opponent abstraction