Added MP campaign setup to the dedicated server & some console commands for managing the campaign

This commit is contained in:
Joonas Rikkonen
2017-09-17 20:03:18 +03:00
parent 9114ae658f
commit e26600d088
11 changed files with 218 additions and 42 deletions

View File

@@ -8,15 +8,6 @@ namespace Barotrauma
private InfoFrameTab selectedTab;
private GUIButton infoButton;
private GUIFrame infoFrame;
public Map Map
{
get
{
CampaignMode mode = (GameMode as CampaignMode);
return (mode == null) ? null : mode.Map;
}
}
private RoundSummary roundSummary;
public RoundSummary RoundSummary

View File

@@ -63,15 +63,18 @@ namespace Barotrauma
"Are you sure you want to choose a shuttle as your vessel?",
new string[] { "Yes", "No" });
msgBox.Buttons[0].OnClicked = (button, obj) => { StartNewGame?.Invoke(selectedSub, saveNameBox.Text, seedBox.Text); return true; };
string savePath = SaveUtil.CreateSavePath(isMultiplayer ? SaveUtil.SaveType.Multiplayer : SaveUtil.SaveType.Singleplayer, saveNameBox.Text);
msgBox.Buttons[0].OnClicked = (button, obj) => { StartNewGame?.Invoke(selectedSub, savePath, seedBox.Text); return true; };
msgBox.Buttons[0].OnClicked += msgBox.Close;
msgBox.Buttons[1].OnClicked = msgBox.Close;
return false;
}
string savePath = SaveUtil.CreateSavePath(isMultiplayer ? SaveUtil.SaveType.Multiplayer : SaveUtil.SaveType.Singleplayer, saveNameBox.Text);
StartNewGame?.Invoke(selectedSub, savePath, seedBox.Text);
else
{
string savePath = SaveUtil.CreateSavePath(isMultiplayer ? SaveUtil.SaveType.Multiplayer : SaveUtil.SaveType.Singleplayer, saveNameBox.Text);
StartNewGame?.Invoke(selectedSub, savePath, seedBox.Text);
}
return true;
};

View File

@@ -66,7 +66,6 @@
<Compile Include="Source\Characters\Character.cs" />
<Compile Include="Source\DebugConsole.cs" />
<Compile Include="Source\GameMain.cs" />
<Compile Include="Source\GameSession\GameSession.cs" />
<Compile Include="Source\GameSettings.cs" />
<Compile Include="Source\Items\Components\ItemComponent.cs" />
<Compile Include="Source\Items\Components\ItemLabel.cs" />
@@ -123,6 +122,9 @@
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Folder Include="Source\GameSession\" />
</ItemGroup>
<Import Project="..\BarotraumaShared\BarotraumaShared.projitems" Label="Shared" />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -72,11 +72,27 @@ namespace Barotrauma
int index = -1;
if (int.TryParse(string.Join(" ", args), out index))
{
GameMain.NetLobbyScreen.SelectedModeIndex = index;
if (index > 0 && index < GameMain.NetLobbyScreen.GameModes.Length &&
GameMain.NetLobbyScreen.GameModes[index].Name == "Campaign")
{
MultiplayerCampaign.StartCampaignSetup();
}
else
{
GameMain.NetLobbyScreen.SelectedModeIndex = index;
}
}
else
{
GameMain.NetLobbyScreen.SelectedModeName = string.Join(" ", args);
string modeName = string.Join(" ", args);
if (modeName.ToLowerInvariant() == "campaign")
{
MultiplayerCampaign.StartCampaignSetup();
}
else
{
GameMain.NetLobbyScreen.SelectedModeName = modeName;
}
}
NewMessage("Set gamemode to " + GameMain.NetLobbyScreen.SelectedModeName, Color.Cyan);
}));

View File

@@ -1,7 +0,0 @@
namespace Barotrauma
{
partial class GameSession
{
public const Map Map = null;
}
}

View File

