Last active
October 17, 2016 03:28
-
-
Save BSVino/d76542f8f63480bb924c5c59246136f5 to your computer and use it in GitHub Desktop.
EntityList
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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