Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
dd290af
feat(mhfu-port): the behaviour graph replaces the rule list
sp00ktober Oct 9, 2026
ad614e4
docs(ports): the behaviour graph in the manifest README
sp00ktober Oct 9, 2026
c756218
build(studio): NodeGraphQt on Qt.py 1.4 (2.x pulls stubs that break m…
sp00ktober Oct 9, 2026
a9370a1
feat(studio): GraphView, a node-graph view over NodeGraphQt that the …
sp00ktober Oct 9, 2026
c96c97f
test(studio): a click is no move, a group drag moves each node once
sp00ktober Oct 9, 2026
ae9e4b9
test(studio): tidy an expression
sp00ktober Oct 9, 2026
7918b56
refactor(studio): GraphView listens to NodeGraphQt's public signals, …
sp00ktober Oct 9, 2026
63719e6
Merge the behaviour graph model
sp00ktober Oct 9, 2026
6ca1dec
Merge the NodeGraphQt view
sp00ktober Oct 9, 2026
5eb2cbf
fix(mhfu-port): a manifest with no schema key and a [[rule]] list loa…
sp00ktober Oct 9, 2026
0c7201c
feat(studio): the studio reads the behaviour graph, not rules
sp00ktober Oct 9, 2026
d6836f6
feat(studio): GraphView says when a gesture is whole, takes a canvas …
sp00ktober Oct 9, 2026
60f4981
feat(studio): the Behaviour dock
sp00ktober Oct 9, 2026
27510eb
feat(mhfu-port): behaviour.params and refused; migrate's grid clears …
sp00ktober Oct 9, 2026
569056c
feat(studio): the dock reads behaviour.params and refused; a window t…
sp00ktober Oct 9, 2026
c4efbb7
fix(studio): an accepted behaviour edit is drawn once in the window
sp00ktober Oct 13, 2026
c2fd757
feat(studio): the behaviour canvas pans with two fingers and zooms wi…
sp00ktober Oct 13, 2026
637e90e
fix(studio): a node keeps its size when its options change
sp00ktober Oct 13, 2026
fae4130
feat(studio): Behaviour is a tab of the centre beside the 3D view, wi…
sp00ktober Oct 13, 2026
caf2597
feat(studio): the tools belong to the 3D view and Findings stays open…
sp00ktober Oct 13, 2026
3ee414d
feat(mhfu-port): a block kind words its own summary
sp00ktober Oct 13, 2026
a814c99
feat(studio): compact behaviour nodes and a property bar under the ca…
sp00ktober Oct 13, 2026
b729ee6
fix(studio): a move's note stays editable in the bar; the node paints…
sp00ktober Oct 13, 2026
eec1e77
Merge branch 'bx/i2-tab' into bx/i3
sp00ktober Oct 13, 2026
fd6156d
feat(mhfu-port): triggers() groups the paths by what starts them
sp00ktober Oct 13, 2026
20c70d8
feat(studio): an outline of triggers, and a trigger's rules as framed…
sp00ktober Oct 13, 2026
edbf02a
feat(studio): build and edit a rule inside a trigger's rows
sp00ktober Oct 13, 2026
67abf52
feat(studio): reorder a trigger's rules by their frames, and play a m…
sp00ktober Oct 13, 2026
f914df7
fix(studio): a rule that plays nothing by design ends at its last block
sp00ktober Oct 13, 2026
f77a7d7
feat(studio): show all rules in order, each from its own trigger, bes…
sp00ktober Oct 13, 2026
dd98eef
feat(studio): a node selected on the canvas dims what is not on its r…
sp00ktober Oct 13, 2026
a928253
feat(studio): a reference lists the rules that play its move and the …
sp00ktober Oct 13, 2026
513d8b6
feat(studio): Play in game is off in the bar and the menu, with the r…
sp00ktober Oct 13, 2026
1be88a7
refactor(studio): drop the dead " (between moves)" cut from an outlin…
sp00ktober Oct 13, 2026
73fed61
docs(studio): the Behaviour tab as outline, rows, bar and canvas
sp00ktober Oct 13, 2026
da6a93e
test(studio): compile stays identical across the rows' edits and a se…
sp00ktober Oct 13, 2026
e9d2496
fix(studio): a node's tip shows over its title, not NodeGraphQt's ren…
sp00ktober Oct 13, 2026
8a89b91
docs(studio): the Behaviour section says what the UI does not
sp00ktober Oct 13, 2026
1598cbf
feat(mhfu): read em_vhook's brain rules from game memory
sp00ktober Oct 13, 2026
1d4fd41
feat(studio): match the brain's rule slots to the open port's rules a…
sp00ktober Oct 13, 2026
28e42da
feat(studio): Watch the game marks every rule's frame and trigger wit…
sp00ktober Oct 13, 2026
a39cc77
docs(studio): Watch the game in the Behaviour section
sp00ktober Oct 13, 2026
2bcae35
docs(brain): trim the docstrings
sp00ktober Oct 13, 2026
32fb236
feat(studio): the watch status takes the header's spare room and ends…
sp00ktober Oct 13, 2026
ca5fcee
Merge branch 'bx/p1-reader' into bx/p1-marks
sp00ktober Oct 13, 2026
69a6096
fix(studio): a rule's flash is outlined in the theme's accent, not a …
sp00ktober Oct 13, 2026
87c4fd3
fix(studio): the header's buttons keep their size while the watch sta…
sp00ktober Oct 13, 2026
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
15 changes: 11 additions & 4 deletions apps/studio/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,17 @@ starting where the last stood, facing as it faced, and the Timeline's bar above
shows the steps (click one to pick it). Picking or playing anything else starts clips where
they normally start.

Under the moves are the rules (`[[rule]]`), each read as a sentence ("after the lunge for 20
frames, within 1200, play stamp"): New rule plays the picked move once when the monster notices
the hunter, and every field is a control, the part only for a flinch or a break, the mode only
for a pair move, `force` as above. A refusal is the manifest's own words, in the status line.
The Behaviour tab edits the port's `[behaviour]` as rules, grouped by what starts them: an event, a
state between moves, or a move playing. The game checks rules in rank order, `#1` first. Rank is the
stored canvas order, each block's `(y, x)`, top first: `+ Rule` adds a rule last, dragging a rule's
frame trades places with its own trigger's rules only, and in All rules › Canvas dragging a node can
change it. In Canvas a block's `out` wires to the next block's `in` or to a move's `play`; a move's
`while playing` starts a rule, and `then` sets the move's `after`. The palette is
`mhfu_port.behaviour.KINDS`. Watch the game, in the header, reads the running game once a second
while the tab is shown and marks each frame and trigger with how often the game fired its rules
(`7×`; a frame lights up when its count rises): the game must run this port's rules as Play in game
sends them, and the header says when it does not. The tab keeps its own docks; Findings stays open
across tabs.

## Tests

Expand Down
5 changes: 5 additions & 0 deletions apps/studio/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ dependencies = [
"qtawesome>=1.4",
"pillow>=11",
"tomli-w>=1.2",
"NodeGraphQt>=0.6.44",
# Qt.py 2 pulls types-pyside6, whose stubs shadow PySide6's own and break strict mypy
"Qt.py>=1.4.8,<2",
# NodeGraphQt imports distutils, gone in 3.12; setuptools supplies it
"setuptools>=70; python_full_version >= '3.12'",
]
classifiers = ["Typing :: Typed"]

Expand Down
Loading
Loading