@model ContinuityExplorerViewModel @{ ViewData["Title"] = $"Continuity Explorer - {Model.Project.ProjectName}"; ViewData["ProjectSection"] = "Continuity Explorer"; } @functions { private static string StateBadgeClass(string state) => state switch { "Explicit" => "bg-success", "Inferred" => "bg-secondary", _ => "bg-warning text-dark" }; private bool IsEntitySelected(string entityType) => Model.Filter.EntityTypes.Contains(entityType, StringComparer.OrdinalIgnoreCase); }

Continuity

Continuity Explorer

Investigate where characters, assets, and locations stand across the story.

Filters
Reset
@if (Model.Filter.DisplayMode == "StoryState") {

Story State

@if (!Model.StoryState.Characters.Any() && !Model.StoryState.Assets.Any() && !Model.StoryState.Locations.Any()) {

No matching continuity information found.

} else { @if (Model.Filter.IncludeCharacters) {

Characters

@foreach (var row in Model.StoryState.Characters) { }
CharacterCurrent LocationStateLast Confirmed
@row.CharacterName@row.CurrentLocation@row.State@row.LastConfirmed
} @if (Model.Filter.IncludeAssets) {

Assets

@foreach (var row in Model.StoryState.Assets) { }
AssetHolder / LocationStateLast Confirmed
@row.AssetName@row.CurrentHolderOrLocation@row.State@row.LastConfirmed
} @if (Model.Filter.IncludeLocations) {

Locations

@if (!Model.StoryState.Locations.Any()) {

No matching location presence found.

} else {
@foreach (var location in Model.StoryState.Locations) {

@location.LocationPath

Characters: @(location.CharactersPresent.Any() ? string.Join(", ", location.CharactersPresent) : "None")

Assets: @(location.AssetsPresent.Any() ? string.Join(", ", location.AssetsPresent) : "None")

}
} } }
} else if (Model.Filter.DisplayMode == "Journey") {

Journey

@if (!Model.CharacterJourney.Any() && !Model.AssetJourney.Any()) {

No movement recorded.

} else { @foreach (var group in Model.CharacterJourney.GroupBy(x => new { x.CharacterID, x.CharacterName })) {

@group.Key.CharacterName

@foreach (var row in group) { }
SceneLocation
@row.SceneLabel@row.Location
} @foreach (var group in Model.AssetJourney.GroupBy(x => new { x.StoryAssetID, x.AssetName })) {

@group.Key.AssetName

@foreach (var row in group) { }
SceneHolder / Location
@row.SceneLabel@row.HolderOrLocation
} }
} else {

Location Activity

@if (!Model.LocationActivity.Any()) {

No matching continuity information found.

} else {
@foreach (var row in Model.LocationActivity) { }
LocationSceneCharacters PresentAssets Present
@row.LocationName@row.SceneLabel@row.CharactersPresent@row.AssetsPresent
}
}