vec2 loc; /**< Used by render, to determine slot location on screen */
- InventoryEntry(void)
- : item(nullptr), count(0) {}
+ InventoryEntry(Item* i = nullptr, int c = 0, vec2 l = vec2())
+ : item(i), count(c), loc(l) {}
};
struct UseItemEvent {
*/
static bool take(const std::string& name, int count);
- static inline Item getItem(const std::string& s)
- { return itemList[s]; }
+ static void makeDrop(const vec2& p, InventoryEntry& ie);
+ static void makeDrop(const vec2& p, const std::string& s, int c);
+
+ static inline Item* getItem(const std::string& s)
+ { return &itemList[s]; }
};
#endif // INVENTORY_HPP_
*/
vec2 offset;
+std::size_t getUsedMem(void);
+void deleteRemaining(void);
+extern int balance;
+
+void print(void) {
+ std::cout << "Used memory: " << getUsedMem() << " bytes\n";
+ std::cout << "New/delete balance: " << balance << '\n';
+}
+
/**
* The main program.
* Init, load, run. Die.
static bool worldReset = false, worldDontReallyRun = false;
std::string worldActuallyUseThisXMLFile;
+ print();
+ atexit(print);
+ //atexit(deleteRemaining);
+
// handle command line args
if (argc > 1) {
for (int i = 1; i < argc; i++) {
WorldSystem::die();
WindowSystem::die();
- return 0; // Calls everything passed to atexit
+ return 0; // Calls everything passed to atexit
}
constexpr int memEntries = 2048;
return total;
}
+void deleteRemaining(void)
+{
+ for (int i = 0; i < memEntries; i++) {
+ if (mems[i] != nullptr) {
+ balance--;
+ std::free(mems[i]);
+ mems[i] = nullptr;
+ sizs[i] = 0;
+ }
+ }
+
+}
+
void *operator new(std::size_t n) throw (std::bad_alloc)
{
- auto buf = std::malloc(n);
balance++;
+ auto buf = std::malloc(n);
if (buf == nullptr)
throw std::bad_alloc();
void operator delete(void* p) throw ()
{
if (p != nullptr) {
- std::free(p);
balance--;
-
for (int i = 0; i < memEntries; i++) {
if (mems[i] == p) {
+ std::free(p);
mems[i] = nullptr;
sizs[i] = 0;
break;
(void)n;
if (p != nullptr) {
- std::free(p);
balance--;
-
for (int i = 0; i < memEntries; i++) {
if (mems[i] == p) {
+ std::free(p);
mems[i] = nullptr;
sizs[i] = 0;
break;
}
}
- auto e = game::entities.create();
- e.assign<Position>(mre.position.x, mre.position.y);
- e.assign<Direction>(0, 0.1f);
- e.assign<ItemDrop>(items[movingItem]);
- e.assign<Sprite>();
- e.component<Sprite>()->addSpriteSegment(
- SpriteData(items[movingItem].item->sprite), vec2(0, 0));
- auto dim = items[movingItem].item->sprite.getDim();
- e.assign<Solid>(HLINES(dim.x), HLINES(dim.y));
- e.assign<Visible>();
- e.assign<Physics>();
-
+ makeDrop(mre.position, items[movingItem]);
items[movingItem].item = nullptr;
items[movingItem].count = 0;
-
movingItem = -1;
}
}
+void InventorySystem::makeDrop(const vec2& p, InventoryEntry& ie)
+{
+ auto e = game::entities.create();
+ e.assign<Position>(p.x, p.y);
+ e.assign<Direction>(0, 0.1f);
+ e.assign<ItemDrop>(ie);
+ e.assign<Sprite>();
+ e.component<Sprite>()->addSpriteSegment(
+ SpriteData(ie.item->sprite), vec2(0, 0));
+ auto dim = ie.item->sprite.getDim();
+ e.assign<Solid>(HLINES(dim.x), HLINES(dim.y));
+ e.assign<Visible>();
+ e.assign<Physics>();
+}
+
+void InventorySystem::makeDrop(const vec2& p, const std::string& s, int c)
+{
+ auto item = getItem(s);
+ auto e = game::entities.create();
+ e.assign<Position>(p.x, p.y);
+ e.assign<Direction>(0, 0.1f);
+ InventoryEntry ie (item, c);
+ e.assign<ItemDrop>(ie);
+ e.assign<Sprite>();
+ e.component<Sprite>()->addSpriteSegment(
+ SpriteData(item->sprite), vec2(0, 0));
+ auto dim = item->sprite.getDim();
+ e.assign<Solid>(HLINES(dim.x), HLINES(dim.y));
+ e.assign<Visible>();
+ e.assign<Physics>();
+}
+
void InventorySystem::receive(const KeyDownEvent &kde)
{
if (kde.keycode == SDLK_e) {
e.assign<Physics>();
auto sprite = e.assign<Sprite>();
auto tex = InventorySystem::getItem("Arrow");
- sprite->addSpriteSegment(SpriteData(tex.sprite), 0);
+ sprite->addSpriteSegment(SpriteData(tex->sprite), 0);
auto dim = HLINES(sprite->getSpriteSize());
e.assign<Solid>(dim.x, dim.y);
e.assign<Hit>(10, false);
//glUniform4f(Render::worldShader.uniform[WU_tex_color], 1.0, 1.0, 1.0, 1.3 - static_cast<float>(alpha) / 255.0f);
//makeWorldDrawingSimplerEvenThoughAndyDoesntThinkWeCanMakeItIntoFunctions(0, fron_tex_coord, tex_coord, 6);
- // TODO make stars dynamic (make them particles??)
- static const Texture starTex ("assets/style/classic/bg/star.png"); // TODO why in theme, not just std.?
- const static float stardim = 24;
- GLfloat* star_coord = new GLfloat[stars.size() * 5 * 6 + 1];
- GLfloat* si = &star_coord[0];
-
if (worldShade > 0) {
+ static const Texture starTex ("assets/style/classic/bg/star.png"); // TODO why in theme, not just std.?
+ static const float stardim = 24;
+
+ GLfloat* star_coord = new GLfloat[stars.size() * 5 * 6 + 1];
+ auto si = &star_coord;
auto xcoord = offset.x * 0.9f;
for (auto &s : stars) {
glVertexAttribPointer(Render::worldShader.coord, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), &star_coord[0]);
glVertexAttribPointer(Render::worldShader.tex, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), &star_coord[3]);
glDrawArrays(GL_TRIANGLES, 0, stars.size() * 6);
- }
- delete[] star_coord;
+ delete[] star_coord;
+ }
Render::worldShader.disable();