ComputerScreen.razor
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace CryptidHunt
<root>
<div class="blackScreen" style="opacity: @(Computer.Started ? 0 : 0.9)"></div>
@if (Computer.Started)
{
<div class="monkeybar">FPS: @FrameRate</div>
}
else
{
<div class="textContainer">
<div class="text">
WELCOME TO THE NEXTBOT
PERSONALISED!
WHAT OR WHO DO YOU FEAR THE MOST?...
</div>
<div class="smallText" style="flex-direction: column">
<label>(PRESS MOUSE1 TO FOCUS)</label>
<label>(PRESS ENTER TO SEND)</label>
</div>
</div>
<TextEntry @ref=Input
onsubmit=@Submit
onblur=@Close
Placeholder="For example, @(Random.Shared.FromArray(ExampleFears))"
MaxLength=@(20) />
<div class="monkeyBar">MADE BY MONKEY BAR</div>
}
</root>
@code
{
public static readonly string[] ExampleFears = [
"colonoscopy",
"clowns",
"grass",
"aliens",
"clowns",
"heights",
"bears",
"drink and drive",
"martians",
"wendigo",
"night",
"vampires",
"wolves",
"dark basement",
"broccoli",
"ghosts",
"skeletons",
"ghouls",
"cemetery",
"dark castle",
"peanuts"
];
[Property]
public CameraComponent TargetCamera { get; set; }
[Property]
public Computer Computer { get; set; }
public TextEntry Input { get; set; }
public string ExampleFear { get; set; }
public int FrameRate = 15;
TimeUntil _fpsReroll = 1;
private static Texture _renderTarget;
private RealTimeUntil _nextRender;
protected override void OnStart()
{
base.OnStart();
_renderTarget = Texture.CreateRenderTarget()
.WithSize(new Vector2(512f, 512f * 0.6f))
.WithScreenFormat()
.Create();
Open();
}
protected override void OnUpdate()
{
base.OnUpdate();
if (!TargetCamera.IsValid() || !_nextRender)
return;
if (_fpsReroll)
{
FrameRate = Random.Shared.Int(10, 15);
_fpsReroll = Random.Shared.Float(0.5f, 2f);
}
var frameRate = Computer.Playing ? FrameRate : 5;
TargetCamera.RenderToTexture(_renderTarget);
_nextRender = 1f / frameRate;
Panel.Style.BackgroundImage = _renderTarget;
if (Computer.Playing && !Computer.Started)
Input?.Focus();
}
private void Submit()
{
var message = Input.Text.Trim();
Input.Text = string.Empty;
Close();
if (string.IsNullOrWhiteSpace(message))
return;
Computer.Started = true;
Computer.StopGameSequence();
SetFear(message);
}
async void SetFear(string fear)
{
Computer.Fear = await Flickr.Get(fear);
}
public void Open()
{
Input?.Focus();
}
public void Close()
{
Input?.Blur();
Input.Text = string.Empty;
}
protected override int BuildHash() => System.HashCode.Combine(Computer.Started, Computer.Started ? FrameRate : 0);
}