beyond-all-reason / beyond-all-reason/RecoilEngine
`/ally` works unilaterally
- Dominant language
- C++
- Stars
- 679
- Forks
- 290
- Avg merge
- 3d 2h
- Merged PRs (30d)
- 40
Description
Anybody in an allyteam[^1] can do `/ally` and the engine just applies given alliance ([ceasefire](https://github.com/beyond-all-reason/RecoilEngine/issues/1656)) state. There is no way for other teammates to disagree (other than just unilaterally applying a different state), and no way for a game to say anything about it.
It would be good if this was up to game control.
Perhaps all there is to do would be to provide a basecontent gadget that listens to `/luarules ally` and calls `Spring.SetAlly` under a faithful replication the existing engine behaviour, then get rid of native `/ally`. `fixedAllies` would be a modoption.
[^1]: I didn't see any spectator check, I hope this doesn't mean that spectators can also control allyteam 0's ceasefire state or that you can desync a replay this way. Something to check and/or handle properly in the replacement gadget.
Contributor guide
Research direction
Start by tracing the native `/ally` entry point and the `/luarules ally` path, then inspect how a basecontent gadget could call `Spring.SetAlly`. Check spectator access and replay/desync behavior, and compare against the existing ceasefire behavior. Done means game control is possible without native `/ally`, with `fixedAllies` exposed as a modoption and the existing behavior faithfully preserved.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, lua
- Domain
- game-dev
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100