@@ -21,26 +21,31 @@ namespace Barotrauma
set { selectedShuttle = value; lastUpdateID++; }
}
private GameModePreset[] GameModes;
private GameModePreset[] gameModes;
public GameModePreset[] GameModes
{
get { return gameModes; }
}
private int selectedModeIndex;
public int SelectedModeIndex
{
get { return selectedModeIndex; }
set {
set
{
lastUpdateID++;
selectedModeIndex = Math.Max(0, Math.Min(GameModes.Count()-1, value));
selectedModeIndex = MathHelper.Clamp(value, 0, gameModes.Length - 1);
}
}
public string SelectedModeName
{
get { return GameModes[SelectedModeIndex].Name; }
get { return gameModes[SelectedModeIndex].Name; }
set
{
for (int i = 0; i < GameModes.Count(); i++)
for (int i = 0; i < gameModes.Count(); i++)
{
if (GameModes[i].Name.ToLower() == value.ToLower())
if (gameModes[i].Name.ToLower() == value.ToLower())
{
SelectedModeIndex = i;
break;
@@ -51,7 +56,7 @@ namespace Barotrauma
public GameModePreset SelectedMode
{
get { return GameModes[SelectedModeIndex]; }
get { return gameModes[SelectedModeIndex]; }
}
public string ServerMessageText;
@@ -117,14 +122,9 @@ namespace Barotrauma
DebugConsole.NewMessage("Selected sub: " + SelectedSub.Name, Color.White);
DebugConsole.NewMessage("Selected shuttle: " + SelectedShuttle.Name, Color.White);
GameModes = GameModePreset.list.ToArray();
gameModes = GameModePreset.list.ToArray();
}
public override void Select()
{
base.Select();
}
private List<Submarine> subs;
public List<Submarine> GetSubList()
{
@@ -152,5 +152,19 @@ namespace Barotrauma
get { return true; }
set { /* do nothing */ }
}
public void ToggleCampaignMode(bool enabled)
{
for (int i = 0; i < GameModes.Length; i++)
{
if ((GameModes[i].Name == "Campaign") == enabled)
{
selectedModeIndex = i;
break;
}
}
lastUpdateID++;
}
}
}

View File

@@ -50,7 +50,7 @@ namespace Barotrauma
public static List<ColoredText> Messages = new List<ColoredText>();
private delegate void QuestionCallback(string answer);
public delegate void QuestionCallback(string answer);
private static QuestionCallback activeQuestionCallback;
#if CLIENT
private static GUIComponent activeQuestionText;
@@ -634,6 +634,65 @@ namespace Barotrauma
var character = FindMatchingCharacter(argsRight, false);
GameMain.Server.SetClientCharacter(client, character);
}));
commands.Add(new Command("campaigninfo|campaignstatus", "campaigninfo: Display information about the state of the currently active campaign.", (string[] args) =>
{
var campaign = GameMain.GameSession?.GameMode as CampaignMode;
if (campaign == null)
{
ThrowError("No campaign active!");
return;
}
campaign.LogState();
}));
commands.Add(new Command("campaigndestination|setcampaigndestination", "campaigndestination [index]: Set the location to head towards in the currently active campaign.", (string[] args) =>
{
var campaign = GameMain.GameSession?.GameMode as CampaignMode;
if (campaign == null)
{
ThrowError("No campaign active!");
return;
}
if (args.Length == 0)
{
int i = 0;
foreach (LocationConnection connection in campaign.Map.CurrentLocation.Connections)
{
NewMessage(" " + i + ". " + connection.OtherLocation(campaign.Map.CurrentLocation).Name, Color.White);
i++;
}
ShowQuestionPrompt("Select a destination (0 - " + (campaign.Map.CurrentLocation.Connections.Count - 1) + "):", (string selectedDestination) =>
{
int destinationIndex = -1;
if (!int.TryParse(selectedDestination, out destinationIndex)) return;
if (destinationIndex < 0 || destinationIndex >= campaign.Map.CurrentLocation.Connections.Count)
{
NewMessage("Index out of bounds!", Color.Red);
return;
}
Location location = campaign.Map.CurrentLocation.Connections[destinationIndex].OtherLocation(campaign.Map.CurrentLocation);
campaign.Map.SelectLocation(location);
NewMessage(location.Name+" selected.", Color.White);
});
}
else
{
int destinationIndex = -1;
if (!int.TryParse(args[0], out destinationIndex)) return;
if (destinationIndex < 0 || destinationIndex >= campaign.Map.CurrentLocation.Connections.Count)
{
NewMessage("Index out of bounds!", Color.Red);
return;
}
Location location = campaign.Map.CurrentLocation.Connections[destinationIndex].OtherLocation(campaign.Map.CurrentLocation);
campaign.Map.SelectLocation(location);
NewMessage(location.Name + " selected.", Color.White);
}
}));
#if DEBUG
commands.Add(new Command("spamevents", "A debug command that immediately creates entity events for all items, characters and structures.", (string[] args) =>
{
@@ -875,7 +934,7 @@ namespace Barotrauma
#endif
}
private static void ShowQuestionPrompt(string question, QuestionCallback onAnswered)
public static void ShowQuestionPrompt(string question, QuestionCallback onAnswered)
{
NewMessage(" >>" + question, Color.Cyan);
activeQuestionCallback += onAnswered;

View File

@@ -1,4 +1,5 @@
using System;
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Xml.Linq;
@@ -58,5 +59,33 @@ namespace Barotrauma
}
public abstract void Save(XElement element);
public void LogState()
{
DebugConsole.NewMessage("********* CAMPAIGN STATUS *********", Color.White);
DebugConsole.NewMessage(" Money: " + Money, Color.White);
DebugConsole.NewMessage(" Current location: " + map.CurrentLocation.Name, Color.White);
DebugConsole.NewMessage(" Available destinations: ", Color.White);
for (int i = 0; i < map.CurrentLocation.Connections.Count; i++)
{
Location destination = map.CurrentLocation.Connections[i].OtherLocation(map.CurrentLocation);
if (destination == map.SelectedLocation)
{
DebugConsole.NewMessage(" " + i + ". " + destination.Name + " [SELECTED]", Color.White);
}
else
{
DebugConsole.NewMessage(" " + i + ". " + destination.Name, Color.White);
}
}
if (map.SelectedConnection?.Mission != null)
{
DebugConsole.NewMessage(" Selected mission: " + map.SelectedConnection.Mission.Name, Color.White);
DebugConsole.NewMessage("\n" + map.SelectedConnection.Mission.Description, Color.White);
}
}
}
}

