Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Api #108

Merged
merged 26 commits into from
Mar 23, 2024
Merged

Api #108

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
4 changes: 2 additions & 2 deletions pon2.nimble
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ requires "nim ^= 2.0.2"

requires "docopt ^= 0.7.1"
requires "karax ^= 1.3.3"
requires "nigui ^= 0.2.7"
requires "nigui ^= 0.2.8"
requires "nimsimd ^= 1.2.9"
requires "suru#f6f1e607c585b2bc2f71309996643f0555ff6349"
requires "suru ^= 0.3.2"

# Tasks

Expand Down
54 changes: 29 additions & 25 deletions src/pon2pkg/app.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
## and [Nazo Puyo](https://vc.sega.jp/3ds/nazopuyo/).
##
## Submodule Documentations:
## - [color](./apppkg/color.html)
## - [generate](./apppkg/generate.html)
## - [gui](./apppkg/gui.html)
## - [key](./apppkg/key.html)
## - [marathon](./apppkg/marathon.html)
## - [nazopuyo](./apppkg/nazopuyo.html)
## - [permute](./apppkg/permute.html)
## - [simulator](./apppkg/simulator.html)
## - [solve](./apppkg/solve.html)
## - [color](./app/color.html)
## - [generate](./app/generate.html)
## - [gui](./app/gui.html)
## - [key](./app/key.html)
## - [marathon](./app/marathon.html)
## - [nazopuyo](./app/nazopuyo.html)
## - [permute](./app/permute.html)
## - [simulator](./app/simulator.html)
## - [solve](./app/solve.html)
##

{.experimental: "strictDefs".}
Expand All @@ -25,11 +25,13 @@ export
generate.GenerateError, generate.GenerateRequirementColor,
generate.GenerateRequirement, generate.generate
export
gui.GuiApplication, gui.initGuiApplication, gui.toggleFocus, gui.solve, gui.permute,
gui.nextReplay, gui.prevReplay, gui.operate
gui.GuiApplicationReplay, gui.GuiApplication, gui.initGuiApplication, gui.replay,
gui.focusEditor, gui.solving, gui.permuting, gui.progressBar, gui.toggleFocus,
gui.solve, gui.permute, gui.nextReplay, gui.prevReplay, gui.operate
export key.KeyEvent, key.initKeyEvent
export
marathon.Marathon, marathon.initMarathon, marathon.toggleFocus,
marathon.MarathonMatchResult, marathon.Marathon, marathon.initMarathon,
marathon.matchResult, marathon.focusSimulator, marathon.toggleFocus,
marathon.nextResultPage, marathon.prevResultPage, marathon.match, marathon.play,
marathon.operate
export
Expand All @@ -38,19 +40,21 @@ export
export permute.permute
export
simulator.SimulatorKind, simulator.SimulatorMode, simulator.SimulatorState,
simulator.Simulator, simulator.initSimulator, simulator.rule, simulator.kind,
simulator.mode, simulator.`rule=`, simulator.`kind=`, simulator.`mode=`,
simulator.score, simulator.originalNazoPuyoWrap, simulator.toggleInserting,
simulator.toggleFocus, simulator.moveCursorUp, simulator.moveCursorDown,
simulator.moveCursorRight, simulator.moveCursorLeft, simulator.deletePairPosition,
simulator.writeCell, simulator.shiftFieldUp, simulator.shiftFieldDown,
simulator.shiftFieldRight, simulator.shiftFieldLeft, simulator.flipFieldV,
simulator.flipFieldH, simulator.`requirementKind=`, simulator.`requirementColor=`,
simulator.`requirementNumber=`, simulator.undo, simulator.redo,
simulator.moveNextPositionRight, simulator.moveNextPositionLeft,
simulator.rotateNextPositionRight, simulator.rotateNextPositionLeft,
simulator.forward, simulator.backward, simulator.reset, simulator.toUri,
simulator.parseSimulator, simulator.operate
simulator.SimulatorEditing, simulator.Simulator, simulator.initSimulator,
simulator.rule, simulator.kind, simulator.mode, simulator.`rule=`, simulator.`kind=`,
simulator.`mode=`, simulator.nazoPuyoWrap, simulator.originalNazoPuyoWrap,
simulator.`pairsPositions=`, simulator.editing, simulator.`editingCell=`,
simulator.editor, simulator.state, simulator.score, simulator.operatingPosition,
simulator.toggleInserting, simulator.toggleFocus, simulator.moveCursorUp,
simulator.moveCursorDown, simulator.moveCursorRight, simulator.moveCursorLeft,
simulator.deletePairPosition, simulator.writeCell, simulator.shiftFieldUp,
simulator.shiftFieldDown, simulator.shiftFieldRight, simulator.shiftFieldLeft,
simulator.flipFieldV, simulator.flipFieldH, simulator.`requirementKind=`,
simulator.`requirementColor=`, simulator.`requirementNumber=`, simulator.undo,
simulator.redo, simulator.moveOperatingPositionRight,
simulator.moveOperatingPositionLeft, simulator.rotateOperatingPositionRight,
simulator.rotateOperatingPositionLeft, simulator.forward, simulator.backward,
simulator.reset, simulator.toUri, simulator.parseSimulator, simulator.operate
export solve.solve

