Как правильно посчитать бонусы в карточной игре?
Выглядит как PubSub-задача. Допустим у нас есть карта "Король гоблинов" 5/5 таунт, класс - гоблины.
Когда мы кладем ее на стол она ( в смысле соответствующий объект ) отписывается от канала "для тех, кто лежит в руке" и подписывается на каналы "Лежим на столе", "Класс - гоблины", "Карты с таунтом" и тэ дэ. 
И посылает в соответствующие каналы сообщение - "Я 5/5 гоблин пришел на стол на такую-то позицию".
Таким образом мы можем баффать гоблинов, уничтожать вражеские таунты или баффать соседей по столу без перебора всех карт. Ну и добавление новых эффектов тоже с меньшей болью происходит
Я думаю, лучше обрабатывать с другой стороны - в игровом поле иметь список карт и список применённых бонусов. При использовании карты изменять характеристики как самой карты, так и игрового поля. И возможно, что придётся перерасчитывать каждую карту (зависит от применённой карты). Взяв карту и обработав её, игровое состояние сразу станет изменённым, и не нужно будет при каждой проверке перепроверять состояния каждой карты.