Up to Main Index Up to Journal for January, 2015
JOURNAL FOR TUESDAY 13TH JANUARY, 2015
______________________________________________________________________________
SUBJECT: Things are just a sum of their attributes
DATE: Tue 13 Jan 20:26:19 GMT 2015
I've been a little lax recently with the journal due to having too much fun
coding on WolfMUD-mini :) It's turning out quite different from what I had
planned[1].
I now have a core Thing type which is a slice of attribute interfaces:
type thing struct {
a []has.Attribute
}
type Attribute interface {
Parent() Thing
SetParent(Thing)
}
To make implementing an Attribute easy there is an embeddable parent type
which just implements an Attribute for you:
type parent struct {
p has.Thing
}
func (p *parent) Parent() has.Thing {
return p.p
}
func (p *parent) SetParent(t has.Thing) {
p.p = t
}
So we have a Thing which has a slice of Attributes and each attribute can
refer back to it's parent (the Thing) by calling Parent(). This enables
attributes to refer to each other if they need to.
A simple Attribute is the name attribute:
type name struct {
parent
name string
}
func NewName(n string) *name {
return &name{parent{}, n}
}
func (n *name) Name() string {
return n.name
}
There are similar description and alias attributes. Putting everything
together we can create simple items such as:
attr.Thing(
attr.NewName("some cheese"),
attr.NewDescription("This is a chunk of very hard cheese."),
attr.NewAlias("cheese"),
)
For something a little more complicated how about a mug of coffee?
attr.Thing(
attr.NewName("a mug"),
attr.NewDescription("This is a large mug."),
attr.NewAlias("mug"),
attr.NewInventory(
attr.Thing(
attr.NewName("some coffee"),
attr.NewDescription("This is some hot, strong coffee."),
),
),
)
Hmmm, coffee, nice ;) You can also add, remove and modify attributes on the
fly at runtime. So you could, as a simple example, dip a dart into a poison
bottle and transfer the 'poison' attribute to the dart and create a poison
dart or a poison dagger, even a poison banana I guess...
We now have items created by stuffing attributes into things. What glues
everything together are the commands. They behave in a very Go like way now:
if a Thing has this or these attributes you can do this with it.
For now that's it. Next time I'll describe commands in detail and how they are
currently being implemented.
--
Diddymus
[1] See towards the end of: ../../2014/12/22.html
Up to Main Index Up to Journal for January, 2015