when defined(js):
Expand Down
2 changes: 1 addition & 1 deletion src/pon2pkg/app/color.nim
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ when defined(js):
color.red.toHex(2),
color.green.toHex(2),
color.blue.toHex(2),
color.alpha.toHex(2)
color.alpha.toHex(2),
]
else:
import nigui
Expand Down
139 changes: 83 additions & 56 deletions src/pon2pkg/app/gui.nim
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
{.experimental: "strictFuncs".}
{.experimental: "views".}

import std/[options, sequtils]
import std/[sequtils]
import ./[key, nazopuyo, simulator]
import ../core/[field, nazopuyo, pairposition, puyopuyo, requirement]
import ../private/[misc]

when defined(js):
import std/[sugar]
import std/[options, sugar]
import karax/[karax, karaxdsl, kdom, vdom]
import ../core/[pair]
import ../private/[webworker]
Expand All @@ -24,20 +24,24 @@ else:
import ./[permute, solve]
{.pop.}

type GuiApplication* = object ## GUI application.
simulator*: ref Simulator
replaySimulator*: ref Simulator
type
GuiApplicationReplay* = object ## Pairs&Positions for the replay simulator.
hasData*: bool
pairsPositionsSeq*: seq[PairsPositions]
index*: Natural

replayPairsPositionsSeq*: Option[seq[PairsPositions]]
replayIdx*: Natural
GuiApplication* = object ## GUI application.
simulator*: ref Simulator
replaySimulator*: ref Simulator

editor: bool
focusEditor*: bool
solving*: bool
permuting*: bool
replay: GuiApplicationReplay

when defined(js):
progressBarData*: tuple[now: Natural, total: Natural]
editor: bool
focusEditor: bool
solving: bool
permuting: bool

progressBar: tuple[now: Natural, total: Natural]

using
self: GuiApplication
Expand All @@ -54,19 +58,42 @@ proc initGuiApplication*(simulator: Simulator): GuiApplication {.inline.} =
result.replaySimulator = new Simulator
result.replaySimulator[] = simulator

{.push warning[ProveInit]: off.}
result.replayPairsPositionsSeq = none seq[PairsPositions]
{.pop.}
result.replayIdx = 0
result.replay.hasData = false
result.replay.pairsPositionsSeq = @[]
result.replay.index = 0

result.editor = simulator.editor
result.focusEditor = false
result.solving = false
result.permuting = false

when defined(js):
result.progressBarData.now = 0
result.progressBarData.total = 0
result.progressBar.now = 0
result.progressBar.total = 0

# ------------------------------------------------
# Property
# ------------------------------------------------

