Route tutorial create requests to tutorial games (#8351)

This commit is contained in:
2026-07-08 11:20:59 -07:00
committed by GitHub
parent 0950fecb2e
commit 0aa7edbb06
4 changed files with 72 additions and 14 deletions
@@ -155,6 +155,7 @@ scala_library(
"//src/main/scala/net/eagle0/eagle/library/settings:max_supported_players",
"//src/main/scala/net/eagle0/eagle/model/proto_converters:tutorial_phase_converter",
"//src/main/scala/net/eagle0/eagle/model/proto_converters/game_state",
"//src/main/scala/net/eagle0/eagle/model/state:tutorial_phase",
"//src/main/scala/net/eagle0/eagle/model/state/game_state",
"//src/main/scala/net/eagle0/eagle/service/new_game_creation:game_parameters_utils",
"//src/main/scala/net/eagle0/eagle/service/persistence:save_directory",
@@ -17,6 +17,7 @@ import net.eagle0.eagle.common.tutorial_phase.TutorialPhase as TutorialPhaseProt
import net.eagle0.eagle.library.settings.MaxSupportedPlayers
import net.eagle0.eagle.library.EagleClientException
import net.eagle0.eagle.model.proto_converters.TutorialPhaseConverter
import net.eagle0.eagle.model.state.TutorialPhase
import net.eagle0.eagle.service.new_game_creation.GameParametersUtils
import net.eagle0.eagle.service.CustomBattleManager.CreateCustomBattleResponse
import net.eagle0.eagle.UserId
@@ -65,21 +66,22 @@ class EagleServiceImpl(
def createGame(
request: CreateGameRequest
): Future[CreateGameResponse] =
if request.tutorialStartPhase != TutorialPhaseProto.TUTORIAL_PHASE_UNKNOWN then
val startPhase = TutorialPhaseConverter.fromProto(request.tutorialStartPhase)
lockAndUpdateGamesWith(uid =>
gamesManager.createTutorialGameForUser(uid, new Random().nextLong(), startPhase = startPhase)
)
else
lockAndUpdateGamesWith(uid =>
gamesManager.createGameForUser(
expandedGameParameters = GameParametersUtils.defaultExpandedGameParameters,
userId = uid,
desiredLeaderTextId = request.desiredLeaderTextId,
maxHumanPlayers = request.humanPlayerCount,
totalPlayers = request.totalPlayerCount
EagleServiceImpl.tutorialStartPhaseForCreateGame(request) match {
case Some(startPhase) =>
lockAndUpdateGamesWith(uid =>
gamesManager.createTutorialGameForUser(uid, new Random().nextLong(), startPhase = startPhase)
)
)
case None =>
lockAndUpdateGamesWith(uid =>
gamesManager.createGameForUser(
expandedGameParameters = GameParametersUtils.defaultExpandedGameParameters,
userId = uid,
desiredLeaderTextId = request.desiredLeaderTextId,
maxHumanPlayers = request.humanPlayerCount,
totalPlayers = request.totalPlayerCount
)
)
}
private def createCustomBattle(
request: CustomBattleRequest
@@ -685,6 +687,13 @@ class EagleServiceImpl(
}
object EagleServiceImpl {
private[service] def tutorialStartPhaseForCreateGame(request: CreateGameRequest): Option[TutorialPhase] =
if request.tutorialStartPhase != TutorialPhaseProto.TUTORIAL_PHASE_UNKNOWN then
Some(TutorialPhaseConverter.fromProto(request.tutorialStartPhase))
else if request.skipTutorialBattle then Some(TutorialPhase.Expansion)
else if request.isTutorial then Some(TutorialPhase.OpeningBattle)
else None
def apply(
gamesManager: GamesManager,
customBattleManager: CustomBattleManager,
@@ -28,6 +28,18 @@ scala_test(
],
)
scala_test(
name = "eagle_service_impl_test",
timeout = "short",
srcs = ["EagleServiceImplTest.scala"],
deps = [
"//src/main/protobuf/net/eagle0/eagle/api:eagle_scala_grpc",
"//src/main/protobuf/net/eagle0/eagle/common:tutorial_phase_scala_proto",
"//src/main/scala/net/eagle0/eagle/model/state:tutorial_phase",
"//src/main/scala/net/eagle0/eagle/service",
],
)
scala_test(
name = "sqlite_history_test",
timeout = "moderate",
@@ -0,0 +1,36 @@
package net.eagle0.eagle.service
import net.eagle0.eagle.api.eagle.CreateGameRequest
import net.eagle0.eagle.common.tutorial_phase.TutorialPhase as TutorialPhaseProto
import net.eagle0.eagle.model.state.TutorialPhase
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
class EagleServiceImplTest extends AnyFlatSpec with Matchers {
"tutorialStartPhaseForCreateGame" should "start tutorial requests at the opening battle by default" in {
EagleServiceImpl.tutorialStartPhaseForCreateGame(
CreateGameRequest(isTutorial = true)
) shouldBe Some(TutorialPhase.OpeningBattle)
}
it should "start skip-battle tutorial requests at expansion" in {
EagleServiceImpl.tutorialStartPhaseForCreateGame(
CreateGameRequest(isTutorial = true, skipTutorialBattle = true)
) shouldBe Some(TutorialPhase.Expansion)
}
it should "prefer an explicit tutorial start phase" in {
EagleServiceImpl.tutorialStartPhaseForCreateGame(
CreateGameRequest(
isTutorial = true,
skipTutorialBattle = true,
tutorialStartPhase = TutorialPhaseProto.TUTORIAL_PHASE_MOBILIZATION
)
) shouldBe Some(TutorialPhase.Mobilization)
}
it should "leave normal game requests on the normal creation path" in {
EagleServiceImpl.tutorialStartPhaseForCreateGame(CreateGameRequest()) shouldBe None
}
}