[Various] Bringing up to speed with latest local changes

- FreeSO version update
- Desktop UCP wip
- New loading graphic
- Fix CAS carousel being rather sticky on desktop.
- Add missing neighbors on neighborhood load (for cc npcs, first runs)
- Support showing load errors when objects on a lot are missing
- PersonGeneratorHelper for getting info from people by spawning them in
a dummy VM and running init.
- Add support for Simantics AOT
This commit is contained in:
riperiperi 2019-03-16 11:19:15 +00:00
parent 00f8cd6727
commit 0bfb91fa58
55 changed files with 1078 additions and 157 deletions

1
.gitignore vendored
View file

@ -242,3 +242,4 @@ ModelManifest.xml
.fake/
Client/Simitone/Simitone/
Client/Simitone/TS1.Scripts

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 708 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -64,6 +64,7 @@
<Compile Include="UI\Panels\CAS\UIFamilyCASItem.cs" />
<Compile Include="UI\Panels\CAS\UIFamilyCASPanel.cs" />
<Compile Include="UI\Panels\CAS\UISimCASPanel.cs" />
<Compile Include="UI\Panels\Desktop\UIDesktopUCP.cs" />
<Compile Include="UI\Panels\LiveSubpanels\Catalog\UICatalogItem.cs" />
<Compile Include="UI\Panels\LiveSubpanels\UIButtonSubpanel.cs" />
<Compile Include="UI\Panels\LiveSubpanels\UIBuyBrowsePanel.cs" />
@ -102,6 +103,7 @@
<Compile Include="UI\Screens\LoadingGameScreen.cs" />
<Compile Include="UI\Screens\TS1CASScreen.cs" />
<Compile Include="UI\Screens\TS1GameScreen.cs" />
<Compile Include="Utils\PersonGeneratorHelper.cs" />
<Compile Include="Utils\SimitoneNeighOBJExporter.cs" />
</ItemGroup>
<ItemGroup>
@ -114,6 +116,10 @@
<Name>MonoGame.Framework.Windows</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\FreeSO\Other\libs\MSDFData\MSDFData.csproj">
<Project>{eabea510-3e53-4f19-9f0b-75c5ca9dfa3b}</Project>
<Name>MSDFData</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\FreeSO\TSOClient\FSO.UI\FSO.UI.csproj">
<Project>{73e2ad5b-720b-4ef3-9b7c-55931d0ec693}</Project>
<Name>FSO.UI</Name>
@ -221,6 +227,66 @@
<Content Include="Content\uigraphics\common\circle10px.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_bg.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_build.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_buy.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_floordown.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_floorup.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_friend.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_live.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_opt.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_rotccw.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_rotcw.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_speed1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_speed2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_speed3.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_speed4.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_w1.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_w2.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_w3.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_w4.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_zoomm.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\desktop\d_live_zoomp.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\uigraphics\dialog\ngbh_outline.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

View file

@ -20,6 +20,7 @@ using FSO.HIT.Model;
using FSO.Client;
using FSO.Files;
using FSO.SimAntics;
using MSDFData;
namespace Simitone.Client
{
@ -35,6 +36,7 @@ namespace Simitone.Client
public SimitoneGame() : base()
{
GameFacade.Game = this;
GameThread.Game = Thread.CurrentThread;
if (GameFacade.DirectX) TimedReferenceController.SetMode(CacheType.PERMANENT);
Content.RootDirectory = FSOEnvironment.GFXContentDir;
@ -101,7 +103,8 @@ namespace Simitone.Client
SmoothZoom = settings.SmoothZoom,
SurroundingLots = settings.SurroundingLotMode,
AA = settings.AntiAlias,
Directional = settings.DirectionalLight3D
Directional = settings.DirectionalLight3D,
Complex = true
};
OperatingSystem os = Environment.OSVersion;
@ -204,17 +207,25 @@ namespace Simitone.Client
try
{
GameFacade.MainFont = new FSO.Client.UI.Framework.Font();
GameFacade.MainFont.AddSize(12, Content.Load<SpriteFont>("Fonts/Mobile_15px"));
GameFacade.MainFont.AddSize(15, Content.Load<SpriteFont>("Fonts/Mobile_20px"));
GameFacade.MainFont.AddSize(19, Content.Load<SpriteFont>("Fonts/Mobile_25px"));
GameFacade.MainFont.AddSize(37, Content.Load<SpriteFont>("Fonts/Mobile_50px"));
//GameFacade.MainFont.AddSize(12, Content.Load<SpriteFont>("Fonts/Mobile_15px"));
//GameFacade.MainFont.AddSize(15, Content.Load<SpriteFont>("Fonts/Mobile_20px"));
//GameFacade.MainFont.AddSize(19, Content.Load<SpriteFont>("Fonts/Mobile_25px"));
//GameFacade.MainFont.AddSize(37, Content.Load<SpriteFont>("Fonts/Mobile_50px"));
GameFacade.EdithFont = new FSO.Client.UI.Framework.Font();
GameFacade.EdithFont.AddSize(12, Content.Load<SpriteFont>("Fonts/Trebuchet_12px"));
GameFacade.EdithFont.AddSize(14, Content.Load<SpriteFont>("Fonts/Trebuchet_14px"));
//GameFacade.EdithFont.AddSize(12, Content.Load<SpriteFont>("Fonts/Trebuchet_12px"));
//GameFacade.EdithFont.AddSize(14, Content.Load<SpriteFont>("Fonts/Trebuchet_14px"));
GameFacade.VectorFont = new FSO.UI.Framework.MSDFFont(Content.Load<FieldFont>("../Fonts/mobile"));
GameFacade.EdithVectorFont = new FSO.UI.Framework.MSDFFont(Content.Load<FieldFont>("../Fonts/trebuchet"));
GameFacade.EdithVectorFont.VectorScale = 0.366f;
GameFacade.EdithVectorFont.Height = 15;
GameFacade.EdithVectorFont.YOff = 11;
FSO.UI.Framework.MSDFFont.MSDFEffect = Content.Load<Effect>("Effects/MSDFFont");
vitaboyEffect = Content.Load<Effect>("Effects/Vitaboy"+((FSOEnvironment.SoftwareDepth)?"iOS":""));
uiLayer = new UILayer(this, Content.Load<SpriteFont>("Fonts/FreeSO_12px"), Content.Load<SpriteFont>("Fonts/FreeSO_16px"));
uiLayer = new UILayer(this);
}
catch (Exception e)
{

View file

@ -18,6 +18,7 @@ namespace Simitone.Client.UI.Controls
public Color HoverColor = Color.Lerp(UIStyle.Current.BtnNormal, UIStyle.Current.BtnActive, 0.5f);
public Color DisabledColor = new Color(128, 128, 128, 255);
public bool Shadow;
public Vector3 ShadowParam = new Vector3(3, 3, 0.25f);
public float Alpha { get; set; }
public UIStencilButton(Texture2D tex) : base(tex)
@ -54,7 +55,7 @@ namespace Simitone.Client.UI.Controls
color = Color; break;
}
if (Shadow)
DrawLocalTexture(SBatch, Texture, null, new Vector2(3f, 3f), Vector2.One, Color.Black * 0.25f * Alpha);
DrawLocalTexture(SBatch, Texture, null, new Vector2(ShadowParam.X, ShadowParam.Y), Vector2.One, Color.Black * ShadowParam.Z * Alpha);
DrawLocalTexture(SBatch, Texture, null, Vector2.Zero, Vector2.One, color * Alpha);
}
}

View file

@ -63,7 +63,7 @@ namespace Simitone.Client.UI.Model
HeadCamera.Target = pos2;
HeadCamera.ProjectionOrigin = new Vector2(74/2, 74/2);
var HeadScene = new _3DTargetScene(GameFacade.GraphicsDevice, HeadCamera, new Point(74, 74), (GlobalSettings.Default.AntiAlias) ? 8 : 0);
var HeadScene = new _3DTargetScene(GameFacade.GraphicsDevice, HeadCamera, new Point(74, 74), (GlobalSettings.Default.AntiAlias > 0) ? 8 : 0);
HeadScene.ID = "UIPieMenuHead";
m_Head.Scene = HeadScene;

View file

