Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pkg/engine/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ type Target interface {
Neutrals() []key.TargetID

// TODO: target type, (Light, Dark, Neutral)
AddNeutralTarget() key.TargetID
AddNeutralTarget(key key.NeutralTarget) key.TargetID

RemoveNeutralTarget(id key.TargetID)

Expand Down
4 changes: 4 additions & 0 deletions pkg/engine/info/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,7 @@ type ActionState interface {
type EnemyInstance interface {
Action(target key.TargetID, state ActionState)
}

type NeutralTargetInstance interface {
Attack(target key.TargetID, state ActionState)
}
11 changes: 11 additions & 0 deletions pkg/engine/info/neutral-target.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package info

import (
"github.com/simimpact/srsim/pkg/key"
"github.com/simimpact/srsim/pkg/model"
)

type NeutralTarget struct {
Key key.NeutralTarget `json:"key"`
Element model.DamageType `json:"element"`
}
25 changes: 25 additions & 0 deletions pkg/engine/target/neutral-target/add.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package neutraltarget

import (
"fmt"

"github.com/simimpact/srsim/pkg/engine/info"
"github.com/simimpact/srsim/pkg/key"
)

// TODO: Add some way for neutrals to refer back to their owners/summoners to use their stats?
func (mgr *Manager) AddNeutral(id key.TargetID, key key.NeutralTarget) error {
config, ok := neutralCatalog[key]
if !ok {
return fmt.Errorf("Invalid neutral target %v", key)
}

info := info.NeutralTarget{
Key: key,
Element: config.Element,
}

mgr.info[id] = info
mgr.instances[id] = config.Create(mgr.engine, id, info)
return nil
}
19 changes: 19 additions & 0 deletions pkg/engine/target/neutral-target/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package neutraltarget

import (
"github.com/simimpact/srsim/pkg/engine"
"github.com/simimpact/srsim/pkg/engine/info"
"github.com/simimpact/srsim/pkg/key"
"github.com/simimpact/srsim/pkg/model"
)

type Config struct {
Create func(engine engine.Engine, id key.TargetID, info info.NeutralTarget) info.NeutralTargetInstance
Attack Attack
Speed float64
Element model.DamageType
}

type Attack struct {
TargetType model.TargetType
}
57 changes: 57 additions & 0 deletions pkg/engine/target/neutral-target/manager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package neutraltarget

import (
"fmt"

"github.com/simimpact/srsim/pkg/engine"
"github.com/simimpact/srsim/pkg/engine/attribute"
"github.com/simimpact/srsim/pkg/engine/info"
"github.com/simimpact/srsim/pkg/key"
"github.com/simimpact/srsim/pkg/logic"
)

type Manager struct {
engine engine.Engine
attr attribute.Manager
eval logic.Eval
instances map[key.TargetID]info.NeutralTargetInstance
info map[key.TargetID]info.NeutralTarget
}

func New(engine engine.Engine, attr attribute.Manager, eval logic.Eval) *Manager {
return &Manager{
engine: engine,
attr: attr,
eval: eval,
instances: make(map[key.TargetID]info.NeutralTargetInstance, 4),
info: make(map[key.TargetID]info.NeutralTarget, 4),
}
}

func (mgr *Manager) Get(id key.TargetID) (info.NeutralTargetInstance, error) {
if instance, ok := mgr.instances[id]; ok {
return instance, nil
}

return nil, fmt.Errorf("Target id was not a neutral target: %v", id)
}

func (mgr *Manager) Info(id key.TargetID) (info.NeutralTarget, error) {
if info, ok := mgr.info[id]; ok {
return info, nil
}

return info.NeutralTarget{}, fmt.Errorf("Target id was not a neutral target: %v", id)
}

func (mgr *Manager) Neutrals() map[key.TargetID]info.NeutralTarget {
return mgr.info
}

func (mgr *Manager) AttackInfo(id key.TargetID) (Attack, error) {
if target, ok := mgr.info[id]; ok {
return neutralCatalog[target.Key].Attack, nil
}

return Attack{}, fmt.Errorf("Id was not a neutral %v", id)
}
27 changes: 27 additions & 0 deletions pkg/engine/target/neutral-target/register.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package neutraltarget

import (
"sync"

"github.com/simimpact/srsim/pkg/key"
)

var (
mu sync.Mutex
neutralCatalog = make(map[key.NeutralTarget]Config)
)

func Register(key key.NeutralTarget, neutral Config) {
mu.Lock()
defer mu.Unlock()

if _, dup := neutralCatalog[key]; dup {
panic("duplicate registration attempt: " + key)
}

if neutral.Create == nil {
panic("Neutral create function must be defined: " + key)
}

neutralCatalog[key] = neutral
}
8 changes: 8 additions & 0 deletions pkg/key/neutral-target.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package key

type NeutralTarget string

const (
LightningLord NeutralTarget = "lightninglord"
Numby NeutralTarget = "Numby"
)
Loading