Hud.razor
@using System;
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace NiuLai
<root class="root">
@if ( GameFlow.Screen == GameScreen.Title )
{
<div class="screen title">
<div class="title-tall"></div>
<div class="title-stamp"></div>
<div class="title-wash"></div>
<div class="title-stack">
<div class="seal">@GameInfo.DragonSeal</div>
<div class="studio">@GameInfo.Studio · 手搓海报三张</div>
<div class="loading">五年手搓加载中…… Five-year handmade loading……</div>
<div class="title-cn">牛来</div>
<div class="title-en">(Niu Lai)</div>
<div class="tag">@GameInfo.Tagline</div>
<div class="tag-en">@GameInfo.TaglineEn</div>
<div class="poster-note">跟着牛来走完迁徙。建模有点歪。这是电影。</div>
<div class="poster-note en">Walk the migration with Niu Lai. Model a bit crooked. This is the movie.</div>
<div class="menu-links">
<div class="btn primary" @onclick="@OnStart">开始 / START</div>
<div class="btn" @onclick="@OnQuit">退出 / QUIT</div>
</div>
</div>
<div class="ver">@GameInfo.Package · @GameInfo.VersionLabel · bootleg cut</div>
</div>
}
else if ( GameFlow.Screen == GameScreen.Paused )
{
<div class="screen pause">
<div class="panel">
<div class="pause-stamp"></div>
<div class="panel-title">暂停 / PAUSED</div>
<div class="btn primary" @onclick="@OnResume">继续 / CONTINUE</div>
<div class="btn" @onclick="@OnTitle">标题 / TITLE</div>
</div>
</div>
}
else if ( GameFlow.Screen == GameScreen.Ending )
{
<div class="screen ending">
<div class="end-poster"></div>
<div class="end-card">
<div class="end-stamp"></div>
<div class="end-title">雨后轻风有香</div>
<div class="end-sub">After Rain, Light Wind Have Fragrance · 孙丽芳</div>
<div class="end-sub">片尾曲正在播放 · ending song from the movie</div>
@foreach ( var line in Lines.Ending )
{
<div class="end-line">@line.Cn</div>
<div class="end-line en">@line.En</div>
}
<div class="end-stat">勇气 @GameState.Courage · 草 @GameState.GrassEaten 丛 · @GameState.ChapterCn</div>
<div class="btn primary" @onclick="@OnTitle">再看一遍 / WATCH AGAIN</div>
</div>
</div>
}
else
{
<div class="play">
<div class="top">
<div class="quest">
<div class="q-cn">@GameState.QuestLine.Cn</div>
<div class="q-en">@GameState.QuestLine.En</div>
</div>
<div class="meters">
<div class="meter">
<div class="m-k">章节 CHAPTER</div>
<div class="m-v">@GameState.ChapterCn</div>
</div>
<div class="meter">
<div class="m-k">勇气 COURAGE</div>
<div class="m-v">@GameState.Courage</div>
</div>
<div class="meter">
<div class="m-k">草 GRASS</div>
<div class="m-v">@GameState.GrassBag@(GameState.HasMilk ? " · 奶" : "")</div>
</div>
<div class="meter">
<div class="m-k">名场面 SCENES</div>
<div class="m-v">@GameState.SceneScore / @GameState.SceneTotal</div>
</div>
</div>
</div>
@if ( GameState.InVoid )
{
<div class="banner">纯黑的梦 · THE BLACK DREAM</div>
}
@if ( GameState.Talking )
{
<div class="talk">
<div class="who">@GameState.Speaker</div>
<div class="cn">@GameState.CurrentLine.Cn</div>
<div class="en">@GameState.CurrentLine.En</div>
<div class="next">E / Enter 继续 continue</div>
</div>
}
else if ( Chatter.Visible )
{
<div class="bark">
<div class="who">@Chatter.Who</div>
<div class="cn">@Chatter.Cn</div>
<div class="en">@Chatter.En</div>
</div>
}
@if ( !GameState.Talking && !string.IsNullOrEmpty( GameState.PromptCn ) )
{
<div class="prompt">
<div class="cn">@GameState.PromptCn</div>
<div class="en">@GameState.PromptEn</div>
</div>
}
<div class="help">WASD 走 · 鼠标看 · 空格跳 · E 互动 · F 哞 · Esc 暂停</div>
</div>
}
@if ( FilmCut.Playing )
{
<div class="letter-top"></div>
<div class="letter-bot"></div>
@if ( !string.IsNullOrEmpty( FilmCut.CardCn ) )
{
<div class="cut-card">
<div class="cut-k">院线录音 · THEATER TAPE</div>
<div class="cut-cn">@FilmCut.CardCn</div>
<div class="cut-en">@FilmCut.CardEn</div>
<div class="cut-skip">E 跳过 / skip this handmade shot</div>
</div>
}
}
@if ( Trophies.ToastVisible && Trophies.Toast is TrophyDef ach )
{
<div class="ach">
<div class="ach-k">成就 ACHIEVEMENT</div>
<div class="ach-t">@ach.Title</div>
<div class="ach-d">@ach.Description</div>
</div>
}
</root>
@code
{
int _sig;
protected override void OnUpdate()
{
var sig = HashCode.Combine(
HashCode.Combine(
(int)GameFlow.Screen,
(int)GameState.Beat,
GameState.Courage,
GameState.GrassBag,
GameState.GrassEaten,
GameState.SceneScore,
GameState.Talking,
GameState.DialogueIndex
),
GameState.PromptCn,
GameState.InVoid,
Trophies.Version,
FilmCut.Version,
Chatter.Version
);
if ( sig == _sig )
return;
_sig = sig;
StateHasChanged();
}
void OnStart()
{
GameFlow.StartNewGame();
}
void OnResume()
{
GameFlow.SetScreen( GameScreen.Playing );
}
void OnTitle()
{
GameFlow.BackToTitle();
}
void OnQuit()
{
Game.Close();
}
}