Merge pull request #7072 from obrakmann/fmv-overhaul
Move FMV playback from Lua scripts to widgets
This commit is contained in:
@@ -91,6 +91,15 @@ namespace OpenRA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MapVideos
|
||||||
|
{
|
||||||
|
public string BackgroundInfo;
|
||||||
|
public string Briefing;
|
||||||
|
public string GameStart;
|
||||||
|
public string GameWon;
|
||||||
|
public string GameLost;
|
||||||
|
}
|
||||||
|
|
||||||
public class Map
|
public class Map
|
||||||
{
|
{
|
||||||
[FieldLoader.Ignore] public IFolder Container;
|
[FieldLoader.Ignore] public IFolder Container;
|
||||||
@@ -105,7 +114,6 @@ namespace OpenRA
|
|||||||
|
|
||||||
public string Title;
|
public string Title;
|
||||||
public string Type = "Conquest";
|
public string Type = "Conquest";
|
||||||
public string PreviewVideo;
|
|
||||||
public string Description;
|
public string Description;
|
||||||
public string Author;
|
public string Author;
|
||||||
public string Tileset;
|
public string Tileset;
|
||||||
@@ -134,6 +142,19 @@ namespace OpenRA
|
|||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[FieldLoader.LoadUsing("LoadVideos")]
|
||||||
|
public MapVideos Videos;
|
||||||
|
|
||||||
|
static object LoadVideos(MiniYaml y)
|
||||||
|
{
|
||||||
|
var videos = new MapVideos();
|
||||||
|
var nodesDict = y.ToDictionary();
|
||||||
|
if (nodesDict.ContainsKey("Videos"))
|
||||||
|
FieldLoader.Load(videos, nodesDict["Videos"]);
|
||||||
|
|
||||||
|
return videos;
|
||||||
|
}
|
||||||
|
|
||||||
[FieldLoader.Ignore] public Lazy<Dictionary<string, ActorReference>> Actors;
|
[FieldLoader.Ignore] public Lazy<Dictionary<string, ActorReference>> Actors;
|
||||||
|
|
||||||
public int PlayerCount { get { return Players.Count(p => p.Value.Playable); } }
|
public int PlayerCount { get { return Players.Count(p => p.Value.Playable); } }
|
||||||
@@ -375,7 +396,6 @@ namespace OpenRA
|
|||||||
"Title",
|
"Title",
|
||||||
"Description",
|
"Description",
|
||||||
"Author",
|
"Author",
|
||||||
"PreviewVideo",
|
|
||||||
"Tileset",
|
"Tileset",
|
||||||
"MapSize",
|
"MapSize",
|
||||||
"Bounds",
|
"Bounds",
|
||||||
@@ -391,6 +411,8 @@ namespace OpenRA
|
|||||||
root.Add(new MiniYamlNode(field, FieldSaver.FormatValue(this, f)));
|
root.Add(new MiniYamlNode(field, FieldSaver.FormatValue(this, f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
root.Add(new MiniYamlNode("Videos", FieldSaver.SaveDifferences(Videos, new MapVideos())));
|
||||||
|
|
||||||
root.Add(new MiniYamlNode("Options", FieldSaver.SaveDifferences(Options, new MapOptions())));
|
root.Add(new MiniYamlNode("Options", FieldSaver.SaveDifferences(Options, new MapOptions())));
|
||||||
|
|
||||||
root.Add(new MiniYamlNode("Players", null,
|
root.Add(new MiniYamlNode("Players", null,
|
||||||
|
|||||||
@@ -157,6 +157,8 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
map.MapResources = Exts.Lazy(() => new CellLayer<ResourceTile>(TileShape.Rectangle, size));
|
map.MapResources = Exts.Lazy(() => new CellLayer<ResourceTile>(TileShape.Rectangle, size));
|
||||||
map.MapTiles = Exts.Lazy(() => new CellLayer<TerrainTile>(TileShape.Rectangle, size));
|
map.MapTiles = Exts.Lazy(() => new CellLayer<TerrainTile>(TileShape.Rectangle, size));
|
||||||
|
|
||||||
|
map.Videos = new MapVideos();
|
||||||
|
|
||||||
map.Options = new MapOptions();
|
map.Options = new MapOptions();
|
||||||
|
|
||||||
if (legacyMapFormat == IniMapFormat.RedAlert)
|
if (legacyMapFormat == IniMapFormat.RedAlert)
|
||||||
@@ -174,6 +176,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
ReadCncTrees(file);
|
ReadCncTrees(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LoadVideos(file, "BASIC");
|
||||||
LoadActors(file, "STRUCTURES");
|
LoadActors(file, "STRUCTURES");
|
||||||
LoadActors(file, "UNITS");
|
LoadActors(file, "UNITS");
|
||||||
LoadActors(file, "INFANTRY");
|
LoadActors(file, "INFANTRY");
|
||||||
@@ -502,5 +505,33 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
|
|
||||||
map.Players.Add(section, pr);
|
map.Players.Add(section, pr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LoadVideos(IniFile file, string section)
|
||||||
|
{
|
||||||
|
foreach (var s in file.GetSection(section))
|
||||||
|
{
|
||||||
|
if (s.Value != "x" && s.Value != "<none>")
|
||||||
|
{
|
||||||
|
switch (s.Key)
|
||||||
|
{
|
||||||
|
case "Intro":
|
||||||
|
map.Videos.BackgroundInfo = s.Value.ToLower() + ".vqa";
|
||||||
|
break;
|
||||||
|
case "Brief":
|
||||||
|
map.Videos.Briefing = s.Value.ToLower() + ".vqa";
|
||||||
|
break;
|
||||||
|
case "Action":
|
||||||
|
map.Videos.GameStart = s.Value.ToLower() + ".vqa";
|
||||||
|
break;
|
||||||
|
case "Win":
|
||||||
|
map.Videos.GameWon = s.Value.ToLower() + ".vqa";
|
||||||
|
break;
|
||||||
|
case "Lose":
|
||||||
|
map.Videos.GameLost = s.Value.ToLower() + ".vqa";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA.Widgets
|
|||||||
{
|
{
|
||||||
class LeaveMapLogic
|
class LeaveMapLogic
|
||||||
{
|
{
|
||||||
enum Tab { Objectives, Chat };
|
enum Tab { Objectives, Chat }
|
||||||
Tab currentTab;
|
Tab currentTab;
|
||||||
|
|
||||||
OrderManager orderManager;
|
OrderManager orderManager;
|
||||||
@@ -125,6 +125,13 @@ namespace OpenRA.Mods.RA.Widgets
|
|||||||
var objectivesContainer = dialog.Get<ContainerWidget>("OBJECTIVES_PANEL");
|
var objectivesContainer = dialog.Get<ContainerWidget>("OBJECTIVES_PANEL");
|
||||||
Game.LoadWidget(world, panel, objectivesContainer, new WidgetArgs());
|
Game.LoadWidget(world, panel, objectivesContainer, new WidgetArgs());
|
||||||
objectivesContainer.IsVisible = () => currentTab == Tab.Objectives;
|
objectivesContainer.IsVisible = () => currentTab == Tab.Objectives;
|
||||||
|
|
||||||
|
string video = null;
|
||||||
|
if (world.LocalPlayer.WinState != WinState.Undefined)
|
||||||
|
video = world.LocalPlayer.WinState == WinState.Won ? world.Map.Videos.GameWon : world.Map.Videos.GameLost;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(video))
|
||||||
|
Media.PlayFMVFullscreen(world, video, () => { });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isMultiplayer)
|
if (isMultiplayer)
|
||||||
|
|||||||
@@ -23,14 +23,19 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
{
|
{
|
||||||
public class MissionBrowserLogic
|
public class MissionBrowserLogic
|
||||||
{
|
{
|
||||||
|
enum PlayingVideo { None, Info, Briefing, GameStart }
|
||||||
|
|
||||||
readonly Action onStart;
|
readonly Action onStart;
|
||||||
readonly ScrollPanelWidget descriptionPanel;
|
readonly ScrollPanelWidget descriptionPanel;
|
||||||
readonly LabelWidget description;
|
readonly LabelWidget description;
|
||||||
readonly SpriteFont descriptionFont;
|
readonly SpriteFont descriptionFont;
|
||||||
readonly DropDownButtonWidget difficultyButton;
|
readonly DropDownButtonWidget difficultyButton;
|
||||||
readonly ButtonWidget startVideoButton;
|
readonly ButtonWidget startBriefingVideoButton;
|
||||||
readonly ButtonWidget stopVideoButton;
|
readonly ButtonWidget stopBriefingVideoButton;
|
||||||
|
readonly ButtonWidget startInfoVideoButton;
|
||||||
|
readonly ButtonWidget stopInfoVideoButton;
|
||||||
readonly VqaPlayerWidget videoPlayer;
|
readonly VqaPlayerWidget videoPlayer;
|
||||||
|
readonly BackgroundWidget fullscreenVideoPlayer;
|
||||||
|
|
||||||
readonly ScrollPanelWidget missionList;
|
readonly ScrollPanelWidget missionList;
|
||||||
readonly ScrollItemWidget headerTemplate;
|
readonly ScrollItemWidget headerTemplate;
|
||||||
@@ -38,12 +43,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
|
|
||||||
MapPreview selectedMapPreview;
|
MapPreview selectedMapPreview;
|
||||||
|
|
||||||
bool showVideoPlayer;
|
PlayingVideo playingVideo;
|
||||||
|
|
||||||
string difficulty;
|
string difficulty;
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public MissionBrowserLogic(Widget widget, Action onStart, Action onExit)
|
public MissionBrowserLogic(Widget widget, World world, Action onStart, Action onExit)
|
||||||
{
|
{
|
||||||
this.onStart = onStart;
|
this.onStart = onStart;
|
||||||
|
|
||||||
@@ -54,16 +59,17 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
|
|
||||||
var title = widget.GetOrNull<LabelWidget>("MISSIONBROWSER_TITLE");
|
var title = widget.GetOrNull<LabelWidget>("MISSIONBROWSER_TITLE");
|
||||||
if (title != null)
|
if (title != null)
|
||||||
title.GetText = () => showVideoPlayer ? selectedMapPreview.Title : title.Text;
|
title.GetText = () => playingVideo != PlayingVideo.None ? selectedMapPreview.Title : title.Text;
|
||||||
|
|
||||||
widget.Get("MISSION_INFO").IsVisible = () => selectedMapPreview != null;
|
widget.Get("MISSION_INFO").IsVisible = () => selectedMapPreview != null;
|
||||||
|
|
||||||
var previewWidget = widget.Get<MapPreviewWidget>("MISSION_PREVIEW");
|
var previewWidget = widget.Get<MapPreviewWidget>("MISSION_PREVIEW");
|
||||||
previewWidget.Preview = () => selectedMapPreview;
|
previewWidget.Preview = () => selectedMapPreview;
|
||||||
previewWidget.IsVisible = () => !showVideoPlayer;
|
previewWidget.IsVisible = () => playingVideo == PlayingVideo.None;
|
||||||
|
|
||||||
videoPlayer = widget.Get<VqaPlayerWidget>("MISSION_VIDEO");
|
videoPlayer = widget.Get<VqaPlayerWidget>("MISSION_VIDEO");
|
||||||
widget.Get("MISSION_BIN").IsVisible = () => showVideoPlayer;
|
widget.Get("MISSION_BIN").IsVisible = () => playingVideo != PlayingVideo.None;
|
||||||
|
fullscreenVideoPlayer = Ui.LoadWidget<BackgroundWidget>("FULLSCREEN_PLAYER", Ui.Root, new WidgetArgs { { "world", world } });
|
||||||
|
|
||||||
descriptionPanel = widget.Get<ScrollPanelWidget>("MISSION_DESCRIPTION_PANEL");
|
descriptionPanel = widget.Get<ScrollPanelWidget>("MISSION_DESCRIPTION_PANEL");
|
||||||
|
|
||||||
@@ -72,10 +78,15 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
|
|
||||||
difficultyButton = widget.Get<DropDownButtonWidget>("DIFFICULTY_DROPDOWNBUTTON");
|
difficultyButton = widget.Get<DropDownButtonWidget>("DIFFICULTY_DROPDOWNBUTTON");
|
||||||
|
|
||||||
startVideoButton = widget.Get<ButtonWidget>("START_VIDEO_BUTTON");
|
startBriefingVideoButton = widget.Get<ButtonWidget>("START_BRIEFING_VIDEO_BUTTON");
|
||||||
stopVideoButton = widget.Get<ButtonWidget>("STOP_VIDEO_BUTTON");
|
stopBriefingVideoButton = widget.Get<ButtonWidget>("STOP_BRIEFING_VIDEO_BUTTON");
|
||||||
stopVideoButton.IsVisible = () => showVideoPlayer;
|
stopBriefingVideoButton.IsVisible = () => playingVideo == PlayingVideo.Briefing;
|
||||||
stopVideoButton.OnClick = StopVideo;
|
stopBriefingVideoButton.OnClick = () => StopVideo(videoPlayer);
|
||||||
|
|
||||||
|
startInfoVideoButton = widget.Get<ButtonWidget>("START_INFO_VIDEO_BUTTON");
|
||||||
|
stopInfoVideoButton = widget.Get<ButtonWidget>("STOP_INFO_VIDEO_BUTTON");
|
||||||
|
stopInfoVideoButton.IsVisible = () => playingVideo == PlayingVideo.Info;
|
||||||
|
stopInfoVideoButton.OnClick = () => StopVideo(videoPlayer);
|
||||||
|
|
||||||
var allMaps = new List<Map>();
|
var allMaps = new List<Map>();
|
||||||
missionList.RemoveChildren();
|
missionList.RemoveChildren();
|
||||||
@@ -114,12 +125,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
SelectMap(allMaps.First());
|
SelectMap(allMaps.First());
|
||||||
|
|
||||||
var startButton = widget.Get<ButtonWidget>("STARTGAME_BUTTON");
|
var startButton = widget.Get<ButtonWidget>("STARTGAME_BUTTON");
|
||||||
startButton.OnClick = StartMission;
|
startButton.OnClick = StartMissionClicked;
|
||||||
startButton.IsDisabled = () => selectedMapPreview.RuleStatus != MapRuleStatus.Cached;
|
startButton.IsDisabled = () => selectedMapPreview.RuleStatus != MapRuleStatus.Cached;
|
||||||
|
|
||||||
widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
|
widget.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
|
||||||
{
|
{
|
||||||
StopVideo();
|
StopVideo(videoPlayer);
|
||||||
Game.Disconnect();
|
Game.Disconnect();
|
||||||
Ui.CloseWindow();
|
Ui.CloseWindow();
|
||||||
onExit();
|
onExit();
|
||||||
@@ -128,7 +139,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
|
|
||||||
void CreateMissionGroup(string title, IEnumerable<Map> maps)
|
void CreateMissionGroup(string title, IEnumerable<Map> maps)
|
||||||
{
|
{
|
||||||
var header = ScrollItemWidget.Setup(headerTemplate, () => true, () => {});
|
var header = ScrollItemWidget.Setup(headerTemplate, () => true, () => { });
|
||||||
header.Get<LabelWidget>("LABEL").GetText = () => title;
|
header.Get<LabelWidget>("LABEL").GetText = () => title;
|
||||||
missionList.AddChild(header);
|
missionList.AddChild(header);
|
||||||
|
|
||||||
@@ -139,41 +150,35 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
var item = ScrollItemWidget.Setup(template,
|
var item = ScrollItemWidget.Setup(template,
|
||||||
() => selectedMapPreview != null && selectedMapPreview.Uid == map.Uid,
|
() => selectedMapPreview != null && selectedMapPreview.Uid == map.Uid,
|
||||||
() => SelectMap(map),
|
() => SelectMap(map),
|
||||||
StartMission);
|
StartMissionClicked);
|
||||||
|
|
||||||
item.Get<LabelWidget>("TITLE").GetText = () => map.Title;
|
item.Get<LabelWidget>("TITLE").GetText = () => map.Title;
|
||||||
missionList.AddChild(item);
|
missionList.AddChild(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float cachedSoundVolume;
|
|
||||||
float cachedMusicVolume;
|
|
||||||
void SelectMap(Map map)
|
void SelectMap(Map map)
|
||||||
{
|
{
|
||||||
StopVideo();
|
|
||||||
|
|
||||||
selectedMapPreview = Game.modData.MapCache[map.Uid];
|
selectedMapPreview = Game.modData.MapCache[map.Uid];
|
||||||
|
|
||||||
// Cache the rules on a background thread to avoid jank
|
// Cache the rules on a background thread to avoid jank
|
||||||
new Thread(selectedMapPreview.CacheRules).Start();
|
new Thread(selectedMapPreview.CacheRules).Start();
|
||||||
|
|
||||||
var video = selectedMapPreview.Map.PreviewVideo;
|
var briefingVideo = selectedMapPreview.Map.Videos.Briefing;
|
||||||
var videoVisible = video != null;
|
var briefingVideoVisible = briefingVideo != null;
|
||||||
var videoDisabled = !(videoVisible && GlobalFileSystem.Exists(video));
|
var briefingVideoDisabled = !(briefingVideoVisible && GlobalFileSystem.Exists(briefingVideo));
|
||||||
|
|
||||||
startVideoButton.IsVisible = () => videoVisible && !showVideoPlayer;
|
var infoVideo = selectedMapPreview.Map.Videos.BackgroundInfo;
|
||||||
startVideoButton.IsDisabled = () => videoDisabled;
|
var infoVideoVisible = infoVideo != null;
|
||||||
startVideoButton.OnClick = () =>
|
var infoVideoDisabled = !(infoVideoVisible && GlobalFileSystem.Exists(infoVideo));
|
||||||
{
|
|
||||||
showVideoPlayer = true;
|
|
||||||
videoPlayer.Load(video);
|
|
||||||
videoPlayer.PlayThen(StopVideo);
|
|
||||||
|
|
||||||
// Mute other distracting sounds
|
startBriefingVideoButton.IsVisible = () => briefingVideoVisible && playingVideo != PlayingVideo.Briefing;
|
||||||
cachedSoundVolume = Sound.SoundVolume;
|
startBriefingVideoButton.IsDisabled = () => briefingVideoDisabled || playingVideo != PlayingVideo.None;
|
||||||
cachedMusicVolume = Sound.MusicVolume;
|
startBriefingVideoButton.OnClick = () => PlayVideo(videoPlayer, briefingVideo, PlayingVideo.Briefing, () => StopVideo(videoPlayer));
|
||||||
Sound.SoundVolume = Sound.MusicVolume = 0;
|
|
||||||
};
|
startInfoVideoButton.IsVisible = () => infoVideoVisible && playingVideo != PlayingVideo.Info;
|
||||||
|
startInfoVideoButton.IsDisabled = () => infoVideoDisabled || playingVideo != PlayingVideo.None;
|
||||||
|
startInfoVideoButton.OnClick = () => PlayVideo(videoPlayer, infoVideo, PlayingVideo.Info, () => StopVideo(videoPlayer));
|
||||||
|
|
||||||
var text = map.Description != null ? map.Description.Replace("\\n", "\n") : "";
|
var text = map.Description != null ? map.Description.Replace("\\n", "\n") : "";
|
||||||
text = WidgetUtils.WrapText(text, description.Bounds.Width, descriptionFont);
|
text = WidgetUtils.WrapText(text, description.Bounds.Width, descriptionFont);
|
||||||
@@ -205,25 +210,72 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopVideo()
|
float cachedSoundVolume;
|
||||||
|
float cachedMusicVolume;
|
||||||
|
void MuteSounds()
|
||||||
{
|
{
|
||||||
if (!showVideoPlayer)
|
cachedSoundVolume = Sound.SoundVolume;
|
||||||
return;
|
cachedMusicVolume = Sound.MusicVolume;
|
||||||
|
Sound.SoundVolume = Sound.MusicVolume = 0;
|
||||||
Sound.SoundVolume = cachedSoundVolume;
|
|
||||||
Sound.MusicVolume = cachedMusicVolume;
|
|
||||||
|
|
||||||
videoPlayer.Stop();
|
|
||||||
showVideoPlayer = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartMission()
|
void UnMuteSounds()
|
||||||
{
|
{
|
||||||
StopVideo();
|
if (cachedSoundVolume > 0)
|
||||||
|
Sound.SoundVolume = cachedSoundVolume;
|
||||||
|
|
||||||
|
if (cachedMusicVolume > 0)
|
||||||
|
Sound.MusicVolume = cachedMusicVolume;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayVideo(VqaPlayerWidget player, string video, PlayingVideo pv, Action onComplete)
|
||||||
|
{
|
||||||
|
StopVideo(player);
|
||||||
|
|
||||||
|
playingVideo = pv;
|
||||||
|
player.Load(video);
|
||||||
|
|
||||||
|
// video playback runs asynchronously
|
||||||
|
player.PlayThen(onComplete);
|
||||||
|
|
||||||
|
// Mute other distracting sounds
|
||||||
|
MuteSounds();
|
||||||
|
}
|
||||||
|
|
||||||
|
void StopVideo(VqaPlayerWidget player)
|
||||||
|
{
|
||||||
|
if (playingVideo == PlayingVideo.None)
|
||||||
|
return;
|
||||||
|
|
||||||
|
UnMuteSounds();
|
||||||
|
player.Stop();
|
||||||
|
playingVideo = PlayingVideo.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartMissionClicked()
|
||||||
|
{
|
||||||
|
StopVideo(videoPlayer);
|
||||||
|
|
||||||
if (selectedMapPreview.RuleStatus != MapRuleStatus.Cached)
|
if (selectedMapPreview.RuleStatus != MapRuleStatus.Cached)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var gameStartVideo = selectedMapPreview.Map.Videos.GameStart;
|
||||||
|
if (gameStartVideo != null && GlobalFileSystem.Exists(gameStartVideo))
|
||||||
|
{
|
||||||
|
var fsPlayer = fullscreenVideoPlayer.Get<VqaPlayerWidget>("PLAYER");
|
||||||
|
fullscreenVideoPlayer.Visible = true;
|
||||||
|
PlayVideo(fsPlayer, gameStartVideo, PlayingVideo.GameStart, () =>
|
||||||
|
{
|
||||||
|
StopVideo(fsPlayer);
|
||||||
|
StartMission();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
StartMission();
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartMission()
|
||||||
|
{
|
||||||
OrderManager om = null;
|
OrderManager om = null;
|
||||||
|
|
||||||
Action lobbyReady = null;
|
Action lobbyReady = null;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Container@MISSIONBROWSER_PANEL:
|
|||||||
X: 15
|
X: 15
|
||||||
Y: 15
|
Y: 15
|
||||||
Width: 239
|
Width: 239
|
||||||
Height: 347
|
Height: 307
|
||||||
Children:
|
Children:
|
||||||
ScrollItem@HEADER:
|
ScrollItem@HEADER:
|
||||||
Width: PARENT_RIGHT-27
|
Width: PARENT_RIGHT-27
|
||||||
@@ -74,6 +74,13 @@ Container@MISSIONBROWSER_PANEL:
|
|||||||
Width: PARENT_RIGHT - 32
|
Width: PARENT_RIGHT - 32
|
||||||
VAlign: Top
|
VAlign: Top
|
||||||
Font: Small
|
Font: Small
|
||||||
|
DropDownButton@DIFFICULTY_DROPDOWNBUTTON:
|
||||||
|
X: 15
|
||||||
|
Y: 337
|
||||||
|
Width: 239
|
||||||
|
Height: 25
|
||||||
|
Text: Difficulty
|
||||||
|
Font: Regular
|
||||||
Button@BACK_BUTTON:
|
Button@BACK_BUTTON:
|
||||||
Y: 376
|
Y: 376
|
||||||
Width: 140
|
Width: 140
|
||||||
@@ -81,20 +88,34 @@ Container@MISSIONBROWSER_PANEL:
|
|||||||
Text: Back
|
Text: Back
|
||||||
Font: Bold
|
Font: Bold
|
||||||
Key: escape
|
Key: escape
|
||||||
Button@START_VIDEO_BUTTON:
|
Button@START_BRIEFING_VIDEO_BUTTON:
|
||||||
X: PARENT_RIGHT - 290
|
X: PARENT_RIGHT - 290
|
||||||
Y: 376
|
Y: 376
|
||||||
Width: 140
|
Width: 140
|
||||||
Height: 35
|
Height: 35
|
||||||
Text: View Briefing
|
Text: Watch Briefing
|
||||||
Font: Bold
|
Font: Bold
|
||||||
Button@STOP_VIDEO_BUTTON:
|
Button@STOP_BRIEFING_VIDEO_BUTTON:
|
||||||
X: PARENT_RIGHT - 290
|
X: PARENT_RIGHT - 290
|
||||||
Y: 376
|
Y: 376
|
||||||
Width: 140
|
Width: 140
|
||||||
Height: 35
|
Height: 35
|
||||||
Text: Stop Briefing
|
Text: Stop Briefing
|
||||||
Font: Bold
|
Font: Bold
|
||||||
|
Button@START_INFO_VIDEO_BUTTON:
|
||||||
|
X: PARENT_RIGHT - 440
|
||||||
|
Y: 376
|
||||||
|
Width: 140
|
||||||
|
Height: 35
|
||||||
|
Text: Watch Info Video
|
||||||
|
Font: Bold
|
||||||
|
Button@STOP_INFO_VIDEO_BUTTON:
|
||||||
|
X: PARENT_RIGHT - 440
|
||||||
|
Y: 376
|
||||||
|
Width: 140
|
||||||
|
Height: 35
|
||||||
|
Text: Stop Info Video
|
||||||
|
Font: Bold
|
||||||
Button@STARTGAME_BUTTON:
|
Button@STARTGAME_BUTTON:
|
||||||
X: PARENT_RIGHT - 140
|
X: PARENT_RIGHT - 140
|
||||||
Y: 376
|
Y: 376
|
||||||
@@ -102,13 +123,6 @@ Container@MISSIONBROWSER_PANEL:
|
|||||||
Height: 35
|
Height: 35
|
||||||
Text: Play
|
Text: Play
|
||||||
Font: Bold
|
Font: Bold
|
||||||
DropDownButton@DIFFICULTY_DROPDOWNBUTTON:
|
|
||||||
X: PARENT_RIGHT - 290 - 150
|
|
||||||
Y: 376
|
|
||||||
Width: 140
|
|
||||||
Height: 35
|
|
||||||
Text: Difficulty
|
|
||||||
Font: Bold
|
|
||||||
Container@MISSION_BIN:
|
Container@MISSION_BIN:
|
||||||
Children:
|
Children:
|
||||||
VqaPlayer@MISSION_VIDEO:
|
VqaPlayer@MISSION_VIDEO:
|
||||||
@@ -116,3 +130,14 @@ Container@MISSIONBROWSER_PANEL:
|
|||||||
Y: 1
|
Y: 1
|
||||||
Width: 640
|
Width: 640
|
||||||
Height: 375
|
Height: 375
|
||||||
|
Background@FULLSCREEN_PLAYER:
|
||||||
|
Width: WINDOW_RIGHT
|
||||||
|
Height: WINDOW_BOTTOM
|
||||||
|
Background: panel-allblack
|
||||||
|
Visible: False
|
||||||
|
Children:
|
||||||
|
VqaPlayer@PLAYER:
|
||||||
|
X: 0
|
||||||
|
Y: 0
|
||||||
|
Width: WINDOW_RIGHT
|
||||||
|
Height: WINDOW_BOTTOM
|
||||||
|
|||||||
@@ -83,26 +83,18 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(25, function()
|
|
||||||
Media.PlayMovieFullscreen("consyard.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(player, function()
|
Trigger.OnPlayerLost(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(25, function()
|
|
||||||
Media.PlayMovieFullscreen("gameover.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("landing.vqa", function()
|
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
||||||
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
gdiObjective1 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
gdiObjective1 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
gdiObjective2 = player.AddSecondaryObjective("Establish a beachhead")
|
||||||
gdiObjective2 = player.AddSecondaryObjective("Establish a beachhead")
|
|
||||||
|
|
||||||
ReinforceWithLandingCraft(MCVReinforcements, lstStart.Location + CVec.New(2, 0), lstEnd.Location + CVec.New(2, 0), mcvTarget.Location)
|
ReinforceWithLandingCraft(MCVReinforcements, lstStart.Location + CVec.New(2, 0), lstEnd.Location + CVec.New(2, 0), mcvTarget.Location)
|
||||||
Reinforce(InfantryReinforcements)
|
Reinforce(InfantryReinforcements)
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnIdle(Gunboat, function() SetGunboatPath(Gunboat) end)
|
Trigger.OnIdle(Gunboat, function() SetGunboatPath(Gunboat) end)
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: Use the units provided to protect the Mobile Construction Vehicle.
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: gdi1.vqa
|
|
||||||
|
|
||||||
Tileset: TEMPERAT
|
Tileset: TEMPERAT
|
||||||
|
|
||||||
MapSize: 64,64
|
MapSize: 64,64
|
||||||
@@ -22,6 +20,12 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
Briefing: gdi1.vqa
|
||||||
|
GameStart: landing.vqa
|
||||||
|
GameWon: consyard.vqa
|
||||||
|
GameLost: gameover.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
|
|||||||
@@ -72,16 +72,10 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("flag.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(player, function()
|
Trigger.OnPlayerLost(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("gameover.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: Defend your position, deploy the MCV, then build a sizable force to
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: gdi2.vqa
|
|
||||||
|
|
||||||
Tileset: TEMPERAT
|
Tileset: TEMPERAT
|
||||||
|
|
||||||
MapSize: 64,64
|
MapSize: 64,64
|
||||||
@@ -22,6 +20,11 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
Briefing: gdi2.vqa
|
||||||
|
GameWon: flag.vqa
|
||||||
|
GameLost: gameover.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
|
|||||||
@@ -59,24 +59,16 @@ WorldLoaded = function()
|
|||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("samdie.vqa", function()
|
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
||||||
nodObjective = enemy.AddPrimaryObjective("Destroy all GDI troops")
|
gdiMainObjective = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
gdiMainObjective = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
gdiAirSupportObjective = player.AddSecondaryObjective("Destroy the SAM sites to receive air support")
|
||||||
gdiAirSupportObjective = player.AddSecondaryObjective("Destroy the SAM sites to receive air support")
|
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnPlayerLost(player, function()
|
Trigger.OnPlayerLost(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("gameover.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("bombaway.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnAllKilled(SamSites, function()
|
Trigger.OnAllKilled(SamSites, function()
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: Build up forces to destroy Nod base.\n\nOnce all Nod SAM sites are
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: gdi3.vqa
|
|
||||||
|
|
||||||
Tileset: TEMPERAT
|
Tileset: TEMPERAT
|
||||||
|
|
||||||
MapSize: 64,64
|
MapSize: 64,64
|
||||||
@@ -22,6 +20,12 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
Briefing: gdi3.vqa
|
||||||
|
GameStart: samdie.vqa
|
||||||
|
GameWon: bombaway.vqa
|
||||||
|
GameLost: gameover.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
|
|||||||
@@ -121,26 +121,16 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.OnPlayerWon(gdi, function()
|
Trigger.OnPlayerWon(gdi, function()
|
||||||
Media.PlaySpeechNotification(gdi, "Win")
|
Media.PlaySpeechNotification(gdi, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("burdet1.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(gdi, function()
|
Trigger.OnPlayerLost(gdi, function()
|
||||||
Media.PlaySpeechNotification(gdi, "Lose")
|
Media.PlaySpeechNotification(gdi, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("gameover.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("bkground.vqa", function()
|
gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.")
|
||||||
Media.PlayMovieFullscreen("nitejump.vqa", function()
|
reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.")
|
||||||
gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.")
|
nod.AddPrimaryObjective("Defend against the GDI forces.")
|
||||||
reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.")
|
|
||||||
nod.AddPrimaryObjective("Defend against the GDI forces.")
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
BuildNod1()
|
BuildNod1()
|
||||||
Utils.Do(NodHelis, function(heli)
|
Utils.Do(NodHelis, function(heli)
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: Nod has captured classified GDI property.\n\nYou must find and retr
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: gdi4b.vqa
|
|
||||||
|
|
||||||
Tileset: TEMPERAT
|
Tileset: TEMPERAT
|
||||||
|
|
||||||
MapSize: 64,64
|
MapSize: 64,64
|
||||||
@@ -22,6 +20,13 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
BackgroundInfo: bkground.vqa
|
||||||
|
Briefing: gdi4b.vqa
|
||||||
|
GameStart: nitejump.vqa
|
||||||
|
GameWon: burdet1.vqa
|
||||||
|
GameLost: gameover.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Cheats: False
|
Cheats: False
|
||||||
|
|||||||
@@ -126,25 +126,15 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.OnPlayerWon(gdi, function()
|
Trigger.OnPlayerWon(gdi, function()
|
||||||
Media.PlaySpeechNotification(gdi, "Win")
|
Media.PlaySpeechNotification(gdi, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("burdet1.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(gdi, function()
|
Trigger.OnPlayerLost(gdi, function()
|
||||||
Media.PlaySpeechNotification(gdi, "Lose")
|
Media.PlaySpeechNotification(gdi, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("gameover.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("bkground.vqa", function()
|
gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.")
|
||||||
Media.PlayMovieFullscreen("nitejump.vqa", function()
|
reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.")
|
||||||
gdiObjective = gdi.AddPrimaryObjective("Retrieve the crate with the stolen rods.")
|
nod.AddPrimaryObjective("Defend against the GDI forces.")
|
||||||
reinforcementsObjective = gdi.AddSecondaryObjective("Eliminate " .. KillsUntilReinforcements .. " Nod units for reinforcements.")
|
|
||||||
nod.AddPrimaryObjective("Defend against the GDI forces.")
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
SetupWorld()
|
SetupWorld()
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: Nod has captured classified GDI property.\n\nYou must find and retr
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: gdi4b.vqa
|
|
||||||
|
|
||||||
Tileset: TEMPERAT
|
Tileset: TEMPERAT
|
||||||
|
|
||||||
MapSize: 64,64
|
MapSize: 64,64
|
||||||
@@ -22,6 +20,13 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
BackgroundInfo: bkground.vqa
|
||||||
|
Briefing: gdi4b.vqa
|
||||||
|
GameStart: nitejump.vqa
|
||||||
|
GameWon: burdet1.vqa
|
||||||
|
GameLost: gameover.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
|
|||||||
@@ -81,25 +81,15 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("burdet1.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(player, function()
|
Trigger.OnPlayerLost(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("gameover.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("bkground.vqa", function()
|
nodObjective = nod.AddPrimaryObjective("Destroy all GDI troops")
|
||||||
Media.PlayMovieFullscreen("nodsweep.vqa", function()
|
gdiObjective1 = player.AddPrimaryObjective("Defend the town of Bialystok")
|
||||||
nodObjective = nod.AddPrimaryObjective("Destroy all GDI troops")
|
gdiObjective2 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
gdiObjective1 = player.AddPrimaryObjective("Defend the town of Bialystok")
|
|
||||||
gdiObjective2 = player.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
townAttackTrigger = false
|
townAttackTrigger = false
|
||||||
Trigger.OnExitedFootprint(TownAttackTrigger, function(a, id)
|
Trigger.OnExitedFootprint(TownAttackTrigger, function(a, id)
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: Nod is moving to capture and hold a civilian town.\n\nYour mission
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: gdi4a.vqa
|
|
||||||
|
|
||||||
Tileset: TEMPERAT
|
Tileset: TEMPERAT
|
||||||
|
|
||||||
MapSize: 64,64
|
MapSize: 64,64
|
||||||
@@ -22,6 +20,13 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
BackgroundInfo: bkground.vqa
|
||||||
|
Briefing: gdi4a.vqa
|
||||||
|
GameStart: nodsweep.vqa
|
||||||
|
GameWon: burdet1.vqa
|
||||||
|
GameLost: gameover.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: In order for the Brotherhood to gain a foothold, we must begin by e
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: nod1.vqa
|
|
||||||
|
|
||||||
Tileset: DESERT
|
Tileset: DESERT
|
||||||
|
|
||||||
MapSize: 64,64
|
MapSize: 64,64
|
||||||
@@ -22,6 +20,10 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
Briefing: nod1.vqa
|
||||||
|
GameLost: nodlose.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
|
|||||||
@@ -52,9 +52,6 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.OnPlayerLost(nod, function()
|
Trigger.OnPlayerLost(nod, function()
|
||||||
Media.PlaySpeechNotification(nod, "Lose")
|
Media.PlaySpeechNotification(nod, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("nodlose.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
NodObjective1 = nod.AddPrimaryObjective("Kill Nikoomba")
|
NodObjective1 = nod.AddPrimaryObjective("Kill Nikoomba")
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
Briefing: nod3.vqa
|
||||||
|
GameStart: dessweep.vqa
|
||||||
|
GameWon: desflees.vqa
|
||||||
|
GameLost: flag.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
|
|||||||
@@ -31,23 +31,15 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("desflees.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(player, function()
|
Trigger.OnPlayerLost(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("flag.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("dessweep.vqa", function()
|
gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
nodObjective1 = player.AddPrimaryObjective("Capture the prison")
|
||||||
nodObjective1 = player.AddPrimaryObjective("Capture the prison")
|
nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces")
|
||||||
nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces")
|
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnCapture(TechCenter, function()
|
Trigger.OnCapture(TechCenter, function()
|
||||||
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
Briefing: nod3.vqa
|
||||||
|
GameStart: dessweep.vqa
|
||||||
|
GameWon: desflees.vqa
|
||||||
|
GameLost: flag.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
|
|||||||
@@ -47,23 +47,15 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("desflees.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(player, function()
|
Trigger.OnPlayerLost(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("flag.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("dessweep.vqa", function()
|
gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
||||||
gdiObjective = enemy.AddPrimaryObjective("Eliminate all Nod forces in the area")
|
nodObjective1 = player.AddPrimaryObjective("Capture the prison")
|
||||||
nodObjective1 = player.AddPrimaryObjective("Capture the prison")
|
nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces")
|
||||||
nodObjective2 = player.AddSecondaryObjective("Destroy all GDI forces")
|
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnKilled(TechCenter, function() player.MarkFailedObjective(nodObjective1) end)
|
Trigger.OnKilled(TechCenter, function() player.MarkFailedObjective(nodObjective1) end)
|
||||||
Trigger.OnCapture(TechCenter, function()
|
Trigger.OnCapture(TechCenter, function()
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ Background@MISSIONBROWSER_PANEL:
|
|||||||
X: 20
|
X: 20
|
||||||
Y: 50
|
Y: 50
|
||||||
Width: 270
|
Width: 270
|
||||||
Height: 377
|
Height: 332
|
||||||
Children:
|
Children:
|
||||||
ScrollItem@HEADER:
|
ScrollItem@HEADER:
|
||||||
BaseName: scrollheader
|
BaseName: scrollheader
|
||||||
@@ -69,20 +69,34 @@ Background@MISSIONBROWSER_PANEL:
|
|||||||
Width: PARENT_RIGHT - 32
|
Width: PARENT_RIGHT - 32
|
||||||
VAlign: Top
|
VAlign: Top
|
||||||
Font: Small
|
Font: Small
|
||||||
Button@START_VIDEO_BUTTON:
|
Button@START_BRIEFING_VIDEO_BUTTON:
|
||||||
X: 20
|
X: 20
|
||||||
Y: PARENT_BOTTOM - 45
|
Y: PARENT_BOTTOM - 45
|
||||||
Width: 120
|
Width: 130
|
||||||
Height: 25
|
Height: 25
|
||||||
Text: Play Briefing
|
Text: Watch Briefing
|
||||||
Font: Bold
|
Font: Bold
|
||||||
Button@STOP_VIDEO_BUTTON:
|
Button@STOP_BRIEFING_VIDEO_BUTTON:
|
||||||
X: 20
|
X: 20
|
||||||
Y: PARENT_BOTTOM - 45
|
Y: PARENT_BOTTOM - 45
|
||||||
Width: 120
|
Width: 130
|
||||||
Height: 25
|
Height: 25
|
||||||
Text: Stop Briefing
|
Text: Stop Briefing
|
||||||
Font: Bold
|
Font: Bold
|
||||||
|
Button@START_INFO_VIDEO_BUTTON:
|
||||||
|
X: 160
|
||||||
|
Y: PARENT_BOTTOM - 45
|
||||||
|
Width: 130
|
||||||
|
Height: 25
|
||||||
|
Text: Watch Info Video
|
||||||
|
Font: Bold
|
||||||
|
Button@STOP_INFO_VIDEO_BUTTON:
|
||||||
|
X: 160
|
||||||
|
Y: PARENT_BOTTOM - 45
|
||||||
|
Width: 130
|
||||||
|
Height: 25
|
||||||
|
Text: Stop Info Video
|
||||||
|
Font: Bold
|
||||||
Button@STARTGAME_BUTTON:
|
Button@STARTGAME_BUTTON:
|
||||||
X: PARENT_RIGHT - 140 - 130
|
X: PARENT_RIGHT - 140 - 130
|
||||||
Y: PARENT_BOTTOM - 45
|
Y: PARENT_BOTTOM - 45
|
||||||
@@ -99,9 +113,9 @@ Background@MISSIONBROWSER_PANEL:
|
|||||||
Font: Bold
|
Font: Bold
|
||||||
Key: escape
|
Key: escape
|
||||||
DropDownButton@DIFFICULTY_DROPDOWNBUTTON:
|
DropDownButton@DIFFICULTY_DROPDOWNBUTTON:
|
||||||
X: PARENT_RIGHT - 140 - 130 - 150
|
X: 20
|
||||||
Y: PARENT_BOTTOM - 45
|
Y: 427 - HEIGHT
|
||||||
Width: 140
|
Width: 270
|
||||||
Height: 25
|
Height: 25
|
||||||
Text: Difficulty
|
Text: Difficulty
|
||||||
Font: Bold
|
Font: Bold
|
||||||
@@ -117,3 +131,14 @@ Background@MISSIONBROWSER_PANEL:
|
|||||||
Y: 1
|
Y: 1
|
||||||
Width: 640
|
Width: 640
|
||||||
Height: 375
|
Height: 375
|
||||||
|
Background@FULLSCREEN_PLAYER:
|
||||||
|
Width: WINDOW_RIGHT
|
||||||
|
Height: WINDOW_BOTTOM
|
||||||
|
Background: dialog5
|
||||||
|
Visible: False
|
||||||
|
Children:
|
||||||
|
VqaPlayer@PLAYER:
|
||||||
|
X: 0
|
||||||
|
Y: 0
|
||||||
|
Width: WINDOW_RIGHT
|
||||||
|
Height: WINDOW_BOTTOM
|
||||||
|
|||||||
@@ -142,14 +142,10 @@ end
|
|||||||
|
|
||||||
MissionAccomplished = function()
|
MissionAccomplished = function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("snowbomb.vqa")
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
MissionFailed = function()
|
MissionFailed = function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlayMovieFullscreen("bmap.vqa") end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
SetUnitStances = function()
|
SetUnitStances = function()
|
||||||
@@ -182,14 +178,12 @@ WorldLoaded = function()
|
|||||||
Trigger.OnPlayerLost(player, MissionFailed)
|
Trigger.OnPlayerLost(player, MissionFailed)
|
||||||
Trigger.OnPlayerWon(player, MissionAccomplished)
|
Trigger.OnPlayerWon(player, MissionAccomplished)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("landing.vqa", function()
|
FindEinsteinObjective = player.AddPrimaryObjective("Find Einstein.")
|
||||||
FindEinsteinObjective = player.AddPrimaryObjective("Find Einstein.")
|
TanyaSurviveObjective = player.AddPrimaryObjective("Tanya must survive.")
|
||||||
TanyaSurviveObjective = player.AddPrimaryObjective("Tanya must survive.")
|
EinsteinSurviveObjective = player.AddPrimaryObjective("Einstein must survive.")
|
||||||
EinsteinSurviveObjective = player.AddPrimaryObjective("Einstein must survive.")
|
CivilProtectionObjective = player.AddSecondaryObjective("Protect all civilians.")
|
||||||
CivilProtectionObjective = player.AddSecondaryObjective("Protect all civilians.")
|
|
||||||
|
|
||||||
RunInitialActivities()
|
RunInitialActivities()
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnKilled(Lab, LabDestroyed)
|
Trigger.OnKilled(Lab, LabDestroyed)
|
||||||
Trigger.OnKilled(OilPump, OilPumpDestroyed)
|
Trigger.OnKilled(OilPump, OilPumpDestroyed)
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: Rescue Einstein from the Headquarters inside this Soviet complex.\n
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: ally1.vqa
|
|
||||||
|
|
||||||
Tileset: SNOW
|
Tileset: SNOW
|
||||||
|
|
||||||
MapSize: 128,128
|
MapSize: 128,128
|
||||||
@@ -22,6 +20,12 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
Briefing: ally1.vqa
|
||||||
|
GameStart: landing.vqa
|
||||||
|
GameWon: snowbomb.vqa
|
||||||
|
GameLost: bmap.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
Crates: False
|
Crates: False
|
||||||
Fog: True
|
Fog: True
|
||||||
@@ -586,7 +590,6 @@ Rules:
|
|||||||
Scripts: allies01.lua
|
Scripts: allies01.lua
|
||||||
ObjectivesPanel:
|
ObjectivesPanel:
|
||||||
PanelName: MISSION_OBJECTIVES
|
PanelName: MISSION_OBJECTIVES
|
||||||
-StartGameNotification:
|
|
||||||
TRAN.Extraction:
|
TRAN.Extraction:
|
||||||
Inherits: TRAN
|
Inherits: TRAN
|
||||||
RenderUnit:
|
RenderUnit:
|
||||||
|
|||||||
@@ -22,16 +22,10 @@ end
|
|||||||
|
|
||||||
MissionAccomplished = function()
|
MissionAccomplished = function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("montpass.vqa")
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
MissionFailed = function()
|
MissionFailed = function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("frozen.vqa")
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
Tick = function()
|
Tick = function()
|
||||||
@@ -109,9 +103,7 @@ WorldLoaded = function()
|
|||||||
Trigger.OnPlayerLost(player, MissionFailed)
|
Trigger.OnPlayerLost(player, MissionFailed)
|
||||||
Trigger.OnPlayerWon(player, MissionAccomplished)
|
Trigger.OnPlayerWon(player, MissionAccomplished)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("mcv.vqa", function()
|
ConquestObjective = player.AddPrimaryObjective("Secure the area.")
|
||||||
ConquestObjective = player.AddPrimaryObjective("Secure the area.")
|
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end)
|
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end)
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Description: A critical supply convoy is due through this area in 10 minutes, bu
|
|||||||
|
|
||||||
Author: Westwood Studios
|
Author: Westwood Studios
|
||||||
|
|
||||||
PreviewVideo: ally2.vqa
|
|
||||||
|
|
||||||
Tileset: SNOW
|
Tileset: SNOW
|
||||||
|
|
||||||
MapSize: 128,128
|
MapSize: 128,128
|
||||||
@@ -22,6 +20,12 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
Briefing: ally2.vqa
|
||||||
|
GameStart: mcv.vqa
|
||||||
|
GameWon: montpass.vqa
|
||||||
|
GameLost: frozen.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
@@ -882,7 +886,6 @@ Rules:
|
|||||||
Scripts: allies02.lua
|
Scripts: allies02.lua
|
||||||
ObjectivesPanel:
|
ObjectivesPanel:
|
||||||
PanelName: MISSION_OBJECTIVES
|
PanelName: MISSION_OBJECTIVES
|
||||||
-StartGameNotification:
|
|
||||||
^Vehicle:
|
^Vehicle:
|
||||||
Tooltip:
|
Tooltip:
|
||||||
GenericVisibility: Enemy
|
GenericVisibility: Enemy
|
||||||
|
|||||||
@@ -114,13 +114,11 @@ InitObjectives = function()
|
|||||||
Trigger.OnPlayerLost(player, function()
|
Trigger.OnPlayerLost(player, function()
|
||||||
Trigger.AfterDelay(25, function()
|
Trigger.AfterDelay(25, function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlayMovieFullscreen("sovtstar.vqa") end)
|
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Trigger.AfterDelay(25, function()
|
Trigger.AfterDelay(25, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlayMovieFullscreen("toofar.vqa") end)
|
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
@@ -250,9 +248,7 @@ WorldLoaded = function()
|
|||||||
|
|
||||||
InitPlayers()
|
InitPlayers()
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("brdgtilt.vqa", function()
|
InitObjectives()
|
||||||
InitObjectives()
|
InitTriggers()
|
||||||
InitTriggers()
|
SendAlliedUnits()
|
||||||
SendAlliedUnits()
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
|
Videos:
|
||||||
|
GameStart: brdgtilt.vqa
|
||||||
|
GameWon: toofar.vqa
|
||||||
|
GameLost: sovtstar.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
Crates: False
|
Crates: False
|
||||||
@@ -1380,7 +1385,6 @@ Rules:
|
|||||||
Scripts: allies03a.lua
|
Scripts: allies03a.lua
|
||||||
ObjectivesPanel:
|
ObjectivesPanel:
|
||||||
PanelName: MISSION_OBJECTIVES
|
PanelName: MISSION_OBJECTIVES
|
||||||
-StartGameNotification:
|
|
||||||
^Infantry:
|
^Infantry:
|
||||||
Tooltip:
|
Tooltip:
|
||||||
GenericVisibility: Enemy
|
GenericVisibility: Enemy
|
||||||
|
|||||||
@@ -20,7 +20,11 @@ UseAsShellmap: False
|
|||||||
|
|
||||||
Type: Campaign
|
Type: Campaign
|
||||||
|
|
||||||
PreviewVideo: soviet1.vqa
|
Videos:
|
||||||
|
Briefing: soviet1.vqa
|
||||||
|
GameStart: flare.vqa
|
||||||
|
GameWon: snstrafe.vqa
|
||||||
|
GameLost: sfrozen.vqa
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
ShortGame: False
|
ShortGame: False
|
||||||
@@ -783,7 +787,6 @@ Rules:
|
|||||||
Scripts: soviet01.lua
|
Scripts: soviet01.lua
|
||||||
ObjectivesPanel:
|
ObjectivesPanel:
|
||||||
PanelName: MISSION_OBJECTIVES
|
PanelName: MISSION_OBJECTIVES
|
||||||
-StartGameNotification:
|
|
||||||
V01:
|
V01:
|
||||||
LeavesHusk:
|
LeavesHusk:
|
||||||
HuskActor: healcrate
|
HuskActor: healcrate
|
||||||
|
|||||||
@@ -46,27 +46,16 @@ WorldLoaded = function()
|
|||||||
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Media.PlayMovieFullscreen("flare.vqa", function()
|
CivilProtectionObjective = france.AddPrimaryObjective("Protect the civilians.")
|
||||||
CivilProtectionObjective = france.AddPrimaryObjective("Protect the civilians.")
|
VillageRaidObjective = player.AddPrimaryObjective("Raze the village.")
|
||||||
VillageRaidObjective = player.AddPrimaryObjective("Raze the village.")
|
JeepDemolishingBridge()
|
||||||
JeepDemolishingBridge()
|
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlaySpeechNotification(player, "StartGame")
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
Trigger.OnPlayerWon(player, function()
|
Trigger.OnPlayerWon(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Win")
|
Media.PlaySpeechNotification(player, "Win")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("snstrafe.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.OnPlayerLost(player, function()
|
Trigger.OnPlayerLost(player, function()
|
||||||
Media.PlaySpeechNotification(player, "Lose")
|
Media.PlaySpeechNotification(player, "Lose")
|
||||||
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
||||||
Media.PlayMovieFullscreen("sfrozen.vqa")
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Trigger.AfterDelay(DateTime.Seconds(2), InsertYaks)
|
Trigger.AfterDelay(DateTime.Seconds(2), InsertYaks)
|
||||||
|
|||||||
Reference in New Issue
Block a user