Skip to content

Instantly share code, notes, and snippets.

@BSVino
Last active October 17, 2016 03:28
Show Gist options
  • Select an option

  • Save BSVino/d76542f8f63480bb924c5c59246136f5 to your computer and use it in GitHub Desktop.

Select an option

Save BSVino/d76542f8f63480bb924c5c59246136f5 to your computer and use it in GitHub Desktop.
EntityList
#if 1
#define CRASH_1
#else
#define CRASH_2
#endif
#include <vector>
#include <string>
using namespace std;
struct Entity {
int m_index;
string m_name;
Entity(string name) { m_name = name; }
virtual struct Monster* AsMonster() { return nullptr; }
virtual struct Player* AsPlayer() { return nullptr; }
};
struct Player : public Entity {
int m_attacker = -1;
Player(string name) : Entity(name) { }
virtual struct Player* AsPlayer() { return this; }
};
struct Monster : public Entity {
int m_target = -1;
Monster(string name) : Entity(name) { }
virtual struct Monster* AsMonster() { return this; }
};
struct EntityList {
vector<Entity*> m_entities;
Entity* FindEntity(string name) {
for (size_t k = 0; k < m_entities.size(); k++) {
if (m_entities[k]->m_name == name)
return m_entities[k];
}
return nullptr;
}
Entity* GetEntity(int index) {
if (index < 0 || index >= m_entities.size())
return nullptr;
return m_entities[index];
}
};
struct GameFramework {
struct EntityReflection* m_entity_reflection;
struct PlayerInfo* m_player_info;
struct LevelData* m_level_data;
EntityList* m_entity_list;
};
struct Game {
struct NetworkLayer* m_network_layer;
struct PhysicsSimulation* m_physics_simulation;
GameFramework* m_game_framework;
static Game* s_game;
};
Game* Game::s_game = new Game;
__declspec(noinline) void Setup()
{
Game::s_game->m_game_framework = new GameFramework;
Game::s_game->m_game_framework->m_entity_list = new EntityList;
Player* player = new Player("player");
Monster* monster1 = new Monster("monster1");
Monster* monster2 = new Monster("monster2");
EntityList* list = Game::s_game->m_game_framework->m_entity_list;
auto PushEntity = [](EntityList* list, Entity* entity) {
entity->m_index = (int)list->m_entities.size();
list->m_entities.push_back(entity);
};
PushEntity(list, player);
PushEntity(list, monster1);
PushEntity(list, monster2);
player->m_attacker = monster1->m_index;
#ifdef CRASH_1
monster1->m_target = player->m_index;
#endif
#ifdef CRASH_2
monster1->m_target = -1;
#endif
monster2->m_target = monster1->m_index;
}
__declspec(noinline) string FindMonsterTarget(Entity* monster1, Entity* monster2, Entity* monster3, Entity* monster4, Entity* monster5) {
printf("%X %X %X %X\n", monster1, monster2, monster3, monster4);
#ifdef CRASH_2
return Game::s_game->m_game_framework->m_entity_list->GetEntity(monster4->AsMonster()->m_target)->AsPlayer()->m_name.c_str();
#endif
#ifdef CRASH_1
return Game::s_game->m_game_framework->m_entity_list->GetEntity(monster5->AsPlayer()->m_attacker)->m_name.c_str();
#endif
}
int main(int argc, const char** args)
{
Setup();
EntityList* list = Game::s_game->m_game_framework->m_entity_list;
Entity* player = list->FindEntity("player");
Entity* door1 = list->FindEntity("door1");
Entity* door2 = list->FindEntity("door2");
Entity* monster1 = list->FindEntity("monster1");
Entity* monster2 = list->FindEntity("monster2");
return (int)FindMonsterTarget(player, door1, door2, monster1, monster2).length();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment