s2client-api icon indicating copy to clipboard operation
s2client-api copied to clipboard

In multithreaded and multi-player game, the Restart() in OnGameEnd() fails to work

Open monarchBacilluscoli opened this issue 6 years ago • 0 comments

The Update() will still return false thus breaks the main loop, although it have called AgentControl()->Restart() in OnGameEnd().
In single player game with a computer, it works fine. And maybe that is what caused the problem:

static void CallOnStep(Agent* a) {              // 0. Update()->StepAgents()->RunParallel()->[]step_agent()->CallOnStep() 
    ControlInterface* control = a->Control();
    if (!control->IsInGame()) {
        a->OnGameEnd();                         // 1. Ok, it calls OnGameEnd() and my AgentControl()->Restart() will be called soon!
        control->RequestLeaveGame();            // 2. ...OK...That's it
        return;
    }

    ActionInterface* action = a->Actions();
    control->IssueEvents(action->Commands());
    if (action) {
        action->SendActions();
    }

    ActionFeatureLayerInterface* action_feature_layer = a->ActionsFeatureLayer();
    if (action_feature_layer) {
        action_feature_layer->SendActions();
    }
}                                               // 4. Then it will return to Update() and return false, then the main loop breaks and my program exits
}

monarchBacilluscoli avatar Dec 11 '19 14:12 monarchBacilluscoli