1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-25 22:42:04 +02:00

basic multiplayer support

This commit is contained in:
Laserlicht
2025-10-25 17:55:25 +02:00
parent c6730a2dcc
commit 134017a7cd
5 changed files with 12 additions and 8 deletions

View File

@@ -1483,7 +1483,7 @@ void CPlayerInterface::playerBlocked(int reason, bool start)
{
if(reason == PlayerBlocked::EReason::UPCOMING_BATTLE)
{
if(GAME->server().howManyPlayerInterfaces() > 1 && GAME->interface() != this && GAME->interface()->makingTurn == false)
if(GAME->server().howManyPlayerInterfaces() > 1 && GAME->interface() != this && GAME->interface()->makingTurn == false && !GAME->map().getMap()->battleOnly)
{
//one of our players who isn't last in order got attacked not by our another player (happens for example in hotseat mode)
GAME->setInterfaceInstance(this);

View File

@@ -401,7 +401,7 @@ void ApplyClientNetPackVisitor::visitPlayerEndsGame(PlayerEndsGame & pack)
bool localHumanWinsGame = vstd::contains(cl.playerint, pack.player) && cl.gameInfo().getPlayerState(pack.player)->human && pack.victoryLossCheckResult.victory();
bool lastHumanEndsGame = GAME->server().howManyPlayerInterfaces() == 1 && vstd::contains(cl.playerint, pack.player) && cl.gameInfo().getPlayerState(pack.player)->human && !settings["session"]["spectate"].Bool();
if(lastHumanEndsGame || localHumanWinsGame)
if(lastHumanEndsGame || localHumanWinsGame || pack.silentEnd)
{
assert(adventureInt);
if(adventureInt)

View File

@@ -3480,10 +3480,13 @@ void CGameHandler::checkVictoryLossConditionsForPlayer(PlayerColor player)
if(gameState().getMap().battleOnly)
{
PlayerEndsGame peg;
peg.player = player;
peg.silentEnd = true;
sendAndApply(peg);
for(const auto & playerIt : gameState().players)
{
PlayerEndsGame peg;
peg.player = playerIt.first;
peg.silentEnd = true;
sendAndApply(peg);
}
gameServer().setState(EServerState::SHUTDOWN);
return;
}

View File

@@ -1021,7 +1021,7 @@ void CVCMIServer::multiplayerWelcomeMessage()
if(pi.second.isControlledByHuman())
humanPlayer++;
if(humanPlayer < 2) // Singleplayer
if(humanPlayer < 2 || mi->mapHeader->battleOnly) // Singleplayer or Battle only mode
return;
gh->playerMessages->broadcastSystemMessage(MetaString::createFromTextID("vcmi.broadcast.command"));

View File

@@ -26,6 +26,7 @@
#include "../../lib/entities/artifact/CArtifact.h"
#include "../../lib/entities/artifact/CArtifactFittingSet.h"
#include "../../lib/gameState/CGameState.h"
#include "../../lib/mapping/CMap.h"
#include "../../lib/mapObjects/CGTownInstance.h"
#include "../../lib/networkPacks/PacksForClientBattle.h"
#include "../../lib/spells/CSpellHandler.h"
@@ -275,7 +276,7 @@ void BattleResultProcessor::endBattle(const CBattleInfoCallback & battle)
bool isDefenderHuman = defenderPlayer && defenderPlayer->isHuman();
bool onlyOnePlayerHuman = isAttackerHuman != isDefenderHuman;
// in battles against neutrals attacker can ask to replay battle manually, additionally in battles against AI player human side can also ask for replay
if(onlyOnePlayerHuman)
if(onlyOnePlayerHuman || gameHandler->gameState().getMap().battleOnly)
{
auto battleDialogQuery = std::make_shared<CBattleDialogQuery>(gameHandler, battle.getBattle(), battleQuery->result);
battleResult->queryID = battleDialogQuery->queryID;