1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-12-28 15:55:51 +00:00
Aquaria/Aquaria/RecipeMenuEntry.cpp

453 lines
9.4 KiB
C++

/*
Copyright (C) 2007, 2010 - Bit-Blot
This file is part of Aquaria.
Aquaria is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "Game.h"
namespace RecipeMenuNamespace
{
int pageSize = 4;
std::string processFoodName(std::string name)
{
size_t p = name.find(' ');
if (p != std::string::npos)
{
name[p] = '\n';
}
return name;
}
}
using namespace RecipeMenuNamespace;
RecipeMenuEntry::RecipeMenuEntry(Recipe *recipe) : RenderObject(), recipe(recipe)
{
selected = 0;
// Quad *result, *i1, *i2, *i3;
// Recipe *recipe;
data = dsq->continuity.getIngredientDataByName(recipe->result);
if (data)
{
glow = new Quad("particles/glow", Vector(-100, 0));
glow->scale = Vector(4,4);
glow->setBlendType(BLEND_ADD);
glow->alphaMod = 0;
addChild(glow, PM_POINTER);
result = new Quad("ingredients/" + data->gfx, Vector(-100,0));
result->scale = Vector(0.7, 0.7);
addChild(result, PM_POINTER);
BitmapText *text = new BitmapText(&dsq->smallFont);
text->scale = Vector(0.7, 0.7);
text->color = 0;
text->position = result->position + Vector(0, 18);
text->setText(processFoodName(data->displayName));
addChild(text, PM_POINTER);
}
Quad *equals = new Quad("gui/recipe-equals", Vector(-50, 0));
equals->scale = Vector(0.7, 0.7);
addChild(equals, PM_POINTER);
int c = 0;
//int size = (recipe->names.size() + recipe->types.size())-1;
int size=0;
for (int i = 0; i < recipe->names.size(); i++)
size += recipe->names[i].amount;
for (int j = 0; j < recipe->types.size(); j++)
size += recipe->types[j].amount;
size --;
for (int i = 0; i < recipe->names.size(); i++)
{
debugLog("recipe name: " + recipe->names[i].name);
IngredientData *data = dsq->continuity.getIngredientDataByName(recipe->names[i].name);
if (data)
{
for (int j = 0; j < recipe->names[i].amount; j++)
{
ing[c] = new Quad("ingredients/" + data->gfx, Vector(100*c,0));
ing[c]->scale = Vector(0.7, 0.7);
addChild(ing[c], PM_POINTER);
BitmapText *text = new BitmapText(&dsq->smallFont);
text->scale = Vector(0.7, 0.7);
text->color = 0;
text->position = ing[c]->position + Vector(0, 18);
text->setText(processFoodName(data->displayName));
addChild(text, PM_POINTER);
if (c < size)
{
Quad *plus = new Quad("gui/recipe-plus", Vector(100*c+50, 0));
plus->scale = Vector(0.7, 0.7);
addChild(plus, PM_POINTER);
}
c++;
if (c > 3)
{
errorLog(recipe->result + std::string("'s ingredient count exceeded"));
break;
}
}
}
}
for (int i = 0; i < recipe->types.size(); i++)
{
//debugLog("recipe type: " + recipe->types[i].typeName);
for (int j = 0; j < recipe->types[i].amount; j++)
{
// any type of whatever...
BitmapText *text = new BitmapText(&dsq->smallFont);
text->color = 0;
text->scale = Vector(0.8, 0.8);
text->position = Vector(100*c, 0); //-20
std::string typeName = dsq->continuity.getIngredientDisplayName(recipe->types[i].typeName);
if (recipe->types[i].type != IT_ANYTHING)
typeName = dsq->continuity.stringBank.get(2031) + "\n" + typeName;
else
typeName = std::string("\n") + typeName;
text->setText(typeName);
addChild(text, PM_POINTER);
if (c < size)
{
Quad *plus = new Quad("gui/recipe-plus", Vector(100*c+50, 0));
plus->scale = Vector(0.7, 0.7);
addChild(plus, PM_POINTER);
}
c++;
}
}
description = 0;
alpha = 0;
alpha.interpolateTo(1, 0.2);
shareAlphaWithChildren = 1;
followCamera = 1;
}
void RecipeMenuEntry::onUpdate(float dt)
{
RenderObject::onUpdate(dt);
if (!game->recipeMenu.description)
return;
if (alpha.x == 1)
{
Vector p = result->getWorldPosition();
int w2 = 40, h2 = 32, w3 = 300;
if (core->mouse.position.x > p.x - w2
&& core->mouse.position.x < p.x + w3
&& core->mouse.position.y > p.y - h2
&& core->mouse.position.y < p.y + h2)
{
glow->alphaMod = 0.2;
std::ostringstream ds;
//ds << data->name << ": ";
//ds << "* ";
for (int i = 0; i < data->effects.size(); i++)
{
ds << dsq->continuity.getIEString(data, i);
if (i == data->effects.size()-1)
{
// do nothing
//ds << ".";
}
else
{
ds << ", ";
}
}
game->recipeMenu.description->setText(ds.str());
game->recipeMenu.description->offset = Vector(0, -10 * (game->recipeMenu.description->getNumLines()-1));
// description->setText(ds.str());
selected = 1;
}
else
{
glow->alphaMod = 0;
selected = 0;
int n=0;
for (int i = 0; i < game->recipeMenu.recipeMenuEntries.size(); i++)
{
if (!game->recipeMenu.recipeMenuEntries[i]->selected)
n++;
}
if (n == game->recipeMenu.recipeMenuEntries.size())
{
game->recipeMenu.description->setText("");
}
}
}
}
RecipeMenu::RecipeMenu()
{
on = false;
currentPage = 0;
description = 0;
}
void RecipeMenu::slide(RenderObject *r, bool in, float t)
{
int oy=-640;
if (in)
{
r->alpha = 1;
//r->alpha.interpolateTo(1, 0.2);
r->offset = Vector(0,oy);
r->offset.interpolateTo(Vector(0,0), t, 0, 0, 1);
}
else
{
r->alpha.interpolateTo(0, 1);
r->offset.interpolateTo(Vector(0,oy), t, 0, 0, 1);
}
}
int RecipeMenu::getNumKnown()
{
int num = 0;
for (int i = 0; i < dsq->continuity.recipes.size(); i++)
{
if (dsq->continuity.recipes[i].isKnown())
{
num++;
}
}
return num;
}
int RecipeMenu::getNumPages()
{
int numKnown = dsq->continuity.recipes.size();//getNumKnown();
int numPages = (numKnown/pageSize);
/*
for (int i = 0; i < dsq->continuity.recipes.size(); i++)
{
debugLog("r: " + dsq->continuity.recipes[i].result);
}
*/
std::ostringstream os;
os << "numKnown: " << numKnown << " pagesSize: " << pageSize << " numPages: " << numPages;
debugLog(os.str());
return numPages;
}
void RecipeMenu::goPrevPage()
{
if (getNumPages() <= 1) return;
dsq->sound->playSfx("recipemenu-pageturn");
destroyPage();
currentPage--;
if (currentPage < 0)
currentPage = getNumPages();
createPage(currentPage);
}
void RecipeMenu::goNextPage()
{
if (getNumPages() <= 1) return;
dsq->sound->playSfx("recipemenu-pageturn");
destroyPage();
currentPage++;
int pages = getNumPages();
if (currentPage > pages)
{
currentPage = 0;
}
createPage(currentPage);
}
void RecipeMenu::toggle(bool on, bool watch)
{
if (dsq->isNested()) return;
static bool toggling = false;
if (toggling) return;
debugLog("RecipeMenu::toggle");
toggling = true;
float t = 0.6;
if (on)
{
slide(scroll, 1, t);
slide(scrollEnd, 1, t);
slide(header, 1, t);
slide(page, 1, t);
dsq->sound->playSfx("recipemenu-open");
if (watch)
dsq->main(t);
if (!dsq->game->isInGameMenu())
{
slide(scroll, 0, 0);
slide(scrollEnd, 0, 0);
slide(header, 0, 0);
slide(page, 0, 0);
toggling = false;
return;
}
createPage(currentPage);
nextPage->alpha.interpolateTo(1, 0.2);
prevPage->alpha.interpolateTo(1, 0.2);
}
else
{
destroyPage();
slide(scroll, 0, t);
slide(scrollEnd, 0, t);
slide(header, 0, t);
slide(page, 0, t);
if (this->on)
dsq->sound->playSfx("recipemenu-close");
nextPage->alpha = 0;
prevPage->alpha = 0;
if (watch)
dsq->main(t);
}
this->on = on;
AquariaGuiElement::canDirMoveGlobal = !this->on;
toggling = false;
}
void RecipeMenu::createPage(int p)
{
int num = 0;
int startNum = p*pageSize;
int checkNum = 0;
for (int i = dsq->continuity.recipes.size()-1; i >=0 ; i--)
{
if (dsq->continuity.recipes[i].isKnown())
{
if (checkNum >= startNum)
{
if (num < pageSize)
{
RecipeMenuEntry *r = new RecipeMenuEntry(&dsq->continuity.recipes[i]);
recipeMenuEntries.push_back(r);
//80 + num * 70
r->position = Vector(500-5, 65 + num * 70);
dsq->game->addRenderObject(r, scroll->layer);
num++;
}
else
break;
}
else
{
checkNum++;
}
}
}
if (num == 0)
{
}
description = new BitmapText(&dsq->smallFont);
description->followCamera = 1;
description->scale = Vector(0.7, 0.7);
description->setAlign(ALIGN_LEFT);
description->position = Vector(364, 334); //most recent: (364, 334) //348, 328
description->color = Vector(0,0,0);//Vector(0.7,0,0);
description->setText("");
description->setWidth(500); // 1000??
dsq->game->addRenderObject(description, scroll->layer);
std::ostringstream os2;
os2 << dsq->continuity.stringBank.get(2006) << " " << currentPage+1 << "/" << getNumPages()+1;
page->setText(os2.str());
debugLog("done: " + os2.str());
}
void RecipeMenu::destroyPage()
{
for (int i = 0; i < recipeMenuEntries.size(); i++)
{
recipeMenuEntries[i]->setLife(1);
recipeMenuEntries[i]->setDecayRate(20);
recipeMenuEntries[i]->fadeAlphaWithLife = 1;
}
recipeMenuEntries.clear();
if (description)
{
description->setLife(1);
description->setDecayRate(4);
description->fadeAlphaWithLife = 1;
description = 0;
}
}