@model CharacterDetailViewModel @{ ViewData["Title"] = Model.Character.CharacterName; var firstAppearance = Model.Appearances.FirstOrDefault(); var storyImportance = Model.Character.CharacterImportance switch { >= 8 => "Major", >= 4 => "Secondary / Supporting", >= 1 => "Minor", _ => "Timeline fallback" }; }
Project context @Model.Project.ProjectName

Character

@Model.Character.CharacterName

@Model.Character.DefaultDescription

Characters Back to timeline Character arc Knowledge timeline Export character Markdown Edit character
@if (TempData["RelationshipMessage"] is string relationshipMessage) {
@relationshipMessage
}

Profile

Short name: @Model.Character.ShortName

Sex: @Model.Character.Sex

Age: @Model.DisplayAge

Height: @Model.Character.Height

Eye colour: @Model.Character.EyeColour

Story importance: @storyImportance

Initial Relationships

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

No initial relationships yet.

} else {
@foreach (var categoryGroup in Model.InitialRelationships.GroupBy(x => new { x.RelationshipCategoryName, x.CategorySortOrder }).OrderBy(x => x.Key.CategorySortOrder).ThenBy(x => x.Key.RelationshipCategoryName)) {

@categoryGroup.Key.RelationshipCategoryName

@foreach (var relationship in categoryGroup.OrderBy(x => x.RelationshipTypeSortOrder).ThenBy(x => x.CharacterAName).ThenBy(x => x.CharacterBName)) { var initialSourceId = relationship.CharacterAID; var initialRelatedId = relationship.CharacterBID;
@relationship.CharacterAName -> @relationship.CharacterBName @relationship.RelationshipTypeName @relationship.RelationshipCategoryName Reciprocal: @(relationship.IsReciprocal ? "Yes" : "No") Reader initially knows: @(relationship.ReaderInitiallyKnows ? "Yes" : "No") @if (!string.IsNullOrWhiteSpace(relationship.InitialRelationshipStateName) || relationship.InitialIntensity.HasValue) { @relationship.InitialRelationshipStateName@if (relationship.InitialIntensity.HasValue) { / Intensity @relationship.InitialIntensity } } @if (!string.IsNullOrWhiteSpace(relationship.InitialBookTitle)) { Initial book: @relationship.InitialBookTitle } @if (!string.IsNullOrWhiteSpace(relationship.Notes)) { @relationship.Notes } Open related character Evolution
Edit
} }
}
Add initial relationship

Current Relationships

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

No current relationship state yet.

} else {
@foreach (var categoryGroup in Model.CurrentRelationships.GroupBy(x => new { x.Relationship.RelationshipCategoryName, x.Relationship.CategorySortOrder }).OrderBy(x => x.Key.CategorySortOrder).ThenBy(x => x.Key.RelationshipCategoryName)) {

@categoryGroup.Key.RelationshipCategoryName

@foreach (var current in categoryGroup.OrderBy(x => x.Relationship.RelationshipTypeSortOrder).ThenBy(x => x.Relationship.CharacterAName).ThenBy(x => x.Relationship.CharacterBName)) { var relationship = current.Relationship; var relatedCharacterId = relationship.CharacterAID == Model.Character.CharacterID ? relationship.CharacterBID : relationship.CharacterAID; var relatedCharacterName = relationship.CharacterAID == Model.Character.CharacterID ? relationship.CharacterBName : relationship.CharacterAName;
@relatedCharacterName @relationship.RelationshipTypeName @relationship.RelationshipCategoryName / Current: @current.CurrentStateName Reciprocal: @(relationship.IsReciprocal ? "Yes" : "No") / Confidence / intensity: @(current.CurrentIntensity?.ToString() ?? "Unknown") @if (!string.IsNullOrWhiteSpace(current.CurrentNotes)) { @current.CurrentNotes } Open related character Evolution
View History
Initial: @relationship.RelationshipTypeName @relationship.RelationshipCategoryName @(relationship.InitialRelationshipStateName ?? "No awareness state")@if (relationship.InitialIntensity.HasValue) { / Intensity @relationship.InitialIntensity } Reader initially knows: @(relationship.ReaderInitiallyKnows ? "Yes" : "No") @if (!string.IsNullOrWhiteSpace(relationship.Notes)) { @relationship.Notes }
@foreach (var item in current.Events) {
@item.BookTitle / Ch @item.ChapterNumber / Scene @item.SceneNumber: @item.SceneTitle @item.RelationshipStateName @item.RelationshipCategoryName / Intensity @(item.Intensity?.ToString() ?? "Unknown") Awareness: @(item.IsKnownToOtherCharacter ? "known to other character" : "not known to other character") @if (!string.IsNullOrWhiteSpace(item.Description)) { @item.Description } Open scene
}
Current: @current.CurrentStateName Confidence / intensity: @(current.CurrentIntensity?.ToString() ?? "Unknown")
} }
}

Relationship Events

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

No relationship events yet.

} else {
@foreach (var item in Model.RelationshipEvents) {
@item.CharacterAName -> @item.CharacterBName: @item.RelationshipStateName @item.BookTitle / Ch @item.ChapterNumber / Scene @item.SceneNumber: @item.SceneTitle @item.RelationshipTypeName @item.RelationshipCategoryName / Awareness: @(item.IsKnownToOtherCharacter ? "known to other character" : "not known to other character") Reciprocal: @(item.IsReciprocal ? "Yes" : "No") / Confidence / intensity: @(item.Intensity?.ToString() ?? "Unknown") @if (!string.IsNullOrWhiteSpace(item.Description)) { @item.Description } Open in timeline Open related character
}
}

Scene appearances

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

No scene appearances yet.

} else {
@foreach (var appearance in Model.Appearances) {
@appearance.BookTitle / Ch @appearance.ChapterNumber / Scene @appearance.SceneNumber: @appearance.SceneTitle @appearance.RoleInSceneTypeName / @appearance.PresenceTypeName @appearance.OutfitDescription @appearance.PhysicalCondition @appearance.EmotionalState Open in timeline
}
}

Attribute history

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

No attribute events yet.

} else {
@foreach (var item in Model.AttributeEvents) {
@item.AttributeName: @item.AttributeValue @item.BookTitle / Ch @item.ChapterNumber / Scene @item.SceneNumber: @item.SceneTitle @item.Description Open in timeline
}
}

Knowledge

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

No knowledge entries yet.

} else {
@foreach (var item in Model.KnowledgeItems) {
@item.KnowledgeStateName: @(item.AssetName ?? item.ThreadTitle) @item.BookTitle / Ch @item.ChapterNumber / Scene @item.SceneNumber: @item.SceneTitle @item.Description Open in timeline
}
}