@ -0,0 +1,489 @@
using FSO.Client;
using FSO.Client.UI.Controls;
using FSO.Client.UI.Framework;
using FSO.Client.UI.Model;
using FSO.Common;
using FSO.Common.Rendering.Framework.Model;
using FSO.Common.Utils;
using FSO.Content;
using FSO.HIT;
using FSO.LotView.RC;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Simitone.Client.UI.Controls;
using Simitone.Client.UI.Model;
using Simitone.Client.UI.Screens;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Simitone.Client.UI.Panels.Desktop
{
public class UIDesktopUCP : UICachedContainer
{
public UIImage Background;
public UIImage FriendIcon;
public UIButton LiveButton;
public UIButton BuyButton;
public UIButton BuildButton;
public UIButton OptionsButton;
public UILabel MoneyLabel;
public UILabel TimeLabel;
public UILabel TimeLabelShadow;
public UILabel FriendsLabel;
public UILabel FriendsLabelShadow;
public UILabel FloorLabel;
public UILabel FloorLabelShadow;
public UIButton RoofButton;
public UIButton WallsUpButton;
public UIButton WallsCutButton;
public UIButton WallsDownButton;
public UIButton FloorUpButton;
public UIButton FloorDownButton;
public UIButton ZoomInButton;
public UIButton ZoomOutButton;
public UIButton RotateCWButton;
public UIButton RotateCCWButton;
public UIButton[] SpeedButtons;
private TS1GameScreen Game;
public Func<UIMainPanelMode, bool> OnModeClick;
public string[] FloorNames = new string[]
{
"1st",
"2nd",
"3rd",
"4th",
"5th"
};
public static Dictionary<int, int> RemapSpeed = new Dictionary<int, int>()
{
{0, 4}, //pause
{1, 1}, //1 speed
{3, 2}, //2 speed
{10, 3}, //3 speed
};
public static Dictionary<int, int> ReverseRemap = RemapSpeed.ToDictionary(x => x.Value, x => x.Key);
public UIDesktopUCP(TS1GameScreen screen)
{
Game = screen;
var ui = Content.Get().CustomUI;
var gd = GameFacade.GraphicsDevice;
var sDir = new Vector3(0, 2, 0.5f);
Background = new UIImage(ui.Get("d_live_bg.png").Get(gd));
Add(Background);
FriendIcon = new UIImage(ui.Get("d_live_friend.png").Get(gd)) { Position = new Vector2(156, 186) };
Add(FriendIcon);
Add(LiveButton = new UIButton(ui.Get("d_live_live.png").Get(gd)) { Position = new Vector2(15, 2) });
Add(BuyButton = new UIButton(ui.Get("d_live_buy.png").Get(gd)) { Position = new Vector2(107, 27) });
Add(BuildButton = new UIButton(ui.Get("d_live_build.png").Get(gd)) { Position = new Vector2(179, 80) });
Add(OptionsButton = new UIButton(ui.Get("d_live_opt.png").Get(gd)) { Position = new Vector2(242, 165) });
Add(FloorUpButton = new UIStencilButton(ui.Get("d_live_floorup.png").Get(gd)) { Position = new Vector2(16, 150), Shadow = true, ShadowParam = sDir });
Add(FloorDownButton = new UIStencilButton(ui.Get("d_live_floordown.png").Get(gd)) { Position = new Vector2(16, 192), Shadow = true, ShadowParam = sDir });
Add(RoofButton = new UIStencilButton(ui.Get("d_live_w1.png").Get(gd)) { Position = new Vector2(15, 111), Shadow = true, ShadowParam = sDir });
Add(WallsUpButton = new UIStencilButton(ui.Get("d_live_w2.png").Get(gd)) { Position = new Vector2(50, 107), Shadow = true, ShadowParam = sDir });
Add(WallsCutButton = new UIStencilButton(ui.Get("d_live_w3.png").Get(gd)) { Position = new Vector2(86, 112), Shadow = true, ShadowParam = sDir });
Add(WallsDownButton = new UIStencilButton(ui.Get("d_live_w4.png").Get(gd)) { Position = new Vector2(117, 122), Shadow = true, ShadowParam = sDir });
Add(ZoomInButton = new UIStencilButton(ui.Get("d_live_zoomp.png").Get(gd)) { Position = new Vector2(87, 154) });
Add(ZoomOutButton = new UIStencilButton(ui.Get("d_live_zoomm.png").Get(gd)) { Position = new Vector2(87, 196) });
Add(RotateCWButton = new UIStencilButton(ui.Get("d_live_rotcw.png").Get(gd)) { Position = new Vector2(62, 175) });
Add(RotateCCWButton = new UIStencilButton(ui.Get("d_live_rotccw.png").Get(gd)) { Position = new Vector2(114, 175) });
SpeedButtons = new UIButton[4];
for (int i=0; i<4; i++)
{
Add(SpeedButtons[i] = new UIStencilButton(ui.Get($"d_live_speed{i+1}.png").Get(gd))
{
Position = new Vector2(158 + 30 * i, 246),
Shadow = true,
ShadowParam = sDir
});
var speed = i + 1;
SpeedButtons[i].OnButtonClick += (btn) =>
{
SwitchSpeed(speed);
};
}
var largeStyle = TextStyle.DefaultLabel.Clone();
largeStyle.Size = 15;
largeStyle.Color = UIStyle.Current.DialogTitle;
var whiteStyle = TextStyle.DefaultLabel.Clone();
whiteStyle.Size = 12;
whiteStyle.Color = UIStyle.Current.Text;
var shadowStyle = TextStyle.DefaultLabel.Clone();
shadowStyle.Size = 12;
shadowStyle.Color = Color.Black * 0.5f;
var friendStyle = TextStyle.DefaultLabel.Clone();
friendStyle.Size = 12;
friendStyle.Color = UIStyle.Current.SecondaryText;
Add(MoneyLabel = new UILabel()
{
Position = new Vector2(7, 241),
Size = new Vector2(138, 30),
Alignment = TextAlignment.Middle | TextAlignment.Center,
Caption = "$0",
CaptionStyle = largeStyle
});
Add(TimeLabelShadow = new UILabel()
{
Position = new Vector2(157, 221+2),
Size = new Vector2(114, 16),
Alignment = TextAlignment.Middle | TextAlignment.Center,
Caption = "12:00AM",
CaptionStyle = shadowStyle
});
Add(TimeLabel = new UILabel()
{
Position = new Vector2(157, 221),
Size = new Vector2(114, 16),
Alignment = TextAlignment.Middle | TextAlignment.Center,
Caption = "12:00AM",
CaptionStyle = whiteStyle
});
Add(FriendsLabelShadow = new UILabel()
{
Position = new Vector2(176, 184+2),
Alignment = TextAlignment.Top | TextAlignment.Left,
Caption = "0",
CaptionStyle = shadowStyle
});
Add(FriendsLabel = new UILabel()
{
Position = new Vector2(176, 184),
Alignment = TextAlignment.Top | TextAlignment.Left,
Caption = "0",
CaptionStyle = friendStyle
});
Add(FloorLabelShadow = new UILabel()
{
Position = new Vector2(22, 184+2),
Size = new Vector2(24, 15),
Alignment = TextAlignment.Center | TextAlignment.Middle,
Caption = "1st",
CaptionStyle = shadowStyle
});
Add(FloorLabel = new UILabel()
{
Position = new Vector2(22, 184),
Size = new Vector2(24, 15),
Alignment = TextAlignment.Center | TextAlignment.Middle,
Caption = "1st",
CaptionStyle = whiteStyle
});
RoofButton.OnButtonClick += (btn) => SetCut(3);
WallsUpButton.OnButtonClick += (btn) => SetCut(2);
WallsCutButton.OnButtonClick += (btn) => SetCut(1);
WallsDownButton.OnButtonClick += (btn) => SetCut(0);
LiveButton.OnButtonClick += (btn) => OnModeClick?.Invoke(UIMainPanelMode.LIVE);
BuyButton.OnButtonClick += (btn) => OnModeClick?.Invoke(UIMainPanelMode.BUY);
BuildButton.OnButtonClick += (btn) => OnModeClick?.Invoke(UIMainPanelMode.BUILD);
OptionsButton.OnButtonClick += (btn) => OnModeClick?.Invoke(UIMainPanelMode.OPTIONS);
ZoomInButton.OnButtonClick += ZoomControl;
ZoomOutButton.OnButtonClick += ZoomControl;
RotateCWButton.OnButtonClick += RotateClockwise;
RotateCCWButton.OnButtonClick += RotateCounterClockwise;
FloorUpButton.OnButtonClick += (b) => { if (Game.Level < 5) Game.Level++; };
FloorDownButton.OnButtonClick += (b) => { if (Game.Level > 1) Game.Level--; };
Size = new Vector2(Background.Width, Background.Height);
UpdateBuildBuy();
UpdateMoneyDisplay();
UpdateZoomButton();
}
private void ZoomControl(UIElement button)
{
if (FSOEnvironment.Enable3D) return;
Game.ZoomLevel = (Game.ZoomLevel + ((button == ZoomInButton) ? -1 : 1));
}
private void RotateCounterClockwise(UIElement button)
{
if (FSOEnvironment.Enable3D) return;
var newRot = (Game.Rotation - 1);
if (newRot < 0) newRot = 3;
Game.Rotation = newRot;
}
private void RotateClockwise(UIElement button)
{
if (FSOEnvironment.Enable3D) return;
Game.Rotation = (Game.Rotation + 1) % 4;
}
private string LastClock = "";
private int LastSpeed = -1;
private int LastCut;
private int LastMoney = 0;
private sbyte LastFloor = 0;
private int LastZoom;
public override void Update(UpdateState state)
{
var vm = Game.vm;
var min = vm.Context.Clock.Minutes;
var hour = vm.Context.Clock.Hours;
string suffix = (hour > 11) ? "PM" : "AM";
hour %= 12;
if (hour == 0) hour = 12;
var text = hour.ToString() + ":" + min.ToString().PadLeft(2, '0') + " " + suffix;
if (text != LastClock)
{
LastClock = text;
TimeLabel.Caption = text;
TimeLabelShadow.Caption = text;
}
if (Game.Level != LastFloor)
{
LastFloor = Game.Level;
FloorLabel.Caption = FloorNames[LastFloor - 1];
FloorLabelShadow.Caption = FloorNames[LastFloor - 1];
FloorDownButton.Disabled = LastFloor == 1;
FloorUpButton.Disabled = LastFloor == 5;
}
var speed = RemapSpeed[Math.Max(0, vm.SpeedMultiplier)];
if (speed != LastSpeed)
{
/*
if (speed == 4) InnerBg.Texture = Content.Get().CustomUI.Get("clockinbg_pause.png").Get(GameFacade.GraphicsDevice);
else if (LastSpeed == 4) InnerBg.Texture = Content.Get().CustomUI.Get("clockinbg.png").Get(GameFacade.GraphicsDevice);
*/
for (int i = 0; i < 4; i++)
{
SpeedButtons[i].Selected = (i + 1 == speed);
}
LastSpeed = speed;
}
if (LastCut != Game.LotControl.WallsMode)
{
LastCut = Game.LotControl.WallsMode;
var ui = Content.Get().CustomUI;
RoofButton.Selected = LastCut == 3;
WallsUpButton.Selected = LastCut == 2;
WallsCutButton.Selected = LastCut == 1;
WallsDownButton.Selected = LastCut == 0;
}
var money = GetMoney();
if (LastMoney != money)
{
DisplayChange(money - LastMoney);
LastMoney = money;
UpdateMoneyDisplay();
}
if (LastZoom != Game.ZoomLevel) UpdateZoomButton();
base.Update(state);
//KEY SHORTCUTS
var keys = state.NewKeys;
var nofocus = true;
if (Game.InLot)
{
if (keys.Contains(Keys.F1) && !LiveButton.Disabled) OnModeClick?.Invoke(UIMainPanelMode.LIVE);
if (keys.Contains(Keys.F2) && !BuyButton.Disabled) OnModeClick?.Invoke(UIMainPanelMode.BUY);
if (keys.Contains(Keys.F3) && !BuildButton.Disabled) OnModeClick?.Invoke(UIMainPanelMode.BUILD);
if (keys.Contains(Keys.F4)) OnModeClick?.Invoke(UIMainPanelMode.OPTIONS); // Options Panel
if (nofocus)
{
if (FSOEnvironment.Enable3D)
{
//if the zoom or rotation buttons are down, gradually change their values.
if (RotateCWButton.IsDown || state.KeyboardState.IsKeyDown(Keys.OemPeriod)) ((WorldStateRC)Game.vm.Context.World.State).RotationX += 2f / FSOEnvironment.RefreshRate;
if (RotateCCWButton.IsDown || state.KeyboardState.IsKeyDown(Keys.OemComma)) ((WorldStateRC)Game.vm.Context.World.State).RotationX -= 2f / FSOEnvironment.RefreshRate;
if (ZoomInButton.IsDown || (state.KeyboardState.IsKeyDown(Keys.OemPlus) && !state.CtrlDown)) Game.LotControl.TargetZoom = Math.Max(0.25f, Math.Min(Game.LotControl.TargetZoom + 1f / FSOEnvironment.RefreshRate, 2));
if (ZoomOutButton.IsDown || (state.KeyboardState.IsKeyDown(Keys.OemMinus) && !state.CtrlDown)) Game.LotControl.TargetZoom = Math.Max(0.25f, Math.Min(Game.LotControl.TargetZoom - 1f / FSOEnvironment.RefreshRate, 2));
}
else
{
if (keys.Contains(Keys.OemPlus) && !state.CtrlDown && !ZoomInButton.Disabled) { Game.ZoomLevel -= 1; UpdateZoomButton(); }
if (keys.Contains(Keys.OemMinus) && !state.CtrlDown && !ZoomOutButton.Disabled) { Game.ZoomLevel += 1; UpdateZoomButton(); }
if (keys.Contains(Keys.OemComma)) RotateCounterClockwise(null);
if (keys.Contains(Keys.OemPeriod)) RotateClockwise(null);
}
if (keys.Contains(Keys.PageDown)) { if (Game.Level > 1) Game.Level--; }
if (keys.Contains(Keys.PageUp)) { if (Game.Level < 5) Game.Level++; }
if (keys.Contains(Keys.Home)) UpdateWallsViewKeyHandler(1);
if (keys.Contains(Keys.End)) UpdateWallsViewKeyHandler(0);
}
}
}
private void UpdateWallsViewKeyHandler(int type)
{
var mode = Game.LotControl.WallsMode;
switch (type)
{
case 0:
if (mode > 0) Game.LotControl.WallsMode -= 1;
break;
case 1:
if (mode < 3) Game.LotControl.WallsMode += 1;
break;
}
}
public void UpdateZoomButton()
{
ZoomInButton.Disabled = (!Game.InLot) || (!FSOEnvironment.Enable3D && (Game.ZoomLevel == 1));
ZoomOutButton.Disabled = (!FSOEnvironment.Enable3D && (Game.ZoomLevel == 3));
LastZoom = Game.ZoomLevel;
}
public void SetMode(UIMainPanelMode mode)
{
LiveButton.Selected = mode == UIMainPanelMode.LIVE;
BuyButton.Selected = mode == UIMainPanelMode.BUY;
BuildButton.Selected = mode == UIMainPanelMode.BUILD;
OptionsButton.Selected = mode == UIMainPanelMode.OPTIONS;
}
public void DisplayChange(int change)
{
var newLabel = new UILabel();
newLabel.Position = MoneyLabel.Position;
newLabel.Y += -20f;
newLabel.CaptionStyle = MoneyLabel.CaptionStyle.Clone();
newLabel.CaptionStyle.Size = 15;
newLabel.CaptionStyle.Color = (change > 0) ? UIStyle.Current.Text : UIStyle.Current.NegMoney;
newLabel.Alignment = FSO.Client.UI.Framework.TextAlignment.Right | FSO.Client.UI.Framework.TextAlignment.Middle;
newLabel.Size = MoneyLabel.Size;
newLabel.Caption = ((change > 0) ? "+" : "-") + "§" + Math.Abs(change);
DynamicOverlay.Add(newLabel);
GameFacade.Screens.Tween.To(newLabel, 1.5f, new Dictionary<string, float>() { { "Y", newLabel.Y-30 }, { "Opacity", 0 } });
GameThread.SetTimeout(() => { Remove(newLabel); }, 1500);
}
private void UpdateMoneyDisplay()
{
MoneyLabel.Caption = "§" + LastMoney.ToString("##,#0");
MoneyLabel.Visible = Game.vm.GetGlobalValue(32) == 0;
}
private int GetMoney()
{
return Game.ActiveFamily?.Budget ?? 0;
}
public void UpdateBuildBuy()
{
var bbEnable = Game.vm.Context.Architecture.BuildBuyEnabled;
BuyButton.Disabled = !bbEnable;
BuildButton.Disabled = !bbEnable;
LiveButton.Disabled = Game.vm.GetGlobalValue(32) != 0;
}
public void SetCut(int cut)
{
Game.LotControl.World.State.DrawRoofs = (cut == 3);
Game.LotControl.WallsMode = cut;
}
public void SwitchSpeed(int speed)
{
var vm = Game.vm;
if (vm.SpeedMultiplier == -1) return;
switch (vm.SpeedMultiplier)
{
case 0:
switch (speed)
{
case 1:
HITVM.Get().PlaySoundEvent(UISounds.SpeedPTo1); break;
case 2:
HITVM.Get().PlaySoundEvent(UISounds.SpeedPTo2); break;
case 3:
HITVM.Get().PlaySoundEvent(UISounds.SpeedPTo3); break;
}
break;
case 1:
switch (speed)
{
case 4:
HITVM.Get().PlaySoundEvent(UISounds.Speed1ToP); break;
case 2:
HITVM.Get().PlaySoundEvent(UISounds.Speed1To2); break;
case 3:
HITVM.Get().PlaySoundEvent(UISounds.Speed1To3); break;
}
break;
case 3:
switch (speed)
{
case 4:
HITVM.Get().PlaySoundEvent(UISounds.Speed2ToP); break;
case 1:
HITVM.Get().PlaySoundEvent(UISounds.Speed2To1); break;
case 3:
HITVM.Get().PlaySoundEvent(UISounds.Speed2To3); break;
}
break;
case 10:
switch (speed)
{
case 4:
HITVM.Get().PlaySoundEvent(UISounds.Speed3ToP); break;
case 1:
HITVM.Get().PlaySoundEvent(UISounds.Speed3To1); break;
case 2:
HITVM.Get().PlaySoundEvent(UISounds.Speed3To2); break;
}
break;
}
switch (speed)
{
case 4: vm.SpeedMultiplier = 0; break;
case 1: vm.SpeedMultiplier = 1; break;
case 2: vm.SpeedMultiplier = 3; break;
case 3: vm.SpeedMultiplier = 10; break;
}
}
}
}