func replay*(self): GuiApplicationReplay {.inline.} =
## Returns the pairs&positions for the replay simulator.
self.replay

func focusEditor*(self): bool {.inline.} =
## Returns `true` if the editor simulator is focused.
self.focusEditor

func solving*(self): bool {.inline.} =
## Returns `true` if a nazo puyo is being solved.
self.solving

func permuting*(self): bool {.inline.} =
## Returns `true` if a nazo puyo is being permuted.
self.permuting

func progressBar*(self): tuple[now: int, total: int] {.inline.} =
## Returns the progress bar information.
result.now = self.progressBar.now
result.total = self.progressBar.total

# ------------------------------------------------
# Edit - Other
Expand All @@ -86,15 +113,15 @@ proc updateReplaySimulator[F: TsuField or WaterField](
mSelf; nazo: NazoPuyo[F]
) {.inline.} =
## Updates the replay simulator.
## This function is assumed to be called after `mSelf.replayPairsPositionsSeq` is set.
assert mSelf.replayPairsPositionsSeq.isSome
## This function is assumed to be called after `mSelf.replay.pairsPositionsSeq` is set.
assert mSelf.replay.hasData

if mSelf.replayPairsPositionsSeq.get.len > 0:
if mSelf.replay.pairsPositionsSeq.len > 0:
mSelf.focusEditor = true
mSelf.replayIdx = 0
mSelf.replay.index = 0