View File

@@ -75,7 +75,7 @@ namespace Barotrauma
GameMain.NetLobbyScreen.ToggleCampaignMode(true);
SaveUtil.SaveGame(GameMain.GameSession.SavePath);
campaign.LastSaveID++;
campaign.LastSaveID++;
};
campaignSetupUI.LoadGame = (string fileName) =>
@@ -104,6 +104,53 @@ namespace Barotrauma
return true;
};
}
#elif SERVER
public static void StartCampaignSetup()
{
DebugConsole.NewMessage("********* CAMPAIGN SETUP *********", Color.White);
DebugConsole.ShowQuestionPrompt("Do you want to start a new campaign? Y/N", (string arg) =>
{
if (arg.ToLowerInvariant() == "y" || arg.ToLowerInvariant() == "yes")
{
DebugConsole.ShowQuestionPrompt("Enter a save name for the campaign:", (string saveName) =>
{
if (string.IsNullOrWhiteSpace(saveName)) return;
string savePath = SaveUtil.CreateSavePath(SaveUtil.SaveType.Multiplayer, saveName);
GameMain.GameSession = new GameSession(new Submarine(GameMain.NetLobbyScreen.SelectedSub.FilePath, ""), savePath, GameModePreset.list.Find(g => g.Name == "Campaign"));
var campaign = ((MultiplayerCampaign)GameMain.GameSession.GameMode);
campaign.GenerateMap(GameMain.NetLobbyScreen.LevelSeed);
campaign.SetDelegates();
GameMain.NetLobbyScreen.ToggleCampaignMode(true);
SaveUtil.SaveGame(GameMain.GameSession.SavePath);
campaign.LastSaveID++;
DebugConsole.NewMessage("Campaign started!", Color.Cyan);
});
}
else
{
string[] saveFiles = SaveUtil.GetSaveFiles(SaveUtil.SaveType.Multiplayer);
DebugConsole.NewMessage("Saved campaigns:", Color.White);
for (int i = 0; i < saveFiles.Length; i++)
{
DebugConsole.NewMessage(" " + i + ". " + saveFiles[i], Color.White);
}
DebugConsole.ShowQuestionPrompt("Select a save file to load (0 - " + (saveFiles.Length - 1) + "):", (string selectedSave) =>
{
int saveIndex = -1;
if (!int.TryParse(selectedSave, out saveIndex)) return;
SaveUtil.LoadGame(saveFiles[saveIndex]);
((MultiplayerCampaign)GameMain.GameSession.GameMode).LastSaveID++;
GameMain.NetLobbyScreen.ToggleCampaignMode(true);
DebugConsole.NewMessage("Campaign loaded!", Color.Cyan);
});
}
});
}
#endif
private void SetDelegates()

View File

@@ -39,7 +39,16 @@ namespace Barotrauma
{
get { return level; }
}
public Map Map
{
get
{
CampaignMode mode = (GameMode as CampaignMode);
return (mode == null) ? null : mode.Map;
}
}
public Location StartLocation
{
get

View File

@@ -397,6 +397,19 @@ namespace Barotrauma
OnLocationSelected?.Invoke(selectedLocation, selectedConnection);
}
public void SelectLocation(Location location)
{
if (!locations.Contains(location))
{
DebugConsole.ThrowError("Failed to select a location. "+location.Name+" not found in the map.");
return;
}
selectedLocation = location;
selectedConnection = connections.Find(c => c.Locations.Contains(currentLocation) && c.Locations.Contains(selectedLocation));
OnLocationSelected?.Invoke(selectedLocation, selectedConnection);
}
public void Save(XElement element)
{
XElement mapElement = new XElement("map");