View file

@ -777,9 +777,9 @@ namespace Simitone.Client.UI.Panels.LiveSubpanels
public override void GameResized()
{
CatContainer.Size = new Vector2(UIScreen.Current.ScreenWidth - 342, 128);
if (ChoosingSub) Reset();
base.GameResized();
CatContainer.Size = new Vector2(Size.X, 128);
if (ChoosingSub) Reset();
}
public override void Update(UpdateState state)

View file

@ -19,7 +19,7 @@ namespace Simitone.Client.UI.Panels.LiveSubpanels
{
Opacity = 0;
var screenWidth = GameFacade.Screens.CurrentUIScreen.ScreenWidth;
Size = new Vector2(screenWidth-342, 128);
Size = new Vector2(screenWidth - (342 + (game.Desktop?100:0)), 128);
GameFacade.Screens.Tween.To(this, 0.3f, new Dictionary<string, float>() { { "Opacity", 1f } });
Game = game;
}
@ -27,7 +27,7 @@ namespace Simitone.Client.UI.Panels.LiveSubpanels
public override void GameResized()
{
var screenWidth = UIScreen.Current.ScreenWidth;
Size = new Vector2(screenWidth - 342, 128);
Size = new Vector2(screenWidth - (342 + (Game.Desktop ? 100 : 0)), 128);
base.GameResized();
}

