OP said elsewhere in the comments (emphasis mine):
Your code is allowed to peek at the game engine for the purposes of figuring out if it is being simulated by someone else’s code. Peeking at the game engine for other reasons, like figuring out how many of each opponents remain or attempting to modify the game engine itself or attempting to modify your opponents’ code from anywhere outside their own simulation of you is against the rules.
And in the original post:
You may save whatever information you want into the class instance’s fields but you may not save information between rounds or between class instantiations.
You are not peeking at the game engine, you can just message this the same as you can message cooperation (2, 0, 2 code etc).
You also do not need to save any information over instances—all of your bots on a round are running on the same instance. If any of your ForetellerBots observes SignalBot, then SignalBot has not dropped. SignalBot’s existence is in itself the flag.
Each pairing is independent of every other pairing. [You do know what round of the game it is and that you are facing an opponent. If you face a copy of yourself you are automatically awarded the maximum 5 points per round (2.5 points per bot). You otherwise do not know any history of the game to this point.
A separate instance of each bot is created for each pairing in each round. All that ForetellerBot knows in any pairing is whether it is itself facing a SignalBot, not whether any of its copies are.
OP said elsewhere in the comments (emphasis mine):
And in the original post:
You are not peeking at the game engine, you can just message this the same as you can message cooperation (2, 0, 2 code etc).
You also do not need to save any information over instances—all of your bots on a round are running on the same instance. If any of your ForetellerBots observes SignalBot, then SignalBot has not dropped. SignalBot’s existence is in itself the flag.
A separate instance of each bot is created for each pairing in each round. All that ForetellerBot knows in any pairing is whether it is itself facing a SignalBot, not whether any of its copies are.
Thanks for the info. This conflicts with the specification of
which I interpreted to mean that there exists exactly 1 instance of the class per round.
The model you propose makes sense though, I guess my mental model of the thing was mistaken.