{"TotalCount":50,"Files":[{"Ident":"wurstsoftware.forp","Path":"Game/GameText.cs","FileName":"GameText.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"using Forp.Object;\r\nusing Forp.Util;\r\nusing Sandbox.Diagnostics;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace Forp.Game;\r\n\r\npublic class GameText : Component\r\n{\r\n\t[RequireComponent] protected TextRenderer TextRenderer { get; set; }\r\n\r\n\tpublic void SetText(string Text)\r\n\t{\r\n\t\tTextRenderer.Text = Text;\r\n\t}\r\n\r\n\tpublic void SetScale(float Scale)\r\n\t{\r\n\t\tTextRenderer.Scale = Scale;\r\n\t}\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tbase.OnStart();\r\n\t}\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tbase.OnUpdate();\r\n\r\n\t\tif (GameManager.Instance.Mode != EGameManagerMode.Menu) // meh\r\n\t\t{\r\n\t\t\tVector3 Direction = WorldPosition - GamePlayer.Local.Camera.WorldPosition;\r\n\t\t\tTextRenderer.WorldRotation = Rotation.LookAt(Direction);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static T CreateTextObject\u003CT\u003E(Transform Transform, string Text = \u0022\u0022) where T : GameText\r\n\t{\r\n\t\tvar TextPrefab = GameManager.Instance.GetTextPrefab\u003CT\u003E();\r\n\t\tAssert.NotNull(TextPrefab);\r\n\r\n\t\tvar ConstructionClone = TextPrefab.Clone();\r\n\t\tConstructionClone.WorldTransform = Transform;\r\n\r\n\t\tvar TextObject = ConstructionClone.GetComponent\u003CT\u003E();\r\n\t\tTextObject.SetText($\u0022{Text}\u0022);\r\n\r\n\t\treturn TextObject;\r\n\t}\r\n}\r\n\r\npublic sealed class QueuedObjectText : GameText\r\n{\r\n\tprivate TimeSince TimeSinceHovered;\r\n\tprivate bool _isHovered = false;\r\n\tpublic bool IsHovered\r\n\t{\r\n\t\tget =\u003E _isHovered;\r\n\t\tset\r\n\t\t{\r\n\t\t\tif (value)\r\n\t\t\t{\r\n\t\t\t\tTimeSinceHovered = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (_isHovered == value)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t_isHovered = value;\r\n\t\t\tTextRenderer.Color = _isHovered ? Color.Red : Color.White;\r\n\t\t}\r\n\t}\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tbase.OnUpdate();\r\n\r\n\t\tif (_isHovered \u0026\u0026 TimeSinceHovered \u003E 0.066f)\r\n\t\t{\r\n\t\t\tIsHovered = false;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic Hex OwnerHex = null;\r\n\tpublic Guid GameObjectId = Guid.Empty;\r\n\r\n\tpublic void OnClick()\r\n\t{\r\n\t\tif (OwnerHex == null || GameObjectId == Guid.Empty)\r\n\t\t{\r\n\t\t\tLog.Warning($\u0022{this} hex text was invalid!\u0022);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tOwnerHex.Server_RemoveUnitFromQueue(GameObjectId);\r\n\t\tDestroyGameObject();\r\n\t}\r\n}\r\n\r\npublic sealed class DamageText : GameText\r\n{\r\n\tprivate int TicksAlive = 0;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tbase.OnStart();\r\n\r\n\t\tTextRenderer.Color = Color.Red;\r\n\t}\r\n\r\n\tprotected override void OnFixedUpdate()\r\n\t{\r\n\t\tbase.OnFixedUpdate();\r\n\r\n\t\tWorldPosition \u002B= Vector3.Up * 5;\r\n\t\tTicksAlive\u002B\u002B;\r\n\r\n\t\tif (TicksAlive \u003E 50)\r\n\t\t{\r\n\t\t\tDestroyGameObject();\r\n\t\t}\r\n\t}\r\n}"},{"Ident":"wurstsoftware.forp","Path":"styles/base/_splitcontainer.scss","FileName":"_splitcontainer.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"\r\n.splitcontainer\r\n{\r\n\tflex-grow: 1;\r\n\r\n\t\u003E .split-left, \u003E .split-right\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t}\r\n\r\n\t\u003E .split-left\r\n\t{\r\n\t\theight: 100%;\r\n\t}\r\n\r\n\t\u003E .splitter\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t\twidth: 8px;\r\n\t\tcursor: ew-resize;\r\n\r\n\t\t\u0026:hover\r\n\t\t{\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026.dragging \u003E .splitter\r\n\t{\r\n\t}\r\n\r\n\t\u0026.vertical\r\n\t{\r\n\t\tflex-direction: column;\r\n\r\n\t\t\u003E .splitter\r\n\t\t{\r\n\t\t\theight: 8px;\r\n\t\t\twidth: 100%;\r\n\t\t\tcursor: ns-resize;\r\n\t\t}\r\n\t}\r\n}"},{"Ident":"wurstsoftware.forp","Path":"ui/controls/vectorcontrol.cs.scss","FileName":"vectorcontrol.cs.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"VectorControl\r\n{\r\n\tgap: 2px;\r\n\tflex-grow: 1;\r\n}\r\n\r\nVectorControl NumberEntry\r\n{\r\n\tflex-basis: 50%;\r\n}"},{"Ident":"wurstsoftware.forp","Path":"Object/Upgrade.cs","FileName":"Upgrade.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"using Forp.Game;\r\nusing Forp.Object;\r\nusing Sandbox.UI;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Text;\r\n\r\nnamespace Forp.Object.Unit;\r\n\r\npublic record FUpgrade\r\n{\r\n\tpublic string ObjectId { get; set; }\r\n\tpublic string Name { get; set; }\r\n\r\n\tpublic List\u003CGameObject\u003E BuildingIds { get; set; }\r\n\tpublic int AttackModifyer { get; set; }\r\n\tpublic int HealthModifyer { get; set; }\r\n}\r\n\r\npublic class Upgrade : Obj\r\n{\r\n\t[Property] public List\u003CGameObject\u003E Buildings { get; set; }\r\n\t[Property] public int AttackModifyer { get; set; }\r\n\t[Property] public int HealthModifyer { get; set; }\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tShowTooltip = GamePlayer.Local != null \u0026\u0026 GamePlayer.Local.DraggedObject == GameObject;\r\n\t\tbase.OnUpdate();\r\n\r\n\t\tif (ShowTooltip)\r\n\t\t{\r\n\t\t\tWorldTooltip.SetScale(0.05f);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic string GetDesciption()\r\n\t{\r\n\t\treturn $\u0022{Buildings.Count}b\\n{AttackModifyer}a\\n{HealthModifyer}hp\u0022;\r\n\t}\r\n\r\n\tpublic List\u003Cstring\u003E GetBuildingIds()\r\n\t{\r\n\t\treturn Buildings.Select(Building =\u003E Building.GetComponent\u003CTextBuilding\u003E().ObjectId).ToList();\r\n\t}\r\n\r\n\tpublic FUpgrade GetUpgradeData()\r\n\t{\r\n\t\tFUpgrade UpgradeData = new()\r\n\t\t{\r\n\t\t\tObjectId = ObjectId,\r\n\t\t\tName = DisplayName,\r\n\t\t\tBuildingIds = Buildings,\r\n\t\t\tAttackModifyer = AttackModifyer,\r\n\t\t\tHealthModifyer = HealthModifyer,\r\n\t\t};\r\n\r\n\t\treturn UpgradeData;\r\n\t}\r\n}\r\n"},{"Ident":"wurstsoftware.forp","Path":"ui/menupanel.razor.scss","FileName":"menupanel.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"\r\nmenupanel\r\n{\r\n    position: absolute;\r\n    z-index: 1000;\r\n    pointer-events: all;\r\n    font-size: 12px;\r\n    flex-shrink: 0;\r\n\r\n    .background\r\n    {\r\n        position: absolute;\r\n        left: -5000px;\r\n        right: -5000px;\r\n        top: -5000px;\r\n        bottom: -5000px;\r\n    }\r\n\r\n    \u003E .inner\r\n    {\r\n        min-width: 200px;\r\n        min-height: 20px;\r\n        flex-direction: column;\r\n        font-family: Poppins;\r\n        font-weight: bold;\r\n        border-radius: 10px;\r\n        box-shadow: 5px 5px 30px #000e;\r\n        background-color: #2a2a2a;\r\n        flex-shrink: 0;\r\n\r\n        .spacer\r\n        {\r\n            height: 1px;\r\n            background-color: #0005;\r\n        }\r\n\r\n        .option\r\n        {\r\n            color: #fffa;\r\n            padding: 0px 8px;\r\n            cursor: pointer;\r\n            flex-shrink: 0;\r\n            height: 32px;\r\n\r\n            \u0026:first-child\r\n            {\r\n                border-top-left-radius: 10px;\r\n                border-top-right-radius: 10px;\r\n            }\r\n\r\n            \u0026:last-child\r\n            {\r\n                border-bottom-left-radius: 10px;\r\n                border-bottom-right-radius: 10px;\r\n            }\r\n\r\n            .icon\r\n            {\r\n                padding: 8px;\r\n                font-family: Material Icons;\r\n                justify-content: center;\r\n                align-items: center;\r\n                flex-shrink: 0;\r\n            }\r\n\r\n            .text\r\n            {\r\n                padding: 8px;\r\n                flex-shrink: 0;\r\n            }\r\n\r\n            \u0026:hover\r\n            {\r\n                background-color: #3472e6;\r\n                color: #f5f8fe;\r\n            }\r\n        }\r\n    }\r\n}\r\n"},{"Ident":"wurstsoftware.forp","Path":"ui/controls/color/colorhuecontrol.cs.scss","FileName":"colorhuecontrol.cs.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"ColorHueControl\r\n{\r\n\tgap: 0.5rem;\r\n\tflex-grow: 1;\r\n\tpointer-events: all;\r\n\tbackground: linear-gradient( to right, red, yellow, lime, cyan, blue, magenta, red );\r\n\tborder-radius: 4px;\r\n\tpadding: 2px;\r\n\theight: 12px;\r\n\tposition: relative;\r\n\tcursor: pointer;\r\n\tmargin: 10px 0;\r\n\tborder: 1px solid #333;\r\n\r\n\t\u0026:hover\r\n\t{\r\n\t\tborder: 1px solid #08f;\r\n\t}\r\n\r\n\t\u0026:active\r\n\t{\r\n\t\tborder: 1px solid #fff;\r\n\t}\r\n\r\n\t.handle\r\n\t{\r\n\t\ttop: -5px;\r\n\t\tbottom: -5px;\r\n\t\taspect-ratio: 1;\r\n\t\tborder-radius: 100px;\r\n\t\tborder: 2px solid #444;\r\n\t\tposition: absolute;\r\n\t\tbackground-color: white;\r\n\t\tbox-shadow: 2px 2px 16px #000a;\r\n\t\ttransform: translateX( -50% );\r\n\t\tpointer-events: none;\r\n\t}\r\n}\r\n"},{"Ident":"wurstsoftware.forp","Path":"styles/rootpanel.scss","FileName":"rootpanel.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"\r\n\r\nRootPanel\r\n{\r\n\tfont-family: Roboto;\r\n\tcolor: white;\r\n}\r\n\r\nIconPanel, i\r\n{\r\n\tfont-family: Material Icons;\r\n\tbackground-position: center;\r\n\tbackground-size: contain;\r\n}\r\n\r\n.tooltip\r\n{\r\n\tbackground-color: rgba( black, 0.8 );\r\n\tborder: 1px solid rgba( #555, 0.1 );\r\n\tpadding: 10px;\r\n\tborder-radius: 4px;\r\n\tcolor: white;\r\n\tfont-family: Inter;\r\n\tfont-weight: bold;\r\n\ttransition: opacity 0.09s ease;\r\n\topacity: 1;\r\n\tmargin: 0px;\r\n\r\n\t\u0026:intro, \u0026:outro\r\n\t{\r\n\t\topacity: 0;\r\n\t}\r\n}\r\n\r\n.textentry\r\n{\r\n\tcursor: text;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\twhite-space: nowrap;\r\n\toverflow: hidden;\r\n\tflex-direction: row;\r\n\tposition: relative;\r\n\tpadding: 10px;\r\n\r\n\t\u0026.disabled\r\n\t{\r\n\t\tcursor: default;\r\n\t}\r\n\r\n\t\u0026.is-multiline\r\n\t{\r\n\t\talign-items: flex-start;\r\n\t\twhite-space: normal;\r\n\t}\r\n\r\n\t.content-label,\r\n\t.placeholder\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t}\r\n\r\n\t.placeholder\r\n\t{\r\n\t\topacity: 0.2;\r\n\t\tpointer-events: none;\r\n\t}\r\n\r\n\t.iconpanel\r\n\t{\r\n\t\tposition: absolute;\r\n\t\tright: 0;\r\n\t\tpadding-right: 10px;\r\n\t\tpointer-events: none;\r\n\r\n\t\t\u0026.clearbutton\r\n\t\t{\r\n\t\t\tcolor: #fff;\r\n\t\t\tpointer-events: all;\r\n\t\t\tcursor: pointer;\r\n\t\t\topacity: 0.1;\r\n\r\n\t\t\t\u0026:hover\r\n\t\t\t{\r\n\t\t\t\topacity: 0.5;\r\n\t\t\t}\r\n\r\n\t\t\t\u0026:active\r\n\t\t\t{\r\n\t\t\t\topacity: 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026:empty\r\n\t{\r\n\t\t.clearbutton\r\n\t\t{\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026.has-icon\r\n\t{\r\n\t\tpadding-right: 30px;\r\n\t}\r\n\r\n\t.content-label,\r\n\t.prefix-label,\r\n\t.suffix-label,\r\n\t.placeholder\r\n\t{\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t.content-label\r\n\t{\r\n\t\torder: 1;\r\n\t}\r\n\r\n\t.suffix-label\r\n\t{\r\n\t\torder: 2;\r\n\t}\r\n\r\n\t.prefix-label,\r\n\t.suffix-label\r\n\t{\r\n\t\tflex-shrink: 0;\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\t\u0026.invalid\r\n\t{\r\n\t\tbox-shadow: 0px 0px 1px 2px #f8356b;\r\n\t}\r\n}\r\n\r\n.popup-panel\r\n{\r\n\tbackground-color: #1b202c;\r\n\tflex-direction: column;\r\n\tcolor: #8e9ec2;\r\n\ttransition: all 0.1s ease-out;\r\n\tposition: absolute;\r\n\tz-index: 2000;\r\n\tmin-height: 20px;\r\n\tmin-width: 10px;\r\n\toverflow: scroll;\r\n\tpointer-events: all;\r\n\tbox-shadow: 3px 3px 64px #000;\r\n\tborder-radius: 4px;\r\n\r\n\t\u0026.medium\r\n\t{\r\n\t\tmax-width: 300px;\r\n\t}\r\n\r\n\t\u0026.center-horizontal\r\n\t{\r\n\t\ttransform-origin: top center;\r\n\t}\r\n\r\n\t\u0026.below-center\r\n\t{\r\n\t\ttransform: translateX( -50% );\r\n\t\ttransform-origin: 0% 0%;\r\n\t}\r\n\r\n\t\u0026.above-left\r\n\t{\r\n\t\ttransform-origin: 0% 100%;\r\n\t}\r\n\r\n\t\u0026.above-center\r\n\t{\r\n\t\ttransform: translateX( -50% );\r\n\t\ttransform-origin: 0% 100%;\r\n\t}\r\n\r\n\t\u0026.left\r\n\t{\r\n\t\ttransform-origin: 100% 50%;\r\n\t\ttransform: translate( 00% -50% );\r\n\t}\r\n\r\n\t\u0026.right\r\n\t{\r\n\t\ttransform-origin: 0 50%;\r\n\t\ttransform: translate( 0% -50% );\r\n\t}\r\n\r\n\t\u0026:intro\r\n\t{\r\n\t\ttransform: scale( 0 );\r\n\t\tpointer-events: none;\r\n\t\topacity: 0;\r\n\t}\r\n\r\n\t\u0026:outro\r\n\t{\r\n\t\topacity: 0;\r\n\t\ttransition: all 0.1s ease-in;\r\n\t\tmargin-top: 50px;\r\n\t\tpointer-events: none;\r\n\t}\r\n\r\n\t\u0026.below-stretch\r\n\t{\r\n\t\ttransform-origin: 0% 0%;\r\n\r\n\t\t\u0026:intro\r\n\t\t{\r\n\t\t\ttransform: scaleY( 0.1 );\r\n\t\t}\r\n\t}\r\n\r\n\t\u003E .canvas\r\n\t{\r\n\t\tflex-direction: column;\r\n\t}\r\n\r\n\t.information\r\n\t{\r\n\t\tpadding: 16px;\r\n\t\tfont-size: 14px;\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\tbutton\r\n\t{\r\n\t\tpadding: 2px 8px;\r\n\t\tcursor: pointer;\r\n\t\tfont-family: Poppins;\r\n\t\tfont-weight: 600;\r\n\t\tflex-shrink: 0;\r\n\r\n\t\t\u0026:hover\r\n\t\t{\r\n\t\t\tbackground-color: #08f;\r\n\t\t\tcolor: #fff;\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"wurstsoftware.forp","Path":"ui/components/packagecard.razor.scss","FileName":"packagecard.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"@import \u0022/styles/_theme.scss\u0022;\r\n$background-size: 8px;\r\n\r\nPackageCard\r\n{\r\n\tflex-shrink: 0;\r\n\r\n\t\u0026:hover\r\n\t{\r\n\t\tsound-in: \u0022ui.button.over\u0022;\r\n\t}\r\n\r\n\t\u0026:active\r\n\t{\r\n\t\tsound-in: \u0022ui.button.press\u0022;\r\n\t}\r\n\r\n\tflex-direction: column;\r\n\tposition: relative;\r\n\tbackground-color: rgba( $default-950, 0 );\r\n\tborder-radius: $rounding-default;\r\n\ttransition: all 150ms ease;\r\n\tcursor: pointer;\r\n\tz-index: 0;\r\n\theight: 200px;\r\n\r\n\t.image\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t\tflex-shrink: 0;\r\n\t\ttransition: all 150ms ease;\r\n\t\tborder: 1px solid rgba( white, 0.025 );\r\n\t\taspect-ratio: 16 / 9;\r\n\t\tbackground-position: center;\r\n\t\tbackground-size: cover;\r\n\t\tborder-radius: $rounding-small;\r\n\t\tposition: relative;\r\n\t}\r\n\r\n\tcolumn\r\n\t{\r\n\t\tpadding: 8px 2px; // Optically aligned\r\n\t}\r\n\r\n\t\r\n\r\n\t\u0026.list\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t\theight: 64px;\r\n\t\tflex-direction: row;\r\n\t\tgap: 12px;\r\n\t\tpadding: 4px;\r\n\r\n\t\t.inner column\r\n\t\t{\r\n\t\t\tflex-grow: 1;\r\n\t\t}\r\n\r\n\t\t.image\r\n\t\t{\r\n\t\t\theight: 100%;\r\n\t\t\taspect-ratio: 1;\r\n\t\t\tflex-grow: 0;\r\n\t\t\tflex-shrink: 0;\r\n\t\t}\r\n\r\n\t\tcolumn\r\n\t\t{\r\n\t\t\tgap: 3px;\r\n\t\t\tjustify-content: center;\r\n\t\t}\r\n\r\n\t\t.package-title\r\n\t\t{\r\n\t\t\tflex-shrink: 0;\r\n\t\t\tmax-width: 500px;\r\n\t\t}\r\n\r\n\t\t.package-users\r\n\t\t{\r\n\t\t\ttop: 1px;\r\n\t\t\tright: 1px;\r\n\t\t}\r\n\r\n\t\t\u0026:hover\r\n\t\t{\r\n\t\t\tbackground-color: $default-800;\r\n\t\t\ttransform: none;\r\n\r\n\t\t\t\u0026::after\r\n\t\t\t{\r\n\t\t\t\tdisplay: none;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026.wide\r\n\t{\r\n\t\theight: 250px;\r\n\r\n\t\t.package-title\r\n\t\t{\r\n\t\t\tmax-width: 300px;\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026.small\r\n\t{\r\n\t\theight: 200px;\r\n\t\taspect-ratio: 3/4;\r\n\r\n\t\t.image\r\n\t\t{\r\n\t\t\taspect-ratio: 1;\r\n\t\t}\r\n\r\n\t\t.package-title\r\n\t\t{\r\n\t\t\tmax-width: 140px;\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026.tall\r\n\t{\r\n\t\theight: 400px;\r\n\r\n\t\t.image\r\n\t\t{\r\n\t\t\taspect-ratio: 9/16;\r\n\t\t}\r\n\r\n\t\t.package-title\r\n\t\t{\r\n\t\t\tmax-width: 200px;\r\n\t\t}\r\n\t}\r\n\r\n\t.package-title\r\n\t{\r\n\t\ttext-overflow: ellipsis;\r\n\t\tmax-height: 24px;\r\n\t\tflex-shrink: 1;\r\n\t\tfont-size: 14px;\r\n\t}\r\n\r\n\t.package-users\r\n\t{\r\n\t\tposition: absolute;\r\n\t\tbottom: 4px;\r\n\t\tright: 4px;\r\n\t\tbackground-color: rgba( 10, 40, 10, 0.95 );\r\n\t\tpadding: 3px 5px;\r\n\t\tborder-radius: 2px;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tgap: 3px;\r\n\t\tfont-size: 11px;\r\n\t\tcolor: #def;\r\n\t\tborder: 1px solid #252;\r\n\t\tcolor: #2f3;\r\n\r\n\t\t\u0026:before\r\n\t\t{\r\n\t\t\tcontent: \u0027\u25CF\u0027;\r\n\t\t\tfont-size: 0.5rem;\r\n\t\t}\r\n\t}\r\n\t// Hover effect (not for list)\r\n\t\u0026:not(.list)\r\n\t{\r\n\t\t\u0026::after\r\n\t\t{\r\n\t\t\tcontent: \u0022\u0022;\r\n\t\t\tposition: absolute;\r\n\t\t\ttop: 0;\r\n\t\t\tleft: 0;\r\n\t\t\tbottom: 0;\r\n\t\t\tright: 0;\r\n\t\t\tbackground-color: rgba( $default-950, 0 );\r\n\t\t\ttransition: all 150ms ease;\r\n\t\t\tz-index: -10;\r\n\t\t\tborder-radius: $rounding-large;\r\n\t\t\tpointer-events: none;\r\n\t\t}\r\n\r\n\t\t\u0026:hover\r\n\t\t{\r\n\t\t\ttransform: scale( 1.05 );\r\n\r\n\t\t\t\u0026::after\r\n\t\t\t{\r\n\t\t\t\tbackground-color: $default-800;\r\n\t\t\t\ttop: -$background-size;\r\n\t\t\t\tleft: -$background-size;\r\n\t\t\t\tright: -$background-size;\r\n\t\t\t\tbottom: -$background-size;\r\n\t\t\t\tbox-shadow: 0 0 25px rgba( black, 0.3 );\r\n\t\t\t}\r\n\r\n\t\t\tz-index: 100;\r\n\t\t\tbackground-color: $default-900;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n.package-card.list packageflairbar\r\n{\r\n\tdisplay: none;\r\n}\r\n\r\n.package-card.list .package-users\r\n{\r\n\tdisplay: none;\r\n}"},{"Ident":"wurstsoftware.forp","Path":"styles/form/_coloreditor.scss","FileName":"_coloreditor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"\r\n$primary: red !default;\r\n$primary-alt: white !default;\r\n\r\n$switch-padding: 6px !default;\r\n\r\n.coloreditor\r\n{\r\n\tflex-direction: column;\r\n\tmin-width: 250px;\r\n\tmax-width: 250px;\r\n\r\n\t\u003E .canvas\r\n\t{\r\n\t\tborder-top: 1px solid rgba( white, 0.5 );\r\n\t\tflex-grow: 1;\r\n\t\tflex-direction: column;\r\n\t\tpadding: 10px 15px;\r\n\r\n\r\n\t\t\u003E textentry.textentry\r\n\t\t{\r\n\t\t\tflex-grow: 0;\r\n\t\t\tflex-shrink: 0;\r\n\t\t\twidth: auto;\r\n\t\t}\r\n\t}\r\n\r\n\t.slider\r\n\t{\r\n\t\tpadding: 6.5px;\r\n\t}\r\n\r\n\t.slider .track\r\n\t{\r\n\t\theight: 14px;\r\n\t\tborder-radius: 14px;\r\n\t\tleft: 0px;\r\n\t\tright: 0px;\r\n\t\ttransition: all 0.1s ease-out;\r\n\r\n\t\t.inner\r\n\t\t{\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\r\n\t.slider:hover, .slider:active\r\n\t{\r\n\t\tpadding: 7px;\r\n\r\n\t\t.track\r\n\t\t{\r\n\t\t\theight: 20px;\r\n\t\t\tborder-radius: 6px;\r\n\t\t}\r\n\r\n\t\t.thumb\r\n\t\t{\r\n\t\t\twidth: 10px;\r\n\t\t\theight: 16px;\r\n\t\t\tmargin-left: 2px;\r\n\t\t}\r\n\t}\r\n\r\n\t.slider .thumb\r\n\t{\r\n\t\twidth: 10px;\r\n\t\theight: 10px;\r\n\t\tbox-shadow: 0px 0px 0px transparent;\r\n\t\tbackground-color: white;\r\n\t\tbackdrop-filter: invert( 1 );\r\n\t\tmargin-left: 1px;\r\n\t\tpointer-events: none;\r\n\t}\r\n\r\n\t.alpha_slider .track\r\n\t{\r\n\t\tbackground-image: linear-gradient( to right, rgba( #ccc, 0.05 ), rgba( #ccc, 0.9 ) );\r\n\t}\r\n\r\n\t.hue .track\r\n\t{\r\n\t\tbackground: linear-gradient(to right, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);\r\n\r\n\t\t.inner\r\n\t\t{\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\r\n\t.satval\r\n\t{\r\n\t\tbackground: linear-gradient(to right, white, transparent);\r\n\t\theight: 200px;\r\n\t\tposition: relative;\r\n\r\n\t\t\u0026:active\r\n\t\t{\r\n\t\t\tz-index: 10;\r\n\t\t\tcursor: none;\r\n\t\t}\r\n\r\n\t\t.value_gradient\r\n\t\t{\r\n\t\t\tbackground: linear-gradient(to bottom, black, white);\r\n\t\t\tposition: absolute;\r\n\t\t\ttop: 0;\r\n\t\t\tleft: 0;\r\n\t\t\tright: 0;\r\n\t\t\tbottom: 0;\r\n\t\t\tpointer-events: none;\r\n\t\t\tmix-blend-mode: multiply;\r\n\t\t}\r\n\r\n\t\t.thumb\r\n\t\t{\r\n\t\t\tz-index: 10;\r\n\t\t}\r\n\t}\r\n\r\n\t.presets\r\n\t{\r\n\t\tflex-wrap: wrap;\r\n\t\talign-content: center;\r\n\t\tjustify-content: center;\r\n\t\tpadding: 15px;\r\n\t\tborder-top: 1px solid rgba( white, 0.5 );\r\n\r\n\t\t.preset\r\n\t\t{\r\n\t\t\tbackground-color: white;\r\n\t\t\twidth: 16px;\r\n\t\t\theight: 16px;\r\n\t\t\tmargin: 2px;\r\n\t\t\tborder-radius: 20px;\r\n\t\t\tcursor: pointer;\r\n\t\t\t\r\n\t\t\t\u0026:hover\r\n\t\t\t{\r\n\t\t\t\tbox-shadow: 0px 0px 1px 2px white;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n.coloreditorrgba\r\n{\r\n\tflex-direction: column;\r\n\r\n\t.slider\r\n\t{\r\n\t\tpadding-right: 16px;\r\n\t}\r\n\r\n\t.slider .track\r\n\t{\r\n\t\tbackground-color: transparent;\r\n\t\theight: 14px;\r\n\t\tborder-radius: 14px;\r\n\t\tleft: 0px;\r\n\t\tright: 0px;\r\n\r\n\t\t.inner\r\n\t\t{\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\r\n\t.slider .thumb\r\n\t{\r\n\t\twidth: 12px;\r\n\t\theight: 12px;\r\n\t\tbox-shadow: 0px 0px 0px transparent;\r\n\t\tbackground-color: white;\r\n\t\tmargin-left: 2px;\r\n\t\tbackdrop-filter: invert( 1 );\r\n\t}\r\n\r\n\t.red_slider .track\r\n\t{\r\n\t\tbackground-image: linear-gradient( to right, rgba( #e63439, 0.1 ), rgba( #e63439, 0.9 ) );\r\n\t}\r\n\r\n\t.green_slider .track\r\n\t{\r\n\t\tbackground-image: linear-gradient( to right, rgba( #54be35, 0.1 ), rgba( #54be35, 0.9 ) );\r\n\t}\r\n\r\n\t.blue_slider .track\r\n\t{\r\n\t\tbackground-image: linear-gradient( to right, rgba( #3472e6, 0.1 ), rgba( #3472e6, 0.9 ) );\r\n\t}\r\n\r\n\t.alpha_slider .track\r\n\t{\r\n\t\tbackground-image: linear-gradient( to right, rgba( #ccc, 0.05 ), rgba( #ccc, 0.9 ) );\r\n\t}\r\n}\r\n\r\n\r\n.coloreditorhsva\r\n{\r\n\tflex-direction: column;\r\n\r\n\t.slider\r\n\t{\r\n\t\tpadding-right: 16px;\r\n\t}\r\n\r\n\t.slider .track\r\n\t{\r\n\t\tbackground-color: transparent;\r\n\t\theight: 14px;\r\n\t\tborder-radius: 14px;\r\n\t\tleft: 0px;\r\n\t\tright: 0px;\r\n\r\n\t\t.inner\r\n\t\t{\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\r\n\t.slider .thumb\r\n\t{\r\n\t\twidth: 12px;\r\n\t\theight: 12px;\r\n\t\tbox-shadow: 0px 0px 0px transparent;\r\n\t\tbackground-color: white;\r\n\t\tmargin-left: 2px;\r\n\t\tbackdrop-filter: invert( 1 );\r\n\t}\r\n\t\t\r\n\t.hue_slider .track\r\n\t{\r\n\t\tbackground-image: linear-gradient( to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00 );\r\n\t}\r\n\r\n\t.alpha_slider .track\r\n\t{\r\n\t\tbackground-image: linear-gradient( to right, rgba( #ccc, 0.05 ), rgba( #ccc, 0.9 ) );\r\n\t}\r\n}"},{"Ident":"wurstsoftware.forp","Path":"styles/base.scss","FileName":"base.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"@import \u0022base/_splitcontainer.scss\u0022;\r\n@import \u0022base/_navigator.scss\u0022;\r\n\r\nbutton\r\n{\r\n\tcursor: pointer;\r\n}\r\n\r\nIconPanel\r\n{\r\n\tfont-family: Material Icons;\r\n}\r\n\r\n.is-half\r\n{\r\n\twidth: 50%;\r\n}\r\n\r\n.is-third\r\n{\r\n\twidth: 33%;\r\n}\r\n\r\n.is-quarter\r\n{\r\n\twidth: 25%;\r\n}\r\n\r\nbutton.has-subtitle\r\n{\r\n\tposition: relative;\r\n\tflex-direction: column;\r\n\tjustify-content: flex-start;\r\n\talign-items: flex-start;\r\n\tpadding-left: 40px; // icon space\r\n\r\n\t.iconpanel\r\n\t{\r\n\t\tposition: absolute;\r\n\t\tleft: 5px;\r\n\t\ttop: 0;\r\n\t\tbottom: 0;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.button-label\r\n\t{\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\t.button-subtitle\r\n\t{\r\n\t\tfont-size: 12px;\r\n\t\topacity: 0.5;\r\n\t\tmix-blend-mode: lighten;\r\n\t}\r\n}"},{"Ident":"wurstsoftware.forp","Path":"Object/ObjectHex.cs","FileName":"ObjectHex.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"using Forp.Object.Unit;\r\nusing Sandbox;\r\nusing Sandbox.Diagnostics;\r\nusing System;\r\nusing Sandbox.UI;\r\nusing Forp.Game;\r\nusing Forp.Object.Building;\r\nusing System.Transactions;\r\nusing System.Runtime.CompilerServices;\r\n\r\nnamespace Forp.Object;\r\n\r\npublic enum EHexType\r\n{\r\n\tGrass,\r\n\tSand,\r\n\tStone,\r\n\tWater,\r\n}\r\n\r\npublic record FQueueObject\r\n{\r\n\tpublic Guid GameObjectId { get; init; }\r\n\r\n\tpublic string ObjectId { get; init; }\r\n\tpublic string ObjectName { get; init; }\r\n\tpublic int ProductionToBuild { get; init; }\r\n\tpublic int GoldToBuild { get; init; }\r\n\r\n\tpublic int Production { get; set; }\r\n\tpublic bool IsReadyToBuild()\r\n\t{\r\n\t\treturn Production \u003E= ProductionToBuild;\r\n\t}\r\n\r\n\tpublic bool CanBeBuilt()\r\n\t{\r\n\t\treturn GamePlayer.Local.Gold \u003E= GoldToBuild;\r\n\t}\r\n\r\n\tpublic string GetBuildString()\r\n\t{\r\n\t\treturn $\u0022{ObjectName} {Production} / {ProductionToBuild}\u0022;\r\n\t}\r\n}\r\n\r\npublic sealed class Hex : Obj\r\n{\r\n\t[RequireComponent] public HighlightOutline HighlightOutline { get; set; }\r\n\t[Property] GameObject FogPrefab { get; set; }\r\n\tGameObject FogObject = null;\r\n\r\n\t[Sync(SyncFlags.FromHost)] public NetList\u003CFQueueObject\u003E QueuedUnits { get; set; } = new();\r\n\t[Sync(SyncFlags.FromHost), Property] public int Production { get; set; } = 0;\r\n\t[Sync(SyncFlags.FromHost), Property] public EHexType Type { get; set; } = EHexType.Grass;\r\n\t[Sync(SyncFlags.FromHost), Change, Property] public Color BaseColour { get; set; } = Color.White;\r\n\r\n\t[Property] public Dictionary\u003CEHexType, Model\u003E TypeModels { get; private set; }\r\n\r\n\t/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n\t[Sync(SyncFlags.FromHost), Change] public FBuilding BuildingData { get; set; } = null;\r\n\tpublic TextRenderer ConstructionObject { get; set; } = null;\r\n\tpublic ObjectBuilding BuildingObject { get; set; } = null;\r\n\tprivate void OnBuildingDataChanged(FBuilding OldBuildingData, FBuilding NewBuildingData)\r\n\t{\r\n\t\tif (BuildingData == null)\r\n\t\t{\r\n\t\t\tif (BuildingObject.IsValid())\r\n\t\t\t{\r\n\t\t\t\tBuildingObject.GameObject.Destroy();\r\n\t\t\t\tBuildingObject = null;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (BuildingData.TurnsAlive \u003C BuildingData.ProductionToBuild)\r\n\t\t{\r\n\t\t\tif (!ConstructionObject.IsValid())\r\n\t\t\t{\r\n\t\t\t\tvar ConstructionClone = GameManager.Instance.GameTextPrefab.Clone();\r\n\t\t\t\tConstructionClone.NetworkMode = NetworkMode.Never;\r\n\t\t\t\tConstructionClone.WorldTransform = BuildingData.Transform;\r\n\t\t\t\tConstructionClone.WorldPosition \u002B= Vector3.Up * 100;\r\n\t\t\t\tConstructionObject = ConstructionClone.GetComponent\u003CTextRenderer\u003E();\r\n\t\t\t}\r\n\r\n\t\t\tConstructionObject.Text = $\u0022{BuildingData.TurnsAlive} / {BuildingData.ProductionToBuild}\u0022;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (ConstructionObject.IsValid())\r\n\t\t{\r\n\t\t\tConstructionObject.GameObject.Destroy();\r\n\t\t}\r\n\r\n\t\tif (BuildingData.OwnerGuid == Connection.Local.Id)\r\n\t\t{\r\n\t\t\tRevealHexesRecusrive(this, true, BuildingData.ViewRange \u002B 1);\r\n\t\t}\r\n\r\n\t\t// we only build once\r\n\t\tif (IsRevealed \u0026\u0026 !BuildingObject.IsValid())\r\n\t\t{\r\n\t\t\tCloneConfig BuildingCloneConfig = new()\r\n\t\t\t{\r\n\t\t\t\tStartEnabled = true,\r\n\t\t\t\tParent = GameObject,\r\n\t\t\t};\r\n\r\n\t\t\tvar Clone = GameManager.Instance.GetObject(BuildingData.ObjectId).Clone(BuildingCloneConfig);\r\n\t\t\tBuildingObject = Clone.GetComponent\u003CObjectBuilding\u003E();\r\n\t\t\tBuildingObject.OwnerHex = this;\r\n\t\t\tBuildingObject.ModelRenderer?.Tint = GameManager.Instance.GetTintColour(BuildingData.OwnerGuid);\r\n\r\n\t\t\tif (GameManager.Instance.GetGamePlayer(BuildingData.OwnerGuid) is { } OwnerPlayer)\r\n\t\t\t{\r\n\t\t\t\tBuildingObject.OwnerPlayer = OwnerPlayer;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (BuildingObject.IsValid())\r\n\t\t{\r\n\t\t\tBuildingObject.Health = BuildingData.Health;\r\n\t\t\tBuildingObject.Attack = BuildingData.Attack;\r\n\t\t\tif (BuildingData.Health \u003C= 0)\r\n\t\t\t{\r\n\t\t\t\tBuildingObject.DestroyGameObject();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t[Sync(SyncFlags.FromHost), Change] public FUnit UnitData { get; set; } = null;\r\n\tpublic ObjectUnit UnitObject { get; set; } = null;\r\n\tprivate void OnUnitDataChanged(FUnit OldUnitData, FUnit NewUnitData)\r\n\t{\r\n\t\tif (UnitData == null)\r\n\t\t{\r\n\t\t\tif (UnitObject.IsValid())\r\n\t\t\t{\r\n\t\t\t\tUnitObject.GameObject.Destroy();\r\n\t\t\t\tUnitObject = null;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (UnitData.OwnerGuid == Connection.Local.Id)\r\n\t\t{\r\n\t\t\tRevealHexesRecusrive(this, true, UnitData.ViewRange \u002B 1);\r\n\t\t}\r\n\r\n\t\tif (IsRevealed \u0026\u0026 !UnitObject.IsValid())\r\n\t\t{\r\n\t\t\tCloneConfig UnitCloneConfig = new()\r\n\t\t\t{\r\n\t\t\t\tStartEnabled = true,\r\n\t\t\t\tParent = GameObject,\r\n\t\t\t};\r\n\r\n\t\t\tvar Clone = GameManager.Instance.GetObject(UnitData.ObjectId).Clone(UnitCloneConfig);\r\n\t\t\tUnitObject = Clone.GetComponent\u003CObjectUnit\u003E();\r\n\t\t\tUnitObject.OwnerHex = this;\r\n\t\t\tUnitObject.WorldPosition \u002B= Vector3.Up * 20f;\r\n\t\t\tUnitObject.WorldRotation = Rotation.FromYaw(180);\r\n\t\t\tUnitObject.ModelRenderer?.Tint = GameManager.Instance.GetTintColour(UnitData.OwnerGuid);\r\n\r\n\t\t\tif (GameManager.Instance.Mode != EGameManagerMode.Menu)\r\n\t\t\t{\r\n\t\t\t\tUnitObject.ModelRenderer.RenderOptions.Overlay = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (!UnitData.IsAi \u0026\u0026 GameManager.Instance.GetGamePlayer(UnitData.OwnerGuid) is { } OwnerPlayer)\r\n\t\t\t{\r\n\t\t\t\tUnitObject.OwnerPlayer = OwnerPlayer;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tUnitObject.AddComponent\u003CAiUnit\u003E();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (UnitObject.IsValid())\r\n\t\t{\r\n\t\t\tUnitObject.Health = UnitData.Health;\r\n\t\t\tUnitObject.Attack = UnitData.Attack;\r\n\t\t\tif (UnitData.Health \u003C= 0)\r\n\t\t\t{\r\n\t\t\t\tLog.Info($\u0022you! yes you are DEAD\u0022);\r\n\t\t\t\tUnitObject.DestroyGameObject();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (UnitObject.Upgrade != null)\r\n\t\t\t{\r\n\t\t\t\tUnitObject.ApplyUpgrade(UnitData.Upgrade);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t[Sync(SyncFlags.FromHost), Change] public FObj ObjectData { get; set; } = null;\r\n\tpublic Obj Obj { get; set; } = null;\r\n\tprivate void OnObjectDataChanged(FObj OldObjectData, FObj NewObjectData)\r\n\t{\r\n\t\tif (ObjectData == null)\r\n\t\t{\r\n\t\t\tif (Obj.IsValid())\r\n\t\t\t{\r\n\t\t\t\tObj.GameObject.Destroy();\r\n\t\t\t\tObj = null;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (IsRevealed \u0026\u0026 !Obj.IsValid())\r\n\t\t{\r\n\t\t\tCloneConfig ObjCloneConfig = new()\r\n\t\t\t{\r\n\t\t\t\tStartEnabled = true,\r\n\t\t\t\tParent = GameObject,\r\n\t\t\t};\r\n\r\n\t\t\tvar Clone = GameManager.Instance.GetObject(ObjectData.ObjectId).Clone(ObjCloneConfig);\r\n\t\t\tClone.WorldPosition \u002B= Vector3.Up * 30f; // HACK\r\n\t\t}\r\n\t}\r\n\r\n\t[Sync(SyncFlags.FromHost)] public Guid OwningConnectionGuid { get; set; }\r\n\r\n\tpublic void SetOwner_ServerOnly(Guid OwnerIn)\r\n\t{\r\n\t\tAssert.True(Networking.IsHost);\r\n\r\n\t\tOwningConnectionGuid = OwnerIn;\r\n\t\tSetBaseColour_ServerOnly(GameManager.Instance.GetTintColour(OwningConnectionGuid));\r\n\t}\r\n\r\n\tpublic void RemoveOwner_ServerOnly()\r\n\t{\r\n\t\tAssert.True(Networking.IsHost);\r\n\r\n\t\tOwningConnectionGuid = Guid.Empty;\r\n\t\tSetBaseColour_ServerOnly(Color.White);\r\n\t}\r\n\r\n\tpublic void AddQueuedObject_ServerOnly(FQueueObject QueueObject)\r\n\t{\r\n\t\tAssert.True(Networking.IsHost);\r\n\t\tQueuedUnits.Add(QueueObject);\r\n\t}\r\n\r\n\t[Rpc.Host]\r\n\tpublic void Server_RemoveUnitFromQueue(Guid GameObjectId)\r\n\t{\r\n\t\tvar Entry = QueuedUnits.FirstOrDefault(Obj =\u003E Obj.GameObjectId == GameObjectId);\r\n\t\t\r\n\t\tif (Entry == null)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (GameManager.Instance.GetGamePlayer(GetOwnerId()) is { } Owner)\r\n\t\t{\r\n\t\t\tOwner.Gold \u002B= Entry.GoldToBuild;\r\n\t\t}\r\n\r\n\t\tQueuedUnits.Remove(Entry);\r\n\t}\r\n\r\n\tprivate void OnBaseColourChanged(Color OldColour, Color NewColour)\r\n\t{\r\n\t\tModelRenderer.Tint = BaseColour;//.Darken(1f / Production);\r\n\t}\r\n\r\n\tprivate void SetBaseColour_ServerOnly(Color Colour)\r\n\t{\r\n\t\tBaseColour = Colour;\r\n\t}\r\n\r\n\tpublic static readonly List\u003CVector3\u003E BrotherOffsets = [new(170, 100), new(170, -100), new(0, -200), new(-170, -100), new(-170, 100), new(0, 200)];\r\n\r\n\tprotected override void OnAwake()\r\n\t{\r\n\t\tbase.OnAwake();\r\n\r\n\t\tAssert.IsValid(FogPrefab);\r\n\r\n\t\tif (!IsRevealed)\r\n\t\t{\r\n\t\t\tOnHide();\r\n\t\t}\r\n\t}\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tAssert.IsValid(FogPrefab);\r\n\r\n\t\tbase.OnStart();\r\n\r\n\t\tQueuedUnits.OnChanged \u002B= OnQueuedObjectsChanged; // TODO : unbind?\r\n\r\n\t\tif (Networking.IsHost)\r\n\t\t{\r\n\t\t\tInitHex_ServerOnly();\r\n\t\t}\r\n\r\n\t\tModelRenderer.Model = TypeModels[Type];\r\n\t\tHighlightOutline.Enabled = false;\r\n\t\tHighlightOutline.Color = Color.Blue;\r\n\t}\r\n\r\n\tprotected override void OnDestroy()\r\n\t{\r\n\t\tLocalCameraMode = ECameraMode.Normal;\r\n\r\n\t\tbase.OnDestroy();\r\n\t}\r\n\r\n\tpublic void InitHex_ServerOnly()\r\n\t{\r\n\t\tAssert.True(Networking.IsHost);\r\n\r\n\t\tType = Random.Shared.FromArray(Enum.GetValues\u003CEHexType\u003E());\r\n\r\n\t\tswitch (Type)\r\n\t\t{\r\n\t\t\tcase EHexType.Grass:\r\n\t\t\t\tProduction = Random.Shared.Int(3, 4);\r\n\t\t\t\tbreak;\r\n\t\t\tcase EHexType.Sand:\r\n\t\t\t\tProduction = Random.Shared.Int(1, 6);\r\n\t\t\t\tbreak;\r\n\t\t\tcase EHexType.Stone:\r\n\t\t\t\tProduction = Random.Shared.Int(3, 6);\r\n\t\t\t\tbreak;\r\n\t\t\tcase EHexType.Water:\r\n\t\t\t\tProduction = Random.Shared.Int(1, 5);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (Random.Shared.Next(7) == 1 \u0026\u0026 Type == EHexType.Grass)\r\n\t\t{\r\n\t\t\tGameManager.Instance.Server_CreateHexObject(\u0022tree\u0022, this, Connection.Host.Id);\r\n\t\t\tGameManager.Instance.Server_CreateHexUnitObject(\u0022unit-combat\u0022, this, Connection.Host.Id, true);\r\n\t\t\tSetOwner_ServerOnly(GameManager.AiGuid);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate void OnQueuedObjectsChanged(NetListChangeEvent\u003CFQueueObject\u003E QueueObjectChanged)\r\n\t{\r\n\t\tif (IsLocallyOwned())\r\n\t\t{\r\n\t\t\tDrawUnitQueue();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic override void OnClick()\r\n\t{\r\n\t\tbase.OnClick();\r\n\r\n\t\tIsSelected = !IsSelected;\r\n\t}\r\n\r\n\tpublic Transform GetObjectSpawnLocation()\r\n\t{\r\n\t\tvar BaseTransform = WorldTransform;\r\n\t\tBaseTransform.Position \u002B= Vector3.Up * 40; // 40 = hex width\r\n\t\treturn BaseTransform;\r\n\t}\r\n\r\n\tprivate readonly Dictionary\u003CGuid, QueuedObjectText\u003E QueuedObjectTexts = new();\r\n\r\n\tpublic void DrawUnitQueue()\r\n\t{\r\n\t\tList\u003CGuid\u003E GuidsToRemove = new();\r\n\r\n\t\tint TextYPadding = 100;\r\n\t\tforeach (var QueuedObject in QueuedUnits)\r\n\t\t{\r\n\t\t\tTextYPadding \u002B= 50;\r\n\r\n\t\t\tif (QueuedObjectTexts.TryGetValue(QueuedObject.GameObjectId, out var FoundText))\r\n\t\t\t{\r\n\t\t\t\tFoundText.SetText($\u0022{QueuedObject.GetBuildString()}\u0022);\r\n\r\n\t\t\t\tif (QueuedObject.IsReadyToBuild())\r\n\t\t\t\t{\r\n\t\t\t\t\tGuidsToRemove.Add(QueuedObject.GameObjectId);\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tvar TextTransform = BuildingData.Transform;\r\n\t\t\tTextTransform.Position \u002B= Vector3.Up * TextYPadding;\r\n\r\n\t\t\tvar TextObject = GameText.CreateTextObject\u003CQueuedObjectText\u003E(TextTransform, $\u0022{QueuedObject.GetBuildString()}\u0022);\r\n\t\t\tTextObject.OwnerHex = this;\r\n\t\t\tTextObject.GameObjectId = QueuedObject.GameObjectId;\r\n\t\t\tQueuedObjectTexts.Add(QueuedObject.GameObjectId, TextObject);\r\n\t\t}\r\n\r\n\t\tforeach (var Guid in GuidsToRemove)\r\n\t\t{\r\n\t\t\tRemoveQueuedObjectText(Guid);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic void RemoveQueuedObjectText(Guid GameObjectId)\r\n\t{\r\n\t\tif (QueuedObjectTexts.TryGetValue(GameObjectId, out var FoundText))\r\n\t\t{\r\n\t\t\tFoundText.DestroyGameObject();\r\n\t\t\tQueuedObjectTexts.Remove(GameObjectId);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly List\u003CGameText\u003E ProductionTexts = new();\r\n\r\n\tprivate void ProductionShown(bool Shown)\r\n\t{\r\n\t\tforeach (var ProductionText in ProductionTexts)\r\n\t\t{\r\n\t\t\tProductionText.DestroyGameObject();\r\n\t\t}\r\n\t\tProductionTexts.Clear();\r\n\r\n\t\tif (Shown \u0026\u0026 IsRevealed)\r\n\t\t{\r\n\t\t\tvar TextTransform = WorldTransform;\r\n\t\t\tTextTransform.Position \u002B= Vector3.Up * 25;\r\n\r\n\t\t\tvar ProductionText = GameText.CreateTextObject\u003CGameText\u003E(TextTransform, $\u0022{Production}\u2B21\u0022);\r\n\r\n\t\t\tif (Production \u003C= 2)\r\n\t\t\t{\r\n\t\t\t\tProductionText.GetComponent\u003CTextRenderer\u003E().Color = Color.Red;\r\n\t\t\t}\r\n\t\t\telse if (Production \u003E 6)\r\n\t\t\t{\r\n\t\t\t\tProductionText.GetComponent\u003CTextRenderer\u003E().Color = Color.Green;\r\n\t\t\t}\r\n\r\n\t\t\tProductionTexts.Add(ProductionText);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate void OnHighlight()\r\n\t{\r\n\t\tif (!CanWalkOn())\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tHighlightOutline.Enabled = true;\r\n\t}\r\n\r\n\tprivate void OnDeHighlight()\r\n\t{\r\n\t\tModelRenderer.MaterialOverride = null;\r\n\t\tHighlightOutline.Enabled = false;\r\n\t}\r\n\r\n\tprivate void OnReveal()\r\n\t{\r\n\t\tif (FogObject.IsValid())\r\n\t\t{\r\n\t\t\tFogObject.Destroy();\r\n\t\t\tFogObject = null;\r\n\t\t}\r\n\r\n\t\tSetBaseColour_ServerOnly(GameManager.Instance.GetTintColour(OwningConnectionGuid));\r\n\r\n\t\t// TODO : revisit\r\n\t\tOnUnitDataChanged(new(), new());\r\n\t\tOnBuildingDataChanged(new(), new());\r\n\t\tOnObjectDataChanged(new(), new());\r\n\r\n\t\t// TODO : REALLY revisit\r\n\t\tif (GamePlayer.Local != null)\r\n\t\t{\r\n\t\t\tLocalCameraMode = GamePlayer.Local.CameraMode;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate void OnHide()\r\n\t{\r\n\t\tCloneConfig FogConfig = new(WorldTransform);\r\n\t\tFogObject = FogPrefab.Clone(FogConfig);\r\n\r\n\t\t// TODO : revisit\r\n\t\tOnUnitDataChanged(new(), new());\r\n\t\tOnBuildingDataChanged(new(), new());\r\n\t\tOnObjectDataChanged(new(), new());\r\n\t}\r\n\r\n\tprivate void OnSelect()\r\n\t{\r\n\t\t// ModelRenderer.Tint = BaseColour.Darken(0.66f);\r\n\t}\r\n\r\n\tprivate void OnDeselect()\r\n\t{\r\n\t\t// ModelRenderer.Tint = BaseColour;\r\n\t}\r\n\r\n\t/////////////////////////////////////////////////////////////////////////////////////////////////\r\n\r\n\t[Sync(SyncFlags.FromHost)] public NetList\u003CHex\u003E AllBrothers { get; set; } = [null, null, null, null, null, null];\r\n\r\n\tprivate ECameraMode _LocalCameraMode = ECameraMode.Normal;\r\n\tpublic ECameraMode LocalCameraMode\r\n\t{\r\n\t\tget =\u003E _LocalCameraMode;\r\n\t\tset\r\n\t\t{\r\n\t\t\t_LocalCameraMode = value;\r\n\r\n\t\t\tif (UnitObject.IsValid())\r\n\t\t\t{\r\n\t\t\t\tUnitObject.SetCameraMode(_LocalCameraMode);\r\n\t\t\t}\r\n\r\n\t\t\tProductionShown(_LocalCameraMode == ECameraMode.Build);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate bool _isHighlighted = false;\r\n\tpublic bool IsHighlighted\r\n\t{\r\n\t\tget =\u003E _isHighlighted;\r\n\t\tset\r\n\t\t{\r\n\t\t\tif (_isHighlighted == value)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t_isHighlighted = value;\r\n\r\n\t\t\tif (_isHighlighted)\r\n\t\t\t{\r\n\t\t\t\tOnHighlight();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tOnDeHighlight();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate bool _isRevealed = false;\r\n\tpublic bool IsRevealed\r\n\t{\r\n\t\tget =\u003E _isRevealed;\r\n\t\tset\r\n\t\t{\r\n\t\t\tif (_isRevealed == value)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t_isRevealed = value;\r\n\r\n\t\t\tif (_isRevealed)\r\n\t\t\t{\r\n\t\t\t\tOnReveal();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tOnHide();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate bool _isSelected = false;\r\n\tpublic bool IsSelected\r\n\t{\r\n\t\tget =\u003E _isSelected;\r\n\t\tset\r\n\t\t{\r\n\t\t\tif (_isSelected == value)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t_isSelected = value;\r\n\r\n\t\t\tif (_isSelected)\r\n\t\t\t{\r\n\t\t\t\tOnSelect();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tOnDeselect();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic bool HasOwner()\r\n\t{\r\n\t\treturn OwningConnectionGuid != Guid.Empty;\r\n\t}\r\n\r\n\tpublic bool IsLocallyOwned()\r\n\t{\r\n\t\treturn GetOwnerId() == GamePlayer.Local.ConnectionId;\r\n\t}\r\n\r\n\tpublic bool CanWalkOn()\r\n\t{\r\n\t\treturn Type != EHexType.Water;\r\n\t}\r\n\r\n\tpublic Guid GetOwnerId()\r\n\t{\r\n\t\treturn OwningConnectionGuid;\r\n\t}\r\n\r\n\tpublic List\u003CHex\u003E GetSurroundingHexesInRange(int Range, bool IncludeSelf = false)\r\n\t{\r\n\t\tList\u003CHex\u003E SurroundingHexes = [];\r\n\r\n\t\tif (IncludeSelf)\r\n\t\t{\r\n\t\t\tSurroundingHexes.Add(this);\r\n\t\t}\r\n\r\n\t\tHashSet\u003CHex\u003E Visited = [this];\r\n\t\tList\u003CHex\u003E CurrentRing = [this];\r\n\r\n\t\tfor (int RangeIndex = 0; RangeIndex \u003C Range; \u002B\u002BRangeIndex)\r\n\t\t{\r\n\t\t\tList\u003CHex\u003E NextRing = [];\r\n\r\n\t\t\tforeach (var Hex in CurrentRing)\r\n\t\t\t{\r\n\t\t\t\tforeach (var Brother in Hex.AllBrothers)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (Brother == null)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar BrotherHex = Brother.GetComponent\u003CHex\u003E();\r\n\r\n\t\t\t\t\tif (BrotherHex == null || !Visited.Add(BrotherHex))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tSurroundingHexes.Add(BrotherHex);\r\n\t\t\t\t\tNextRing.Add(BrotherHex);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tCurrentRing = NextRing;\r\n\t\t}\r\n\r\n\t\treturn SurroundingHexes;\r\n\t}\r\n\r\n\tpublic static void SetOwnerHexesRecursive_ServerOnly(Hex Hex, Guid OwningConnectionGuid, int Depth)\r\n\t{\r\n\t\tAssert.True(Networking.IsHost);\r\n\t\tif (Hex == null || Depth \u003C= 0) return;\r\n\r\n\t\tif (OwningConnectionGuid != Guid.Empty)\r\n\t\t{\r\n\t\t\tHex.SetOwner_ServerOnly(OwningConnectionGuid);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tHex.RemoveOwner_ServerOnly();\r\n\t\t}\r\n\r\n\t\tforeach (var Brother in Hex.AllBrothers)\r\n\t\t{\r\n\t\t\tif (Brother == null) continue;\r\n\t\t\tSetOwnerHexesRecursive_ServerOnly(Brother.GetComponent\u003CHex\u003E(), OwningConnectionGuid, Depth - 1);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void RevealHexesRecusrive(Hex Hex, bool Reveal, int Depth)\r\n\t{\r\n\t\tif (Hex == null || Depth \u003C= 0) return;\r\n\r\n\t\tHex.IsRevealed = Reveal;\r\n\r\n\t\tforeach (var Brother in Hex.AllBrothers)\r\n\t\t{\r\n\t\t\tif (Brother == null) continue;\r\n\t\t\tRevealHexesRecusrive(Brother.GetComponent\u003CHex\u003E(), Reveal, Depth - 1);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static void HighlightHexesRecusrive(Hex Hex, bool Highlight, int Depth)\r\n\t{\r\n\t\tif (Hex == null || Depth \u003C= 0) return;\r\n\r\n\t\tHex.IsHighlighted = Highlight;\r\n\r\n\t\tforeach (var Brother in Hex.AllBrothers)\r\n\t\t{\r\n\t\t\tif (Brother == null) continue;\r\n\t\t\tHighlightHexesRecusrive(Brother.GetComponent\u003CHex\u003E(), Highlight, Depth - 1);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static bool AreHexesUnowned(Hex Hex, int Depth, Guid AllowedOwner)\r\n\t{\r\n\t\tif (Hex == null || Depth \u003C= 0) return true;\r\n\r\n\t\tif (Hex.OwningConnectionGuid != Guid.Empty \u0026\u0026 Hex.OwningConnectionGuid != AllowedOwner)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tforeach (var Brother in Hex.AllBrothers)\r\n\t\t{\r\n\t\t\tif (Brother == null) continue;\r\n\t\t\tif (!AreHexesUnowned(Brother.GetComponent\u003CHex\u003E(), Depth - 1, AllowedOwner))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n"},{"Ident":"wurstsoftware.forp","Path":"styles/form/_dropdown.scss","FileName":"_dropdown.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"\r\n$primary: red !default;\r\n$primary-alt: white !default;\r\n\r\n$switch-padding: 6px !default;\r\n\r\n.button.popupbutton.dropdown\r\n{\r\n\tcursor: pointer;\r\n\ttransition: all .1s ease-out;\r\n\tposition: relative;\r\n\r\n\t\u003E .dropdown_indicator\r\n\t{\r\n\t\tposition: absolute;\r\n\t\tright: 8px;\r\n\t}\r\n\r\n\t\u0026.open\r\n\t{\r\n\t\tborder-bottom-left-radius: 1px;\r\n\t\tborder-bottom-right-radius: 1px;\r\n\t\ttransition: border-radius 0.2s ease-out;\r\n\t}\r\n}\r\n\r\nselect\r\n{\r\n\tmin-height: 40px;\r\n\r\n\t\u003E option\r\n\t{\r\n\t\tdisplay: none;\r\n\t}\r\n}"},{"Ident":"wurstsoftware.forp","Path":"ui/dropdown.cs.scss","FileName":"dropdown.cs.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":".dropdown\r\n{\r\n\tgap: 2px;\r\n\tflex-grow: 1;\r\n\tcursor: pointer;\r\n\tjustify-content: flex-end;\r\n\talign-items: center;\r\n\tpadding: 0px 12px;\r\n\r\n\t.button-right-column\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t}\r\n}\r\n"},{"Ident":"wurstsoftware.forp","Path":"ui/uiplayerhud.razor.scss","FileName":"uiplayerhud.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"* {\r\n    font-family: Verdana;\r\n}\r\n\r\nroot {\r\n    width: 100%;\r\n    height: 100%;\r\n    position: absolute;\r\n    color: white;\r\n    font-size: 24px;\r\n    pointer-events: all;\r\n}\r\n\r\nwatermark {\r\n    padding-top: 8px;\r\n    padding-left: 12px;\r\n    color: white;\r\n    font-size: 18px;\r\n}\r\n\r\nstatic-bar {\r\n    font-size: 21px;\r\n    position: absolute;\r\n    top: 32px;\r\n    right: 0;\r\n    width: 34%;\r\n    padding-left: 1em;\r\n    background-color: #FFFFFFAA;\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: flex-end;\r\n}\r\n\r\nbottom-bar {\r\n    position: absolute;\r\n    bottom: 0;\r\n    left: 20%;\r\n    width: 66%;\r\n    height: 16%;\r\n    background-color: #000000AA;\r\n}\r\n\r\n    bottom-bar selected-name {\r\n        font-size: 64px;\r\n        color: white;\r\n    }\r\n\r\nbuild-container {\r\n    position: absolute;\r\n    display: flex;\r\n    flex-direction: column;\r\n}\r\n\r\nbuild-unit {\r\n    width: 180px;\r\n    height: 60px;\r\n    border-radius: 50%;\r\n    background-color: #000000AA;\r\n    pointer-events: all;\r\n    color: white;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n}\r\n\r\n    build-unit button:hover {\r\n        cursor: crosshair;\r\n        background-color: black;\r\n    }\r\n\r\nnext-turn-button {\r\n    position: absolute;\r\n    bottom: 4%;\r\n    left: 93%;\r\n    width: 96px;\r\n    height: 96px;\r\n    border-radius: 50%;\r\n    background-color: #000000AA;\r\n    pointer-events: all;\r\n    color: white;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    text-align: center;\r\n}\r\n\r\n    next-turn-button:hover {\r\n        cursor: crosshair;\r\n        background-color: black;\r\n    }\r\n\r\ndead {\r\n    position: absolute;\r\n    top: 50%;\r\n    left: 50%;\r\n    transform: translate(-50%, -50%);\r\n    color: red;\r\n    font-size: 96px;\r\n    text-align: center;\r\n    pointer-events: none;\r\n    animation-name: splash;\r\n    animation-duration: 0.5s;\r\n    animation-iteration-count: infinite;\r\n    animation-direction: alternate;\r\n    animation-timing-function: linear;\r\n    text-shadow: -3px -3px 0 black, 3px -3px 0 black, -3px 3px 0 black, 3px 3px 0 black, -3px 0 0 black, 3px 0 0 black, 0 -3px 0 black, 0 3px 0 black;\r\n}\r\n\r\n@keyframes splash {\r\n    from {\r\n        transform: translate(-50%, -50%) scale(1) rotate(1deg);\r\n    }\r\n\r\n    to {\r\n        transform: translate(-50%, -50%) scale(1.1) rotate(-1deg);\r\n    }\r\n}"},{"Ident":"wurstsoftware.forp","Path":"UI/GamePlayer.Ui.cs","FileName":"GamePlayer.Ui.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"using Forp.Object;\r\nusing Forp.Object.Building;\r\nusing Forp.Object.Unit;\r\nusing Sandbox;\r\nusing Sandbox.Diagnostics;\r\nusing Sandbox.Services;\r\nusing System;\r\nusing static Sandbox.Material;\r\n\r\nnamespace Forp.Game;\r\n\r\npublic struct FPlayerUiInfo\r\n{\r\n\tpublic FPlayerUiInfo() { }\r\n\r\n\tpublic string Name = \u0022NONE\u0022;\r\n\tpublic int Gold = 0;\r\n\tpublic int Territory = 0;\r\n\tpublic int Production = 0;\r\n\r\n\tpublic Object.Obj HoveredObject = null;\r\n\tpublic ObjectUnit SelectedUnit = null;\r\n\tpublic Hex SelectedHex = null;\r\n\tpublic List\u003Cstring\u003E BuildObjects = new();\r\n\r\n\tpublic readonly List\u003Cstring\u003E GetTopBarStrings()\r\n\t{\r\n\t\tGameManager.Instance.GetPlayerBoardStats(out var BoardStats);\r\n\t\treturn BoardStats.Select(Player =\u003E $\u0022{Player.Key.SteamName} \\u00A3{Player.Key.Gold} {Player.Value.Production}\u2B21 {Player.Value.TerritoryPercentage}%\u0022).ToList();\r\n\t}\r\n\r\n\tpublic readonly string GetBottomBarString()\r\n\t{\r\n\t\tvar BottomString = String.Empty;\r\n\r\n\t\tif (SelectedHex.IsValid() \u0026\u0026 SelectedHex.IsRevealed)\r\n\t\t{\r\n\t\t\tvar OwnerName = \u0022None\u0022;\r\n\t\t\tvar IsLocallyOwner = false;\r\n\r\n\t\t\tif (GameManager.Instance.GetGamePlayer(SelectedHex.GetOwnerId()) is { } Owner)\r\n\t\t\t{\r\n\t\t\t\tOwnerName = Owner.SteamName;\r\n\t\t\t\tIsLocallyOwner = SelectedHex.IsLocallyOwned();\r\n\t\t\t}\r\n\r\n\t\t\tBottomString \u002B= $\u0022type {SelectedHex.Type} with {SelectedHex.Production} resources owned by {OwnerName}\\n\u0022;\r\n\r\n\t\t\tif (SelectedHex.UnitObject.IsValid())\r\n\t\t\t{\r\n\t\t\t\tbool IsAi = SelectedHex.UnitObject.GetComponent\u003CAiUnit\u003E() != null;\r\n\t\t\t\tBottomString \u002B= $\u0022occupied by {SelectedHex.UnitObject.DisplayName} ai={IsAi}\\n\u0022;\r\n\t\t\t}\r\n\r\n\t\t\tif (SelectedHex.BuildingObject.IsValid())\r\n\t\t\t{\r\n\t\t\t\tBottomString \u002B= $\u0022with building {SelectedHex.BuildingObject.DisplayName} {IsLocallyOwner}\\n\u0022;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (SelectedUnit.IsValid())\r\n\t\t{\r\n\t\t\tBottomString \u002B= $\u0022unit {SelectedUnit.DisplayName} {SelectedUnit.Attack}A {SelectedUnit.Health}HP\\n\u0022;\r\n\r\n\t\t\tif (HoveredObject is ObjectUnit { } HoveredUnit \u0026\u0026 HoveredUnit != SelectedUnit)\r\n\t\t\t{\r\n\t\t\t\tBottomString \u002B= $\u0022attack {HoveredUnit.DisplayName}\u0022;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (HoveredObject.IsValid())\r\n\t\t{\r\n\t\t\tBottomString \u002B= $\u0022{HoveredObject.DisplayName}\\n\u0022;\r\n\t\t}\r\n\r\n\t\treturn BottomString;\r\n\t}\r\n\r\n\tpublic readonly bool AnythingSelected()\r\n\t{\r\n\t\treturn SelectedUnit != null || SelectedHex != null;\r\n\t}\r\n}\r\n\r\npublic sealed partial class GamePlayer : Component\r\n{\r\n\tpublic bool IsDead()\r\n\t{\r\n\t\tforeach (var Hex in GameManager.Instance.BoardHexes)\r\n\t\t{\r\n\t\t\tif (Hex.UnitData?.OwnerGuid == ConnectionId || Hex.BuildingData?.OwnerGuid == ConnectionId)\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic void GetPlayerUiInfo(out FPlayerUiInfo OutPlayerUiInfo)\r\n\t{\r\n\t\tOutPlayerUiInfo = new();\r\n\t\tOutPlayerUiInfo.Name = Local?.SteamName;\r\n\t\tOutPlayerUiInfo.Gold = Gold;\r\n\r\n\t\tGameManager.Instance.GetPlayerBoardStats(out var PlayerBoardStats);\r\n\t\tif (PlayerBoardStats.TryGetValue(Local, out var PlayerStats))\r\n\t\t{\r\n\t\t\tOutPlayerUiInfo.Territory = PlayerStats.TerritoryPercentage;\r\n\t\t\tOutPlayerUiInfo.Production = PlayerStats.Production;\r\n\t\t}\r\n\r\n\t\tOutPlayerUiInfo.SelectedHex = SelectedHex;\r\n\t\tOutPlayerUiInfo.SelectedUnit = SelectedUnit;\r\n\t\tOutPlayerUiInfo.HoveredObject = HoveredObject;\r\n\r\n\t\t// if we\u0027ve got a valid hex what can we build\r\n\t\tif (SelectedHex.IsValid() \u0026\u0026 SelectedHex.BuildingObject.IsValid())\r\n\t\t{\r\n\t\t\tforeach (var BuildUnit in SelectedHex.BuildingObject.BuildableUnits)\r\n\t\t\t{\r\n\t\t\t\tif (BuildUnit.GetComponent\u003CObjectUnit\u003E() is { } BuildObjectUnit)\r\n\t\t\t\t{\r\n\t\t\t\t\tOutPlayerUiInfo.BuildObjects.Add($\u0022{BuildObjectUnit.ObjectId} \u00A3{BuildObjectUnit.GoldToBuild}\u0022);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate void RefreshGUi()\r\n\t{\r\n\t\tif (GUi == null)\r\n\t\t{\r\n\t\t\treturn; // :(\r\n\t\t}\r\n\r\n\t\tvar UpgradeModel = GUi.Upgrade.GetComponent\u003CSkinnedModelRenderer\u003E();\r\n\t\tAssert.NotNull(UpgradeModel);\r\n\t\tUpgradeModel.Tint = Colour;\r\n\t\tvar Outline = UpgradeModel.GetOrAddComponent\u003CHighlightOutline\u003E();\r\n\t\tOutline.Color = Colour;\r\n\r\n\t\tvar AvatarDresser = GUi.Avatar.GetComponent\u003CDresser\u003E();\r\n\t\tAssert.NotNull(AvatarDresser);\r\n\t\tvar AvatarModel = GUi.Avatar.GetComponent\u003CSkinnedModelRenderer\u003E();\r\n\t\tAssert.NotNull(AvatarModel);\r\n\r\n\t\tif (HoveredObject is ObjectUnit HoveredUnit \u0026\u0026 HoveredObject.IsValid())\r\n\t\t{\r\n\t\t\tAvatarModel.Tint = HoveredUnit.ModelRenderer.Tint;\r\n\t\t\tAvatarDresser.Clothing = HoveredUnit.GetComponent\u003CDresser\u003E()?.Clothing;\r\n\t\t\tAvatarDresser.Source = Dresser.ClothingSource.Manual;\r\n\t\t\tAvatarDresser.Apply();\r\n\t\t}\r\n\t\telse if (SelectedUnit is ObjectUnit CastSelectedUnit \u0026\u0026 SelectedUnit.IsValid())\r\n\t\t{\r\n\t\t\tAvatarModel.Tint = CastSelectedUnit.ModelRenderer.Tint;\r\n\t\t\tAvatarDresser.Clothing = CastSelectedUnit.GetComponent\u003CDresser\u003E()?.Clothing; // ?\r\n\t\t\tAvatarDresser.Source = Dresser.ClothingSource.Manual;\r\n\t\t\tAvatarDresser.Apply();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tAvatarModel.Tint = Color.White;\r\n\t\t\tAvatarDresser.Source = Dresser.ClothingSource.LocalUser;\r\n\t\t\tAvatarDresser.Apply();\r\n\t\t}\r\n\r\n\t\tSetGuiStrings();\r\n\t}\r\n\r\n\tprivate void SetGuiStrings()\r\n\t{\r\n\t\tvar BottomTextString = $\u0022\\u2800\u0022;\r\n\r\n\t\tif (HoveredObject is ObjectUnit ObjectUnit)\r\n\t\t{\r\n\t\t\tvar UnitPrefix = ObjectUnit.IsAi ? \u0022Native\u0022 : $\u0022{ObjectUnit.OwnerPlayer.SteamName}\u0027s\u0022;\r\n\t\t\tBottomTextString = $\u0022{UnitPrefix} {ObjectUnit.DisplayName}\\n{ObjectUnit.Health}hp\u0022;\r\n\r\n\t\t\tif (ObjectUnit.OwnerPlayer?.ConnectionId == Local.ConnectionId)\r\n\t\t\t{\r\n\t\t\t\tBottomTextString \u002B= $\u0022\\n{ObjectUnit.Attack} Attack\u0022;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if (HoveredObject is ObjectBuilding ObjectBuilding)\r\n\t\t{\r\n\t\t\tBottomTextString = $\u0022{ObjectBuilding.DisplayName} {ObjectBuilding.Health}hp\u0022;\r\n\t\t}\r\n\t\telse if (HoveredObject is Upgrade ObjectUpgrade)\r\n\t\t{\r\n\t\t\tBottomTextString = $\u0022{ObjectUpgrade.GetDesciption()}\u0022;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tGameManager.Instance.GetPlayerBoardStats(out var BoardStats);\r\n\t\t\tif (BoardStats.ContainsKey(this))\r\n\t\t\t{\r\n\t\t\t\tBottomTextString = $\u0022\\u00A3{Gold}\\n{BoardStats[this].Production}\u2B21\\n{BoardStats[this].TerritoryPercentage}%\u0022;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar BottomTextRenderer = GUi.BottomText.GetComponent\u003CTextRenderer\u003E();\r\n\t\tAssert.NotNull(BottomTextRenderer);\r\n\t\tBottomTextRenderer.Text = $\u0022{BottomTextString}\u0022;\r\n\t}\r\n}\r\n\r\npublic sealed class GamePlayerGUi : Component\r\n{\r\n\t[Property] public GameObject Upgrade { get; private set; }\r\n\t[Property] public GameObject BottomText { get; private set; }\r\n\t[Property] public GameObject Avatar { get; private set; }\r\n\r\n\tprivate bool ShowUpgrades = false;\r\n\tprivate List\u003CGameObject\u003E ShownUpgrades = new();\r\n\tpublic void OnUpgradeClicked(GamePlayer UpgradePlayer)\r\n\t{\r\n\t\tShowUpgrades = !ShowUpgrades;\r\n\t\tif (!ShowUpgrades)\r\n\t\t{\r\n\t\t\tforeach (var ShownUpgrade in ShownUpgrades)\r\n\t\t\t{\r\n\t\t\t\tShownUpgrade.Destroy();\r\n\t\t\t}\r\n\t\t\tShownUpgrades.Clear();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\tif (UpgradePlayer == null)\r\n\t\t{\r\n\t\t\tLog.Warning(\u0022upgrade pressed by no-one (spooky)\u0022);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfloat XOffset = 7.77f;\r\n\t\tforeach (var Upgrade in UpgradePlayer.Upgrades)\r\n\t\t{\r\n\t\t\tvar UpgradeObject = GameManager.Instance.GetObject(Upgrade.ObjectId);\r\n\r\n\t\t\tCloneConfig CloneConfig = new()\r\n\t\t\t{\r\n\t\t\t\tParent = this.Upgrade,\r\n\t\t\t\tStartEnabled = true,\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tvar ShownUpgrade = UpgradeObject.Clone(CloneConfig);\r\n\t\t\tShownUpgrade.LocalScale = Vector3.One;\r\n\t\t\tShownUpgrade.WorldPosition \u002B= Vector3.Right * XOffset;\r\n\t\t\tShownUpgrades.Add(ShownUpgrade);\r\n\r\n\t\t\tXOffset \u002B= 5f;\r\n\t\t}\r\n\t}\r\n}"},{"Ident":"wurstsoftware.forp","Path":"ui/controls/slidercontrol.razor.scss","FileName":"slidercontrol.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"\r\n.slidercontrol\r\n{\r\n    flex-direction: row;\r\n    min-width: 50px;\r\n    position: relative;\r\n    flex-shrink: 0;\r\n    flex-direction: row;\r\n    cursor: pointer;\r\n    gap: 8px;\r\n    flex-grow: 1;\r\n    align-items: center;\r\n    pointer-events: all;\r\n\r\n    \u003E .inner\r\n    {\r\n        flex-direction: column;\r\n        flex-shrink: 1;\r\n        flex-grow: 1;\r\n        min-height: 32px;\r\n        justify-content: center;\r\n\r\n        \u003E .values\r\n        {\r\n            width: 100%;\r\n            pointer-events: none;\r\n            font-size: 14px;\r\n            color: #aaa;\r\n\r\n            \u003E .left\r\n            {\r\n                flex-grow: 1;\r\n            }\r\n        }\r\n\r\n        \u003E .track\r\n        {\r\n            position: relative;\r\n            background-color: #888;\r\n            height: 7px;\r\n            margin: 8px;\r\n            align-items: center;\r\n            border-radius: 4px;\r\n\r\n            \u003E .track-active\r\n            {\r\n                background-color: #fff;\r\n                position: absolute;\r\n                height: 100%;\r\n                left: 0px;\r\n                border-radius: 4px;\r\n            }\r\n\r\n            \u003E .thumb\r\n            {\r\n                position: relative;\r\n                background-color: #fff;\r\n                border-radius: 100px;\r\n                width: 16px;\r\n                height: 16px;\r\n                transform: translateX( -50% );\r\n            }\r\n        }\r\n    }\r\n\r\n    \u003E .entry\r\n    {\r\n        flex-shrink: 0;\r\n        flex-grow: 0;\r\n        width: 50px;\r\n\r\n        \u003E numberentry\r\n        {\r\n            background-color: transparent;\r\n\r\n            \u003E .content-label\r\n            {\r\n                padding: 0 4px;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n\r\n.slidercontrol .value-tooltip\r\n{\r\n    position: absolute;\r\n    bottom: 150%;\r\n    left: -8px;\r\n    z-index: 1000;\r\n    flex-direction: column;\r\n\r\n    \u003E .label\r\n    {       \r\n        background-color: black;\r\n        padding: 8px 12px;\r\n        border-radius: 8px;\r\n    }\r\n\r\n    \u003E.tail\r\n    {\r\n        bottom: -0px;\r\n        background-color: black;\r\n        width: 10px;\r\n        height: 10px;\r\n        transform: rotateZ(45 deg) translateX( 4px );\r\n        position: absolute;\r\n    }\r\n}"},{"Ident":"wurstsoftware.forp","Path":"ui/components/packageflairbar.razor.scss","FileName":"packageflairbar.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"PackageFlairBar\r\n{\r\n\tposition: absolute;\r\n\ttop: 6px;\r\n\tleft: 6px;\r\n\tz-index: 2;\r\n\tflex-direction: row;\r\n\tgap: 5px;\r\n\tpointer-events: none;\r\n\r\n\t.flair\r\n\t{\r\n\t\tposition: relative;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\twidth: 22px;\r\n\t\theight: 22px;\r\n\t\tpointer-events: all;\r\n\t\tborder-radius: 4px;\r\n\t\tcolor: white;\r\n\t\tborder: 1px solid rgba( white, 0.1 );\r\n\t\toutline: 1px solid #0006;\r\n\t\topacity: 0.7;\r\n\r\n\t\t\u0026:hover\r\n\t\t{\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\r\n\t\ticon\r\n\t\t{\r\n\t\t\tfont-size: 15px;\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"wurstsoftware.forp","Path":"ui/components/packagefilters.razor.scss","FileName":"packagefilters.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"\r\n@import \u0022/styles/_theme.scss\u0022;\r\n\r\n.packagefilter\r\n{\r\n\twidth: 100%;\r\n\tflex-shrink: 0;\r\n\r\n\t.left\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t\tflex-shrink: 0;\r\n\t\tgap: 16px;\r\n\t}\r\n\r\n\t.right\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t\tflex-shrink: 0;\r\n\t\tgap: 16px;\r\n\t}\r\n}\r\n\r\n.packagefilter textentry\r\n{\r\n\tflex-grow: 1;\r\n\tpadding: 8px 12px;\r\n\tpointer-events: all;\r\n\r\n\tLabel\r\n\t{\r\n\t\tmargin-left: 26px;\r\n\t}\r\n\r\n\ticonpanel\r\n\t{\r\n\t\tposition: absolute;\r\n\t\tleft: 12px;\r\n\t\topacity: 0.3;\r\n\t\tfont-size: $text-large;\r\n\t}\r\n}\r\n\r\n\t.packagefilterfacet, .packagefilter textentry\r\n\t{\r\n\t\tbackground-color: rgba($default-950, 0.3);\r\n\t\tcolor: $default-text;\r\n\t\toutline: 1px solid $default-border;\r\n\t\ttransition: all 150ms $easing;\r\n\t\tborder-radius: $rounding-default;\r\n\t\tpadding: 4px 12px;\r\n\t\tgap: 16px;\r\n\t\tflex-shrink: 0;\r\n\t\tfont-size: 14px;\r\n\t\tcursor: pointer;\r\n\t\talign-items: center;\r\n\r\n\t\t.clear-button\r\n\t\t{\r\n\t\t\theight: 100%;\r\n\t\t\tmargin-right: -8px;\r\n\t\t\talign-items: center;\r\n\t\t\tpadding: 0px 4px;\r\n\r\n\t\t\t\u0026:hover\r\n\t\t\t{\r\n\t\t\t\tcolor: red;\r\n\t\t\t\tborder-radius: 100%;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\u0026.is-active\r\n\t\t{\r\n\t\t\tbackground-color: $default-700;\r\n\t\t}\r\n\r\n\t\t\u0026:not(.is-active)\r\n\t\t{\r\n\t\t\t\u0026:hover\r\n\t\t\t{\r\n\t\t\t\toutline: 1px solid $default-50;\r\n\t\t\t}\r\n\t\t}\r\n\t}"},{"Ident":"wurstsoftware.forp","Path":"Object/Obj.cs","FileName":"Obj.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"using Forp.Game;\r\nusing Sandbox;\r\nusing Sandbox.Diagnostics;\r\nusing System;\r\nusing static Sandbox.VideoWriter;\r\n\r\nnamespace Forp.Object;\r\n\r\npublic interface IObj\r\n{\r\n\tpublic string ObjectId { get; set; }\r\n\r\n\tpublic string Name { get; set; }\r\n\tpublic Transform Transform { get; set; }\r\n\tpublic Guid OwnerGuid { get; set; }\r\n\tpublic int TurnsAlive { get; set; }\r\n\r\n\tpublic int Health { get; set; }\r\n\tpublic int Attack { get; set; }\r\n\r\n\tpublic Hex Hex { get; set; }\r\n}\r\n\r\npublic record FObj : IObj\r\n{\r\n\tpublic string ObjectId { get; set; }\r\n\r\n\tpublic string Name { get; set; }\r\n\tpublic Transform Transform { get; set; }\r\n\tpublic Guid OwnerGuid { get; set; }\r\n\tpublic int TurnsAlive { get; set; }\r\n\tpublic int ViewRange { get; set; }\r\n\tpublic int Health { get; set; }\r\n\tpublic int Attack { get; set; }\r\n\r\n\tpublic Hex Hex { get; set; }\r\n}\r\n\r\npublic class Obj : Component\r\n{\r\n\t[Property] public string DisplayName { get; set; }\r\n\t[Property] public string Tooltip { get; set; }\r\n\t[Property] public string ObjectId { get; set; }\r\n\t[Property] public int Health { get; set; }\r\n\t[Property] public int Attack { get; set; }\r\n\r\n\t[RequireComponent] public SkinnedModelRenderer ModelRenderer { get; set; }\r\n\t[RequireComponent] public ModelCollider ModelCollider { get; set; }\r\n\r\n\tpublic GamePlayer OwnerPlayer { get; set; }\r\n\tpublic Hex OwnerHex { get; set; }\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tbase.OnStart();\r\n\t}\r\n\r\n\tprotected override void OnDestroy()\r\n\t{\r\n\t\tShowHealth = false;\r\n\r\n\t\tif (WorldTooltip != null)\r\n\t\t{\r\n\t\t\tWorldTooltip.DestroyGameObject();\r\n\t\t\tWorldTooltip = null;\r\n\t\t}\r\n\r\n\t\tbase.OnDestroy();\r\n\t}\r\n\r\n\tprotected GameText WorldTooltip = null;\r\n\tprotected bool ShowTooltip = false;\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tif (ShowTooltip)\r\n\t\t{\r\n\t\t\tif (WorldTooltip == null)\r\n\t\t\t{\r\n\t\t\t\tWorldTooltip = GameText.CreateTextObject\u003CGameText\u003E(new(), $\u0022{Tooltip}\u0022);\r\n\t\t\t}\r\n\r\n\t\t\tWorldTooltip.WorldPosition = WorldPosition;\r\n\t\t\tWorldTooltip.WorldPosition \u002B= Vector3.Up * 5f;\r\n\t\t}\r\n\t\telse if (!ShowTooltip \u0026\u0026 WorldTooltip != null)\r\n\t\t{\r\n\t\t\tWorldTooltip.DestroyGameObject();\r\n\t\t\tWorldTooltip = null;\r\n\t\t}\r\n\r\n\t\tbase.OnUpdate();\r\n\t}\r\n\r\n\tprivate bool _showHealth = false;\r\n\tpublic bool ShowHealth\r\n\t{\r\n\t\tget =\u003E _showHealth;\r\n\t\tset\r\n\t\t{\r\n\t\t\t_showHealth = value;\r\n\t\t\tToggleHealth(_showHealth);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate GameText HealthText = null;\r\n\tprotected void ToggleHealth(bool Show)\r\n\t{\r\n\t\tif (HealthText.IsValid())\r\n\t\t{\r\n\t\t\tHealthText.DestroyGameObject();\r\n\t\t\tHealthText = null;\r\n\t\t}\r\n\r\n\t\tif (!Show)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar TextTransform = WorldTransform;\r\n\t\tTextTransform.Position \u002B= Vector3.Up * 400;\r\n\r\n\t\tvar OwnerString = OwnerPlayer == null ? \u0022AI\u0022 : OwnerPlayer.SteamName;\r\n\t\tHealthText = GameText.CreateTextObject\u003CGameText\u003E(TextTransform, $\u0022{DisplayName} : {OwnerString}\\n{Health}hp\u0022);\r\n\t\tHealthText.WorldRotation = new();\r\n\t}\r\n\r\n\t[Rpc.Broadcast]\r\n\tpublic void OnDamageTaken(float Damage)\r\n\t{\r\n\t\tvar TextTransform = WorldTransform;\r\n\t\tTextTransform.Position \u002B= Vector3.Up * 150;\r\n\t\tGameText.CreateTextObject\u003CDamageText\u003E(TextTransform, $\u0022-{Damage}\u0022);\r\n\r\n\t\tOnDamageTaken_Internal();\r\n\t}\r\n\r\n\tprotected virtual void OnDamageTaken_Internal() { }\r\n\tpublic virtual void OnClick() { }\r\n}\r\n"},{"Ident":"wurstsoftware.forp","Path":"Util/SingletonComponent.cs","FileName":"SingletonComponent.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":356505,"Code":"using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Forp.Util;\r\n\r\npublic abstract class SingletonComponent\u003CT\u003E : Component, IHotloadManaged\r\n\twhere T : SingletonComponent\u003CT\u003E\r\n{\r\n\tpublic static T Instance { get; private set; }\r\n\r\n\tprotected override void OnAwake()\r\n\t{\r\n\t\tif (Active)\r\n\t\t{\r\n\t\t\tInstance = (T)this;\r\n\t\t}\r\n\t}\r\n\r\n\tvoid IHotloadManaged.Destroyed(Dictionary\u003Cstring, object\u003E state)\r\n\t{\r\n\t\tstate[\u0022IsActive\u0022] = Instance == this;\r\n\t}\r\n\r\n\tvoid IHotloadManaged.Created(IReadOnlyDictionary\u003Cstring, object\u003E state)\r\n\t{\r\n\t\tif (state.GetValueOrDefault(\u0022IsActive\u0022) is true)\r\n\t\t{\r\n\t\t\tInstance = (T)this;\r\n\t\t}\r\n\t}\r\n\r\n\tprotected override void OnDestroy()\r\n\t{\r\n\t\tif (Instance == this)\r\n\t\t{\r\n\t\t\tInstance = null;\r\n\t\t}\r\n\t}\r\n}\r\n"}]}