From 463991b4e3f16abe158d552dd86490918e6cc9e9 Mon Sep 17 00:00:00 2001 From: SpectCOW <126259962+SpcFORK@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:55:17 +0000 Subject: [PATCH] Leave Kapcacher for later and add WeekMaster --- nat/.main.oak | 3 +- scenes/init/gameParts/all.oak | 8 +- scenes/init/gameParts/ml.oak | 8 +- scenes/init/gameParts/weekmaster.oak | 167 ++++++++++++++++++ scenes/init/menu/credits.oak | 1 + scenes/init/menu/gameSelect.oak | 2 + scenes/init/menu/menuScreen.oak | 7 + scenes/oc_bootseq/boot.oak | 2 +- web/entry.oak | 6 +- .../mlp/EmptyWeek/songs/dadbattle/song.xml | 5 +- 10 files changed, 196 insertions(+), 13 deletions(-) create mode 100644 scenes/init/gameParts/weekmaster.oak diff --git a/nat/.main.oak b/nat/.main.oak index 262090d..d180877 100644 --- a/nat/.main.oak +++ b/nat/.main.oak @@ -168,6 +168,7 @@ fn resolveHTMLBuilding(build) { + OKFunk @@ -191,8 +192,8 @@ fn resolveHTMLBuilding(build) { + - ' |> str.trim() |> fmt.format(combined) diff --git a/scenes/init/gameParts/all.oak b/scenes/init/gameParts/all.oak index f608b2b..88eb18e 100644 --- a/scenes/init/gameParts/all.oak +++ b/scenes/init/gameParts/all.oak @@ -1 +1,7 @@ -ml := import('ml') \ No newline at end of file +ml := import('ml') +weekmaster := import('weekmaster') + +window.GAMEPARTS := { + ml: ml + weekmaster: weekmaster +} \ No newline at end of file diff --git a/scenes/init/gameParts/ml.oak b/scenes/init/gameParts/ml.oak index 7ad4653..b5b0a65 100644 --- a/scenes/init/gameParts/ml.oak +++ b/scenes/init/gameParts/ml.oak @@ -10,18 +10,18 @@ fn MLtoSObj(htmlStr, type) { fn parseNode(node) { result := {} + with std.each(node.attributes) fn(ii) if ii != ? -> result.(ii.name) <- ii.value + fn handleNoChildren if node.attributes.length > 0 { - with std.each(node.attributes) fn(ii) if ii != ? -> result.(ii.name) <- ii.value - true -> result.'__text' <- node.textContent _ -> result <- node.textContent |> std.default('') } - + if node.children.length = ? | node.children.length <= 0 { true -> handleNoChildren() _ -> with std.each(node.children) fn(ii) result.(ii.localName) <- parseNode(ii) } - + result } diff --git a/scenes/init/gameParts/weekmaster.oak b/scenes/init/gameParts/weekmaster.oak new file mode 100644 index 0000000..a979a70 --- /dev/null +++ b/scenes/init/gameParts/weekmaster.oak @@ -0,0 +1,167 @@ +{ MLtoSObj: MLtoSObj } := import('ml') + +fn weekByName(c) { + 'weekLevels/mlp/' << c +} + +fn getWeeksXML() { + // Weeks.xml isnb't a folder, but in there so this okay + weekByName('weeks.xml') +} + +fn getWeekAsset(weekName, c) { + weekByName(weekName) << '/' << c +} + +fn getWeekXML(weekName) { + getWeekAsset(weekName, 'main.xml') +} + +fn getWeekSong(weekName, c) { + getWeekAsset(weekName, 'songs/') << c +} + +fn getSongAsset(weekName, songName, c) { + getWeekSong(weekName, songName) << '/' << c +} + +fn getSongXML(weekName, c) { + getSongAsset(weekName, c, 'song.xml') +} + +fn getChartXML(weekName, c) { + getSongAsset(weekName, c, 'chart.xml') +} + +fn getWeekSprite(weekName, c) { + getWeekAsset(weekName, 'sprites/') << c +} + +fn fetchWeekXML(weekName) { + weekPath := getWeekXML(weekName) + fetch(weekPath) +} + +fn handleMLFormat(r) MLtoSObj(r, 'text/xml') +fn handleMLText(r) r.text() + +fn parseWeekXML(weekName) { + resText := with fetchWeekXML(weekName). + then() handleMLText + + with resText. + then() handleMLFormat +} + +fn propagateWeek(weekData) { + newWeek := weekData |> Object() + + songs := Object.entries(newWeek.songs) + + root := '' + promArr := [] + fn pPush(i) promArr.push(i) + + fn handleUrl(k, n) { + SONGROLL_DATA := with rolloutSongUrl(n). + then() fn(d) newWeek.songs.(k) <- d + + pPush(SONGROLL_DATA) + } + + with songs.forEach() fn(e, i) { + [kName, assetUrl] := e + + if kName = 'root' { + ASSET_URL := root + assetUrl + + true -> root <- assetUrl + _ -> handleUrl(kName, ASSET_URL) + } + } + + with Promise.all(promArr).then() fn() newWeek +} + +fn fetchSongXML(weekName, songName) { + songPath := getSongXML(weekName, songName) + fetch(songPath) +} + +fn parseSongXML(weekName, songName) { + resText := with fetchSongXML(weekName, songName). + then() fn(r) handleMLText + + with resText. + then() handleMLFormat +} + +fn parseSongXURL(songUrl) { + resText := with fetch(songUrl). + then() handleMLText + + with resText. + then() handleMLFormat +} + +fn parseSongEntries(song, v, i) { + [key, val] := v + + v +} + +fn parseSongPreload(song, v, i) { + [key, val] := v + + v +} + +fn parseSongPlaybacks(song, v, i) { + [key, val] := v + + v +} + +fn propagateSong(songData) { + newSong := songData |> Object() + + entries := Object.entries(songData.entry) + preload := Object.entries(songData.preload) + playbacks := Object.entries(songData.playbacks) + + root := '' + promArr := [] + fn pPush(i...) promArr.push(i...) + + fn passSong(cb) fn(args...) cb(newSong, args...) + + entries <- with entries.map() passSong(parseSongEntries) + preload <- with preload.map() passSong(parseSongPreload) + playbacks <- with playbacks.map() passSong(parseSongPlaybacks) + + pPush( + entries... + ) + + pPush( + preload... + ) + + pPush( + playbacks... + ) + + with Promise.all(promArr).then() fn() newSong +} + +fn rolloutSongUrl(songUrl) { + data := parseSongXURL(songUrl) + with data.then() propagateSong +} + +fn rolloutWeek(weekName) { + data := parseWeekXML(weekName) + with data.then() propagateWeek +} + +with rolloutWeek('EmptyWeek').then() console.log \ No newline at end of file diff --git a/scenes/init/menu/credits.oak b/scenes/init/menu/credits.oak index 7025f3c..281a8f4 100644 --- a/scenes/init/menu/credits.oak +++ b/scenes/init/menu/credits.oak @@ -41,6 +41,7 @@ with scene('credits') fn { creditStr := 'SpectCOW (SpcFORK), Creator of KaboomFunkin.\n' << + 'NiceEli, JS/TS inject, LDTK Charts.\n' << 'Thanks for playing!' with add() [ diff --git a/scenes/init/menu/gameSelect.oak b/scenes/init/menu/gameSelect.oak index 91800ac..b2a468b 100644 --- a/scenes/init/menu/gameSelect.oak +++ b/scenes/init/menu/gameSelect.oak @@ -167,4 +167,6 @@ with scene('gameSelect') fn { with wait(0.2) weekCall } + Transition(BLACK).fadeOut(0.2) + } \ No newline at end of file diff --git a/scenes/init/menu/menuScreen.oak b/scenes/init/menu/menuScreen.oak index 594f9be..e0118ab 100644 --- a/scenes/init/menu/menuScreen.oak +++ b/scenes/init/menu/menuScreen.oak @@ -45,6 +45,9 @@ rng := import('random') { shakey: shakey } := import('../../blocks/shakey') +{ Transition: Transition } := import('../../blocks/Transition') + + with scene('menuScreen') fn { enterNextH('gameSelect') @@ -114,4 +117,8 @@ with scene('menuScreen') fn { } + // --- + + Transition(WHITE).fadeOut(0.3) + } \ No newline at end of file diff --git a/scenes/oc_bootseq/boot.oak b/scenes/oc_bootseq/boot.oak index 4ea2553..60cddb7 100644 --- a/scenes/oc_bootseq/boot.oak +++ b/scenes/oc_bootseq/boot.oak @@ -43,9 +43,9 @@ with scene('init__') fn { ]) fn SET(v) cn_title_text.opacity <- v + fn TEXT(v) cn_title_text.text <- v fn SHOW SET(1) fn HIDE SET(0) - fn TEXT(v) cn_title_text.text <- v shakey(cn_title_text) diff --git a/web/entry.oak b/web/entry.oak index 75c1004..ed12231 100644 --- a/web/entry.oak +++ b/web/entry.oak @@ -4,6 +4,7 @@ json := import('json') fmt := import('fmt') path := import('path') +// https://unpkg.com/kapcacher@0.2.5/kapcache.js oaka := import('oaka') // --- @@ -14,7 +15,8 @@ h! := 500 globalThis.k := kaboom({ width: 600 height: 500 - scale: w! / h! + scale: w! / h!, + plugins: [KapCacher.CacherPlugin] }) vv := visualViewport @@ -53,8 +55,6 @@ addEventListener('scroll', updateCanvas) addEventListener('orientationchange', updateCanvas) document.addEventListener('fullscreenchange', updateCanvas) - - // --- scenes := import('../scenes/main') \ No newline at end of file diff --git a/weekLevels/mlp/EmptyWeek/songs/dadbattle/song.xml b/weekLevels/mlp/EmptyWeek/songs/dadbattle/song.xml index 8629da9..686edf8 100644 --- a/weekLevels/mlp/EmptyWeek/songs/dadbattle/song.xml +++ b/weekLevels/mlp/EmptyWeek/songs/dadbattle/song.xml @@ -4,14 +4,13 @@ weeks/songs/dadbattle/song.ogg weeks/songs/dadbattle/voices.ogg - entry.oak - + weekLevels/mlp/EmptyWeek/sprites/sprites.xml 120 - right + right \ No newline at end of file