Get_Name() << "이(가) 피해를 입음.\n"; break; case EVENTTYPE::UnitDeath: { cout << "[LOG] " << unit->Get_Name() << "이(가) 사망!\n"; if (auto monster = dynamic_cast(unit)) { shared_ptr dropItem = MonsterFactory::DropItem(monster->Get_MonsterType()); if (dropItem) { cout << "[DROP] " << dropItem->Get_ItemName() << " 획득!\n"; GameManager::GetInstance().Get_Player()->Add_Item(dropItem); } } } break; case EVENTTYPE::TurnStart: "> Get_Name() << "이(가) 피해를 입음.\n"; break; case EVENTTYPE::UnitDeath: { cout << "[LOG] " << unit->Get_Name() << "이(가) 사망!\n"; if (auto monster = dynamic_cast(unit)) { shared_ptr dropItem = MonsterFactory::DropItem(monster->Get_MonsterType()); if (dropItem) { cout << "[DROP] " << dropItem->Get_ItemName() << " 획득!\n"; GameManager::GetInstance().Get_Player()->Add_Item(dropItem); } } } break; case EVENTTYPE::TurnStart: "> Get_Name() << "이(가) 피해를 입음.\n"; break; case EVENTTYPE::UnitDeath: { cout << "[LOG] " << unit->Get_Name() << "이(가) 사망!\n"; if (auto monster = dynamic_cast(unit)) { shared_ptr dropItem = MonsterFactory::DropItem(monster->Get_MonsterType()); if (dropItem) { cout << "[DROP] " << dropItem->Get_ItemName() << " 획득!\n"; GameManager::GetInstance().Get_Player()->Add_Item(dropItem); } } } break; case EVENTTYPE::TurnStart: ">
#pragma once
#include "IObserver.h"
#include "Unit.h"
#include "Item.h"
#include "Monster.h"
#include "MonsterFactory.h"

class BattleLogger : public IObserver
{
public:
    void OnNotify(EVENTTYPE event, const Unit* unit) override
    {
        switch (event)
        {
        case EVENTTYPE::Damaged:
            cout << "[LOG] " << unit->Get_Name() << "이(가) 피해를 입음.\\n";
            break;

        case EVENTTYPE::UnitDeath:
        {
            cout << "[LOG] " << unit->Get_Name() << "이(가) 사망!\\n";

            if (auto monster = dynamic_cast<const Monster*>(unit))
            {
                shared_ptr<Item> dropItem = MonsterFactory::DropItem(monster->Get_MonsterType());

                if (dropItem)
                {
                    cout << "[DROP] " << dropItem->Get_ItemName() << " 획득!\\n";
                    GameManager::GetInstance().Get_Player()->Add_Item(dropItem);
                }
            }
        }
            break;

        case EVENTTYPE::TurnStart:
            cout << "[LOG] === 턴 시작 ===\\n";
            break;

        case EVENTTYPE::TurnEnd:
            cout << "[LOG] === 턴 종료 ===\\n";
            break;
        }
    }

};

  • Subject = EventSubject

  • Observer = BattleLogger

  • 이벤트 유발자 = Unit

  • 전투 중, 데미지를 받거나 사망하는 등의 이벤트가 발생하면, EventSubject 가 BattleLogger 에게 전파하고, BattleLogger 가 출력.

  • BattleManager 에서 Unit 들과, Subject 연결. 모든 유닛들이 같은 EventSubject 를 보게 됨.

image.png

  • 흐름은 다음과 같음.

image.png

image.png

  • 이제 Notify 로 전달받은 Target 유닛의 정보를 토대로 이벤트 로그 출력이 시작.