How about maintaining the state outside of the model's context for example in some SQLite database? The purpose of the language model would be as a language interface to a statically defined set of (SQL) commands/statements. And so on - there would be more problem's to be solved, of course, and sweet talking may always remain a possibility just as cheating is in any other game as well.
The current crop of LLMs are not able to consistently/logically update the state in the SQLite database based on player actions. They will update it when they are not supposed to, update it to the wrong value, and fail to update it entirely when they are supposed to.
I tried this. It sounds good on paper but the LLM will just "forget" to use it's tools. Either it will decline to query the database and just make stuff up, or it will decline to update the database when it should. The further along the game play gets the more out of sync the game word gets from the external state. I'm sure there is a clever solution but I never found it.
you're making the mistake to assume that leaving the structure of the communication and game play to the LLM is the only option. the LLM just is a tool serving a specific purpose in the game play. the LLM cannot forget to query if the query/state-management task is simply an imperative step in a loop. it's not left to the LLM to remember it.