{"TotalCount":86,"Files":[{"Ident":"facepunch.breakout","Path":".obj/__compiler_extra.cs","FileName":"__compiler_extra.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"global using static Sandbox.Internal.GlobalGameNamespace;\r\nglobal using Microsoft.AspNetCore.Components;\r\nglobal using Microsoft.AspNetCore.Components.Rendering;\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonTitle\u0022, \u0022Breakout\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonIdent\u0022, \u0022breakout\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022OrgIdent\u0022, \u0022facepunch\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022Ident\u0022, \u0022facepunch.breakout\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineVersion\u0022, \u002227\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineMinorVersion\u0022, \u00221\u0022 )]\r\n\r\n[assembly: System.Runtime.Versioning.TargetFramework( \u0022.NETCoreApp,Version=v9.0\u0022, FrameworkDisplayName = \u0022.NET 9.0\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022CompileTime\u0022, \u00222026-07-08T09:04:56.5456514Z\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyVersion(\u00220.0.111.0\u0022)]\r\n[assembly: global::System.Reflection.AssemblyFileVersion(\u00220.0.111.0\u0022)]"},{"Ident":"facepunch.breakout","Path":"Game/GameFeedback.cs","FileName":"GameFeedback.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"using System;\r\nusing Sandbox;\r\n\r\nnamespace Breakout;\r\n\r\n/// \u003Csummary\u003E\r\n/// Owns purely-cosmetic game juice: the center banner, the damage flash, camera shake, brick\r\n/// debris, wall-hit sparks, confetti and the board-clear sting. BreakoutGame delegates here and\r\n/// re-exposes the banner/damage state for the HUD.\r\n/// \u003C/summary\u003E\r\n[Title( \u0022Game Feedback\u0022 ), Category( \u0022Breakout\u0022 ), Icon( \u0022auto_awesome\u0022 )]\r\npublic sealed class GameFeedback : Component\r\n{\r\n\t[Property] public GameObject DebrisPrefab { get; set; }\r\n\t[Property] public GameObject WallHitPrefab { get; set; }\r\n\t[Property] public GameObject ConfettiPrefab { get; set; }\r\n\t[Property] public float LifeLostShake { get; set; } = 0.65f;\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Big center banner text, like \u0022LEVEL 1\u0022 or \u0022BOARD CLEAR!\u0022.\r\n\t/// \u003C/summary\u003E\r\n\tpublic string BannerText { get; private set; }\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Smaller line shown beneath the banner (may be null).\r\n\t/// \u003C/summary\u003E\r\n\tpublic string BannerSub { get; private set; }\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Ticks up each time a new banner is shown, so the HUD can restart its animation.\r\n\t/// \u003C/summary\u003E\r\n\tpublic int BannerSeq { get; private set; }\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// True while the banner should currently be visible.\r\n\t/// \u003C/summary\u003E\r\n\tpublic bool BannerActive =\u003E !string.IsNullOrEmpty( BannerText ) \u0026\u0026 bannerSince \u003C bannerHold;\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Ticks up each time the player takes damage, so the HUD can restart the red flash.\r\n\t/// \u003C/summary\u003E\r\n\tpublic int DamageSeq { get; private set; }\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// True while the red damage flash should currently be showing.\r\n\t/// \u003C/summary\u003E\r\n\tpublic bool DamageActive =\u003E DamageSeq \u003E 0 \u0026\u0026 damageSince \u003C DamageFlashHold;\r\n\r\n\tprivate RealTimeSince bannerSince;\r\n\tprivate float bannerHold;\r\n\tprivate RealTimeSince damageSince;\r\n\tprivate const float DamageFlashHold = 0.05f;\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Shows the center banner with optional sub-text for hold seconds.\r\n\t/// \u003C/summary\u003E\r\n\tpublic void ShowBanner( string text, string sub = null, float hold = 1.1f )\r\n\t{\r\n\t\tBannerText = text;\r\n\t\tBannerSub = sub;\r\n\t\tbannerSince = 0f;\r\n\t\tbannerHold = hold;\r\n\t\tBannerSeq\u002B\u002B;\r\n\t}\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Kicks off the red screen flash and a small camera shake when the player loses a life.\r\n\t/// \u003C/summary\u003E\r\n\tpublic void TriggerDamageFeedback()\r\n\t{\r\n\t\tdamageSince = 0f;\r\n\t\tDamageSeq\u002B\u002B;\r\n\t\tShakeCamera( LifeLostShake );\r\n\t}\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Shakes the camera. Bigger amount means a stronger, longer shake.\r\n\t/// \u003C/summary\u003E\r\n\tpublic void ShakeCamera( float amount )\r\n\t{\r\n\t\tif ( amount \u003C= 0f )\r\n\t\t\treturn;\r\n\r\n\t\tScene.Camera.AddShake( amount * 20, amount * 10f, 0.5f );\r\n\t}\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Spawns the shatter particles for a broken brick, tinted to match it.\r\n\t/// \u003C/summary\u003E\r\n\tpublic void SpawnDebris( Block block )\r\n\t{\r\n\t\tif ( !block.IsValid() || DebrisPrefab is null )\r\n\t\t\treturn;\r\n\r\n\t\tvar go = DebrisPrefab.Clone( new CloneConfig( new Transform( block.WorldPosition ), startEnabled: false ) );\r\n\r\n\t\tforeach ( var fx in go.Components.GetAll\u003CParticleEffect\u003E( FindMode.EverythingInSelfAndDescendants ) )\r\n\t\t\tfx.Tint = block.HealthyTint;\r\n\r\n\t\tgo.Enabled = true;\r\n\t}\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Spawns a spark burst facing inward where the ball hit a wall or the paddle.\r\n\t/// \u003C/summary\u003E\r\n\tpublic void SpawnWallHit( Vector3 worldPos, Vector3 inwardNormal )\r\n\t{\r\n\t\tif ( WallHitPrefab is null )\r\n\t\t\treturn;\r\n\r\n\t\tvar n = inwardNormal.Normal;\r\n\t\tvar up = MathF.Abs( n.z ) \u003E 0.99f ? Vector3.Forward : Vector3.Up;\r\n\t\tvar rot = Rotation.LookAt( n, up );\r\n\t\tWallHitPrefab.Clone( new CloneConfig( new Transform( worldPos, rot ), name: \u0022wall_hit\u0022 ) );\r\n\t}\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Spawns the celebratory confetti burst used on a board clear.\r\n\t/// \u003C/summary\u003E\r\n\tpublic void SpawnConfetti( Vector3 worldPos ) =\u003E ConfettiPrefab?.Clone( worldPos );\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Plays the rising three-note chime used when a board is cleared.\r\n\t/// \u003C/summary\u003E\r\n\tpublic void PlayClearSting()\r\n\t{\r\n\t\tfloat[] pitches = { 1.15f, 1.5f, 1.9f };\r\n\t\tforeach ( var pitch in pitches )\r\n\t\t{\r\n\t\t\tvar note = Sound.Play( \u0022brick_break_01\u0022 );\r\n\t\t\tif ( note is not null )\r\n\t\t\t\tnote.Pitch = pitch;\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"UI/Controls.razor","FileName":"Controls.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"@using System\r\n@using Sandbox\r\n@using Sandbox.UI\r\n@namespace Breakout\r\n@inherits Panel\r\n\r\n@if ( Game.IsValid() \u0026\u0026 Game.State != GameState.Menu \u0026\u0026 Game.Level \u003C= 1 )\r\n{\r\n    \u003Croot\u003E\r\n        \u003Cdiv class=\u0022container\u0022\u003E\r\n            \u003Cspan class=\u0022controls-label\u0022\u003ECONTROLS\u003C/span\u003E\r\n            \u003Cdiv class=\u0022column\u0022\u003E\r\n                \u003Cdiv class=\u0022input\u0022\u003E\r\n                    @*There is no mouse/ controller move input hint so we do this.*@\r\n                    @if(Input.UsingController)\r\n                    {\r\n                        \u003Clabel class=\u0022type\u0022\u003EMove\u003C/label\u003E\u003Cimg src=\u0022ui/glyphs/xbox/leftjoystickbutton.svg\u0022 class=\u0022mouse-glyph\u0022 /\u003E\r\n                    }\r\n                    else\r\n                    {\r\n                        \u003Clabel class=\u0022type\u0022\u003EMove Paddle\u003C/label\u003E\u003Cimg src=\u0022ui/glyphs/default/mouse.svg\u0022 class=\u0022mouse-glyph\u0022 /\u003E\r\n                    }\r\n                \u003C/div\u003E\r\n                \u003Cdiv class=\u0022input\u0022\u003E\r\n                    \u003Clabel class=\u0022type\u0022\u003ELaunch\u003C/label\u003E\u003CInputHint Action=\u0022attack1\u0022 class=\u0022key-glyph\u0022 Dark=@true /\u003E\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n\r\n    \u003C/root\u003E\r\n}\r\n\r\n@code\r\n{\r\n    /// \u003Csummary\u003E\r\n    /// The game this bar reads score, lives, level and mode from.\r\n    /// \u003C/summary\u003E\r\n    [Parameter] public BreakoutGame Game { get; set; }\r\n\r\n    // Update the ui when the game state changes or when the input method changes.\r\n    protected override int BuildHash() =\u003E System.HashCode.Combine(Game?.State, Game?.Mode, Game?.Level, Input.UsingController);\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"UI/HelpScreen.razor","FileName":"HelpScreen.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"@using System\r\n@using Sandbox\r\n@using Sandbox.UI\r\n@namespace Breakout\r\n@inherits Panel\r\n\r\n@*\r\n    HelpScreen is the \u0022how to play\u0022 page you reach from the menu\u0027s HELP button. It shows a guide\r\n    of every block type and what it does. Pressing BACK runs the Back callback, which tells the\r\n    menu to show itself again.\r\n*@\r\n\r\n\u003Croot\u003E\r\n    \u003Cdiv class=\u0022help\u0022\u003E\r\n        \u003Cbutton class=\u0022back-btn\u0022 onclick=@(() =\u003E Back?.Invoke())\u003E\r\n            \u003Cspan class=\u0022back-icon\u0022\u003E\u25C0\u003C/span\u003E\r\n            BACK\r\n        \u003C/button\u003E\r\n\r\n        \u003Cdiv class=\u0022help-body\u0022\u003E\r\n            \u003Cdiv class=\u0022help-title\u0022\u003EHELP\u003C/div\u003E\r\n            \u003Cdiv class=\u0022help-sub\u0022\u003EHere is what each brick does when you hit it.\u003C/div\u003E\r\n\r\n            \u003Cdiv class=\u0022block-grid\u0022\u003E\r\n                @foreach ( var block in Blocks )\r\n                {\r\n                    \u003Cdiv class=\u0022block-card\u0022\u003E\r\n                        \u003Cimg class=\u0022block-icon\u0022 src=\u0022@block.Icon\u0022 /\u003E\r\n                        \u003Cdiv class=\u0022block-info\u0022\u003E\r\n                            \u003Cdiv class=\u0022block-name\u0022\u003E@block.Name\u003C/div\u003E\r\n                            \u003Cdiv class=\u0022block-desc\u0022\u003E@block.Description\u003C/div\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/div\u003E\r\n                }\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    \u003C/div\u003E\r\n\u003C/root\u003E\r\n\r\n@code\r\n{\r\n    /// \u003Csummary\u003E\r\n    /// Called when the player presses BACK, so the menu can show itself again.\r\n    /// \u003C/summary\u003E\r\n    [Parameter] public Action Back { get; set; }\r\n\r\n    /// \u003Csummary\u003E\r\n    /// One row in the block guide: the icon to show, the block\u0027s name, and a short description.\r\n    /// \u003C/summary\u003E\r\n    private record BlockGuideEntry( string Icon, string Name, string Description );\r\n\r\n    // The list shown on the help page. Add a new line here to document another block type.\r\n    private static readonly BlockGuideEntry[] Blocks =\r\n    {\r\n        new( \u0022textures/blocks/normal.png\u0022, \u0022Brick\u0022, \u0022Breaks in a single hit.\u0022 ),\r\n        new( \u0022textures/blocks/armoured.png\u0022, \u0022Armoured\u0022, \u0022Takes two hits to break.\u0022 ),\r\n        new( \u0022textures/blocks/unbreakable.png\u0022, \u0022Unbreakable\u0022, \u0022Can\u0027t be broken, so play around it.\u0022 ),\r\n        new( \u0022textures/blocks/explosion.png\u0022, \u0022Explosive\u0022, \u0022Blows up nearby bricks when it breaks.\u0022 ),\r\n        new( \u0022textures/blocks/speed.png\u0022, \u0022Fast Ball\u0022, \u0022Turns your ball into a faster one.\u0022 ),\r\n        new( \u0022textures/blocks/big_ball.png\u0022, \u0022Big Ball\u0022, \u0022Makes your ball big enough to smash armour in one hit.\u0022 ),\r\n        new( \u0022textures/blocks/fire_ball.png\u0022, \u0022Fireball\u0022, \u0022Turns your ball into a fireball that burns straight through bricks.\u0022 ),\r\n        new( \u0022textures/blocks/split.png\u0022, \u0022Multi-Ball\u0022, \u0022Drops a pickup that splits your ball into more.\u0022 ),\r\n        new( \u0022textures/blocks/expand.png\u0022, \u0022Expand\u0022, \u0022Drops a pickup that makes your paddle wider.\u0022 ),\r\n    };\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"styles/form/_coloreditor.scss","FileName":"_coloreditor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"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":"facepunch.breakout","Path":"ui/menupanel.razor.scss","FileName":"menupanel.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"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":"facepunch.breakout","Path":"ui/controls/vectorcontrol.cs.scss","FileName":"vectorcontrol.cs.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"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":"facepunch.breakout","Path":"styles/form/_checkbox.scss","FileName":"_checkbox.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"\r\n@import \u0022/styles/_theme.scss\u0022;\r\n\r\n$primary: $primary-blue !default;\r\n$primary-alt: white !default;\r\n$form-control-height: 24px !default;\r\n\r\n.checkbox\r\n{\r\n\tcursor: pointer;\r\n\tcolor: rgba( $primary-alt, 0.6 );\r\n\talign-items: center;\r\n\tgap: 8px;\r\n\r\n\tlabel\r\n\t{\r\n\t\tpointer-events: none;\r\n\t}\r\n\r\n\t\u003E .checkmark\r\n\t{\r\n\t\tpadding: 1px;\r\n\t\tfont-size: 22px;\r\n\t\tborder: 1px solid $primary;\r\n\t\tborder-radius: $rounding-small;\r\n\t\ttext-align: center;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tcolor: transparent;\r\n\t\tmin-height: $form-control-height;\r\n\t\tpointer-events: none;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n\t\u0026.checked\r\n\t{\r\n\t\t\u003E .checkmark\r\n\t\t{\r\n\t\t\tcolor: $primary-alt;\r\n\t\t\tbackground-color: $primary;\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026:active\r\n\t{\r\n\t\tcolor: $primary-alt;\r\n\t}\r\n\r\n\t\u0026:hover\r\n\t{\r\n\t\tcolor: $primary-alt;\r\n\t}\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"Blocks/ExplodingBlock.cs","FileName":"ExplodingBlock.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\nnamespace Breakout;\r\n\r\n/// \u003Csummary\u003E\r\n/// A brick that blows up when destroyed, taking out every other breakable brick within\r\n/// BlastRadius. Those can be exploding bricks too, so one blast can chain into more.\r\n/// \u003C/summary\u003E\r\n[Title( \u0022Exploding Block\u0022 ), Category( \u0022Breakout\u0022 ), Icon( \u0022bolt\u0022 )]\r\npublic sealed class ExplodingBlock : Block\r\n{\r\n\t[Property] public float BlastRadius { get; set; } = 80f;\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Breaks this brick and destroys every other breakable brick within BlastRadius, which can chain into further explosions.\r\n\t/// \u003C/summary\u003E\r\n\tpublic override void OnDestroyed()\r\n\t{\r\n\t\tif ( Broken )\r\n\t\t\treturn;\r\n\r\n\t\tvar origin = WorldPosition;\r\n\r\n\t\tbase.OnDestroyed();\r\n\t\tGame?.HitStop( 0.05f );\r\n\r\n\t\tforeach ( var other in Scene.GetAllComponents\u003CBlock\u003E().ToList() )\r\n\t\t{\r\n\t\t\tif ( other == this || !other.IsValid() || !other.Breakable )\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tif ( other.WorldPosition.Distance( origin ) \u003C= BlastRadius )\r\n\t\t\t\tother.OnDestroyed();\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"Game/GameMode.cs","FileName":"GameMode.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"namespace Breakout;\r\n\r\n/// \u003Csummary\u003E\r\n/// The three ways to play. Classic is the authentic original brick wall, Arcade shuffles through\r\n/// the custom levels, and Weekly is a shared challenge board that changes each week.\r\n/// \u003C/summary\u003E\r\npublic enum GameMode\r\n{\r\n\tClassic,\r\n\tArcade,\r\n\tWeekly\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"Paddle/PaddleEffect.cs","FileName":"PaddleEffect.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\nnamespace Breakout;\r\n\r\n/// \u003Csummary\u003E\r\n/// Base class for a timed effect living on the paddle (such as the wide-paddle boost). It runs\r\n/// OnApply when added, then removes itself after Duration seconds, calling OnRemoved on its way out.\r\n/// \u003C/summary\u003E\r\npublic abstract class PaddleEffect : Component\r\n{\r\n\t[Property] public float Duration { get; set; } = 8f;\r\n\r\n\tprotected Paddle Paddle { get; private set; }\r\n\r\n\tprivate TimeUntil expires;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tPaddle = Components.Get\u003CPaddle\u003E( FindMode.EverythingInSelfAndAncestors );\r\n\t\tif ( Paddle is null )\r\n\t\t{\r\n\t\t\tDestroy();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\texpires = Duration;\r\n\t\tOnApply();\r\n\t}\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tif ( Duration \u003E 0f \u0026\u0026 expires )\r\n\t\t\tDestroy();\r\n\t}\r\n\r\n\tprotected override void OnDestroy() =\u003E OnRemoved();\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Called once when the effect is added. Override to start the effect.\r\n\t/// \u003C/summary\u003E\r\n\tprotected virtual void OnApply() { }\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// Called once when the effect expires or is removed. Override to undo the effect.\r\n\t/// \u003C/summary\u003E\r\n\tprotected virtual void OnRemoved() { }\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"styles/form/_dropdown.scss","FileName":"_dropdown.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"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":"facepunch.breakout","Path":"ui/controls/color/colorcontrol.cs.scss","FileName":"colorcontrol.cs.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"ColorControl\r\n{\r\n\tgap: 0.5rem;\r\n\tflex-grow: 1;\r\n\tpointer-events: all;\r\n\tbackground-color: #000a;\r\n\tborder-radius: 4px;\r\n\tpadding: 2px;\r\n\theight: 32px;\r\n}\r\n\r\nColorControl TextEntry\r\n{\r\n\tflex-grow: 1;\r\n\tflex-shrink: 0;\r\n\tcolor: #aaa;\r\n\tfont-size: 1.2rem;\r\n\r\n\t\u0026:hover, \u0026:focus\r\n\t{\r\n\t\tcolor: #ddd;\r\n\r\n\t\t.icon\r\n\t\t{\r\n\t\t\tcolor: #3af;\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026:active\r\n\t{\r\n\t\tcolor: white;\r\n\t}\r\n}\r\n\r\nColorControl \u003E .colorswatch\r\n{\r\n\taspect-ratio: 1;\r\n\tborder-radius: 4px;\r\n\theight: 100%;\r\n\tflex-shrink: 0;\r\n\tcursor: pointer;\r\n\tborder: 2px solid #000;\r\n}"},{"Ident":"facepunch.breakout","Path":"ui/inputhint.razor.scss","FileName":"inputhint.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"@import \u0022_theme.scss\u0022;\r\n\r\nInputHint\r\n{\r\n\twidth: 28px;\r\n\theight: 28px;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.glyph\r\n{\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tbackground-size: contain;\r\n\tbackground-position: center;\r\n\tbackground-repeat: no-repeat;\r\n\r\n}\r\n\r\n.glyph.dark\r\n{\r\n\tfilter: invert( 1 );\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"styles/form/_switch.scss","FileName":"_switch.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"\r\n$primary: red !default;\r\n$primary-alt: white !default;\r\n\r\n$switch-padding: 6px !default;\r\n\r\n.checkbox.switch\r\n{\r\n\tcursor: pointer;\r\n\r\n\t\u003E .checkmark\r\n\t{\r\n\t\tfont-size: 22px;\r\n\t\tborder: 0px solid $primary;\r\n\t\tborder-radius: 100px;\r\n\t\ttext-align: center;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\tcolor: $primary-alt;\r\n\t\tpadding: $switch-padding;\r\n\t\tpadding-right: 32px;\r\n\t\tpadding-left: $switch-padding;\r\n\t\ttransition: all 0.3s ease;\r\n\t\tbackground-color: rgba( $primary, 0.1 );\r\n\r\n\t\t\u003E .handle\r\n\t\t{\r\n\t\t\tbackground-color: $primary-alt;\r\n\t\t\twidth: 20px;\r\n\t\t\theight: 20px;\r\n\t\t\tborder-radius: 100px;\r\n\t\t\tbox-shadow: 2px 2px 12px black;\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026.checked\r\n\t{\r\n\t\t\u003E .checkmark\r\n\t\t{\r\n\t\t\tbackground-color: $primary;\r\n\t\t\tpadding-left: 32px;\r\n\t\t\tpadding-right: $switch-padding;\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026:active\r\n\t{\r\n\t\ttransform: scale( 0.9 );\r\n\t\ttransform-origin: 20px 50%;\r\n\t}\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"ui/controls/switchcontrol.razor.scss","FileName":"switchcontrol.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"\r\n.switchcontrol\r\n{\r\n    flex-direction: row;\r\n    width: 100px;\r\n    min-height: 24px;\r\n    align-items: center;\r\n    cursor: pointer;\r\n\r\n    .switch-frame\r\n    {\r\n        flex-grow: 0;\r\n        flex-shrink: 1;\r\n        width: 48px;\r\n        height: 16px;\r\n        background-color: #fff1;\r\n        margin: 0px 5px;\r\n        align-items: center;\r\n        border-radius: 100px;\r\n        transition: all 0.4s linear;\r\n\r\n        .switch-inner\r\n        {\r\n            position: relative;\r\n            flex-grow: 0;\r\n            flex-shrink: 1;\r\n            background-color: #999;\r\n            width: 25px;\r\n            height: 25px;\r\n            border-radius: 100px;\r\n            left: 20%;\r\n            transform: translateX( -50% );\r\n            transition: all 0.3s ease-out;\r\n        }\r\n    }\r\n\r\n    \u0026.active\r\n    {\r\n        .switch-frame\r\n        {\r\n            background-color: #fffa;\r\n        }\r\n\r\n        .switch-inner\r\n        {\r\n            left: 80%;\r\n            background-color: #fff;\r\n        }\r\n    }\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"styles/base/_navigator.scss","FileName":"_navigator.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":".navigator-body\r\n{\r\n\t\u0026.hidden\r\n\t{\r\n\t\tdisplay: none;\r\n\t}\r\n}\r\n"},{"Ident":"facepunch.breakout","Path":"ui/controls/color/colorhuecontrol.cs.scss","FileName":"colorhuecontrol.cs.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"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":"facepunch.breakout","Path":"ui/components/packagelist.razor.scss","FileName":"packagelist.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":".package-list\r\n{\r\n    flex-shrink: 1;\r\n    flex-wrap: wrap;\r\n    flex-grow: 1;\r\n\r\n    h1\r\n    {\r\n        width: 100%;\r\n        margin-top: 50px;\r\n        font-size: 40px;\r\n    }\r\n\r\n    PackageCard\r\n    {\r\n        \u0026:hover\r\n        {\r\n            sound-in: \u0022ui.button.over\u0022;\r\n        }\r\n    }\r\n\r\n    VirtualGrid\r\n    {\r\n        width: 100%;\r\n        height: 100%;\r\n\r\n        .cell\r\n        {\r\n            \r\n        }\r\n    }\r\n}"},{"Ident":"facepunch.breakout","Path":"Level/BlockPalette.cs","FileName":"BlockPalette.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":307874,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\nnamespace Breakout;\r\n\r\n/// \u003Csummary\u003E\r\n/// Maps level symbols to the colors used when drawing a level\u0027s thumbnail preview. This is only for\r\n/// the editor preview image; the in-game bricks get their color from the spawner\u0027s palette.\r\n/// \u003C/summary\u003E\r\npublic static class BlockPalette\r\n{\r\n\tpublic static readonly Color Background = new( 0.07f, 0.08f, 0.10f );\r\n\tpublic static readonly Color Empty = new( 0.16f, 0.17f, 0.19f );\r\n\r\n\t/// \u003Csummary\u003E\r\n\t/// The preview color for a level symbol (falls back to the empty-cell color for unknown symbols).\r\n\t/// \u003C/summary\u003E\r\n\tpublic static Color ColorFor( char symbol )\r\n\t{\r\n\t\treturn symbol switch\r\n\t\t{\r\n\t\t\t\u00271\u0027 =\u003E new Color( 0.95f, 0.62f, 0.20f ), // normal\r\n\t\t\t\u00272\u0027 =\u003E new Color( 0.36f, 0.55f, 0.78f ), // multi-hit\r\n\t\t\t\u0027P\u0027 =\u003E new Color( 0.35f, 0.78f, 0.42f ), // power-up (multi-ball)\r\n\t\t\t\u0027E\u0027 =\u003E new Color( 0.30f, 0.78f, 0.80f ), // expand\r\n\t\t\t\u0027X\u0027 =\u003E new Color( 0.86f, 0.27f, 0.27f ), // exploding\r\n\t\t\t\u0027#\u0027 =\u003E new Color( 0.55f, 0.55f, 0.58f ), // unbreakable\r\n\t\t\t\u0027S\u0027 =\u003E new Color( 1.00f, 0.45f, 0.20f ), // fast ball\r\n\t\t\t\u0027B\u0027 =\u003E new Color( 0.40f, 0.70f, 1.00f ), // big ball\r\n\t\t\t\u0027F\u0027 =\u003E new Color( 1.00f, 0.35f, 0.10f ), // fireball\r\n\t\t\t_ =\u003E Empty,\r\n\t\t};\r\n\t}\r\n}\r\n"}]}