Skip to content
Merged
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
8 changes: 8 additions & 0 deletions pkg/engine/attribute/attribute.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,14 @@ type Getter interface {
FullEnergy(target key.TargetID) bool
LastAttacker(target key.TargetID) key.TargetID
SP() int
MaxSP() int
}

type Manager interface {
Getter

ModifySP(data info.ModifySP) error
ModifyMaxSP(data info.ModifySP) error

AddTarget(target key.TargetID, base info.Attributes) error

Expand All @@ -48,6 +50,7 @@ type Service struct {
modEval modifier.Eval
targets map[key.TargetID]*attrTarget
sp int
maxsp int
}

func New(event *event.System, modEval modifier.Eval) Manager {
Expand All @@ -56,6 +59,7 @@ func New(event *event.System, modEval modifier.Eval) Manager {
modEval: modEval,
targets: make(map[key.TargetID]*attrTarget, 10),
sp: 3,
maxsp: 5,
}
}

Expand Down Expand Up @@ -144,3 +148,7 @@ func (s *Service) LastAttacker(target key.TargetID) key.TargetID {
func (s *Service) SP() int {
return s.sp
}

func (s *Service) MaxSP() int {
return s.maxsp
}
12 changes: 12 additions & 0 deletions pkg/engine/attribute/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,15 @@ func (s *Service) emitSPChange(key key.Reason, source key.TargetID, prevSP, newS
}
return nil
}

func (s *Service) emitMaxSPChange(key key.Reason, source key.TargetID, prevMaxSP, newMaxSP int) error {
if prevMaxSP != newMaxSP {
s.event.MaxSPChange.Emit(event.MaxSPChange{
Key: key,
Source: source,
OldMaxSP: prevMaxSP,
NewMaxSP: newMaxSP,
})
}
return nil
}
17 changes: 15 additions & 2 deletions pkg/engine/attribute/modify.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,10 +193,23 @@ func (s *Service) ModifyEnergyFixed(data info.ModifyAttribute) error {
func (s *Service) ModifySP(data info.ModifySP) error {
old := s.sp
s.sp += data.Amount
if s.sp > 5 {
s.sp = 5
if s.sp > s.maxsp {
s.sp = s.maxsp
} else if s.sp < 0 {
s.sp = 0
}
return s.emitSPChange(data.Key, data.Source, old, s.sp)
}

func (s *Service) ModifyMaxSP(data info.ModifySP) error {
old := s.sp
s.maxsp += data.Amount
if s.sp > s.maxsp {
s.ModifySP(info.ModifySP{
Key: data.Key,
Source: data.Source,
Amount: s.maxsp - s.sp,
})
}
return s.emitMaxSPChange(data.Key, data.Source, old, s.maxsp)
}
8 changes: 8 additions & 0 deletions pkg/engine/event/attribute.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,11 @@ type SPChange struct {
OldSP int `json:"old_sp"`
NewSP int `json:"new_sp"`
}

type MaxSPChangeEventHandler = handler.EventHandler[MaxSPChange]
type MaxSPChange struct {
Key key.Reason `json:"key"`
Source key.TargetID `json:"source"`
OldMaxSP int `json:"old_max_sp"`
NewMaxSP int `json:"new_max_sp"`
}
1 change: 1 addition & 0 deletions pkg/engine/event/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ type System struct {
StanceBreak StanceBreakEventHandler
StanceReset StanceResetEventHandler
SPChange SPChangeEventHandler
MaxSPChange MaxSPChangeEventHandler

BreakExtend BreakExtendEventHandler

Expand Down
2 changes: 1 addition & 1 deletion pkg/engine/info/attribute.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ type ModifySP struct {
// The source of this modification
Source key.TargetID `json:"source"`

// The amount of SP to be added or removed
// The amount of SP or maximum SP to be added or removed
Amount int `json:"amount"`
}

Expand Down
8 changes: 8 additions & 0 deletions pkg/simulation/attribute.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,18 @@ func (sim *Simulation) ModifySP(data info.ModifySP) error {
return sim.Attr.ModifySP(data)
}

func (sim *Simulation) ModifyMaxSP(data info.ModifySP) error {
return sim.Attr.ModifyMaxSP(data)
}

func (sim *Simulation) SP() int {
return sim.Attr.SP()
}

func (sim *Simulation) MaxSP() int {
return sim.Attr.MaxSP()
}

func (sim *Simulation) Stats(target key.TargetID) *info.Stats {
return sim.Attr.Stats(target)
}
Expand Down
28 changes: 28 additions & 0 deletions tests/mock/mock_attribute.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 28 additions & 6 deletions ui/packages/types/src/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,22 @@ export interface SPChange {
old_sp: number /* int */;
new_sp: number /* int */;
}
export type MaxSPChangeEventHandler = Handler<MaxSPChange>;
export interface MaxSPChange {
key: string;
source: string;
old_max_sp: number /* int */;
new_max_sp: number /* int */;
}

//////////
// source: break.go

export type BreakExtendEventHandler = Handler<BreakExtend>;
export interface BreakExtend {
key: string;
target: string;
}

//////////
// source: combat.go
Expand Down Expand Up @@ -87,6 +103,7 @@ export interface HitStart {
export type HitEndEventHandler = Handler<HitEnd>;
export interface HitEnd {
key: string;
hit?: info.Hit;
hit_index: number /* int */;
attacker: string;
defender: string;
Expand Down Expand Up @@ -151,6 +168,11 @@ export interface ModifierRemoved {
target: string;
modifier: info.Modifier;
}
export type ModifierDispelledEventHandler = Handler<ModifierDispelled>;
export interface ModifierDispelled {
target: string;
modifier: info.Modifier;
}
export type ModifierExtendedDurationEventHandler = Handler<ModifierExtendedDuration>;
export interface ModifierExtendedDuration {
target: string;
Expand Down Expand Up @@ -298,27 +320,27 @@ export interface TurnTargetsAdded {
export type TurnResetEventHandler = Handler<TurnReset>;
export interface TurnReset {
reset_target: string;
gauge_cost: number /* float64 */;
gauge_cost: number /* int64 */;
turn_order: TurnStatus[];
}
export type GaugeChangeEventHandler = Handler<GaugeChange>;
export interface GaugeChange {
key: string;
target: string;
source: string;
old_gauge: number /* float64 */;
new_gauge: number /* float64 */;
old_gauge: number /* int64 */;
new_gauge: number /* int64 */;
turn_order: TurnStatus[];
}
export type CurrentGaugeCostChangeEventHandler = Handler<CurrentGaugeCostChange>;
export interface CurrentGaugeCostChange {
key: string;
source: string;
old_cost: number /* float64 */;
new_cost: number /* float64 */;
old_cost: number /* int64 */;
new_cost: number /* int64 */;
}
export interface TurnStatus {
id: string;
gauge: number /* float64 */;
gauge: number /* int64 */;
av: number /* float64 */;
}
14 changes: 10 additions & 4 deletions ui/packages/types/src/info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export interface ModifySP {
*/
source: string;
/**
* The amount of SP to be added or removed
* The amount of SP or maximum SP to be added or removed
*/
amount: number /* int */;
}
Expand Down Expand Up @@ -210,12 +210,12 @@ export interface Hit {
* The stats of the attacker of this hit. These stats are a snapshot of the target's state and
* can be modified
*/
attacker?: Stats;
attacker?: StatsEncoded;
/**
* The stats of the defender of this hit. These stats are a snapshot of the target's state and
* can be modified
*/
defender?: Stats;
defender?: StatsEncoded;
/**
* The type of attack (IE: dot, ult, insert, etc)
*/
Expand Down Expand Up @@ -351,7 +351,7 @@ export interface Modifier {
*/
duration: number /* int */;
/**
* When duration is > 0, the turn a modifier is added on will not count torwards the duration.
* When duration is > 0, the turn a modifier is added on will not count towards the duration.
* If this field is set to true, this will override that behavior and count the application turn
* against the duration (if application happens before the check).
*/
Expand Down Expand Up @@ -388,6 +388,12 @@ export interface Modifier {
* Any additional weaknesses that are applied to the target by this modifier.
*/
weakness: WeaknessMap;
/**
* CanDispel indicates whether the modifier can be removed through dispel effects.
* If true, the modifier can be targeted and removed by dispel abilities; if false (default),
* it is immune to dispel.
*/
can_dispel: boolean;
}
export interface Dispel {
/**
Expand Down
Loading