diff --git a/.gitignore b/.gitignore index 1fa4d00..2838418 100644 --- a/.gitignore +++ b/.gitignore @@ -241,4 +241,5 @@ ModelManifest.xml # FAKE - F# Make .fake/ -Client/Simitone/Simitone/ \ No newline at end of file +Client/Simitone/Simitone/ +Client/Simitone/TS1.Scripts \ No newline at end of file diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/default_edge.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/default_edge.png new file mode 100644 index 0000000..919e5db Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/default_edge.png differ diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/r1__h.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/r1__h.png new file mode 100644 index 0000000..a4a28f6 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/r1__h.png differ diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/r1__n.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/r1__n.png new file mode 100644 index 0000000..5f0f469 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/r1__n.png differ diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/r2__h.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/r2__h.png new file mode 100644 index 0000000..6a065a6 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/r2__h.png differ diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/r2__n.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/r2__n.png new file mode 100644 index 0000000..2833255 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/r2__n.png differ diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/r3_.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/r3_.png new file mode 100644 index 0000000..b90afc9 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/r3_.png differ diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/r3__n.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/r3__n.png new file mode 100644 index 0000000..5e22243 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/r3__n.png differ diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/r4__h.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/r4__h.png new file mode 100644 index 0000000..da01664 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/r4__h.png differ diff --git a/Client/Simitone/Simitone.Client/Content/Textures/roof/r4__n.png b/Client/Simitone/Simitone.Client/Content/Textures/roof/r4__n.png new file mode 100644 index 0000000..8842b15 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/Textures/roof/r4__n.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_bg.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_bg.png new file mode 100644 index 0000000..4145c35 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_bg.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_build.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_build.png new file mode 100644 index 0000000..e2307d1 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_build.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_buy.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_buy.png new file mode 100644 index 0000000..5cdc0b6 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_buy.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_floordown.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_floordown.png new file mode 100644 index 0000000..dffe914 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_floordown.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_floorup.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_floorup.png new file mode 100644 index 0000000..1aea0c9 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_floorup.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_friend.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_friend.png new file mode 100644 index 0000000..b14670e Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_friend.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_live.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_live.png new file mode 100644 index 0000000..721855a Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_live.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_opt.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_opt.png new file mode 100644 index 0000000..ce4e12a Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_opt.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_rotccw.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_rotccw.png new file mode 100644 index 0000000..11c5ecb Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_rotccw.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_rotcw.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_rotcw.png new file mode 100644 index 0000000..136d59e Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_rotcw.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed1.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed1.png new file mode 100644 index 0000000..001ffaa Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed1.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed2.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed2.png new file mode 100644 index 0000000..634e7ac Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed2.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed3.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed3.png new file mode 100644 index 0000000..3dd478e Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed3.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed4.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed4.png new file mode 100644 index 0000000..c92d0dc Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_speed4.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w1.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w1.png new file mode 100644 index 0000000..3cc6d7f Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w1.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w2.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w2.png new file mode 100644 index 0000000..baf24f3 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w2.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w3.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w3.png new file mode 100644 index 0000000..62a6282 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w3.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w4.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w4.png new file mode 100644 index 0000000..59fb881 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_w4.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_zoomm.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_zoomm.png new file mode 100644 index 0000000..ad9e422 Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_zoomm.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_zoomp.png b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_zoomp.png new file mode 100644 index 0000000..217734c Binary files /dev/null and b/Client/Simitone/Simitone.Client/Content/uigraphics/desktop/d_live_zoomp.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/load/load_bar_bg.png b/Client/Simitone/Simitone.Client/Content/uigraphics/load/load_bar_bg.png index 550a9d0..8ee01f6 100644 Binary files a/Client/Simitone/Simitone.Client/Content/uigraphics/load/load_bar_bg.png and b/Client/Simitone/Simitone.Client/Content/uigraphics/load/load_bar_bg.png differ diff --git a/Client/Simitone/Simitone.Client/Content/uigraphics/load/load_bar_content.png b/Client/Simitone/Simitone.Client/Content/uigraphics/load/load_bar_content.png index 91d9d76..526386c 100644 Binary files a/Client/Simitone/Simitone.Client/Content/uigraphics/load/load_bar_content.png and b/Client/Simitone/Simitone.Client/Content/uigraphics/load/load_bar_content.png differ diff --git a/Client/Simitone/Simitone.Client/Simitone.Client.csproj b/Client/Simitone/Simitone.Client/Simitone.Client.csproj index 813ddda..f70bf1c 100644 --- a/Client/Simitone/Simitone.Client/Simitone.Client.csproj +++ b/Client/Simitone/Simitone.Client/Simitone.Client.csproj @@ -64,6 +64,7 @@ + @@ -102,6 +103,7 @@ + @@ -114,6 +116,10 @@ MonoGame.Framework.Windows False + + {eabea510-3e53-4f19-9f0b-75c5ca9dfa3b} + MSDFData + {73e2ad5b-720b-4ef3-9b7c-55931d0ec693} FSO.UI @@ -221,6 +227,66 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/Client/Simitone/Simitone.Client/SimitoneGame.cs b/Client/Simitone/Simitone.Client/SimitoneGame.cs index 420316a..6bfbe1e 100644 --- a/Client/Simitone/Simitone.Client/SimitoneGame.cs +++ b/Client/Simitone/Simitone.Client/SimitoneGame.cs @@ -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("Fonts/Mobile_15px")); - GameFacade.MainFont.AddSize(15, Content.Load("Fonts/Mobile_20px")); - GameFacade.MainFont.AddSize(19, Content.Load("Fonts/Mobile_25px")); - GameFacade.MainFont.AddSize(37, Content.Load("Fonts/Mobile_50px")); + //GameFacade.MainFont.AddSize(12, Content.Load("Fonts/Mobile_15px")); + //GameFacade.MainFont.AddSize(15, Content.Load("Fonts/Mobile_20px")); + //GameFacade.MainFont.AddSize(19, Content.Load("Fonts/Mobile_25px")); + //GameFacade.MainFont.AddSize(37, Content.Load("Fonts/Mobile_50px")); GameFacade.EdithFont = new FSO.Client.UI.Framework.Font(); - GameFacade.EdithFont.AddSize(12, Content.Load("Fonts/Trebuchet_12px")); - GameFacade.EdithFont.AddSize(14, Content.Load("Fonts/Trebuchet_14px")); + //GameFacade.EdithFont.AddSize(12, Content.Load("Fonts/Trebuchet_12px")); + //GameFacade.EdithFont.AddSize(14, Content.Load("Fonts/Trebuchet_14px")); + + GameFacade.VectorFont = new FSO.UI.Framework.MSDFFont(Content.Load("../Fonts/mobile")); + GameFacade.EdithVectorFont = new FSO.UI.Framework.MSDFFont(Content.Load("../Fonts/trebuchet")); + GameFacade.EdithVectorFont.VectorScale = 0.366f; + GameFacade.EdithVectorFont.Height = 15; + GameFacade.EdithVectorFont.YOff = 11; + + FSO.UI.Framework.MSDFFont.MSDFEffect = Content.Load("Effects/MSDFFont"); vitaboyEffect = Content.Load("Effects/Vitaboy"+((FSOEnvironment.SoftwareDepth)?"iOS":"")); - uiLayer = new UILayer(this, Content.Load("Fonts/FreeSO_12px"), Content.Load("Fonts/FreeSO_16px")); + uiLayer = new UILayer(this); } catch (Exception e) { diff --git a/Client/Simitone/Simitone.Client/UI/Controls/UIStencilButton.cs b/Client/Simitone/Simitone.Client/UI/Controls/UIStencilButton.cs index ee46190..c85dd8e 100644 --- a/Client/Simitone/Simitone.Client/UI/Controls/UIStencilButton.cs +++ b/Client/Simitone/Simitone.Client/UI/Controls/UIStencilButton.cs @@ -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); } } diff --git a/Client/Simitone/Simitone.Client/UI/Model/UIIconCache.cs b/Client/Simitone/Simitone.Client/UI/Model/UIIconCache.cs index 7edb07b..31d3f22 100644 --- a/Client/Simitone/Simitone.Client/UI/Model/UIIconCache.cs +++ b/Client/Simitone/Simitone.Client/UI/Model/UIIconCache.cs @@ -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; diff --git a/Client/Simitone/Simitone.Client/UI/Panels/Desktop/UIDesktopUCP.cs b/Client/Simitone/Simitone.Client/UI/Panels/Desktop/UIDesktopUCP.cs new file mode 100644 index 0000000..83b353e --- /dev/null +++ b/Client/Simitone/Simitone.Client/UI/Panels/Desktop/UIDesktopUCP.cs @@ -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 OnModeClick; + + public string[] FloorNames = new string[] + { + "1st", + "2nd", + "3rd", + "4th", + "5th" + }; + + public static Dictionary RemapSpeed = new Dictionary() + { + {0, 4}, //pause + {1, 1}, //1 speed + {3, 2}, //2 speed + {10, 3}, //3 speed + }; + + public static Dictionary 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() { { "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; + } + } + } +} diff --git a/Client/Simitone/Simitone.Client/UI/Panels/LiveSubpanels/UIBuyBrowsePanel.cs b/Client/Simitone/Simitone.Client/UI/Panels/LiveSubpanels/UIBuyBrowsePanel.cs index b01f65b..9771401 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/LiveSubpanels/UIBuyBrowsePanel.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/LiveSubpanels/UIBuyBrowsePanel.cs @@ -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) diff --git a/Client/Simitone/Simitone.Client/UI/Panels/LiveSubpanels/UISubpanel.cs b/Client/Simitone/Simitone.Client/UI/Panels/LiveSubpanels/UISubpanel.cs index a1c27ba..436b252 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/LiveSubpanels/UISubpanel.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/LiveSubpanels/UISubpanel.cs @@ -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() { { "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(); } diff --git a/Client/Simitone/Simitone.Client/UI/Panels/LotControls/UISelectSkinAlert.cs b/Client/Simitone/Simitone.Client/UI/Panels/LotControls/UISelectSkinAlert.cs index 68ef40b..9b577eb 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/LotControls/UISelectSkinAlert.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/LotControls/UISelectSkinAlert.cs @@ -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(); diff --git a/Client/Simitone/Simitone.Client/UI/Panels/UILoadProgress.cs b/Client/Simitone/Simitone.Client/UI/Panels/UILoadProgress.cs index 6151e77..0c7ed8d 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/UILoadProgress.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/UILoadProgress.cs @@ -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; } diff --git a/Client/Simitone/Simitone.Client/UI/Panels/UILotControl.cs b/Client/Simitone/Simitone.Client/UI/Panels/UILotControl.cs index 7e02632..feaac72 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/UILotControl.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/UILotControl.cs @@ -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) diff --git a/Client/Simitone/Simitone.Client/UI/Panels/UIMainPanel.cs b/Client/Simitone/Simitone.Client/UI/Panels/UIMainPanel.cs index 605ff64..6cf5f4e 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/UIMainPanel.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/UIMainPanel.cs @@ -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() { { "CurWidth", GameFacade.Screens.CurrentUIScreen.ScreenWidth-(64+15)} }, TweenQuad.EaseOut); + GameFacade.Screens.Tween.To(this, 0.5f, new Dictionary() { { "CurWidth", GameFacade.Screens.CurrentUIScreen.ScreenWidth-X} }, TweenQuad.EaseOut); foreach (var fade in GetFadeables()) { GameFacade.Screens.Tween.To(fade, 0.3f, new Dictionary() { { "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); } } diff --git a/Client/Simitone/Simitone.Client/UI/Panels/UIObjectHolder.cs b/Client/Simitone/Simitone.Client/UI/Panels/UIObjectHolder.cs index 5172148..e3c1a7e 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/UIObjectHolder.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/UIObjectHolder.cs @@ -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); diff --git a/Client/Simitone/Simitone.Client/UI/Panels/UIPieMenu.cs b/Client/Simitone/Simitone.Client/UI/Panels/UIPieMenu.cs index b8367f4..0d6ddd5 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/UIPieMenu.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/UIPieMenu.cs @@ -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; diff --git a/Client/Simitone/Simitone.Client/UI/Panels/UISimitoneFrontend.cs b/Client/Simitone/Simitone.Client/UI/Panels/UISimitoneFrontend.cs index 55d16ac..1af29ff 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/UISimitoneFrontend.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/UISimitoneFrontend.cs @@ -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); } } } diff --git a/Client/Simitone/Simitone.Client/UI/Panels/WorldUI/UIHeadlineRenderer.cs b/Client/Simitone/Simitone.Client/UI/Panels/WorldUI/UIHeadlineRenderer.cs index cf10437..894aae4 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/WorldUI/UIHeadlineRenderer.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/WorldUI/UIHeadlineRenderer.cs @@ -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; diff --git a/Client/Simitone/Simitone.Client/UI/Panels/WorldUI/UIMoneyHeadline.cs b/Client/Simitone/Simitone.Client/UI/Panels/WorldUI/UIMoneyHeadline.cs index 1ec8d73..8c21ab2 100644 --- a/Client/Simitone/Simitone.Client/UI/Panels/WorldUI/UIMoneyHeadline.cs +++ b/Client/Simitone/Simitone.Client/UI/Panels/WorldUI/UIMoneyHeadline.cs @@ -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); } diff --git a/Client/Simitone/Simitone.Client/UI/Screens/LoadingGameScreen.cs b/Client/Simitone/Simitone.Client/UI/Screens/LoadingGameScreen.cs index df7e8fa..986216d 100644 --- a/Client/Simitone/Simitone.Client/UI/Screens/LoadingGameScreen.cs +++ b/Client/Simitone/Simitone.Client/UI/Screens/LoadingGameScreen.cs @@ -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() { { "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() { { "Y", ScreenHeight/4 }, { "ScaleX", 0.5f }, { "ScaleY", 0.5f } }, TweenQuad.EaseOut); + LogoTween = GameFacade.Screens.Tween.To(Logo, 1f, new Dictionary() { { "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) diff --git a/Client/Simitone/Simitone.Client/UI/Screens/TS1CASScreen.cs b/Client/Simitone/Simitone.Client/UI/Screens/TS1CASScreen.cs index 4d1518b..38b7a6f 100644 --- a/Client/Simitone/Simitone.Client/UI/Screens/TS1CASScreen.cs +++ b/Client/Simitone/Simitone.Client/UI/Screens/TS1CASScreen.cs @@ -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) { diff --git a/Client/Simitone/Simitone.Client/UI/Screens/TS1GameScreen.cs b/Client/Simitone/Simitone.Client/UI/Screens/TS1GameScreen.cs index de8e489..26fa7e1 100644 --- a/Client/Simitone/Simitone.Client/UI/Screens/TS1GameScreen.cs +++ b/Client/Simitone/Simitone.Client/UI/Screens/TS1GameScreen.cs @@ -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 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; @@ -502,12 +565,14 @@ namespace Simitone.Client.UI.Screens vm.TS1State.ActivateFamily(vm, ActiveFamily); } BlueprintReset(lotName, null); + + if (vm.LoadErrors.Count > 0) GameThread.NextUpdate((state) => ShowLoadErrors(vm.LoadErrors, true)); - vm.MyUID = uint.MaxValue; + 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; } } diff --git a/Client/Simitone/Simitone.Client/Utils/PersonGeneratorHelper.cs b/Client/Simitone/Simitone.Client/Utils/PersonGeneratorHelper.cs new file mode 100644 index 0000000..d6a9a88 --- /dev/null +++ b/Client/Simitone/Simitone.Client/Utils/PersonGeneratorHelper.cs @@ -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(); + } + } +} diff --git a/Client/Simitone/Simitone.Windows/Program.cs b/Client/Simitone/Simitone.Windows/Program.cs index 537c009..cc930d6 100644 --- a/Client/Simitone/Simitone.Windows/Program.cs +++ b/Client/Simitone/Simitone.Windows/Program.cs @@ -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; diff --git a/Client/Simitone/Simitone.Windows/Simitone.Windows.csproj b/Client/Simitone/Simitone.Windows/Simitone.Windows.csproj index 6adc654..2fdae73 100644 --- a/Client/Simitone/Simitone.Windows/Simitone.Windows.csproj +++ b/Client/Simitone/Simitone.Windows/Simitone.Windows.csproj @@ -74,6 +74,10 @@ {5deb20eb-1eb7-48f9-922c-463abae56e63} FSO.IDE + + {b8ab3711-7b4f-4126-9bf3-4ddde9475b74} + FSO.SimAntics.JIT + {73e2ad5b-720b-4ef3-9b7c-55931d0ec693} FSO.UI diff --git a/Client/Simitone/Simitone.sln b/Client/Simitone/Simitone.sln index e4797d4..ce27e7e 100644 --- a/Client/Simitone/Simitone.sln +++ b/Client/Simitone/Simitone.sln @@ -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