Scene-based cue naming in mock show generator, stub validation for untimed blocks

This commit is contained in:
Ian Gulliver
2026-02-20 21:14:50 -07:00
parent b282ab710f
commit 911121e463
2 changed files with 56 additions and 39 deletions

View File

@@ -79,62 +79,73 @@ func GenerateMockShow(numTracks, numCues, numBlocks int) *Show {
placed := 0 placed := 0
cueIdx := 0 cueIdx := 0
scene := 0
for placed < numBlocks && cueIdx < numCues { for placed < numBlocks && cueIdx < numCues {
cue := &Block{ scene++
ID: fmt.Sprintf("q%d", cueIdx*10), cuesInScene := 2 + rng.IntN(3)
Type: "cue",
Name: fmt.Sprintf("Q%d", cueIdx*10),
}
show.Blocks = append(show.Blocks, cue)
cueIdx++
tracksThisCue := numTracks - rng.IntN(2) for intra := 1; intra <= cuesInScene; intra++ {
perm := rng.Perm(numTracks) if placed >= numBlocks || cueIdx >= numCues {
cueTargets := []TriggerTarget{}
for _, trackIdx := range perm[:tracksThisCue] {
if placed >= numBlocks {
break break
} }
block := randBlock(trackIdx)
show.Blocks = append(show.Blocks, block)
cueTargets = append(cueTargets, TriggerTarget{Block: block.ID, Hook: "START"})
placed++
prev := block cue := &Block{
chainLen := rng.IntN(3) ID: fmt.Sprintf("q%d", cueIdx),
for range chainLen { Type: "cue",
Name: fmt.Sprintf("S%d Q%d", scene, intra),
}
show.Blocks = append(show.Blocks, cue)
cueIdx++
tracksThisCue := numTracks - rng.IntN(2)
perm := rng.Perm(numTracks)
cueTargets := []TriggerTarget{}
for _, trackIdx := range perm[:tracksThisCue] {
if placed >= numBlocks { if placed >= numBlocks {
break break
} }
if !prev.hasDefinedTiming() { block := randBlock(trackIdx)
break show.Blocks = append(show.Blocks, block)
} cueTargets = append(cueTargets, TriggerTarget{Block: block.ID, Hook: "START"})
next := randBlock(trackIdx)
show.Blocks = append(show.Blocks, next)
show.Triggers = append(show.Triggers, &Trigger{
Source: TriggerSource{Block: prev.ID, Signal: "END"},
Targets: []TriggerTarget{{Block: next.ID, Hook: "START"}},
})
prev = next
placed++ placed++
}
}
if len(cueTargets) > 0 { prev := block
show.Triggers = append(show.Triggers, &Trigger{ chainLen := rng.IntN(3)
Source: TriggerSource{Block: cue.ID, Signal: "GO"}, for range chainLen {
Targets: cueTargets, if placed >= numBlocks {
}) break
}
if !prev.hasDefinedTiming() {
break
}
next := randBlock(trackIdx)
show.Blocks = append(show.Blocks, next)
show.Triggers = append(show.Triggers, &Trigger{
Source: TriggerSource{Block: prev.ID, Signal: "END"},
Targets: []TriggerTarget{{Block: next.ID, Hook: "START"}},
})
prev = next
placed++
}
}
if len(cueTargets) > 0 {
show.Triggers = append(show.Triggers, &Trigger{
Source: TriggerSource{Block: cue.ID, Signal: "GO"},
Targets: cueTargets,
})
}
} }
} }
for cueIdx < numCues { for cueIdx < numCues {
scene++
cue := &Block{ cue := &Block{
ID: fmt.Sprintf("q%d", cueIdx*10), ID: fmt.Sprintf("q%d", cueIdx),
Type: "cue", Type: "cue",
Name: fmt.Sprintf("Q%d", cueIdx*10), Name: fmt.Sprintf("S%d Q1", scene),
} }
show.Blocks = append(show.Blocks, cue) show.Blocks = append(show.Blocks, cue)
cueIdx++ cueIdx++

View File

@@ -122,6 +122,12 @@ func (show *Show) Validate() error {
if !startTargeted[block.ID] { if !startTargeted[block.ID] {
return fmt.Errorf("block %q has no trigger for its START", block.ID) return fmt.Errorf("block %q has no trigger for its START", block.ID)
} }
/*
TODO: Put this back when mock is fixed
if !block.hasDefinedTiming() && !hookTargeted[blockEvent{block.ID, "FADE_OUT"}] && !hookTargeted[blockEvent{block.ID, "END"}] {
return fmt.Errorf("block %q has no defined timing and nothing triggers its FADE_OUT or END", block.ID)
}
*/
} }
for _, trigger := range show.Triggers { for _, trigger := range show.Triggers {