Compare commits

..

15 Commits

Author SHA1 Message Date
xawotihs 14d4bede9a Linked mingw32 rcc 2013-12-31 17:45:01 +01:00
xawotihs 8636a99d0d Activates qt resources only on windows as g++ seems to crash on Travis VM. 2013-12-31 17:18:14 +01:00
xawotihs 73cdbd6b88 And again 2013-12-31 16:58:17 +01:00
xawotihs 3482afeb84 Should fix the build of the graphics versions 2013-12-31 16:08:59 +01:00
xawotihs de40146462 Something is weird with the -- in the travis build script... 2013-12-31 15:49:21 +01:00
xawotihs 94d5a85043 Tries to remove weird characters in travis build file 2013-12-31 00:08:46 +01:00
xawotihs 4811fbcc9f Activates qt resources into graphics Qt build 2013-12-30 23:41:50 +01:00
xawotihs 6fd136a211 Fixed JSfx with JMOD. 2013-12-29 18:37:26 +01:00
xawotihs d98640fc01 Fixed android JGfx compilation 2013-12-29 12:38:35 +01:00
xawotihs 685317b457 Installs psp HGE lib 2013-12-28 18:02:32 +01:00
xawotihs a9a59d7b8e Tries to build PSP HGE lib 2013-12-28 17:52:37 +01:00
xawotihs fe9ad84ee5 More PSP compilation fixes. 2013-12-28 12:15:52 +01:00
xawotihs 3f43648b22 More PSP fixes. 2013-12-28 11:44:00 +01:00
xawotihs afb4c4605b Fixed PSP cross compilation issues. 2013-12-28 01:05:53 +01:00
xawotihs fec4468aea Updated JFileSystem implementation to be compatible with Qt resources. 2013-12-28 00:38:02 +01:00
135 changed files with 1496 additions and 16490 deletions
+21 -50
View File
@@ -2,59 +2,30 @@ language: cpp
branches:
except:
- latest-master
before_install:
- export BUILD_PSP=YES
- export BUILD_ANDROID=YES
- export BUILD_Qt=YES
- export BUILD_MAC=YES
- sudo apt-get update -qq
# Building for PSP here
- if [ "$BUILD_PSP" == "YES" ]; then
export PSPDEV="$TRAVIS_BUILD_DIR/opt/pspsdk" &&
export PSPSDK="$PSPDEV/psp/sdk" &&
export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" &&
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;
fi
# Building for Android here
- if [ "$BUILD_ANDROID" == "YES" ]; then
export ANDROID="android-sdk-linux/tools/android" &&
if [ `uname -m` = x86_64 ]; then sudo apt-get install -qq --force-yes libgd2-xpm ia32-libs ia32-libs-multiarch jq; fi &&
wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2 -nv &&
wget http://dl.google.com/android/android-sdk_r24.3.3-linux.tgz -nv;
fi
# Building for Qt here
- if [ "$BUILD_Qt" == "YES" ]; then
sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa &&
sudo apt-get update -qq &&
sudo apt-get install -qq qt5-qmake qtbase5-dev qtdeclarative5-dev qttools5-dev qtmultimedia5-dev pulseaudio libpulse-dev &&
export QMAKE="qmake -qt=qt5";
fi
- 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:
- if [ "$BUILD_PSP" == "YES" ]; then
tar -x --xz -f sdk.lzma;
fi
- if [ "$BUILD_ANDROID" == "YES" ]; then
tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 &&
tar -zxf android-sdk_r24.3.3-linux.tgz &&
$ANDROID list sdk --extended -a &&
echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-22.0.1,android-10 --no-ui --force --no-https;
fi
- sudo add-apt-repository ppa:tobydox/mingw -y
- 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 jq mingw32-x-gcc mingw32-x-qt; fi
- sudo ln -s /opt/mingw32/bin/moc /opt/mingw32/bin/i686-w64-mingw32-moc
- sudo ln -s /opt/mingw32/bin/rcc /opt/mingw32/bin/i686-w64-mingw32-rcc
- 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 list sdk -a
- echo yes | $ANDROID update sdk -a --filter 1,2,5,19 --no-ui --force > log.txt
- sudo pip install pyjavaproperties
- sudo pip install github3.py
- sudo pip install cpp-coveralls
script: ./travis-script.sh
env:
global:
- secure: "EBzr1+qjQsOhn0s+tcFmXR1jP9B0xiOSXuXbRXWZ1OEHNvp8+A5/pS84LYVFlaZqmxr5dApxvPtwhgLIUbQ3EPXm8LpC3KgSD4dS+9/QMbxhe5TK4oczgFRGcDTMJQZsCzhOh7hp3tbcbJg5Gp+VT7aFjFQSHDGwhzSJXsXwh/8="
- secure: "X5dTQfofqAutnXxmu11Ep2MQ5QYnMN8m0AITRtwymhEF2UclcOudI1+skPtuhAGbWQnSO+lhunV3cvMfw2/Ml3k/VDz6VdFSKFrzAu7ja1VLJfcxr7chi0s8q30pVBb66tGydjIBac3B+RQyqgmZQW1frbRrhC/kPFQ6wPWOJdQ="
- secure: "T97NUPnxCpVZ/c5HH0zfo0FO3DPSRMSmze58ubW5EUTZOjAMtEt+OFdsrNZvUTCugUj2M1agtonZbAbczpaAL+lgZcHDgXgWMkfO0pMnsWX1yyCNqMuE/iTMpJr/xsLQeyWlftWjJLsseQU45abZsd1XVmda/G+ZhrDLF1y55SA="
secure: "fJgWlCFbde96OSQNGKUmowGX+ERPeqP+n1EOMf1+FJzOU4DdkTLRAlV5+5qnEX9jB/3mWN6iPpmG1qEz/SdDG3KHxJYs4ZU/Lu485O24zZ/+GdYBNsrvhPD9ckPGEMLDa1foEVTDnW0Dlkz3BCFcszjhtXGUJv7v6Pj6LRk1Mg8="
script: "tools/travis-script.sh"
after_success:
- coveralls -b . -e JGE/src -e JGE/include -i projects/mtg/include -i projects/mtg/src --gcov-options '\-lp'
- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l core.zip -r Wagic-core.zip -b $TRAVIS_BRANCH
- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l projects/mtg/Android/bin/Wagic-debug.apk -r Wagic-android.apk -b $TRAVIS_BRANCH
- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l projects/mtg/psprelease.zip -r Wagic-psp.zip -b $TRAVIS_BRANCH
script: "./travis-script.sh"
after_success: ./upload-binaries.sh
-80
View File
@@ -1,80 +0,0 @@
# Changelog
## [latest-master] (https://github.com/WagicProject/wagic/tree/latest-master)
#### 08/12/14
- *Merged pull-request:* Fix for guild_keywords Devotion, added some "Chroma" cards [\#606](https://github.com/WagicProject/wagic/pull/606) ([kevlahnota](https://github.com/kevlahnota))
- *Merged pull-request:* added guild keywords, added specific life cost [\#605](https://github.com/WagicProject/wagic/pull/605) ([kevlahnota](https://github.com/kevlahnota))
- *Merged pull-request:* Buyback issue and a fix [\#604](https://github.com/WagicProject/wagic/pull/604) ([apollovy](https://github.com/apollovy))
- *Merged pull-request:* Feature/ios update xcode5.1 [\#602](https://github.com/WagicProject/wagic/pull/602) ([mjnguyen](https://github.com/mjnguyen))
- *Merged pull-request:* Remove dead code and fix circular initialization [\#601](https://github.com/WagicProject/wagic/pull/601) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* update android build tools version [\#600](https://github.com/WagicProject/wagic/pull/600) ([Rolzad73](https://github.com/Rolzad73))
- *Merged pull-request:* Attempt to make android tools fetching for TravisCI explicit and futureproof [\#599](https://github.com/WagicProject/wagic/pull/599) ([Rolzad73](https://github.com/Rolzad73))
- *Merged pull-request:* Damager keyword [\#598](https://github.com/WagicProject/wagic/pull/598) ([bjornsnoen](https://github.com/bjornsnoen))
- *Merged pull-request:* Fix a rarity mistake and a grammatical error [\#596](https://github.com/WagicProject/wagic/pull/596) ([bjornsnoen](https://github.com/bjornsnoen))
- *Merged pull-request:* Fix bug where the phase wheel got out of sync [\#588](https://github.com/WagicProject/wagic/pull/588) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* More easing [\#586](https://github.com/WagicProject/wagic/pull/586) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Added Avatar Tokens created by Ajani Goldmane. [\#585](https://github.com/WagicProject/wagic/pull/585) ([bjornsnoen](https://github.com/bjornsnoen))
- *Merged pull-request:* Cleanup, usability fixes and source code documentation for DeckView.h and GridDeckView.h [\#583](https://github.com/WagicProject/wagic/pull/583) ([ZobyTwo](https://github.com/ZobyTwo))
- *Fixed bug:* Blight does not destroy at the end of turn but right now [\#592](https://github.com/WagicProject/wagic/issues/592)
- *Fixed bug:* game freezes on Android when the phone returns from "sleep mode" [\#544](https://github.com/WagicProject/wagic/issues/544)
- *Fixed bug:* Android port needs to be able to respond to attaching/detaching devices to it [\#522](https://github.com/WagicProject/wagic/issues/522)
## [alpha-195] (https://github.com/WagicProject/wagic/tree/alpha-195)
#### 07/12/13
- *Merged pull-request:* Reset positions and filters when reopening the editor [\#578](https://github.com/WagicProject/wagic/pull/578) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Deck viewer [\#577](https://github.com/WagicProject/wagic/pull/577) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Do not specify the system directory in JGE [\#576](https://github.com/WagicProject/wagic/pull/576) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Changed Travis build file to use Android API 10 and Android build tools 18.1.1 [\#575](https://github.com/WagicProject/wagic/pull/575) ([Rolzad73](https://github.com/Rolzad73))
- *Merged pull-request:* Feature/play from grave [\#574](https://github.com/WagicProject/wagic/pull/574) ([pankdm](https://github.com/pankdm))
- *Merged pull-request:* Fix Valgrind warnings appearing during the test suit. [\#573](https://github.com/WagicProject/wagic/pull/573) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Strings 2 [\#572](https://github.com/WagicProject/wagic/pull/572) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Android travis ci [\#570](https://github.com/WagicProject/wagic/pull/570) ([xawotihs](https://github.com/xawotihs))
- *Merged pull-request:* Android NDK build fix [\#569](https://github.com/WagicProject/wagic/pull/569) ([Rolzad73](https://github.com/Rolzad73))
- *Merged pull-request:* Add a few namespaces and fix header guards. [\#564](https://github.com/WagicProject/wagic/pull/564) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Updated deckmenu.cpp to properly render deck description and summary [\#562](https://github.com/WagicProject/wagic/pull/562) ([citiral](https://github.com/citiral))
- *Merged pull-request:* Fix some valgrind memcheck warnings. However there remains one... [\#561](https://github.com/WagicProject/wagic/pull/561) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Remove some dead code [\#560](https://github.com/WagicProject/wagic/pull/560) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Show output only for failing tests [\#559](https://github.com/WagicProject/wagic/pull/559) ([pankdm](https://github.com/pankdm))
- *Merged pull-request:* Defines/Typos [\#557](https://github.com/WagicProject/wagic/pull/557) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Simplify Damage::resolve a bit [\#556](https://github.com/WagicProject/wagic/pull/556) ([ZobyTwo](https://github.com/ZobyTwo))
- *Merged pull-request:* Fix cranial plating [\#555](https://github.com/WagicProject/wagic/pull/555) ([pankdm](https://github.com/pankdm))
- *Merged pull-request:* Android cleanup [\#1](https://github.com/WagicProject/wagic/pull/1) ([Rolzad73](https://github.com/Rolzad73))
- *Fixed bug:* Iona and Nin don't work [\#527](https://github.com/WagicProject/wagic/issues/527)
- *Closed issue:* Less verbose output of tests at Travis [\#558](https://github.com/WagicProject/wagic/issues/558)
## [wagic-0.19.2] (https://github.com/WagicProject/wagic/tree/wagic-v0.19.2)
#### 28/10/13
-128
View File
@@ -1,128 +0,0 @@
#ifndef DOWNLOADER_H
#define DOWNLOADER_H
//-------------------------------------------------------------------------------------
//
// This class handles download of remote resources (any kind of file)
// All the resources are stored locally in the userPath
// For every resources, the downloader verifies if the resource was modifed
// on the server before downloading the update. The Downloader maintains a catalogue
// of resource downloaded to be able to check if they need to be updated.
//
// The interface can be used completly synchronously by the application and some
// context or message loop is needed in the implementation of this interface
//
// Note that the Downloader could in theory by implemented on top of JNetwork.
//
//-------------------------------------------------------------------------------------
#include <string>
#include <ostream>
#include <istream>
#include <fstream>
#include <map>
#include "Threading.h"
#ifdef QT_CONFIG
#include <QObject>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#endif
using namespace std;
class DownloadRequest
#ifdef QT_CONFIG
: public QObject
#endif
{
#ifdef QT_CONFIG
Q_OBJECT
private slots:
#endif
void fileDownloaded();
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
#ifdef QT_CONFIG
signals:
void percentChanged(int percent);
void statusChanged(int);
#endif
public:
typedef enum {
NOT_PRESENT,
DOWNLOADING,
DOWNLOADED,
DOWNLOAD_ERROR
} DownloadStatus;
protected:
string mLocalPath;
string mRemoteResourceURL;
// previous one is the original, next one can change after redirection
string mRequestedRemoteResourceURL;
string mETag;
DownloadStatus mDownloadStatus;
bool mUpgradeAvailable;
size_t mTotalSize;
size_t mCurrentSize;
ofstream mFile;
#ifdef QT_CONFIG
QNetworkReply* mNetworkReply;
static QNetworkAccessManager networkAccessManager;
#endif
public:
DownloadRequest(string localPath="",
string remoteResourceURL="",
string ETag = "",
DownloadStatus downloadStatus=NOT_PRESENT,
size_t totalSize = 0,
size_t currentSize = 0);
~DownloadRequest();
static bool NetworkIsAccessible();
string getTempLocalPath() const { return (mLocalPath+".tmp"); };
string getLocalPath() const { return mLocalPath; };
string getRemoteResource() const { return mRemoteResourceURL; };
string getETag() const { return mETag; };
void startGet();
void startHead();
DownloadStatus getDownloadStatus() const { return mDownloadStatus; };
bool upgradeAvailable() const { return mUpgradeAvailable; };
void getSizes(size_t& totalSize, size_t&currentSize) {
totalSize = mTotalSize;
currentSize = mCurrentSize;
};
friend ostream& operator<<(ostream& out, const DownloadRequest& d);
friend istream& operator>>(istream&, DownloadRequest&);
friend class Downloader;
};
class Downloader
{
protected:
Downloader(string globalRemoteURL="", string localCacheRecords="");
virtual ~Downloader();
static Downloader* mInstance;
string mGlobalRemoteURL;
string mLocalCacheRecords;
boost::mutex mMutex;
map<string, DownloadRequest*> mRequestMap;
public:
static Downloader* GetInstance();
static void Release();
void Update();
DownloadRequest* Get(string localPath, string remoteResourceURL="");
friend ostream& operator<<(ostream& out, const Downloader& d);
friend istream& operator>>(istream&, Downloader&);
};
#endif // DOWNLOADER_H
+37 -12
View File
@@ -1,6 +1,10 @@
#ifndef _J_FILE_SYSTEM_H_
#define _J_FILE_SYSTEM_H_
#ifdef QT_CONFIG
#include <QFile>
#endif
#include "zfsystem.h"
#include <string>
using zip_file_system::filesystem;
@@ -18,13 +22,38 @@ using namespace std;
/// archive file.
///
//////////////////////////////////////////////////////////////////////////
class JFile {
friend class JFileSystem;
filesystem::limited_file_info * mCurrentFileInZip;
izfstream mFile;
#ifdef QT_CONFIG
QFile *mpqFile;
#endif
public:
JFile() : mCurrentFileInZip(0)
#ifdef QT_CONFIG
, mpqFile(0)
#endif
{
};
~JFile() {
#ifdef QT_CONFIG
if(mpqFile) {
mpqFile->close();
delete mpqFile;
}
#endif
if (mFile)
mFile.close();
};
};
class JZipCache {
public:
JZipCache();
~JZipCache();
map<string, filesystem::limited_file_info> dir;
};
class JFileSystem {
@@ -32,23 +61,21 @@ private:
string mSystemFSPath, mUserFSPath;
filesystem * mSystemFS, * mUserFS;
static JFileSystem* mInstance;
izfstream mFile;
map<string,JZipCache *>mZipCache;
unsigned int mZipCachedElementsCount;
string mZipFileName;
int mFileSize;
char *mPassword;
bool mZipAvailable;
void preloadZip(const string& filename);
izfstream mZipFile;
filesystem::limited_file_info * mCurrentFileInZip;
std::vector<std::string>& scanRealFolder(const std::string& folderName, std::vector<std::string>& results);
bool openForRead(izfstream & File, const string & FilePath);
int GetFileSize(izfstream & file);
public:
//////////////////////////////////////////////////////////////////////////
/// Attach ZIP archive to the file system.
///
@@ -83,7 +110,7 @@ public:
/// Open file for reading.
///
//////////////////////////////////////////////////////////////////////////
bool OpenFile(const string &filename);
JFile* OpenFile(const string &filename);
//Fills the vector results with a list of children of the given folder
std::vector<std::string>& scanfolder(const std::string& folderName, std::vector<std::string>& results);
@@ -97,20 +124,19 @@ public:
/// @return Number of bytes read.
///
//////////////////////////////////////////////////////////////////////////
int ReadFile(void *buffer, int size);
int ReadFile(JFile*, void *buffer, int size);
//////////////////////////////////////////////////////////////////////////
/// Get size of file.
///
//////////////////////////////////////////////////////////////////////////
int GetFileSize();
int GetFileSize(izfstream & file);
int GetFileSize(JFile*);
//////////////////////////////////////////////////////////////////////////
/// Close file.
///
//////////////////////////////////////////////////////////////////////////
void CloseFile();
void CloseFile(JFile*);
//////////////////////////////////////////////////////////////////////////
/// Set root for all the following file operations
@@ -124,11 +150,10 @@ public:
void SetUSerRoot(const string& resourceRoot);
string GetUserRoot() { return mUserFSPath; };
bool openForRead(izfstream & File, const string & FilePath);
bool readIntoString(const string & FilePath, string & target);
bool ReadFileLine(JFile*, string&);
bool openForWrite(ofstream & File, const string & FilePath, ios_base::openmode mode = ios_base::out );
bool Rename(string from, string to);
bool Remove(string aFile);
//Returns true if strFilename exists somewhere in the fileSystem
bool FileExists(const string& strFilename);
-1
View File
@@ -178,7 +178,6 @@ private:
float mSpacing;
PIXEL_TYPE mColor;
int mBlend;
int mBase;
+113 -125
View File
@@ -23,32 +23,28 @@
#include "SLES/OpenSLES_Android.h"
#elif defined USE_PHONON
#include <phonon/AudioOutput>
#include <phonon/MediaObject>
#elif (defined QT_CONFIG)
#include "QMediaPlayer"
#include "QMediaPlaylist"
#include "QSoundEffect"
#include <phonon/AudioOutput>
#include <phonon/MediaObject>
#elif defined WIN32
#include <windows.h>
#include <windows.h>
#define WITH_FMOD
#elif defined (PSP)
#include <pspgu.h>
#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <time.h>
#include <string.h>
#include <pspaudiolib.h>
#include <psprtc.h>
#include <pspgu.h>
#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <time.h>
#include <string.h>
#include <pspaudiolib.h>
#include <psprtc.h>
#include "JAudio.h"
#include "JMP3.h"
#include "JAudio.h"
#include "JMP3.h"
#endif
#ifdef WITH_FMOD
#include "../Dependencies/include/fmod.h"
#include "../Dependencies/include/fmod.h"
#endif
//------------------------------------------------------------------------------------------------
@@ -71,7 +67,7 @@ public:
#ifdef USE_PHONON
Phonon::AudioOutput* mOutput;
Phonon::MediaObject* mMediaObject;
public slots:
public slots:
void seekAtTheBegining();
#elif defined (PSP)
JMP3* mTrack;
@@ -86,10 +82,6 @@ public slots:
SLPlayItf playInterface;
SLSeekItf seekInterface;
SLVolumeItf musicVolumeInterface;
#elif (defined QT_CONFIG)
QMediaPlaylist* playlist;
QMediaPlayer* player;
string fullpath;
#else
void* mTrack;
#endif //WITH_FMOD
@@ -100,15 +92,13 @@ public slots:
//------------------------------------------------------------------------------------------------
class JSample
{
public:
public:
JSample();
~JSample();
unsigned long fileSize();
#if (defined QT_CONFIG) && (!defined USE_PHONON)
QMediaPlayer* effect;
void* mSample;
#elif defined (PSP)
#if defined (PSP)
WAVDATA *mSample;
#elif defined (IOS)
std::string filename;
@@ -143,128 +133,126 @@ class JSoundSystem
public:
//////////////////////////////////////////////////////////////////////////
/// Get the singleton instance
///
//////////////////////////////////////////////////////////////////////////
static JSoundSystem* GetInstance();
//////////////////////////////////////////////////////////////////////////
/// Get the singleton instance
///
//////////////////////////////////////////////////////////////////////////
static JSoundSystem* GetInstance();
static void Destroy();
static void Destroy();
//////////////////////////////////////////////////////////////////////////
/// Load music.
///
/// @note MP3 is the only supported format for the moment.
///
/// @param filename - Name of the music file.
///
//////////////////////////////////////////////////////////////////////////
JMusic *LoadMusic(const char *fileName);
//////////////////////////////////////////////////////////////////////////
/// Load music.
///
/// @note MP3 is the only supported format for the moment.
///
/// @param filename - Name of the music file.
///
//////////////////////////////////////////////////////////////////////////
JMusic *LoadMusic(const char *fileName);
//////////////////////////////////////////////////////////////////////////
/// Delete music from memory.
///
/// @param music - Music to be deleted.
///
//////////////////////////////////////////////////////////////////////////
//void FreeMusic(JMusic *music);
//////////////////////////////////////////////////////////////////////////
/// Delete music from memory.
///
/// @param music - Music to be deleted.
///
//////////////////////////////////////////////////////////////////////////
//void FreeMusic(JMusic *music);
//////////////////////////////////////////////////////////////////////////
/// Play music.
///
/// @param music - Music to be played.
/// @param looping - Play the music in a loop.
///
//////////////////////////////////////////////////////////////////////////
void PlayMusic(JMusic *music, bool looping = false);
//////////////////////////////////////////////////////////////////////////
/// Play music.
///
/// @param music - Music to be played.
/// @param looping - Play the music in a loop.
///
//////////////////////////////////////////////////////////////////////////
void PlayMusic(JMusic *music, bool looping = false);
//////////////////////////////////////////////////////////////////////////
/// Stop playing.
///
/// @param music - Music to be stopped.
///
//////////////////////////////////////////////////////////////////////////
void StopMusic(JMusic *music);
//////////////////////////////////////////////////////////////////////////
/// Stop playing.
///
/// @param music - Music to be stopped.
///
//////////////////////////////////////////////////////////////////////////
void StopMusic(JMusic *music);
//////////////////////////////////////////////////////////////////////////
/// Resume playing.
///
/// @param music - Music to be resumed.
///
//////////////////////////////////////////////////////////////////////////
void ResumeMusic(JMusic *music);
//////////////////////////////////////////////////////////////////////////
/// Resume playing.
///
/// @param music - Music to be resumed.
///
//////////////////////////////////////////////////////////////////////////
void ResumeMusic(JMusic *music);
//////////////////////////////////////////////////////////////////////////
/// Pause playing.
///
/// @param music - Music to be paused.
///
//////////////////////////////////////////////////////////////////////////
void PauseMusic(JMusic *music);
//////////////////////////////////////////////////////////////////////////
/// Pause playing.
///
/// @param music - Music to be paused.
///
//////////////////////////////////////////////////////////////////////////
void PauseMusic(JMusic *music);
//////////////////////////////////////////////////////////////////////////
/// Load sound effect.
///
/// @note WAV sound effect only.
///
/// @param fileName - Sound effect for loading.
///
//////////////////////////////////////////////////////////////////////////
JSample *LoadSample(const char *fileName);
//////////////////////////////////////////////////////////////////////////
/// Load sound effect.
///
/// @note WAV sound effect only.
///
/// @param fileName - Sound effect for loading.
///
//////////////////////////////////////////////////////////////////////////
JSample *LoadSample(const char *fileName);
//////////////////////////////////////////////////////////////////////////
/// Delete sound effect from memory.
///
/// @param sample - Sound to be deleted.
///
//////////////////////////////////////////////////////////////////////////
//void FreeSample(JSample *sample);
//////////////////////////////////////////////////////////////////////////
/// Delete sound effect from memory.
///
/// @param sample - Sound to be deleted.
///
//////////////////////////////////////////////////////////////////////////
//void FreeSample(JSample *sample);
//////////////////////////////////////////////////////////////////////////
/// Play sound effect.
///
/// @param sample - Sound for playing.
///
//////////////////////////////////////////////////////////////////////////
void PlaySample(JSample *sample);
//////////////////////////////////////////////////////////////////////////
/// Play sound effect.
///
/// @param sample - Sound for playing.
///
//////////////////////////////////////////////////////////////////////////
void PlaySample(JSample *sample);
//////////////////////////////////////////////////////////////////////////
/// Set volume for audio playback.
///
/// @param volume - New volume.
///
//////////////////////////////////////////////////////////////////////////
void SetVolume(int volume);
//////////////////////////////////////////////////////////////////////////
/// Set volume for audio playback.
///
/// @param volume - New volume.
///
//////////////////////////////////////////////////////////////////////////
void SetVolume(int volume);
void SetMusicVolume(int volume);
void SetMusicVolume(int volume);
void SetSfxVolume(int volume);
void SetSfxVolume(int volume);
int mChannel;
int mChannel;
protected:
JSoundSystem();
~JSoundSystem();
JSoundSystem();
~JSoundSystem();
void InitSoundSystem();
void DestroySoundSystem();
void InitSoundSystem();
void DestroySoundSystem();
private:
#if (defined PSP || defined ANDROID)
JMusic *mCurrentMusic;
JMusic *mCurrentMusic;
JSample *mCurrentSample;
#endif
int mVolume;
int mMusicVolume;
int mSampleVolume;
int mVolume;
int mMusicVolume;
int mSampleVolume;
static JSoundSystem* mInstance;
static JSoundSystem* mInstance;
};
#endif
+2 -2
View File
@@ -137,14 +137,14 @@ private slots:
private:
int lastPosx(){
#if QT_VERSION >= 0x050100
#if QT_VERSION >= 0x050000
return m_lastPos.x()*devicePixelRatio();
#else
return m_lastPos.x();
#endif
}
int lastPosy(){
#if QT_VERSION >= 0x050100
#if QT_VERSION >= 0x050000
return m_lastPos.y()*devicePixelRatio();
#else
return m_lastPos.y();
-298
View File
@@ -1,298 +0,0 @@
#include "DebugRoutines.h"
#include "JFileSystem.h"
#include "Downloader.h"
#define RECORDS_DEFAULT_FILE "cache/records.txt"
#ifdef QT_CONFIG
QNetworkAccessManager DownloadRequest::networkAccessManager;
#endif
DownloadRequest::DownloadRequest(string localPath,
string remoteResourceURL,
string ETag,
DownloadStatus downloadStatus,
size_t totalSize,
size_t currentSize):
mLocalPath(localPath),
mRemoteResourceURL(remoteResourceURL),
mRequestedRemoteResourceURL(remoteResourceURL),
mETag(ETag),
mDownloadStatus(downloadStatus),
mUpgradeAvailable(false),
mTotalSize(totalSize),
mCurrentSize(currentSize)
{
}
DownloadRequest::~DownloadRequest()
{
}
void DownloadRequest::startHead()
{
#ifdef QT_CONFIG
QNetworkRequest request(QUrl(QString(mRequestedRemoteResourceURL.c_str())));
request.setRawHeader("If-None-Match", mETag.c_str());
mNetworkReply = networkAccessManager.head(request);
connect(mNetworkReply, SIGNAL(finished()), SLOT(fileDownloaded()));
#endif
}
void DownloadRequest::startGet()
{
#ifdef QT_CONFIG
mNetworkReply = networkAccessManager.get(QNetworkRequest(QUrl(QString(mRequestedRemoteResourceURL.c_str()))));
#endif
mFile.close();
JFileSystem::GetInstance()->Remove(getTempLocalPath());
JFileSystem::GetInstance()->openForWrite(mFile, getTempLocalPath());
#ifdef QT_CONFIG
connect(mNetworkReply, SIGNAL(downloadProgress(qint64, qint64)),
SLOT(downloadProgress(qint64, qint64)));
connect(mNetworkReply, SIGNAL(finished()), SLOT(fileDownloaded()));
#endif
}
void DownloadRequest::fileDownloaded()
{
do {
QByteArray eTagByteArray = mNetworkReply->rawHeader("ETag");
if(!eTagByteArray.isEmpty()) {
string oldETag = mETag;
mETag = QString(eTagByteArray).toStdString();
if(oldETag!="" && oldETag != mETag)
mUpgradeAvailable = true;
}
// let's check some error
if(mNetworkReply->error() != QNetworkReply::NoError) {
DebugTrace(mNetworkReply->errorString().toStdString());
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
mFile.close();
JFileSystem::GetInstance()->Remove(getTempLocalPath());
break;
}
// check if we're getting redirected
QVariant redirectionTarget = mNetworkReply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (!redirectionTarget.isNull()) {
QUrl newUrl = QUrl(mRequestedRemoteResourceURL.c_str()).resolved(redirectionTarget.toUrl());
DebugTrace(string("Redirect to ")+ newUrl.toString().toStdString());
mRequestedRemoteResourceURL = newUrl.toString().toStdString();
mNetworkReply->deleteLater();
if(mFile.is_open())
startGet();
else
startHead();
return;
}
if(mFile.is_open())
{
QByteArray byteArray = mNetworkReply->readAll();
mFile.write(byteArray.constData(), byteArray.size());
mFile.close();
if(!JFileSystem::GetInstance()->Rename(getTempLocalPath(), mLocalPath)) {
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
break;
}
}
mDownloadStatus = DownloadRequest::DOWNLOADED;
} while(0);
Downloader::GetInstance()->Update();
mNetworkReply->deleteLater();
emit statusChanged((int)mDownloadStatus);
}
void DownloadRequest::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
QByteArray byteArray = mNetworkReply->readAll();
mFile.write(byteArray.constData(), byteArray.size());
mCurrentSize = bytesReceived;
mTotalSize = bytesTotal;
int percent = 0;
if(bytesTotal)
percent = (bytesReceived/bytesTotal)*100;
emit percentChanged(percent);
}
Downloader* Downloader::mInstance = 0;
Downloader::Downloader(string globalRemoteURL, string localcacheRecords):
mGlobalRemoteURL(globalRemoteURL),
mLocalCacheRecords(localcacheRecords)
{
JFileSystem::GetInstance()->MakeDir("cache");
izfstream downloadRecords;
if(mLocalCacheRecords.empty())
mLocalCacheRecords = RECORDS_DEFAULT_FILE;
if(JFileSystem::GetInstance()->openForRead(downloadRecords, mLocalCacheRecords))
{// File exists, let's read it.
downloadRecords >> (*this);
}
JFileSystem::GetInstance()->CloseFile();
}
Downloader::~Downloader()
{
map<string, DownloadRequest*>::iterator ite;
for(ite = mRequestMap.begin(); ite != mRequestMap.end(); ite++)
{
delete (*ite).second;
}
mRequestMap.erase(mRequestMap.begin(), mRequestMap.end());
}
Downloader* Downloader::GetInstance()
{
if(!mInstance)
{
mInstance = new Downloader();
}
return mInstance;
}
void Downloader::Release()
{
if(mInstance)
{
delete mInstance;
mInstance = 0;
}
}
bool DownloadRequest::NetworkIsAccessible()
{
bool result = false;
#ifdef QT_CONFIG
networkAccessManager.setNetworkAccessible(QNetworkAccessManager::Accessible);
result = networkAccessManager.networkAccessible();
#endif
return result;
}
DownloadRequest* Downloader::Get(string localPath, string remoteResourceURL)
{
map<string, DownloadRequest*>::iterator ite = mRequestMap.find(localPath);
if(ite == mRequestMap.end())
{ // request does not exist, let's create it
DownloadRequest* request = new DownloadRequest(localPath, remoteResourceURL);
std::pair<std::map<string,DownloadRequest*>::iterator,bool> ret;
ret = mRequestMap.insert ( std::pair<string,DownloadRequest*>(localPath, request) );
if (ret.second==false) {
DebugTrace("Downloader::Get Error inserting request in Map");
return 0;
}
ite = ret.first;
}
// Now, we can check the server
if((*ite).second->getDownloadStatus() == DownloadRequest::NOT_PRESENT ||
(*ite).second->upgradeAvailable())
{ // File is not here or an update is available, let's get it
(*ite).second->startGet();
(*ite).second->mDownloadStatus = DownloadRequest::DOWNLOADING;
}
else if ((*ite).second->getDownloadStatus() == DownloadRequest::DOWNLOADED)
{ // File is here, let's check if there is some update without blocking the playback
(*ite).second->startHead();
}
return (*ite).second;
}
void Downloader::Update()
{
ofstream downloadRecords;
if(JFileSystem::GetInstance()->openForWrite(downloadRecords, mLocalCacheRecords))
{
downloadRecords << (*this);
}
downloadRecords.close();
}
ostream& operator<<(ostream& out, const DownloadRequest& d)
{
// HEAD request fails, so this line erase cache record after upgrade check :(
// if(d.getDownloadStatus() == DownloadRequest::DOWNLOADED)
{
out << "localPath=" << d.mLocalPath << endl;
out << "remoteResource=" << d.mRemoteResourceURL << endl;
out << "ETag=" << d.mETag << endl;
out << "upgradeAvailable=" << d.mUpgradeAvailable <<endl;
}
return out;
}
istream& operator>>(istream& in, DownloadRequest& d)
{
string s;
while(std::getline(in, s))
{
size_t limiter = s.find("=");
string areaS;
if (limiter != string::npos)
{
areaS = s.substr(0, limiter);
if (areaS.compare("localPath") == 0)
{
d.mLocalPath = s.substr(limiter + 1);
}
else if (areaS.compare("remoteResource") == 0)
{
d.mRemoteResourceURL = s.substr(limiter + 1);
d.mRequestedRemoteResourceURL = d.mRemoteResourceURL;
}
else if (areaS.compare("ETag") == 0)
{
d.mETag = s.substr(limiter + 1);
d.mDownloadStatus = DownloadRequest::DOWNLOADED;
}
else if (areaS.compare("upgradeAvailable") == 0)
{
d.mUpgradeAvailable = (bool)atoi(s.substr(limiter + 1).c_str());
break;
}
}
}
return in;
}
ostream& operator<<(ostream& out, const Downloader& d)
{
map<string, DownloadRequest*>::const_iterator ite;
for(ite = d.mRequestMap.begin(); ite != d.mRequestMap.end(); ite++)
{
out << (*(*ite).second) << endl;
}
return out;
}
istream& operator>>(istream& in, Downloader& d)
{
while(!in.eof())
{
DownloadRequest* downloadRequest = new DownloadRequest();
in >> (*downloadRequest);
if(!downloadRequest->getLocalPath().empty() &&
!downloadRequest->getRemoteResource().empty() &&
!downloadRequest->getETag().empty()) {
d.mRequestMap[downloadRequest->getLocalPath()] = downloadRequest;
} else {
delete downloadRequest;
}
}
return in;
}
+5 -4
View File
@@ -44,11 +44,12 @@ bool JAnimator::Load(const char* scriptFile)
JFileSystem *fileSystem = JFileSystem::GetInstance();
if (fileSystem == NULL) return false;
if (!fileSystem->OpenFile(scriptFile)) return false;
JFile* jFile = fileSystem->OpenFile(scriptFile);
if (!jFile) return false;
int size = fileSystem->GetFileSize();
int size = fileSystem->GetFileSize(jFile);
char *xmlBuffer = new char[size];
fileSystem->ReadFile(xmlBuffer, size);
fileSystem->ReadFile(jFile, xmlBuffer, size);
TiXmlDocument doc;
doc.Parse(xmlBuffer);
@@ -173,7 +174,7 @@ bool JAnimator::Load(const char* scriptFile)
}
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
delete[] xmlBuffer;
return true;
+17 -16
View File
@@ -49,7 +49,8 @@ char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad) // WAVE加载,
{
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (!fileSystem->OpenFile(fileName))
JFile* jFile = fileSystem->OpenFile(fileName);
if (!jFile)
return 0;
memset(p_wav, 0, sizeof(WAVDATA));
@@ -57,14 +58,14 @@ char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad) // WAVE加载,
char head[256];
memset(head, 0, 256);
//sceIoRead(fd, head, 20);
fileSystem->ReadFile(head, 20);
fileSystem->ReadFile(jFile, head, 20);
char string[8];
memset(string, 0, 8);
memcpy(string, head, 4);
if (0!=strcmp(string, "RIFF"))
{
//sceIoClose(fd);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return 0;
}
memset(string, 0, 8);
@@ -72,7 +73,7 @@ char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad) // WAVE加载,
if (0!=strcmp(string, "WAVE"))
{
//sceIoClose(fd);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return 0;
}
memset(string, 0, 8);
@@ -80,42 +81,42 @@ char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad) // WAVE加载,
if (0!=strcmp(string, "fmt"))
{
//sceIoClose(fd);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return 0;
}
int fmtSize = 0;
memcpy(&fmtSize, head+16, 4);
//sceIoRead(fd, head+20, fmtSize);
fileSystem->ReadFile(head+20,fmtSize );
fileSystem->ReadFile(jFile, head+20,fmtSize );
p_wav->headSize = 20+fmtSize;
while (1)
{
//sceIoRead(fd, head+p_wav->headSize, 4);
fileSystem->ReadFile(head+p_wav->headSize, 4);
fileSystem->ReadFile(jFile, head+p_wav->headSize, 4);
memset(string, 0, 8);
memcpy(string, head+p_wav->headSize, 4);
p_wav->headSize += 4;
if (0!=strcmp(string, "data"))
{
//sceIoRead(fd, head+p_wav->headSize, 4);
fileSystem->ReadFile(head+p_wav->headSize, 4);
fileSystem->ReadFile(jFile, head+p_wav->headSize, 4);
memcpy(&fmtSize, head+p_wav->headSize, 4);
p_wav->headSize += 4;
//sceIoRead(fd, head+p_wav->headSize, fmtSize);
fileSystem->ReadFile(head+p_wav->headSize, fmtSize);
fileSystem->ReadFile(jFile, head+p_wav->headSize, fmtSize);
p_wav->headSize += fmtSize;
}
else
{
//sceIoRead(fd, head+p_wav->headSize, 4);
fileSystem->ReadFile(head+p_wav->headSize, 4);
fileSystem->ReadFile(jFile, head+p_wav->headSize, 4);
p_wav->headSize += 4;
break;
}
if (p_wav->headSize>191)
{
//sceIoClose(fd);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return 0;
}
}
@@ -126,7 +127,7 @@ char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad) // WAVE加载,
if (p_wav->channelCount!=1 && p_wav->channelCount!=2)
{
//sceIoClose(fd);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return 0;
}
memcpy(&p_wav->samplePerSecond, head+24, 4);
@@ -136,7 +137,7 @@ char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad) // WAVE加载,
if (p_wav->bytePerSample!=1 && p_wav->bytePerSample!=2)
{
//sceIoClose(fd);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return 0;
}
p_wav->nSample = 44100 / p_wav->samplePerSecond;
@@ -147,17 +148,17 @@ char loadWaveData(WAVDATA* p_wav, char* fileName, char memLoad) // WAVE加载,
if (p_wav->soundSize>4096000)
{
//sceIoClose(fd);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return 0;
}
p_wav->buffer = (char*)malloc(p_wav->soundSize);
memset(p_wav->buffer, 0, p_wav->soundSize);
//sceIoRead(fd, p_wav->buffer, p_wav->soundSize);
fileSystem->ReadFile(p_wav->buffer, p_wav->soundSize);
fileSystem->ReadFile(jFile, p_wav->buffer, p_wav->soundSize);
p_wav->bytePosition = 0;
p_wav->fd = -1;
//sceIoClose(fd);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
}
else
{
+166 -79
View File
@@ -107,7 +107,6 @@ JFileSystem* JFileSystem::GetInstance()
// Tries to set the system and user paths.
// On some OSes, the parameters get overriden by hardcoded values
JFileSystem::JFileSystem(const string & _userPath, const string & _systemPath)
{
string systemPath = _systemPath;
string userPath = _userPath;
@@ -131,8 +130,8 @@ JFileSystem::JFileSystem(const string & _userPath, const string & _systemPath)
dir.mkdir(USERDIR);
dir.cd(USERDIR);
userPath = QDir::toNativeSeparators(dir.absolutePath()).toStdString();
systemPath = QDir::toNativeSeparators(sysDir.absolutePath()).toStdString();
userPath = QDir::toNativeSeparators(dir.absolutePath()).toStdString();
DebugTrace("User path " << userPath);
DebugTrace("System path " << systemPath);
@@ -192,9 +191,6 @@ JFileSystem::JFileSystem(const string & _userPath, const string & _systemPath)
mZipAvailable = false;
mZipCachedElementsCount = 0;
mPassword = NULL;
mFileSize = 0;
mCurrentFileInZip = NULL;
};
void JFileSystem::Destroy()
@@ -208,14 +204,26 @@ void JFileSystem::Destroy()
bool JFileSystem::DirExists(const string& strDirname)
{
return (mSystemFS && mSystemFS->DirExists(strDirname)) || mUserFS->DirExists(strDirname);
return (
(mSystemFS && mSystemFS->DirExists(strDirname))
|| mUserFS->DirExists(strDirname)
#ifdef QT_CONFIG
|| QDir(QString(":/") + strDirname.c_str()).exists()
#endif
);
}
bool JFileSystem::FileExists(const string& strFilename)
{
if (strFilename.length() < 1 ) return false;
return (mSystemFS && mSystemFS->FileExists(strFilename)) || mUserFS->FileExists(strFilename);
return (
(mSystemFS && mSystemFS->FileExists(strFilename))
|| mUserFS->FileExists(strFilename)
#ifdef QT_CONFIG
|| QFile(QString(":/") + strFilename.c_str()).exists()
#endif
);
}
bool JFileSystem::MakeDir(const string & dir)
@@ -248,7 +256,7 @@ void JFileSystem::clearZipCache()
bool JFileSystem::AttachZipFile(const string &zipfile, char *password /* = NULL */)
{
if (mZipAvailable && mZipFile.is_open())
if (mZipAvailable && mZipFile != NULL)
{
if (mZipFileName != zipfile)
DetachZipFile(); // close the previous zip file
@@ -275,7 +283,6 @@ bool JFileSystem::AttachZipFile(const string &zipfile, char *password /* = NULL
}
mZipAvailable = true;
return true;
}
@@ -285,7 +292,6 @@ void JFileSystem::DetachZipFile()
{
mZipFile.close();
}
mCurrentFileInZip = NULL;
mZipAvailable = false;
}
@@ -307,28 +313,58 @@ bool JFileSystem::openForRead(izfstream & File, const string & FilePath) {
bool JFileSystem::readIntoString(const string & FilePath, string & target)
{
izfstream file;
if (!openForRead(file, FilePath))
return false;
int fileSize = GetFileSize(file);
bool result = false;
// Trying first with a izfstream
do {
izfstream file;
if (!openForRead(file, FilePath))
break;
int fileSize = GetFileSize(file);
#ifndef __MINGW32__
try {
try {
#endif
target.resize((std::string::size_type) fileSize);
target.resize((std::string::size_type) fileSize);
#ifndef __MINGW32__
} catch (bad_alloc&) {
return false;
}
} catch (bad_alloc&) {
break;
}
#endif
if (fileSize)
file.read(&target[0], fileSize);
file.close();
return true;
if (fileSize)
file.read(&target[0], fileSize);
file.close();
result = true;
} while (0);
#ifdef QT_CONFIG
// Now we try with qrc if we haven't finc anything yet
if (!result) do {
string path = string(":/") + FilePath.c_str();
QFile qfile(path.c_str());
qfile.open(QIODevice::ReadOnly);
if(!qfile.isReadable())
break;
int fileSize = qfile.size();
#ifndef __MINGW32__
try {
#endif
target.resize((std::string::size_type) fileSize);
#ifndef __MINGW32__
} catch (bad_alloc&) {
break;
}
#endif
if (fileSize)
qfile.read(&target[0], fileSize);
qfile.close();
result = true;
} while (0);
#endif //QT_CONFIG
return result;
}
bool JFileSystem::openForWrite(ofstream & File, const string & FilePath, ios_base::openmode mode)
@@ -374,57 +410,72 @@ bool JFileSystem::openForWrite(ofstream & File, const string & FilePath, ios_bas
return false;
}
bool JFileSystem::OpenFile(const string &filename)
JFile* JFileSystem::OpenFile(const string &filename)
{
mCurrentFileInZip = NULL;
bool result;
JFile* jFile = new JFile();
jFile->mCurrentFileInZip = NULL;
if (!mZipAvailable || !mZipFile)
return openForRead(mFile, filename);
do {
if (!mZipAvailable || !mZipFile) {
result = openForRead(jFile->mFile, filename);
if(!result) {
#ifdef QT_CONFIG
string path = string(":/") + filename.c_str();
jFile->mpqFile = new QFile(path.c_str());
jFile->mpqFile->open(QIODevice::ReadOnly);
result = jFile->mpqFile->isReadable();
#endif
}
break;
}
preloadZip(mZipFileName);
map<string,JZipCache *>::iterator it = mZipCache.find(mZipFileName);
if (it == mZipCache.end())
{
//DetachZipFile();
//return OpenFile(filename);
return openForRead(mFile, filename);
}
JZipCache * zc = it->second;
map<string, filesystem::limited_file_info>::iterator it2 = zc->dir.find(filename);
if (it2 == zc->dir.end())
{
/*DetachZipFile();
preloadZip(mZipFileName);
map<string,JZipCache *>::iterator it = mZipCache.find(mZipFileName);
if (it == mZipCache.end())
{
//DetachZipFile();
//return OpenFile(filename);
result = openForRead(jFile->mFile, filename);
break;
}
JZipCache * zc = it->second;
map<string, filesystem::limited_file_info>::iterator it2 = zc->dir.find(filename);
if (it2 == zc->dir.end())
{
/*DetachZipFile();
return OpenFile(filename); */
return openForRead(mFile, filename);
result = openForRead(jFile->mFile, filename);
break;
}
jFile->mCurrentFileInZip = &(it2->second);
result = true;
} while(0);
if(result)
return jFile;
else {
delete jFile;
return 0;
}
mCurrentFileInZip = &(it2->second);
mFileSize = it2->second.m_Size;
return true;
}
void JFileSystem::CloseFile()
void JFileSystem::CloseFile(JFile* jFile)
{
if (mZipAvailable && mZipFile)
{
mCurrentFileInZip = NULL;
}
if (mFile)
mFile.close();
delete jFile;
}
//returns 0 if less than "size" bits were read
int JFileSystem::ReadFile(void *buffer, int size)
int JFileSystem::ReadFile(JFile* jFile, void *buffer, int size)
{
if (mCurrentFileInZip)
if (jFile->mCurrentFileInZip)
{
assert(mZipFile);
if((size_t)size > mCurrentFileInZip->m_Size) //only support "store" method for zip inside zips
if((size_t)size > jFile->mCurrentFileInZip->m_Size) //only support "store" method for zip inside zips
return 0;
std::streamoff offset = filesystem::SkipLFHdr(mZipFile, mCurrentFileInZip->m_Offset);
std::streamoff offset = filesystem::SkipLFHdr(mZipFile, jFile->mCurrentFileInZip->m_Offset);
if (!mZipFile.seekg(offset))
return 0;
mZipFile.read((char *) buffer, size);
@@ -432,16 +483,43 @@ int JFileSystem::ReadFile(void *buffer, int size)
return size;
}
if (!mFile)
#ifdef QT_CONFIG
if(jFile->mpqFile) {
return jFile->mpqFile->read((char*)buffer, size);
}
#endif
if (!jFile->mFile)
return 0;
assert(!mFile.Zipped() || (size_t)size <= mFile.getUncompSize());
mFile.read((char *)buffer, size);
if (mFile.eof())
assert(!jFile->mFile.Zipped() || (size_t)size <= jFile->mFile.getUncompSize());
jFile->mFile.read((char *)buffer, size);
if (jFile->mFile.eof())
return 0;
return size;
}
bool JFileSystem::ReadFileLine(JFile* jFile, string& s)
{
if(!jFile) return false;
#ifdef QT_CONFIG
if(jFile->mpqFile) {
QString qs = jFile->mpqFile->readLine();
if(qs.isEmpty())
return false;
else {
s = qs.toStdString();
return true;
}
}
#endif
if(!jFile->mFile)
return 0;
assert(!jFile->mFile.Zipped());
return std::getline(jFile->mFile, s);
}
std::vector<std::string>& JFileSystem::scanRealFolder(const std::string& folderName, std::vector<std::string>& results)
{
DIR *dip = opendir(folderName.c_str());
@@ -529,8 +607,17 @@ std::vector<std::string>& JFileSystem::scanfolder(const std::string& _folderName
seen[systemReal[i]] = true;
}
}
#ifdef QT_CONFIG
string path = string(":/") + folderName;
QDir dir(path.c_str());
QStringList list = dir.entryList();
for(int i = 0; i < list.size(); i++)
{
seen[list.at(i).toStdString()] = true;
}
#endif
for(map<string,bool>::iterator it = seen.begin(); it != seen.end(); ++it)
for(map<string,bool>::iterator it = seen.begin(); it != seen.end(); ++it)
{
results.push_back(it->first);
}
@@ -544,12 +631,18 @@ std::vector<std::string> JFileSystem::scanfolder(const std::string& folderName)
return scanfolder(folderName, result);
}
int JFileSystem::GetFileSize()
int JFileSystem::GetFileSize(JFile* jFile)
{
if (mCurrentFileInZip)
return mFileSize;
if (jFile->mCurrentFileInZip)
return jFile->mCurrentFileInZip->m_Size;
return GetFileSize(mFile);
#ifdef QT_CONFIG
if(jFile->mpqFile) {
return jFile->mpqFile->size();
}
#endif
return GetFileSize(jFile->mFile);
}
bool JFileSystem::Rename(string _from, string _to)
@@ -557,13 +650,7 @@ bool JFileSystem::Rename(string _from, string _to)
string from = mUserFSPath + _from;
string to = mUserFSPath + _to;
std::remove(to.c_str());
return (rename(from.c_str(), to.c_str()) == 0);
}
bool JFileSystem::Remove(string aFile)
{
string toRemove = mUserFSPath + aFile;
return (std::remove(toRemove.c_str()) == 0);
return rename(from.c_str(), to.c_str()) ? true: false;
}
int JFileSystem::GetFileSize(izfstream & file)
+10 -9
View File
@@ -116,25 +116,26 @@ bool JGBKFont::Init(const char* engFileName, const char* chnFileName, int fontsi
int size;
JFileSystem *fileSys = JFileSystem::GetInstance();
if (!fileSys->OpenFile(engFileName))
JFile* jFile = fileSys->OpenFile(engFileName);
if (!jFile)
return false;
size = fileSys->GetFileSize();
size = fileSys->GetFileSize(jFile);
mEngFont = new BYTE[size];
fileSys->ReadFile(mEngFont, size);
fileSys->CloseFile();
fileSys->ReadFile(jFile, mEngFont, size);
fileSys->CloseFile(jFile);
if (!fileSys->OpenFile(chnFileName))
jFile = fileSys->OpenFile(chnFileName);
if (!jFile)
return false;
size = fileSys->GetFileSize();
size = fileSys->GetFileSize(jFile);
mChnFont = new BYTE[size];
fileSys->ReadFile(mChnFont, size);
fileSys->CloseFile();
fileSys->ReadFile(jFile, mChnFont, size);
fileSys->CloseFile(jFile);
return true;
}
+26 -21
View File
@@ -892,9 +892,10 @@ static void PNGCustomReadDataFn(png_structp png_ptr, png_bytep data, png_size_t
{
png_size_t check;
JFileSystem *fileSystem = (JFileSystem*)png_ptr->io_ptr;
JFile* jFile = (JFile*)png_ptr->io_ptr;
JFileSystem* fileSystem = JFileSystem::GetInstance();
check = fileSystem->ReadFile(data, length);
check = fileSystem->ReadFile(jFile, data, length);
if (check != length)
{
@@ -1038,23 +1039,24 @@ void JRenderer::LoadJPG(TextureInfo &textureInfo, const char *filename, int mode
bits32 = NULL;
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (!fileSystem->OpenFile(filename))
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile)
{
return;
}
rawsize = fileSystem->GetFileSize();
rawsize = fileSystem->GetFileSize(jFile);
rawdata = new u8[rawsize];
if (!rawdata)
{
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return;
}
fileSystem->ReadFile(rawdata, rawsize);
fileSystem->CloseFile();
fileSystem->ReadFile(jFile, rawdata, rawsize);
fileSystem->CloseFile(jFile);
cinfo.err = jpeg_std_error(&jerr);
@@ -1362,24 +1364,25 @@ int JRenderer::LoadPNG(TextureInfo &textureInfo, const char* filename, int mode,
u32* line;
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (!fileSystem->OpenFile(filename)) return JGE_ERR_CANT_OPEN_FILE;
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile) return JGE_ERR_CANT_OPEN_FILE;
//JLOG("PNG opened - creating read struct");
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return JGE_ERR_PNG;
}
//JLOG("Setting error callback func");
png_set_error_fn(png_ptr, (png_voidp) NULL, (png_error_ptr) NULL, PNGCustomWarningFn);
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_PNG;
}
png_init_io(png_ptr, NULL);
png_set_read_fn(png_ptr, (png_voidp)fileSystem, PNGCustomReadDataFn);
png_set_read_fn(png_ptr, (png_voidp)jFile, PNGCustomReadDataFn);
png_set_sig_bytes(png_ptr, sig_read);
png_read_info(png_ptr, info_ptr);
@@ -1392,7 +1395,7 @@ int JRenderer::LoadPNG(TextureInfo &textureInfo, const char* filename, int mode,
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
line = (u32*) malloc(width * 4);
if (!line) {
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_MALLOC_FAILED;
}
@@ -1430,7 +1433,7 @@ int JRenderer::LoadPNG(TextureInfo &textureInfo, const char* filename, int mode,
std::ostringstream stream;
stream << "Alloc failed for: Tex Width: " << texWidth << " Tex Height: " << kVerticalBlockSize << ", total bytes: " << texWidth * kVerticalBlockSize * sizeof(PIXEL_TYPE);
JLOG(stream.str().c_str());
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_MALLOC_FAILED;
}
@@ -1505,7 +1508,7 @@ int JRenderer::LoadPNG(TextureInfo &textureInfo, const char* filename, int mode,
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
//JLOG("Closing PNG");
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
if (done)
{
@@ -1725,9 +1728,9 @@ int JRenderer::image_readgif(void * handle, TextureInfo &textureInfo, DWORD * bg
int image_gif_read(GifFileType * ft, GifByteType * buf, int size)
{
JFileSystem *fileSys = (JFileSystem *)ft->UserData;
if (fileSys->ReadFile(buf, size))
JFileSystem *fileSys = JFileSystem::GetInstance();
JFile* jFile = (JFile*)ft->UserData;
if (fileSys->ReadFile(jFile, buf, size))
return size;
else
return 0;
@@ -1740,15 +1743,17 @@ void JRenderer::LoadGIF(TextureInfo &textureInfo, const char *filename, int mode
JFileSystem *fileSys = JFileSystem::GetInstance();
if (!fileSys->OpenFile(filename))
JFile* jFile = fileSys->OpenFile(filename);
if (!jFile)
return;
DWORD bkcol;
int result = image_readgif(fileSys, textureInfo, &bkcol, image_gif_read, mode);
int result = image_readgif(jFile, textureInfo, &bkcol, image_gif_read, mode);
if(result!=0)
textureInfo.mBits=NULL;
fileSys->CloseFile();
fileSys->CloseFile(jFile);
return ;
}
@@ -2262,4 +2267,4 @@ void JRenderer::FillRoundRect(float x, float y, float w, float h, float radius,
void JRenderer::SetImageFilter(JImageFilter* imageFilter)
{
mImageFilter = imageFilter;
}
}
+4 -3
View File
@@ -42,10 +42,11 @@ JLBFont::JLBFont(const char *fontname, int lineheight, bool useVideoRAM)
//FILE *file;
JFileSystem *fileSys = JFileSystem::GetInstance();
if (!fileSys->OpenFile(filename)) return;
JFile* jFile = fileSys->OpenFile(filename);
if (!jFile) return;
fileSys->ReadFile((u8 *)buffer, 2048);
fileSys->CloseFile();
fileSys->ReadFile(jFile, (u8 *)buffer, 2048);
fileSys->CloseFile(jFile);
sprintf(filename, "%s.png", fontname);
mTexture = mRenderer->LoadTexture(filename, useVideoRAM);
+5 -4
View File
@@ -96,7 +96,8 @@ bool JMD2Model::Load(char *filename, char *textureName)
// open the model file
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (!fileSystem->OpenFile(filename))
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile)
return false;
//filePtr = fopen(filename, "rb");
//if (filePtr == NULL)
@@ -107,13 +108,13 @@ bool JMD2Model::Load(char *filename, char *textureName)
//fileLen = ftell(filePtr);
//fseek(filePtr, 0, SEEK_SET);
fileLen = fileSystem->GetFileSize();
fileLen = fileSystem->GetFileSize(jFile);
// read entire file into buffer
buffer = (char*)malloc(fileLen + 1);
//fread(buffer, sizeof(char), fileLen, filePtr);
fileSystem->ReadFile(buffer, fileLen);
fileSystem->CloseFile();
fileSystem->ReadFile(jFile, buffer, fileLen);
fileSystem->CloseFile(jFile);
// extract model file header from buffer
modelHeader = (modelHeader_t*)buffer;
+5 -4
View File
@@ -47,14 +47,15 @@ bool JOBJModel::Load(const char *modelName, const char *textureName)
{
JFileSystem* fileSys = JFileSystem::GetInstance();
if (!fileSys->OpenFile(modelName))
JFile* jFile = fileSys->OpenFile(modelName);
if (!jFile)
return false;
int size = fileSys->GetFileSize();
int size = fileSys->GetFileSize(jFile);
char *buffer = new char[size];
fileSys->ReadFile(buffer, size);
fileSys->CloseFile();
fileSys->ReadFile(jFile, buffer, size);
fileSys->CloseFile(jFile);
Vector3D vert;
+5 -4
View File
@@ -55,11 +55,12 @@ bool JParticleEffect::Load(const char* filename)
JFileSystem *fileSystem = JFileSystem::GetInstance();
if (fileSystem == NULL) return false;
if (!fileSystem->OpenFile(filename)) return false;
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile) return false;
int size = fileSystem->GetFileSize();
int size = fileSystem->GetFileSize(jFile);
char *xmlBuffer = new char[size];
fileSystem->ReadFile(xmlBuffer, size);
fileSystem->ReadFile(jFile, xmlBuffer, size);
TiXmlDocument doc;
@@ -296,7 +297,7 @@ bool JParticleEffect::Load(const char* filename)
}
}
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
delete[] xmlBuffer;
return true;
+5 -5
View File
@@ -93,13 +93,13 @@ bool JResourceManager::LoadResource(const string& resourceName)
JFileSystem *fileSystem = JFileSystem::GetInstance();
if (fileSystem == NULL) return false;
JFile* jFile = fileSystem->OpenFile(path.c_str());
if (!jFile) return false;
if (!fileSystem->OpenFile(path.c_str())) return false;
int size = fileSystem->GetFileSize();
int size = fileSystem->GetFileSize(jFile);
char *xmlBuffer = new char[size];
fileSystem->ReadFile(xmlBuffer, size);
fileSystem->ReadFile(jFile, xmlBuffer, size);
TiXmlDocument doc;
doc.Parse(xmlBuffer);
@@ -179,7 +179,7 @@ bool JResourceManager::LoadResource(const string& resourceName)
}
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
delete[] xmlBuffer;
// JGERelease();
+5 -4
View File
@@ -41,11 +41,12 @@ bool JSpline::Load(const char *filename, float xscale, float yscale)
JFileSystem *fileSystem = JFileSystem::GetInstance();
if (fileSystem == NULL) return false;
if (!fileSystem->OpenFile(filename)) return false;
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile) return false;
int size = fileSystem->GetFileSize();
int size = fileSystem->GetFileSize(jFile);
char *xmlBuffer = new char[size];
fileSystem->ReadFile(xmlBuffer, size);
fileSystem->ReadFile(jFile, xmlBuffer, size);
TiXmlDocument doc;
doc.Parse(xmlBuffer);
@@ -76,7 +77,7 @@ bool JSpline::Load(const char *filename, float xscale, float yscale)
}
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
delete[] xmlBuffer;
return true;
+6 -5
View File
@@ -199,15 +199,16 @@ bool JTTFont::Load(const char *filename, int size, int mode)
if (FT_Init_FreeType( &mLibrary ) == 0)
{
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (fileSystem->OpenFile(filename))
JFileSystem* fileSystem = JFileSystem::GetInstance();
JFile* jFile = fileSystem->OpenFile(filename);
if (jFile)
{
mFontBitsSize = fileSystem->GetFileSize();
mFontBitsSize = fileSystem->GetFileSize(jFile);
mFontBits = (FT_Byte*)malloc(mFontBitsSize);
fileSystem->ReadFile(mFontBits, mFontBitsSize);
fileSystem->CloseFile();
fileSystem->ReadFile(jFile, mFontBits, mFontBitsSize);
fileSystem->CloseFile(jFile);
if (FT_New_Memory_Face(mLibrary, mFontBits, mFontBitsSize, 0, &mFace ) == 0)
{
+11 -18
View File
@@ -9,11 +9,11 @@
#include <QtDeclarative>
#include "qmlapplicationviewer.h"
#endif //QT_WIDGET
#include "Downloader.h"
#include "filedownloader.h"
#include "GameApp.h"
#include "corewrapper.h"
WagicCore* g_glwidget = NULL;
QWidget* g_glwidget = NULL;
static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] =
{
@@ -69,25 +69,18 @@ int main(int argc, char* argv[])
#endif //QT_WIDGET
if(argc >= 2 && string(argv[1]) == "testsuite")
{
int result = 0;
result += WagicCore::runTestSuite();
return result;
}
app->setApplicationName(WagicCore::getApplicationName());
DownloadRequest* downloadRequest = NULL;
#ifdef WAGIC_RESOURCE_URL
Downloader*downloader = Downloader::GetInstance();
downloadRequest = downloader->Get(
"core.zip",
WAGIC_RESOURCE_URL
);
#endif
FileDownloader fileDownloader(USERDIR, WAGIC_RESOURCE_NAME);
#ifdef QT_WIDGET
g_glwidget = new WagicCore();
if(!downloadRequest || downloadRequest->getDownloadStatus() == DownloadRequest::DOWNLOADED)
{
g_glwidget->start(0);
}
else
{
g_glwidget->connect(downloadRequest, SIGNAL(statusChanged(int)), SLOT(start(int)));
}
g_glwidget->connect(&fileDownloader, SIGNAL(finished(int)), SLOT(start(int)));
#else
qmlRegisterType<WagicCore>("CustomComponents", 1, 0, "WagicCore");
+1 -14
View File
@@ -78,20 +78,7 @@ extern "C" void Java_org_libsdl_app_SDLActivity_nativeResume(
{
if (!g_engine)
return;
g_engine->Resume();
}
#include "Wagic_Version.h"
extern "C" jstring Java_org_libsdl_app_SDLActivity_getResourceName(
JNIEnv* env, jclass cls)
{
return env->NewStringUTF (WAGIC_RESOURCE_NAME);
}
extern "C" jstring Java_org_libsdl_app_SDLActivity_getResourceUrl(
JNIEnv* env, jclass cls)
{
return env->NewStringUTF (WAGIC_RESOURCE_URL);
g_engine->Resume();
}
#endif
+5 -4
View File
@@ -57,19 +57,20 @@ hgeFont::hgeFont(const char *szFont, bool bMipmap __attribute__((unused)))
// Load font description
JFileSystem* fileSys = JFileSystem::GetInstance();
if (!fileSys->OpenFile(szFont)) return;
JFile* jFile = fileSys->OpenFile(szFont);
if (!jFile) return;
//data=hge->Resource_Load(szFont, &size);
//if(!data) return;
size = fileSys->GetFileSize();
size = fileSys->GetFileSize(jFile);
desc = new char[size+1];
//memcpy(desc,data,size);
fileSys->ReadFile(desc, size);
fileSys->ReadFile(jFile, desc, size);
desc[size]=0;
//hge->Resource_Free(data);
fileSys->CloseFile();
fileSys->CloseFile(jFile);
pdesc=_get_line(desc,linebuf);
if(strcmp(linebuf, FNTHEADERTAG))
+35 -40
View File
@@ -50,46 +50,41 @@ float Random_Float(float min, float max)
hgeParticleSystem::hgeParticleSystem(const char *filename, JQuad *sprite)
{
//void *psi;
//hgeParticleSystemInfo psi;
JFileSystem* fileSys = JFileSystem::GetInstance();
//hge=hgeCreate(HGE_VERSION);
//psi=hge->Resource_Load(filename);
if (!fileSys->OpenFile(filename)) return;
//if(!psi) return;
//memcpy(&info, psi, sizeof(hgeParticleSystemInfo));
//hge->Resource_Free(psi);
// Skip reading the pointer as it may be larger than 4 bytes in the structure
void *dummyPointer;
fileSys->ReadFile(&dummyPointer, 4);
// we're actually trying to read more than the file size now, but it's no problem.
// Note that this fix is only to avoid the largest problems, filling a structure
// by directly reading a file, is really a bad idea ...
fileSys->ReadFile(&(info.nEmission), sizeof(hgeParticleSystemInfo) - 4);
fileSys->CloseFile();
info.sprite=sprite;
// info.fGravityMin *= 100;
// info.fGravityMax *= 100;
// info.fSpeedMin *= 100;
// info.fSpeedMax *= 100;
vecLocation.x=vecPrevLocation.x=0.0f;
vecLocation.y=vecPrevLocation.y=0.0f;
fTx=fTy=0;
fEmissionResidue=0.0f;
nParticlesAlive=0;
fAge=-2.0;
mTimer = 0.0f;
rectBoundingBox.Clear();
bUpdateBoundingBox=false;
JFileSystem* fileSys = JFileSystem::GetInstance();
JFile* jFile = fileSys->OpenFile(filename);
if (!jFile) return;
//if(!psi) return;
//memcpy(&info, psi, sizeof(hgeParticleSystemInfo));
//hge->Resource_Free(psi);
// Skip reading the pointer as it may be larger than 4 bytes in the structure
void *dummyPointer;
fileSys->ReadFile(jFile, &dummyPointer, 4);
// we're actually trying to read more than the file size now, but it's no problem.
// Note that this fix is only to avoid the largest problems, filling a structure
// by directly reading a file, is really a bad idea ...
fileSys->ReadFile(jFile, &(info.nEmission), sizeof(hgeParticleSystemInfo) - 4);
fileSys->CloseFile(jFile);
info.sprite=sprite;
// info.fGravityMin *= 100;
// info.fGravityMax *= 100;
// info.fSpeedMin *= 100;
// info.fSpeedMax *= 100;
vecLocation.x=vecPrevLocation.x=0.0f;
vecLocation.y=vecPrevLocation.y=0.0f;
fTx=fTy=0;
fEmissionResidue=0.0f;
nParticlesAlive=0;
fAge=-2.0;
mTimer = 0.0f;
rectBoundingBox.Clear();
bUpdateBoundingBox=false;
}
hgeParticleSystem::hgeParticleSystem(hgeParticleSystemInfo *psi)
+36 -29
View File
@@ -1683,20 +1683,21 @@ void JRenderer::LoadJPG(TextureInfo &textureInfo, const char *filename, int mode
int rawsize, i;
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (!fileSystem->OpenFile(filename)) return;
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile) return;
rawsize = fileSystem->GetFileSize();
rawsize = fileSystem->GetFileSize(jFile);
rawdata = new BYTE[rawsize];
if (!rawdata)
{
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return;
}
fileSystem->ReadFile(rawdata, rawsize);
fileSystem->CloseFile();
fileSystem->ReadFile(jFile, rawdata, rawsize);
fileSystem->CloseFile(jFile);
// Initialize libJpeg Object
cinfo.err = jpeg_std_error(&jerr);
@@ -1804,9 +1805,10 @@ static void PNGCustomReadDataFn(png_structp png_ptr, png_bytep data, png_size_t
{
png_size_t check;
JFileSystem *fileSystem = (JFileSystem*)png_ptr->io_ptr;
JFileSystem* fileSystem = JFileSystem::GetInstance();
JFile *jFile = (JFile*)png_ptr->io_ptr;
check = fileSystem->ReadFile(data, length);
check = fileSystem->ReadFile(jFile, data, length);
if (check != length)
{
@@ -1869,13 +1871,14 @@ int JRenderer::LoadPNG(TextureInfo &textureInfo, const char *filename, int mode
DWORD* line;
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (!fileSystem->OpenFile(filename))
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile)
return JGE_ERR_CANT_OPEN_FILE;
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL)
{
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
return JGE_ERR_PNG;
}
@@ -1885,14 +1888,14 @@ int JRenderer::LoadPNG(TextureInfo &textureInfo, const char *filename, int mode
if (info_ptr == NULL)
{
//fclose(fp);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_PNG;
}
png_init_io(png_ptr, NULL);
png_set_read_fn(png_ptr, (png_voidp)fileSystem, PNGCustomReadDataFn);
png_set_read_fn(png_ptr, (png_voidp)jFile, PNGCustomReadDataFn);
png_set_sig_bytes(png_ptr, sig_read);
png_read_info(png_ptr, info_ptr);
@@ -1908,7 +1911,7 @@ int JRenderer::LoadPNG(TextureInfo &textureInfo, const char *filename, int mode
if (!line)
{
//fclose(fp);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
return JGE_ERR_MALLOC_FAILED;
@@ -1957,7 +1960,7 @@ int JRenderer::LoadPNG(TextureInfo &textureInfo, const char *filename, int mode
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
textureInfo.mBits = buffer;
@@ -2116,9 +2119,10 @@ int JRenderer::image_readgif(void * handle, TextureInfo &textureInfo, DWORD * bg
int image_gif_read(GifFileType * ft, GifByteType * buf, int size)
{
JFileSystem *fileSys = (JFileSystem *)ft->UserData;
//return fread(buf, 1, size, (FILE *)ft->UserData);
if (fileSys->ReadFile(buf, size))
JFileSystem* fileSystem = JFileSystem::GetInstance();
JFile* jFile = (JFile*)ft->UserData;
if (fileSys->ReadFile(jFile, buf, size))
return size;
else
return 0;
@@ -2130,17 +2134,18 @@ void JRenderer::LoadGIF(TextureInfo &textureInfo, const char *filename, int mode
///*
//FILE * fp = fopen(filename, "rb");
JFileSystem *fileSys = JFileSystem::GetInstance();
if (!fileSys->OpenFile(filename))
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile))
return;
//if(fp == NULL)
// return;
DWORD bkcol;
int result = image_readgif(fileSys, textureInfo, &bkcol, image_gif_read, mode);
int result = image_readgif(jFile, textureInfo, &bkcol, image_gif_read, mode);
if(result!=0)
textureInfo.mBits=NULL;
//fclose(fp);
fileSys->CloseFile();
fileSys->CloseFile(jFile);
return ;//*/
}
#endif //(!defined IOS) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
@@ -2161,20 +2166,21 @@ JTexture* JRenderer::LoadTexture(const char* filename, int mode, int TextureForm
UIImage *image = NULL;
do {
if (!fileSystem->OpenFile(filename))
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile)
break;
rawsize = fileSystem->GetFileSize();
rawsize = fileSystem->GetFileSize(jFile);
rawdata = new BYTE[rawsize];
if (!rawdata)
{
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
break;
}
fileSystem->ReadFile(rawdata, rawsize);
fileSystem->CloseFile();
fileSystem->ReadFile(jFile, rawdata, rawsize);
fileSystem->CloseFile(jFile);
texData = [[NSData alloc] initWithBytes:rawdata length:rawsize];
image = [[UIImage alloc] initWithData:texData];
@@ -2254,20 +2260,21 @@ JTexture* JRenderer::LoadTexture(const char* filename, int, int)
JFileSystem* fileSystem = JFileSystem::GetInstance();
do {
if (!fileSystem->OpenFile(filename))
JFile* jFile = fileSystem->OpenFile(filename);
if (!jFile)
break;
rawsize = fileSystem->GetFileSize();
rawsize = fileSystem->GetFileSize(jFile);
rawdata = new BYTE[rawsize];
if (!rawdata)
{
fileSystem->CloseFile();
fileSystem->CloseFile(jFile);
break;
}
fileSystem->ReadFile(rawdata, rawsize);
fileSystem->CloseFile();
fileSystem->ReadFile(jFile, rawdata, rawsize);
fileSystem->CloseFile(jFile);
QImage tmpImage = QImage::fromData(rawdata, rawsize);
if(tmpImage.isNull())
+75 -125
View File
@@ -22,8 +22,6 @@
JMusic::JMusic()
#ifdef USE_PHONON
: mOutput(0), mMediaObject(0)
#elif defined QT_CONFIG
: playlist(0), player(0)
#endif
{
}
@@ -42,16 +40,11 @@ int JMusic::getPlayTime(){
JMusic::~JMusic()
{
#if defined USE_PHONON
#ifdef USE_PHONON
if(mOutput)
delete mOutput;
if(mMediaObject)
delete mMediaObject;
#elif defined QT_CONFIG
if(player)
delete player;
if(playlist)
delete playlist;
#elif defined WITH_FMOD
JSoundSystem::GetInstance()->StopMusic(this);
if (mTrack) FSOUND_Sample_Free(mTrack);
@@ -67,9 +60,7 @@ void JMusic::seekAtTheBegining()
//////////////////////////////////////////////////////////////////////////
JSample::JSample()
#ifdef QT_CONFIG
: effect(0)
#elif (defined USE_PHONON)
#ifdef USE_PHONON
: mOutput(0), mMediaObject(0)
#endif
{
@@ -78,12 +69,7 @@ JSample::JSample()
JSample::~JSample()
{
#if (defined QT_CONFIG) && (!defined USE_PHONON)
if(effect) {
delete effect;
effect = 0;
}
#elif (defined USE_PHONON)
#ifdef USE_PHONON
if(mOutput)
delete mOutput;
if(mMediaObject)
@@ -158,84 +144,66 @@ void JSoundSystem::DestroySoundSystem()
JMusic *JSoundSystem::LoadMusic(const char *fileName)
{
JMusic* music = NULL;
#if (defined QT_CONFIG) && (!defined USE_PHONON)
music = new JMusic();
if (music)
{
music->player = new QMediaPlayer;
music->player->setVolume(100);
music->playlist = new QMediaPlaylist;
music->fullpath = JFileSystem::GetInstance()->GetResourceFile(fileName);
music->playlist->addMedia(QUrl::fromLocalFile(music->fullpath.c_str()));
music->playlist->setCurrentIndex(0);
}
#elif defined USE_PHONON
music = new JMusic();
if (music)
{
music->mOutput = new Phonon::AudioOutput(Phonon::GameCategory, 0);
music->mMediaObject = new Phonon::MediaObject(0);
string fullpath = JFileSystem::GetInstance()->GetResourceFile(fileName);
music->mMediaObject->setCurrentSource(QString(fullpath.c_str()));
Phonon::Path mediapath = Phonon::createPath(music->mMediaObject, music->mOutput);
Q_ASSERT(mediapath.isValid());
}
#ifdef USE_PHONON
JMusic* music = new JMusic();
if (music)
{
music->mOutput = new Phonon::AudioOutput(Phonon::GameCategory, 0);
music->mMediaObject = new Phonon::MediaObject(0);
string fullpath = JFileSystem::GetInstance()->GetResourceFile(fileName);
music->mMediaObject->setCurrentSource(QString(fullpath.c_str()));
Phonon::Path mediapath = Phonon::createPath(music->mMediaObject, music->mOutput);
Q_ASSERT(mediapath.isValid());
}
return music;
#elif (defined WITH_FMOD)
music = new JMusic();
if (music)
JMusic* music = new JMusic();
if (music)
{
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (fileSystem->OpenFile(fileName))
{
int size = fileSystem->GetFileSize();
char *buffer = new char[size];
fileSystem->ReadFile(buffer, size);
music->mTrack = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, FSOUND_LOADMEMORY, 0, size);
JFileSystem* fileSystem = JFileSystem::GetInstance();
JFile* jFile = fileSystem->OpenFile(fileName);
if (jFile)
{
int size = fileSystem->GetFileSize(jFile);
char *buffer = new char[size];
fileSystem->ReadFile(jFile, buffer, size);
music->mTrack = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, FSOUND_LOADMEMORY, 0, size);
delete[] buffer;
fileSystem->CloseFile();
}
delete[] buffer;
fileSystem->CloseFile(jFile);
}
}
return music;
#else
cerr << fileName << endl;
return NULL;
#endif
return music;
}
void JSoundSystem::PlayMusic(JMusic *music, bool looping)
{
#if (defined QT_CONFIG) && (!defined USE_PHONON)
if(music && music->player && music->playlist)
#ifdef USE_PHONON
if (music && music->mMediaObject && music->mOutput)
{
if(looping)
{
if(looping)
music->playlist->setPlaybackMode(QMediaPlaylist::Loop);
music->player->setPlaylist(music->playlist);
music->player->play();
music->mMediaObject->connect(music->mMediaObject, SIGNAL(aboutToFinish()), music, SLOT(seekAtTheBegining()));
}
#elif USE_PHONON
if (music && music->mMediaObject && music->mOutput)
{
if(looping)
{
music->mMediaObject->connect(music->mMediaObject, SIGNAL(aboutToFinish()), music, SLOT(seekAtTheBegining()));
}
music->mOutput->setVolume((qreal)mVolume*0.01);
music->mMediaObject->play();
music->mOutput->setVolume((qreal)mVolume*0.01);
music->mMediaObject->play();
}
}
#elif (defined WITH_FMOD)
if (music && music->mTrack)
if (music && music->mTrack)
{
mChannel = FSOUND_PlaySound(mChannel, music->mTrack);
SetMusicVolume(mVolume);
mChannel = FSOUND_PlaySound(mChannel, music->mTrack);
SetMusicVolume(mVolume);
if (looping)
FSOUND_SetLoopMode(mChannel, FSOUND_LOOP_NORMAL);
else
FSOUND_SetLoopMode(mChannel, FSOUND_LOOP_OFF);
if (looping)
FSOUND_SetLoopMode(mChannel, FSOUND_LOOP_NORMAL);
else
FSOUND_SetLoopMode(mChannel, FSOUND_LOOP_OFF);
}
#else
music = 0;
@@ -246,12 +214,7 @@ void JSoundSystem::PlayMusic(JMusic *music, bool looping)
void JSoundSystem::StopMusic(JMusic *music)
{
#if (defined QT_CONFIG) && (!defined USE_PHONON)
if (music && music->player && music->playlist)
{
music->player->stop();
}
#elif defined USE_PHONON
#ifdef USE_PHONON
if (music && music->mMediaObject && music->mOutput)
{
music->mMediaObject->stop();
@@ -302,61 +265,48 @@ void JSoundSystem::SetSfxVolume(int volume){
JSample *JSoundSystem::LoadSample(const char *fileName)
{
JSample* sample = NULL;
#if (defined QT_CONFIG) && (!defined USE_PHONON)
sample = new JSample();
if (sample)
{
string fullpath = JFileSystem::GetInstance()->GetResourceFile(fileName);
sample->effect = new QMediaPlayer;
sample->effect->setMedia(QUrl::fromLocalFile(fullpath.c_str()));
sample->effect->setVolume(100);
sample->mSample = &(sample->effect);
}
#elif (defined USE_PHONON)
sample = new JSample();
if (sample)
{
sample->mOutput = new Phonon::AudioOutput(Phonon::GameCategory, 0);
sample->mMediaObject = new Phonon::MediaObject(0);
string fullpath = JFileSystem::GetInstance()->GetResourceFile(fileName);
sample->mMediaObject->setCurrentSource(QString(fullpath.c_str()));
Phonon::Path mediapath = Phonon::createPath(sample->mMediaObject, sample->mOutput);
Q_ASSERT(mediapath.isValid());
}
#if (defined USE_PHONON)
JSample* sample = new JSample();
if (sample)
{
sample->mOutput = new Phonon::AudioOutput(Phonon::GameCategory, 0);
sample->mMediaObject = new Phonon::MediaObject(0);
string fullpath = JFileSystem::GetInstance()->GetResourceFile(fileName);
sample->mMediaObject->setCurrentSource(QString(fullpath.c_str()));
Phonon::Path mediapath = Phonon::createPath(sample->mMediaObject, sample->mOutput);
Q_ASSERT(mediapath.isValid());
}
return sample;
#elif (defined WITH_FMOD)
sample = new JSample();
if (sample)
JSample* sample = new JSample();
if (sample)
{
JFileSystem* fileSystem = JFileSystem::GetInstance();
if (fileSystem->OpenFile(fileName))
{
int size = fileSystem->GetFileSize();
char *buffer = new char[size];
fileSystem->ReadFile(buffer, size);
sample->mSample = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, FSOUND_LOADMEMORY, 0, size);
JFileSystem* fileSystem = JFileSystem::GetInstance();
JFile* jFile = fileSystem->OpenFile(fileName);
if (jFile)
{
int size = fileSystem->GetFileSize(jFile);
char *buffer = new char[size];
fileSystem->ReadFile(jFile, buffer, size);
sample->mSample = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, FSOUND_LOADMEMORY, 0, size);
delete[] buffer;
fileSystem->CloseFile();
}else
sample->mSample = NULL;
delete[] buffer;
fileSystem->CloseFile(jFile);
}else
sample->mSample = NULL;
}
return sample;
#else
cerr << fileName << endl;
return NULL;
#endif
return sample;
}
void JSoundSystem::PlaySample(JSample *sample)
{
#if (defined QT_CONFIG) && (!defined USE_PHONON)
if(sample)
{
sample->effect->play();
}
#elif defined USE_PHONON
#ifdef USE_PHONON
if (sample && sample->mMediaObject && sample->mOutput)
{
sample->mOutput->setVolume((qreal)mSampleVolume*0.01);
-7
View File
@@ -2,8 +2,6 @@
[![Build Status](https://travis-ci.org/WagicProject/wagic.png?branch=master)](https://travis-ci.org/WagicProject/wagic)
[![Build status](https://ci.appveyor.com/api/projects/status/7j4fbr6m62aqej59/branch/master)](https://ci.appveyor.com/project/xawotihs/wagic/branch/master)
[![Coverage Status](https://coveralls.io/repos/WagicProject/wagic/badge.png?branch=master)](https://coveralls.io/r/WagicProject/wagic?branch=master)
## Description
@@ -21,8 +19,3 @@ It is highly customizable and allows the player to tweak the rules / create thei
Info, downloads, discussions and more at http://wololo.net/forum/index.php
-![alt text](http://wololo.net/wagic/wp-content/uploads/2009/10/shop.jpg "Screenshot")
### Sample round play-through video
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/WUFSAPZuDIk/0.jpg)](http://www.youtube.com/watch?v=WUFSAPZuDIk)
-76
View File
@@ -1,76 +0,0 @@
# Notes:
# - Minimal appveyor.yml file is an empty file. All sections are optional.
# - Indent each level of configuration with 2 spaces. Do not use tabs!
# - All section names are case-sensitive.
# - Section names should be unique on each level.
# branches to build
branches:
# blacklist
except:
- travis_mac_osx
# Do not build on tags (GitHub only)
skip_tags: true
#---------------------------------#
# environment configuration #
#---------------------------------#
environment:
GH_TOKEN:
secure: dYnBDQkiY5oVjIlswzBX9BJigNtBGXgGlp1tK3XbHzrDEDrs2vaKD5m+Oz5OSz1C
# scripts that run after cloning repository
install:
- ps: (new-object net.webclient).DownloadFile('https://raw.github.com/pypa/pip/master/contrib/get-pip.py', 'C:/get-pip.py')
- "C:/Python27/python.exe C:/get-pip.py"
- "C:/Python27/Scripts/pip.exe install pyjavaproperties"
- "C:/Python27/Scripts/pip.exe install github3.py"
#---------------------------------#
# build configuration #
#---------------------------------#
# build Configuration, i.e. Debug, Release, etc.
configuration: Release
build:
project: projects/mtg/mtg_vs2010.sln # path to Visual Studio solution or project
#---------------------------------#
# tests configuration #
#---------------------------------#
# to disable automatic tests
test: off
#---------------------------------#
# artifacts configuration #
#---------------------------------#
artifacts:
# pushing windows package
- path: projects\mtg\bin\Wagic-windows*.zip
#---------------------------------#
# deployment configuration #
#---------------------------------#
# scripts to run before deployment
before_deploy:
- cd projects/mtg/bin
- "C:/Python27/python.exe createWindowsZip.py"
- cd ../../..
# scripts to run after deployment
after_deploy:
# to run your custom scripts instead of provider deployments
deploy_script:
- "C:/Python27/python.exe tools/upload-binaries.py -t %GH_TOKEN% -s %APPVEYOR_REPO_COMMIT% -l projects/mtg/bin/Wagic-windows.zip -r Wagic-windows.zip -b %APPVEYOR_REPO_BRANCH%"
# to disable deployment
#deploy: off
+1
View File
@@ -57,6 +57,7 @@ LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.cpp \
$(MTG_PATH)/src/DeckMetaData.cpp \
$(MTG_PATH)/src/DeckStats.cpp \
$(MTG_PATH)/src/DuelLayers.cpp \
$(MTG_PATH)/src/Effects.cpp \
$(MTG_PATH)/src/ExtraCost.cpp \
$(MTG_PATH)/src/GameApp.cpp \
$(MTG_PATH)/src/GameLauncher.cpp \
@@ -80,6 +80,7 @@ public class SDLActivity extends Activity implements OnKeyListener
public Boolean mErrorHappened = false;
public final static String RES_FOLDER = Environment.getExternalStorageDirectory().getPath() + "/Wagic/Res/";
public static String RES_FILENAME = "core_0184.zip";
public static final String RES_URL = "http://wagic.googlecode.com/files/";
public String systemFolder = Environment.getExternalStorageDirectory().getPath() + "/Wagic/Res/";
private String userFolder;
@@ -306,7 +307,7 @@ public class SDLActivity extends Activity implements OnKeyListener
private void startDownload()
{
String url = getResourceUrl();
String url = RES_URL + RES_FILENAME;
if (!checkStorageState())
{
Log.e(TAG, "Error in initializing storage space.");
@@ -436,7 +437,7 @@ public class SDLActivity extends Activity implements OnKeyListener
mContext = this.getApplicationContext();
// get the current version of the app to set the core filename
String versionCodeString = getApplicationCode();
RES_FILENAME = getResourceName();
RES_FILENAME = "core_" + versionCodeString + ".zip";
StorageOptions.determineStorageOptions();
checkStorageLocationPreference();
@@ -524,9 +525,6 @@ public class SDLActivity extends Activity implements OnKeyListener
}
// C functions we call
public static native String getResourceUrl();
public static native String getResourceName();
public static native void nativeInit();
public static native void nativeQuit();
-20
View File
@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleGetInfoString</key>
<string>Created by Qt/QMake</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleExecutable</key>
<string>wagic.launcher</string>
<key>CFBundleIdentifier</key>
<string>wagic.wagic</string>
<key>NOTE</key>
<string>This file was generated by Qt/QMake.</string>
</dict>
</plist>
Binary file not shown.
-5
View File
@@ -1,5 +0,0 @@
#!/bin/bash
cd ${0%/*/*}/Resources
#cd ../Resources
exec ../MacOS/wagic -platformpluginpath ../PlugIns >> ../logs/out.log 2> ../logs/err.log
+3 -3
View File
@@ -6,7 +6,7 @@ OBJS = objs/InteractiveButton.o objs/AbilityParser.o objs/ActionElement.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/ExtraCost.o objs/GameApp.o objs/GameLauncher.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\
@@ -86,7 +86,7 @@ all: $(DEFAULT_RULE)
endif
CFLAGS := -Wall -W -Wno-unused $(CFLAGS)
CFLAGS := -Wall -W -Werror -Wno-unused $(CFLAGS)
CXXFLAGS += $(CFLAGS)
# -fno-exceptions
@@ -128,7 +128,7 @@ clean:
endif
define compile
$(CXX) -c $(CXXFLAGS) $< -o $@
$(CXX) -c $(CXXFLAGS) $< -o $@
endef
PrecompiledHeader.h.gch: ../../projects/mtg/include/PrecompiledHeader.h
+66 -19
View File
@@ -30,8 +30,8 @@ def createResZipFile(filename):
zip_file.close()
if rename:
os.rename('settings/options.txt', 'settings/options.orig.txt')
os.rename('player/options.txt', 'player/options.orig.txt')
os.rename('settings/options.txt', 'settings/options.orig.txt')
os.rename('player/options.txt', 'player/options.orig.txt')
def getFilename():
p = Properties();
@@ -42,20 +42,51 @@ def getFilename():
filename = 'core_' + major + minor + point
return filename
def createQrcFile():
utilities = ZipUtilities()
print "Creating Qt Resource File"
filename = "core.qrc"
f = open(filename, 'w')
f.seek(0,0)
f.write("""<!DOCTYPE RCC><RCC version="1.0">\n<qresource>\n""")
rename = False
if not os.path.isfile('settings/options.txt'):
os.rename('settings/options.orig.txt', 'settings/options.txt')
remame = True
if not os.path.isfile('player/options.txt'):
os.rename('player/options.orig.txt', 'player/options.txt')
rename = True
utilities.addFolderToQrc(f, 'themes')
utilities.addFolderToQrc(f, 'sound')
utilities.addFolderToQrc(f, 'settings')
utilities.addFolderToQrc(f, 'sets')
utilities.addFolderToQrc(f, 'rules')
utilities.addFolderToQrc(f, 'player')
utilities.addFolderToQrc(f, 'packs')
utilities.addFolderToQrc(f, 'lang')
utilities.addFolderToQrc(f, 'graphics')
utilities.addFolderToQrc(f, 'campaigns')
utilities.addFolderToQrc(f, 'ai')
if rename:
os.rename('settings/options.txt', 'settings/options.orig.txt')
os.rename('player/options.txt', 'player/options.orig.txt')
f.seek(0,2)
f.write('</qresource>\n</RCC>\n')
f.close
print >> sys.stderr, 'Created Resource Package for Qt projects: {0}'.format( filename)
def createStandardResFile(filename):
print('Creating Standard Resource File')
if not filename:
filename = getFilename() + '.zip'
def createStandardResFile():
print "Creating Standard Resource File"
filename = getFilename() + '.zip'
createResZipFile( filename )
print >> sys.stderr, 'Created Resource Package for Standard Distribution: {0}'.format( filename)
def createIosResFile(filename):
print('Preparing Resource Package for iOS')
def createIosResFile():
print 'Preparing Resource Package for iOS'
utilities = ZipUtilities()
if not filename:
filename = getFilename() + '_iOS.zip'
filename = getFilename() + '_iOS.zip'
#createResZipFile( filename )
zip_file = zipfile.ZipFile(filename, 'a', zipfile.ZIP_STORED)
zip_file.write("../../iOS/Res/rules/modrules.xml", "rules/modrules.xml", zipfile.ZIP_STORED)
@@ -80,29 +111,45 @@ class ZipUtilities:
if file != '.svn':
full_path = os.path.join(folder, file)
if os.path.isfile(full_path):
print('File added: ' + str(full_path))
print 'File added: ' + str(full_path)
zip_file.write(full_path)
elif os.path.isdir(full_path):
print('Entering folder: ' + str(full_path))
print 'Entering folder: ' + str(full_path)
self.addFolderToZip(zip_file, full_path)
def addFolderToQrc(self, qrc, folder):
qrc.seek(0,2)
for file in os.listdir(folder):
if file != '.svn':
full_path = os.path.join(folder, file)
if os.path.isfile(full_path):
print 'File added: ' + str(full_path)
qrc.write('<file>')
qrc.write(full_path)
qrc.write('</file>\n')
elif os.path.isdir(full_path):
print 'Entering folder: ' + str(full_path)
self.addFolderToQrc(qrc, full_path)
def main():
## using optparse instead of argParse for now since python 2.7 may not be installed.
parser = OptionParser()
parser.add_option("-p", "--platform", help="PLATFORM: specify custom build. (eg ios, android, etc)", metavar="PLATFORM", dest="platform")
parser.add_option("-n", "--name", help="NAME: specify resource file name", metavar="NAME", dest="name")
parser.add_option("-p", "--platform", help="PLATFORM: specify custom build. (eg qt, ios, android, etc)", metavar="PLATFORM", dest="platform")
(options, args) = parser.parse_args()
if (options.platform):
if (options.platform == "ios"):
createIosResFile(options.name)
else:
createStandardResFile(options.name)
print "reading %s..." % options.platform
if (options.platform == 'ios'):
createIosResFile()
elif (options.platform == 'qt'):
createQrcFile()
else:
createStandardResFile()
else:
createStandardResFile(options.name)
createStandardResFile()
if __name__ == "__main__":
main()
-846
View File
@@ -1,846 +0,0 @@
[meta]
author=Wagic Team
name=Born of the Gods
year=2014
block=Theros
[/meta]
[card]
primitive=Acolyte's Reward
id=378373
rarity=U
[/card]
[card]
primitive=Aerie Worshippers
id=378402
rarity=U
[/card]
[card]
primitive=Akroan Conscriptor
id=378459
rarity=U
[/card]
[card]
primitive=Akroan Phalanx
id=378374
rarity=U
[/card]
[card]
primitive=Akroan Skyguard
id=378375
rarity=C
[/card]
[card]
primitive=Arbiter of the Ideal
id=378403
rarity=R
[/card]
[card]
primitive=Archetype of Aggression
id=378460
rarity=U
[/card]
[card]
primitive=Archetype of Courage
id=378376
rarity=U
[/card]
[card]
primitive=Archetype of Endurance
id=378488
rarity=U
[/card]
[card]
primitive=Archetype of Finality
id=378430
rarity=U
[/card]
[card]
primitive=Archetype of Imagination
id=378404
rarity=U
[/card]
[card]
primitive=Ashiok's Adept
id=378431
rarity=U
[/card]
[card]
primitive=Aspect of Hydra
id=378489
rarity=C
[/card]
[card]
primitive=Asphyxiate
id=378432
rarity=C
[/card]
[card]
primitive=Astral Cornucopia
id=378529
rarity=R
[/card]
[card]
primitive=Bile Blight
id=378433
rarity=U
[/card]
[card]
primitive=Black Oak of Odunos
id=378434
rarity=U
[/card]
[card]
primitive=Bolt of Keranos
id=378461
rarity=C
[/card]
[card]
primitive=Brimaz, King of Oreskos
id=378377
rarity=M
[/card]
[card]
primitive=Champion of Stray Souls
id=378435
rarity=M
[/card]
[card]
primitive=Charging Badger
id=378490
rarity=C
[/card]
[card]
primitive=Chorus of the Tides
id=378405
rarity=C
[/card]
[card]
primitive=Chromanticore
id=378516
rarity=M
[/card]
[card]
primitive=Claim of Erebos
id=378436
rarity=C
[/card]
[card]
primitive=Courser of Kruphix
id=378491
rarity=R
[/card]
[card]
primitive=Crypsis
id=378406
rarity=C
[/card]
[card]
primitive=Culling Mark
id=378492
rarity=C
[/card]
[card]
primitive=Cyclops of One-Eyed Pass
id=378462
rarity=C
[/card]
[card]
primitive=Dawn to Dusk
id=378378
rarity=U
[/card]
[card]
primitive=Deepwater Hypnotist
id=378407
rarity=C
[/card]
[card]
primitive=Divination
id=378408
rarity=C
[/card]
[card]
primitive=Drown in Sorrow
id=378437
rarity=U
[/card]
[card]
primitive=Eater of Hope
id=378438
rarity=R
[/card]
[card]
primitive=Eidolon of Countless Battles
id=378379
rarity=R
[/card]
[card]
primitive=Elite Skirmisher
id=378380
rarity=C
[/card]
[card]
primitive=Ephara, God of the Polis
id=378517
rarity=M
[/card]
[card]
primitive=Ephara's Enlightenment
id=378518
rarity=U
[/card]
[card]
primitive=Ephara's Radiance
id=378381
rarity=C
[/card]
[card]
primitive=Epiphany Storm
id=378463
rarity=C
[/card]
[card]
primitive=Eternity Snare
id=378409
rarity=U
[/card]
[card]
primitive=Evanescent Intellect
id=378410
rarity=C
[/card]
[card]
primitive=Everflame Eidolon
id=378464
rarity=U
[/card]
[card]
primitive=Excoriate
id=378382
rarity=C
[/card]
[card]
primitive=Eye Gouge
id=378439
rarity=C
[/card]
[card]
primitive=Fall of the Hammer
id=378465
rarity=C
[/card]
[card]
primitive=Fanatic of Xenagos
id=378519
rarity=U
[/card]
[card]
primitive=Fate Unraveler
id=378440
rarity=R
[/card]
[card]
primitive=Fated Conflagration
id=378466
rarity=R
[/card]
[card]
primitive=Fated Infatuation
id=378411
rarity=R
[/card]
[card]
primitive=Fated Intervention
id=378493
rarity=R
[/card]
[card]
primitive=Fated Retribution
id=378383
rarity=R
[/card]
[card]
primitive=Fated Return
id=378441
rarity=R
[/card]
[card]
primitive=Fearsome Temper
id=378467
rarity=C
[/card]
[card]
primitive=Felhide Brawler
id=378442
rarity=C
[/card]
[card]
primitive=Felhide Spiritbinder
id=378468
rarity=R
[/card]
[card]
primitive=Flame-Wreathed Phoenix
id=378469
rarity=M
[/card]
[card]
primitive=Flitterstep Eidolon
id=378412
rarity=U
[/card]
[card]
primitive=Floodtide Serpent
id=378413
rarity=C
[/card]
[card]
primitive=Forgestoker Dragon
id=378470
rarity=R
[/card]
[card]
primitive=Forlorn Pseudamma
id=378443
rarity=U
[/card]
[card]
primitive=Forsaken Drifters
id=378444
rarity=U
[/card]
[card]
primitive=Ghostblade Eidolon
id=378384
rarity=U
[/card]
[card]
primitive=Gild
id=378445
rarity=R
[/card]
[card]
primitive=Gold
id=-378445
rarity=T
[/card]
[card]
primitive=Glimpse the Sun God
id=378385
rarity=U
[/card]
[card]
primitive=God-Favored General
id=378386
rarity=U
[/card]
[card]
primitive=Gorgon's Head
id=378530
rarity=U
[/card]
[card]
primitive=Graverobber Spider
id=378494
rarity=U
[/card]
[card]
primitive=Great Hart
id=378387
rarity=C
[/card]
[card]
primitive=Griffin Dreamfinder
id=378388
rarity=C
[/card]
[card]
primitive=Grisly Transformation
id=378446
rarity=C
[/card]
[card]
primitive=Herald of Torment
id=378447
rarity=R
[/card]
[card]
primitive=Hero of Iroas
id=378389
rarity=R
[/card]
[card]
primitive=Hero of Leina Tower
id=378495
rarity=R
[/card]
[card]
primitive=Heroes' Podium
id=378531
rarity=R
[/card]
[card]
primitive=Hold at Bay
id=378390
rarity=C
[/card]
[card]
primitive=Hunter's Prowess
id=378496
rarity=R
[/card]
[card]
primitive=Impetuous Sunchaser
id=378471
rarity=C
[/card]
[card]
primitive=Karametra, God of Harvests
id=378520
rarity=M
[/card]
[card]
primitive=Karametra's Favor
id=378497
rarity=C
[/card]
[card]
primitive=Kiora, the Crashing Wave
id=378521
rarity=M
[/card]
[card]
primitive=Kiora's Prevention
id=37852101
rarity=T
[/card]
[card]
primitive=Kiora's Kraken
id=-378521
rarity=T
[/card]
[card]
primitive=Kiora's Follower
id=378522
rarity=U
[/card]
[card]
primitive=Kragma Butcher
id=378472
rarity=C
[/card]
[card]
primitive=Kraken of the Straits
id=378414
rarity=U
[/card]
[card]
primitive=Lightning Volley
id=378473
rarity=U
[/card]
[card]
primitive=Loyal Pegasus
id=378391
rarity=C
[/card]
[card]
primitive=Marshmist Titan
id=378448
rarity=C
[/card]
[card]
primitive=Meletis Astronomer
id=378415
rarity=U
[/card]
[card]
primitive=Mindreaver
id=378416
rarity=R
[/card]
[card]
primitive=Mischief and Mayhem
id=378498
rarity=U
[/card]
[card]
primitive=Mogis, God of Slaughter
id=378523
rarity=M
[/card]
[card]
primitive=Mortal's Ardor
id=378392
rarity=C
[/card]
[card]
primitive=Mortal's Resolve
id=378499
rarity=C
[/card]
[card]
primitive=Necrobite
id=378449
rarity=C
[/card]
[card]
primitive=Nessian Demolok
id=378500
rarity=U
[/card]
[card]
primitive=Nessian Wilds Ravager
id=378501
rarity=R
[/card]
[card]
primitive=Noble Quarry
id=378502
rarity=U
[/card]
[card]
primitive=Nullify
id=378417
rarity=C
[/card]
[card]
primitive=Nyxborn Eidolon
id=378450
rarity=C
[/card]
[card]
primitive=Nyxborn Rollicker
id=378474
rarity=C
[/card]
[card]
primitive=Nyxborn Shieldmate
id=378393
rarity=C
[/card]
[card]
primitive=Nyxborn Triton
id=378418
rarity=C
[/card]
[card]
primitive=Nyxborn Wolf
id=378503
rarity=C
[/card]
[card]
primitive=Odunos River Trawler
id=378451
rarity=U
[/card]
[card]
primitive=Oracle of Bones
id=378475
rarity=R
[/card]
[card]
primitive=Oracle's Insight
id=378419
rarity=U
[/card]
[card]
primitive=Oreskos Sun Guide
id=378394
rarity=C
[/card]
[card]
primitive=Ornitharch
id=378395
rarity=U
[/card]
[card]
primitive=Pain Seer
id=378452
rarity=R
[/card]
[card]
primitive=Peregrination
id=378504
rarity=U
[/card]
[card]
primitive=Perplexing Chimera
id=378420
rarity=R
[/card]
[card]
primitive=Pharagax Giant
id=378476
rarity=C
[/card]
[card]
primitive=Phenax, God of Deception
id=378524
rarity=M
[/card]
[card]
primitive=Pheres-Band Raiders
id=378505
rarity=U
[/card]
[card]
primitive=Pheres-Band Tromper
id=378506
rarity=C
[/card]
[card]
primitive=Pillar of War
id=378532
rarity=U
[/card]
[card]
primitive=Pinnacle of Rage
id=378477
rarity=U
[/card]
[card]
primitive=Plea for Guidance
id=378396
rarity=R
[/card]
[card]
primitive=Ragemonger
id=378525
rarity=U
[/card]
[card]
primitive=Raised by Wolves
id=378507
rarity=U
[/card]
[card]
primitive=Reap what is Sown
id=378526
rarity=U
[/card]
[card]
primitive=Reckless Reveler
id=378478
rarity=C
[/card]
[card]
primitive=Retraction Helix
id=378421
rarity=C
[/card]
[card]
primitive=Revoke Existence
id=378397
rarity=C
[/card]
[card]
primitive=Rise to the Challenge
id=378479
rarity=C
[/card]
[card]
primitive=Sanguimancy
id=378453
rarity=U
[/card]
[card]
primitive=Satyr Firedancer
id=378480
rarity=R
[/card]
[card]
primitive=Satyr Nyx-Smith
id=378481
rarity=U
[/card]
[card]
primitive=Satyr Wayfinder
id=378508
rarity=C
[/card]
[card]
primitive=Scourge of Skola Vale
id=378509
rarity=R
[/card]
[card]
primitive=Scouring Sands
id=378482
rarity=C
[/card]
[card]
primitive=Searing Blood
id=378483
rarity=U
[/card]
[card]
primitive=Servant of Tymaret
id=378454
rarity=C
[/card]
[card]
primitive=Setessan Oathsworn
id=378510
rarity=C
[/card]
[card]
primitive=Setessan Starbreaker
id=378511
rarity=C
[/card]
[card]
primitive=Shrike Harpy
id=378455
rarity=U
[/card]
[card]
primitive=Silent Sentinel
id=378398
rarity=R
[/card]
[card]
primitive=Siren of the Fanged Coast
id=378422
rarity=U
[/card]
[card]
primitive=Siren of the Silent Song
id=378527
rarity=U
[/card]
[card]
primitive=Siren Song Lyre
id=378533
rarity=U
[/card]
[card]
primitive=Skyreaping
id=378512
rarity=U
[/card]
[card]
primitive=Snake of the Golden Grove
id=378513
rarity=C
[/card]
[card]
primitive=Sphinx's Disciple
id=378423
rarity=C
[/card]
[card]
primitive=Spirit of the Labyrinth
id=378399
rarity=R
[/card]
[card]
primitive=Spiteful Returned
id=378456
rarity=U
[/card]
[card]
primitive=Springleaf Drum
id=378534
rarity=U
[/card]
[card]
primitive=Stormcaller of Keranos
id=378484
rarity=U
[/card]
[card]
primitive=Stratus Walk
id=378424
rarity=C
[/card]
[card]
primitive=Sudden Storm
id=378425
rarity=C
[/card]
[card]
primitive=Sunbond
id=378400
rarity=U
[/card]
[card]
primitive=Swordwise Centaur
id=378514
rarity=C
[/card]
[card]
primitive=Temple of Enlightenment
id=378535
rarity=R
[/card]
[card]
primitive=Temple of Malice
id=378536
rarity=R
[/card]
[card]
primitive=Temple of Plenty
id=378537
rarity=R
[/card]
[card]
primitive=Thassa's Rebuff
id=378426
rarity=U
[/card]
[card]
primitive=Thunder Brute
id=378485
rarity=U
[/card]
[card]
primitive=Thunderous Might
id=378486
rarity=U
[/card]
[card]
primitive=Tromokratis
id=378427
rarity=R
[/card]
[card]
primitive=Unravel the AEther
id=378515
rarity=U
[/card]
[card]
primitive=Vanguard of Brimaz
id=378401
rarity=U
[/card]
[card]
primitive=Vortex Elemental
id=378428
rarity=U
[/card]
[card]
primitive=Warchanter of Mogis
id=378457
rarity=C
[/card]
[card]
primitive=Weight of the Underworld
id=378458
rarity=C
[/card]
[card]
primitive=Whelming Wave
id=378429
rarity=R
[/card]
[card]
primitive=Whims of the Fates
id=378487
rarity=R
[/card]
[card]
primitive=Xenagos, God of Revels
id=378528
rarity=M
[/card]
File diff suppressed because it is too large Load Diff
-21
View File
@@ -1,21 +0,0 @@
<PACK name="Dragons of Tarkir" type="Booster" pool="all set:DTK;" price="700">
<slot copies="1">
<random_card>rarity:mythic;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
</slot>
<slot copies="3">
<random_card>rarity:uncommon;</random_card>
</slot>
<slot copies="1">
<random_card>rarity:special;</random_card>
</slot>
<slot copies="10">
<random_card>rarity:common;</random_card>
</slot>
</PACK>
-934
View File
@@ -1,934 +0,0 @@
[meta]
author=Wagic Team
year=2015
[/meta]
[card]
primitive=Abzan Advantage
id=391781
rarity=C
[/card]
[card]
primitive=Abzan Beastmaster
id=391782
rarity=U
[/card]
[card]
primitive=Abzan Kin-Guard
id=391783
rarity=U
[/card]
[card]
primitive=Abzan Runemark
id=391784
rarity=C
[/card]
[card]
primitive=Abzan Skycaptain
id=391785
rarity=C
[/card]
[card]
primitive=Ainok Guide
id=391786
rarity=C
[/card]
[card]
primitive=Alesha, Who Smiles at Death
id=391787
rarity=R
[/card]
[card]
primitive=Alesha's Vanguard
id=391788
rarity=C
[/card]
[card]
primitive=Ambush Krotiq
id=391789
rarity=C
[/card]
[card]
primitive=Ancestral Vengeance
id=391790
rarity=C
[/card]
[card]
primitive=Arashin Cleric
id=391791
rarity=C
[/card]
[card]
primitive=Arashin War Beast
id=391792
rarity=U
[/card]
[card]
primitive=Arcbond
id=391793
rarity=R
[/card]
[card]
primitive=Archers of Qarsi
id=391794
rarity=C
[/card]
[card]
primitive=Archfiend of Depravity
id=391795
rarity=R
[/card]
[card]
primitive=Atarka, World Render
id=391796
rarity=R
[/card]
[card]
primitive=Aven Skirmisher
id=391797
rarity=C
[/card]
[card]
primitive=Aven Surveyor
id=391798
rarity=C
[/card]
[card]
primitive=Bathe in Dragonfire
id=391799
rarity=C
[/card]
[card]
primitive=Battle Brawler
id=391800
rarity=U
[/card]
[card]
primitive=Battlefront Krushok
id=391801
rarity=U
[/card]
[card]
primitive=Bloodfell Caves
id=391802
rarity=C
[/card]
[card]
primitive=Bloodfire Enforcers
id=391803
rarity=U
[/card]
[card]
primitive=Blossoming Sands
id=391804
rarity=C
[/card]
[card]
primitive=Break Through the Line
id=391805
rarity=U
[/card]
[card]
primitive=Brutal Hordechief
id=391806
rarity=M
[/card]
[card]
primitive=Cached Defenses
id=391807
rarity=U
[/card]
[card]
primitive=Channel Harm
id=391808
rarity=U
[/card]
[card]
primitive=Citadel Siege
id=391809
rarity=R
[/card]
[card]
primitive=Cloudform
id=391810
rarity=U
[/card]
[card]
primitive=Collateral Damage
id=391811
rarity=C
[/card]
[card]
primitive=Crucible of the Spirit Dragon
id=391812
rarity=R
[/card]
[card]
primitive=Crux of Fate
id=391813
rarity=R
[/card]
[card]
primitive=Cunning Strike
id=391814
rarity=C
[/card]
[card]
primitive=Daghatar the Adamant
id=391815
rarity=R
[/card]
[card]
primitive=Dark Deal
id=391816
rarity=U
[/card]
[card]
primitive=Defiant Ogre
id=391817
rarity=C
[/card]
[card]
primitive=Destructor Dragon
id=391818
rarity=U
[/card]
[card]
primitive=Diplomacy of the Wastes
id=391819
rarity=U
[/card]
[card]
primitive=Dismal Backwater
id=391820
rarity=C
[/card]
[card]
primitive=Douse in Gloom
id=391821
rarity=C
[/card]
[card]
primitive=Dragon Bell Monk
id=391822
rarity=C
[/card]
[card]
primitive=Dragonrage
id=391823
rarity=U
[/card]
[card]
primitive=Dragonscale General
id=391824
rarity=R
[/card]
[card]
primitive=Dromoka, the Eternal
id=391825
rarity=R
[/card]
[card]
primitive=Elite Scaleguard
id=391826
rarity=U
[/card]
[card]
primitive=Enhanced Awareness
id=391827
rarity=C
[/card]
[card]
primitive=Ethereal Ambush
id=391828
rarity=C
[/card]
[card]
primitive=Fascination
id=391829
rarity=U
[/card]
[card]
primitive=Fearsome Awakening
id=391830
rarity=U
[/card]
[card]
primitive=Feral Krushok
id=391831
rarity=C
[/card]
[card]
primitive=Fierce Invocation
id=391832
rarity=C
[/card]
[card]
primitive=Flamerush Rider
id=391833
rarity=R
[/card]
[card]
primitive=Flamewake Phoenix
id=391834
rarity=R
[/card]
[card]
primitive=Forest
id=391836
rarity=C
[/card]
[card]
primitive=Formless Nurturing
id=391837
rarity=C
[/card]
[card]
primitive=Friendly Fire
id=391838
rarity=U
[/card]
[card]
primitive=Frontier Mastodon
id=391839
rarity=C
[/card]
[card]
primitive=Frontier Siege
id=391840
rarity=R
[/card]
[card]
primitive=Frost Walker
id=391841
rarity=U
[/card]
[card]
primitive=Fruit of the First Tree
id=391842
rarity=U
[/card]
[card]
primitive=Ghastly Conscription
id=391843
rarity=M
[/card]
[card]
primitive=Goblin Boom Keg
id=391844
rarity=U
[/card]
[card]
primitive=Goblin Heelcutter
id=391845
rarity=C
[/card]
[card]
primitive=Gore Swine
id=391846
rarity=C
[/card]
[card]
primitive=Grave Strength
id=391847
rarity=U
[/card]
[card]
primitive=Great-Horn Krushok
id=391848
rarity=C
[/card]
[card]
primitive=Grim Contest
id=391849
rarity=C
[/card]
[card]
primitive=Gurmag Angler
id=391850
rarity=C
[/card]
[card]
primitive=Harsh Sustenance
id=391851
rarity=C
[/card]
[card]
primitive=Hero's Blade
id=391852
rarity=U
[/card]
[card]
primitive=Hewed Stone Retainers
id=391853
rarity=U
[/card]
[card]
primitive=Honor's Reward
id=391854
rarity=U
[/card]
[card]
primitive=Hooded Assassin
id=391855
rarity=C
[/card]
[card]
primitive=Humble Defector
id=391856
rarity=U
[/card]
[card]
primitive=Hungering Yeti
id=391857
rarity=U
[/card]
[card]
primitive=Hunt the Weak
id=391858
rarity=C
[/card]
[card]
primitive=Island
id=391859
rarity=C
[/card]
[card]
primitive=Jeskai Barricade
id=391861
rarity=U
[/card]
[card]
primitive=Jeskai Infiltrator
id=391862
rarity=R
[/card]
[card]
primitive=Jeskai Runemark
id=391863
rarity=C
[/card]
[card]
primitive=Jeskai Sage
id=391864
rarity=C
[/card]
[card]
primitive=Jungle Hollow
id=391865
rarity=C
[/card]
[card]
primitive=Kolaghan, the Storm's Fury
id=391866
rarity=R
[/card]
[card]
primitive=Lightform
id=391867
rarity=U
[/card]
[card]
primitive=Lightning Shrieker
id=391868
rarity=C
[/card]
[card]
primitive=Lotus Path Djinn
id=391869
rarity=C
[/card]
[card]
primitive=Lotus-Eye Mystics
id=391870
rarity=U
[/card]
[card]
primitive=Map the Wastes
id=391871
rarity=C
[/card]
[card]
primitive=Marang River Prowler
id=391872
rarity=U
[/card]
[card]
primitive=Mardu Runemark
id=391873
rarity=C
[/card]
[card]
primitive=Mardu Scout
id=391874
rarity=C
[/card]
[card]
primitive=Mardu Shadowspear
id=391875
rarity=U
[/card]
[card]
primitive=Mardu Strike Leader
id=391876
rarity=R
[/card]
[card]
primitive=Mardu Woe-Reaper
id=391877
rarity=U
[/card]
[card]
primitive=Mastery of the Unseen
id=391878
rarity=R
[/card]
[card]
primitive=Merciless Executioner
id=391879
rarity=U
[/card]
[card]
primitive=Mindscour Dragon
id=391880
rarity=U
[/card]
[card]
primitive=Mistfire Adept
id=391881
rarity=U
[/card]
[card]
primitive=Mob Rule
id=391882
rarity=R
[/card]
[card]
primitive=Monastery Mentor
id=391883
rarity=M
[/card]
[card]
primitive=Monk Token
id=-391883
rarity=T
[/card]
[card]
primitive=Monastery Siege
id=391884
rarity=R
[/card]
[card]
primitive=Mountain
id=391885
rarity=C
[/card]
[card]
primitive=Neutralizing Blast
id=391887
rarity=U
[/card]
[card]
primitive=Noxious Dragon
id=391888
rarity=U
[/card]
[card]
primitive=Ojutai, Soul of Winter
id=391889
rarity=R
[/card]
[card]
primitive=Orc Sureshot
id=391890
rarity=U
[/card]
[card]
primitive=Outpost Siege
id=391891
rarity=R
[/card]
[card]
primitive=Palace Siege
id=391892
rarity=R
[/card]
[card]
primitive=Pilgrim of the Fires
id=391893
rarity=U
[/card]
[card]
primitive=Plains
id=391895
rarity=C
[/card]
[card]
primitive=Pressure Point
id=391896
rarity=C
[/card]
[card]
primitive=Pyrotechnics
id=391897
rarity=U
[/card]
[card]
primitive=Qarsi High Priest
id=391898
rarity=U
[/card]
[card]
primitive=Rageform
id=391899
rarity=U
[/card]
[card]
primitive=Rakshasa's Disdain
id=391900
rarity=C
[/card]
[card]
primitive=Rally the Ancestors
id=391901
rarity=R
[/card]
[card]
primitive=Reach of Shadows
id=391902
rarity=C
[/card]
[card]
primitive=Reality Shift
id=391903
rarity=U
[/card]
[card]
primitive=Refocus
id=391904
rarity=C
[/card]
[card]
primitive=Renowned Weaponsmith
id=391905
rarity=U
[/card]
[card]
primitive=Return to the Earth
id=391906
rarity=C
[/card]
[card]
primitive=Rite of Undoing
id=391907
rarity=U
[/card]
[card]
primitive=Rugged Highlands
id=391908
rarity=C
[/card]
[card]
primitive=Ruthless Instincts
id=391909
rarity=U
[/card]
[card]
primitive=Sage-Eye Avengers
id=391911
rarity=R
[/card]
[card]
primitive=Sage's Reverie
id=391910
rarity=U
[/card]
[card]
primitive=Sandblast
id=391912
rarity=C
[/card]
[card]
primitive=Sandsteppe Mastodon
id=391913
rarity=R
[/card]
[card]
primitive=Sandsteppe Outcast
id=391914
rarity=C
[/card]
[card]
primitive=Scoured Barrens
id=391915
rarity=C
[/card]
[card]
primitive=Scroll of the Masters
id=391916
rarity=R
[/card]
[card]
primitive=Shaman of the Great Hunt
id=391917
rarity=M
[/card]
[card]
primitive=Shamanic Revelation
id=391918
rarity=R
[/card]
[card]
primitive=Shifting Loyalties
id=391919
rarity=U
[/card]
[card]
primitive=Shockmaw Dragon
id=391920
rarity=U
[/card]
[card]
primitive=Shu Yun, the Silent Tempest
id=391921
rarity=R
[/card]
[card]
primitive=Sibsig Host
id=391922
rarity=C
[/card]
[card]
primitive=Sibsig Muckdraggers
id=391923
rarity=U
[/card]
[card]
primitive=Silumgar, the Drifting Death
id=391924
rarity=R
[/card]
[card]
primitive=Smoldering Efreet
id=391925
rarity=C
[/card]
[card]
primitive=Soul Summons
id=391926
rarity=C
[/card]
[card]
primitive=Soulfire Grand Master
id=391927
rarity=M
[/card]
[card]
primitive=Soulflayer
id=391928
rarity=R
[/card]
[card]
primitive=Sudden Reclamation
id=391929
rarity=U
[/card]
[card]
primitive=Sultai Emissary
id=391930
rarity=C
[/card]
[card]
primitive=Sultai Runemark
id=391931
rarity=C
[/card]
[card]
primitive=Sultai Skullkeeper
id=391932
rarity=C
[/card]
[card]
primitive=Supplant Form
id=391933
rarity=R
[/card]
[card]
primitive=Swamp
id=391934
rarity=C
[/card]
[card]
primitive=Swiftwater Cliffs
id=391936
rarity=C
[/card]
[card]
primitive=Tasigur, the Golden Fang
id=391937
rarity=R
[/card]
[card]
primitive=Tasigur's Cruelty
id=391938
rarity=C
[/card]
[card]
primitive=Temporal Trespass
id=391939
rarity=M
[/card]
[card]
primitive=Temur Battle Rage
id=391940
rarity=C
[/card]
[card]
primitive=Temur Runemark
id=391941
rarity=C
[/card]
[card]
primitive=Temur Sabertooth
id=391942
rarity=U
[/card]
[card]
primitive=Temur War Shaman
id=391943
rarity=R
[/card]
[card]
primitive=Thornwood Falls
id=391944
rarity=C
[/card]
[card]
primitive=Torrent Elemental
id=391945
rarity=M
[/card]
[card]
primitive=Tranquil Cove
id=391946
rarity=C
[/card]
[card]
primitive=Typhoid Rats
id=391947
rarity=C
[/card]
[card]
primitive=Ugin, the Spirit Dragon
id=391948
rarity=M
[/card]
[card]
primitive=Ugin's Construct
id=391949
rarity=U
[/card]
[card]
primitive=Valorous Stance
id=391950
rarity=U
[/card]
[card]
primitive=Vaultbreaker
id=391951
rarity=U
[/card]
[card]
primitive=Wandering Champion
id=391952
rarity=U
[/card]
[card]
primitive=War Flare
id=391953
rarity=C
[/card]
[card]
primitive=Warden of the First Tree
id=391954
rarity=M
[/card]
[card]
primitive=Wardscale Dragon
id=391955
rarity=U
[/card]
[card]
primitive=Whisk Away
id=391956
rarity=C
[/card]
[card]
primitive=Whisperer of the Wilds
id=391957
rarity=C
[/card]
[card]
primitive=Whisperwood Elemental
id=391958
rarity=M
[/card]
[card]
primitive=Wild Slash
id=391959
rarity=U
[/card]
[card]
primitive=Wildcall
id=391960
rarity=R
[/card]
[card]
primitive=Will of the Naga
id=391961
rarity=C
[/card]
[card]
primitive=Winds of Qal Sisma
id=391962
rarity=U
[/card]
[card]
primitive=Wind-Scarred Crag
id=391963
rarity=C
[/card]
[card]
primitive=Write into Being
id=391964
rarity=C
[/card]
[card]
primitive=Yasova Dragonclaw
id=391965
rarity=R
[/card]
[card]
primitive=Forest
id=391835
rarity=C
[/card]
[card]
primitive=Island
id=391860
rarity=C
[/card]
[card]
primitive=Mountain
id=391886
rarity=C
[/card]
[card]
primitive=Plains
id=391894
rarity=C
[/card]
[card]
primitive=Swamp
id=391935
rarity=C
[/card]
-21
View File
@@ -1,21 +0,0 @@
<PACK name="Fate Reforged" type="Booster" pool="all set:FRF;" price="700">
<slot copies="1">
<random_card>rarity:mythic;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
</slot>
<slot copies="3">
<random_card>rarity:uncommon;</random_card>
</slot>
<slot copies="1">
<random_card>rarity:special;</random_card>
</slot>
<slot copies="10">
<random_card>rarity:common;</random_card>
</slot>
</PACK>
-830
View File
@@ -1,830 +0,0 @@
[meta]
author=Wagic Team
year=2014
block=Theros
[/meta]
[card]
primitive=Aegis of the Gods
id=380364
rarity=R
[/card]
[card]
primitive=Aerial Formation
id=380365
rarity=C
[/card]
[card]
primitive=Agent of Erebos
id=380366
rarity=U
[/card]
[card]
primitive=Ajani, Mentor of Heroes
id=380367
rarity=M
[/card]
[card]
primitive=Ajani's Presence
id=380368
rarity=C
[/card]
[card]
primitive=Akroan Line Breaker
id=380369
rarity=U
[/card]
[card]
primitive=Akroan Mastiff
id=380370
rarity=C
[/card]
[card]
primitive=Armament of Nyx
id=380371
rarity=C
[/card]
[card]
primitive=Armory of Iroas
id=380372
rarity=U
[/card]
[card]
primitive=Aspect of Gorgon
id=380373
rarity=C
[/card]
[card]
primitive=Athreos, God of Passage
id=380374
rarity=M
[/card]
[card]
primitive=Banishing Light
id=380375
rarity=U
[/card]
[card]
primitive=Bassara Tower Archer
id=380376
rarity=U
[/card]
[card]
primitive=Battlefield Thaumaturge
id=380377
rarity=R
[/card]
[card]
primitive=Bearer of the Heavens
id=380378
rarity=R
[/card]
[card]
primitive=Bladetusk Boar
id=380379
rarity=C
[/card]
[card]
primitive=Blinding Flare
id=380380
rarity=U
[/card]
[card]
primitive=Bloodcrazed Hoplite
id=380381
rarity=C
[/card]
[card]
primitive=Brain Maggot
id=380382
rarity=U
[/card]
[card]
primitive=Cast into Darkness
id=380383
rarity=C
[/card]
[card]
primitive=Chariot of Victory
id=380384
rarity=U
[/card]
[card]
primitive=Cloaked Siren
id=380385
rarity=C
[/card]
[card]
primitive=Colossal Heroics
id=380386
rarity=U
[/card]
[card]
primitive=Consign to Dust
id=380387
rarity=U
[/card]
[card]
primitive=Countermand
id=380388
rarity=C
[/card]
[card]
primitive=Cruel Feeding
id=380389
rarity=C
[/card]
[card]
primitive=Crystalline Nautilus
id=380390
rarity=U
[/card]
[card]
primitive=Cyclops of Eternal Fury
id=380391
rarity=U
[/card]
[card]
primitive=Dakra Mystic
id=380392
rarity=U
[/card]
[card]
primitive=Daring Thief
id=380393
rarity=R
[/card]
[card]
primitive=Dawnbringer Charioteers
id=380394
rarity=R
[/card]
[card]
primitive=Deicide
id=380395
rarity=R
[/card]
[card]
primitive=Desecration Plague
id=380396
rarity=C
[/card]
[card]
primitive=Deserter's Quarters
id=380397
rarity=U
[/card]
[card]
primitive=Desperate Stand
id=380398
rarity=U
[/card]
[card]
primitive=Dictate of Erebos
id=380399
rarity=R
[/card]
[card]
primitive=Dictate of Heliod
id=380400
rarity=R
[/card]
[card]
primitive=Dictate of Karametra
id=380401
rarity=R
[/card]
[card]
primitive=Dictate of Kruphix
id=380402
rarity=R
[/card]
[card]
primitive=Dictate of the Twin Gods
id=380403
rarity=R
[/card]
[card]
primitive=Disciple of Deceit
id=380404
rarity=U
[/card]
[card]
primitive=Doomwake Giant
id=380405
rarity=R
[/card]
[card]
primitive=Dreadbringer Lampads
id=380406
rarity=C
[/card]
[card]
primitive=Eagle of the Watch
id=380407
rarity=C
[/card]
[card]
primitive=Eidolon of Blossoms
id=380408
rarity=R
[/card]
[card]
primitive=Eidolon of Rhetoric
id=380409
rarity=U
[/card]
[card]
primitive=Eidolon of the Great Revel
id=380410
rarity=R
[/card]
[card]
primitive=Extinguish All Hope
id=380411
rarity=R
[/card]
[card]
primitive=Feast of Dreams
id=380412
rarity=C
[/card]
[card]
primitive=Felhide Petrifier
id=380413
rarity=U
[/card]
[card]
primitive=Flamespeaker's Will
id=380414
rarity=C
[/card]
[card]
primitive=Fleetfeather Cockatrice
id=380415
rarity=U
[/card]
[card]
primitive=Flurry of Horns
id=380416
rarity=C
[/card]
[card]
primitive=Font of Fertility
id=380417
rarity=C
[/card]
[card]
primitive=Font of Fortunes
id=380418
rarity=C
[/card]
[card]
primitive=Font of Ire
id=380419
rarity=C
[/card]
[card]
primitive=Font of Return
id=380420
rarity=C
[/card]
[card]
primitive=Font of Vigor
id=380421
rarity=C
[/card]
[card]
primitive=Forgeborn Oreads
id=380422
rarity=U
[/card]
[card]
primitive=Gluttonous Cyclops
id=380423
rarity=C
[/card]
[card]
primitive=Gnarled Scarhide
id=380424
rarity=U
[/card]
[card]
primitive=Godhunter Octopus
id=380425
rarity=C
[/card]
[card]
primitive=Godsend
id=380426
rarity=M
[/card]
[card]
primitive=Golden Hind
id=380427
rarity=C
[/card]
[card]
primitive=Goldenhide Ox
id=380428
rarity=U
[/card]
[card]
primitive=Gold-Forged Sentinel
id=380429
rarity=U
[/card]
[card]
primitive=Grim Guardian
id=380430
rarity=C
[/card]
[card]
primitive=Hall of Triumph
id=380431
rarity=R
[/card]
[card]
primitive=Harness by Force
id=380432
rarity=R
[/card]
[card]
primitive=Harvestguard Alseids
id=380433
rarity=C
[/card]
[card]
primitive=Heroes' Bane
id=380434
rarity=R
[/card]
[card]
primitive=Hour of Need
id=380435
rarity=U
[/card]
[card]
primitive=Hubris
id=380436
rarity=C
[/card]
[card]
primitive=Humbler of Mortals
id=380437
rarity=C
[/card]
[card]
primitive=Hydra Broodmaster
id=380438
rarity=R
[/card]
[card]
primitive=Hypnotic Siren
id=380439
rarity=R
[/card]
[card]
primitive=Interpret the Signs
id=380440
rarity=U
[/card]
[card]
primitive=Iroas, God of Victory
id=380441
rarity=M
[/card]
[card]
primitive=Keranos, God of Storms
id=380442
rarity=M
[/card]
[card]
primitive=King Macar, the Gold-Cursed
id=380443
rarity=R
[/card]
[card]
primitive=Kiora's Dismissal
id=380444
rarity=U
[/card]
[card]
primitive=Knowledge and Power
id=380445
rarity=U
[/card]
[card]
primitive=Kruphix, God of Horizons
id=380446
rarity=M
[/card]
[card]
primitive=Kruphix's Insight
id=380447
rarity=C
[/card]
[card]
primitive=Lagonna-Band Trailblazer
id=380448
rarity=C
[/card]
[card]
primitive=Launch the Fleet
id=380449
rarity=R
[/card]
[card]
primitive=Leonin Iconoclast
id=380450
rarity=U
[/card]
[card]
primitive=Lightning Diadem
id=380451
rarity=C
[/card]
[card]
primitive=Magma Spray
id=380452
rarity=C
[/card]
[card]
primitive=Mana Confluence
id=380453
rarity=R
[/card]
[card]
primitive=Market Festival
id=380454
rarity=C
[/card]
[card]
primitive=Master of the Feast
id=380455
rarity=R
[/card]
[card]
primitive=Mogis's Warhound
id=380456
rarity=U
[/card]
[card]
primitive=Mortal Obstinacy
id=380457
rarity=C
[/card]
[card]
primitive=Nature's Panoply
id=380458
rarity=C
[/card]
[card]
primitive=Nessian Game Warden
id=380459
rarity=U
[/card]
[card]
primitive=Nightmarish End
id=380460
rarity=U
[/card]
[card]
primitive=Nyx Infusion
id=380461
rarity=C
[/card]
[card]
primitive=Nyx Weaver
id=380462
rarity=U
[/card]
[card]
primitive=Nyx-Fleece Ram
id=380463
rarity=U
[/card]
[card]
primitive=Oakheart Dryads
id=380464
rarity=C
[/card]
[card]
primitive=Oppressive Rays
id=380465
rarity=C
[/card]
[card]
primitive=Oreskos Swiftclaw
id=380466
rarity=C
[/card]
[card]
primitive=Pensive Minotaur
id=380467
rarity=C
[/card]
[card]
primitive=Phalanx Formation
id=380468
rarity=U
[/card]
[card]
primitive=Pharika, God of Affliction
id=380469
rarity=M
[/card]
[card]
primitive=Pharika's Chosen
id=380470
rarity=C
[/card]
[card]
primitive=Pheres-Band Thunderhoof
id=380471
rarity=C
[/card]
[card]
primitive=Pheres-Band Warchief
id=380472
rarity=R
[/card]
[card]
primitive=Pin to the Earth
id=380473
rarity=C
[/card]
[card]
primitive=Polymorphous Rush
id=380474
rarity=R
[/card]
[card]
primitive=Prophetic Flamespeaker
id=380475
rarity=M
[/card]
[card]
primitive=Pull from the Deep
id=380476
rarity=U
[/card]
[card]
primitive=Quarry Colossus
id=380477
rarity=U
[/card]
[card]
primitive=Ravenous Leucrocota
id=380478
rarity=C
[/card]
[card]
primitive=Renowned Weaver
id=380479
rarity=C
[/card]
[card]
primitive=Reprisal
id=380480
rarity=U
[/card]
[card]
primitive=Returned Reveler
id=380481
rarity=C
[/card]
[card]
primitive=Revel of the Fallen God
id=380482
rarity=R
[/card]
[card]
primitive=Reviving Melody
id=380483
rarity=U
[/card]
[card]
primitive=Riddle of Lightning
id=380484
rarity=U
[/card]
[card]
primitive=Riptide Chimera
id=380485
rarity=U
[/card]
[card]
primitive=Rise of Eagles
id=380486
rarity=C
[/card]
[card]
primitive=Ritual of the Returned
id=380487
rarity=U
[/card]
[card]
primitive=Rollick of Abandon
id=380488
rarity=U
[/card]
[card]
primitive=Rotted Hulk
id=380489
rarity=C
[/card]
[card]
primitive=Rouse the Mob
id=380490
rarity=C
[/card]
[card]
primitive=Sage of Hours
id=380491
rarity=M
[/card]
[card]
primitive=Satyr Grovedancer
id=380492
rarity=C
[/card]
[card]
primitive=Satyr Hoplite
id=380493
rarity=C
[/card]
[card]
primitive=Scourge of Fleets
id=380494
rarity=R
[/card]
[card]
primitive=Setessan Tactics
id=380495
rarity=R
[/card]
[card]
primitive=Sightless Brawler
id=380496
rarity=U
[/card]
[card]
primitive=Sigiled Skink
id=380497
rarity=C
[/card]
[card]
primitive=Sigiled Starfish
id=380498
rarity=C
[/card]
[card]
primitive=Silence the Believers
id=380499
rarity=R
[/card]
[card]
primitive=Skybind
id=380500
rarity=R
[/card]
[card]
primitive=Skyspear Cavalry
id=380501
rarity=U
[/card]
[card]
primitive=Solidarity of Heroes
id=380502
rarity=U
[/card]
[card]
primitive=Spawn of Thraxes
id=380503
rarity=R
[/card]
[card]
primitive=Spirespine
id=380504
rarity=U
[/card]
[card]
primitive=Spite of Mogis
id=380505
rarity=U
[/card]
[card]
primitive=Spiteful Blow
id=380506
rarity=U
[/card]
[card]
primitive=Squelching Leeches
id=380507
rarity=U
[/card]
[card]
primitive=Starfall
id=380508
rarity=C
[/card]
[card]
primitive=Stonewise Fortifier
id=380509
rarity=C
[/card]
[card]
primitive=Stormchaser Chimera
id=380510
rarity=U
[/card]
[card]
primitive=Strength from the Fallen
id=380511
rarity=U
[/card]
[card]
primitive=Supply-Line Cranes
id=380512
rarity=C
[/card]
[card]
primitive=Swarmborn Giant
id=380513
rarity=U
[/card]
[card]
primitive=Temple of Epiphany
id=380514
rarity=R
[/card]
[card]
primitive=Temple of Malady
id=380515
rarity=R
[/card]
[card]
primitive=Tethmos High Priest
id=380516
rarity=U
[/card]
[card]
primitive=Thassa's Devourer
id=380517
rarity=C
[/card]
[card]
primitive=Thassa's Ire
id=380518
rarity=U
[/card]
[card]
primitive=Thoughtrender Lamia
id=380519
rarity=U
[/card]
[card]
primitive=Tormented Thoughts
id=380520
rarity=U
[/card]
[card]
primitive=Triton Cavalry
id=380521
rarity=U
[/card]
[card]
primitive=Triton Shorestalker
id=380522
rarity=C
[/card]
[card]
primitive=Twinflame
id=380523
rarity=R
[/card]
[card]
primitive=Underworld Coinsmith
id=380524
rarity=U
[/card]
[card]
primitive=War-Wing Siren
id=380525
rarity=C
[/card]
[card]
primitive=Whitewater Naiads
id=380526
rarity=U
[/card]
[card]
primitive=Wildfire Cerberus
id=380527
rarity=U
[/card]
[card]
primitive=Worst Fears
id=380528
rarity=M
[/card]
-21
View File
@@ -1,21 +0,0 @@
<PACK name="Journey Into Nyx" type="Booster" pool="all set:JOU;" price="700">
<slot copies="1">
<random_card>rarity:mythic;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
</slot>
<slot copies="3">
<random_card>rarity:uncommon;</random_card>
</slot>
<slot copies="1">
<random_card>rarity:special;</random_card>
</slot>
<slot copies="10">
<random_card>rarity:common;</random_card>
</slot>
</PACK>
File diff suppressed because it is too large Load Diff
-21
View File
@@ -1,21 +0,0 @@
<PACK name="Khans of Tarkir" type="Booster" pool="all set:KTK;" price="700">
<slot copies="1">
<random_card>rarity:mythic;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
<random_card>rarity:rare;</random_card>
</slot>
<slot copies="3">
<random_card>rarity:uncommon;</random_card>
</slot>
<slot copies="1">
<random_card>rarity:special;</random_card>
</slot>
<slot copies="10">
<random_card>rarity:common;</random_card>
</slot>
</PACK>
+5
View File
@@ -1513,3 +1513,8 @@ primitive=Zephyr Net
id=142357
rarity=C
[/card]
[card]
primitive=Avatar Token
id=-140233
rarity=T
[/card]
+21 -27
View File
@@ -11,7 +11,7 @@ rarity=C
[card]
primitive=Accorder's Shield
id=370581
rarity=U
rarity=C
[/card]
[card]
primitive=Accursed Spirit
@@ -31,7 +31,7 @@ rarity=C
[card]
primitive=Air Servant
id=370688
rarity=U
rarity=C
[/card]
[card]
primitive=Ajani, Caller of the Pride
@@ -121,7 +121,7 @@ rarity=C
[card]
primitive=Blur Sliver
id=370593
rarity=C
rarity=U
[/card]
[card]
primitive=Bogbrew Witch
@@ -156,7 +156,7 @@ rarity=C
[card]
primitive=Bubbling Cauldron
id=370661
rarity=U
rarity=R
[/card]
[card]
primitive=Burning Earth
@@ -261,7 +261,7 @@ rarity=R
[card]
primitive=Darksteel Forge
id=370734
rarity=M
rarity=R
[/card]
[card]
primitive=Darksteel Ingot
@@ -326,7 +326,7 @@ rarity=R
[card]
primitive=Doom Blade
id=370609
rarity=U
rarity=C
[/card]
[card]
primitive=Door of Destinies
@@ -339,11 +339,6 @@ id=370660
rarity=U
[/card]
[card]
primitive=Dragon Egg Dragon
id=-370660
rarity=T
[/card]
[card]
primitive=Dragon Hatchling
id=370717
rarity=C
@@ -436,7 +431,7 @@ rarity=C
[card]
primitive=Fortify
id=370712
rarity=C
rarity=U
[/card]
[card]
primitive=Frost Breath
@@ -586,7 +581,7 @@ rarity=R
[card]
primitive=Kalonian Hydra
id=370766
rarity=M
rarity=R
[/card]
[card]
primitive=Kalonian Tusker
@@ -596,7 +591,7 @@ rarity=U
[card]
primitive=Lava Axe
id=370595
rarity=C
rarity=
[/card]
[card]
primitive=Lay of the Land
@@ -624,8 +619,8 @@ id=370740
rarity=R
[/card]
[card]
primitive=Liliana's Reaver Zombie
id=-370740
primitive=Zombie Token
id=-339967
rarity=T
[/card]
[card]
@@ -741,7 +736,7 @@ rarity=R
[card]
primitive=Nightwing Shade
id=370705
rarity=C
rarity=U
[/card]
[card]
primitive=Oath of the Ancient Wood
@@ -836,7 +831,7 @@ rarity=R
[card]
primitive=Quag Sickness
id=370714
rarity=C
rarity=U
[/card]
[card]
primitive=Quicken
@@ -851,7 +846,7 @@ rarity=C
[card]
primitive=Ratchet Bomb
id=370623
rarity=R
rarity=C
[/card]
[card]
primitive=Regathan Firecat
@@ -901,7 +896,7 @@ rarity=R
[card]
primitive=Scourge of Valkas
id=370584
rarity=M
rarity=R
[/card]
[card]
primitive=Scroll Thief
@@ -956,7 +951,7 @@ rarity=M
[card]
primitive=Shimmering Grotto
id=370631
rarity=U
rarity=C
[/card]
[card]
primitive=Shivan Dragon
@@ -1036,7 +1031,6 @@ rarity=U
[card]
primitive=Staff of the Mind Magus
id=370676
rarity=U
[/card]
[card]
primitive=Staff of the Wild Magus
@@ -1111,7 +1105,7 @@ rarity=R
[card]
primitive=Thunder Strike
id=370607
rarity=C
rarity=U
[/card]
[card]
primitive=Tidebinder Mage
@@ -1121,7 +1115,7 @@ rarity=R
[card]
primitive=Time Ebb
id=370641
rarity=C
rarity=R
[/card]
[card]
primitive=Tome Scour
@@ -1221,7 +1215,7 @@ rarity=R
[card]
primitive=Windreader Sphinx
id=370810
rarity=M
rarity=U
[/card]
[card]
primitive=Windstorm
@@ -1249,8 +1243,8 @@ id=370619
rarity=R
[/card]
[card]
primitive=Xathrid Necromancer Zombie
id=-370619
primitive=Zombie Token
id=-339968
rarity=T
[/card]
[card]
@@ -86,6 +86,17 @@ mana={5}{U}
type=Sorcery
[/card]
[card]
name=Gravecrawler
abilities=cantblock
autograveyard=aslongas(zombie|myBattlefield) {B}:name(cast from graveyard) activate name(cast from graveyard) castcard(normal) assorcery
text=Gravecrawler can't block. -- You may cast Gravecrawler from your graveyard as long as you control a Zombie.
mana={B}
type=Creature
subtype=Zombie
power=2
toughness=1
[/card]
[card]
name=Ivy Seer
auto={2}{G}{T}:foreach(*[green]|myhand) 1/1 target(creature)
text={2}{G}, {T}: Reveal any number of green cards in your hand. Target creature gets +X/+X until end of turn, where X is the number of cards revealed this way.
File diff suppressed because it is too large Load Diff
@@ -4149,6 +4149,15 @@ mana={U}{U}
type=Sorcery
[/card]
[card]
name=Draining Whelk
text=Flash (You may cast this spell any time you could cast an instant.) -- Flying -- When Draining Whelk enters the battlefield, counter target spell. Put X +1/+1 counters on Draining Whelk, where X is that spell's converted mana cost.
mana={4}{U}{U}
type=Creature
subtype=Illusion
power=1
toughness=1
[/card]
[card]
name=Drake Umbra
mana={4}{U}
type=Enchantment
@@ -7036,6 +7045,16 @@ mana={2}{G}
type=Enchantment
[/card]
[card]
name=Heartlash Cinder
abilities=haste
text=Haste -- Chroma - When Heartlash Cinder enters the battlefield, it gets +X/+0 until end of turn, where X is the number of red mana symbols in the mana costs of permanents you control.
mana={1}{R}
type=Creature
subtype=Elemental Warrior
power=1
toughness=1
[/card]
[card]
name=Heartstone
text=Activated abilities of creatures cost {1} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana.
mana={3}
@@ -7667,6 +7686,12 @@ type=Instant
text=As an additional cost to cast Induce Despair, reveal a creature card from your hand. Target creature gets -X/-X until end of turn, where X is the revealed card's converted mana cost.
[/card]
[card]
name=Induce Paranoia
text=Counter target spell. If {B} was spent to cast Induce Paranoia, that spell's controller puts the top X cards of his or her library into his or her graveyard, where X is the spell's converted mana cost.
mana={2}{U}{U}
type=Instant
[/card]
[card]
name=Inescapable Brute
text=Wither (This deals damage to creatures in the form of -1/-1 counters.) -- Inescapable Brute must be blocked if able.
mana={5}{R}
@@ -11465,6 +11490,15 @@ mana={X}{R}
type=Instant
[/card]
[card]
name=Outrage Shaman
text=Chroma - When Outrage Shaman enters the battlefield, it deals damage to target creature equal to the number of red mana symbols in the mana costs of permanents you control.
mana={3}{R}{R}
type=Creature
subtype=Goblin Shaman
power=2
toughness=2
[/card]
[card]
name=Outrider en-Kor
text=Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.) -- {0}: The next 1 damage that would be dealt to Outrider en-Kor this turn is dealt to target creature you control instead.
mana={2}{W}
@@ -12316,6 +12350,15 @@ power=2
toughness=2
[/card]
[card]
name=Primalcrux
text=Trample -- Chroma - Primalcrux's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control.
mana={G}{G}{G}{G}{G}{G}
type=Creature
subtype=Elemental
power=*
toughness=*
[/card]
[card]
name=Primitive Etchings
text=Reveal the first card you draw each turn. Whenever you reveal a creature card this way, draw a card.
mana={2}{G}{G}
@@ -12862,6 +12905,13 @@ mana={R}{R}
type=Enchantment
[/card]
[card]
name=Ral Zarek
text=+1: Tap target permanent, then untap another target permanent. -- -2: Ral Zarek deals 3 damage to target creature or player. -- -7: Flip five coins. Take an extra turn after this one for each coin that comes up heads.
mana={2}{U}{R}
type=Planeswalker
subtype=Ral
[/card]
[card]
name=Raiding Party
text=Raiding Party can't be the target of white spells or abilities from white sources. -- Sacrifice an Orc: Each player may tap any number of untapped white creatures he or she controls. For each creature tapped this way, that player chooses up to two Plains. Then destroy all Plains that weren't chosen this way by any player.
mana={2}{R}
@@ -14491,6 +14541,12 @@ mana={W}
type=Enchantment
[/card]
[card]
name=Serum Powder
text={T}: Add {1} to your mana pool. -- Any time you could mulligan and Serum Powder is in your hand, you may exile all the cards from your hand, then draw that many cards. (You can do this in addition to taking mulligans.)
mana={3}
type=Artifact
[/card]
[card]
name=Serum Visions
text=Draw a card. -- Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)
mana={U}
@@ -15774,6 +15830,15 @@ text={T}: Add {1} to your mana pool. -- {4}, {T}: Put a 0/1 white Goat creature
type=Land
[/card]
[card]
name=Springjack Shepherd
text=Chroma - When Springjack Shepherd enters the battlefield, put a 0/1 white Goat creature token onto the battlefield for each white mana symbol in the mana costs of permanents you control.
mana={3}{W}
type=Creature
subtype=Kithkin Wizard
power=1
toughness=2
[/card]
[card]
name=Sprout Swarm
text=Convoke (Each creature you tap while casting this spell reduces its total cost by {1} or by one mana of that creature's color.) -- Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.) -- Put a 1/1 green Saproling creature token onto the battlefield.
mana={1}{G}
@@ -17566,6 +17631,15 @@ toughness=2
text=Auras attached to permanents you control have totem armor. (If an enchanted permanent you control would be destroyed, instead remove all damage from it and destroy an Aura attached to it.)
[/card]
[card]
name=Umbra Stalker
text=Chroma - Umbra Stalker's power and toughness are each equal to the number of black mana symbols in the mana costs of cards in your graveyard.
mana={4}{B}{B}{B}
type=Creature
subtype=Elemental
power=*
toughness=*
[/card]
[card]
name=Unblinking Bleb
text=Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -- Whenever Unblinking Bleb or another permanent is turned face up, you may scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)
mana={3}{U}
+1 -9
View File
@@ -204,7 +204,6 @@ brass_man.txt
brass_man_i161.txt
briarhorn.txt
bringer_of_the_red_dawn.txt
buyback.txt
cage_of_hands.txt
Call_to_Heel_1.txt
Call_to_Heel_2.txt
@@ -309,9 +308,6 @@ evil_presence3.txt
evil_presence_i647.txt
evil_presence_i647_2.txt
exaltedsourcekilled.txt
executioners_swing.txt
executioners_swing2.txt
executioners_swing3.txt
explore.txt
Faceless_Butcher.txt
fading.txt
@@ -345,7 +341,6 @@ foratog.txt
force_of_nature.txt
force_of_nature2.txt
force_of_nature3.txt
formidable.txt
fountain_of_youth.txt
Frogmite.txt
fungus_sliver.txt
@@ -662,8 +657,6 @@ tidal_warrior_i649.txt
tidal_warrior_i652.txt
Timely_Reinforcements.txt
titanic_ultimatum.txt
tokenizer.txt
tokenizer2.txt
torture.txt
tranquil_domain.txt
turn_to_slag.txt
@@ -717,5 +710,4 @@ momir/overcost.txt
#AI Tests
########################
ai/goblin_artillery.txt
#I dont understand why this test works, and it breaks the redo, so I deactivate it.
#ai/proliferate_simple.txt
ai/proliferate_simple.txt
-30
View File
@@ -1,30 +0,0 @@
# Cast card once with buyback and second time without.
# The card must be in the graveyard, not in the hand
[INIT]
FIRSTMAIN
[PLAYER1]
hand:Capsize
manapool:{5}{U}{U}{U}{U}
[PLAYER2]
inplay:Swamp,Island
[DO]
Capsize
# pay buyback
choice 1
Swamp
Capsize
Island
[ASSERT]
FIRSTMAIN
[PLAYER1]
graveyard:Capsize
[PLAYER2]
hand:Swamp,Island
[END]
@@ -1,42 +0,0 @@
#NAME: Executioner's Swing
#DESC: Checks targetability
#DESC: Test that can target creature that damaged creature this turn
[INIT]
combatattackers
[PLAYER1]
inplay:Grizzly Bears
[PLAYER2]
inplay:Flying Men,Swamp,Plains
hand:Executioner's Swing
[DO]
Grizzly Bears
next
Flying Men
next
next
next
# second main
# kill bear
yes
Swamp
Plains
Executioner's Swing
Grizzly Bears
endinterruption
[ASSERT]
secondmain
[PLAYER1]
graveyard:Grizzly Bears
[PLAYER2]
graveyard:Executioner's Swing,Flying Men
inplay:Plains,Swamp
[END]
@@ -1,42 +0,0 @@
#NAME: Executioner's Swing
#DESC: Checks targetability
#DESC: Test that can target creature that damaged player
[INIT]
combatattackers
[PLAYER1]
inplay:Grizzly Bears
[PLAYER2]
inplay:Swamp,Plains
hand:Executioner's Swing
[DO]
Grizzly Bears
next
next
next
next
# second main
# kill bear
yes
Swamp
Plains
Executioner's Swing
Grizzly Bears
endinterruption
[ASSERT]
secondmain
[PLAYER1]
graveyard:Grizzly Bears
[PLAYER2]
graveyard:Executioner's Swing
inplay:Plains,Swamp
life:18
[END]
@@ -1,34 +0,0 @@
#NAME: Executioner's Swing
#DESC: Checks targetability
#DESC: Prove that can't target passive creature
[INIT]
secondmain
[PLAYER1]
inplay:Grizzly Bears
[PLAYER2]
manapool:{B}{W}
hand:Executioner's Swing
[DO]
# attempt to kill bear
yes
Swamp
Plains
Executioner's Swing
Grizzly Bears
endinterruption
[ASSERT]
secondmain
[PLAYER1]
inplay:Grizzly Bears
[PLAYER2]
hand:Executioner's Swing
manapool:{W}{B}
[END]
-33
View File
@@ -1,33 +0,0 @@
#Testing Atarka Beastbreaker,Stampeding Elk Herd -- Formidable
#Atarka Beastbreaker will become 6/6, and then attacks along with Stampeding Elk Herd, trample effect will trigger
#then p2 will block with Steel Wall, p2 must have 13 life...
[INIT]
COMBATATTACKERS
[PLAYER1]
inplay:Atarka Beastbreaker,Krosan Tusker,Stampeding Elk Herd
manapool:{4}{G}
[PLAYER2]
inplay:Steel Wall
life:20
[DO]
Atarka Beastbreaker
choice 1
Atarka Beastbreaker
Stampeding Elk Herd
next
Steel Wall
#blockers
next
#combatdamage 2
next
next
#endofcombat 2
[ASSERT]
COMBATEND
[PLAYER1]
inplay:Atarka Beastbreaker,Krosan Tusker,Stampeding Elk Herd
manapool:{0}
[PLAYER2]
graveyard:Steel Wall
life:13
[END]
-24
View File
@@ -1,24 +0,0 @@
#Testing Griselbrand with the new specific life cost {L:7}
#Player has 8 life and you cannot use the ability the second time if you cannot pay life.
#Must change griselbrand code to {L:7}:draw:7 instead of {L}{L}{L}{L}{L}{L}{L}:draw:7
[INIT]
FIRSTMAIN
[PLAYER1]
inplay:Griselbrand
life:8
library:forest,forest,forest,forest,forest,forest,forest,plains,mountain,mountain,mountain,mountain,mountain,mountain,island
[PLAYER2]
life:20
[DO]
Griselbrand
Griselbrand
[ASSERT]
FIRSTMAIN
[PLAYER1]
inplay:Griselbrand
life:1
hand:mountain,mountain,mountain,mountain,mountain,mountain,island
library:forest,forest,forest,forest,forest,forest,forest,plains
[PLAYER2]
life:20
[END]
@@ -1,38 +0,0 @@
#Testing guild keyword gruul for Xenagos, God of Revels. You must have Born of the gods set (BNG)
#[card]
#name=Xenagos, God of Revels
#abilities=indestructible
#auto=@each my combatbegins:name(haste and +x/+x) target(other creature|mybattlefield) transforms((,newability[haste],newability[power/power])) ueot
#auto=this(variable{gruul}>6) transforms((Creature))
#text=Indestructible -- As long as your devotion to red and green is less than seven, Xenagos isn't a creature. -- At the beginning of combat on your turn, another target creature you control gains haste and gets +X/+X until end of turn, where X is that creature's power.
#mana={3}{R}{G}
#type=Legendary Enchantment
#subtype=God
#power=6
#toughness=5
#[/card]
[INIT]
FIRSTMAIN
[PLAYER1]
inplay:378528
hand:19869
life:20
manapool:{G}{G}{G}{G}{G}
[PLAYER2]
life:20
[DO]
19869
next
choice 0
19869
next
19869
eot
[ASSERT]
UNTAP
[PLAYER1]
inplay:378528,19869
life:20
[PLAYER2]
life:12
[END]
-29
View File
@@ -1,29 +0,0 @@
# Testing Tokenizer - Parallel Lives (ISD) 249662
# Dragon Fodder (ALA) 174936
# text=Put two 1/1 red Goblin creature tokens into play.
# Tokens must be 2.. since there are no tokenizer.
[INIT]
FIRSTMAIN
[PLAYER1]
hand:174936
manapool:{R}{1}
inplay:249662
[PLAYER2]
hand:Demystify
manapool:{W}
[DO]
174936
no
yes
Demystify
249662
endinterruption
[ASSERT]
FIRSTMAIN
[PLAYER1]
graveyard:249662,174936
inplay:-174936,-174936
[PLAYER2]
graveyard:Demystify
life:20
[END]
-27
View File
@@ -1,27 +0,0 @@
# Testing Tokenizer - Parallel Lives (ISD) 249662
# Dragon Fodder (ALA) 174936
# text=Put two 1/1 red Goblin creature tokens into play.
# Tokens must be 8.. since there are two tokenizer... original value
# is 2 with first tokenizer it will become 4, with the second tokenizer
# the value will be 8...
[INIT]
FIRSTMAIN
[PLAYER1]
hand:174936
manapool:{R}{1}
inplay:249662,249662
[PLAYER2]
inplay:plains
hand:Demystify
[DO]
174936
[ASSERT]
FIRSTMAIN
[PLAYER1]
graveyard:174936
inplay:249662,249662,-174936,-174936,-174936,-174936,-174936,-174936,-174936,-174936
[PLAYER2]
hand:Demystify
inplay:plains
life:20
[END]
-73
View File
@@ -1,73 +0,0 @@
import sys
import os
import zipfile
from pyjavaproperties import Properties
from optparse import OptionParser
def createWindowsZipFile(filename):
utilities = ZipUtilities()
zip_file = zipfile.ZipFile(filename, 'w', zipfile.ZIP_STORED)
zip_file.write('../../../LICENSE')
zip_file.write('libpng13.dll')
zip_file.write('SDL.dll')
zip_file.write('fmod.dll')
zip_file.write('zlib1.dll')
zip_file.write('Wagic.exe')
zip_file.write('Res/' + getFilename('core') + '.zip')
zip_file.close()
def getFilename(filename):
p = Properties();
p.load(open('../build.number.properties'));
minor = p['build.minor'];
major = p['build.major'];
point = p['build.point'];
filename = filename + '-' + major + minor + point
return filename
def createStandardResFile():
print "Creating Resource File"
cmd = 'python createResourceZip.py -n ' + getFilename('core') + '.zip'
os.chdir("Res")
os.system(cmd)
os.chdir("..")
print "Creating Windows Package File"
filename = 'Wagic-windows.zip'
createWindowsZipFile( filename )
print >> sys.stderr, 'Created Windows Package: {0}'.format( filename)
class ZipUtilities:
def toZip(self, file, filename):
zip_file = zipfile.ZipFile(filename, 'w')
if os.path.isfile(file):
zip_file.write(file)
else:
self.addFolderToZip(zip_file, file)
zip_file.close()
def addFolderToZip(self, zip_file, folder):
zip_file.writestr(folder + '/', '')
for file in os.listdir(folder):
if file != '.svn':
full_path = os.path.join(folder, file)
if os.path.isfile(full_path):
print 'File added: ' + str(full_path)
zip_file.write(full_path)
elif os.path.isdir(full_path):
print 'Entering folder: ' + str(full_path)
self.addFolderToZip(zip_file, full_path)
def main():
## using optparse instead of argParse for now since python 2.7 may not be installed.
parser = OptionParser()
parser.add_option("-p", "--platform", help="PLATFORM: specify custom build. (eg ios, android, etc)", metavar="PLATFORM", dest="platform")
(options, args) = parser.parse_args()
createStandardResFile()
if __name__ == "__main__":
main()
+2 -4
View File
@@ -3,7 +3,7 @@
<property file="build.properties" />
<property file="build.number.properties" />
<property environment="env"/>
<path id="groovy.class.path" >
<fileset dir="${groovy.dir}" />
</path>
@@ -90,9 +90,7 @@ Author: Michael Nguyen
#define WAGIC_RESOURCE_VERSION VERSION_FILE(WAGIC_VERSION_MAJOR, WAGIC_VERSION_MEDIUM, WAGIC_VERSION_MINOR)
#define WAGIC_VERSION_STRING VERSION_STRINGIFY(WAGIC_VERSION)
#define WAGIC_CORE_VERSION_STRING "core_" VERSION_STRINGIFY(WAGIC_RESOURCE_VERSION)
#define WAGIC_RESOURCE_NAME "Wagic-core.zip"
#define WAGIC_RELEASE_NAME "${env.RELEASE_NAME}"
#define WAGIC_RESOURCE_URL "https://github.com/WagicProject/wagic/releases/download/" WAGIC_RELEASE_NAME "/" WAGIC_RESOURCE_NAME
#define WAGIC_RESOURCE_NAME WAGIC_CORE_VERSION_STRING ".zip"
#endif
-4
View File
@@ -12,8 +12,6 @@ using std::vector;
class ManaCost;
class MTGAbility;
namespace AI {
class AIHint
{
public:
@@ -68,6 +66,4 @@ public:
~AIHints();
};
};
#endif
-4
View File
@@ -3,8 +3,6 @@
#include "AIPlayerBaka.h"
namespace AI {
class AIMomirPlayer: public AIPlayerBaka
{
public:
@@ -16,6 +14,4 @@ public:
MTGAbility * getMomirAbility();
};
};
#endif
+4 -44
View File
@@ -18,44 +18,20 @@
#include "Player.h"
#include "config.h"
#include <vector>
#include <queue>
using std::queue;
using std::vector;
namespace AI {
class AIStats;
class AIPlayer;
class Action
{
protected:
GameObserver* m_pObserver;
bool parseLine(const string& s);
public:
Action(GameObserver* g, const string& s) : m_pObserver(g)
{
parseLine(s);
};
friend ostream& operator<<(ostream&, const Action&);
friend istream& operator>>(istream&, Action&);
};
class AIAction
{
protected:
int clickMultiAct(vector<Targetable*>&actionTargets);
public:
AIPlayer * owner;
MTGAbility * ability;
NestedAbility * nability;
Player * player;
// int id;
int id;
MTGCardInstance * click;
MTGCardInstance * target; // TODO Improve
vector<Targetable*>mAbilityTargets;
@@ -84,10 +60,7 @@ public:
{
};
int Act();
ostream& logSimpleAct(ostream& out, MTGCardInstance* click) const;
ostream& logMultiAct(ostream& out, const vector<Targetable *> &actionTargets) const;
friend ostream& operator<<(ostream& out, const AIAction& a);
int clickMultiAct(vector<Targetable*>&actionTargets);
};
@@ -104,20 +77,8 @@ protected:
int clickMultiTarget(TargetChooser * tc,vector<Targetable*>&potentialTargets);
int clickSingleTarget(TargetChooser * tc,vector<Targetable*>&potentialTargets, MTGCardInstance * Choosencard = NULL);
RandomGenerator randomGenerator;
virtual bool canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy);
virtual bool canPlay(MTGCardInstance * card);
virtual int getCreaturesInfo(Player * player, int neededInfo = INFO_NBCREATURES , int untapMode = 0, int canAttack = 0);
virtual int createAbilityPotentialsActions(MTGAbility * a, MTGCardInstance * c, vector<AIAction>& actions);
public:
enum {
INFO_NBCREATURES,
INFO_CREATURESPOWER,
INFO_CREATURESRANK,
INFO_CREATURESTOUGHNESS,
INFO_CREATURESATTACKINGPOWER
};
//These variables are used by TestSuite and Rules.cpp... TODO change that?
int agressivity;
@@ -128,7 +89,7 @@ public:
virtual int receiveEvent(WEvent * event);
virtual void Render();
AIPlayer(GameObserver *observer, string deckFile, string deckFileSmall, string avatarFile, MTGDeck * deck = NULL);
AIPlayer(GameObserver *observer, string deckFile, string deckFileSmall, MTGDeck * deck = NULL);
virtual ~AIPlayer();
virtual int chooseTarget(TargetChooser * tc = NULL, Player * forceTarget = NULL, MTGCardInstance * Chosencard = NULL, bool checkonly = false) = 0;
@@ -155,6 +116,5 @@ class AIPlayerFactory{
#endif
};
}
#endif
+11 -5
View File
@@ -4,8 +4,6 @@
#include "AIPlayer.h"
#include "AllAbilities.h"
namespace AI {
class AIStats;
class AIHints;
class AIHint;
@@ -59,7 +57,7 @@ public:
OrderedAIAction* a2Ptr = const_cast<OrderedAIAction*>(&a2);
int e1 = a1Ptr->getEfficiency();
int e2 = a2Ptr->getEfficiency();
// if (e1 == e2) return a1Ptr->id < a2Ptr->id;
if (e1 == e2) return a1Ptr->id < a2Ptr->id;
return (e1 > e2);
}
};
@@ -74,7 +72,7 @@ class AIPlayerBaka: public AIPlayer{
virtual int interruptIfICan();
virtual int chooseAttackers();
virtual int chooseBlockers();
virtual bool canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy);
virtual int canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy);
virtual int effectBadOrGood(MTGCardInstance * card, int mode = MODE_PUTINTOPLAY, TargetChooser * tc = NULL);
@@ -107,10 +105,19 @@ class AIPlayerBaka: public AIPlayer{
virtual int getEfficiency(OrderedAIAction * action);
virtual int getEfficiency(MTGAbility * ability);
virtual bool payTheManaCost(ManaCost * cost, MTGCardInstance * card = NULL,vector<MTGAbility*> gotPayment = vector<MTGAbility*>());
virtual int getCreaturesInfo(Player * player, int neededInfo = INFO_NBCREATURES , int untapMode = 0, int canAttack = 0);
virtual ManaCost * getPotentialMana(MTGCardInstance * card = NULL);
virtual int selectAbility();
public:
enum {
INFO_NBCREATURES,
INFO_CREATURESPOWER,
INFO_CREATURESRANK,
INFO_CREATURESTOUGHNESS,
INFO_CREATURESATTACKINGPOWER
};
vector<MTGAbility*>gotPayments;
AIPlayerBaka(GameObserver *observer, string deckFile, string deckfileSmall, string avatarFile, MTGDeck * deck = NULL);
@@ -130,5 +137,4 @@ class AIPlayerBaka: public AIPlayer{
virtual int createAbilityTargets(MTGAbility * a, MTGCardInstance * c, RankingContainer& ranking);
};
}
#endif
+1 -5
View File
@@ -11,8 +11,6 @@ class AIStats;
class AIHints;
namespace AI {
class AIPlayerBakaB: public AIPlayerBaka{
protected:
int orderBlockers();
@@ -20,7 +18,7 @@ protected:
int interruptIfICan();
int chooseAttackers();
int chooseBlockers();
bool canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy);
int canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy);
int effectBadOrGood(MTGCardInstance * card, int mode = MODE_PUTINTOPLAY, TargetChooser * tc = NULL);
@@ -63,8 +61,6 @@ protected:
int createAbilityTargets(MTGAbility * a, MTGCardInstance * c, RankingContainer& ranking);
};
};
#endif
#endif
-34
View File
@@ -1,34 +0,0 @@
/*
* Wagic, The Homebrew ?! is licensed under the BSD license
* See LICENSE in the Folder's root
* http://wololo.net/wagic/
AIPlayerMinMax is the MinMax implementation of the AIPlayer interface
*/
#ifndef _IAPLAYER_MINMAX_H
#define _IAPLAYER_MINMAX_H
#include "AIPlayer.h"
#include "config.h"
namespace AI {
class AIPlayerMinMax: public AIPlayer{
protected:
void LookAround();
public:
AIPlayerMinMax(GameObserver *observer, string deckFile, string deckFileSmall, string avatarFile, MTGDeck * deck = NULL);
virtual ~AIPlayerMinMax();
virtual int chooseTarget(TargetChooser * tc = NULL, Player * forceTarget = NULL, MTGCardInstance * Chosencard = NULL, bool checkonly = false) = 0;
virtual int affectCombatDamages(CombatStep) = 0;
virtual int Act(float dt) = 0;
};
};
#endif
-4
View File
@@ -18,8 +18,6 @@ class MTGCard;
class Damage;
class WEvent;
namespace AI {
class AIStat
{
public:
@@ -51,6 +49,4 @@ public:
void Render();
};
};
#endif
+4 -5
View File
@@ -72,7 +72,7 @@ public:
}
Interruptible(GameObserver* observer, int inID = 0, bool hasFocus = false)
: PlayGuiObject(40, 0.0f, 0.0f, inID, hasFocus), Targetable(observer), state(NOT_RESOLVED), display(0), source(NULL)
: PlayGuiObject(40, x, y, inID, hasFocus), Targetable(observer), state(NOT_RESOLVED), display(0), source(NULL)
{
}
@@ -204,6 +204,7 @@ protected:
JQuadPtr pspIcons[8];
InterruptDecision interruptDecision[2];
float timer;
int currentState;
ActionStackMode mode;
int checked;
ATutorialMessage* currentTutorial;
@@ -223,7 +224,7 @@ public:
int getNextIndex(Interruptible * previous, int type = 0, int state = 0 , int display = -1);
void Fizzle(Interruptible * action, FizzleMode fizzleMode = PUT_IN_GRAVEARD);
Interruptible * getAt(int id);
void cancelInterruptOffer(Player* p = 0, InterruptDecision cancelMode = DONT_INTERRUPT, bool log = true);
void cancelInterruptOffer(InterruptDecision cancelMode = DONT_INTERRUPT, bool log = true);
void endOfInterruption(bool log = true);
Interruptible * getLatest(int state);
Player * askIfWishesToInterrupt;
@@ -250,9 +251,7 @@ public:
#endif
void setCurrentTutorial(ATutorialMessage* message) {currentTutorial = message;};
ATutorialMessage* getCurrentTutorial() {return currentTutorial;};
bool isNotUndecided() {
return (interruptDecision[0] == NOT_DECIDED && interruptDecision[1] == NOT_DECIDED);
};
bool isCalm() {return interruptDecision[0] == NOT_DECIDED && interruptDecision[1] == NOT_DECIDED;};
};
#endif
+1 -240
View File
@@ -172,206 +172,6 @@ private:
{
intValue = target->getManaCost()->getConvertedCost();
}
else if (s == "azorius")//devotion blue white
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 2);
intValue += zone->countDevotion(dtc, 5);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "boros")//devotion red white
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 3);
intValue += zone->countDevotion(dtc, 5);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "dimir")//devotion blue black
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 2);
intValue += zone->countDevotion(dtc, 4);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "golgari")//devotion to green black
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 1);
intValue += zone->countDevotion(dtc, 4);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "gruul")//devotion to green red
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 1);
intValue += zone->countDevotion(dtc, 3);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "izzet")//devotion to red blue
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 2);
intValue += zone->countDevotion(dtc, 3);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "orzhov")//devotion to white black
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 4);
intValue += zone->countDevotion(dtc, 5);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "rakdos")//devotion to red black
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 3);
intValue += zone->countDevotion(dtc, 4);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "selesnya")//devotion to green white
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 1);
intValue += zone->countDevotion(dtc, 5);
}
}
}
SAFE_DELETE(dtc);
}
else if (s == "simic")//devotion to green blue
{
TargetChooserFactory dtf(card->getObserver());
TargetChooser * dtc = dtf.createTargetChooser("*",NULL);
for (int i = 0; i < 2; i++)
{
Player * dp = card->getObserver()->players[i];
MTGGameZone * dzones[] = { dp->game->inPlay, dp->game->graveyard, dp->game->hand, dp->game->library };
for (int k = 0; k < 4; k++)
{
MTGGameZone * zone = dzones[k];
if (dtc->targetsZone(zone, card)&&dp == card->controller())
{
intValue += zone->countDevotion(dtc, 1);
intValue += zone->countDevotion(dtc, 2);
}
}
}
SAFE_DELETE(dtc);
}
else if (s.find("type:") != string::npos)
{
size_t begins = s.find("type:");
@@ -635,17 +435,6 @@ private:
{
intValue = target->controller()->opponent()->game->hand->nb_cards;
}
else if (s == "powertotalinplay")//Count Total Power of Creatures you control... Formidable
{
intValue = 0;
for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j)
{
if (card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_CREATURE))
{
intValue += card->controller()->game->inPlay->cards[j]->power;
}
}
}
else
{
intValue = atoi(s.c_str());
@@ -3140,7 +2929,7 @@ public:
SAFE_DELETE(NewPow);
SAFE_DELETE(NewTou);
}
for (int i = 0; i < Tokenizer(); ++i)
for (int i = 0; i < multiplier->getValue(); ++i)
{
//MTGCardInstance * myToken;
if (tokenId)
@@ -3199,23 +2988,6 @@ public:
return 1;
}
int Tokenizer()//tokenizer
{
int tokenize = 1;
if (source->controller()->game->battlefield->hasAbility(Constants::TOKENIZER))
{
int nbcards = source->controller()->game->battlefield->nb_cards;
for (int j = 0; j < nbcards; j++)
{
if (source->controller()->game->battlefield->cards[j]->has(Constants::TOKENIZER))
tokenize *= 2;
}
return multiplier->getValue()*tokenize;
}
else
return multiplier->getValue();
}
void setTokenOwner()
{
switch(who)
@@ -5557,17 +5329,6 @@ public:
AAShuffle * clone() const;
};
//Mulligan
class AAMulligan: public ActivatedAbilityTP
{
public:
AAMulligan(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, ManaCost * _cost = NULL, int who =
TargetChooser::UNSET);
int resolve();
const string getMenuText();
AAMulligan * clone() const;
};
//Remove Mana From ManaPool
class AARemoveMana: public ActivatedAbilityTP
{
-1
View File
@@ -64,7 +64,6 @@ class CardDescriptor: public MTGCardInstance
string compareName;
int CDopponentDamaged;
int CDcontrollerDamaged;
int CDdamager;
};
#endif
+13
View File
@@ -0,0 +1,13 @@
#ifndef _EFFECTS_H_
#define _EFFECTS_H_
#include <JGui.h>
class Effect: public JGuiObject
{
static int id_counter;
public:
Effect() : JGuiObject(++id_counter) {};
};
#endif // _EFFECTS_H_
-13
View File
@@ -90,19 +90,6 @@ public:
virtual LifeCost * clone() const;
};
//Specific life cost
class SpecificLifeCost : public ExtraCost
{
private:
int slc;
public:
SpecificLifeCost(TargetChooser *_tc = NULL, int slc = 0);
virtual int canPay();
virtual int doPay();
virtual SpecificLifeCost * clone() const;
};
//phyrexian mana
class LifeorManaCost : public ExtraCost
{
+2 -5
View File
@@ -52,6 +52,7 @@ class GameObserver{
string startupGameSerialized;
bool parseLine(const string& s);
virtual void logAction(const string& s);
bool processAction(const string& s);
bool processActions(bool undo
#ifdef TESTSUITE
, TestSuiteGame* testgame
@@ -68,7 +69,6 @@ class GameObserver{
);
public:
bool processAction(const string& s);
int currentPlayerId;
CombatStep combatStep;
int turn;
@@ -78,7 +78,7 @@ class GameObserver{
vector<list<Phase*> >gameTurn;
int cancelCurrentAction();
ExtraCosts * mExtraPayment;
GamePhase oldGamePhase;
int oldGamePhase;
TargetChooser * targetChooser;
DuelLayers * mLayers;
ReplacementEffects *replacementEffects;
@@ -111,7 +111,6 @@ class GameObserver{
void loadPlayer(int playerId, PlayerType playerType = PLAYER_TYPE_HUMAN, int decknb=0, bool premadeDeck=false);
virtual void loadPlayer(int playerId, Player* player);
int getPlayerId(Player* player) {if(player == players[0]) return 1; else if(player == players[1]) return 2; else return 0;};
Player * currentPlayer;
Player * currentActionPlayer;
Player * isInterrupting;
@@ -139,7 +138,6 @@ class GameObserver{
int receiveEvent(WEvent * event);
bool connectRule;
void logActionMomir(MTGCardInstance * card_to_discard, int cardId);
void logAction(Player* player, const string& s="");
void logAction(int playerId, const string& s="") {
logAction(players[playerId], s);
@@ -153,7 +151,6 @@ class GameObserver{
bool undo();
bool isLoading(){ return mLoading; };
void Mulligan(Player* player = NULL);
void serumMulligan(Player* player = NULL);
Player* getPlayer(size_t index) { return players[index];};
bool isStarted() { return (mLayers!=NULL);};
RandomGenerator* getRandomGenerator() { return &randomGenerator; };
-1
View File
@@ -65,7 +65,6 @@ public:
bool wasDealtDamage;
bool damageToOpponent;
bool damageToController;
bool damageToCreature;
bool mPropertiesChangedSinceLastUpdate;
int reduxamount;
int flanked;
+1 -2
View File
@@ -219,8 +219,7 @@ class Constants
LURE = 101,
NOLEGEND = 102,
CANPLAYFROMGRAVEYARD = 103,
TOKENIZER = 104,
NB_BASIC_ABILITIES = 105,
NB_BASIC_ABILITIES = 104,
RARITY_S = 'S', //Special Rarity
-1
View File
@@ -98,7 +98,6 @@ class MTGGameZone {
unsigned int countByType(const string &value);
unsigned int countByCanTarget(TargetChooser * tc);
unsigned int countTotalManaSymbols(TargetChooser * tc, int color);
unsigned int countDevotion(TargetChooser * tc, int color); //devotion for gods
MTGCardInstance * findByName(string name);
//returns true if one of the cards in the zone has the ability
-1
View File
@@ -99,7 +99,6 @@ public:
string toString();
int getCost(int color);
int getManaSymbols(int color);
int getManaSymbolsHybridMerged(int color);
//Returns NULL if i is greater than nbhybrids
ManaCostHybrid * getHybridCost(unsigned int i);
-1
View File
@@ -19,7 +19,6 @@ public:
string toString();
int getConvertedCost();
int getManaSymbols(int color);
int getManaSymbolsHybridMerged(int color);
friend std::ostream& operator<<(std::ostream& out, ManaCostHybrid& m);
friend std::ostream& operator<<(std::ostream& out, ManaCostHybrid* m);
+2
View File
@@ -12,6 +12,7 @@
#define GUI_OPPONENTHAND 5
#include <JGui.h>
#include "Effects.h"
#include "WEvent.h"
#include "Pos.h"
@@ -64,6 +65,7 @@ public:
}
;
virtual ~PlayGuiObject() {};
vector<Effect*> effects;
};
#endif
+1 -2
View File
@@ -68,7 +68,6 @@ public:
MTGInPlay * inPlay();
ManaPool * getManaPool();
void takeMulligan();
void serumMulligan();
ManaCost * doesntEmpty;
ManaCost * poolDoesntEmpty;
void cleanupPhase();
@@ -106,7 +105,7 @@ public:
std::string GetCurrentDeckStatsFile();
virtual bool parseLine(const string& s);
friend ostream& operator<<(ostream&, const Player&);
friend istream& operator>>(istream&, Player&);
friend istream& operator>>(istream&, Player&);
bool operator<(Player& aPlayer);
bool isDead();
};
+1 -1
View File
@@ -114,7 +114,7 @@ public:
int run();
};
class TestSuiteAI:public AI::AIPlayerBaka
class TestSuiteAI:public AIPlayerBaka
{
private:
MTGCardInstance * getCard(string action);
+1 -1
View File
@@ -234,7 +234,7 @@ public:
WCFilterSet(string arg);
bool isMatch(MTGCard *c)
{
return (setid == MTGSets::ALL_SETS || c->setId == setid) && (c->getRarity() != Constants::RARITY_T); //removes viewing of card tokens. tokens will not display on spoiler and should not affect gameplay :)
return (setid == MTGSets::ALL_SETS || c->setId == setid);
}
;
string getCode();
-4
View File
@@ -7,8 +7,6 @@
#include <sstream>
namespace AI {
AIHint::AIHint(string _line)
{
string line = _line;
@@ -584,5 +582,3 @@ AIAction * AIHints::suggestAbility(ManaCost * potentialMana)
}
return NULL;
}
};
-3
View File
@@ -6,8 +6,6 @@
#include "AIStats.h"
#include "AllAbilities.h"
namespace AI {
AIMomirPlayer::AIMomirPlayer(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayerBaka(observer, file, fileSmall, avatarFile, deck)
{
@@ -130,4 +128,3 @@ int AIMomirPlayer::computeActions()
return AIPlayerBaka::computeActions();
}
};
+3 -288
View File
@@ -13,36 +13,11 @@
#include "AIPlayerBakaB.h"
#endif
namespace AI {
bool Action::parseLine(const string& s)
{
return true;
}
ostream& operator<<(ostream& out, const Action&)
{
return out;
}
istream& operator>>(istream& in, Action& a)
{
string s;
while(std::getline(in, s))
{
if(!a.parseLine(s))
{
break;
}
}
return in;
}
int AIPlayer::totalAIDecks = -1;
const char * const MTG_LAND_TEXTS[] = { "artifact", "forest", "island", "mountain", "swamp", "plains", "other lands" };
AIAction::AIAction(AIPlayer * owner, MTGCardInstance * c, MTGCardInstance * t)
: owner(owner), ability(NULL), player(NULL), click(c), target(t)
{
@@ -67,51 +42,6 @@ AIAction::AIAction(AIPlayer * owner, MTGCardInstance * c, MTGCardInstance * t)
}
}
ostream& operator<<(ostream& out, const AIAction& a)
{
do {
if (a.player && !a.playerAbilityTarget)
{
out << "p" + (a.owner->getObserver()->getPlayerId(a.player) + 1) << endl;
break;
}
if (a.ability)
{
a.logSimpleAct(out, a.click);
// we're ignoring ability and we shouldn't
if (a.target && !a.mAbilityTargets.size())
{
a.logSimpleAct(out, a.target);
// sounds broken if target is a player ... or not, it's the following case
break;
}
else if(a.playerAbilityTarget && !a.mAbilityTargets.size())
{
out << "p" + (a.owner->getObserver()->getPlayerId((Player*)a.playerAbilityTarget) + 1) << endl;
// with this log we're losing what player clicked on who ... which is bad.
break;
}
if(a.mAbilityTargets.size())
{
a.logMultiAct(out, a.mAbilityTargets);
break;
}
}
else if(a.mAbilityTargets.size())
{
a.logMultiAct(out, a.mAbilityTargets);
break;
}
else if (a.click)
{ //Shouldn't be used, really...
assert(0);
}
} while(0);
return out;
}
int AIAction::Act()
{
GameObserver * g = owner->getObserver();
@@ -152,46 +82,6 @@ int AIAction::Act()
return 0;
}
ostream& AIAction::logSimpleAct(ostream& out, MTGCardInstance* click) const
{
string currentPlayer = "p" + (owner->getObserver()->getPlayerId(owner) + 1);
out << currentPlayer << click->currentZone->getName() << "[" << click->currentZone->getIndex(click) << "]" << endl;
return out;
}
ostream& AIAction::logMultiAct(ostream& out, const vector<Targetable*>& actionTargets) const
{
GameObserver * g = owner->getObserver();
TargetChooser * tc = g->getCurrentTargetChooser();
do {
if(!tc) break;
vector<Targetable*>::const_iterator ite = actionTargets.begin();
while(ite != actionTargets.end())
{
MTGCardInstance * card = ((MTGCardInstance *) (*ite));
if(card == (MTGCardInstance*)tc->source)//click source first.
{
logSimpleAct(out, card);
continue;
}
++ite;
}
// this is just wrong, but at least it should compile
for(int k = 0 ;k < int(actionTargets.size()) && k < tc->maxtargets; k++)
{
if (MTGCardInstance * card = dynamic_cast<MTGCardInstance *>(actionTargets[k]))
{
if(k+1 == int(actionTargets.size()))
tc->done = true;
logSimpleAct(out, card);
}
}
tc->attemptsToFill++;
} while (0);
return out;
}
int AIAction::clickMultiAct(vector<Targetable*>& actionTargets)
{
GameObserver * g = owner->getObserver();
@@ -226,7 +116,7 @@ int AIAction::clickMultiAct(vector<Targetable*>& actionTargets)
return 1;
}
AIPlayer::AIPlayer(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayer::AIPlayer(GameObserver *observer, string file, string fileSmall, MTGDeck * deck) :
Player(observer, file, fileSmall, deck)
{
agressivity = 50;
@@ -234,33 +124,6 @@ AIPlayer::AIPlayer(GameObserver *observer, string file, string fileSmall, string
playMode = Player::MODE_AI;
mFastTimerMode = false;
if(avatarFile != "")
{
if(!loadAvatar(avatarFile, "bakaAvatar"))
{
avatarFile = "baka.jpg";
loadAvatar(avatarFile, "bakaAvatar");
}
mAvatarName = avatarFile;
}
else //load a random avatar.
{
avatarFile = "avatar";
char buffer[3];
sprintf(buffer, "%i", int(observer->getRandomGenerator()->random()%100));
avatarFile.append(buffer);
avatarFile.append(".jpg");
if(!loadAvatar(avatarFile, "bakaAvatar"))
{
avatarFile = "baka.jpg";
loadAvatar(avatarFile, "bakaAvatar");
}
mAvatarName = avatarFile;
}
if (fileSmall == "ai_baka_eviltwin")
mAvatar->SetHFlip(true);
}
AIPlayer::~AIPlayer()
@@ -509,151 +372,3 @@ void AIPlayer::invalidateTotalAIDecks()
totalAIDecks = -1;
}
bool AIPlayer::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy)
{
if (ennemy->has(Constants::FIRSTSTRIKE) || ennemy->has(Constants::DOUBLESTRIKE))
return false;
if (!(card->has(Constants::FIRSTSTRIKE) || card->has(Constants::DOUBLESTRIKE)))
return false;
if (!(card->power >= ennemy->toughness))
return false;
if (!(card->power >= ennemy->toughness + 1) && ennemy->has(Constants::FLANKING))
return false;
return true;
}
bool AIPlayer::canPlay(MTGCardInstance * card)
{
if (card->hasType(Subtypes::TYPE_LAND))
{
if (game->playRestrictions->canPutIntoZone(card, game->inPlay) == PlayRestriction::CANT_PLAY)
return false;
}
else
{
if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY)
return false;
}
if (!manaPool->canAfford(card->getManaCost()))
return false;
return true;
}
int AIPlayer::getCreaturesInfo(Player * player, int neededInfo, int untapMode, int canAttack)
{
int result = 0;
CardDescriptor cd;
cd.init();
cd.setType("Creature");
cd.unsecureSetTapped(untapMode);
MTGCardInstance * card = NULL;
while ((card = cd.nextmatch(player->game->inPlay, card)))
{
if (!canAttack || card->canAttack())
{
if (neededInfo == INFO_NBCREATURES)
{
result++;
}
else
{
result += card->power;
}
}
}
return result;
}
int AIPlayer::createAbilityPotentialsActions(MTGAbility * a, MTGCardInstance * c, vector<AIAction>& actions)
{
if (!a->getActionTc())
{
AIAction aiAction(this, a, c, NULL);
actions.push_back(aiAction);
return 1;
}
vector<Targetable*>potentialTargets;
for (int i = 0; i < 2; i++)
{
Player * p = observer->players[i];
MTGGameZone * playerZones[] = { p->game->graveyard, p->game->library, p->game->hand, p->game->inPlay,p->game->stack };
// try player first
if(a->getActionTc()->canTarget((Targetable*)p))
{
if(a->getActionTc()->maxtargets == 1)
{
AIAction aiAction(this, a, p, c);
actions.push_back(aiAction);
}
else
potentialTargets.push_back(p);
}
for (int j = 0; j < 5; j++)
{
MTGGameZone * zone = playerZones[j];
for (int k = 0; k < zone->nb_cards; k++)
{
MTGCardInstance * t = zone->cards[k];
if (a->getActionTc()->canTarget(t))
{
if(a->getActionTc()->maxtargets == 1)
{
AIAction aiAction(this, a, c, t);
actions.push_back(aiAction);
}
else
{
potentialTargets.push_back(t);
}
}
}
}
}
vector<Targetable*>realTargets;
if(a->getActionTc()->maxtargets != 1)
{
if(a->getActionTc()->getNbTargets() && a->getActionTc()->attemptsToFill > 4)
{
a->getActionTc()->done = true;
return 0;
}
while(potentialTargets.size())
{
AIAction * check = NULL;
Player * pTargeting = 0;
MTGCardInstance * cTargeting = dynamic_cast<MTGCardInstance*>(potentialTargets[0]);
if(cTargeting)
{
check = NEW AIAction(this, a,c,cTargeting);
}
else
{
pTargeting = dynamic_cast<Player*>(potentialTargets[0]);
if(pTargeting)
check = NEW AIAction(this, a,pTargeting,c);
}
if(check && pTargeting)
{
AIAction aiAction(this, a,pTargeting,c);
actions.push_back(aiAction);
}
if(check)
realTargets.push_back(potentialTargets[0]);
potentialTargets.erase(potentialTargets.begin());
SAFE_DELETE(check);
}
if(!realTargets.size() || (int(realTargets.size()) < a->getActionTc()->maxtargets && a->getActionTc()->targetMin))
return 0;
AIAction aiAction(this, a, c,realTargets);
aiAction.target = dynamic_cast<MTGCardInstance*>(realTargets[0]);
aiAction.playerAbilityTarget = dynamic_cast<Player*>(realTargets[0]);
actions.push_back(aiAction);
}
return 1;
}
}
+70 -8
View File
@@ -14,7 +14,6 @@
// AIAction
//
namespace AI {
Player * OrderedAIAction::getPlayerTarget()
{
@@ -2193,6 +2192,36 @@ int AIPlayerBaka::computeActions()
return 1;
};
//
// Combat //
//
int AIPlayerBaka::getCreaturesInfo(Player * player, int neededInfo, int untapMode, int canAttack)
{
int result = 0;
CardDescriptor cd;
cd.init();
cd.setType("Creature");
cd.unsecureSetTapped(untapMode);
MTGCardInstance * card = NULL;
while ((card = cd.nextmatch(player->game->inPlay, card)))
{
if (!canAttack || card->canAttack())
{
if (neededInfo == INFO_NBCREATURES)
{
result++;
}
else
{
result += card->power;
}
}
}
return result;
}
int AIPlayerBaka::chooseAttackers()
{
//Attack with all creatures
@@ -2239,12 +2268,19 @@ int AIPlayerBaka::chooseAttackers()
}
/* Can I first strike my oponent and get away with murder ? */
bool AIPlayerBaka::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy)
int AIPlayerBaka::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy)
{
if(hints && hints->HintSaysAlwaysBlock(observer,ennemy))
return true;
return AIPlayer::canFirstStrikeKill(card, ennemy);
return 1;
if (ennemy->has(Constants::FIRSTSTRIKE) || ennemy->has(Constants::DOUBLESTRIKE))
return 0;
if (!(card->has(Constants::FIRSTSTRIKE) || card->has(Constants::DOUBLESTRIKE)))
return 0;
if (!(card->power >= ennemy->toughness))
return 0;
if (!(card->power >= ennemy->toughness + 1) && ennemy->has(Constants::FLANKING))
return 0;
return 1;
}
int AIPlayerBaka::chooseBlockers()
@@ -2428,7 +2464,7 @@ int AIPlayerBaka::receiveEvent(WEvent * event)
AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
AIPlayer(observer, file, fileSmall, avatarFile, deck)
AIPlayer(observer, file, fileSmall, deck)
{
nextCardToPlay = NULL;
@@ -2443,6 +2479,34 @@ AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall
for (size_t i = 0; i < mDeck->meta_AIHints.size(); ++i)
hints->add(mDeck->meta_AIHints[i]);
}
if(avatarFile != "")
{
if(!loadAvatar(avatarFile, "bakaAvatar"))
{
avatarFile = "baka.jpg";
loadAvatar(avatarFile, "bakaAvatar");
}
mAvatarName = avatarFile;
}
else //load a random avatar.
{
avatarFile = "avatar";
char buffer[3];
sprintf(buffer, "%i", int(observer->getRandomGenerator()->random()%100));
avatarFile.append(buffer);
avatarFile.append(".jpg");
if(!loadAvatar(avatarFile, "bakaAvatar"))
{
avatarFile = "baka.jpg";
loadAvatar(avatarFile, "bakaAvatar");
}
mAvatarName = avatarFile;
}
if (fileSmall == "ai_baka_eviltwin")
mAvatar->SetHFlip(true);
initTimer();
}
@@ -2534,5 +2598,3 @@ AIPlayerBaka::~AIPlayerBaka() {
}
SAFE_DELETE(hints);
}
}
+2 -3
View File
@@ -14,7 +14,6 @@
// Abilities/Target Selection
//
namespace AI {
MTGCardInstance * AIPlayerBakaB::chooseCard(TargetChooser * tc, MTGCardInstance * source, int random)
{
@@ -118,7 +117,7 @@ int AIPlayerBakaB::chooseAttackers()
}
/* Can I first strike my oponent and get away with murder ? */
bool AIPlayerBakaB::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy)
int AIPlayerBakaB::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy)
{
return AIPlayerBaka::canFirstStrikeKill(card, ennemy);
}
@@ -181,7 +180,7 @@ AIPlayerBakaB::~AIPlayerBakaB() {
}
}
#endif
-78
View File
@@ -1,78 +0,0 @@
#include "PrecompiledHeader.h"
#include "AIPlayerMinMax.h"
#include "CardDescriptor.h"
#include "AIStats.h"
#include "AllAbilities.h"
#include "ExtraCost.h"
#include "GuiCombat.h"
#include "AIHints.h"
#include "ManaCostHybrid.h"
#include "MTGRules.h"
namespace AI {
//
// Abilities/Target Selection
//
AIPlayerMinMax::AIPlayerMinMax(GameObserver *observer, string deckFile, string deckFileSmall, string avatarFile, MTGDeck * deck) :
AIPlayer(observer, deckFile, deckFileSmall, avatarFile, deck)
{
}
int AIPlayerMinMax::Act(float dt)
{
return 0;
};
AIPlayerMinMax::~AIPlayerMinMax()
{
}
void AIPlayerMinMax::LookAround()
{
vector<MTGCardInstance*>::iterator ite;
vector<AIAction> potentialActions;
// look for something useable (including mana)
for (size_t i = 1; i < observer->mLayers->actionLayer()->mObjects.size(); i++)
{
MTGAbility * a = ((MTGAbility *) observer->mLayers->actionLayer()->mObjects[i]);
//Make sure we can use the ability
for (int j = 0; j < game->inPlay->nb_cards; j++)
{
MTGCardInstance * card = game->inPlay->cards[j];
if (a->isReactingToClick(card, 0))
{
createAbilityPotentialsActions(a, card, potentialActions);
}
}
}
// look for something playable
for(ite = game->hand->cards.begin(); ite != game->hand->cards.end(); ite++)
{
if(canPlay(*ite))
{
AIAction a(this, (*ite));
potentialActions.push_back(a);
}
}
stringstream stream;
stream << *observer;
vector<AIAction>::const_iterator it;
for(it = potentialActions.begin(); it != potentialActions.end(); it++)
{
stringstream theCommand;
theCommand << (*it);
GameObserver g;
g.load(stream.str());
g.processAction(theCommand.str());
}
}
}
-5
View File
@@ -6,9 +6,6 @@
#include "MTGCardInstance.h"
#include "WEvent.h"
#include "AllAbilities.h"
namespace AI {
//TODO:better comments this is too cryptic to work on by anyone but original coder.
bool compare_aistats(AIStat * first, AIStat * second)
{
@@ -220,5 +217,3 @@ void AIStats::Render()
}
}
}
}
+13 -34
View File
@@ -608,7 +608,7 @@ int ActionStack::setIsInterrupting(Player * player, bool log)
if (!gModRules.game.canInterrupt())
{
cancelInterruptOffer(0, DONT_INTERRUPT, log);
cancelInterruptOffer(DONT_INTERRUPT, log);
return 0;
}
@@ -622,18 +622,9 @@ int ActionStack::setIsInterrupting(Player * player, bool log)
int playerId = (player == observer->players[1]) ? 1 : 0;
interruptDecision[playerId] = INTERRUPT;
Interruptible* latest = getLatest(NOT_RESOLVED);
stringstream stream;
if(latest)
stream << "yes " << " " << latest->getDisplayName();
else
stream << "yes";
observer->isInterrupting = player;
if(log)
observer->logAction(player, stream.str());
observer->logAction(player, "yes");
return 1;
}
@@ -681,6 +672,7 @@ ActionStack::ActionStack(GameObserver* game)
interruptDecision[i] = NOT_DECIDED;
askIfWishesToInterrupt = NULL;
timer = -1;
currentState = -1;
mode = ACTIONSTACK_STANDARD;
checked = 0;
lastActionController = NULL;
@@ -881,6 +873,8 @@ void ActionStack::Update(float dt)
//modal = 0;
TargetChooser * tc = observer->getCurrentTargetChooser();
int newState = observer->getCurrentGamePhase();
currentState = newState;
if (!tc)
checked = 0;
@@ -998,33 +992,18 @@ void ActionStack::Update(float dt)
}
}
void ActionStack::cancelInterruptOffer(Player* p, InterruptDecision cancelMode, bool log)
void ActionStack::cancelInterruptOffer(InterruptDecision cancelMode, bool log)
{
assert(observer->isInterrupting!=0);
int playerId;
if(p) {
playerId = observer->getPlayerId(p)-1;
} else {
if(observer->isInterrupting == observer->players[1]) {
playerId = 1;
} else {
playerId = 0;
}
}
if(log) {
stringstream stream;
Interruptible* latest = getLatest(NOT_RESOLVED);
if(latest)
stream << "no " << cancelMode << " " << latest->getDisplayName();
else
stream << "no " << cancelMode;
observer->logAction(playerId, stream.str());
}
int playerId = (observer->isInterrupting == observer->players[1]) ? 1 : 0;
interruptDecision[playerId] = cancelMode;
askIfWishesToInterrupt = NULL;
observer->isInterrupting = NULL;
timer = -1;
if(log) {
stringstream stream;
stream << "no " << cancelMode;
observer->logAction(playerId, stream.str());
}
}
void ActionStack::endOfInterruption(bool log)
@@ -1080,7 +1059,7 @@ bool ActionStack::CheckUserInput(JButton inputKey)
}
else if ((JGE_BTN_PRI == key))
{
cancelInterruptOffer(0, DONT_INTERRUPT_ALL);
cancelInterruptOffer(DONT_INTERRUPT_ALL);
return true;
}
return true;
+33 -82
View File
@@ -1359,13 +1359,6 @@ int AAFizzler::resolve()
sCard = sTarget->source;
if (!sCard || !sTarget || sCard->has(Constants::NOFIZZLE))
return 0;
if (source->alias == 111057 && sTarget)//Draining Whelk
{
for (int j = sTarget->cost->getConvertedCost(); j > 0; j--)
{
source->counters->addCounter(1,1);
}
}
stack->Fizzle(sTarget, fizzleMode);
return 1;
}
@@ -2489,49 +2482,35 @@ int AACloner::resolve()
Player * targetPlayer = who == 1 ? source->controller()->opponent() : source->controller();
int tokenize = 1;//tokenizer support for cloning
if (targetPlayer->game->battlefield->hasAbility(Constants::TOKENIZER))
{
int nbcards = targetPlayer->game->battlefield->nb_cards;
for (int j = 0; j < nbcards; j++)
{
if (targetPlayer->game->battlefield->cards[j]->has(Constants::TOKENIZER))
tokenize *= 2;
}
}
for (int i = 0; i < tokenize; ++i)
{
MTGCardInstance * myClone = NEW MTGCardInstance(clone, targetPlayer->game);
targetPlayer->game->temp->addCard(myClone);
MTGCardInstance * myClone = NEW MTGCardInstance(clone, targetPlayer->game);
targetPlayer->game->temp->addCard(myClone);
Spell * spell = NEW Spell(game, myClone);
spell->source->isToken = 1;
spell->resolve();
spell->source->fresh = 1;
spell->source->model = spell->source;
spell->source->model->data = spell->source;
if(_target->isToken)
{
spell->source->power = _target->origpower;
spell->source->toughness = _target->origtoughness;
spell->source->life = _target->origtoughness;
}
list<int>::iterator it;
for (it = awith.begin(); it != awith.end(); it++)
{
spell->source->basicAbilities[*it] = 1;
}
for (it = colors.begin(); it != colors.end(); it++)
{
spell->source->setColor(*it);
}
for (it = typesToAdd.begin(); it != typesToAdd.end(); it++)
{
spell->source->addType(*it);
}
delete spell;
Spell * spell = NEW Spell(game, myClone);
spell->source->isToken = 1;
spell->resolve();
spell->source->fresh = 1;
spell->source->model = spell->source;
spell->source->model->data = spell->source;
if(_target->isToken)
{
spell->source->power = _target->origpower;
spell->source->toughness = _target->origtoughness;
spell->source->life = _target->origtoughness;
}
list<int>::iterator it;
for (it = awith.begin(); it != awith.end(); it++)
{
spell->source->basicAbilities[*it] = 1;
}
for (it = colors.begin(); it != colors.end(); it++)
{
spell->source->setColor(*it);
}
for (it = typesToAdd.begin(); it != typesToAdd.end(); it++)
{
spell->source->addType(*it);
}
delete spell;
return 1;
}
@@ -2962,32 +2941,6 @@ AAShuffle * AAShuffle::clone() const
return NEW AAShuffle(*this);
}
// Mulligan
AAMulligan::AAMulligan(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, ManaCost * _cost, int who) :
ActivatedAbilityTP(observer, _id, card, _target, _cost, who)
{
}
int AAMulligan::resolve()
{
Player * player = getPlayerFromTarget(getTarget());
if (player)
{
player->serumMulligan();
}
return 1;
}
const string AAMulligan::getMenuText()
{
return "Mulligan";
}
AAMulligan * AAMulligan::clone() const
{
return NEW AAMulligan(*this);
}
// Remove Mana From ManaPool
AARemoveMana::AARemoveMana(GameObserver* observer, int _id, MTGCardInstance * card, Targetable * _target, string manaDesc, int who) :
ActivatedAbilityTP(observer, _id, card, _target, NULL, who)
@@ -3550,7 +3503,7 @@ int MenuAbility::processAbility()
mClone->resolve();
SAFE_DELETE(mClone);
if (source->controller() == game->isInterrupting)
game->mLayers->stackLayer()->cancelInterruptOffer(0, ActionStack::DONT_INTERRUPT, false);
game->mLayers->stackLayer()->cancelInterruptOffer(ActionStack::DONT_INTERRUPT, false);
}
processed = true;
@@ -3587,7 +3540,7 @@ int MenuAbility::reactToChoiceClick(Targetable * object,int choice,int control)
if(!mClone)
{
if (source->controller() == game->isInterrupting)
game->mLayers->stackLayer()->cancelInterruptOffer(0, ActionStack::DONT_INTERRUPT, false);
game->mLayers->stackLayer()->cancelInterruptOffer(ActionStack::DONT_INTERRUPT, false);
return 0;
}
mClone->target = abilities[choice]->target;
@@ -4770,15 +4723,14 @@ void AVanishing::Update(float dt)
int AVanishing::resolve()
{
return 1;
}
const string AVanishing::getMenuText()
{
if (counterName.find("fade") != string::npos)
{
return "Fading";
}
if(counterName.find("fade") != string::npos)
return "Fading";
return "Vanishing";
}
@@ -5751,8 +5703,7 @@ void ATutorialMessage::Update(float dt)
mElapsed += dt;
if(!mUserCloseRequest)
IconButtonsController::Update(dt);
IconButtonsController::Update(dt);
if (mIsImage)
return;
+4 -16
View File
@@ -23,7 +23,6 @@ CardDescriptor::CardDescriptor()
colorComparisonMode = COMPARISON_NONE;
CDopponentDamaged = 0;
CDcontrollerDamaged = 0;
CDdamager = 0;
}
int CardDescriptor::init()
@@ -227,27 +226,16 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card)
{
match = NULL;
}
if ((CDdamager == -1 && (card->damageToOpponent || card->damageToController || card->damageToCreature))
|| (CDdamager == 1 && !(card->damageToOpponent || card->damageToController || card->damageToCreature)))
{
match = NULL;
}
if(CDopponentDamaged == -1 || CDopponentDamaged == 1)
{
Player * p = card->controller()->opponent();//controller()->opponent();
if ((CDopponentDamaged == -1 && card->damageToOpponent && card->controller() == p)
|| (CDopponentDamaged == 1 && !card->damageToOpponent && card->controller() == p)
|| (CDopponentDamaged == -1 && card->damageToController && card->controller() == p->opponent())
|| (CDopponentDamaged == 1 && !card->damageToController && card->controller() == p->opponent()))
if ((CDopponentDamaged == -1 && card->damageToOpponent && card->controller() == p) || (CDopponentDamaged == 1 && !card->damageToOpponent && card->controller() == p)
|| (CDopponentDamaged == -1 && card->damageToController && card->controller() == p->opponent()) || (CDopponentDamaged == 1 && !card->damageToController && card->controller() == p->opponent()))
{
match = NULL;
}
if ((CDcontrollerDamaged == -1 && card->damageToController && card->controller() == p)
|| (CDcontrollerDamaged == 1 && !card->damageToController && card->controller() == p)
|| (CDcontrollerDamaged == -1 && card->damageToOpponent && card->controller() == p->opponent())
|| (CDcontrollerDamaged == 1 && !card->damageToOpponent && card->controller() == p->opponent()))
if ((CDcontrollerDamaged == -1 && card->damageToController && card->controller() == p) || (CDcontrollerDamaged == 1 && !card->damageToController && card->controller() == p)
|| (CDcontrollerDamaged == -1 && card->damageToOpponent && card->controller() == p->opponent()) || (CDcontrollerDamaged == 1 && !card->damageToOpponent && card->controller() == p->opponent()))
{
match = NULL;
}
-12
View File
@@ -1224,18 +1224,6 @@ bool CardGui::FilterCard(MTGCard * _card,string filter)
cd.CDcontrollerDamaged = 1;
}
}
//creature dealt damage to anything
else if (attribute.find("damager") != string::npos)
{
if (minus)
{
cd.CDdamager = -1;
}
else
{
cd.CDdamager = 1;
}
}
else if (attribute.find("multicolor") != string::npos)
{
//card is multicolored?
+2 -2
View File
@@ -625,7 +625,7 @@ int Credits::isDifficultyUnlocked(DeckStats * stats)
{
if (options[Options::DIFFICULTY_MODE_UNLOCKED].number)
return 0;
int nbAIDecks = AI::AIPlayer::getTotalAIDecks();
int nbAIDecks = AIPlayer::getTotalAIDecks();
int wins = 0;
@@ -743,7 +743,7 @@ int Credits::IsMoreAIDecksUnlocked(DeckStats * stats) {
// the number of currently unlocked decks in order to go through.
if (stats->nbGames() < currentlyUnlocked * 1.2) return 0;
if (AI::AIPlayer::getTotalAIDecks() > currentlyUnlocked)
if (AIPlayer::getTotalAIDecks() > currentlyUnlocked)
return 1;
return 0;
+1 -3
View File
@@ -192,10 +192,8 @@ 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::DAMAGEABLE_MTGCARDINSTANCE){
if (target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE)
((MTGCardInstance*)target)->wasDealtDamage = true;
((MTGCardInstance*)source)->damageToCreature = true;
}
if (target->type_as_damageable == Damageable::DAMAGEABLE_PLAYER)
{
if(target == source->controller())
+3
View File
@@ -0,0 +1,3 @@
#include "../include/Effects.h"
int Effect::id_counter = 0;
-38
View File
@@ -151,44 +151,6 @@ int LifeCost::doPay()
return 1;
}
//Specific life cost
SpecificLifeCost * SpecificLifeCost::clone() const
{
SpecificLifeCost * ec = NEW SpecificLifeCost(*this);
if (tc)
ec->tc = tc->clone();
return ec;
}
SpecificLifeCost::SpecificLifeCost(TargetChooser *_tc, int slc)
: ExtraCost("Life", _tc), slc(slc)
{
}
int SpecificLifeCost::canPay()
{
MTGCardInstance * _target = (MTGCardInstance *) target;
if(_target->controller()->life >= slc)
{
return 1;
}
return 0;
}
int SpecificLifeCost::doPay()
{
if (!target)
return 0;
MTGCardInstance * _target = (MTGCardInstance *) target;
_target->controller()->loseLife(slc);
target = NULL;
if (tc)
tc->initTargets();
return 1;
}
//life or Mana cost
LifeorManaCost * LifeorManaCost::clone() const
{
+27 -105
View File
@@ -295,8 +295,8 @@ void GameObserver::userRequestNextGamePhase(bool allowInterrupt, bool log)
{
if(log) {
stringstream stream;
stream << "next " << allowInterrupt;
logAction(currentPlayer/*currentActionPlayer*/, stream.str());
stream << "next " << allowInterrupt << " " <<mCurrentGamePhase;
logAction(currentPlayer, stream.str());
}
if(getCurrentTargetChooser() && getCurrentTargetChooser()->maxtargets == 1000)
@@ -795,7 +795,6 @@ void GameObserver::gameStateBasedEffects()
c->wasDealtDamage = false;
c->damageToController = false;
c->damageToOpponent = false;
c->damageToCreature = false;
c->isAttacking = NULL;
}
for (int t = 0; t < nbcards; t++)
@@ -863,7 +862,7 @@ void GameObserver::gameStateBasedEffects()
if (combatStep == TRIGGERS)
{
if (!mLayers->stackLayer()->getNext(NULL, 0, NOT_RESOLVED) && !targetChooser
&& !mLayers->actionLayer()->isWaitingForAnswer())
&& !mLayers->actionLayer()->isWaitingForAnswer())
mLayers->stackLayer()->AddNextCombatStep();
}
@@ -1497,7 +1496,6 @@ ostream& operator<<(ostream& out, const GameObserver& g)
out << "player=" << g.currentPlayerId + 1 << endl;
if(g.mCurrentGamePhase != MTG_PHASE_INVALID)
out << "phase=" << g.phaseRing->phaseName(g.mCurrentGamePhase) << endl;
out << "gameType=" << g.gameType() << endl;
out << "[player1]" << endl;
out << *(g.players[0]) << endl;
out << "[player2]" << endl;
@@ -1571,13 +1569,8 @@ bool GameObserver::load(const string& ss, bool undo, int controlledPlayerIndex
if (s[s.size() - 1] == '\r') s.erase(s.size() - 1); //Handle DOS files
if (!s.size()) continue;
if (s[0] == '#') continue;
if (s.find("gameType:") == 0)
{
mGameType = (GameType)atoi(s.substr(9).c_str());
continue;
}
if (s.find("seed:") == 0)
std::transform(s.begin(), s.end(), s.begin(), ::tolower);
if (s.find("seed ") == 0)
{
mSeed = atoi(s.substr(5).c_str());
randomGenerator.setSeed(mSeed);
@@ -1666,25 +1659,6 @@ bool GameObserver::load(const string& ss, bool undo, int controlledPlayerIndex
if(testgame)
testgame->initGame();
#endif //TESTSUITE
switch(mGameType) {
case GAME_TYPE_MOMIR:
{
addObserver(NEW MTGMomirRule(this, -1, MTGCollection()));
break;
}
case GAME_TYPE_STONEHEWER:
{
addObserver(NEW MTGStoneHewerRule(this, -1,MTGCollection()));
break;
}
case GAME_TYPE_HERMIT:
{
addObserver(NEW MTGHermitRule(this, -1));
break;
}
default:
break;
}
processActions(undo
#ifdef TESTSUITE
@@ -1694,7 +1668,7 @@ bool GameObserver::load(const string& ss, bool undo, int controlledPlayerIndex
}
else
{
actionsList.push_back(s);
logAction(s);
}
break;
}
@@ -1724,28 +1698,19 @@ bool GameObserver::processAction(const string& s)
size_t size = s.find("]")-begin;
size_t index = atoi(s.substr(begin, size).c_str());
dumpAssert(index < zone->cards.size());
if(s.find(" -momir- ") != string::npos) {
int cardId = atoi(s.substr(s.find(" -momir- ") + 9).c_str());
MTGMomirRule * a = ((MTGMomirRule *) mLayers->actionLayer()->getAbility(MTGAbility::MOMIR));
a->reactToClick(zone->cards[index], cardId);
mLayers->actionLayer()->stuffHappened = 1;
}
else
cardClick(zone->cards[index], zone->cards[index]);
cardClick(zone->cards[index], zone->cards[index]);
} else if (s.find("stack") != string::npos) {
size_t begin = s.find("[")+1;
size_t size = s.find("]")-begin;
size_t index = atoi(s.substr(begin, size).c_str());
stackObjectClicked((Interruptible*)mLayers->stackLayer()->getByIndex(index));
} else if (s.find(".yes") != string::npos) {
} else if (s.find("yes") != string::npos) {
mLayers->stackLayer()->setIsInterrupting(p);
} else if (s.find(".no") != string::npos) {
mLayers->stackLayer()->cancelInterruptOffer(p);
} else if (s.find("no") != string::npos) {
mLayers->stackLayer()->cancelInterruptOffer();
} else if (s.find("endinterruption") != string::npos) {
mLayers->stackLayer()->endOfInterruption();
} else if (s.find(".next") != string::npos) {
// currentPlayer = p;
// currentActionPlayer = p;
} else if (s.find("next") != string::npos) {
userRequestNextGamePhase();
} else if (s.find("combatok") != string::npos) {
mLayers->combatLayer()->clickOK();
@@ -1754,14 +1719,14 @@ bool GameObserver::processAction(const string& s)
} else if (s.find("choice") != string::npos) {
int choice = atoi(s.substr(s.find("choice ") + 7).c_str());
mLayers->actionLayer()->doReactTo(choice);
} else if (s == "p1" || s == "p2") {
cardClick(NULL, p);
} else if(s.find("mulligan") != string::npos) {
Mulligan(p);
} else if(s.find("shufflelib") != string::npos) {
// This should probably be differently and be automatically part of the ability triggered
// that would allow the AI to use it as well.
shuffleLibrary(p);
} else if (s.find("p1") || s.find("p2")) {
cardClick(NULL, p);
} else {
DebugTrace("no clue about: " + s);
}
@@ -1805,29 +1770,21 @@ bool GameObserver::processActions(bool undo
}
#endif
for(loadingite = loadingList.begin(); loadingite != loadingList.end(); /*loadingite++,*/ cmdIndex++)
for(loadingite = loadingList.begin(); loadingite != loadingList.end(); loadingite++, cmdIndex++)
{
Interruptible* lastInterruption;
Player* lastInterruptingPlayer;
processAction(*loadingite);
do
size_t nb = actionsList.size();
for (int i = 0; i<6; i++)
{
lastInterruption = mLayers->stackLayer()->getLatest(NOT_RESOLVED);
lastInterruptingPlayer = isInterrupting;
// let's fake an update
GameObserver::Update(counter);
counter += 1.000f;
}
while(
(lastInterruption != mLayers->stackLayer()->getLatest(NOT_RESOLVED)
&& mLayers->stackLayer()->isNotUndecided())
||lastInterruptingPlayer != isInterrupting);
// one again just to be sure
GameObserver::Update(counter);
counter += 1.000f;
string s = *loadingite;
processAction(s);
dumpAssert(actionsList.back() == *loadingite);
dumpAssert(nb == actionsList.size());
dumpAssert(cmdIndex == (actionsList.size()-1));
}
mLoading = false;
@@ -1856,42 +1813,14 @@ void GameObserver::logAction(MTGCardInstance* card, MTGGameZone* zone, size_t in
logAction(stream.str());
}
void GameObserver::logActionMomir(MTGCardInstance * card, int cardId)
{
stringstream stream;
stream << "p" << ((card->controller()==players[0])?"1.":"2.")
<< card->currentZone->getName()<< "[" << card->currentZone->getIndex(card) << "] "
<< " -momir- " << cardId << " " << card->getLCName();
logAction(stream.str());
}
void GameObserver::logAction(const string& s)
{
stringstream stream;
stream << s;
stream << " " << getCurrentGamePhaseName();
// << mLayers->stackLayer()->interruptDecision[0]
// << mLayers->stackLayer()->interruptDecision[1];
if(s.find("shufflelib") == string::npos &&
s.find("next") == string::npos &&
s.find(".no") == string::npos &&
s.find(".yes") == string::npos
) {
// shufflelib replay might be desynchronized
stream << " cp " << getPlayerId(currentPlayer) << ", ii " << getPlayerId(isInterrupting) << ", cap " << getPlayerId(currentActionPlayer);
}
if(mLoading)
{
string toCheck = *loadingite;
string vs = stream.str();
dumpAssert(toCheck == vs);
loadingite++;
dumpAssert(toCheck == s);
}
actionsList.push_back(stream.str());
actionsList.push_back(s);
};
bool GameObserver::undo()
@@ -1909,13 +1838,6 @@ void GameObserver::Mulligan(Player* player)
player->takeMulligan();
}
void GameObserver::serumMulligan(Player* player)
{
if(!player) player = currentPlayer;
logAction(player, "mulligan serum powder");
player->serumMulligan();
}
Player* GameObserver::createPlayer(const string& playerMode
#ifdef TESTSUITE
, TestSuiteGame* testgame
@@ -1928,7 +1850,7 @@ Player* GameObserver::createPlayer(const string& playerMode
switch(aMode)
{
case Player::MODE_AI:
AI::AIPlayerFactory playerCreator;
AIPlayerFactory playerCreator;
if(players.size())
pPlayer = playerCreator.createAIPlayer(this, MTGCollection(), players[0]);
else
@@ -2001,7 +1923,7 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b
}
else
{ //AI Player, chooses deck
AI::AIPlayerFactory playerCreator;
AIPlayerFactory playerCreator;
Player * opponent = NULL;
if (playerId == 1) opponent = players[0];
@@ -2011,7 +1933,7 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b
else
{
//Random deck
AI::AIPlayerFactory playerCreator;
AIPlayerFactory playerCreator;
Player * opponent = NULL;
// Reset the random logging.
@@ -2028,7 +1950,7 @@ void GameObserver::loadPlayer(int playerId, PlayerType playerType, int decknb, b
}
if (playerType == PLAYER_TYPE_CPU_TEST)
((AI::AIPlayer *) players[playerId])->setFastTimerMode();
((AIPlayer *) players[playerId])->setFastTimerMode();
}
}
+2 -2
View File
@@ -263,7 +263,7 @@ void GameStateDeckViewer::saveDeck()
void GameStateDeckViewer::saveAsAIDeck(string deckName)
{
int deckId = AI::AIPlayer::getTotalAIDecks() + 1;
int deckId = AIPlayer::getTotalAIDecks() + 1;
std::ostringstream oss;
oss << "deck" <<deckId;
@@ -278,7 +278,7 @@ void GameStateDeckViewer::saveAsAIDeck(string deckName)
filepath.append(aiDeckName).append(".txt");
DebugTrace("saving AI deck " << filepath);
myDeck->save(filepath, true, deckName, deckDesc);
AI::AIPlayer::invalidateTotalAIDecks(); //We added one AI deck, so we need to invalidate the count cache
AIPlayer::invalidateTotalAIDecks(); //We added one AI deck, so we need to invalidate the count cache
}
void GameStateDeckViewer::sellCard()

Some files were not shown because too many files have changed in this diff Show More