mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-12-28 15:55:51 +00:00
453 lines
9.4 KiB
C++
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;
|
|
}
|
|
}
|