501 lines
14 KiB
C++
501 lines
14 KiB
C++
#include "PrecompiledHeader.h"
|
|
|
|
#include "ModRules.h"
|
|
#include "utils.h"
|
|
#include "GameState.h"
|
|
#include "../../../JGE/src/tinyxml/tinyxml.h"
|
|
|
|
|
|
ModRules gModRules;
|
|
|
|
bool ModRules::load(string filename)
|
|
{
|
|
std::string xmlBuffer;
|
|
if (! JFileSystem::GetInstance()->readIntoString(filename, xmlBuffer))
|
|
{
|
|
DebugTrace("FATAL: cannot find modrules.xml");
|
|
return false;
|
|
}
|
|
|
|
TiXmlDocument doc;
|
|
doc.Parse(xmlBuffer.c_str());
|
|
|
|
for (TiXmlNode* node = doc.FirstChild(); node; node = node->NextSibling())
|
|
{
|
|
TiXmlElement* element = node->ToElement();
|
|
if (element != NULL)
|
|
{
|
|
if (element->ValueStr() == "menu")
|
|
{
|
|
menu.parse(element);
|
|
}
|
|
else if (element->ValueStr() == "general")
|
|
{
|
|
general.parse(element);
|
|
}
|
|
else if (element->ValueStr() == "cards")
|
|
{
|
|
cards.parse(element);
|
|
}
|
|
else if (element->ValueStr() == "game")
|
|
{
|
|
game.parse(element);
|
|
}
|
|
else if (element->ValueStr() == "cardgui")
|
|
{
|
|
cardgui.parse(element);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int ModRulesMenuItem::strToAction(string str)
|
|
{
|
|
if (str.compare("playMenu") == 0)
|
|
return MENUITEM_PLAY;
|
|
if (str.compare("deckEditor") == 0)
|
|
return MENUITEM_DECKEDITOR;
|
|
if (str.compare("shop") == 0)
|
|
return MENUITEM_SHOP;
|
|
if (str.compare("options") == 0)
|
|
return MENUITEM_OPTIONS;
|
|
if (str.compare("quit") == 0)
|
|
return MENUITEM_EXIT;
|
|
if (str.compare("trophies") == 0)
|
|
return MENUITEM_TROPHIES;
|
|
|
|
return MENUITEM_PLAY;
|
|
}
|
|
|
|
ModRulesMenuItem::ModRulesMenuItem(string actionIdStr, string displayName)
|
|
{
|
|
mActionId = strToAction(actionIdStr);
|
|
mDisplayName = displayName;
|
|
}
|
|
|
|
|
|
int ModRulesMenuItem::getMatchingGameState()
|
|
{
|
|
return getMatchingGameState(mActionId);
|
|
}
|
|
|
|
int ModRulesMenuItem::getMatchingGameState(int actionId)
|
|
{
|
|
switch (actionId)
|
|
{
|
|
case MENUITEM_DECKEDITOR:
|
|
return GAME_STATE_DECK_VIEWER;
|
|
case MENUITEM_SHOP:
|
|
return GAME_STATE_SHOP;
|
|
case MENUITEM_OPTIONS:
|
|
return GAME_STATE_OPTIONS;
|
|
case MENUITEM_TROPHIES:
|
|
return GAME_STATE_AWARDS;
|
|
default:
|
|
return GAME_STATE_NONE;
|
|
}
|
|
}
|
|
|
|
ModRulesMainMenuItem::ModRulesMainMenuItem(string actionIdStr, string displayName, int iconId, string particleFile):
|
|
ModRulesMenuItem(actionIdStr, displayName), mIconId(iconId), mParticleFile(particleFile)
|
|
{
|
|
}
|
|
|
|
JButton ModRulesOtherMenuItem::strToJButton(string str)
|
|
{
|
|
if (str.compare("btn_next") == 0)
|
|
return JGE_BTN_NEXT;
|
|
if (str.compare("btn_prev") == 0)
|
|
return JGE_BTN_PREV;
|
|
if (str.compare("btn_ctrl") == 0)
|
|
return JGE_BTN_CTRL;
|
|
if (str.compare("btn_menu") == 0)
|
|
return JGE_BTN_MENU;
|
|
if (str.compare("btn_cancel") == 0)
|
|
return JGE_BTN_CANCEL;
|
|
if (str.compare("btn_pri") == 0)
|
|
return JGE_BTN_PRI;
|
|
if (str.compare("btn_sec") == 0)
|
|
return JGE_BTN_SEC;
|
|
|
|
return JGE_BTN_NEXT;
|
|
}
|
|
|
|
|
|
ModRulesOtherMenuItem::ModRulesOtherMenuItem(string actionIdStr, string displayName, string keyStr): ModRulesMenuItem(actionIdStr, displayName)
|
|
{
|
|
mKey = strToJButton(keyStr);
|
|
}
|
|
|
|
void ModRulesMenu::parse(TiXmlElement* element)
|
|
{
|
|
TiXmlNode* mainNode = element->FirstChild("main");
|
|
if (mainNode) {
|
|
for (TiXmlNode* node = mainNode->ToElement()->FirstChild("item"); node; node = node->NextSibling("item"))
|
|
{
|
|
TiXmlElement* element = node->ToElement();
|
|
{
|
|
main.push_back(NEW ModRulesMainMenuItem(
|
|
element->Attribute("action"),
|
|
element->Attribute("displayName"),
|
|
atoi(element->Attribute("iconId")),
|
|
element->Attribute("particleFile")));
|
|
}
|
|
}
|
|
}
|
|
|
|
TiXmlNode* otherNode = element->FirstChild("other");
|
|
if (otherNode) {
|
|
for (TiXmlNode* node = otherNode->ToElement()->FirstChild("item"); node; node = node->NextSibling("item"))
|
|
{
|
|
TiXmlElement* element = node->ToElement();
|
|
if (element)
|
|
{
|
|
other.push_back(NEW ModRulesOtherMenuItem(
|
|
element->Attribute("action"),
|
|
element->Attribute("displayName"),
|
|
element->Attribute("key")));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ModRulesMenu::~ModRulesMenu()
|
|
{
|
|
for (size_t i = 0; i < main.size(); ++i)
|
|
SAFE_DELETE(main[i]);
|
|
|
|
for (size_t i = 0; i < other.size(); ++i)
|
|
SAFE_DELETE(other[i]);
|
|
|
|
main.clear();
|
|
other.clear();
|
|
}
|
|
|
|
//inGame rules
|
|
ModRulesGame::ModRulesGame()
|
|
{
|
|
mCanInterrupt = true;
|
|
}
|
|
|
|
void ModRulesGame::parse(TiXmlElement* element)
|
|
{
|
|
int value = ModRules::getValueAsInt(element, "canInterrupt");
|
|
if (value != -1)
|
|
mCanInterrupt = value > 0;
|
|
}
|
|
|
|
|
|
//General Rules
|
|
ModRulesGeneral::ModRulesGeneral()
|
|
{
|
|
mHasDeckEditor = true;
|
|
mHasShop = true;
|
|
}
|
|
|
|
void ModRulesGeneral::parse(TiXmlElement* element)
|
|
{
|
|
int value = ModRules::getValueAsInt(element, "hasDeckEditor");
|
|
if (value != -1)
|
|
mHasDeckEditor = value > 0;
|
|
|
|
value = ModRules::getValueAsInt(element, "hasShop");
|
|
if (value != -1)
|
|
mHasShop = value > 0;
|
|
|
|
}
|
|
|
|
int ModRules::getValueAsInt(TiXmlElement* element, string childName){
|
|
TiXmlNode* node = element->FirstChild(childName.c_str());
|
|
if (node) {
|
|
const char* value = node->ToElement()->GetText();
|
|
return atoi(value);
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
ModRulesCards::ModRulesCards()
|
|
{
|
|
activateEffect = NEW SimpleCardEffectRotate(M_PI/2); //Default activation effect
|
|
}
|
|
|
|
SimpleCardEffect * ModRulesCards::parseEffect(string s)
|
|
{
|
|
size_t limiter = s.find("(");
|
|
string function, params;
|
|
if (limiter != string::npos)
|
|
{
|
|
function = s.substr(0, limiter);
|
|
params = s.substr(limiter+1, s.size() - 2 - limiter);
|
|
}
|
|
else
|
|
{
|
|
function = s;
|
|
}
|
|
|
|
if (function.compare("rotate") == 0)
|
|
{
|
|
return NEW SimpleCardEffectRotate(M_PI*atoi(params.c_str())/180);
|
|
}
|
|
|
|
if (function.compare("mask") == 0)
|
|
{
|
|
vector<string> argb = split( params, ',');
|
|
if (argb.size() < 4)
|
|
{
|
|
DebugTrace("not enough params in mask");
|
|
return NULL;
|
|
}
|
|
PIXEL_TYPE mask = ARGB(
|
|
atoi(argb[0].c_str()),
|
|
atoi(argb[1].c_str()),
|
|
atoi(argb[2].c_str()),
|
|
atoi(argb[3].c_str())
|
|
);
|
|
return NEW SimpleCardEffectMask(mask);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void ModRulesCards::parse(TiXmlElement* element)
|
|
{
|
|
TiXmlNode* node = element->FirstChild("general");
|
|
if (node) {
|
|
TiXmlElement* generalElement = node->ToElement();
|
|
TiXmlNode* nodeActivation = generalElement->FirstChild("activate");
|
|
if (nodeActivation) {
|
|
TiXmlElement* activateElement = nodeActivation->ToElement();
|
|
TiXmlNode* nodeUIEvent = activateElement->FirstChild("uiEvent");
|
|
if (nodeUIEvent) {
|
|
const char* event = nodeUIEvent->ToElement()->GetText();
|
|
SAFE_DELETE(activateEffect);
|
|
activateEffect = parseEffect(event);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
ModRulesCards::~ModRulesCards()
|
|
{
|
|
SAFE_DELETE(activateEffect);
|
|
}
|
|
|
|
ModRulesBackGroundCardGuiItem::ModRulesBackGroundCardGuiItem(string ColorId,string ColorName, string DisplayImg, string DisplayThumb,string MenuIcon)
|
|
{
|
|
mColorId = atoi(ColorId.c_str());
|
|
MColorName = ColorName;
|
|
mDisplayImg = DisplayImg;
|
|
mDisplayThumb = DisplayThumb;
|
|
mMenuIcon = atoi(MenuIcon.c_str());
|
|
}
|
|
|
|
|
|
|
|
ModRulesRenderCardGuiItem::ModRulesRenderCardGuiItem(string name, int posX, int posY, string formattedData, string filter, bool font, int fontSize, PIXEL_TYPE fontColor, int SizeIcon,int IconPosX,int IconPosY,string FileName)
|
|
{
|
|
mName = name;
|
|
mPosX = posX;
|
|
mPosY = posY;
|
|
mFormattedData = formattedData;
|
|
mFilter = filter;
|
|
mFontSize = fontSize;
|
|
mFont = font;
|
|
mFontColor = fontColor;
|
|
mSizeIcon = SizeIcon;
|
|
mIconPosX = IconPosX;
|
|
mIconPosY = IconPosY;
|
|
mFileName = FileName;
|
|
|
|
}
|
|
|
|
void ModRulesCardGui::parse(TiXmlElement* element)
|
|
{
|
|
string _Name;
|
|
int _Posx;
|
|
int _Posy;
|
|
string _FormattedText;
|
|
string _Filter;
|
|
int _FontSize;
|
|
bool _Font;
|
|
PIXEL_TYPE _FontColor;
|
|
int _SizeIcon;
|
|
int _IconPosX;
|
|
int _IconPosY;
|
|
string _FileName;
|
|
|
|
|
|
|
|
TiXmlNode* mainNode = element->FirstChild("background");
|
|
if (mainNode) {
|
|
for (TiXmlNode* node = mainNode->ToElement()->FirstChild("card"); node; node = node->NextSibling("card"))
|
|
{
|
|
TiXmlElement* element = node->ToElement();
|
|
{
|
|
background.push_back(NEW ModRulesBackGroundCardGuiItem(
|
|
element->Attribute("id"),
|
|
element->Attribute("color"),
|
|
element->Attribute("img"),
|
|
element->Attribute("thumb"),
|
|
element->Attribute("menuicon")));
|
|
}
|
|
}
|
|
}
|
|
mainNode = element->FirstChild("renderbig");
|
|
if (mainNode) {
|
|
TiXmlNode* ChildNode;
|
|
for (TiXmlNode* node = mainNode->ToElement()->FirstChild("item"); node; node = node->NextSibling("item"))
|
|
{
|
|
_Name = node->ToElement()->Attribute("name");
|
|
_Posx = 0;
|
|
_Posy = 0;
|
|
_FormattedText = "";
|
|
_Filter = "";
|
|
_FontSize = 0;
|
|
_Font = false;
|
|
_FontColor = 0;
|
|
_SizeIcon = 0;
|
|
_IconPosX = 0;
|
|
_IconPosY = 0 ;
|
|
_FileName = "";
|
|
|
|
|
|
TiXmlElement* ItemElement = node->ToElement();
|
|
ChildNode = ItemElement->FirstChild("position");
|
|
if (ChildNode) {
|
|
_Posx = atoi(ChildNode->ToElement()->Attribute("x"));
|
|
_Posy = atoi(ChildNode->ToElement()->Attribute("y"));
|
|
}
|
|
ChildNode = ItemElement->FirstChild("formattedtext");
|
|
if (ChildNode) {
|
|
_FormattedText = ChildNode->ToElement()->GetText();
|
|
|
|
}
|
|
ChildNode = ItemElement->FirstChild("filter");
|
|
if (ChildNode) {
|
|
_Filter = ChildNode->ToElement()->GetText();
|
|
|
|
}
|
|
|
|
ChildNode = ItemElement->FirstChild("font");
|
|
if (ChildNode) {
|
|
_Font = true;
|
|
_FontSize = atoi(ChildNode->ToElement()->Attribute("size"));
|
|
vector<string> argb = split( ChildNode->ToElement()->Attribute("color"), ',');
|
|
_FontColor = ARGB(
|
|
atoi(argb[0].c_str()),
|
|
atoi(argb[1].c_str()),
|
|
atoi(argb[2].c_str()),
|
|
atoi(argb[3].c_str())
|
|
);
|
|
|
|
}
|
|
ChildNode = ItemElement->FirstChild("iconposition");
|
|
if (ChildNode) {
|
|
_IconPosX = atoi(ChildNode->ToElement()->Attribute("x"));
|
|
_IconPosY = atoi(ChildNode->ToElement()->Attribute("y"));
|
|
}
|
|
|
|
ChildNode = ItemElement->FirstChild("filename");
|
|
if (ChildNode) {
|
|
_FileName = ChildNode->ToElement()->GetText();
|
|
|
|
}
|
|
ChildNode = ItemElement->FirstChild("sizeicon");
|
|
if (ChildNode) {
|
|
_SizeIcon = atoi(ChildNode->ToElement()->GetText());
|
|
|
|
}
|
|
|
|
|
|
renderbig.push_back(NEW ModRulesRenderCardGuiItem( _Name, _Posx, _Posy, _FormattedText, _Filter,_Font, _FontSize, _FontColor,_SizeIcon,_IconPosX,_IconPosY,_FileName ));
|
|
}
|
|
}
|
|
mainNode = element->FirstChild("rendertinycrop");
|
|
if (mainNode) {
|
|
TiXmlNode* ChildNode;
|
|
for (TiXmlNode* node = mainNode->ToElement()->FirstChild("item"); node; node = node->NextSibling("item"))
|
|
{
|
|
_Name = node->ToElement()->Attribute("name");
|
|
_Posx = 0;
|
|
_Posy = 0;
|
|
_FormattedText = "";
|
|
_Filter = "";
|
|
_FontSize = 0;
|
|
_Font = false;
|
|
_FontColor = 0;
|
|
_SizeIcon = 0;
|
|
_IconPosX = 0;
|
|
_IconPosY = 0 ;
|
|
_FileName = "";
|
|
|
|
|
|
TiXmlElement* ItemElement = node->ToElement();
|
|
ChildNode = ItemElement->FirstChild("position");
|
|
if (ChildNode) {
|
|
_Posx = atoi(ChildNode->ToElement()->Attribute("x"));
|
|
_Posy = atoi(ChildNode->ToElement()->Attribute("y"));
|
|
}
|
|
ChildNode = ItemElement->FirstChild("formattedtext");
|
|
if (ChildNode) {
|
|
_FormattedText = ChildNode->ToElement()->GetText();
|
|
|
|
}
|
|
ChildNode = ItemElement->FirstChild("filter");
|
|
if (ChildNode) {
|
|
_Filter = ChildNode->ToElement()->GetText();
|
|
|
|
}
|
|
|
|
ChildNode = ItemElement->FirstChild("font");
|
|
if (ChildNode) {
|
|
_Font = true;
|
|
_FontSize = atoi(ChildNode->ToElement()->Attribute("size"));
|
|
vector<string> argb = split( ChildNode->ToElement()->Attribute("color"), ',');
|
|
_FontColor = ARGB(
|
|
atoi(argb[0].c_str()),
|
|
atoi(argb[1].c_str()),
|
|
atoi(argb[2].c_str()),
|
|
atoi(argb[3].c_str())
|
|
);
|
|
|
|
}
|
|
ChildNode = ItemElement->FirstChild("iconposition");
|
|
if (ChildNode) {
|
|
_IconPosX = atoi(ChildNode->ToElement()->Attribute("x"));
|
|
_IconPosY = atoi(ChildNode->ToElement()->Attribute("y"));
|
|
}
|
|
|
|
ChildNode = ItemElement->FirstChild("filename");
|
|
if (ChildNode) {
|
|
_FileName = ChildNode->ToElement()->GetText();
|
|
|
|
}
|
|
ChildNode = ItemElement->FirstChild("sizeicon");
|
|
if (ChildNode) {
|
|
_SizeIcon = atoi(ChildNode->ToElement()->GetText());
|
|
|
|
}
|
|
|
|
|
|
rendertinycrop.push_back(NEW ModRulesRenderCardGuiItem( _Name, _Posx, _Posy, _FormattedText, _Filter,_Font, _FontSize, _FontColor,_SizeIcon,_IconPosX,_IconPosY,_FileName ));
|
|
}
|
|
}
|
|
}
|
|
|
|
ModRulesCardGui::~ModRulesCardGui()
|
|
{
|
|
for (size_t i = 0; i < background.size(); ++i)
|
|
SAFE_DELETE(background[i]);
|
|
for (size_t i = 0; i < renderbig.size(); ++i)
|
|
SAFE_DELETE(renderbig[i]);
|
|
for (size_t i = 0; i < rendertinycrop.size(); ++i)
|
|
SAFE_DELETE(rendertinycrop[i]);
|
|
|
|
background.clear();
|
|
renderbig.clear();
|
|
rendertinycrop.clear();
|
|
|
|
}
|