void Battle::NextTurn() { std::queue<BattleEvent> events; std::sort(combatants.begin(), combatants.end(), [](Creature* a, Creature* b) { return a->GetAgility() > b->GetAgility(); }); for (auto com : combatants) { if (com->GetID() == "Player") { Dialogue targetSelection = Dialogue("Who?", {}); for (auto target : combatants) if (target->GetID() != "Player") targetSelection.AddChoice(target->GetName()); int choice = battleOptions.Activate(); switch (choice) { default: case 1: { int position = targetSelection.Activate(); for (int i = 0; i < position; i++) if (combatants[i]->GetID() == "Player") position++; Creature* target = combatants[position - 1]; events.push(BattleEvent(com, target, BattleEventType::ATTACK)); break; } case 2: { events.push(BattleEvent(com, nullptr, BattleEventType::DEFEND)); break; } } } else { Creature* player = *std::find_if(combatants.begin(), combatants.end(), [](Creature* a) { return a->GetID() == "Player"; }); events.push(BattleEvent(com, player, BattleEventType::ATTACK)); } } while (!events.empty()) { BattleEvent event = events.front(); switch (event.GetType()) { case BattleEventType::ATTACK: { auto a = combatants.begin(); auto b = combatants.end(); if (std::find(a, b, event.GetSource()) == b || std::find(a, b, event.GetTarget()) == b) break; std::cout << event.GetSource()->GetName() << " attacks " << event.GetTarget()->GetName() << " for " << event.Run() << " damage!" << std::endl; if (event.GetTarget()->GetHP() <= 0) Kill(event.GetTarget()); break; } case BattleEventType::DEFEND: std::cout << event.GetSource()->GetName() << " defends!\n"; break; default: break; } events.pop(); } }
void BattleView::Process(void) { Assert(m_eventQueue); if(!m_eventQueue) return; PointerList<BattleEvent>::PointerListNode *eventNode = m_eventQueue->GetHeadNode(); while (eventNode) { BattleEvent * event = eventNode->GetObj(); Assert(event); BattleViewActor * actor = event->GetActor(); bool addEvent = true; bool isAfterAttack = IsAfterAttack(*event); PointerList<BattleEvent>::PointerListNode * activeNode = m_activeEvents->GetHeadNode(); while (activeNode) { if (isAfterAttack && (activeNode->GetObj()->GetType() == BATTLE_EVENT_TYPE_ATTACK) ) { addEvent = false; break; } if((event->GetType() == BATTLE_EVENT_TYPE_PLACEMENT) && (activeNode->GetObj()->GetType() != BATTLE_EVENT_TYPE_PLACEMENT)) { addEvent = false; break; } if(activeNode->GetObj()->GetActor() == actor) { addEvent = false; break; } activeNode = activeNode->GetNext(); } if(addEvent) { PointerList<BattleEvent>::PointerListNode *addNode = eventNode; eventNode = eventNode->GetNext(); m_eventQueue->Remove(addNode); m_activeEvents->AddTail(event); } else { eventNode = eventNode->GetNext(); } } if(m_activeEvents->GetCount() > 0) { m_walker->SetList(m_activeEvents); while (m_walker->IsValid()) { BattleEvent * event = m_walker->GetObj(); Assert(event); event->Process(); if (event->IsFinished()) { m_walker->Remove(); delete event; if (!IsProcessing() && (!g_theCurrentBattle || !g_theCurrentBattle->IsDone())) { g_gevManager->GotUserInput(); } } else { m_walker->Next(); } } } }