Skip to content

Commit 3967db0

Browse files
authored
Add Max SP logic (#347)
* Add Max SP logic * add Max SP to Manager * add methods `MaxSP`: returns Max SP * add `ModifyMaxSP`: modifies Max SP similarly to `ModifySP` with `Amount` field; no handling of error cases * add `MaxSPChange` event + emit * update `ModifySP` logic to use `maxsp` instead of fixed number * Rerun scripts * Reuse `ModifySP` struct and adjust SP if SP greater than new max SP * Rerun scripts
1 parent f2a58ea commit 3967db0

File tree

10 files changed

+119
-13
lines changed

10 files changed

+119
-13
lines changed

pkg/engine/attribute/attribute.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ type Getter interface {
2222
FullEnergy(target key.TargetID) bool
2323
LastAttacker(target key.TargetID) key.TargetID
2424
SP() int
25+
MaxSP() int
2526
}
2627

2728
type Manager interface {
2829
Getter
2930

3031
ModifySP(data info.ModifySP) error
32+
ModifyMaxSP(data info.ModifySP) error
3133

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

@@ -48,6 +50,7 @@ type Service struct {
4850
modEval modifier.Eval
4951
targets map[key.TargetID]*attrTarget
5052
sp int
53+
maxsp int
5154
}
5255

5356
func New(event *event.System, modEval modifier.Eval) Manager {
@@ -56,6 +59,7 @@ func New(event *event.System, modEval modifier.Eval) Manager {
5659
modEval: modEval,
5760
targets: make(map[key.TargetID]*attrTarget, 10),
5861
sp: 3,
62+
maxsp: 5,
5963
}
6064
}
6165

@@ -144,3 +148,7 @@ func (s *Service) LastAttacker(target key.TargetID) key.TargetID {
144148
func (s *Service) SP() int {
145149
return s.sp
146150
}
151+
152+
func (s *Service) MaxSP() int {
153+
return s.maxsp
154+
}

pkg/engine/attribute/event.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,15 @@ func (s *Service) emitSPChange(key key.Reason, source key.TargetID, prevSP, newS
7676
}
7777
return nil
7878
}
79+
80+
func (s *Service) emitMaxSPChange(key key.Reason, source key.TargetID, prevMaxSP, newMaxSP int) error {
81+
if prevMaxSP != newMaxSP {
82+
s.event.MaxSPChange.Emit(event.MaxSPChange{
83+
Key: key,
84+
Source: source,
85+
OldMaxSP: prevMaxSP,
86+
NewMaxSP: newMaxSP,
87+
})
88+
}
89+
return nil
90+
}

pkg/engine/attribute/modify.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,23 @@ func (s *Service) ModifyEnergyFixed(data info.ModifyAttribute) error {
193193
func (s *Service) ModifySP(data info.ModifySP) error {
194194
old := s.sp
195195
s.sp += data.Amount
196-
if s.sp > 5 {
197-
s.sp = 5
196+
if s.sp > s.maxsp {
197+
s.sp = s.maxsp
198198
} else if s.sp < 0 {
199199
s.sp = 0
200200
}
201201
return s.emitSPChange(data.Key, data.Source, old, s.sp)
202202
}
203+
204+
func (s *Service) ModifyMaxSP(data info.ModifySP) error {
205+
old := s.sp
206+
s.maxsp += data.Amount
207+
if s.sp > s.maxsp {
208+
s.ModifySP(info.ModifySP{
209+
Key: data.Key,
210+
Source: data.Source,
211+
Amount: s.maxsp - s.sp,
212+
})
213+
}
214+
return s.emitMaxSPChange(data.Key, data.Source, old, s.maxsp)
215+
}

pkg/engine/event/attribute.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,11 @@ type SPChange struct {
6565
OldSP int `json:"old_sp"`
6666
NewSP int `json:"new_sp"`
6767
}
68+
69+
type MaxSPChangeEventHandler = handler.EventHandler[MaxSPChange]
70+
type MaxSPChange struct {
71+
Key key.Reason `json:"key"`
72+
Source key.TargetID `json:"source"`
73+
OldMaxSP int `json:"old_max_sp"`
74+
NewMaxSP int `json:"new_max_sp"`
75+
}

pkg/engine/event/event.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ type System struct {
4848
StanceBreak StanceBreakEventHandler
4949
StanceReset StanceResetEventHandler
5050
SPChange SPChangeEventHandler
51+
MaxSPChange MaxSPChangeEventHandler
5152

5253
BreakExtend BreakExtendEventHandler
5354

pkg/engine/info/attribute.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ type ModifySP struct {
5959
// The source of this modification
6060
Source key.TargetID `json:"source"`
6161

62-
// The amount of SP to be added or removed
62+
// The amount of SP or maximum SP to be added or removed
6363
Amount int `json:"amount"`
6464
}
6565

pkg/simulation/attribute.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,18 @@ func (sim *Simulation) ModifySP(data info.ModifySP) error {
3535
return sim.Attr.ModifySP(data)
3636
}
3737

38+
func (sim *Simulation) ModifyMaxSP(data info.ModifySP) error {
39+
return sim.Attr.ModifyMaxSP(data)
40+
}
41+
3842
func (sim *Simulation) SP() int {
3943
return sim.Attr.SP()
4044
}
4145

46+
func (sim *Simulation) MaxSP() int {
47+
return sim.Attr.MaxSP()
48+
}
49+
4250
func (sim *Simulation) Stats(target key.TargetID) *info.Stats {
4351
return sim.Attr.Stats(target)
4452
}

tests/mock/mock_attribute.go

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ui/packages/types/src/event.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,22 @@ export interface SPChange {
5858
old_sp: number /* int */;
5959
new_sp: number /* int */;
6060
}
61+
export type MaxSPChangeEventHandler = Handler<MaxSPChange>;
62+
export interface MaxSPChange {
63+
key: string;
64+
source: string;
65+
old_max_sp: number /* int */;
66+
new_max_sp: number /* int */;
67+
}
68+
69+
//////////
70+
// source: break.go
71+
72+
export type BreakExtendEventHandler = Handler<BreakExtend>;
73+
export interface BreakExtend {
74+
key: string;
75+
target: string;
76+
}
6177

6278
//////////
6379
// source: combat.go
@@ -87,6 +103,7 @@ export interface HitStart {
87103
export type HitEndEventHandler = Handler<HitEnd>;
88104
export interface HitEnd {
89105
key: string;
106+
hit?: info.Hit;
90107
hit_index: number /* int */;
91108
attacker: string;
92109
defender: string;
@@ -151,6 +168,11 @@ export interface ModifierRemoved {
151168
target: string;
152169
modifier: info.Modifier;
153170
}
171+
export type ModifierDispelledEventHandler = Handler<ModifierDispelled>;
172+
export interface ModifierDispelled {
173+
target: string;
174+
modifier: info.Modifier;
175+
}
154176
export type ModifierExtendedDurationEventHandler = Handler<ModifierExtendedDuration>;
155177
export interface ModifierExtendedDuration {
156178
target: string;
@@ -298,27 +320,27 @@ export interface TurnTargetsAdded {
298320
export type TurnResetEventHandler = Handler<TurnReset>;
299321
export interface TurnReset {
300322
reset_target: string;
301-
gauge_cost: number /* float64 */;
323+
gauge_cost: number /* int64 */;
302324
turn_order: TurnStatus[];
303325
}
304326
export type GaugeChangeEventHandler = Handler<GaugeChange>;
305327
export interface GaugeChange {
306328
key: string;
307329
target: string;
308330
source: string;
309-
old_gauge: number /* float64 */;
310-
new_gauge: number /* float64 */;
331+
old_gauge: number /* int64 */;
332+
new_gauge: number /* int64 */;
311333
turn_order: TurnStatus[];
312334
}
313335
export type CurrentGaugeCostChangeEventHandler = Handler<CurrentGaugeCostChange>;
314336
export interface CurrentGaugeCostChange {
315337
key: string;
316338
source: string;
317-
old_cost: number /* float64 */;
318-
new_cost: number /* float64 */;
339+
old_cost: number /* int64 */;
340+
new_cost: number /* int64 */;
319341
}
320342
export interface TurnStatus {
321343
id: string;
322-
gauge: number /* float64 */;
344+
gauge: number /* int64 */;
323345
av: number /* float64 */;
324346
}

ui/packages/types/src/info.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export interface ModifySP {
7272
*/
7373
source: string;
7474
/**
75-
* The amount of SP to be added or removed
75+
* The amount of SP or maximum SP to be added or removed
7676
*/
7777
amount: number /* int */;
7878
}
@@ -210,12 +210,12 @@ export interface Hit {
210210
* The stats of the attacker of this hit. These stats are a snapshot of the target's state and
211211
* can be modified
212212
*/
213-
attacker?: Stats;
213+
attacker?: StatsEncoded;
214214
/**
215215
* The stats of the defender of this hit. These stats are a snapshot of the target's state and
216216
* can be modified
217217
*/
218-
defender?: Stats;
218+
defender?: StatsEncoded;
219219
/**
220220
* The type of attack (IE: dot, ult, insert, etc)
221221
*/
@@ -351,7 +351,7 @@ export interface Modifier {
351351
*/
352352
duration: number /* int */;
353353
/**
354-
* When duration is > 0, the turn a modifier is added on will not count torwards the duration.
354+
* When duration is > 0, the turn a modifier is added on will not count towards the duration.
355355
* If this field is set to true, this will override that behavior and count the application turn
356356
* against the duration (if application happens before the check).
357357
*/
@@ -388,6 +388,12 @@ export interface Modifier {
388388
* Any additional weaknesses that are applied to the target by this modifier.
389389
*/
390390
weakness: WeaknessMap;
391+
/**
392+
* CanDispel indicates whether the modifier can be removed through dispel effects.
393+
* If true, the modifier can be targeted and removed by dispel abilities; if false (default),
394+
* it is immune to dispel.
395+
*/
396+
can_dispel: boolean;
391397
}
392398
export interface Dispel {
393399
/**

0 commit comments

Comments
 (0)