diff --git a/docs/courses/educator-trainings.md b/docs/courses/educator-trainings.md index e309ed1335b..6d1c472a6f7 100644 --- a/docs/courses/educator-trainings.md +++ b/docs/courses/educator-trainings.md @@ -4,19 +4,24 @@ A collection of courses that provide professional learning opportunities for Mic ## CSEd Week Webinars +_(Click tile to register for free)_ ```codecard [ { "name": "Intro to MakeCode for CSEd Week 2024", - "description": "Join us for an engaging 50-minute webinar where we'll explore the best MakeCode Hour of Code activities, perfect for Computer Science Education Week! ", - "url":"https://learn.microsoft.com/en-us/training/modules/utilize-makecode-arcade-your-classroom/", - "imageUrl": "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RWOYCd?ver=bf04&q=90&m=6&h=291&w=517&b=%23FFFFFFFF&l=f&o=t" + "description": "Join us for an engaging 50-minute webinar where we'll explore the best MakeCode Hour of Code activities, perfect for Computer Science Education Week!", + "label": "11/14/24 at 4pm PST", + "labelClass": "purple ribbon large", + "url":"https://msit.events.teams.microsoft.com/event/5c9177b9-52a5-4aa7-a6ba-a62213830c0e@72f988bf-86f1-41af-91ab-2d7cd011db47", + "imageUrl": "/static/tutorials/bubbles/card.jpg" }, { "name": "Instant CSEd Week Prep", + "label": "12/03/24 at 4pm PST", + "labelClass": "purple ribbon large", "description": "From activity selection to class runtime, you'll leave this session with all the knowledge and resources necessary to make CS Education Week fun, engaging, and stress-free for you and your students. ", - "url":"https://microbit.org/teach/professional-development/", - "imageUrl": "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RWP52j?ver=a251&q=90&m=6&h=291&w=517&b=%23FFFFFFFF&l=f&o=t" + "url":"https://msit.events.teams.microsoft.com/event/efc1dd04-8b3d-48d4-b4ae-97c27eb0fdf0@72f988bf-86f1-41af-91ab-2d7cd011db47", + "imageUrl": "/static/skillmap/balloon/balloon4.gif" } ] ``` @@ -24,24 +29,24 @@ A collection of courses that provide professional learning opportunities for Mic ## Intro to CS with Arcade +_(Click tile to register for free)_ ```codecard [ { "name": "Tips and Tricks for Intro to CS with Arcade", - "description": "From activity selection to class runtime, you'll leave this session with all the knowledge and resources necessary to make CS Education Week fun, engaging, and stress-free for you and your students.", - "url":"https://learn.microsoft.com/en-us/training/modules/utilize-makecode-arcade-your-classroom/", + "description": "Discover exciting tips, tricks, and features meant to make your classroom experience as smooth as possible", + "label": "11/07/24 at 4pm PST", + "labelClass": "purple ribbon large", + "url":"https://msit.events.teams.microsoft.com/event/081611d2-a02f-4f0f-9d7f-c10b97020acb@72f988bf-86f1-41af-91ab-2d7cd011db47", "imageUrl": "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RWOYCd?ver=bf04&q=90&m=6&h=291&w=517&b=%23FFFFFFFF&l=f&o=t" }, { "name": "Intro to CS - Ask Me Anything", - "description": "Explore courses covering a range of topics to do with computing and the micro:bit", - "url":"https://microbit.org/teach/professional-development/", - "imageUrl": "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RWP52j?ver=a251&q=90&m=6&h=291&w=517&b=%23FFFFFFFF&l=f&o=t" - }, { - "name": "Minecraft PL", - "description": "This series focuses on using Minecraft Education as a teaching and learning tool to support strong pedagogical practices", - "url": "https://learn.microsoft.com/en-us/training/paths/minecraft-teacher-academy/", - "imageUrl": "https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE5fBrs?ver=79f6&q=90&m=6&h=291&w=517&b=%23FFFFFFFF&l=f&o=t" + "description": "This session is your chance to ask the curriculum developers about whatever is on your mind—from coding conundrums to classroom challenges.", + "label": "02/25/25 at 4pm PST", + "labelClass": "purple ribbon large", + "url":"https://msit.events.teams.microsoft.com/event/b12482d0-cef6-4159-8324-7f751f56048a@72f988bf-86f1-41af-91ab-2d7cd011db47", + "imageUrl": "https://arcade.makecode.com/api/S02325-67229-86604-38896/thumb" } ] ``` @@ -50,7 +55,7 @@ A collection of courses that provide professional learning opportunities for Mic ### ~hint -In addition to the trainings found here, Arcade and micro:bit occasionally provide live professional learning opportunities in persona and online. Follow @MSMakeCode on Twitter to learn more. +In addition to the trainings found here, Arcade and micro:bit occasionally provide live professional learning opportunities in person and online. Follow @MSMakeCode on Twitter to learn more. ### ~ diff --git a/docs/hour-of-code/all.md b/docs/hour-of-code/all.md index a8ec9a70ad9..bacdeee3de9 100644 --- a/docs/hour-of-code/all.md +++ b/docs/hour-of-code/all.md @@ -8,9 +8,15 @@ Join us in celebrating Computer Science Education Week by playing, designing, an [ { "name": "Inside Out 2", - "description": "Create a bubble popping game, featuring the stars of Disney and Pixar's Inside Out 2.", + "description": "Create a bubble popping game, featuring the stars of Disney and Pixar's Inside Out 2", "url": "https://arcade.makecode.com/#tutorial:/tutorials/bubbles", "imageUrl": "/static/tutorials/bubbles/card.jpg" + }, + { + "name": "Scott Kelly - Mission to Hubble", + "description": "Follow along with the steps of this tutorial to create a game based on Scott Kelly's first space flight", + "url": "https://forms.codeninjas.com/back-to-school-game-building-session/?utm-source=makecode&utm_medium=partner&utm_campaign=bts_gbs", + "imageUrl": "/static/tutorials/hubble/hubble_4x3.jpg" } ] ``` diff --git a/docs/static/tutorials/lyla/bg.gif b/docs/static/tutorials/lyla/bg.gif new file mode 100644 index 00000000000..12086f202fa Binary files /dev/null and b/docs/static/tutorials/lyla/bg.gif differ diff --git a/docs/static/tutorials/lyla/more.gif b/docs/static/tutorials/lyla/more.gif new file mode 100644 index 00000000000..b4e41766dad Binary files /dev/null and b/docs/static/tutorials/lyla/more.gif differ diff --git a/docs/static/tutorials/lyla/pickle.gif b/docs/static/tutorials/lyla/pickle.gif index 2a1a2decff0..2f23c277d25 100644 Binary files a/docs/static/tutorials/lyla/pickle.gif and b/docs/static/tutorials/lyla/pickle.gif differ diff --git a/docs/static/tutorials/lyla/timer.gif b/docs/static/tutorials/lyla/timer.gif new file mode 100644 index 00000000000..01375e2b3a5 Binary files /dev/null and b/docs/static/tutorials/lyla/timer.gif differ diff --git a/docs/tutorials/lyla-jr.md b/docs/tutorials/lyla-jr.md new file mode 100644 index 00000000000..8b4c6f59983 --- /dev/null +++ b/docs/tutorials/lyla-jr.md @@ -0,0 +1,594 @@ +# Lyla and Ev's Snack Chase +### @explicitHints true +### @flyoutOnly true + + +## Lyla and Ev's Snack Chase @showdialog + +**Let's code a video game with Lyla, Everett and Stu!** + +![Pickle Party Game](/static/tutorials/lyla/lyla.gif "Characters chasing pickle slices." ) + + + +## {Step 5} + +**We need snacks to chase!** + +![Add a flying pickle with a new block](/static/tutorials/lyla/pickle.gif "Choose the pickle from the gallery" ) + +#### ~ tutorialhint + +```blocks +//@highlight +sprites.sendFlying(lyla_imgs.picklechip, 1) +``` + + + +## {Step 7} + +**Add a background!** + +![Use the set scene block](/static/tutorials/lyla/bg.gif "Use the set scene block" ) + +The background in the block is Loops Lunch! Click on the image to draw your own background. + + + +#### ~ tutorialhint + +```blocks +sprites.sendFlying(lyla_imgs.picklechip, 1) +//@highlight +scene.setBG(lyla_imgs.diner) +``` + + + + +## {Step 6} + +**Try your game!** + +[Re-Link Intro Video Here] + +Press A (or the space bar) to clear the message, then use the arrow keys to +catch the snacks. + + + + +## {Step 8} + +**Add a timer!** + + +![Grab the timer block](/static/tutorials/lyla/timer.gif "The timer will count down from 45 to 0." ) + +How many snacks can you catch before time runs out? + +If its too hard, add more seconds to the timer. If it's too easy, try taking time away. + + + + +#### ~ tutorialhint + +```blocks +sprites.sendFlying(lyla_imgs.picklechip, 1) +scene.setBG(lyla_imgs.diner) +//@highlight +game.gameCountdown(30) +``` + + + + + +## {Step 10} + +**Make more changes!** + +![Add something special](/static/tutorials/lyla/more.gif "Add something special") + +If you want, you can change the players, change the snacks, and add sounds! + + +#### ~ tutorialhint + +```blocks +sprites.sendFlying(lyla_imgs.picklechip, 1) +scene.setBG(lyla_imgs.diner) +game.gameCountdown(30) +//@highlight +sprites.assignPlayerImgs(lyla_imgs.lyla, lyla_imgs.louisa, lyla_imgs.liana, lyla_imgs.luke) +music.play(music.createSong(assets.song`countdown`), music.PlaybackMode.InBackground) + +``` + + + +## {Finale} + +**🥒 You did it! 🥒** + +![You finished your game!](/static/tutorials/lyla/finish.gif "You finished your game") + + +You made a video game! Try playing it with your friends. + + +```blockconfig.global +scene.setBG(lyla_imgs.diner) +game.gameCountdown(30) +sprites.sendFlying(lyla_imgs.picklechip, 1) +sprites.assignPlayerImgs(lyla_imgs.lyla, lyla_imgs.stu, lyla_imgs.everett, lyla_imgs.luke) +music.play(music.melodyPlayable(music.baDing), music.PlaybackMode.InBackground) + +``` + + + + +```ghost +scene.setBG(lyla_imgs.diner) +game.gameCountdown(30) +sprites.sendFlying(lyla_imgs.picklechip, 1) +sprites.assignPlayerImgs(lyla_imgs.lyla, lyla_imgs.stu, lyla_imgs.everett, lyla_imgs.luke) +music.play(music.melodyPlayable(music.baDing), music.PlaybackMode.UntilDone) +music.play(music.createSong(assets.song`countdown`), music.PlaybackMode.InBackground) + +``` + + + +```package +multiplayer +arcade-text=github:microsoft/arcade-text#v1.3.0 +lyla_imgs=github:kiki-lee/lyla_imgs#v0.0.7 +arcade-block-icons=github:kiki-lee/arcade-block-icons#v0.0.10 +``` + + +```customts + +//% color=#b79900 icon="\uf1ce" +namespace pickle { + /* Code to set up Lyla game only */ + // Make sure not to remove later player when earlier player selected + export let playersConnected = 0; + // Keep count to delete old splash when new splash arrives + export let pickles_to_get = 7; + export let characters = [lyla_imgs.lyla, lyla_imgs.everett, lyla_imgs.stu, lyla_imgs.luke]; + // Create textsprite for score + export let scoreText = textsprite.create(""); + export let theseThings = " snacks"; + + game.setGameOverMessage(false, "Try Again!") + game.setGameOverEffect(false, effects.dissolve) + game.setGameOverPlayable(false, music.createSong(lyla_imgs.lose), false) + game.setGameOverMessage(true, "You did it!") + game.setGameOverPlayable(true, music.createSong(lyla_imgs.winner), false) + + + control.raiseEvent(3241, 1) + + sprites.onOverlap(SpriteKind.Player, SpriteKind.Projectile, function (sprite, otherSprite) { + sprites.destroy(otherSprite, effects.disintegrate, 100) + pickle.changeScoreOverride(1) + }) + info.onCountdownEnd(function () { + game.simpleGame() + }) + + // Workaround for game in play mode (vs edit mode where it worked fine) + info.setScore(0) + + + // Add characters and message when new players join + mp.onControllerEvent(ControllerEvent.Connected, function (thisPlayer) { + if (mp.getPlayerProperty(thisPlayer, mp.PlayerProperty.Number) <= characters.length) { + pickle.setPlayersWith(characters, mp.getPlayerProperty(thisPlayer, mp.PlayerProperty.Number)) + } + else { + game.splashMP("Not enough characters on team!") + } + }) + + + + /********/ + //% blockId=set_players + // block="set game for $num player(s) with $list" + //% num.defl=1 + //% list.shadow=variables_get + //% list.defl=characters + export function setPlayersWith(list: Image[], num: number) { + + if (num > playersConnected) { + playersConnected = num; + pickles_to_get = 7 * num; + sprites.destroyAllSpritesOfKind(SpriteKind.Player) + let xloc = [ + 40, + 120, + 40, + 120 + ] + let yloc = [ + 30, + 30, + 90, + 90 + ] + for (let index = 0; index <= num - 1; index++) { + mp.setPlayerSprite(mp.getPlayerByIndex(index), sprites.create(list[index], SpriteKind.Player)) + mp.getPlayerSprite(mp.getPlayerByIndex(index)).setStayInScreen(true) + mp.getPlayerSprite(mp.getPlayerByIndex(index)).setPosition(xloc.shift(), yloc.shift()) + mp.getPlayerSprite(mp.getPlayerByIndex(index)).z = 1000 + mp.moveWithButtons(mp.getPlayerByIndex(index)) + + } + game.splashMP("Catch " + pickles_to_get + theseThings + " to win!") + } + } + //% blockId=bump_sprite + // block="$thisSprite bump $thatSprite" + //% thisSprite.shadow=variables_get + //% thisSprite.defl=sprite + //% thatSprite.shadow=variables_get + //% thatSprite.defl=otherSprite + export function bumpSprite(thisSprite: Sprite, thatSprite: Sprite) { + thatSprite.setPosition((thisSprite.x + 80) % 160, thisSprite.y) + } + /** + * Overrides the normal score UI with an iconified version + */ + //% blockId=set_score_override + //% block="set `ICON.pickle` to $thisScore" + //% thisScore.defl=0 + //% color="#b70082" + //% group="Info" + //% help=github:docs/mp_set_score_override + export function setScoreOverride(thisScore: number) { + let thisIcon = img` + . . . . . . . . . . . . . . . . +. . . . . 7 7 a 8. . . . . . . +. . . . 7 7 a 8 7 7 a 8 7. . . +. . . 7 7 a 8 7 7 a 8 7 7 7. . +. . 7 7 a 8 7 7 a 8 7 7 7 a 8. +. . 7 a 8 7 7 a 8 7 7 7 a 8 7. +. 7 a 8 7 7 a 8 7 7 7 a 8 7. . +.a 8 7 7 a 8 7 7 7 a 8 7 7 7. +. . 7 7 a 8 7 7 a 8 8 7 7 7 7. +. . 7 a 8 7 7 a 8 7 7 7 7 7 a. +. . . 8 7 7 a 8 7 7 7 7 7 a 8. +. . . 7 7 a 8 7 7 7 7 a a 8. . +. . . .a 8 7 7 7 7 a 8 7. . . +. . . . . . 7 7 7 a 8 7. . . . +. . . . . . . . . . . . . . . . +. . . . . . . . . . . . . . . . +` + info.setScore(thisScore) + pickle.scoreText.setText(" x " + convertToText(info.score())) + scoreText.setIcon(thisIcon) + scoreText.setBorder(1, 3, 1) + scoreText.setMaxFontHeight(9) + scoreText.right = 160 + scoreText.top = 1 + scoreText.update() + info.showScore(false) + } + /** + * Changes the score and overrides the traditional UI + * with an iconified version + */ + //% blockId=mp_change_score_override + //% block="change `ICON.pickle` by $thisScore" + //% thisScore.defl=1 + //% color="#b70082" + //% help=github:docs/mp_change_score_override + //% group="Info" + export function changeScoreOverride(thisScore: number) { + info.changeScoreBy(thisScore) + pickle.setScoreOverride(info.score()) + } +} +namespace loops { + /** + * Run code when the play button is pressed + * (Like on start, but jr) + */ + //% color=#488898 + //% help=game/on-start-simple + //% weight=99 + //% afterOnStart=false + //% blockId=on_start_simple + //% block="on `ICON.play`" + //% blockAllowMultiple=0 + export function onStartSimple(a: () => void): void { + a(); + } +} +namespace music { + /** + * Simplified block to play a song + */ + //% help=game/simple-song + //% blockId=playThis + //% block="play $thisSong" + //% thisSong.shadow=music_song_field_editor + export function simpleSong(thisSong: Playable) { + music.play(thisSong, music.PlaybackMode.UntilDone) + } +} +//% weight=200 +namespace game { + /** + * Start the game timer + */ + //% blockId=game_countdown + //% block="`ICON.clock-white` $thisSec (s)" + //% thisSec.defl = 30 + //% help=github:docs/game_coundown + export function gameCountdown(thisSec: number) { + info.startCountdown(thisSec) + } + /** + * Run code on an interval of time. This executes before game.onUpdate() + * @param body code to execute + */ + //% help=game/on-update-interval weight=99 afterOnStart=true + //% blockId=gameinterval3 + //% weight=100 + //% block="every $period second(s)" + //% period.defl=1 + //% blockAllowMultiple=1 + export function onUpdateInterval3(period: number, a: () => void): void { + period = period * 1000; + if (!a || period < 0) return; + let timer = 0; + game.eventContext().registerFrameHandler(scene.UPDATE_INTERVAL_PRIORITY, () => { + const time = game.currentScene().millis(); + if (timer <= time) { + timer = time + period; + a(); + } + }); + } + //% blockId=hold_text + //% weight=200 + //% block="show $thisText" + //% thisText.defl="Press (A) to play" + export function holdText(thisText: string) { + game.showLongText(thisText, DialogLayout.Full) + } + /** + * Special lose sequence + */ + //% blockId=set_lyla_lose + //% block="game over `ICON.frown-open-white`" + //% help=github:docs/set_simple_lose + export function simpleLoss() { + game.gameOver(false) + } + /** + * Special win sequence + */ + //% blockId=set_lyla_win + //% block="game over `ICON.smile-beam-white`" + //% weight=300 + //% help=github:docs/set_simple_win + export function simpleWin() { + game.gameOver(true) + } + /** + * Special win sequence + */ + //% blockId=set_lyla_g_o + //% block="game over" + //% weight=300 + //% help=github:docs/set_simple_g_o + export function simpleGame() { + if (info.score() >= pickle.pickles_to_get) { + game.simpleWin() + } else { + game.simpleLoss() + } + } + /** + * Show a title and an optional subtitle menu + * Can be dismissed by any player + * @param title + * @param subtitle + */ + //% weight=90 help=game/splashMP + //% blockId=gameSplashMP block="splash %title||%subtitle" + //% title.shadow=text + //% subtitle.shadow=text + //% group="Prompt" + export function splashMP(title: any, subtitle?: any) { + title = console.inspect(title); + subtitle = subtitle ? console.inspect(subtitle) : subtitle; + controller._setUserEventsEnabled(false); + game.pushScene(); + game.currentScene().flags |= scene.Flag.SeeThrough; + const dialog = new SplashDialog(screen.width, subtitle ? 42 : 35); + dialog.setText(title); + if (subtitle) dialog.setSubtext(subtitle); + const s = sprites.create(dialog.image, -1); + let pressed = true; + let done = false; + let connected = false; + mp.onControllerEvent(ControllerEvent.Connected, function (thisPlayer) { + connected = true; + }) + + game.onUpdate(() => { + dialog.update(); + const currentState = ( connected || + (mp.isButtonPressed(mp.playerSelector(mp.PlayerNumber.One), mp.MultiplayerButton.A)) || + (mp.isButtonPressed(mp.playerSelector(mp.PlayerNumber.Two), mp.MultiplayerButton.A)) || + (mp.isButtonPressed(mp.playerSelector(mp.PlayerNumber.Three), mp.MultiplayerButton.A)) || + (mp.isButtonPressed(mp.playerSelector(mp.PlayerNumber.Four), mp.MultiplayerButton.A)) || + (mp.isButtonPressed(mp.playerSelector(mp.PlayerNumber.One), mp.MultiplayerButton.B)) || + (mp.isButtonPressed(mp.playerSelector(mp.PlayerNumber.Two), mp.MultiplayerButton.B)) || + (mp.isButtonPressed(mp.playerSelector(mp.PlayerNumber.Three), mp.MultiplayerButton.B)) || + (mp.isButtonPressed(mp.playerSelector(mp.PlayerNumber.Four), mp.MultiplayerButton.B)) + ) + if (currentState && !pressed) { + connected = false; + pressed = true; + scene.setBackgroundImage(null); // GC it + game.popScene(); + done = true; + } + else if (pressed && !currentState) { + pressed = false; + connected = false; + } + }) + pauseUntil(() => done); + controller._setUserEventsEnabled(true); + } +} + +//% weight=100 +namespace sprites { + export enum Plyrs { + //% block="Player 1" + One = 0, + //% block="Player 2" + Two = 1, + //% block="Player 3" + Three = 2, + //% block="Player 4" + Four = 3 + } + /** + * Creates a moving sprite with the image that you choose + */ + //% blockId=send_flying + //% weight=1000 + //% block="add $thing every $interval `ICON.clock-white`" + //% thing.shadow=screen_image_picker + //% thing.defl=lyla_imgs.picklechip + //% interval.defl=1 + export function sendFlying(thing: Image, interval:number) { + // Only calls them pickles if they are the default pickle + /*if (thing.equals(lyla_imgs.picklechip)) { + pickle.theseThings = " pickles"; + }*/ + game.onUpdateInterval(interval*1000, function () { + let foodFight = sprites.createProjectileFromSide(thing, randint(-100, 100), randint(-100, 100)) + }) + } + /** + * Assign images to players by array + */ + //% blockId=assign_player_images + //% block="team = $img1 $img2 $img3 $img4" + //% img1.shadow=screen_image_picker + //% img2.shadow=screen_image_picker + //% img3.shadow=screen_image_picker + //% img4.shadow=screen_image_picker + //% img1.defl=lyla_imgs.lyla + //% img2.defl=lyla_imgs.stu + //% img3.defl=lyla_imgs.everett + //% img4.defl=lyla_imgs.luke + //% inlineInputMode=inline + //% weight=1200 + export function assignPlayerImgs(img1: Image, img2: Image, img3: Image, img4: Image) { + pickle.characters[0] = img1; + pickle.characters[1] = img2; + pickle.characters[2] = img3; + pickle.characters[3] = img4; + } +} +//% weight=250 +namespace info { + /** + * Runs code once each time a player's score reaches a given value. + * @param score The score to check for, eg: 100 + * @param handler The code to run when the score is reached + */ + //% blockId=onScore2 + //% block="after $score `ICON.pickle`" + //% score.defl=20 + //% blockGap=8 + //% help=docs/on-score + //% group="Info" + export function onScore2(score: number, handler: () => void) { + info.onScore(score, handler); + } +} +//% weight=100 +namespace scene { + /** + * Sets the background with fewer words + */ + //% blockId=set_bg + //% block="set scene $thisBG" + //% thisBG.shadow=lyla_bg_image_picker + //% help=docs/set_bg + //% group="Scene" + export function setBG(thisBG: Image) { + scene.setBackgroundImage(thisBG) + } +} +namespace images { + //% blockId=lyla_bg_image_picker block="%img" + //% shim=TD_ID + //% img.fieldEditor="sprite" + //% img.fieldOptions.taggedTemplate="img" + //% img.fieldOptions.decompileIndirectFixedInstances="true" + //% img.fieldOptions.decompileArgumentAsString="true" + //% img.fieldOptions.sizes="-1,-1" + //% img.fieldOptions.filter="lylabg" + //% weight=100 group="Create" + //% blockHidden=1 duplicateShadowOnDrag + export function _screenImageLylaBG(img: Image) { + return img + } +} + +``` + +```simtheme +{ + "palette": [ + "#000000", + "#FFFFFF", + "#FF2121", + "#D26A9E", + "#F9C890", + "#FDFF70", + "#8E2EC4", + "#408325", + "#4166D8", + "#10CCE5", + "#95D6B1", + "#A4839F", + "#693C16", + "#E5CDC4", + "#A46C46", + "#000000" + ] +} +``` + + +```assetjson +{ + "assets.json": "", + "images.g.jres": "{\n \"EM~exxT809P9NBm_MJip\": {\n \"data\": \"003c000408010204001c00100500640000041e000004000000000000000000000000000a000004120000000400012408000c00012410001400012407001c00020a006400f401640000040000000000000000000000000000000003060018001c000124\",\n \"mimeType\": \"application/mkcd-song\",\n \"displayName\": \"countdown\",\n \"namespace\": \"mySongs.\"\n },\n \"*\": {\n \"mimeType\": \"image/x-mkcd-f4\",\n \"dataEncoding\": \"base64\",\n \"namespace\": \"myImages\"\n }\n}", + "images.g.ts": "// Auto-generated code. Do not edit.\nnamespace myImages {\n\n helpers._registerFactory(\"image\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n\n }\n return null;\n })\n\n helpers._registerFactory(\"animation\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n\n }\n return null;\n })\n\n helpers._registerFactory(\"song\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"EM~exxT809P9NBm_MJip\":\n case \"countdown\":return hex`003c000408010204001c00100500640000041e000004000000000000000000000000000a000004120000000400012408000c00012410001400012407001c00020a006400f401640000040000000000000000000000000000000003060018001c000124`;\n }\n return null;\n })\n\n}\n// Auto-generated code. Do not edit.\n", + "main.blocks": "", + "main.ts": "\n", + "pxt.json": "{\n \"name\": \"TMNT_Music\",\n \"description\": \"\",\n \"dependencies\": {\n \"device\": \"*\"\n },\n \"files\": [\n \"main.blocks\",\n \"main.ts\",\n \"assets.json\",\n \"images.g.jres\",\n \"images.g.ts\",\n \"tilemap.g.jres\",\n \"tilemap.g.ts\"\n ],\n \"targetVersions\": {\n \"branch\": \"v1.12.30\",\n \"tag\": \"v1.12.30\",\n \"commits\": \"https://github.com/microsoft/pxt-arcade/commits/33228b1cc7e1bea3f728c26a6047bdef35fd2c09\",\n \"target\": \"1.12.30\",\n \"pxt\": \"8.5.41\"\n },\n \"preferredEditor\": \"tsprj\",\n \"palette\": [\n \"#000000\",\n \"#FFFFFF\",\n \"#FF2121\",\n \"#DFDDDE\",\n \"#FF8135\",\n \"#FFF609\",\n \"#8E2EC4\",\n \"#408325\",\n \"#003FAD\",\n \"#87F2FF\",\n \"#EBF8F9\",\n \"#A4839F\",\n \"#F9F6E1\",\n \"#E5CDC4\",\n \"#91463d\",\n \"#000000\"\n ]\n}\n", + "tilemap.g.jres": "{\n \"transparency16\": {\n \"data\": \"hwQQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\",\n \"mimeType\": \"image/x-mkcd-f4\",\n \"tilemapTile\": true\n },\n \"*\": {\n \"mimeType\": \"image/x-mkcd-f4\",\n \"dataEncoding\": \"base64\",\n \"namespace\": \"myTiles\"\n }\n}", + "tilemap.g.ts": "// Auto-generated code. Do not edit.\nnamespace myTiles {\n //% fixedInstance jres blockIdentity=images._tile\n export const transparency16 = image.ofBuffer(hex``);\n\n helpers._registerFactory(\"tile\", function(name: string) {\n switch(helpers.stringTrim(name)) {\n case \"transparency16\":return transparency16;\n }\n return null;\n })\n\n}\n// Auto-generated code. Do not edit.\n" +} +``` +