Jeck - Cache and resource manager merged, streamlined.

This is pretty major, so there'll probably be something wrong with it... even though I did spend a few hours looking.
NOTES:
 * If you've Retrieved it, don't delete it--- Use resources.Release(Whatever). 
    Textures automatically release subordinate quads.
 * Most of the time, use resources.RetrieveQuad to grab a quad. Should handle everything for you.
    RetrieveQuad will load the required texture, if needed.
    Only managed resources have a resource name ("back", "simon", etc). 
    Managed resources can be retrieved with GetTexture/GetQuad/GetWhatever.
    Non managed quads lookup by position/dimensions, defaulting to the whole texture.
 * Use resources.RetrieveTexture only when you need to do something special to it. 
    Calling retrieve texture with RETRIEVE_MANAGE will permanently add a texture to the manager
    RETRIEVE_LOCK and RETRIEVE_VRAM will lock a texture. It will not leave the cache until
    Release(JTexture*) is called, or as a last resort during cache overflow.
 * Try to only store (as a class member) pointers to textures retrieved with RETRIEVE_MANAGE. 
    All others may become invalid, although locked textures do have a high degree of stability. It's
    pretty safe to store a locked texture if you're not going to load much between uses.

There's a lot going on here, so I might have missed something... but it runs through the test suite alright.

TODO: 
 * When called without any arguments, RetrieveQuad sometimes leaves a thin border around the image. 
    This can be bypassed by specifying a quad one or two pixels less than the image size. Why?
 * I've had a crash while runing the Demo mode, something to do with receiveEventMinus? 
    This hasn't exactly reproduced on a clean SVN copy, (being a hang, rather than a crash) so 
    I've probably done something to worsen the problem somehow? I'll look into it tomorrow.
 * Clean up lock/unlock system, memory usage. Streamline interface, consider phasing out calls using GetWhatever() format.
This commit is contained in:
wagic.jeck
2009-09-03 09:28:16 +00:00
parent 7214248494
commit f220d2e9b9
49 changed files with 1587 additions and 1233 deletions

View File

@@ -26,8 +26,6 @@ using namespace std;
#define INVALID_ID -1
class JRenderer;
class JParticleEffect;
class JMotionEmitter;
class JSample;
class JMusic;
class JTexture;
@@ -38,33 +36,30 @@ class JResourceManager
{
public:
JResourceManager();
~JResourceManager();
virtual ~JResourceManager();
//void SetResourceRoot(const string& resourceRoot);
bool LoadResource(const string& resourceName);
void RemoveAll();
void RemoveGraphics();
void RemoveSound();
void RemoveFont();
int CreateTexture(const string &textureName);
virtual int CreateTexture(const string &textureName);
JTexture* GetTexture(const string &textureName);
JTexture* GetTexture(int id);
int CreateQuad(const string &quadName, const string &textureName, float x, float y, float width, float height);
virtual int CreateQuad(const string &quadName, const string &textureName, float x, float y, float width, float height);
JQuad* GetQuad(const string &quadName);
JQuad* GetQuad(int id);
int LoadJLBFont(const string &fontName, int height);
virtual int LoadJLBFont(const string &fontName, int height);
JLBFont* GetJLBFont(const string &fontName);
JLBFont* GetJLBFont(int id);
int LoadMusic(const string &musicName);
virtual int LoadMusic(const string &musicName);
JMusic* GetMusic(const string &musicName);
JMusic* GetMusic(int id);
int LoadSample(const string &sampleName);
virtual int LoadSample(const string &sampleName);
JSample* GetSample(const string &sampleName);
JSample* GetSample(int id);
@@ -76,7 +71,7 @@ public:
// JMotionEmitter* GetMotionEmitter(const string &emitterName);
// JMotionEmitter* GetMotionEmitter(int id);
private:
protected:
//JRenderer *mRenderer;

View File

@@ -16,6 +16,13 @@
#include "../include/JLBFont.h"
#include "tinyxml/tinyxml.h"
#if defined (_DEBUG) && defined (WIN32)
#include "crtdbg.h"
#define NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define NEW new
#endif
JResourceManager::JResourceManager()
{
//mResourceRoot = "Res/"; // default root folder
@@ -299,7 +306,7 @@ int JResourceManager::CreateQuad(const string &quadName, const string &textureNa
printf("creating quad:%s\n", quadName.c_str());
int id = mQuadList.size();
mQuadList.push_back(new JQuad(tex, x, y, width, height));
mQuadList.push_back(NEW JQuad(tex, x, y, width, height));
mQuadMap[quadName] = id;
@@ -343,7 +350,7 @@ int JResourceManager::LoadJLBFont(const string &fontName, int height)
int id = mFontList.size();
///////////////////////////////////////
mFontList.push_back(new JLBFont(path.c_str(), height, true));
mFontList.push_back(NEW JLBFont(path.c_str(), height, true));
mFontMap[fontName] = id;

View File

@@ -1,4 +1,4 @@
OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/Blocker.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardSelector.o objs/ConstraintResolver.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateDuel.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGRules.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PriceList.o objs/ReplacementEffects.o objs/ShopItem.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/TexturesCache.o objs/SimplePad.o objs/Token.o objs/Translate.o objs/utils.o objs/WEvent.o objs/WResourceManager.o
OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/Blocker.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardSelector.o objs/ConstraintResolver.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateDuel.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGRules.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PriceList.o objs/ReplacementEffects.o objs/ShopItem.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/SimplePad.o objs/Token.o objs/Translate.o objs/utils.o objs/WEvent.o objs/WResourceManager.o
DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS))
RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache)

View File

@@ -29,8 +29,6 @@
#include "../include/MTGCard.h"
#include "../include/MTGGameZones.h"
#include "../include/TexturesCache.h"
#include "../include/CardEffect.h"
#define MAX_STATE 6
@@ -47,11 +45,6 @@
#define GAME_TYPE_RANDOM2 3
class MTGAllCards;
class TexturesCache;
class GameApp: public JApp
{
@@ -83,7 +76,6 @@ class GameApp: public JApp
void LoadGameStates();
void SetNextState(int state);
static WResourceManager * CommonRes;
static hgeParticleSystem * Particles[6];
static int HasMusic;
static string systemError;

View File

@@ -8,7 +8,7 @@
#include "../include/GameState.h"
#include "../include/SimpleMenu.h"
#include "../include/TexturesCache.h"
#include "../include/WResourceManager.h"
#include "../include/CardGui.h"
#include "../include/GameOptions.h"
#include "../include/PriceList.h"
@@ -144,13 +144,11 @@ class GameStateDeckViewer: public GameState, public JGuiListener
pricelist = NEW PriceList(RESPATH"/settings/prices.dat",mParent->collection);
playerdata = NEW PlayerData(mParent->collection);
sellMenu = NULL;
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), &cache,mParent->collection));
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection));
displayed_deck = myCollection;
myDeck = NULL;
menuFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
menuFont = resources.GetJLBFont(Constants::MENU_FONT);
mFont = resources.GetJLBFont(Constants::MAIN_FONT);
menu = NEW SimpleMenu(11,this,menuFont,SCREEN_WIDTH/2-100,20);
@@ -160,29 +158,29 @@ class GameStateDeckViewer: public GameState, public JGuiListener
//icon images
mIcons[Constants::MTG_COLOR_ARTIFACT] = GameApp::CommonRes->GetQuad("c_artifact");
mIcons[Constants::MTG_COLOR_LAND] = GameApp::CommonRes->GetQuad("c_land");
mIcons[Constants::MTG_COLOR_WHITE] = GameApp::CommonRes->GetQuad("c_white");
mIcons[Constants::MTG_COLOR_RED] = GameApp::CommonRes->GetQuad("c_red");
mIcons[Constants::MTG_COLOR_BLACK] = GameApp::CommonRes->GetQuad("c_black");
mIcons[Constants::MTG_COLOR_BLUE] = GameApp::CommonRes->GetQuad("c_blue");
mIcons[Constants::MTG_COLOR_GREEN] = GameApp::CommonRes->GetQuad("c_green");
mIcons[Constants::MTG_COLOR_ARTIFACT] = resources.GetQuad("c_artifact");
mIcons[Constants::MTG_COLOR_LAND] = resources.GetQuad("c_land");
mIcons[Constants::MTG_COLOR_WHITE] = resources.GetQuad("c_white");
mIcons[Constants::MTG_COLOR_RED] = resources.GetQuad("c_red");
mIcons[Constants::MTG_COLOR_BLACK] = resources.GetQuad("c_black");
mIcons[Constants::MTG_COLOR_BLUE] = resources.GetQuad("c_blue");
mIcons[Constants::MTG_COLOR_GREEN] = resources.GetQuad("c_green");
for (int i=0; i < 7; i++){
mIcons[i]->SetHotSpot(16,16);
}
pspIconsTexture = GameApp::CommonRes->LoadTexture("iconspsp.png", TEX_TYPE_USE_VRAM);
//Grab a texture in VRAM.
pspIconsTexture = resources.RetrieveTexture("iconspsp.png",RETRIEVE_VRAM);
for (int i=0; i < 8; i++){
pspIcons[i] = NEW JQuad(pspIconsTexture, i*32, 0, 32, 32);
pspIcons[i] = resources.RetrieveQuad("iconspsp.png", i*32, 0, 32, 32);
pspIcons[i]->SetHotSpot(16,16);
}
backQuad = GameApp::CommonRes->GetQuad("back");
backQuad = resources.GetQuad("back");
//menuFont = NEW JLBFont("graphics/f3",16);
menuFont = GameApp::CommonRes->GetJLBFont("f3");
menuFont = resources.GetJLBFont("f3");
welcome_menu = NEW SimpleMenu(10,this,menuFont,20,20);
int nbDecks = fillDeckMenu(welcome_menu,options.profileFile());
welcome_menu->Add(nbDecks+1, "--NEW--");
@@ -193,7 +191,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener
JSoundSystem::GetInstance()->StopMusic(GameApp::music);
SAFE_DELETE(GameApp::music);
}
GameApp::music = GameApp::CommonRes->ssLoadMusic("track1.mp3");
GameApp::music = resources.ssLoadMusic("track1.mp3");
if (GameApp::music){
JSoundSystem::GetInstance()->PlayMusic(GameApp::music, true);
}
@@ -225,9 +223,10 @@ class GameStateDeckViewer: public GameState, public JGuiListener
}
SAFE_DELETE(welcome_menu);
SAFE_DELETE(menu);
SAFE_DELETE(pspIconsTexture);
resources.Release(pspIconsTexture);
for (int i=0; i < 8; i++){
SAFE_DELETE(pspIcons[i]);
pspIcons[i] = NULL; //The quads these point to are released with the texture.
}
SAFE_DELETE(myCollection);
SAFE_DELETE(myDeck);
@@ -505,7 +504,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener
}
void renderOnScreenMenu(){
JLBFont * font = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * font = resources.GetJLBFont(Constants::MAIN_FONT);
font->SetColor(ARGB(255,255,255,255));
JRenderer * r = JRenderer::GetInstance();
float pspIconsSize = 0.5;
@@ -617,15 +616,10 @@ class GameStateDeckViewer: public GameState, public JGuiListener
JQuad * quad = backQuad;
int showName = 1;
if (cache.isInCache(card) || last_user_activity > (abs(2-id) + 1)* NO_USER_ACTIVITY_SHOWCARD_DELAY){
quad = cache.getQuad(card);
showName = 0;
}
quad = resources.RetrieveCard(card);
if (quad){
showName = 0;
int quadAlpha = alpha;
if ( !displayed_deck->cards[card]) quadAlpha /=2;
quad->SetColor(ARGB(mAlpha,quadAlpha,quadAlpha,quadAlpha));
@@ -641,7 +635,7 @@ class GameStateDeckViewer: public GameState, public JGuiListener
}else{
Pos pos = Pos(x, y, scale* 285/250, 0.0, 255);
CardGui::alternateRender(card, pos);
quad = cache.getThumb(card);
quad = resources.RetrieveCard(card,CACHE_THUMB);
if (quad){
float _scale = 285 * scale / quad->mHeight;
quad->SetColor(ARGB(40,255,255,255));
@@ -727,12 +721,12 @@ class GameStateDeckViewer: public GameState, public JGuiListener
int loadDeck(int deckid){
SAFE_DELETE(myCollection);
string profile = options[Options::ACTIVE_PROFILE].str;
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), &cache,mParent->collection));
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection));
displayed_deck = myCollection;
char deckname[256];
sprintf(deckname,"deck%i.txt",deckid);
SAFE_DELETE(myDeck);
myDeck = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(deckname).c_str(), &cache,mParent->collection));
myDeck = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(deckname).c_str(), mParent->collection));
MTGCard * current = myDeck->getNext();
while (current){
int howmanyinDeck = myDeck->cards[current];

View File

@@ -17,13 +17,10 @@ class GameStateMenu: public GameState, public JGuiListener
SimpleMenu* gameTypeMenu;
int hasChosenGameType;
JQuad * mIcons[10];
JTexture * mIconsTexture;
JTexture * bgTexture;
JTexture * movingWTexture;
JQuad * mBg;
JQuad * mMovingW;
JTexture * splashTex;
JQuad * splashQuad;
float mCreditsYPos;
int currentState;
//JMusic * bgMusic;

View File

@@ -4,7 +4,7 @@
#include "MTGCard.h"
#include "MTGGameZones.h"
#include "MTGAbility.h"
#include "TexturesCache.h"
#include "WResourceManager.h"
#include "ManaCost.h"
#include "Blocker.h"
#include "Damage.h"
@@ -15,7 +15,6 @@ class MTGCardInstance;
class MTGPlayerCards;
class MTGAbility;
class MTGCard;
class TexturesCache;
class ManaCost;
class UntapBlockers;
class CardDescriptor;

View File

@@ -5,7 +5,7 @@
#include "../include/MTGDefinitions.h"
#include "../include/GameApp.h"
#include "../include/TexturesCache.h"
#include "../include/WResourceManager.h"
#include <string>
@@ -48,16 +48,13 @@ private:
void initCounters();
public:
TexturesCache * mCache;
vector<int> ids;
map<int, MTGCard *> collection;
MTGAllCards();
~MTGAllCards();
MTGAllCards(TexturesCache * cache);
MTGCard * _(int id);
void destroyAllCards();
MTGAllCards(const char * config_file, const char * set_name);
MTGAllCards(const char * config_file, const char * set_name, TexturesCache * cache);
MTGCard * getCardById(int id);
MTGCard * getCardByName(string name);
int load(const char * config_file, const char * setName, int autoload = 1);
@@ -80,14 +77,13 @@ class MTGDeck{
int total_cards;
public:
TexturesCache * mCache;
MTGAllCards * database;
map <int,int> cards;
string meta_desc;
string meta_name;
int totalCards();
MTGDeck(TexturesCache * cache, MTGAllCards * _allcards);
MTGDeck(const char * config_file, TexturesCache * cache, MTGAllCards * _allcards, int meta_only = 0);
MTGDeck(MTGAllCards * _allcards);
MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only = 0);
int addRandomCards(int howmany, int * setIds = NULL, int nbSets = 0, int rarity = -1, const char * subtype = NULL, int * colors = NULL, int nbcolors = 0);
int add(int cardid);
int add(MTGDeck * deck); // adds the contents of "deck" into myself

View File

@@ -1,84 +0,0 @@
#ifndef _TEXTURES_CACHE_H
#define _TEXTURES_CACHE_H
#define CACHE_SIZE_PIXELS 2000000
#define CACHE_CARD 1
#define CACHE_THUMB 2
#include <JGE.h>
#include <JTypes.h>
#include <map>
using std::map;
#include "MTGDeck.h"
class MTGCard;
class CachedTexture{
protected:
JTexture* tex;
JQuad* quad;
public:
int lastTime;
int nbpixels;
JQuad * getQuad();
void init(string filename);
CachedTexture(MTGCard * card, int type);
CachedTexture(string filename);
~CachedTexture();
};
class TexturesCache{
protected:
int lastTime;
int nb_textures;
int delete_previous;
int totalsize;
map<string,CachedTexture *> cache;
public:
int isInCache(MTGCard * card, int type=CACHE_CARD);
TexturesCache();
~TexturesCache();
int removeOldestQuad();
void removeQuad(string id);
int cleanup();
CachedTexture * getCacheByCard(MTGCard * card, int type=CACHE_CARD);
JQuad * getQuad(MTGCard * card, int type=CACHE_CARD);
JQuad * getThumb(MTGCard * card){return getQuad(card, CACHE_THUMB);};
JQuad * getQuad(string path,MTGCard * card = NULL, int type=0);
};
extern TexturesCache cache;
class SampleCached{
public:
int lastTime;
JSample * sample;
SampleCached(int _lastTime, JSample * _sample):lastTime(_lastTime),sample(_sample){};
~SampleCached(){SAFE_DELETE(sample);};
};
class SampleCache{
protected:
int lastTime;
map<string, SampleCached *> cache;
static SampleCache * mInstance;
void cleanCache();
void cleanOldest();
~SampleCache();
public:
static SampleCache * GetInstance();
static void DestroyInstance();
SampleCache(){lastTime = 0;};
JSample * getSample(string filename);
};
#endif

View File

@@ -1,57 +1,127 @@
#ifndef _WRESOURCEMANAGER_H_
#define _WRESOURCEMANAGER_H_
#include <JResourceManager.h>
#include <JSoundSystem.h>
#include <JTypes.h>
#include "MTGDeck.h"
#include "MTGCard.h"
#define CACHE_SIZE_PIXELS 2000000
class WCachedResource{
public:
friend class WResourceManager;
bool isLocked(); //Is the resource locked?
void lock(); //Lock it.
void unlock(bool force = false); //Unlock it. If force, then set locks to 0.
void hit(); //Update resource last used time.
WCachedResource();
protected:
unsigned int lastTime;
unsigned char locks; //Remember to unlock when we're done using locked stuff, or else this'll be useless.
};
class WCachedTexture: public WCachedResource{
public:
friend class WResourceManager;
WCachedTexture();
~WCachedTexture();
JTexture * GetTexture(); //Return this texture as is. Does not make a new one.
JQuad * GetQuad(float offX=0.0f, float offY=0.0f, float width=0.0f, float height=0.0f); //Get us a new/existing quad.
JQuad * GetCard(float offX=0.0f, float offY=0.0f, float width=0.0f, float height=0.0f); //Same as above, but centered when new.
bool ReleaseQuad(JQuad* quad); //We're done with this quad, so delete and stop tracking. True if existed.
protected:
JTexture * texture;
vector<JQuad*> trackedQuads;
};
class WCachedSample: public WCachedResource{
public:
friend class WResourceManager;
WCachedSample();
~WCachedSample();
JSample * GetSample(); //Return this sample.
protected:
JSample * sample;
};
enum ENUM_RETRIEVE_STYLE{
RETRIEVE_EXISTING, //Only returns a resource if it already exists. Does not lock or unlock.
RETRIEVE_NORMAL, //Returns or creates a resource. Does not change lock status.
RETRIEVE_LOCK, //As above, locks cached resource.
RETRIEVE_UNLOCK, //As above, unlocks cached resource.
RETRIEVE_RESOURCE, //Only retrieves a managed resource.
RETRIEVE_VRAM, //If we create the texture, use vram.
RETRIEVE_MANAGE, //Permanently adds retrieved resource to resource manager.
};
enum ENUM_CACHE_SUBTYPE{
CACHE_CARD,
CACHE_THUMB
};
//This class is a wrapper for JResourceManager
class WResourceManager
class WResourceManager: public JResourceManager
{
public:
WResourceManager();
~WResourceManager();
//Wrapped from JResourceManager
void RemoveAll(){jrm->RemoveAll();}
void RemoveGraphics(){jrm->RemoveGraphics();}
void RemoveSound(){jrm->RemoveSound();}
void RemoveFont(){jrm->RemoveFont();}
JQuad * RetrieveCard(MTGCard * card, int type = CACHE_CARD, int style = RETRIEVE_NORMAL);
JSample * RetrieveSample(string filename, int style = RETRIEVE_NORMAL);
JTexture * RetrieveTexture(string filename, int style = RETRIEVE_NORMAL);
JQuad * RetrieveQuad(string filename, float offX=0.0f, float offY=0.0f, float width=0.0f, float height=0.0f, string resname="", int style = RETRIEVE_NORMAL);
void Release(JTexture * tex);
void Release(JQuad * quad);
void Release(JSample * sample);
int CreateTexture(const string &textureName);
JTexture* GetTexture(const string &textureName);
JTexture* GetTexture(int id);
unsigned int nowTime();
int CreateQuad(const string &quadName, const string &textureName, float x, float y, float width, float height);
JQuad* GetQuad(const string &quadName);
JQuad* GetQuad(int id);
int LoadJLBFont(const string &fontName, int height);
JLBFont* GetJLBFont(const string &fontName);
JLBFont* GetJLBFont(int id);
int LoadMusic(const string &musicName);
JMusic* GetMusic(const string &musicName);
JMusic* GetMusic(int id);
int LoadSample(const string &sampleName);
JSample* GetSample(const string &sampleName);
JSample* GetSample(int id);
//Wrapped from other bits, if we want them.
JTexture* LoadTexture(const char* filename, int mode = 0, int textureFormat = TEXTURE_FORMAT);
//Wrapped from JSoundSystem
JMusic * ssLoadMusic(const char *fileName);
JSample * ssLoadSample(const char *fileName);
//Our New redirect system.
string graphicsFile(const string filename, const string specific = "", bool bFont = false);
//Our file redirect system.
string graphicsFile(const string filename, const string specific = "");
string cardFile(const string filename, const string setname, const string specific = "");
string musicFile(const string filename, const string specific = "");
string sfxFile(const string filename, const string specific = "");
int fileOK(string filename, bool relative = false);
private:
JResourceManager * jrm;
map<string,string> stopgap;
};
//Not part of our interface, but left public to maintain JResourceManager compatibility
//These are for managed resources only.
int CreateTexture(const string &textureName);
int CreateQuad(const string &quadName, const string &textureName, float x=0.0f, float y=0.0f, float width=0.0f, float height=0.0f);
int LoadJLBFont(const string &fontName, int height);
int LoadMusic(const string &musicName);
int LoadSample(const string &sampleName);
//Wrapped from JSoundSystem. TODO: Privatize.
JMusic * ssLoadMusic(const char *fileName);
JSample * ssLoadSample(const char *fileName);
private:
bool RemoveOldestTexture();
bool RemoveOldestSample();
bool cleanup();
WCachedTexture * getCachedTexture(string filename, bool makenew = true, int mode = 0, int format = TEXTURE_FORMAT);
WCachedTexture * getCachedCard(MTGCard * card, int type = CACHE_CARD, bool makenew = true);
WCachedSample * getCachedSample(string filename, bool makenew = true);
void FlattenTimes(); //To prevent bad cache timing on int overflow
//For cached stuff
map<string,WCachedTexture*> textureCache;
map<string,WCachedSample*> sampleCache;
//Current access time.
int lastTime;
//Statistics of record.
int nb_textures;
int totalsize;
};
extern WResourceManager resources;
#endif

