Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 25c844c1f5 | |||
| 34492d9096 | |||
| 30d92eb68c | |||
| 6e6a0fd5c2 | |||
| cd4a980182 | |||
| aad54fd98d | |||
| 6b7a49506c | |||
| 7ecf67c176 | |||
| 77aeb2d0ac | |||
| 7a9f989104 | |||
| ae06bebd24 | |||
| 042fb7b376 | |||
| c3583ade01 | |||
| f97d9805dd | |||
| 1d33de59a9 | |||
| 0c4b09891b | |||
| 25955303e7 | |||
| 27b75eecb0 | |||
| e40921cf13 | |||
| 083cebcc7e | |||
| a722736335 | |||
| c483c20c81 | |||
| dec1caa43c | |||
| 9526e22118 | |||
| d9816c7ad0 | |||
| 8e327a27df | |||
| 43fe67d7d8 | |||
| a63991bb4e | |||
| 928ca3497a | |||
| 60219411f6 | |||
| 642f5bb515 | |||
| 20e878a102 |
+2
-2
@@ -18,8 +18,8 @@ install:
|
||||
- wget http://dl.google.com/android/android-sdk_r22-linux.tgz -nv
|
||||
- tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2
|
||||
- tar -zxf android-sdk_r22-linux.tgz
|
||||
- $ANDROID list sdk -a
|
||||
- echo yes | $ANDROID update sdk -a --filter 1,2,5,19 --no-ui --force > log.txt
|
||||
- $ANDROID list sdk --extended -a
|
||||
- echo yes | $ANDROID update sdk -a --filter "tools","platform-tools","build-tools-19.0.1","android-10" --no-ui --force > log.txt
|
||||
- sudo pip install pyjavaproperties
|
||||
script: ./travis-script.sh
|
||||
env:
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
#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¤tSize) {
|
||||
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
|
||||
@@ -128,6 +128,7 @@ public:
|
||||
bool readIntoString(const string & FilePath, string & target);
|
||||
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);
|
||||
@@ -163,4 +164,4 @@ protected:
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+221
-1
@@ -1,7 +1,7 @@
|
||||
#ifndef THREADING_H
|
||||
#define THREADING_H
|
||||
|
||||
#if !defined(PSP) && !defined(QT_CONFIG) && !(__cplusplus > 199711L)
|
||||
#if !defined(PSP) && !defined(QT_CONFIG) && !(__cplusplus > 199711L) && !defined(SDL_CONFIG)
|
||||
#include <boost/date_time.hpp>
|
||||
|
||||
#ifdef WIN32
|
||||
@@ -611,6 +611,226 @@ namespace boost
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(SDL_CONFIG)
|
||||
#include "SDL_thread.h"
|
||||
#include "SDL_timer.h"
|
||||
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include "../include/JLogger.h"
|
||||
|
||||
namespace boost
|
||||
{
|
||||
template <class Mutex>
|
||||
struct unique_lock
|
||||
{
|
||||
unique_lock(Mutex& inMutex) : mMutex(&inMutex)
|
||||
{
|
||||
mMutex->lock();
|
||||
}
|
||||
|
||||
~unique_lock()
|
||||
{
|
||||
mMutex->unlock();
|
||||
}
|
||||
|
||||
Mutex* mMutex;
|
||||
};
|
||||
|
||||
class mutex
|
||||
{
|
||||
public:
|
||||
|
||||
typedef unique_lock<mutex> scoped_lock;
|
||||
|
||||
mutex()
|
||||
: mpSDLMutex(0)
|
||||
{
|
||||
mpSDLMutex = SDL_CreateMutex();
|
||||
}
|
||||
|
||||
~mutex()
|
||||
{
|
||||
SDL_DestroyMutex(mpSDLMutex);
|
||||
}
|
||||
|
||||
void lock()
|
||||
{
|
||||
SDL_mutexP(mpSDLMutex);
|
||||
}
|
||||
|
||||
void unlock()
|
||||
{
|
||||
SDL_mutexV(mpSDLMutex);
|
||||
}
|
||||
|
||||
SDL_mutex* mpSDLMutex;
|
||||
|
||||
private:
|
||||
mutex(mutex const&);
|
||||
mutex& operator=(mutex const&);
|
||||
};
|
||||
|
||||
|
||||
|
||||
class recursive_mutex
|
||||
{
|
||||
public:
|
||||
|
||||
typedef unique_lock<recursive_mutex> scoped_lock;
|
||||
|
||||
recursive_mutex()
|
||||
: mpSDLMutex(0)
|
||||
{
|
||||
mpSDLMutex = SDL_CreateMutex();
|
||||
}
|
||||
|
||||
~recursive_mutex()
|
||||
{
|
||||
SDL_DestroyMutex(mpSDLMutex);
|
||||
}
|
||||
|
||||
void lock()
|
||||
{
|
||||
SDL_mutexP(mpSDLMutex);
|
||||
}
|
||||
|
||||
void unlock()
|
||||
{
|
||||
SDL_mutexV(mpSDLMutex);
|
||||
}
|
||||
|
||||
SDL_mutex* mpSDLMutex;
|
||||
|
||||
private:
|
||||
recursive_mutex(recursive_mutex const&);
|
||||
recursive_mutex& operator=(recursive_mutex const&);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
** Emulating boost::thread configuration glue, with some shortcuts
|
||||
** This detail namespace is a distillation of boost's thread.hpp, thread_data.hpp.
|
||||
*/
|
||||
namespace detail
|
||||
{
|
||||
struct thread_data_base
|
||||
{
|
||||
thread_data_base()
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~thread_data_base()
|
||||
{
|
||||
}
|
||||
|
||||
virtual void run() = 0;
|
||||
};
|
||||
|
||||
typedef boost::shared_ptr<detail::thread_data_base> thread_data_ptr;
|
||||
|
||||
template<typename F>
|
||||
class thread_data : public detail::thread_data_base
|
||||
{
|
||||
public:
|
||||
thread_data(F f_) : f(f_)
|
||||
{
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
f();
|
||||
}
|
||||
|
||||
private:
|
||||
F f;
|
||||
|
||||
void operator=(thread_data&);
|
||||
thread_data(thread_data&);
|
||||
};
|
||||
|
||||
} //namespace detail
|
||||
|
||||
/**
|
||||
** A simplistic implementation of boost::thread, using QThread.
|
||||
**
|
||||
*/
|
||||
class thread
|
||||
{
|
||||
/*
|
||||
** Helper class for sceKernelStartThread, which passes args by value, not by reference
|
||||
** We use this struct to wrap any pointers that we want to pass to the worker thread.
|
||||
*/
|
||||
struct CallbackData
|
||||
{
|
||||
CallbackData(detail::thread_data_ptr inThreadInfo)
|
||||
: mThreadInfo(inThreadInfo)
|
||||
{
|
||||
}
|
||||
|
||||
detail::thread_data_ptr mThreadInfo;
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
thread()
|
||||
{
|
||||
}
|
||||
|
||||
template <class F,class A1>
|
||||
thread(F f, A1 a1) : mThreadInfo(make_thread_info(boost::bind(boost::type<void>(), f, a1)))
|
||||
{
|
||||
mpSDLThread = SDL_CreateThread(ThreadProc, &mThreadInfo);
|
||||
}
|
||||
|
||||
~thread()
|
||||
{
|
||||
}
|
||||
|
||||
void join()
|
||||
{
|
||||
int status;
|
||||
SDL_WaitThread(mpSDLThread, &status);
|
||||
}
|
||||
|
||||
private:
|
||||
static int ThreadProc(void *inParam)
|
||||
{
|
||||
detail::thread_data_ptr* threadInfo = reinterpret_cast<detail::thread_data_ptr* >(inParam);
|
||||
CallbackData callbackData(*threadInfo);
|
||||
|
||||
LOG("Entering thread::ThreadProc");
|
||||
callbackData.mThreadInfo->run();
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<typename F>
|
||||
static inline detail::thread_data_ptr make_thread_info(F f)
|
||||
{
|
||||
return detail::thread_data_ptr(new detail::thread_data<F>(f));
|
||||
}
|
||||
|
||||
detail::thread_data_ptr mThreadInfo;
|
||||
SDL_Thread* mpSDLThread;
|
||||
};
|
||||
|
||||
namespace posix_time
|
||||
{
|
||||
typedef unsigned int milliseconds;
|
||||
}
|
||||
|
||||
/**
|
||||
** boost's platform neutral sleep call.
|
||||
*/
|
||||
namespace this_thread
|
||||
{
|
||||
inline void sleep(boost::posix_time::milliseconds const& time)
|
||||
{
|
||||
SDL_Delay(time);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // THREADING_H
|
||||
|
||||
@@ -0,0 +1,298 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
@@ -557,7 +557,13 @@ 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()) ? true: false;
|
||||
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);
|
||||
}
|
||||
|
||||
int JFileSystem::GetFileSize(izfstream & file)
|
||||
|
||||
+18
-11
@@ -9,11 +9,11 @@
|
||||
#include <QtDeclarative>
|
||||
#include "qmlapplicationviewer.h"
|
||||
#endif //QT_WIDGET
|
||||
#include "filedownloader.h"
|
||||
#include "Downloader.h"
|
||||
#include "GameApp.h"
|
||||
#include "corewrapper.h"
|
||||
|
||||
QWidget* g_glwidget = NULL;
|
||||
WagicCore* g_glwidget = NULL;
|
||||
|
||||
static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] =
|
||||
{
|
||||
@@ -69,18 +69,25 @@ 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());
|
||||
FileDownloader fileDownloader(USERDIR, WAGIC_RESOURCE_NAME);
|
||||
DownloadRequest* downloadRequest = NULL;
|
||||
#ifdef WAGIC_RESOURCE_URL
|
||||
Downloader*downloader = Downloader::GetInstance();
|
||||
downloadRequest = downloader->Get(
|
||||
"core.zip",
|
||||
WAGIC_RESOURCE_URL
|
||||
);
|
||||
#endif
|
||||
#ifdef QT_WIDGET
|
||||
g_glwidget = new WagicCore();
|
||||
g_glwidget->connect(&fileDownloader, SIGNAL(finished(int)), SLOT(start(int)));
|
||||
if(!downloadRequest || downloadRequest->getDownloadStatus() == DownloadRequest::DOWNLOADED)
|
||||
{
|
||||
g_glwidget->start(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_glwidget->connect(downloadRequest, SIGNAL(statusChanged(int)), SLOT(start(int)));
|
||||
}
|
||||
#else
|
||||
qmlRegisterType<WagicCore>("CustomComponents", 1, 0, "WagicCore");
|
||||
|
||||
|
||||
+14
-1
@@ -78,7 +78,20 @@ extern "C" void Java_org_libsdl_app_SDLActivity_nativeResume(
|
||||
{
|
||||
if (!g_engine)
|
||||
return;
|
||||
g_engine->Resume();
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -80,7 +80,6 @@ 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;
|
||||
@@ -307,7 +306,7 @@ public class SDLActivity extends Activity implements OnKeyListener
|
||||
|
||||
private void startDownload()
|
||||
{
|
||||
String url = RES_URL + RES_FILENAME;
|
||||
String url = getResourceUrl();
|
||||
if (!checkStorageState())
|
||||
{
|
||||
Log.e(TAG, "Error in initializing storage space.");
|
||||
@@ -437,7 +436,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 = "core_" + versionCodeString + ".zip";
|
||||
RES_FILENAME = getResourceName();
|
||||
|
||||
StorageOptions.determineStorageOptions();
|
||||
checkStorageLocationPreference();
|
||||
@@ -525,6 +524,9 @@ 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();
|
||||
|
||||
@@ -28204,7 +28204,7 @@ subtype=Equipment
|
||||
[card]
|
||||
name=Executioner's Swing
|
||||
text=Target creature that dealt damage this turn gets -5/-5 until end of turn.
|
||||
target=creature[damaged]
|
||||
target=creature[damager]
|
||||
auto=-5/-5 ueot
|
||||
mana={W}{B}
|
||||
type=Instant
|
||||
@@ -37166,7 +37166,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Grave Pact
|
||||
auto=@movedTo(creature|mygraveyard) from(mybattlefield):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ opponent
|
||||
auto=@movedTo(creature|graveyard) from(mybattlefield):ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ opponent
|
||||
text=Whenever a creature you control dies, each other player sacrifices a creature.
|
||||
mana={1}{B}{B}{B}
|
||||
type=Enchantment
|
||||
@@ -104298,4 +104298,4 @@ type=Land Creature
|
||||
subtype=Forest Dryad
|
||||
power=1
|
||||
toughness=1
|
||||
[/card]
|
||||
[/card]
|
||||
|
||||
@@ -308,6 +308,9 @@ 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
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
#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]
|
||||
@@ -0,0 +1,42 @@
|
||||
#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]
|
||||
@@ -0,0 +1,34 @@
|
||||
#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]
|
||||
@@ -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,7 +90,9 @@ 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_VERSION_STRING ".zip"
|
||||
#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
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -64,6 +64,7 @@ class CardDescriptor: public MTGCardInstance
|
||||
string compareName;
|
||||
int CDopponentDamaged;
|
||||
int CDcontrollerDamaged;
|
||||
int CDdamager;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -65,6 +65,7 @@ public:
|
||||
bool wasDealtDamage;
|
||||
bool damageToOpponent;
|
||||
bool damageToController;
|
||||
bool damageToCreature;
|
||||
bool mPropertiesChangedSinceLastUpdate;
|
||||
int reduxamount;
|
||||
int flanked;
|
||||
|
||||
@@ -4723,14 +4723,15 @@ 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";
|
||||
}
|
||||
|
||||
@@ -5703,7 +5704,8 @@ void ATutorialMessage::Update(float dt)
|
||||
|
||||
mElapsed += dt;
|
||||
|
||||
IconButtonsController::Update(dt);
|
||||
if(!mUserCloseRequest)
|
||||
IconButtonsController::Update(dt);
|
||||
|
||||
if (mIsImage)
|
||||
return;
|
||||
|
||||
@@ -23,6 +23,7 @@ CardDescriptor::CardDescriptor()
|
||||
colorComparisonMode = COMPARISON_NONE;
|
||||
CDopponentDamaged = 0;
|
||||
CDcontrollerDamaged = 0;
|
||||
CDdamager = 0;
|
||||
}
|
||||
|
||||
int CardDescriptor::init()
|
||||
@@ -226,16 +227,27 @@ MTGCardInstance * CardDescriptor::match(MTGCardInstance * card)
|
||||
{
|
||||
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 ((CDdamager == -1 && (card->damageToOpponent || card->damageToController || card->damageToCreature))
|
||||
|| (CDdamager == 1 && !(card->damageToOpponent || card->damageToController || card->damageToCreature)))
|
||||
{
|
||||
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(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()))
|
||||
{
|
||||
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()))
|
||||
{
|
||||
match = NULL;
|
||||
}
|
||||
|
||||
@@ -1224,6 +1224,18 @@ 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?
|
||||
|
||||
@@ -192,8 +192,10 @@ 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())
|
||||
|
||||
@@ -795,6 +795,7 @@ 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++)
|
||||
|
||||
@@ -215,34 +215,39 @@ void GameStateOptions::Render()
|
||||
const char * const CreditsText[] = {
|
||||
"Wagic, The Homebrew?! by Wololo",
|
||||
"",
|
||||
"updates, new cards, and more on http://wololo.net/wagic",
|
||||
"Updates, new cards, and more on http://wololo.net/wagic",
|
||||
"Many thanks to the people who help this project",
|
||||
"",
|
||||
"",
|
||||
"Art: Ilya B, Julio, Jeck, J, Kaioshin, Lakeesha",
|
||||
"Art:",
|
||||
"Ilya B, Julio, Jeck, J, Kaioshin, Lakeesha",
|
||||
"Check themeinfo.txt for the full credits of each theme!",
|
||||
"",
|
||||
"Dev Team:",
|
||||
"Abrasax, Almosthumane, Daddy32, DJardin, Dr.Solomat,",
|
||||
"J, Jeck, kevlahnota, Leungclj, linshier, Mootpoint, Mnguyen,",
|
||||
"Psyringe, Salmelo, Superhiro, Wololo, Yeshua, Zethfox",
|
||||
"Abrasax, Almosthumane, Daddy32, DJardin, Dr.Solomat, J, Jeck,",
|
||||
"kevlahnota, Leungclj, linshier, Mootpoint, Mnguyen, Psyringe,",
|
||||
"Rolzad73, Salmelo, Superhiro, Wololo, Yeshua, Zethfox",
|
||||
"",
|
||||
"Music by Celestial Aeon Project, http://www.jamendo.com",
|
||||
"",
|
||||
"Deck Builders: Abrasax, AzureKnight, colarchon",
|
||||
"Excessum, Hehotfarv, Jeremy, Jog1118, JonyAS",
|
||||
"Lachaux, Link17, Muddobbers, Nakano, Niegen",
|
||||
"Kaioshin, Psyringe, r1c47, Superhiro, Szei",
|
||||
"Thanatos02, Whismer, Wololo",
|
||||
"Deck Builders:",
|
||||
"Abrasax, AzureKnight, colarchon, Excessum, Hehotfarv,",
|
||||
"Jeremy, Jog1118, JonyAS, Lachaux, Link17, Muddobbers,",
|
||||
"Nakano, Niegen, Kaioshin, Psyringe, r1c47, Superhiro,",
|
||||
"Szei, Thanatos02, Whismer, Wololo",
|
||||
"",
|
||||
"Thanks also go to Dr.Watson, Orine, Raphael, Sakya, Tyranid",
|
||||
"for their help.",
|
||||
"",
|
||||
"Thanks to everyone who contributes code/content on the forums!",
|
||||
"",
|
||||
"Developed with the JGE++ Library (http://code.google.com/p/wagic)",
|
||||
"",
|
||||
"Source:",
|
||||
"http://code.google.com/p/wagic (2009-2013)",
|
||||
"https://github.com/WagicProject/wagic (2013- )",
|
||||
"",
|
||||
"Developed with the JGE++ Library",
|
||||
"SFX From www.soundsnap.com",
|
||||
|
||||
"",
|
||||
"",
|
||||
"This work is not related to or endorsed by Wizards of the Coast, Inc",
|
||||
|
||||
@@ -158,6 +158,7 @@ void MTGCardInstance::initMTGCI()
|
||||
auras = 0;
|
||||
damageToOpponent = false;
|
||||
damageToController = false;
|
||||
damageToCreature = false;
|
||||
wasDealtDamage = false;
|
||||
isDualWielding = false;
|
||||
suspended = false;
|
||||
|
||||
@@ -485,6 +485,18 @@ TargetChooser * TargetChooserFactory::createTargetChooser(string s, MTGCardInsta
|
||||
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?
|
||||
|
||||
@@ -41,8 +41,8 @@ INCLUDEPATH += ../../Boost
|
||||
INCLUDEPATH += include
|
||||
|
||||
unix:!symbian:LIBS += -lz
|
||||
win32:LIBS += ../../JGE/Dependencies/lib/fmodvc.lib
|
||||
win32:LIBS += ../../JGE/Dependencies/lib/zlibd.lib
|
||||
windows:LIBS += ../../JGE/Dependencies/lib/fmodvc.lib
|
||||
windows:LIBS += ../../JGE/Dependencies/lib/zlibd.lib
|
||||
PRECOMPILED_HEADER = include/PrecompiledHeader.h
|
||||
|
||||
#DEFINES += TRACK_OBJECT_USAGE
|
||||
@@ -283,6 +283,7 @@ HEADERS += \
|
||||
|
||||
# JGE, could probably be moved outside
|
||||
SOURCES += \
|
||||
../../JGE/src/Downloader.cpp\
|
||||
../../JGE/src/Encoding.cpp\
|
||||
../../JGE/src/JAnimator.cpp\
|
||||
../../JGE/src/JApp.cpp\
|
||||
@@ -320,6 +321,7 @@ SOURCES += \
|
||||
../../JGE/src/zipFS/zstream.cpp
|
||||
|
||||
HEADERS += \
|
||||
../../JGE/include/Downloader.h\
|
||||
../../JGE/include/Threading.h\
|
||||
../../JGE/include/decoder_prx.h\
|
||||
../../JGE/include/DebugRoutines.h\
|
||||
|
||||
+16
-1
@@ -5,6 +5,21 @@ echo PSPDEV = $PSPDEV
|
||||
echo psp-config = `psp-config --psp-prefix`
|
||||
echo ls = `ls`
|
||||
echo pwd = `pwd`
|
||||
# computing potential release name
|
||||
echo TRAVIS_PULL_REQUEST = $TRAVIS_PULL_REQUEST
|
||||
echo TRAVIS_BRANCH = $TRAVIS_BRANCH
|
||||
|
||||
if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
|
||||
if [ "$TRAVIS_BRANCH" = "alphas" ]; then
|
||||
export RELEASE_NAME="alpha-${TRAVIS_BUILD_NUMBER}"
|
||||
else if [ "$TRAVIS_BRANCH" = "master" ]; then
|
||||
export RELEASE_NAME="latest-master"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
echo RELEASE_NAME = $RELEASE_NAME
|
||||
|
||||
|
||||
# updating versions with the TRAVIS build numbers
|
||||
cd projects/mtg/
|
||||
@@ -49,7 +64,7 @@ ant debug -f projects/mtg/Android/build.xml
|
||||
# we're building a Qt version with GUI here
|
||||
mkdir qt-gui-build
|
||||
cd qt-gui-build
|
||||
qmake ../projects/mtg/wagic-qt.pro CONFIG+=release CONFIG+=graphics
|
||||
qmake ../projects/mtg/wagic-SDL.pro CONFIG+=release CONFIG+=graphics
|
||||
make -j 8
|
||||
cd ..
|
||||
|
||||
|
||||
+8
-8
@@ -10,28 +10,28 @@ if [ "$TRAVIS_BRANCH" == "alphas" ]; then
|
||||
-H "Accept: application/vnd.github.manifold-preview" \
|
||||
-H "Content-Type: application/zip" \
|
||||
--data-binary @core.zip \
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-core-${TRAVIS_BUILD_NUMBER}.zip"
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-core.zip"
|
||||
|
||||
echo -e "Uploading android package\n"
|
||||
curl -X POST -H "Authorization: token ${GH_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.manifold-preview" \
|
||||
-H "Content-Type: application/zip" \
|
||||
--data-binary @projects/mtg/Android/bin/Wagic-debug.apk \
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-android-${TRAVIS_BUILD_NUMBER}.apk"
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-android.apk"
|
||||
|
||||
echo -e "Uploading PSP package\n"
|
||||
curl -X POST -H "Authorization: token ${GH_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.manifold-preview" \
|
||||
-H "Content-Type: application/zip" \
|
||||
--data-binary @projects/mtg/psprelease.zip \
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-psp-${TRAVIS_BUILD_NUMBER}.zip"
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-psp.zip"
|
||||
|
||||
echo -e "Uploading Windows package\n"
|
||||
curl -X POST -H "Authorization: token ${GH_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.manifold-preview" \
|
||||
-H "Content-Type: application/zip" \
|
||||
--data-binary @build/win-cross/win-cross.zip \
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-windows-${TRAVIS_BUILD_NUMBER}.zip"
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-windows.zip"
|
||||
|
||||
echo -e "Done uploading\n"
|
||||
fi
|
||||
@@ -71,28 +71,28 @@ if [ "$TRAVIS_BRANCH" == "master" ]; then
|
||||
-H "Accept: application/vnd.github.manifold-preview" \
|
||||
-H "Content-Type: application/zip" \
|
||||
--data-binary @core.zip \
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-core-${TRAVIS_BUILD_NUMBER}.zip"
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-core.zip"
|
||||
|
||||
echo -e "Uploading android package\n"
|
||||
curl -X POST -H "Authorization: token ${GH_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.manifold-preview" \
|
||||
-H "Content-Type: application/zip" \
|
||||
--data-binary @projects/mtg/Android/bin/Wagic-debug.apk \
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-android-${TRAVIS_BUILD_NUMBER}.apk"
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-android.apk"
|
||||
|
||||
echo -e "Uploading PSP package\n"
|
||||
curl -X POST -H "Authorization: token ${GH_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.manifold-preview" \
|
||||
-H "Content-Type: application/zip" \
|
||||
--data-binary @projects/mtg/psprelease.zip \
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-psp-${TRAVIS_BUILD_NUMBER}.zip"
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-psp.zip"
|
||||
|
||||
echo -e "Uploading Windows package\n"
|
||||
curl -X POST -H "Authorization: token ${GH_TOKEN}" \
|
||||
-H "Accept: application/vnd.github.manifold-preview" \
|
||||
-H "Content-Type: application/zip" \
|
||||
--data-binary @build/win-cross/win-cross.zip \
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-windows-${TRAVIS_BUILD_NUMBER}.zip"
|
||||
"https://uploads.github.com/repos/WagicProject/wagic/releases/${IDDI}/assets?name=Wagic-windows.zip"
|
||||
|
||||
echo -e "Done uploading\n"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user