Documentation ¶
Overview ¶
Package rt defines the runtime interfaces used to interact with the game world. We use interfaces rather than concrete implementations to decouple package dependencies.
Index ¶
- Variables
- func IsNilRecord(e error) bool
- func IsUnknown(e error) bool
- func UnknownField(target, field string) error
- func UnknownName(name string) error
- func UnknownObject(o string) error
- func UnknownResponse(v string) error
- func UnknownVariable(v string) error
- type Address
- type Aspect
- type Assignment
- type BoolEval
- type Cursor
- type Dotted
- type Execute
- type Field
- type Jump
- type Kind
- func (k *Kind) Ancestors() []string
- func (k *Kind) Aspect(i int) (ret Aspect)
- func (k *Kind) AspectIndex(aspect string) (ret int)
- func (k *Kind) Field(i int) (ret Field)
- func (k *Kind) FieldCount() int
- func (k *Kind) FieldIndex(n string) (ret int)
- func (k *Kind) FindAspectByTrait(trait string) int
- func (k *Kind) Implements(name string) bool
- func (k *Kind) Name() (ret string)
- type Kinds
- type NilRecord
- type Notifier
- type NumEval
- type NumListEval
- type PanicValue
- func (n PanicValue) Affinity() affine.Affinity
- func (n PanicValue) Any() any
- func (n PanicValue) Appends(Value) error
- func (n PanicValue) Bool() bool
- func (n PanicValue) FieldByName(string) (Value, error)
- func (n PanicValue) Float() float64
- func (Floats PanicValue) Floats() []float64
- func (n PanicValue) Index(int) Value
- func (n PanicValue) Int() int
- func (n PanicValue) Len() int
- func (n PanicValue) Record() *Record
- func (n PanicValue) Records() []*Record
- func (n PanicValue) SetFieldByName(string, Value) error
- func (n PanicValue) SetIndex(int, Value) error
- func (n PanicValue) Slice(i, j int) (Value, error)
- func (n PanicValue) Splice(start, end int, add Value) (Value, error)
- func (n PanicValue) String() string
- func (n PanicValue) Strings() []string
- func (n PanicValue) Type() string
- type Record
- func (d *Record) GetIndexedField(i int) (ret Value, err error)
- func (d *Record) GetNamedField(field string) (ret Value, err error)
- func (d *Record) HasValue(i int) (okay bool)
- func (d *Record) SetIndexedField(i int, val Value) (err error)
- func (d *Record) SetNamedField(field string, val Value) (err error)
- type RecordEval
- type RecordListEval
- type Reference
- type Rule
- type Runtime
- type Scope
- type TextEval
- type TextListEval
- type Unknown
- type Value
- func BoolFrom(v bool, subtype string) Value
- func BoolOf(v bool) Value
- func CopyValue(val Value) (ret Value)
- func FloatFrom(v float64, subtype string) Value
- func FloatOf(v float64) Value
- func FloatsFrom(vs []float64, subtype string) (ret Value)
- func FloatsOf(vs []float64) Value
- func IntFrom(v int, subtype string) Value
- func IntOf(v int) Value
- func RecordOf(v *Record) Value
- func RecordsFrom(vs []*Record, subtype string) (ret Value)
- func StringFrom(v string, subtype string) Value
- func StringOf(v string) Value
- func StringsFrom(vs []string, subtype string) (ret Value)
- func StringsOf(vs []string) Value
- func ZeroField(aff affine.Affinity, cls string, idx int) (ret Value, err error)
- func ZeroValue(aff affine.Affinity) (ret Value, err error)
Constants ¶
This section is empty.
Variables ¶
Functions ¶
func IsNilRecord ¶
func UnknownField ¶
func UnknownName ¶
func UnknownObject ¶
func UnknownResponse ¶
func UnknownVariable ¶
Types ¶
type Aspect ¶
the traits of any aspects behave like separate boolean fields; ex. if the list of fields contains a "colour" aspect with traits "red", "blue", "green" then the returned kind will respond to "colour", "red", "blue", and "green".
func MakeAspects ¶
given a set of fields which may contain aspects generate a list of traits. relies on the passed kinds database having types which inherit from kindOf.Aspect the fields of those types are the traits.
type Assignment ¶
Assignment accesses values in a generic way.
func AssignValue ¶ added in v0.24.7
func AssignValue(v Value) Assignment
wrap an existing value as an assigned value
type Cursor ¶ added in v0.24.6
type Cursor interface { CurrentValue() Value SetAtIndex(int, Value) error GetAtIndex(int) (Cursor, error) SetAtField(string, Value) error GetAtField(string) (Cursor, error) }
a value within an object, record, or list.
type Dotted ¶ added in v0.24.6
type Dotted interface { // read a value from the contents of the passed target. Peek(target Cursor) (Cursor, error) // write into the contents of the passed target. Poke(target Cursor, newValue Value) error }
a "pointer" into the contents of some as yet unspecified target: for example, a field for use with objects or records, or an index for use in lists.
type Field ¶
type Field struct { Name string // name of the field, unique within the kind Affinity affine.Affinity // one of the built in data types Type string `json:",omitempty"` // subtype; ex. kind for text types Init Assignment `json:",omitempty"` // default initialization }
member of a kind.
type Kind ¶
type Kind struct { // indicates ancestry, the name of this kind at the start, parent kinds to the right. // can be nil if anonymous Path []string // holds the accumulated fields of all ancestors. // parent fields to the *left*, more derived fields to the right. ( the reverse of path. ) // descendant kinds can have different initial assignments for the same named field. Fields []Field `json:",omitempty"` // a subset of fields for those containing traits // see MakeAspects. Aspects []Aspect `json:",omitempty"` // contains filtered or unexported fields }
used for tapestry objects and records a kind is a collection of fields with optional inheritance.
func (*Kind) Ancestors ¶
ancestors of this kind, the name of this kind at the head of the list. the slice isn't a copy; it should be treated as read-only. nil for anonymous kinds.
func (*Kind) AspectIndex ¶
func (*Kind) FieldCount ¶ added in v0.24.6
number of fields contained by this ( and all parent kinds )
func (*Kind) FieldIndex ¶
returns the index of the matching field; for traits, that's the index of its aspect. returns -1 if no matching field was found.
func (*Kind) FindAspectByTrait ¶
return the index of the aspect containing the passed trait
func (*Kind) Implements ¶
true if the kind has the named ancestor. ( this is a shortcut for testing the passed name in Path() )
type NilRecord ¶
type NilRecord struct { Class string // name of the record type that the field wants Field int // index of the field in its parent record }
returned when trying to generate the zero value of a field containing a record record fields are nil by default so that types are able to refer to themselves in go, types can use pointers for self references ( ex. struct LinkedList { Link *LinkedList } )
type Notifier ¶ added in v0.24.7
type Notifier struct { StartedScene func(domains []string) EndedScene func(domains []string) ChangedState func(noun, aspect, oldState, newState string) ChangedRelative func(a, b, rel string) }
Callbacks to listen for system level changes
type NumListEval ¶
NumListEval represents the computation of a series of numeric values.
type PanicValue ¶
type PanicValue struct{}
PanicValue is a PanicValue where every method panics except type and affinity.
func (PanicValue) Affinity ¶
func (n PanicValue) Affinity() affine.Affinity
Affinity returns a blank string.
func (PanicValue) Any ¶
func (n PanicValue) Any() any
func (PanicValue) FieldByName ¶
func (n PanicValue) FieldByName(string) (Value, error)
FieldByName panics
func (PanicValue) SetFieldByName ¶
func (n PanicValue) SetFieldByName(string, Value) error
SetFieldByName panics
type Record ¶
type Record struct { *Kind // contains filtered or unexported fields }
Record - provides access to named field/values pairs. The fields of a record are defined by its kind. Fields that are themselves records ( ie. sub-records ) start uninitialized. Trying to Get() an uninitialized record will result in a "NilRecord" error. safe.EnsureField() can use the Kinds database to create sub-records on demand.
func (*Record) GetIndexedField ¶
GetIndexedField panics if out of range. note: traits are never indexed fields ( although their aspect is ) Can return a NilRecord error for uninitialized record fields.
func (*Record) GetNamedField ¶
GetNamedField picks a value or trait from this record. Can return a NilRecord error for uninitialized record fields.
func (*Record) HasValue ¶
limited change detection ( a hack, basically, for determining whether patterns have written results )
func (*Record) SetIndexedField ¶
SetIndexedField - note this doesn't handle trait translation. Unlike the Value interface, this doesn't panic and it doesn't copy values. As a special case, passing a nil value will reset the field to its default.
type RecordEval ¶
RecordEval yields access to a set of fields and their values.
type RecordListEval ¶
RecordListEval represents the computation of a series of a set of fields.
type Reference ¶ added in v0.24.6
type Reference interface { // set the value at the current cursor. SetValue(newValue Value) (err error) // read the value of the current cursor. GetValue() (ret Value, err error) // peeks into the current cursor at the requested field or index. Dot(next Dotted) (ret Reference, err error) }
a value that might contain other values.
type Rule ¶
type Rule struct { Name string // controls the style of transition: // when true, stops processing of any other rules; otherwise moves to the next phase. // a stop before the main rule is considered a canceled action; // and the result of the action in that case is false. Stop bool // controls when a transitions happens Jump Jump // whether the rule needs to be updated // before jumping to the next phase ( ex. for counters ) Updates bool // a chain of if-else statements is considered an "optional" rule; // otherwise its considered a mandatory rule. // mandatory rules block other rules from running ( based on stop/stop ) // optional rules only block other rules if some part of the if chain tested true. Exe []Execute }
Rule triggers a named series of statements when its filters and phase are satisfied. stopping before the action happens is considered a cancel.
type Runtime ¶
type Runtime interface { // ActivateDomain - objects are grouped into potentially hierarchical "domains". // de/activating makes those groups hidden/visible to the runtime. // Domain hierarchy is defined at assembly time. ActivateDomain(name string) error // GetKindByName - type description GetKindByName(name string) (*Kind, error) // Call - run the pattern defined by the passed record. // passes the expected return because patterns can be called in ambiguous context ( ex. template expressions ) Call(name string, expectedReturn affine.Affinity, keys []string, vals []Value) (Value, error) // RelativesOf - returns a list, even for one-to-one relationships. RelativesOf(a, relation string) (Value, error) // ReciprocalsOf - returns a list, even for one-to-one relationships. ReciprocalsOf(b, relation string) (Value, error) // RelateTo - establish a new relation between nouns and and b. RelateTo(a, b, relation string) error // PushScope - modifies the behavior of Get/SetField meta.Variable // by adding a set of variables to the current namespace. // ex. loops add iterators PushScope(Scope) // PopScope - remove the most recently added set of variables from the internal stack. PopScope() // GetField - various runtime objects (ex. nouns, kinds, etc.) store data addressed by name. // the objects and their fields depend on implementation and context. // see package meta for a variety of common objects. GetField(object, field string) (Value, error) // SetField - store, or at least attempt to store, a *copy* of the value into the field of the named object. // it can return an error: // if the value is not of a compatible type, // if the field is considered to read-only, // or if there is no object or field of the indicated names. SetField(object, field string, value Value) error // PluralOf - turn single words into their plural variants, and vice-versa. // each plural word maps to a unique singular. // for example, if the singular of "people" is "person", it cant also be "personage". PluralOf(single string) string // note: one plural word can map to multiple single words. // in that case the returned singular word is arbitrary ( if theoretically consistent ) // for example, "person" can have the plural "people" or "persons" and this could return either. SingularOf(plural string) string // Random - return a pseudo-random number. Random(inclusiveMin, exclusiveMax int) int // Writer which prints text to the player. // It's tempting to have this be Write() -- so callers can print directly to the runtime. // That doesn't work in practice because go interfaces aren't virtual functions. // Any runtime wrapper can get stripped off, and wind up writing to an unexpected implementation. Writer() io.Writer // SetWriter - Override the current writer. SetWriter(io.Writer) (prev io.Writer) SetNotifier(Notifier) (prev Notifier) }
Runtime environment for an in-progress game.
type Scope ¶
type Scope interface { // return g.Unknown if the named field/variable doesn't exist. FieldByName(field string) (Value, error) // set without copying SetFieldByName(field string, val Value) error }
Scope - establishes a pool of local variables. Scopes are usually accessed via the runtime Set/GetField.
type TextListEval ¶
TextListEval represents the computation of a series of strings.
type Unknown ¶
type Unknown struct {
Target, Field string
}
error for GetField, SetField
func (Unknown) IsUnknownField ¶
type Value ¶
type Value interface { // identifies how the passed value is represented internally. // ex. a number can be represented as float or as an int, // a record might be one of several different kinds, // text might represent an object id of a specific kind, an aspect, trait, or other value. Type() string // identifies the general category of the value. Affinity() affine.Affinity // return this value as a bool, or panic if the value isn't a bool. Bool() bool // return this value as a float, or panic if the value isn't a number. Float() float64 // return this value as an int, or panic if the value isn't a number. Int() int // return this value as a string; it doesn't panic. // for non-string values, similar to package reflect, it returns a string of the form "<type value>". String() string // return this value as a record, or panic if the value isn't a record. Record() *Record // return this value as a slice of floats, or panic if this isn't a float slice. // note: while primitive values support both ints and floats, slices can only be floats. Floats() []float64 // return this value as a slice of strings, or panic if this isn't a string slice. Strings() []string // return this value as a slice of records, or panic if not a record slice. // note: every value in the returned slice is expected to be record of this value's Type(). Records() []*Record // return a value representing a field inside this record. // if the field holds a record or a slice, the returned value shares its memory with the named field. // errors if note a record, or the field doesn't exist. FieldByName(string) (Value, error) // writes a *copy* of the passed value into a record. // errors if not a record, the field doesn't exist, or if its affinity cant support the passed value. SetFieldByName(string, Value) error // the number of elements in the value. // panics if this cant have a length: isnt a slice or a string. Len() int // return the nth element of this value, where 0 is the first value. // panics if this isn't a slice. Index(int) Value // writes a *copy* of the passed value into a slice // panics if this isn't a slice, if the index is out of range, or if the affinities are mismatched. // errors if the types are mismatched SetIndex(int, Value) error // adds a *copy* of a value, or a copy of a slice of values, to the end of this slice. // panics if this value isn't an appropriate kind of slice; errors on subtype. // In golang, this is a package level function, presumably to mirror the built-in append() Appends(Value) error // return a *copy* of this slice and its values containing the first index up to (and not including) the second index. // panics if this value isn't a slice. Slice(i, j int) (Value, error) // cut elements out of this slice from start to end, // adding copies of the passed additional elements (if any) at the start of the cut point. // Returns the cut elements, or an error if the start and end indices are bad. // panics if this value isn't a slice, or if additional element(s) are of an incompatible affinity. Splice(start, end int, add Value) (Value, error) }
Value represents any one of Tapestry's built in types.
func CopyValue ¶
CopyValue: create a new value from a snapshot of the passed value panics on error because it assumes all values should be copyable
func FloatsFrom ¶
func RecordsFrom ¶
func StringFrom ¶
func StringsFrom ¶
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
package kindsOf defines a handful of built-in base types for tapestry kinds.
|
package kindsOf defines a handful of built-in base types for tapestry kinds. |
Package meta provides string constants for rt.Runtime Get/SetField.
|
Package meta provides string constants for rt.Runtime Get/SetField. |
Package pattern provides tools for creating and executing functions with guards.
|
Package pattern provides tools for creating and executing functions with guards. |
Package print provides low level routines for styling output.
|
Package print provides low level routines for styling output. |