Adds reactions, lair actions, and regional actions to the editor and monster display.

This commit is contained in:
2021-04-04 17:48:06 -07:00
parent 0ac780c188
commit e7ccc0e1ab
2 changed files with 107 additions and 35 deletions

View File

@@ -11,9 +11,6 @@ import SwiftUI
struct EditMonster: View {
// TODO: Add challengeRating/challengeRatingEnum and customChallengeRating maybe in basicInfo
// TODO: Add a way to edit the monster being blind. Probably a header section to the senses section.
// TODO: Add a way to edit lair actions
// TODO: Add a way to edit regional actions
// TODO: Add a way to edit reactions
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@Environment(\.managedObjectContext) private var viewContext
@@ -51,24 +48,39 @@ struct EditMonster: View {
NavigationLink(
"Condition Immunities",
destination: EditStrings(viewModel: monsterViewModel, path: \.conditionImmunities, title: "Condition Immunities"))
destination: EditStrings(
viewModel: monsterViewModel,
path: \.conditionImmunities,
title: "Condition Immunities"))
NavigationLink(
"Damage Immunities",
destination: EditStrings(viewModel: monsterViewModel, path: \.damageImmunities, title: "Damage Immunities"))
destination: EditStrings(
viewModel: monsterViewModel,
path: \.damageImmunities,
title: "Damage Immunities"))
NavigationLink(
"Damage Resistances",
destination: EditStrings(viewModel: monsterViewModel, path: \.damageResistances, title: "Damage Resistances"))
destination: EditStrings(
viewModel: monsterViewModel,
path: \.damageResistances,
title: "Damage Resistances"))
NavigationLink(
"Damage Vulnerabilities",
destination: EditStrings(viewModel: monsterViewModel, path: \.damageVulnerabilities, title: "Damage Vulnerabilities"))
destination: EditStrings(
viewModel: monsterViewModel,
path: \.damageVulnerabilities,
title: "Damage Vulnerabilities"))
}
Group {
NavigationLink(
"Senses",
destination: EditStrings(viewModel: monsterViewModel, path: \.senses, title: "Senses"))
destination: EditStrings(
viewModel: monsterViewModel,
path: \.senses,
title: "Senses"))
NavigationLink(
"Languages",
@@ -79,15 +91,46 @@ struct EditMonster: View {
destination: EditChallengeRating(viewModel: monsterViewModel))
NavigationLink(
"Abilities", destination: EditTraits(viewModel: monsterViewModel, path: \.abilities, title: "Abilities"))
"Abilities",
destination: EditTraits(
viewModel: monsterViewModel,
path: \.abilities,
title: "Abilities"))
NavigationLink(
"Actions",
destination: EditTraits(viewModel: monsterViewModel, path: \.actions, title: "Actions"))
destination: EditTraits(
viewModel: monsterViewModel,
path: \.actions,
title: "Actions"))
NavigationLink(
"Reactions",
destination: EditTraits(
viewModel: monsterViewModel,
path: \.reactions,
title: "Reactions"))
NavigationLink(
"Legendary Actions",
destination: EditTraits(viewModel: monsterViewModel, path: \.legendaryActions, title: "Legendary Actions"))
destination: EditTraits(
viewModel: monsterViewModel,
path: \.legendaryActions,
title: "Legendary Actions"))
NavigationLink(
"Lair Actions",
destination: EditTraits(
viewModel: monsterViewModel,
path: \.lairActions,
title: "Lair Actions"))
NavigationLink(
"Regional Actions",
destination: EditTraits(
viewModel: monsterViewModel,
path: \.regionalActions,
title: "Regional Actions"))
}
}

View File

@@ -205,10 +205,30 @@ struct SavingThrowsAndSkillsView: View {
}
}
struct TraitList: View {
var title: String
var traits: [AbilityViewModel]
var viewModel: MonsterViewModel
var body: some View {
VStack(alignment: .leading) {
Text(title)
.font(.system(size: 20, weight: .bold))
ForEach(traits) { action in
VStack {
Markdown(Document(action.renderedText(viewModel)))
Divider()
}
}
}
}
}
struct MonsterDetailView: View {
let kTextColor = Color(hex: 0x982818)
var viewModel: MonsterViewModel
@ObservedObject var viewModel: MonsterViewModel
var body: some View {
let monsterLanguagesDescription = viewModel.languagesDescription
@@ -259,30 +279,42 @@ struct MonsterDetailView: View {
// Actions
if (viewModel.actions.count > 0) {
VStack(alignment: .leading) {
Text("Actions")
.font(.system(size: 24, weight: .bold))
ForEach(viewModel.actions) { action in
VStack {
Markdown(Document(action.renderedText(viewModel)))
Divider()
}
}
}
TraitList(
title:"Actions",
traits: viewModel.actions,
viewModel: viewModel)
}
// Reactions
if (viewModel.reactions.count > 0) {
TraitList(
title:"Reactions",
traits: viewModel.reactions,
viewModel: viewModel)
}
// Legendary Actions
if (viewModel.legendaryActions.count > 0) {
VStack(alignment: .leading) {
Text("Legendary Actions")
.font(.system(size: 20, weight: .bold))
ForEach(viewModel.legendaryActions) { action in
VStack {
Markdown(Document(action.renderedText(viewModel)))
Divider()
}
}
}
TraitList(
title:"Legendary Actions",
traits: viewModel.legendaryActions,
viewModel: viewModel)
}
// Lair Actions
if (viewModel.lairActions.count > 0) {
TraitList(
title: "Lair Actions",
traits: viewModel.lairActions,
viewModel: viewModel)
}
// Regional Actions
if (viewModel.regionalActions.count > 0) {
TraitList(
title: "Regional Actions",
traits: viewModel.regionalActions,
viewModel: viewModel)
}
}
}
@@ -294,9 +326,6 @@ struct MonsterDetailView: View {
struct MonsterDetailWrapper: View {
// TODO: Add display for when the monster is blind
// TODO: Add display for lair actions
// TODO: Add display for regional actions
// TODO: Add display for reactions
let kTextColor: Color = Color(hex: 0x982818)
@ObservedObject var monster: Monster