View file

@ -126,7 +126,7 @@ namespace Simitone.Client.UI.Panels.LotControls
}
Camera = new BasicCamera(GameFacade.GraphicsDevice, new Vector3(5, 1, 0), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
Camera.NearPlane = 0.001f;
Scene = new _3DTargetScene(GameFacade.GraphicsDevice, Camera, new Point(1030, 500), GlobalSettings.Default.AntiAlias?8:0);
Scene = new _3DTargetScene(GameFacade.GraphicsDevice, Camera, new Point(1030, 500), (GlobalSettings.Default.AntiAlias > 0)?8:0);
Scene.Initialize(GameFacade.Scenes);
InitializeLot();

View file

@ -17,6 +17,20 @@ namespace Simitone.Client.UI.Panels
{
public int[] Divisors = new int[]
{
237,
328,
398,
456,
507,
556,
609,
680,
731,
781,
832,
920
/*
140,
243,
278,
@ -30,6 +44,7 @@ namespace Simitone.Client.UI.Panels
723,
814,
884
*/
};
public float OddTransition { get; set; }

View file

@ -327,13 +327,12 @@ namespace Simitone.Client.UI.Panels
private void DialogResponse(byte code)
{
if (BlockingDialog == null || !(BlockingDialog is UIMobileAlert) || ActiveEntity == null) return;
if (BlockingDialog == null || !(BlockingDialog is UIMobileAlert)) return;
BlockingDialog.Close();
var ma = (UIMobileAlert)BlockingDialog;
LastDialogID = 0;
vm.SendCommand(new VMNetDialogResponseCmd
{
ActorUID = ActiveEntity.PersistID,
ResponseCode = code,
ResponseText = (ma.ResponseText == null) ? "" : ma.ResponseText
});
@ -671,6 +670,20 @@ namespace Simitone.Client.UI.Panels
//MouseCutRect = new Rectangle(0,0,0,0);
}
public void SetTargetZoom(WorldZoom zoom)
{
switch (zoom)
{
case WorldZoom.Near:
TargetZoom = 1f; break;
case WorldZoom.Medium:
TargetZoom = 0.5f; break;
case WorldZoom.Far:
TargetZoom = 0.25f; break;
}
LastZoom = World.State.Zoom;
}
public override void Draw(UISpriteBatch batch)
{
//DrawLocalTexture(batch, World.State.Light.LightMap, new Rectangle(0,0, World.State.Light.LightMap.Width/3, World.State.Light.LightMap.Height/2), new Vector2());
@ -681,6 +694,7 @@ namespace Simitone.Client.UI.Panels
base.Draw(batch);
}
private WorldZoom LastZoom;
public override void Update(UpdateState state)
{
base.Update(state);
@ -695,6 +709,13 @@ namespace Simitone.Client.UI.Panels
}
else
{
if (World.State.Zoom != LastZoom)
{
//zoom has been changed by something else. inherit the value
SetTargetZoom(World.State.Zoom);
LastZoom = World.State.Zoom;
}
float BaseScale;
WorldZoom targetZoom;
if (TargetZoom < 0.5f)

View file

@ -110,32 +110,39 @@ namespace Simitone.Client.UI.Panels
var ui = Content.Get().CustomUI;
Div = ui.Get("panel_div.png").Get(GameFacade.GraphicsDevice);
FloorUpBtn = new UIStencilButton(ui.Get("level_up.png").Get(GameFacade.GraphicsDevice));
FloorUpBtn.Position = new Vector2(80, 10);
FloorUpBtn.OnButtonClick += (b) => { if (Game.Level < 5) Game.Level++; };
Add(FloorUpBtn);
if (!Game.Desktop)
{
FloorUpBtn = new UIStencilButton(ui.Get("level_up.png").Get(GameFacade.GraphicsDevice));
FloorUpBtn.Position = new Vector2(80, 10);
FloorUpBtn.OnButtonClick += (b) => { if (Game.Level < 5) Game.Level++; };
Add(FloorUpBtn);
FloorDownBtn = new UIStencilButton(ui.Get("level_down.png").Get(GameFacade.GraphicsDevice));
FloorDownBtn.Position = new Vector2(80, 68);
FloorDownBtn.OnButtonClick += (b) => { if (Game.Level > 1) Game.Level--; };
Add(FloorDownBtn);
FloorDownBtn = new UIStencilButton(ui.Get("level_down.png").Get(GameFacade.GraphicsDevice));
FloorDownBtn.Position = new Vector2(80, 68);
FloorDownBtn.OnButtonClick += (b) => { if (Game.Level > 1) Game.Level--; };
Add(FloorDownBtn);
FloorLabel = new UILabel();
FloorLabel.CaptionStyle = FloorLabel.CaptionStyle.Clone();
FloorLabel.CaptionStyle.Size = 15;
FloorLabel.CaptionStyle.Color = UIStyle.Current.Text;
FloorLabel.Alignment = TextAlignment.Middle | TextAlignment.Center;
FloorLabel.Position = new Vector2(80, 64);
FloorLabel.Size = new Vector2(51, 18);
FloorLabel = new UILabel();
FloorLabel.CaptionStyle = FloorLabel.CaptionStyle.Clone();
FloorLabel.CaptionStyle.Size = 15;
FloorLabel.CaptionStyle.Color = UIStyle.Current.Text;
FloorLabel.Alignment = TextAlignment.Middle | TextAlignment.Center;
FloorLabel.Position = new Vector2(80, 64);
FloorLabel.Size = new Vector2(51, 18);
FloorLabelShadow = new UILabel();
FloorLabelShadow.CaptionStyle = FloorLabel.CaptionStyle.Clone();
FloorLabelShadow.Alignment = TextAlignment.Middle | TextAlignment.Center;
FloorLabelShadow.Position = new Vector2(83, 67);
FloorLabelShadow.Size = new Vector2(51, 18);
FloorLabelShadow.CaptionStyle.Color = Color.Black * 0.5f;
Add(FloorLabelShadow);
Add(FloorLabel);
FloorLabelShadow = new UILabel();
FloorLabelShadow.CaptionStyle = FloorLabel.CaptionStyle.Clone();
FloorLabelShadow.Alignment = TextAlignment.Middle | TextAlignment.Center;
FloorLabelShadow.Position = new Vector2(83, 67);
FloorLabelShadow.Size = new Vector2(51, 18);
FloorLabelShadow.CaptionStyle.Color = Color.Black * 0.5f;
Add(FloorLabelShadow);
Add(FloorLabel);
Divider = new UIImage(ui.Get("divider.png").Get(GameFacade.GraphicsDevice));
Divider.Position = new Vector2(146, 29);
Add(Divider);
}
HideButton = new UIStencilButton(ui.Get("panel_hide.png").Get(GameFacade.GraphicsDevice));
HideButton.X = Game.ScreenWidth - (50 + 64 + 15);
@ -143,12 +150,8 @@ namespace Simitone.Client.UI.Panels
HideButton.OnButtonClick += (b) => { Close(); };
Add(HideButton);
Divider = new UIImage(ui.Get("divider.png").Get(GameFacade.GraphicsDevice));
Divider.Position = new Vector2(146, 29);
Add(Divider);
Switcher = new UICategorySwitcher();
Switcher.Position = new Vector2(164, 0);
Switcher.Position = new Vector2(164 - (Game.Desktop ? 16 : 0), 0);
Switcher.InitCategories(LiveCategories);
Switcher.OnCategorySelect += Switcher_OnCategorySelect;
Switcher.OnOpen += Switcher_OnOpen;
@ -159,7 +162,7 @@ namespace Simitone.Client.UI.Panels
fade.Opacity = 0;
}
Game.LotControl.QueryPanel.Position = new Vector2(53, -5);
Game.LotControl.QueryPanel.Position = new Vector2(53 + (Game.Desktop ? 25 : 0), -5);
Add(Game.LotControl.QueryPanel);
Game.LotControl.PickupPanel.Opacity = 0;
Add(Game.LotControl.PickupPanel);
@ -312,8 +315,18 @@ namespace Simitone.Client.UI.Panels
public UIElement[] GetFadeables()
{
return new UIElement[]
if (Game.Desktop)
{
return new UIElement[]
{
Switcher.MainButton,
HideButton
};
}
else
{
return new UIElement[]
{
FloorUpBtn,
FloorDownBtn,
FloorLabel,
@ -321,7 +334,8 @@ namespace Simitone.Client.UI.Panels
Switcher.MainButton,
Divider,
HideButton
};
};
}
}
public override void Draw(UISpriteBatch batch)
@ -347,13 +361,16 @@ namespace Simitone.Client.UI.Panels
base.Update(state);
Visible = _CurWidth > 0;
if (Game.Level != LastFloor)
if (!Game.Desktop)
{
LastFloor = Game.Level;
FloorLabel.Caption = FloorNames[LastFloor - 1];
FloorLabelShadow.Caption = FloorNames[LastFloor - 1];
FloorDownBtn.Disabled = LastFloor == 1;
FloorUpBtn.Disabled = LastFloor == 5;
if (Game.Level != LastFloor)
{
LastFloor = Game.Level;
FloorLabel.Caption = FloorNames[LastFloor - 1];
FloorLabelShadow.Caption = FloorNames[LastFloor - 1];
FloorDownBtn.Disabled = LastFloor == 1;
FloorUpBtn.Disabled = LastFloor == 5;
}
}
Game.LotControl.PickupPanel.Visible = Game.LotControl.PickupPanel.Opacity > 0;
@ -370,7 +387,7 @@ namespace Simitone.Client.UI.Panels
public void Open()
{
Visible = true;
GameFacade.Screens.Tween.To(this, 0.5f, new Dictionary<string, float>() { { "CurWidth", GameFacade.Screens.CurrentUIScreen.ScreenWidth-(64+15)} }, TweenQuad.EaseOut);
GameFacade.Screens.Tween.To(this, 0.5f, new Dictionary<string, float>() { { "CurWidth", GameFacade.Screens.CurrentUIScreen.ScreenWidth-X} }, TweenQuad.EaseOut);
foreach (var fade in GetFadeables())
{
GameFacade.Screens.Tween.To(fade, 0.3f, new Dictionary<string, float>() { { "Opacity", 1f } });
@ -420,8 +437,8 @@ namespace Simitone.Client.UI.Panels
public override void GameResized()
{
base.GameResized();
if (PanelActive) CurWidth = Game.ScreenWidth - (64 + 15);
HideButton.X = Game.ScreenWidth - (50 + 64 + 15);
if (PanelActive) CurWidth = Game.ScreenWidth - X;
HideButton.X = Game.ScreenWidth - (50 + X);
}
}

View file

@ -76,7 +76,7 @@ namespace Simitone.Client.UI.Panels
for (int i = 0; i < Group.Objects.Count; i++)
{
var target = Group.Objects[i];
target.SetRoom(65534);
target.SetRoom(65535);
if (target is VMGameObject) ((ObjectComponent)target.WorldUI).ForceDynamic = true;
CursorTiles[i] = vm.Context.CreateObjectInstance(0x00000437, new LotTilePos(target.Position), FSO.LotView.Model.Direction.NORTH, true).Objects[0];
CursorTiles[i].SetPosition(target.Position, Direction.NORTH, vm.Context);

View file

@ -60,6 +60,7 @@ namespace Simitone.Client.UI.Panels
this.ButtonStyle = new TextStyle
{
Font = GameFacade.MainFont,
VFont = GameFacade.VectorFont,
Size = 12,
Color = new Color(0xA5, 0xC3, 0xD6),
SelectedColor = new Color(0x00, 0xFF, 0xFF),
@ -133,7 +134,7 @@ namespace Simitone.Client.UI.Panels
HeadCamera.Position = new Vector3(0, pos2.Y, 12.5f);
HeadCamera.Target = pos2;
HeadScene = new _3DTargetScene(GameFacade.GraphicsDevice, HeadCamera, new Point((int)(200 * TrueScale), (int)(200 * TrueScale)), (GlobalSettings.Default.AntiAlias) ? 8 : 0);
HeadScene = new _3DTargetScene(GameFacade.GraphicsDevice, HeadCamera, new Point((int)(200 * TrueScale), (int)(200 * TrueScale)), (GlobalSettings.Default.AntiAlias > 0) ? 8 : 0);
HeadScene.ID = "UIPieMenuHead";
m_Head.Scene = HeadScene;

View file

@ -16,6 +16,7 @@ using Microsoft.Xna.Framework.Input;
using FSO.SimAntics;
using FSO.SimAntics.NetPlay.Model.Commands;
using FSO.HIT;
using Simitone.Client.UI.Panels.Desktop;
namespace Simitone.Client.UI.Panels
{
@ -29,6 +30,7 @@ namespace Simitone.Client.UI.Panels
public UIMainPanel MainPanel;
public UIStencilButton ExtendPanelBtn;
public UIModeSwitcher ModeSwitcher;
public UIDesktopUCP DesktopUCP;
public bool PanelActive;
public int LastCut = 0;
@ -36,48 +38,62 @@ namespace Simitone.Client.UI.Panels
public UISimitoneFrontend(TS1GameScreen screen)
{
var ui = Content.Get().CustomUI;
CutBtn = new UITwoStateButton(ui.Get("cut_btn_down.png").Get(GameFacade.GraphicsDevice));
CutBtn.X = screen.ScreenWidth - (256 + 15);
CutBtn.Y = 15;
CutBtn.OnButtonClick += CutButton;
Add(CutBtn);
Clock = new UIClockPanel(screen.vm);
Clock.X = screen.ScreenWidth - (334 + 15);
Clock.Y = 15;
Game = screen;
Add(Clock);
Money = new UIMoneyPanel(screen);
Money.Position = new Vector2(15, screen.ScreenHeight - 172);
Add(Money);
if (!Game.Desktop)
{
CutBtn = new UITwoStateButton(ui.Get("cut_btn_down.png").Get(GameFacade.GraphicsDevice));
CutBtn.X = screen.ScreenWidth - (256 + 15);
CutBtn.Y = 15;
CutBtn.OnButtonClick += CutButton;
Add(CutBtn);
Clock = new UIClockPanel(screen.vm);
Clock.X = screen.ScreenWidth - (334 + 15);
Clock.Y = 15;
Add(Clock);
Money = new UIMoneyPanel(screen);
Money.Position = new Vector2(15, screen.ScreenHeight - 172);
Add(Money);
ExtendPanelBtn = new UIStencilButton(ui.Get("panel_expand.png").Get(GameFacade.GraphicsDevice));
ExtendPanelBtn.OnButtonClick += ExpandClicked;
Add(ExtendPanelBtn);
}
MainPanel = new UIMainPanel(screen);
MainPanel.OnEndSelect += OnEndSelect;
MainPanel.ModeChanged += ModeChanged;
Add(MainPanel);
ExtendPanelBtn = new UIStencilButton(ui.Get("panel_expand.png").Get(GameFacade.GraphicsDevice));
ExtendPanelBtn.OnButtonClick += ExpandClicked;
Add(ExtendPanelBtn);
var mode = new UIModeSwitcher(screen);
mode.Position = new Vector2(64 + 15, screen.ScreenHeight - (64 + 15));
mode.OnModeClick += LiveButtonClicked;
Add(mode);
ModeSwitcher = mode;
ExtendPanelBtn.Position = new Vector2(mode.X + 54, mode.Y - 50);
if (Game.Desktop)
{
DesktopUCP = new UIDesktopUCP(screen);
DesktopUCP.Position = new Vector2(15, screen.ScreenHeight - (278 + 15));
DesktopUCP.OnModeClick += LiveButtonClicked;
Add(DesktopUCP);
}
else
{
var mode = new UIModeSwitcher(screen);
mode.Position = new Vector2(64 + 15, screen.ScreenHeight - (64 + 15));
mode.OnModeClick += LiveButtonClicked;
Add(mode);
ModeSwitcher = mode;
ExtendPanelBtn.Position = new Vector2(mode.X + 54, mode.Y - 50);
}
MainPanel.X = 64 + 15;
MainPanel.Y = mode.Y - 64;
if (Game.Desktop) MainPanel.X += 100;
MainPanel.GameResized();
MainPanel.Y = screen.ScreenHeight - (128 + 15);
MainPanel.Visible = false;
if (Game.vm.GetGlobalValue(32) > 0)
{
MainPanel.SetMode(UIMainPanelMode.BUY);
ModeSwitcher.EndSwitch(MainPanel.Mode);
ModeSwitcher?.EndSwitch(MainPanel.Mode);
MainPanel.Open();
} else
{
@ -87,7 +103,8 @@ namespace Simitone.Client.UI.Panels
private void ModeChanged(UIMainPanelMode obj)
{
Clock.SetHidden(obj != UIMainPanelMode.LIVE);
Clock?.SetHidden(obj != UIMainPanelMode.LIVE);
DesktopUCP?.SetMode(obj);
var lotType = MainPanel.GetLotType(true);
var hit = FSO.HIT.HITVM.Get();
switch (obj)
@ -140,13 +157,15 @@ namespace Simitone.Client.UI.Panels
private bool LiveButtonClicked(UIMainPanelMode mode)
{
if (MainPanel.PanelActive)
var deskAuto = Game.Desktop && (mode != UIMainPanelMode.LIVE || MainPanel.Mode != UIMainPanelMode.LIVE);
if (MainPanel.PanelActive || deskAuto)
{
if (MainPanel.ShowingSelect)
if (MainPanel.ShowingSelect || deskAuto)
{
if (!MainPanel.PanelActive) MainPanel.Open();
//switch to the target mode
MainPanel.SetMode(mode);
MainPanel.SwitchAvatar.Kill();
MainPanel.SwitchAvatar?.Kill();
return false;
}
else
@ -169,7 +188,7 @@ namespace Simitone.Client.UI.Panels
private void OnEndSelect()
{
ModeSwitcher.EndSwitch(MainPanel.Mode);
ModeSwitcher?.EndSwitch(MainPanel.Mode);
}
private void CutButton(UIElement button)
@ -219,45 +238,54 @@ namespace Simitone.Client.UI.Panels
}
base.Update(state);
if (LastCut != Game.LotControl.WallsMode)
if (!Game.Desktop)
{
LastCut = Game.LotControl.WallsMode;
var ui = Content.Get().CustomUI;
string cutImg = "cut_btn_down.png";
switch (LastCut)
if (LastCut != Game.LotControl.WallsMode)
{
case 1:
cutImg = "cut_btn_away.png"; break;
case 2:
cutImg = "cut_btn_up.png"; break;
case 3:
cutImg = "cut_btn_roof.png"; break;
LastCut = Game.LotControl.WallsMode;
var ui = Content.Get().CustomUI;
string cutImg = "cut_btn_down.png";
switch (LastCut)
{
case 1:
cutImg = "cut_btn_away.png"; break;
case 2:
cutImg = "cut_btn_up.png"; break;
case 3:
cutImg = "cut_btn_roof.png"; break;
}
CutBtn.Texture = ui.Get(cutImg).Get(GameFacade.GraphicsDevice);
}
CutBtn.Texture = ui.Get(cutImg).Get(GameFacade.GraphicsDevice);
if (Clock.TweenHook != ClockTween)
{
ClockTween = Clock.TweenHook;
CutBtn.X = Game.ScreenWidth - (256 + (138f * ClockTween) + 15);
if (CutPanel != null) CutPanel.X = CutBtn.X - 39;
}
ModeSwitcher.LiveButton.Switching = MainPanel.ShowingSelect;
ExtendPanelBtn.Visible = !MainPanel.PanelActive;
}
if (Clock.TweenHook != ClockTween)
{
ClockTween = Clock.TweenHook;
CutBtn.X = Game.ScreenWidth - (256 + (138f * ClockTween) + 15);
if (CutPanel != null) CutPanel.X = CutBtn.X - 39;
}
ModeSwitcher.LiveButton.Switching = MainPanel.ShowingSelect;
ExtendPanelBtn.Visible = !MainPanel.PanelActive;
}
public override void GameResized()
{
base.GameResized();
CutBtn.X = Game.ScreenWidth - (256 + (138f * ClockTween) + 15);
if (CutPanel != null) CutPanel.X = CutBtn.X - 39;
Clock.X = Game.ScreenWidth - (334 + 15);
Clock.Y = 15;
Money.Position = new Vector2(15, Game.ScreenHeight - 172);
var mode = ModeSwitcher;
mode.Position = new Vector2(64 + 15, Game.ScreenHeight - (64 + 15));
ExtendPanelBtn.Position = new Vector2(mode.X + 54, mode.Y - 50);
MainPanel.Y = mode.Y - 64;
if (!Game.Desktop)
{
CutBtn.X = Game.ScreenWidth - (256 + (138f * ClockTween) + 15);
if (CutPanel != null) CutPanel.X = CutBtn.X - 39;
Clock.X = Game.ScreenWidth - (334 + 15);
Clock.Y = 15;
Money.Position = new Vector2(15, Game.ScreenHeight - 172);
var mode = ModeSwitcher;
mode.Position = new Vector2(64 + 15, Game.ScreenHeight - (64 + 15));
ExtendPanelBtn.Position = new Vector2(mode.X + 54, mode.Y - 50);
}
else
{
DesktopUCP.Position = new Vector2(15, Game.ScreenHeight - (278 + 15));
}
MainPanel.Y = Game.ScreenHeight - (128 + 15);
}
}
}

View file

@ -183,18 +183,6 @@ namespace Simitone.Client.UI.Panels.WorldUI
batch.Draw(Cross, new Vector2(Texture.Width / 2 - Cross.Width / 2, Texture.Height / 2 - Cross.Height / 4), Color.White);
}
if (DrawSkill)
{
batch.Draw(WhitePx, new Rectangle(88, 4, 71, 41), new Color(92, 92, 92));
var font = GameFacade.MainFont.GetNearest(14).Font;
Vector2 fontOrigin = font.MeasureString(SkillString) / 2;
batch.DrawString(font, SkillString, new Vector2(88 + 35, 15) - fontOrigin * 0.60f, new Color(255, 249, 157), 0, new Vector2(), 0.60f, SpriteEffects.None, 0);
fontOrigin = font.MeasureString(SpeedString) / 2;
batch.DrawString(font, SpeedString, new Vector2(88 + 35, 34) - fontOrigin * 0.60f, new Color(255, 249, 157), 0, new Vector2(), 0.60f, SpriteEffects.None, 0);
}
batch.End();
GD.SetRenderTarget(null);
Invalidated = false;

View file

@ -59,8 +59,10 @@ namespace Simitone.Client.UI.Panels.WorldUI
batch.Draw(MoneyBG, new Vector2(MoneyTarget.Width-9.6f, Headline.Duration / 2), new Rectangle(24, 0, 12, 24), Model.UIStyle.Current.Bg * opacity,
0, Vector2.Zero, new Vector2(0.8f, 0.8f), SpriteEffects.None, 0);
Style.Color.A = (byte)(opacity*255);
batch.DrawString(Style.SpriteFont, Text, new Vector2(5, Headline.Duration/2), Style.Color);
batch.End();
Style.VFont.Draw(GD, Text, new Vector2(5, 1), Style.Color, new Vector2(Style.Scale), null);
GD.SetRenderTarget(null);
}

View file

@ -39,6 +39,7 @@ namespace Simitone.Client.UI.Screens
public UISimitoneLogo Logo;
public UISimitoneLoadLabel LastLabel;
public bool LoadingComplete;
public UITweenInstance LogoTween;
private bool Closing = false;
private float _i;
@ -83,19 +84,19 @@ namespace Simitone.Client.UI.Screens
GameFacade.Screens.Tween.To(this, 0.5f, new Dictionary<string, float>() { { "InterpolatedAnimation", 1f } }, TweenQuad.EaseOut);
LoadProgress = new UILoadProgress();
LoadProgress.Position = (new Vector2(ScreenWidth, ScreenHeight) - new Vector2(938, 112))/2;
LoadProgress.Position = (new Vector2(ScreenWidth, ScreenHeight) - new Vector2(1012, 128))/2;
Add(LoadProgress);
Logo = new UISimitoneLogo();
Logo.Position = new Vector2(ScreenWidth, ScreenHeight) / 2;
Add(Logo);
GameFacade.Screens.Tween.To(Logo, 1f, new Dictionary<string, float>() { { "Y", ScreenHeight/4 }, { "ScaleX", 0.5f }, { "ScaleY", 0.5f } }, TweenQuad.EaseOut);
LogoTween = GameFacade.Screens.Tween.To(Logo, 1f, new Dictionary<string, float>() { { "Y", ScreenHeight/4 }, { "ScaleX", 0.5f }, { "ScaleY", 0.5f } }, TweenQuad.EaseOut);
InterpolatedAnimation = InterpolatedAnimation;
(new Thread(() => {
FSO.Content.Content.Init(GlobalSettings.Default.StartupPath, GameFacade.GraphicsDevice);
VMContext.InitVMConfig();
VMContext.InitVMConfig(true);
lock (this)
{
LoadingComplete = true;
@ -125,6 +126,20 @@ namespace Simitone.Client.UI.Screens
}, 750);
}
public override void GameResized()
{
base.GameResized();
GameFacade.Screens.Tween.Stop(LogoTween, true);
Bg.Position = (new Vector2(ScreenWidth, ScreenHeight)) / 2;
ProgressDiag.Position = new Vector2(0, ScreenHeight / 2 - 75);
TextDiag.Position = new Vector2(0, ScreenHeight * 0.75f - 37);
LoadProgress.Position = (new Vector2(ScreenWidth, ScreenHeight) - new Vector2(1012, 128)) / 2;
Logo.Position = new Vector2(ScreenWidth, ScreenHeight/2) / 2;
if (LastLabel != null) LastLabel.Position = new Vector2(ScreenWidth / 2, ScreenHeight * 0.75f);
InterpolatedAnimation = InterpolatedAnimation;
}
public ContentLoadingProgress LastProgress = ContentLoadingProgress.Invalid;
public override void Update(UpdateState state)

View file

@ -249,7 +249,7 @@ namespace Simitone.Client.UI.Screens
var moving = 0;
if (state.MouseStates.Count > 0)
if (state.MouseStates.Count(x => x.MouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed) > 0)
{
if (XLast == -1)
{
@ -699,11 +699,6 @@ namespace Simitone.Client.UI.Screens
vm.Context.Clock.Minutes = 0;
vm.Context.Clock.Hours = 12;
if (state.NewKeys.Contains(Microsoft.Xna.Framework.Input.Keys.LeftControl))
{
SetMode(UICASMode.SimEdit);
}
var disableAccept = false;
switch (Mode)
{

View file

@ -28,6 +28,7 @@ using Microsoft.Xna.Framework.Input;
using Simitone.Client.UI.Controls;
using Simitone.Client.UI.Panels;
using Simitone.Client.UI.Panels.WorldUI;
using Simitone.Client.Utils;
using System;
using System.Collections.Generic;
using System.IO;
@ -41,6 +42,7 @@ namespace Simitone.Client.UI.Screens
{
public UIContainer WindowContainer;
public bool Downtown;
public bool Desktop = !FSOEnvironment.SoftwareKeyboard;
public UILotControl LotControl { get; set; }
public UISimitoneFrontend Frontend { get; set; }
@ -87,6 +89,7 @@ namespace Simitone.Client.UI.Screens
Bg.Visible = false;
World.Visible = true;
//ucp.SetMode(UIUCP.UCPMode.LotMode);
LotControl.SetTargetZoom(targ);
if (m_ZoomLevel != value) vm.Context.World.InitiateSmoothZoom(targ);
vm.Context.World.State.Zoom = targ;
m_ZoomLevel = value;
@ -191,6 +194,8 @@ namespace Simitone.Client.UI.Screens
public void NeighSelection(NeighSelectionMode mode)
{
Content.Get().Neighborhood.PreparePersonDataFromObject = PersonGeneratorHelper.PreparePersonDataFromObject;
Content.Get().Neighborhood.AddMissingNeighbors();
var nbd = (ushort)((mode == NeighSelectionMode.MoveInMagic) ? 7 : 4);
TS1NeighPanel = new UINeighborhoodSelectionPanel(nbd);
var switcher = new UINeighbourhoodSwitcher(TS1NeighPanel, nbd, mode != NeighSelectionMode.Normal);
@ -233,6 +238,7 @@ namespace Simitone.Client.UI.Screens
public void MoveInAndPlay(short house, int family, UIElement switcher)
{
MoveInFamily = null;
var neigh = Content.Get().Neighborhood;
var fami = neigh.GetFamily((ushort)family);
neigh.SetFamilyForHouse(house, fami, true);
@ -343,6 +349,25 @@ namespace Simitone.Client.UI.Screens
if (state.NewKeys.Contains(Keys.D3)) ChangeSpeedTo(3);
if (state.NewKeys.Contains(Keys.P)) ChangeSpeedTo(0);
if (state.NewKeys.Contains(Keys.F12))
{
ChangeSpeedTo(1);
//running 10000 ticks
var timer = new System.Diagnostics.Stopwatch();
timer.Start();
for (int i=0; i<10000; i++)
{
vm.Tick();
}
timer.Stop();
UIScreen.GlobalShowDialog(new UIMobileAlert(new UIAlertOptions() {
Title = "Benchmark",
Message = "10000 ticks took " + timer.ElapsedMilliseconds + "ms."
}), true);
}
if (World != null)
{
//stub smooth zoom?
@ -454,7 +479,7 @@ namespace Simitone.Client.UI.Screens
public void InitializeLot(VMMarshal marshal)
{
InitializeLot();
vm.MyUID = uint.MaxValue;
vm.MyUID = 1;
vm.Load(marshal);
vm.TS1State.ActivateFamily(vm, ActiveFamily);
@ -462,7 +487,7 @@ namespace Simitone.Client.UI.Screens
var settings = GlobalSettings.Default;
var myClient = new VMNetClient
{
PersistID = uint.MaxValue,
PersistID = 1,
RemoteIP = "local",
AvatarState = new VMNetAvatarPersistState()
{
@ -470,7 +495,7 @@ namespace Simitone.Client.UI.Screens
DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender),
BodyOutfit = settings.DebugBody,
HeadOutfit = settings.DebugHead,
PersistID = uint.MaxValue,
PersistID = 1,
SkinTone = (byte)settings.DebugSkin,
Gender = (short)(settings.DebugGender ? 1 : 0),
Permissions = FSO.SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin,
@ -489,6 +514,44 @@ namespace Simitone.Client.UI.Screens
this.Add(Frontend);
}
public void ShowLoadErrors(List<VMLoadError> errors, bool verbose)
{
var errorMsg = GameFacade.Strings.GetString("153", "16");
if (verbose)
{
errorMsg += "\n";
foreach (var error in errors)
{
errorMsg += "\n" + error.ToString();
}
}
//signal thru the VM so we can stop time appropriately
vm.LastSpeedMultiplier = vm.SpeedMultiplier;
vm.SpeedMultiplier = 0;
vm.SignalDialog(new VMDialogInfo
{
Block = true,
Caller = null,
Yes = "OK",
DialogID = 0,
Title = GameFacade.Strings.GetString("153", "17"),
Message = errorMsg,
});
/*
CloseAlert = new UIMobileAlert(new FSO.Client.UI.Controls.UIAlertOptions
{
Title = GameFacade.Strings.GetString("153", "17"), //missing objects!
Message = errorMsg,
Buttons = UIAlertButton.Ok(
(b) => { CloseAlert.Close(); CloseAlert = null; }
)
});
*/
}
public void InitializeLot(string lotName, bool external)
{
if (lotName == "" || lotName[0] == '!') return;
@ -503,11 +566,13 @@ namespace Simitone.Client.UI.Screens
}
BlueprintReset(lotName, null);
vm.MyUID = uint.MaxValue;
if (vm.LoadErrors.Count > 0) GameThread.NextUpdate((state) => ShowLoadErrors(vm.LoadErrors, true));
vm.MyUID = 1;
var settings = GlobalSettings.Default;
var myClient = new VMNetClient
{
PersistID = uint.MaxValue,
PersistID = 1,
RemoteIP = "local",
AvatarState = new VMNetAvatarPersistState()
{
@ -515,7 +580,7 @@ namespace Simitone.Client.UI.Screens
DefaultSuits = new VMAvatarDefaultSuits(settings.DebugGender),
BodyOutfit = settings.DebugBody,
HeadOutfit = settings.DebugHead,
PersistID = uint.MaxValue,
PersistID = 1,
SkinTone = (byte)settings.DebugSkin,
Gender = (short)(settings.DebugGender ? 1 : 0),
Permissions = FSO.SimAntics.Model.TSOPlatform.VMTSOAvatarPermissions.Admin,
@ -557,7 +622,7 @@ namespace Simitone.Client.UI.Screens
public void LoadSurrounding(short houseID)
{
return;
var surrounding = new NBHm(new OBJ(File.OpenRead(@"C:\Users\Rhys\Desktop\nb2.obj")));
var surrounding = new NBHm(new OBJ(File.OpenRead(@"C:\Users\Rhys\Desktop\fso 2018\nb4.obj")));
NBHmHouse myH = null;
var myHeight = vm.Context.Blueprint.InterpAltitude(new Vector3(0, 0, 0));
if (!surrounding.Houses.TryGetValue(houseID, out myH)) return;
@ -653,7 +718,8 @@ namespace Simitone.Client.UI.Screens
switch (type)
{
case VMEventType.TS1BuildBuyChange:
Frontend.ModeSwitcher.UpdateBuildBuy();
Frontend?.ModeSwitcher?.UpdateBuildBuy();
Frontend?.DesktopUCP?.UpdateBuildBuy();
break;
}
}
@ -803,6 +869,8 @@ namespace Simitone.Client.UI.Screens
{
CleanupLastWorld();
NeighSelection(NeighSelectionMode.Normal);
Downtown = false;
SavedLot = null;
}
}

View file

@ -0,0 +1,50 @@
using FSO.Client;
using FSO.LotView;
using FSO.LotView.Model;
using FSO.SimAntics;
using FSO.SimAntics.Engine.TSOTransaction;
using FSO.SimAntics.Model;
using FSO.SimAntics.NetPlay.Drivers;
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Simitone.Client.Utils
{
public static class PersonGeneratorHelper
{
private static VM TempVM;
private static void InitVM()
{
var world = new World(GameFacade.GraphicsDevice);
world.Initialize(GameFacade.Scenes);
var context = new VMContext(world);
TempVM = new VM(context, new VMServerDriver(new VMTSOGlobalLinkStub()), new VMNullHeadlineProvider());
TempVM.Init();
var blueprint = new Blueprint(3, 3);
world.InitBlueprint(blueprint);
context.Blueprint = blueprint;
context.Architecture = new VMArchitecture(3, 3, blueprint, TempVM.Context);
blueprint.Terrain = new FSO.LotView.Components.TerrainComponent(new Rectangle(0, 0, 3, 3), blueprint);
TempVM.Tick();
}
public static short[] PreparePersonDataFromObject(uint guid)
{
if (TempVM == null) InitVM();
var obj = TempVM.Context.CreateObjectInstance(guid, LotTilePos.OUT_OF_WORLD, Direction.NORTH)?.BaseObject as VMAvatar;
if (obj == null) return new short[88];
var result = obj.GetPersonDataClone();
obj.Delete(true, TempVM.Context);
return result.Take(88).ToArray();
}
}
}

View file

@ -30,10 +30,10 @@ namespace Simitone.Windows
var useDX = true;
var path = gameLocator.FindTheSimsOnline();
if (useDX) GlobalSettings.Default.AntiAlias = false;
FSOEnvironment.Enable3D = false;
bool ide = false;
bool aa = false;
bool jit = false;
#region User resolution parmeters
foreach (var arg in args)
@ -57,6 +57,12 @@ namespace Simitone.Windows
case "3d":
FSOEnvironment.Enable3D = true;
break;
case "aa":
aa = true;
break;
case "jit":
jit = true;
break;
}
}
}
@ -87,13 +93,19 @@ namespace Simitone.Windows
GlobalSettings.Default.TS1HybridPath = gameLocator.FindTheSims1();
GlobalSettings.Default.ClientVersion = "0";
GlobalSettings.Default.LightingMode = 3;
GlobalSettings.Default.AntiAlias = true;
GlobalSettings.Default.AntiAlias = aa ? 2 : 0;
GlobalSettings.Default.ComplexShaders = true;
GameFacade.DirectX = useDX;
World.DirectX = useDX;
if (ide) new FSO.IDE.VolcanicStartProxy().InitVolcanic();
var assemblies = new FSO.SimAntics.JIT.Runtime.AssemblyStore();
//var globals = new TS1.Scripts.Dummy(); //make sure scripts assembly is loaded
if (jit) assemblies.InitAOT();
FSO.SimAntics.Engine.VMTranslator.INSTANCE = new FSO.SimAntics.JIT.Runtime.VMAOTTranslator(assemblies);
SimitoneGame game = new SimitoneGame();
var form = (Form)Form.FromHandle(game.Window.Handle);
if (form != null) form.FormClosing += Form_FormClosing;

View file

@ -74,6 +74,10 @@
<Project>{5deb20eb-1eb7-48f9-922c-463abae56e63}</Project>
<Name>FSO.IDE</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\FreeSO\TSOClient\FSO.SimAntics.JIT\FSO.SimAntics.JIT.csproj">
<Project>{b8ab3711-7b4f-4126-9bf3-4ddde9475b74}</Project>
<Name>FSO.SimAntics.JIT</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\FreeSO\TSOClient\FSO.UI\FSO.UI.csproj">
<Project>{73e2ad5b-720b-4ef3-9b7c-55931d0ec693}</Project>
<Name>FSO.UI</Name>

View file

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
# Visual Studio 15
VisualStudioVersion = 15.0.27703.2035
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simitone.iOS", "Simitone\Simitone.iOS.csproj", "{F0BFC685-A357-4E5A-B502-1B5A35970E63}"
EndProject
@ -51,6 +51,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSO.IDE", "..\..\FreeSO\TSO
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimplePaletteQuantizer", "..\..\FreeSO\Other\libs\ColorQuantizer\SimplePaletteQuantizer\SimplePaletteQuantizer.csproj", "{37812A22-91F3-4220-891E-5C26DA64A975}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSDFData", "..\..\FreeSO\Other\libs\MSDFData\MSDFData.csproj", "{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MSDFExtension", "..\..\FreeSO\Other\libs\MSDFExtension\MSDFExtension.csproj", "{EBF08DC7-916D-4133-BADE-38C31E29F18A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSO.SimAntics.JIT", "..\..\FreeSO\TSOClient\FSO.SimAntics.JIT\FSO.SimAntics.JIT.csproj", "{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TS1.Scripts", "TS1.Scripts\TS1.Scripts.csproj", "{E5391443-CF1E-4A61-8415-B0E51F23748B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@ -789,8 +797,137 @@ Global
{37812A22-91F3-4220-891E-5C26DA64A975}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{37812A22-91F3-4220-891E-5C26DA64A975}.Release|x86.ActiveCfg = Release|Any CPU
{37812A22-91F3-4220-891E-5C26DA64A975}.Release|x86.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Ad-Hoc|x86.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.AppStore|Any CPU.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.AppStore|iPhone.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.AppStore|x86.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.AppStore|x86.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Debug|iPhone.Build.0 = Debug|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Debug|x86.ActiveCfg = Debug|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Debug|x86.Build.0 = Debug|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Release|Any CPU.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Release|iPhone.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Release|iPhone.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Release|x86.ActiveCfg = Release|Any CPU
{EABEA510-3E53-4F19-9F0B-75C5CA9DFA3B}.Release|x86.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Ad-Hoc|x86.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.AppStore|Any CPU.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.AppStore|iPhone.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.AppStore|x86.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.AppStore|x86.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Debug|iPhone.Build.0 = Debug|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Debug|x86.ActiveCfg = Debug|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Debug|x86.Build.0 = Debug|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Release|Any CPU.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Release|iPhone.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Release|iPhone.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Release|x86.ActiveCfg = Release|Any CPU
{EBF08DC7-916D-4133-BADE-38C31E29F18A}.Release|x86.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Ad-Hoc|x86.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.AppStore|Any CPU.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.AppStore|iPhone.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.AppStore|x86.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.AppStore|x86.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Debug|iPhone.Build.0 = Debug|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Debug|x86.ActiveCfg = Debug|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Debug|x86.Build.0 = Debug|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Release|Any CPU.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Release|iPhone.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Release|iPhone.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Release|x86.ActiveCfg = Release|Any CPU
{B8AB3711-7B4F-4126-9BF3-4DDDE9475B74}.Release|x86.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Ad-Hoc|x86.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.AppStore|Any CPU.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.AppStore|iPhone.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.AppStore|iPhone.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.AppStore|x86.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.AppStore|x86.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Debug|iPhone.Build.0 = Debug|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Debug|x86.ActiveCfg = Debug|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Debug|x86.Build.0 = Debug|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Release|iPhone.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Release|iPhone.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Release|x86.ActiveCfg = Release|Any CPU
{E5391443-CF1E-4A61-8415-B0E51F23748B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F2FD9699-EAC6-4F94-8505-2B0ECD1E5D59}
EndGlobalSection
EndGlobal