View File

@@ -587,7 +587,7 @@ AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * op
}
MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, collection);
MTGDeck * tempDeck = NEW MTGDeck(deckFile, collection);
MTGPlayerCards * deck = NEW MTGPlayerCards(collection,tempDeck);
delete tempDeck;
AIPlayerBaka * baka = NEW AIPlayerBaka(deck,deckFile, deckFileSmall, avatarFile);

View File

@@ -215,7 +215,7 @@ void ActionLayer::setMenuObject(Targetable * object){
SAFE_DELETE(abilitiesMenu);
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
abilitiesMenu = NEW SimpleMenu(10, this, mFont, 100, 100);
for (int i=0;i<mCount;i++){

View File

@@ -8,7 +8,7 @@
#include "../include/Damage.h"
#include "../include/ManaCost.h"
#include "../include/GameOptions.h"
#include "../include/TexturesCache.h"
#include "../include/WResourceManager.h"
#include "../include/TargetChooser.h"
#include "../include/CardGui.h"
#include "../include/Translate.h"
@@ -24,7 +24,7 @@ int NextGamePhase::resolve(){
void NextGamePhase::Render(){
int nextPhase = (GameObserver::GetInstance()->getCurrentGamePhase() + 1) % Constants::MTG_PHASE_CLEANUP;
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[200];
@@ -50,14 +50,14 @@ int StackAbility::resolve(){
return (ability->resolve());
}
void StackAbility::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[200];
sprintf(buffer, "%s", _(ability->getMenuText()).c_str());
mFont->DrawString(buffer, x + 30 , y, JGETEXT_LEFT);
JRenderer * renderer = JRenderer::GetInstance();
JQuad * quad = cache.getThumb(ability->source);
JQuad * quad = resources.RetrieveCard(ability->source,CACHE_THUMB);
if (quad){
quad->SetColor(ARGB(255,255,255,255));
float scale = 30 / quad->mHeight;
@@ -183,12 +183,12 @@ MTGCardInstance * Spell::getNextCardTarget(MTGCardInstance * previous){
}
void Spell::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
mFont->DrawString(_(source->name).c_str(), x + 30 , y, JGETEXT_LEFT);
JRenderer * renderer = JRenderer::GetInstance();
JQuad * quad = cache.getThumb(source);
JQuad * quad = resources.RetrieveCard(source,CACHE_THUMB);
if (quad){
quad->SetColor(ARGB(255,255,255,255));
float scale = mHeight / quad->mHeight;
@@ -205,7 +205,7 @@ void Spell::Render(){
// just overwrites it.
// I stole the render code from RenderBig() in CardGUI.cpp
quad = cache.getQuad(source);
quad = resources.RetrieveCard(source);
if (quad){
quad->SetColor(ARGB(220,255,255,255));
float scale = 257.f / quad->mHeight;
@@ -217,7 +217,7 @@ void Spell::Render(){
Pos pos = Pos(10 + 90, 20 + 130, 0.9f, 0.0, 255);
CardGui::alternateRender(mtgcard, pos);
quad = cache.getThumb(source);
quad = resources.RetrieveCard(source,CACHE_THUMB);
if (quad){
float scale = 250 / quad->mHeight;
quad->SetColor(ARGB(40,255,255,255));
@@ -268,7 +268,7 @@ int PutInGraveyard::resolve(){
}
void PutInGraveyard::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
if (!removeFromGame){
@@ -277,7 +277,7 @@ void PutInGraveyard::Render(){
mFont->DrawString(_("is exiled").c_str(), x + 30 , y, JGETEXT_LEFT);
}
JRenderer * renderer = JRenderer::GetInstance();
JQuad * quad = cache.getThumb(card);
JQuad * quad = resources.RetrieveCard(card,CACHE_THUMB);
if (quad){
quad->SetColor(ARGB(255,255,255,255));
float scale = 30 / quad->mHeight;
@@ -305,7 +305,7 @@ int DrawAction::resolve(){
}
void DrawAction::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[200];
@@ -789,13 +789,13 @@ void ActionStack::Render(){
if (current->state==NOT_RESOLVED) height += current->mHeight;
}
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
mFont->SetColor(ARGB(255,255,255,255));
JRenderer * renderer = JRenderer::GetInstance();
//JQuad * back = GameApp::CommonRes->GetQuad("interrupt");
//JQuad * back = resources.GetQuad("interrupt");
//float xScale = width / back->mWidth;
//float yScale = height / back->mHeight;
renderer->FillRoundRect(x0 + 16 ,y0 + 16 ,width +2 ,height +2 , 10, ARGB(128,0,0,0));
@@ -845,7 +845,7 @@ void ActionStack::Render(){
if (current->display) height += current->mHeight;
}
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);

View File

@@ -32,7 +32,7 @@ void CardGui::Update(float dt)
void CardGui::Render()
{
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
JRenderer * renderer = JRenderer::GetInstance();
GameObserver * game = GameObserver::GetInstance();
@@ -40,31 +40,31 @@ void CardGui::Render()
TargetChooser * tc = NULL;
if (game) tc = game->getCurrentTargetChooser();
JQuad * quad = cache.getThumb(card);
JQuad * quad = resources.RetrieveCard(card,CACHE_THUMB);
if (quad) {
const float scale = actZ * 40 / quad->mHeight;
renderer->RenderQuad(GameApp::CommonRes->GetQuad("shadow"), actX + (scale-1)*15, actY + (scale-1)*15, actT, 28*scale, 40*scale);
renderer->RenderQuad(resources.GetQuad("shadow"), actX + (scale-1)*15, actY + (scale-1)*15, actT, 28*scale, 40*scale);
quad->SetColor(ARGB(static_cast<unsigned char>(actA),255,255,255));
renderer->RenderQuad(quad, actX, actY, actT, scale, scale);
}
else {
const float scale = actZ;
renderer->RenderQuad(GameApp::CommonRes->GetQuad("shadow"), actX + (scale-1)*15, actY + (scale-1)*15, actT, 28*scale, 40*scale);
renderer->RenderQuad(resources.GetQuad("shadow"), actX + (scale-1)*15, actY + (scale-1)*15, actT, 28*scale, 40*scale);
mFont->SetColor(ARGB(static_cast<unsigned char>(actA), 0, 0, 0));
JQuad * icon = NULL;
if (card->hasSubtype("plains"))
icon = GameApp::CommonRes->GetQuad("c_white");
icon = resources.GetQuad("c_white");
else if (card->hasSubtype("swamp"))
icon = GameApp::CommonRes->GetQuad("c_black");
icon = resources.GetQuad("c_black");
else if (card->hasSubtype("forest"))
icon = GameApp::CommonRes->GetQuad("c_green");
icon = resources.GetQuad("c_green");
else if (card->hasSubtype("mountain"))
icon = GameApp::CommonRes->GetQuad("c_red");
icon = resources.GetQuad("c_red");
else if (card->hasSubtype("island"))
icon = GameApp::CommonRes->GetQuad("c_blue");
icon = resources.GetQuad("c_blue");
if (icon) icon->SetHotSpot(16,16);
JQuad* q = alternateThumbQuad(card);
@@ -96,13 +96,15 @@ JQuad * CardGui::alternateThumbQuad(MTGCard * card){
JQuad * q;
switch(card->getColor())
{
case Constants::MTG_COLOR_GREEN: q = cache.getQuad("sets/green_thumb.jpg");break;
case Constants::MTG_COLOR_BLUE : q = cache.getQuad("sets/blue_thumb.jpg");break;
case Constants::MTG_COLOR_RED : q = cache.getQuad("sets/red_thumb.jpg");break;
case Constants::MTG_COLOR_BLACK: q = cache.getQuad("sets/black_thumb.jpg");break;
case Constants::MTG_COLOR_WHITE: q = cache.getQuad("sets/white_thumb.jpg");break;
default: q = cache.getQuad("sets/black_thumb.jpg");break;
case Constants::MTG_COLOR_GREEN: q = resources.RetrieveQuad("green_thumb.jpg");break;
case Constants::MTG_COLOR_BLUE : q = resources.RetrieveQuad("blue_thumb.jpg");break;
case Constants::MTG_COLOR_RED : q = resources.RetrieveQuad("red_thumb.jpg");break;
case Constants::MTG_COLOR_BLACK: q = resources.RetrieveQuad("black_thumb.jpg");break;
case Constants::MTG_COLOR_WHITE: q = resources.RetrieveQuad("white_thumb.jpg");break;
default: q = resources.RetrieveQuad("black_thumb.jpg");break;
}
if(q && q->mTex)
q->SetHotSpot(q->mTex->mWidth/2,q->mTex->mHeight/2);
return q;
}
@@ -112,19 +114,22 @@ void CardGui::alternateRender(MTGCard * card, const Pos& pos){
JQuad * q;
switch(card->getColor())
{
case Constants::MTG_COLOR_GREEN: q = cache.getQuad("sets/green.jpg");break;
case Constants::MTG_COLOR_BLUE : q = cache.getQuad("sets/blue.jpg");break;
case Constants::MTG_COLOR_RED : q = cache.getQuad("sets/red.jpg");break;
case Constants::MTG_COLOR_BLACK: q = cache.getQuad("sets/black.jpg");break;
case Constants::MTG_COLOR_WHITE: q = cache.getQuad("sets/white.jpg");break;
default: q = cache.getQuad("sets/black.jpg");break;
case Constants::MTG_COLOR_GREEN: q = resources.RetrieveQuad("green.jpg");break;
case Constants::MTG_COLOR_BLUE : q = resources.RetrieveQuad("blue.jpg");break;
case Constants::MTG_COLOR_RED : q = resources.RetrieveQuad("red.jpg");break;
case Constants::MTG_COLOR_BLACK: q = resources.RetrieveQuad("black.jpg");break;
case Constants::MTG_COLOR_WHITE: q = resources.RetrieveQuad("white.jpg");break;
default: q = resources.RetrieveQuad("black.jpg");break;
}
if(q && q->mTex)
q->SetHotSpot(q->mTex->mWidth/2,q->mTex->mHeight/2);
float scale = pos.actZ * 250 / q->mHeight;
q->SetColor(ARGB((int)pos.actA,255,255,255));
renderer->RenderQuad(q, pos.actX, pos.actY, pos.actT, scale, scale);
// Write the title
JLBFont * font = GameApp::CommonRes->GetJLBFont("magic");
JLBFont * font = resources.GetJLBFont("magic");
float backup_scale = font->GetScale();
font->SetColor(ARGB((int)pos.actA, 0, 0, 0));
font->SetScale(0.8 * pos.actZ);
@@ -217,7 +222,7 @@ void CardGui::alternateRender(MTGCard * card, const Pos& pos){
void CardGui::RenderBig(const Pos& pos){
JRenderer * renderer = JRenderer::GetInstance();
JQuad * quad = cache.getQuad(card);
JQuad * quad = resources.RetrieveCard(card);
if (quad){
quad->SetColor(ARGB((int)pos.actA,255,255,255));
float scale = pos.actZ * 257.f / quad->mHeight;
@@ -226,7 +231,7 @@ void CardGui::RenderBig(const Pos& pos){
}
JQuad * q;
if ((q = cache.getThumb(card)))
if ((q = resources.RetrieveCard(card,CACHE_THUMB)))
{
float scale = pos.actZ * 250 / q->mHeight;
q->SetColor(ARGB((int)pos.actA,255,255,255));

View File

@@ -27,8 +27,7 @@
}
Credits::~Credits(){
SAFE_DELETE(unlockedTex);
SAFE_DELETE(unlockedQuad);
resources.Release(unlockedTex);
for (unsigned int i = 0; i<bonus.size(); ++i)
if (bonus[i])
delete bonus[i];
@@ -74,28 +73,28 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){
if (unlocked == -1){
unlocked = isDifficultyUnlocked();
if (unlocked){
unlockedTex = GameApp::CommonRes->LoadTexture("unlocked.png", TEX_TYPE_USE_VRAM);
unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96);
unlockedTex = resources.RetrieveTexture("unlocked.png", RETRIEVE_VRAM);
unlockedQuad = resources.RetrieveQuad("unlocked.png", 2, 2, 396, 96);
options[Options::DIFFICULTY_MODE_UNLOCKED] = GameOption(1);
options.save();
} else if ((unlocked = isMomirUnlocked())) {
unlockedTex = GameApp::CommonRes->LoadTexture("momir_unlocked.png", TEX_TYPE_USE_VRAM);
unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96);
unlockedTex = resources.RetrieveTexture("momir_unlocked.png", RETRIEVE_VRAM);
unlockedQuad = resources.RetrieveQuad("momir_unlocked.png", 2, 2, 396, 96);
options[Options::MOMIR_MODE_UNLOCKED] = GameOption(1);
options.save();
} else if ((unlocked = isEvilTwinUnlocked())) {
unlockedTex = GameApp::CommonRes->LoadTexture("eviltwin_unlocked.png", TEX_TYPE_USE_VRAM);
unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96);
unlockedTex = resources.RetrieveTexture("eviltwin_unlocked.png", RETRIEVE_VRAM);
unlockedQuad = resources.RetrieveQuad("eviltwin_unlocked.png", 2, 2, 396, 96);
options[Options::EVILTWIN_MODE_UNLOCKED] = GameOption(1);
options.save();
}else if((unlocked = isRandomDeckUnlocked())) {
unlockedTex = GameApp::CommonRes->LoadTexture("randomdeck_unlocked.png", TEX_TYPE_USE_VRAM);
unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96);
unlockedTex = resources.RetrieveTexture("randomdeck_unlocked.png", RETRIEVE_VRAM);
unlockedQuad = resources.RetrieveQuad("randomdeck_unlocked.png", 2, 2, 396, 96);
options[Options::RANDOMDECK_MODE_UNLOCKED] = GameOption(1);
options.save();
}else if((unlocked = unlockRandomSet())) {
unlockedTex = GameApp::CommonRes->LoadTexture("set_unlocked.png", TEX_TYPE_USE_VRAM);
unlockedQuad = NEW JQuad(unlockedTex, 2, 2, 396, 96);
unlockedTex = resources.RetrieveTexture("set_unlocked.png", RETRIEVE_VRAM);
unlockedQuad = resources.RetrieveQuad("set_unlocked.png", 2, 2, 396, 96);
char buffer[4096];
unlockedString = MtgSets::SetsList->values[unlocked -1];
sprintf(buffer,"unlocked_%s", unlockedString.c_str());
@@ -103,7 +102,7 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){
options.save();
}
if (unlocked){
JSample * sample = SampleCache::GetInstance()->getSample("bonus.wav");
JSample * sample = resources.RetrieveSample("bonus.wav");
if (sample) JSoundSystem::GetInstance()->PlaySample(sample);
}
}
@@ -131,9 +130,9 @@ void Credits::compute(Player * _p1, Player * _p2, GameApp * _app){
void Credits::Render(){
GameObserver * g = GameObserver::GetInstance();
JRenderer * r = JRenderer::GetInstance();
JLBFont * f = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * f2 = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
JLBFont * f3 = GameApp::CommonRes->GetJLBFont(Constants::MAGIC_FONT);
JLBFont * f = resources.GetJLBFont(Constants::MAIN_FONT);
JLBFont * f2 = resources.GetJLBFont(Constants::MENU_FONT);
JLBFont * f3 = resources.GetJLBFont(Constants::MAGIC_FONT);
f->SetScale(1);
f2->SetScale(1);
f3->SetScale(1);

View File

@@ -4,7 +4,7 @@
#include "../include/Counters.h"
#include "../include/WEvent.h"
#include "../include/Translate.h"
#include "../include/TexturesCache.h"
#include "../include/WResourceManager.h"
Damage::Damage(MTGCardInstance * source, Damageable * target) {
init(source, target, source->getPower());
@@ -62,14 +62,14 @@ int Damage::resolve(){
}
void Damage::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[200];
sprintf(buffer, _("Deals %i damage to").c_str(), damage);
mFont->DrawString(buffer, x + 20 , y, JGETEXT_LEFT);
JRenderer * renderer = JRenderer::GetInstance();
JQuad * quad = cache.getThumb(source);
JQuad * quad = resources.RetrieveCard(source,CACHE_THUMB);
if (quad){
float scale = 30 / quad->mHeight;
renderer->RenderQuad(quad, x , y , 0,scale,scale);

View File

@@ -51,7 +51,7 @@ void DamagerDamaged::clearDamage()
void DamagerDamaged::Render(CombatStep mode)
{
TransientCardView::Render();
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetBase(0);
switch (mode)

View File

@@ -59,7 +59,7 @@ int SacrificeCost::doPay(){
void SacrificeCost::Render(){
//TODO : real stuff
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[200];
sprintf(buffer, _("sacrifice").c_str());

View File

@@ -18,7 +18,6 @@
#include "../include/Translate.h"
const char * const GameState::menuTexts[]= {"--NEW--","Deck 1", "Deck 2", "Deck 3", "Deck 4", "Deck 5", "Deck 6"} ;
WResourceManager* GameApp::CommonRes = NEW WResourceManager();
hgeParticleSystem* GameApp::Particles[] = {NULL,NULL,NULL,NULL,NULL,NULL};
int GameApp::HasMusic = 1;
JMusic * GameApp::music = NULL;
@@ -67,7 +66,7 @@ void GameApp::Create()
//Test for Music files presence
string filepath = RESPATH;
filepath = filepath + "/" + CommonRes->musicFile("Track0.mp3");
filepath = filepath + "/" + resources.musicFile("Track0.mp3");
std::ifstream file(filepath.c_str());
if (file)
file.close();
@@ -75,76 +74,70 @@ void GameApp::Create()
HasMusic = 0;
filepath = RESPATH;
filepath = filepath + "/" + CommonRes->musicFile("Track1.mp3");
filepath = filepath + "/" + resources.musicFile("Track1.mp3");
std::ifstream file2(filepath.c_str());
if (file2)
file2.close();
else
HasMusic = 0;
CommonRes->CreateTexture("menuicons.png");
resources.RetrieveTexture("menuicons.png",RETRIEVE_MANAGE);
//Creating thes quad in this specific order allows us to have them in the correct order to call them by integer id
CommonRes->CreateQuad("c_artifact", "menuicons.png", 2 + 6*36, 38, 32, 32);
CommonRes->CreateQuad("c_green", "menuicons.png", 2 + 0*36, 38, 32, 32);
CommonRes->CreateQuad("c_blue", "menuicons.png", 2 + 1*36, 38, 32, 32);
CommonRes->CreateQuad("c_red", "menuicons.png", 2 + 3*36, 38, 32, 32);
CommonRes->CreateQuad("c_black", "menuicons.png", 2 + 2*36, 38, 32, 32);
CommonRes->CreateQuad("c_white", "menuicons.png", 2 + 4*36, 38, 32, 32);
CommonRes->CreateQuad("c_land", "menuicons.png", 2 + 5*36, 38, 32, 32);
manaIcons[Constants::MTG_COLOR_ARTIFACT] = GameApp::CommonRes->GetQuad("c_artifact");
manaIcons[Constants::MTG_COLOR_LAND] = GameApp::CommonRes->GetQuad("c_land");
manaIcons[Constants::MTG_COLOR_WHITE] = GameApp::CommonRes->GetQuad("c_white");
manaIcons[Constants::MTG_COLOR_RED] = GameApp::CommonRes->GetQuad("c_red");
manaIcons[Constants::MTG_COLOR_BLACK] = GameApp::CommonRes->GetQuad("c_black");
manaIcons[Constants::MTG_COLOR_BLUE] = GameApp::CommonRes->GetQuad("c_blue");
manaIcons[Constants::MTG_COLOR_GREEN] = GameApp::CommonRes->GetQuad("c_green");
manaIcons[Constants::MTG_COLOR_GREEN] = resources.RetrieveQuad("menuicons.png", 2 + 0*36, 38, 32, 32, "c_green",RETRIEVE_MANAGE);
manaIcons[Constants::MTG_COLOR_BLUE] = resources.RetrieveQuad("menuicons.png", 2 + 1*36, 38, 32, 32, "c_blue",RETRIEVE_MANAGE);
manaIcons[Constants::MTG_COLOR_RED] = resources.RetrieveQuad("menuicons.png", 2 + 3*36, 38, 32, 32, "c_red",RETRIEVE_MANAGE);
manaIcons[Constants::MTG_COLOR_BLACK] = resources.RetrieveQuad("menuicons.png", 2 + 2*36, 38, 32, 32, "c_black",RETRIEVE_MANAGE);
manaIcons[Constants::MTG_COLOR_WHITE] = resources.RetrieveQuad("menuicons.png", 2 + 4*36, 38, 32, 32, "c_white",RETRIEVE_MANAGE);
manaIcons[Constants::MTG_COLOR_LAND] = resources.RetrieveQuad("menuicons.png", 2 + 5*36, 38, 32, 32, "c_land",RETRIEVE_MANAGE);
manaIcons[Constants::MTG_COLOR_ARTIFACT] = resources.RetrieveQuad("menuicons.png", 2 + 6*36, 38, 32, 32, "c_artifact",RETRIEVE_MANAGE);
for (int i = sizeof(manaIcons)/sizeof(manaIcons[0]) - 1; i >= 0; --i) manaIcons[i]->SetHotSpot(16,16);
CommonRes->CreateTexture("back.jpg");
CommonRes->CreateQuad("back", "back.jpg", 0, 0, 200, 285);
CommonRes->GetQuad("back")->SetHotSpot(100, 145);
resources.RetrieveTexture("back.jpg",RETRIEVE_MANAGE);
resources.RetrieveQuad("back.jpg", 0, 0, 200, 285, "back",RETRIEVE_MANAGE);
resources.GetQuad("back")->SetHotSpot(100, 145);
CommonRes->CreateTexture("back_thumb.jpg");
CommonRes->CreateQuad("back_thumb", "back_thumb.jpg", 0, 0, MTG_MINIIMAGE_WIDTH, MTG_MINIIMAGE_HEIGHT);
resources.RetrieveTexture("back_thumb.jpg",RETRIEVE_MANAGE);
resources.RetrieveQuad("back_thumb.jpg", 0, 0, MTG_MINIIMAGE_WIDTH, MTG_MINIIMAGE_HEIGHT, "back_thumb",RETRIEVE_MANAGE);
CommonRes->CreateTexture("particles.png");
CommonRes->CreateQuad("particles", "particles.png", 0, 0, 32, 32);
CommonRes->GetQuad("particles")->SetHotSpot(16,16);
resources.RetrieveTexture("particles.png",RETRIEVE_MANAGE);
resources.RetrieveQuad("particles.png", 0, 0, 32, 32, "particles",RETRIEVE_MANAGE);
resources.GetQuad("particles")->SetHotSpot(16,16);
resources.RetrieveQuad("particles.png", 64, 0, 32, 32, "stars",RETRIEVE_MANAGE);
resources.GetQuad("stars")->SetHotSpot(16,16);
CommonRes->CreateQuad("stars", "particles.png", 64, 0, 32, 32);
CommonRes->GetQuad("stars")->SetHotSpot(16,16);
CommonRes->LoadJLBFont("simon",11);
CommonRes->GetJLBFont("simon")->SetTracking(-1);
CommonRes->LoadJLBFont("f3",16);
CommonRes->LoadJLBFont("magic",16);
resources.LoadJLBFont("simon",11);
resources.GetJLBFont("simon")->SetTracking(-1);
resources.LoadJLBFont("f3",16);
resources.LoadJLBFont("magic",16);
CommonRes->CreateTexture("phasebar.png");
CommonRes->CreateTexture("wood.png");
CommonRes->CreateTexture("gold.png");
CommonRes->CreateTexture("goldglow.png");
CommonRes->CreateTexture("backdrop.jpg");
CommonRes->CreateTexture("handback.png");
resources.RetrieveTexture("phasebar.png",RETRIEVE_MANAGE);
resources.RetrieveTexture("wood.png",RETRIEVE_MANAGE);
resources.RetrieveTexture("gold.png",RETRIEVE_MANAGE);
resources.RetrieveTexture("goldglow.png",RETRIEVE_MANAGE);
resources.RetrieveTexture("backdrop.jpg",RETRIEVE_MANAGE);
resources.RetrieveTexture("handback.png",RETRIEVE_MANAGE);
resources.RetrieveTexture("BattleIcon.png",RETRIEVE_MANAGE);
resources.RetrieveTexture("DefenderIcon.png",RETRIEVE_MANAGE);
resources.RetrieveTexture("shadow.png",RETRIEVE_MANAGE);
CommonRes->CreateTexture("BattleIcon.png");
CommonRes->CreateTexture("DefenderIcon.png");
CommonRes->CreateTexture("shadow.png");
CommonRes->CreateQuad("BattleIcon", "BattleIcon.png", 0, 0, 25, 25);
CommonRes->CreateQuad("DefenderIcon", "DefenderIcon.png", 0, 0, 24, 23);
CommonRes->CreateQuad("shadow", "shadow.png", 0, 0, 1, 1);
CommonRes->GetQuad("BattleIcon")->SetHotSpot(12, 12);
CommonRes->GetQuad("DefenderIcon")->SetHotSpot(12, 12);
CommonRes->GetQuad("shadow")->SetHotSpot(0.5, 0.5);
resources.RetrieveQuad("BattleIcon.png", 0, 0, 25, 25,"BattleIcon",RETRIEVE_MANAGE);
resources.RetrieveQuad("DefenderIcon.png", 0, 0, 24, 23,"DefenderIcon",RETRIEVE_MANAGE);
resources.RetrieveQuad("shadow.png", 0, 0, 1, 1,"shadow",RETRIEVE_MANAGE);
resources.GetQuad("BattleIcon")->SetHotSpot(12, 12);
resources.GetQuad("DefenderIcon")->SetHotSpot(12, 12);
resources.GetQuad("shadow")->SetHotSpot(0.5, 0.5);
collection = NEW MTGAllCards(&cache);
collection = NEW MTGAllCards();
Particles[0] = NEW hgeParticleSystem("graphics/particle1.psi", CommonRes->GetQuad("particles"));
Particles[1] = NEW hgeParticleSystem("graphics/particle2.psi", CommonRes->GetQuad("particles"));
Particles[2] = NEW hgeParticleSystem("graphics/particle3.psi", CommonRes->GetQuad("particles"));
Particles[3] = NEW hgeParticleSystem("graphics/particle4.psi", CommonRes->GetQuad("particles"));
Particles[4] = NEW hgeParticleSystem("graphics/particle5.psi", CommonRes->GetQuad("particles"));
Particles[5] = NEW hgeParticleSystem("graphics/particle7.psi", CommonRes->GetQuad("particles"));
Particles[0] = NEW hgeParticleSystem("graphics/particle1.psi", resources.GetQuad("particles"));
Particles[1] = NEW hgeParticleSystem("graphics/particle2.psi", resources.GetQuad("particles"));
Particles[2] = NEW hgeParticleSystem("graphics/particle3.psi", resources.GetQuad("particles"));
Particles[3] = NEW hgeParticleSystem("graphics/particle4.psi", resources.GetQuad("particles"));
Particles[4] = NEW hgeParticleSystem("graphics/particle5.psi", resources.GetQuad("particles"));
Particles[5] = NEW hgeParticleSystem("graphics/particle7.psi", resources.GetQuad("particles"));
mGameStates[GAME_STATE_DECK_VIEWER] = NEW GameStateDeckViewer(this);
mGameStates[GAME_STATE_DECK_VIEWER]->Create();
@@ -197,12 +190,8 @@ void GameApp::Destroy()
collection->destroyAllCards();
SAFE_DELETE(collection);
}
SampleCache::DestroyInstance();
delete(DeckStats::GetInstance());
SAFE_DELETE(CommonRes);
SAFE_DELETE(Subtypes::subtypesList);
SAFE_DELETE(MtgSets::SetsList);
@@ -274,7 +263,7 @@ void GameApp::Render()
{
if (systemError.size()){
fprintf(stderr, systemError.c_str());
JLBFont * mFont= CommonRes->GetJLBFont("simon");
JLBFont * mFont= resources.GetJLBFont("simon");
if (mFont) mFont->DrawString(systemError.c_str(),1,1);
return;
}

View File

@@ -189,8 +189,8 @@ void GameObserver::startGame(int shuffle, int draw){
//Preload images from hand
if (!players[0]->isAI()){
for (i=0; i< players[0]->game->hand->nb_cards; i++){
cache.getThumb(players[0]->game->hand->cards[i]);
cache.getQuad(players[0]->game->hand->cards[i]);
resources.RetrieveCard(players[0]->game->hand->cards[i],CACHE_THUMB);
resources.RetrieveCard(players[0]->game->hand->cards[i]);
}
}
turn = 0;

View File

@@ -300,7 +300,7 @@ void GameSettings::checkProfile(){
//Validation of collection, etc, only happens if the game is up.
if(theGame == NULL || theGame->collection == NULL)
return;
if(profileFile(PLAYER_COLLECTION) == "")
{
//If we had any default settings, we'd set them here.
@@ -335,7 +335,7 @@ void GameSettings::createUsersFirstDeck(int setId){
if(theGame == NULL || theGame->collection == NULL)
return;
MTGDeck *mCollection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), &cache, theGame->collection);
MTGDeck *mCollection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), theGame->collection);
//10 lands of each
int sets[] = {setId};
if (!mCollection->addRandomCards(10, sets,1, Constants::RARITY_L,"Forest")){

View File

@@ -16,7 +16,7 @@ int GameState::fillDeckMenu(SimpleMenu * _menu, string path, string smallDeckPre
char deckDesc[512];
sprintf(buffer, "%s/deck%i.txt",path.c_str(),nbDecks+1);
if(fileExists(buffer)){
MTGDeck * mtgd = NEW MTGDeck(buffer,NULL,NULL,1);
MTGDeck * mtgd = NEW MTGDeck(buffer,NULL,1);
found = 1;
nbDecks++;
sprintf(smallDeckName, "%s_deck%i",smallDeckPrefix.c_str(),nbDecks);

View File

@@ -75,7 +75,7 @@ void GameStateDuel::Start()
mGamePhase = DUEL_STATE_CHOOSE_DECK1;
credits = NEW Credits();
mFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
mFont = resources.GetJLBFont(Constants::MENU_FONT);
mFont->SetBase(0);
opponentMenuFont = mFont;
@@ -115,7 +115,7 @@ void GameStateDuel::loadPlayerRandom(int playerId, int isAI, int mode){
string lands[] = {"forest", "forest", "island", "mountain", "swamp", "plains", "forest"};
MTGDeck * tempDeck = NEW MTGDeck(NULL, mParent->collection);
MTGDeck * tempDeck = NEW MTGDeck(mParent->collection);
tempDeck->addRandomCards(9,0,0,-1,lands[color1].c_str());
tempDeck->addRandomCards(9,0,0,-1,lands[color2].c_str());
tempDeck->addRandomCards(1,0,0,'U',"land",colors,nbcolors);
@@ -141,7 +141,7 @@ void GameStateDuel::loadPlayerRandom(int playerId, int isAI, int mode){
void GameStateDuel::loadPlayerMomir(int playerId, int isAI){
string deckFileSmall = "momir";
char empty[] = "";
MTGDeck * tempDeck = NEW MTGDeck(options.profileFile("momir.txt").c_str(), NULL, mParent->collection);
MTGDeck * tempDeck = NEW MTGDeck(options.profileFile("momir.txt").c_str(), mParent->collection);
deck[playerId] = NEW MTGPlayerCards(mParent->collection, tempDeck);
if (!isAI) // Human Player
mPlayers[playerId] = NEW HumanPlayer(deck[playerId], options.profileFile("momir.txt").c_str(), deckFileSmall);
@@ -160,7 +160,7 @@ void GameStateDuel::loadPlayer(int playerId, int decknb, int isAI){
sprintf(deckFile, "%s/deck%i.txt",options.profileFile().c_str(), decknb);
char deckFileSmall[255];
sprintf(deckFileSmall, "player_deck%i",decknb);
MTGDeck * tempDeck = NEW MTGDeck(deckFile, NULL, mParent->collection);
MTGDeck * tempDeck = NEW MTGDeck(deckFile, mParent->collection);
deck[playerId] = NEW MTGPlayerCards(mParent->collection,tempDeck);
delete tempDeck;
mPlayers[playerId] = NEW HumanPlayer(deck[playerId],deckFile, deckFileSmall);

View File

@@ -64,60 +64,50 @@ GameStateMenu::GameStateMenu(GameApp* parent): GameState(parent)
mGuiController = NULL;
subMenuController = NULL;
gameTypeMenu = NULL;
mIconsTexture = NULL;
//bgMusic = NULL;
timeIndex = 0;
angleMultiplier = MIN_ANGLE_MULTIPLIER;
yW = 55;
mVolume = 0;
splashTex = NULL;
splashQuad = NULL;
scroller = NULL;
}
GameStateMenu::~GameStateMenu() {}
void GameStateMenu::Create()
{
mDip = NULL;
mReadConf = 0;
mCurrentSetName[0] = 0;
mIconsTexture = GameApp::CommonRes->LoadTexture("menuicons.png", TEX_TYPE_USE_VRAM);
bgTexture = GameApp::CommonRes->LoadTexture("menutitle.png", TEX_TYPE_USE_VRAM);
movingWTexture = GameApp::CommonRes->LoadTexture("movingW.png", TEX_TYPE_USE_VRAM);
mBg = NEW JQuad(bgTexture, 0, 0, 256, 166); // Create background quad for rendering.
mMovingW = NEW JQuad(movingWTexture, 2, 2, 84, 62);
if (fileExists(GameApp::CommonRes->graphicsFile("splash.jpg").c_str())){
splashTex = GameApp::CommonRes->LoadTexture("splash.jpg", TEX_TYPE_USE_VRAM);
splashQuad = NEW JQuad(splashTex, 0, 0, 480, 272);
}
mBg->SetHotSpot(105,50);
mMovingW->SetHotSpot(72,16);
//load all the icon images
//load all the icon images. Menu icons are managed, so we can do this here.
int n = 0;
char buf[512];
for (int i=0;i<5;i++){
for (int j=0;j<2;j++){
mIcons[n] = NEW JQuad(mIconsTexture, 2 + i*36, 2 + j*36, 32, 32);
sprintf(buf,"menuicons%d%d",i,j);
mIcons[n] = resources.RetrieveQuad("menuicons.png", 2 + i*36, 2 + j*36, 32, 32,buf);
mIcons[n]->SetHotSpot(16,16);
n++;
}
}
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT);
mFont->SetColor(options[Metrics::LOADING_TC].asColor());
mGuiController = NEW JGuiController(100, this);
if (mGuiController)
{
mGuiController->Add(NEW MenuItem(MENUITEM_PLAY, mFont, "Play", 80, 50 + SCREEN_HEIGHT/2, mIcons[8], mIcons[9],"graphics/particle1.psi",GameApp::CommonRes->GetQuad("particles"), true));
mGuiController->Add(NEW MenuItem(MENUITEM_DECKEDITOR, mFont, "Deck Editor", 160, 50 + SCREEN_HEIGHT/2, mIcons[2], mIcons[3],"graphics/particle2.psi",GameApp::CommonRes->GetQuad("particles")));
mGuiController->Add(NEW MenuItem(MENUITEM_SHOP, mFont, "Shop", 240, 50 + SCREEN_HEIGHT/2, mIcons[0], mIcons[1],"graphics/particle3.psi",GameApp::CommonRes->GetQuad("particles")));
mGuiController->Add(NEW MenuItem(MENUITEM_OPTIONS, mFont, "Options", 320, 50 + SCREEN_HEIGHT/2, mIcons[6], mIcons[7],"graphics/particle4.psi",GameApp::CommonRes->GetQuad("particles")));
mGuiController->Add(NEW MenuItem(MENUITEM_EXIT, mFont, "Exit", 400, 50 + SCREEN_HEIGHT/2, mIcons[4], mIcons[5],"graphics/particle5.psi",GameApp::CommonRes->GetQuad("particles")));
mGuiController->Add(NEW MenuItem(MENUITEM_PLAY, mFont, "Play", 80, 50 + SCREEN_HEIGHT/2, mIcons[8], mIcons[9],"graphics/particle1.psi",resources.GetQuad("particles"), true));
mGuiController->Add(NEW MenuItem(MENUITEM_DECKEDITOR, mFont, "Deck Editor", 160, 50 + SCREEN_HEIGHT/2, mIcons[2], mIcons[3],"graphics/particle2.psi",resources.GetQuad("particles")));
mGuiController->Add(NEW MenuItem(MENUITEM_SHOP, mFont, "Shop", 240, 50 + SCREEN_HEIGHT/2, mIcons[0], mIcons[1],"graphics/particle3.psi",resources.GetQuad("particles")));
mGuiController->Add(NEW MenuItem(MENUITEM_OPTIONS, mFont, "Options", 320, 50 + SCREEN_HEIGHT/2, mIcons[6], mIcons[7],"graphics/particle4.psi",resources.GetQuad("particles")));
mGuiController->Add(NEW MenuItem(MENUITEM_EXIT, mFont, "Exit", 400, 50 + SCREEN_HEIGHT/2, mIcons[4], mIcons[5],"graphics/particle5.psi",resources.GetQuad("particles")));
}
currentState = MENU_STATE_MAJOR_LOADING_CARDS | MENU_STATE_MINOR_NONE;
scroller = NEW TextScroller(GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT), SCREEN_WIDTH/2 - 90 , SCREEN_HEIGHT-17,180);
scroller = NEW TextScroller(resources.GetJLBFont(Constants::MAIN_FONT), SCREEN_WIDTH/2 - 90 , SCREEN_HEIGHT-17,180);
scrollerSet = 0;
}
@@ -128,29 +118,16 @@ void GameStateMenu::Destroy()
SAFE_DELETE(mGuiController);
SAFE_DELETE(subMenuController);
SAFE_DELETE(gameTypeMenu);
SAFE_DELETE(mIconsTexture);
for (int i = 0; i < 10 ; i++){
SAFE_DELETE(mIcons[i]);
}
SAFE_DELETE(mBg);
SAFE_DELETE(mMovingW);
SAFE_DELETE(movingWTexture);
SAFE_DELETE(bgTexture);
resources.Release(bgTexture);
resources.Release(movingWTexture);
SAFE_DELETE(scroller);
}
void GameStateMenu::Start(){
JRenderer::GetInstance()->ResetPrivateVRAM();
JRenderer::GetInstance()->EnableVSync(true);
subMenuController = NULL;
if (GameApp::HasMusic && !GameApp::music && options[Options::MUSICVOLUME].number > 0){
GameApp::music = GameApp::CommonRes->ssLoadMusic("Track0.mp3");
GameApp::music = resources.ssLoadMusic("Track0.mp3");
JSoundSystem::GetInstance()->PlayMusic(GameApp::music, true);
}
@@ -162,6 +139,16 @@ void GameStateMenu::Start(){
hasChosenGameType = 1;
if (options[Options::MOMIR_MODE_UNLOCKED].number) hasChosenGameType = 0;
if (options[Options::RANDOMDECK_MODE_UNLOCKED].number) hasChosenGameType = 0;
bgTexture = resources.RetrieveTexture("menutitle.png", RETRIEVE_VRAM);
movingWTexture = resources.RetrieveTexture("movingW.png", RETRIEVE_VRAM);
mBg = resources.RetrieveQuad("menutitle.png"); // Create background quad for rendering.
mMovingW = resources.RetrieveQuad("movingW.png");
mBg->SetHotSpot(105,50);
mMovingW->SetHotSpot(72,16);
JRenderer::GetInstance()->ResetPrivateVRAM();
JRenderer::GetInstance()->EnableVSync(true);
}
@@ -217,7 +204,7 @@ void GameStateMenu::fillScroller(){
sprintf(buff2, _("You have unlocked %i expansions out of %i").c_str(),nbunlocked, MtgSets::SetsList->nb_items);
scroller->Add(buff2);
DeckDataWrapper* ddw = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), &cache,mParent->collection));
DeckDataWrapper* ddw = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), mParent->collection));
int totalCards = ddw->getCount();
if (totalCards){
sprintf(buff2, _("You have a total of %i cards in your collection").c_str(),totalCards);
@@ -274,8 +261,10 @@ int GameStateMenu::nextDirectory(const char * root, const char * file){
void GameStateMenu::End()
{
JRenderer::GetInstance()->EnableVSync(false);
resources.Release(bgTexture);
resources.Release(movingWTexture);
}
@@ -316,9 +305,7 @@ void GameStateMenu::Update(float dt)
}
}
resetDirectory();
SAFE_DELETE(splashQuad);
SAFE_DELETE(splashTex);
}
}
break;
case MENU_STATE_MAJOR_FIRST_TIME :
options.checkProfile();
@@ -338,7 +325,7 @@ void GameStateMenu::Update(float dt)
{
if (!hasChosenGameType){
currentState = MENU_STATE_MAJOR_SUBMENU;
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT);
subMenuController = NEW SimpleMenu(102, this, mFont, 150,60);
if (subMenuController){
subMenuController->Add(SUBMENUITEM_CLASSIC,"Classic");
@@ -402,8 +389,9 @@ void GameStateMenu::Render()
{
JRenderer * renderer = JRenderer::GetInstance();
renderer->ClearScreen(ARGB(0,0,0,0));
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT);
if ((currentState & MENU_STATE_MAJOR) == MENU_STATE_MAJOR_LOADING_CARDS){
JQuad* splashQuad = resources.RetrieveQuad("splash.jpg");
if (splashQuad){
renderer->RenderQuad(splashQuad,0,0);
}else{
@@ -412,7 +400,7 @@ void GameStateMenu::Render()
mFont->DrawString(text,SCREEN_WIDTH/2,SCREEN_HEIGHT/2,JGETEXT_CENTER);
}
}else{
mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
mFont = resources.GetJLBFont(Constants::MAIN_FONT);
PIXEL_TYPE colors[] =
{
ARGB(255, 3, 2, 0),
@@ -447,7 +435,7 @@ void GameStateMenu::Render()
void GameStateMenu::ButtonPressed(int controllerId, int controlId)
{
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT);
#if defined (WIN32) || defined (LINUX)
char buf[4096];
sprintf(buf, "cnotrollerId: %i", controllerId);
@@ -558,13 +546,10 @@ ostream& GameStateMenu::toString(ostream& out) const
<< " ; gameTypeMenu : " << gameTypeMenu
<< " ; hasChosenGameType : " << hasChosenGameType
<< " ; mIcons : " << mIcons
<< " ; mIconsTexture : " << mIconsTexture
<< " ; bgTexture : " << bgTexture
<< " ; movingWTexture : " << movingWTexture
<< " ; mBg : " << mBg
<< " ; mMovingW : " << mMovingW
<< " ; splashTex : " << splashTex
<< " ; splashQuad : " << splashQuad
<< " ; mCreditsYPos : " << mCreditsYPos
<< " ; currentState : " << currentState
<< " ; mVolume : " << mVolume

View File

@@ -54,7 +54,7 @@ void GameStateOptions::Start()
optionsList->failMsg = "";
optionsTabs->Add(optionsList);
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
optionsMenu = NEW SimpleMenu(102, this,mFont, 50,170);
optionsMenu->Add(1, "Save & Back to Main Menu");
optionsMenu->Add(2, "Back to Main Menu");
@@ -135,7 +135,7 @@ void GameStateOptions::Render()
"Please support this project with donations at http://wololo.net/wagic",
};
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("magic");
JLBFont * mFont = resources.GetJLBFont("magic");
mFont->SetColor(ARGB(255,200,200,200));
mFont->SetScale(1.0);
float startpos = 272 - timer * 10;

View File

@@ -26,19 +26,16 @@ void GameStateShop::Create(){
void GameStateShop::Start()
{
menu = NULL;
menuFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
itemFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
menuFont = resources.GetJLBFont(Constants::MENU_FONT);
itemFont = resources.GetJLBFont(Constants::MAIN_FONT);
mStage = STAGE_SHOP_SHOP;
bgTexture = GameApp::CommonRes->LoadTexture("shop.jpg", TEX_TYPE_USE_VRAM);
mBg = NEW JQuad(bgTexture, 0, 0, 480, 272); // Create background quad for rendering.
mBack = GameApp::CommonRes->GetQuad("back");
bgTexture = resources.RetrieveTexture("shop.jpg", RETRIEVE_VRAM);
mBg = resources.RetrieveQuad("shop.jpg");
mBack = resources.GetQuad("back");
JRenderer::GetInstance()->ResetPrivateVRAM();
JRenderer::GetInstance()->EnableVSync(true);
@@ -99,7 +96,7 @@ void GameStateShop::load(){
setIds[i] = (rand() % MtgSets::SetsList->nb_items);
}
}
JQuad * mBackThumb = GameApp::CommonRes->GetQuad("back_thumb");
JQuad * mBackThumb = resources.GetQuad("back_thumb");
@@ -109,7 +106,7 @@ void GameStateShop::load(){
shop->Add(setNames[i],mBack,mBackThumb, 700);
}
MTGDeck * tempDeck = NEW MTGDeck(NULL,mParent->collection);
MTGDeck * tempDeck = NEW MTGDeck(mParent->collection);
tempDeck->addRandomCards(8,sets,nbsets);
for (map<int,int>::iterator it = tempDeck->cards.begin(); it!=tempDeck->cards.end(); it++){
for (int j = 0; j < it->second; j++){
@@ -122,11 +119,9 @@ void GameStateShop::load(){
void GameStateShop::End()
{
JRenderer::GetInstance()->EnableVSync(false);
resources.Release(bgTexture);
SAFE_DELETE(shop);
SAFE_DELETE(bgTexture);
SAFE_DELETE(mBg);
SAFE_DELETE(menu);
}
void GameStateShop::Destroy(){

View File

@@ -4,7 +4,7 @@
GuiBackground::GuiBackground()
{
JTexture* texture = GameApp::CommonRes->GetTexture("backdrop.jpg");
JTexture* texture = resources.GetTexture("backdrop.jpg");
if (texture)
quad = NEW JQuad(texture, 0, 0, 480, 255);
else

View File

@@ -21,12 +21,7 @@ GuiCombat::GuiCombat(GameObserver* go) : GuiLayer(), go(go), active(false), acti
{
if (NULL == ok_quad)
{
if (!GameApp::CommonRes->GetTexture("Ok.png"))
{
GameApp::CommonRes->CreateTexture("Ok.png");
GameApp::CommonRes->CreateQuad("OK", "Ok.png", 0, 0, 56, 45);
}
ok_quad = GameApp::CommonRes->GetQuad("OK");
ok_quad = resources.RetrieveQuad("OK.png");
if (ok_quad) ok_quad->SetHotSpot(28, 22);
}
}
@@ -226,7 +221,7 @@ void GuiCombat::Render()
{
go->opponent()->mAvatar->SetHotSpot(18, 25);
enemy_avatar.Render(go->opponent()->mAvatar);
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetColor(ARGB(255, 255, 64, 0));
{
char buf[10]; sprintf(buf, "%i", damage);
@@ -238,7 +233,7 @@ void GuiCombat::Render()
renderer->DrawLine(0, SCREEN_HEIGHT / 2 + 10, SCREEN_WIDTH, SCREEN_HEIGHT / 2 + 10, ARGB(255, 255, 64, 0));
if (FIRST_STRIKE == step)
{
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetColor(ARGB(255, 64, 255, 64));
mFont->DrawString("First strike damage", 370, 2);
}
@@ -338,6 +333,7 @@ int GuiCombat::receiveEventMinus(WEvent* e)
}
else if (WEventPhaseChange* event = dynamic_cast<WEventPhaseChange*>(e))
{
event = event;
step = BLOCKERS;
}
else if (WEventCombatStepChange* event = dynamic_cast<WEventCombatStepChange*>(e))

View File

@@ -4,26 +4,26 @@
GuiFrame::GuiFrame()
{
if (JTexture* woodTex = GameApp::CommonRes->GetTexture("wood.png"))
wood = NEW JQuad(woodTex, 0, 0, SCREEN_WIDTH, 16);
if (resources.GetTexture("wood.png"))
wood = resources.RetrieveQuad("wood.png", 0, 0, SCREEN_WIDTH, 16);
else
{
wood = NULL;
GameApp::systemError += "Can't load wood texture : " __FILE__ "\n";
}
if (JTexture* goldTex = GameApp::CommonRes->GetTexture("gold.png"))
if (resources.GetTexture("gold.png"))
{
gold1 = NEW JQuad(goldTex, 0, 0, SCREEN_WIDTH, 6);
gold2 = NEW JQuad(goldTex, 0, 6, SCREEN_WIDTH, 6);
gold1 = resources.RetrieveQuad("gold.png", 0, 0, SCREEN_WIDTH, 6, "gold1");
gold2 = resources.RetrieveQuad("gold.png", 0, 6, SCREEN_WIDTH, 6, "gold2");
}
else
{
gold1 = gold2 = NULL;
GameApp::systemError += "Can't load gold texture : " __FILE__ "\n";
}
if (JTexture* goldGlowTex = GameApp::CommonRes->GetTexture("goldglow.png"))
goldGlow = NEW JQuad(goldGlowTex, 0, 1, SCREEN_WIDTH, 18);
if (resources.GetTexture("goldglow.png"))
goldGlow = resources.RetrieveQuad("goldglow.png", 0, 1, SCREEN_WIDTH, 18);
else
{
goldGlow = NULL;
@@ -38,10 +38,10 @@ GuiFrame::GuiFrame()
GuiFrame::~GuiFrame()
{
delete(gold2);
delete(gold1);
delete(wood);
SAFE_DELETE(goldGlow);
resources.Release(gold2);
resources.Release(gold1);
resources.Release(wood);
resources.Release(goldGlow);
}
void GuiFrame::Render()

View File

@@ -24,7 +24,7 @@ HandLimitor::HandLimitor(GuiHand* hand) : hand(hand) {}
GuiHand::GuiHand(CardSelector* cs, MTGHand* hand) : GuiLayer(), hand(hand), cs(cs)
{
JTexture* texture = GameApp::CommonRes->GetTexture("handback.png");
JTexture* texture = resources.GetTexture("handback.png");
if (texture)
{
back = NEW JQuad(texture, 0, 0, 101, 250);
@@ -54,7 +54,7 @@ GuiHandOpponent::GuiHandOpponent(CardSelector* cs, MTGHand* hand) : GuiHand(cs,
void GuiHandOpponent::Render()
{
JQuad * quad = GameApp::CommonRes->GetQuad("back_thumb");
JQuad * quad = resources.GetQuad("back_thumb");
float x = 45;
for (vector<CardView*>::iterator it = cards.begin(); it != cards.end(); ++it)

View File

@@ -13,22 +13,22 @@ ManaIcon::ManaIcon(int color, float x, float y) : Pos(x, y, 0.5, 0.0, 255), f(-1
switch (color)
{
case Constants::MTG_COLOR_RED :
particleSys = NEW hgeParticleSystem("graphics/manared.psi", GameApp::CommonRes->GetQuad("stars"));
particleSys = NEW hgeParticleSystem("graphics/manared.psi", resources.GetQuad("stars"));
break;
case Constants::MTG_COLOR_BLUE :
particleSys = NEW hgeParticleSystem("graphics/manablue.psi", GameApp::CommonRes->GetQuad("stars"));
particleSys = NEW hgeParticleSystem("graphics/manablue.psi", resources.GetQuad("stars"));
break;
case Constants::MTG_COLOR_GREEN :
particleSys = NEW hgeParticleSystem("graphics/managreen.psi", GameApp::CommonRes->GetQuad("stars"));
particleSys = NEW hgeParticleSystem("graphics/managreen.psi", resources.GetQuad("stars"));
break;
case Constants::MTG_COLOR_BLACK :
particleSys = NEW hgeParticleSystem("graphics/manablack.psi", GameApp::CommonRes->GetQuad("stars"));
particleSys = NEW hgeParticleSystem("graphics/manablack.psi", resources.GetQuad("stars"));
break;
case Constants::MTG_COLOR_WHITE :
particleSys = NEW hgeParticleSystem("graphics/manawhite.psi", GameApp::CommonRes->GetQuad("stars"));
particleSys = NEW hgeParticleSystem("graphics/manawhite.psi", resources.GetQuad("stars"));
break;
default :
particleSys = NEW hgeParticleSystem("graphics/mana.psi", GameApp::CommonRes->GetQuad("stars"));
particleSys = NEW hgeParticleSystem("graphics/mana.psi", resources.GetQuad("stars"));
}
icon = manaIcons[color];

View File

@@ -22,7 +22,7 @@ static int colors[] =
GuiPhaseBar::GuiPhaseBar() : phase(GameObserver::GetInstance()->phaseRing->getCurrentPhase()), angle(0.0f)
{
JTexture* texture = GameApp::CommonRes->GetTexture("phasebar.png");
JTexture* texture = resources.GetTexture("phasebar.png");
if (texture)
quad = NEW JQuad(texture, 0, 0, Width, Height);
else

View File

@@ -70,7 +70,7 @@ void GuiPlay::BattleField::EnstackAttacker(CardView* card)
GameObserver* game = GameObserver::GetInstance();
card->x = currentAttacker * (HORZWIDTH-20) / (attackers + 1); card->y = baseY + (game->players[0] == card->card->controller() ? 20 + y : -20 - y);
++currentAttacker;
// JRenderer::GetInstance()->RenderQuad(GameApp::CommonRes->GetQuad("BattleIcon"), card->actX, card->actY, 0, 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime()), 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime()));
// JRenderer::GetInstance()->RenderQuad(resources.GetQuad("BattleIcon"), card->actX, card->actY, 0, 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime()), 0.5 + 0.1 * sinf(JGE::GetInstance()->GetTime()));
}
void GuiPlay::BattleField::EnstackBlocker(CardView* card)
{

View File

@@ -21,7 +21,7 @@ void GuiAvatar::Render()
GameObserver * game = GameObserver::GetInstance();
JRenderer * r = JRenderer::GetInstance();
int life = player->life;
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
//Avatar
int lifeDiff = life - currentLife;
@@ -97,14 +97,14 @@ void GuiGameZone::toggleDisplay(){
void GuiGameZone::Render(){
//Texture
JQuad * quad = GameApp::CommonRes->GetQuad("back_thumb");
JQuad * quad = resources.GetQuad("back_thumb");
float scale = defaultHeight / quad->mHeight;
quad->SetColor(ARGB((int)(actA/2),255,255,255));
JRenderer::GetInstance()->RenderQuad(quad, actX, actY, 0.0, scale, scale);
//Number of cards
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MAIN_FONT);
mFont->SetScale(DEFAULT_MAIN_FONT_SCALE);
char buffer[11];
sprintf(buffer,"%i", zone->nb_cards);

View File

@@ -2344,7 +2344,7 @@ AManaProducer::AManaProducer(int id, MTGCardInstance * card, ManaCost * _output,
if (tap) source->tap();
if (options[Options::SFXVOLUME].number > 0){
JSample * sample = SampleCache::GetInstance()->getSample("mana.wav");
JSample * sample = resources.RetrieveSample("mana.wav");
if (sample) JSoundSystem::GetInstance()->PlaySample(sample);
}
return resolve();

View File

@@ -593,7 +593,7 @@ JSample * MTGCardInstance::getSample(){
#ifdef WIN32
OutputDebugString(type.c_str());
#endif
if (fileExists(GameApp::CommonRes->sfxFile(type).c_str())){
if (fileExists(resources.sfxFile(type).c_str())){
sample = string(type);
break;
}
@@ -605,7 +605,7 @@ JSample * MTGCardInstance::getSample(){
if (!basicAbilities[i]) continue;
string type = Constants::MTGBasicAbilities[i];
type = type + ".wav";
if (fileExists(GameApp::CommonRes->sfxFile(type).c_str())){
if (fileExists(resources.sfxFile(type).c_str())){
sample = type;
break;
}
@@ -614,12 +614,12 @@ JSample * MTGCardInstance::getSample(){
if (!sample.size()){
string type = Subtypes::subtypesList->find(types[0]);
type = type + ".wav";
if (fileExists(GameApp::CommonRes->sfxFile(type).c_str())){
if (fileExists(resources.sfxFile(type).c_str())){
sample = type;
}
}
if (sample.size()) return SampleCache::GetInstance()->getSample(sample);
if (sample.size()) return resources.RetrieveSample(sample);
return NULL;
}

View File

@@ -157,7 +157,6 @@ void MTGAllCards::initCounters(){
void MTGAllCards::init(){
tempCard = NULL;
mCache = NULL;
total_cards = 0;
initCounters();
srand(time(0)); // initialize random
@@ -197,17 +196,7 @@ void MTGAllCards::destroyAllCards(){
}
MTGAllCards::MTGAllCards(const char * config_file, const char * set_name){
MTGAllCards(config_file, set_name, NULL);
}
MTGAllCards::MTGAllCards(TexturesCache * cache){
init();
mCache = cache;
}
MTGAllCards::MTGAllCards(const char * config_file, const char * set_name, TexturesCache * cache){
init();
mCache = cache;
load(config_file,set_name, 0);
}
@@ -350,16 +339,14 @@ MTGCard * MTGAllCards::getCardByName(string name){
MTGDeck::MTGDeck(TexturesCache * cache, MTGAllCards * _allcards){
mCache = cache;
MTGDeck::MTGDeck(MTGAllCards * _allcards){
total_cards = 0;
database = _allcards;
filename ="";
meta_name = "";
}
MTGDeck::MTGDeck(const char * config_file, TexturesCache * cache, MTGAllCards * _allcards, int meta_only){
mCache = cache;
MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only){
total_cards = 0;
database = _allcards;
filename = config_file;

View File

@@ -5,7 +5,7 @@
MTGGamePhase::MTGGamePhase(int id):ActionElement(id){
animation = 0;
currentState = -1;
mFont= GameApp::CommonRes->GetJLBFont("simon");
mFont= resources.GetJLBFont("simon");
mFont->SetBase(0); // using 2nd font
}

View File

@@ -150,7 +150,7 @@ MTGCardInstance * MTGPlayerCards::putInZone(MTGCardInstance * card, MTGGameZone
if (options[Options::SFXVOLUME].number > 0){
if (to == g->players[0]->game->graveyard || to == g->players[1]->game->graveyard){
if (card->isCreature()){
JSample * sample = SampleCache::GetInstance()->getSample("graveyard.wav");
JSample * sample = resources.RetrieveSample("graveyard.wav");
if (sample) JSoundSystem::GetInstance()->PlaySample(sample);
}
}

View File

@@ -299,7 +299,7 @@ void MTGMomirRule::Update(float dt){
void MTGMomirRule::Render(){
if (!textAlpha) return;
JLBFont * mFont = GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT);
JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT);
mFont->SetScale(2 - (float)textAlpha/130);
mFont->SetColor(ARGB(textAlpha,255,255,255));
mFont->DrawString(text.c_str(),SCREEN_WIDTH/2,SCREEN_HEIGHT/2,JGETEXT_CENTER);
@@ -395,7 +395,7 @@ void HUDDisplay::Render(){
HUDDisplay::HUDDisplay(int _id):MTGAbility(_id, NULL){
timestamp = 0;
popdelay = 2;
f = GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT);
f = resources.GetJLBFont(Constants::MAIN_FONT);
maxWidth = 0;
}

View File

@@ -1,453 +1,453 @@
#include "../include/config.h"
#include "../include/ManaCost.h"
#include "../include/ManaCostHybrid.h"
#include "../include/ExtraCost.h"
#include "../include/TargetChooser.h"
#include "../include/Targetable.h"
#include "../include/Player.h"
#include "../include/WEvent.h"
#if defined (WIN32)
#include <windows.h>
#endif
ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstance * c){
ManaCost * manaCost;
if (_manaCost){
manaCost = _manaCost;
}else{
manaCost = NEW ManaCost();
}
int state = 0;
unsigned int start = 0;
unsigned int end = 0;
while (!s.empty() && state != -1){
switch(state){
case 0:
start = s.find_first_of("{");
if (start == string::npos){
return manaCost;
}else{
state = 1;
}
break;
case 1:
end = s.find_first_of("}");
if (end == string::npos){
state = -1;
}else{
string value = s.substr(start+1, end - 1 - start);
if (value == "u"){
manaCost->add(Constants::MTG_COLOR_BLUE, 1);
}else if (value == "b"){
manaCost->add(Constants::MTG_COLOR_BLACK, 1);
}else if (value == "w"){
manaCost->add(Constants::MTG_COLOR_WHITE, 1);
}else if (value == "g"){
manaCost->add(Constants::MTG_COLOR_GREEN, 1);
}else if (value == "r"){
manaCost->add(Constants::MTG_COLOR_RED, 1);
}else if (value == "x"){
manaCost->x();
}else if (value == "t"){
//Tap is handled outside of Manacost
}else if (value[0] == 's'){
//sacrifice
OutputDebugString("Sacrifice\n");
TargetChooserFactory tcf;
TargetChooser * tc = NULL;
size_t target_start = value.find("(");
size_t target_end = value.find(")");
if (target_start!=string::npos && target_end!=string::npos){
string target = value.substr(target_start+1, target_end-1 - target_start);
tc = tcf.createTargetChooser(target,c);
}
manaCost->addExtraCost(NEW SacrificeCost(tc));
}else{
int intvalue = atoi(value.c_str());
int colors[2];
int values[2];
if (intvalue < 10 && value.size() > 1){
for (int i = 0; i < 2; i++){
char c = value[i];
if (c >='0' && c <='9'){
colors[i] = Constants::MTG_COLOR_ARTIFACT;
values[i] = c - '0';
}else{
for (int j = 0; j < Constants::MTG_NB_COLORS; j++){
if (c == Constants::MTGColorChars[j]){
colors[i] = j;
values[i] = 1;
}
}
}
}
manaCost->addHybrid(colors[0], values[0], colors[1], values[1]);
}else{
manaCost->add(Constants::MTG_COLOR_ARTIFACT, intvalue);
}
}
s = s.substr(end + 1);
state = 0;
}
break;
default:
break;
}
}
return manaCost;
}
ManaCost::ManaCost(){
init();
}
ManaCost::ManaCost(int _cost[], int nb_elems){
init();
int i;
int total = nb_elems;
for (i = 0; i < total; i++){
cost[_cost[i*2]] = _cost[i*2 + 1];
}
}
ManaCost::ManaCost(ManaCost * _manaCost){
init();
int i;
for (i=0; i<= Constants::MTG_NB_COLORS; i++){
cost[i] = _manaCost->getCost(i);
}
}
ManaCost::~ManaCost(){
for (unsigned int i = 0; i < nbhybrids ; i++){
SAFE_DELETE(hybrids[i]);
}
if (!extraCostsIsCopy) {
SAFE_DELETE(extraCosts);
}
}
void ManaCost::x(){
cost[Constants::MTG_NB_COLORS] = 1;
}
void ManaCost::init(){
int i;
for (i=0; i<= Constants::MTG_NB_COLORS; i++){
cost[i] = 0;
}
nbhybrids = 0;
extraCosts = NULL;
extraCostsIsCopy = 0;
}
void ManaCost::copy(ManaCost * _manaCost){
for (unsigned int i = 0; i <= Constants::MTG_NB_COLORS; i++){
cost[i] = _manaCost->getCost(i);
}
for (unsigned int i = 0; i < _manaCost->nbhybrids; i++){
hybrids[i] = NEW ManaCostHybrid((*_manaCost->hybrids[i]));
}
nbhybrids = _manaCost->nbhybrids;
if (_manaCost->extraCosts){
//TODO Deep copy ?
if(!extraCostsIsCopy) SAFE_DELETE(extraCosts);
extraCosts = _manaCost->extraCosts;
extraCostsIsCopy = 1;
}
}
int ManaCost::getCost(int color){
return cost[color];
}
ManaCostHybrid * ManaCost::getHybridCost(unsigned int i){
if (nbhybrids <= i) return NULL;
return hybrids[i];
}
int ManaCost::getMainColor(){
for (int i=0; i< Constants::MTG_NB_COLORS; i++){
if (cost[i]) return i;
}
return 0;
}
int ManaCost::hasColor(int color){
if (cost[color]) return 1;
for (unsigned int i = 0; i < nbhybrids; i++){
if (hybrids[i]->hasColor(color)) return 1;
}
return 0;
}
int ManaCost::isNull(){
if (getConvertedCost()) return 0;
if (extraCosts) return 0;
return 1;
}
int ManaCost::getConvertedCost(){
int result = 0;
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
result += cost[i];
}
for (unsigned int i = 0; i < nbhybrids; i++){
result+= hybrids[i]->getConvertedCost();
}
return result;
}
int ManaCost::remove(int color, int value){
cost[color] -= value;
return 1;
}
int ManaCost::add(int color, int value){
cost[color] += value;
return 1;
}
int ManaCost::add(ManaCost * _cost){
if(!_cost) return 0;
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
cost[i]+= _cost->getCost(i);
}
for (unsigned int i = 0; i < _cost->nbhybrids; i++){
hybrids[nbhybrids] = NEW ManaCostHybrid((*_cost->hybrids[i]));
nbhybrids++;
}
return 1;
}
string ManaCost::toString(){
return "ManaCost - Todo";
}
int ManaCost::addHybrid(int c1, int v1, int c2, int v2){
ManaCostHybrid * h = NEW ManaCostHybrid(c1,v1,c2,v2);
hybrids[nbhybrids] = h;
nbhybrids++;
return nbhybrids;
}
int ManaCost::addExtraCost(ExtraCost * _cost){
if (!extraCosts) extraCosts = NEW ExtraCosts();
extraCosts->costs.push_back(_cost);
OutputDebugString("Adding Sacrifice\n");
return 1;
}
int ManaCost::isExtraPaymentSet(){
if (!extraCosts) return 1;
OutputDebugString("Checking costs\n");
return extraCosts->isPaymentSet();
}
int ManaCost::resetExtraPayment(){
if (!extraCosts) return 1;
return extraCosts->reset();
}
int ManaCost::doPayExtra(){
if (!extraCosts) return 0;
return extraCosts->doPay(); //TODO reset ?
}
int ManaCost::setExtraCostsAction(MTGAbility * action, MTGCardInstance * card){
if (extraCosts) extraCosts->setAction(action, card);
return 1;
}
int ManaCost::pay(ManaCost * _cost){
ManaCost * diff = Diff(_cost);
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
cost[i] = diff->getCost(i);
}
delete diff;
return 1;
//TODO return 0 if can't afford the cost!
}
//return 1 if _cost can be paid with current data, 0 otherwise
int ManaCost::canAfford(ManaCost * _cost){
ManaCost * diff = Diff(_cost);
int positive = diff->isPositive();
delete diff;
if (positive){
return 1;
}
return 0;
}
int ManaCost::isPositive(){
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
if (cost[i] < 0){
return 0;
}
}
return 1;
}
void ManaCost::randomDiffHybrids(ManaCost * _cost, int diff[]){
int _nbhybrids = _cost->nbhybrids;
for (int i = 0; i < _nbhybrids; i++){
ManaCostHybrid * h = _cost->hybrids[i];
diff[h->color1 * 2 +1]-= h->value1;
}
}
int ManaCost::tryToPayHybrids(ManaCostHybrid * _hybrids[], int _nbhybrids, int diff[]){
if (!_nbhybrids) return 1;
int result = 0;
ManaCostHybrid * h = _hybrids[_nbhybrids -1];
if (diff[h->color1 * 2 +1] >= h->value1){
diff[h->color1 * 2 +1]-= h->value1;
result = tryToPayHybrids(_hybrids,_nbhybrids -1, diff);
if (result) return 1;
diff[h->color1 * 2 +1]+= h->value1;
}
if (diff[h->color2 * 2 +1] >= h->value2){
diff[h->color2 * 2 +1]-= h->value2;
result = tryToPayHybrids(_hybrids,_nbhybrids -1, diff);
if (result) return 1;
diff[h->color2 * 2 +1]+= h->value2;
}
return 0;
}
//compute the difference between two mana costs
ManaCost * ManaCost::Diff(ManaCost * _cost){
int diff[(Constants::MTG_NB_COLORS + 1 )* 2];
diff[Constants::MTG_NB_COLORS * 2] = Constants::MTG_NB_COLORS;
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
diff[i*2] = i;
diff[i*2 +1] = cost[i] - _cost->getCost(i);
}
int hybridResult = tryToPayHybrids(_cost->hybrids, _cost->nbhybrids, diff);
if (!hybridResult) randomDiffHybrids(_cost,diff);
//Colorless mana, special case
int colorless_idx = Constants::MTG_COLOR_ARTIFACT * 2 + 1;
if (diff[colorless_idx] < 0){
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
if (diff[i*2 + 1] > 0){
if (diff[i*2 + 1] + diff[colorless_idx] > 0){
diff[i*2 + 1] += diff[colorless_idx];
diff[colorless_idx] = 0;
break;
}else{
diff[colorless_idx] += diff[i*2 + 1];
diff[i*2 + 1] = 0;
}
}
}
}
//Cost X
if (_cost->getCost(Constants::MTG_NB_COLORS)){
diff[Constants::MTG_NB_COLORS * 2 + 1] = 0;
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
if (diff[i*2 + 1] > 0){
diff[Constants::MTG_NB_COLORS * 2 + 1] += diff[i*2 + 1];
diff[i*2 + 1] = 0;
}
}
}
ManaCost * result = NEW ManaCost(diff, Constants::MTG_NB_COLORS +1);
return result;
}
#ifdef WIN32
void ManaCost::Dump(){
char buf[4096];
OutputDebugString("\n===ManaCost===\n");
for (int i=0; i<= Constants::MTG_NB_COLORS; i++){
if (cost[i]) {
sprintf(buf, "%c:%i - ", Constants::MTGColorChars[i],cost[i]);
OutputDebugString(buf);
}
}
for (unsigned int i=0; i< nbhybrids; i++){
ManaCostHybrid * h = hybrids[i];
sprintf(buf, "H:{%c:%i}/{%c:%i}", Constants::MTGColorChars[h->color1], h->value1, Constants::MTGColorChars[h->color2], h->value2);
OutputDebugString(buf);
}
OutputDebugString("\n=============\n");
}
#endif
ostream& operator<<(ostream& out, const ManaCost& m)
{
return out << "(manacost)";
}
void ManaPool::init(){
ManaCost::init();
#include "../include/config.h"
#include "../include/ManaCost.h"
#include "../include/ManaCostHybrid.h"
#include "../include/ExtraCost.h"
#include "../include/TargetChooser.h"
#include "../include/Targetable.h"
#include "../include/Player.h"
#include "../include/WEvent.h"
#if defined (WIN32)
#include <windows.h>
#endif
ManaCost * ManaCost::parseManaCost(string s, ManaCost * _manaCost, MTGCardInstance * c){
ManaCost * manaCost;
if (_manaCost){
manaCost = _manaCost;
}else{
manaCost = NEW ManaCost();
}
int state = 0;
unsigned int start = 0;
unsigned int end = 0;
while (!s.empty() && state != -1){
switch(state){
case 0:
start = s.find_first_of("{");
if (start == string::npos){
return manaCost;
}else{
state = 1;
}
break;
case 1:
end = s.find_first_of("}");
if (end == string::npos){
state = -1;
}else{
string value = s.substr(start+1, end - 1 - start);
if (value == "u"){
manaCost->add(Constants::MTG_COLOR_BLUE, 1);
}else if (value == "b"){
manaCost->add(Constants::MTG_COLOR_BLACK, 1);
}else if (value == "w"){
manaCost->add(Constants::MTG_COLOR_WHITE, 1);
}else if (value == "g"){
manaCost->add(Constants::MTG_COLOR_GREEN, 1);
}else if (value == "r"){
manaCost->add(Constants::MTG_COLOR_RED, 1);
}else if (value == "x"){
manaCost->x();
}else if (value == "t"){
//Tap is handled outside of Manacost
}else if (value[0] == 's'){
//sacrifice
OutputDebugString("Sacrifice\n");
TargetChooserFactory tcf;
TargetChooser * tc = NULL;
size_t target_start = value.find("(");
size_t target_end = value.find(")");
if (target_start!=string::npos && target_end!=string::npos){
string target = value.substr(target_start+1, target_end-1 - target_start);
tc = tcf.createTargetChooser(target,c);
}
manaCost->addExtraCost(NEW SacrificeCost(tc));
}else{
int intvalue = atoi(value.c_str());
int colors[2];
int values[2];
if (intvalue < 10 && value.size() > 1){
for (int i = 0; i < 2; i++){
char c = value[i];
if (c >='0' && c <='9'){
colors[i] = Constants::MTG_COLOR_ARTIFACT;
values[i] = c - '0';
}else{
for (int j = 0; j < Constants::MTG_NB_COLORS; j++){
if (c == Constants::MTGColorChars[j]){
colors[i] = j;
values[i] = 1;
}
}
}
}
manaCost->addHybrid(colors[0], values[0], colors[1], values[1]);
}else{
manaCost->add(Constants::MTG_COLOR_ARTIFACT, intvalue);
}
}
s = s.substr(end + 1);
state = 0;
}
break;
default:
break;
}
}
return manaCost;
}
ManaCost::ManaCost(){
init();
}
ManaCost::ManaCost(int _cost[], int nb_elems){
init();
int i;
int total = nb_elems;
for (i = 0; i < total; i++){
cost[_cost[i*2]] = _cost[i*2 + 1];
}
}
ManaCost::ManaCost(ManaCost * _manaCost){
init();
int i;
for (i=0; i<= Constants::MTG_NB_COLORS; i++){
cost[i] = _manaCost->getCost(i);
}
}
ManaCost::~ManaCost(){
for (unsigned int i = 0; i < nbhybrids ; i++){
SAFE_DELETE(hybrids[i]);
}
if (!extraCostsIsCopy) {
SAFE_DELETE(extraCosts);
}
}
void ManaCost::x(){
cost[Constants::MTG_NB_COLORS] = 1;
}
void ManaCost::init(){
int i;
for (i=0; i<= Constants::MTG_NB_COLORS; i++){
cost[i] = 0;
}
nbhybrids = 0;
extraCosts = NULL;
extraCostsIsCopy = 0;
}
void ManaCost::copy(ManaCost * _manaCost){
for (unsigned int i = 0; i <= Constants::MTG_NB_COLORS; i++){
cost[i] = _manaCost->getCost(i);
}
for (unsigned int i = 0; i < _manaCost->nbhybrids; i++){
hybrids[i] = NEW ManaCostHybrid((*_manaCost->hybrids[i]));
}
nbhybrids = _manaCost->nbhybrids;
if (_manaCost->extraCosts){
//TODO Deep copy ?
if(!extraCostsIsCopy) SAFE_DELETE(extraCosts);
extraCosts = _manaCost->extraCosts;
extraCostsIsCopy = 1;
}
}
int ManaCost::getCost(int color){
return cost[color];
}
ManaCostHybrid * ManaCost::getHybridCost(unsigned int i){
if (nbhybrids <= i) return NULL;
return hybrids[i];
}
int ManaCost::getMainColor(){
for (int i=0; i< Constants::MTG_NB_COLORS; i++){
if (cost[i]) return i;
}
return 0;
}
int ManaCost::hasColor(int color){
if (cost[color]) return 1;
for (unsigned int i = 0; i < nbhybrids; i++){
if (hybrids[i]->hasColor(color)) return 1;
}
return 0;
}
int ManaCost::isNull(){
if (getConvertedCost()) return 0;
if (extraCosts) return 0;
return 1;
}
int ManaCost::getConvertedCost(){
int result = 0;
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
result += cost[i];
}
for (unsigned int i = 0; i < nbhybrids; i++){
result+= hybrids[i]->getConvertedCost();
}
return result;
}
int ManaCost::remove(int color, int value){
cost[color] -= value;
return 1;
}
int ManaCost::add(int color, int value){
cost[color] += value;
return 1;
}
int ManaCost::add(ManaCost * _cost){
if(!_cost) return 0;
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
cost[i]+= _cost->getCost(i);
}
for (unsigned int i = 0; i < _cost->nbhybrids; i++){
hybrids[nbhybrids] = NEW ManaCostHybrid((*_cost->hybrids[i]));
nbhybrids++;
}
return 1;
}
string ManaCost::toString(){
return "ManaCost - Todo";
}
int ManaCost::addHybrid(int c1, int v1, int c2, int v2){
ManaCostHybrid * h = NEW ManaCostHybrid(c1,v1,c2,v2);
hybrids[nbhybrids] = h;
nbhybrids++;
return nbhybrids;
}
int ManaCost::addExtraCost(ExtraCost * _cost){
if (!extraCosts) extraCosts = NEW ExtraCosts();
extraCosts->costs.push_back(_cost);
OutputDebugString("Adding Sacrifice\n");
return 1;
}
int ManaCost::isExtraPaymentSet(){
if (!extraCosts) return 1;
OutputDebugString("Checking costs\n");
return extraCosts->isPaymentSet();
}
int ManaCost::resetExtraPayment(){
if (!extraCosts) return 1;
return extraCosts->reset();
}
int ManaCost::doPayExtra(){
if (!extraCosts) return 0;
return extraCosts->doPay(); //TODO reset ?
}
int ManaCost::setExtraCostsAction(MTGAbility * action, MTGCardInstance * card){
if (extraCosts) extraCosts->setAction(action, card);
return 1;
}
int ManaCost::pay(ManaCost * _cost){
ManaCost * diff = Diff(_cost);
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
cost[i] = diff->getCost(i);
}
delete diff;
return 1;
//TODO return 0 if can't afford the cost!
}
//return 1 if _cost can be paid with current data, 0 otherwise
int ManaCost::canAfford(ManaCost * _cost){
ManaCost * diff = Diff(_cost);
int positive = diff->isPositive();
delete diff;
if (positive){
return 1;
}
return 0;
}
int ManaCost::isPositive(){
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
if (cost[i] < 0){
return 0;
}
}
return 1;
}
void ManaCost::randomDiffHybrids(ManaCost * _cost, int diff[]){
int _nbhybrids = _cost->nbhybrids;
for (int i = 0; i < _nbhybrids; i++){
ManaCostHybrid * h = _cost->hybrids[i];
diff[h->color1 * 2 +1]-= h->value1;
}
}
int ManaCost::tryToPayHybrids(ManaCostHybrid * _hybrids[], int _nbhybrids, int diff[]){
if (!_nbhybrids) return 1;
int result = 0;
ManaCostHybrid * h = _hybrids[_nbhybrids -1];
if (diff[h->color1 * 2 +1] >= h->value1){
diff[h->color1 * 2 +1]-= h->value1;
result = tryToPayHybrids(_hybrids,_nbhybrids -1, diff);
if (result) return 1;
diff[h->color1 * 2 +1]+= h->value1;
}
if (diff[h->color2 * 2 +1] >= h->value2){
diff[h->color2 * 2 +1]-= h->value2;
result = tryToPayHybrids(_hybrids,_nbhybrids -1, diff);
if (result) return 1;
diff[h->color2 * 2 +1]+= h->value2;
}
return 0;
}
//compute the difference between two mana costs
ManaCost * ManaCost::Diff(ManaCost * _cost){
int diff[(Constants::MTG_NB_COLORS + 1 )* 2];
diff[Constants::MTG_NB_COLORS * 2] = Constants::MTG_NB_COLORS;
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
diff[i*2] = i;
diff[i*2 +1] = cost[i] - _cost->getCost(i);
}
int hybridResult = tryToPayHybrids(_cost->hybrids, _cost->nbhybrids, diff);
if (!hybridResult) randomDiffHybrids(_cost,diff);
//Colorless mana, special case
int colorless_idx = Constants::MTG_COLOR_ARTIFACT * 2 + 1;
if (diff[colorless_idx] < 0){
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
if (diff[i*2 + 1] > 0){
if (diff[i*2 + 1] + diff[colorless_idx] > 0){
diff[i*2 + 1] += diff[colorless_idx];
diff[colorless_idx] = 0;
break;
}else{
diff[colorless_idx] += diff[i*2 + 1];
diff[i*2 + 1] = 0;
}
}
}
}
//Cost X
if (_cost->getCost(Constants::MTG_NB_COLORS)){
diff[Constants::MTG_NB_COLORS * 2 + 1] = 0;
for (int i=0; i < Constants::MTG_NB_COLORS; i++){
if (diff[i*2 + 1] > 0){
diff[Constants::MTG_NB_COLORS * 2 + 1] += diff[i*2 + 1];
diff[i*2 + 1] = 0;
}
}
}
ManaCost * result = NEW ManaCost(diff, Constants::MTG_NB_COLORS +1);
return result;
}
#ifdef WIN32
void ManaCost::Dump(){
char buf[4096];
OutputDebugString("\n===ManaCost===\n");
for (int i=0; i<= Constants::MTG_NB_COLORS; i++){
if (cost[i]) {
sprintf(buf, "%c:%i - ", Constants::MTGColorChars[i],cost[i]);
OutputDebugString(buf);
}
}
for (unsigned int i=0; i< nbhybrids; i++){
ManaCostHybrid * h = hybrids[i];
sprintf(buf, "H:{%c:%i}/{%c:%i}", Constants::MTGColorChars[h->color1], h->value1, Constants::MTGColorChars[h->color2], h->value2);
OutputDebugString(buf);
}
OutputDebugString("\n=============\n");
}
#endif
ostream& operator<<(ostream& out, const ManaCost& m)
{
return out << "(manacost)";
}
void ManaPool::init(){
ManaCost::init();
WEvent * e = NEW WEventEmptyManaPool(this);
GameObserver::GetInstance()->receiveEvent(e);
}
ManaPool::ManaPool(Player * player):ManaCost(),player(player){}
ManaPool::ManaPool(ManaCost * _manaCost,Player * player):ManaCost(_manaCost),player(player){}
int ManaPool::remove (int color, int value){
int result = ManaCost::remove(color, value);
for (int i = 0; i < value; ++i){
WEvent * e = NEW WEventConsumeMana(color, this);
GameObserver::GetInstance()->receiveEvent(e);
}
return result;
}
int ManaPool::add(int color, int value, MTGCardInstance * source ){
int result = ManaCost::add(color, value);
for (int i = 0; i < value; ++i){
WEvent * e = NEW WEventEngageMana(color, source,this);
GameObserver::GetInstance()->receiveEvent(e);
}
return result;
}
int ManaPool::add(ManaCost * _cost, MTGCardInstance * source){
if(!_cost) return 0;
int result = ManaCost::add(_cost);
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
for (int j = 0; j < _cost->getCost(i); j++){
WEvent * e = NEW WEventEngageMana(i, source, this);
GameObserver::GetInstance()->receiveEvent(e);
}
}
return result;
}
int ManaPool::pay (ManaCost * _cost){
int current[Constants::MTG_NB_COLORS];
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
current[i] = cost[i];
}
int result = ManaCost::pay(_cost);
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
int value = current[i] - cost[i];
for (int j = 0; j <value; j++){
WEvent * e = NEW WEventConsumeMana(i, this);
GameObserver::GetInstance()->receiveEvent(e);
}
}
return result;
GameObserver::GetInstance()->receiveEvent(e);
}
ManaPool::ManaPool(Player * player):ManaCost(),player(player){}
ManaPool::ManaPool(ManaCost * _manaCost,Player * player):ManaCost(_manaCost),player(player){}
int ManaPool::remove (int color, int value){
int result = ManaCost::remove(color, value);
for (int i = 0; i < value; ++i){
WEvent * e = NEW WEventConsumeMana(color, this);
GameObserver::GetInstance()->receiveEvent(e);
}
return result;
}
int ManaPool::add(int color, int value, MTGCardInstance * source ){
int result = ManaCost::add(color, value);
for (int i = 0; i < value; ++i){
WEvent * e = NEW WEventEngageMana(color, source,this);
GameObserver::GetInstance()->receiveEvent(e);
}
return result;
}
int ManaPool::add(ManaCost * _cost, MTGCardInstance * source){
if(!_cost) return 0;
int result = ManaCost::add(_cost);
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
for (int j = 0; j < _cost->getCost(i); j++){
WEvent * e = NEW WEventEngageMana(i, source, this);
GameObserver::GetInstance()->receiveEvent(e);
}
}
return result;
}
int ManaPool::pay (ManaCost * _cost){
int current[Constants::MTG_NB_COLORS];
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
current[i] = cost[i];
}
int result = ManaCost::pay(_cost);
for (unsigned int i = 0; i < Constants::MTG_NB_COLORS; i++){
int value = current[i] - cost[i];
for (int j = 0; j <value; j++){
WEvent * e = NEW WEventConsumeMana(i, this);
GameObserver::GetInstance()->receiveEvent(e);
}
}
return result;
}

View File

@@ -46,7 +46,7 @@ OptionItem::OptionItem( string _id, string _displayValue) {
//Option Integer
void OptionInteger::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
if (hasFocus){
mFont->SetColor(options[Metrics::OPTION_ITEM_TCH].asColor(ARGB(255,255,255,0)));
}else{
@@ -106,7 +106,7 @@ void OptionSelect::initSelections(){
}
void OptionSelect::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
if (hasFocus){
mFont->SetColor(options[Metrics::OPTION_ITEM_TCH].asColor(ARGB(255,255,255,0)));
}else{
@@ -148,7 +148,7 @@ ostream& OptionSelect::toString(ostream& out) const
//OptionHeader
void OptionHeader::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
mFont->SetColor(options[Metrics::OPTION_HEADER_TC].asColor());
JRenderer * renderer = JRenderer::GetInstance();
@@ -157,7 +157,7 @@ void OptionHeader::Render(){
}
void OptionText::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
mFont->SetScale(.8);
mFont->SetColor(options[Metrics::OPTION_TEXT_TC].asColor());
@@ -245,7 +245,7 @@ void OptionProfile::populate(){
void OptionProfile::Render(){
JRenderer * renderer = JRenderer::GetInstance();
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
mFont->SetScale(1);
int spacing = 2+(int)mFont->GetHeight();
@@ -430,7 +430,7 @@ void OptionsList::Render(){
//List is empty.
if (!nbitems && failMsg != ""){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
mFont->SetColor(options[Metrics::MSG_FAIL_TC].asColor(ARGB(255,155,155,155)));
mFont->DrawString(failMsg.c_str(),SCREEN_WIDTH/2, 40, JGETEXT_RIGHT);
return;
@@ -623,7 +623,7 @@ void OptionsMenu::Update(float dt){
OptionsMenu::OptionsMenu(){
nbitems=0;
current=0;
mFont = GameApp::CommonRes->GetJLBFont("f3");
mFont = resources.GetJLBFont("f3");
for(int x=0;x<MAX_OPTION_TABS;x++)
tabs[x] = NULL;
}
@@ -705,7 +705,7 @@ void OptionsList::cancelSubmode()
void OptionString::Render(){
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
if (hasFocus){
mFont->SetColor(options[Metrics::OPTION_ITEM_TCH].asColor(ARGB(255,255,255,0)));
}else{

View File

@@ -21,7 +21,7 @@ PlayerData::PlayerData(MTGAllCards * allcards){
}
//COLLECTION
collection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), allcards->mCache, allcards);
collection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION,"",false).c_str(), allcards);
}

View File

@@ -2,7 +2,7 @@
#include "../include/ShopItem.h"
#include "../include/GameStateShop.h"
#include "../include/CardGui.h"
#include "../include/TexturesCache.h"
#include "../include/WResourceManager.h"
#include "../include/Translate.h"
#include <hge/hgedistort.h>
@@ -69,7 +69,7 @@ ShopItem::ShopItem(int id, JLBFont *font, int _cardid, float _xy[], bool hasFocu
if (card->getRarity() == Constants::RARITY_L) quantity = 50;
quad = NULL;
thumb = cache.getThumb(card);
thumb = resources.RetrieveCard(card,CACHE_THUMB);
if (!thumb) thumb = CardGui::alternateThumbQuad(card);
@@ -157,7 +157,7 @@ void ShopItem::Render(){
//NOTHING
}
if (mHasFocus){
if (card) quad = cache.getQuad(card);
if (card) quad = resources.RetrieveCard(card);
if (quad){
quad->SetColor(ARGB(255,255,255,255));
renderer->RenderQuad(quad,SCREEN_WIDTH - 105,SCREEN_HEIGHT/2 - 5,0, 0.9f,0.9f);
@@ -169,9 +169,6 @@ void ShopItem::Render(){
}
}
void ShopItem::Update(float dt)
{
if (mScale < mTargetScale){
@@ -231,7 +228,7 @@ ShopItems::ShopItems(int id, JGuiListener* listener, JLBFont* font, int x, int y
for (int i=0; i < SHOP_BOOSTERS; i++){
setIds[i] = _setIds[i];
};
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), NULL,_collection));
myCollection = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), _collection));
}
@@ -262,7 +259,7 @@ void ShopItems::Update(float dt){
char buffer[4096];
sprintf(buffer,"%s : %i credits",item->getText(),price);
if(!dialog){
dialog = NEW SimpleMenu(1,this,GameApp::CommonRes->GetJLBFont(Constants::MENU_FONT),SCREEN_WIDTH-300,SCREEN_HEIGHT/2,buffer);
dialog = NEW SimpleMenu(1,this,resources.GetJLBFont(Constants::MENU_FONT),SCREEN_WIDTH-300,SCREEN_HEIGHT/2,buffer);
dialog->Add(1,"Yes");
dialog->Add(2,"No");
}
@@ -336,7 +333,7 @@ void ShopItems::ButtonPressed(int controllerId, int controlId){
safeDeleteDisplay();
display = NEW CardDisplay(12,NULL, SCREEN_WIDTH - 200, SCREEN_HEIGHT/2,this,NULL,5);
MTGDeck * tempDeck = NEW MTGDeck(NULL,playerdata->collection->database);
MTGDeck * tempDeck = NEW MTGDeck(playerdata->collection->database);
int rare_or_mythic = Constants::RARITY_R;
int rnd = rand() % 8;
if (rnd == 0) rare_or_mythic = Constants::RARITY_M;

View File

@@ -43,21 +43,21 @@ SimpleMenu::SimpleMenu(int id, JGuiListener* listener, JLBFont* font, int x, int
JRenderer* renderer = JRenderer::GetInstance();
if (!spadeLTex) spadeLTex= GameApp::CommonRes->LoadTexture("spade_ul.png", TEX_TYPE_USE_VRAM);
if (!spadeRTex) spadeRTex = GameApp::CommonRes->LoadTexture("spade_ur.png", TEX_TYPE_USE_VRAM);
if (!spadeLTex) spadeLTex= resources.RetrieveTexture("spade_ul.png", RETRIEVE_MANAGE);
if (!spadeRTex) spadeRTex = resources.RetrieveTexture("spade_ur.png", RETRIEVE_MANAGE);
if (!jewelTex) jewelTex= renderer->CreateTexture(5, 5, TEX_TYPE_USE_VRAM);
if (!sideTex) sideTex = GameApp::CommonRes->LoadTexture("menuside.png", TEX_TYPE_USE_VRAM);
if (NULL == spadeL) spadeL = NEW JQuad(spadeLTex, 2, 1, 16, 13);
if (NULL == spadeR) spadeR = NEW JQuad(spadeRTex, 2, 1, 16, 13);
if (!sideTex) sideTex = resources.RetrieveTexture("menuside.png", RETRIEVE_MANAGE);
if (NULL == spadeL) spadeL = resources.RetrieveQuad("spade_ul.png", 2, 1, 16, 13, "spade_ul", RETRIEVE_MANAGE);
if (NULL == spadeR) spadeR = resources.RetrieveQuad("spade_ur.png", 2, 1, 16, 13, "spade_ur", RETRIEVE_MANAGE);
if (NULL == jewel) jewel = NEW JQuad(jewelTex, 1, 1, 3, 3);
if (NULL == side) side = NEW JQuad(sideTex, 1, 1, 1, 7);
if (NULL == side) side = resources.RetrieveQuad("menuside.png", 1, 1, 1, 7,"menuside", RETRIEVE_MANAGE);
if (NULL == titleFont)
{
GameApp::CommonRes->LoadJLBFont("smallface", 7);
titleFont = GameApp::CommonRes->GetJLBFont("smallface");
resources.LoadJLBFont("smallface", 7);
titleFont = resources.GetJLBFont("smallface");
}
if (NULL == stars) stars = NEW hgeParticleSystem("graphics/stars.psi", GameApp::CommonRes->GetQuad("stars"));
if (NULL == stars) stars = NEW hgeParticleSystem("graphics/stars.psi", resources.GetQuad("stars"));
stars->MoveTo(mX, mY);
}
@@ -129,7 +129,7 @@ void SimpleMenu::Render(){
if ((static_cast<SimpleMenuItem*>(mObjects[i]))->mY - LINE_HEIGHT * startId < mY + height - LINE_HEIGHT + 7)
{
if (static_cast<SimpleMenuItem*>(mObjects[i])->hasFocus()){
GameApp::CommonRes->GetJLBFont(Constants::MAIN_FONT)->DrawString(static_cast<SimpleMenuItem*>(mObjects[i])->desc.c_str(),mX+mWidth+10,mY+15);
resources.GetJLBFont(Constants::MAIN_FONT)->DrawString(static_cast<SimpleMenuItem*>(mObjects[i])->desc.c_str(),mX+mWidth+10,mY+15);
mFont->SetColor(options[Metrics::POPUP_MENU_TCH].asColor(ARGB(255,255,255,0)));
}
else
@@ -178,13 +178,13 @@ void SimpleMenu::Close()
}
void SimpleMenu::destroy(){
SAFE_DELETE(SimpleMenu::spadeR);
SAFE_DELETE(SimpleMenu::spadeL);
resources.Release(SimpleMenu::spadeR);
resources.Release(SimpleMenu::spadeL);
resources.Release(SimpleMenu::side);
resources.Release(SimpleMenu::spadeRTex);
resources.Release(SimpleMenu::spadeLTex);
resources.Release(SimpleMenu::sideTex);
SAFE_DELETE(SimpleMenu::jewel);
SAFE_DELETE(SimpleMenu::side);
SAFE_DELETE(SimpleMenu::spadeRTex);
SAFE_DELETE(SimpleMenu::spadeLTex);
SAFE_DELETE(SimpleMenu::jewelTex);
SAFE_DELETE(SimpleMenu::sideTex);
SAFE_DELETE(SimpleMenu::stars);
SAFE_DELETE(SimpleMenu::jewelTex);
}

View File

@@ -278,7 +278,7 @@ string SimplePad::Finish() {
void SimplePad::Render(){
//This could use some cleaning up to make margins more explicit
JLBFont * mFont = GameApp::CommonRes->GetJLBFont("f3");
JLBFont * mFont = resources.GetJLBFont("f3");
int offX = 0, offY = 0;
int kH = mFont->GetHeight();

View File

@@ -296,7 +296,7 @@ void TestSuite::initGame(){
for (int k = 0; k < initState.playerData[i].zones[j].nbitems; k++){
MTGCardInstance * card = getCardByMTGId(initState.playerData[i].zones[j].cards[k]);
char buf[4096];
sprintf(buf, "QUAD : %p\n", cache.getQuad(card));
sprintf(buf, "QUAD : %p\n", resources.RetrieveCard(card));
OutputDebugString(buf);
if (card && zone != p->game->library){
if (zone == p->game->inPlay){

View File

@@ -1,227 +0,0 @@
#include "../include/config.h"
#include "../include/TexturesCache.h"
#include "../include/GameOptions.h"
#include <JFileSystem.h>
TexturesCache cache;
TexturesCache::TexturesCache(){
nb_textures = 0;
totalsize = 0;
delete_previous = 0;
lastTime = 0;
#ifdef WIN32
char buf [4096];
sprintf(buf, " Init TextureCache : %p\n", this);
OutputDebugString(buf);
#endif
}
TexturesCache::~TexturesCache(){
LOG("==Destroying TexturesCache==");
for (map<string,CachedTexture*>::iterator it = cache.begin(); it != cache.end(); ++it){
delete it->second;
}
LOG("==Destroying TexturesCache Successful==");
}
int TexturesCache::isInCache(MTGCard * card, int type){
CachedTexture * tex = getCacheByCard(card, type);
if (tex) return 1;
return 0;
}
CachedTexture * TexturesCache::getCacheByCard(MTGCard *card, int type){
char _filename[512];
if (type == CACHE_THUMB){
sprintf(_filename, "sets/%s/thumbnails/%s", card->getSetName(), card->getImageName());
}else{
sprintf(_filename, "sets/%s/%s", card->getSetName(), card->getImageName());
}
string filename = _filename;
return cache[filename];
}
int TexturesCache::removeOldestQuad(){
int oldest = -1;
string result = "";
for (map<string,CachedTexture*>::iterator it = cache.begin(); it != cache.end(); ++it){
if (it->second && (oldest == -1 || oldest > it->second->lastTime)){
oldest = it->second->lastTime;
result = it->first;
}
}
if (oldest != -1){
removeQuad(result);
return 1;
}
return 0;
}
void TexturesCache::removeQuad(string id){
totalsize -= cache[id]->nbpixels;
delete cache[id];
cache.erase(id);
nb_textures--;
}
int TexturesCache::cleanup(){
int maxSize = options[Options::CACHESIZE].number * 100000;
if (!maxSize) maxSize = CACHE_SIZE_PIXELS;
while (totalsize > maxSize){
int result = removeOldestQuad();
if (!result) return 0;
}
return 1;
}
JQuad * TexturesCache::getQuad(string filename,MTGCard * card, int type){
CachedTexture * ctex = cache[filename];
if (!ctex){
if (cleanup()){
if (card) cache[filename] = NEW CachedTexture(card,type);
else cache[filename] = NEW CachedTexture(filename);
totalsize+= cache[filename]->nbpixels;
fprintf(stderr, "Total Size of cache in pixels: %i\n", totalsize);
nb_textures++;
}else{
//Error
return NULL;
}
}
cache[filename]->lastTime = lastTime++;
return cache[filename]->getQuad();
}
JQuad * TexturesCache::getQuad(MTGCard * card, int type){
char _filename[512];
if (type == CACHE_THUMB){
sprintf(_filename, "sets/%s/thumbnails/%s", card->getSetName(), card->getImageName());
}else{
sprintf(_filename, "sets/%s/%s", card->getSetName(), card->getImageName());
}
string filename = _filename;
return getQuad(filename,card,type);
}
CachedTexture::CachedTexture(string filename){
quad = NULL;
tex = NULL;
nbpixels = 0;
lastTime = 0;
if (fileExists(filename.c_str())) init(filename);
}
CachedTexture::CachedTexture(MTGCard * card, int type){
LOG("==Creating CardTexture Object");
JFileSystem* fs = JFileSystem::GetInstance();
char filename[100];
quad = NULL;
tex = NULL;
nbpixels = 0;
lastTime = 0;
if (type == CACHE_THUMB){
sprintf(filename, "sets/%s/thumbnails/%s", card->getSetName(), card->getImageName());
}else{
sprintf(filename, "sets/%s/%s", card->getSetName(), card->getImageName());
}
if (fileExists(filename)){
fs->DetachZipFile();
init(filename);
}else{
char zipname[100];
sprintf(zipname, "Res/sets/%s/%s.zip", card->getSetName(),card->getSetName());
if (fileExists(zipname)){
fs->AttachZipFile(zipname);
if (type == CACHE_THUMB){
sprintf(filename, "thumbnails/%s", card->getImageName());
}else{
sprintf(filename, "%s", card->getImageName());
}
init(filename);
}
}
LOG("CardTexture Object Creation succesful");
}
void CachedTexture::init(string filename){
tex = JRenderer::GetInstance()->LoadTexture(filename.c_str(), false,GU_PSM_5551);
if (tex){
quad = NEW JQuad(tex, 0.0f, 0.0f, tex->mWidth, tex->mHeight);
quad->SetHotSpot(tex->mWidth / 2, tex->mHeight / 2);
nbpixels = tex->mTexHeight * tex->mTexWidth;
}
}
JQuad * CachedTexture::getQuad(){
return quad;
}
CachedTexture::~CachedTexture(){
LOG("==Deleting CardTexture Object");
SAFE_DELETE(quad);
SAFE_DELETE(tex);
LOG("CardTexture Object deletion Succesful");
}
SampleCache * SampleCache::mInstance = NULL;
SampleCache * SampleCache::GetInstance(){
if (!mInstance) mInstance = NEW SampleCache();
return mInstance;
}
JSample * SampleCache::getSample(string filename){
lastTime++;
map<string,SampleCached *>::iterator it = cache.find(filename);
if (it == cache.end()){
if (cache.size() >10) cleanOldest(); //Poor man's limit
JSample * sample = GameApp::CommonRes->ssLoadSample(filename.c_str());
if (!sample && fileExists(GameApp::CommonRes->sfxFile(filename).c_str())){ //Out of Ram ??
cleanCache();
sample = GameApp::CommonRes->ssLoadSample(filename.c_str());
}
cache[filename] = NEW SampleCached(lastTime, sample);
return sample;
}else{
it->second->lastTime = lastTime;
return (it->second->sample);
}
}
void SampleCache::cleanOldest(){
int smallest = lastTime;
map<string,SampleCached *>::iterator found = cache.end();
map<string,SampleCached *>::iterator it;
for (it = cache.begin(); it != cache.end(); it++){
if(it->second->lastTime <= smallest){
smallest = it->second->lastTime;
found = it;
}
}
if (found != cache.end()){
delete (found->second);
cache.erase(found);
}
}
void SampleCache::cleanCache(){
map<string,SampleCached *>::iterator it;
for (it = cache.begin(); it != cache.end(); it++){
delete(it->second);
}
cache.clear();
}
SampleCache::~SampleCache(){
cleanCache();
}
void SampleCache::DestroyInstance(){
SAFE_DELETE(mInstance);
}

View File

@@ -6,39 +6,582 @@
#include <string>
#include <stdlib.h>
#include <JGE.h>
#include <JFileSystem.h>
#include "../include/WResourceManager.h"
WResourceManager::WResourceManager(){
jrm = NEW JResourceManager();
WResourceManager resources;
WCachedResource::WCachedResource(){
locks = 0;
lastTime = resources.nowTime();
}
bool WCachedResource::isLocked(){
return (locks != 0);
}
void WCachedResource::lock(){
if(locks < 255)
locks++;
}
void WCachedResource::unlock(bool force){
if(force)
locks = 0;
else if(locks > 0)
locks--;
}
void WCachedResource::hit(){
lastTime = resources.nowTime();
}
WCachedTexture::WCachedTexture(){
texture = NULL;
}
WCachedTexture::~WCachedTexture(){
SAFE_DELETE(texture);
for(vector<JQuad*>::iterator i = trackedQuads.begin();i!=trackedQuads.end();i++)
SAFE_DELETE((*i));
}
JTexture * WCachedTexture::GetTexture(){
return texture;
}
bool WCachedTexture::ReleaseQuad(JQuad* quad){
SAFE_DELETE(texture);
for(vector<JQuad*>::iterator i = trackedQuads.begin();i!=trackedQuads.end();i++){
if((*i) == quad){
SAFE_DELETE(quad);
trackedQuads.erase(i);
return true;
}
}
return false;
}
JQuad * WCachedTexture::GetQuad(float offX, float offY, float width, float height){
if(texture == NULL)
return NULL;
if(width == 0.0f)
width = texture->mWidth;
if(height == 0.0f)
height = texture->mHeight;
vector<JQuad*>::iterator it;
for(it = trackedQuads.begin();it!=trackedQuads.end();it++)
if((*it)->mHeight == height && (*it)->mWidth == width
&& (*it)->mX == offX && (*it)->mY == offY)
return (*it);
JQuad * jq = NEW JQuad(texture,offX,offY,width,height);
trackedQuads.push_back(jq);
return jq;
}
JQuad * WCachedTexture::GetCard(float offX, float offY, float width, float height){
if(texture == NULL)
return NULL;
if(width == 0.0f)
width = texture->mWidth;
if(height == 0.0f)
height = texture->mHeight;
vector<JQuad*>::iterator it;
for(it = trackedQuads.begin();it!=trackedQuads.end();it++)
if((*it)->mHeight == height && (*it)->mWidth == width
&& (*it)->mX == offX && (*it)->mY == offY)
return (*it);
JQuad * jq = NEW JQuad(texture,offX,offY,width,height);
jq->SetHotSpot(jq->mTex->mWidth / 2, jq->mTex->mHeight / 2);
trackedQuads.push_back(jq);
return jq;
}
WCachedSample::WCachedSample(){
sample = NULL;
}
WCachedSample::~WCachedSample(){
SAFE_DELETE(sample);
}
JSample * WCachedSample::GetSample(){
return sample;
}
bool WResourceManager::cleanup(){
int maxSize = options[Options::CACHESIZE].number * 100000;
if (!maxSize) maxSize = CACHE_SIZE_PIXELS;
while (totalsize > maxSize){
int result = RemoveOldestTexture();
if (!result) return false;
}
return true;
}
unsigned int WResourceManager::nowTime(){
if(lastTime == 65535)
FlattenTimes();
return ++lastTime;
}
WCachedSample * WResourceManager::getCachedSample(string filename, bool makenew){
WCachedSample * csample = sampleCache[filename];
//Failed to cache it!
if(!csample && makenew){
csample = NEW WCachedSample();
//Space in cache, make new sample
if(cleanup()){
csample->sample = ssLoadSample(filename.c_str());
//Failed.
if(!csample->sample){
for(map<string,WCachedSample*>::iterator it=sampleCache.begin();it!=sampleCache.end();it++)
if(it->second == NULL){
sampleCache.erase(it);
break;
}
SAFE_DELETE(csample);
return NULL;
}
csample->hit();
sampleCache[filename] = csample;
}
else
return NULL; //Error.
}
return csample;
}
WCachedTexture * WResourceManager::getCachedTexture(string filename, bool makenew, int mode, int format){
WCachedTexture * ctex = textureCache[filename];
//Failed to cache it!
if(!ctex && makenew){
ctex = NEW WCachedTexture();
//Space in cache, make new texture
if(cleanup()){
ctex->texture = JRenderer::GetInstance()->LoadTexture(graphicsFile(filename).c_str(),mode,format);
//Couldn't create texture, so fail.
if(!ctex->texture){
for(map<string,WCachedTexture*>::iterator it=textureCache.begin();it!=textureCache.end();it++)
if(it->second == NULL){
textureCache.erase(it);
break;
}
SAFE_DELETE(ctex);
return NULL;
}
ctex->hit();
textureCache[filename] = ctex;
}
else
return NULL; //Error.
}
return ctex;
}
WCachedTexture * WResourceManager:: getCachedCard(MTGCard * card, int type, bool makenew){
string filename = card->getImageName();
if(type == CACHE_THUMB)
filename = "thumbnails/"+filename;
WCachedTexture * ctex = textureCache[filename];
//Failed to cache it!
if(!ctex && makenew){
ctex = NEW WCachedTexture();
//Space in cache, make new texture
if(cleanup()){
ctex->texture = JRenderer::GetInstance()->LoadTexture(cardFile(filename,card->getSetName()).c_str());
//Couldn't create texture, so fail.
if(!ctex->texture){
for(map<string,WCachedTexture*>::iterator it=textureCache.begin();it!=textureCache.end();it++)
if(it->second == NULL){
textureCache.erase(it);
break;
}
SAFE_DELETE(ctex);
return NULL;
}
ctex->hit();
textureCache[filename] = ctex;
}
else
return NULL; //Error.
}
return ctex;
}
void WResourceManager::FlattenTimes(){
unsigned int youngest = 65535;
unsigned int oldest = 0;
for (map<string,WCachedTexture*>::iterator it = textureCache.begin(); it != textureCache.end(); ++it){
if(!it->second) continue;
if(it->second->lastTime < youngest) youngest = it->second->lastTime;
if(it->second->lastTime > oldest) oldest = it->second->lastTime;
}
for (map<string,WCachedSample*>::iterator it = sampleCache.begin(); it != sampleCache.end(); ++it){
if(!it->second) continue;
if(it->second->lastTime < youngest) youngest = it->second->lastTime;
if(it->second->lastTime > oldest) oldest = it->second->lastTime;
}
for (map<string,WCachedSample*>::iterator it = sampleCache.begin(); it != sampleCache.end(); ++it){
if(!it->second) continue;
it->second->lastTime -= youngest;
}
for (map<string,WCachedTexture*>::iterator it = textureCache.begin(); it != textureCache.end(); ++it){
if(!it->second) continue;
it->second->lastTime -= youngest;
}
lastTime = oldest;
}
bool WResourceManager::RemoveOldestTexture(){
map<string,WCachedTexture*>::iterator oldest;
for(map<string,WCachedTexture*>::iterator it = textureCache.begin();it!=textureCache.end();it++){
if(it->second && (it->second->lastTime < oldest->second->lastTime
|| (oldest->second->isLocked() && !it->second->isLocked())))
oldest = it;
}
if(oldest != textureCache.end()){
SAFE_DELETE(oldest->second)
textureCache.erase(oldest);
return true;
}
return false;
}
bool WResourceManager::RemoveOldestSample(){
map<string,WCachedSample*>::iterator it, saved;
saved = sampleCache.begin();
for(it = sampleCache.begin();it!=sampleCache.end();it++){
if(it->second->lastTime < saved->second->lastTime)
saved = it;
}
if(saved != sampleCache.end()){
SAFE_DELETE(saved->second);
sampleCache.erase(saved);
return true;
}
return false;
}
WResourceManager::WResourceManager(){
#ifdef WIN32
char buf [4096];
sprintf(buf, " Init WResourceManager : %p\n", this);
OutputDebugString(buf);
#endif
mTextureList.clear();
mTextureList.reserve(16);
mTextureMap.clear();
mQuadList.clear();
mQuadList.reserve(128);
mQuadMap.clear();
mFontList.clear();
mFontList.reserve(4);
mFontMap.clear();
mMusicList.clear();
mMusicList.reserve(4);
mMusicMap.clear();
mSampleList.clear();
mSampleList.reserve(8);
mSampleMap.clear();
nb_textures = 0;
totalsize = 0;
lastTime = 0;
}
WResourceManager::~WResourceManager(){
SAFE_DELETE(jrm);
LOG("==Destroying WResourceManager==");
for (map<string,WCachedTexture*>::iterator it = textureCache.begin(); it != textureCache.end(); ++it){
delete it->second;
}
for (map<string,WCachedSample*>::iterator it = sampleCache.begin(); it != sampleCache.end(); ++it){
delete it->second;
}
textureCache.clear();
sampleCache.clear();
RemoveAll();
LOG("==Successfully Destroyed WResourceManager==");
}
string WResourceManager::graphicsFile(const string filename, const string specific, bool bFont){
char buf[512];
char file[512];
char lookup[512];
if(bFont)
sprintf(file,"%s.dat",filename.c_str());
JQuad * WResourceManager::RetrieveCard(MTGCard * card, int type, int style){
//Cards are never, ever resource managed, so just check cache.
WCachedTexture * tc;
if(style == RETRIEVE_EXISTING)
tc = getCachedCard(card,type,false);
else
tc = getCachedCard(card,type,true);
//Perform lock or unlock on entry.
if(style == RETRIEVE_LOCK) tc->lock();
else if(style == RETRIEVE_UNLOCK) tc->unlock();
//Texture exists! Get quad.
if(tc && tc->texture != NULL){
tc->hit();
return tc->GetCard();
}
return NULL;
}
JQuad * WResourceManager::RetrieveQuad(string filename, float offX, float offY, float width, float height, string resname, int style){
//Check our resources.
if(resname == "")
resname = filename;
//No exactly existant quad
JQuad * retval = GetQuad(resname);
if(retval != NULL || style == RETRIEVE_RESOURCE)
return retval;
//We have a managed resource named this!
JTexture * jtex = GetTexture(filename);
if(jtex){
//Check for an existing quad with this name and stats
JQuad * jq = GetQuad(resname);
if(jq && jq->mHeight == height && jq->mWidth == width && jq->mX == offX && jq->mY == offY)
return jq;
//Find a quad with these stats, regardless of name
for(vector<JQuad*>::iterator it=mQuadList.begin();it!=mQuadList.end();it++){
if((*it)->mHeight == height && (*it)->mWidth == width && (*it)->mX == offX && (*it)->mY == offY)
return (*it);
}
//Overwrite the existing quad, if any.
CreateQuad(resname,filename,offX,offY,width,height);
return GetQuad(resname);
}
//If we don't have an existing texture, check cache.
WCachedTexture * tc = NULL;
if(style != RETRIEVE_MANAGE){
if(style == RETRIEVE_EXISTING)
tc = getCachedTexture(filename,false);
else if(style == RETRIEVE_VRAM)
tc = getCachedTexture(filename,true,TEX_TYPE_USE_VRAM);
else
tc = getCachedTexture(filename);
}
//Quads never mess with locks. Ever.
if(style == RETRIEVE_MANAGE){
//Remove cache hit from cache
map<string,WCachedTexture*>::iterator it = textureCache.end();
tc = textureCache[filename];
for(it = textureCache.begin();it!=textureCache.end();it++){
if(it->second == tc)
break;
}
SAFE_DELETE(tc);
if(it != textureCache.end())
textureCache.erase(it);
//Pop texture & quad into resource manager
CreateQuad(resname,filename,offX,offY,width,height);
return GetQuad(resname);
}
//Texture exists! Get quad.
if(tc && tc->texture != NULL){
tc->hit();
return tc->GetQuad(offX,offY,width,height);
}
return NULL;
}
void WResourceManager::Release(JTexture * tex){
if(tex == NULL)
return;
map<string,WCachedTexture*>::iterator it;
for(it = textureCache.begin();it!=textureCache.end();it++){
if(it->second && it->second->texture == tex)
break;
}
if(it != textureCache.end()){
it->second->unlock();
if(!it->second->isLocked()){
SAFE_DELETE(it->second);
textureCache.erase(it);
}
}
}
void WResourceManager::Release(JQuad * quad){
map<string,WCachedTexture*>::iterator it;
if(quad == NULL)
return;
for(it = textureCache.begin();it!=textureCache.end();it++){
if(it->second && it->second->ReleaseQuad(quad))
break;
}
if(it != textureCache.end()){
it->second->unlock();
if(!it->second->isLocked()){
SAFE_DELETE(it->second);
textureCache.erase(it);
}
}
}
void WResourceManager::Release(JSample * sample){
if(sample == NULL)
return;
map<string,WCachedSample*>::iterator it;
for(it = sampleCache.begin();it!=sampleCache.end();it++){
if(it->second && it->second->sample == sample)
break;
}
if(it != sampleCache.end()){
it->second->unlock();
if(!it->second->isLocked()){
SAFE_DELETE(it->second);
sampleCache.erase(it);
}
}
}
JTexture * WResourceManager::RetrieveTexture(string filename, int style){
//Check our resources.
JTexture * retval = GetTexture(filename);
if(retval != NULL || style == RETRIEVE_RESOURCE)
return retval;
//Check cache.
WCachedTexture * tc = NULL;
if(style != RETRIEVE_MANAGE){
if(style == RETRIEVE_EXISTING)
tc = getCachedTexture(filename,false);
else if(style == RETRIEVE_VRAM)
tc = getCachedTexture(filename,true,TEX_TYPE_USE_VRAM);
else
tc = getCachedTexture(filename);
}
//Perform lock or unlock on entry.
if(style == RETRIEVE_LOCK || style == RETRIEVE_VRAM) tc->lock();
else if(style == RETRIEVE_UNLOCK) tc->unlock();
//Make a new managed resource
else if(style == RETRIEVE_MANAGE){
//Remove cache hit from cache
tc = textureCache[filename];
map<string,WCachedTexture*>::iterator it = textureCache.end();
for(it = textureCache.begin();it!=textureCache.end();it++){
if(it->second == tc)
break;
}
SAFE_DELETE(tc);
if(it != textureCache.end())
textureCache.erase(it);
//Pop texture into resource manager
CreateTexture(filename);
return GetTexture(filename);
}
//Texture exists! Get it.
if(tc->texture != NULL){
tc->hit();
return tc->GetTexture();
}
return retval;
}
JSample * WResourceManager::RetrieveSample(string filename, int style){
//Check our resources.
JSample * retval = GetSample(filename);
if(retval != NULL || style == RETRIEVE_RESOURCE)
return retval;
//Check cache.
WCachedSample * tc;
if(style != RETRIEVE_MANAGE){
if(style == RETRIEVE_EXISTING)
tc = getCachedSample(filename,false);
else
sprintf(file,"%s",filename.c_str());
tc = getCachedSample(filename);
}
//Perform lock or unlock on entry.
if(style == RETRIEVE_LOCK) tc->lock();
else if(style == RETRIEVE_UNLOCK) tc->unlock();
//Make a new managed resource
else if(style == RETRIEVE_MANAGE){
//Remove cache hit from cache
tc = sampleCache[filename];
map<string,WCachedSample*>::iterator it;
for(it = sampleCache.begin();it!=sampleCache.end();it++){
if(it->second == tc)
break;
}
if(stopgap.find(filename) != stopgap.end())
return stopgap[filename];
SAFE_DELETE(tc);
if(it != sampleCache.end())
sampleCache.erase(it);
//Pop sample into resource manager
LoadSample(filename);
return GetSample(filename);
}
//Sample exists! Get it.
if(tc->sample != NULL){
tc->hit();
return tc->GetSample();
}
return retval;
}
string WResourceManager::graphicsFile(const string filename, const string specific){
char buf[512];
//Check the specific location, if any.
if(specific != ""){
sprintf(buf,"%s/%s",specific.c_str(),file);
sprintf(lookup,"%s/%s",specific.c_str(),file);
if(fileOK(lookup,true)){
stopgap[filename] = buf;
sprintf(buf,"%s/%s",specific.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
}
}
//Check the theme folder.
@@ -46,12 +589,9 @@ string WResourceManager::graphicsFile(const string filename, const string specif
std::transform(theme.begin(), theme.end(), theme.begin(), ::tolower);
if(theme != "" || theme != "default"){
sprintf(buf,"themes/%s/%s",theme.c_str(),filename.c_str());
sprintf(lookup,"themes/%s/%s",theme.c_str(),file);
if(fileOK(lookup,true)){
stopgap[filename] = buf;
sprintf(buf,"themes/%s/%s",theme.c_str(),filename.c_str());
if(fileOK(buf,true))
return buf;
}
}
//Failure. Check mode graphics
@@ -60,34 +600,82 @@ string WResourceManager::graphicsFile(const string filename, const string specif
if(mode != "" && mode != "defualt"){
sprintf(buf,"modes/%s/graphics/%s",mode.c_str(),filename.c_str());
sprintf(lookup,"modes/%s/graphics/%s",mode.c_str(),file);
if(fileOK(lookup,true)){
stopgap[filename] = buf;
if(fileOK(buf,true))
return buf;
}
}
//Failure. Check graphics
char graphdir[512];
sprintf(graphdir,"graphics/%s",filename.c_str());
sprintf(lookup,"graphics/%s",file);
if(fileOK(lookup,true)){
stopgap[filename] = graphdir;
if(fileOK(graphdir,true))
return graphdir;
}
//Failure. Check sets.
sprintf(buf,"sets/%s",filename.c_str());
sprintf(lookup,"sets/%s",file);
if(fileOK(lookup,true)){
stopgap[filename] = buf;
if(fileOK(buf,true))
return buf;
}
//Complete abject failure. Probably a crash...
return graphdir;
}
string WResourceManager::cardFile(const string filename, const string setname, const string specific){
JFileSystem* fs = JFileSystem::GetInstance();
char buf[512];
char sets[512];
fs->DetachZipFile();
if(setname != "")
sprintf(sets,"sets/%s",setname.c_str());
else
sprintf(sets,"sets");
//Check the specific location, if any.
if(specific != ""){
sprintf(buf,"%s/%s/%s",specific.c_str(),sets,filename.c_str());
if(fileOK(buf,true))
return buf;
}
//Check the theme folder.
string theme = options[Options::ACTIVE_THEME].str;
std::transform(theme.begin(), theme.end(), theme.begin(), ::tolower);
if(theme != "" || theme != "default"){
sprintf(buf,"themes/%s/%s/%s",theme.c_str(),sets,filename.c_str());
if(fileOK(buf,true))
return buf;
}
//Failure. Check mode
string mode = options[Options::ACTIVE_MODE].str;
std::transform(mode.begin(), mode.end(), mode.begin(), ::tolower);
if(mode != "" && mode != "defualt"){
sprintf(buf,"modes/%s/%s/%s",mode.c_str(),sets,filename.c_str());
if(fileOK(buf,true))
return buf;
}
//Failure. Check sets
char defdir[512];
sprintf(defdir,"%s/%s",sets,filename.c_str());
if(fileOK(defdir,true))
return defdir;
//Failure. Assume it's in a zip file?
char zipname[100];
sprintf(zipname, "Res/sets/%s/%s.zip", setname.c_str(),setname.c_str());
if (fileExists(zipname)){
fs->AttachZipFile(zipname);
return filename;
}
//Complete abject failure. Probably a crash...
return defdir;
}
string WResourceManager::musicFile(const string filename, const string specific){
char buf[512];
@@ -179,58 +767,95 @@ int WResourceManager::fileOK(string filename, bool relative){
}
int WResourceManager::CreateTexture(const string &textureName) {
return jrm->CreateTexture(graphicsFile(textureName));
}
JTexture* WResourceManager::GetTexture(const string &textureName) {
return jrm->GetTexture(graphicsFile(textureName));
}
JTexture* WResourceManager::GetTexture(int id) {
return jrm->GetTexture(id);
}
map<string, int>::iterator itr = mTextureMap.find(textureName);
int WResourceManager::CreateQuad(const string &quadName, const string &textureName, float x, float y, float width, float height){
return jrm->CreateQuad(quadName, graphicsFile(textureName), x, y, width, height);
}
JQuad* WResourceManager::GetQuad(const string &quadName){
return jrm->GetQuad(quadName);
}
JQuad* WResourceManager::GetQuad(int id){
return jrm->GetQuad(id);
if (itr == mTextureMap.end())
{
string path = graphicsFile(textureName);
printf("creating texture:%s\n", path.c_str());
JTexture *tex = JRenderer::GetInstance()->LoadTexture(path.c_str());
if (tex == NULL)
return INVALID_ID;
int id = mTextureList.size();
mTextureList.push_back(tex);
mTextureMap[textureName] = id;
return id;
}
else
return itr->second;
}
int WResourceManager::LoadJLBFont(const string &fontName, int height){
return jrm->LoadJLBFont(graphicsFile(fontName), height);
}
JLBFont* WResourceManager::GetJLBFont(const string &fontName){
return jrm->GetJLBFont(graphicsFile(fontName, "", true));
}
map<string, int>::iterator itr = mFontMap.find(fontName);
JLBFont* WResourceManager::GetJLBFont(int id){
return jrm->GetJLBFont(id);
if (itr == mFontMap.end())
{
string path = graphicsFile(fontName);
printf("creating font:%s\n", path.c_str());
int id = mFontList.size();
mFontList.push_back(NEW JLBFont(path.c_str(), height, true));
mFontMap[fontName] = id;
return id;
}
else
return itr->second;
}
int WResourceManager::LoadMusic(const string &musicName){
return jrm->LoadMusic(musicFile(musicName));
}
JMusic* WResourceManager::GetMusic(const string &musicName){
return jrm->GetMusic(musicFile(musicName));
}
JMusic* WResourceManager::GetMusic(int id){
return jrm->GetMusic(id);
map<string, int>::iterator itr = mMusicMap.find(musicName);
if (itr == mMusicMap.end())
{
string path = musicFile(musicName);
printf("creating music:%s\n", path.c_str());
JMusic *music = JSoundSystem::GetInstance()->LoadMusic(path.c_str());
if (music == NULL)
return INVALID_ID;
int id = mMusicList.size();
mMusicList.push_back(music);
mMusicMap[musicName] = id;
return id;
}
else
return itr->second;
}
int WResourceManager::LoadSample(const string &sampleName){
return jrm->LoadSample(sfxFile(sampleName));
}
JSample* WResourceManager::GetSample(const string &sampleName){
return jrm->GetSample(sfxFile(sampleName));
}
JSample* WResourceManager::GetSample(int id){
return jrm->GetSample(id);
}
map<string, int>::iterator itr = mSampleMap.find(sampleName);
JTexture* WResourceManager::LoadTexture(const char* filename, int mode, int textureFormat){
return JRenderer::GetInstance()->LoadTexture(graphicsFile(filename).c_str(),mode,textureFormat);
if (itr == mSampleMap.end())
{
string path = sfxFile(sampleName);
printf("creating sample:%s\n", path.c_str());
JSample *sample = JSoundSystem::GetInstance()->LoadSample(path.c_str());
if (sample == NULL)
return INVALID_ID;
int id = mSampleList.size();
mSampleList.push_back(sample);
mSampleMap[sampleName] = id;
return id;
}
else
return itr->second;
}
JMusic * WResourceManager::ssLoadMusic(const char *fileName){
@@ -239,3 +864,40 @@ JMusic * WResourceManager::ssLoadMusic(const char *fileName){
JSample * WResourceManager::ssLoadSample(const char *fileName){
return JSoundSystem::GetInstance()->LoadSample(sfxFile(fileName).c_str());
}
//Unmodified from JResourceManager
int WResourceManager::CreateQuad(const string &quadName, const string &textureName, float x, float y, float width, float height){
map<string, int>::iterator itr = mQuadMap.find(quadName);
if (itr == mQuadMap.end())
{
JTexture *tex = GetTexture(textureName);
if (tex == NULL)
{
int texId = CreateTexture(textureName); // load texture if necessary
tex = GetTexture(texId);
}
if (tex == NULL) // no texture, no quad...
return INVALID_ID;
printf("creating quad:%s\n", quadName.c_str());
int id = mQuadList.size();
if(width == 0.0f)
width = tex->mWidth;
if(height == 0.0f)
height = tex->mHeight;
mQuadList.push_back(NEW JQuad(tex, x, y, width, height));
mQuadMap[quadName] = id;
return id;
}
else
return itr->second;
}