/
trait_prereq.go
123 lines (112 loc) · 3.35 KB
/
trait_prereq.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Copyright ©1998-2023 by Richard A. Wilkes. All rights reserved.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, version 2.0. If a copy of the MPL was not distributed with
* this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This Source Code Form is "Incompatible With Secondary Licenses", as
* defined by the Mozilla Public License, version 2.0.
*/
package gurps
import (
"github.com/richardwilkes/gcs/v5/model/fxp"
"github.com/richardwilkes/gcs/v5/model/gurps/enums/prereq"
"github.com/richardwilkes/toolbox/i18n"
"github.com/richardwilkes/toolbox/xio"
)
var _ Prereq = &TraitPrereq{}
// TraitPrereq holds a prereq against a Trait.
type TraitPrereq struct {
Parent *PrereqList `json:"-"`
Type prereq.Type `json:"type"`
Has bool `json:"has"`
NameCriteria StringCriteria `json:"name,omitempty"`
LevelCriteria NumericCriteria `json:"level,omitempty"`
NotesCriteria StringCriteria `json:"notes,omitempty"`
}
// NewTraitPrereq creates a new TraitPrereq.
func NewTraitPrereq() *TraitPrereq {
return &TraitPrereq{
Type: prereq.Trait,
NameCriteria: StringCriteria{
StringCriteriaData: StringCriteriaData{
Compare: IsString,
},
},
LevelCriteria: NumericCriteria{
NumericCriteriaData: NumericCriteriaData{
Compare: AtLeastNumber,
},
},
NotesCriteria: StringCriteria{
StringCriteriaData: StringCriteriaData{
Compare: AnyString,
},
},
Has: true,
}
}
// PrereqType implements Prereq.
func (a *TraitPrereq) PrereqType() prereq.Type {
return a.Type
}
// ParentList implements Prereq.
func (a *TraitPrereq) ParentList() *PrereqList {
return a.Parent
}
// Clone implements Prereq.
func (a *TraitPrereq) Clone(parent *PrereqList) Prereq {
clone := *a
clone.Parent = parent
return &clone
}
// FillWithNameableKeys implements Prereq.
func (a *TraitPrereq) FillWithNameableKeys(m map[string]string) {
Extract(a.NameCriteria.Qualifier, m)
Extract(a.NotesCriteria.Qualifier, m)
}
// ApplyNameableKeys implements Prereq.
func (a *TraitPrereq) ApplyNameableKeys(m map[string]string) {
a.NameCriteria.Qualifier = Apply(a.NameCriteria.Qualifier, m)
a.NotesCriteria.Qualifier = Apply(a.NotesCriteria.Qualifier, m)
}
// Satisfied implements Prereq.
func (a *TraitPrereq) Satisfied(entity *Entity, exclude any, tooltip *xio.ByteBuffer, prefix string, _ *bool) bool {
satisfied := false
Traverse(func(t *Trait) bool {
if exclude == t || !a.NameCriteria.Matches(t.Name) {
return false
}
notes := t.Notes()
if modNotes := t.ModifierNotes(); modNotes != "" {
notes += "\n" + modNotes
}
if !a.NotesCriteria.Matches(notes) {
return false
}
var levels fxp.Int
if t.IsLeveled() {
levels = t.Levels.Max(0)
}
satisfied = a.LevelCriteria.Matches(levels)
return satisfied
}, true, false, entity.Traits...)
if !a.Has {
satisfied = !satisfied
}
if !satisfied && tooltip != nil {
tooltip.WriteString(prefix)
tooltip.WriteString(HasText(a.Has))
tooltip.WriteString(i18n.Text(" a trait whose name "))
tooltip.WriteString(a.NameCriteria.String())
if a.NotesCriteria.Compare != AnyString {
tooltip.WriteString(i18n.Text(", notes "))
tooltip.WriteString(a.NotesCriteria.String())
tooltip.WriteByte(',')
}
tooltip.WriteString(i18n.Text(" and level "))
tooltip.WriteString(a.LevelCriteria.String())
}
return satisfied
}