horsegen: skill activation duration scaling

This commit is contained in:
2026-02-15 10:39:03 -05:00
parent e3903e5312
commit e608363a24
9 changed files with 1169 additions and 47 deletions

38
horse/durscale_string.go Normal file
View File

@@ -0,0 +1,38 @@
// Code generated by "stringer -type DurScale -trimprefix Duration -linecomment"; DO NOT EDIT.
package horse
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[DurationDirect-1]
_ = x[DurationFrontDistance-2]
_ = x[DurationRemainingHP-3]
_ = x[DurationIncrementPass-4]
_ = x[DurationMidSideBlock-5]
_ = x[DurationRemainingHP2-7]
}
const (
_DurScale_name_0 = "directlyscaling with distance from the frontscaling with remaining HPincreasing with each pass while activescaling with mid-race phase blocked side time"
_DurScale_name_1 = "scaling with remaining HP"
)
var (
_DurScale_index_0 = [...]uint8{0, 8, 44, 69, 107, 152}
)
func (i DurScale) String() string {
switch {
case 1 <= i && i <= 5:
i -= 1
return _DurScale_name_0[_DurScale_index_0[i]:_DurScale_index_0[i+1]]
case i == 7:
return _DurScale_name_1
default:
return "DurScale(" + strconv.FormatInt(int64(i), 10) + ")"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -46,6 +46,7 @@ type Activation struct {
Precondition string Precondition string
Condition string Condition string
Duration TenThousandths Duration TenThousandths
DurScale DurScale
Cooldown TenThousandths Cooldown TenThousandths
Abilities []Ability Abilities []Ability
} }
@@ -126,6 +127,18 @@ func (a Ability) String() string {
return string(r) return string(r)
} }
type DurScale int8
//go:generate go run golang.org/x/tools/cmd/stringer@v0.41.0 -type DurScale -trimprefix Duration -linecomment
const (
DurationDirect DurScale = 1 // directly
DurationFrontDistance DurScale = 2 // scaling with distance from the front
DurationRemainingHP DurScale = 3 // scaling with remaining HP
DurationIncrementPass DurScale = 4 // increasing with each pass while active
DurationMidSideBlock DurScale = 5 // scaling with mid-race phase blocked side time
DurationRemainingHP2 DurScale = 7 // scaling with remaining HP
)
type AbilityType int8 type AbilityType int8
//go:generate go run golang.org/x/tools/cmd/stringer@v0.41.0 -type AbilityType -trimprefix Ability -linecomment //go:generate go run golang.org/x/tools/cmd/stringer@v0.41.0 -type AbilityType -trimprefix Ability -linecomment

View File

@@ -85,17 +85,40 @@ pub struct activation
precondition: condition precondition: condition
condition: condition condition: condition
duration: decimal // seconds duration: decimal // seconds
dur-scale: dur-scale
cooldown: decimal // seconds cooldown: decimal // seconds
abilities: list<ability> // one to three elements abilities: list<ability> // one to three elements
pub fun activation/show(a: activation, ?character/show: (character-id) -> string): string pub fun activation/show(a: activation, ?character/show: (character-id) -> string): string
match a match a
Activation("", condition, duration, _, abilities) | !duration.is-pos -> condition ++ " -> " ++ abilities.show Activation("", condition, duration, _, _, abilities) | !duration.is-pos -> condition ++ " -> " ++ abilities.show
Activation("", condition, duration, cooldown, abilities) | cooldown >= 500.decimal -> condition ++ " -> for " ++ duration.show ++ "s, " ++ abilities.show Activation("", condition, duration, Direct-Dur, cooldown, abilities) | cooldown >= 500.decimal -> condition ++ " -> for " ++ duration.show ++ "s, " ++ abilities.show
Activation("", condition, duration, cooldown, abilities) -> condition ++ " -> for " ++ duration.show ++ "s on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show Activation("", condition, duration, dur-scale, cooldown, abilities) | cooldown >= 500.decimal -> condition ++ " -> for " ++ duration.show ++ "s " ++ dur-scale.show ++ ", " ++ abilities.show
Activation(precondition, condition, duration, _, abilities) | !duration.is-pos -> precondition ++ " -> " ++ condition ++ " -> " ++ abilities.show Activation("", condition, duration, Direct-Dur, cooldown, abilities) -> condition ++ " -> for " ++ duration.show ++ "s on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show
Activation(precondition, condition, duration, cooldown, abilities) | cooldown >= 500.decimal -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s, " ++ abilities.show Activation("", condition, duration, dur-scale, cooldown, abilities) -> condition ++ " -> for " ++ duration.show ++ "s " ++ dur-scale.show ++ " on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show
Activation(precondition, condition, duration, cooldown, abilities) -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show Activation(precondition, condition, duration, _, _, abilities) | !duration.is-pos -> precondition ++ " -> " ++ condition ++ " -> " ++ abilities.show
Activation(precondition, condition, duration, Direct-Dur, cooldown, abilities) | cooldown >= 500.decimal -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s, " ++ abilities.show
Activation(precondition, condition, duration, dur-scale, cooldown, abilities) | cooldown >= 500.decimal -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s " ++ dur-scale.show ++ ", " ++ abilities.show
Activation(precondition, condition, duration, Direct-Dur, cooldown, abilities) -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show
Activation(precondition, condition, duration, dur-scale, cooldown, abilities) -> precondition ++ " -> " ++ condition ++ " -> for " ++ duration.show ++ "s " ++ dur-scale.show ++ " on " ++ cooldown.show ++ "s cooldown, " ++ abilities.show
// Special scaling types for skill activation durations.
pub type dur-scale
Direct-Dur
Front-Distance-Dur
Multiply-Remaining-HP
Increment-Pass
Midrace-Side-Block-Time-Dur
Multiply-Remaining-HP2
pub fun dur-scale/show(s: dur-scale): string
match s
Direct-Dur -> "with no scaling"
Front-Distance-Dur -> "scaling with distance from the front"
Multiply-Remaining-HP -> "scaling with remaining HP"
Increment-Pass -> "increasing with each pass while active"
Midrace-Side-Block-Time-Dur -> "scaling with mid-race phase blocked side time"
Multiply-Remaining-HP2 -> "scaling with remaining HP"
// Effects of activating a skill. // Effects of activating a skill.
pub struct ability pub struct ability