var nazo2 = nazo
nazo2.puyoPuyo.pairsPositions = mSelf.replayPairsPositionsSeq.get[0]
nazo2.puyoPuyo.pairsPositions = mSelf.replay.pairsPositionsSeq[0]
mSelf.replaySimulator[] =
nazo2.initSimulator(mSelf.replaySimulator[].mode, mSelf.replaySimulator[].editor)
else:
Expand Down Expand Up @@ -122,19 +149,20 @@ proc solve*(
{.pop.}
wrappedNazoPuyo.asyncSolve(results, parallelCount = parallelCount)

mSelf.progressBarData.total =
mSelf.progressBar.total =
if wrappedNazoPuyo.puyoPuyo.pairsPositions[0].pair.isDouble:
wrappedNazoPuyo.puyoPuyo.field.validDoublePositions.card
else:
wrappedNazoPuyo.puyoPuyo.field.validPositions.card
mSelf.progressBarData.now = 0
mSelf.progressBar.now = 0

var interval: Interval
proc showReplay() =
mSelf.progressBarData.now = results.len.pred
mSelf.progressBar.now = results.len.pred
if results.allIt it.isSome:
mSelf.progressBarData.total = 0
mSelf.replayPairsPositionsSeq = some results.mapIt(it.get).concat
mSelf.progressBar.total = 0
mSelf.replay.hasData = true
mSelf.replay.pairsPositionsSeq = results.mapIt(it.get).concat
mSelf.updateReplaySimulator wrappedNazoPuyo
mSelf.solving = false
interval.clearInterval
Expand All @@ -145,8 +173,9 @@ proc solve*(
interval = showReplay.setInterval ResultMonitorIntervalMs
else:
# FIXME: make asynchronous, redraw
mSelf.replayPairsPositionsSeq =
some wrappedNazoPuyo.solve(parallelCount = parallelCount)
mSelf.replay.hasData = true
mSelf.replay.pairsPositionsSeq =
wrappedNazoPuyo.solve(parallelCount = parallelCount)
mSelf.updateReplaySimulator wrappedNazoPuyo
mSelf.solving = false

Expand Down Expand Up @@ -182,16 +211,16 @@ proc permute*(
results, fixMoves, allowDouble, allowLastDouble, parallelCount
)

mSelf.progressBarData.total =
mSelf.progressBar.total =
wrappedNazoPuyo.allPairsPositionsSeq(fixMoves, allowDouble, allowLastDouble).len
mSelf.progressBarData.now = 0
mSelf.progressBar.now = 0

var interval: Interval
proc showReplay() =
mSelf.progressBarData.now = results.len.pred
mSelf.progressBar.now = results.len.pred
if results.allIt it.isSome:
mSelf.progressBarData.total = 0
mSelf.replayPairsPositionsSeq = some results.mapIt(it.get)
mSelf.progressBar.total = 0
mSelf.replay.pairsPositionsSeq = results.mapIt(it.get)
mSelf.updateReplaySimulator wrappedNazoPuyo
mSelf.permuting = false
interval.clearInterval
Expand All @@ -202,8 +231,8 @@ proc permute*(
interval = showReplay.setInterval ResultMonitorIntervalMs
else:
# FIXME: make asynchronous, redraw
mSelf.replayPairsPositionsSeq =
some wrappedNazoPuyo.permute(fixMoves, allowDouble, allowLastDouble).toSeq
mSelf.replay.pairsPositionsSeq =
wrappedNazoPuyo.permute(fixMoves, allowDouble, allowLastDouble).toSeq
mSelf.updateReplaySimulator wrappedNazoPuyo
mSelf.permuting = false

Expand All @@ -215,32 +244,30 @@ proc permute*(

proc nextReplay*(mSelf) {.inline.} =
## Shows the next replay.
if mSelf.replayPairsPositionsSeq.isNone or mSelf.replayPairsPositionsSeq.get.len == 0:
if not mSelf.replay.hasData or mSelf.replay.pairsPositionsSeq.len == 0:
return

if mSelf.replayIdx == mSelf.replayPairsPositionsSeq.get.len.pred:
mSelf.replayIdx = 0
if mSelf.replay.index == mSelf.replay.pairsPositionsSeq.len.pred:
mSelf.replay.index = 0
else:
mSelf.replayIdx.inc
mSelf.replay.index.inc

mSelf.replaySimulator[].nazoPuyoWrap.get:
wrappedNazoPuyo.puyoPuyo.pairsPositions =
mSelf.replayPairsPositionsSeq.get[mSelf.replayIdx]
mSelf.replaySimulator[].pairsPositions =
mSelf.replay.pairsPositionsSeq[mSelf.replay.index]
mSelf.replaySimulator[].reset false

proc prevReplay*(mSelf) {.inline.} =
## Shows the previous replay.
if mSelf.replayPairsPositionsSeq.isNone or mSelf.replayPairsPositionsSeq.get.len == 0:
if not mSelf.replay.hasData or mSelf.replay.pairsPositionsSeq.len == 0:
return

if mSelf.replayIdx == 0:
mSelf.replayIdx = mSelf.replayPairsPositionsSeq.get.len.pred
if mSelf.replay.index == 0:
mSelf.replay.index = mSelf.replay.pairsPositionsSeq.len.pred
else:
mSelf.replayIdx.dec
mSelf.replay.index.dec

mSelf.replaySimulator[].nazoPuyoWrap.get:
wrappedNazoPuyo.puyoPuyo.pairsPositions =
mSelf.replayPairsPositionsSeq.get[mSelf.replayIdx]
mSelf.replaySimulator[].pairsPositions =
mSelf.replay.pairsPositionsSeq[mSelf.replay.index]
mSelf.replaySimulator[].reset false

# ------------------------------------------------
Expand Down Expand Up @@ -319,12 +346,12 @@ when defined(js):
mSelf.initEditorControllerNode id
tdiv(class = "block"):
mSelf.initEditorSettingsNode id
if mSelf.progressBarData.total > 0:
if mSelf.progressBar.total > 0:
mSelf.initEditorProgressBarNode
if mSelf.replayPairsPositionsSeq.isSome:
if mSelf.replay.hasData:
tdiv(class = "block"):
mSelf.initEditorPaginationNode
if mSelf.replayPairsPositionsSeq.get.len > 0:
if mSelf.replay.pairsPositionsSeq.len > 0:
tdiv(class = "block"):
mSelf.initEditorSimulatorNode

Expand Down
Loading
Loading