From 6bf2147d94ab0cd21c60529c59e928f1eac5e2ef Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Wed, 6 Nov 2013 12:55:31 +0400 Subject: [PATCH 01/66] 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 02/66] 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 03/66] 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 04/66] 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 05/66] 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 06/66] 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 07/66] 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 08/66] 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 09/66] 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 10/66] 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 11/66] 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 12/66] 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 13/66] 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 14/66] 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 15/66] 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 16/66] 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 17/66] 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 18/66] 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 19/66] 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 20/66] 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 21/66] 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 22/66] 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 23/66] 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 24/66] 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 25/66] 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 26/66] 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 27/66] 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 28/66] 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 29/66] 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 30/66] 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 31/66] 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 32/66] 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 33/66] 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 34/66] 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 35/66] 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 36/66] 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 37/66] 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 38/66] 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 39/66] 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 40/66] 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 41/66] 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 42/66] - 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 43/66] 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 44/66] 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 From a43854420d8dbc367be083dedb4a151303de51ba Mon Sep 17 00:00:00 2001 From: xawotihs Date: Wed, 27 Nov 2013 20:33:59 +0100 Subject: [PATCH 45/66] Fixed compilation issue on Windows --- projects/mtg/src/DeckStats.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/DeckStats.cpp b/projects/mtg/src/DeckStats.cpp index 5cb4c4dff..9f50b2a7c 100644 --- a/projects/mtg/src/DeckStats.cpp +++ b/projects/mtg/src/DeckStats.cpp @@ -287,8 +287,8 @@ void StatsWrapper::initValues() 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(noLandsProbInTurn, (int)0.0f, sizeof(float) * Constants::STATS_FOR_TURNS); + memset(noCreaturesProbInTurn, (int)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)); From dc118c64b85dfada923de59767ff004f0cb24b08 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Wed, 27 Nov 2013 23:04:46 +0100 Subject: [PATCH 46/66] Fixed compilation on Mac --- projects/mtg/wagic-qt.pro | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/projects/mtg/wagic-qt.pro b/projects/mtg/wagic-qt.pro index d9b1171fe..70f98804e 100644 --- a/projects/mtg/wagic-qt.pro +++ b/projects/mtg/wagic-qt.pro @@ -31,11 +31,11 @@ TEMPLATE = app #!macx:CONFIG += precompile_header unix|macx:QMAKE_CXXFLAGS += -Wno-unused-parameter -unix|macx:QMAKE_CXXFLAGS += -Wno-unused-but-set-parameter -unix|macx:QMAKE_CXXFLAGS += -Wno-unused-but-set-variable +unix:!macx:QMAKE_CXXFLAGS += -Wno-unused-but-set-parameter +unix:!macx:QMAKE_CXXFLAGS += -Wno-unused-but-set-variable unix|macx:QMAKE_CXXFLAGS += -Wno-unused-value -unix|macx:QMAKE_CXXFLAGS += -Wno-unused-local-typedefs -unix|macx:!maemo5:!symbian:QMAKE_CXXFLAGS += -Werror +unix:!macx:QMAKE_CXXFLAGS += -Wno-unused-local-typedefs +unix:!macx:!maemo5:!symbian:QMAKE_CXXFLAGS += -Werror windows:DEFINES += _CRT_SECURE_NO_WARNINGS unix|macx:DEFINES += LINUX From 89206b3a6b6f0cf4e5c9827f140054f12951680b Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Thu, 28 Nov 2013 16:43:03 +0400 Subject: [PATCH 47/66] Added testing that QT GUI build is successfull --- travis-script.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/travis-script.sh b/travis-script.sh index 6927f0dc8..4dbe2fbc1 100755 --- a/travis-script.sh +++ b/travis-script.sh @@ -15,6 +15,13 @@ $ANDROID list targets $ANDROID update project -t 1 -p projects/mtg/Android ant debug -f projects/mtg/Android/build.xml +# we're building a Qt version with GUI here +mkdir qt-gui-build +cd qt-gui-build +qmake ../projects/mtg/wagic-qt.pro CONFIG+=debug CONFIG+=graphics +make -j 8 +cd .. + # let's try an Intel linux binary qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug DEFINES+=CAPTURE_STDERR make -j 8 From f68568cc1ed43c46af911339ff6685d1d0be8135 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Mon, 18 Nov 2013 09:52:20 +0100 Subject: [PATCH 48/66] Replace strcmp with c++ equivalent when comparing std::strings. --- projects/mtg/src/GameState.cpp | 2 +- projects/mtg/src/MTGPack.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/mtg/src/GameState.cpp b/projects/mtg/src/GameState.cpp index 227a7af42..30c4eabd1 100644 --- a/projects/mtg/src/GameState.cpp +++ b/projects/mtg/src/GameState.cpp @@ -134,7 +134,7 @@ void GameState::renderDeckMenu(DeckMenu * _menu, const vector& d // deck sorting routines bool sortByName(DeckMetaData * d1, DeckMetaData * d2) { - return strcmp(d1->getName().c_str(), d2->getName().c_str()) < 0; + return d1->getName() < d2->getName(); } diff --git a/projects/mtg/src/MTGPack.cpp b/projects/mtg/src/MTGPack.cpp index 2aa3ea031..5e8b53d34 100644 --- a/projects/mtg/src/MTGPack.cpp +++ b/projects/mtg/src/MTGPack.cpp @@ -293,7 +293,7 @@ void MTGPacks::loadAll() sprintf(myFilename, "packs/%s",relative.c_str()); if (relative[0] == '.') continue; - if (!strcmp(relative.c_str(), "default_booster.txt")) + if (relative == "default_booster.txt") continue; MTGPack * p = NEW MTGPack(myFilename); if (!p->isValid()) From c85d8576043bdea766a6633d17972225a7dfddd4 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Fri, 22 Nov 2013 18:31:00 +0100 Subject: [PATCH 49/66] Replace constness cast --- projects/mtg/src/MTGDeck.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index 20580dc14..0e1256671 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -51,9 +51,9 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi if (i == string::npos || 0 == i) return 0; - char* key = const_cast (s.c_str()); // I know what I'm doing, let me do it - key[i] = 0; - char* val = key + i + 1; + s[i] = '\0'; + const char* key = s.c_str(); + const char* val = key+i+1; switch (key[0]) { From 5d0d130587d64780b26c0866b74de0475ba1cd21 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Fri, 22 Nov 2013 18:33:07 +0100 Subject: [PATCH 50/66] Make MTGGameZone::countByType use string instead of char* and replace strcmp with std::string operator== calls. --- projects/mtg/include/MTGGameZones.h | 2 +- projects/mtg/src/GameObserver.cpp | 2 +- projects/mtg/src/MTGGameZones.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/projects/mtg/include/MTGGameZones.h b/projects/mtg/include/MTGGameZones.h index 9970ff4d9..7310d65d0 100644 --- a/projects/mtg/include/MTGGameZones.h +++ b/projects/mtg/include/MTGGameZones.h @@ -95,7 +95,7 @@ class MTGGameZone { void cleanupPhase(); void beforeBeginPhase(); - unsigned int countByType(const char * value); + unsigned int countByType(const string &value); unsigned int countByCanTarget(TargetChooser * tc); unsigned int countTotalManaSymbols(TargetChooser * tc, int color); MTGCardInstance * findByName(string name); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index b7dcda29c..7d16dfdd1 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -1042,7 +1042,7 @@ void GameObserver::Affinity() } else { - reduce = card->controller()->game->battlefield->countByType(type.c_str()); + reduce = card->controller()->game->battlefield->countByType(type); } for(int i = 0; i < reduce;i++) { diff --git a/projects/mtg/src/MTGGameZones.cpp b/projects/mtg/src/MTGGameZones.cpp index 56f7efe12..4a425ed1c 100644 --- a/projects/mtg/src/MTGGameZones.cpp +++ b/projects/mtg/src/MTGGameZones.cpp @@ -529,7 +529,7 @@ size_t MTGGameZone::getIndex(MTGCardInstance * card) } -unsigned int MTGGameZone::countByType(const char * value) +unsigned int MTGGameZone::countByType(const string &value) { int result = 0; int subTypeId = MTGAllCards::findType(value); @@ -539,7 +539,7 @@ unsigned int MTGGameZone::countByType(const char * value) { result++; } - else if(strcmp(value, "token") == 0 && cards[i]->isToken) + else if(value == "token" && cards[i]->isToken) result++; } return result; From 9d5a83d5884623f1f860933fa920a10ccb72b999 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sat, 23 Nov 2013 11:10:41 +0100 Subject: [PATCH 51/66] Replace more strcmp with std::string::compare or std::string::operator==. This commit also enables TinyXML STL support. --- JGE/Makefile | 1 + JGE/src/JAnimator.cpp | 8 ++++---- JGE/src/JOBJModel.cpp | 8 ++++---- JGE/src/JParticleEffect.cpp | 32 ++++++++++++++++---------------- JGE/src/JResourceManager.cpp | 6 +++--- JGE/src/Qtmain.cpp | 2 +- JGE/src/hge/hgefont.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 2 +- projects/mtg/src/MTGDeck.cpp | 24 ++++++++++++------------ projects/mtg/src/ModRules.cpp | 10 +++++----- projects/mtg/src/StoryFlow.cpp | 24 ++++++++++++------------ projects/mtg/wagic-SDL.pro | 1 + projects/mtg/wagic-qt.pro | 2 ++ 13 files changed, 63 insertions(+), 59 deletions(-) diff --git a/JGE/Makefile b/JGE/Makefile index 2849fa678..3d86cc650 100644 --- a/JGE/Makefile +++ b/JGE/Makefile @@ -31,6 +31,7 @@ HGE_OBJS = src/hge/hgecolor.o src/hge/hgeparticle.o \ CXXFLAGS = -W -Wall -Werror -Wno-unused +CXXFLAGS += -DTIXML_USE_STL ifdef DEBUG CXXFLAGS += -ggdb3 diff --git a/JGE/src/JAnimator.cpp b/JGE/src/JAnimator.cpp index 08f704c6c..802d2badd 100644 --- a/JGE/src/JAnimator.cpp +++ b/JGE/src/JAnimator.cpp @@ -67,7 +67,7 @@ bool JAnimator::Load(const char* scriptFile) element = script->ToElement(); printf("---- Loading %s:%s\n", element->Value(), element->Attribute("name")); - const char *type[] = + string type[] = { "ANIMATION_TYPE_LOOPING", "ANIMATION_TYPE_ONCE_AND_STAY", @@ -76,9 +76,9 @@ bool JAnimator::Load(const char* scriptFile) "ANIMATION_TYPE_PINGPONG" }; - const char* aniType = element->Attribute("type"); + const char* aniType = element->Attribute("type"); for (int i=0;i<5;i++) - if (strcmp(type[i], aniType)==0) + if (type[i] == aniType) { SetAnimationType(i); break; @@ -108,7 +108,7 @@ bool JAnimator::Load(const char* scriptFile) element = param->ToElement(); if (element != NULL) { - if (strcmp(element->Value(), "settings")==0) + if (element->ValueStr() == "settings") { const char* quadName = element->Attribute("quad"); JQuad* quad = mResource->GetQuad(quadName); diff --git a/JGE/src/JOBJModel.cpp b/JGE/src/JOBJModel.cpp index d30a0ed7b..276c46a59 100644 --- a/JGE/src/JOBJModel.cpp +++ b/JGE/src/JOBJModel.cpp @@ -89,16 +89,16 @@ bool JOBJModel::Load(const char *modelName, const char *textureName) if (count == 4) { - if (strcmp(s1, "vn") == 0) + if (string("vn") == s1) normalList.push_back(vert); - else if (strcmp(s1, "vt") == 0) + else if (string("vt") == s1) texList.push_back(vert); - else if (strcmp(s1, "v") == 0) + else if (string("v") == s1) vertList.push_back(vert); } else if (count == 3) { - if (strcmp(s1, "vt") == 0) + if (string("vt") == s1) texList.push_back(vert); } diff --git a/JGE/src/JParticleEffect.cpp b/JGE/src/JParticleEffect.cpp index e3411de03..d56606846 100644 --- a/JGE/src/JParticleEffect.cpp +++ b/JGE/src/JParticleEffect.cpp @@ -90,7 +90,7 @@ bool JParticleEffect::Load(const char* filename) // FIELD_COUNT // }; - const char* lifeValues[] = + const string lifeValues[] = { "speed", "size", @@ -104,7 +104,7 @@ bool JParticleEffect::Load(const char* filename) "gravity" }; - const char* typeNames[] = + const string typeNames[] = { "POINT", "AREA", @@ -113,7 +113,7 @@ bool JParticleEffect::Load(const char* filename) "CIRCLE" }; - const char* modeNames[] = + const string modeNames[] = { "REPEAT", "ONCE", @@ -149,32 +149,32 @@ bool JParticleEffect::Load(const char* filename) { element = param->ToElement(); - if (strcmp(element->Attribute("name"), "settings")==0) + if (string("settings") == element->Attribute("name")) { - if (strcmp(element->Attribute("blend"), "NORMAL")==0) + if (string("NORMAL") == element->Attribute("blend")) mParticleEmitters[mEmitterCount]->SetBlending(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); - else if (strcmp(element->Attribute("blend"), "ADDITIVE")==0) + else if (string("ADDITIVE") == element->Attribute("blend")) mParticleEmitters[mEmitterCount]->SetBlending(BLEND_SRC_ALPHA, BLEND_ONE); for (unsigned int i=0;iAttribute("mode"), modeNames[i])==0) + if (modeNames[i] == element->Attribute("mode")) { mParticleEmitters[mEmitterCount]->mEmitterMode = i; #if defined (_DEBUG) - printf("emitter mode:%s\n", modeNames[i]); + printf("emitter mode:%s\n", modeNames[i].c_str()); #endif break; } } for (unsigned i=0;iAttribute("type"), typeNames[i])==0) + if (typeNames[i] == element->Attribute("type")) { mParticleEmitters[mEmitterCount]->mType = i; #if defined (_DEBUG) - printf("emitter type:%s\n", typeNames[i]); + printf("emitter type:%s\n", typeNames[i].c_str()); #endif break; } @@ -213,7 +213,7 @@ bool JParticleEffect::Load(const char* filename) } } - else if (strcmp(element->Attribute("name"), "quantity")==0) + else if (string("quantity") == element->Attribute("name")) { for (key = param->FirstChild(); key; key = key->NextSibling()) { @@ -227,7 +227,7 @@ bool JParticleEffect::Load(const char* filename) } } - else if (strcmp(element->Attribute("name"), "lifex")==0) + else if (string("lifex") == element->Attribute("name")) { if (element->QueryFloatAttribute("base", &baseValue) == TIXML_SUCCESS && element->QueryFloatAttribute("max", &value) == TIXML_SUCCESS) @@ -236,7 +236,7 @@ bool JParticleEffect::Load(const char* filename) mParticleEmitters[mEmitterCount]->mLifeMax= value; } } - else if (strcmp(element->Attribute("name"), "anglex")==0) + else if (string("anglex") == element->Attribute("name")) { if (element->QueryFloatAttribute("base", &baseValue) == TIXML_SUCCESS && element->QueryFloatAttribute("max", &value) == TIXML_SUCCESS) @@ -245,7 +245,7 @@ bool JParticleEffect::Load(const char* filename) mParticleEmitters[mEmitterCount]->mAngleMax= value*DEG2RAD; } } - else if (strcmp(element->Attribute("name"), "speedx")==0) + else if (string("speedx") == element->Attribute("name")) { if (element->QueryFloatAttribute("base", &baseValue) == TIXML_SUCCESS && element->QueryFloatAttribute("max", &value) == TIXML_SUCCESS) @@ -254,7 +254,7 @@ bool JParticleEffect::Load(const char* filename) mParticleEmitters[mEmitterCount]->mSpeedMax= value; } } - else if (strcmp(element->Attribute("name"), "sizex")==0) + else if (string("sizex") == element->Attribute("name")) { if (element->QueryFloatAttribute("base", &baseValue) == TIXML_SUCCESS && element->QueryFloatAttribute("max", &value) == TIXML_SUCCESS) @@ -267,7 +267,7 @@ bool JParticleEffect::Load(const char* filename) { for (int i=0;iAttribute("name"), lifeValues[i])==0) + if (lifeValues[i] == element->Attribute("name")) { for (key = param->FirstChild(); key; key = key->NextSibling()) { diff --git a/JGE/src/JResourceManager.cpp b/JGE/src/JResourceManager.cpp index a5d3c75cd..6d7702f02 100644 --- a/JGE/src/JResourceManager.cpp +++ b/JGE/src/JResourceManager.cpp @@ -119,11 +119,11 @@ bool JResourceManager::LoadResource(const string& resourceName) element = node->ToElement(); if (element != NULL) { - if (strcmp(element->Value(), "texture")==0) + if (element->ValueStr() == "texture") { CreateTexture(element->Attribute("name")); } - else if (strcmp(element->Value(), "quad")==0) + else if (element->ValueStr() == "quad") { string quadName = element->Attribute("name"); string textureName = element->Attribute("texture"); @@ -170,7 +170,7 @@ bool JResourceManager::LoadResource(const string& resourceName) GetQuad(id)->SetHotSpot(hotspotX, hotspotY); } } - else if (strcmp(element->Value(), "font")==0) + else if (element->ValueStr() == "font") { } diff --git a/JGE/src/Qtmain.cpp b/JGE/src/Qtmain.cpp index 9aa849ead..f21d6bdb7 100644 --- a/JGE/src/Qtmain.cpp +++ b/JGE/src/Qtmain.cpp @@ -69,7 +69,7 @@ int main(int argc, char* argv[]) #endif //QT_WIDGET - if(argc >= 2 && strcmp(argv[1], "testsuite")==0) + if(argc >= 2 && string(argv[1]) == "testsuite") { int result = 0; result += WagicCore::runTestSuite(); diff --git a/JGE/src/hge/hgefont.cpp b/JGE/src/hge/hgefont.cpp index 9adc621b2..02c18a4e5 100644 --- a/JGE/src/hge/hgefont.cpp +++ b/JGE/src/hge/hgefont.cpp @@ -72,7 +72,7 @@ hgeFont::hgeFont(const char *szFont, bool bMipmap __attribute__((unused))) fileSys->CloseFile(); pdesc=_get_line(desc,linebuf); - if(strcmp(linebuf, FNTHEADERTAG)) + if(strcmp(linebuf, FNTHEADERTAG)) { // hge->System_Log("Font %s has incorrect format.", szFont); delete[] desc; diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index cebf7e5ac..aa44def2e 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1145,7 +1145,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG } - if(strncmp(s.c_str(), "chooseacolor ", strlen("chooseacolor ")) == 0 || strncmp(s.c_str(), "chooseatype ", strlen("chooseatype ")) == 0) + if(s.compare(0, strlen("chooseacolor "), "chooseacolor ") == 0 || s.compare(0, strlen("chooseatype "), "chooseatype ") == 0) { MTGAbility * choose = parseChooseActionAbility(s,card,spell,target,0,id); choose = NEW GenericActivatedAbility(observer, "","",id, card,choose,NULL); diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index 0e1256671..f0e527bbd 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -52,28 +52,28 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi return 0; s[i] = '\0'; - const char* key = s.c_str(); - const char* val = key+i+1; + const string key = s.substr(0, i); + const char* val = s.c_str()+i+1; - switch (key[0]) + switch (s[0]) { case 'a': - if (0 == strcmp("auto", key)) + if (key == "auto") { if (!primitive) primitive = NEW CardPrimitive(); primitive->addMagicText(val); } - else if (0 == strncmp("auto", key, 4)) + else if (key.compare(0, strlen("auto")-1, "auto") == 0) { if (!primitive) primitive = NEW CardPrimitive(); - primitive->addMagicText(val, key + 4); + primitive->addMagicText(val, key.substr(4)); } - else if (0 == strcmp("alias", key)) + else if (key == "alias") { if (!primitive) primitive = NEW CardPrimitive(); primitive->alias = atoi(val); } - else if (0 == strcmp("abilities", key)) + else if (key == "abilities") { if (!primitive) primitive = NEW CardPrimitive(); string value = val; @@ -288,21 +288,21 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi case 't': if (!primitive) primitive = NEW CardPrimitive(); - if (0 == strcmp("target", key)) + if (key == "target") { string value = val; std::transform(value.begin(), value.end(), value.begin(), ::tolower); primitive->spellTargetType = value; } - else if (0 == strcmp("text", key)) + else if (key == "text") primitive->setText(val); - else if (0 == strcmp("type", key)) + else if (key == "type") { vector values = split(val, ' '); for (size_t values_i = 0; values_i < values.size(); ++values_i) primitive->setType(values[values_i]); } - else if (0 == strcmp("toughness", key)) primitive->setToughness(atoi(val)); + else if (key == "toughness") primitive->setToughness(atoi(val)); break; default: diff --git a/projects/mtg/src/ModRules.cpp b/projects/mtg/src/ModRules.cpp index 029f5a9e8..a39c99bc9 100644 --- a/projects/mtg/src/ModRules.cpp +++ b/projects/mtg/src/ModRules.cpp @@ -25,23 +25,23 @@ bool ModRules::load(string filename) TiXmlElement* element = node->ToElement(); if (element != NULL) { - if (strcmp(element->Value(), "menu") == 0) + if (element->ValueStr() == "menu") { menu.parse(element); } - else if (strcmp(element->Value(), "general") == 0) + else if (element->ValueStr() == "general") { general.parse(element); } - else if (strcmp(element->Value(), "cards") == 0) + else if (element->ValueStr() == "cards") { cards.parse(element); } - else if (strcmp(element->Value(), "game") == 0) + else if (element->ValueStr() == "game") { game.parse(element); } - else if (strcmp(element->Value(), "cardgui") == 0) + else if (element->ValueStr() == "cardgui") { cardgui.parse(element); } diff --git a/projects/mtg/src/StoryFlow.cpp b/projects/mtg/src/StoryFlow.cpp index b77c40efd..98eacc5d7 100644 --- a/projects/mtg/src/StoryFlow.cpp +++ b/projects/mtg/src/StoryFlow.cpp @@ -333,15 +333,15 @@ StoryDuel::StoryDuel(TiXmlElement* root, StoryFlow * mParent) : if (element) { const char* textC = element->GetText(); - if (strcmp(element->Value(), "onwin") == 0) + if (element->ValueStr() == "onwin") { onWin = textC; } - else if (strcmp(element->Value(), "onlose") == 0) + else if (element->ValueStr() == "onlose") { onLose = textC; } - else if (strcmp(element->Value(), "bg") == 0) + else if (element->ValueStr() == "bg") { string text = textC; bg = string("campaigns/").append(mParent->folder).append("/").append(text); @@ -396,10 +396,10 @@ int StoryPage::loadElement(TiXmlElement* element) if (!element) return 0; const char* textC = element->GetText(); string text = textC; - if (strcmp(element->Value(), "music") == 0) + if (element->ValueStr() == "music") { musicFile = string("campaigns/").append(mParent->folder).append("/").append(text); - if (!fileExists(musicFile.c_str())) musicFile = text; + if (!FileExists(musicFile)) musicFile = text; return 1; } return 0; @@ -434,15 +434,15 @@ StoryDialog::StoryDialog(TiXmlElement* root, StoryFlow * mParent) : string sFont = safeAttribute(element, "font"); int font = atoi(sFont.c_str()); - if (strcmp(element->Value(), "text") == 0) + if (element->ValueStr() == "text") { graphics.push_back(NEW StoryText(text, x, y, align, font)); } - else if (strcmp(element->Value(), "title") == 0) + else if (element->ValueStr() == "title") { graphics.push_back(NEW StoryText(text, x, y, "center", Fonts::MENU_FONT)); } - else if (strcmp(element->Value(), "img") == 0) + else if (element->ValueStr() == "img") { //special case to force center if (sX.compare("") == 0) @@ -452,7 +452,7 @@ StoryDialog::StoryDialog(TiXmlElement* root, StoryFlow * mParent) : string img = string("campaigns/").append(mParent->folder).append("/").append(text); graphics.push_back(NEW StoryImage(img, x, y)); } - else if (strcmp(element->Value(), "answer") == 0) + else if (element->ValueStr() == "answer") { string id = element->Attribute("goto"); if (!align.size()) align = "center"; @@ -461,7 +461,7 @@ StoryDialog::StoryDialog(TiXmlElement* root, StoryFlow * mParent) : graphics.push_back(sc); Add(sc); } - else if (strcmp(element->Value(), "reward") == 0) + else if (element->ValueStr() == "reward") { string type = safeAttribute(element, "type"); string value = safeAttribute(element, "value"); @@ -553,7 +553,7 @@ StoryPage * StoryFlow::loadPage(TiXmlElement* element) if (!typeNode) return NULL; StoryPage * result = NULL; const char* type = typeNode->ToElement()->GetText(); - if (strcmp(type, "duel") == 0) + if (string("duel") == type) { result = NEW StoryDuel(element, this); } @@ -615,7 +615,7 @@ bool StoryFlow::parse(string path) TiXmlElement* element = node->ToElement(); if (element != NULL) { - if (strcmp(element->Value(), "page") == 0) + if (element->ValueStr() == "page") { string id = element->Attribute("id"); diff --git a/projects/mtg/wagic-SDL.pro b/projects/mtg/wagic-SDL.pro index 7617aae78..a1580106d 100644 --- a/projects/mtg/wagic-SDL.pro +++ b/projects/mtg/wagic-SDL.pro @@ -18,6 +18,7 @@ CONFIG(debug, debug|release):DEFINES += _DEBUG #DEFINES += QT_CONFIG #DEFINES += NETWORK_SUPPORT DEFINES += SDL_CONFIG +DEFINES += TIXML_USE_STL macx:DEFINES += USE_PHONON maemo5: { DEFINES += USE_PHONON diff --git a/projects/mtg/wagic-qt.pro b/projects/mtg/wagic-qt.pro index 70f98804e..3084f5f32 100644 --- a/projects/mtg/wagic-qt.pro +++ b/projects/mtg/wagic-qt.pro @@ -49,6 +49,8 @@ android:INCLUDEPATH += $$ANDROID_NDK_ROOT/platforms/android-9/arch-arm/usr/inclu #DEFINES += QT_NO_DEBUG_OUTPUT DEFINES += NETWORK_SUPPORT +DEFINES += TIXML_USE_STL + windows:INCLUDEPATH += ../../JGE/Dependencies/include windows{ *-g++* { From 672b0be7bda072e6084be54dec8e4b31be1fb60c Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Fri, 29 Nov 2013 10:56:33 +0100 Subject: [PATCH 52/66] Fix a few string bugs add StartsWith for strings --- projects/mtg/include/utils.h | 16 ++++++++++++++++ projects/mtg/src/MTGDeck.cpp | 36 ++++++++++++++++++------------------ projects/mtg/src/utils.cpp | 10 ++++++++++ 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/projects/mtg/include/utils.h b/projects/mtg/include/utils.h index 2029f3219..3a3461b40 100644 --- a/projects/mtg/include/utils.h +++ b/projects/mtg/include/utils.h @@ -140,4 +140,20 @@ template istream& operator>>(istream& in, T& p) /* replace_all ... replacement to avoid depending on boost for that */ void ReplaceString(std::string& subject, const std::string& search, const std::string& replace); +/*! \brief Returns true if base starts with start, otherwise false + * + * Compares the first strlen(start) characters of base with start and + * returns true if both match. + */ +bool StartsWith(const std::string& base, const char *start); + +/*! \brief Returns true if base starts with start, otherwise false + * + * This version is slightly more efficient as strlen does not need to + * get called. Otherwise, it behaves exactly like + * StartsWith(const std::string& base, const char *start) + * + * \see StartsWith(const std::string& base, const char *start) + */ +bool StartsWith(const std::string& base, const std::string& start); #endif diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index f0e527bbd..c97b838a3 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -47,15 +47,15 @@ static inline int getGrade(int v) int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primitive) { if ('#' == s[0]) return 1; // a comment shouldn't be treated as an error condition - size_t i = s.find_first_of('='); - if (i == string::npos || 0 == i) + size_t del_pos = s.find_first_of('='); + if (del_pos == string::npos || 0 == del_pos) return 0; - s[i] = '\0'; - const string key = s.substr(0, i); - const char* val = s.c_str()+i+1; - - switch (s[0]) + s[del_pos] = '\0'; + const string key = s.substr(0, del_pos); + const string val = s.substr(del_pos + 1); + + switch (key[0]) { case 'a': if (key == "auto") @@ -63,7 +63,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi if (!primitive) primitive = NEW CardPrimitive(); primitive->addMagicText(val); } - else if (key.compare(0, strlen("auto")-1, "auto") == 0) + else if (StartsWith(key, "auto")) { if (!primitive) primitive = NEW CardPrimitive(); primitive->addMagicText(val, key.substr(4)); @@ -71,7 +71,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi else if (key == "alias") { if (!primitive) primitive = NEW CardPrimitive(); - primitive->alias = atoi(val); + primitive->alias = atoi(val.c_str()); } else if (key == "abilities") { @@ -152,12 +152,12 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi } case 'g': //grade - if (s.size() - i - 1 > 2) currentGrade = getGrade(val[2]); + if (s.size() - del_pos - 1 > 2) currentGrade = getGrade(val[2]); break; case 'i': //id if (!card) card = NEW MTGCard(); - card->setMTGId(atoi(val)); + card->setMTGId(atoi(val.c_str())); break; case 'k': //kicker @@ -222,7 +222,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi break; case 'p': - if ('r' == key[1]) + if (key[1] == 'r') { // primitive if (!card) card = NEW MTGCard(); map::iterator it = primitives.find(val); @@ -231,18 +231,18 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi else { //power if (!primitive) primitive = NEW CardPrimitive(); - primitive->setPower(atoi(val)); + primitive->setPower(atoi(val.c_str())); } break; case 'r': //retrace/rarity//restrictions - if('s' == key[2] && 't' == key[3])//restrictions + if(key[2] == 's' && key[3] == 't')//restrictions { if (!primitive) primitive = NEW CardPrimitive(); string value = val; primitive->setRestrictions(value); } - else if ('e' == key[1] && 't' == key[2]) + else if (key[1] == 'e' && key[2] == 't') { //retrace if (!primitive) primitive = NEW CardPrimitive(); if (ManaCost * cost = primitive->getManaCost()) @@ -279,7 +279,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi else { if (!primitive) primitive = NEW CardPrimitive(); - vector values = split(val, ' '); + vector values = split(val.c_str(), ' '); for (size_t values_i = 0; values_i < values.size(); ++values_i) primitive->setSubtype(values[values_i]); } @@ -302,7 +302,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi for (size_t values_i = 0; values_i < values.size(); ++values_i) primitive->setType(values[values_i]); } - else if (key == "toughness") primitive->setToughness(atoi(val)); + else if (key == "toughness") primitive->setToughness(atoi(val.c_str())); break; default: @@ -317,7 +317,7 @@ int MTGAllCards::processConfLine(string &s, MTGCard *card, CardPrimitive * primi tempPrimitive = primitive; tempCard = card; - return i; + return del_pos; } diff --git a/projects/mtg/src/utils.cpp b/projects/mtg/src/utils.cpp index 7a31822bd..2217b6143 100644 --- a/projects/mtg/src/utils.cpp +++ b/projects/mtg/src/utils.cpp @@ -399,3 +399,13 @@ void ReplaceString(std::string& subject, const std::string& search, const std::s } } +bool StartsWith(const std::string& base, const char *start) +{ + return base.compare(0, strlen(start), start) == 0; +} + +bool StartsWith(const std::string& base, const std::string& start) +{ + return base.compare(0, start.length(), start) == 0; +} + From 3f0dd987f0754ce36511cbe10b70b2f28c547a9c Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sat, 23 Nov 2013 11:26:10 +0100 Subject: [PATCH 53/66] Remove bool CardInstance::hasSubtype(const char * _subtype) There exists bool CardInstance::hasSubtype(const string& _subtype) and the const char* version converts _subtype into string deeper in the call hierarchy anyway. So both methods did the same. --- projects/mtg/include/CardPrimitive.h | 1 - projects/mtg/src/CardPrimitive.cpp | 6 ------ 2 files changed, 7 deletions(-) diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index 6bad49cee..064478bc5 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -101,7 +101,6 @@ public: int removeType(string value, int removeAll = 0); int removeType(int value, int removeAll = 0); bool hasSubtype(int _subtype); - bool hasSubtype(const char * _subtype); bool hasSubtype(const string& _subtype); bool hasType(int _type); bool hasType(const char * type); diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 0af4460d5..9946f138a 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -350,12 +350,6 @@ bool CardPrimitive::hasType(const char * _type) return hasType(id); } -bool CardPrimitive::hasSubtype(const char * _subtype) -{ - int id = MTGAllCards::findType(_subtype); - return hasType(id); -} - bool CardPrimitive::hasSubtype(const string& _subtype) { int id = MTGAllCards::findType(_subtype); From 9ee44ca09100a15dc8f307e3cd8e80b97723f397 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sat, 23 Nov 2013 12:57:31 +0100 Subject: [PATCH 54/66] Substitute more char arrays with strings --- projects/mtg/include/CardPrimitive.h | 2 +- projects/mtg/include/DeckEditorMenu.h | 2 +- projects/mtg/include/DeckMenu.h | 2 +- projects/mtg/include/DeckMenuItem.h | 4 +--- projects/mtg/include/DeckStats.h | 2 +- projects/mtg/include/GameObserver.h | 4 ++-- projects/mtg/include/MTGCardInstance.h | 8 +++---- projects/mtg/include/MTGDeck.h | 14 ++++++------ projects/mtg/include/MTGDefinitions.h | 2 +- projects/mtg/include/PhaseRing.h | 2 +- projects/mtg/src/ActionStack.cpp | 2 +- projects/mtg/src/CardPrimitive.cpp | 2 +- projects/mtg/src/DeckEditorMenu.cpp | 2 +- projects/mtg/src/DeckMenu.cpp | 2 +- projects/mtg/src/DeckStats.cpp | 2 +- projects/mtg/src/GameObserver.cpp | 4 ++-- projects/mtg/src/GameOptions.cpp | 6 +++--- projects/mtg/src/MTGCardInstance.cpp | 8 +++---- projects/mtg/src/MTGDeck.cpp | 30 +++++++++++++++++--------- projects/mtg/src/MTGDefinitions.cpp | 2 +- projects/mtg/src/PhaseRing.cpp | 5 +++-- projects/mtg/src/TestSuiteAI.cpp | 4 ++-- 22 files changed, 61 insertions(+), 50 deletions(-) diff --git a/projects/mtg/include/CardPrimitive.h b/projects/mtg/include/CardPrimitive.h index 064478bc5..f02cd7d16 100644 --- a/projects/mtg/include/CardPrimitive.h +++ b/projects/mtg/include/CardPrimitive.h @@ -103,7 +103,7 @@ public: bool hasSubtype(int _subtype); bool hasSubtype(const string& _subtype); bool hasType(int _type); - bool hasType(const char * type); + bool hasType(const string& type); void setManaCost(const string& value); ManaCost * getManaCost(); diff --git a/projects/mtg/include/DeckEditorMenu.h b/projects/mtg/include/DeckEditorMenu.h index d252785ec..6191d88bb 100644 --- a/projects/mtg/include/DeckEditorMenu.h +++ b/projects/mtg/include/DeckEditorMenu.h @@ -17,7 +17,7 @@ private: StatsWrapper *stw; public: - DeckEditorMenu(int id, JGuiListener* listener = NULL, int fontId = 1, const char * _title = "", DeckDataWrapper *selectedDeck = NULL, StatsWrapper *stats = NULL); + DeckEditorMenu(int id, JGuiListener* listener = NULL, int fontId = 1, const string& _title = "", DeckDataWrapper *selectedDeck = NULL, StatsWrapper *stats = NULL); void Render(); virtual ~DeckEditorMenu(); }; diff --git a/projects/mtg/include/DeckMenu.h b/projects/mtg/include/DeckMenu.h index 0f2376634..fa3035efd 100644 --- a/projects/mtg/include/DeckMenu.h +++ b/projects/mtg/include/DeckMenu.h @@ -79,7 +79,7 @@ public: virtual void Render(); virtual void Update(float dt); using JGuiController::Add; - virtual void Add(int id, const char * Text, string desc = "", bool forceFocus = false, DeckMetaData *deckMetaData = NULL); + virtual void Add(int id, const string& Text, const string& desc = "", bool forceFocus = false, DeckMetaData *deckMetaData = NULL); virtual void Close(); void updateScroller(); void RenderBackground(); diff --git a/projects/mtg/include/DeckMenuItem.h b/projects/mtg/include/DeckMenuItem.h index 67d48e9b5..53ee35d5e 100644 --- a/projects/mtg/include/DeckMenuItem.h +++ b/projects/mtg/include/DeckMenuItem.h @@ -77,9 +77,7 @@ public: } // Setters - void setDescription( const string description ) { mDescription = description; }; - - ; + void setDescription( const string& description ) { mDescription = description; } }; #endif diff --git a/projects/mtg/include/DeckStats.h b/projects/mtg/include/DeckStats.h index 428b538c8..39238c533 100644 --- a/projects/mtg/include/DeckStats.h +++ b/projects/mtg/include/DeckStats.h @@ -98,7 +98,7 @@ public: string getManaColorIndex(); void updateStats(string filename, MTGAllCards * collection); void updateStats(DeckDataWrapper *mtgDeck); - int countCardsByType(const char * _type, DeckDataWrapper * myDeck); + int countCardsByType(const string& _type, DeckDataWrapper * myDeck); float noLuck(int n, int a, int x); vector aiDeckNames; diff --git a/projects/mtg/include/GameObserver.h b/projects/mtg/include/GameObserver.h index 281e742ba..5b3bfcbbe 100644 --- a/projects/mtg/include/GameObserver.h +++ b/projects/mtg/include/GameObserver.h @@ -98,8 +98,8 @@ class GameObserver{ int cardClick(MTGCardInstance * card,Targetable * _object = NULL, bool log = true); GamePhase getCurrentGamePhase(); void setCurrentGamePhase(GamePhase phase) { mCurrentGamePhase = phase; }; - const char * getCurrentGamePhaseName(); - const char * getNextGamePhaseName(); + const string& getCurrentGamePhaseName(); + const string& getNextGamePhaseName(); void nextCombatStep(); void userRequestNextGamePhase(bool allowInterrupt = true, bool log = true); void cleanupPhase(); diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 7317c4142..ab708e5db 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -129,11 +129,11 @@ public: //types - void addType(char * type_text); + void addType(const string& type_text); virtual void addType(int id); - void setType(const char * type_text); - void setSubtype( string value); - int removeType(string value, int removeAll = 0); + void setType(const string& type_text); + void setSubtype(const string &value); + int removeType(const string &value, int removeAll = 0); int removeType(int value, int removeAll = 0); //dangerranking is a hint to Ai which creatures are the ones it should be targetting for effects. diff --git a/projects/mtg/include/MTGDeck.h b/projects/mtg/include/MTGDeck.h index 3fe38b5f2..577d83c8f 100644 --- a/projects/mtg/include/MTGDeck.h +++ b/projects/mtg/include/MTGDeck.h @@ -19,7 +19,7 @@ class MTGPack; class MTGSetInfo { public: - MTGSetInfo(string _id); + MTGSetInfo(const string& _id); ~MTGSetInfo(); string id; //Short name: 10E, RAV, etc. Automatic from folder. string author; //Author of set, for crediting mod makers, etc. @@ -70,7 +70,7 @@ public: MTGSets(); ~MTGSets(); - int Add(const char * subtype); + int Add(const string& subtype); int findSet(string value); int findBlock(string s); int size(); @@ -127,8 +127,10 @@ public: MTGCard * getCardByName(string name); void loadFolder(const string& folder, const string& filename="" ); - int load(const char * config_file, const char * setName = NULL, int autoload = 1); - int countByType(const char * _type); + int load(const string& config_file); + int load(const string& config_file, const string& setName); + int load(const string& config_file, int set_id); + int countByType(const string& _type); int countByColor(int color); int countBySet(int setId); int totalCards(); @@ -218,8 +220,8 @@ public: int totalCards(); int totalPrice(); MTGDeck(MTGAllCards * _allcards); - MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only = 0,int difficultySetting = 0); - int addRandomCards(int howmany, int * setIds = NULL, int nbSets = 0, int rarity = -1, const char * subtype = NULL, + MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_only = 0,int difficultySetting = 0); + int addRandomCards(int howmany, int * setIds = NULL, int nbSets = 0, int rarity = -1, const string& subtype = "", int * colors = NULL, int nbcolors = 0); int add(int cardid); int add(MTGDeck * deck); // adds the contents of "deck" into myself diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index 0db903015..86d11e14d 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -293,7 +293,7 @@ class Constants static map MTGBasicAbilitiesMap; static const char* MTGBasicAbilities[]; - static const char* MTGPhaseNames[]; + static const string MTGPhaseNames[]; static const char* MTGPhaseCodeNames[]; static int GetBasicAbilityIndex(string mtgAbility); diff --git a/projects/mtg/include/PhaseRing.h b/projects/mtg/include/PhaseRing.h index 2c116c1bf..3c3afd7cd 100644 --- a/projects/mtg/include/PhaseRing.h +++ b/projects/mtg/include/PhaseRing.h @@ -62,7 +62,7 @@ public: int addCombatAfter(Player* player, int after_id, bool withMain = false); int addPhaseAfter(GamePhase id, Player* player, int after_id); int removePhase(int id); - const char * phaseName(int id); + const string& phaseName(int id); static GamePhase phaseStrToInt(string s); static string phaseIntToStr(int id); diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 6509bc217..4e4fe8948 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -57,7 +57,7 @@ void NextGamePhase::Render() if (observer->currentActionPlayer == observer->players[1]) playerId = 2; - sprintf(buffer, "%s %i : %s", _("Player").c_str(), playerId, observer->getNextGamePhaseName()); + sprintf(buffer, "%s %i : %s", _("Player").c_str(), playerId, observer->getNextGamePhaseName().c_str()); mFont->DrawString(buffer, x + 15, y+10, JGETEXT_LEFT); mFont->SetScale(DEFAULT_MAIN_FONT_SCALE); diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 9946f138a..e564fb84e 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -344,7 +344,7 @@ bool CardPrimitive::hasSubtype(int _subtype) return hasType(_subtype); } -bool CardPrimitive::hasType(const char * _type) +bool CardPrimitive::hasType(const string& _type) { int id = MTGAllCards::findType(_type); return hasType(id); diff --git a/projects/mtg/src/DeckEditorMenu.cpp b/projects/mtg/src/DeckEditorMenu.cpp index 5af4b183a..f88695d9a 100644 --- a/projects/mtg/src/DeckEditorMenu.cpp +++ b/projects/mtg/src/DeckEditorMenu.cpp @@ -7,7 +7,7 @@ #include #include "Translate.h" -DeckEditorMenu::DeckEditorMenu(int id, JGuiListener* listener, int fontId, const char * _title, DeckDataWrapper *_selectedDeck, StatsWrapper *stats) : +DeckEditorMenu::DeckEditorMenu(int id, JGuiListener* listener, int fontId, const string& _title, DeckDataWrapper *_selectedDeck, StatsWrapper *stats) : DeckMenu(id, listener, fontId, _title), selectedDeck(_selectedDeck), stw(stats) { backgroundName = "DeckEditorMenuBackdrop"; diff --git a/projects/mtg/src/DeckMenu.cpp b/projects/mtg/src/DeckMenu.cpp index 98122f87a..8524fc90e 100644 --- a/projects/mtg/src/DeckMenu.cpp +++ b/projects/mtg/src/DeckMenu.cpp @@ -370,7 +370,7 @@ void DeckMenu::Update(float dt) } -void DeckMenu::Add(int id, const char * text, string desc, bool forceFocus, DeckMetaData * deckMetaData) +void DeckMenu::Add(int id, const string& text, const string& desc, bool forceFocus, DeckMetaData * deckMetaData) { DeckMenuItem * menuItem = NEW DeckMenuItem(this, id, fontId, text, 0, mY + DeckMenuConst::kVerticalMargin + mCount * DeckMenuConst::kLineHeight, (mCount == 0), mAutoTranslate, deckMetaData); diff --git a/projects/mtg/src/DeckStats.cpp b/projects/mtg/src/DeckStats.cpp index 9f50b2a7c..677760bb6 100644 --- a/projects/mtg/src/DeckStats.cpp +++ b/projects/mtg/src/DeckStats.cpp @@ -587,7 +587,7 @@ void StatsWrapper::updateStats(DeckDataWrapper *myDeck) // This should probably be cached in DeckDataWrapper // or at least be calculated for all common types in one go -int StatsWrapper::countCardsByType(const char * _type, DeckDataWrapper * myDeck) +int StatsWrapper::countCardsByType(const string& _type, DeckDataWrapper * myDeck) { int result = 0; for (int i = 0; i < myDeck->Size(true); i++) diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 7d16dfdd1..ed01c26d5 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -110,12 +110,12 @@ GamePhase GameObserver::getCurrentGamePhase() return mCurrentGamePhase; } -const char* GameObserver::getCurrentGamePhaseName() +const string& GameObserver::getCurrentGamePhaseName() { return phaseRing->phaseName(mCurrentGamePhase); } -const char* GameObserver::getNextGamePhaseName() +const string& GameObserver::getNextGamePhaseName() { return phaseRing->phaseName((mCurrentGamePhase + 1) % MTG_PHASE_CLEANUP); } diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index b82265623..43b63a9df 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -818,9 +818,9 @@ void GameSettings::createUsersFirstDeck(int setId) mCollection->addRandomCards(10, 0, 0, Constants::RARITY_L, "Island"); //Starter Deck - mCollection->addRandomCards(3, sets, 1, Constants::RARITY_R, NULL); - mCollection->addRandomCards(9, sets, 1, Constants::RARITY_U, NULL); - mCollection->addRandomCards(48, sets, 1, Constants::RARITY_C, NULL); + mCollection->addRandomCards(3, sets, 1, Constants::RARITY_R); + mCollection->addRandomCards(9, sets, 1, Constants::RARITY_U); + mCollection->addRandomCards(48, sets, 1, Constants::RARITY_C); //Boosters for (int i = 0; i < 2; i++) diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index a44f1aae2..b1855b014 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -254,22 +254,22 @@ void MTGCardInstance::addType(int type) SAFE_DELETE(e); } -void MTGCardInstance::addType(char * type_text) +void MTGCardInstance::addType(const string& type_text) { setSubtype(type_text); } -void MTGCardInstance::setType(const char * type_text) +void MTGCardInstance::setType(const string& type_text) { setSubtype(type_text); } -void MTGCardInstance::setSubtype(string value) +void MTGCardInstance::setSubtype(const string& value) { int id = MTGAllCards::findType(value); addType(id); } -int MTGCardInstance::removeType(string value, int removeAll) +int MTGCardInstance::removeType(const string& value, int removeAll) { int id = MTGAllCards::findType(value); return removeType(id, removeAll); diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index c97b838a3..7359271b7 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -381,10 +381,20 @@ void MTGAllCards::loadFolder(const string& infolder, const string& filename ) } } -int MTGAllCards::load(const char * config_file, const char * set_name, int) +int MTGAllCards::load(const string &config_file) +{ + return load(config_file, MTGSets::INTERNAL_SET); +} + +int MTGAllCards::load(const string& config_file, const string &set_name) +{ + const int set_id = setlist.Add(set_name); + return load(config_file, set_id); +} + +int MTGAllCards::load(const string &config_file, int set_id) { conf_read_mode = 0; - const int set_id = set_name ? setlist.Add(set_name) : MTGSets::INTERNAL_SET; MTGSetInfo *si = setlist.getInfo(set_id); int lineNumber = 0; @@ -532,7 +542,7 @@ int MTGAllCards::countBySet(int setId) } //TODO more efficient way ? -int MTGAllCards::countByType(const char * _type) +int MTGAllCards::countByType(const string &_type) { int result = 0; map::iterator it; @@ -772,7 +782,7 @@ int MTGDeck::totalPrice() return total; } -MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only,int difficultyRating) +MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_only, int difficultyRating) { total_cards = 0; database = _allcards; @@ -879,7 +889,7 @@ MTGCard * MTGDeck::getCardById(int mtgId) return database->getCardById(mtgId); } -int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, const char * _subtype, int * colors, int nbcolors) +int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, const string &_subtype, int * colors, int nbcolors) { if (howmany <= 0) return 1; @@ -900,8 +910,8 @@ int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, c int collectionTotal = database->totalCards(); if (!collectionTotal) return 0; - char subtype[4096]; - if (_subtype) sprintf(subtype, "%s", _subtype); + string subtype; + if (_subtype.size()) subtype = _subtype; vector subcollection; int subtotal = 0; @@ -911,7 +921,7 @@ int MTGDeck::addRandomCards(int howmany, int * setIds, int nbSets, int rarity, c int r = card->getRarity(); if (r != Constants::RARITY_T && (rarity == -1 || r == rarity) && // remove tokens card->setId != MTGSets::INTERNAL_SET && //remove cards that are defined in primitives. Those are workarounds (usually tokens) and should only be used internally - (!_subtype || card->data->hasSubtype(subtype))) + (!_subtype.size() || card->data->hasSubtype(subtype))) { int ok = 0; @@ -1265,7 +1275,7 @@ MTGSetInfo* MTGSets::randomSet(int blockId, int atleast) int blockSize(int blockId); -int MTGSets::Add(const char * name) +int MTGSets::Add(const string& name) { int setid = findSet(name); if (setid != -1) return setid; @@ -1344,7 +1354,7 @@ MTGSetInfo::~MTGSetInfo() SAFE_DELETE(mPack); } -MTGSetInfo::MTGSetInfo(string _id) +MTGSetInfo::MTGSetInfo(const string& _id) { string whitespaces(" \t\f\v\n\r"); id = _id; diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 1ebf044f8..eaecce696 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -162,7 +162,7 @@ int Constants::GetColorStringIndex(string mtgColor) return -1; } -const char* Constants::MTGPhaseNames[] = +const string Constants::MTGPhaseNames[] = { "---", "Untap", diff --git a/projects/mtg/src/PhaseRing.cpp b/projects/mtg/src/PhaseRing.cpp index 330790099..bb9fb82e3 100644 --- a/projects/mtg/src/PhaseRing.cpp +++ b/projects/mtg/src/PhaseRing.cpp @@ -142,9 +142,10 @@ bool PhaseRing::extraDamagePhase(int id) return false; } -const char * PhaseRing::phaseName(int id) +const string& PhaseRing::phaseName(int id) { - if (extraDamagePhase(id)) return "Combat Damage (2)"; + static const string combatPhase2("Combat Damage (2)"); + if (extraDamagePhase(id)) return combatPhase2; return Constants::MTGPhaseNames[id]; } diff --git a/projects/mtg/src/TestSuiteAI.cpp b/projects/mtg/src/TestSuiteAI.cpp index eeb279fd2..bb7e236ce 100644 --- a/projects/mtg/src/TestSuiteAI.cpp +++ b/projects/mtg/src/TestSuiteAI.cpp @@ -350,8 +350,8 @@ void TestSuiteGame::assertGame() if (observer->getCurrentGamePhase() != endState.phase) { sprintf(result, "==phase problem. Expected [ %s ](%i), got [ %s ](%i)==
", - Constants::MTGPhaseNames[endState.phase],endState.phase, - Constants::MTGPhaseNames[observer->getCurrentGamePhase()], observer->getCurrentGamePhase()); + Constants::MTGPhaseNames[endState.phase].c_str(),endState.phase, + Constants::MTGPhaseNames[observer->getCurrentGamePhase()].c_str(), observer->getCurrentGamePhase()); Log(result); error++; } From 6f083389c242d78acb2cc59b9f414a72b1609665 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Sat, 23 Nov 2013 13:00:03 +0100 Subject: [PATCH 55/66] Speedup MTGAllCards::countByType a bit --- projects/mtg/src/MTGDeck.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index 7359271b7..058c1d4c3 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -544,12 +544,14 @@ int MTGAllCards::countBySet(int setId) //TODO more efficient way ? int MTGAllCards::countByType(const string &_type) { + int type_id = findType(_type); + int result = 0; map::iterator it; for (it = collection.begin(); it != collection.end(); it++) { MTGCard * c = it->second; - if (c->data->hasType(_type)) + if (c->data->hasType(type_id)) { result++; } From 69c6745f53ae0ced7b44557a21c33be80cbec810 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Fri, 29 Nov 2013 13:33:33 +0100 Subject: [PATCH 56/66] Make getMenuText() return string. --- projects/mtg/include/ActionElement.h | 2 +- projects/mtg/include/AllAbilities.h | 166 +++++++++++++-------------- projects/mtg/include/MTGAbility.h | 6 +- projects/mtg/include/MTGRules.h | 32 +++--- projects/mtg/include/SimpleMenu.h | 2 +- projects/mtg/src/AllAbilities.cpp | 130 ++++++++++----------- projects/mtg/src/GameStateStory.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 6 +- projects/mtg/src/MTGRules.cpp | 12 +- projects/mtg/src/SimpleMenu.cpp | 2 +- 10 files changed, 180 insertions(+), 180 deletions(-) diff --git a/projects/mtg/include/ActionElement.h b/projects/mtg/include/ActionElement.h index bdd7007fe..aa3830e43 100644 --- a/projects/mtg/include/ActionElement.h +++ b/projects/mtg/include/ActionElement.h @@ -72,7 +72,7 @@ public: { return 0; } - virtual const char * getMenuText() + virtual const string getMenuText() { return "Ability"; } diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 6ff6c7521..7d446b399 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1081,7 +1081,7 @@ public: ManaCost * cost = NULL); int resolve(); - const char* getMenuText(); + const string getMenuText(); AACounter * clone() const; }; @@ -1100,7 +1100,7 @@ public: bool all,ManaCost * cost = NULL); int resolve(); - const char* getMenuText(); + const string getMenuText(); AARemoveAllCounter * clone() const; }; @@ -1110,7 +1110,7 @@ class AAResetDamage: public ActivatedAbility public: AAResetDamage(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, ManaCost * cost = NULL); int resolve(); - const char* getMenuText(); + const string getMenuText(); AAResetDamage * clone() const; }; @@ -1120,7 +1120,7 @@ public: string named; AAFakeAbility(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target,string _newName, ManaCost * cost = NULL); int resolve(); - const char* getMenuText(); + const string getMenuText(); AAFakeAbility * clone() const; }; @@ -1131,7 +1131,7 @@ public: AAFizzler(GameObserver* observer, int _id, MTGCardInstance * card, Spell * _target, ManaCost * _cost = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAFizzler* clone() const; }; @@ -1160,7 +1160,7 @@ public: string Cond; IfThenAbility(GameObserver* observer, int _id,MTGAbility * delayedAbility = NULL,MTGAbility * delayedElseAbility = NULL, MTGCardInstance * _source=NULL, Targetable * target = NULL, int type = 1,string Cond = ""); int resolve(); - const char * getMenuText(); + const string getMenuText(); IfThenAbility * clone() const; ~IfThenAbility(); }; @@ -1179,7 +1179,7 @@ public: void Update(float dt); - const char * getMenuText(); + const string getMenuText(); int testDestroy(); int isReactingToTargetClick(Targetable * card); @@ -1209,7 +1209,7 @@ public: bool CheckUserInput(JButton key); void Update(float dt); int resolve(); - const char * getMenuText(); + const string getMenuText(); int testDestroy(); int isReactingToTargetClick(Targetable * card); int reactToTargetClick(Targetable * object); @@ -1225,7 +1225,7 @@ class AAProliferate: public ActivatedAbility public: AAProliferate(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,ManaCost * cost = NULL); int resolve(); - const char* getMenuText(); + const string getMenuText(); AAProliferate * clone() const; ~AAProliferate(); }; @@ -1243,7 +1243,7 @@ public: int resolve(); int addToGame(); int destroy(); - const char * getMenuText(); + const string getMenuText(); MultiAbility * clone() const; ~MultiAbility(); }; @@ -1259,7 +1259,7 @@ public: GenericActivatedAbility(GameObserver* observer, string newName,string castRestriction,int _id, MTGCardInstance * card, MTGAbility * a, ManaCost * _cost, string limit = "",MTGAbility * sideEffects = NULL,string usesBeforeSideEffects = "", int restrictions = 0, MTGGameZone * dest = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); void Update(float dt); int testDestroy(); @@ -1274,7 +1274,7 @@ class AALibraryBottom: public ActivatedAbility public: AALibraryBottom(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target = NULL, ManaCost * _cost = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); AALibraryBottom * clone() const; }; @@ -1284,7 +1284,7 @@ class AACopier: public ActivatedAbility public: AACopier(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target = NULL, ManaCost * _cost = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); AACopier * clone() const; }; //imprint @@ -1293,7 +1293,7 @@ class AAPhaseOut: public ActivatedAbility public: AAPhaseOut(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target = NULL, ManaCost * _cost = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAPhaseOut * clone() const; }; //cloning...this makes a token thats a copy of the target. @@ -1310,7 +1310,7 @@ public: AACloner(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target = NULL, ManaCost * _cost = NULL, int who = 0, string abilitiesStringList = "",string typeslist = ""); int resolve(); - const char * getMenuText(); + const string getMenuText(); virtual ostream& toString(ostream& out) const; AACloner * clone() const; ~AACloner(); @@ -1326,7 +1326,7 @@ public: AAMover(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string dest,string _name, ManaCost * _cost = NULL); MTGGameZone * destinationZone(Targetable * target = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); const char * getMenuText(TargetChooser * fromTc); AAMover * clone() const; ~AAMover(); @@ -1342,7 +1342,7 @@ public: AARandomMover(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target, string tcs, string from, string to); MTGGameZone * destinationZone(Targetable * target = NULL,string zone = ""); int resolve(); - const char * getMenuText(); + const string getMenuText(); AARandomMover * clone() const; ~AARandomMover(); }; @@ -1356,7 +1356,7 @@ public: string menu; AABuryCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target); int resolve(); - const char * getMenuText(); + const string getMenuText(); AABuryCard * clone() const; ~AABuryCard(); }; @@ -1367,7 +1367,7 @@ public: MTGAbility * andAbility; AADestroyCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target); int resolve(); - const char * getMenuText(); + const string getMenuText(); AADestroyCard * clone() const; ~AADestroyCard(); }; @@ -1378,7 +1378,7 @@ public: MTGAbility * andAbility; AASacrificeCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target); int resolve(); - const char * getMenuText(); + const string getMenuText(); AASacrificeCard * clone() const; ~AASacrificeCard(); }; @@ -1389,7 +1389,7 @@ public: MTGAbility * andAbility; AADiscardCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target); int resolve(); - const char * getMenuText(); + const string getMenuText(); AADiscardCard * clone() const; ~AADiscardCard(); }; @@ -1409,7 +1409,7 @@ public: string tcString; GenericTargetAbility(GameObserver* observer, string newName, string castRestriction, int _id, MTGCardInstance * _source, TargetChooser * _tc, MTGAbility * a, ManaCost * _cost = NULL, string limit = "",MTGAbility * sideEffects = NULL,string usesBeforeSideEffects = "", int restrictions = 0, MTGGameZone * dest = NULL,string tcString =""); - const char * getMenuText(); + const string getMenuText(); ~GenericTargetAbility(); GenericTargetAbility * clone() const; int resolve(); @@ -1447,7 +1447,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { return "Ninjutsu"; } @@ -1479,7 +1479,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { return "Remove From Combat"; } @@ -1501,7 +1501,7 @@ public: AADrawer(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, ManaCost * _cost,string nbcardsStr, int who = TargetChooser::UNSET,bool noReplace = false); int resolve(); - const char * getMenuText(); + const string getMenuText(); AADrawer * clone() const; int getNumCards(); }; @@ -1521,7 +1521,7 @@ public: ACastRestriction(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, TargetChooser * _restrictionsScope, WParsedInt * _value, bool _modifyExisting, int _zoneId, int who = TargetChooser::UNSET); int addToGame(); int destroy(); - const char * getMenuText(); + const string getMenuText(); ACastRestriction * clone() const; ~ACastRestriction(); @@ -1536,7 +1536,7 @@ public: AInstantCastRestrictionUEOT(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, TargetChooser * _restrictionsScope, WParsedInt * _value, bool _modifyExisting, int _zoneId, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AInstantCastRestrictionUEOT * clone() const; ~AInstantCastRestrictionUEOT(); }; @@ -1549,7 +1549,7 @@ public: AALifer(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string life_s, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AALifer * clone() const; int getLife(); @@ -1562,7 +1562,7 @@ public: AAWinGame(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAWinGame * clone() const; }; @@ -1603,7 +1603,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { return Constants::MTGBasicAbilities[ability]; } @@ -1645,7 +1645,7 @@ public: return InstantAbility::addToGame(); } - const char * getMenuText() + const string getMenuText() { return Constants::MTGBasicAbilities[ability]; } @@ -1706,7 +1706,7 @@ public: return ActivatedAbility::addToGame(); } - const char * getMenuText() + const string getMenuText() { return ability->getMenuText(); } @@ -1862,7 +1862,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { sprintf(menuText,"Protection from %s",tcstr.c_str()); return menuText; @@ -2054,7 +2054,7 @@ public: ((MTGCardInstance *) target)->addToToughness(-wppt->toughness.getValue()); return 1; } - const char * getMenuText() + const string getMenuText() { if(PT.size()) { @@ -2147,7 +2147,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { return ability->getMenuText(); } @@ -2189,7 +2189,7 @@ public: return toAdd->addToGame(); } - const char * getMenuText() + const string getMenuText() { return ability->getMenuText(); } @@ -2287,7 +2287,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { return "Regenerate"; } @@ -2494,7 +2494,7 @@ public: SAFE_DELETE(ability); } - const char * getMenuText() + const string getMenuText() { if(ability) { @@ -2620,7 +2620,7 @@ public: SAFE_DELETE(ability); } - const char * getMenuText() + const string getMenuText() { //Special case for move if (AAMover * move = dynamic_cast(ability)) @@ -2806,7 +2806,7 @@ public: int equip(MTGCardInstance * equipped); int resolve(); - const char * getMenuText(); + const string getMenuText(); int testDestroy(); int destroy(); @@ -3034,7 +3034,7 @@ public: card->setAttacker(1); } - const char * getMenuText() + const string getMenuText() { sprintf(menuText, "Create %s", name.c_str()); return menuText; @@ -3135,7 +3135,7 @@ public: } } - const char * getMenuText() + const string getMenuText() { if(name.size()) return name.c_str(); @@ -3308,7 +3308,7 @@ public: return 0; } - const char * getMenuText() + const string getMenuText() { return ability->getMenuText(); } @@ -3520,7 +3520,7 @@ public: } } - const char * getMenuText() + const string getMenuText() { return ability->getMenuText(); } @@ -3543,7 +3543,7 @@ public: AASetHand(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int hand, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AASetHand * clone() const; }; @@ -3557,7 +3557,7 @@ public: AALifeSet(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, WParsedInt * life, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AALifeSet * clone() const; ~AALifeSet(); @@ -3574,7 +3574,7 @@ public: AADamager(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, string d, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); int getDamage(); AADamager * clone() const; @@ -3588,7 +3588,7 @@ public: AADamagePrevent(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int preventing, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AADamagePrevent * clone() const; ~AADamagePrevent(); }; @@ -3602,7 +3602,7 @@ public: AAAlterPoison(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int poison, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAAlterPoison * clone() const; ~AAAlterPoison(); }; @@ -3630,7 +3630,7 @@ class AATapper: public ActivatedAbility public: AATapper(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target, ManaCost * _cost = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); AATapper * clone() const; }; @@ -3640,7 +3640,7 @@ class AAUntapper: public ActivatedAbility public: AAUntapper(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target, ManaCost * _cost = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAUntapper * clone() const; }; @@ -3661,7 +3661,7 @@ class AAFrozen: public ActivatedAbility public: AAFrozen(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target, ManaCost * _cost = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAFrozen * clone() const; }; /* ghetto new target*/ @@ -3671,7 +3671,7 @@ public: bool retarget; AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget = false, ManaCost * _cost = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); AANewTarget * clone() const; }; /* morph*/ @@ -3682,7 +3682,7 @@ public: AAMorph(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target, ManaCost * _cost = NULL); int resolve(); int testDestroy(); - const char * getMenuText(); + const string getMenuText(); AAMorph * clone() const; }; /* flip*/ @@ -3694,7 +3694,7 @@ public: AAFlip(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,string flipStats); int resolve(); int testDestroy(); - const char * getMenuText(); + const string getMenuText(); AAFlip * clone() const; }; /* dynamic ability build*/ @@ -3759,7 +3759,7 @@ string menu; int resolve(); int activateMainAbility(MTGAbility * toActivate,MTGCardInstance * source , Damageable * target); int activateStored(); - const char * getMenuText(); + const string getMenuText(); AADynamic * clone() const; ~AADynamic(); }; @@ -3812,7 +3812,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { return "Swap power and toughness"; } @@ -3828,7 +3828,7 @@ public: AAExchangeLife(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAExchangeLife * clone() const; }; @@ -4064,7 +4064,7 @@ public: int reapplyCountersBonus(MTGCardInstance * rtarget= NULL,bool powerapplied=false,bool toughnessapplied=false); int testDestroy(); int destroy(); - const char * getMenuText(); + const string getMenuText(); ATransformer * clone() const; ~ATransformer(); }; @@ -4087,7 +4087,7 @@ public: ATransformerInstant(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, string types = "", string abilities = "",string newpower = "",bool newpowerfound = false,string newtoughness = "",bool newtoughnessfound = false,vectornewAbilitiesList = vector(),bool newAbilityFound = false,bool aForever = false, bool UYNT = false,string menutext = ""); int resolve(); - const char * getMenuText(); + const string getMenuText(); ATransformerInstant * clone() const; ~ATransformerInstant(); }; @@ -4103,7 +4103,7 @@ public: WParsedPT * newWppt; PTInstant(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, WParsedPT * wppt,string s = "",bool nonstatic = false); int resolve(); - const char * getMenuText(); + const string getMenuText(); PTInstant * clone() const; ~PTInstant(); }; @@ -4162,7 +4162,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { return "Exalted"; } @@ -4180,7 +4180,7 @@ public: ASwapPT * ability; ASwapPTUEOT(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target); int resolve(); - const char * getMenuText(); + const string getMenuText(); ASwapPTUEOT * clone() const; ~ASwapPTUEOT(); }; @@ -4257,7 +4257,7 @@ public: APreventDamageTypesUEOT(GameObserver* observer, int id, MTGCardInstance * source, string to, string from, int type = 0); int resolve(); int destroy(); - const char * getMenuText(); + const string getMenuText(); APreventDamageTypesUEOT * clone() const; ~APreventDamageTypesUEOT(); }; @@ -4274,7 +4274,7 @@ public: AVanishing(GameObserver* observer, int _id, MTGCardInstance * card, ManaCost * _cost, int restrictions = 0,int amount = 0,string counterName = ""); void Update(float dt); int resolve(); - const char * getMenuText(); + const string getMenuText(); AVanishing * clone() const; ~AVanishing(); }; @@ -4296,7 +4296,7 @@ public: void Update(float dt); int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); virtual ostream& toString(ostream& out) const; AUpkeep * clone() const; ~AUpkeep(); @@ -4322,7 +4322,7 @@ public: MTG_PHASE_UPKEEP,bool forcedestroy = false,bool next = true,bool myturn = true,bool opponentturn = true,bool once = false); void Update(float dt); int resolve(); - const char * getMenuText(); + const string getMenuText(); APhaseAction * clone() const; ~APhaseAction(); }; @@ -4336,7 +4336,7 @@ public: APhaseActionGeneric(GameObserver* observer, int _id, MTGCardInstance * card, MTGCardInstance * target, string sAbility, int restrictions = 0, int _phase = MTG_PHASE_UPKEEP,bool forcedestroy = false,bool next = true,bool myturn = false,bool opponentturn = false,bool once = false); int resolve(); - const char * getMenuText(); + const string getMenuText(); APhaseActionGeneric * clone() const; ~APhaseActionGeneric(); @@ -4356,7 +4356,7 @@ public: void Update(float dt); void resolveBlink(); int resolve(); - const char * getMenuText(); + const string getMenuText(); ABlink * clone() const; ~ABlink(); private: @@ -4374,7 +4374,7 @@ public: MTGAbility * stored; ABlinkGeneric(GameObserver* observer, int _id, MTGCardInstance * card, MTGCardInstance * _target,bool blinkueot=false,bool blinkForSource = false,bool blinkhand = false,MTGAbility * stored = NULL); int resolve(); - const char * getMenuText(); + const string getMenuText(); ABlinkGeneric * clone() const; ~ABlinkGeneric(); @@ -5280,7 +5280,7 @@ public: return 1; } - const char * getMenuText() + const string getMenuText() { return "phase alter"; } @@ -5299,7 +5299,7 @@ public: AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AADepleter * clone() const; }; @@ -5312,7 +5312,7 @@ public: AAModTurn(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbTurnStr, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAModTurn * clone() const; }; @@ -5323,7 +5323,7 @@ public: AAShuffle(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AAShuffle * clone() const; }; @@ -5336,7 +5336,7 @@ public: AARemoveMana(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, string ManaDesc, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AARemoveMana * clone() const; ~AARemoveMana(); @@ -5351,7 +5351,7 @@ public: AARandomDiscarder(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target,string nbcardsStr, ManaCost * _cost = NULL, int who = TargetChooser::UNSET); int resolve(); - const char * getMenuText(); + const string getMenuText(); AARandomDiscarder * clone() const; }; @@ -5523,7 +5523,7 @@ public: int testDestroy(){return 0;}; void Update(float dt); - const char * getMenuText(); + const string getMenuText(); int isReactingToTargetClick(Targetable * card); int reactToTargetClick(Targetable * object); MTGCardInstance * makeCard(); @@ -5640,7 +5640,7 @@ public: MTGAbility * abilityAltered; AASetColorChosen(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, int _color = 0 ,string toAdd = ""); int resolve(); - const char* getMenuText(); + const string getMenuText(); AASetColorChosen * clone() const; ~AASetColorChosen(); }; @@ -5653,7 +5653,7 @@ public: MTGAbility * abilityAltered; AASetTypeChosen(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, int _type = 0,string menu = "error" ,string toAdd = ""); int resolve(); - const char* getMenuText(); + const string getMenuText(); AASetTypeChosen * clone() const; ~AASetTypeChosen(); }; @@ -5667,7 +5667,7 @@ public: bool ANonWall; GenericChooseTypeColor(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, string toAdd = "",bool chooseColor = false,bool nonwall = false, ManaCost * cost = NULL); int resolve(); - const char* getMenuText(); + const string getMenuText(); GenericChooseTypeColor * clone() const; ~GenericChooseTypeColor(); @@ -5684,7 +5684,7 @@ public: MTGAbility * abilityAltered; AASetCoin(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, int side = -1,string toAdd = ""); int resolve(); - const char* getMenuText(); + const string getMenuText(); AASetCoin * clone() const; ~AASetCoin(); }; @@ -5695,7 +5695,7 @@ public: AASetCoin * setCoin; GenericFlipACoin(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, string toAdd = "", ManaCost * cost = NULL); int resolve(); - const char* getMenuText(); + const string getMenuText(); GenericFlipACoin * clone() const; ~GenericFlipACoin(); @@ -5714,7 +5714,7 @@ public: GenericPaidAbility(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target,string _newName,string _castRestriction,string _mayCost, string toAdd, ManaCost * cost = NULL); int resolve(); - const char* getMenuText(); + const string getMenuText(); GenericPaidAbility * clone() const; ~GenericPaidAbility(); diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index 71e04fd07..b9ecfa8cf 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -317,7 +317,7 @@ public: virtual TargetAbility* clone() const = 0; virtual void Render(); virtual int resolve(); - virtual const char * getMenuText(); + virtual const string getMenuText(); virtual ostream& toString(ostream& out) const; }; @@ -436,7 +436,7 @@ public: void Update(float dt); virtual GenericTriggeredAbility* clone() const; - const char * getMenuText(); + const string getMenuText(); ~GenericTriggeredAbility(); }; @@ -525,7 +525,7 @@ public: int isReactingToClick(MTGCardInstance * _card, ManaCost * mana = NULL); int resolve(); int reactToClick(MTGCardInstance* _card); - const char * getMenuText(); + const string getMenuText(); ~AManaProducer(); virtual AManaProducer * clone() const; }; diff --git a/projects/mtg/include/MTGRules.h b/projects/mtg/include/MTGRules.h index b601bd130..b524e42e2 100644 --- a/projects/mtg/include/MTGRules.h +++ b/projects/mtg/include/MTGRules.h @@ -73,7 +73,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGPutInPlayRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { return "cast card normally"; } @@ -87,7 +87,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGKickerRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { return "pay kicker"; } @@ -105,7 +105,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGAlternativeCostRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { if(alternativeName.size()) return alternativeName.c_str(); @@ -121,7 +121,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGBuyBackRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { return "cast and buy back"; } @@ -136,7 +136,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGFlashBackRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { return "flash back"; } @@ -150,7 +150,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGRetraceRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { return "retrace"; } @@ -165,7 +165,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGMorphCostRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { return "play morphed"; } @@ -181,7 +181,7 @@ public: string suspendmenu; virtual ostream& toString(ostream& out) const; MTGSuspendRule(GameObserver* observer, int _id); - const char * getMenuText(); + const string getMenuText(); virtual MTGSuspendRule * clone() const; }; @@ -195,7 +195,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGAttackRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { return "Attacker"; } @@ -213,7 +213,7 @@ public: int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); int reactToClick(MTGCardInstance * card); MTGPlaneswalkerAttackRule(GameObserver* observer, int _id); - const char * getMenuText() + const string getMenuText() { return "Attack Planeswalker"; } @@ -226,7 +226,7 @@ public: MTGCardInstance* attacker; AAPlaneswalkerAttacked(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target); int resolve(); - const char* getMenuText(); + const string getMenuText(); AAPlaneswalkerAttacked * clone() const; ~AAPlaneswalkerAttacked(); }; @@ -252,7 +252,7 @@ public: int reactToClick(MTGCardInstance * card); virtual ostream& toString(ostream& out) const; MTGBlockRule(GameObserver* observer, int _id); - const char * getMenuText(); + const string getMenuText(); virtual MTGBlockRule * clone() const; ~MTGBlockRule(); }; @@ -386,7 +386,7 @@ public: int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); int reactToClick(MTGCardInstance * card); int reactToClick(MTGCardInstance * card, int id); - const char * getMenuText() + const string getMenuText() { return "Momir"; } @@ -406,7 +406,7 @@ public: MTGCardInstance * genEquip(int id); MTGStoneHewerRule(GameObserver* observer, int _id, MTGAllCards * _collection); int receiveEvent(WEvent * event); - const char * getMenuText() + const string getMenuText() { return "Stone Hewer"; } @@ -419,7 +419,7 @@ class MTGHermitRule: public PermanentAbility public: MTGHermitRule(GameObserver* observer, int _id); int receiveEvent(WEvent * event); - const char * getMenuText() + const string getMenuText() { return "Hermit"; } @@ -447,7 +447,7 @@ public: int receiveEvent(WEvent * event); - const char * getMenuText() + const string getMenuText() { return "Deathtouch"; } diff --git a/projects/mtg/include/SimpleMenu.h b/projects/mtg/include/SimpleMenu.h index b68ca466c..f50d492e8 100644 --- a/projects/mtg/include/SimpleMenu.h +++ b/projects/mtg/include/SimpleMenu.h @@ -43,7 +43,7 @@ public: virtual bool CheckUserInput(JButton key); virtual void Update(float dt); using JGuiController::Add; - virtual void Add(int id, const char * Text, string desc = "", bool forceFocus = false); + virtual void Add(int id, const string &Text, string desc = "", bool forceFocus = false); int getmCurr(){return mCurr;} float getWidth(){return mWidth; } virtual void Close(); diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index d0f2cad43..a382ec057 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -71,7 +71,7 @@ int GenericActivatedAbility::resolve() return 0; } -const char * GenericActivatedAbility::getMenuText() +const string GenericActivatedAbility::getMenuText() { if(newName.size()) return newName.c_str(); @@ -133,7 +133,7 @@ int AAAlterPoison::resolve() return 0; } -const char * AAAlterPoison::getMenuText() +const string AAAlterPoison::getMenuText() { return "Poison"; } @@ -165,7 +165,7 @@ int AADamagePrevent::resolve() return 0; } -const char * AADamagePrevent::getMenuText() +const string AADamagePrevent::getMenuText() { return "Prevent Damage"; } @@ -237,7 +237,7 @@ AADamager::AADamager(GameObserver* observer, int _id, MTGCardInstance * _source, return damage.getValue(); } - const char * AADamager::getMenuText() + const string AADamager::getMenuText() { MTGCardInstance * _target = dynamic_cast(target); if(_target && _target->hasType(Subtypes::TYPE_PLANESWALKER)) @@ -276,7 +276,7 @@ AADepleter::AADepleter(GameObserver* observer, int _id, MTGCardInstance * card, return 1; } -const char * AADepleter::getMenuText() +const string AADepleter::getMenuText() { return "Deplete"; } @@ -311,7 +311,7 @@ AAModTurn::AAModTurn(GameObserver* observer, int _id, MTGCardInstance * card, Ta return 1; } - const char * AAModTurn::getMenuText() + const string AAModTurn::getMenuText() { WParsedInt numTurns(nbTurnStr, NULL, source); if(numTurns.getValue() > 0) @@ -354,7 +354,7 @@ int AALibraryBottom::resolve() return 0; } -const char * AALibraryBottom::getMenuText() +const string AALibraryBottom::getMenuText() { return "Bottom Of Library"; } @@ -382,7 +382,7 @@ int AACopier::resolve() return 0; } -const char * AACopier::getMenuText() +const string AACopier::getMenuText() { return "Copy"; } @@ -415,7 +415,7 @@ int AAPhaseOut::resolve() return 0; } -const char * AAPhaseOut::getMenuText() +const string AAPhaseOut::getMenuText() { return "Phase Out"; } @@ -506,7 +506,7 @@ AACounter::AACounter(GameObserver* observer, int id, MTGCardInstance * source, M return 0; } -const char* AACounter::getMenuText() +const string AACounter::getMenuText() { if (menu.size()) { @@ -695,7 +695,7 @@ int AARemoveAllCounter::resolve() return nb; } -const char* AARemoveAllCounter::getMenuText() +const string AARemoveAllCounter::getMenuText() { if (menu.size()) { @@ -773,7 +773,7 @@ int AAProliferate::resolve() } -const char* AAProliferate::getMenuText() +const string AAProliferate::getMenuText() { return "Proliferate"; } @@ -837,7 +837,7 @@ int GenericChooseTypeColor::resolve() } -const char* GenericChooseTypeColor::getMenuText() +const string GenericChooseTypeColor::getMenuText() { if(chooseColor) return "Choose a color"; @@ -899,7 +899,7 @@ int AASetColorChosen::resolve() return 1; } -const char* AASetColorChosen::getMenuText() +const string AASetColorChosen::getMenuText() { return Constants::MTGColorStrings[color]; } @@ -956,7 +956,7 @@ int AASetTypeChosen::resolve() return 1; } -const char* AASetTypeChosen::getMenuText() +const string AASetTypeChosen::getMenuText() { return menutext.c_str(); } @@ -1003,7 +1003,7 @@ int GenericFlipACoin::resolve() } -const char* GenericFlipACoin::getMenuText() +const string GenericFlipACoin::getMenuText() { return "Flip A Coin"; } @@ -1095,7 +1095,7 @@ int AASetCoin::resolve() return 1; } -const char* AASetCoin::getMenuText() +const string AASetCoin::getMenuText() { if(side == 1) return "Tails"; @@ -1186,7 +1186,7 @@ int GenericPaidAbility::resolve() return 1; } -const char* GenericPaidAbility::getMenuText() +const string GenericPaidAbility::getMenuText() { if (newName.size()) return newName.c_str(); @@ -1288,7 +1288,7 @@ int AAResetDamage::resolve() return 1; } -const char* AAResetDamage::getMenuText() +const string AAResetDamage::getMenuText() { return "Reset Damages"; } @@ -1309,7 +1309,7 @@ int AAFakeAbility::resolve() return 1; } -const char* AAFakeAbility::getMenuText() +const string AAFakeAbility::getMenuText() { if(named.size()) return named.c_str(); @@ -1356,7 +1356,7 @@ int AAFizzler::resolve() return 1; } -const char * AAFizzler::getMenuText() +const string AAFizzler::getMenuText() { return "Fizzle"; } @@ -1403,7 +1403,7 @@ int AABuryCard::resolve() return 0; } -const char * AABuryCard::getMenuText() +const string AABuryCard::getMenuText() { if(menu.size()) return menu.c_str(); @@ -1459,7 +1459,7 @@ int AADestroyCard::resolve() return 0; } -const char * AADestroyCard::getMenuText() +const string AADestroyCard::getMenuText() { return "Destroy"; } @@ -1515,7 +1515,7 @@ int AASacrificeCard::resolve() return 0; } -const char * AASacrificeCard::getMenuText() +const string AASacrificeCard::getMenuText() { return "Sacrifice"; } @@ -1570,7 +1570,7 @@ int AADiscardCard::resolve() return 0; } -const char * AADiscardCard::getMenuText() +const string AADiscardCard::getMenuText() { return "Discard"; } @@ -1634,7 +1634,7 @@ AADrawer::AADrawer(GameObserver* observer, int _id, MTGCardInstance * card, Targ return numCards.getValue(); } -const char * AADrawer::getMenuText() +const string AADrawer::getMenuText() { return "Draw"; } @@ -1663,7 +1663,7 @@ int AAFrozen::resolve() return 1; } -const char * AAFrozen::getMenuText() +const string AAFrozen::getMenuText() { return "Freeze"; } @@ -1728,7 +1728,7 @@ int AANewTarget::resolve() return 1; } -const char * AANewTarget::getMenuText() +const string AANewTarget::getMenuText() { return "New Target"; } @@ -1809,7 +1809,7 @@ int AAMorph::testDestroy() return 0; } -const char * AAMorph::getMenuText() +const string AAMorph::getMenuText() { return "Morph"; } @@ -1946,7 +1946,7 @@ int AAFlip::testDestroy() return 0; } -const char * AAFlip::getMenuText() +const string AAFlip::getMenuText() { string s = flipStats; sprintf(menuText, "Transform:%s", s.c_str()); @@ -2252,7 +2252,7 @@ int AADynamic::activateStored() return 1; } -const char * AADynamic::getMenuText() +const string AADynamic::getMenuText() { if (menu.size()) { @@ -2367,7 +2367,7 @@ int AALifer::getLife() return life.getValue(); } -const char * AALifer::getMenuText() +const string AALifer::getMenuText() { if(getLife() < 0) return "Life Loss"; @@ -2400,7 +2400,7 @@ int AASetHand::resolve() return 1; } -const char * AASetHand::getMenuText() +const string AASetHand::getMenuText() { return "Set Hand Size"; } @@ -2431,7 +2431,7 @@ int AALifeSet::resolve() return 1; } -const char * AALifeSet::getMenuText() +const string AALifeSet::getMenuText() { return "Set Life"; } @@ -2513,7 +2513,7 @@ int AACloner::resolve() } -const char * AACloner::getMenuText() +const string AACloner::getMenuText() { if (who == 1) return "Clone For Opponent"; @@ -2588,7 +2588,7 @@ int ACastRestriction::destroy() return 1; } -const char * ACastRestriction::getMenuText() +const string ACastRestriction::getMenuText() { if (modifyExisting) return "Additional Lands"; //hardoced because only the lands rule allows to modify existing rule for now @@ -2623,7 +2623,7 @@ int AInstantCastRestrictionUEOT::resolve() wrapper->addToGame(); return 1; } -const char * AInstantCastRestrictionUEOT::getMenuText() +const string AInstantCastRestrictionUEOT::getMenuText() { return ability->getMenuText(); } @@ -2717,14 +2717,14 @@ int AAMover::resolve() return 0; } -const char * AAMover::getMenuText() +const string AAMover::getMenuText() { if(named.size()) return named.c_str(); return "Move"; } -const char * AAMover::getMenuText(TargetChooser * tc) +const char* AAMover::getMenuText(TargetChooser * tc) { if(named.size()) return named.c_str(); @@ -2864,7 +2864,7 @@ int AARandomMover::resolve() return 0; } -const char * AARandomMover::getMenuText() +const string AARandomMover::getMenuText() { return "Dig"; } @@ -2902,7 +2902,7 @@ int AARandomDiscarder::resolve() return 1; } -const char * AARandomDiscarder::getMenuText() +const string AARandomDiscarder::getMenuText() { return "Discard Random"; } @@ -2929,7 +2929,7 @@ int AAShuffle::resolve() return 1; } -const char * AAShuffle::getMenuText() +const string AAShuffle::getMenuText() { return "Shuffle"; } @@ -3027,7 +3027,7 @@ int AARemoveMana::resolve() return 1; } -const char * AARemoveMana::getMenuText() +const string AARemoveMana::getMenuText() { if (mRemoveAll && !mManaDesc) return "Empty Manapool"; @@ -3066,7 +3066,7 @@ int AATapper::resolve() return 1; } -const char * AATapper::getMenuText() +const string AATapper::getMenuText() { return "Tap"; } @@ -3096,7 +3096,7 @@ int AAUntapper::resolve() return 1; } -const char * AAUntapper::getMenuText() +const string AAUntapper::getMenuText() { return "Untap"; } @@ -3177,7 +3177,7 @@ int AAWinGame::resolve() return 1; } -const char * AAWinGame::getMenuText() +const string AAWinGame::getMenuText() { return "Win Game"; } @@ -3268,7 +3268,7 @@ int IfThenAbility::resolve() return 0; } -const char * IfThenAbility::getMenuText() +const string IfThenAbility::getMenuText() { return ""; } @@ -3320,7 +3320,7 @@ void MayAbility::Update(float dt) } } -const char * MayAbility::getMenuText() +const string MayAbility::getMenuText() { return ability->getMenuText(); } @@ -3456,7 +3456,7 @@ int MenuAbility::resolve() return a->addToGame(); } -const char * MenuAbility::getMenuText() +const string MenuAbility::getMenuText() { if((abilities.size() > 1 && must)||(abilities.size() > 2 && !must)) return "choose one"; @@ -3657,7 +3657,7 @@ int MultiAbility::destroy() return ActivatedAbility::destroy(); } -const char * MultiAbility::getMenuText() +const string MultiAbility::getMenuText() { if (abilities.size() && abilities[0]) return abilities[0]->getMenuText(); @@ -3696,7 +3696,7 @@ GenericTargetAbility::GenericTargetAbility(GameObserver* observer, string newNam counters = 0; } -const char * GenericTargetAbility::getMenuText() +const string GenericTargetAbility::getMenuText() { if (!ability) return "Error"; @@ -4249,7 +4249,7 @@ int ATransformer::destroy() return 1; } -const char * ATransformer::getMenuText() +const string ATransformer::getMenuText() { if(menutext.size()) return menutext.c_str(); @@ -4282,7 +4282,7 @@ int ATransformerInstant::resolve() wrapper->addToGame(); return 1; } -const char * ATransformerInstant::getMenuText() +const string ATransformerInstant::getMenuText() { if(menu.size()) return menu.c_str(); @@ -4316,7 +4316,7 @@ int PTInstant::resolve() wrapper->addToGame(); return 1; } -const char * PTInstant::getMenuText() +const string PTInstant::getMenuText() { return ability->getMenuText(); } @@ -4347,7 +4347,7 @@ int ASwapPTUEOT::resolve() return 1; } -const char * ASwapPTUEOT::getMenuText() +const string ASwapPTUEOT::getMenuText() { return ability->getMenuText(); } @@ -4417,7 +4417,7 @@ int AAExchangeLife::resolve() return 0; } -const char * AAExchangeLife::getMenuText() +const string AAExchangeLife::getMenuText() { return "Exchange life"; } @@ -4655,7 +4655,7 @@ int APreventDamageTypesUEOT::destroy() return 1; } -const char * APreventDamageTypesUEOT::getMenuText() +const string APreventDamageTypesUEOT::getMenuText() { return ability->getMenuText(); } @@ -4725,7 +4725,7 @@ int AVanishing::resolve() return 1; } -const char * AVanishing::getMenuText() +const string AVanishing::getMenuText() { if(counterName.find("fade") != string::npos) return "Fading"; @@ -4821,7 +4821,7 @@ int AUpkeep::resolve() return 1; } -const char * AUpkeep::getMenuText() +const string AUpkeep::getMenuText() { return "Upkeep"; } @@ -4921,7 +4921,7 @@ int APhaseAction::resolve() return 0; } -const char * APhaseAction::getMenuText() +const string APhaseAction::getMenuText() { if(psMenuText.size()) return psMenuText.c_str(); @@ -4958,7 +4958,7 @@ int APhaseActionGeneric::resolve() return 1; } -const char * APhaseActionGeneric::getMenuText() +const string APhaseActionGeneric::getMenuText() { return ability->getMenuText(); } @@ -5116,7 +5116,7 @@ int ABlink::resolve() { return 0; } -const char * ABlink::getMenuText() +const string ABlink::getMenuText() { return "Blink"; } @@ -5147,7 +5147,7 @@ int ABlinkGeneric::resolve() return 1; } -const char * ABlinkGeneric::getMenuText() +const string ABlinkGeneric::getMenuText() { return "Blink"; } @@ -5369,7 +5369,7 @@ int AEquip::resolve() return 1; } -const char * AEquip::getMenuText() +const string AEquip::getMenuText() { if (isAttach) return "Attach"; @@ -5583,7 +5583,7 @@ int AACastCard::resolveSpell() return 0; } -const char * AACastCard::getMenuText() +const string AACastCard::getMenuText() { if(nameThis.size()) return nameThis.c_str(); diff --git a/projects/mtg/src/GameStateStory.cpp b/projects/mtg/src/GameStateStory.cpp index 621f66081..8ec25b7f5 100644 --- a/projects/mtg/src/GameStateStory.cpp +++ b/projects/mtg/src/GameStateStory.cpp @@ -65,7 +65,7 @@ void GameStateStory::Update(float dt) if (!menu && mEngine->GetButtonClick(JGE_BTN_MENU)) { menu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), 100, this, Fonts::MENU_FONT, SCREEN_WIDTH / 2 - 100, 25); - menu->Add(0, "Back to main menu"); + menu->Add(0, string("Back to main menu")); menu->Add(kCancelMenuID, "Cancel"); } if (menu) diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index aa44def2e..b3e10f976 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -4893,7 +4893,7 @@ int TargetAbility::resolve() return 0; } -const char * TargetAbility::getMenuText() +const string TargetAbility::getMenuText() { if (ability) return ability->getMenuText(); @@ -5423,7 +5423,7 @@ GenericTriggeredAbility::~GenericTriggeredAbility() SAFE_DELETE(destroyCondition); } -const char * GenericTriggeredAbility::getMenuText() +const string GenericTriggeredAbility::getMenuText() { return ability->getMenuText(); } @@ -5516,7 +5516,7 @@ int AManaProducer::reactToClick(MTGCardInstance * _card) return ActivatedAbility::activateAbility(); } -const char * AManaProducer::getMenuText() +const string AManaProducer::getMenuText() { if (menutext.size()) return menutext.c_str(); diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index 03101b281..b3ba2cd86 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -997,9 +997,9 @@ int MTGSuspendRule::reactToClick(MTGCardInstance * card) return 1; } -const char * MTGSuspendRule::getMenuText() +const string MTGSuspendRule::getMenuText() { - return suspendmenu.c_str(); + return suspendmenu; } ostream& MTGSuspendRule::toString(ostream& out) const @@ -1333,9 +1333,9 @@ int AAPlaneswalkerAttacked::resolve() return 1; } -const char* AAPlaneswalkerAttacked::getMenuText() +const string AAPlaneswalkerAttacked::getMenuText() { - return menuText.c_str(); + return menuText; } AAPlaneswalkerAttacked * AAPlaneswalkerAttacked::clone() const @@ -1597,9 +1597,9 @@ int MTGBlockRule::reactToClick(MTGCardInstance * card) return 1; } -const char * MTGBlockRule::getMenuText() +const string MTGBlockRule::getMenuText() { - return blockmenu.c_str(); + return blockmenu; } ostream& MTGBlockRule::toString(ostream& out) const diff --git a/projects/mtg/src/SimpleMenu.cpp b/projects/mtg/src/SimpleMenu.cpp index 3aaa15ad0..8fb514185 100644 --- a/projects/mtg/src/SimpleMenu.cpp +++ b/projects/mtg/src/SimpleMenu.cpp @@ -328,7 +328,7 @@ void SimpleMenu::Update(float dt) } } -void SimpleMenu::Add(int id, const char * text, string desc, bool forceFocus) +void SimpleMenu::Add(int id, const string& text, string desc, bool forceFocus) { SimpleMenuItem * smi = NEW SimpleMenuItem(this, id, fontId, text, 0, mY + SimpleMenuConst::kVerticalMargin + mCount * SimpleMenuConst::kLineHeight, (mCount == 0), autoTranslate); From e8407caa2a67bb0bb42020ecb91fb5efa49111cb Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Thu, 28 Nov 2013 17:23:16 +0100 Subject: [PATCH 57/66] Add TIXML_USE_STL compiler flag to psp makefile to make headers compatible --- projects/mtg/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile index dc4f2b7fe..a77114104 100644 --- a/projects/mtg/Makefile +++ b/projects/mtg/Makefile @@ -73,7 +73,7 @@ PSP_EBOOT_UNKPNG = pic0.png PSP_EBOOT_PIC1 = pic1.png INCDIR = ../../JGE/include ../../JGE/src/zipFS ../../JGE/include/psp ../../JGE/include/psp/freetype2 ../../JGE/src ../../projects/mtg/include ../../Boost LIBDIR = ../../JGE/lib/psp -CFLAGS = -O2 -G0 -DPSPFW3XX -DDEVHOOK -DUSE_PRECOMPILED_HEADERS=1 -DPSP +CFLAGS = -O2 -G0 -DPSPFW3XX -DDEVHOOK -DUSE_PRECOMPILED_HEADERS=1 -DPSP -DTIXML_USE_STL else OBJS += objs/TestSuiteAI.o INCDIR = -I../../JGE/include -I../../JGE/src -I/usr/X11/include -I../../projects/mtg/include -I../../Boost -I../../JGE/src/zipFS From 6699902c24caa1a37ae76283d4e6e110803ef1e9 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Thu, 28 Nov 2013 17:36:03 +0100 Subject: [PATCH 58/66] Add TIXML_USE_STL to android builds --- projects/mtg/Android/jni/Android.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/mtg/Android/jni/Android.mk b/projects/mtg/Android/jni/Android.mk index faa1067b3..e502bef9c 100644 --- a/projects/mtg/Android/jni/Android.mk +++ b/projects/mtg/Android/jni/Android.mk @@ -14,7 +14,7 @@ PNG_PATH := $(JGE_PATH)/Dependencies/libpng DEBUG ?= DEBUG LOCAL_CFLAGS += -DLINUX -DANDROID -DSDL_CONFIG -D_$(DEBUG) -LOCAL_CFLAGS += -D_STLP_USE_SIMPLE_NODE_ALLOC +LOCAL_CFLAGS += -D_STLP_USE_SIMPLE_NODE_ALLOC -DTIXML_USE_STL LOCAL_CFLAGS += -D__arm__ -D_REENTRANT -D_GLIBCXX__PTHREADS LOCAL_STATIC_LIBRARIES := libpng libjpeg LOCAL_SHARED_LIBRARIES := SDL From dbece750f8988af8641449da35cf1c42c47f140a Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Fri, 29 Nov 2013 13:51:13 +0100 Subject: [PATCH 59/66] Use tabs instead of spaces if the file uses tabs --- JGE/src/JAnimator.cpp | 8 ++++---- JGE/src/JOBJModel.cpp | 18 +++++++++--------- JGE/src/JParticleEffect.cpp | 32 ++++++++++++++++---------------- JGE/src/JResourceManager.cpp | 6 +++--- JGE/src/hge/hgefont.cpp | 2 +- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/JGE/src/JAnimator.cpp b/JGE/src/JAnimator.cpp index 802d2badd..fca367832 100644 --- a/JGE/src/JAnimator.cpp +++ b/JGE/src/JAnimator.cpp @@ -67,7 +67,7 @@ bool JAnimator::Load(const char* scriptFile) element = script->ToElement(); printf("---- Loading %s:%s\n", element->Value(), element->Attribute("name")); - string type[] = + string type[] = { "ANIMATION_TYPE_LOOPING", "ANIMATION_TYPE_ONCE_AND_STAY", @@ -76,9 +76,9 @@ bool JAnimator::Load(const char* scriptFile) "ANIMATION_TYPE_PINGPONG" }; - const char* aniType = element->Attribute("type"); + const char* aniType = element->Attribute("type"); for (int i=0;i<5;i++) - if (type[i] == aniType) + if (type[i] == aniType) { SetAnimationType(i); break; @@ -108,7 +108,7 @@ bool JAnimator::Load(const char* scriptFile) element = param->ToElement(); if (element != NULL) { - if (element->ValueStr() == "settings") + if (element->ValueStr() == "settings") { const char* quadName = element->Attribute("quad"); JQuad* quad = mResource->GetQuad(quadName); diff --git a/JGE/src/JOBJModel.cpp b/JGE/src/JOBJModel.cpp index 276c46a59..04e504a02 100644 --- a/JGE/src/JOBJModel.cpp +++ b/JGE/src/JOBJModel.cpp @@ -75,10 +75,10 @@ bool JOBJModel::Load(const char *modelName, const char *textureName) int count; - while (filePtr < size) - { + while (filePtr < size) + { filePtr = ReadLine(tmpLine, buffer, filePtr, size); - { + { if ((tmpLine[0] == '#') || (strlen(tmpLine) < 3)) { @@ -89,19 +89,19 @@ bool JOBJModel::Load(const char *modelName, const char *textureName) if (count == 4) { - if (string("vn") == s1) + if (string("vn") == s1) normalList.push_back(vert); - else if (string("vt") == s1) + else if (string("vt") == s1) texList.push_back(vert); - else if (string("v") == s1) + else if (string("v") == s1) vertList.push_back(vert); } else if (count == 3) { - if (string("vt") == s1) + if (string("vt") == s1) texList.push_back(vert); } - + } else if (tmpLine[0] == 'f') { @@ -211,7 +211,7 @@ bool JOBJModel::Load(const char *modelName, const char *textureName) if (textureName != NULL) mTexture = JRenderer::GetInstance()->LoadTexture(textureName); - return true; + return true; } diff --git a/JGE/src/JParticleEffect.cpp b/JGE/src/JParticleEffect.cpp index d56606846..a991b4f4e 100644 --- a/JGE/src/JParticleEffect.cpp +++ b/JGE/src/JParticleEffect.cpp @@ -90,7 +90,7 @@ bool JParticleEffect::Load(const char* filename) // FIELD_COUNT // }; - const string lifeValues[] = + const string lifeValues[] = { "speed", "size", @@ -104,7 +104,7 @@ bool JParticleEffect::Load(const char* filename) "gravity" }; - const string typeNames[] = + const string typeNames[] = { "POINT", "AREA", @@ -113,7 +113,7 @@ bool JParticleEffect::Load(const char* filename) "CIRCLE" }; - const string modeNames[] = + const string modeNames[] = { "REPEAT", "ONCE", @@ -149,32 +149,32 @@ bool JParticleEffect::Load(const char* filename) { element = param->ToElement(); - if (string("settings") == element->Attribute("name")) + if (string("settings") == element->Attribute("name")) { - if (string("NORMAL") == element->Attribute("blend")) + if (string("NORMAL") == element->Attribute("blend")) mParticleEmitters[mEmitterCount]->SetBlending(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA); - else if (string("ADDITIVE") == element->Attribute("blend")) + else if (string("ADDITIVE") == element->Attribute("blend")) mParticleEmitters[mEmitterCount]->SetBlending(BLEND_SRC_ALPHA, BLEND_ONE); for (unsigned int i=0;iAttribute("mode")) + if (modeNames[i] == element->Attribute("mode")) { mParticleEmitters[mEmitterCount]->mEmitterMode = i; #if defined (_DEBUG) - printf("emitter mode:%s\n", modeNames[i].c_str()); + printf("emitter mode:%s\n", modeNames[i].c_str()); #endif break; } } for (unsigned i=0;iAttribute("type")) + if (typeNames[i] == element->Attribute("type")) { mParticleEmitters[mEmitterCount]->mType = i; #if defined (_DEBUG) - printf("emitter type:%s\n", typeNames[i].c_str()); + printf("emitter type:%s\n", typeNames[i].c_str()); #endif break; } @@ -213,7 +213,7 @@ bool JParticleEffect::Load(const char* filename) } } - else if (string("quantity") == element->Attribute("name")) + else if (string("quantity") == element->Attribute("name")) { for (key = param->FirstChild(); key; key = key->NextSibling()) { @@ -227,7 +227,7 @@ bool JParticleEffect::Load(const char* filename) } } - else if (string("lifex") == element->Attribute("name")) + else if (string("lifex") == element->Attribute("name")) { if (element->QueryFloatAttribute("base", &baseValue) == TIXML_SUCCESS && element->QueryFloatAttribute("max", &value) == TIXML_SUCCESS) @@ -236,7 +236,7 @@ bool JParticleEffect::Load(const char* filename) mParticleEmitters[mEmitterCount]->mLifeMax= value; } } - else if (string("anglex") == element->Attribute("name")) + else if (string("anglex") == element->Attribute("name")) { if (element->QueryFloatAttribute("base", &baseValue) == TIXML_SUCCESS && element->QueryFloatAttribute("max", &value) == TIXML_SUCCESS) @@ -245,7 +245,7 @@ bool JParticleEffect::Load(const char* filename) mParticleEmitters[mEmitterCount]->mAngleMax= value*DEG2RAD; } } - else if (string("speedx") == element->Attribute("name")) + else if (string("speedx") == element->Attribute("name")) { if (element->QueryFloatAttribute("base", &baseValue) == TIXML_SUCCESS && element->QueryFloatAttribute("max", &value) == TIXML_SUCCESS) @@ -254,7 +254,7 @@ bool JParticleEffect::Load(const char* filename) mParticleEmitters[mEmitterCount]->mSpeedMax= value; } } - else if (string("sizex") == element->Attribute("name")) + else if (string("sizex") == element->Attribute("name")) { if (element->QueryFloatAttribute("base", &baseValue) == TIXML_SUCCESS && element->QueryFloatAttribute("max", &value) == TIXML_SUCCESS) @@ -267,7 +267,7 @@ bool JParticleEffect::Load(const char* filename) { for (int i=0;iAttribute("name")) + if (lifeValues[i] == element->Attribute("name")) { for (key = param->FirstChild(); key; key = key->NextSibling()) { diff --git a/JGE/src/JResourceManager.cpp b/JGE/src/JResourceManager.cpp index 6d7702f02..bd557d1f4 100644 --- a/JGE/src/JResourceManager.cpp +++ b/JGE/src/JResourceManager.cpp @@ -119,11 +119,11 @@ bool JResourceManager::LoadResource(const string& resourceName) element = node->ToElement(); if (element != NULL) { - if (element->ValueStr() == "texture") + if (element->ValueStr() == "texture") { CreateTexture(element->Attribute("name")); } - else if (element->ValueStr() == "quad") + else if (element->ValueStr() == "quad") { string quadName = element->Attribute("name"); string textureName = element->Attribute("texture"); @@ -170,7 +170,7 @@ bool JResourceManager::LoadResource(const string& resourceName) GetQuad(id)->SetHotSpot(hotspotX, hotspotY); } } - else if (element->ValueStr() == "font") + else if (element->ValueStr() == "font") { } diff --git a/JGE/src/hge/hgefont.cpp b/JGE/src/hge/hgefont.cpp index 02c18a4e5..9adc621b2 100644 --- a/JGE/src/hge/hgefont.cpp +++ b/JGE/src/hge/hgefont.cpp @@ -72,7 +72,7 @@ hgeFont::hgeFont(const char *szFont, bool bMipmap __attribute__((unused))) fileSys->CloseFile(); pdesc=_get_line(desc,linebuf); - if(strcmp(linebuf, FNTHEADERTAG)) + if(strcmp(linebuf, FNTHEADERTAG)) { // hge->System_Log("Font %s has incorrect format.", szFont); delete[] desc; From 031f2dbffba461072f130c31ea71eebe4abca22e Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Fri, 29 Nov 2013 18:20:41 +0100 Subject: [PATCH 60/66] Fix Valgrind warnings appearing during the test suit. --- JGE/src/JGfx-fake.cpp | 4 +--- JGE/src/pc/JGfx.cpp | 2 +- projects/mtg/include/AllAbilities.h | 1 + projects/mtg/src/ActionStack.cpp | 1 + projects/mtg/src/AllAbilities.cpp | 7 +++++++ projects/mtg/src/CardPrimitive.cpp | 3 +++ projects/mtg/src/CardSelector.cpp | 2 +- projects/mtg/src/GameOptions.cpp | 2 +- projects/mtg/src/MTGAbility.cpp | 3 +++ projects/mtg/src/MTGCardInstance.cpp | 3 +++ projects/mtg/src/StyleManager.cpp | 2 +- 11 files changed, 23 insertions(+), 7 deletions(-) diff --git a/JGE/src/JGfx-fake.cpp b/JGE/src/JGfx-fake.cpp index 917d1f7ab..a90097b2f 100644 --- a/JGE/src/JGfx-fake.cpp +++ b/JGE/src/JGfx-fake.cpp @@ -65,7 +65,7 @@ void JQuad::SetHotSpot(float x, float y) ////////////////////////////////////////////////////////////////////////// -JTexture::JTexture() : mBuffer(NULL) +JTexture::JTexture() : mWidth(0), mHeight(0), mBuffer(NULL) { mTexId = -1; } @@ -305,14 +305,12 @@ void JRenderer::TransferTextureToGLContext(JTexture& inTexture) JTexture* JRenderer::CreateTexture(int width, int height, int mode __attribute__((unused))) { JTexture *tex = new JTexture(); - return tex; } JTexture* JRenderer::LoadTexture(const char* filename, int mode, int textureFormat) { JTexture *tex = new JTexture(); - return tex; } diff --git a/JGE/src/pc/JGfx.cpp b/JGE/src/pc/JGfx.cpp index 6050eeeab..da598a336 100644 --- a/JGE/src/pc/JGfx.cpp +++ b/JGE/src/pc/JGfx.cpp @@ -343,7 +343,7 @@ void JQuad::SetHotSpot(float x, float y) ////////////////////////////////////////////////////////////////////////// -JTexture::JTexture() : mBuffer(NULL) +JTexture::JTexture() : mBuffer(NULL), mHeight(0), mWidth(0) { mTexId = -1; } diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 6ff6c7521..2aac5f654 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -1258,6 +1258,7 @@ public: GenericActivatedAbility(GameObserver* observer, string newName,string castRestriction,int _id, MTGCardInstance * card, MTGAbility * a, ManaCost * _cost, string limit = "",MTGAbility * sideEffects = NULL,string usesBeforeSideEffects = "", int restrictions = 0, MTGGameZone * dest = NULL); + GenericActivatedAbility(const GenericActivatedAbility& other); int resolve(); const char * getMenuText(); int isReactingToClick(MTGCardInstance * card, ManaCost * mana = NULL); diff --git a/projects/mtg/src/ActionStack.cpp b/projects/mtg/src/ActionStack.cpp index 6509bc217..140a38ecc 100644 --- a/projects/mtg/src/ActionStack.cpp +++ b/projects/mtg/src/ActionStack.cpp @@ -675,6 +675,7 @@ ActionStack::ActionStack(GameObserver* game) currentState = -1; mode = ACTIONSTACK_STANDARD; checked = 0; + lastActionController = NULL; if(!observer->getResourceManager()) return; for (int i = 0; i < 8; ++i) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index d0f2cad43..028293bdd 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -55,6 +55,12 @@ GenericActivatedAbility::GenericActivatedAbility(GameObserver* observer, string target = ability->target; } +GenericActivatedAbility::GenericActivatedAbility(const GenericActivatedAbility &other): + ActivatedAbility(other), NestedAbility(other), activeZone(other.activeZone), newName(other.newName) +{ + +} + int GenericActivatedAbility::resolve() { //Note: I've seen a similar block in some other MTGAbility, can this be refactored . @@ -105,6 +111,7 @@ int GenericActivatedAbility::testDestroy() GenericActivatedAbility * GenericActivatedAbility::clone() const { GenericActivatedAbility * a = NEW GenericActivatedAbility(*this); + a->ability = ability->clone(); return a; } diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 0af4460d5..fc206f609 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -84,6 +84,9 @@ int CardPrimitive::init() alias = 0; restrictions = NULL; dredgeAmount = 0; + + power = 0; + toughness = 0; return 1; } diff --git a/projects/mtg/src/CardSelector.cpp b/projects/mtg/src/CardSelector.cpp index cae1bee14..ce94a404c 100644 --- a/projects/mtg/src/CardSelector.cpp +++ b/projects/mtg/src/CardSelector.cpp @@ -66,7 +66,7 @@ CardSelector::SelectorMemory::SelectorMemory() } CardSelector::CardSelector(GameObserver *observer, DuelLayers* duel) : - CardSelectorBase(observer), active(NULL), duel(duel), limitor(NULL), bigpos(300, 145, 1.0, 0.0, 220) + CardSelectorBase(observer), active(NULL), duel(duel), limitor(NULL), bigpos(300, 145, 1.0, 0.0, 220), timer(0.0f) { } diff --git a/projects/mtg/src/GameOptions.cpp b/projects/mtg/src/GameOptions.cpp index b82265623..4e60d8d85 100644 --- a/projects/mtg/src/GameOptions.cpp +++ b/projects/mtg/src/GameOptions.cpp @@ -956,7 +956,7 @@ OptionMaxGrade::OptionMaxGrade() // MARK: OptionASkipPhase -OptionASkipPhase OptionASkipPhase::mDef; +OptionASkipPhase OptionASkipPhase::mDef = OptionASkipPhase(); OptionASkipPhase::OptionASkipPhase() { mDef.values.push_back(EnumDefinition::assoc(Constants::ASKIP_NONE, "Off")); diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index cebf7e5ac..6ce295848 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -4368,6 +4368,7 @@ MTGAbility::MTGAbility(GameObserver* observer, int id, MTGCardInstance * card) : aType = MTGAbility::UNKNOWN; mCost = NULL; forceDestroy = 0; + forcedAlive = 0; oneShot = 0; canBeInterrupted = true; } @@ -4381,6 +4382,7 @@ MTGAbility::MTGAbility(GameObserver* observer, int id, MTGCardInstance * _source aType = MTGAbility::UNKNOWN; mCost = NULL; forceDestroy = 0; + forcedAlive = 0; oneShot = 0; canBeInterrupted = true; } @@ -5451,6 +5453,7 @@ AManaProducer::AManaProducer(GameObserver* observer, int id, MTGCardInstance * c aType = MTGAbility::MANA_PRODUCER; setCost(_cost); output = _output; + tap = 0; Producing = producing; menutext = ""; DoesntEmpty = doesntEmpty; diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index a44f1aae2..7baaa63af 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -125,6 +125,7 @@ int MTGCardInstance::init() void MTGCardInstance::initMTGCI() { + X = 0; sample = ""; model = NULL; isToken = false; @@ -195,6 +196,8 @@ void MTGCardInstance::initMTGCI() lastController = NULL; regenerateTokens = 0; blocked = false; + graveEffects = false; + exileEffects = false; currentZone = NULL; cardsAbilities = vector(); data = this; //an MTGCardInstance point to itself for data, allows to update it without killing the underlying database item diff --git a/projects/mtg/src/StyleManager.cpp b/projects/mtg/src/StyleManager.cpp index e2005a7c5..e904808aa 100644 --- a/projects/mtg/src/StyleManager.cpp +++ b/projects/mtg/src/StyleManager.cpp @@ -25,7 +25,7 @@ void StyleManager::killRules() styles.clear(); } -StyleManager::StyleManager() +StyleManager::StyleManager(): topRule(0), topSize(0), playerSrc(0) { loadRules(); } From 0db2925e7a5fe2062199b0b4429dd9da04335de5 Mon Sep 17 00:00:00 2001 From: Tobias Loose Date: Fri, 29 Nov 2013 18:44:30 +0100 Subject: [PATCH 61/66] Fix initialization orders --- JGE/src/pc/JGfx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JGE/src/pc/JGfx.cpp b/JGE/src/pc/JGfx.cpp index da598a336..ea71b167c 100644 --- a/JGE/src/pc/JGfx.cpp +++ b/JGE/src/pc/JGfx.cpp @@ -343,7 +343,7 @@ void JQuad::SetHotSpot(float x, float y) ////////////////////////////////////////////////////////////////////////// -JTexture::JTexture() : mBuffer(NULL), mHeight(0), mWidth(0) +JTexture::JTexture() : mWidth(0), mHeight(0), mBuffer(NULL) { mTexId = -1; } From 965d4f6d450cb597ca2f3909e74f784c4b909cd0 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Fri, 29 Nov 2013 19:31:23 +0100 Subject: [PATCH 62/66] Fixes Windows project --- JGE/JGE.vcxproj | 6 +++--- projects/mtg/template.vcxproj | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/JGE/JGE.vcxproj b/JGE/JGE.vcxproj index 567c398e3..f39975b77 100644 --- a/JGE/JGE.vcxproj +++ b/JGE/JGE.vcxproj @@ -73,7 +73,7 @@ MaxSpeed OnlyExplicitInline src/zipFS;Dependencies/SDL/include;Dependencies/include;$(JGEEXTRAS);../Boost;../projects/mtg/include;include;%(AdditionalIncludeDirectories) - SDL_CONFIG;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + TIXML_USE_STL; SDL_CONFIG;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true MultiThreadedDLL true @@ -101,7 +101,7 @@ Disabled src/zipFS;Dependencies/SDL/include;Dependencies/include;$(JGEEXTRAS);../Boost;../projects/mtg/include;include;%(AdditionalIncludeDirectories) - SDL_CONFIG;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + TIXML_USE_STL; SDL_CONFIG;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDLL @@ -129,7 +129,7 @@ Full OnlyExplicitInline src/zipFS;Dependencies/SDL/include;Dependencies/include;$(JGEEXTRAS);../Boost;../projects/mtg/include;include;%(AdditionalIncludeDirectories) - SDL_CONFIG;WIN32;NDEBUG;_LIB;_SECURE_SCL=0;_HAS_ITERATOR_DEBBUGING=0;%(PreprocessorDefinitions) + TIXML_USE_STL; SDL_CONFIG;WIN32;NDEBUG;_LIB;_SECURE_SCL=0;_HAS_ITERATOR_DEBBUGING=0;%(PreprocessorDefinitions) true MultiThreadedDLL true diff --git a/projects/mtg/template.vcxproj b/projects/mtg/template.vcxproj index 96f355a51..9fe22b571 100644 --- a/projects/mtg/template.vcxproj +++ b/projects/mtg/template.vcxproj @@ -108,7 +108,7 @@ MaxSpeed OnlyExplicitInline ./include;$(MTGEXTRAS);../../JGE/include;../../JGE/Dependencies/include;../../Boost;../../JGE/Dependencies/SDL/include;../../JGE/src/zipFS;%(AdditionalIncludeDirectories) - SDL_CONFIG;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + TIXML_USE_STL; SDL_CONFIG;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true MultiThreadedDLL true @@ -157,7 +157,7 @@ Disabled ./include;$(MTGEXTRAS);../../JGE/include;../../JGE/Dependencies/include;../../Boost;../../JGE/Dependencies/SDL/include;../../JGE/src/zipFS;%(AdditionalIncludeDirectories) - SDL_CONFIG;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + TIXML_USE_STL; SDL_CONFIG;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL .\Debug/template.pch @@ -209,7 +209,7 @@ Full OnlyExplicitInline ./include;$(MTGEXTRAS);../../JGE/include;../../JGE/Dependencies/include;../../Boost;../../JGE/Dependencies/SDL/include;../../JGE/src/zipFS;%(AdditionalIncludeDirectories) - SDL_CONFIG;WIN32;NDEBUG;_WINDOWS;_SECURE_SCL=0;_HAS_ITERATOR_DEBBUGING=0;%(PreprocessorDefinitions) + TIXML_USE_STL; SDL_CONFIG;WIN32;NDEBUG;_WINDOWS;_SECURE_SCL=0;_HAS_ITERATOR_DEBBUGING=0;%(PreprocessorDefinitions) true MultiThreadedDLL true @@ -261,7 +261,7 @@ Disabled ./include;$(MTGEXTRAS);../../JGE/include;../../JGE/Dependencies/include;../../Boost;../../JGE/Dependencies/SDL/include;../../JGE/src/zipFS;%(AdditionalIncludeDirectories) - SDL_CONFIG;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + TIXML_USE_STL; SDL_CONFIG;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL From 4095676b6ba7055b250caf2c5ee010a8ac6dde21 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Fri, 29 Nov 2013 22:07:45 +0100 Subject: [PATCH 63/66] Fixed memory leak introduced in #555 --- projects/mtg/src/AllAbilities.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 9c1b1767f..53ba1bcbe 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -5323,6 +5323,7 @@ int AEquip::unequip() { MTGAbility * a = currentAbilities[i]; if (dynamic_cast (a) || dynamic_cast (a) || dynamic_cast (a) + || dynamic_cast (AbilityFactory::getCoreAbility(a)) || (a->aType == MTGAbility::STANDARD_TOKENCREATOR && a->oneShot)) { SAFE_DELETE(a); From bf0a0a1580eba5233e5594329323cdaf366f8b79 Mon Sep 17 00:00:00 2001 From: xawotihs Date: Sat, 30 Nov 2013 19:32:55 +0100 Subject: [PATCH 64/66] Build the graphics version in release instead of debug. --- travis-script.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/travis-script.sh b/travis-script.sh index 4dbe2fbc1..17f0fbdec 100755 --- a/travis-script.sh +++ b/travis-script.sh @@ -18,11 +18,11 @@ ant debug -f projects/mtg/Android/build.xml # we're building a Qt version with GUI here mkdir qt-gui-build cd qt-gui-build -qmake ../projects/mtg/wagic-qt.pro CONFIG+=debug CONFIG+=graphics +qmake ../projects/mtg/wagic-qt.pro CONFIG+=release CONFIG+=graphics make -j 8 cd .. -# let's try an Intel linux binary +# let's try an Intel linux binary in debug text-mode-only qmake projects/mtg/wagic-qt.pro CONFIG+=console CONFIG+=debug DEFINES+=CAPTURE_STDERR make -j 8 From a70259b5ba5fed02848561907a4f24d1ad0c5848 Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Sun, 1 Dec 2013 00:59:16 +0400 Subject: [PATCH 65/66] Fixed: Assembly-Worker didn't appear as creature type For artifact creatures the parent type TYPE_ARTIFACT was used and therefore that creature's subtype wasn't added in full list. --- projects/mtg/src/CardPrimitive.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/projects/mtg/src/CardPrimitive.cpp b/projects/mtg/src/CardPrimitive.cpp index 8372eb0c1..b399bfb07 100644 --- a/projects/mtg/src/CardPrimitive.cpp +++ b/projects/mtg/src/CardPrimitive.cpp @@ -228,6 +228,9 @@ void CardPrimitive::setSubtype(const string& value) } } + // "Artifact Creature" should have "Creature" as parent type + if (parentType == Subtypes::TYPE_ARTIFACT && isCreature()) + parentType = Subtypes::TYPE_CREATURE; int id = MTGAllCards::add(value, parentType); addType(id); From 9effa7c975f38ec815c4987fb9822408bee6ab0a Mon Sep 17 00:00:00 2001 From: Dmitry Panin Date: Sun, 1 Dec 2013 01:01:57 +0400 Subject: [PATCH 66/66] Slightly changed formatting while investigating src --- projects/mtg/include/MTGDeck.h | 2 +- projects/mtg/src/AllAbilities.cpp | 12 ++++++------ projects/mtg/src/MTGAbility.cpp | 4 ++-- projects/mtg/src/Subtypes.cpp | 7 ++++--- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/projects/mtg/include/MTGDeck.h b/projects/mtg/include/MTGDeck.h index 577d83c8f..c17e83189 100644 --- a/projects/mtg/include/MTGDeck.h +++ b/projects/mtg/include/MTGDeck.h @@ -138,7 +138,7 @@ public: static int findType(string subtype, bool forceAdd = true) { boost::mutex::scoped_lock lock(instance->mMutex); - int result = instance->subtypesList.find(subtype, forceAdd); + int result = instance->subtypesList.find(subtype, forceAdd); return result; }; static int add(string value, unsigned int parentType) { diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index 53ba1bcbe..feaccb371 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -823,13 +823,13 @@ int GenericChooseTypeColor::resolve() for (size_t i = 0; i < values.size(); ++i) { string menu = values[i]; - if(!ANonWall || (menu != "wall" && menu != "Wall")) + if (!ANonWall || (menu != "wall" && menu != "Wall")) { - setType = NEW AASetTypeChosen(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, i,menu,baseAbility); - MTGAbility * set = setType->clone(); - set->oneShot = true; - selection.push_back(set); - SAFE_DELETE(setType); + setType = NEW AASetTypeChosen(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, i,menu,baseAbility); + MTGAbility * set = setType->clone(); + set->oneShot = true; + selection.push_back(set); + SAFE_DELETE(setType); } } } diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index 5a5fb68ca..022efba29 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1145,7 +1145,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG } - if(s.compare(0, strlen("chooseacolor "), "chooseacolor ") == 0 || s.compare(0, strlen("chooseatype "), "chooseatype ") == 0) + if (StartsWith(s, "chooseacolor ") || StartsWith(s, "chooseatype ")) { MTGAbility * choose = parseChooseActionAbility(s,card,spell,target,0,id); choose = NEW GenericActivatedAbility(observer, "","",id, card,choose,NULL); @@ -3272,7 +3272,7 @@ MTGAbility * AbilityFactory::parseChooseActionAbility(string s,MTGCardInstance * a->canBeInterrupted = false; return a; } - //choose a color + //choose a color vector splitChooseAColor = parseBetween(s, "chooseacolor ", " chooseend"); if (splitChooseAColor.size()) { diff --git a/projects/mtg/src/Subtypes.cpp b/projects/mtg/src/Subtypes.cpp index c8a9d170e..446aec08e 100644 --- a/projects/mtg/src/Subtypes.cpp +++ b/projects/mtg/src/Subtypes.cpp @@ -54,7 +54,9 @@ int Subtypes::add(string value, unsigned int parentType) } if (isSubType(subtype) && (parentType == TYPE_CREATURE)) { - if(value != "forest" && value != "Forest")//http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=136196 one creature with a land subtype exist, but the card has special ruling. + if (value != "forest" && value != "Forest") + //http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=136196 + //one creature with a land subtype exist, but the card has special ruling. subtypesCreature.push_back(value); } return subtype; @@ -115,8 +117,7 @@ void Subtypes::sortSubTypes() const vector& Subtypes::getCreatureValuesById() { - sort(subtypesCreature.begin(),subtypesCreature.end()); - subtypesCreature.erase(unique(subtypesCreature.begin(),subtypesCreature.end()),subtypesCreature.end()); + sortSubTypes(); return subtypesCreature; }