beyond-all-reason / beyond-all-reason/RecoilEngine

`/ally` works unilaterally

Open
#2,264 1 comment 0 reactions 0 assignees View on GitHub
area: Lua API enhancement game compat
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.