@foreach (var column in timelineColumns)
{
if (column.Scene is not Scene realPlotScene)
{
continue;
}
var slot = lane.SceneSlots.FirstOrDefault(x => x.Scene.SceneID == realPlotScene.SceneID);
@foreach (var threadEvent in slot?.Events ?? Enumerable.Empty())
{
var markerClass = threadEvent.EventTypeName is "Resolved" or "Payoff"
? "resolved"
: threadEvent.EventTypeName is "Contradicted"
? "contradicted"
: "";
@threadEvent.MarkerText
}
}
}
}
}
else
{
Add visible plot lines and thread events to see narrative lanes here.
@foreach (var column in timelineColumns)
{
if (column.Scene is not Scene realAssetScene)
{
continue;
}
var slot = lane.SceneSlots.FirstOrDefault(x => x.Scene.SceneID == realAssetScene.SceneID);
@foreach (var group in Model.CharacterLanes.Select((lane, index) => new { lane, group = index < 6 ? "Major characters" : "Secondary characters" }).GroupBy(x => x.group))
{
@foreach (var laneItem in group)
{
var lane = laneItem.lane;
var characterFocusClass = Model.Filter.FocusType == "character" && Model.Filter.FocusID.HasValue && Model.Filter.FocusID != lane.Character.CharacterID ? "lane-dim" : "";
@foreach (var column in timelineColumns)
{
if (column.Scene is not Scene realCharacterScene)
{
continue;
}
var slot = lane.SceneSlots.FirstOrDefault(x => x.Scene.SceneID == realCharacterScene.SceneID);
Add scenes to begin seeing emotional and pacing shape.
}
else
{
Compare selected metrics across the same scene timeline. Click a point to focus that scene.
Metric chart could not load. The raw metric rows are still available below.
Show raw metric rows
@foreach (var graph in Model.MetricGraphs)
{
@graph.MetricName
@foreach (var column in timelineColumns)
{
if (column.Scene is null)
{
No value
continue;
}
var point = graph.Points.FirstOrDefault(x => x.SceneID == column.Scene.SceneID);
if (point is null)
{
No value
continue;
}
@point.Value
}