View File

@@ -216,6 +216,7 @@ type SkillActivation struct {
Precondition string Precondition string
Condition string Condition string
Duration int Duration int
DurScale int
Cooldown int Cooldown int
Abilities [3]SkillAbility Abilities [3]SkillAbility
} }
@@ -264,67 +265,69 @@ func Skills(ctx context.Context, db *sqlitex.Pool) ([]Skill, error) {
Precondition: stmt.ColumnText(9), Precondition: stmt.ColumnText(9),
Condition: stmt.ColumnText(10), Condition: stmt.ColumnText(10),
Duration: stmt.ColumnInt(11), Duration: stmt.ColumnInt(11),
Cooldown: stmt.ColumnInt(12), DurScale: stmt.ColumnInt(12),
Cooldown: stmt.ColumnInt(13),
Abilities: [3]SkillAbility{ Abilities: [3]SkillAbility{
{ {
Type: stmt.ColumnInt(13), Type: stmt.ColumnInt(14),
ValueUsage: stmt.ColumnInt(14), ValueUsage: stmt.ColumnInt(15),
Value: stmt.ColumnInt(15), Value: stmt.ColumnInt(16),
Target: stmt.ColumnInt(16), Target: stmt.ColumnInt(17),
TargetValue: stmt.ColumnInt(17), TargetValue: stmt.ColumnInt(18),
}, },
{ {
Type: stmt.ColumnInt(18), Type: stmt.ColumnInt(19),
ValueUsage: stmt.ColumnInt(19), ValueUsage: stmt.ColumnInt(20),
Value: stmt.ColumnInt(20), Value: stmt.ColumnInt(21),
Target: stmt.ColumnInt(21), Target: stmt.ColumnInt(22),
TargetValue: stmt.ColumnInt(22), TargetValue: stmt.ColumnInt(23),
}, },
{ {
Type: stmt.ColumnInt(23), Type: stmt.ColumnInt(24),
ValueUsage: stmt.ColumnInt(24), ValueUsage: stmt.ColumnInt(25),
Value: stmt.ColumnInt(25), Value: stmt.ColumnInt(26),
Target: stmt.ColumnInt(26), Target: stmt.ColumnInt(27),
TargetValue: stmt.ColumnInt(27), TargetValue: stmt.ColumnInt(28),
}, },
}, },
}, },
{ {
Precondition: stmt.ColumnText(28), Precondition: stmt.ColumnText(29),
Condition: stmt.ColumnText(29), Condition: stmt.ColumnText(30),
Duration: stmt.ColumnInt(30), Duration: stmt.ColumnInt(31),
Cooldown: stmt.ColumnInt(31), DurScale: stmt.ColumnInt(32),
Cooldown: stmt.ColumnInt(33),
Abilities: [3]SkillAbility{ Abilities: [3]SkillAbility{
{ {
Type: stmt.ColumnInt(32), Type: stmt.ColumnInt(34),
ValueUsage: stmt.ColumnInt(33), ValueUsage: stmt.ColumnInt(35),
Value: stmt.ColumnInt(34), Value: stmt.ColumnInt(36),
Target: stmt.ColumnInt(35), Target: stmt.ColumnInt(37),
TargetValue: stmt.ColumnInt(36), TargetValue: stmt.ColumnInt(38),
}, },
{ {
Type: stmt.ColumnInt(37), Type: stmt.ColumnInt(39),
ValueUsage: stmt.ColumnInt(38), ValueUsage: stmt.ColumnInt(40),
Value: stmt.ColumnInt(39), Value: stmt.ColumnInt(41),
Target: stmt.ColumnInt(40), Target: stmt.ColumnInt(42),
TargetValue: stmt.ColumnInt(41), TargetValue: stmt.ColumnInt(43),
}, },
{ {
Type: stmt.ColumnInt(42), Type: stmt.ColumnInt(44),
ValueUsage: stmt.ColumnInt(43), ValueUsage: stmt.ColumnInt(45),
Value: stmt.ColumnInt(44), Value: stmt.ColumnInt(46),
Target: stmt.ColumnInt(45), Target: stmt.ColumnInt(47),
TargetValue: stmt.ColumnInt(46), TargetValue: stmt.ColumnInt(48),
}, },
}, },
}, },
}, },
SPCost: stmt.ColumnInt(47), SPCost: stmt.ColumnInt(49),
InheritID: stmt.ColumnInt(48), InheritID: stmt.ColumnInt(50),
UniqueOwnerID: stmt.ColumnInt(49), UniqueOwnerID: stmt.ColumnInt(51),
UniqueOwner: stmt.ColumnText(50), UniqueOwner: stmt.ColumnText(52),
IconID: stmt.ColumnInt(51), IconID: stmt.ColumnInt(53),
Index: stmt.ColumnInt(52), Index: stmt.ColumnInt(54),
} }
r = append(r, s) r = append(r, s)
} }

View File

@@ -39,6 +39,7 @@ var AllSkills = map[SkillID]Skill{
{{- end }} {{- end }}
Condition: {{ printf "%q" $a.Condition }}, Condition: {{ printf "%q" $a.Condition }},
Duration: {{ $a.Duration }}, Duration: {{ $a.Duration }},
DurScale: {{ $a.DurScale }},
{{- if $a.Cooldown }} {{- if $a.Cooldown }}
Cooldown: {{ $a.Cooldown }}, Cooldown: {{ $a.Cooldown }},
{{- end }} {{- end }}

View File

@@ -116,6 +116,14 @@ pub fun activations(s: skill-id): list<activation>
precondition = {{ printf "%q" $a.Precondition }}, precondition = {{ printf "%q" $a.Precondition }},
condition = {{ printf "%q" $a.Condition }}, condition = {{ printf "%q" $a.Condition }},
duration = {{ $a.Duration }}.decimal{{ if gt $a.Duration 0 }}(-4){{ end }}, duration = {{ $a.Duration }}.decimal{{ if gt $a.Duration 0 }}(-4){{ end }},
dur-scale = {{ if eq $a.DurScale 1 }}Direct-Dur
{{- else if eq $a.DurScale 2 }}Front-Distance-Dur
{{- else if eq $a.DurScale 3 }}Multiply-Remaining-HP
{{- else if eq $a.DurScale 4 }}Increment-Pass
{{- else if eq $a.DurScale 5 }}Midrace-Side-Block-Time-Dur
{{- else if eq $a.DurScale 7 }}Multiply-Remaining-HP2
{{- else }}??? $a.DurScale={{ $a.DurScale }}
{{- end }},
cooldown = {{ $a.Cooldown }}.decimal{{ if gt $a.Cooldown 0 }}(-4){{ end }}, cooldown = {{ $a.Cooldown }}.decimal{{ if gt $a.Cooldown 0 }}(-4){{ end }},
abilities = [ abilities = [
{{- range $abil := $a.Abilities }} {{- range $abil := $a.Abilities }}

View File

@@ -45,6 +45,7 @@ SELECT
d.precondition_1, d.precondition_1,
d.condition_1, d.condition_1,
d.float_ability_time_1, d.float_ability_time_1,
d.ability_time_usage_1,
d.float_cooldown_time_1, d.float_cooldown_time_1,
d.ability_type_1_1, d.ability_type_1_1,
d.ability_value_usage_1_1, d.ability_value_usage_1_1,
@@ -64,6 +65,7 @@ SELECT
d.precondition_2, d.precondition_2,
d.condition_2, d.condition_2,
d.float_ability_time_2, d.float_ability_time_2,
d.ability_time_usage_2,
d.float_cooldown_time_2, d.float_cooldown_time_2,
d.ability_type_2_1, d.ability_type_2_1,
d.ability_value_usage_2_1, d.ability_value_usage_2_1,