commit 33673a05e8bbdfb23f5642bb343300f258eb5b7c Author: Speiger Date: Sun Aug 3 22:10:51 2025 +0200 Initial Commit diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..8ce7b51 --- /dev/null +++ b/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..00a51af --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c8171ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build +/bin/ +/.settings/ +/.project +/data +/backup +/output \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..a5bb1f6 --- /dev/null +++ b/build.gradle @@ -0,0 +1,47 @@ +plugins { + id 'java-library' +} + +archivesBaseName = "Mario Kart World Tracker" + +repositories { + mavenCentral() +} + +version = 1.0 +sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaLanguageVersion.of(21) + +jar { + manifest { + attributes "Main-Class": 'speiger.src.ui.MapPanel' + } + from { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + configurations.runtimeClasspath.collect { zipTree(it) } + } +} + +task baseJar(type: Jar) { + from sourceSets.main.output + archiveClassifier.set("slim") + exclude('assets/images/images.zip') + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + manifest { + attributes "Main-Class": 'speiger.src.ui.MapPanel' + } + from { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + configurations.runtimeClasspath.collect { zipTree(it) } + } +} + + +dependencies { + implementation 'com.google.code.gson:gson:2.8.6' + implementation 'org.jsoup:jsoup:1.19.1' + implementation 'commons-codec:commons-codec:1.19.0' +} + +artifacts { + archives baseJar +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..62d4c05 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..0d18421 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..fbd7c51 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..5093609 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..11f644a --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/6.4/userguide/multi_project_builds.html + */ + +rootProject.name = 'MKW_Map' diff --git a/src/main/java/speiger/src/data/Collectable.java b/src/main/java/speiger/src/data/Collectable.java new file mode 100644 index 0000000..2ff4241 --- /dev/null +++ b/src/main/java/speiger/src/data/Collectable.java @@ -0,0 +1,11 @@ +package speiger.src.data; + +import java.awt.Point; +import java.util.Map; +import java.util.UUID; + +public record Collectable(String name, UUID id, CollectableType type, Point position, EndPoint end, Map images) { + public boolean hasEndpoint() { + return end != null; + } +} diff --git a/src/main/java/speiger/src/data/CollectableType.java b/src/main/java/speiger/src/data/CollectableType.java new file mode 100644 index 0000000..5a12a08 --- /dev/null +++ b/src/main/java/speiger/src/data/CollectableType.java @@ -0,0 +1,8 @@ +package speiger.src.data; + +public enum CollectableType { + PSWITCH, + PANEL, + MEDAL, + CHUCKS +} diff --git a/src/main/java/speiger/src/data/EndPoint.java b/src/main/java/speiger/src/data/EndPoint.java new file mode 100644 index 0000000..ce907af --- /dev/null +++ b/src/main/java/speiger/src/data/EndPoint.java @@ -0,0 +1,7 @@ +package speiger.src.data; + +import java.awt.Point; + +public record EndPoint(Point location, boolean isFlying) { + +} \ No newline at end of file diff --git a/src/main/java/speiger/src/data/Registry.java b/src/main/java/speiger/src/data/Registry.java new file mode 100644 index 0000000..f111142 --- /dev/null +++ b/src/main/java/speiger/src/data/Registry.java @@ -0,0 +1,342 @@ +package speiger.src.data; + +import java.awt.Point; +import java.awt.image.BufferedImage; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; + +import javax.imageio.ImageIO; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.internal.Streams; +import com.google.gson.stream.JsonWriter; + +public class Registry { + public static final Registry INSTANCE = new Registry(); + ExecutorService service = Executors.newFixedThreadPool(4); + ExecutorCompletionService queue = new ExecutorCompletionService<>(service); + Map collectables = new LinkedHashMap<>(); + Set completed = new HashSet<>(); + Object syncObj = new Object(); + + public void load() { + parseRegistry("/assets/data/medals.json", CollectableType.MEDAL); + parseRegistry("/assets/data/panels.json", CollectableType.PANEL); + parseRegistry("/assets/data/pswitches.json", CollectableType.PSWITCH); + parseRegistry("/assets/data/chucks.json", CollectableType.CHUCKS); + dumpData(); + loadCompleted(); + } + + private void dumpData() { + Path path = getOrigin().resolve("data"); + if(Files.exists(path.resolve("images.zip"))) return; + try(InputStream stream = Registry.class.getResourceAsStream("/assets/images/images.zip")) { + if(Files.notExists(path)) Files.createDirectories(path); + Files.copy(stream, path.resolve("images.zip")); + } + catch(Exception e) { + e.printStackTrace(); + } + } + + public void importSave(List ids) { + completed.clear(); + completed.addAll(ids); + save(); + } + + private void loadCompleted() { + completed.clear(); + Path path = getOrigin().resolve("data/save.json"); + if(Files.notExists(path)) return; + try(BufferedReader reader = Files.newBufferedReader(path)) { + for(JsonElement element : JsonParser.parseReader(reader).getAsJsonObject().getAsJsonArray("completed")) { + completed.add(UUID.fromString(element.getAsString())); + } + } + catch(Exception e) { + e.printStackTrace(); + } + } + + public void save() { + JsonArray array = new JsonArray(); + completed.forEach(T -> array.add(T.toString())); + Path path = getOrigin().resolve("data"); + if(Files.notExists(path)) { + try { + Files.createDirectories(path); + } + catch(Exception e) { + e.printStackTrace(); + } + } + try(JsonWriter writer = new JsonWriter(Files.newBufferedWriter(path.resolve("save.json")))) { + writer.setIndent("\t"); + JsonObject obj = new JsonObject(); + obj.add("completed", array); + Streams.write(obj, writer); + } + catch(Exception e) { + e.printStackTrace(); + } + } + + public void processQueue() { + List images = new ArrayList<>(); + Future data = null; + while((data = queue.poll()) != null) { + try { + images.add(data.get()); + } + catch(Exception e) { + e.printStackTrace(); + } + } + synchronized(syncObj) { + try(FileSystem system = FileSystems.newFileSystem(getOrigin().resolve("data/images.zip"), Map.of("create", "true"))) { + for(DownloadedImage image : images) { + if(image.id() == null) continue; + Path path = system.getPath(image.id().toString().replace("-", "_")+".jpg"); + try(OutputStream stream = Files.newOutputStream(path)) { + ImageIO.write(image.image(), "jpg", new BufferedOutputStream(stream)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + } + } + + private void parseRegistry(String path, CollectableType type) { + try(InputStreamReader reader = new InputStreamReader(Registry.class.getResourceAsStream(path))) { + for(JsonElement element : JsonParser.parseReader(reader).getAsJsonObject().getAsJsonArray("entries")) { + try { + Collectable entry = parse(element.getAsJsonObject(), type); + collectables.put(entry.id(), entry); + } + catch(Exception e) { + e.printStackTrace(); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + } + + public BufferedImage getImage(TaggedImage image) { + Path path = getOrigin().resolve("data/images.zip"); + if(Files.exists(path)) { + synchronized(syncObj) { + try(FileSystem system = FileSystems.newFileSystem(path)) { + Path resolve = system.getPath(image.fileId().toString().replace("-", "_")); + if(Files.exists(resolve)) { return ImageIO.read(new ByteArrayInputStream(Files.readAllBytes(resolve))); } + } + catch(Exception e) { + e.printStackTrace(); + } + } + } + try { + return queue.submit(new DownloadTask(image)).get().image(); + } + catch(Exception e) { + e.printStackTrace(); + } + return null; + } + + public Collectable get(UUID id) { + return collectables.get(id); + } + + public int completed(CollectableType type) { + return (int)collectables.values().stream().filter(T -> completed.contains(T.id())).filter(T -> T.type() == type).count(); + } + + public int total(CollectableType type) { + return (int)collectables.values().stream().filter(T -> T.type() == type).count(); + } + + public void markComplete(UUID id) { + completed.add(id); + save(); + } + + public void unmarkComplete(UUID id) { + completed.remove(id); + save(); + } + + public boolean isCompleted(UUID id) { + return completed.contains(id); + } + + public List collectables() { + return new ArrayList<>(collectables.values()); + } + + public void downloadMissingIcons(Consumer progressTracker, AtomicBoolean cancel, Runnable completion) { + ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + ExecutorCompletionService queue = new ExecutorCompletionService<>(service); + synchronized(syncObj) { + Map done = Map.of(); + if(Files.notExists(getOrigin().resolve("data/images.zip"))) { + done = Map.of("create", "true"); + } + + try(FileSystem system = FileSystems.newFileSystem(getOrigin().resolve("data/images.zip"), done)) { + int toDo = 0; + for(Collectable collect : Registry.INSTANCE.collectables()) { + for(TaggedImage image : collect.images().values()) { + Path path = system.getPath(image.fileId().toString().replace("-", "_")+".jpg"); + if(Files.exists(path)) continue; + queue.submit(new DownloadTask(image, cancel)); + toDo++; + } + } + int total = toDo; + progressTracker.accept(new int[] {0, total}); + service.shutdown(); + while(toDo > 0) { + Future future = null; + while((future = queue.poll()) != null) { + DownloadedImage image = future.get(); + toDo--; + if(image.id() == null) continue; + Path path = system.getPath(image.id().toString().replace("-", "_")+".jpg"); + try(OutputStream stream = Files.newOutputStream(path)) { + ImageIO.write(image.image(), "jpg", new BufferedOutputStream(stream)); + } + catch(Exception e) { + e.printStackTrace(); + } + progressTracker.accept(new int[] {(total - toDo), total}); + Thread.sleep(Duration.ofMillis(50)); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + } + completion.run(); + } + + private static Collectable parse(JsonObject obj, CollectableType type) { + String name = obj.get("name").getAsString(); + UUID id = UUID.fromString(obj.get("id").getAsString()); + Point pos = parsePosition(obj.getAsJsonObject("position")); + EndPoint point = parseEnd(obj.getAsJsonObject("end")); + Map images = new HashMap<>(); + for(JsonElement el : obj.getAsJsonArray("images")) { + TaggedImage image = parseImage(el.getAsJsonObject()); + images.put(image.tag(), image); + } + return new Collectable(name, id, type, pos, point, images); + } + + private static TaggedImage parseImage(JsonObject obj) { + return new TaggedImage(UUID.fromString(obj.get("id").getAsString()), obj.get("url").getAsString(), obj.get("type").getAsString()); + } + + private static EndPoint parseEnd(JsonObject obj) { + return obj == null ? null : new EndPoint(parsePosition(obj), obj.get("flying").getAsBoolean()); + } + + private static Point parsePosition(JsonObject obj) { + return new Point(obj.get("x").getAsInt(), obj.get("y").getAsInt()); + } + + public static Path getOrigin() { + try { + Path data = Path.of(Registry.class.getProtectionDomain().getCodeSource().getLocation().toURI()); + if(!Files.isDirectory(data)) return data.getParent(); + } + catch(URISyntaxException e) { + e.printStackTrace(); + } + return Path.of(""); + } + + private static class DownloadTask implements Callable { + TaggedImage image; + AtomicBoolean cancel; + + public DownloadTask(TaggedImage image) { + this.image = image; + } + + public DownloadTask(TaggedImage image, AtomicBoolean cancel) { + this.image = image; + this.cancel = cancel; + } + + @Override + public DownloadedImage call() throws Exception { + if(cancel != null && cancel.get()) { + return new DownloadedImage(null, null); + } + try { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + WritableByteChannel output = Channels.newChannel(stream); + ReadableByteChannel input = Channels.newChannel(new URI(image.url().replace(" ", "%20")).toURL().openStream()); + ByteBuffer buffer = ByteBuffer.allocate(8192); + while(input.read(buffer) > 0) { + output.write(buffer.flip()); + buffer.flip(); + } + input.close(); + output.close(); + return new DownloadedImage(this.image.fileId(), ImageIO.read(new ByteArrayInputStream(stream.toByteArray()))); + } + catch(Exception e) { + e.printStackTrace(); + } + return new DownloadedImage(null, null); + } + + } + + private record DownloadedImage(UUID id, BufferedImage image) {} +} diff --git a/src/main/java/speiger/src/data/TaggedImage.java b/src/main/java/speiger/src/data/TaggedImage.java new file mode 100644 index 0000000..75b9689 --- /dev/null +++ b/src/main/java/speiger/src/data/TaggedImage.java @@ -0,0 +1,7 @@ +package speiger.src.data; + +import java.util.UUID; + +public record TaggedImage(UUID fileId, String url, String tag) { + +} diff --git a/src/main/java/speiger/src/ui/DownloadTask.java b/src/main/java/speiger/src/ui/DownloadTask.java new file mode 100644 index 0000000..eeb8455 --- /dev/null +++ b/src/main/java/speiger/src/ui/DownloadTask.java @@ -0,0 +1,68 @@ +package speiger.src.ui; + +import java.awt.BorderLayout; +import java.awt.EventQueue; +import java.awt.FlowLayout; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.border.EmptyBorder; + +import speiger.src.data.Registry; + +public class DownloadTask extends JDialog { + private static final long serialVersionUID = 142921231931795121L; + + public DownloadTask(JFrame owner) { + super(owner, owner != null); + setTitle("Downloading Images"); + setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + setBounds(100, 100, 326, 153); + setLocationRelativeTo(owner); + getContentPane().setLayout(new BorderLayout()); + JPanel content = new JPanel(null); + content.setBorder(new EmptyBorder(5, 5, 5, 5)); + + JLabel label = new JLabel("Downloading location Images"); + label.setBounds(10, 11, 210, 14); + content.add(label); + + JProgressBar progress = new JProgressBar(); + progress.setStringPainted(true); + progress.setString("0 / 0"); + progress.setBounds(10, 38, 284, 25); + content.add(progress); + + getContentPane().add(content, BorderLayout.CENTER); + + JPanel buttonPane = new JPanel(); + buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); + getContentPane().add(buttonPane, BorderLayout.SOUTH); + AtomicBoolean task = new AtomicBoolean(); + + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(T -> { + task.set(true); + dispose(); + }); + buttonPane.add(cancelButton); + Thread.ofPlatform().start(() -> { + Registry.INSTANCE.downloadMissingIcons(T -> { + EventQueue.invokeLater(() -> { + progress.setString(T[0]+" / "+T[1]); + progress.setMaximum(T[1]); + progress.setValue(T[0]); + repaint(); + }); + }, task, () -> { + EventQueue.invokeLater(this::dispose); + }); + }); + setVisible(true); + } +} diff --git a/src/main/java/speiger/src/ui/LocationDisplay.java b/src/main/java/speiger/src/ui/LocationDisplay.java new file mode 100644 index 0000000..d902e53 --- /dev/null +++ b/src/main/java/speiger/src/ui/LocationDisplay.java @@ -0,0 +1,84 @@ +package speiger.src.ui; + +import java.awt.BorderLayout; +import java.awt.EventQueue; +import java.awt.Graphics; +import java.awt.Panel; +import java.awt.event.ComponentAdapter; +import java.awt.event.MouseAdapter; +import java.awt.image.BufferedImage; +import java.util.Map; + +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; + +import speiger.src.data.Registry; +import speiger.src.data.TaggedImage; + +public class LocationDisplay extends JDialog { + private static final long serialVersionUID = 3803744617604239360L; + + public LocationDisplay(JFrame owner, String name, Map images) { + setTitle(name+" Images"); + setBounds(0, 0, 700, 700); + setResizable(true); + setLocationRelativeTo(owner); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + getContentPane().setLayout(new BorderLayout()); + JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + getContentPane().add(tabbedPane, BorderLayout.CENTER); + + images.forEach((K, V) -> { + JPanel panel = new JPanel(new BorderLayout()); + tabbedPane.addTab(firstLetterUppercase(K), panel); + Thread.ofPlatform().name("Image Loader", 1).start(() -> { + BufferedImage image = Registry.INSTANCE.getImage(V); + if(image == null) { + EventQueue.invokeLater(() -> tabbedPane.remove(panel)); + return; + } + EventQueue.invokeLater(() -> { + panel.add(new ImagePanel(image, this), BorderLayout.CENTER); + repaint(); + }); + }); + }); + setVisible(true); + addComponentListener(new ComponentAdapter() { + public void componentResized(java.awt.event.ComponentEvent e) { + repaint(); + }; + }); + } + + public static String firstLetterUppercase(String string) { + if(string == null || string.isEmpty()) { + return string; + } + String first = Character.toString(string.charAt(0)); + return string.replaceFirst(first, first.toUpperCase()); + } + + private static class ImagePanel extends Panel { + private static final long serialVersionUID = 5945747347624323542L; + BufferedImage image; + + public ImagePanel(BufferedImage image, JDialog owner) { + this.image = image; + + addMouseListener(new MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent e) { + owner.dispose(); + }; + }); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + g.drawImage(image, 0, 0, getWidth(), getHeight(), this); + } + } +} diff --git a/src/main/java/speiger/src/ui/MapPanel.java b/src/main/java/speiger/src/ui/MapPanel.java new file mode 100644 index 0000000..ef46e98 --- /dev/null +++ b/src/main/java/speiger/src/ui/MapPanel.java @@ -0,0 +1,383 @@ +package speiger.src.ui; + +import java.awt.BorderLayout; +import java.awt.Checkbox; +import java.awt.EventQueue; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Point; +import java.awt.RenderingHints; +import java.awt.Toolkit; +import java.awt.event.ActionListener; +import java.awt.event.ItemListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; +import java.awt.geom.AffineTransform; +import java.io.BufferedReader; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.time.Duration; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; +import java.util.prefs.Preferences; + +import javax.swing.ImageIcon; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.KeyStroke; + +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; + +import speiger.src.data.Collectable; +import speiger.src.data.CollectableType; +import speiger.src.data.Registry; + +public class MapPanel extends JPanel { + private static final JFileChooser CHOOSER = new JFileChooser(new File(Preferences.userRoot().node(MapPanel.class.getName()).get("Last Folder", new File(".").getAbsolutePath()))); + private static final long serialVersionUID = 7639401429824622357L; + private static Checkbox P_SWITCH; + private static Checkbox MEDALS; + private static Checkbox PANEL; + private static Checkbox CHUCKS; + + JFrame owner; + Runnable progressUpdate; + float zoom = 1F; + Point offset = new Point(-568, -271); + Point lastDrag = null; + Image map = new ImageIcon(MapPanel.class.getResource("/assets/images/map.png")).getImage(); + Image[] medal = new Image[] { + new ImageIcon(MapPanel.class.getResource("/assets/images/medal.png")).getImage(), + new ImageIcon(MapPanel.class.getResource("/assets/images/medal_disabled.png")).getImage() + }; + Image[] panel = new Image[] { + new ImageIcon(MapPanel.class.getResource("/assets/images/panel.png")).getImage(), + new ImageIcon(MapPanel.class.getResource("/assets/images/panel_disabled.png")).getImage() + }; + Image[] pswitch = new Image[] { + new ImageIcon(MapPanel.class.getResource("/assets/images/pswitch.png")).getImage(), + new ImageIcon(MapPanel.class.getResource("/assets/images/pswitch_disabled.png")).getImage() + }; + Image[] chuck = new Image[] { + new ImageIcon(MapPanel.class.getResource("/assets/images/chucks.png")).getImage(), + new ImageIcon(MapPanel.class.getResource("/assets/images/chucks_disabled.png")).getImage() + }; + List markers = new ArrayList(); + List visibleMarkers = new ArrayList(); + Marker lastMarker = null; + + public static void main(String...args) { + Toolkit.getDefaultToolkit().setDynamicLayout(false); + JFrame frame = new JFrame(); + frame.setLayout(new BorderLayout()); + frame.setBounds(0, 0, 800, 600); + frame.setTitle("Mario Kart World Progress Tracker"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setLocationRelativeTo(null); + MapPanel panel = new MapPanel(frame); + frame.add(panel, BorderLayout.CENTER); + JMenuBar bar = new JMenuBar(); + frame.setJMenuBar(bar); + JMenu menu = bar.add(new JMenu("File")); + menu.add(item("Import Save", T -> { + Preferences prefs = Preferences.userRoot().node(MapPanel.class.getName()); + if(CHOOSER.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { + File file = CHOOSER.getSelectedFile(); + if(!file.getName().endsWith(".json")) return; + try(BufferedReader reader = Files.newBufferedReader(file.toPath())) { + List ids = new ArrayList<>(); + for(JsonElement element : JsonParser.parseReader(reader).getAsJsonObject().getAsJsonArray("completed")) { + ids.add(UUID.fromString(element.getAsString())); + } + Registry.INSTANCE.importSave(ids); + panel.onImported(); + } + catch(Exception e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(frame, "Importing caused an error \n"+e.toString(), "Importing Error", JOptionPane.ERROR_MESSAGE); + } + + prefs.put("Last Folder", file.getParent()); + } + }, null)); + menu.add(item("Export Save", T -> { + Preferences prefs = Preferences.userRoot().node(MapPanel.class.getName()); + if(CHOOSER.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { + File file = CHOOSER.getSelectedFile(); + String name = file.getName(); + int index = name.lastIndexOf("."); + if(index > -1) name = name.substring(0, index); + name += ".json"; + Path save = Registry.getOrigin().resolve("data/save.json"); + if(Files.notExists(save)) return; + + try { Files.copy(save, file.toPath().getParent().resolve(name), StandardCopyOption.REPLACE_EXISTING); } + catch(Exception e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(frame, "Exporting caused an error \n"+e.toString(), "Exporting Error", JOptionPane.ERROR_MESSAGE); + } + + prefs.put("Last Folder", file.getParent()); + + } + }, null)); + menu.add(item("Download all Previews", T -> { + if(JOptionPane.showConfirmDialog(frame, "Are you sure you want to download all missing images?", "Download Images", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { + new DownloadTask(frame); + } + }, null)); + menu.add(item("Credits", T -> { + JOptionPane.showMessageDialog(frame, "Credits Go to:\nhttps://mkw.techtangents.net and\nhttps://www.gamerguides.com/mario-kart-world/maps/world \nwhich are used as Resource Providers", "Credits", JOptionPane.INFORMATION_MESSAGE); + }, null)); + + JMenu controls = new JMenu("Controls"); + controls.add("Left Button: Toggle Completion"); + controls.add("Right Button: Show Location"); + controls.add("Left Button Dragging: Move Map"); + controls.add("Mouse Scrolling: Zoom"); + + + JMenu bulk = new JMenu("Bulk Actions"); + bulk.add(item("Complete Visible", T -> { + panel.setCompletionState(true); + }, null)); + bulk.add(item("Uncomplete Visible", T -> { + panel.setCompletionState(false); + }, null)); + bar.add(bulk); + JMenu fuckups = new JMenu("I Fucked up"); + fuckups.add(item("Reset Zoom", T -> { + panel.resetZoom(); + }, KeyStroke.getKeyStroke('z'))); + fuckups.add(item("Reset Offset", T -> { + panel.resetMap(); + }, KeyStroke.getKeyStroke('r'))); + + bar.add(fuckups); + bar.add(controls); + + JPanel sideMenu = new JPanel(); + sideMenu.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 5, 0)); + + sideMenu.add(new JLabel("Filter")); + P_SWITCH = (Checkbox)sideMenu.add(box("P-Switches", T -> onFilterChanged(panel::updateFilter))); + MEDALS = (Checkbox)sideMenu.add(box("Medals", T -> onFilterChanged(panel::updateFilter))); + PANEL = (Checkbox)sideMenu.add(box("Panels", T -> onFilterChanged(panel::updateFilter))); + CHUCKS = (Checkbox)sideMenu.add(box("Chucks", T -> onFilterChanged(panel::updateFilter))); + JLabel PSwitchProgress = new JLabel(Registry.INSTANCE.completed(CollectableType.PSWITCH)+" / "+Registry.INSTANCE.total(CollectableType.PSWITCH)); + JLabel MedalsProgress = new JLabel(Registry.INSTANCE.completed(CollectableType.MEDAL)+" / "+Registry.INSTANCE.total(CollectableType.MEDAL)); + JLabel PanelProgress = new JLabel(Registry.INSTANCE.completed(CollectableType.PANEL)+" / "+Registry.INSTANCE.total(CollectableType.PANEL)); + JLabel ChucksProgress = new JLabel(Registry.INSTANCE.completed(CollectableType.CHUCKS)+" / "+Registry.INSTANCE.total(CollectableType.CHUCKS)); + panel.progressUpdate = () -> { + PSwitchProgress.setText(Registry.INSTANCE.completed(CollectableType.PSWITCH)+" / "+Registry.INSTANCE.total(CollectableType.PSWITCH)); + MedalsProgress.setText(Registry.INSTANCE.completed(CollectableType.MEDAL)+" / "+Registry.INSTANCE.total(CollectableType.MEDAL)); + PanelProgress.setText(Registry.INSTANCE.completed(CollectableType.PANEL)+" / "+Registry.INSTANCE.total(CollectableType.PANEL)); + ChucksProgress.setText(Registry.INSTANCE.completed(CollectableType.CHUCKS)+" / "+Registry.INSTANCE.total(CollectableType.CHUCKS)); + EventQueue.invokeLater(sideMenu::repaint); + }; + + sideMenu.add(new JLabel("P-Switches:")); + sideMenu.add(PSwitchProgress); + sideMenu.add(new JLabel("Medals:")); + sideMenu.add(MedalsProgress); + sideMenu.add(new JLabel("Panels:")); + sideMenu.add(PanelProgress); + sideMenu.add(new JLabel("Chucks:")); + sideMenu.add(ChucksProgress); + + frame.add(sideMenu, BorderLayout.WEST); + + panel.resetMap(); + frame.setVisible(true); + + while(true) { + try { + Registry.INSTANCE.processQueue(); + Thread.sleep(Duration.ofMillis(50)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + } + + private static Checkbox box(String name, ItemListener listener) { + Checkbox box = new Checkbox(name, true); + box.addItemListener(listener); + return box; + } + + private static void onFilterChanged(Consumer> consumer) { + EnumSet types = EnumSet.noneOf(CollectableType.class); + if(P_SWITCH.getState()) types.add(CollectableType.PSWITCH); + if(MEDALS.getState()) types.add(CollectableType.MEDAL); + if(PANEL.getState()) types.add(CollectableType.PANEL); + if(CHUCKS.getState()) types.add(CollectableType.CHUCKS); + consumer.accept(types); + } + + private static JMenuItem item(String name, ActionListener action, KeyStroke stroke) { + JMenuItem item = new JMenuItem(name); + item.addActionListener(action); + item.setAccelerator(stroke); + return item; + } + + private Image[] fromType(CollectableType type) { + return switch(type) { + case MEDAL -> medal; + case PANEL -> panel; + case PSWITCH -> pswitch; + case CHUCKS -> chuck; + default -> pswitch; + }; + } + + public MapPanel(JFrame frame) { + this.owner = frame; + Registry.INSTANCE.load(); + for(Collectable entry : Registry.INSTANCE.collectables()) { + Marker marker = new Marker(entry.id(), entry.type(), entry.name(), entry.position(), fromType(entry.type())); + markers.add(marker); + visibleMarkers.add(marker); + } + MouseAdapter adapter = new MouseAdapter() { + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + double lastZoom = zoom; + zoom = (e.getPreciseWheelRotation() < 0 ? zoom * 1.1F : zoom / 1.1F); + Point mouse = e.getPoint(); + double scaleDiff = zoom / lastZoom; + offset.x = (int) (mouse.x - scaleDiff * (mouse.x - offset.x)); + offset.y = (int) (mouse.y - scaleDiff * (mouse.y - offset.y)); + repaint(); + } + + @Override + public void mousePressed(MouseEvent e) { + lastDrag = e.getPoint(); + } + + @Override + public void mouseMoved(MouseEvent e) { + Point hover = screenToMap(e.getPoint()); + Marker marker = findMarker(hover, zoom); + if(marker == lastMarker) return; + if(lastMarker != null) lastMarker.setHovered(false); + lastMarker = marker; + if(marker == null) return; + marker.setHovered(true); + repaint(); + } + + @Override + public void mouseDragged(MouseEvent e) { + if(lastDrag == null) return; + offset.translate((int)(e.getX() - lastDrag.getX()), (int)(e.getY() - lastDrag.getY())); + lastDrag = e.getPoint(); + repaint(); + } + + @Override + public void mouseClicked(MouseEvent e) { + Point hover = screenToMap(e.getPoint()); + Marker marker = findMarker(hover, zoom); + if(marker == null) return; + if(e.getButton() == 1) { + marker.toggle(); + repaint(); + if(progressUpdate != null) progressUpdate.run(); + } + else if(e.getButton() == 3) { + Collectable element = Registry.INSTANCE.get(marker.id()); + new LocationDisplay(owner, element.name(), element.images()); + } + } + }; + addMouseListener(adapter); + addMouseWheelListener(adapter); + addMouseMotionListener(adapter); + } + + public void onImported() { + markers.forEach(Marker::updateCompletion); + EventQueue.invokeLater(this::repaint); + } + + public void resetZoom() { + zoom = 1F; + EventQueue.invokeLater(this::repaint); + } + + public void resetMap() { + int imgWidth = map.getWidth(this); + int imgHeight = map.getHeight(this); + + int panelWidth = getWidth(); + int panelHeight = getHeight(); + if (imgWidth > 0 && imgHeight > 0 && panelWidth > 0 && panelHeight > 0) { + offset.setLocation((panelWidth - (int)(imgWidth * zoom)) / 2, (panelHeight - (int)(imgHeight * zoom)) / 2); + } + EventQueue.invokeLater(this::repaint); + } + + public void updateFilter(EnumSet types) { + visibleMarkers.clear(); + markers.forEach(T -> { + if(types.contains(T.type())) visibleMarkers.add(T); + }); + EventQueue.invokeLater(this::repaint); + } + + public void setCompletionState(boolean value) { + visibleMarkers.forEach(T -> T.setCompletion(value)); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + Graphics2D g2 = (Graphics2D) g; + + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + AffineTransform at = new AffineTransform(); + at.translate(offset.x, offset.y); + at.scale(zoom, zoom); + g2.setTransform(at); + + g2.drawImage(map, 0, 0, this); + for(Marker marker : visibleMarkers) { + marker.draw(g2, (float)zoom); + } + for(Marker marker : visibleMarkers) { + marker.drawHover(g2, (float)zoom); + } + } + + private Marker findMarker(Point point, float scale) { + for(int i = 0,m=visibleMarkers.size();i>1; + return mouse.x >= point.x - rad && mouse.x <= point.x + rad && mouse.y >= point.y - rad && mouse.y <= point.y + rad; + } + + public boolean isHovered() { + return hovered; + } + + public void setHovered(boolean value) { + this.hovered = value; + } + + public void updateCompletion() { + disabled = Registry.INSTANCE.isCompleted(id); + } + + public void draw(Graphics2D g, float scale) { + int realSize = Math.clamp((int)(32 / scale), 5, 32); + g.drawImage(display[disabled ? 1 : 0], point.x-(realSize>>1), point.y-(realSize>>1), realSize, realSize, null); + } + + public void drawHover(Graphics2D g, float scale) { + int realSize = Math.clamp((int)(32 / scale), 5, 32); + if(hovered) { + g.setColor(Color.BLACK); + g.setStroke(new BasicStroke(1F / scale *2F)); + g.drawRect(point.x-(realSize>>1), point.y-(realSize>>1), realSize, realSize); + } + } +} diff --git a/src/main/java/speiger/src/ui/VerticalFlowLayout.java b/src/main/java/speiger/src/ui/VerticalFlowLayout.java new file mode 100644 index 0000000..6e12d08 --- /dev/null +++ b/src/main/java/speiger/src/ui/VerticalFlowLayout.java @@ -0,0 +1,174 @@ +package speiger.src.ui; + +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Insets; +import java.awt.LayoutManager; + +public class VerticalFlowLayout implements LayoutManager, java.io.Serializable { + + private static final long serialVersionUID = -2732129344472207193L; + + /** + * This value indicates that each row of components + * should be left-justified. + */ + public static final int TOP = 0; + + /** + * This value indicates that each row of components + * should be centered. + */ + public static final int CENTER = 1; + + /** + * This value indicates that each row of components + * should be right-justified. + */ + public static final int BOTTOM = 2; + + int align; + protected int hgap; + protected int vgap; + + /** + * Constructs a new FlowLayout with a centered alignment and a + * default 5-unit horizontal and vertical gap. + */ + public VerticalFlowLayout() { + this(CENTER, 5, 5); + } + + public VerticalFlowLayout(int align) { + this(align, 5, 5); + } + + public VerticalFlowLayout(int align, int hgap, int vgap) { + this.hgap = hgap; + this.vgap = vgap; + setAlignment(align); + } + + public int getAlignment() { return align; } + public void setAlignment(int align) { this.align = align; } + public int getHgap() { return hgap; } + public void setHgap(int hgap) { this.hgap = hgap; } + public int getVgap() { return vgap; } + public void setVgap(int vgap) { this.vgap = vgap; } + + public void addLayoutComponent(String name, Component comp) {} + + public void removeLayoutComponent(Component comp) {} + + public Dimension preferredLayoutSize(Container target) { + synchronized (target.getTreeLock()) { + Dimension dim = new Dimension(0, 0); + int nmembers = target.getComponentCount(); + Boolean firstVisibleComponent = true; + + for (int i = 0; i < nmembers; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + Dimension d = m.getPreferredSize(); + dim.width = Math.max(dim.width, d.width); + if (firstVisibleComponent) { + firstVisibleComponent = false; + } else { + dim.height += vgap; + } + + dim.height += d.height; + } + } + Insets insets = target.getInsets(); + dim.width += insets.left + insets.right + hgap * 2; + dim.height += insets.top + insets.bottom + vgap * 2; + return dim; + } + } + + public Dimension minimumLayoutSize(Container target) { + synchronized (target.getTreeLock()) { + Dimension dim = new Dimension(0, 0); + int nmembers = target.getComponentCount(); + + for (int i = 0; i < nmembers; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + Dimension d = m.getMinimumSize(); + dim.width = Math.max(dim.width, d.width); + if (i > 0) { + dim.height += vgap; + } + dim.height += d.height; + } + } + Insets insets = target.getInsets(); + dim.width += insets.left + insets.right + hgap * 2; + dim.height += insets.top + insets.bottom + vgap * 2; + return dim; + } + } + + private void moveComponents(Container target, int x, int y, int width, int height, + int rowStart, int rowEnd, boolean ltr) { + synchronized (target.getTreeLock()) { + switch (align) { + case TOP: + y += ltr ? 0 : height; + break; + case CENTER: + y += height / 2; + break; + case BOTTOM: + y += ltr ? height : 0; + break; + } + for (int i = rowStart; i < rowEnd; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + if (ltr) { + m.setLocation(x, y); + } else { + m.setLocation(x, target.getHeight() - y - m.getHeight()); + } + y += m.getHeight() + vgap; + } + } + } + } + + public void layoutContainer(Container target) { + synchronized (target.getTreeLock()) { + Insets insets = target.getInsets(); + + int maxlen = target.getHeight() - (insets.top + insets.bottom + vgap * 2); + int nmembers = target.getComponentCount(); + int x = insets.left + hgap, y = 0; + int roww = 0, start = 0; + + boolean ltr = target.getComponentOrientation().isLeftToRight(); + for (int i = 0; i < nmembers; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + Dimension d = m.getPreferredSize(); + m.setSize(d.width, d.height); + if ((y == 0) || ((y + d.height) <= maxlen)) { + if (y > 0) y += vgap; + y += d.height; + roww = Math.max(roww, d.width); + } else { + moveComponents(target, x, insets.top + vgap, roww, maxlen - y, start, i, ltr); + y = d.height; + x += hgap + roww; + roww = d.width; + start = i; + } + } + } + + moveComponents(target, x, insets.top + vgap, roww, maxlen - y, start, nmembers, ltr); + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/data/chucks.json b/src/main/resources/assets/data/chucks.json new file mode 100644 index 0000000..c65acad --- /dev/null +++ b/src/main/resources/assets/data/chucks.json @@ -0,0 +1,49 @@ +{ + "entries": [ + { + "name": "Charging Chuck 1", + "id": "042cb714-5b4b-4e0b-a2cb-f480a4f72405", + "position": { + "x": 942, + "y": 204 + }, + "images": [ + { + "type": "location", + "id": "01377fd7-896e-49db-b9d6-41895caada58", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_14-38-48.jpg" + } + ] + }, + { + "name": "Charging Chuck 2", + "id": "f7d46b9b-5cba-4c51-9ce9-b10e6a57ff0f", + "position": { + "x": 918, + "y": 504 + }, + "images": [ + { + "type": "location", + "id": "70185b92-874c-4e3c-b5e8-fc893d68577d", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_09-19-35.jpg" + } + ] + }, + { + "name": "Charging Chuck 3", + "id": "4212133d-7561-43e7-80e2-3b70ceeb87db", + "position": { + "x": 1300, + "y": 440 + }, + "images": [ + { + "type": "location", + "id": "246e2285-f893-4264-86e7-ed7f2655e69d", + "url": "https://www.gamerguides.com/assets/maps/markers/chargin-chuck.jpg" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/data/medals.json b/src/main/resources/assets/data/medals.json new file mode 100644 index 0000000..29d80b8 --- /dev/null +++ b/src/main/resources/assets/data/medals.json @@ -0,0 +1,3004 @@ +{ + "entries": [ + { + "name": "PM-160", + "id": "086d1d5c-b2d1-4969-ba44-95db55405757", + "position": { + "x": 1114, + "y": 606 + }, + "images": [ + { + "type": "location", + "id": "98f6d343-24df-45ac-9156-423e9e090a5c", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion33.jpg" + } + ] + }, + { + "name": "PM-169", + "id": "abd9042b-765f-4973-8cd2-c343afd27560", + "position": { + "x": 1137, + "y": 578 + }, + "images": [ + { + "type": "location", + "id": "c876a0b6-145c-4ab0-b67f-84f261fcfabf", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_20-37-26_(2).jpg" + } + ] + }, + { + "name": "PM-192", + "id": "4cd19094-2c7e-4673-b70c-2b5b389573ef", + "position": { + "x": 1351, + "y": 372 + }, + "images": [ + { + "type": "location", + "id": "decbfdea-ee3e-4540-a5fc-9cedddb3ffc4", + "url": "https://mkw.techtangents.net/marker/medal/PM-192/location.jpg" + } + ] + }, + { + "name": "PM-009", + "id": "aefc6c2f-6555-4779-80ab-c555309a828b", + "position": { + "x": 969, + "y": 909 + }, + "images": [ + { + "type": "location", + "id": "741ce517-cb8b-420d-95ed-96bbfdb3bbe0", + "url": "https://mkw.techtangents.net/marker/medal/PM-009/location.jpg" + } + ] + }, + { + "name": "PM-010", + "id": "4a80d411-4862-4f13-bfc5-4b252dca02ee", + "position": { + "x": 947, + "y": 895 + }, + "images": [ + { + "type": "location", + "id": "b4fa7343-c816-48b3-b525-322ccbc8e781", + "url": "https://mkw.techtangents.net/marker/medal/PM-010/location.jpg" + } + ] + }, + { + "name": "PM-011", + "id": "7c4d3fdc-0bd8-46c3-bda2-5c0b40199db9", + "position": { + "x": 1023, + "y": 895 + }, + "images": [ + { + "type": "location", + "id": "e4de95ee-cd0d-40ad-b022-7000977e117f", + "url": "https://mkw.techtangents.net/marker/medal/PM-011/location.jpg" + } + ] + }, + { + "name": "PM-012", + "id": "e5d2c7dc-790c-4e6c-9cef-4c6a202b54b3", + "position": { + "x": 962, + "y": 814 + }, + "images": [ + { + "type": "location", + "id": "164d06ed-c239-4a8a-bd07-3ecd959a5339", + "url": "https://mkw.techtangents.net/marker/medal/PM-012/location.jpg" + } + ] + }, + { + "name": "PM-117", + "id": "a5ef6fca-25c7-4c28-be32-491afe36ef8e", + "position": { + "x": 961, + "y": 554 + }, + "images": [ + { + "type": "location", + "id": "f9725c39-1897-42a0-8f13-08d597c2176e", + "url": "https://mkw.techtangents.net/marker/medal/PM-117/location.jpg" + } + ] + }, + { + "name": "PM-119", + "id": "123d93e6-cb5f-4555-858f-dde4753868b3", + "position": { + "x": 961, + "y": 570 + }, + "images": [ + { + "type": "location", + "id": "560898a9-11dc-4060-b7f0-7022461a4fc0", + "url": "https://mkw.techtangents.net/marker/medal/PM-119/location.jpg" + } + ] + }, + { + "name": "PM-122", + "id": "c09fcf19-e7b6-44fe-8c1c-dcc61e3cbb19", + "position": { + "x": 1002, + "y": 597 + }, + "images": [ + { + "type": "location", + "id": "343cbe9b-0ccd-4cc9-b0fd-b42e28b79e4a", + "url": "https://mkw.techtangents.net/marker/medal/PM-122/location.jpg" + } + ] + }, + { + "name": "PM-123", + "id": "d71b4be1-0db9-49bf-8a5a-92ab078d8c22", + "position": { + "x": 1005, + "y": 733 + }, + "images": [ + { + "type": "location", + "id": "c5ad1bc7-bd64-4775-8d8e-40696c206198", + "url": "https://mkw.techtangents.net/marker/medal/PM-123/location.jpg" + } + ] + }, + { + "name": "PM-124", + "id": "6483758c-9750-4868-8706-927c1a44ff20", + "position": { + "x": 1041, + "y": 687 + }, + "images": [ + { + "type": "location", + "id": "2e89778f-8403-4ccf-9f79-e3bcad129e26", + "url": "https://mkw.techtangents.net/marker/medal/PM-124/location.jpg" + } + ] + }, + { + "name": "PM-127", + "id": "ce631d3c-93ee-4f67-8a72-1cedafba574e", + "position": { + "x": 1066, + "y": 706 + }, + "images": [ + { + "type": "location", + "id": "c4f57cce-9a0e-43ca-8f7e-70c522ab9475", + "url": "https://mkw.techtangents.net/marker/medal/PM-127/location.jpg" + } + ] + }, + { + "name": "PM-128", + "id": "068933f2-4ff5-41ac-be61-4f7a6ed8ae0b", + "position": { + "x": 1143, + "y": 688 + }, + "images": [ + { + "type": "location", + "id": "12e01ef5-7391-4a1f-a2ba-8fb70865e296", + "url": "https://mkw.techtangents.net/marker/medal/PM-128/location.jpg" + } + ] + }, + { + "name": "PM-129", + "id": "39d3c825-e804-4f97-ac82-651b84a75bfc", + "position": { + "x": 1087, + "y": 750 + }, + "images": [ + { + "type": "location", + "id": "53da67fe-6bd7-43b4-946a-fc0d94a4e689", + "url": "https://mkw.techtangents.net/marker/medal/PM-129/location.jpg" + } + ] + }, + { + "name": "PM-130", + "id": "02b1480c-491a-4064-87ef-c3eb5d87c279", + "position": { + "x": 1053, + "y": 761 + }, + "images": [ + { + "type": "location", + "id": "faab9edc-ffd7-41ab-8c13-0cadfefa8e61", + "url": "https://mkw.techtangents.net/marker/medal/PM-130/location.jpg" + } + ] + }, + { + "name": "PM-131", + "id": "34a51167-4827-47a2-8983-98c996e25f45", + "position": { + "x": 1051, + "y": 793 + }, + "images": [ + { + "type": "location", + "id": "f7e79261-605f-46a5-ad84-50bd41d59391", + "url": "https://mkw.techtangents.net/marker/medal/PM-131/location.jpg" + } + ] + }, + { + "name": "PM-132", + "id": "a78804d6-b476-472d-9684-fe322164de5b", + "position": { + "x": 1067, + "y": 811 + }, + "images": [ + { + "type": "location", + "id": "bbd69344-fba9-4cb5-bce9-1d4fae30b23b", + "url": "https://mkw.techtangents.net/marker/medal/PM-132/location.jpg" + } + ] + }, + { + "name": "PM-133", + "id": "a680bb24-191e-4e05-a853-14a22d1ee510", + "position": { + "x": 1120, + "y": 759 + }, + "images": [ + { + "type": "location", + "id": "a1051d81-c963-4570-9547-4e37eda557d0", + "url": "https://mkw.techtangents.net/marker/medal/PM-133/location.jpg" + } + ] + }, + { + "name": "PM-134", + "id": "287be749-0ff8-40fa-bb03-c028e7d79950", + "position": { + "x": 1145, + "y": 771 + }, + "images": [ + { + "type": "location", + "id": "6a06d48b-7aba-4184-89b4-90b7de00ee9f", + "url": "https://mkw.techtangents.net/marker/medal/PM-134/location.jpg" + } + ] + }, + { + "name": "PM-135", + "id": "92deba5e-a3e7-47be-b61f-1ab9e76bafb1", + "position": { + "x": 1188, + "y": 755 + }, + "images": [ + { + "type": "location", + "id": "2d385ba0-5b88-4d87-9ffc-16d5539901c4", + "url": "https://mkw.techtangents.net/marker/medal/PM-135/location.jpg" + } + ] + }, + { + "name": "PM-136", + "id": "14597169-8904-4fd8-897a-646e53380292", + "position": { + "x": 1108, + "y": 910 + }, + "images": [ + { + "type": "location", + "id": "a4dfbb6e-c23d-46a8-bd70-e9bf85296718", + "url": "https://mkw.techtangents.net/marker/medal/PM-136/location.jpg" + } + ] + }, + { + "name": "PM-137", + "id": "372a3b74-3583-430b-b9b7-4717ba195eb6", + "position": { + "x": 1105, + "y": 897 + }, + "images": [ + { + "type": "location", + "id": "23adaa4e-8d81-4c8e-a492-814b250c7578", + "url": "https://mkw.techtangents.net/marker/medal/PM-137/location.jpg" + } + ] + }, + { + "name": "PM-138", + "id": "0d795624-232e-48f6-bf31-8ec591cc51bb", + "position": { + "x": 1082, + "y": 981 + }, + "images": [ + { + "type": "location", + "id": "0c9399f7-83c8-44ee-8b56-77e344a3c57d", + "url": "https://mkw.techtangents.net/marker/medal/PM-138/location.jpg" + } + ] + }, + { + "name": "PM-139", + "id": "8703c001-b3db-43e6-9b4f-c68964573ac5", + "position": { + "x": 1145, + "y": 972 + }, + "images": [ + { + "type": "location", + "id": "fb88a72c-c744-45cc-a2ed-9e794562cbe1", + "url": "https://mkw.techtangents.net/marker/medal/PM-139/location.jpg" + } + ] + }, + { + "name": "PM-140", + "id": "7c93488b-8cc9-472b-8cfe-9ac1f949dc24", + "position": { + "x": 1117, + "y": 988 + }, + "images": [ + { + "type": "location", + "id": "84e40e7e-f27f-4ea2-9580-a24fc2dcb780", + "url": "https://mkw.techtangents.net/marker/medal/PM-140/location.jpg" + } + ] + }, + { + "name": "PM-141", + "id": "35a7d9dd-143e-4ce9-a5e8-08d2166fce7c", + "position": { + "x": 1219, + "y": 924 + }, + "images": [ + { + "type": "location", + "id": "31cdac3e-75de-4be3-aa8d-94afedb34902", + "url": "https://mkw.techtangents.net/marker/medal/PM-141/location.jpg" + } + ] + }, + { + "name": "PM-142", + "id": "dd7b824b-9d67-4676-bee3-bd22b2aa0c0f", + "position": { + "x": 1189, + "y": 912 + }, + "images": [ + { + "type": "location", + "id": "11612aad-d6af-4f43-9569-19ad10639c0e", + "url": "https://mkw.techtangents.net/marker/medal/PM-142/location.jpg" + } + ] + }, + { + "name": "PM-143", + "id": "767f00e8-fc3c-462c-98c6-440392583396", + "position": { + "x": 1216, + "y": 871 + }, + "images": [ + { + "type": "location", + "id": "f81c94fe-99fa-4afe-90ad-b9a6fb980f7c", + "url": "https://mkw.techtangents.net/marker/medal/PM-143/location.jpg" + } + ] + }, + { + "name": "PM-145", + "id": "2b8a8596-634b-4a3f-8d98-c4c2960da4a3", + "position": { + "x": 1329, + "y": 911 + }, + "images": [ + { + "type": "location", + "id": "d9d542f2-7220-40c1-be94-deb1745d3cd2", + "url": "https://mkw.techtangents.net/marker/medal/PM-145/location.jpg" + } + ] + }, + { + "name": "PM-146", + "id": "ee2886ec-0f6e-4c4a-9c7b-bde12388815a", + "position": { + "x": 1331, + "y": 899 + }, + "images": [ + { + "type": "location", + "id": "585f8994-07ab-4f05-9f8c-9722abc8e18d", + "url": "https://mkw.techtangents.net/marker/medal/PM-146/location.jpg" + } + ] + }, + { + "name": "PM-147", + "id": "ae70cf52-0b6e-4b62-8295-0ef2ec3d9045", + "position": { + "x": 1395, + "y": 765 + }, + "images": [ + { + "type": "location", + "id": "964e55f7-f17a-4288-b993-0760e01fecc7", + "url": "https://mkw.techtangents.net/marker/medal/PM-147/location.jpg" + } + ] + }, + { + "name": "PM-148", + "id": "8d8a6b0f-6535-4e2e-9c08-f8e590a7b153", + "position": { + "x": 1435, + "y": 787 + }, + "images": [ + { + "type": "location", + "id": "9f85c967-48e8-45af-9713-edc9c9bf11fe", + "url": "https://mkw.techtangents.net/marker/medal/PM-148/location.jpg" + } + ] + }, + { + "name": "PM-149", + "id": "10a69427-5c36-454b-a45e-60fb276939e1", + "position": { + "x": 1297, + "y": 823 + }, + "images": [ + { + "type": "location", + "id": "a7370174-e2fe-48af-8968-e5e150531496", + "url": "https://mkw.techtangents.net/marker/medal/PM-149/location.jpg" + } + ] + }, + { + "name": "PM-150", + "id": "66fa19cd-dac5-48ce-bd59-7b092a7f87f3", + "position": { + "x": 1299, + "y": 787 + }, + "images": [ + { + "type": "location", + "id": "aa4d28fa-5f24-4176-bab5-8a59b9dbcfc2", + "url": "https://mkw.techtangents.net/marker/medal/PM-150/location.jpg" + } + ] + }, + { + "name": "PM-154", + "id": "2353b21d-6358-4f0a-a939-017832bd4d56", + "position": { + "x": 1230, + "y": 644 + }, + "images": [ + { + "type": "location", + "id": "726abea2-09ab-44fb-ad3f-08df0f498059", + "url": "https://mkw.techtangents.net/marker/medal/PM-154/location.jpg" + } + ] + }, + { + "name": "PM-155", + "id": "91aece1b-4295-433e-ac30-db2985f33206", + "position": { + "x": 1236, + "y": 633 + }, + "images": [ + { + "type": "location", + "id": "2d04865a-62dc-4f0d-8015-307535395a12", + "url": "https://mkw.techtangents.net/marker/medal/PM-155/location.jpg" + } + ] + }, + { + "name": "PM-156", + "id": "025b84f4-f516-41d9-be13-b3260f0b39d1", + "position": { + "x": 1197, + "y": 670 + }, + "images": [ + { + "type": "location", + "id": "205bf82a-30b0-4abb-b225-51efd5161b3b", + "url": "https://mkw.techtangents.net/marker/medal/PM-156/location.jpg" + } + ] + }, + { + "name": "PM-157", + "id": "df89a472-df04-45f6-bbbf-ce22f6d81f4b", + "position": { + "x": 1302, + "y": 729 + }, + "images": [ + { + "type": "location", + "id": "fdd71037-74f7-408d-87cf-4a3f21bdf250", + "url": "https://mkw.techtangents.net/marker/medal/PM-157/location.jpg" + } + ] + }, + { + "name": "PM-163", + "id": "8767b80d-8b90-40ef-99dd-e9c7cddc67d7", + "position": { + "x": 1406, + "y": 567 + }, + "images": [ + { + "type": "location", + "id": "9bfbcb90-1cc0-41d5-b5c7-019db88bb764", + "url": "https://mkw.techtangents.net/marker/medal/PM-163/location.jpg" + } + ] + }, + { + "name": "PM-165", + "id": "4205c499-7c75-484e-bec2-c8c18b6dc9cd", + "position": { + "x": 1366, + "y": 578 + }, + "images": [ + { + "type": "location", + "id": "58d79719-baaf-48a9-9da7-18fcaa5b2313", + "url": "https://mkw.techtangents.net/marker/medal/PM-165/location.jpg" + } + ] + }, + { + "name": "PM-166", + "id": "19ac1019-bd4e-4bee-a1a9-f6e49d7ce30d", + "position": { + "x": 1336, + "y": 562 + }, + "images": [ + { + "type": "location", + "id": "2b20f24a-da28-4acf-8a07-db81eb4df143", + "url": "https://mkw.techtangents.net/marker/medal/PM-166/location.jpg" + } + ] + }, + { + "name": "PM-167", + "id": "e39f8e32-330d-4d22-af41-7204bfd1a2e9", + "position": { + "x": 1176, + "y": 600 + }, + "images": [ + { + "type": "location", + "id": "6bb09138-6f5c-458a-bb50-e706215bc6b7", + "url": "https://mkw.techtangents.net/marker/medal/PM-167/location.jpg" + } + ] + }, + { + "name": "PM-168", + "id": "d65fc06f-eca9-4db7-91b9-3425cf5ecb28", + "position": { + "x": 1221, + "y": 579 + }, + "images": [ + { + "type": "location", + "id": "d5a2c8b7-cabf-4ced-89f7-948ab862f4cb", + "url": "https://mkw.techtangents.net/marker/medal/PM-168/location.jpg" + } + ] + }, + { + "name": "PM-178", + "id": "d0d47e60-7af8-4412-9b23-7524541b129c", + "position": { + "x": 1406, + "y": 391 + }, + "images": [ + { + "type": "location", + "id": "5de799a5-006e-4b5c-af27-763b8583e945", + "url": "https://mkw.techtangents.net/marker/medal/PM-178/location.jpg" + } + ] + }, + { + "name": "PM-179", + "id": "4f3bc905-4553-4a93-a2a6-4872fb17f277", + "position": { + "x": 1405, + "y": 474 + }, + "images": [ + { + "type": "location", + "id": "523279ad-0f9c-4965-a88c-a3fcc563862b", + "url": "https://mkw.techtangents.net/marker/medal/PM-179/location.jpg" + } + ] + }, + { + "name": "PM-001", + "id": "9543ed82-9f3e-4e6c-9cbf-ea50f38faec1", + "position": { + "x": 820, + "y": 1008 + }, + "images": [ + { + "type": "location", + "id": "5cb4e39f-014e-42e3-a9e7-d8e18091a391", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion2.jpg" + } + ] + }, + { + "name": "PM-002", + "id": "d232f5c0-f5e7-4eef-9003-d4bff5ea91b3", + "position": { + "x": 761, + "y": 956 + }, + "images": [ + { + "type": "location", + "id": "3cf1889d-992a-415c-9fe1-a6ce81c45cbe", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion14.jpg" + } + ] + }, + { + "name": "PM-003", + "id": "9acfa413-2af3-4679-b1bd-7009e1fad35d", + "position": { + "x": 795, + "y": 950 + }, + "images": [ + { + "type": "location", + "id": "7d95587e-9bba-4415-a256-32824ad2102e", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion28.jpg" + } + ] + }, + { + "name": "PM-004", + "id": "9e293bcb-f060-4792-b78a-8dd841f70c52", + "position": { + "x": 824, + "y": 952 + }, + "images": [ + { + "type": "location", + "id": "4e4344f0-4c67-4bde-bfa0-93f0945454cb", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_13-47-48.jpg" + } + ] + }, + { + "name": "PM-005", + "id": "8d945c29-0fef-4f57-9e18-c4e060745b45", + "position": { + "x": 698, + "y": 980 + }, + "images": [ + { + "type": "location", + "id": "fb739028-7d28-4253-9298-6943999b8cd8", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_14-27-58.jpg" + } + ] + }, + { + "name": "PM-006", + "id": "c637b998-4d0c-47cb-8e07-860b47054c35", + "position": { + "x": 711, + "y": 916 + }, + "images": [ + { + "type": "location", + "id": "6da171ea-9370-470a-9c75-79e8bc136b32", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion12.jpg" + } + ] + }, + { + "name": "PM-007", + "id": "9bf7c3c4-193c-4da7-a581-2a3ac488a6b0", + "position": { + "x": 737, + "y": 881 + }, + "images": [ + { + "type": "location", + "id": "746bde57-c208-4984-bf70-6d336c15e666", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-17_11-51-15.jpg" + } + ] + }, + { + "name": "PM-008", + "id": "d7fa1c03-aa75-475b-b11a-30ad4f7a437b", + "position": { + "x": 744, + "y": 836 + }, + "images": [ + { + "type": "location", + "id": "e04dbdd9-d48e-445c-8d99-7e7f9a732f75", + "url": "https://mkw.techtangents.net/marker/medal/PM-008/location.jpg" + } + ] + }, + { + "name": "PM-013", + "id": "74705136-2120-4f72-9de8-e4e2829151cf", + "position": { + "x": 785, + "y": 818 + }, + "images": [ + { + "type": "location", + "id": "92e72a4d-b094-474e-adaf-ea7f056e1978", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion7.jpg" + } + ] + }, + { + "name": "PM-014", + "id": "f3d83ba2-1237-4a56-9930-056a4d254e11", + "position": { + "x": 834, + "y": 766 + }, + "images": [ + { + "type": "location", + "id": "4336b5d6-c4a9-499c-b4b3-a06afc91adf0", + "url": "https://mkw.techtangents.net/marker/medal/PM-014/location.jpg" + } + ] + }, + { + "name": "PM-015", + "id": "ed5f38c2-2c59-493d-9e76-1927f596a9a5", + "position": { + "x": 811, + "y": 811 + }, + "images": [ + { + "type": "location", + "id": "63d3259c-f532-4a24-a435-c66e2304f707", + "url": "https://mkw.techtangents.net/marker/medal/PM-015/location.jpg" + } + ] + }, + { + "name": "PM-016", + "id": "ad990a91-6524-4bea-9c20-964c39438865", + "position": { + "x": 808, + "y": 805 + }, + "images": [ + { + "type": "location", + "id": "6a8c99a5-40b4-42b0-8a5f-18a2822572d7", + "url": "https://mkw.techtangents.net/marker/medal/PM-016/location.jpg" + } + ] + }, + { + "name": "PM-017", + "id": "6e0c2a8b-c397-40c1-aa84-74c74981cad9", + "position": { + "x": 843, + "y": 694 + }, + "images": [ + { + "type": "location", + "id": "29fd3174-7a13-4ec4-a44b-6961b587ff1f", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_13-08-19.jpg" + } + ] + }, + { + "name": "PM-018", + "id": "19e1127a-dc68-48cc-a870-158a6122a965", + "position": { + "x": 819, + "y": 683 + }, + "images": [ + { + "type": "location", + "id": "96e0317f-ffb3-4304-90f8-50cbb429c360", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion39.jpg" + } + ] + }, + { + "name": "PM-019", + "id": "0480cbad-f178-4212-87cc-4912384e39df", + "position": { + "x": 705, + "y": 812 + }, + "images": [ + { + "type": "location", + "id": "a32362a1-0c00-4dcc-be47-b847af769c11", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_15-20-58.jpg" + } + ] + }, + { + "name": "PM-020", + "id": "92b7821c-2c39-434c-9f20-f454f060db15", + "position": { + "x": 687, + "y": 801 + }, + "images": [ + { + "type": "location", + "id": "65014d06-af38-4f05-851c-cf55a843d2f6", + "url": "https://mkw.techtangents.net/marker/medal/PM-020/location.jpg" + } + ] + }, + { + "name": "PM-021", + "id": "d6909e8a-4230-4432-98ba-3d4ea8e9c6f6", + "position": { + "x": 828, + "y": 747 + }, + "images": [ + { + "type": "location", + "id": "61e249d2-1756-460c-bfe5-901bf2aa1497", + "url": "https://mkw.techtangents.net/marker/medal/PM-021/location.jpg" + } + ] + }, + { + "name": "PM-022", + "id": "736d9e4d-e716-4ec1-b4a4-21eef515654d", + "position": { + "x": 800, + "y": 821 + }, + "images": [ + { + "type": "location", + "id": "c3b2fd6c-87b5-4ce4-ada8-9f73613ae2f4", + "url": "https://mkw.techtangents.net/marker/medal/PM-022/location.jpg" + } + ] + }, + { + "name": "PM-023", + "id": "679024af-9498-4d79-a4d2-6f04d2cd0640", + "position": { + "x": 650, + "y": 839 + }, + "images": [ + { + "type": "location", + "id": "ed2f3c09-cb03-4367-9bdc-ec9ac17bd7d4", + "url": "https://mkw.techtangents.net/marker/medal/PM-023/location.jpg" + } + ] + }, + { + "name": "PM-024", + "id": "3def473e-a5d3-4178-8fa5-dd2cc5f2da89", + "position": { + "x": 605, + "y": 834 + }, + "images": [ + { + "type": "location", + "id": "48b3932d-c6e9-4e91-9279-460e62a834de", + "url": "https://mkw.techtangents.net/marker/medal/PM-024/location.jpg" + } + ] + }, + { + "name": "PM-025", + "id": "ace5ecae-b2b1-4a21-9e3d-e8d32c95d779", + "position": { + "x": 620, + "y": 874 + }, + "images": [ + { + "type": "location", + "id": "31c89f74-a2d5-41ee-b2c0-d670c5f5fc40", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-07_16-10-10.jpg" + } + ] + }, + { + "name": "PM-026", + "id": "9499c7af-730b-4659-a948-53c73dbf476d", + "position": { + "x": 622, + "y": 898 + }, + "images": [ + { + "type": "location", + "id": "6bf3cc7e-6570-47aa-9287-ed15f07a72d3", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-07_16-23-18.png" + } + ] + }, + { + "name": "PM-027", + "id": "c6b0031c-49f9-4067-94a8-40d0b66a2ccf", + "position": { + "x": 547, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "2f17b672-98c6-4172-a150-a01cf0927fb9", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_19-13-35.jpg" + } + ] + }, + { + "name": "PM-028", + "id": "0a5525a2-9849-4a07-b099-c562ffc3ac59", + "position": { + "x": 527, + "y": 768 + }, + "images": [ + { + "type": "location", + "id": "3568b1ba-06ec-4fa4-8305-3382fce8dc05", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_11-14-37.jpg" + } + ] + }, + { + "name": "PM-029", + "id": "8c5d79b5-df1b-4fc4-a4fe-1069e1e51600", + "position": { + "x": 466, + "y": 784 + }, + "images": [ + { + "type": "location", + "id": "465a3396-7fef-4e25-b258-cc6b3a9918f7", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-06_12-57-03.jpg" + } + ] + }, + { + "name": "PM-030", + "id": "e1fe0cb1-98d5-4eae-b2f7-746aae0c79a6", + "position": { + "x": 488, + "y": 796 + }, + "images": [ + { + "type": "location", + "id": "1d7d6813-0a91-4f0c-a373-af51b782d343", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_12-11-04.jpg" + } + ] + }, + { + "name": "PM-031", + "id": "c0bb5cd9-c541-487d-b29c-95803858c064", + "position": { + "x": 457, + "y": 715 + }, + "images": [ + { + "type": "location", + "id": "f0e81c64-d897-4b9d-b594-0d3acb9da57d", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-05_21-01-38.jpg" + } + ] + }, + { + "name": "PM-032", + "id": "932dd089-529b-4d03-abf8-ebc01fd074ad", + "position": { + "x": 506, + "y": 710 + }, + "images": [ + { + "type": "location", + "id": "d989a156-c61c-46dc-a467-64ce5c6ed779", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-06_11-54-51.jpg" + } + ] + }, + { + "name": "PM-033", + "id": "8d8755a7-8624-4bdb-886f-994ff15e0c77", + "position": { + "x": 596, + "y": 670 + }, + "images": [ + { + "type": "location", + "id": "e5e6dc52-885e-4fda-b622-ef282481ffe9", + "url": "https://mkw.techtangents.net/marker/medal/PM-033/location.jpg" + } + ] + }, + { + "name": "PM-034", + "id": "4a6db202-ad5b-4a1b-93ad-8d6c07255611", + "position": { + "x": 626, + "y": 677 + }, + "images": [ + { + "type": "location", + "id": "d4cc0e42-0ab1-45b3-8632-650c0c478eee", + "url": "https://mkw.techtangents.net/marker/medal/PM-034/location.jpg" + } + ] + }, + { + "name": "PM-035", + "id": "f2851e82-28ee-42c5-977a-310a6769bf0e", + "position": { + "x": 663, + "y": 660 + }, + "images": [ + { + "type": "location", + "id": "abafb839-df94-41f9-a77c-edee97ad1f77", + "url": "https://mkw.techtangents.net/marker/medal/PM-035/location.jpg" + } + ] + }, + { + "name": "PM-036", + "id": "a1e0161a-40a9-41db-87b5-ad6de8ce32a1", + "position": { + "x": 692, + "y": 660 + }, + "images": [ + { + "type": "location", + "id": "645d7589-56ac-4521-bc18-447bed44f9c6", + "url": "https://mkw.techtangents.net/marker/medal/PM-036/location.jpg" + } + ] + }, + { + "name": "PM-037", + "id": "d4d43f81-4005-444b-9f15-fd9e37d9a961", + "position": { + "x": 603, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "1aa495d5-abd3-4b1a-8904-b346672dfd07", + "url": "https://mkw.techtangents.net/marker/medal/PM-037/location.jpg" + } + ] + }, + { + "name": "PM-038", + "id": "a75ec2f6-e4f3-4a67-8295-8d6ce8cc23e3", + "position": { + "x": 535, + "y": 553 + }, + "images": [ + { + "type": "location", + "id": "572208a6-1127-4dcd-b269-51ecd6a511f4", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_11-44-43.jpg" + } + ] + }, + { + "name": "PM-039", + "id": "55e6b0ad-0588-4dfa-ba2e-e7585b85be2d", + "position": { + "x": 517, + "y": 642 + }, + "images": [ + { + "type": "location", + "id": "9c337762-4615-439c-ab61-76807ce9d88a", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_12-08-30.jpg" + } + ] + }, + { + "name": "PM-040", + "id": "bd08b982-1bf9-45fc-ab41-fcc06efd4275", + "position": { + "x": 646, + "y": 563 + }, + "images": [ + { + "type": "location", + "id": "9dd03bab-9b95-42a6-a0d6-84883147ee0b", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_16-36-22.jpg" + } + ] + }, + { + "name": "PM-041", + "id": "3596b555-ef57-40e0-8562-72243e4b8060", + "position": { + "x": 429, + "y": 579 + }, + "images": [ + { + "type": "location", + "id": "f3a82986-f09b-4020-8d8a-4de963720146", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_16-46-33.jpg" + } + ] + }, + { + "name": "PM-042", + "id": "3a35c00f-f559-453c-975e-755123f71d98", + "position": { + "x": 477, + "y": 575 + }, + "images": [ + { + "type": "location", + "id": "05fa643c-e6df-4373-9213-35a244c5146c", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-07_19-02-36.jpg" + } + ] + }, + { + "name": "PM-043", + "id": "ca4546f6-05c5-4353-bc69-1c5b6065390d", + "position": { + "x": 465, + "y": 549 + }, + "images": [ + { + "type": "location", + "id": "2d7333a8-bcf5-460f-9ea7-bca40212994f", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-06_09-54-38.jpg" + } + ] + }, + { + "name": "PM-044", + "id": "537105d3-38ea-4579-8fc7-cc05c1dfdedc", + "position": { + "x": 475, + "y": 541 + }, + "images": [ + { + "type": "location", + "id": "4662cfa9-4d5f-4e98-97cc-103122186d55", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_15-21-51.jpg" + } + ] + }, + { + "name": "PM-045", + "id": "baac928d-9a22-4ece-b03c-bc79b75e502a", + "position": { + "x": 434, + "y": 526 + }, + "images": [ + { + "type": "location", + "id": "c913fadd-4e13-4660-9845-85b292190d5a", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_09-33-18.jpg" + } + ] + }, + { + "name": "PM-046", + "id": "2af43212-cf90-4f9d-8f7d-3fb9d63c8eb4", + "position": { + "x": 562, + "y": 526 + }, + "images": [ + { + "type": "location", + "id": "6423a9a9-77fb-419b-877f-825514a24602", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-05_19-32-39.jpg" + } + ] + }, + { + "name": "PM-047", + "id": "b06edfe3-e5f0-4c4c-abb5-ccef028099d7", + "position": { + "x": 488, + "y": 531 + }, + "images": [ + { + "type": "location", + "id": "71ae50e8-c4d4-461b-a72f-f7713d8fe8b7", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-06_11-17-33.jpg" + } + ] + }, + { + "name": "PM-048", + "id": "6ae0805b-dffe-4530-8f6a-67a636cbcf2d", + "position": { + "x": 542, + "y": 500 + }, + "images": [ + { + "type": "location", + "id": "0ecde226-2e27-4fda-a476-a2e1b84906df", + "url": "https://mkw.techtangents.net/marker/medal/PM-048/location.jpg" + } + ] + }, + { + "name": "PM-049", + "id": "573f1295-83bf-47f7-acc3-3b6653f2dabe", + "position": { + "x": 491, + "y": 308 + }, + "images": [ + { + "type": "location", + "id": "4c8d4d62-373a-463a-9478-f5465596da05", + "url": "https://mkw.techtangents.net/marker/medal/PM-049/location.jpg" + } + ] + }, + { + "name": "PM-050", + "id": "0c4753fc-628f-4943-b5db-815b488d3f0d", + "position": { + "x": 522, + "y": 344 + }, + "images": [ + { + "type": "location", + "id": "5360dd95-c41c-41d4-af45-de1add32aee7", + "url": "https://mkw.techtangents.net/marker/medal/PM-050/location.jpg" + } + ] + }, + { + "name": "PM-051", + "id": "171a7a88-3851-4cfd-ba84-9fc607febf48", + "position": { + "x": 612, + "y": 339 + }, + "images": [ + { + "type": "location", + "id": "3a33bf9f-4900-4134-b1c1-3347ad911134", + "url": "https://mkw.techtangents.net/marker/medal/PM-051/location.jpg" + } + ] + }, + { + "name": "PM-052", + "id": "03cdfd94-589d-4440-8ad9-458e6389159d", + "position": { + "x": 610, + "y": 513 + }, + "images": [ + { + "type": "location", + "id": "0bf55e24-a1e6-479d-8321-6c6aa22714be", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_14-45-51.jpg" + } + ] + }, + { + "name": "PM-053", + "id": "428770a1-6b33-47fc-8fc9-3cb2c969499b", + "position": { + "x": 651, + "y": 518 + }, + "images": [ + { + "type": "location", + "id": "8d264870-454b-4bcf-8d07-e1bdf2b370d6", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_16-38-32.jpg" + } + ] + }, + { + "name": "PM-054", + "id": "3d639a01-8fc5-4dc5-9e80-6c0c380f5d34", + "position": { + "x": 646, + "y": 480 + }, + "images": [ + { + "type": "location", + "id": "c6184634-091c-4a98-9876-13354cdb5d9d", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-08_12-40-10.jpg" + } + ] + }, + { + "name": "PM-055", + "id": "2cfd2dc0-fc86-4a9f-b2e6-6af41f44f98b", + "position": { + "x": 670, + "y": 444 + }, + "images": [ + { + "type": "location", + "id": "15973a83-bf9f-4a8d-9256-de867ac65f10", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-08_12-35-18.jpg" + } + ] + }, + { + "name": "PM-056", + "id": "a356578c-2b1c-4c9a-b96b-56ec539eed72", + "position": { + "x": 677, + "y": 443 + }, + "images": [ + { + "type": "location", + "id": "339ac081-7e00-4bb6-aca2-a783e1758727", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_16-41-17.jpg" + } + ] + }, + { + "name": "PM-057", + "id": "55dd923c-567d-4583-b1b5-5c2f4cdbf18b", + "position": { + "x": 521, + "y": 479 + }, + "images": [ + { + "type": "location", + "id": "57736a40-ecc7-45ca-9879-4bdac3c75c0f", + "url": "https://mkw.techtangents.net/marker/medal/PM-057/location.jpg" + } + ] + }, + { + "name": "PM-058", + "id": "01d758b2-ba58-4470-a34c-c49ff1675cd4", + "position": { + "x": 680, + "y": 409 + }, + "images": [ + { + "type": "location", + "id": "560b6a89-5905-4a44-aea5-c5ea796cfeea", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_16-13-49.jpg" + } + ] + }, + { + "name": "PM-059", + "id": "d5ce498e-ddb1-4003-8fc8-09364b8db518", + "position": { + "x": 707, + "y": 378 + }, + "images": [ + { + "type": "location", + "id": "fb25b345-f7ca-4489-82f6-92982dbb35a1", + "url": "https://mkw.techtangents.net/marker/medal/PM-059/location.jpg" + } + ] + }, + { + "name": "PM-060", + "id": "b95c6615-4f12-41f0-ae60-7404cd70e89a", + "position": { + "x": 750, + "y": 300 + }, + "images": [ + { + "type": "location", + "id": "3c055ca6-9bcd-4b7e-8ba9-05487938e1a4", + "url": "https://mkw.techtangents.net/marker/medal/PM-060/location.jpg" + } + ] + }, + { + "name": "PM-061", + "id": "6bdc27d3-946f-4c23-bc2f-6284e9790b71", + "position": { + "x": 672, + "y": 208 + }, + "images": [ + { + "type": "location", + "id": "ebf3f081-0104-404f-9ff4-b9cd37091e2b", + "url": "https://mkw.techtangents.net/marker/medal/PM-061/location.jpg" + } + ] + }, + { + "name": "PM-062", + "id": "b5e574f4-7fe2-4058-8d68-e173b7079dae", + "position": { + "x": 662, + "y": 332 + }, + "images": [ + { + "type": "location", + "id": "9eb447b5-90d9-45e0-9e4e-dfe5e5629312", + "url": "https://mkw.techtangents.net/marker/medal/PM-062/location.jpg" + } + ] + }, + { + "name": "PM-063", + "id": "b334daf2-cea7-4c37-ba73-472bf0379d44", + "position": { + "x": 759, + "y": 221 + }, + "images": [ + { + "type": "location", + "id": "78592ce4-08ae-4459-b5ff-8858a2a07e1f", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_16-14-17.jpg" + } + ] + }, + { + "name": "PM-064", + "id": "bb7ea5e8-6ed6-4220-88fb-0b6dbe05ae27", + "position": { + "x": 515, + "y": 391 + }, + "images": [ + { + "type": "location", + "id": "c6122255-b42c-459f-a786-3ca177e1f441", + "url": "https://mkw.techtangents.net/marker/medal/PM-064/location.jpg" + } + ] + }, + { + "name": "PM-065", + "id": "14f73ac1-0dd7-452a-b588-efef479ba616", + "position": { + "x": 659, + "y": 215 + }, + "images": [ + { + "type": "location", + "id": "7fd01b36-e003-4faf-891b-60cb3ec451ed", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-08_15-49-57.jpg" + } + ] + }, + { + "name": "PM-066", + "id": "a262d4cb-d52a-42da-a4cf-0bde96516545", + "position": { + "x": 684, + "y": 228 + }, + "images": [ + { + "type": "location", + "id": "a64d2842-b357-47e5-8f40-fcbaf16ac348", + "url": "https://mkw.techtangents.net/marker/medal/PM-066/location.jpg" + } + ] + }, + { + "name": "PM-067", + "id": "05e0efbf-30df-4c2b-b57d-12fb28b273ce", + "position": { + "x": 831, + "y": 185 + }, + "images": [ + { + "type": "location", + "id": "a99f634d-53d2-4137-a287-d982795e03e6", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-08_20-51-47.jpg" + } + ] + }, + { + "name": "PM-068", + "id": "9fffc403-5fc4-4aa4-8ced-887d8f51aaaf", + "position": { + "x": 805, + "y": 166 + }, + "images": [ + { + "type": "location", + "id": "cb453ac5-3891-46d4-9fc1-d40d012214e8", + "url": "https://www.gamerguides.com/assets/maps/markers/unedited210645012787.jpg" + } + ] + }, + { + "name": "PM-069", + "id": "6d4ee0ec-4573-4ab0-9558-b497adfe7378", + "position": { + "x": 796, + "y": 231 + }, + "images": [ + { + "type": "location", + "id": "60c28ca6-d633-4698-a2e3-3330962d73f8", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_16-20-43.jpg" + } + ] + }, + { + "name": "PM-070", + "id": "dca49f8d-def3-4d8d-a6ad-3d5fa66241d3", + "position": { + "x": 827, + "y": 203 + }, + "images": [ + { + "type": "location", + "id": "e71d980a-bfbf-4220-96fc-903bbfb31d90", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-08_20-37-02.jpg" + } + ] + }, + { + "name": "PM-071", + "id": "ced45e32-56cd-4efb-81f3-42932be1396c", + "position": { + "x": 826, + "y": 262 + }, + "images": [ + { + "type": "location", + "id": "54a69272-2105-4d4a-a1da-8cb45039f20f", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_16-26-41.jpg" + } + ] + }, + { + "name": "PM-072", + "id": "8f700e21-5b50-428d-9d77-23a9dced4310", + "position": { + "x": 763, + "y": 401 + }, + "images": [ + { + "type": "location", + "id": "6f573251-b257-4929-b5a6-7dfaa0d9d918", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_16-34-40.jpg" + } + ] + }, + { + "name": "PM-073", + "id": "9a37e360-aed4-442f-ba71-d2b5a3e160e1", + "position": { + "x": 816, + "y": 388 + }, + "images": [ + { + "type": "location", + "id": "e43f8ed7-970c-4bce-a837-86216da41970", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_10-54-17_(2).jpg" + } + ] + }, + { + "name": "PM-074", + "id": "5e254dc9-dfdc-485b-81e4-8dfb29641069", + "position": { + "x": 796, + "y": 393 + }, + "images": [ + { + "type": "location", + "id": "5d8c6cc3-c016-44c6-869f-31ceab23f21a", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_10-34-01.jpg" + } + ] + }, + { + "name": "PM-075", + "id": "0e6f547c-d38c-43cc-88b8-438371de1c09", + "position": { + "x": 838, + "y": 364 + }, + "images": [ + { + "type": "location", + "id": "aff2eb4a-1319-4a13-b4bd-4dda1df93113", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_14-22-56.jpg" + } + ] + }, + { + "name": "PM-076", + "id": "d255233c-17be-40e5-9fd6-31e7647160f5", + "position": { + "x": 790, + "y": 331 + }, + "images": [ + { + "type": "location", + "id": "c56bcd0f-b86b-4cb4-bffa-ad29893ce5e5", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_16-28-43.jpg" + } + ] + }, + { + "name": "PM-077", + "id": "400ecc44-98b7-4671-9a65-9c55c2e05645", + "position": { + "x": 876, + "y": 301 + }, + "images": [ + { + "type": "location", + "id": "16913d29-2321-42d0-8eec-7b921eb9c1e8", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_16-32-30.jpg" + } + ] + }, + { + "name": "PM-078", + "id": "fd39176d-350a-4c01-b01f-295d12409498", + "position": { + "x": 918, + "y": 321 + }, + "images": [ + { + "type": "location", + "id": "9a6db4dd-203c-40ce-8c9f-e88b7e8b6e74", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_13-02-01.jpg" + } + ] + }, + { + "name": "PM-079", + "id": "46d45363-83ea-43be-95eb-6b55e296a23f", + "position": { + "x": 793, + "y": 437 + }, + "images": [ + { + "type": "location", + "id": "68b4f78b-65f7-4ecc-b902-1562ce3f11e9", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_11-33-48.jpg" + } + ] + }, + { + "name": "PM-080", + "id": "07582b2b-b92d-407f-a957-4936e568567f", + "position": { + "x": 921, + "y": 277 + }, + "images": [ + { + "type": "location", + "id": "42ca9d70-f8fb-4f85-9dc2-2b11fe7fa73f", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_09-57-56.jpg" + } + ] + }, + { + "name": "PM-081", + "id": "9f4b6634-ac7b-44df-943e-2a5c7aa37702", + "position": { + "x": 945, + "y": 268 + }, + "images": [ + { + "type": "location", + "id": "078e9898-eb2e-4ab1-96b5-f40a81821b03", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_09-52-22.png" + } + ] + }, + { + "name": "PM-082", + "id": "76b3ba01-ec59-47b3-870a-bd833dce0614", + "position": { + "x": 919, + "y": 253 + }, + "images": [ + { + "type": "location", + "id": "19979ef1-46b1-4e2e-b3e8-302694bbc03b", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_11-17-02.jpg" + } + ] + }, + { + "name": "PM-083", + "id": "e21f4f63-0928-4c5c-8c91-60fa4fd434c0", + "position": { + "x": 995, + "y": 269 + }, + "images": [ + { + "type": "location", + "id": "f897b077-f8e2-487a-8d60-057d5e8de442", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_12-39-18.jpg" + } + ] + }, + { + "name": "PM-084", + "id": "891eaad8-36f3-4e00-a33a-ccf482ffe5d2", + "position": { + "x": 920, + "y": 233 + }, + "images": [ + { + "type": "location", + "id": "508d4b35-1080-4cc6-bf57-8477721df9d4", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_15-08-48.jpg" + } + ] + }, + { + "name": "PM-085", + "id": "811e73d6-34a8-4b72-83d1-5fccbf2bdacb", + "position": { + "x": 973, + "y": 205 + }, + "images": [ + { + "type": "location", + "id": "036111e1-8343-4533-b9a1-920774ac4723", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_11-21-13.jpg" + } + ] + }, + { + "name": "PM-086", + "id": "b9f1a3b1-ebbd-4129-ac08-d2a2a0614418", + "position": { + "x": 952, + "y": 169 + }, + "images": [ + { + "type": "location", + "id": "1768ce6a-07d3-490b-9761-be964d311b5f", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_09-40-54.jpg" + } + ] + }, + { + "name": "PM-087", + "id": "8b972ff8-7024-4b67-8601-1e20ac937d42", + "position": { + "x": 973, + "y": 181 + }, + "images": [ + { + "type": "location", + "id": "35d2def9-aa85-4379-a109-364eefa838b5", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_19-36-16.jpg" + } + ] + }, + { + "name": "PM-088", + "id": "5ea63b9d-f218-4648-b0ed-b41ed4870ff6", + "position": { + "x": 945, + "y": 102 + }, + "images": [ + { + "type": "location", + "id": "b0dcd035-4f65-4771-b4c3-d4da7ae4d89a", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_15-59-57.jpg" + } + ] + }, + { + "name": "PM-089", + "id": "8db98af6-1698-4c7b-b839-18ed279dcc90", + "position": { + "x": 950, + "y": 118 + }, + "images": [ + { + "type": "location", + "id": "fa1d3f60-dba3-4969-ac82-e9485466559c", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_19-08-18.jpg" + } + ] + }, + { + "name": "PM-090", + "id": "9c01be48-2c43-4202-a799-e3d2b60b0acc", + "position": { + "x": 999, + "y": 129 + }, + "images": [ + { + "type": "location", + "id": "b15a15a0-1f20-4df5-8fdb-eecc48759c0d", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_13-44-43.jpg" + } + ] + }, + { + "name": "PM-091", + "id": "73e7aea2-484f-41b1-8d72-12f709a7e8da", + "position": { + "x": 1012, + "y": 202 + }, + "images": [ + { + "type": "location", + "id": "12513672-29fe-443f-91f8-6cd9c7e0040c", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_19-53-22.jpg" + } + ] + }, + { + "name": "PM-092", + "id": "0a42669b-a6dc-4281-86e4-f493e315cf79", + "position": { + "x": 974, + "y": 301 + }, + "images": [ + { + "type": "location", + "id": "2f1db4a1-3560-42e8-9ec0-3a79d17ef684", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_16-40-57.jpg" + } + ] + }, + { + "name": "PM-093", + "id": "ee159b8b-544e-4fda-90d5-c3f123e21bb1", + "position": { + "x": 950, + "y": 282 + }, + "images": [ + { + "type": "location", + "id": "018d95d4-7290-442d-9ae6-c2aef0976b49", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_17-30-18.jpg" + } + ] + }, + { + "name": "PM-094", + "id": "d545ce70-1e8b-47e7-a65e-58302579d375", + "position": { + "x": 1050, + "y": 275 + }, + "images": [ + { + "type": "location", + "id": "67fd6e23-1bc9-40d7-9a5d-5b7414c8ec6a", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_16-31-33.jpg" + } + ] + }, + { + "name": "PM-095", + "id": "3f68b495-b4fc-4f86-a1eb-a34112c76329", + "position": { + "x": 1034, + "y": 317 + }, + "images": [ + { + "type": "location", + "id": "9723a8c1-078f-43bb-9f2c-3ed3d9a0e161", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_14-53-04.jpg" + } + ] + }, + { + "name": "PM-096", + "id": "afb0168b-a828-43a0-8f36-3f114df753b7", + "position": { + "x": 997, + "y": 368 + }, + "images": [ + { + "type": "location", + "id": "0025b569-d6e2-4ee4-9ea3-cdd03a287d66", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_13-29-42.jpg" + } + ] + }, + { + "name": "PM-097", + "id": "59097044-19a4-4b02-bbe7-c463aae6acad", + "position": { + "x": 922, + "y": 384 + }, + "images": [ + { + "type": "location", + "id": "4631d2b1-dfb8-452f-86c4-d579f8c55c1e", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_11-04-25.jpg" + } + ] + }, + { + "name": "PM-098", + "id": "692990d9-e30e-4ff6-81ca-defb2fa53eba", + "position": { + "x": 976, + "y": 405 + }, + "images": [ + { + "type": "location", + "id": "3f43d15e-1818-4f5a-bb1b-506476cdb504", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_12-57-45_(2).jpg" + } + ] + }, + { + "name": "PM-099", + "id": "b8b1c0ba-73ec-40da-ac92-984e0a00c0e5", + "position": { + "x": 954, + "y": 478 + }, + "images": [ + { + "type": "location", + "id": "b8f3f058-6257-4f84-9354-238003f98aa7", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_09-43-53.jpg" + } + ] + }, + { + "name": "PM-100", + "id": "7b3e716d-b434-4cae-b82c-2ae7ed07ed3f", + "position": { + "x": 975, + "y": 476 + }, + "images": [ + { + "type": "location", + "id": "e67169d8-0b24-45e9-a81b-a35ec393c170", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_20-19-12.jpg" + } + ] + }, + { + "name": "PM-101", + "id": "471917f6-9478-461c-9e2f-6384df279ff8", + "position": { + "x": 913, + "y": 464 + }, + "images": [ + { + "type": "location", + "id": "4fa2e38b-7c0f-4871-83df-9f4676e97888", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_09-01-58.jpg" + } + ] + }, + { + "name": "PM-102", + "id": "6fc6106f-8481-4df8-be81-cf6f98ba340a", + "position": { + "x": 912, + "y": 483 + }, + "images": [ + { + "type": "location", + "id": "3351b390-7f0b-4f3c-b085-748810e29057", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_10-39-43.jpg" + } + ] + }, + { + "name": "PM-103", + "id": "5c74f1d8-87f5-4a95-bbc6-124ae7bbe5f5", + "position": { + "x": 866, + "y": 519 + }, + "images": [ + { + "type": "location", + "id": "5a6098db-211e-44ef-a600-f529ec04c5ea", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_16-07-57.jpg" + } + ] + }, + { + "name": "PM-104", + "id": "fead72ec-399a-429b-9c13-6a988cadfbd6", + "position": { + "x": 802, + "y": 418 + }, + "images": [ + { + "type": "location", + "id": "b72dfd0f-8476-4870-be96-6e44a8c4b342", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_19-29-58.jpg" + } + ] + }, + { + "name": "PM-105", + "id": "d7612854-1e4f-465c-bcd7-35c33aa0d465", + "position": { + "x": 723, + "y": 674 + }, + "images": [ + { + "type": "location", + "id": "5d1ceddb-89b9-4bdd-bd45-931dff826351", + "url": "https://mkw.techtangents.net/marker/medal/PM-105/location.jpg" + } + ] + }, + { + "name": "PM-106", + "id": "655529be-3649-465b-802e-17d8f85020b4", + "position": { + "x": 772, + "y": 425 + }, + "images": [ + { + "type": "location", + "id": "8cae0510-0cb4-4280-a08f-f7a3b4164661", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_19-27-43.jpg" + } + ] + }, + { + "name": "PM-107", + "id": "a05628b2-b79f-475a-aa66-d381ce449400", + "position": { + "x": 796, + "y": 490 + }, + "images": [ + { + "type": "location", + "id": "db79f9c6-03ec-492b-94d2-9b63735a0e89", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_11-37-42.jpg" + } + ] + }, + { + "name": "PM-108", + "id": "bb720173-36b1-4c95-ab94-3b21e54cdb5d", + "position": { + "x": 755, + "y": 497 + }, + "images": [ + { + "type": "location", + "id": "f36ac1e5-338a-4a52-8cc2-65d9bc62eaa0", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_11-37-26.jpg" + } + ] + }, + { + "name": "PM-109", + "id": "f45775f6-4c51-4903-8fe1-711822776d8e", + "position": { + "x": 756, + "y": 528 + }, + "images": [ + { + "type": "location", + "id": "d2da3c61-c726-4d8b-b273-09c42145f16e", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_14-09-11.jpg" + } + ] + }, + { + "name": "PM-110", + "id": "470832b2-e76e-4868-89eb-17f7ec576f5d", + "position": { + "x": 805, + "y": 557 + }, + "images": [ + { + "type": "location", + "id": "65061aba-b007-467f-a5aa-0706d6942ab8", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_11-57-36.jpg" + } + ] + }, + { + "name": "PM-111", + "id": "7912b8f1-02a4-4cc5-9028-64eda772c65a", + "position": { + "x": 840, + "y": 600 + }, + "images": [ + { + "type": "location", + "id": "e1c812a4-fdae-44d9-ae52-a070c7b37913", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_11-54-52.jpg" + } + ] + }, + { + "name": "PM-112", + "id": "85db310a-943d-4b2a-bcbf-9033c3abcd3e", + "position": { + "x": 769, + "y": 578 + }, + "images": [ + { + "type": "location", + "id": "d2e51361-c124-402b-8f95-09450b702227", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_13-42-02.jpg" + } + ] + }, + { + "name": "PM-113", + "id": "3b7cfb91-5efd-477e-99e0-935adea16980", + "position": { + "x": 820, + "y": 551 + }, + "images": [ + { + "type": "location", + "id": "92397150-aed2-47f5-bd0c-d3bc295e3abe", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_11-48-39.jpg" + } + ] + }, + { + "name": "PM-114", + "id": "b35bad4e-c456-477e-8a05-b511d244769c", + "position": { + "x": 830, + "y": 521 + }, + "images": [ + { + "type": "location", + "id": "8f37b51d-b3df-402e-8087-d010bce2b034", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_11-48-39.jpg" + } + ] + }, + { + "name": "PM-115", + "id": "9eefb228-6c10-4ee9-b2be-e3024571ce5a", + "position": { + "x": 736, + "y": 483 + }, + "images": [ + { + "type": "location", + "id": "0383587a-a55d-4543-a87c-5114c6f89ebb", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_19-24-26.jpg" + } + ] + }, + { + "name": "PM-116", + "id": "f4a686fa-9c75-4d3d-bd73-96682ec0e1fb", + "position": { + "x": 890, + "y": 627 + }, + "images": [ + { + "type": "location", + "id": "bc90508d-93d5-4c95-bf57-e225c8de571b", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_12-06-14.jpg" + } + ] + }, + { + "name": "PM-118", + "id": "8bbaa421-48b0-4c37-8676-7215ec088d9e", + "position": { + "x": 951, + "y": 526 + }, + "images": [ + { + "type": "location", + "id": "840f858d-cd8e-4834-847d-e74d795da30b", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_17-09-38.jpg" + } + ] + }, + { + "name": "PM-120", + "id": "ae9e04f3-6bb2-4d65-ac44-a24f25d93951", + "position": { + "x": 960, + "y": 644 + }, + "images": [ + { + "type": "location", + "id": "329b811c-bbea-409d-9186-3585b394e2e3", + "url": "https://mkw.techtangents.net/marker/medal/PM-120/location.jpg" + } + ] + }, + { + "name": "PM-121", + "id": "9d717a96-1584-4cc8-b5bf-7ecf0a7adbf6", + "position": { + "x": 960, + "y": 665 + }, + "images": [ + { + "type": "location", + "id": "b867439a-8d10-4dcf-ab56-04a9b73c8ce4", + "url": "https://mkw.techtangents.net/marker/medal/PM-121/location.jpg" + } + ] + }, + { + "name": "PM-125", + "id": "c63a2b5b-5893-453b-94be-9784bd52cad0", + "position": { + "x": 1127, + "y": 642 + }, + "images": [ + { + "type": "location", + "id": "6808fc76-7e76-40f2-96fe-459b4927270c", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion32.jpg" + } + ] + }, + { + "name": "PM-126", + "id": "bd0cdb07-94dc-4cc6-915a-76f16aa572ed", + "position": { + "x": 1082, + "y": 648 + }, + "images": [ + { + "type": "location", + "id": "03543f8d-ce9f-437a-a96c-7441cfd8a8ca", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion24.jpg" + } + ] + }, + { + "name": "PM-144", + "id": "f825575a-44ff-41f5-bac8-3e2bfc4409ae", + "position": { + "x": 1299, + "y": 923 + }, + "images": [ + { + "type": "location", + "id": "57cb16fa-78f6-4fc8-9408-ec18e03018ca", + "url": "https://mkw.techtangents.net/marker/medal/PM-144/location.jpg" + } + ] + }, + { + "name": "PM-151", + "id": "58ed2612-2f92-4ca4-9a83-2d07b8caa828", + "position": { + "x": 1228, + "y": 744 + }, + "images": [ + { + "type": "location", + "id": "974f8713-ca99-43b7-9433-87009ee4f5d9", + "url": "https://www.gamerguides.com/assets/maps/markers/Medallion27.jpg" + } + ] + }, + { + "name": "PM-152", + "id": "e8f6e21d-44e4-4b85-9fc3-a8c3f3da39f0", + "position": { + "x": 1257, + "y": 680 + }, + "images": [ + { + "type": "location", + "id": "335a32f0-f46b-4c70-922b-adef66fd975c", + "url": "https://mkw.techtangents.net/marker/medal/PM-152/location.jpg" + } + ] + }, + { + "name": "PM-153", + "id": "ea5cd1c6-9d2a-457d-8ffe-7945dec137d6", + "position": { + "x": 1310, + "y": 706 + }, + "images": [ + { + "type": "location", + "id": "b9ab7723-f0ba-49ee-bc90-350dbe0ae1e8", + "url": "https://mkw.techtangents.net/marker/medal/PM-153/location.jpg" + } + ] + }, + { + "name": "PM-158", + "id": "55865403-4904-4a15-8bc1-efc54dfe1b42", + "position": { + "x": 1279, + "y": 670 + }, + "images": [ + { + "type": "location", + "id": "494e1bd3-667f-4be2-9e9a-731bf3e4f40a", + "url": "https://mkw.techtangents.net/marker/medal/PM-158/location.jpg" + } + ] + }, + { + "name": "PM-159", + "id": "66633b38-3dcb-481a-bdf5-1c701a97fda8", + "position": { + "x": 1146, + "y": 567 + }, + "images": [ + { + "type": "location", + "id": "484f8d8c-bc83-4312-84c2-f392b7ab90c0", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_16-55-53.jpg" + } + ] + }, + { + "name": "PM-161", + "id": "2fc570dd-2faf-40cc-9680-98fd2c639806", + "position": { + "x": 1140, + "y": 556 + }, + "images": [ + { + "type": "location", + "id": "2a520412-f2ea-46c8-b1c1-26acf0bf0c79", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-10_17-01-00.jpg" + } + ] + }, + { + "name": "PM-162", + "id": "747fa598-95cc-47ee-868a-46a2dc3910a4", + "position": { + "x": 1421, + "y": 578 + }, + "images": [ + { + "type": "location", + "id": "ff9a4731-b7fc-4923-944c-2c5805564a9d", + "url": "https://mkw.techtangents.net/marker/medal/PM-162/location.jpg" + } + ] + }, + { + "name": "PM-164", + "id": "457b9d54-8e94-4ab0-985f-788e1fe19f4b", + "position": { + "x": 1427, + "y": 556 + }, + "images": [ + { + "type": "location", + "id": "b6633dd6-3584-4ba8-9361-02a1e5f3e93d", + "url": "https://mkw.techtangents.net/marker/medal/PM-164/location.jpg" + } + ] + }, + { + "name": "PM-170", + "id": "4f81340a-15bc-443e-9127-6ae1cbdea9b8", + "position": { + "x": 1154, + "y": 512 + }, + "images": [ + { + "type": "location", + "id": "92e8a3a7-19ed-4a66-b769-b3efae0f744d", + "url": "https://mkw.techtangents.net/marker/medal/PM-170/location.jpg" + } + ] + }, + { + "name": "PM-171", + "id": "9f59f966-a8c7-4c0b-bd3e-435d5e2029c7", + "position": { + "x": 1196, + "y": 456 + }, + "images": [ + { + "type": "location", + "id": "685911ed-8df1-41d7-a54c-00b7c011f137", + "url": "https://www.gamerguides.com/assets/maps/markers/peach-medallion-2.jpg" + } + ] + }, + { + "name": "PM-172", + "id": "643e2a64-8e5d-4178-8b64-02131ade715b", + "position": { + "x": 1227, + "y": 391 + }, + "images": [ + { + "type": "location", + "id": "a35ae3a9-c057-4da0-b5d2-e83dd20b1869", + "url": "https://mkw.techtangents.net/marker/medal/PM-172/location.jpg" + } + ] + }, + { + "name": "PM-173", + "id": "e784dba9-1aa6-42e5-9075-2267b25d7aac", + "position": { + "x": 1255, + "y": 402 + }, + "images": [ + { + "type": "location", + "id": "f20c6348-c999-49cc-b2d3-e4aa3690306d", + "url": "https://mkw.techtangents.net/marker/medal/PM-173/location.jpg" + } + ] + }, + { + "name": "PM-174", + "id": "aecc2767-2ff5-4fbd-8d08-8ed517a6a4d4", + "position": { + "x": 1219, + "y": 417 + }, + "images": [ + { + "type": "location", + "id": "18d649ea-443c-4c94-8778-c962ca506540", + "url": "https://mkw.techtangents.net/marker/medal/PM-174/location.jpg" + } + ] + }, + { + "name": "PM-175", + "id": "d8ecdbc7-5df7-4ea7-aefb-7fe2d51c3c2b", + "position": { + "x": 1250, + "y": 489 + }, + "images": [ + { + "type": "location", + "id": "7b0a6931-efc1-4f69-9517-5270db375ffc", + "url": "https://mkw.techtangents.net/marker/medal/PM-175/location.jpg" + } + ] + }, + { + "name": "PM-176", + "id": "bf5ecae0-e9f4-4cfd-bc64-5c7586edd094", + "position": { + "x": 1266, + "y": 476 + }, + "images": [ + { + "type": "location", + "id": "d5a8ba00-fc15-43ab-84b2-f573fa08ede3", + "url": "https://mkw.techtangents.net/marker/medal/PM-176/location.jpg" + } + ] + }, + { + "name": "PM-177", + "id": "f9487413-c961-4f4d-a4f8-b0d6b35f8900", + "position": { + "x": 1290, + "y": 501 + }, + "images": [ + { + "type": "location", + "id": "746c6a19-64b5-4101-85ad-a52643fffa3e", + "url": "https://mkw.techtangents.net/marker/medal/PM-177/location.jpg" + } + ] + }, + { + "name": "PM-180", + "id": "13060a1c-1e04-4ec7-9a73-75b7f179749a", + "position": { + "x": 1405, + "y": 372 + }, + "images": [ + { + "type": "location", + "id": "6a81e486-1040-44f4-ac2d-bb2f76d51ade", + "url": "https://mkw.techtangents.net/marker/medal/PM-180/location.jpg" + } + ] + }, + { + "name": "PM-181", + "id": "fa54511f-2cef-4736-93ee-f811803a8a5a", + "position": { + "x": 1245, + "y": 287 + }, + "images": [ + { + "type": "location", + "id": "955dcaab-41b7-459e-a386-a0d15608ee5d", + "url": "https://mkw.techtangents.net/marker/medal/PM-181/location.jpg" + } + ] + }, + { + "name": "PM-182", + "id": "eccef104-1f1b-4493-bba2-e17b0a4a77bb", + "position": { + "x": 1280, + "y": 301 + }, + "images": [ + { + "type": "location", + "id": "525e7327-3b47-4b17-95c0-cd33d53320ac", + "url": "https://www.gamerguides.com/assets/maps/markers/peach-medallion-12.jpg" + } + ] + }, + { + "name": "PM-183", + "id": "174cd5fd-46ed-4319-9b1a-fa5c2e8015d8", + "position": { + "x": 1266, + "y": 269 + }, + "images": [ + { + "type": "location", + "id": "382f6ffc-1644-4012-b67c-940bab77649f", + "url": "https://mkw.techtangents.net/marker/medal/PM-183/location.jpg" + } + ] + }, + { + "name": "PM-184", + "id": "03c3cc4f-61d4-45d1-9208-badacacc0a5a", + "position": { + "x": 1276, + "y": 275 + }, + "images": [ + { + "type": "location", + "id": "14f3cf9a-f80b-43ad-b73f-1a0567c179b3", + "url": "https://mkw.techtangents.net/marker/medal/PM-184/location.jpg" + } + ] + }, + { + "name": "PM-185", + "id": "beffd1d3-1077-45ec-ab11-47ef2cac2325", + "position": { + "x": 1214, + "y": 321 + }, + "images": [ + { + "type": "location", + "id": "1a3fb32d-44ad-4390-aa67-1d5b6767674d", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_20-49-16.jpg" + } + ] + }, + { + "name": "PM-186", + "id": "51112c22-3755-4f45-ac05-f84bc116cb63", + "position": { + "x": 1112, + "y": 465 + }, + "images": [ + { + "type": "location", + "id": "630dc644-037d-4dce-b083-6bc6ad10533f", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-17_10-09-26.jpg" + } + ] + }, + { + "name": "PM-187", + "id": "e89698b9-f845-467b-9392-3965567b45b9", + "position": { + "x": 1089, + "y": 448 + }, + "images": [ + { + "type": "location", + "id": "dc0155f8-fbd6-4347-a292-6a6b440432c9", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_14-57-47.jpg" + } + ] + }, + { + "name": "PM-188", + "id": "0c720b42-5edb-4538-8bc4-d9932e01961e", + "position": { + "x": 1117, + "y": 387 + }, + "images": [ + { + "type": "location", + "id": "5ddfde4a-53a7-4efe-a43e-d2b450d65b4d", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_12-30-20.jpg" + } + ] + }, + { + "name": "PM-189", + "id": "0c01e81d-60ef-45ed-afdb-225f7a881128", + "position": { + "x": 1126, + "y": 424 + }, + "images": [ + { + "type": "location", + "id": "b721fbf0-ab57-4157-967c-09d3c1734c2e", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-12_12-22-52.jpg" + } + ] + }, + { + "name": "PM-190", + "id": "159bc080-7b28-4331-b558-31f06f56313f", + "position": { + "x": 1112, + "y": 487 + }, + "images": [ + { + "type": "location", + "id": "f285885c-7f9d-4dd3-8467-ee878336c130", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-17_10-14-21.jpg" + } + ] + }, + { + "name": "PM-191", + "id": "edc7c25b-0b9d-4c2d-bc6f-47ab5404f04b", + "position": { + "x": 1163, + "y": 263 + }, + "images": [ + { + "type": "location", + "id": "0e6f13a5-dd37-4383-ab50-80e873179cfe", + "url": "https://www.gamerguides.com/assets/maps/markers/peach-medallion-10.jpg" + } + ] + }, + { + "name": "PM-193", + "id": "d68b402b-d9be-405c-a13e-50d7d840f462", + "position": { + "x": 1164, + "y": 230 + }, + "images": [ + { + "type": "location", + "id": "c597a49b-6004-4f59-9b34-e1e2ccda6c4a", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_17-08-52.jpg" + } + ] + }, + { + "name": "PM-194", + "id": "4bab561e-66e9-4a4c-9679-04248536f58c", + "position": { + "x": 1144, + "y": 161 + }, + "images": [ + { + "type": "location", + "id": "6ad1303d-7f23-4325-903e-deb503a99ef2", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_20-21-23.png" + } + ] + }, + { + "name": "PM-195", + "id": "7abe2518-4836-466e-9d86-c04d8a378f3b", + "position": { + "x": 1062, + "y": 195 + }, + "images": [ + { + "type": "location", + "id": "391f8dec-424f-4e7c-9ae0-e49c04238a18", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-09_19-33-16.jpg" + } + ] + }, + { + "name": "PM-196", + "id": "c8428c70-dbc6-4c74-a590-ff02b256a10f", + "position": { + "x": 1152, + "y": 181 + }, + "images": [ + { + "type": "location", + "id": "dc600888-9bcc-4704-ab1c-ee3ae51052d2", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_17-00-49.jpg" + } + ] + }, + { + "name": "PM-197", + "id": "377c84e3-5ae2-48a1-9631-3d102ac5e79c", + "position": { + "x": 1127, + "y": 215 + }, + "images": [ + { + "type": "location", + "id": "8e31417e-79f1-47c9-955c-c48201ccba7d", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_17-23-19.jpg" + } + ] + }, + { + "name": "PM-198", + "id": "c8293bae-8ab5-4f9a-a525-34693bdd4028", + "position": { + "x": 1033, + "y": 213 + }, + "images": [ + { + "type": "location", + "id": "7913c85f-ca13-4e27-a1b4-125e8f9f4961", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_20-10-24.jpg" + } + ] + }, + { + "name": "PM-199", + "id": "54a6a288-68cc-46e3-83fa-91780cd0f57f", + "position": { + "x": 1013, + "y": 233 + }, + "images": [ + { + "type": "location", + "id": "7f5f5188-b05b-49b0-84a1-1ceb60eb2eff", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-16_19-45-32.jpg" + } + ] + }, + { + "name": "PM-200", + "id": "66127c92-aeca-490a-aaa9-60f758f32a63", + "position": { + "x": 714, + "y": 319 + }, + "images": [ + { + "type": "location", + "id": "897e82d2-5aad-4943-9c87-b57b797d7f77", + "url": "https://mkw.techtangents.net/marker/medal/PM-200/location.jpg" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/data/panels.json b/src/main/resources/assets/data/panels.json new file mode 100644 index 0000000..3c9f36d --- /dev/null +++ b/src/main/resources/assets/data/panels.json @@ -0,0 +1,2254 @@ +{ + "entries": [ + { + "name": "Acorn Heights - A", + "id": "6ff47a32-92ac-4335-be25-750ef8ed7a7c", + "position": { + "x": 950, + "y": 117 + }, + "images": [ + { + "type": "location", + "id": "e9ce28b4-c88c-4216-a156-f31f839b2359", + "url": "https://mkw.techtangents.net/marker/panel/Acorn Heights - A/location.jpg" + } + ] + }, + { + "name": "Acorn Heights - B", + "id": "fb167ea8-d2c0-4913-8363-07a34d6d0ab8", + "position": { + "x": 953, + "y": 121 + }, + "images": [ + { + "type": "location", + "id": "b0217870-122d-4ed2-a434-70ffa69f2e9a", + "url": "https://mkw.techtangents.net/marker/panel/Acorn Heights - B/location.jpg" + } + ] + }, + { + "name": "Acorn Heights - C", + "id": "3e279573-fc03-4571-89a9-a34e17a159cf", + "position": { + "x": 961, + "y": 109 + }, + "images": [ + { + "type": "location", + "id": "417da08a-986a-44b5-bb0a-f4ad20a7c6e7", + "url": "https://mkw.techtangents.net/marker/panel/Acorn Heights - C/location.jpg" + } + ] + }, + { + "name": "Acorn Heights - D", + "id": "5b9abb6c-2b67-40d6-98f7-afd8d23b00b3", + "position": { + "x": 933, + "y": 126 + }, + "images": [ + { + "type": "location", + "id": "3fe42142-3b39-4453-b5aa-4aa8d7cb2e01", + "url": "https://mkw.techtangents.net/marker/panel/Acorn Heights - D/location.jpg" + } + ] + }, + { + "name": "Acorn Heights - E", + "id": "1791920c-049c-4da3-ad78-0f1f0875218d", + "position": { + "x": 929, + "y": 118 + }, + "images": [ + { + "type": "location", + "id": "8c85aabf-8d44-414c-9007-16596c50fc29", + "url": "https://mkw.techtangents.net/marker/panel/Acorn Heights - E/location.jpg" + } + ] + }, + { + "name": "Airship Fortress - A", + "id": "964f4b42-a7ed-41a1-a7b3-727a96a9943a", + "position": { + "x": 520, + "y": 339 + }, + "images": [ + { + "type": "location", + "id": "58e28817-ef14-4665-80f7-9874663e8698", + "url": "https://mkw.techtangents.net/marker/panel/Airship Fortress - A/location.jpg" + } + ] + }, + { + "name": "Airship Fortress - B", + "id": "58e81af1-6921-4e8f-b8a9-785cad1b4d28", + "position": { + "x": 529, + "y": 334 + }, + "images": [ + { + "type": "location", + "id": "2aa6cd1d-a562-4d73-b7d7-ac3a598b1044", + "url": "https://mkw.techtangents.net/marker/panel/Airship Fortress - B/location.jpg" + } + ] + }, + { + "name": "Airship Fortress - C", + "id": "a0fe770f-a24d-456a-a1cf-ee44bd11ae40", + "position": { + "x": 502, + "y": 345 + }, + "images": [ + { + "type": "location", + "id": "b4f840ac-0e9e-4d87-a8b6-84d810a321d2", + "url": "https://mkw.techtangents.net/marker/panel/Airship Fortress - C/location.jpg" + } + ] + }, + { + "name": "Airship Fortress - D", + "id": "6aa7fd48-af8d-4cbb-9d8d-1fb849012543", + "position": { + "x": 480, + "y": 333 + }, + "images": [ + { + "type": "location", + "id": "a78660fd-e7f9-4ce9-85c4-36ffc1163993", + "url": "https://mkw.techtangents.net/marker/panel/Airship Fortress - D/location.jpg" + } + ] + }, + { + "name": "Airship Fortress - E", + "id": "97466b64-34c8-4dd7-8ff2-e0fc5ebd3ce9", + "position": { + "x": 490, + "y": 338 + }, + "images": [ + { + "type": "location", + "id": "e2b64769-240c-4a84-be17-df373f8453f2", + "url": "https://mkw.techtangents.net/marker/panel/Airship Fortress - E/location.jpg" + } + ] + }, + { + "name": "Boo Cinema - A", + "id": "40c1b9d9-165c-48bd-a5a6-046468cd7bf3", + "position": { + "x": 1134, + "y": 186 + }, + "images": [ + { + "type": "location", + "id": "5200a552-d2cc-4020-9583-7dda57c13685", + "url": "https://mkw.techtangents.net/marker/panel/Boo Cinema - A/location.jpg" + } + ] + }, + { + "name": "Boo Cinema - B", + "id": "6dd200e7-d569-40f4-a9f9-ecdf8bf68e25", + "position": { + "x": 1147, + "y": 182 + }, + "images": [ + { + "type": "location", + "id": "6da3302b-5f58-4e6d-9388-d9961503615f", + "url": "https://mkw.techtangents.net/marker/panel/Boo Cinema - B/location.jpg" + } + ] + }, + { + "name": "Boo Cinema - C", + "id": "72ad0e69-f635-4221-9df6-27627802c1e0", + "position": { + "x": 1132, + "y": 174 + }, + "images": [ + { + "type": "location", + "id": "42ce72a3-11f3-4748-aeb5-9ee4ed38ade2", + "url": "https://mkw.techtangents.net/marker/panel/Boo Cinema - C/location.jpg" + } + ] + }, + { + "name": "Boo Cinema - D", + "id": "dfad32ae-1753-42cf-b77d-6c051cfca435", + "position": { + "x": 1137, + "y": 172 + }, + "images": [ + { + "type": "location", + "id": "92a0ce29-ddbf-4e90-8537-fa05b8193e39", + "url": "https://mkw.techtangents.net/marker/panel/Boo Cinema - D/location.jpg" + } + ] + }, + { + "name": "Boo Cinema - E", + "id": "b740bd91-fa37-47d3-9c5b-be5a4445f27b", + "position": { + "x": 1135, + "y": 163 + }, + "images": [ + { + "type": "location", + "id": "3be84cde-bb48-4822-b8ec-58172c4bba75", + "url": "https://mkw.techtangents.net/marker/panel/Boo Cinema - E/location.jpg" + } + ] + }, + { + "name": "Bowser's Castle - A", + "id": "b7d1b80f-a993-4ac3-a758-bae815e3c5f7", + "position": { + "x": 674, + "y": 225 + }, + "images": [ + { + "type": "location", + "id": "71a0fde8-bf86-4930-b15f-2619bca97837", + "url": "https://mkw.techtangents.net/marker/panel/Bowser's Castle - A/location.jpg" + } + ] + }, + { + "name": "Bowser's Castle - B", + "id": "f20858a0-a0fc-433d-901f-1f350c0535af", + "position": { + "x": 678, + "y": 213 + }, + "images": [ + { + "type": "location", + "id": "eb74713d-bd1a-40e6-a625-a81bcb0ca884", + "url": "https://mkw.techtangents.net/marker/panel/Bowser's Castle - B/location.jpg" + } + ] + }, + { + "name": "Bowser's Castle - C", + "id": "12d5fbce-e1ed-4fe6-8b68-f06fa12dccc5", + "position": { + "x": 668, + "y": 203 + }, + "images": [ + { + "type": "location", + "id": "1d6688c2-d713-406f-80de-5f5154cc4048", + "url": "https://mkw.techtangents.net/marker/panel/Bowser's Castle - C/location.jpg" + } + ] + }, + { + "name": "Bowser's Castle - D", + "id": "0deff5f8-db21-411e-85de-75da6b421ca7", + "position": { + "x": 645, + "y": 195 + }, + "images": [ + { + "type": "location", + "id": "338f0fef-668e-44c2-8677-8747514af3f1", + "url": "https://mkw.techtangents.net/marker/panel/Bowser's Castle - D/location.jpg" + } + ] + }, + { + "name": "Bowser's Castle - E", + "id": "77df2630-3e36-41e9-9eab-3fa0d1fbec0b", + "position": { + "x": 640, + "y": 205 + }, + "images": [ + { + "type": "location", + "id": "4a43d147-959e-494b-a3de-fdfe7ae5afa3", + "url": "https://mkw.techtangents.net/marker/panel/Bowser's Castle - E/location.jpg" + } + ] + }, + { + "name": "Cheep Cheep Falls - A", + "id": "bc1a2890-557b-432e-8115-b211b3fb62f9", + "position": { + "x": 1140, + "y": 586 + }, + "images": [ + { + "type": "location", + "id": "3173110e-4b69-43e6-9b72-7e4772a20e29", + "url": "https://mkw.techtangents.net/marker/panel/Cheep Cheep Falls - A/location.jpg" + } + ] + }, + { + "name": "Cheep Cheep Falls - B", + "id": "bb2e6893-9447-46a3-9c1b-3ea607c89b4e", + "position": { + "x": 1131, + "y": 571 + }, + "images": [ + { + "type": "location", + "id": "42a266dd-81d4-4b36-9fb7-e9d8047b5c4c", + "url": "https://mkw.techtangents.net/marker/panel/Cheep Cheep Falls - B/location.jpg" + } + ] + }, + { + "name": "Cheep Cheep Falls - C", + "id": "b156f048-d33f-4915-bc36-a8b1fec5d19d", + "position": { + "x": 1143, + "y": 548 + }, + "images": [ + { + "type": "location", + "id": "26fe533c-87b9-4a83-a883-36425c5c4f15", + "url": "https://mkw.techtangents.net/marker/panel/Cheep Cheep Falls - C/location.jpg" + } + ] + }, + { + "name": "Cheep Cheep Falls - D", + "id": "dae5f0c8-9f0d-4ebf-82b3-ad57b1c682f9", + "position": { + "x": 1119, + "y": 550 + }, + "images": [ + { + "type": "location", + "id": "dbda2ac7-918e-45ce-836c-33fa43c2df49", + "url": "https://mkw.techtangents.net/marker/panel/Cheep Cheep Falls - D/location.jpg" + } + ] + }, + { + "name": "Cheep Cheep Falls - E", + "id": "87400b65-510c-467a-89de-ddacf16178bc", + "position": { + "x": 1120, + "y": 562 + }, + "images": [ + { + "type": "location", + "id": "7e12f4c9-f092-4b43-860d-1ba0bb3a5807", + "url": "https://mkw.techtangents.net/marker/panel/Cheep Cheep Falls - E/location.jpg" + } + ] + }, + { + "name": "Choco Mountain - A", + "id": "95d6954d-c918-45fa-94dd-62093c27a984", + "position": { + "x": 793, + "y": 570 + }, + "images": [ + { + "type": "location", + "id": "c5c6c991-120b-46b9-ab03-3597bce9b88d", + "url": "https://mkw.techtangents.net/marker/panel/Choco Mountain - A/location.jpg" + } + ] + }, + { + "name": "Choco Mountain - B", + "id": "e5f81ad3-163f-4f8c-b5f7-ab319c9d9918", + "position": { + "x": 814, + "y": 549 + }, + "images": [ + { + "type": "location", + "id": "2a0de416-f0b0-45c6-963f-b752f8d94c91", + "url": "https://mkw.techtangents.net/marker/panel/Choco Mountain - B/location.jpg" + } + ] + }, + { + "name": "Choco Mountain - C", + "id": "4351fca3-f337-4dba-9fcf-921a9c9a6c3b", + "position": { + "x": 803, + "y": 556 + }, + "images": [ + { + "type": "location", + "id": "d3ec80b9-ea53-4b2e-b088-8bc8146cc8dc", + "url": "https://mkw.techtangents.net/marker/panel/Choco Mountain - C/location.jpg" + } + ] + }, + { + "name": "Choco Mountain - D", + "id": "5663224b-2f43-43ad-b5c9-c7ad4b7b0e56", + "position": { + "x": 810, + "y": 557 + }, + "images": [ + { + "type": "location", + "id": "73623741-235b-4ecc-b915-fe7a6a8d9350", + "url": "https://mkw.techtangents.net/marker/panel/Choco Mountain - D/location.jpg" + } + ] + }, + { + "name": "Choco Mountain - E", + "id": "a4ef5549-c5c5-41bb-a02f-e4eedb20ed13", + "position": { + "x": 816, + "y": 564 + }, + "images": [ + { + "type": "location", + "id": "3d3c6676-f330-4dd0-b63b-3be7c7bc2833", + "url": "https://mkw.techtangents.net/marker/panel/Choco Mountain - E/location.jpg" + } + ] + }, + { + "name": "Crown City - A", + "id": "e4f0ae07-6533-4df3-ace6-848a1d34edd2", + "position": { + "x": 784, + "y": 828 + }, + "images": [ + { + "type": "location", + "id": "b1d164da-f70c-4362-bbf7-8ea42ea56cbb", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - A/location.jpg" + } + ] + }, + { + "name": "Crown City - B", + "id": "5910097f-2f43-4559-b1b9-18af92aad72d", + "position": { + "x": 801, + "y": 823 + }, + "images": [ + { + "type": "location", + "id": "e866fef3-701c-48fd-99ff-fa0bacb2f7aa", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - B/location.jpg" + } + ] + }, + { + "name": "Crown City - C", + "id": "05620168-0359-4870-bd78-a1b7011c26c9", + "position": { + "x": 811, + "y": 826 + }, + "images": [ + { + "type": "location", + "id": "436f959c-5f4a-4f88-bca4-a865090b8eb6", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - C/location.jpg" + } + ] + }, + { + "name": "Crown City - D", + "id": "b8114ad1-665c-4a97-b42d-90f4fad95cd8", + "position": { + "x": 801, + "y": 789 + }, + "images": [ + { + "type": "location", + "id": "867a9ca8-3bb6-4650-9576-b086368d7335", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - D/location.jpg" + } + ] + }, + { + "name": "Crown City - E", + "id": "776be296-6df5-457c-a1d0-2d108cf85b8d", + "position": { + "x": 788, + "y": 786 + }, + "images": [ + { + "type": "location", + "id": "797b1fd2-eabb-438c-895d-590fa1c6b09f", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - E/location.jpg" + } + ] + }, + { + "name": "Crown City - F", + "id": "8f7ce88d-0ba5-44c8-839f-a9932794517a", + "position": { + "x": 800, + "y": 776 + }, + "images": [ + { + "type": "location", + "id": "4d0b048a-7a87-4543-b712-50bdf52bbc4e", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - F/location.jpg" + } + ] + }, + { + "name": "Crown City - G", + "id": "f5a1d5c1-ad0c-4dd8-981c-4e61c1b72308", + "position": { + "x": 808, + "y": 784 + }, + "images": [ + { + "type": "location", + "id": "0ccebeb4-b0bf-4d3a-aade-9d332c6b462d", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - G/location.jpg" + } + ] + }, + { + "name": "Crown City - H", + "id": "4296453e-744d-4245-8c85-55301d5d814f", + "position": { + "x": 821, + "y": 800 + }, + "images": [ + { + "type": "location", + "id": "42eb584b-e258-4f97-b1ba-c6435384a585", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - H/location.jpg" + } + ] + }, + { + "name": "Crown City - I", + "id": "bd6e8bbd-0968-4fb2-ba2c-edd3d894491a", + "position": { + "x": 825, + "y": 759 + }, + "images": [ + { + "type": "location", + "id": "f375e131-8b18-4d3c-b266-623ef91283aa", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - I/location.jpg" + } + ] + }, + { + "name": "Crown City - J", + "id": "8e139a9b-7cdb-4a78-87e5-25e586640e94", + "position": { + "x": 855, + "y": 766 + }, + "images": [ + { + "type": "location", + "id": "d34241d9-b789-4a68-bdd4-5c55ff875bff", + "url": "https://mkw.techtangents.net/marker/panel/Crown City - J/location.jpg" + } + ] + }, + { + "name": "Dandelion Depths - A", + "id": "6596ed99-56e2-446c-8289-69b4277c5518", + "position": { + "x": 1145, + "y": 391 + }, + "images": [ + { + "type": "location", + "id": "8b0286df-4b3d-4768-a6f4-5c4cb48488ba", + "url": "https://mkw.techtangents.net/marker/panel/Dandelion Depths - A/location.jpg" + } + ] + }, + { + "name": "Dandelion Depths - B", + "id": "d11f983e-a277-4477-8266-8c3d67c2ccb8", + "position": { + "x": 1125, + "y": 390 + }, + "images": [ + { + "type": "location", + "id": "9ce61267-e871-44e5-95a2-a1c0c2ae1165", + "url": "https://mkw.techtangents.net/marker/panel/Dandelion Depths - B/location.jpg" + } + ] + }, + { + "name": "Dandelion Depths - C", + "id": "72fd1a14-998c-4d2c-88c7-19321d2755a0", + "position": { + "x": 1109, + "y": 390 + }, + "images": [ + { + "type": "location", + "id": "aed9c49b-1fbd-4a2e-ae87-0a3f1c768065", + "url": "https://mkw.techtangents.net/marker/panel/Dandelion Depths - C/location.jpg" + } + ] + }, + { + "name": "Dandelion Depths - D", + "id": "4727b7cb-dd34-4c17-9893-794be13e58b2", + "position": { + "x": 1115, + "y": 395 + }, + "images": [ + { + "type": "location", + "id": "1ddac959-ffac-4ee2-b551-13704f88e0a5", + "url": "https://mkw.techtangents.net/marker/panel/Dandelion Depths - D/location.jpg" + } + ] + }, + { + "name": "Dandelion Depths - E", + "id": "412ff623-84f1-4795-b433-74cb79858fde", + "position": { + "x": 1130, + "y": 404 + }, + "images": [ + { + "type": "location", + "id": "1334dfe0-0c68-431f-be23-9b4df65765f6", + "url": "https://mkw.techtangents.net/marker/panel/Dandelion Depths - E/location.jpg" + } + ] + }, + { + "name": "Desert Hills - A", + "id": "6bfeee18-73a4-4b02-afe0-d767edea89e0", + "position": { + "x": 471, + "y": 758 + }, + "images": [ + { + "type": "location", + "id": "c4337855-a79b-4dd5-b8e5-e2e2b4db2559", + "url": "https://mkw.techtangents.net/marker/panel/Desert Hills - A/location.jpg" + } + ] + }, + { + "name": "Desert Hills - B", + "id": "da668d4f-21d2-4985-8e8d-08efcf0c2811", + "position": { + "x": 458, + "y": 757 + }, + "images": [ + { + "type": "location", + "id": "e03f65ed-ab52-4038-aca4-ccde88b5b095", + "url": "https://mkw.techtangents.net/marker/panel/Desert Hills - B/location.jpg" + } + ] + }, + { + "name": "Desert Hills - C", + "id": "2bd409e6-57b2-4b63-adf5-78b5bdb626f8", + "position": { + "x": 467, + "y": 770 + }, + "images": [ + { + "type": "location", + "id": "73552075-fcdf-465c-9c49-f554fdeee6d3", + "url": "https://mkw.techtangents.net/marker/panel/Desert Hills - C/location.jpg" + } + ] + }, + { + "name": "Desert Hills - D", + "id": "e2a2e62f-4880-41c2-a411-92bd0bd1315e", + "position": { + "x": 460, + "y": 772 + }, + "images": [ + { + "type": "location", + "id": "a963114e-39ef-485c-8ae5-58bac30a7b20", + "url": "https://mkw.techtangents.net/marker/panel/Desert Hills - D/location.jpg" + } + ] + }, + { + "name": "Desert Hills - E", + "id": "c873b909-8df0-4f4f-a367-0886bb1747c1", + "position": { + "x": 474, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "955fa60a-274d-4b27-a3dd-ba6bb765e5d3", + "url": "https://mkw.techtangents.net/marker/panel/Desert Hills - E/location.jpg" + } + ] + }, + { + "name": "Dino Dino Jungle - A", + "id": "b1c22326-3b5e-4101-ab00-ec4720693e56", + "position": { + "x": 1138, + "y": 972 + }, + "images": [ + { + "type": "location", + "id": "57e65703-bdd5-478a-a191-29cf86fae665", + "url": "https://mkw.techtangents.net/marker/panel/Dino Dino Jungle - A/location.jpg" + } + ] + }, + { + "name": "Dino Dino Jungle - B", + "id": "b3b6b421-ba9d-4fa9-b0e5-75cf50df1902", + "position": { + "x": 1128, + "y": 973 + }, + "images": [ + { + "type": "location", + "id": "e84d8d96-92d3-4e78-9583-ce424ada16db", + "url": "https://mkw.techtangents.net/marker/panel/Dino Dino Jungle - B/location.jpg" + } + ] + }, + { + "name": "Dino Dino Jungle - C", + "id": "741f9774-f48d-467c-9ca4-eece2643e74d", + "position": { + "x": 1135, + "y": 977 + }, + "images": [ + { + "type": "location", + "id": "339244e1-56e5-460f-8c5a-f6c96e860b7c", + "url": "https://mkw.techtangents.net/marker/panel/Dino Dino Jungle - C/location.jpg" + } + ] + }, + { + "name": "Dino Dino Jungle - D", + "id": "9a8a5f5c-85f9-415f-a598-bde95b4f0ed3", + "position": { + "x": 1124, + "y": 981 + }, + "images": [ + { + "type": "location", + "id": "467fcc83-f816-4ef0-a802-6f8b99c41908", + "url": "https://mkw.techtangents.net/marker/panel/Dino Dino Jungle - D/location.jpg" + } + ] + }, + { + "name": "Dino Dino Jungle - E", + "id": "a1c6a085-9c47-44c8-807f-0b70561195de", + "position": { + "x": 1131, + "y": 984 + }, + "images": [ + { + "type": "location", + "id": "244bda79-87d0-49d2-96c0-654bf30752c0", + "url": "https://mkw.techtangents.net/marker/panel/Dino Dino Jungle - E/location.jpg" + } + ] + }, + { + "name": "DK Pass - A", + "id": "55c0936c-f602-441f-a088-4adbbb5ec616", + "position": { + "x": 1273, + "y": 460 + }, + "images": [ + { + "type": "location", + "id": "c0d41954-0f1a-4f4d-a87a-70a29d7e95ae", + "url": "https://mkw.techtangents.net/marker/panel/DK Pass - A/location.jpg" + } + ] + }, + { + "name": "DK Pass - B", + "id": "76f397a7-b1b3-44ca-9899-f745a6bc7b4a", + "position": { + "x": 1265, + "y": 479 + }, + "images": [ + { + "type": "location", + "id": "9318964d-6e42-4e6a-8fd6-f2bca137b1c2", + "url": "https://mkw.techtangents.net/marker/panel/DK Pass - B/location.jpg" + } + ] + }, + { + "name": "DK Pass - C", + "id": "87ae3753-908d-4de6-a56f-4a1aa07f0a30", + "position": { + "x": 1264, + "y": 469 + }, + "images": [ + { + "type": "location", + "id": "27dd2211-b5b9-4535-94cd-e9b932894f77", + "url": "https://mkw.techtangents.net/marker/panel/DK Pass - C/location.jpg" + } + ] + }, + { + "name": "DK Pass - D", + "id": "84ec6bac-d128-4334-86c2-52da65e79fb7", + "position": { + "x": 1255, + "y": 458 + }, + "images": [ + { + "type": "location", + "id": "6a26a2e9-09d1-4a43-9f2b-5fb05978fcf5", + "url": "https://mkw.techtangents.net/marker/panel/DK Pass - D/location.jpg" + } + ] + }, + { + "name": "DK Pass - E", + "id": "925c2e01-d581-4916-aacd-5cc903663a12", + "position": { + "x": 1248, + "y": 469 + }, + "images": [ + { + "type": "location", + "id": "6e126993-9582-4867-8193-ece32c51d410", + "url": "https://mkw.techtangents.net/marker/panel/DK Pass - E/location.jpg" + } + ] + }, + { + "name": "DK Spaceport - A", + "id": "2a39a626-e997-4e30-9782-bfc154ed59f9", + "position": { + "x": 758, + "y": 983 + }, + "images": [ + { + "type": "location", + "id": "51aeb288-f07f-4876-ba81-53764cd7be42", + "url": "https://mkw.techtangents.net/marker/panel/DK Spaceport - A/location.jpg" + } + ] + }, + { + "name": "DK Spaceport - B", + "id": "5d76fd04-ef76-45d1-a0d4-da277a9bb7ca", + "position": { + "x": 801, + "y": 940 + }, + "images": [ + { + "type": "location", + "id": "907bfe05-0355-4b0f-aaae-206c1778714d", + "url": "https://mkw.techtangents.net/marker/panel/DK Spaceport - B/location.jpg" + } + ] + }, + { + "name": "DK Spaceport - C", + "id": "7dba969a-29c4-4a57-a246-87137e59cd4f", + "position": { + "x": 813, + "y": 940 + }, + "images": [ + { + "type": "location", + "id": "a27ac06f-4a10-4834-9871-0cf1ca24d502", + "url": "https://mkw.techtangents.net/marker/panel/DK Spaceport - C/location.jpg" + } + ] + }, + { + "name": "DK Spaceport - D", + "id": "612ec543-725f-4b6a-8fcb-7df6c11bf42e", + "position": { + "x": 808, + "y": 958 + }, + "images": [ + { + "type": "location", + "id": "6f700dcc-2e0d-495c-bcb1-17db7cf1a123", + "url": "https://mkw.techtangents.net/marker/panel/DK Spaceport - D/location.jpg" + } + ] + }, + { + "name": "DK Spaceport - E", + "id": "4680e2c2-b213-4b7b-b11f-993fc5d75e63", + "position": { + "x": 817, + "y": 952 + }, + "images": [ + { + "type": "location", + "id": "6c9dc509-8375-4c3c-ac49-5550c9e852bb", + "url": "https://mkw.techtangents.net/marker/panel/DK Spaceport - E/location.jpg" + } + ] + }, + { + "name": "Dry Bones Burnout - A", + "id": "0f357f7d-5656-4834-97d0-14201b501791", + "position": { + "x": 820, + "y": 177 + }, + "images": [ + { + "type": "location", + "id": "0537c5a7-5989-4ec5-a70e-d18eab291726", + "url": "https://mkw.techtangents.net/marker/panel/Dry Bones Burnout - A/location.jpg" + } + ] + }, + { + "name": "Dry Bones Burnout - B", + "id": "2c248f46-7675-49ba-bf48-0dba50f360db", + "position": { + "x": 802, + "y": 167 + }, + "images": [ + { + "type": "location", + "id": "2bf71a01-b9d1-43c3-b9d6-580d05048655", + "url": "https://mkw.techtangents.net/marker/panel/Dry Bones Burnout - B/location.jpg" + } + ] + }, + { + "name": "Dry Bones Burnout - C", + "id": "efd4be67-d461-41c8-a2ed-564f00d81e87", + "position": { + "x": 799, + "y": 172 + }, + "images": [ + { + "type": "location", + "id": "f2098b6f-c5b2-4a55-8526-6e016a5fb8f1", + "url": "https://mkw.techtangents.net/marker/panel/Dry Bones Burnout - C/location.jpg" + } + ] + }, + { + "name": "Dry Bones Burnout - D", + "id": "962d8019-bc7b-498e-b1b3-5c5fae89bd43", + "position": { + "x": 800, + "y": 187 + }, + "images": [ + { + "type": "location", + "id": "5c3bdbff-b5a7-4b1a-af4f-8952a0da66fa", + "url": "https://mkw.techtangents.net/marker/panel/Dry Bones Burnout - D/location.jpg" + } + ] + }, + { + "name": "Dry Bones Burnout - E", + "id": "33dcd7fc-d363-4957-b68b-d9b6ba4388ff", + "position": { + "x": 820, + "y": 189 + }, + "images": [ + { + "type": "location", + "id": "578de1b9-84fe-4489-b0ef-1bb6d3a6f5e6", + "url": "https://mkw.techtangents.net/marker/panel/Dry Bones Burnout - E/location.jpg" + } + ] + }, + { + "name": "Faraway Oasis - A", + "id": "3c19aad5-ed10-4c43-9a10-e91cd8b0b81a", + "position": { + "x": 1143, + "y": 793 + }, + "images": [ + { + "type": "location", + "id": "5a242853-a75c-4c21-9d8b-8ebfe8637eed", + "url": "https://mkw.techtangents.net/marker/panel/Faraway Oasis - A/location.jpg" + } + ] + }, + { + "name": "Faraway Oasis - B", + "id": "edc6095c-ae6b-40fb-93d0-a8ce29987bb3", + "position": { + "x": 1131, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "116ef20c-5c7d-4242-9b6c-d084414a6433", + "url": "https://mkw.techtangents.net/marker/panel/Faraway Oasis - B/location.jpg" + } + ] + }, + { + "name": "Faraway Oasis - C", + "id": "baae21d5-1d65-4ca7-bedb-24af9b6d9ee9", + "position": { + "x": 1144, + "y": 763 + }, + "images": [ + { + "type": "location", + "id": "7bf095c5-d512-464d-b7e4-207bbe577f04", + "url": "https://mkw.techtangents.net/marker/panel/Faraway Oasis - C/location.jpg" + } + ] + }, + { + "name": "Faraway Oasis - D", + "id": "7164ad94-cc1c-42ff-a64a-bef3e315b4f1", + "position": { + "x": 1156, + "y": 749 + }, + "images": [ + { + "type": "location", + "id": "2b4dc703-35c7-467d-a9a6-6084c10e3f93", + "url": "https://mkw.techtangents.net/marker/panel/Faraway Oasis - D/location.jpg" + } + ] + }, + { + "name": "Faraway Oasis - E", + "id": "66a721fb-49b6-43da-b0cf-3b3fb5d9770d", + "position": { + "x": 1122, + "y": 747 + }, + "images": [ + { + "type": "location", + "id": "28c2f2e9-25b7-4361-9b07-03b4f78e5df8", + "url": "https://mkw.techtangents.net/marker/panel/Faraway Oasis - E/location.jpg" + } + ] + }, + { + "name": "Great ? Block Ruins - A", + "id": "e953677a-196c-4896-9bf7-d944a9d72a9d", + "position": { + "x": 1336, + "y": 901 + }, + "images": [ + { + "type": "location", + "id": "170c3674-52cb-442f-bca6-5e67a58e888c", + "url": "https://mkw.techtangents.net/marker/panel/Great Block Ruins - A/location.jpg" + } + ] + }, + { + "name": "Great ? Block Ruins - B", + "id": "31a845f4-cd4a-4947-84f5-943442d38733", + "position": { + "x": 1335, + "y": 910 + }, + "images": [ + { + "type": "location", + "id": "6923ac5f-1d18-47de-9f9a-633c8c8457df", + "url": "https://mkw.techtangents.net/marker/panel/Great Block Ruins - B/location.jpg" + } + ] + }, + { + "name": "Great ? Block Ruins - C", + "id": "a0cbf2ad-7571-42fb-9ae2-3da1a5f9e6c1", + "position": { + "x": 1319, + "y": 918 + }, + "images": [ + { + "type": "location", + "id": "5f707ee3-1bd1-4315-b888-3d782de812f0", + "url": "https://mkw.techtangents.net/marker/panel/Great Block Ruins - C/location.jpg" + } + ] + }, + { + "name": "Great ? Block Ruins - D", + "id": "5fa694c3-7e90-4160-a218-7ea3ffcabe92", + "position": { + "x": 1320, + "y": 907 + }, + "images": [ + { + "type": "location", + "id": "b0f61bb0-eb13-46a4-8e7f-a6f997f79a5e", + "url": "https://mkw.techtangents.net/marker/panel/Great Block Ruins - D/location.jpg" + } + ] + }, + { + "name": "Great ? Block Ruins - E", + "id": "d2d29dc9-f138-4c29-9265-fc8790f46b5a", + "position": { + "x": 1297, + "y": 907 + }, + "images": [ + { + "type": "location", + "id": "8f66b56f-9e75-418c-87e9-4ebf33c4b548", + "url": "https://mkw.techtangents.net/marker/panel/Great Block Ruins - E/location.jpg" + } + ] + }, + { + "name": "Koopa Troopa Beach - A", + "id": "a7ab2a80-fafc-4692-8b36-9070ad876c89", + "position": { + "x": 964, + "y": 902 + }, + "images": [ + { + "type": "location", + "id": "8525caf1-e6a6-4b57-b4b8-071a94adf2a0", + "url": "https://mkw.techtangents.net/marker/panel/Koopa Troopa Beach - A/location.jpg" + } + ] + }, + { + "name": "Koopa Troopa Beach - B", + "id": "824fd04a-cb83-4c81-95d7-831adf15a7ba", + "position": { + "x": 957, + "y": 907 + }, + "images": [ + { + "type": "location", + "id": "4d59a289-f888-4828-9588-81bcfc07bdc2", + "url": "https://mkw.techtangents.net/marker/panel/Koopa Troopa Beach - B/location.jpg" + } + ] + }, + { + "name": "Koopa Troopa Beach - C", + "id": "4df48605-1241-4b94-af43-cd6a6aaa3b64", + "position": { + "x": 949, + "y": 913 + }, + "images": [ + { + "type": "location", + "id": "a63bd3c9-e905-4ea7-8325-aeb45552fbab", + "url": "https://mkw.techtangents.net/marker/panel/Koopa Troopa Beach - C/location.jpg" + } + ] + }, + { + "name": "Koopa Troopa Beach - D", + "id": "cb7d0f1e-c485-4300-bdf0-04bcb1c13898", + "position": { + "x": 941, + "y": 899 + }, + "images": [ + { + "type": "location", + "id": "667a903b-2ca2-4456-b2d2-e748d24a5efe", + "url": "https://mkw.techtangents.net/marker/panel/Koopa Troopa Beach - D/location.jpg" + } + ] + }, + { + "name": "Koopa Troopa Beach - E", + "id": "3e8f29a9-1253-4567-8ca4-03b1aa61c7da", + "position": { + "x": 907, + "y": 905 + }, + "images": [ + { + "type": "location", + "id": "fc835691-a3d3-4fbf-959e-02137e5a1420", + "url": "https://mkw.techtangents.net/marker/panel/Koopa Troopa Beach - E/location.jpg" + } + ] + }, + { + "name": "Mario Bros. Circuit - A", + "id": "a5fbb570-6357-402f-b641-2485207fc661", + "position": { + "x": 610, + "y": 681 + }, + "images": [ + { + "type": "location", + "id": "78a82cd1-bbdc-4ebf-aab8-6ebea6b1d462", + "url": "https://mkw.techtangents.net/marker/panel/Mario Bros. Circuit - A/location.jpg" + } + ] + }, + { + "name": "Mario Bros. Circuit - B", + "id": "a6b316ac-2bad-4fa2-91e6-4c6a63e1e11d", + "position": { + "x": 608, + "y": 671 + }, + "images": [ + { + "type": "location", + "id": "fd52a246-1a35-44a7-a525-695da1057eb5", + "url": "https://mkw.techtangents.net/marker/panel/Mario Bros. Circuit - B/location.jpg" + } + ] + }, + { + "name": "Mario Bros. Circuit - C", + "id": "0d45baa9-3c43-40ba-9c03-4653bc7cf87d", + "position": { + "x": 620, + "y": 669 + }, + "images": [ + { + "type": "location", + "id": "9e89ef25-e26a-4650-970f-3fe8a225629e", + "url": "https://mkw.techtangents.net/marker/panel/Mario Bros. Circuit - C/location.jpg" + } + ] + }, + { + "name": "Mario Bros. Circuit - D", + "id": "68983bcc-bb95-448f-bd81-a73fe8caab74", + "position": { + "x": 634, + "y": 662 + }, + "images": [ + { + "type": "location", + "id": "d024d1d9-f2ef-491b-ad8c-0388af86e20f", + "url": "https://mkw.techtangents.net/marker/panel/Mario Bros. Circuit - D/location.jpg" + } + ] + }, + { + "name": "Mario Bros. Circuit - E", + "id": "de687f12-6458-4b16-b40d-4574369955f6", + "position": { + "x": 612, + "y": 661 + }, + "images": [ + { + "type": "location", + "id": "25812981-a067-4dad-ac9a-67e0413f1d14", + "url": "https://mkw.techtangents.net/marker/panel/Mario Bros. Circuit - E/location.jpg" + } + ] + }, + { + "name": "Mario Circuit - A", + "id": "2d79e6ad-0237-45ea-9056-e4015bbdc9e2", + "position": { + "x": 958, + "y": 294 + }, + "images": [ + { + "type": "location", + "id": "642d579e-6f5f-4a14-bec8-f06506473896", + "url": "https://mkw.techtangents.net/marker/panel/Mario Circuit - A/location.jpg" + } + ] + }, + { + "name": "Mario Circuit - B", + "id": "902da3ba-2900-4fff-b150-948c4d7c0905", + "position": { + "x": 969, + "y": 293 + }, + "images": [ + { + "type": "location", + "id": "11d7a5e8-5bf7-46ee-8f47-1ce239d00caa", + "url": "https://mkw.techtangents.net/marker/panel/Mario Circuit - B/location.jpg" + } + ] + }, + { + "name": "Mario Circuit - C", + "id": "f4ad7773-bd11-4da7-b37c-13057f26433e", + "position": { + "x": 969, + "y": 289 + }, + "images": [ + { + "type": "location", + "id": "9b625cac-5415-41f4-906c-61c1ba9b4bad", + "url": "https://mkw.techtangents.net/marker/panel/Mario Circuit - C/location.jpg" + } + ] + }, + { + "name": "Mario Circuit - D", + "id": "a3a8918c-bd6d-467e-8da7-e0640675b942", + "position": { + "x": 969, + "y": 282 + }, + "images": [ + { + "type": "location", + "id": "d366b3c2-1e4f-4181-9cc1-90409b59c054", + "url": "https://mkw.techtangents.net/marker/panel/Mario Circuit - D/location.jpg" + } + ] + }, + { + "name": "Mario Circuit - E", + "id": "cbc78ce2-d884-43eb-a56a-8e02d3f96787", + "position": { + "x": 993, + "y": 285 + }, + "images": [ + { + "type": "location", + "id": "9c39027d-286a-42f6-830e-cebc02c0bcda", + "url": "https://mkw.techtangents.net/marker/panel/Mario Circuit - E/location.jpg" + } + ] + }, + { + "name": "Moo Moo Meadows - A", + "id": "928236f6-99b5-43b9-95d6-37e339e76e05", + "position": { + "x": 965, + "y": 465 + }, + "images": [ + { + "type": "location", + "id": "de61d616-0e1d-4a7b-8342-e6a870ce7828", + "url": "https://mkw.techtangents.net/marker/panel/Moo Moo Meadows - A/location.jpg" + } + ] + }, + { + "name": "Moo Moo Meadows - B", + "id": "5a48f464-1e5b-4ce9-99c0-ecd8085e6ac7", + "position": { + "x": 968, + "y": 463 + }, + "images": [ + { + "type": "location", + "id": "b3a83e7d-c749-4a1a-8366-c7a09daf2d41", + "url": "https://mkw.techtangents.net/marker/panel/Moo Moo Meadows - B/location.jpg" + } + ] + }, + { + "name": "Moo Moo Meadows - C", + "id": "3759f0a5-eb63-4b56-906a-eae4d091cd64", + "position": { + "x": 957, + "y": 455 + }, + "images": [ + { + "type": "location", + "id": "d1faf76b-c7df-4e35-a7a2-e1590cef803b", + "url": "https://mkw.techtangents.net/marker/panel/Moo Moo Meadows - C/location.jpg" + } + ] + }, + { + "name": "Moo Moo Meadows - D", + "id": "2167bb83-0cb8-41c2-aafd-436a55b1dace", + "position": { + "x": 955, + "y": 484 + }, + "images": [ + { + "type": "location", + "id": "c3c60593-6ecc-4ce4-a4e3-bba4af7fd666", + "url": "https://mkw.techtangents.net/marker/panel/Moo Moo Meadows - D/location.jpg" + } + ] + }, + { + "name": "Moo Moo Meadows - E", + "id": "b3dd82a2-f5ab-4272-ad7d-b88df10e3f03", + "position": { + "x": 983, + "y": 484 + }, + "images": [ + { + "type": "location", + "id": "5096bbea-48b7-48e5-a250-5780cfaac19f", + "url": "https://mkw.techtangents.net/marker/panel/Moo Moo Meadows - E/location.jpg" + } + ] + }, + { + "name": "Peach Beach - A", + "id": "a0ec025a-dc87-46ad-b3ce-d4bcc8324fa6", + "position": { + "x": 1404, + "y": 774 + }, + "images": [ + { + "type": "location", + "id": "9901677e-247d-41b4-a851-f61714c2dc08", + "url": "https://mkw.techtangents.net/marker/panel/Peach Beach - A/location.jpg" + } + ] + }, + { + "name": "Peach Beach - B", + "id": "e7916c21-ddf7-4776-9d1c-821c3ee8c88c", + "position": { + "x": 1407, + "y": 780 + }, + "images": [ + { + "type": "location", + "id": "e9c9442f-d55b-4a0c-8152-7e432346fecd", + "url": "https://mkw.techtangents.net/marker/panel/Peach Beach - B/location.jpg" + } + ] + }, + { + "name": "Peach Beach - C", + "id": "06410a9a-977e-4bec-9e65-beb5937c8b34", + "position": { + "x": 1398, + "y": 798 + }, + "images": [ + { + "type": "location", + "id": "b356fdb4-77db-4556-8b76-1c9e36a6d03d", + "url": "https://mkw.techtangents.net/marker/panel/Peach Beach - C/location.jpg" + } + ] + }, + { + "name": "Peach Beach - D", + "id": "1565135d-cf7f-4307-9e44-0567bd384168", + "position": { + "x": 1412, + "y": 762 + }, + "images": [ + { + "type": "location", + "id": "e924938b-4742-44e9-ac6c-1e60f60a5158", + "url": "https://mkw.techtangents.net/marker/panel/Peach Beach - D/location.jpg" + } + ] + }, + { + "name": "Peach Beach - E", + "id": "2a1268e9-cf64-4101-bc21-34c774c73c38", + "position": { + "x": 1442, + "y": 779 + }, + "images": [ + { + "type": "location", + "id": "4907f075-90a3-43f2-8c2b-286e5c1b1e64", + "url": "https://mkw.techtangents.net/marker/panel/Peach Beach - E/location.jpg" + } + ] + }, + { + "name": "Peach Stadium - A", + "id": "9dc73d51-cf44-4f29-b986-49259eb57e87", + "position": { + "x": 942, + "y": 660 + }, + "images": [ + { + "type": "location", + "id": "1bfa0315-9337-4790-8ba0-50736abd0715", + "url": "https://mkw.techtangents.net/marker/panel/Peach Stadium - A/location.jpg" + } + ] + }, + { + "name": "Peach Stadium - B", + "id": "4182ccdb-eb4b-43aa-9906-62b6882ac268", + "position": { + "x": 933, + "y": 650 + }, + "images": [ + { + "type": "location", + "id": "5ac8dfc4-4325-4e30-8b4a-5f55ca6fb971", + "url": "https://mkw.techtangents.net/marker/panel/Peach Stadium - B/location.jpg" + } + ] + }, + { + "name": "Peach Stadium - C", + "id": "78464c7f-63b7-4593-aa77-472ab7551ebf", + "position": { + "x": 966, + "y": 645 + }, + "images": [ + { + "type": "location", + "id": "33cf925a-59dd-4973-8cd3-52e9b6df0cfe", + "url": "https://mkw.techtangents.net/marker/panel/Peach Stadium - C/location.jpg" + } + ] + }, + { + "name": "Peach Stadium - D", + "id": "15b6c4fd-72a3-4cf3-ae97-62b22063e1f8", + "position": { + "x": 970, + "y": 633 + }, + "images": [ + { + "type": "location", + "id": "cf77baf3-c898-4da3-ac50-bdb88c68431a", + "url": "https://mkw.techtangents.net/marker/panel/Peach Stadium - D/location.jpg" + } + ] + }, + { + "name": "Peach Stadium - E", + "id": "a9173e69-a213-49df-88c1-6a3e89fcbcbc", + "position": { + "x": 960, + "y": 625 + }, + "images": [ + { + "type": "location", + "id": "a26e6c41-f585-49e6-92c5-30923004915c", + "url": "https://mkw.techtangents.net/marker/panel/Peach Stadium - E/location.jpg" + } + ] + }, + { + "name": "Salty Salty Speedway - A", + "id": "1836f8f3-e3ba-471c-9c7d-62d35c472579", + "position": { + "x": 1278, + "y": 689 + }, + "images": [ + { + "type": "location", + "id": "0a07a506-f681-4b28-b1b2-879ef5f0eb16", + "url": "https://mkw.techtangents.net/marker/panel/Salty Salty Speedway - A/location.jpg" + } + ] + }, + { + "name": "Salty Salty Speedway - B", + "id": "c1d4dbbf-a6c2-430f-82ae-a3b0b03f3b58", + "position": { + "x": 1247, + "y": 673 + }, + "images": [ + { + "type": "location", + "id": "29aba927-64fc-49fb-8047-51c27fd78973", + "url": "https://mkw.techtangents.net/marker/panel/Salty Salty Speedway - B/location.jpg" + } + ] + }, + { + "name": "Salty Salty Speedway - C", + "id": "7b102985-c1a9-42d6-9438-c8982e84267d", + "position": { + "x": 1252, + "y": 700 + }, + "images": [ + { + "type": "location", + "id": "329eae52-9be6-41a3-9b10-994e6cce9a39", + "url": "https://mkw.techtangents.net/marker/panel/Salty Salty Speedway - C/location.jpg" + } + ] + }, + { + "name": "Salty Salty Speedway - D", + "id": "36a3604b-56d2-4d23-89dc-cbd693a10d22", + "position": { + "x": 1274, + "y": 674 + }, + "images": [ + { + "type": "location", + "id": "1ecd4044-30e0-4ad7-b803-e27ed4b08a38", + "url": "https://mkw.techtangents.net/marker/panel/Salty Salty Speedway - D/location.jpg" + } + ] + }, + { + "name": "Salty Salty Speedway - E", + "id": "95006cb0-0097-45b3-bdf7-85d7421a2c04", + "position": { + "x": 1305, + "y": 666 + }, + "images": [ + { + "type": "location", + "id": "3aca73b5-c15c-4d8d-bdc4-fb86e5c82ee9", + "url": "https://mkw.techtangents.net/marker/panel/Salty Salty Speedway - E/location.jpg" + } + ] + }, + { + "name": "Shy Guy Bazaar - A", + "id": "dc6228b9-0e84-4684-8caf-07e0788b8df6", + "position": { + "x": 451, + "y": 561 + }, + "images": [ + { + "type": "location", + "id": "50c69917-8b6b-4487-a4cd-1cd7975247c9", + "url": "https://mkw.techtangents.net/marker/panel/Shy Guy Bazaar - A/location.jpg" + } + ] + }, + { + "name": "Shy Guy Bazaar - B", + "id": "eb8d8bcd-0a3d-4d26-8caf-fa0f6a315c79", + "position": { + "x": 447, + "y": 553 + }, + "images": [ + { + "type": "location", + "id": "72ebb30b-8e5b-4edb-8c44-eba33a5d6da7", + "url": "https://mkw.techtangents.net/marker/panel/Shy Guy Bazaar - B/location.jpg" + } + ] + }, + { + "name": "Shy Guy Bazaar - C", + "id": "4183ace2-ca6a-4e2f-a88e-0e030660273d", + "position": { + "x": 444, + "y": 561 + }, + "images": [ + { + "type": "location", + "id": "459de938-538f-417f-aaa4-14c6a7eb7c22", + "url": "https://mkw.techtangents.net/marker/panel/Shy Guy Bazaar - C/location.jpg" + } + ] + }, + { + "name": "Shy Guy Bazaar - D", + "id": "cfc43b75-80dc-4c91-b97f-ceccee28d91f", + "position": { + "x": 441, + "y": 546 + }, + "images": [ + { + "type": "location", + "id": "5266b971-c882-415a-b7f9-164ad14fbc6c", + "url": "https://mkw.techtangents.net/marker/panel/Shy Guy Bazaar - D/location.jpg" + } + ] + }, + { + "name": "Shy Guy Bazaar - E", + "id": "a40d6429-bc46-4126-9f7c-7d855613624d", + "position": { + "x": 480, + "y": 550 + }, + "images": [ + { + "type": "location", + "id": "68fc79ed-4c88-4b24-834a-c9873890637f", + "url": "https://mkw.techtangents.net/marker/panel/Shy Guy Bazaar - E/location.jpg" + } + ] + }, + { + "name": "Sky-High Sundae - A", + "id": "7856df93-eb85-467d-9581-88828ee90c67", + "position": { + "x": 1416, + "y": 397 + }, + "images": [ + { + "type": "location", + "id": "75023727-39b9-46a7-9e0e-bda64a3830f5", + "url": "https://mkw.techtangents.net/marker/panel/Sky-High Sundae - A/location.jpg" + } + ] + }, + { + "name": "Sky-High Sundae - B", + "id": "0d3dbe94-0aec-4aec-bccc-a66380f0c86e", + "position": { + "x": 1424, + "y": 407 + }, + "images": [ + { + "type": "location", + "id": "2176c183-5068-4a56-9a78-ed5b32cb3c8d", + "url": "https://mkw.techtangents.net/marker/panel/Sky-High Sundae - B/location.jpg" + } + ] + }, + { + "name": "Sky-High Sundae - C", + "id": "8dcd4a3b-9354-4b89-a9b5-0a3f076daca0", + "position": { + "x": 1428, + "y": 389 + }, + "images": [ + { + "type": "location", + "id": "538f0b42-43c3-422f-9e54-8863fce4122e", + "url": "https://mkw.techtangents.net/marker/panel/Sky-High Sundae - C/location.jpg" + } + ] + }, + { + "name": "Sky-High Sundae - D", + "id": "c1c707e8-854e-4b9d-9524-51bf49f5b84f", + "position": { + "x": 1398, + "y": 379 + }, + "images": [ + { + "type": "location", + "id": "73c67376-1630-4bcc-bf07-6591b46e72cf", + "url": "https://mkw.techtangents.net/marker/panel/Sky-High Sundae - D/location.jpg" + } + ] + }, + { + "name": "Sky-High Sundae - E", + "id": "30c5d872-715b-4d1a-901c-22544d29b267", + "position": { + "x": 1401, + "y": 386 + }, + "images": [ + { + "type": "location", + "id": "6a857f38-caf1-4e20-865d-871bf150d204", + "url": "https://mkw.techtangents.net/marker/panel/Sky-High Sundae - E/location.jpg" + } + ] + }, + { + "name": "Starview Peak - A", + "id": "327c7acf-6017-4e7f-acc7-cc4ec97869b3", + "position": { + "x": 1265, + "y": 281 + }, + "images": [ + { + "type": "location", + "id": "c090dbbb-2cca-4643-b6e3-814bf771cd21", + "url": "https://mkw.techtangents.net/marker/panel/Starview Peak - A/location.jpg" + } + ] + }, + { + "name": "Starview Peak - B", + "id": "aba5c648-92e8-4bbe-81fd-114dbf078b92", + "position": { + "x": 1264, + "y": 282 + }, + "images": [ + { + "type": "location", + "id": "52ec3b12-91e7-42fa-8925-10ae1c791eb4", + "url": "https://mkw.techtangents.net/marker/panel/Starview Peak - B/location.jpg" + } + ] + }, + { + "name": "Starview Peak - C", + "id": "1dd2e565-f9ce-4fd9-a434-3049db44939a", + "position": { + "x": 1261, + "y": 286 + }, + "images": [ + { + "type": "location", + "id": "364c9378-44a0-4ca8-afe4-686fb6e13393", + "url": "https://mkw.techtangents.net/marker/panel/Starview Peak - C/location.jpg" + } + ] + }, + { + "name": "Starview Peak - D", + "id": "78f2d7a1-ce75-4fe7-be90-ba2eb8c64700", + "position": { + "x": 1265, + "y": 276 + }, + "images": [ + { + "type": "location", + "id": "1ee29b74-6bc8-46bb-b161-b07154aa6a4d", + "url": "https://mkw.techtangents.net/marker/panel/Starview Peak - D/location.jpg" + } + ] + }, + { + "name": "Starview Peak - E", + "id": "f0c22ba9-bd3c-4d41-8195-8a243c6865a1", + "position": { + "x": 1262, + "y": 278 + }, + "images": [ + { + "type": "location", + "id": "38dcbf7c-576b-4e74-8bcf-8b86cc8e97b8", + "url": "https://mkw.techtangents.net/marker/panel/Starview Peak - E/location.jpg" + } + ] + }, + { + "name": "Toad's Factory - A", + "id": "eeb7fe40-a62f-4d7d-8acd-dc0609270fc8", + "position": { + "x": 803, + "y": 385 + }, + "images": [ + { + "type": "location", + "id": "d26e682e-f15e-4ab7-855b-1ef6e266ce34", + "url": "https://mkw.techtangents.net/marker/panel/Toad's Factory - A/location.jpg" + } + ] + }, + { + "name": "Toad's Factory - B", + "id": "9837aeac-7045-4b16-be98-9db04f17f461", + "position": { + "x": 812, + "y": 396 + }, + "images": [ + { + "type": "location", + "id": "5c10a231-88d8-4ae3-97c0-b6a47b5adb89", + "url": "https://mkw.techtangents.net/marker/panel/Toad's Factory - B/location.jpg" + } + ] + }, + { + "name": "Toad's Factory - C", + "id": "4576b50f-9097-4973-abe7-07b9a0bc9627", + "position": { + "x": 815, + "y": 386 + }, + "images": [ + { + "type": "location", + "id": "81197041-9d22-470d-8483-de04759d9149", + "url": "https://mkw.techtangents.net/marker/panel/Toad's Factory - C/location.jpg" + } + ] + }, + { + "name": "Toad's Factory - D", + "id": "79de9516-9fcb-4e28-a731-b62de2d66621", + "position": { + "x": 808, + "y": 363 + }, + "images": [ + { + "type": "location", + "id": "7bb738ef-4fec-49c0-8441-229b2ebbee02", + "url": "https://mkw.techtangents.net/marker/panel/Toad's Factory - D/location.jpg" + } + ] + }, + { + "name": "Toad's Factory - E", + "id": "fa56e136-99bd-4ee9-bc49-cf616772e04c", + "position": { + "x": 790, + "y": 361 + }, + "images": [ + { + "type": "location", + "id": "fd5b22e7-b3c9-4ba7-b01c-7b38d4eb703a", + "url": "https://mkw.techtangents.net/marker/panel/Toad's Factory - E/location.jpg" + } + ] + }, + { + "name": "Wario Shipyard - A", + "id": "6d31a7c9-5034-4005-8b51-4ab85a731f3e", + "position": { + "x": 1445, + "y": 586 + }, + "images": [ + { + "type": "location", + "id": "3fffaf9f-7b4a-4ce5-b79d-e671ce1ed6b5", + "url": "https://mkw.techtangents.net/marker/panel/Wario Shipyard - A/location.jpg" + } + ] + }, + { + "name": "Wario Shipyard - B", + "id": "dc0bcd21-b91c-4946-8c5f-c54c70d3ad14", + "position": { + "x": 1441, + "y": 599 + }, + "images": [ + { + "type": "location", + "id": "5e892b51-98c4-4add-bc04-77d6e84a0f1b", + "url": "https://mkw.techtangents.net/marker/panel/Wario Shipyard - B/location.jpg" + } + ] + }, + { + "name": "Wario Shipyard - C", + "id": "ed6b2e27-1d45-4818-8740-1a9086e70254", + "position": { + "x": 1433, + "y": 585 + }, + "images": [ + { + "type": "location", + "id": "e1b8bfa4-a218-41f6-aaa2-18e6aadf8b7e", + "url": "https://mkw.techtangents.net/marker/panel/Wario Shipyard - C/location.jpg" + } + ] + }, + { + "name": "Wario Shipyard - D", + "id": "d2c88aba-64ca-4ba5-9bbd-8fb333b774a3", + "position": { + "x": 1422, + "y": 592 + }, + "images": [ + { + "type": "location", + "id": "5758c7c5-754b-4639-af95-97778e5097ad", + "url": "https://mkw.techtangents.net/marker/panel/Wario Shipyard - D/location.jpg" + } + ] + }, + { + "name": "Wario Shipyard - E", + "id": "7898c744-d396-497a-a791-e97c52e6fba2", + "position": { + "x": 1412, + "y": 586 + }, + "images": [ + { + "type": "location", + "id": "3b75e821-ffd2-4e0d-88f8-8a17ce58b043", + "url": "https://mkw.techtangents.net/marker/panel/Wario Shipyard - E/location.jpg" + } + ] + }, + { + "name": "Wario Stadium - A", + "id": "ff1bcff9-5d12-4094-9375-76a1598c2eb6", + "position": { + "x": 658, + "y": 448 + }, + "images": [ + { + "type": "location", + "id": "5766421d-be50-4161-8374-a45a219062f4", + "url": "https://mkw.techtangents.net/marker/panel/Wario Stadium - A/location.jpg" + } + ] + }, + { + "name": "Wario Stadium - B", + "id": "eec7afcd-c556-4186-95ce-e7e817d18f78", + "position": { + "x": 664, + "y": 455 + }, + "images": [ + { + "type": "location", + "id": "9dd3bdc4-c151-464c-8686-132d6ebed588", + "url": "https://mkw.techtangents.net/marker/panel/Wario Stadium - B/location.jpg" + } + ] + }, + { + "name": "Wario Stadium - C", + "id": "74f84efc-edc0-4446-b386-f4436da86ad4", + "position": { + "x": 664, + "y": 443 + }, + "images": [ + { + "type": "location", + "id": "d1e8b040-88a3-4019-bc81-d7fe368b2123", + "url": "https://mkw.techtangents.net/marker/panel/Wario Stadium - C/location.jpg" + } + ] + }, + { + "name": "Wario Stadium - D", + "id": "6b15a39a-1e70-4944-8dbb-8b934556d7ee", + "position": { + "x": 654, + "y": 489 + }, + "images": [ + { + "type": "location", + "id": "fe322edb-2321-4ca1-92ad-0cd841a909f4", + "url": "https://mkw.techtangents.net/marker/panel/Wario Stadium - D/location.jpg" + } + ] + }, + { + "name": "Wario Stadium - E", + "id": "8594a89d-bb65-49a1-9821-bd561980bad8", + "position": { + "x": 630, + "y": 481 + }, + "images": [ + { + "type": "location", + "id": "f5f0659d-15b7-42f2-9e38-1e3d67208aa0", + "url": "https://mkw.techtangents.net/marker/panel/Wario Stadium - E/location.jpg" + } + ] + }, + { + "name": "Whistlestop Summit - A", + "id": "1d771979-e8d4-418b-97cb-59abf46f9c2d", + "position": { + "x": 625, + "y": 863 + }, + "images": [ + { + "type": "location", + "id": "77e565c8-4d02-4290-9662-d963aa6f2170", + "url": "https://mkw.techtangents.net/marker/panel/Whistlestop Summit - A/location.jpg" + } + ] + }, + { + "name": "Whistlestop Summit - B", + "id": "ba576ea4-9939-48a8-9bd9-9087221a6ba2", + "position": { + "x": 634, + "y": 882 + }, + "images": [ + { + "type": "location", + "id": "3da26709-f3f0-4ee4-a088-3d3f5fc2a843", + "url": "https://mkw.techtangents.net/marker/panel/Whistlestop Summit - B/location.jpg" + } + ] + }, + { + "name": "Whistlestop Summit - C", + "id": "4d6b7d40-88f8-4adc-a7f5-61fe7453b648", + "position": { + "x": 630, + "y": 886 + }, + "images": [ + { + "type": "location", + "id": "c1870a7a-6f1f-4d07-9176-cb593124ef5d", + "url": "https://mkw.techtangents.net/marker/panel/Whistlestop Summit - C/location.jpg" + } + ] + }, + { + "name": "Whistlestop Summit - D", + "id": "06081876-9df3-4a77-8211-1cc8a76b608f", + "position": { + "x": 604, + "y": 896 + }, + "images": [ + { + "type": "location", + "id": "8333d202-2ceb-4681-91bb-332cc7958995", + "url": "https://mkw.techtangents.net/marker/panel/Whistlestop Summit - D/location.jpg" + } + ] + }, + { + "name": "Whistlestop Summit - E", + "id": "68282c69-d6ad-4f1e-ba94-0e4b5b378d08", + "position": { + "x": 611, + "y": 904 + }, + "images": [ + { + "type": "location", + "id": "96f8c92c-ba82-4cc2-b058-b1a8d5dd2f21", + "url": "https://mkw.techtangents.net/marker/panel/Whistlestop Summit - E/location.jpg" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/data/pswitches.json b/src/main/resources/assets/data/pswitches.json new file mode 100644 index 0000000..6d61eb0 --- /dev/null +++ b/src/main/resources/assets/data/pswitches.json @@ -0,0 +1,9619 @@ +{ + "entries": [ + { + "name": "Grab that parking spot! Fast!", + "id": "fa6d6f05-5043-40b9-b147-f082e7ad88dd", + "position": { + "x": 808, + "y": 790 + }, + "end": { + "flying": false, + "x": 785, + "y": 748 + }, + "images": [ + { + "type": "location", + "id": "40d55aaf-546d-46bb-b24a-e800c9d7046e", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab that parking spot! Fast!/location.jpg" + }, + { + "type": "title", + "id": "c3cc99be-5d96-4ceb-910f-28c77774a25c", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab that parking spot! Fast!/title.jpg" + } + ] + }, + { + "name": "Join in on the race around the deserted island!", + "id": "603e4237-495d-40fe-8699-e63c6e6db899", + "position": { + "x": 1401, + "y": 677 + }, + "images": [ + { + "type": "location", + "id": "23e73fcd-77f8-44d0-800c-f3670b44810b", + "url": "https://mkw.techtangents.net/marker/pswitch/Join in on the race around the deserted island!/location.jpg" + }, + { + "type": "title", + "id": "0f707657-8696-42c6-96cb-6a3ec10e0b71", + "url": "https://mkw.techtangents.net/marker/pswitch/Join in on the race around the deserted island!/title.jpg" + } + ] + }, + { + "name": "Race up the Para-Biddybud-covered bridge!", + "id": "e16ac6e4-63c6-471f-9df1-9b8bb39da6b7", + "position": { + "x": 1124, + "y": 404 + }, + "end": { + "flying": false, + "x": 1107, + "y": 380 + }, + "images": [ + { + "type": "location", + "id": "f4b3de81-699c-415b-8d74-012ed4be7166", + "url": "https://mkw.techtangents.net/marker/pswitch/Race up the Para-Biddybud-covered bridge!/location.jpg" + }, + { + "type": "title", + "id": "892a7788-9414-4af9-9714-63bb241652f0", + "url": "https://mkw.techtangents.net/marker/pswitch/Race up the Para-Biddybud-covered bridge!/title.jpg" + } + ] + }, + { + "name": "Survive the spicy Fire Piranha Plant gauntlet!", + "id": "269dacd9-28dd-49db-aaa9-eb154cc90fcf", + "position": { + "x": 705, + "y": 472 + }, + "end": { + "flying": true, + "x": 638, + "y": 382 + }, + "images": [ + { + "type": "location", + "id": "894d231e-716d-49d7-8237-96af3d3fc07d", + "url": "https://mkw.techtangents.net/marker/pswitch/Survive the spicy Fire Piranha Plant gauntlet!/location.jpg" + }, + { + "type": "title", + "id": "1c1e44f7-c9cd-457e-8bc4-05ccb1370a70", + "url": "https://mkw.techtangents.net/marker/pswitch/Survive the spicy Fire Piranha Plant gauntlet!/title.jpg" + } + ] + }, + { + "name": "Mush-zoom to the goal and don't sink!", + "id": "36bc87b9-e556-49be-8094-5e937141a13a", + "position": { + "x": 750, + "y": 556 + }, + "end": { + "flying": false, + "x": 763, + "y": 530 + }, + "images": [ + { + "type": "location", + "id": "f0b52713-7d41-425a-adaf-292dbe85a3eb", + "url": "https://mkw.techtangents.net/marker/pswitch/Mush-zoom to the goal and don't sink!/location.jpg" + }, + { + "type": "title", + "id": "7eb2dc20-7edc-447c-a9f9-c30cad10d2a8", + "url": "https://mkw.techtangents.net/marker/pswitch/Mush-zoom to the goal and don't sink!/title.jpg" + } + ] + }, + { + "name": "Climb up, up, up on Ivy Piranha Plants!", + "id": "09bab264-99b9-4009-bb8a-cf92e97a7b5f", + "position": { + "x": 980, + "y": 131 + }, + "end": { + "flying": false, + "x": 936, + "y": 78 + }, + "images": [ + { + "type": "location", + "id": "9bd59ba1-5735-40d0-bbec-c46708c09009", + "url": "https://mkw.techtangents.net/marker/pswitch/Climb up, up, up on Ivy Piranha Plants!/location.jpg" + }, + { + "type": "title", + "id": "1c34d357-67c6-48ba-a82e-50362b7a7beb", + "url": "https://mkw.techtangents.net/marker/pswitch/Climb up, up, up on Ivy Piranha Plants!/title.jpg" + } + ] + }, + { + "name": "Pick up blue coins...and maybe a donut at the end?", + "id": "1a1fa25a-b9d7-4dcc-9722-3084e0eb84fe", + "position": { + "x": 744, + "y": 721 + }, + "end": { + "flying": false, + "x": 730, + "y": 649 + }, + "images": [ + { + "type": "location", + "id": "9693951e-fe6d-4b14-95e9-69f21b73f426", + "url": "https://mkw.techtangents.net/marker/pswitch/Pick up blue coins...and maybe a donut at the end/location.jpg" + }, + { + "type": "title", + "id": "8d35e0de-acc0-45fa-89d2-81aaa4f3037c", + "url": "https://mkw.techtangents.net/marker/pswitch/Pick up blue coins...and maybe a donut at the end/title.jpg" + } + ] + }, + { + "name": "Clear the lake! Don't become fish food!", + "id": "f090e346-796d-472a-b105-1faf63e7d9c1", + "position": { + "x": 963, + "y": 583 + }, + "end": { + "flying": false, + "x": 934, + "y": 469 + }, + "images": [ + { + "type": "location", + "id": "5a1ad510-93f3-4a24-b94c-ed27be6dacdd", + "url": "https://mkw.techtangents.net/marker/pswitch/Clear the lake! Don't become fish food!/location.jpg" + }, + { + "type": "title", + "id": "210bdbd9-8ca5-4841-aa48-d8297f46a844", + "url": "https://mkw.techtangents.net/marker/pswitch/Clear the lake! Don't become fish food!/title.jpg" + } + ] + }, + { + "name": "Perform stunt after stunt across the bridge!", + "id": "7a415a74-e310-4651-b8f4-76f124368b2b", + "position": { + "x": 580, + "y": 808 + }, + "end": { + "flying": false, + "x": 553, + "y": 737 + }, + "images": [ + { + "type": "location", + "id": "df9fbe87-f1db-40bc-b4c0-5cec1d649d1e", + "url": "https://mkw.techtangents.net/marker/pswitch/Perform stunt after stunt across the bridge!/location.jpg" + }, + { + "type": "title", + "id": "a6bdc7f1-b5c3-41d2-9f28-6ae0e3338412", + "url": "https://mkw.techtangents.net/marker/pswitch/Perform stunt after stunt across the bridge!/title.jpg" + } + ] + }, + { + "name": "Race through the empty stands to the goal!", + "id": "16c9b67a-1761-452f-aeaa-376d97bc0dae", + "position": { + "x": 1257, + "y": 461 + }, + "end": { + "flying": false, + "x": 1216, + "y": 440 + }, + "images": [ + { + "type": "location", + "id": "ff843e4c-7756-4842-aff9-0d3002e82151", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through the empty stands to the goal!/location.jpg" + }, + { + "type": "title", + "id": "43780e79-7fad-4eab-94a3-96240b794ec2", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through the empty stands to the goal!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins on a figure-eight path!", + "id": "e3a43eae-b62f-45a1-8138-9dee55fdbfe7", + "position": { + "x": 982, + "y": 214 + }, + "images": [ + { + "type": "location", + "id": "1ac0e6dc-f123-4859-acf3-bc45b5f3a9e7", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins on a figure-eight path!/location.jpg" + }, + { + "type": "title", + "id": "f41fed64-71f1-45e8-88ba-4a4a60b9a126", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins on a figure-eight path!/title.jpg" + } + ] + }, + { + "name": "Soar above the falls!", + "id": "6340d384-dca2-4bff-a81b-e1ac3f60a715", + "position": { + "x": 1200, + "y": 821 + }, + "end": { + "flying": true, + "x": 1209, + "y": 821 + }, + "images": [ + { + "type": "location", + "id": "594d6d8d-6dc1-40a1-96e3-515c8febb57c", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar above the falls!/location.jpg" + }, + { + "type": "title", + "id": "51f72657-6054-4cb1-8916-ed56bc6a68b2", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar above the falls!/title.jpg" + } + ] + }, + { + "name": "Slip past shocking sumo stomps!", + "id": "47530c70-1ac9-4784-b424-54e50b769880", + "position": { + "x": 764, + "y": 241 + }, + "end": { + "flying": true, + "x": 790, + "y": 156 + }, + "images": [ + { + "type": "location", + "id": "8fb9473d-c517-4129-8749-10b9df94f7d3", + "url": "https://mkw.techtangents.net/marker/pswitch/Slip past shocking sumo stomps!/location.jpg" + }, + { + "type": "title", + "id": "376c939b-18b2-42dc-929e-a83e3783a758", + "url": "https://mkw.techtangents.net/marker/pswitch/Slip past shocking sumo stomps!/title.jpg" + } + ] + }, + { + "name": "Practice precision driving in pursuit of blue coins!", + "id": "5d78f4a4-c35e-44a7-bf42-84fa8763a129", + "position": { + "x": 694, + "y": 966 + }, + "end": { + "flying": false, + "x": 701, + "y": 937 + }, + "images": [ + { + "type": "location", + "id": "1a3da5bb-adf3-4498-a598-dcdff504d66f", + "url": "https://mkw.techtangents.net/marker/pswitch/Practice precision driving in pursuit of blue coins!/location.jpg" + }, + { + "type": "title", + "id": "26bb5171-9209-4833-bf06-0438eb31f7c6", + "url": "https://mkw.techtangents.net/marker/pswitch/Practice precision driving in pursuit of blue coins!/title.jpg" + } + ] + }, + { + "name": "Race along a tricky path over ancient ruins!", + "id": "009f2ea2-7d17-410e-bce3-91a6cc00ecfc", + "position": { + "x": 1314, + "y": 898 + }, + "end": { + "flying": false, + "x": 1309, + "y": 880 + }, + "images": [ + { + "type": "location", + "id": "094c6e3e-78c3-487e-973b-88b5d932ea9a", + "url": "https://mkw.techtangents.net/marker/pswitch/Race along a tricky path over ancient ruins!/location.jpg" + }, + { + "type": "title", + "id": "1dd90ef9-bcf9-4874-8c60-a169a953c680", + "url": "https://mkw.techtangents.net/marker/pswitch/Race along a tricky path over ancient ruins!/title.jpg" + } + ] + }, + { + "name": "Navigate a path of pipes and rings!", + "id": "58a98123-7a03-403b-bb6d-b403de034e40", + "position": { + "x": 735, + "y": 306 + }, + "end": { + "flying": true, + "x": 710, + "y": 232 + }, + "images": [ + { + "type": "location", + "id": "85ba44ea-fc42-4e23-8aaf-bc9758f5f988", + "url": "https://mkw.techtangents.net/marker/pswitch/Navigate a path of pipes and rings!/location.jpg" + }, + { + "type": "title", + "id": "18c64885-45a3-4d0b-a6d8-be1b72b2ece7", + "url": "https://mkw.techtangents.net/marker/pswitch/Navigate a path of pipes and rings!/title.jpg" + } + ] + }, + { + "name": "Join in on a daredevil canyon loop!", + "id": "f2b291ab-aa51-4af4-ba59-e917b611a0d6", + "position": { + "x": 629, + "y": 849 + }, + "end": { + "flying": false, + "x": 589, + "y": 827 + }, + "images": [ + { + "type": "location", + "id": "791e8c95-e596-4912-ae2a-63d382a1d010", + "url": "https://mkw.techtangents.net/marker/pswitch/Join in on a daredevil canyon loop!/location.jpg" + }, + { + "type": "title", + "id": "88e6157b-b05c-404d-ad12-6e5ce2af849a", + "url": "https://mkw.techtangents.net/marker/pswitch/Join in on a daredevil canyon loop!/title.jpg" + } + ] + }, + { + "name": "Soar to Salty Salty Speedway!", + "id": "659fd4db-f631-4f0a-92ab-1940367afa46", + "position": { + "x": 1300, + "y": 541 + }, + "end": { + "flying": true, + "x": 1234, + "y": 641 + }, + "images": [ + { + "type": "location", + "id": "fdb43426-3605-449d-8a3d-b9a53591c33b", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar to Salty Salty Speedway!/location.jpg" + }, + { + "type": "title", + "id": "646acea6-c460-4427-b7c0-e395f153e73d", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar to Salty Salty Speedway!/title.jpg" + } + ] + }, + { + "name": "Gather the blue coins of the enchanting mermaid!", + "id": "1488760e-b0fa-4d82-b39e-a405c68301aa", + "position": { + "x": 1282, + "y": 682 + }, + "images": [ + { + "type": "location", + "id": "97b18301-bf52-4fdd-ac70-e6872ead0721", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather the blue coins of the enchanting mermaid!/location.jpg" + }, + { + "type": "title", + "id": "a33aa042-b3f4-4f79-b54f-fa2b2a267b93", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather the blue coins of the enchanting mermaid!/title.jpg" + } + ] + }, + { + "name": "Prove yourself in a SPECIAL test of skill #5!", + "id": "108457f2-ea79-4f11-a3ab-229f4cdc0918", + "position": { + "x": 1261, + "y": 474 + }, + "end": { + "flying": false, + "x": 1218, + "y": 423 + }, + "images": [ + { + "type": "location", + "id": "f68530de-b905-45c3-afce-5c9c1acac6ff", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 5!/location.jpg" + }, + { + "type": "title", + "id": "44e48d72-828b-4a51-873d-b686f701e653", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 5!/title.jpg" + } + ] + }, + { + "name": "Pass beneath the Signal Bugs at the right time!", + "id": "87157ffe-b2c2-459d-a084-9f92338cf4d5", + "position": { + "x": 920, + "y": 366 + }, + "end": { + "flying": false, + "x": 840, + "y": 369 + }, + "images": [ + { + "type": "location", + "id": "b9b0192a-d706-43a6-8d90-3c9306773327", + "url": "https://mkw.techtangents.net/marker/pswitch/Pass beneath the Signal Bugs at the right time!/location.jpg" + }, + { + "type": "title", + "id": "1568ea41-96ed-4c33-9907-7f61de3560f9", + "url": "https://mkw.techtangents.net/marker/pswitch/Pass beneath the Signal Bugs at the right time!/title.jpg" + } + ] + }, + { + "name": "Follow the pipes and slender paths to the goal!", + "id": "fb9f4e12-644b-4c5a-a84a-14e500ae6e1b", + "position": { + "x": 1213, + "y": 680 + }, + "end": { + "flying": false, + "x": 1139, + "y": 609 + }, + "images": [ + { + "type": "location", + "id": "40bdf351-66d2-4ea2-8196-c733cb15a184", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the pipes and slender paths to the goal!/location.jpg" + }, + { + "type": "title", + "id": "9d34c404-ea52-4a4e-8f56-4ca2375064aa", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the pipes and slender paths to the goal!/title.jpg" + } + ] + }, + { + "name": "Take a shortcut to stay dry and reach the goal!", + "id": "95c4e4fd-8219-46a7-97d4-e0f3b9d384ba", + "position": { + "x": 1258, + "y": 671 + }, + "end": { + "flying": false, + "x": 1271, + "y": 658 + }, + "images": [ + { + "type": "location", + "id": "63ed03f9-0351-4561-abdd-0d862f83c73e", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a shortcut to stay dry and reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "0f772ba7-de8d-44ad-855e-3f574f1d65e6", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a shortcut to stay dry and reach the goal!/title.jpg" + } + ] + }, + { + "name": "Snag a couple snacks in a race around Big Donut!", + "id": "3028aa3f-2327-4f0d-bac5-ca4c4506a4c3", + "position": { + "x": 703, + "y": 360 + }, + "images": [ + { + "type": "location", + "id": "a652a8b8-3d17-4258-82b4-3652c38cab9b", + "url": "https://mkw.techtangents.net/marker/pswitch/Snag a couple snacks in a race around Big Donut!/location.jpg" + }, + { + "type": "title", + "id": "bb84fbc0-8333-4328-8af4-f2cf8974674e", + "url": "https://mkw.techtangents.net/marker/pswitch/Snag a couple snacks in a race around Big Donut!/title.jpg" + } + ] + }, + { + "name": "Bounce, bounce, bounce to a grand vantage point!", + "id": "51eaab51-b2c5-47ca-883d-9b2a021daa10", + "position": { + "x": 764, + "y": 672 + }, + "end": { + "flying": false, + "x": 737, + "y": 677 + }, + "images": [ + { + "type": "location", + "id": "5f044baa-8bfe-492c-8151-36d2841e8267", + "url": "https://mkw.techtangents.net/marker/pswitch/Bounce, bounce, bounce to a grand vantage point!/location.jpg" + }, + { + "type": "title", + "id": "4b2ccbe1-0e4a-420f-9b9c-9384d9f44c92", + "url": "https://mkw.techtangents.net/marker/pswitch/Bounce, bounce, bounce to a grand vantage point!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins around the spicy food court!", + "id": "eb76acb2-eb81-4d80-989c-2313baa90589", + "position": { + "x": 652, + "y": 209 + }, + "images": [ + { + "type": "location", + "id": "bc304fe5-b875-4ec7-932f-2aa97a303403", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins around the spicy food court!/location.jpg" + }, + { + "type": "title", + "id": "7fe1bd8e-8af3-446a-9767-ebced4d0e8ae", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins around the spicy food court!/title.jpg" + } + ] + }, + { + "name": "Weave through traffic and Chargin' Chucks!", + "id": "0a88fa22-bd50-4174-88de-0f264714e872", + "position": { + "x": 936, + "y": 278 + }, + "end": { + "flying": false, + "x": 951, + "y": 302 + }, + "images": [ + { + "type": "location", + "id": "687dc1fd-b702-472b-ba6d-cf42cd127826", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave through traffic and Chargin' Chucks!/location.jpg" + }, + { + "type": "title", + "id": "0eaad2d3-4d26-4c14-93a7-4d6f485dfa26", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave through traffic and Chargin' Chucks!/title.jpg" + } + ] + }, + { + "name": "Cruise along the curving route to reach the goal!", + "id": "886d03b4-7ed6-430d-9368-e8b6fca277de", + "position": { + "x": 539, + "y": 408 + }, + "end": { + "flying": true, + "x": 461, + "y": 325 + }, + "images": [ + { + "type": "location", + "id": "23b8e223-4135-4288-9f9a-1eedb8c486b4", + "url": "https://mkw.techtangents.net/marker/pswitch/Cruise along the curving route to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "ab9c8135-5a8e-4207-ac7b-91ba4f9946ba", + "url": "https://mkw.techtangents.net/marker/pswitch/Cruise along the curving route to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Harmonize with the world by ringing the bell!", + "id": "e9fcaaab-5f20-4fa7-8b67-83f9ca6cd152", + "position": { + "x": 1129, + "y": 552 + }, + "end": { + "flying": true, + "x": 1109, + "y": 538 + }, + "images": [ + { + "type": "location", + "id": "99b4f3d0-642d-4ca2-82c6-a74cf466753c", + "url": "https://mkw.techtangents.net/marker/pswitch/Harmonize with the world by ringing the bell!/location.jpg" + }, + { + "type": "title", + "id": "71f1b337-fd6c-4413-ae2f-d38501464d76", + "url": "https://mkw.techtangents.net/marker/pswitch/Harmonize with the world by ringing the bell!/title.jpg" + } + ] + }, + { + "name": "Grab the blue coins around the spooky graveyard!", + "id": "6c3db498-f30e-4816-baf5-f2e7ef4cc762", + "position": { + "x": 837, + "y": 265 + }, + "end": { + "flying": false, + "x": 829, + "y": 250 + }, + "images": [ + { + "type": "location", + "id": "63766e07-248a-478c-baca-65178b82233f", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab the blue coins around the spooky graveyard!/location.jpg" + }, + { + "type": "title", + "id": "1fb9a506-ed59-438c-b865-a2cd14f1fb6b", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab the blue coins around the spooky graveyard!/title.jpg" + } + ] + }, + { + "name": "\"Vined\" a way to the trophy of trophies!", + "id": "a0c27ce7-7f03-46d8-b5d9-a624fc77f38a", + "position": { + "x": 748, + "y": 804 + }, + "end": { + "flying": false, + "x": 758, + "y": 764 + }, + "images": [ + { + "type": "location", + "id": "46a385bf-df94-4dbc-aa6f-a5b7a541c569", + "url": "https://mkw.techtangents.net/marker/pswitch/Vined a way to the trophy of trophies!/location.jpg" + }, + { + "type": "title", + "id": "aecf3a51-8785-4e4a-8b63-df250f7313cd", + "url": "https://mkw.techtangents.net/marker/pswitch/Vined a way to the trophy of trophies!/title.jpg" + } + ] + }, + { + "name": "Grab the truck to barrel through the shortcuts!", + "id": "3e022945-7147-49be-af75-9a94abb08605", + "position": { + "x": 1085, + "y": 472 + }, + "end": { + "flying": false, + "x": 1062, + "y": 504 + }, + "images": [ + { + "type": "location", + "id": "0b1713c4-bddc-4009-bbb1-86ad3798e46f", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab the truck to barrel through the shortcuts!/location.jpg" + }, + { + "type": "title", + "id": "71a50cdb-5157-4835-8a37-2e27ef5e2852", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab the truck to barrel through the shortcuts!/title.jpg" + } + ] + }, + { + "name": "Rescue blue coins from the whirlpool!", + "id": "75ebf648-63c0-4eaa-8f8c-d4caea45840f", + "position": { + "x": 1391, + "y": 632 + }, + "end": { + "flying": false, + "x": 1374, + "y": 617 + }, + "images": [ + { + "type": "location", + "id": "7017e6d9-d027-4ea4-8940-69ef8b3d6581", + "url": "https://mkw.techtangents.net/marker/pswitch/Rescue blue coins from the whirlpool!/location.jpg" + }, + { + "type": "title", + "id": "8d08f01a-08ec-41d3-8ede-c3a4f8ba631e", + "url": "https://mkw.techtangents.net/marker/pswitch/Rescue blue coins from the whirlpool!/title.jpg" + } + ] + }, + { + "name": "Figure out a figure eight to grab the blue coins!", + "id": "05becbaf-eda5-4457-ac06-7d8781be8af1", + "position": { + "x": 736, + "y": 836 + }, + "images": [ + { + "type": "location", + "id": "e39794d5-7bc1-406a-a513-25e505e081c6", + "url": "https://mkw.techtangents.net/marker/pswitch/Figure out a figure eight to grab the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "e31c446a-67ec-4e5a-9c1c-ce56eef235b8", + "url": "https://mkw.techtangents.net/marker/pswitch/Figure out a figure eight to grab the blue coins!/title.jpg" + } + ] + }, + { + "name": "Use the flower petals to reach the giant apple!", + "id": "e836aa15-abef-4bee-a4c8-d3288b33c79c", + "position": { + "x": 953, + "y": 239 + }, + "end": { + "flying": true, + "x": 957, + "y": 153 + }, + "images": [ + { + "type": "location", + "id": "dce66118-377a-4026-98a2-bc7014a3f33a", + "url": "https://mkw.techtangents.net/marker/pswitch/Use the flower petals to reach the giant apple!/location.jpg" + }, + { + "type": "title", + "id": "2913fefb-4bf8-47da-adce-12dcff949c15", + "url": "https://mkw.techtangents.net/marker/pswitch/Use the flower petals to reach the giant apple!/title.jpg" + } + ] + }, + { + "name": "Watch out for falling chocolate! And rocks!", + "id": "47ed7d5e-336a-4a16-9d04-3e1f3dea22be", + "position": { + "x": 804, + "y": 538 + }, + "end": { + "flying": false, + "x": 784, + "y": 519 + }, + "images": [ + { + "type": "location", + "id": "e10b4777-5e51-4515-91c5-1c0092f37684", + "url": "https://mkw.techtangents.net/marker/pswitch/Watch out for falling chocolate! And rocks!/location.jpg" + }, + { + "type": "title", + "id": "713f5a12-2d0b-4d02-bfa8-b1877de2be16", + "url": "https://mkw.techtangents.net/marker/pswitch/Watch out for falling chocolate! And rocks!/title.jpg" + } + ] + }, + { + "name": "Sprint to the goal through a sea of sand!", + "id": "1e02cf02-16d4-460a-a03a-7887f37cccde", + "position": { + "x": 543, + "y": 730 + }, + "end": { + "flying": false, + "x": 478, + "y": 612 + }, + "images": [ + { + "type": "location", + "id": "f4fa6e4a-8c2e-46be-ba94-5cde20ce7d43", + "url": "https://mkw.techtangents.net/marker/pswitch/Sprint to the goal through a sea of sand!/location.jpg" + }, + { + "type": "title", + "id": "1112c75d-2297-4d8a-bf47-9ddab862ae2e", + "url": "https://mkw.techtangents.net/marker/pswitch/Sprint to the goal through a sea of sand!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins on the Thwompy-Whampy wall!", + "id": "42b2d038-4b52-4ad3-b7cd-4cf903813938", + "position": { + "x": 1088, + "y": 625 + }, + "end": { + "flying": false, + "x": 1056, + "y": 608 + }, + "images": [ + { + "type": "location", + "id": "1036e2eb-8734-403d-828f-82e1c78a6dbb", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins on the Thwompy-Whampy wall!/location.jpg" + }, + { + "type": "title", + "id": "cf3d1e1c-090d-448f-8a6a-ef1259244a8f", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins on the Thwompy-Whampy wall!/title.jpg" + } + ] + }, + { + "name": "Brave the waterspouts on the high seas!", + "id": "18cb39a4-855e-4dda-8b33-a819731339b4", + "position": { + "x": 1291, + "y": 738 + }, + "end": { + "flying": false, + "x": 1339, + "y": 701 + }, + "images": [ + { + "type": "location", + "id": "04b0a9e3-6b2f-4e17-b2b5-bb52b63854ad", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the waterspouts on the high seas!/location.jpg" + }, + { + "type": "title", + "id": "aea03fe1-e002-4ae2-a5f4-bb9a80514a47", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the waterspouts on the high seas!/title.jpg" + } + ] + }, + { + "name": "Trick your way to the top of the gate!", + "id": "d9b1d6fa-4ba5-48da-8254-1cdb0c48ac47", + "position": { + "x": 956, + "y": 658 + }, + "end": { + "flying": false, + "x": 936, + "y": 590 + }, + "images": [ + { + "type": "location", + "id": "50f30c65-b0b6-4602-9b52-505ad97c2e20", + "url": "https://mkw.techtangents.net/marker/pswitch/Trick your way to the top of the gate!/location.jpg" + }, + { + "type": "title", + "id": "677bf43c-dcaf-4918-88f9-2673b3b8928a", + "url": "https://mkw.techtangents.net/marker/pswitch/Trick your way to the top of the gate!/title.jpg" + } + ] + }, + { + "name": "Crash through the Hermity Cone hideouts!", + "id": "5dc4c523-9a2a-4203-a7e2-995aef7c5b0e", + "position": { + "x": 844, + "y": 676 + }, + "end": { + "flying": false, + "x": 839, + "y": 622 + }, + "images": [ + { + "type": "location", + "id": "365b5a51-16f3-4aa7-85b5-ba6df5819a22", + "url": "https://mkw.techtangents.net/marker/pswitch/Crash through the Hermity Cone hideouts!/location.jpg" + }, + { + "type": "title", + "id": "642cab46-bc4a-4cd4-8894-725626885b91", + "url": "https://mkw.techtangents.net/marker/pswitch/Crash through the Hermity Cone hideouts!/title.jpg" + } + ] + }, + { + "name": "Wall ride a waterfall? That...just might work!", + "id": "178a1426-2a14-46c1-9acf-ce0b02cac32a", + "position": { + "x": 1227, + "y": 808 + }, + "end": { + "flying": false, + "x": 1192, + "y": 814 + }, + "images": [ + { + "type": "location", + "id": "d735dac6-824c-4498-998a-0f0684304ce0", + "url": "https://mkw.techtangents.net/marker/pswitch/Wall ride a waterfall That...just might work!/location.jpg" + }, + { + "type": "title", + "id": "afbd6fdb-d4e1-477a-8a2e-b5c27a7fbb5d", + "url": "https://mkw.techtangents.net/marker/pswitch/Wall ride a waterfall That...just might work!/title.jpg" + } + ] + }, + { + "name": "Take a flying tour through the dome and beyond!", + "id": "c46acf46-252a-4d0a-9430-3b4b73007ed6", + "position": { + "x": 1154, + "y": 970 + }, + "end": { + "flying": false, + "x": 1127, + "y": 936 + }, + "images": [ + { + "type": "location", + "id": "2cdf7e75-b578-4a55-8d34-98ae029b83ba", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a flying tour through the dome and beyond!/location.jpg" + }, + { + "type": "title", + "id": "75d676f1-8dcd-49ca-b833-3a89fa78708d", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a flying tour through the dome and beyond!/title.jpg" + } + ] + }, + { + "name": "Use items to blitz across the desert sands!", + "id": "f307cba6-ef18-4217-b435-26d9777f308b", + "position": { + "x": 556, + "y": 692 + }, + "end": { + "flying": false, + "x": 477, + "y": 662 + }, + "images": [ + { + "type": "location", + "id": "0af20fbe-9b7e-455f-81b4-279c410fc2ab", + "url": "https://mkw.techtangents.net/marker/pswitch/Use items to blitz across the desert sands!/location.jpg" + }, + { + "type": "title", + "id": "e90a3b2b-253d-4efd-b205-eb085222ffbe", + "url": "https://mkw.techtangents.net/marker/pswitch/Use items to blitz across the desert sands!/title.jpg" + } + ] + }, + { + "name": "Tackle the tricky path up the mountain!", + "id": "0be4958b-7bf5-41c3-9fbf-ca710343d1e3", + "position": { + "x": 1176, + "y": 883 + }, + "end": { + "flying": false, + "x": 1127, + "y": 873 + }, + "images": [ + { + "type": "location", + "id": "08e6ef21-01a0-44bf-aa5d-53031e8f9ed2", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle the tricky path up the mountain!/location.jpg" + }, + { + "type": "title", + "id": "625a1619-8dc1-4b67-aeef-e2df3d2e1b52", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle the tricky path up the mountain!/title.jpg" + } + ] + }, + { + "name": "Power past Fuzzies while gathering blue coins!", + "id": "ca4a9425-f249-46b9-bb74-4b3eab16164e", + "position": { + "x": 1155, + "y": 494 + }, + "end": { + "flying": false, + "x": 1178, + "y": 490 + }, + "images": [ + { + "type": "location", + "id": "a39021e3-2694-42c8-b2bb-e6b8017eedb0", + "url": "https://mkw.techtangents.net/marker/pswitch/Power past Fuzzies while gathering blue coins!/location.jpg" + }, + { + "type": "title", + "id": "9b352ad3-cce4-4658-907f-7d04b80065fa", + "url": "https://mkw.techtangents.net/marker/pswitch/Power past Fuzzies while gathering blue coins!/title.jpg" + } + ] + }, + { + "name": "Zip up the left-hand path. Mushroom-free!", + "id": "485f2396-6d8a-4805-b7f9-3bd8935e6102", + "position": { + "x": 671, + "y": 284 + }, + "end": { + "flying": false, + "x": 646, + "y": 241 + }, + "images": [ + { + "type": "location", + "id": "a4ac189f-fdbb-4beb-a52e-53edfa3e4439", + "url": "https://mkw.techtangents.net/marker/pswitch/Zip up the left-hand path. Mushroom-free!/location.jpg" + }, + { + "type": "title", + "id": "0ce3baab-965c-4b73-92be-94a501371a4c", + "url": "https://mkw.techtangents.net/marker/pswitch/Zip up the left-hand path. Mushroom-free!/title.jpg" + } + ] + }, + { + "name": "Nab blue coins from the Goombas' vacation spot!", + "id": "d73698ae-67b2-405c-85bb-6d015fd727f2", + "position": { + "x": 1413, + "y": 683 + }, + "end": { + "flying": false, + "x": 1370, + "y": 663 + }, + "images": [ + { + "type": "location", + "id": "de357886-2548-4499-9f88-a25dde4395d1", + "url": "https://mkw.techtangents.net/marker/pswitch/Nab blue coins from the Goombas' vacation spot!/location.jpg" + }, + { + "type": "title", + "id": "7454739a-f8a8-4acf-9f63-70648bb86abd", + "url": "https://mkw.techtangents.net/marker/pswitch/Nab blue coins from the Goombas' vacation spot!/title.jpg" + } + ] + }, + { + "name": "Mind the giraffes as you rocket toward blue coins!", + "id": "51fe5aae-8237-4960-bf1c-d50ec08623e8", + "position": { + "x": 1225, + "y": 771 + }, + "end": { + "flying": false, + "x": 1139, + "y": 749 + }, + "images": [ + { + "type": "location", + "id": "4200913c-0fb5-4f26-9ca9-761d84979611", + "url": "https://mkw.techtangents.net/marker/pswitch/Mind the giraffes as you rocket toward blue coins!/location.jpg" + }, + { + "type": "title", + "id": "6d0bf449-8d84-4e3d-ab79-e379ba6d9a3e", + "url": "https://mkw.techtangents.net/marker/pswitch/Mind the giraffes as you rocket toward blue coins!/title.jpg" + } + ] + }, + { + "name": "Take to the sky and glide along the river valley!", + "id": "002e4755-4ffb-4cd0-822a-11c13fed5b07", + "position": { + "x": 1155, + "y": 859 + }, + "end": { + "flying": false, + "x": 1067, + "y": 838 + }, + "images": [ + { + "type": "location", + "id": "e3cc4eb1-ead1-4c2c-a1ea-4382d7c56849", + "url": "https://mkw.techtangents.net/marker/pswitch/Take to the sky and glide along the river valley!/location.jpg" + }, + { + "type": "title", + "id": "11bf05c8-ef7d-4ad3-b867-4261f33fdf44", + "url": "https://mkw.techtangents.net/marker/pswitch/Take to the sky and glide along the river valley!/title.jpg" + } + ] + }, + { + "name": "Overtake Shy Guys in an upriver race!", + "id": "0f8b1e25-b475-4f95-9db9-e3ef47fc3fe9", + "position": { + "x": 453, + "y": 496 + }, + "end": { + "flying": false, + "x": 549, + "y": 484 + }, + "images": [ + { + "type": "location", + "id": "2aeb45a6-c22a-4d47-9e1c-4b7f66508787", + "url": "https://mkw.techtangents.net/marker/pswitch/Overtake Shy Guys in an upriver race!/location.jpg" + }, + { + "type": "title", + "id": "eb172bca-a648-42fd-9a74-06243edab0c5", + "url": "https://mkw.techtangents.net/marker/pswitch/Overtake Shy Guys in an upriver race!/title.jpg" + } + ] + }, + { + "name": "Bust the Boomerang Bros. blockade!", + "id": "883eec20-6ec1-40c1-9d4f-32192cb5c422", + "position": { + "x": 1221, + "y": 641 + }, + "end": { + "flying": false, + "x": 1205, + "y": 564 + }, + "images": [ + { + "type": "location", + "id": "91b9763d-d839-4cad-9ec2-4ff020d14ee6", + "url": "https://mkw.techtangents.net/marker/pswitch/Bust the Boomerang Bros. blockade!/location.jpg" + }, + { + "type": "title", + "id": "b3af2257-34dd-4b98-b2b1-05fb608fb7ff", + "url": "https://mkw.techtangents.net/marker/pswitch/Bust the Boomerang Bros. blockade!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins from the rooftops!", + "id": "3f34d760-ed76-4a20-96e6-153404b7e371", + "position": { + "x": 664, + "y": 445 + }, + "end": { + "flying": false, + "x": 641, + "y": 455 + }, + "images": [ + { + "type": "location", + "id": "e6470674-cc2e-4a1f-9cb3-5d9c31e12e2b", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins from the rooftops!/location.jpg" + }, + { + "type": "title", + "id": "12b3bdb4-7000-405c-b0ba-bdd7da6a202c", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins from the rooftops!/title.jpg" + } + ] + }, + { + "name": "Bound from block to cloud to reach the goal!", + "id": "6e39b449-fa46-4a68-a4a3-cc449b46e70d", + "position": { + "x": 1302, + "y": 880 + }, + "end": { + "flying": false, + "x": 1252, + "y": 888 + }, + "images": [ + { + "type": "location", + "id": "716880e1-b530-4907-b16e-80763e28a766", + "url": "https://mkw.techtangents.net/marker/pswitch/Bound from block to cloud to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "e9e9ab02-ac1e-41eb-9da6-f0a638c4b412", + "url": "https://mkw.techtangents.net/marker/pswitch/Bound from block to cloud to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins among the Snow Pokeys!", + "id": "ddabe165-27a0-4b2c-97bb-0fc3d220e9ef", + "position": { + "x": 1212, + "y": 432 + }, + "end": { + "flying": false, + "x": 1176, + "y": 411 + }, + "images": [ + { + "type": "location", + "id": "48b7c575-a377-45e6-a234-e4f1c8a93fdb", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins among the Snow Pokeys!/location.jpg" + }, + { + "type": "title", + "id": "be60c0cb-e6ac-4bf5-b1ec-87d8075526c0", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins among the Snow Pokeys!/title.jpg" + } + ] + }, + { + "name": "Bust a path through the maze of blocks!", + "id": "0b10f142-b3ae-4a54-acc3-7fa75f26433e", + "position": { + "x": 448, + "y": 545 + }, + "end": { + "flying": false, + "x": 424, + "y": 516 + }, + "images": [ + { + "type": "location", + "id": "49d900fb-baad-45b4-b7ba-96542c2e5fc8", + "url": "https://mkw.techtangents.net/marker/pswitch/Bust a path through the maze of blocks!/location.jpg" + }, + { + "type": "title", + "id": "e047a3da-6177-4519-ba23-597eac597da8", + "url": "https://mkw.techtangents.net/marker/pswitch/Bust a path through the maze of blocks!/title.jpg" + } + ] + }, + { + "name": "Hit the beach!", + "id": "ae4cfa66-c2b4-456a-b1e1-10e62bf75365", + "position": { + "x": 814, + "y": 702 + }, + "end": { + "flying": false, + "x": 811, + "y": 724 + }, + "images": [ + { + "type": "location", + "id": "efaf3456-ed96-4025-8944-5d162d0e0d4a", + "url": "https://mkw.techtangents.net/marker/pswitch/Hit the beach!/location.jpg" + }, + { + "type": "title", + "id": "d869797e-a210-4a97-931b-43ee5f8f26f4", + "url": "https://mkw.techtangents.net/marker/pswitch/Hit the beach!/title.jpg" + } + ] + }, + { + "name": "Zigzag downhill to reach the goal!", + "id": "25c03724-121e-407f-a2d3-c833c4313d48", + "position": { + "x": 1306, + "y": 818 + }, + "end": { + "flying": false, + "x": 1299, + "y": 773 + }, + "images": [ + { + "type": "location", + "id": "bf135910-017a-4a91-9cc9-cd5c40e38a34", + "url": "https://mkw.techtangents.net/marker/pswitch/Zigzag downhill to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "02149e16-1e38-47e5-b0d9-846e9e96de9e", + "url": "https://mkw.techtangents.net/marker/pswitch/Zigzag downhill to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Climb to great heights to reach the sky block!", + "id": "79645250-e6bf-44e0-b85c-10482f9f0690", + "position": { + "x": 1271, + "y": 921 + }, + "end": { + "flying": false, + "x": 1266, + "y": 888 + }, + "images": [ + { + "type": "location", + "id": "cb6b82c5-568b-4d78-8675-b1e299e5e503", + "url": "https://mkw.techtangents.net/marker/pswitch/Climb to great heights to reach the sky block!/location.jpg" + }, + { + "type": "title", + "id": "6272afdf-b143-421c-afba-4d0cbd62a31c", + "url": "https://mkw.techtangents.net/marker/pswitch/Climb to great heights to reach the sky block!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins along a narrow road!", + "id": "fad06356-7d2b-4cf6-b92b-1f1e4f73bd71", + "position": { + "x": 648, + "y": 332 + }, + "end": { + "flying": false, + "x": 699, + "y": 274 + }, + "images": [ + { + "type": "location", + "id": "b24fdac8-b837-4d5c-8619-aac089e1325b", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins along a narrow road!/location.jpg" + }, + { + "type": "title", + "id": "0215f5a4-f759-4b78-b901-74b931b82e31", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins along a narrow road!/title.jpg" + } + ] + }, + { + "name": "Take some Green Shells for luck!", + "id": "3cd4b63c-ff80-49ff-872d-10a4dcfc1bc4", + "position": { + "x": 1312, + "y": 405 + }, + "end": { + "flying": false, + "x": 1269, + "y": 447 + }, + "images": [ + { + "type": "location", + "id": "b63ec1a7-1f81-400b-b077-7c04987e41d6", + "url": "https://mkw.techtangents.net/marker/pswitch/Take some Green Shells for luck!/location.jpg" + }, + { + "type": "title", + "id": "32241d5e-7c59-47f3-b249-82eee511c86a", + "url": "https://mkw.techtangents.net/marker/pswitch/Take some Green Shells for luck!/title.jpg" + } + ] + }, + { + "name": "Hustle up and down to gather the blue coins!", + "id": "3ed239b6-44c2-4892-9cc1-13811960e5fa", + "position": { + "x": 1199, + "y": 407 + }, + "end": { + "flying": false, + "x": 1177, + "y": 364 + }, + "images": [ + { + "type": "location", + "id": "6a8d6b92-bb96-4163-a1c0-d207e56c3e4a", + "url": "https://mkw.techtangents.net/marker/pswitch/Hustle up and down to gather the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "e9e6069d-e46b-4a5f-9fcd-39961ca90bd9", + "url": "https://mkw.techtangents.net/marker/pswitch/Hustle up and down to gather the blue coins!/title.jpg" + } + ] + }, + { + "name": "Follow the rope for the ruin's blue coins!", + "id": "4fbcde20-38d9-4edc-9495-a9930752e6f0", + "position": { + "x": 464, + "y": 773 + }, + "end": { + "flying": false, + "x": 431, + "y": 736 + }, + "images": [ + { + "type": "location", + "id": "ab5e87e2-5840-4184-b566-308f9a58b46c", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the rope for the ruin's blue coins!/location.jpg" + }, + { + "type": "title", + "id": "84b29c2b-f03f-484d-9fa3-4b240b67ee9f", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the rope for the ruin's blue coins!/title.jpg" + } + ] + }, + { + "name": "Grab blue coins on the way to Dandelion Depths!", + "id": "26728074-9982-4ff9-8a5d-d48c6829ef02", + "position": { + "x": 1050, + "y": 342 + }, + "end": { + "flying": true, + "x": 1078, + "y": 361 + }, + "images": [ + { + "type": "location", + "id": "34431f84-7038-4ac5-9e10-df87c61bb519", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab blue coins on the way to Dandelion Depths!/location.jpg" + }, + { + "type": "title", + "id": "7055b27b-69e0-49ca-a3f9-30b4f6dfbb8d", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab blue coins on the way to Dandelion Depths!/title.jpg" + } + ] + }, + { + "name": "Race through dinosaur-filled streets!", + "id": "4cfe8e6c-b217-44d5-97a5-2a0f29b6cdbe", + "position": { + "x": 806, + "y": 831 + }, + "end": { + "flying": false, + "x": 757, + "y": 770 + }, + "images": [ + { + "type": "location", + "id": "802dd750-cc78-4392-a93b-bbb4964f7cd0", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through dinosaur-filled streets!/location.jpg" + }, + { + "type": "title", + "id": "68132d8f-f2b0-4573-b6c3-be5ad723668f", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through dinosaur-filled streets!/title.jpg" + } + ] + }, + { + "name": "Launch from pipe to pipe to reach the goal!", + "id": "595cb5dc-98f6-459b-bbab-640fe0d4c4ae", + "position": { + "x": 503, + "y": 830 + }, + "end": { + "flying": false, + "x": 503, + "y": 804 + }, + "images": [ + { + "type": "location", + "id": "cc4b1c15-b066-4bed-b3eb-672fa750a3b9", + "url": "https://mkw.techtangents.net/marker/pswitch/Launch from pipe to pipe to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "3ba779a7-6f23-40b6-a390-7698b345ed95", + "url": "https://mkw.techtangents.net/marker/pswitch/Launch from pipe to pipe to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Seek the sea breeze past those windmills!", + "id": "005350bd-b904-46e8-80bd-5dfd8c39b902", + "position": { + "x": 1270, + "y": 786 + }, + "end": { + "flying": true, + "x": 1279, + "y": 746 + }, + "images": [ + { + "type": "location", + "id": "5c532479-b20a-404d-87a4-7b539866ac3b", + "url": "https://mkw.techtangents.net/marker/pswitch/Seek the sea breeze past those windmills!/location.jpg" + }, + { + "type": "title", + "id": "c2eb88d8-ae4f-4c8a-a73e-925ac769f10e", + "url": "https://mkw.techtangents.net/marker/pswitch/Seek the sea breeze past those windmills!/title.jpg" + } + ] + }, + { + "name": "Join the snowballs in a race downhill!", + "id": "3445473e-37dd-4df9-ac80-97f80842a785", + "position": { + "x": 1217, + "y": 345 + }, + "end": { + "flying": false, + "x": 1133, + "y": 331 + }, + "images": [ + { + "type": "location", + "id": "1512aa8d-357a-4755-a706-86a2a8a3720c", + "url": "https://mkw.techtangents.net/marker/pswitch/Join the snowballs in a race downhill!/location.jpg" + }, + { + "type": "title", + "id": "013e528d-fe2d-47ac-8a69-07309290a885", + "url": "https://mkw.techtangents.net/marker/pswitch/Join the snowballs in a race downhill!/title.jpg" + } + ] + }, + { + "name": "Soar up to the train station's Goal Pole!", + "id": "397cd3e1-6534-494c-804e-f926ed6cef31", + "position": { + "x": 558, + "y": 656 + }, + "end": { + "flying": true, + "x": 581, + "y": 576 + }, + "images": [ + { + "type": "location", + "id": "2084836b-d166-458f-a46a-8fdb6c9d6a18", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar up to the train station's Goal Pole!/location.jpg" + }, + { + "type": "title", + "id": "9a75f2aa-a463-4885-8fde-5726163dfc67", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar up to the train station's Goal Pole!/title.jpg" + } + ] + }, + { + "name": "Drop in on the racers atop the rocks!", + "id": "f5f4bdf5-6eea-4731-8910-f76475132534", + "position": { + "x": 690, + "y": 772 + }, + "end": { + "flying": false, + "x": 660, + "y": 740 + }, + "images": [ + { + "type": "location", + "id": "e21698c1-94b2-4b85-ba4a-c274480faf8b", + "url": "https://mkw.techtangents.net/marker/pswitch/Drop in on the racers atop the rocks!/location.jpg" + }, + { + "type": "title", + "id": "8ec9117d-77b2-47c2-8bfd-a881740a6ec5", + "url": "https://mkw.techtangents.net/marker/pswitch/Drop in on the racers atop the rocks!/title.jpg" + } + ] + }, + { + "name": "Hop from line to line to collect the blue coins!", + "id": "e2de64f0-b59c-490f-967b-497384da606b", + "position": { + "x": 882, + "y": 344 + }, + "end": { + "flying": true, + "x": 853, + "y": 378 + }, + "images": [ + { + "type": "location", + "id": "fb213465-df21-41eb-a353-0784d304fd05", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop from line to line to collect the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "438ac366-38e6-4caa-818a-60e462797514", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop from line to line to collect the blue coins!/title.jpg" + } + ] + }, + { + "name": "Take a tricky tour through Shy Guy Bazaar!", + "id": "258f1189-ab7f-44c0-8344-4d6e59e7c06d", + "position": { + "x": 479, + "y": 567 + }, + "end": { + "flying": false, + "x": 463, + "y": 551 + }, + "images": [ + { + "type": "location", + "id": "171c217c-9e86-44bc-9d61-af6f6d3fb4af", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a tricky tour through Shy Guy Bazaar!/location.jpg" + }, + { + "type": "title", + "id": "4e534c98-71b2-46aa-bf26-35b5b78835c5", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a tricky tour through Shy Guy Bazaar!/title.jpg" + } + ] + }, + { + "name": "Go with the flow to collect blue coins!", + "id": "cb8ed166-20cb-4e75-95a4-ae488d6343e5", + "position": { + "x": 1098, + "y": 488 + }, + "end": { + "flying": true, + "x": 1078, + "y": 526 + }, + "images": [ + { + "type": "location", + "id": "7c3c3d9b-53fc-433d-a105-7168495be782", + "url": "https://mkw.techtangents.net/marker/pswitch/Go with the flow to collect blue coins!/location.jpg" + }, + { + "type": "title", + "id": "3a1a94d8-6c44-479b-815d-60f57e2a66e0", + "url": "https://mkw.techtangents.net/marker/pswitch/Go with the flow to collect blue coins!/title.jpg" + } + ] + }, + { + "name": "Collect the blue coins in the mysterious caverns!", + "id": "a77448c4-289e-4ebe-b5b3-ac22a0a214db", + "position": { + "x": 1126, + "y": 419 + }, + "end": { + "flying": false, + "x": 1078, + "y": 369 + }, + "images": [ + { + "type": "location", + "id": "04457b22-0ebd-4163-a317-43ff3c52fa48", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect the blue coins in the mysterious caverns!/location.jpg" + }, + { + "type": "title", + "id": "55e1d51a-64ea-4092-90c4-095518360741", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect the blue coins in the mysterious caverns!/title.jpg" + } + ] + }, + { + "name": "Jump, jump, jump your way through Mario Circuit!", + "id": "820a316c-f15c-45c8-964c-5915cf906caf", + "position": { + "x": 992, + "y": 274 + }, + "end": { + "flying": false, + "x": 904, + "y": 278 + }, + "images": [ + { + "type": "location", + "id": "5a586ca1-d96d-4416-a830-227a5732b4ee", + "url": "https://mkw.techtangents.net/marker/pswitch/Jump, jump, jump your way through Mario Circuit!/location.jpg" + }, + { + "type": "title", + "id": "16197753-df21-4aaa-8bf1-c31471253218", + "url": "https://mkw.techtangents.net/marker/pswitch/Jump, jump, jump your way through Mario Circuit!/title.jpg" + } + ] + }, + { + "name": "Do a tricky U-turn to collect the blue coins in time!", + "id": "c4e3dcca-e96b-4e76-b6b5-68199fd0c7de", + "position": { + "x": 1112, + "y": 743 + }, + "images": [ + { + "type": "location", + "id": "bb28a874-92dd-42c3-ae03-33534956498b", + "url": "https://mkw.techtangents.net/marker/pswitch/Do a tricky U-turn to collect the blue coins in time!/location.jpg" + }, + { + "type": "title", + "id": "616f4966-c20a-4266-b358-a6e5ef5ba879", + "url": "https://mkw.techtangents.net/marker/pswitch/Do a tricky U-turn to collect the blue coins in time!/title.jpg" + } + ] + }, + { + "name": "Squeeze through traffic jams to reach the goal!", + "id": "58a60adc-be15-4bd4-9f9a-a9dfb33a224c", + "position": { + "x": 1187, + "y": 426 + }, + "end": { + "flying": false, + "x": 1213, + "y": 419 + }, + "images": [ + { + "type": "location", + "id": "6fbb2427-deda-45fb-9a99-9fb425ecca61", + "url": "https://mkw.techtangents.net/marker/pswitch/Squeeze through traffic jams to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "af159352-2b04-4894-b6ec-a4ff340d020c", + "url": "https://mkw.techtangents.net/marker/pswitch/Squeeze through traffic jams to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Tackle Shy Guy Challenge #2!", + "id": "ab36a35e-0c7c-45c3-a5ac-1ac16f13d275", + "position": { + "x": 445, + "y": 546 + }, + "end": { + "flying": true, + "x": 426, + "y": 559 + }, + "images": [ + { + "type": "location", + "id": "c50d6d50-1043-4bd5-a373-fd0bff784776", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle Shy Guy Challenge 2!/location.jpg" + }, + { + "type": "title", + "id": "5f3ca149-465d-40a7-861e-28d0aa30d5d0", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle Shy Guy Challenge 2!/title.jpg" + } + ] + }, + { + "name": "Grab blue coins between Frost Piranha attacks!", + "id": "c0b24287-7ca5-4f17-90e9-d679bd9bbb15", + "position": { + "x": 1343, + "y": 403 + }, + "end": { + "flying": false, + "x": 1314, + "y": 383 + }, + "images": [ + { + "type": "location", + "id": "05155116-3d8f-47f2-a001-36bc74ade21b", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab blue coins between Frost Piranha attacks!/location.jpg" + }, + { + "type": "title", + "id": "0f60edaf-1294-406a-802a-f868a908e5b2", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab blue coins between Frost Piranha attacks!/title.jpg" + } + ] + }, + { + "name": "Turn up the tricks to collect all the blue coins!", + "id": "550124a8-dbaf-4f5b-a750-dfc5e6858e51", + "position": { + "x": 638, + "y": 896 + }, + "end": { + "flying": false, + "x": 584, + "y": 870 + }, + "images": [ + { + "type": "location", + "id": "481355bd-c127-4ddf-90f3-618bd7b4947d", + "url": "https://mkw.techtangents.net/marker/pswitch/Turn up the tricks to collect all the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "894ea48e-03c9-440c-9607-e64c8b32d0a5", + "url": "https://mkw.techtangents.net/marker/pswitch/Turn up the tricks to collect all the blue coins!/title.jpg" + } + ] + }, + { + "name": "Tour the islands on the way to the goal!", + "id": "cbcdf6b7-d329-4d13-80c5-814fe88db596", + "position": { + "x": 1363, + "y": 681 + }, + "end": { + "flying": false, + "x": 1356, + "y": 655 + }, + "images": [ + { + "type": "location", + "id": "de3e3559-af39-4daa-a122-ed4dc039e007", + "url": "https://mkw.techtangents.net/marker/pswitch/Tour the islands on the way to the goal!/location.jpg" + }, + { + "type": "title", + "id": "f36524cd-b53c-403f-a1f5-7f63e7f11b29", + "url": "https://mkw.techtangents.net/marker/pswitch/Tour the islands on the way to the goal!/title.jpg" + } + ] + }, + { + "name": "Take the offroad shortcut to Mario Bros. Circuit!", + "id": "2ede617a-01fe-4cd8-b8b5-96f5dcd12ef5", + "position": { + "x": 645, + "y": 596 + }, + "end": { + "flying": false, + "x": 606, + "y": 633 + }, + "images": [ + { + "type": "location", + "id": "d73e8a53-543c-4209-8347-ac476140af5b", + "url": "https://mkw.techtangents.net/marker/pswitch/Take the offroad shortcut to Mario Bros. Circuit!/location.jpg" + }, + { + "type": "title", + "id": "fa93c1e2-dc17-4d8f-97f1-2b32a08bca48", + "url": "https://mkw.techtangents.net/marker/pswitch/Take the offroad shortcut to Mario Bros. Circuit!/title.jpg" + } + ] + }, + { + "name": "Take a tour of Toad's Factory!", + "id": "401ab2c3-6d62-4af7-b2d5-6b8de51effa2", + "position": { + "x": 781, + "y": 370 + }, + "end": { + "flying": false, + "x": 794, + "y": 332 + }, + "images": [ + { + "type": "location", + "id": "77623705-84f3-48da-b8e5-ad1db2b93940", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a tour of Toad's Factory!/location.jpg" + }, + { + "type": "title", + "id": "81d88950-0612-4dcf-bc23-622560550e13", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a tour of Toad's Factory!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins among the gold of the ruins!", + "id": "226e7b11-2ad6-4db1-ba2b-de0cb7f071b6", + "position": { + "x": 1339, + "y": 905 + }, + "images": [ + { + "type": "location", + "id": "157fb3d5-dbeb-41fb-bec7-da8eac1a19d2", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins among the gold of the ruins!/location.jpg" + }, + { + "type": "title", + "id": "2a3b7fb4-1ac4-4f9c-be2c-6be8717c7db9", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins among the gold of the ruins!/title.jpg" + } + ] + }, + { + "name": "Collect the blue coins of the great staircase!", + "id": "89dd0931-38d2-4e4e-a218-0ffb6841f7b9", + "position": { + "x": 918, + "y": 217 + }, + "images": [ + { + "type": "location", + "id": "9576dabe-78f5-4b9a-97dd-2889ebc50722", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect the blue coins of the great staircase!/location.jpg" + }, + { + "type": "title", + "id": "2464dd9f-fccc-4548-8eb7-6fbe40e9faf9", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect the blue coins of the great staircase!/title.jpg" + } + ] + }, + { + "name": "Glide with gusto! Don't let the T.rex scare you!", + "id": "890a40b9-ec79-4bf7-a6ac-643606948e8b", + "position": { + "x": 1122, + "y": 876 + }, + "end": { + "flying": false, + "x": 1144, + "y": 866 + }, + "images": [ + { + "type": "location", + "id": "0bbcc115-7521-4289-b521-57d0da29784b", + "url": "https://mkw.techtangents.net/marker/pswitch/Glide with gusto! Don't let the T.rex scare you!/location.jpg" + }, + { + "type": "title", + "id": "873803d7-e4e6-46b0-9087-19ca2ace85ab", + "url": "https://mkw.techtangents.net/marker/pswitch/Glide with gusto! Don't let the T.rex scare you!/title.jpg" + } + ] + }, + { + "name": "Show off rail tricks while gathering blue coins!", + "id": "8cb58f10-69a9-4495-ab74-41427e80357c", + "position": { + "x": 1119, + "y": 330 + }, + "end": { + "flying": false, + "x": 1115, + "y": 316 + }, + "images": [ + { + "type": "location", + "id": "5b94e48b-cf40-48e2-9b7c-5b96d22f50b6", + "url": "https://mkw.techtangents.net/marker/pswitch/Show off rail tricks while gathering blue coins!/location.jpg" + }, + { + "type": "title", + "id": "2b4e3415-1d99-4ccd-8f5e-527a1d9ecaf6", + "url": "https://mkw.techtangents.net/marker/pswitch/Show off rail tricks while gathering blue coins!/title.jpg" + } + ] + }, + { + "name": "Weave past Frost Piranha attacks for blue coins!", + "id": "9d4bc60c-a861-4c00-b11e-c42c5b2a940e", + "position": { + "x": 1228, + "y": 323 + }, + "end": { + "flying": false, + "x": 1212, + "y": 290 + }, + "images": [ + { + "type": "location", + "id": "b7c39d97-f946-4710-bcbb-99416cfd46f0", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave past Frost Piranha attacks for blue coins!/location.jpg" + }, + { + "type": "title", + "id": "fb254f7e-67b2-421d-999c-7556afb11081", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave past Frost Piranha attacks for blue coins!/title.jpg" + } + ] + }, + { + "name": "Gather the scattered blue coins!", + "id": "f11e1f4f-48e1-420d-a8f7-3ce71fb06745", + "position": { + "x": 806, + "y": 340 + }, + "images": [ + { + "type": "location", + "id": "fead12d0-08d0-42e7-8873-b545cbb37ef6", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather the scattered blue coins!/location.jpg" + }, + { + "type": "title", + "id": "a3ddb582-7a38-4e8c-8412-c134d3f189ec", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather the scattered blue coins!/title.jpg" + } + ] + }, + { + "name": "Scale the shipwrecks for blue coins!", + "id": "d43ea7b2-13ad-4b1a-a85e-aad5e97d2b01", + "position": { + "x": 1404, + "y": 601 + }, + "end": { + "flying": false, + "x": 1389, + "y": 541 + }, + "images": [ + { + "type": "location", + "id": "5949070b-42aa-4491-8bb9-2d372afe67d1", + "url": "https://mkw.techtangents.net/marker/pswitch/Scale the shipwrecks for blue coins!/location.jpg" + }, + { + "type": "title", + "id": "5d911700-2228-480a-b91e-bcd917605725", + "url": "https://mkw.techtangents.net/marker/pswitch/Scale the shipwrecks for blue coins!/title.jpg" + } + ] + }, + { + "name": "Loop around the observatory and grab the blue coins!", + "id": "b6a631a9-856c-4a5a-a1be-f0384c311b2b", + "position": { + "x": 1272, + "y": 281 + }, + "images": [ + { + "type": "location", + "id": "5b307282-8cfc-4fab-a1c6-66ddc46a1aca", + "url": "https://mkw.techtangents.net/marker/pswitch/Loop around the observatory and grab the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "98cfb15a-cc97-471c-8606-f0d39f456797", + "url": "https://mkw.techtangents.net/marker/pswitch/Loop around the observatory and grab the blue coins!/title.jpg" + } + ] + }, + { + "name": "Climb one crane, then dodge the other!", + "id": "3876e526-ab9b-4cf6-8d4c-98a2fb2fcada", + "position": { + "x": 736, + "y": 386 + }, + "end": { + "flying": true, + "x": 753, + "y": 307 + }, + "images": [ + { + "type": "location", + "id": "b4721174-bef9-4add-a3ed-8de8f5216590", + "url": "https://mkw.techtangents.net/marker/pswitch/Climb one crane, then dodge the other!/location.jpg" + }, + { + "type": "title", + "id": "3a172dbd-9aa2-4304-abc9-c0e16eeab2e4", + "url": "https://mkw.techtangents.net/marker/pswitch/Climb one crane, then dodge the other!/title.jpg" + } + ] + }, + { + "name": "Bounce your way to Koopa Troopa Beach!", + "id": "0e3c21f0-8a7a-4e17-baa6-1ae71ff425cd", + "position": { + "x": 947, + "y": 817 + }, + "end": { + "flying": false, + "x": 929, + "y": 860 + }, + "images": [ + { + "type": "location", + "id": "47872b95-c8be-48f8-829e-e72ac82439c9", + "url": "https://mkw.techtangents.net/marker/pswitch/Bounce your way to Koopa Troopa Beach!/location.jpg" + }, + { + "type": "title", + "id": "38ae3aa6-3257-46b0-9675-12df375eb3da", + "url": "https://mkw.techtangents.net/marker/pswitch/Bounce your way to Koopa Troopa Beach!/title.jpg" + } + ] + }, + { + "name": "Weave through the road crowded with Dry Bones!", + "id": "27007644-98b7-4533-9274-38b677b94d6c", + "position": { + "x": 859, + "y": 261 + }, + "end": { + "flying": false, + "x": 799, + "y": 217 + }, + "images": [ + { + "type": "location", + "id": "3294c97b-19eb-40f7-bdad-f3b441cd9cda", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave through the road crowded with Dry Bones!/location.jpg" + }, + { + "type": "title", + "id": "a6b67b53-1495-4d02-a030-8a795edce158", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave through the road crowded with Dry Bones!/title.jpg" + } + ] + }, + { + "name": "Seek peace by climbing the falls!", + "id": "0b9c1969-3428-46e9-8d12-73fbb680c242", + "position": { + "x": 1133, + "y": 594 + }, + "end": { + "flying": false, + "x": 1103, + "y": 520 + }, + "images": [ + { + "type": "location", + "id": "dea1105d-1932-44bb-8814-55bbb1e5e4bb", + "url": "https://mkw.techtangents.net/marker/pswitch/Seek peace by climbing the falls!/location.jpg" + }, + { + "type": "title", + "id": "8adfd944-7bf5-4eda-bf66-7d11010fdfb0", + "url": "https://mkw.techtangents.net/marker/pswitch/Seek peace by climbing the falls!/title.jpg" + } + ] + }, + { + "name": "Weave your way through the Whamps!", + "id": "192aeb2c-8f72-4da7-b58c-3dbbffccd834", + "position": { + "x": 571, + "y": 279 + }, + "end": { + "flying": false, + "x": 536, + "y": 282 + }, + "images": [ + { + "type": "location", + "id": "e9762339-1842-409d-9de7-e8daf9b38b5d", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave your way through the Whamps!/location.jpg" + }, + { + "type": "title", + "id": "90da3018-a467-4a74-bb19-c30bbe61e1e7", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave your way through the Whamps!/title.jpg" + } + ] + }, + { + "name": "Race on a wild route through the woodlands!", + "id": "bc74ef31-e12b-441a-9a60-f9ce9ea59547", + "position": { + "x": 931, + "y": 245 + }, + "images": [ + { + "type": "location", + "id": "fd0d814c-6710-475f-95fa-f31a267b266d", + "url": "https://mkw.techtangents.net/marker/pswitch/Race on a wild route through the woodlands!/location.jpg" + }, + { + "type": "title", + "id": "56140685-a98e-4cbe-be81-9e6749ad53a3", + "url": "https://mkw.techtangents.net/marker/pswitch/Race on a wild route through the woodlands!/title.jpg" + } + ] + }, + { + "name": "Inspect the railroad yard for blue coins!", + "id": "e80e4b45-1ef9-4f2a-a7b4-214c9da22465", + "position": { + "x": 712, + "y": 809 + }, + "end": { + "flying": false, + "x": 653, + "y": 783 + }, + "images": [ + { + "type": "location", + "id": "e0c0dad1-3b94-48c5-b1ae-b41541eb4115", + "url": "https://mkw.techtangents.net/marker/pswitch/Inspect the railroad yard for blue coins!/location.jpg" + }, + { + "type": "title", + "id": "72023852-e448-46c1-bc85-c18daee03a53", + "url": "https://mkw.techtangents.net/marker/pswitch/Inspect the railroad yard for blue coins!/title.jpg" + } + ] + }, + { + "name": "Race to get ahead of the explosives!", + "id": "da49ccb3-5ade-4ce7-bc66-4b6520dbc3e2", + "position": { + "x": 766, + "y": 934 + }, + "end": { + "flying": false, + "x": 692, + "y": 923 + }, + "images": [ + { + "type": "location", + "id": "10c519c5-a0b4-473c-a654-39e3980aa4be", + "url": "https://mkw.techtangents.net/marker/pswitch/Race to get ahead of the explosives!/location.jpg" + }, + { + "type": "title", + "id": "06e4181a-8e23-4f19-a5bb-e010737fff98", + "url": "https://mkw.techtangents.net/marker/pswitch/Race to get ahead of the explosives!/title.jpg" + } + ] + }, + { + "name": "Ride along the outer wall to sneak in!", + "id": "85358661-fb3e-460d-bc42-b23d20ec00d6", + "position": { + "x": 494, + "y": 572 + }, + "end": { + "flying": false, + "x": 419, + "y": 516 + }, + "images": [ + { + "type": "location", + "id": "a10e244d-96c9-442c-93c1-e2284c66fb32", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride along the outer wall to sneak in!/location.jpg" + }, + { + "type": "title", + "id": "168fb8ce-f81d-4cea-ae7d-c2fcb1971357", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride along the outer wall to sneak in!/title.jpg" + } + ] + }, + { + "name": "Hurry upstream and reach the goal!", + "id": "86cbbb36-55b7-4eb8-a1b2-68fe136c0a0c", + "position": { + "x": 950, + "y": 144 + }, + "end": { + "flying": false, + "x": 887, + "y": 208 + }, + "images": [ + { + "type": "location", + "id": "a84b2d44-1f48-467f-853a-7eb5de4d82e0", + "url": "https://mkw.techtangents.net/marker/pswitch/Hurry upstream and reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "251330b5-a134-4acc-8833-35f3df053568", + "url": "https://mkw.techtangents.net/marker/pswitch/Hurry upstream and reach the goal!/title.jpg" + } + ] + }, + { + "name": "Make a connecting flight to the Airship Fortress!", + "id": "87560568-89fd-4f04-bd3c-eeb75c54184f", + "position": { + "x": 589, + "y": 317 + }, + "end": { + "flying": true, + "x": 503, + "y": 311 + }, + "images": [ + { + "type": "location", + "id": "8e934375-2e7f-4f89-afc8-f409952bbe19", + "url": "https://mkw.techtangents.net/marker/pswitch/Make a connecting flight to the Airship Fortress!/location.jpg" + }, + { + "type": "title", + "id": "64818538-1887-4814-967d-e9dea70e2ba7", + "url": "https://mkw.techtangents.net/marker/pswitch/Make a connecting flight to the Airship Fortress!/title.jpg" + } + ] + }, + { + "name": "Bullet Bill through the fiery barrage!", + "id": "3839dc4c-a04c-42ed-a43d-5935221c848c", + "position": { + "x": 682, + "y": 256 + }, + "end": { + "flying": false, + "x": 632, + "y": 192 + }, + "images": [ + { + "type": "location", + "id": "1f5ac4dd-fa22-4b05-921d-86662e1eaad4", + "url": "https://mkw.techtangents.net/marker/pswitch/Bullet Bill through the fiery barrage!/location.jpg" + }, + { + "type": "title", + "id": "97de177b-d0e9-48b2-b1d4-1645ae8e25b6", + "url": "https://mkw.techtangents.net/marker/pswitch/Bullet Bill through the fiery barrage!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins on the floating obstacle course!", + "id": "ce048bde-123a-4e3c-8b4c-58a61eda90ae", + "position": { + "x": 944, + "y": 919 + }, + "images": [ + { + "type": "location", + "id": "94f75662-a7d4-4e5e-84d8-8350fa0d9c00", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins on the floating obstacle course!/location.jpg" + }, + { + "type": "title", + "id": "cf3eb2b5-4686-4f2f-a3da-5914876556f8", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins on the floating obstacle course!/title.jpg" + } + ] + }, + { + "name": "Take a parkour tour of Crown City!", + "id": "e21b1a80-58fd-418d-86b0-dc80212299c3", + "position": { + "x": 807, + "y": 827 + }, + "end": { + "flying": false, + "x": 798, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "9e786a78-dbe7-4b59-8f48-e2571b9c4491", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a parkour tour of Crown City!/location.jpg" + }, + { + "type": "title", + "id": "18182465-eee6-4649-8fe2-5a47c15eaf41", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a parkour tour of Crown City!/title.jpg" + } + ] + }, + { + "name": "Borrow a boat and become unstoppable!", + "id": "ec38e355-a3e6-4caf-8884-7115cb868254", + "position": { + "x": 796, + "y": 419 + }, + "end": { + "flying": false, + "x": 716, + "y": 340 + }, + "images": [ + { + "type": "location", + "id": "556e910f-b27a-468f-baff-166adca5aa1e", + "url": "https://mkw.techtangents.net/marker/pswitch/Borrow a boat and become unstoppable!/location.jpg" + }, + { + "type": "title", + "id": "7a9fd4ad-57d9-4dc1-bc4a-411154039219", + "url": "https://mkw.techtangents.net/marker/pswitch/Borrow a boat and become unstoppable!/title.jpg" + } + ] + }, + { + "name": "Salvage the scattered blue coins!", + "id": "f193d8bc-df32-4a76-ac64-94355416fe03", + "position": { + "x": 578, + "y": 605 + }, + "end": { + "flying": false, + "x": 525, + "y": 572 + }, + "images": [ + { + "type": "location", + "id": "068bf653-e3fa-4fac-a587-b9ccb84314c9", + "url": "https://mkw.techtangents.net/marker/pswitch/Salvage the scattered blue coins!/location.jpg" + }, + { + "type": "title", + "id": "778fd864-8cdd-47ea-935d-d40561984b12", + "url": "https://mkw.techtangents.net/marker/pswitch/Salvage the scattered blue coins!/title.jpg" + } + ] + }, + { + "name": "Bounce up! Drop down! Grab blue coins!", + "id": "9bf35c8f-eeae-4eee-87ce-932f0a1d6ead", + "position": { + "x": 976, + "y": 429 + }, + "end": { + "flying": false, + "x": 971, + "y": 441 + }, + "images": [ + { + "type": "location", + "id": "ecc6c235-b5b2-4987-a1c1-12552071d993", + "url": "https://mkw.techtangents.net/marker/pswitch/Bounce up! Drop down! Grab blue coins!/location.jpg" + }, + { + "type": "title", + "id": "29eb2b96-8b02-4314-8e2a-88da3ec62409", + "url": "https://mkw.techtangents.net/marker/pswitch/Bounce up! Drop down! Grab blue coins!/title.jpg" + } + ] + }, + { + "name": "Drive through the Treaded Grrrol crossing!", + "id": "e0bea711-9bd7-4a6f-8985-eaa6f6c94ba3", + "position": { + "x": 675, + "y": 430 + }, + "end": { + "flying": false, + "x": 621, + "y": 403 + }, + "images": [ + { + "type": "location", + "id": "6fe7203e-1a93-453e-b688-303564dbbde4", + "url": "https://mkw.techtangents.net/marker/pswitch/Drive through the Treaded Grrrol crossing!/location.jpg" + }, + { + "type": "title", + "id": "43b2d7ba-b913-46fb-a0b3-c619b48d220b", + "url": "https://mkw.techtangents.net/marker/pswitch/Drive through the Treaded Grrrol crossing!/title.jpg" + } + ] + }, + { + "name": "Brave the storm and gather blue coins!", + "id": "3bf4b354-dc60-4df1-9b3e-730c5c7a6ce2", + "position": { + "x": 1374, + "y": 583 + }, + "end": { + "flying": false, + "x": 1309, + "y": 574 + }, + "images": [ + { + "type": "location", + "id": "2d43cf6b-b9b6-4732-aba7-73428dffc38c", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the storm and gather blue coins!/location.jpg" + }, + { + "type": "title", + "id": "40e2d3fa-565b-4d9b-bbbb-12640cfc910c", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the storm and gather blue coins!/title.jpg" + } + ] + }, + { + "name": "Dash up the river and reach the goal!", + "id": "e579227c-9f7e-4d82-ac91-3e7874912e85", + "position": { + "x": 1001, + "y": 517 + }, + "end": { + "flying": false, + "x": 969, + "y": 395 + }, + "images": [ + { + "type": "location", + "id": "ea524dec-80e9-472c-a39f-a5ed12d6d73b", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash up the river and reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "29399b25-f2ae-480a-ad7d-51f826637c34", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash up the river and reach the goal!/title.jpg" + } + ] + }, + { + "name": "Watch for the snowball hazards ahead!", + "id": "4771a941-b26a-45a5-a009-7b43267434be", + "position": { + "x": 1383, + "y": 475 + }, + "end": { + "flying": false, + "x": 1314, + "y": 387 + }, + "images": [ + { + "type": "location", + "id": "53ac3399-a27e-4f7e-9927-4de3ae171d3b", + "url": "https://mkw.techtangents.net/marker/pswitch/Watch for the snowball hazards ahead!/location.jpg" + }, + { + "type": "title", + "id": "7cb63276-8de6-4f49-b26b-8e57b29f3262", + "url": "https://mkw.techtangents.net/marker/pswitch/Watch for the snowball hazards ahead!/title.jpg" + } + ] + }, + { + "name": "Show everyone the slopes aren't off limits!", + "id": "c25a9351-3ab4-4253-83ac-8e09e79c3b05", + "position": { + "x": 844, + "y": 469 + }, + "end": { + "flying": false, + "x": 775, + "y": 404 + }, + "images": [ + { + "type": "location", + "id": "d97a7985-3137-4ab1-b24c-d29f6f001c04", + "url": "https://mkw.techtangents.net/marker/pswitch/Show everyone the slopes aren't off limits!/location.jpg" + }, + { + "type": "title", + "id": "6127f4b3-2d53-42d2-ad99-ae21d1897b91", + "url": "https://mkw.techtangents.net/marker/pswitch/Show everyone the slopes aren't off limits!/title.jpg" + } + ] + }, + { + "name": "Ride the rope and soar to the goal!", + "id": "a1582f56-39da-4f97-afd9-96dce54f91ea", + "position": { + "x": 1001, + "y": 297 + }, + "end": { + "flying": true, + "x": 977, + "y": 317 + }, + "images": [ + { + "type": "location", + "id": "4fe9625f-21b8-4416-9223-68ed3789543f", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the rope and soar to the goal!/location.jpg" + }, + { + "type": "title", + "id": "5c148bf8-5287-4240-8fe3-4d27322117fb", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the rope and soar to the goal!/title.jpg" + } + ] + }, + { + "name": "Clear your path with some fireballs!", + "id": "84ba8f3a-bd78-485c-b024-8dea0cc5b622", + "position": { + "x": 1307, + "y": 518 + }, + "end": { + "flying": true, + "x": 1334, + "y": 433 + }, + "images": [ + { + "type": "location", + "id": "bacbe1d3-95dd-4d8d-b63c-55375da05d28", + "url": "https://mkw.techtangents.net/marker/pswitch/Clear your path with some fireballs!/location.jpg" + }, + { + "type": "title", + "id": "ba7ddbd8-a79b-4190-8d95-d2c58601bf4d", + "url": "https://mkw.techtangents.net/marker/pswitch/Clear your path with some fireballs!/title.jpg" + } + ] + }, + { + "name": "Put your trust in waterspout winds!", + "id": "2e85d6e9-198e-4625-b136-7aea1af863a8", + "position": { + "x": 1327, + "y": 541 + }, + "end": { + "flying": true, + "x": 1358, + "y": 540 + }, + "images": [ + { + "type": "location", + "id": "54c77842-f483-488f-8e4a-19130469b134", + "url": "https://mkw.techtangents.net/marker/pswitch/Put your trust in waterspout winds!/location.jpg" + }, + { + "type": "title", + "id": "12d06564-df7d-45e0-8b28-4aa47991dff2", + "url": "https://mkw.techtangents.net/marker/pswitch/Put your trust in waterspout winds!/title.jpg" + } + ] + }, + { + "name": "Trust their backs to get you there!", + "id": "44ba0d7e-e2f1-413e-a8cb-9866ea05577b", + "position": { + "x": 1161, + "y": 976 + }, + "end": { + "flying": false, + "x": 1092, + "y": 945 + }, + "images": [ + { + "type": "location", + "id": "839a1db0-eb5b-422f-8aa7-08e836df91a9", + "url": "https://mkw.techtangents.net/marker/pswitch/Trust their backs to get you there!/location.jpg" + }, + { + "type": "title", + "id": "127e4045-8388-42bc-9f2a-99ece3f7a86a", + "url": "https://mkw.techtangents.net/marker/pswitch/Trust their backs to get you there!/title.jpg" + } + ] + }, + { + "name": "Race from bridge to bridge in the haunted swamp!", + "id": "1855a054-673d-488a-8e38-b55c0a4176ed", + "position": { + "x": 1140, + "y": 247 + }, + "end": { + "flying": false, + "x": 1032, + "y": 159 + }, + "images": [ + { + "type": "location", + "id": "ec755d1e-91b4-4d3e-b40d-a0fcc45d493a", + "url": "https://mkw.techtangents.net/marker/pswitch/Race from bridge to bridge in the haunted swamp!/location.jpg" + }, + { + "type": "title", + "id": "5eca9f37-8173-4e10-96ec-a41dc1d13740", + "url": "https://mkw.techtangents.net/marker/pswitch/Race from bridge to bridge in the haunted swamp!/title.jpg" + } + ] + }, + { + "name": "Travel the savanna and visit the giant waterfalls!", + "id": "0ffe0315-85c5-4309-bcf3-6749a00302a4", + "position": { + "x": 1217, + "y": 882 + }, + "end": { + "flying": false, + "x": 1196, + "y": 796 + }, + "images": [ + { + "type": "location", + "id": "9b39c380-279a-4e09-bfce-99bc67cf6e73", + "url": "https://mkw.techtangents.net/marker/pswitch/Travel the savanna and visit the giant waterfalls!/location.jpg" + }, + { + "type": "title", + "id": "d7ca3746-fe66-476e-9f69-8a22cfd5e424", + "url": "https://mkw.techtangents.net/marker/pswitch/Travel the savanna and visit the giant waterfalls!/title.jpg" + } + ] + }, + { + "name": "Ride the rails in the jungle to grab blue coins!", + "id": "8b1a82f7-e1bc-4dfc-9153-1885c6afb5ec", + "position": { + "x": 1270, + "y": 831 + }, + "end": { + "flying": false, + "x": 1274, + "y": 815 + }, + "images": [ + { + "type": "location", + "id": "794dca3b-a4c5-4542-9d4a-b51377481042", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the rails in the jungle to grab blue coins!/location.jpg" + }, + { + "type": "title", + "id": "02733d98-3691-43b8-b45b-a611b57b2cad", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the rails in the jungle to grab blue coins!/title.jpg" + } + ] + }, + { + "name": "Dash, dash, dash to the goal!", + "id": "216d82d6-5b1b-4bd7-b034-3e613a67bc1e", + "position": { + "x": 593, + "y": 590 + }, + "end": { + "flying": false, + "x": 478, + "y": 616 + }, + "images": [ + { + "type": "location", + "id": "a5f6a50a-ce3a-4c79-89cd-96f73e261fae", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash, dash, dash to the goal!/location.jpg" + }, + { + "type": "title", + "id": "15f56533-ac0f-4abc-b2fc-b7c62f01a696", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash, dash, dash to the goal!/title.jpg" + } + ] + }, + { + "name": "Sail through the sky and rush to the goal!", + "id": "7f97289b-1c9b-4852-a40a-4d5e5dee9259", + "position": { + "x": 1175, + "y": 370 + }, + "end": { + "flying": true, + "x": 1151, + "y": 499 + }, + "images": [ + { + "type": "location", + "id": "1a1849c7-3671-407c-9f77-186cb8e91175", + "url": "https://mkw.techtangents.net/marker/pswitch/Sail through the sky and rush to the goal!/location.jpg" + }, + { + "type": "title", + "id": "4102b8fa-752b-4537-8540-b1a5005ba0dd", + "url": "https://mkw.techtangents.net/marker/pswitch/Sail through the sky and rush to the goal!/title.jpg" + } + ] + }, + { + "name": "Launch off the quarter pipe and get massive air!", + "id": "3746c905-fd29-4b84-898b-d0228f2ce2ac", + "position": { + "x": 978, + "y": 296 + }, + "end": { + "flying": false, + "x": 951, + "y": 283 + }, + "images": [ + { + "type": "location", + "id": "2a5a2869-7381-44b7-9a1b-fb8da1b5dc28", + "url": "https://mkw.techtangents.net/marker/pswitch/Launch off the quarter pipe and get massive air!/location.jpg" + }, + { + "type": "title", + "id": "bc8d5a78-9751-4d89-9d8d-b781924ca8b1", + "url": "https://mkw.techtangents.net/marker/pswitch/Launch off the quarter pipe and get massive air!/title.jpg" + } + ] + }, + { + "name": "Make good use of Feathers to reach the goal!", + "id": "7affb325-d47d-4e32-8266-473fa52e4e01", + "position": { + "x": 1139, + "y": 837 + }, + "end": { + "flying": false, + "x": 1109, + "y": 845 + }, + "images": [ + { + "type": "location", + "id": "d4d61e47-68db-4df8-b4b7-fb8f69822aa8", + "url": "https://mkw.techtangents.net/marker/pswitch/Make good use of Feathers to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "a9b9750b-8ad9-435c-ab8d-520d6f7d4830", + "url": "https://mkw.techtangents.net/marker/pswitch/Make good use of Feathers to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Take to the skies to escape the desert!", + "id": "a2fac05d-d987-4a9b-b7cf-0782e7c6ce5a", + "position": { + "x": 501, + "y": 813 + }, + "end": { + "flying": true, + "x": 591, + "y": 709 + }, + "images": [ + { + "type": "location", + "id": "d1e8439a-8c77-4a45-b858-a242428402ee", + "url": "https://mkw.techtangents.net/marker/pswitch/Take to the skies to escape the desert!/location.jpg" + }, + { + "type": "title", + "id": "0b21435f-7ecc-4169-9b8e-4a95650f765e", + "url": "https://mkw.techtangents.net/marker/pswitch/Take to the skies to escape the desert!/title.jpg" + } + ] + }, + { + "name": "Borrow the truck and smash through!", + "id": "66b33402-4ffd-4699-96a2-6a9a34b1fc09", + "position": { + "x": 727, + "y": 431 + }, + "end": { + "flying": false, + "x": 726, + "y": 352 + }, + "images": [ + { + "type": "location", + "id": "71771643-aec2-4162-9285-1bdf26652292", + "url": "https://mkw.techtangents.net/marker/pswitch/Borrow the truck and smash through!/location.jpg" + }, + { + "type": "title", + "id": "37c4d2b0-7df8-4177-8796-80607c29636f", + "url": "https://mkw.techtangents.net/marker/pswitch/Borrow the truck and smash through!/title.jpg" + } + ] + }, + { + "name": "Use the herd's help to reach the goal!", + "id": "be1fd14e-a547-4d41-bd7e-3206b51d1434", + "position": { + "x": 1174, + "y": 842 + }, + "end": { + "flying": false, + "x": 1102, + "y": 794 + }, + "images": [ + { + "type": "location", + "id": "61252636-71ab-4217-b8b3-023a1689f0b7", + "url": "https://mkw.techtangents.net/marker/pswitch/Use the herd's help to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "2be20a55-9a55-4252-96ff-67c51c734b70", + "url": "https://mkw.techtangents.net/marker/pswitch/Use the herd's help to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Race around a tribute to Choco Island 1!", + "id": "c19e6cf3-0841-4549-973b-dc52971fbd5b", + "position": { + "x": 861, + "y": 581 + }, + "images": [ + { + "type": "location", + "id": "8316caa8-710a-418a-9e1f-6e5c318d1868", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Choco Island 1!/location.jpg" + }, + { + "type": "title", + "id": "460b17db-7521-4d9e-81b5-8269f70800bc", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Choco Island 1!/title.jpg" + } + ] + }, + { + "name": "Travel across the bridge, tricking all the way!", + "id": "487c2a4d-d0f2-42e5-b42d-4cca373ee2c1", + "position": { + "x": 516, + "y": 444 + }, + "end": { + "flying": false, + "x": 536, + "y": 411 + }, + "images": [ + { + "type": "location", + "id": "fb55a32a-e836-4507-8288-682292e8ff3a", + "url": "https://mkw.techtangents.net/marker/pswitch/Travel across the bridge, tricking all the way!/location.jpg" + }, + { + "type": "title", + "id": "7adb4f2d-c6c8-41a1-b67b-c9b5c7f825e8", + "url": "https://mkw.techtangents.net/marker/pswitch/Travel across the bridge, tricking all the way!/title.jpg" + } + ] + }, + { + "name": "Dash through traffic on the covered roads!", + "id": "59b8eb08-6f30-4f1c-9ee6-0c8f6fc7a822", + "position": { + "x": 834, + "y": 713 + }, + "end": { + "flying": false, + "x": 837, + "y": 623 + }, + "images": [ + { + "type": "location", + "id": "27d2952f-9021-46bb-8d14-a017a6ecacd3", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash through traffic on the covered roads!/location.jpg" + }, + { + "type": "title", + "id": "ecd678ce-d566-4d71-939a-e8be3ccbe40d", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash through traffic on the covered roads!/title.jpg" + } + ] + }, + { + "name": "Ramp through rings and over flames!", + "id": "dea61523-11d4-44be-bc5a-c85ba149a5e0", + "position": { + "x": 660, + "y": 460 + }, + "end": { + "flying": false, + "x": 636, + "y": 439 + }, + "images": [ + { + "type": "location", + "id": "c28b22ac-298c-480a-9816-72cd2b7141e5", + "url": "https://mkw.techtangents.net/marker/pswitch/Ramp through rings and over flames!/location.jpg" + }, + { + "type": "title", + "id": "6486f440-576f-43c0-8134-31b7fc801fd8", + "url": "https://mkw.techtangents.net/marker/pswitch/Ramp through rings and over flames!/title.jpg" + } + ] + }, + { + "name": "Note the wind on the way to the goal!", + "id": "06bfbec5-7326-420e-8840-3e5da8939df3", + "position": { + "x": 1346, + "y": 419 + }, + "end": { + "flying": false, + "x": 1351, + "y": 418 + }, + "images": [ + { + "type": "location", + "id": "61195b86-b53a-492e-aa35-fdad5a224fce", + "url": "https://mkw.techtangents.net/marker/pswitch/Note the wind on the way to the goal!/location.jpg" + }, + { + "type": "title", + "id": "0b78a084-6a0a-421b-87a8-9dffd11ef700", + "url": "https://mkw.techtangents.net/marker/pswitch/Note the wind on the way to the goal!/title.jpg" + } + ] + }, + { + "name": "Prove yourself in a SPECIAL test of skill #2!", + "id": "7789af9d-96a5-4e3c-b65c-4fca78ff8269", + "position": { + "x": 833, + "y": 395 + }, + "end": { + "flying": false, + "x": 797, + "y": 337 + }, + "images": [ + { + "type": "location", + "id": "94618b18-3a73-427c-9154-4b928e5cc61d", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 2!/location.jpg" + }, + { + "type": "title", + "id": "54b8c596-bb80-4d14-9da5-3c8121b94ea2", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 2!/title.jpg" + } + ] + }, + { + "name": "Hurry to the frozen peak!", + "id": "a7cfa79b-118b-4547-a278-36a0a7537fc4", + "position": { + "x": 1385, + "y": 450 + }, + "end": { + "flying": false, + "x": 1342, + "y": 457 + }, + "images": [ + { + "type": "location", + "id": "e08c2dee-5703-4f98-931e-db4b0708c60f", + "url": "https://mkw.techtangents.net/marker/pswitch/Hurry to the frozen peak!/location.jpg" + }, + { + "type": "title", + "id": "2824e026-8b29-4887-b52c-9692ba142639", + "url": "https://mkw.techtangents.net/marker/pswitch/Hurry to the frozen peak!/title.jpg" + } + ] + }, + { + "name": "Dodge Tokotokos on the way uphill!", + "id": "df06450c-5a8e-4736-b8fa-c7cd1bf6a26b", + "position": { + "x": 470, + "y": 796 + }, + "end": { + "flying": false, + "x": 422, + "y": 744 + }, + "images": [ + { + "type": "location", + "id": "cb856918-1cd1-4f1a-bd46-30d8ee135984", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge Tokotokos on the way uphill!/location.jpg" + }, + { + "type": "title", + "id": "4190863f-bc7c-4a1e-a013-d0181fdb2b2d", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge Tokotokos on the way uphill!/title.jpg" + } + ] + }, + { + "name": "Hop along the walls of Bowser's Castle!", + "id": "6366b3ec-46f6-46bd-8d7d-0727d44d43fb", + "position": { + "x": 643, + "y": 198 + }, + "end": { + "flying": false, + "x": 637, + "y": 162 + }, + "images": [ + { + "type": "location", + "id": "db6dd6f4-fcb0-4ccf-b564-dfc3237f61b5", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop along the walls of Bowser's Castle!/location.jpg" + }, + { + "type": "title", + "id": "99c39863-24a6-4543-bd55-2739015c1db7", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop along the walls of Bowser's Castle!/title.jpg" + } + ] + }, + { + "name": "Brave the buffalo stampedes from both sides!", + "id": "70a5e1a8-0e20-4ed1-bba4-3d1233e98b3d", + "position": { + "x": 1106, + "y": 687 + }, + "end": { + "flying": false, + "x": 1105, + "y": 679 + }, + "images": [ + { + "type": "location", + "id": "2758445a-bbcf-41a4-ad18-29f9b7453875", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the buffalo stampedes from both sides!/location.jpg" + }, + { + "type": "title", + "id": "148c4890-3d77-4451-a327-39469dc96ede", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the buffalo stampedes from both sides!/title.jpg" + } + ] + }, + { + "name": "Navigate the jumps of the narrow back roads!", + "id": "503e8084-5c05-460f-ac56-b72c7fd78b8b", + "position": { + "x": 1044, + "y": 214 + }, + "end": { + "flying": false, + "x": 979, + "y": 142 + }, + "images": [ + { + "type": "location", + "id": "7551340e-d2c2-4ac9-aae2-ff0075d6a1f9", + "url": "https://mkw.techtangents.net/marker/pswitch/Navigate the jumps of the narrow back roads!/location.jpg" + }, + { + "type": "title", + "id": "26796615-7651-4615-bd38-0c5e04d9d421", + "url": "https://mkw.techtangents.net/marker/pswitch/Navigate the jumps of the narrow back roads!/title.jpg" + } + ] + }, + { + "name": "To the air! To the water!", + "id": "3e38f4f5-0db1-4b2d-82c8-187ffa5b80fb", + "position": { + "x": 988, + "y": 416 + }, + "end": { + "flying": false, + "x": 1012, + "y": 320 + }, + "images": [ + { + "type": "location", + "id": "9343e81c-ab3b-4b5b-8a26-567739514b12", + "url": "https://mkw.techtangents.net/marker/pswitch/To the air! To the water!/location.jpg" + }, + { + "type": "title", + "id": "538b189f-46eb-4707-bd52-398bd2ed580e", + "url": "https://mkw.techtangents.net/marker/pswitch/To the air! To the water!/title.jpg" + } + ] + }, + { + "name": "Brave the dino dome in pursuit of blue coins!", + "id": "791c971e-4f88-4880-a9fb-1556781247e3", + "position": { + "x": 1141, + "y": 984 + }, + "images": [ + { + "type": "location", + "id": "9c82a629-1b02-477f-97ca-69de42e441a6", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the dino dome in pursuit of blue coins!/location.jpg" + }, + { + "type": "title", + "id": "57ae0f3d-fb2f-4154-82e6-129dcbbf6304", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the dino dome in pursuit of blue coins!/title.jpg" + } + ] + }, + { + "name": "Carefully nab blue coins and enjoy some sea air!", + "id": "981fca89-e323-4445-ba08-c9b49ed7f4c3", + "position": { + "x": 1340, + "y": 831 + }, + "images": [ + { + "type": "location", + "id": "147f08d0-1e37-4c1e-b4df-c2c6b5a3583c", + "url": "https://mkw.techtangents.net/marker/pswitch/Carefully nab blue coins and enjoy some sea air!/location.jpg" + }, + { + "type": "title", + "id": "68194e60-98a7-4c26-989f-9f1b3e39eb77", + "url": "https://mkw.techtangents.net/marker/pswitch/Carefully nab blue coins and enjoy some sea air!/title.jpg" + } + ] + }, + { + "name": "Slip past the Batadon blockades!", + "id": "00ad008e-06dc-4dda-a43a-3f16e809c2cd", + "position": { + "x": 526, + "y": 621 + }, + "end": { + "flying": false, + "x": 462, + "y": 560 + }, + "images": [ + { + "type": "location", + "id": "5c34be3d-9fac-40dd-bfab-6d4470d57e3c", + "url": "https://mkw.techtangents.net/marker/pswitch/Slip past the Batadon blockades!/location.jpg" + }, + { + "type": "title", + "id": "79bff5fb-aa7d-4dbe-8deb-46dfa792dfd9", + "url": "https://mkw.techtangents.net/marker/pswitch/Slip past the Batadon blockades!/title.jpg" + } + ] + }, + { + "name": "Hitch a ride to collect the airborne blue coins!", + "id": "6fd6555d-5aa9-49a8-85af-478be5f95bd4", + "position": { + "x": 536, + "y": 672 + }, + "end": { + "flying": true, + "x": 501, + "y": 619 + }, + "images": [ + { + "type": "location", + "id": "e6b82664-3fc2-4b57-b9d6-62f58e555ef5", + "url": "https://mkw.techtangents.net/marker/pswitch/Hitch a ride to collect the airborne blue coins!/location.jpg" + }, + { + "type": "title", + "id": "423c6163-ccbc-441f-8947-dc7dc626d70b", + "url": "https://mkw.techtangents.net/marker/pswitch/Hitch a ride to collect the airborne blue coins!/title.jpg" + } + ] + }, + { + "name": "Show your stuff in this Airship Fortress time trial!", + "id": "68b6d10c-7c21-47b7-b009-a21ce39d0b77", + "position": { + "x": 491, + "y": 345 + }, + "end": { + "flying": true, + "x": 488, + "y": 353 + }, + "images": [ + { + "type": "location", + "id": "a95c5d6f-372a-42c8-aa13-f0b54581987b", + "url": "https://mkw.techtangents.net/marker/pswitch/Show your stuff in this Airship Fortress time trial!/location.jpg" + }, + { + "type": "title", + "id": "4e54c63f-7b77-4f33-8a63-048bc8612124", + "url": "https://mkw.techtangents.net/marker/pswitch/Show your stuff in this Airship Fortress time trial!/title.jpg" + } + ] + }, + { + "name": "Ramp off the triceratops!", + "id": "1f631479-9682-4c7c-b246-d62f27154294", + "position": { + "x": 1207, + "y": 894 + }, + "end": { + "flying": false, + "x": 1129, + "y": 872 + }, + "images": [ + { + "type": "location", + "id": "71a11af4-36db-4d0a-96e8-cab562d28adb", + "url": "https://mkw.techtangents.net/marker/pswitch/Ramp off the triceratops!/location.jpg" + }, + { + "type": "title", + "id": "0860e5e4-c01d-4efb-99c4-6b0a29daedd0", + "url": "https://mkw.techtangents.net/marker/pswitch/Ramp off the triceratops!/title.jpg" + } + ] + }, + { + "name": "Board your chartered flight to the city!", + "id": "9310562d-c699-482f-b0fd-1894ab548116", + "position": { + "x": 785, + "y": 891 + }, + "end": { + "flying": false, + "x": 769, + "y": 803 + }, + "images": [ + { + "type": "location", + "id": "c57a1690-8056-43b1-bdb9-d432a290b84f", + "url": "https://mkw.techtangents.net/marker/pswitch/Board your chartered flight to the city!/location.jpg" + }, + { + "type": "title", + "id": "ca6db4b3-af04-4f17-b5ba-a8173dc98767", + "url": "https://mkw.techtangents.net/marker/pswitch/Board your chartered flight to the city!/title.jpg" + } + ] + }, + { + "name": "Drift through the parking garage like a legend!", + "id": "089b0ba1-ac44-4971-8bb5-79f486c3afaf", + "position": { + "x": 806, + "y": 777 + }, + "end": { + "flying": false, + "x": 798, + "y": 751 + }, + "images": [ + { + "type": "location", + "id": "9ee22d60-590e-4dd1-9914-a098663a5f0b", + "url": "https://mkw.techtangents.net/marker/pswitch/Drift through the parking garage like a legend!/location.jpg" + }, + { + "type": "title", + "id": "098341c9-14ff-47fc-b080-b8856b35e058", + "url": "https://mkw.techtangents.net/marker/pswitch/Drift through the parking garage like a legend!/title.jpg" + } + ] + }, + { + "name": "Evade the armadillos on your way to the goal!", + "id": "f9e07953-ea76-4ce6-a73e-6cc9f792043c", + "position": { + "x": 692, + "y": 551 + }, + "end": { + "flying": false, + "x": 633, + "y": 533 + }, + "images": [ + { + "type": "location", + "id": "0a3d7381-3ffb-4220-90fb-ac9c63345371", + "url": "https://mkw.techtangents.net/marker/pswitch/Evade the armadillos on your way to the goal!/location.jpg" + }, + { + "type": "title", + "id": "fd4e98b1-7bc0-4211-ba69-d7cbec2df8d7", + "url": "https://mkw.techtangents.net/marker/pswitch/Evade the armadillos on your way to the goal!/title.jpg" + } + ] + }, + { + "name": "Hitch a ride on the train to reach the goal!", + "id": "c52feaf1-bec1-4710-8023-695d1bf06c82", + "position": { + "x": 1211, + "y": 530 + }, + "end": { + "flying": true, + "x": 1129, + "y": 497 + }, + "images": [ + { + "type": "location", + "id": "e4845125-018b-49bf-a7ca-95564764c122", + "url": "https://mkw.techtangents.net/marker/pswitch/Hitch a ride on the train to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "c11fe8d5-b9a4-4d1c-a27e-1c398ebf5888", + "url": "https://mkw.techtangents.net/marker/pswitch/Hitch a ride on the train to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins in a tricky rail-riding challenge!", + "id": "825ecdf7-1ee3-47e8-917a-2c84200e3466", + "position": { + "x": 847, + "y": 805 + }, + "end": { + "flying": true, + "x": 878, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "93b75ea2-6461-456b-a5cc-4e0cb46ed13f", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins in a tricky rail-riding challenge!/location.jpg" + }, + { + "type": "title", + "id": "10fc1cf7-be6d-41ba-b5a1-1d345d40cbeb", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins in a tricky rail-riding challenge!/title.jpg" + } + ] + }, + { + "name": "Fly over to Yoshi's for a quick bite!", + "id": "30dbd71e-9fe6-45ea-869a-fe6a7532efce", + "position": { + "x": 607, + "y": 600 + }, + "end": { + "flying": true, + "x": 533, + "y": 597 + }, + "images": [ + { + "type": "location", + "id": "777f0308-4247-4b43-a069-047d28bb34b7", + "url": "https://mkw.techtangents.net/marker/pswitch/Fly over to Yoshi's for a quick bite!/location.jpg" + }, + { + "type": "title", + "id": "abafc624-af1d-48b7-bb14-954fc6e4f3b1", + "url": "https://mkw.techtangents.net/marker/pswitch/Fly over to Yoshi's for a quick bite!/title.jpg" + } + ] + }, + { + "name": "Show everyone how to ride the wall!", + "id": "c60508f9-8975-4cd4-9385-22cf45356ffe", + "position": { + "x": 818, + "y": 207 + }, + "end": { + "flying": true, + "x": 797, + "y": 156 + }, + "images": [ + { + "type": "location", + "id": "1211be17-16f0-4232-811a-04a679a132c4", + "url": "https://mkw.techtangents.net/marker/pswitch/Show everyone how to ride the wall!/location.jpg" + }, + { + "type": "title", + "id": "14674e32-e5f8-446d-a8a6-ab5fd426edf6", + "url": "https://mkw.techtangents.net/marker/pswitch/Show everyone how to ride the wall!/title.jpg" + } + ] + }, + { + "name": "Trick off vehicles on the way to the spaceport!", + "id": "47b72d11-d119-41fa-9cc2-365ad9cc0d40", + "position": { + "x": 729, + "y": 978 + }, + "end": { + "flying": false, + "x": 741, + "y": 919 + }, + "images": [ + { + "type": "location", + "id": "282da190-2fc7-4392-832c-46c2b3bdb141", + "url": "https://mkw.techtangents.net/marker/pswitch/Trick off vehicles on the way to the spaceport!/location.jpg" + }, + { + "type": "title", + "id": "1f713240-6375-4d09-af4a-406ae573344a", + "url": "https://mkw.techtangents.net/marker/pswitch/Trick off vehicles on the way to the spaceport!/title.jpg" + } + ] + }, + { + "name": "Thank the crocodiles for their notable help!", + "id": "33aa93f8-e3c3-430d-8d0c-b510553b6e98", + "position": { + "x": 1160, + "y": 722 + }, + "end": { + "flying": false, + "x": 1119, + "y": 721 + }, + "images": [ + { + "type": "location", + "id": "687d7073-2086-49a0-b346-8d88a3409734", + "url": "https://mkw.techtangents.net/marker/pswitch/Thank the crocodiles for their notable help!/location.jpg" + }, + { + "type": "title", + "id": "27d9a914-dcbd-4f49-b51e-af6bc96d4ce5", + "url": "https://mkw.techtangents.net/marker/pswitch/Thank the crocodiles for their notable help!/title.jpg" + } + ] + }, + { + "name": "Show the lava that you're a super star!", + "id": "7187dc9a-f229-45c0-9df9-9045428fea58", + "position": { + "x": 612, + "y": 332 + }, + "end": { + "flying": false, + "x": 619, + "y": 261 + }, + "images": [ + { + "type": "location", + "id": "c0a05cbf-1fd0-4fb2-981b-9a770977e7fd", + "url": "https://mkw.techtangents.net/marker/pswitch/Show the lava that you're a super star!/location.jpg" + }, + { + "type": "title", + "id": "89fa11b6-6086-4260-8abf-e698cc963b1e", + "url": "https://mkw.techtangents.net/marker/pswitch/Show the lava that you're a super star!/title.jpg" + } + ] + }, + { + "name": "Ramp up over the cliff edge to the goal!", + "id": "fd9a2a09-78d4-4fad-95f2-10732c3a9621", + "position": { + "x": 652, + "y": 778 + }, + "end": { + "flying": true, + "x": 575, + "y": 749 + }, + "images": [ + { + "type": "location", + "id": "fba19004-f57b-49cf-b8da-19e65c5a35a0", + "url": "https://mkw.techtangents.net/marker/pswitch/Ramp up over the cliff edge to the goal!/location.jpg" + }, + { + "type": "title", + "id": "2ae20cdb-102c-4ab0-a222-c9cfb6ba0c79", + "url": "https://mkw.techtangents.net/marker/pswitch/Ramp up over the cliff edge to the goal!/title.jpg" + } + ] + }, + { + "name": "Ride Ivy Piranha Plant vines to grab blue coins!", + "id": "42a38bc2-2e16-4494-bd29-9389ee9fdd8d", + "position": { + "x": 1256, + "y": 885 + }, + "end": { + "flying": false, + "x": 1222, + "y": 876 + }, + "images": [ + { + "type": "location", + "id": "386ad851-272f-4039-bcef-964dd1c489ac", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride Ivy Piranha Plant vines to grab blue coins!/location.jpg" + }, + { + "type": "title", + "id": "a1b7744b-b62b-4df9-b947-83c318d3c99a", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride Ivy Piranha Plant vines to grab blue coins!/title.jpg" + } + ] + }, + { + "name": "Dare to hitch a ride on the Dragoneels!", + "id": "3fdee4ae-2090-497a-ada3-5f1d558be0e0", + "position": { + "x": 1308, + "y": 605 + }, + "end": { + "flying": false, + "x": 1370, + "y": 563 + }, + "images": [ + { + "type": "location", + "id": "e7a44dfb-798e-4b0a-872d-5c71a4b38023", + "url": "https://mkw.techtangents.net/marker/pswitch/Dare to hitch a ride on the Dragoneels!/location.jpg" + }, + { + "type": "title", + "id": "9416eb31-d0a2-4137-9b5f-0675a2a98c67", + "url": "https://mkw.techtangents.net/marker/pswitch/Dare to hitch a ride on the Dragoneels!/title.jpg" + } + ] + }, + { + "name": "Dodge the fireballs and collect blue coins!", + "id": "8c3e2e50-2e39-49d4-9a3e-871e34013544", + "position": { + "x": 822, + "y": 171 + }, + "end": { + "flying": false, + "x": 795, + "y": 142 + }, + "images": [ + { + "type": "location", + "id": "479fef33-560e-4556-8612-72f0b96950de", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge the fireballs and collect blue coins!/location.jpg" + }, + { + "type": "title", + "id": "fc058092-c629-421c-9c73-d0c8454fd4b7", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge the fireballs and collect blue coins!/title.jpg" + } + ] + }, + { + "name": "Pluck the blue coins from the savanna sky!", + "id": "05a37b49-a54a-4b1c-83c0-10d4998e9d07", + "position": { + "x": 1247, + "y": 866 + }, + "end": { + "flying": false, + "x": 1159, + "y": 794 + }, + "images": [ + { + "type": "location", + "id": "6f121e8f-1c14-4c05-9614-28a6831c92e0", + "url": "https://mkw.techtangents.net/marker/pswitch/Pluck the blue coins from the savanna sky!/location.jpg" + }, + { + "type": "title", + "id": "c39e3d60-0e10-4c84-881e-d376709030bd", + "url": "https://mkw.techtangents.net/marker/pswitch/Pluck the blue coins from the savanna sky!/title.jpg" + } + ] + }, + { + "name": "Ramp up and over the suspension bridge!", + "id": "aab0a757-344b-48e9-a434-c22bc5030b7f", + "position": { + "x": 622, + "y": 836 + }, + "end": { + "flying": true, + "x": 640, + "y": 805 + }, + "images": [ + { + "type": "location", + "id": "e079c42f-f532-4d8b-898d-b94e73df32e8", + "url": "https://mkw.techtangents.net/marker/pswitch/Ramp up and over the suspension bridge!/location.jpg" + }, + { + "type": "title", + "id": "5361ef50-7f20-4d2e-b816-a98eb1f7c445", + "url": "https://mkw.techtangents.net/marker/pswitch/Ramp up and over the suspension bridge!/title.jpg" + } + ] + }, + { + "name": "Race offroad through a dinosaur-filled jungle!", + "id": "d68c65d1-d610-42f5-bccf-40599321c06d", + "position": { + "x": 1106, + "y": 931 + }, + "end": { + "flying": false, + "x": 1140, + "y": 892 + }, + "images": [ + { + "type": "location", + "id": "7f3a68d7-b7b4-4934-a1cf-a46ceab46871", + "url": "https://mkw.techtangents.net/marker/pswitch/Race offroad through a dinosaur-filled jungle!/location.jpg" + }, + { + "type": "title", + "id": "30fa1963-a60a-4bea-b626-0d43e7ee93b3", + "url": "https://mkw.techtangents.net/marker/pswitch/Race offroad through a dinosaur-filled jungle!/title.jpg" + } + ] + }, + { + "name": "Rail ride to gather the burger's blue coins!", + "id": "f89f6539-b3c5-4098-a22f-6db9f0c637f3", + "position": { + "x": 630, + "y": 683 + }, + "images": [ + { + "type": "location", + "id": "06766ff1-ed47-4938-ba7b-888016541049", + "url": "https://mkw.techtangents.net/marker/pswitch/Rail ride to gather the burger's blue coins!/location.jpg" + }, + { + "type": "title", + "id": "2915c940-7707-4b16-9046-e9fb3fa85b33", + "url": "https://mkw.techtangents.net/marker/pswitch/Rail ride to gather the burger's blue coins!/title.jpg" + } + ] + }, + { + "name": "Grab blue coins among the Para-Biddybuds!", + "id": "71ec7414-3e34-4e20-8bd0-3bd3bd092f00", + "position": { + "x": 922, + "y": 578 + }, + "images": [ + { + "type": "location", + "id": "0a50ca1e-31bb-4992-bbbe-bb9f5f09c5bd", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab blue coins among the Para-Biddybuds!/location.jpg" + }, + { + "type": "title", + "id": "c2e25092-678d-4877-9c85-1da268418a65", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab blue coins among the Para-Biddybuds!/title.jpg" + } + ] + }, + { + "name": "Show the train how fast you can go!", + "id": "9d9dbde2-039f-4a6c-9b9a-ff7959d6b575", + "position": { + "x": 608, + "y": 901 + }, + "end": { + "flying": false, + "x": 602, + "y": 841 + }, + "images": [ + { + "type": "location", + "id": "b41b6caf-6b0e-46a3-83a6-15e0fb86b1f8", + "url": "https://mkw.techtangents.net/marker/pswitch/Show the train how fast you can go!/location.jpg" + }, + { + "type": "title", + "id": "d88fd7eb-c2ba-491b-b3df-e7b799a386e8", + "url": "https://mkw.techtangents.net/marker/pswitch/Show the train how fast you can go!/title.jpg" + } + ] + }, + { + "name": "Race to the top of Whistlestop Summit!", + "id": "2f356732-8138-4791-9f47-01241a05fda7", + "position": { + "x": 628, + "y": 881 + }, + "end": { + "flying": true, + "x": 594, + "y": 859 + }, + "images": [ + { + "type": "location", + "id": "046bcf33-4ba4-456b-ad47-9922bec745ba", + "url": "https://mkw.techtangents.net/marker/pswitch/Race to the top of Whistlestop Summit!/location.jpg" + }, + { + "type": "title", + "id": "71c56480-de43-4e9c-b5bf-9877bfb546db", + "url": "https://mkw.techtangents.net/marker/pswitch/Race to the top of Whistlestop Summit!/title.jpg" + } + ] + }, + { + "name": "Master the Feather to make it to the goal!", + "id": "5b408910-fdba-4129-af44-395ef3d33c71", + "position": { + "x": 1205, + "y": 569 + }, + "end": { + "flying": false, + "x": 1159, + "y": 589 + }, + "images": [ + { + "type": "location", + "id": "14a01707-3a71-4d25-b1b4-4cb3fc442cce", + "url": "https://mkw.techtangents.net/marker/pswitch/Master the Feather to make it to the goal!/location.jpg" + }, + { + "type": "title", + "id": "b2f90d6e-5a46-49bc-9a19-bc0ad8066ca7", + "url": "https://mkw.techtangents.net/marker/pswitch/Master the Feather to make it to the goal!/title.jpg" + } + ] + }, + { + "name": "Crash the seaside blue-coin party!", + "id": "f738be40-b241-4165-b710-5e8dcd0bb2fe", + "position": { + "x": 1298, + "y": 759 + }, + "images": [ + { + "type": "location", + "id": "f242628d-d17d-482b-a48d-ce2ba9089514", + "url": "https://mkw.techtangents.net/marker/pswitch/Crash the seaside blue-coin party!/location.jpg" + }, + { + "type": "title", + "id": "30a0703d-5602-4343-a8ac-a063019bb1b8", + "url": "https://mkw.techtangents.net/marker/pswitch/Crash the seaside blue-coin party!/title.jpg" + } + ] + }, + { + "name": "Dash wisely to reach the goal in time!", + "id": "75005215-6ab5-493b-b50e-b71d84a3648e", + "position": { + "x": 563, + "y": 563 + }, + "end": { + "flying": false, + "x": 459, + "y": 564 + }, + "images": [ + { + "type": "location", + "id": "69e7ee27-78e8-4352-be0a-45ac7248afaf", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash wisely to reach the goal in time!/location.jpg" + }, + { + "type": "title", + "id": "6f0e09a4-e802-4f54-9f1c-da41a4b25381", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash wisely to reach the goal in time!/title.jpg" + } + ] + }, + { + "name": "Roar down the road in an explosive action scene!", + "id": "c5901da0-a337-4a69-af0d-580e2a255180", + "position": { + "x": 692, + "y": 675 + }, + "end": { + "flying": false, + "x": 642, + "y": 603 + }, + "images": [ + { + "type": "location", + "id": "dbd7c5e9-49a6-40c9-9a83-32d48ce486d4", + "url": "https://mkw.techtangents.net/marker/pswitch/Roar down the road in an explosive action scene!/location.jpg" + }, + { + "type": "title", + "id": "420230d7-bee3-432c-b871-a707940e85d1", + "url": "https://mkw.techtangents.net/marker/pswitch/Roar down the road in an explosive action scene!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins spanning the bridge!", + "id": "bbb0313f-b028-4e60-a707-c7e0a39b5d75", + "position": { + "x": 700, + "y": 601 + }, + "end": { + "flying": false, + "x": 642, + "y": 562 + }, + "images": [ + { + "type": "location", + "id": "703b64aa-0d0f-44e8-bc08-9fd2224da640", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins spanning the bridge!/location.jpg" + }, + { + "type": "title", + "id": "f121d201-6404-426c-ad8d-60970c9bf2b3", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins spanning the bridge!/title.jpg" + } + ] + }, + { + "name": "Note the shortcut through the stadium's garden!", + "id": "a9eff1cb-1429-4aae-9f6e-0c405c008155", + "position": { + "x": 990, + "y": 597 + }, + "end": { + "flying": false, + "x": 935, + "y": 569 + }, + "images": [ + { + "type": "location", + "id": "d056f3a7-42a2-4fb7-afba-d56ae173905c", + "url": "https://mkw.techtangents.net/marker/pswitch/Note the shortcut through the stadium's garden!/location.jpg" + }, + { + "type": "title", + "id": "2eb0120c-659c-423b-a4cf-9e2ec460937f", + "url": "https://mkw.techtangents.net/marker/pswitch/Note the shortcut through the stadium's garden!/title.jpg" + } + ] + }, + { + "name": "Race downhill to reach the lake in time!", + "id": "5b533286-d987-4d2b-a1a8-9c9cb71c732e", + "position": { + "x": 897, + "y": 428 + }, + "end": { + "flying": false, + "x": 910, + "y": 476 + }, + "images": [ + { + "type": "location", + "id": "6045680b-467c-45a7-a7ba-b9a3cccf4270", + "url": "https://mkw.techtangents.net/marker/pswitch/Race downhill to reach the lake in time!/location.jpg" + }, + { + "type": "title", + "id": "6d3ab977-4f26-40df-be96-5c2794604f60", + "url": "https://mkw.techtangents.net/marker/pswitch/Race downhill to reach the lake in time!/title.jpg" + } + ] + }, + { + "name": "Zigzag through the zebra rush!", + "id": "f794c395-bf01-4862-983b-c17670f45b71", + "position": { + "x": 1133, + "y": 816 + }, + "end": { + "flying": false, + "x": 1085, + "y": 765 + }, + "images": [ + { + "type": "location", + "id": "eb7ad37a-b1b5-43fb-9d14-2ca04a3421ed", + "url": "https://mkw.techtangents.net/marker/pswitch/Zigzag through the zebra rush!/location.jpg" + }, + { + "type": "title", + "id": "65afb6e5-bfda-4455-a7ac-3ea98f19ecf3", + "url": "https://mkw.techtangents.net/marker/pswitch/Zigzag through the zebra rush!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins on the park's twists and turns!", + "id": "3daca6e3-5c58-48a0-a355-28f820df4532", + "position": { + "x": 773, + "y": 797 + }, + "images": [ + { + "type": "location", + "id": "7e257de0-309b-48fd-9e48-2fd3f49cc2f7", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins on the park's twists and turns!/location.jpg" + }, + { + "type": "title", + "id": "d7502e50-fbd3-42bf-904e-3d64b2448c41", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins on the park's twists and turns!/title.jpg" + } + ] + }, + { + "name": "Ride the lines and collect the blue coins!", + "id": "50218372-93e1-439b-a732-4213614c90f0", + "position": { + "x": 1187, + "y": 726 + }, + "end": { + "flying": true, + "x": 1118, + "y": 644 + }, + "images": [ + { + "type": "location", + "id": "dae12e43-1ffd-4429-bfce-a152258acfa6", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the lines and collect the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "15cd5ec2-ade9-4b0d-add7-67fd25d5ee39", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the lines and collect the blue coins!/title.jpg" + } + ] + }, + { + "name": "C-c-c-collect the blue coins at DK Pass!", + "id": "09ba9e6c-e7c4-4f2d-925a-c0f91fbb1321", + "position": { + "x": 1254, + "y": 470 + }, + "end": { + "flying": false, + "x": 1217, + "y": 421 + }, + "images": [ + { + "type": "location", + "id": "f92f3a83-8db9-437c-adec-ac5ea84f8d49", + "url": "https://mkw.techtangents.net/marker/pswitch/C-c-c-collect the blue coins at DK Pass!/location.jpg" + }, + { + "type": "title", + "id": "d593f8a8-5e16-4d60-8608-e7ed6b349a9e", + "url": "https://mkw.techtangents.net/marker/pswitch/C-c-c-collect the blue coins at DK Pass!/title.jpg" + } + ] + }, + { + "name": "Boost through a rugged cross-country route!", + "id": "d8a39be3-2cc9-415b-ba28-1f7b1c9bb61e", + "position": { + "x": 1285, + "y": 317 + }, + "end": { + "flying": false, + "x": 1209, + "y": 403 + }, + "images": [ + { + "type": "location", + "id": "3570d4ac-597b-4a19-8130-6b04e878c91b", + "url": "https://mkw.techtangents.net/marker/pswitch/Boost through a rugged cross-country route!/location.jpg" + }, + { + "type": "title", + "id": "afcc5118-3559-4c95-9bf3-84912194c8f6", + "url": "https://mkw.techtangents.net/marker/pswitch/Boost through a rugged cross-country route!/title.jpg" + } + ] + }, + { + "name": "Tackle an endurance challenge in the wasteland!", + "id": "4f74b029-e4aa-4275-98fc-2df3c68b94cf", + "position": { + "x": 708, + "y": 510 + }, + "images": [ + { + "type": "location", + "id": "488e065b-14d0-473e-ad4b-52cd4978e98f", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle an endurance challenge in the wasteland!/location.jpg" + }, + { + "type": "title", + "id": "10dd38f4-7f4c-4ea1-bbdf-41b04f60cd16", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle an endurance challenge in the wasteland!/title.jpg" + } + ] + }, + { + "name": "Launch from pipe to pipe up the plateau!", + "id": "5b8053c4-9961-4063-9466-d71e017e345c", + "position": { + "x": 546, + "y": 754 + }, + "end": { + "flying": false, + "x": 559, + "y": 715 + }, + "images": [ + { + "type": "location", + "id": "d5da6ae1-5d80-4adf-a111-b89d5e7ca221", + "url": "https://mkw.techtangents.net/marker/pswitch/Launch from pipe to pipe up the plateau!/location.jpg" + }, + { + "type": "title", + "id": "6e7b9584-1aea-4b4a-a285-57b5199ec0c5", + "url": "https://mkw.techtangents.net/marker/pswitch/Launch from pipe to pipe up the plateau!/title.jpg" + } + ] + }, + { + "name": "Hop along the blocky shortcut to Wario Stadium!", + "id": "e761dcca-27e1-492e-b61a-15497034eca7", + "position": { + "x": 688, + "y": 530 + }, + "end": { + "flying": false, + "x": 637, + "y": 479 + }, + "images": [ + { + "type": "location", + "id": "c40ea359-d35f-41ce-854f-794bf84d64a6", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop along the blocky shortcut to Wario Stadium!/location.jpg" + }, + { + "type": "title", + "id": "1d6aadfe-a136-4f99-9f6b-e11376460c0b", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop along the blocky shortcut to Wario Stadium!/title.jpg" + } + ] + }, + { + "name": "Forgive the messy nature of prototype testing!", + "id": "257791f0-9e39-4533-8ef2-2f37801ac828", + "position": { + "x": 810, + "y": 381 + }, + "end": { + "flying": false, + "x": 796, + "y": 364 + }, + "images": [ + { + "type": "location", + "id": "e2e7083d-2959-4b94-826c-83d86a36cd05", + "url": "https://mkw.techtangents.net/marker/pswitch/Forgive the messy nature of prototype testing!/location.jpg" + }, + { + "type": "title", + "id": "19a3aab6-0170-49ef-9b10-598553bbbd84", + "url": "https://mkw.techtangents.net/marker/pswitch/Forgive the messy nature of prototype testing!/title.jpg" + } + ] + }, + { + "name": "Harness 18 wheels of power to reach the goal!", + "id": "0b57598d-ee76-4ece-841f-1d48777a8bb9", + "position": { + "x": 446, + "y": 718 + }, + "end": { + "flying": false, + "x": 438, + "y": 630 + }, + "images": [ + { + "type": "location", + "id": "025061a8-9234-41ee-ac54-654305ce953b", + "url": "https://mkw.techtangents.net/marker/pswitch/Harness 18 wheels of power to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "26da4c48-a054-48e0-a13a-c84c10a91b34", + "url": "https://mkw.techtangents.net/marker/pswitch/Harness 18 wheels of power to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Join the endurance race in the savanna!", + "id": "4c3e9b14-5e03-4290-837c-e6530b218a0b", + "position": { + "x": 1094, + "y": 758 + }, + "images": [ + { + "type": "location", + "id": "ab57351e-77e4-424a-8975-28609eb3e133", + "url": "https://mkw.techtangents.net/marker/pswitch/Join the endurance race in the savanna!/location.jpg" + }, + { + "type": "title", + "id": "e9e200a8-d1f3-4c62-b7cc-c4cef8ca445e", + "url": "https://mkw.techtangents.net/marker/pswitch/Join the endurance race in the savanna!/title.jpg" + } + ] + }, + { + "name": "Slice through ice-skating practice!", + "id": "f8751b7b-1454-420e-badb-bf6d2ba9213c", + "position": { + "x": 1360, + "y": 398 + }, + "end": { + "flying": false, + "x": 1342, + "y": 329 + }, + "images": [ + { + "type": "location", + "id": "dddc49f6-17b1-4974-bc4b-63c9e3586554", + "url": "https://mkw.techtangents.net/marker/pswitch/Slice through ice-skating practice!/location.jpg" + }, + { + "type": "title", + "id": "b7794952-a350-4cc8-a392-29185d65c72a", + "url": "https://mkw.techtangents.net/marker/pswitch/Slice through ice-skating practice!/title.jpg" + } + ] + }, + { + "name": "Take an offroad route to Choco Mountain!", + "id": "55007987-bc61-415e-af0f-f6485ab99f32", + "position": { + "x": 846, + "y": 506 + }, + "end": { + "flying": false, + "x": 786, + "y": 533 + }, + "images": [ + { + "type": "location", + "id": "4520a00c-42d4-462a-861f-5d3ea4a822db", + "url": "https://mkw.techtangents.net/marker/pswitch/Take an offroad route to Choco Mountain!/location.jpg" + }, + { + "type": "title", + "id": "2d7e1f06-11d0-4c8c-80dd-1f5b0642fb40", + "url": "https://mkw.techtangents.net/marker/pswitch/Take an offroad route to Choco Mountain!/title.jpg" + } + ] + }, + { + "name": "Crash through traffic to reach the slopes!", + "id": "32a85096-4871-46c0-aefe-0380cab42c3f", + "position": { + "x": 1190, + "y": 464 + }, + "end": { + "flying": false, + "x": 1211, + "y": 414 + }, + "images": [ + { + "type": "location", + "id": "0dd8b274-8225-4a36-a6a7-8a151df5dc98", + "url": "https://mkw.techtangents.net/marker/pswitch/Crash through traffic to reach the slopes!/location.jpg" + }, + { + "type": "title", + "id": "00d619d2-e21f-4893-884e-d9d7bf1635e0", + "url": "https://mkw.techtangents.net/marker/pswitch/Crash through traffic to reach the slopes!/title.jpg" + } + ] + }, + { + "name": "Shine bright with Super Star power!", + "id": "3c8d4451-d4d5-4d82-a63a-a0b054ed826a", + "position": { + "x": 810, + "y": 620 + }, + "images": [ + { + "type": "location", + "id": "7ffea2c3-51e2-440c-a7de-32c795ac9409", + "url": "https://mkw.techtangents.net/marker/pswitch/Shine bright with Super Star power!/location.jpg" + }, + { + "type": "title", + "id": "b53c8c32-6176-4be5-8d07-e82f6ba300a4", + "url": "https://mkw.techtangents.net/marker/pswitch/Shine bright with Super Star power!/title.jpg" + } + ] + }, + { + "name": "Tackle some advanced training in water steering!", + "id": "a6c06a43-628a-42ea-8bc3-264ab7e0859f", + "position": { + "x": 1232, + "y": 601 + }, + "end": { + "flying": false, + "x": 1157, + "y": 572 + }, + "images": [ + { + "type": "location", + "id": "3bf9a25b-7d5c-4f93-8d6e-78ca8a9b2e6c", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle some advanced training in water steering!/location.jpg" + }, + { + "type": "title", + "id": "988e334d-48a6-4ffe-928f-643a31dceaa7", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle some advanced training in water steering!/title.jpg" + } + ] + }, + { + "name": "Zip by Fish Bones on the way to the hot springs!", + "id": "232d32e8-b943-4c45-a102-f829cfd8a90d", + "position": { + "x": 861, + "y": 309 + }, + "end": { + "flying": true, + "x": 760, + "y": 260 + }, + "images": [ + { + "type": "location", + "id": "226666ee-14d1-4939-b3e1-029222c682c1", + "url": "https://mkw.techtangents.net/marker/pswitch/Zip by Fish Bones on the way to the hot springs!/location.jpg" + }, + { + "type": "title", + "id": "1c3b2a09-d272-46a1-8306-d22e9f525456", + "url": "https://mkw.techtangents.net/marker/pswitch/Zip by Fish Bones on the way to the hot springs!/title.jpg" + } + ] + }, + { + "name": "Dodge Bowser's minions on your way to the goal!", + "id": "1b37b195-504f-48c8-bed0-4c3d798e5cfa", + "position": { + "x": 781, + "y": 749 + }, + "end": { + "flying": false, + "x": 830, + "y": 734 + }, + "images": [ + { + "type": "location", + "id": "e72f77dc-ddfe-44b4-996a-77e2e8dc3ab6", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge Bowser's minions on your way to the goal!/location.jpg" + }, + { + "type": "title", + "id": "7f85da8a-fbab-4a27-bc9e-cc26d894247a", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge Bowser's minions on your way to the goal!/title.jpg" + } + ] + }, + { + "name": "Race over ramps and beams to reach the goal!", + "id": "09009138-2329-47e2-b87a-fec0e4bfede0", + "position": { + "x": 655, + "y": 581 + }, + "end": { + "flying": true, + "x": 577, + "y": 552 + }, + "images": [ + { + "type": "location", + "id": "f9f4b3f4-509d-462e-a88e-06f4909bb2b2", + "url": "https://mkw.techtangents.net/marker/pswitch/Race over ramps and beams to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "eafea3f4-ed8c-457e-9c5d-e34fc84c838b", + "url": "https://mkw.techtangents.net/marker/pswitch/Race over ramps and beams to reach the goal!/title.jpg" + } + ] + }, + { + "name": "SEARCH FIELDS. ABDUCT BLUE COINS.", + "id": "37698284-5e2f-426c-8385-39171cae4007", + "position": { + "x": 947, + "y": 396 + }, + "end": { + "flying": true, + "x": 904, + "y": 362 + }, + "images": [ + { + "type": "location", + "id": "5374f95c-7c6c-42c4-af9f-3db8a079155e", + "url": "https://mkw.techtangents.net/marker/pswitch/SEARCH FIELDS. ABDUCT BLUE COINS./location.jpg" + }, + { + "type": "title", + "id": "b650764a-7d87-49bc-b50d-b122339ed887", + "url": "https://mkw.techtangents.net/marker/pswitch/SEARCH FIELDS. ABDUCT BLUE COINS./title.jpg" + } + ] + }, + { + "name": "Grab the blue coins the Piranha Plants want!", + "id": "24479531-900e-41ec-aeea-b0241b4b821d", + "position": { + "x": 1229, + "y": 915 + }, + "end": { + "flying": false, + "x": 1224, + "y": 882 + }, + "images": [ + { + "type": "location", + "id": "73ce7e82-17e2-43dd-8740-b50bb4598f40", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab the blue coins the Piranha Plants want!/location.jpg" + }, + { + "type": "title", + "id": "8bf7543d-460a-4a11-be6a-50006c2b7fc8", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab the blue coins the Piranha Plants want!/title.jpg" + } + ] + }, + { + "name": "Follow the Ivy Piranha Plants to blue coins!", + "id": "e23c1b41-5932-4874-ad0c-a463352f24e6", + "position": { + "x": 1286, + "y": 816 + }, + "end": { + "flying": false, + "x": 1224, + "y": 822 + }, + "images": [ + { + "type": "location", + "id": "8e6b6c96-1475-4f3c-a549-377dcb8f1c10", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the Ivy Piranha Plants to blue coins!/location.jpg" + }, + { + "type": "title", + "id": "e8686e94-609f-44d8-98b4-9f571160c61b", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the Ivy Piranha Plants to blue coins!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins and dodge the Goombas!", + "id": "e422a232-508e-4121-a16e-4d1293dea1aa", + "position": { + "x": 577, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "055d36e0-ab1c-4bff-a693-c9f83d951df4", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins and dodge the Goombas!/location.jpg" + }, + { + "type": "title", + "id": "03ed1c91-d3a1-4a8c-ba4d-53e95336cfc2", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins and dodge the Goombas!/title.jpg" + } + ] + }, + { + "name": "Scoop up blue coins while riding the rails!", + "id": "816744d1-3346-49ad-9503-b300e1737f17", + "position": { + "x": 571, + "y": 303 + }, + "end": { + "flying": false, + "x": 486, + "y": 302 + }, + "images": [ + { + "type": "location", + "id": "207af17c-c64c-4160-af60-1377adf6fe54", + "url": "https://mkw.techtangents.net/marker/pswitch/Scoop up blue coins while riding the rails!/location.jpg" + }, + { + "type": "title", + "id": "4a3cf7a7-2632-402a-a3c9-ab3e3a96cc72", + "url": "https://mkw.techtangents.net/marker/pswitch/Scoop up blue coins while riding the rails!/title.jpg" + } + ] + }, + { + "name": "Get a lift from the brachiosauruses!", + "id": "fbad4cf5-5aeb-4ed6-bd58-0ab3d40a32ff", + "position": { + "x": 1212, + "y": 924 + }, + "end": { + "flying": false, + "x": 1156, + "y": 906 + }, + "images": [ + { + "type": "location", + "id": "ea27c735-bb40-4830-a0b0-71282f76db7e", + "url": "https://mkw.techtangents.net/marker/pswitch/Get a lift from the brachiosauruses!/location.jpg" + }, + { + "type": "title", + "id": "50b73d72-b29c-49b5-9dc9-b6c6ec9c1aee", + "url": "https://mkw.techtangents.net/marker/pswitch/Get a lift from the brachiosauruses!/title.jpg" + } + ] + }, + { + "name": "Aim for the Goal Pole atop the massive mushroom!", + "id": "9bacbf2c-d58c-4642-997d-f9260bd30458", + "position": { + "x": 706, + "y": 698 + }, + "end": { + "flying": true, + "x": 703, + "y": 742 + }, + "images": [ + { + "type": "location", + "id": "1267a046-fc78-46af-a72e-69b586ed8b71", + "url": "https://mkw.techtangents.net/marker/pswitch/Aim for the Goal Pole atop the massive mushroom!/location.jpg" + }, + { + "type": "title", + "id": "35bdd38c-8c08-418b-bf24-9af378d6d1d1", + "url": "https://mkw.techtangents.net/marker/pswitch/Aim for the Goal Pole atop the massive mushroom!/title.jpg" + } + ] + }, + { + "name": "Put the pedal to the metal! Go, go, go!", + "id": "515ce641-6bc6-46fa-b20b-9f98725f669b", + "position": { + "x": 1248, + "y": 292 + }, + "end": { + "flying": false, + "x": 1256, + "y": 269 + }, + "images": [ + { + "type": "location", + "id": "9f8de6ad-9d32-4c41-a68d-da5d4744ea90", + "url": "https://mkw.techtangents.net/marker/pswitch/Put the pedal to the metal! Go, go, go!/location.jpg" + }, + { + "type": "title", + "id": "d6279822-fcf3-472e-b59a-dccc25136de4", + "url": "https://mkw.techtangents.net/marker/pswitch/Put the pedal to the metal! Go, go, go!/title.jpg" + } + ] + }, + { + "name": "Catch the express train to the city!", + "id": "bd1bb0f0-0207-4182-9ea5-9b0dd07a9137", + "position": { + "x": 822, + "y": 650 + }, + "end": { + "flying": false, + "x": 788, + "y": 704 + }, + "images": [ + { + "type": "location", + "id": "fd99d876-285c-425e-b042-a761cb8b7443", + "url": "https://mkw.techtangents.net/marker/pswitch/Catch the express train to the city!/location.jpg" + }, + { + "type": "title", + "id": "07eb1fd9-b147-4eeb-81f8-4662f4e9087a", + "url": "https://mkw.techtangents.net/marker/pswitch/Catch the express train to the city!/title.jpg" + } + ] + }, + { + "name": "Soar high above the slopes!", + "id": "851c0e24-791e-4fb9-904f-da9a53b3cc2e", + "position": { + "x": 1262, + "y": 310 + }, + "end": { + "flying": false, + "x": 1210, + "y": 402 + }, + "images": [ + { + "type": "location", + "id": "a685b291-d402-4084-85dc-94269fa126b9", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar high above the slopes!/location.jpg" + }, + { + "type": "title", + "id": "23b10cf3-2fc5-4bd1-8dd4-24aca2e907c4", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar high above the slopes!/title.jpg" + } + ] + }, + { + "name": "Receive a whale of a welcome to Peach Stadium!", + "id": "91bdd2c3-b58c-4f3e-a48a-6bf31afa5129", + "position": { + "x": 975, + "y": 812 + }, + "end": { + "flying": false, + "x": 932, + "y": 674 + }, + "images": [ + { + "type": "location", + "id": "d6d5a254-a89c-4a6f-b21b-aee6a9ecdb31", + "url": "https://mkw.techtangents.net/marker/pswitch/Receive a whale of a welcome to Peach Stadium!/location.jpg" + }, + { + "type": "title", + "id": "c5d32981-9c66-450c-86c4-e12e8bbb5f5f", + "url": "https://mkw.techtangents.net/marker/pswitch/Receive a whale of a welcome to Peach Stadium!/title.jpg" + } + ] + }, + { + "name": "Take a peek into a ghostly cinematic universe!", + "id": "6f951921-7aed-4ee0-b560-64786bd2cd54", + "position": { + "x": 1132, + "y": 181 + }, + "end": { + "flying": false, + "x": 1118, + "y": 130 + }, + "images": [ + { + "type": "location", + "id": "cdf66b47-78b0-40a1-9c83-e086bff1fba6", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a peek into a ghostly cinematic universe!/location.jpg" + }, + { + "type": "title", + "id": "1d78dfe3-ba5d-4883-a44b-5a3e71eb0cba", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a peek into a ghostly cinematic universe!/title.jpg" + } + ] + }, + { + "name": "Reach the mermaid calling from across the sea!", + "id": "595dc24a-a217-4e79-ba5c-5a9589a12262", + "position": { + "x": 1375, + "y": 656 + }, + "end": { + "flying": true, + "x": 1254, + "y": 653 + }, + "images": [ + { + "type": "location", + "id": "738e82bc-8f48-4e09-85e2-8b5a8d6a6ebc", + "url": "https://mkw.techtangents.net/marker/pswitch/Reach the mermaid calling from across the sea!/location.jpg" + }, + { + "type": "title", + "id": "9685a25a-5c1f-4b65-bba6-e5f04eced39b", + "url": "https://mkw.techtangents.net/marker/pswitch/Reach the mermaid calling from across the sea!/title.jpg" + } + ] + }, + { + "name": "Race to the top of the castle wall!", + "id": "f070f320-0a48-4e28-9130-18176a1c2fed", + "position": { + "x": 635, + "y": 356 + }, + "end": { + "flying": false, + "x": 610, + "y": 309 + }, + "images": [ + { + "type": "location", + "id": "03461e78-9669-4546-aa90-161a7b38dc87", + "url": "https://mkw.techtangents.net/marker/pswitch/Race to the top of the castle wall!/location.jpg" + }, + { + "type": "title", + "id": "a722b7dd-720b-45ab-a7cf-216bd4c1d4e2", + "url": "https://mkw.techtangents.net/marker/pswitch/Race to the top of the castle wall!/title.jpg" + } + ] + }, + { + "name": "Cut through the Shy Guy water show!", + "id": "6ce6c6c0-d96b-4846-b533-69e650297246", + "position": { + "x": 1436, + "y": 774 + }, + "end": { + "flying": false, + "x": 1361, + "y": 700 + }, + "images": [ + { + "type": "location", + "id": "18f98cc3-0b3c-42b9-bdf8-edcb8ee59f95", + "url": "https://mkw.techtangents.net/marker/pswitch/Cut through the Shy Guy water show!/location.jpg" + }, + { + "type": "title", + "id": "e37dd60b-e6e2-469e-a10a-a94d79ac4604", + "url": "https://mkw.techtangents.net/marker/pswitch/Cut through the Shy Guy water show!/title.jpg" + } + ] + }, + { + "name": "Evade the Spikes' attacks and reach the goal!", + "id": "5b2905c8-3570-4281-822f-b1fb5e0469dd", + "position": { + "x": 992, + "y": 366 + }, + "end": { + "flying": false, + "x": 930, + "y": 302 + }, + "images": [ + { + "type": "location", + "id": "0601d3f4-9e0a-48be-ae1b-c4e5251cfd46", + "url": "https://mkw.techtangents.net/marker/pswitch/Evade the Spikes' attacks and reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "cac45d42-8d94-4bb7-94b4-d9df614703d8", + "url": "https://mkw.techtangents.net/marker/pswitch/Evade the Spikes' attacks and reach the goal!/title.jpg" + } + ] + }, + { + "name": "Mush-zoom through town and to the goal!", + "id": "31190174-062a-42a7-9f08-ef180fb92b71", + "position": { + "x": 1444, + "y": 801 + }, + "end": { + "flying": false, + "x": 1375, + "y": 738 + }, + "images": [ + { + "type": "location", + "id": "b12afcdc-89d8-4fdf-a401-dfa55cf94e78", + "url": "https://mkw.techtangents.net/marker/pswitch/Mush-zoom through town and to the goal!/location.jpg" + }, + { + "type": "title", + "id": "57d66035-d52e-4b81-ba55-b5f7933cef05", + "url": "https://mkw.techtangents.net/marker/pswitch/Mush-zoom through town and to the goal!/title.jpg" + } + ] + }, + { + "name": "Soar from plateau to plateau using steel ramps!", + "id": "000a94e0-21d3-4da7-89b2-775b4a82355e", + "position": { + "x": 570, + "y": 854 + }, + "end": { + "flying": false, + "x": 523, + "y": 737 + }, + "images": [ + { + "type": "location", + "id": "fd3f7729-193f-4e08-a2bb-1ee6cc7d92b4", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar from plateau to plateau using steel ramps!/location.jpg" + }, + { + "type": "title", + "id": "0a78d26d-6cb2-4e6a-8947-869f145b2250", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar from plateau to plateau using steel ramps!/title.jpg" + } + ] + }, + { + "name": "Slide by waves of fireballs! Don't get singed!", + "id": "57e86455-939e-4e93-a117-57c15c7565fd", + "position": { + "x": 662, + "y": 283 + }, + "end": { + "flying": false, + "x": 621, + "y": 297 + }, + "images": [ + { + "type": "location", + "id": "e08b6374-ad12-4552-87a1-87ce90ec757c", + "url": "https://mkw.techtangents.net/marker/pswitch/Slide by waves of fireballs! Don't get singed!/location.jpg" + }, + { + "type": "title", + "id": "0aa4a7f1-6ac8-49d9-af01-b80b0ba8bcff", + "url": "https://mkw.techtangents.net/marker/pswitch/Slide by waves of fireballs! Don't get singed!/title.jpg" + } + ] + }, + { + "name": "Show off serious tightrope-riding skills!", + "id": "f265fa64-ca29-4c58-8f4c-5aee94f8aee6", + "position": { + "x": 618, + "y": 404 + }, + "end": { + "flying": true, + "x": 735, + "y": 409 + }, + "images": [ + { + "type": "location", + "id": "fa8c1445-5155-420b-9326-51aa6de7fb87", + "url": "https://mkw.techtangents.net/marker/pswitch/Show off serious tightrope-riding skills!/location.jpg" + }, + { + "type": "title", + "id": "79f11166-14d7-4b7f-a962-4f0da55d1cb2", + "url": "https://mkw.techtangents.net/marker/pswitch/Show off serious tightrope-riding skills!/title.jpg" + } + ] + }, + { + "name": "Barrel through hay bales to bag blue coins!", + "id": "f32ff7c4-4d4a-4b70-9ab4-93a1dde31728", + "position": { + "x": 1042, + "y": 539 + }, + "images": [ + { + "type": "location", + "id": "164dac8b-ac6e-4a7b-a67c-50f834ec7565", + "url": "https://mkw.techtangents.net/marker/pswitch/Barrel through hay bales to bag blue coins!/location.jpg" + }, + { + "type": "title", + "id": "b07addf6-d669-4a16-a0f7-ff88bb092955", + "url": "https://mkw.techtangents.net/marker/pswitch/Barrel through hay bales to bag blue coins!/title.jpg" + } + ] + }, + { + "name": "Thread the gaps in the steel supports!", + "id": "367d0cfc-8587-4a1e-817f-72ccdb1b8f87", + "position": { + "x": 697, + "y": 424 + }, + "end": { + "flying": true, + "x": 592, + "y": 385 + }, + "images": [ + { + "type": "location", + "id": "e7dcbb69-b104-4c44-ac9e-254608ae6a6a", + "url": "https://mkw.techtangents.net/marker/pswitch/Thread the gaps in the steel supports!/location.jpg" + }, + { + "type": "title", + "id": "1a0f7181-f5ac-4fc4-81e2-9aed27e344c2", + "url": "https://mkw.techtangents.net/marker/pswitch/Thread the gaps in the steel supports!/title.jpg" + } + ] + }, + { + "name": "Say \"hi\" to the Mario statue as you soar by!", + "id": "f2a26588-a41d-498c-9226-53e4f0244a56", + "position": { + "x": 1022, + "y": 314 + }, + "end": { + "flying": true, + "x": 931, + "y": 254 + }, + "images": [ + { + "type": "location", + "id": "4fdf980d-7c14-450c-8db6-99c188c4e11b", + "url": "https://mkw.techtangents.net/marker/pswitch/Say hi to the Mario statue as you soar by!/location.jpg" + }, + { + "type": "title", + "id": "edd0bd52-7985-49fe-b234-68e299f4dcd1", + "url": "https://mkw.techtangents.net/marker/pswitch/Say hi to the Mario statue as you soar by!/title.jpg" + } + ] + }, + { + "name": "Race through the stands to the goal!", + "id": "cc3637cc-fd54-45db-aab5-14dbb6db30a7", + "position": { + "x": 604, + "y": 670 + }, + "end": { + "flying": false, + "x": 593, + "y": 661 + }, + "images": [ + { + "type": "location", + "id": "3c283a44-b762-4cab-8e41-3c799cd88ec8", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through the stands to the goal!/location.jpg" + }, + { + "type": "title", + "id": "47543a9c-dd8f-4fdb-b875-1791f8b00ef4", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through the stands to the goal!/title.jpg" + } + ] + }, + { + "name": "Tackle the chilly course on the lake!", + "id": "a23c0d81-c950-4a3e-9877-c88f72d2fce5", + "position": { + "x": 1210, + "y": 504 + }, + "end": { + "flying": false, + "x": 1178, + "y": 421 + }, + "images": [ + { + "type": "location", + "id": "df1a4139-9e53-4dfc-8027-a8700a317ec0", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle the chilly course on the lake!/location.jpg" + }, + { + "type": "title", + "id": "917fb63a-f2eb-482c-bc54-80ef99748429", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle the chilly course on the lake!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins and watch out for Thwomps!", + "id": "131cf8ee-abc4-4b1a-8820-67ea5527fb1f", + "position": { + "x": 718, + "y": 257 + }, + "end": { + "flying": false, + "x": 733, + "y": 244 + }, + "images": [ + { + "type": "location", + "id": "93e1b2b0-71ac-4d05-bde1-1f81c8cf96b3", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins and watch out for Thwomps!/location.jpg" + }, + { + "type": "title", + "id": "54f3ba0c-5431-4cd5-ade1-83c772471c4d", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins and watch out for Thwomps!/title.jpg" + } + ] + }, + { + "name": "Race around a tribute to Koopa Beach 1!", + "id": "6b9028f8-6d7d-42ec-8c78-68341ab08de8", + "position": { + "x": 922, + "y": 910 + }, + "images": [ + { + "type": "location", + "id": "4822607e-7d56-48fd-809e-16bc65a09456", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Koopa Beach 1!/location.jpg" + }, + { + "type": "title", + "id": "63a43f38-f420-44c6-8af3-89aab269e58b", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Koopa Beach 1!/title.jpg" + } + ] + }, + { + "name": "Reach blue coins with the crocodiles' help!", + "id": "8b88a851-5347-4caa-82ad-bada62022eab", + "position": { + "x": 1089, + "y": 870 + }, + "end": { + "flying": false, + "x": 1078, + "y": 826 + }, + "images": [ + { + "type": "location", + "id": "ec2f3c05-47f4-46f4-8d36-ad06023d2c76", + "url": "https://mkw.techtangents.net/marker/pswitch/Reach blue coins with the crocodiles' help!/location.jpg" + }, + { + "type": "title", + "id": "bb1a9c26-5eec-4d31-9ed4-14a3949caf76", + "url": "https://mkw.techtangents.net/marker/pswitch/Reach blue coins with the crocodiles' help!/title.jpg" + } + ] + }, + { + "name": "Weave a route through a pack of Chain Chomps!", + "id": "2b5da45b-ddb1-4704-8bcc-b16ac4af1ac1", + "position": { + "x": 1043, + "y": 677 + }, + "end": { + "flying": false, + "x": 996, + "y": 627 + }, + "images": [ + { + "type": "location", + "id": "66e24d70-64cd-400b-b418-bc1efa9efa2e", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave a route through a pack of Chain Chomps!/location.jpg" + }, + { + "type": "title", + "id": "738ea170-5370-4571-90f0-22a61d20fa78", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave a route through a pack of Chain Chomps!/title.jpg" + } + ] + }, + { + "name": "Take a Yoshi's to-go bag! Or seven! Or eleven!", + "id": "83a4cb1a-ed2c-4e0a-a038-3b1c5ee4f061", + "position": { + "x": 1063, + "y": 396 + }, + "end": { + "flying": false, + "x": 1034, + "y": 411 + }, + "images": [ + { + "type": "location", + "id": "723fbeba-210b-4d90-923a-78668fd1790d", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a Yoshi's to-go bag! Or seven! Or eleven!/location.jpg" + }, + { + "type": "title", + "id": "6516da90-d2a7-4a41-87c0-89015d6a691c", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a Yoshi's to-go bag! Or seven! Or eleven!/title.jpg" + } + ] + }, + { + "name": "Note the timing of your jumps!", + "id": "04f6e8d9-9851-42a1-aef7-78f6eaf75a4a", + "position": { + "x": 817, + "y": 421 + }, + "end": { + "flying": false, + "x": 811, + "y": 375 + }, + "images": [ + { + "type": "location", + "id": "ec15be7e-79d1-47e2-8f95-562c42979a7a", + "url": "https://mkw.techtangents.net/marker/pswitch/Note the timing of your jumps!/location.jpg" + }, + { + "type": "title", + "id": "329bf6ff-4b99-45bf-b9f2-2ea05a1bba1f", + "url": "https://mkw.techtangents.net/marker/pswitch/Note the timing of your jumps!/title.jpg" + } + ] + }, + { + "name": "Pursue zen by collecting blue coins!", + "id": "8a41b4a0-0ac2-429f-8405-37fbba110ef9", + "position": { + "x": 1110, + "y": 564 + }, + "end": { + "flying": false, + "x": 1103, + "y": 553 + }, + "images": [ + { + "type": "location", + "id": "8ab210e2-33e7-443f-abfc-5d5724869523", + "url": "https://mkw.techtangents.net/marker/pswitch/Pursue zen by collecting blue coins!/location.jpg" + }, + { + "type": "title", + "id": "48380bfa-1c4e-43e7-8feb-c7f095e49984", + "url": "https://mkw.techtangents.net/marker/pswitch/Pursue zen by collecting blue coins!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins around the geyser field!", + "id": "e16018ef-9239-4cbc-a43e-fb047731744f", + "position": { + "x": 1095, + "y": 814 + }, + "images": [ + { + "type": "location", + "id": "c9a56dfe-b50e-4c29-bc3a-ce2c5bf83c48", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins around the geyser field!/location.jpg" + }, + { + "type": "title", + "id": "e5d69444-189d-4617-8947-5920591dd7d6", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins around the geyser field!/title.jpg" + } + ] + }, + { + "name": "Catch major air to get to the goal!", + "id": "0bd1482f-baaf-450e-9026-820d2e541125", + "position": { + "x": 1371, + "y": 828 + }, + "end": { + "flying": false, + "x": 1397, + "y": 766 + }, + "images": [ + { + "type": "location", + "id": "74a71667-847a-4348-93de-4a768fbe966e", + "url": "https://mkw.techtangents.net/marker/pswitch/Catch major air to get to the goal!/location.jpg" + }, + { + "type": "title", + "id": "c8ad7c13-f5c2-4810-b725-821b50630f6f", + "url": "https://mkw.techtangents.net/marker/pswitch/Catch major air to get to the goal!/title.jpg" + } + ] + }, + { + "name": "Avoid the Piranha Plants as you go!", + "id": "1d21be15-b33a-43a5-8857-6e544f6a9b16", + "position": { + "x": 1060, + "y": 337 + }, + "end": { + "flying": false, + "x": 1009, + "y": 301 + }, + "images": [ + { + "type": "location", + "id": "85b42d84-a361-4434-8cb3-86da77a31f5a", + "url": "https://mkw.techtangents.net/marker/pswitch/Avoid the Piranha Plants as you go!/location.jpg" + }, + { + "type": "title", + "id": "2fae0d36-5e30-4102-b071-872d03428e15", + "url": "https://mkw.techtangents.net/marker/pswitch/Avoid the Piranha Plants as you go!/title.jpg" + } + ] + }, + { + "name": "Rush from rock to rock through a busy savanna!", + "id": "effaa498-1d21-4c7b-8686-dd52b4b754b6", + "position": { + "x": 1081, + "y": 736 + }, + "end": { + "flying": false, + "x": 1092, + "y": 672 + }, + "images": [ + { + "type": "location", + "id": "49e58184-1152-470b-aa6f-1fa2a3141d5a", + "url": "https://mkw.techtangents.net/marker/pswitch/Rush from rock to rock through a busy savanna!/location.jpg" + }, + { + "type": "title", + "id": "9c28376f-463b-4816-9474-6e1c51ccc046", + "url": "https://mkw.techtangents.net/marker/pswitch/Rush from rock to rock through a busy savanna!/title.jpg" + } + ] + }, + { + "name": "Balance on the tightrope to gather blue coins!", + "id": "bba77669-bfad-4b1a-a797-a56c04aba6a1", + "position": { + "x": 816, + "y": 158 + }, + "end": { + "flying": false, + "x": 794, + "y": 150 + }, + "images": [ + { + "type": "location", + "id": "83d0e29c-6dbf-4537-9314-1fe67d6262a0", + "url": "https://mkw.techtangents.net/marker/pswitch/Balance on the tightrope to gather blue coins!/location.jpg" + }, + { + "type": "title", + "id": "982e9572-e896-43f0-92b3-310dd0f2ccd9", + "url": "https://mkw.techtangents.net/marker/pswitch/Balance on the tightrope to gather blue coins!/title.jpg" + } + ] + }, + { + "name": "Chase whoever is tearing up the yard!", + "id": "344a2995-5997-415d-b5fd-ac49cacaae1f", + "position": { + "x": 929, + "y": 475 + }, + "end": { + "flying": false, + "x": 892, + "y": 448 + }, + "images": [ + { + "type": "location", + "id": "0bc60cf7-17de-403b-87d0-270503d4adab", + "url": "https://mkw.techtangents.net/marker/pswitch/Chase whoever is tearing up the yard!/location.jpg" + }, + { + "type": "title", + "id": "14459cf6-64f0-406c-861b-51c093171153", + "url": "https://mkw.techtangents.net/marker/pswitch/Chase whoever is tearing up the yard!/title.jpg" + } + ] + }, + { + "name": "Mooove through the herd of cows!", + "id": "4178b58a-abf7-4617-a9ae-89ef010e5614", + "position": { + "x": 956, + "y": 460 + }, + "end": { + "flying": false, + "x": 939, + "y": 403 + }, + "images": [ + { + "type": "location", + "id": "fb812126-ec06-40e2-912b-8e0376f5d4db", + "url": "https://mkw.techtangents.net/marker/pswitch/Mooove through the herd of cows!/location.jpg" + }, + { + "type": "title", + "id": "f1c0ebe0-acfe-400d-8a73-2d8fdb43bdb4", + "url": "https://mkw.techtangents.net/marker/pswitch/Mooove through the herd of cows!/title.jpg" + } + ] + }, + { + "name": "Race back through DK Spaceport!", + "id": "9b080573-3e37-4d0e-8065-61300a19db95", + "position": { + "x": 814, + "y": 932 + }, + "end": { + "flying": false, + "x": 788, + "y": 957 + }, + "images": [ + { + "type": "location", + "id": "c122907f-1a0a-4e96-8250-fc1ea18fb0b0", + "url": "https://mkw.techtangents.net/marker/pswitch/Race back through DK Spaceport!/location.jpg" + }, + { + "type": "title", + "id": "341f1985-4b57-4eca-94cb-5056f72c4277", + "url": "https://mkw.techtangents.net/marker/pswitch/Race back through DK Spaceport!/title.jpg" + } + ] + }, + { + "name": "Use Mushrooms to zip up the right-hand path!", + "id": "15d9e9de-0792-48ba-bb98-1f880a6d7fd9", + "position": { + "x": 688, + "y": 280 + }, + "end": { + "flying": false, + "x": 646, + "y": 241 + }, + "images": [ + { + "type": "location", + "id": "47813baa-b7ef-49ae-a897-8bbfd82033ff", + "url": "https://mkw.techtangents.net/marker/pswitch/Use Mushrooms to zip up the right-hand path!/location.jpg" + }, + { + "type": "title", + "id": "4a0a2445-1195-43d8-ac5f-7d0c0e9a76c7", + "url": "https://mkw.techtangents.net/marker/pswitch/Use Mushrooms to zip up the right-hand path!/title.jpg" + } + ] + }, + { + "name": "Drop in and out of the downriver tours!", + "id": "96f5cf1f-09d4-40a5-b47a-55fb8798a52c", + "position": { + "x": 1192, + "y": 789 + }, + "end": { + "flying": false, + "x": 1089, + "y": 699 + }, + "images": [ + { + "type": "location", + "id": "0c5d8e82-9baf-4179-a6f1-febd3c68854d", + "url": "https://mkw.techtangents.net/marker/pswitch/Drop in and out of the downriver tours!/location.jpg" + }, + { + "type": "title", + "id": "4e0fe4f4-26ad-4f02-a49c-7ecf87a5afd9", + "url": "https://mkw.techtangents.net/marker/pswitch/Drop in and out of the downriver tours!/title.jpg" + } + ] + }, + { + "name": "Tackle Shy Guy Challenge #3!", + "id": "c89363dc-d3f9-4677-b38e-314d9902a66d", + "position": { + "x": 448, + "y": 543 + }, + "end": { + "flying": true, + "x": 473, + "y": 478 + }, + "images": [ + { + "type": "location", + "id": "c9cf7b52-50a5-4eab-8064-8b323da4c6e1", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle Shy Guy Challenge 3!/location.jpg" + }, + { + "type": "title", + "id": "63c11f78-648e-4b04-884b-8b50b21c2ea5", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle Shy Guy Challenge 3!/title.jpg" + } + ] + }, + { + "name": "Check out the secret back-road barrel shortcut!", + "id": "d848870f-600b-4362-8c81-f8dbfb497457", + "position": { + "x": 733, + "y": 864 + }, + "end": { + "flying": true, + "x": 786, + "y": 928 + }, + "images": [ + { + "type": "location", + "id": "7c69ea19-e8c2-49a7-9bef-8ce3d02d73b1", + "url": "https://mkw.techtangents.net/marker/pswitch/Check out the secret back-road barrel shortcut!/location.jpg" + }, + { + "type": "title", + "id": "414ed371-6979-42ce-b91c-3ca88771208b", + "url": "https://mkw.techtangents.net/marker/pswitch/Check out the secret back-road barrel shortcut!/title.jpg" + } + ] + }, + { + "name": "Parkour across Salty Salty Speedway's rooftops!", + "id": "e9bbb26a-53e1-43fd-8bc0-81eb6be22020", + "position": { + "x": 1251, + "y": 717 + }, + "end": { + "flying": false, + "x": 1222, + "y": 621 + }, + "images": [ + { + "type": "location", + "id": "1dd0b372-6d30-4044-a2ae-3e1ea7c4c628", + "url": "https://mkw.techtangents.net/marker/pswitch/Parkour across Salty Salty Speedway's rooftops!/location.jpg" + }, + { + "type": "title", + "id": "5c899b8d-8350-4409-a569-11379d9b9713", + "url": "https://mkw.techtangents.net/marker/pswitch/Parkour across Salty Salty Speedway's rooftops!/title.jpg" + } + ] + }, + { + "name": "Take a dangerous voyage to the distant city!", + "id": "14669578-c5ac-46ec-90a4-545c437fff78", + "position": { + "x": 891, + "y": 895 + }, + "end": { + "flying": false, + "x": 794, + "y": 790 + }, + "images": [ + { + "type": "location", + "id": "1e53c099-5bdf-49a1-bdfc-682328692920", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a dangerous voyage to the distant city!/location.jpg" + }, + { + "type": "title", + "id": "79b34707-1ce6-4457-ba91-2b0327a1c189", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a dangerous voyage to the distant city!/title.jpg" + } + ] + }, + { + "name": "Race against the icy avian assault!", + "id": "05a5be7f-71a0-4c46-9ba6-9c9a0e46199a", + "position": { + "x": 1330, + "y": 340 + }, + "end": { + "flying": false, + "x": 1265, + "y": 283 + }, + "images": [ + { + "type": "location", + "id": "a46fbcf2-c2a8-4134-aa74-068087642a3f", + "url": "https://mkw.techtangents.net/marker/pswitch/Race against the icy avian assault!/location.jpg" + }, + { + "type": "title", + "id": "4371b609-6f54-4abb-ae2b-48467349de70", + "url": "https://mkw.techtangents.net/marker/pswitch/Race against the icy avian assault!/title.jpg" + } + ] + }, + { + "name": "Fly safely above the lake of lava!", + "id": "0d75cacb-af3a-465b-92d4-5ec81ffebcc7", + "position": { + "x": 723, + "y": 312 + }, + "end": { + "flying": true, + "x": 675, + "y": 336 + }, + "images": [ + { + "type": "location", + "id": "9ba3203b-3b3b-4562-8cae-7cf9584f0f1a", + "url": "https://mkw.techtangents.net/marker/pswitch/Fly safely above the lake of lava!/location.jpg" + }, + { + "type": "title", + "id": "858d43fe-7b7c-4326-afd7-65b8e7de8939", + "url": "https://mkw.techtangents.net/marker/pswitch/Fly safely above the lake of lava!/title.jpg" + } + ] + }, + { + "name": "Use the Mushrooms to blitz to the station!", + "id": "f981caff-1cd4-465e-9723-0c0c3850ed04", + "position": { + "x": 1177, + "y": 299 + }, + "end": { + "flying": false, + "x": 1089, + "y": 281 + }, + "images": [ + { + "type": "location", + "id": "cf640b75-12b6-4a44-a316-ff0f9f28634a", + "url": "https://mkw.techtangents.net/marker/pswitch/Use the Mushrooms to blitz to the station!/location.jpg" + }, + { + "type": "title", + "id": "4bd2deef-8bb6-4dd7-84aa-bdcd0b7ee8fe", + "url": "https://mkw.techtangents.net/marker/pswitch/Use the Mushrooms to blitz to the station!/title.jpg" + } + ] + }, + { + "name": "Cross the beams of the busted bridge!", + "id": "71b993cb-bf4e-4add-8c4f-1c0dbc2692c5", + "position": { + "x": 661, + "y": 399 + }, + "end": { + "flying": false, + "x": 617, + "y": 395 + }, + "images": [ + { + "type": "location", + "id": "de5cba29-e3f7-43d0-80f6-c867cf143ea8", + "url": "https://mkw.techtangents.net/marker/pswitch/Cross the beams of the busted bridge!/location.jpg" + }, + { + "type": "title", + "id": "e358a2c1-082f-4328-81e2-4f22d926d3d6", + "url": "https://mkw.techtangents.net/marker/pswitch/Cross the beams of the busted bridge!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins around the control tower!", + "id": "1327c80a-27ac-4a36-94f5-639df4ec2740", + "position": { + "x": 973, + "y": 297 + }, + "images": [ + { + "type": "location", + "id": "204facc7-3aea-40b5-af05-8fdd61a78730", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins around the control tower!/location.jpg" + }, + { + "type": "title", + "id": "c5a0d45a-df5d-4197-a079-60336cb27314", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins around the control tower!/title.jpg" + } + ] + }, + { + "name": "Brave the sand and surf in a beachside race!", + "id": "9ba668f6-3f57-4dd2-a47a-024512885fc1", + "position": { + "x": 1032, + "y": 890 + }, + "images": [ + { + "type": "location", + "id": "e247c372-3e64-47b0-bf57-5e4dc4f061e5", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the sand and surf in a beachside race!/location.jpg" + }, + { + "type": "title", + "id": "0bee275d-3074-42fe-b748-7d2e80c6848c", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the sand and surf in a beachside race!/title.jpg" + } + ] + }, + { + "name": "Avoid the Fire Snakes in the Tunnel!", + "id": "31372e65-1960-49f8-9e3b-885a7c8e109e", + "position": { + "x": 493, + "y": 771 + }, + "end": { + "flying": true, + "x": 495, + "y": 679 + }, + "images": [ + { + "type": "location", + "id": "ad0028be-50c8-47dc-84df-851964d611ae", + "url": "https://mkw.techtangents.net/marker/pswitch/Avoid the Fire Snakes in the Tunnel!/location.jpg" + }, + { + "type": "title", + "id": "f80e1197-a69f-4b25-95e3-6957dece0338", + "url": "https://mkw.techtangents.net/marker/pswitch/Avoid the Fire Snakes in the Tunnel!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins on the slackline course!", + "id": "26e10ebd-f944-4623-875b-d21f56f6f6e1", + "position": { + "x": 1066, + "y": 454 + }, + "end": { + "flying": true, + "x": 990, + "y": 425 + }, + "images": [ + { + "type": "location", + "id": "81c45657-5fd8-4ab8-94a2-0d7a22a3251f", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins on the slackline course!/location.jpg" + }, + { + "type": "title", + "id": "47169b5f-db23-4553-884a-efe1eddfa890", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins on the slackline course!/title.jpg" + } + ] + }, + { + "name": "Zip forward and spring up to the Goal Pole!", + "id": "abcfd8cf-7fe0-4150-91bb-079c7c247113", + "position": { + "x": 436, + "y": 782 + }, + "end": { + "flying": false, + "x": 394, + "y": 762 + }, + "images": [ + { + "type": "location", + "id": "69a99d15-0ef6-4b15-a679-94274651a19b", + "url": "https://mkw.techtangents.net/marker/pswitch/Zip forward and spring up to the Goal Pole!/location.jpg" + }, + { + "type": "title", + "id": "f58063b2-a91c-4d80-87a6-b8fd7226a3ed", + "url": "https://mkw.techtangents.net/marker/pswitch/Zip forward and spring up to the Goal Pole!/title.jpg" + } + ] + }, + { + "name": "Show off your wall-riding skills!", + "id": "81fc781d-96a0-4238-9ca7-8ded338ccd91", + "position": { + "x": 623, + "y": 822 + }, + "end": { + "flying": false, + "x": 608, + "y": 775 + }, + "images": [ + { + "type": "location", + "id": "833cef69-d43b-4161-aea8-6396dae4c97c", + "url": "https://mkw.techtangents.net/marker/pswitch/Show off your wall-riding skills!/location.jpg" + }, + { + "type": "title", + "id": "284b3406-cea5-48a9-ae92-c202c83221ca", + "url": "https://mkw.techtangents.net/marker/pswitch/Show off your wall-riding skills!/title.jpg" + } + ] + }, + { + "name": "Display precision driving to gather the blue coins!", + "id": "8b37fec7-2b90-449d-a282-499f65b29322", + "position": { + "x": 1248, + "y": 572 + }, + "end": { + "flying": false, + "x": 1213, + "y": 565 + }, + "images": [ + { + "type": "location", + "id": "2c035bd9-11f3-4541-8f5f-646ab8fdbcc9", + "url": "https://www.gamerguides.com/assets/maps/markers/precision-driving.jpg" + } + ] + }, + { + "name": "Tackle Shy Guy Challenge #1!", + "id": "a4cfc899-ad25-438b-9a95-6c8dc31b71dc", + "position": { + "x": 447, + "y": 545 + }, + "end": { + "flying": true, + "x": 451, + "y": 553 + }, + "images": [ + { + "type": "location", + "id": "94575ef2-e9ee-4ae5-8c2d-988d49639f0d", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle Shy Guy Challenge 1!/location.jpg" + }, + { + "type": "title", + "id": "5369b01f-3785-4506-9143-448b9581880a", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle Shy Guy Challenge 1!/title.jpg" + } + ] + }, + { + "name": "Practice acrobatics and make a tricky landing!", + "id": "c6a71446-7b5e-4cc6-91ce-636a19eddedf", + "position": { + "x": 1035, + "y": 339 + }, + "end": { + "flying": false, + "x": 979, + "y": 267 + }, + "images": [ + { + "type": "location", + "id": "f9886f2e-b708-48e0-ac37-bd6cb6299fdc", + "url": "https://mkw.techtangents.net/marker/pswitch/Practice acrobatics and make a tricky landing!/location.jpg" + }, + { + "type": "title", + "id": "6798042a-3159-4188-9e1e-0a0fd88d5735", + "url": "https://mkw.techtangents.net/marker/pswitch/Practice acrobatics and make a tricky landing!/title.jpg" + } + ] + }, + { + "name": "Ride geysers and shoot through rings to the goal!", + "id": "446bba6c-5671-45fb-a3c5-d36f0d17810a", + "position": { + "x": 807, + "y": 258 + }, + "end": { + "flying": false, + "x": 729, + "y": 242 + }, + "images": [ + { + "type": "location", + "id": "72a1e4e7-de87-4894-ad87-7d8ded6398d2", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride geysers and shoot through rings to the goal!/location.jpg" + }, + { + "type": "title", + "id": "37ce7b4e-4ece-4901-b8a9-5bd345b1c848", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride geysers and shoot through rings to the goal!/title.jpg" + } + ] + }, + { + "name": "Weave through the most dangerous traffic ever!", + "id": "dd215a02-1819-4e41-aae6-094f7f43fc59", + "position": { + "x": 1133, + "y": 353 + }, + "end": { + "flying": false, + "x": 1102, + "y": 341 + }, + "images": [ + { + "type": "location", + "id": "ec558b05-0adb-45e9-877a-336f5f07cb91", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave through the most dangerous traffic ever!/location.jpg" + }, + { + "type": "title", + "id": "ec1f6516-138e-4a03-939e-844092235555", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave through the most dangerous traffic ever!/title.jpg" + } + ] + }, + { + "name": "Remember the classic DONKEY KONG!", + "id": "de86de4b-920e-4091-9eae-a755e14bac48", + "position": { + "x": 835, + "y": 957 + }, + "end": { + "flying": false, + "x": 805, + "y": 949 + }, + "images": [ + { + "type": "location", + "id": "12ce1b5c-f31f-4a26-9bd9-4c0246dd56c0", + "url": "https://mkw.techtangents.net/marker/pswitch/Remember the classic DONKEY KONG!/location.jpg" + }, + { + "type": "title", + "id": "8bb6689f-03dc-4399-ace8-bf4c8127081c", + "url": "https://mkw.techtangents.net/marker/pswitch/Remember the classic DONKEY KONG!/title.jpg" + } + ] + }, + { + "name": "Race through a treacherous tire trial!", + "id": "8bb591eb-c48c-478a-a418-44752df961d5", + "position": { + "x": 679, + "y": 486 + }, + "end": { + "flying": false, + "x": 623, + "y": 471 + }, + "images": [ + { + "type": "location", + "id": "ac0d378d-7aab-422b-8d4e-dc3be2b91aab", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through a treacherous tire trial!/location.jpg" + }, + { + "type": "title", + "id": "0ac33932-9753-4dd9-971b-5c8d11bdade9", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through a treacherous tire trial!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins as you descend into the lily valley!", + "id": "c7b28272-59a4-4e5a-bad9-437bec5c090f", + "position": { + "x": 922, + "y": 112 + }, + "end": { + "flying": false, + "x": 901, + "y": 104 + }, + "images": [ + { + "type": "location", + "id": "d0426c53-990f-46ab-bfb1-b3cacf4f8daf", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins as you descend into the lily valley!/location.jpg" + }, + { + "type": "title", + "id": "d3d10e64-94d5-4472-b573-57897468b4ef", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins as you descend into the lily valley!/title.jpg" + } + ] + }, + { + "name": "Race along a course filled with Bowser's minions!", + "id": "4e2b70d1-70e9-40aa-9ffd-ef8439c20036", + "position": { + "x": 653, + "y": 220 + }, + "images": [ + { + "type": "location", + "id": "4c3f987a-512d-4787-9c24-3c633e4b86b8", + "url": "https://mkw.techtangents.net/marker/pswitch/Race along a course filled with Bowser's minions!/location.jpg" + }, + { + "type": "title", + "id": "3dc89c40-7b61-4ee5-8c3c-126630a5d933", + "url": "https://mkw.techtangents.net/marker/pswitch/Race along a course filled with Bowser's minions!/title.jpg" + } + ] + }, + { + "name": "Show the swamp the power of Super Stars!", + "id": "10f62d3a-4d0c-4df1-ae6f-0037e4d3e40c", + "position": { + "x": 1056, + "y": 186 + }, + "end": { + "flying": false, + "x": 1113, + "y": 216 + }, + "images": [ + { + "type": "location", + "id": "4b04fe54-9c22-46d0-8fd1-5d3c544d9568", + "url": "https://mkw.techtangents.net/marker/pswitch/Show the swamp the power of Super Stars!/location.jpg" + }, + { + "type": "title", + "id": "84cb5988-1fbd-4f3a-9c69-0e1fa960985b", + "url": "https://mkw.techtangents.net/marker/pswitch/Show the swamp the power of Super Stars!/title.jpg" + } + ] + }, + { + "name": "Watch out for attacks from Ice Bros.!", + "id": "d6e0cbef-5400-41f1-b29c-88e27a54c637", + "position": { + "x": 1257, + "y": 287 + }, + "images": [ + { + "type": "location", + "id": "35de866f-639e-4ca7-b9df-078fcecaaf9e", + "url": "https://mkw.techtangents.net/marker/pswitch/Watch out for attacks from Ice Bros.!/location.jpg" + }, + { + "type": "title", + "id": "98a0d555-248f-4320-a556-318ad30ed6ce", + "url": "https://mkw.techtangents.net/marker/pswitch/Watch out for attacks from Ice Bros.!/title.jpg" + } + ] + }, + { + "name": "Clear the windmill!", + "id": "79b57247-ae61-4996-88d6-904ff66fa252", + "position": { + "x": 1262, + "y": 762 + }, + "end": { + "flying": false, + "x": 1242, + "y": 715 + }, + "images": [ + { + "type": "location", + "id": "da5f61e2-9e16-49f6-93f3-51211b0f5935", + "url": "https://mkw.techtangents.net/marker/pswitch/Clear the windmill!/location.jpg" + }, + { + "type": "title", + "id": "5592f7e5-7d8e-4631-96f5-2c3a19aa8d4f", + "url": "https://mkw.techtangents.net/marker/pswitch/Clear the windmill!/title.jpg" + } + ] + }, + { + "name": "Time your Mushroom to bust through to the goal!", + "id": "26d477b3-7a15-430f-ba87-849d99079ec6", + "position": { + "x": 1426, + "y": 406 + }, + "end": { + "flying": false, + "x": 1383, + "y": 337 + }, + "images": [ + { + "type": "location", + "id": "d8424f43-5312-4311-a78d-2db482fb53ae", + "url": "https://mkw.techtangents.net/marker/pswitch/Time your Mushroom to bust through to the goal!/location.jpg" + }, + { + "type": "title", + "id": "32b85e66-defa-48ea-aa06-4e1dd1d99690", + "url": "https://mkw.techtangents.net/marker/pswitch/Time your Mushroom to bust through to the goal!/title.jpg" + } + ] + }, + { + "name": "Ride the rails out to the theater lobby!", + "id": "d4e370ed-c6c8-4b1b-9e3f-2e3cb106fcf6", + "position": { + "x": 1141, + "y": 168 + }, + "end": { + "flying": false, + "x": 1088, + "y": 138 + }, + "images": [ + { + "type": "location", + "id": "f159c4ab-b9ba-4807-a0c0-dd7ef56cf5f5", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the rails out to the theater lobby!/location.jpg" + }, + { + "type": "title", + "id": "20698b68-9f0a-4954-aced-b9d57675a8d7", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the rails out to the theater lobby!/title.jpg" + } + ] + }, + { + "name": "Glide through the tree canopy!", + "id": "32126f86-aa44-45c3-b7ca-139d4e4df436", + "position": { + "x": 1073, + "y": 307 + }, + "end": { + "flying": true, + "x": 1043, + "y": 278 + }, + "images": [ + { + "type": "location", + "id": "cc56223a-9a21-48e3-b346-a8a71657287d", + "url": "https://mkw.techtangents.net/marker/pswitch/Glide through the tree canopy!/location.jpg" + }, + { + "type": "title", + "id": "d6d3917b-640e-4c5d-8a49-a452d851b7c5", + "url": "https://mkw.techtangents.net/marker/pswitch/Glide through the tree canopy!/title.jpg" + } + ] + }, + { + "name": "Race around a tribute to Ghost Valley 2!", + "id": "1f37483e-7d3f-485d-b772-a966d6375b45", + "position": { + "x": 1079, + "y": 204 + }, + "images": [ + { + "type": "location", + "id": "ee128046-cc3a-4aa9-80e0-d8c558074566", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Ghost Valley 2!/location.jpg" + }, + { + "type": "title", + "id": "7137d435-8bd8-4a4d-a842-f634620b4351", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Ghost Valley 2!/title.jpg" + } + ] + }, + { + "name": "Launch up, up, up into the clouds!", + "id": "08ee0060-f043-4976-9eac-d5d50e385546", + "position": { + "x": 1133, + "y": 804 + }, + "end": { + "flying": false, + "x": 1122, + "y": 733 + }, + "images": [ + { + "type": "location", + "id": "2efd06d5-9334-4b0f-b48b-e8bc1fb29db1", + "url": "https://mkw.techtangents.net/marker/pswitch/Launch up, up, up into the clouds!/location.jpg" + }, + { + "type": "title", + "id": "537f6966-9163-46b7-928a-a3b5f7cc9abb", + "url": "https://mkw.techtangents.net/marker/pswitch/Launch up, up, up into the clouds!/title.jpg" + } + ] + }, + { + "name": "Weave around the treacherous tornadoes!", + "id": "d7a4b781-bec4-46c7-83ac-ceab3860f378", + "position": { + "x": 557, + "y": 582 + }, + "end": { + "flying": false, + "x": 461, + "y": 554 + }, + "images": [ + { + "type": "location", + "id": "290f4b1c-d558-48af-a6eb-bb11b6154970", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave around the treacherous tornadoes!/location.jpg" + }, + { + "type": "title", + "id": "576aeb01-2c89-4760-91df-d86e52caedf2", + "url": "https://mkw.techtangents.net/marker/pswitch/Weave around the treacherous tornadoes!/title.jpg" + } + ] + }, + { + "name": "Put the flower petal to the metal!", + "id": "16169c78-bc9e-4d5c-af04-dfa5d5b7e128", + "position": { + "x": 1327, + "y": 790 + }, + "end": { + "flying": false, + "x": 1258, + "y": 752 + }, + "images": [ + { + "type": "location", + "id": "358c931d-f7ac-44f6-b6d0-3c9f0f87969c", + "url": "https://mkw.techtangents.net/marker/pswitch/Put the flower petal to the metal!/location.jpg" + }, + { + "type": "title", + "id": "e07dbee3-9ab3-459f-a997-f1c0dcdce000", + "url": "https://mkw.techtangents.net/marker/pswitch/Put the flower petal to the metal!/title.jpg" + } + ] + }, + { + "name": "Scoop up blue coins in the Skeeters' water hole!", + "id": "038c9b6d-cb50-40f1-aced-598bcd4b5252", + "position": { + "x": 950, + "y": 198 + }, + "end": { + "flying": false, + "x": 943, + "y": 188 + }, + "images": [ + { + "type": "location", + "id": "47b1fe8e-d246-4fa0-9cd3-3a63c50718e8", + "url": "https://mkw.techtangents.net/marker/pswitch/Scoop up blue coins in the Skeeters' water hole!/location.jpg" + }, + { + "type": "title", + "id": "264bb82e-44b7-4019-bdc3-ded70688da64", + "url": "https://mkw.techtangents.net/marker/pswitch/Scoop up blue coins in the Skeeters' water hole!/title.jpg" + } + ] + }, + { + "name": "Dodge the Chain Chomps as you ascend!", + "id": "bcf38770-932b-4ac5-861d-f58ae3aafd6f", + "position": { + "x": 555, + "y": 452 + }, + "end": { + "flying": false, + "x": 591, + "y": 437 + }, + "images": [ + { + "type": "location", + "id": "b68da1f9-8d4e-4d10-a9d6-f650b80521a1", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge the Chain Chomps as you ascend!/location.jpg" + }, + { + "type": "title", + "id": "b709fb81-aff3-470d-8355-7147e0f55adb", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge the Chain Chomps as you ascend!/title.jpg" + } + ] + }, + { + "name": "Race up to the very top of the crane!", + "id": "28c8a9fa-6620-47b4-8073-7474c4f4319f", + "position": { + "x": 794, + "y": 363 + }, + "end": { + "flying": true, + "x": 753, + "y": 319 + }, + "images": [ + { + "type": "location", + "id": "414d7b4a-f298-49ca-bdde-85ee7de85f71", + "url": "https://mkw.techtangents.net/marker/pswitch/Race up to the very top of the crane!/location.jpg" + }, + { + "type": "title", + "id": "a1d2ea7d-a552-443c-ae64-78baba6c870c", + "url": "https://mkw.techtangents.net/marker/pswitch/Race up to the very top of the crane!/title.jpg" + } + ] + }, + { + "name": "Save blue coins from the waves of the whirlpool!", + "id": "980691bb-71ea-499b-829c-b59cf011c031", + "position": { + "x": 1036, + "y": 746 + }, + "images": [ + { + "type": "location", + "id": "565ba068-fdfd-4f93-a784-413eeaaf5c42", + "url": "https://mkw.techtangents.net/marker/pswitch/Save blue coins from the waves of the whirlpool!/location.jpg" + }, + { + "type": "title", + "id": "c9dbf6d2-2c85-4319-9f0a-29c2bd79c63d", + "url": "https://mkw.techtangents.net/marker/pswitch/Save blue coins from the waves of the whirlpool!/title.jpg" + } + ] + }, + { + "name": "Surf the waves as Bulbers look on!", + "id": "f59ad301-3f1d-4847-85f1-df43987b7a45", + "position": { + "x": 1254, + "y": 591 + }, + "end": { + "flying": false, + "x": 1266, + "y": 536 + }, + "images": [ + { + "type": "location", + "id": "7c070fa1-ad8e-41a1-9d17-26b29ad23ad8", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-13_14-45-21.jpg" + } + ] + }, + { + "name": "Jump, jump, jump, jump, jump, jump, jump...jump!", + "id": "3c15586a-eabc-4a90-bd98-80146664741a", + "position": { + "x": 1118, + "y": 424 + }, + "end": { + "flying": false, + "x": 1110, + "y": 370 + }, + "images": [ + { + "type": "location", + "id": "1594a257-54bf-401a-a54c-c9066565a368", + "url": "https://mkw.techtangents.net/marker/pswitch/Jump, jump, jump, jump, jump, jump, jump...jump!/location.jpg" + }, + { + "type": "title", + "id": "96ed240f-16b9-4e9a-b58c-f5f9c1ca01c6", + "url": "https://mkw.techtangents.net/marker/pswitch/Jump, jump, jump, jump, jump, jump, jump...jump!/title.jpg" + } + ] + }, + { + "name": "Tear up the mountain pass before time runs out!", + "id": "cbcb5e18-3224-48f8-a22f-e98f03ed54fc", + "position": { + "x": 1013, + "y": 470 + }, + "end": { + "flying": false, + "x": 1030, + "y": 433 + }, + "images": [ + { + "type": "location", + "id": "556027f6-caec-47e6-90e6-d1b5bc39f8cd", + "url": "https://mkw.techtangents.net/marker/pswitch/Tear up the mountain pass before time runs out!/location.jpg" + }, + { + "type": "title", + "id": "6083ea57-2ae6-44be-9c83-59c6500a32e9", + "url": "https://mkw.techtangents.net/marker/pswitch/Tear up the mountain pass before time runs out!/title.jpg" + } + ] + }, + { + "name": "Grab all the snowmen's blue coins!", + "id": "69ebf379-372b-4b74-b269-c35a77191bb3", + "position": { + "x": 1142, + "y": 296 + }, + "end": { + "flying": false, + "x": 1118, + "y": 279 + }, + "images": [ + { + "type": "location", + "id": "f3d6729f-e024-4cd6-b6dd-a2447b780129", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab all the snowmen's blue coins!/location.jpg" + }, + { + "type": "title", + "id": "7aeab2fe-c3b6-4b2d-be19-3b5bc54b193e", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab all the snowmen's blue coins!/title.jpg" + } + ] + }, + { + "name": "Chase each Tokotoko to the next!", + "id": "d339b8b3-c136-4239-be6a-358372ba6d63", + "position": { + "x": 475, + "y": 754 + }, + "end": { + "flying": false, + "x": 466, + "y": 731 + }, + "images": [ + { + "type": "location", + "id": "4b33fd52-7df3-42b7-b46f-53a7a6f69fb9", + "url": "https://mkw.techtangents.net/marker/pswitch/Chase each Tokotoko to the next!/location.jpg" + }, + { + "type": "title", + "id": "3cd5f065-e236-4b26-ab85-7f0dc252d330", + "url": "https://mkw.techtangents.net/marker/pswitch/Chase each Tokotoko to the next!/title.jpg" + } + ] + }, + { + "name": "Climb the camera cranes! Ready... Action!", + "id": "a1b24a47-b386-467f-a810-a99f625a4888", + "position": { + "x": 1144, + "y": 192 + }, + "end": { + "flying": false, + "x": 1092, + "y": 149 + }, + "images": [ + { + "type": "location", + "id": "b0728c97-78c6-4555-8902-b278a138feae", + "url": "https://mkw.techtangents.net/marker/pswitch/Climb the camera cranes! Ready... Action!/location.jpg" + }, + { + "type": "title", + "id": "eacb802e-664d-4d24-9e03-28571c844c3e", + "url": "https://mkw.techtangents.net/marker/pswitch/Climb the camera cranes! Ready... Action!/title.jpg" + } + ] + }, + { + "name": "Travel downstream to Acorn Heights!", + "id": "4031ecc5-87b9-4839-85ce-ad46abd15cbb", + "position": { + "x": 1067, + "y": 263 + }, + "end": { + "flying": true, + "x": 945, + "y": 99 + }, + "images": [ + { + "type": "location", + "id": "0e35b72f-0ed7-43be-8ddc-ad173b3a2007", + "url": "https://mkw.techtangents.net/marker/pswitch/Travel downstream to Acorn Heights!/location.jpg" + }, + { + "type": "title", + "id": "3dc1f78d-c1f0-4161-9034-d48e2c0fa539", + "url": "https://mkw.techtangents.net/marker/pswitch/Travel downstream to Acorn Heights!/title.jpg" + } + ] + }, + { + "name": "Drift to the top of the twisting tower!", + "id": "7c5695e2-b360-4b46-b5a1-263cf206c613", + "position": { + "x": 524, + "y": 332 + }, + "end": { + "flying": false, + "x": 488, + "y": 311 + }, + "images": [ + { + "type": "location", + "id": "1f1dc984-8106-4a93-bbb3-c2ab25cb2853", + "url": "https://mkw.techtangents.net/marker/pswitch/Drift to the top of the twisting tower!/location.jpg" + }, + { + "type": "title", + "id": "c563c132-a734-4140-a635-ae0f5776a3b3", + "url": "https://mkw.techtangents.net/marker/pswitch/Drift to the top of the twisting tower!/title.jpg" + } + ] + }, + { + "name": "Cut across traffic and grab the blue coins!", + "id": "53d08682-456f-4919-b15d-faa3245b66bb", + "position": { + "x": 857, + "y": 335 + }, + "end": { + "flying": false, + "x": 855, + "y": 284 + }, + "images": [ + { + "type": "location", + "id": "db03792f-9138-405e-b0fd-950a85e5d358", + "url": "https://mkw.techtangents.net/marker/pswitch/Cut across traffic and grab the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "927c5d7a-5c19-4d3e-a57e-320cdc07b812", + "url": "https://mkw.techtangents.net/marker/pswitch/Cut across traffic and grab the blue coins!/title.jpg" + } + ] + }, + { + "name": "Traverse desert skies and grassy hills to the goal!", + "id": "c4f9685d-db34-43d5-90d5-60801e0b3695", + "position": { + "x": 466, + "y": 753 + }, + "end": { + "flying": false, + "x": 452, + "y": 761 + }, + "images": [ + { + "type": "location", + "id": "01efee05-47e0-4d43-bae3-5dff39989dd0", + "url": "https://mkw.techtangents.net/marker/pswitch/Traverse desert skies and grassy hills to the goal!/location.jpg" + }, + { + "type": "title", + "id": "7c224652-19bc-4754-9964-6d640d504037", + "url": "https://mkw.techtangents.net/marker/pswitch/Traverse desert skies and grassy hills to the goal!/title.jpg" + } + ] + }, + { + "name": "Soar to the VIP-seating tower!", + "id": "57eb9726-4066-472f-8452-9cee41b336b7", + "position": { + "x": 1422, + "y": 764 + }, + "end": { + "flying": true, + "x": 1338, + "y": 699 + }, + "images": [ + { + "type": "location", + "id": "55404694-d88b-479d-8e7e-18efc74e7ba4", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar to the VIP-seating tower!/location.jpg" + }, + { + "type": "title", + "id": "c13d440a-3917-40f3-b18b-a4abc981e3a8", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar to the VIP-seating tower!/title.jpg" + } + ] + }, + { + "name": "Go on a wilderness adventure and reach the goal!", + "id": "2d2e8157-8507-4fec-8c66-cc7d4d912bac", + "position": { + "x": 903, + "y": 289 + }, + "end": { + "flying": false, + "x": 911, + "y": 190 + }, + "images": [ + { + "type": "location", + "id": "61e5c545-1db2-4f20-8bc5-b21a861b8406", + "url": "https://mkw.techtangents.net/marker/pswitch/Go on a wilderness adventure and reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "f1ca1e94-4660-4174-ac05-0f63224ff025", + "url": "https://mkw.techtangents.net/marker/pswitch/Go on a wilderness adventure and reach the goal!/title.jpg" + } + ] + }, + { + "name": "Grab the blue coins and don't sink!", + "id": "907bd4ac-ddc5-4c48-a930-ebe068e22617", + "position": { + "x": 541, + "y": 466 + }, + "images": [ + { + "type": "location", + "id": "cccefacc-fe8d-466e-b980-37d2a104b0e9", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab the blue coins and don't sink!/location.jpg" + }, + { + "type": "title", + "id": "aa754ece-2f4e-4de5-967d-34a8daa1075b", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab the blue coins and don't sink!/title.jpg" + } + ] + }, + { + "name": "Pull off tricky jumps from column to column!", + "id": "c308a1d9-ea0d-4649-a3b8-65e44bf7ee99", + "position": { + "x": 512, + "y": 776 + }, + "end": { + "flying": false, + "x": 466, + "y": 763 + }, + "images": [ + { + "type": "location", + "id": "d6407758-2019-43d7-be54-78cd3b14aa4d", + "url": "https://mkw.techtangents.net/marker/pswitch/Pull off tricky jumps from column to column!/location.jpg" + }, + { + "type": "title", + "id": "b521f8ad-9269-4e2c-bcf4-41a0c2f0a1fb", + "url": "https://mkw.techtangents.net/marker/pswitch/Pull off tricky jumps from column to column!/title.jpg" + } + ] + }, + { + "name": "Gather up blue coins at the riverside safari!", + "id": "efb24011-829b-4ce3-ae5a-608828e5f327", + "position": { + "x": 1151, + "y": 766 + }, + "images": [ + { + "type": "location", + "id": "4e2eafa7-a7d7-4fd4-82ac-8855559b33c5", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather up blue coins at the riverside safari!/location.jpg" + }, + { + "type": "title", + "id": "07017e45-b993-492b-8660-d70475d7d96f", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather up blue coins at the riverside safari!/title.jpg" + } + ] + }, + { + "name": "Scale the slippery slope to reach the goal!", + "id": "62a13d66-5f57-48b8-a9ac-cbc3bd035eaf", + "position": { + "x": 1169, + "y": 331 + }, + "end": { + "flying": false, + "x": 1215, + "y": 266 + }, + "images": [ + { + "type": "location", + "id": "b62d2011-a4f8-42e1-bc54-8301f69d8d9a", + "url": "https://mkw.techtangents.net/marker/pswitch/Scale the slippery slope to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "3a10bd02-4c43-4cef-833f-c06e10b2b283", + "url": "https://mkw.techtangents.net/marker/pswitch/Scale the slippery slope to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Soar through the air and through the bridge!", + "id": "3d70b653-d3a2-4d37-8755-0210ade63259", + "position": { + "x": 698, + "y": 565 + }, + "end": { + "flying": true, + "x": 648, + "y": 584 + }, + "images": [ + { + "type": "location", + "id": "64be233b-4153-4f12-a788-35f4c0f2d579", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar through the air and through the bridge!/location.jpg" + }, + { + "type": "title", + "id": "3f0f70d9-a006-44cb-b73a-ed2d30ef4cf1", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar through the air and through the bridge!/title.jpg" + } + ] + }, + { + "name": "Endure a storm of acorns!", + "id": "7347e2fb-ec13-408b-b8ea-1495cde5dc54", + "position": { + "x": 945, + "y": 131 + }, + "end": { + "flying": false, + "x": 925, + "y": 80 + }, + "images": [ + { + "type": "location", + "id": "4bc95d57-6628-4a2b-9784-0d79d286320c", + "url": "https://mkw.techtangents.net/marker/pswitch/Endure a storm of acorns!/location.jpg" + }, + { + "type": "title", + "id": "dee83547-4a9c-4555-a810-5e6268b895b5", + "url": "https://mkw.techtangents.net/marker/pswitch/Endure a storm of acorns!/title.jpg" + } + ] + }, + { + "name": "Take to the skies high above Peach Stadium!", + "id": "e3702f43-cc5a-4032-85ef-c08b931d67e5", + "position": { + "x": 960, + "y": 638 + }, + "end": { + "flying": false, + "x": 935, + "y": 598 + }, + "images": [ + { + "type": "location", + "id": "75753a8d-8cad-41f9-8162-96933b4f25ab", + "url": "https://mkw.techtangents.net/marker/pswitch/Take to the skies high above Peach Stadium!/location.jpg" + }, + { + "type": "title", + "id": "a3fa7664-ffe2-4221-8082-2009dc414fea", + "url": "https://mkw.techtangents.net/marker/pswitch/Take to the skies high above Peach Stadium!/title.jpg" + } + ] + }, + { + "name": "Race along a risky shortcut!", + "id": "667b22f9-8c91-4577-96ed-ddef1c384dac", + "position": { + "x": 828, + "y": 513 + }, + "end": { + "flying": true, + "x": 739, + "y": 503 + }, + "images": [ + { + "type": "location", + "id": "456cd764-01f0-4f3a-891d-32fac053b770", + "url": "https://mkw.techtangents.net/marker/pswitch/Race along a risky shortcut!/location.jpg" + }, + { + "type": "title", + "id": "7169cb05-02bb-4d2e-8ff9-516d753c689a", + "url": "https://mkw.techtangents.net/marker/pswitch/Race along a risky shortcut!/title.jpg" + } + ] + }, + { + "name": "Race around a tribute to Vanilla Lake!", + "id": "54f32b1f-1438-4fe7-9a22-708b8e49332d", + "position": { + "x": 1416, + "y": 479 + }, + "images": [ + { + "type": "location", + "id": "1097c40d-1b95-4d45-bf88-05ac0eb1c223", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Vanilla Lake!/location.jpg" + }, + { + "type": "title", + "id": "ed15941c-5040-472d-9b09-4e0001675440", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Vanilla Lake!/title.jpg" + } + ] + }, + { + "name": "Trick your heart out in this challenging trial!", + "id": "6df2579a-5d9a-4cbc-aa09-eea968bd3085", + "position": { + "x": 999, + "y": 811 + }, + "end": { + "flying": true, + "x": 961, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "1f44bc8c-c19f-4ca7-b703-2ee39896c7bb", + "url": "https://mkw.techtangents.net/marker/pswitch/Trick your heart out in this challenging trial!/location.jpg" + }, + { + "type": "title", + "id": "25037676-a014-4906-95b2-a73eaf061372", + "url": "https://mkw.techtangents.net/marker/pswitch/Trick your heart out in this challenging trial!/title.jpg" + } + ] + }, + { + "name": "Take a long flight for a hole in one!", + "id": "3d55547b-29fc-400c-98d1-1a8e925957bc", + "position": { + "x": 489, + "y": 383 + }, + "end": { + "flying": true, + "x": 510, + "y": 433 + }, + "images": [ + { + "type": "location", + "id": "73816625-210b-4e8a-b223-7e36d66dfb62", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a long flight for a hole in one!/location.jpg" + }, + { + "type": "title", + "id": "5cfed261-16a9-4ce3-b32e-1a20c82a575b", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a long flight for a hole in one!/title.jpg" + } + ] + }, + { + "name": "Jump into a local amateur race!", + "id": "f08b522f-a355-41cf-b3a1-dea3d475e15c", + "position": { + "x": 902, + "y": 564 + }, + "images": [ + { + "type": "location", + "id": "e6c2e52a-6255-4f94-8f04-02f943fd525d", + "url": "https://mkw.techtangents.net/marker/pswitch/Jump into a local amateur race!/location.jpg" + }, + { + "type": "title", + "id": "7415a573-d382-401b-a2a6-0d07ef75a320", + "url": "https://mkw.techtangents.net/marker/pswitch/Jump into a local amateur race!/title.jpg" + } + ] + }, + { + "name": "Grab some easy blue coins...and one tricky one!", + "id": "131d22d7-b979-4642-941c-1e1679996d36", + "position": { + "x": 911, + "y": 534 + }, + "end": { + "flying": false, + "x": 896, + "y": 472 + }, + "images": [ + { + "type": "location", + "id": "dde0e30a-ef79-471c-b2c8-3f8c26c0aaf8", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab some easy blue coins...and one tricky one!/location.jpg" + }, + { + "type": "title", + "id": "14d90d0f-b412-4e0e-8c5c-4350a696c8cf", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab some easy blue coins...and one tricky one!/title.jpg" + } + ] + }, + { + "name": "Watch for Dragoneels while racing on the lake!", + "id": "34b3d095-10e3-48b7-8d10-dcbc93bf8920", + "position": { + "x": 1061, + "y": 661 + }, + "end": { + "flying": false, + "x": 1046, + "y": 624 + }, + "images": [ + { + "type": "location", + "id": "8494dcd2-ff3a-4ce7-97a8-38d5a3eeac0d", + "url": "https://mkw.techtangents.net/marker/pswitch/Watch for Dragoneels while racing on the lake!/location.jpg" + }, + { + "type": "title", + "id": "9e8cd843-e811-4bdb-ad1a-6a515ac779f1", + "url": "https://mkw.techtangents.net/marker/pswitch/Watch for Dragoneels while racing on the lake!/title.jpg" + } + ] + }, + { + "name": "Gather blue coins while penguins put on a parade!", + "id": "faebce9d-fb6a-4459-ad9a-c3c2e4c2a569", + "position": { + "x": 1412, + "y": 464 + }, + "end": { + "flying": false, + "x": 1380, + "y": 419 + }, + "images": [ + { + "type": "location", + "id": "187b6d39-c2eb-4c59-a443-82bdb9ab93f7", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins while penguins put on a parade!/location.jpg" + }, + { + "type": "title", + "id": "ab9e6b0b-b785-42c6-ad74-a0b470729319", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather blue coins while penguins put on a parade!/title.jpg" + } + ] + }, + { + "name": "Ride the pipes to get the launchpad's blue coins!", + "id": "d0cd8bc3-181f-49f7-bf4f-1d5751f9d2a9", + "position": { + "x": 819, + "y": 938 + }, + "end": { + "flying": false, + "x": 796, + "y": 903 + }, + "images": [ + { + "type": "location", + "id": "97499958-98d8-4562-8136-b5bd466e08e8", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the pipes to get the launchpad's blue coins!/location.jpg" + }, + { + "type": "title", + "id": "158a79c0-9fac-443f-933d-9168b7b840df", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the pipes to get the launchpad's blue coins!/title.jpg" + } + ] + }, + { + "name": "Test yourself in a tough time trial challenge!", + "id": "6ed3e639-4e0a-4b81-a477-fd036c3c1fc7", + "position": { + "x": 976, + "y": 275 + }, + "end": { + "flying": false, + "x": 946, + "y": 272 + }, + "images": [ + { + "type": "location", + "id": "3b0168dc-e26d-40dd-b55d-d484ebf312dc", + "url": "https://mkw.techtangents.net/marker/pswitch/Test yourself in a tough time trial challenge!/location.jpg" + }, + { + "type": "title", + "id": "a139e296-76c4-4630-87cc-522d3a28b457", + "url": "https://mkw.techtangents.net/marker/pswitch/Test yourself in a tough time trial challenge!/title.jpg" + } + ] + }, + { + "name": "Cool off at the oasis while grabbing blue coins!", + "id": "72fbdc61-c273-43cb-b898-4fefb0391d7b", + "position": { + "x": 547, + "y": 489 + }, + "end": { + "flying": false, + "x": 523, + "y": 479 + }, + "images": [ + { + "type": "location", + "id": "da9e1f50-1467-41d8-9255-6755856f8421", + "url": "https://mkw.techtangents.net/marker/pswitch/Cool off at the oasis while grabbing blue coins!/location.jpg" + }, + { + "type": "title", + "id": "ba344ba5-da88-42d0-8b85-84abdfb210d2", + "url": "https://mkw.techtangents.net/marker/pswitch/Cool off at the oasis while grabbing blue coins!/title.jpg" + } + ] + }, + { + "name": "Scope out the bazaar and scoop up blue coins!", + "id": "df729760-eb50-4d69-aa0f-3aaf4ca4e342", + "position": { + "x": 458, + "y": 547 + }, + "images": [ + { + "type": "location", + "id": "e367b1d3-5a95-43db-b199-718301821f13", + "url": "https://mkw.techtangents.net/marker/pswitch/Scope out the bazaar and scoop up blue coins!/location.jpg" + }, + { + "type": "title", + "id": "9e1f2424-025e-4fa9-8cf9-7debc40ea5d9", + "url": "https://mkw.techtangents.net/marker/pswitch/Scope out the bazaar and scoop up blue coins!/title.jpg" + } + ] + }, + { + "name": "Bounce along the cloud tops!", + "id": "c3f22cd6-64c4-43b8-9112-6f3bafc8c07b", + "position": { + "x": 1311, + "y": 905 + }, + "end": { + "flying": false, + "x": 1308, + "y": 886 + }, + "images": [ + { + "type": "location", + "id": "7da295a7-5f59-4c54-9d41-300b7fd370a1", + "url": "https://mkw.techtangents.net/marker/pswitch/Bounce along the cloud tops!/location.jpg" + }, + { + "type": "title", + "id": "e7383cb5-0971-4aca-b611-ecfc7076690e", + "url": "https://mkw.techtangents.net/marker/pswitch/Bounce along the cloud tops!/title.jpg" + } + ] + }, + { + "name": "Break through the Hammer Bros. blockade!", + "id": "7e2e6912-ea96-4d12-b470-28feee9c8fae", + "position": { + "x": 470, + "y": 530 + }, + "end": { + "flying": false, + "x": 461, + "y": 469 + }, + "images": [ + { + "type": "location", + "id": "f438280e-5482-4a1e-ac18-9b08fafe5afb", + "url": "https://mkw.techtangents.net/marker/pswitch/Break through the Hammer Bros. blockade!/location.jpg" + }, + { + "type": "title", + "id": "c4e5930e-9334-422a-87a6-eccc28184753", + "url": "https://mkw.techtangents.net/marker/pswitch/Break through the Hammer Bros. blockade!/title.jpg" + } + ] + }, + { + "name": "Follow that helicopter!", + "id": "5095b3f9-89ef-4305-9d0d-96f9a11b4ced", + "position": { + "x": 741, + "y": 656 + }, + "end": { + "flying": false, + "x": 764, + "y": 786 + }, + "images": [ + { + "type": "location", + "id": "bbbd7448-cdfe-41da-8a27-a7cf6f5b1917", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow that helicopter!/location.jpg" + }, + { + "type": "title", + "id": "a3e0586a-ded0-4b8e-bcbf-213c85eec3c3", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow that helicopter!/title.jpg" + } + ] + }, + { + "name": "Prove yourself in a SPECIAL test of skill #4!", + "id": "47d5612d-2a20-49dc-99c5-852e2df9b4bb", + "position": { + "x": 1154, + "y": 966 + }, + "end": { + "flying": false, + "x": 1102, + "y": 958 + }, + "images": [ + { + "type": "location", + "id": "438a14df-c1a2-44be-a18e-238641c2ac66", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 4!/location.jpg" + }, + { + "type": "title", + "id": "6a4b0dbc-3051-47b0-ab91-f2acd16dcfda", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 4!/title.jpg" + } + ] + }, + { + "name": "Pass by plenty of Pokeys partying on the path!", + "id": "2a49c57d-6669-477e-b837-927cc542abc2", + "position": { + "x": 531, + "y": 579 + }, + "end": { + "flying": false, + "x": 571, + "y": 552 + }, + "images": [ + { + "type": "location", + "id": "662a80bc-c404-4946-9918-9bc676a85f52", + "url": "https://mkw.techtangents.net/marker/pswitch/Pass by plenty of Pokeys partying on the path!/location.jpg" + }, + { + "type": "title", + "id": "d7cc74c4-2b15-4f5f-a466-44f476822daa", + "url": "https://mkw.techtangents.net/marker/pswitch/Pass by plenty of Pokeys partying on the path!/title.jpg" + } + ] + }, + { + "name": "Perform a bold escape through the ice-cream ravine!", + "id": "225707ad-24a8-4287-9e60-d557ed53344b", + "position": { + "x": 1412, + "y": 373 + }, + "end": { + "flying": true, + "x": 1401, + "y": 381 + }, + "images": [ + { + "type": "location", + "id": "276f1fb4-5753-4eca-bb41-82ab0be5f1cc", + "url": "https://mkw.techtangents.net/marker/pswitch/Perform a bold escape through the ice-cream ravine!/location.jpg" + }, + { + "type": "title", + "id": "54d36d7b-1270-40b6-bf12-75f0bc4f8e1f", + "url": "https://mkw.techtangents.net/marker/pswitch/Perform a bold escape through the ice-cream ravine!/title.jpg" + } + ] + }, + { + "name": "Brave the spooky forest in pursuit of blue coins!", + "id": "dd57c619-dd7b-4278-a9c3-b6d139363815", + "position": { + "x": 1096, + "y": 274 + }, + "end": { + "flying": false, + "x": 1052, + "y": 269 + }, + "images": [ + { + "type": "location", + "id": "583258d0-7234-4e9c-b261-3be454a32f62", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the spooky forest in pursuit of blue coins!/location.jpg" + }, + { + "type": "title", + "id": "1bdfd07b-94f6-476c-88d4-ab5c9f6a75e2", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the spooky forest in pursuit of blue coins!/title.jpg" + } + ] + }, + { + "name": "Overcome the sinking feeling to collect blue coins!", + "id": "abab4c9f-96a9-4289-9c5c-f219ca90be79", + "position": { + "x": 1090, + "y": 220 + }, + "end": { + "flying": false, + "x": 1098, + "y": 155 + }, + "images": [ + { + "type": "location", + "id": "d120d96a-12e6-4dec-84c6-81dbdafed491", + "url": "https://mkw.techtangents.net/marker/pswitch/Overcome the sinking feeling to collect blue coins!/location.jpg" + }, + { + "type": "title", + "id": "4694fb75-1ee0-4841-9d0a-1160d6881d04", + "url": "https://mkw.techtangents.net/marker/pswitch/Overcome the sinking feeling to collect blue coins!/title.jpg" + } + ] + }, + { + "name": "Gather the blue coins around the control tower!", + "id": "26294916-dbc6-4357-9542-bbea8f3311d4", + "position": { + "x": 954, + "y": 634 + }, + "end": { + "flying": false, + "x": 932, + "y": 612 + }, + "images": [ + { + "type": "location", + "id": "34148c7e-656f-4297-b436-badea203be2b", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather the blue coins around the control tower!/location.jpg" + }, + { + "type": "title", + "id": "99e5d383-46ef-4c40-916d-d549fe315139", + "url": "https://mkw.techtangents.net/marker/pswitch/Gather the blue coins around the control tower!/title.jpg" + } + ] + }, + { + "name": "Blitz to the beach! Go, go, go!", + "id": "a1c871bd-4301-457c-aef2-2c6775a0d618", + "position": { + "x": 1226, + "y": 729 + }, + "end": { + "flying": false, + "x": 1280, + "y": 726 + }, + "images": [ + { + "type": "location", + "id": "ecaf9bf3-1895-43e7-afcd-93e8e35f0935", + "url": "https://mkw.techtangents.net/marker/pswitch/Blitz to the beach! Go, go, go!/location.jpg" + }, + { + "type": "title", + "id": "221edbb5-223e-40ba-bfab-1a85fb0ef82e", + "url": "https://mkw.techtangents.net/marker/pswitch/Blitz to the beach! Go, go, go!/title.jpg" + } + ] + }, + { + "name": "Race through the figure-eight time trial!", + "id": "d88f8cb9-22f5-4f48-9db5-a47f34b780ee", + "position": { + "x": 982, + "y": 712 + }, + "images": [ + { + "type": "location", + "id": "3cf381c8-b32b-4f4c-817f-dd3515f03bf1", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through the figure-eight time trial!/location.jpg" + }, + { + "type": "title", + "id": "0603b1c9-d828-47df-bcb5-ff61e86d9b69", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through the figure-eight time trial!/title.jpg" + } + ] + }, + { + "name": "Ride the urban railings to collect blue coins!", + "id": "bd070319-55d3-403f-bdb7-5318b160d5aa", + "position": { + "x": 810, + "y": 761 + }, + "end": { + "flying": false, + "x": 796, + "y": 757 + }, + "images": [ + { + "type": "location", + "id": "8b90e9e0-988b-4d3a-829a-b7277cd13344", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the urban railings to collect blue coins!/location.jpg" + }, + { + "type": "title", + "id": "d4328095-5c04-4a91-b7a0-3f0f91c4ff63", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the urban railings to collect blue coins!/title.jpg" + } + ] + }, + { + "name": "Tackle a sandy test of endurance!", + "id": "9c38bd0f-e15c-4739-9da0-e9524639d4d9", + "position": { + "x": 491, + "y": 693 + }, + "end": { + "flying": false, + "x": 458, + "y": 556 + }, + "images": [ + { + "type": "location", + "id": "58e609aa-a645-4619-bb6e-429d9674c1aa", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle a sandy test of endurance!/location.jpg" + }, + { + "type": "title", + "id": "de86a063-319d-4c8e-9bbd-7139c69b3cdf", + "url": "https://mkw.techtangents.net/marker/pswitch/Tackle a sandy test of endurance!/title.jpg" + } + ] + }, + { + "name": "Use a delicate touch to reach the Goal Pole!", + "id": "65fc0da4-5c0d-44a0-8d24-32deb90f0ce6", + "position": { + "x": 926, + "y": 727 + }, + "end": { + "flying": false, + "x": 970, + "y": 698 + }, + "images": [ + { + "type": "location", + "id": "49f819c9-f94f-4104-a272-58169442ec0e", + "url": "https://mkw.techtangents.net/marker/pswitch/Use a delicate touch to reach the Goal Pole!/location.jpg" + }, + { + "type": "title", + "id": "b55ad5ae-6d2a-47e5-979e-c2cd64bea379", + "url": "https://mkw.techtangents.net/marker/pswitch/Use a delicate touch to reach the Goal Pole!/title.jpg" + } + ] + }, + { + "name": "Rescue blue coins from the sands!", + "id": "9fb69ba6-51f4-4ff0-b68d-0a20b2b52ee6", + "position": { + "x": 531, + "y": 438 + }, + "end": { + "flying": false, + "x": 607, + "y": 430 + }, + "images": [ + { + "type": "location", + "id": "d5f9d9ca-901f-4943-b38a-c8ebee1cc970", + "url": "https://mkw.techtangents.net/marker/pswitch/Rescue blue coins from the sands!/location.jpg" + }, + { + "type": "title", + "id": "3179b1e7-4f45-4690-9513-71b2019abb14", + "url": "https://mkw.techtangents.net/marker/pswitch/Rescue blue coins from the sands!/title.jpg" + } + ] + }, + { + "name": "Chase the train and follow the tracks!", + "id": "d5aac215-9f49-4548-beab-80cbbe2bbd51", + "position": { + "x": 913, + "y": 321 + }, + "end": { + "flying": false, + "x": 899, + "y": 230 + }, + "images": [ + { + "type": "location", + "id": "9c797414-fbbc-49a5-a5af-883e9a048ee0", + "url": "https://mkw.techtangents.net/marker/pswitch/Chase the train and follow the tracks!/location.jpg" + }, + { + "type": "title", + "id": "43b5ba15-09d3-4f1a-8dc1-e746e5e1f715", + "url": "https://mkw.techtangents.net/marker/pswitch/Chase the train and follow the tracks!/title.jpg" + } + ] + }, + { + "name": "Rail ride the ropes to the top!", + "id": "d7d33ba9-8e2c-4070-b313-3c276a1e9378", + "position": { + "x": 958, + "y": 895 + }, + "end": { + "flying": true, + "x": 893, + "y": 867 + }, + "images": [ + { + "type": "location", + "id": "1fbc527b-d943-417a-929a-57c441f83866", + "url": "https://mkw.techtangents.net/marker/pswitch/Rail ride the ropes to the top!/location.jpg" + }, + { + "type": "title", + "id": "fbf325f6-04f8-46aa-9548-05f6ef395392", + "url": "https://mkw.techtangents.net/marker/pswitch/Rail ride the ropes to the top!/title.jpg" + } + ] + }, + { + "name": "Race upstream through the river valley!", + "id": "98caf34f-1223-49af-935b-da3e8103215e", + "position": { + "x": 612, + "y": 838 + }, + "end": { + "flying": false, + "x": 585, + "y": 855 + }, + "images": [ + { + "type": "location", + "id": "b7888439-e715-40d4-a48f-aa557954a6eb", + "url": "https://mkw.techtangents.net/marker/pswitch/Race upstream through the river valley!/location.jpg" + }, + { + "type": "title", + "id": "82a1402c-71fe-45e3-88c2-90bb3c68c5ff", + "url": "https://mkw.techtangents.net/marker/pswitch/Race upstream through the river valley!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins in the dried-up oasis!", + "id": "f9e8bd87-6aec-4156-bcdb-7798a277a346", + "position": { + "x": 499, + "y": 666 + }, + "end": { + "flying": false, + "x": 489, + "y": 647 + }, + "images": [ + { + "type": "location", + "id": "ba4b5942-11d7-4496-ada3-91c8c941dc42", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins in the dried-up oasis!/location.jpg" + }, + { + "type": "title", + "id": "a28215fe-254f-42e8-b4ea-e8011cfcbb96", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins in the dried-up oasis!/title.jpg" + } + ] + }, + { + "name": "Reach the top of the rotating ice-cream-cone!", + "id": "dc112bc1-7ef2-4e34-94e6-000b85f787de", + "position": { + "x": 1425, + "y": 392 + }, + "end": { + "flying": true, + "x": 1375, + "y": 317 + }, + "images": [ + { + "type": "location", + "id": "6f8f9f52-36d9-44d9-b9fc-e66e057b1aa5", + "url": "https://mkw.techtangents.net/marker/pswitch/Reach the top of the rotating ice-cream-cone!/location.jpg" + }, + { + "type": "title", + "id": "e6b1c0c4-c3fb-4bf3-8602-0d098b6a2770", + "url": "https://mkw.techtangents.net/marker/pswitch/Reach the top of the rotating ice-cream-cone!/title.jpg" + } + ] + }, + { + "name": "Collect coins while pulling off high-flying stunts!", + "id": "43db7de9-e91c-4904-a5c6-352048553b2e", + "position": { + "x": 597, + "y": 696 + }, + "end": { + "flying": true, + "x": 599, + "y": 682 + }, + "images": [ + { + "type": "location", + "id": "2c40fa92-6d07-4cca-91a6-d75792296565", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect coins while pulling off high-flying stunts!/location.jpg" + }, + { + "type": "title", + "id": "a38e09c2-6a8b-4098-b469-01f79e1782ee", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect coins while pulling off high-flying stunts!/title.jpg" + } + ] + }, + { + "name": "Prove yourself in a SPECIAL test of skill #1!", + "id": "266d8d08-238b-4361-8348-4950d53cc721", + "position": { + "x": 855, + "y": 675 + }, + "end": { + "flying": false, + "x": 828, + "y": 629 + }, + "images": [ + { + "type": "location", + "id": "9cb28711-9d77-478c-8c29-c657599f180a", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 1!/location.jpg" + }, + { + "type": "title", + "id": "5693a30a-cd1c-4d02-93d1-a0a0e3a791ab", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 1!/title.jpg" + } + ] + }, + { + "name": "Race down the river and escape to the sea!", + "id": "a9c08bb2-4ca4-43fd-b36b-812339f40958", + "position": { + "x": 534, + "y": 533 + }, + "end": { + "flying": false, + "x": 423, + "y": 477 + }, + "images": [ + { + "type": "location", + "id": "e0851160-a7ca-409d-8b57-c0cc222f0b3d", + "url": "https://mkw.techtangents.net/marker/pswitch/Race down the river and escape to the sea!/location.jpg" + }, + { + "type": "title", + "id": "39aa49ce-3775-459a-abc1-25c9f047aefd", + "url": "https://mkw.techtangents.net/marker/pswitch/Race down the river and escape to the sea!/title.jpg" + } + ] + }, + { + "name": "Show your skill by gliding a really long way!", + "id": "a8287531-fd42-4558-a938-d98995284287", + "position": { + "x": 1208, + "y": 404 + }, + "end": { + "flying": true, + "x": 1172, + "y": 483 + }, + "images": [ + { + "type": "location", + "id": "7774d66e-255c-4a57-a2f6-6d5eed2893da", + "url": "https://mkw.techtangents.net/marker/pswitch/Show your skill by gliding a really long way!/location.jpg" + }, + { + "type": "title", + "id": "1f8783f7-c2f3-4e86-b639-7951bb83e7c0", + "url": "https://mkw.techtangents.net/marker/pswitch/Show your skill by gliding a really long way!/title.jpg" + } + ] + }, + { + "name": "Drop into the Shy Guy snowboarding competition!", + "id": "eab30557-8c32-489e-8ec5-21198f726661", + "position": { + "x": 1281, + "y": 474 + }, + "end": { + "flying": false, + "x": 1227, + "y": 429 + }, + "images": [ + { + "type": "location", + "id": "5228df8a-fcdc-448d-bba7-defb1b8cf1b3", + "url": "https://mkw.techtangents.net/marker/pswitch/Drop into the Shy Guy snowboarding competition!/location.jpg" + }, + { + "type": "title", + "id": "0e3e87e3-afbc-4f02-a7d6-2aeb4a9c3c84", + "url": "https://mkw.techtangents.net/marker/pswitch/Drop into the Shy Guy snowboarding competition!/title.jpg" + } + ] + }, + { + "name": "Round up blue coins at the riverside campsite!", + "id": "740e4589-76f1-4ea0-877e-584edc50149a", + "position": { + "x": 921, + "y": 186 + }, + "end": { + "flying": false, + "x": 888, + "y": 145 + }, + "images": [ + { + "type": "location", + "id": "65401cf8-e32b-44de-922d-1ecab689f6fe", + "url": "https://mkw.techtangents.net/marker/pswitch/Round up blue coins at the riverside campsite!/location.jpg" + }, + { + "type": "title", + "id": "88e42552-700b-49e0-8ebf-8ed191ab7b6c", + "url": "https://mkw.techtangents.net/marker/pswitch/Round up blue coins at the riverside campsite!/title.jpg" + } + ] + }, + { + "name": "Ride the rail! Ride the line! Get to the goal!", + "id": "27c42e9a-4004-4813-89f3-09d6210ed939", + "position": { + "x": 1058, + "y": 240 + }, + "end": { + "flying": false, + "x": 1041, + "y": 185 + }, + "images": [ + { + "type": "location", + "id": "79517833-995b-4314-8133-c331d845ee6a", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the rail! Ride the line! Get to the goal!/location.jpg" + }, + { + "type": "title", + "id": "e84d6ad9-0a8d-4789-84d0-4dba7a9f8433", + "url": "https://mkw.techtangents.net/marker/pswitch/Ride the rail! Ride the line! Get to the goal!/title.jpg" + } + ] + }, + { + "name": "Trick your heart out to reach the mountaintop!", + "id": "956975fa-eaf2-4d67-909d-3da884c4e057", + "position": { + "x": 1055, + "y": 388 + }, + "end": { + "flying": true, + "x": 960, + "y": 376 + }, + "images": [ + { + "type": "location", + "id": "89775d0a-60d6-4c99-aafd-a0232ac0f866", + "url": "https://mkw.techtangents.net/marker/pswitch/Trick your heart out to reach the mountaintop!/location.jpg" + }, + { + "type": "title", + "id": "a9fff7f0-b2dd-4b67-9ea7-1c0211765975", + "url": "https://mkw.techtangents.net/marker/pswitch/Trick your heart out to reach the mountaintop!/title.jpg" + } + ] + }, + { + "name": "Race around a tribute to Choco Island 2!", + "id": "c424be71-42ad-46cb-8353-df964b396dea", + "position": { + "x": 748, + "y": 600 + }, + "images": [ + { + "type": "location", + "id": "f55e371b-767f-4e6d-b271-57c8c9bf4133", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Choco Island 2!/location.jpg" + }, + { + "type": "title", + "id": "7e521a2c-e807-46e2-84f2-1d6fb45f1482", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Choco Island 2!/title.jpg" + } + ] + }, + { + "name": "Show Shy Guys how to race downriver!", + "id": "46873198-1ba2-4e8a-a580-f1b61eb3b069", + "position": { + "x": 750, + "y": 497 + }, + "end": { + "flying": false, + "x": 658, + "y": 547 + }, + "images": [ + { + "type": "location", + "id": "ad8fb3e7-99fc-4a5a-ae67-d8638881de93", + "url": "https://mkw.techtangents.net/marker/pswitch/Show Shy Guys how to race downriver!/location.jpg" + }, + { + "type": "title", + "id": "8106a493-ed70-4d00-9181-592cad9bfc15", + "url": "https://mkw.techtangents.net/marker/pswitch/Show Shy Guys how to race downriver!/title.jpg" + } + ] + }, + { + "name": "Race around a tribute to Ghost Valley 3!", + "id": "6e402a6b-907b-4da5-973f-5e4694209ec4", + "position": { + "x": 1145, + "y": 215 + }, + "images": [ + { + "type": "location", + "id": "2a3a64a9-95a7-4d12-af23-65b49bc932e6", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Ghost Valley 3!/location.jpg" + }, + { + "type": "title", + "id": "142bf384-e315-4f6a-8b21-dd12141662d4", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Ghost Valley 3!/title.jpg" + } + ] + }, + { + "name": "Maneuver through the leisurely moose herd!", + "id": "d5c1257e-c221-4dd2-a510-60f0d4ba6fbf", + "position": { + "x": 1010, + "y": 157 + }, + "end": { + "flying": false, + "x": 997, + "y": 152 + }, + "images": [ + { + "type": "location", + "id": "e13f80ff-608c-4f4b-a516-52091e07d0cc", + "url": "https://mkw.techtangents.net/marker/pswitch/Maneuver through the leisurely moose herd!/location.jpg" + }, + { + "type": "title", + "id": "d5289cb7-4eab-47d3-9268-758558c0cebb", + "url": "https://mkw.techtangents.net/marker/pswitch/Maneuver through the leisurely moose herd!/title.jpg" + } + ] + }, + { + "name": "Focus on the blue coins in a sea of gold!", + "id": "52ea654b-c1f2-45d6-b0f3-74818fc10b0f", + "position": { + "x": 810, + "y": 553 + }, + "end": { + "flying": false, + "x": 775, + "y": 540 + }, + "images": [ + { + "type": "location", + "id": "75646804-2962-4005-9ef7-80d863604130", + "url": "https://mkw.techtangents.net/marker/pswitch/Focus on the blue coins in a sea of gold!/location.jpg" + }, + { + "type": "title", + "id": "cc9e8f22-81b3-4507-b92d-56f49d19f8ac", + "url": "https://mkw.techtangents.net/marker/pswitch/Focus on the blue coins in a sea of gold!/title.jpg" + } + ] + }, + { + "name": "Prove yourself in a SPECIAL test of skill #3!", + "id": "ec22f7d3-b312-4b28-803a-afc9aead7bf0", + "position": { + "x": 1114, + "y": 396 + }, + "end": { + "flying": false, + "x": 1094, + "y": 389 + }, + "images": [ + { + "type": "location", + "id": "c856436a-9932-49b6-b60a-2b1d2ccc81c6", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 3!/location.jpg" + }, + { + "type": "title", + "id": "9b958d4f-6c1b-43fb-8c09-22b7d7bb41c0", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 3!/title.jpg" + } + ] + }, + { + "name": "Charge through the defensive line!", + "id": "ea73d02c-5528-47ff-b4ba-74c210ea6811", + "position": { + "x": 655, + "y": 726 + }, + "end": { + "flying": false, + "x": 660, + "y": 663 + }, + "images": [ + { + "type": "location", + "id": "1b6b1c4c-ee48-4a6d-beba-a390fa056d42", + "url": "https://mkw.techtangents.net/marker/pswitch/Charge through the defensive line!/location.jpg" + }, + { + "type": "title", + "id": "8869f04b-996f-4947-9561-3e6ce954a406", + "url": "https://mkw.techtangents.net/marker/pswitch/Charge through the defensive line!/title.jpg" + } + ] + }, + { + "name": "Perform tricks without plunging into lava pools!", + "id": "f9d835e9-21f7-44f3-93b7-461eca81b9c3", + "position": { + "x": 663, + "y": 191 + }, + "end": { + "flying": false, + "x": 631, + "y": 193 + }, + "images": [ + { + "type": "location", + "id": "48d009f5-d2dc-4be9-b37e-8534a7d7295a", + "url": "https://mkw.techtangents.net/marker/pswitch/Perform tricks without plunging into lava pools!/location.jpg" + }, + { + "type": "title", + "id": "e9a364c6-06f1-4c90-9106-0ffb3d089bba", + "url": "https://mkw.techtangents.net/marker/pswitch/Perform tricks without plunging into lava pools!/title.jpg" + } + ] + }, + { + "name": "Prove yourself in a SPECIAL test of skill #6!", + "id": "21df585b-28d5-43be-9286-946e8746c042", + "position": { + "x": 658, + "y": 820 + }, + "end": { + "flying": false, + "x": 617, + "y": 792 + }, + "images": [ + { + "type": "location", + "id": "07cc5b4f-0a00-452a-89b1-72251edd84d1", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 6!/location.jpg" + }, + { + "type": "title", + "id": "0fcfc831-6235-463e-8194-844e3a21a2b9", + "url": "https://mkw.techtangents.net/marker/pswitch/Prove yourself in a SPECIAL test of skill 6!/title.jpg" + } + ] + }, + { + "name": "Trust that there's a blue-coin reason for the pipe!", + "id": "95ea79ff-ea15-4610-a1d0-76f8cec484c7", + "position": { + "x": 958, + "y": 469 + }, + "end": { + "flying": false, + "x": 949, + "y": 440 + }, + "images": [ + { + "type": "location", + "id": "f84d979e-35fd-41b8-a426-e02e5ce1995b", + "url": "https://mkw.techtangents.net/marker/pswitch/Trust that there's a blue-coin reason for the pipe!/location.jpg" + }, + { + "type": "title", + "id": "cc7c113d-91a3-4856-996e-0d5cce718377", + "url": "https://mkw.techtangents.net/marker/pswitch/Trust that there's a blue-coin reason for the pipe!/title.jpg" + } + ] + }, + { + "name": "Hitch a ride on the runaway truck!", + "id": "0bbf99b4-fd56-4b02-8460-7fe747aa234e", + "position": { + "x": 1074, + "y": 880 + }, + "end": { + "flying": false, + "x": 1104, + "y": 812 + }, + "images": [ + { + "type": "location", + "id": "cf04217b-4593-4581-a1df-ea36af90e27b", + "url": "https://mkw.techtangents.net/marker/pswitch/Hitch a ride on the runaway truck!/location.jpg" + }, + { + "type": "title", + "id": "b990f7eb-8333-4581-88f5-559d07c3883b", + "url": "https://mkw.techtangents.net/marker/pswitch/Hitch a ride on the runaway truck!/title.jpg" + } + ] + }, + { + "name": "Rely on tornado tailwinds to reach the Goal Pole!", + "id": "33e60dab-452b-4bf0-b811-462a2fe951ae", + "position": { + "x": 675, + "y": 682 + }, + "end": { + "flying": true, + "x": 672, + "y": 715 + }, + "images": [ + { + "type": "location", + "id": "141f4e96-779d-4b88-97e0-11f55454ad1c", + "url": "https://mkw.techtangents.net/marker/pswitch/Rely on tornado tailwinds to reach the Goal Pole!/location.jpg" + }, + { + "type": "title", + "id": "3f09bf67-264f-44d0-913e-8a73533e91e1", + "url": "https://mkw.techtangents.net/marker/pswitch/Rely on tornado tailwinds to reach the Goal Pole!/title.jpg" + } + ] + }, + { + "name": "Make a path through the back-road route!", + "id": "322df668-3fa8-44c5-90de-e1a694e315c9", + "position": { + "x": 652, + "y": 873 + }, + "end": { + "flying": false, + "x": 671, + "y": 870 + }, + "images": [ + { + "type": "location", + "id": "a1dda724-23a3-47eb-ae96-3b38aa59f29e", + "url": "https://mkw.techtangents.net/marker/pswitch/Make a path through the back-road route!/location.jpg" + }, + { + "type": "title", + "id": "bc385918-5def-40b8-ab25-9c5126f4daa9", + "url": "https://mkw.techtangents.net/marker/pswitch/Make a path through the back-road route!/title.jpg" + } + ] + }, + { + "name": "Hitch a ride in the helicopter and flee a fiery fate!", + "id": "3d8fc2c0-8194-4874-8099-e031bf341ed3", + "position": { + "x": 666, + "y": 240 + }, + "end": { + "flying": true, + "x": 664, + "y": 294 + }, + "images": [ + { + "type": "location", + "id": "d5675e07-5c7c-446e-95d0-e81b810d35af", + "url": "https://mkw.techtangents.net/marker/pswitch/Hitch a ride in the helicopter and flee a fiery fate!/location.jpg" + }, + { + "type": "title", + "id": "233e0ba6-45b5-4ec9-8a94-8aac7cdfb696", + "url": "https://mkw.techtangents.net/marker/pswitch/Hitch a ride in the helicopter and flee a fiery fate!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins in the hot springs!", + "id": "50d80c08-3fb4-4b80-bf98-1423c841df8d", + "position": { + "x": 785, + "y": 283 + }, + "end": { + "flying": false, + "x": 770, + "y": 235 + }, + "images": [ + { + "type": "location", + "id": "63eebc85-6782-430d-860b-6faba5d4a366", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins in the hot springs!/location.jpg" + }, + { + "type": "title", + "id": "7b735c36-4b5e-432f-8554-49c5cc2d10f7", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins in the hot springs!/title.jpg" + } + ] + }, + { + "name": "Brave the haunted forest!", + "id": "9f91c7bd-8137-4167-b142-3152c872216c", + "position": { + "x": 1110, + "y": 249 + }, + "end": { + "flying": true, + "x": 993, + "y": 230 + }, + "images": [ + { + "type": "location", + "id": "991035ec-3f93-47b5-8d06-f5c386cc283a", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the haunted forest!/location.jpg" + }, + { + "type": "title", + "id": "d0052502-516e-472c-b698-eb9f19d3c07e", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the haunted forest!/title.jpg" + } + ] + }, + { + "name": "Race through a storm of rain and coins!", + "id": "04b1b76d-3da7-4f57-809a-c0cb6f756973", + "position": { + "x": 482, + "y": 634 + }, + "end": { + "flying": false, + "x": 447, + "y": 555 + }, + "images": [ + { + "type": "location", + "id": "587561bd-e23c-4233-b330-c8b4858592f1", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through a storm of rain and coins!/location.jpg" + }, + { + "type": "title", + "id": "6a4bed7c-1ba4-4676-82b1-c9ceb5c2a1bd", + "url": "https://mkw.techtangents.net/marker/pswitch/Race through a storm of rain and coins!/title.jpg" + } + ] + }, + { + "name": "Use the ancient shipwrecks to get a boost!", + "id": "c6fbf00d-a2b4-4e9f-b5b8-daf51771f3d7", + "position": { + "x": 443, + "y": 657 + }, + "end": { + "flying": false, + "x": 383, + "y": 702 + }, + "images": [ + { + "type": "location", + "id": "22422346-8c67-43cf-b140-8a30b7b2e90d", + "url": "https://mkw.techtangents.net/marker/pswitch/Use the ancient shipwrecks to get a boost!/location.jpg" + }, + { + "type": "title", + "id": "7534040d-8c5e-485c-ab94-9efbcecf70ce", + "url": "https://mkw.techtangents.net/marker/pswitch/Use the ancient shipwrecks to get a boost!/title.jpg" + } + ] + }, + { + "name": "Dash, dash, dash through the thick chocolate!", + "id": "226e68ec-a469-43fa-8182-2da04d7d1078", + "position": { + "x": 790, + "y": 557 + }, + "end": { + "flying": false, + "x": 778, + "y": 513 + }, + "images": [ + { + "type": "location", + "id": "0854d566-ba08-4395-afcd-2dc0143ece2a", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash, dash, dash through the thick chocolate!/location.jpg" + }, + { + "type": "title", + "id": "e21ef8b2-739f-48c7-8b4e-e08cf5048b17", + "url": "https://mkw.techtangents.net/marker/pswitch/Dash, dash, dash through the thick chocolate!/title.jpg" + } + ] + }, + { + "name": "Hop from rail to rail to grab the blue coins!", + "id": "a7c61ca3-28b0-45c2-9050-9b238b0e1854", + "position": { + "x": 758, + "y": 347 + }, + "end": { + "flying": false, + "x": 783, + "y": 314 + }, + "images": [ + { + "type": "location", + "id": "8a4d997f-de34-4540-acd8-97a7082d3fe2", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop from rail to rail to grab the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "eadb64e4-7cbe-484a-945e-1e50dbe22071", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop from rail to rail to grab the blue coins!/title.jpg" + } + ] + }, + { + "name": "Gracefully grab blue coins amongst falling leaves!", + "id": "504d820d-b089-4649-81a5-573648e33e39", + "position": { + "x": 1128, + "y": 525 + }, + "end": { + "flying": true, + "x": 1060, + "y": 535 + }, + "images": [ + { + "type": "location", + "id": "5b82c06c-1d47-43f5-adc4-1c96e0bf5f64", + "url": "https://mkw.techtangents.net/marker/pswitch/Gracefully grab blue coins amongst falling leaves!/location.jpg" + }, + { + "type": "title", + "id": "b9b62445-50fc-4aa4-8288-35c946454fd7", + "url": "https://mkw.techtangents.net/marker/pswitch/Gracefully grab blue coins amongst falling leaves!/title.jpg" + } + ] + }, + { + "name": "Dodge debris and drift across the waterfall!", + "id": "4c0e5c32-caf4-471e-974d-6ba3a95bea84", + "position": { + "x": 1130, + "y": 775 + }, + "end": { + "flying": false, + "x": 1098, + "y": 730 + }, + "images": [ + { + "type": "location", + "id": "17cef3ea-4607-4c7d-a3d4-0750aac81cb4", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge debris and drift across the waterfall!/location.jpg" + }, + { + "type": "title", + "id": "ac1ca97d-6a2b-4e12-b2bc-d6dcec45a602", + "url": "https://mkw.techtangents.net/marker/pswitch/Dodge debris and drift across the waterfall!/title.jpg" + } + ] + }, + { + "name": "Follow the rings along the rooftops!", + "id": "a9fb7e03-7457-476c-ab84-7380cba063b5", + "position": { + "x": 647, + "y": 490 + }, + "end": { + "flying": false, + "x": 622, + "y": 414 + }, + "images": [ + { + "type": "location", + "id": "4b87acc7-e8cd-4d11-9c95-e7f18a9371e7", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the rings along the rooftops!/location.jpg" + }, + { + "type": "title", + "id": "b569499c-65a3-4661-8c87-dc3f53e1ab18", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the rings along the rooftops!/title.jpg" + } + ] + }, + { + "name": "Wiggle past the Wigglers on your way to the goal!", + "id": "09adfe9d-5304-425b-a25f-ec4d8084a4eb", + "position": { + "x": 922, + "y": 134 + }, + "end": { + "flying": true, + "x": 925, + "y": 83 + }, + "images": [ + { + "type": "location", + "id": "59de6dd4-86c7-4e2b-89da-3086b7d6a00a", + "url": "https://mkw.techtangents.net/marker/pswitch/Wiggle past the Wigglers on your way to the goal!/location.jpg" + }, + { + "type": "title", + "id": "59409bb0-9a2d-44c7-bee7-69c5655ab454", + "url": "https://mkw.techtangents.net/marker/pswitch/Wiggle past the Wigglers on your way to the goal!/title.jpg" + } + ] + }, + { + "name": "Show off a very dangerous way to board a train!", + "id": "88eb6b48-7b17-4253-b319-2a94a9861fbe", + "position": { + "x": 1057, + "y": 565 + }, + "end": { + "flying": false, + "x": 1073, + "y": 605 + }, + "images": [ + { + "type": "location", + "id": "89e6b811-4c00-45ce-8e1b-446801957bb8", + "url": "https://mkw.techtangents.net/marker/pswitch/Show off a very dangerous way to board a train!/location.jpg" + }, + { + "type": "title", + "id": "c8a6eb61-5b85-4566-840d-070734238b14", + "url": "https://mkw.techtangents.net/marker/pswitch/Show off a very dangerous way to board a train!/title.jpg" + } + ] + }, + { + "name": "Overtake the train crossing the truss bridge!", + "id": "5c4438e8-55dc-467f-81a3-26fbf107fb8d", + "position": { + "x": 606, + "y": 485 + }, + "end": { + "flying": false, + "x": 575, + "y": 519 + }, + "images": [ + { + "type": "location", + "id": "ccf6f75b-5b67-47dc-9761-7fc713f35545", + "url": "https://mkw.techtangents.net/marker/pswitch/Overtake the train crossing the truss bridge!/location.jpg" + }, + { + "type": "title", + "id": "3314bfd4-fa4b-4f8a-ae08-5829c390fafb", + "url": "https://mkw.techtangents.net/marker/pswitch/Overtake the train crossing the truss bridge!/title.jpg" + } + ] + }, + { + "name": "Bash through certain boxes for a boost!", + "id": "05f806af-dea7-479f-b682-c84f2899bf3f", + "position": { + "x": 1281, + "y": 696 + }, + "end": { + "flying": false, + "x": 1262, + "y": 632 + }, + "images": [ + { + "type": "location", + "id": "e560d09e-3f7d-4182-905e-c9359c886a19", + "url": "https://mkw.techtangents.net/marker/pswitch/Bash through certain boxes for a boost!/location.jpg" + }, + { + "type": "title", + "id": "0d06acaa-84d8-4881-be07-d9edbb1fdd63", + "url": "https://mkw.techtangents.net/marker/pswitch/Bash through certain boxes for a boost!/title.jpg" + } + ] + }, + { + "name": "Make use of the vehicles along the riverbanks!", + "id": "368a5d9e-465d-4366-9f9a-e764e47e8196", + "position": { + "x": 1062, + "y": 443 + }, + "end": { + "flying": true, + "x": 959, + "y": 437 + }, + "images": [ + { + "type": "location", + "id": "a5b138ee-15df-4520-9d8c-7db9c53e2bd2", + "url": "https://mkw.techtangents.net/marker/pswitch/Make use of the vehicles along the riverbanks!/location.jpg" + }, + { + "type": "title", + "id": "289992f4-07f5-44a8-9e6c-c8cecb081c6c", + "url": "https://mkw.techtangents.net/marker/pswitch/Make use of the vehicles along the riverbanks!/title.jpg" + } + ] + }, + { + "name": "Play some tunes while gathering blue coins!", + "id": "562badce-0762-48bd-a2b6-eabe882d6a95", + "position": { + "x": 882, + "y": 635 + }, + "end": { + "flying": false, + "x": 866, + "y": 620 + }, + "images": [ + { + "type": "location", + "id": "9ebb1cdd-2dca-4015-80dd-2557b1d02648", + "url": "https://mkw.techtangents.net/marker/pswitch/Play some tunes while gathering blue coins!/location.jpg" + }, + { + "type": "title", + "id": "c9e1ccfa-66e8-4694-a328-a11cab93a337", + "url": "https://mkw.techtangents.net/marker/pswitch/Play some tunes while gathering blue coins!/title.jpg" + } + ] + }, + { + "name": "Steer the Ivy Piranha Plant vine toward the goal!", + "id": "3c71c48d-b141-4db2-a132-3a2821e89015", + "position": { + "x": 1017, + "y": 565 + }, + "end": { + "flying": true, + "x": 929, + "y": 532 + }, + "images": [ + { + "type": "location", + "id": "eb24d77d-2801-4645-b5cf-217e07f3e2fc", + "url": "https://mkw.techtangents.net/marker/pswitch/Steer the Ivy Piranha Plant vine toward the goal!/location.jpg" + }, + { + "type": "title", + "id": "0b7ec868-0369-4ea9-8ed9-e275dc639bc1", + "url": "https://mkw.techtangents.net/marker/pswitch/Steer the Ivy Piranha Plant vine toward the goal!/title.jpg" + } + ] + }, + { + "name": "Collect blue coins along a scenic back route!", + "id": "a6ae5c79-f3e7-4020-8037-c96b0c19cf9d", + "position": { + "x": 1003, + "y": 638 + }, + "end": { + "flying": true, + "x": 934, + "y": 552 + }, + "images": [ + { + "type": "location", + "id": "f191be95-0430-4916-a332-015733018986", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins along a scenic back route!/location.jpg" + }, + { + "type": "title", + "id": "d61a2c7a-3b8b-430f-accc-54068158788f", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect blue coins along a scenic back route!/title.jpg" + } + ] + }, + { + "name": "Grab blue coins as snowballs descend the slopes!", + "id": "2363c6cb-b6d2-4b79-a60d-03fe83c7b9c2", + "position": { + "x": 1254, + "y": 413 + }, + "end": { + "flying": false, + "x": 1231, + "y": 372 + }, + "images": [ + { + "type": "location", + "id": "96034676-d738-4555-bf8b-e2fdd8b99988", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab blue coins as snowballs descend the slopes!/location.jpg" + }, + { + "type": "title", + "id": "524fc8b6-0123-4c8b-8d26-6584f635553a", + "url": "https://mkw.techtangents.net/marker/pswitch/Grab blue coins as snowballs descend the slopes!/title.jpg" + } + ] + }, + { + "name": "Blitz past Bullies while gathering blue coins!", + "id": "b9ad6204-6270-4260-8b3f-c9c43272f109", + "position": { + "x": 694, + "y": 330 + }, + "images": [ + { + "type": "location", + "id": "7aba4044-b24c-495a-a12b-348d05fcc619", + "url": "https://mkw.techtangents.net/marker/pswitch/Blitz past Bullies while gathering blue coins!/location.jpg" + }, + { + "type": "title", + "id": "42773a81-5647-42db-a77c-605f74f44af4", + "url": "https://mkw.techtangents.net/marker/pswitch/Blitz past Bullies while gathering blue coins!/title.jpg" + } + ] + }, + { + "name": "Join the spontaneous race in the canyon!", + "id": "c14f61b5-fc2b-406e-bbc5-38fbc71ec5af", + "position": { + "x": 682, + "y": 861 + }, + "images": [ + { + "type": "location", + "id": "2f7a9113-40cc-47f0-ac9a-f53f6d070102", + "url": "https://mkw.techtangents.net/marker/pswitch/Join the spontaneous race in the canyon!/location.jpg" + }, + { + "type": "title", + "id": "6a52efbd-a054-4d33-b415-ca25e355ce3b", + "url": "https://mkw.techtangents.net/marker/pswitch/Join the spontaneous race in the canyon!/title.jpg" + } + ] + }, + { + "name": "Tear up the track with trick after trick!", + "id": "51d4c2d8-fd35-4a79-ba65-aeea5477cae9", + "position": { + "x": 687, + "y": 310 + }, + "end": { + "flying": false, + "x": 623, + "y": 300 + }, + "images": [ + { + "type": "location", + "id": "b0fcdfb1-d05e-4dae-970f-e279cdb8ad4e", + "url": "https://mkw.techtangents.net/marker/pswitch/Tear up the track with trick after trick!/location.jpg" + }, + { + "type": "title", + "id": "d795afb5-7ce3-4cdc-884a-ef92131676b8", + "url": "https://mkw.techtangents.net/marker/pswitch/Tear up the track with trick after trick!/title.jpg" + } + ] + }, + { + "name": "Take a leap of faith over the waterfall's edge!", + "id": "f21daf96-346f-42ac-939c-85a41b7ddce8", + "position": { + "x": 1239, + "y": 821 + }, + "end": { + "flying": false, + "x": 1187, + "y": 788 + }, + "images": [ + { + "type": "location", + "id": "ecdb5c95-da25-4432-b36f-7ddf44f655f2", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a leap of faith over the waterfall's edge!/location.jpg" + }, + { + "type": "title", + "id": "641de2ff-49a9-4ac7-b44a-45bfcab26dce", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a leap of faith over the waterfall's edge!/title.jpg" + } + ] + }, + { + "name": "Zip past and over the wild dinosaurs!", + "id": "529ff622-be91-42d4-a4b3-cf3c7e69b128", + "position": { + "x": 1128, + "y": 907 + }, + "end": { + "flying": false, + "x": 1031, + "y": 864 + }, + "images": [ + { + "type": "location", + "id": "a6ca460e-e30d-4430-84c6-4b4cbf345316", + "url": "https://mkw.techtangents.net/marker/pswitch/Zip past and over the wild dinosaurs!/location.jpg" + }, + { + "type": "title", + "id": "50cd253d-0151-40be-8b86-b06d64e5d2a6", + "url": "https://mkw.techtangents.net/marker/pswitch/Zip past and over the wild dinosaurs!/title.jpg" + } + ] + }, + { + "name": "Bring an appetite and race to the goal!", + "id": "ced4d49a-29cc-480d-a215-24d60710788a", + "position": { + "x": 612, + "y": 651 + }, + "end": { + "flying": false, + "x": 599, + "y": 670 + }, + "images": [ + { + "type": "location", + "id": "7160bc61-d851-4015-b69e-a9940c0adf3f", + "url": "https://mkw.techtangents.net/marker/pswitch/Bring an appetite and race to the goal!/location.jpg" + }, + { + "type": "title", + "id": "b09babb5-eccf-43d0-a4fd-397ff3b8ab6a", + "url": "https://mkw.techtangents.net/marker/pswitch/Bring an appetite and race to the goal!/title.jpg" + } + ] + }, + { + "name": "Navigate the schools of fish to reach the goal!", + "id": "e22edb32-e2f2-4cde-bd5a-f59a08064482", + "position": { + "x": 1009, + "y": 908 + }, + "end": { + "flying": false, + "x": 978, + "y": 798 + }, + "images": [ + { + "type": "location", + "id": "3ec9d838-d394-4111-942e-d96c9539fe59", + "url": "https://mkw.techtangents.net/marker/pswitch/Navigate the schools of fish to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "5ad0650e-8198-45fc-9813-ad41fe2edefc", + "url": "https://mkw.techtangents.net/marker/pswitch/Navigate the schools of fish to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Cross treacherous bluffs to reach the Goal Pole!", + "id": "5456b5ff-7381-4833-944c-38a13793e12f", + "position": { + "x": 1191, + "y": 623 + }, + "end": { + "flying": false, + "x": 1180, + "y": 552 + }, + "images": [ + { + "type": "location", + "id": "325f1560-c92a-4ed2-a550-f000b6fad16a", + "url": "https://mkw.techtangents.net/marker/pswitch/Cross treacherous bluffs to reach the Goal Pole!/location.jpg" + }, + { + "type": "title", + "id": "2b9a6421-9856-4f44-8d17-853b8f4965ad", + "url": "https://mkw.techtangents.net/marker/pswitch/Cross treacherous bluffs to reach the Goal Pole!/title.jpg" + } + ] + }, + { + "name": "Scoop up what the Super Koopas drop!", + "id": "2aa7dfda-aad0-4444-8966-fd24e0ac0b6a", + "position": { + "x": 1066, + "y": 492 + }, + "end": { + "flying": true, + "x": 984, + "y": 511 + }, + "images": [ + { + "type": "location", + "id": "920420bc-2d0b-4453-a90c-b77123deec32", + "url": "https://mkw.techtangents.net/marker/pswitch/Scoop up what the Super Koopas drop!/location.jpg" + }, + { + "type": "title", + "id": "48209731-a58b-4eb2-8f18-77248dfb1fba", + "url": "https://mkw.techtangents.net/marker/pswitch/Scoop up what the Super Koopas drop!/title.jpg" + } + ] + }, + { + "name": "Masterfully weave and wall ride past traffic!", + "id": "5f9c9b79-1310-4b35-bfdf-08330b4556a4", + "position": { + "x": 1052, + "y": 299 + }, + "end": { + "flying": false, + "x": 1066, + "y": 327 + }, + "images": [ + { + "type": "location", + "id": "ed55aaf0-0bdb-4452-be85-f3d4203f9b31", + "url": "https://mkw.techtangents.net/marker/pswitch/Masterfully weave and wall ride past traffic!/location.jpg" + }, + { + "type": "title", + "id": "dadcdbd3-7fcd-4c4f-8e09-eb4250423421", + "url": "https://mkw.techtangents.net/marker/pswitch/Masterfully weave and wall ride past traffic!/title.jpg" + } + ] + }, + { + "name": "Lead the way, Ivy Piranha Plants!", + "id": "f98b3988-07dc-458d-b6b5-e8cdb1f019f4", + "position": { + "x": 964, + "y": 362 + }, + "end": { + "flying": true, + "x": 939, + "y": 385 + }, + "images": [ + { + "type": "location", + "id": "650c73eb-e157-4241-ae22-9581b24a7d79", + "url": "https://mkw.techtangents.net/marker/pswitch/Lead the way, Ivy Piranha Plants!/location.jpg" + }, + { + "type": "title", + "id": "fdbc389b-4c2f-4249-b8c1-f670efabae3f", + "url": "https://mkw.techtangents.net/marker/pswitch/Lead the way, Ivy Piranha Plants!/title.jpg" + } + ] + }, + { + "name": "Take a somewhat-leisurely path to the goal!", + "id": "a07629b7-ad3c-4eb3-a34d-f4b7e278c891", + "position": { + "x": 826, + "y": 669 + }, + "end": { + "flying": false, + "x": 828, + "y": 604 + }, + "images": [ + { + "type": "location", + "id": "ab19ca40-643a-4854-92ce-518e3de45c53", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a somewhat-leisurely path to the goal!/location.jpg" + }, + { + "type": "title", + "id": "186ea347-c6ba-4351-a1fb-a6e12835586a", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a somewhat-leisurely path to the goal!/title.jpg" + } + ] + }, + { + "name": "Do tricks off the cacti for extra height!", + "id": "0e7867f7-5ad8-4a17-b737-4d1267379389", + "position": { + "x": 649, + "y": 552 + }, + "end": { + "flying": false, + "x": 602, + "y": 506 + }, + "images": [ + { + "type": "location", + "id": "bf66f57b-e683-4cbd-a8c9-38490a122573", + "url": "https://mkw.techtangents.net/marker/pswitch/Do tricks off the cacti for extra height!/location.jpg" + }, + { + "type": "title", + "id": "a9d839af-bd65-426f-b08a-f5ddae6b206d", + "url": "https://mkw.techtangents.net/marker/pswitch/Do tricks off the cacti for extra height!/title.jpg" + } + ] + }, + { + "name": "Borrow some upgrades to reach the goal!", + "id": "05603002-083b-4f2a-972f-1a80066e310b", + "position": { + "x": 734, + "y": 906 + }, + "end": { + "flying": false, + "x": 749, + "y": 769 + }, + "images": [ + { + "type": "location", + "id": "77a6fa1f-45ae-49c1-ab25-f2e461de4e7e", + "url": "https://mkw.techtangents.net/marker/pswitch/Borrow some upgrades to reach the goal!/location.jpg" + }, + { + "type": "title", + "id": "a38384dd-3e95-41a6-a17e-c2d8bbc1af51", + "url": "https://mkw.techtangents.net/marker/pswitch/Borrow some upgrades to reach the goal!/title.jpg" + } + ] + }, + { + "name": "Slalom downhill and scoop up the blue coins!", + "id": "dcd34ebb-9308-417a-abe3-c4904c13c396", + "position": { + "x": 1245, + "y": 369 + }, + "end": { + "flying": false, + "x": 1211, + "y": 396 + }, + "images": [ + { + "type": "location", + "id": "80a83ba9-2205-4f27-863f-71211d641564", + "url": "https://mkw.techtangents.net/marker/pswitch/Slalom downhill and scoop up the blue coins!/location.jpg" + }, + { + "type": "title", + "id": "e229aa7c-3072-4dbb-a9ee-acc3abf67e61", + "url": "https://mkw.techtangents.net/marker/pswitch/Slalom downhill and scoop up the blue coins!/title.jpg" + } + ] + }, + { + "name": "Take the river route to the city!", + "id": "0d1d6761-d090-47e8-828f-d578e29b1e00", + "position": { + "x": 754, + "y": 689 + }, + "end": { + "flying": false, + "x": 770, + "y": 707 + }, + "images": [ + { + "type": "location", + "id": "f53f48dd-67b0-4805-9795-29d335bdba20", + "url": "https://mkw.techtangents.net/marker/pswitch/Take the river route to the city!/location.jpg" + }, + { + "type": "title", + "id": "ac52c38f-d3e3-4f25-a44c-939f21e04d8c", + "url": "https://mkw.techtangents.net/marker/pswitch/Take the river route to the city!/title.jpg" + } + ] + }, + { + "name": "Honk if you like to gather blue coins!", + "id": "61cf7f07-4cbf-4fb4-b938-cd1c079c8ea2", + "position": { + "x": 701, + "y": 907 + }, + "end": { + "flying": false, + "x": 674, + "y": 918 + }, + "images": [ + { + "type": "location", + "id": "5360bec6-82c6-40ea-aa8a-9640a97bf2f0", + "url": "https://mkw.techtangents.net/marker/pswitch/Honk if you like to gather blue coins!/location.jpg" + }, + { + "type": "title", + "id": "dc505bcc-72fd-4fe8-8634-8b82b1746862", + "url": "https://mkw.techtangents.net/marker/pswitch/Honk if you like to gather blue coins!/title.jpg" + } + ] + }, + { + "name": "Race during a truly immersive movie experience!", + "id": "435f24b9-a4e0-472a-af7d-c174b49e5a13", + "position": { + "x": 1139, + "y": 180 + }, + "images": [ + { + "type": "location", + "id": "a41b8fcd-91f4-49a8-8a36-4764de6811bd", + "url": "https://mkw.techtangents.net/marker/pswitch/Race during a truly immersive movie experience!/location.jpg" + }, + { + "type": "title", + "id": "224da000-a3bf-4e1b-abab-61e007bbe53c", + "url": "https://mkw.techtangents.net/marker/pswitch/Race during a truly immersive movie experience!/title.jpg" + } + ] + }, + { + "name": "Hit the ramps and reach the goal!", + "id": "02d88398-7aa8-4fcb-b8f5-7b0aaab97d2f", + "position": { + "x": 960, + "y": 506 + }, + "end": { + "flying": false, + "x": 931, + "y": 546 + }, + "images": [ + { + "type": "location", + "id": "eb0eed2c-b934-4718-a44f-e1dc59fe7e84", + "url": "https://www.gamerguides.com/assets/maps/markers/Screenshot_2025-06-11_09-38-34.jpg" + } + ] + }, + { + "name": "Soar along a secret route to Cheep Cheep Falls!", + "id": "1654113a-ab46-4683-bc76-4577ddf650d5", + "position": { + "x": 1061, + "y": 549 + }, + "end": { + "flying": false, + "x": 1090, + "y": 533 + }, + "images": [ + { + "type": "location", + "id": "6c1e4193-43ab-42cb-bc3a-dab1a3e11a04", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar along a secret route to Cheep Cheep Falls!/location.jpg" + }, + { + "type": "title", + "id": "31bc8dcd-bcd2-4a52-8343-59380d7ab9fd", + "url": "https://mkw.techtangents.net/marker/pswitch/Soar along a secret route to Cheep Cheep Falls!/title.jpg" + } + ] + }, + { + "name": "Take a nonstop flight from tower to tower!", + "id": "fbd548dc-7c63-4941-b2ac-fc594409b8dd", + "position": { + "x": 1418, + "y": 612 + }, + "end": { + "flying": true, + "x": 1425, + "y": 570 + }, + "images": [ + { + "type": "location", + "id": "98cbeab9-06ee-4fce-a860-0d4b1e244650", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a nonstop flight from tower to tower!/location.jpg" + }, + { + "type": "title", + "id": "0430b76a-00a6-4886-9c95-f67d2f78ff53", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a nonstop flight from tower to tower!/title.jpg" + } + ] + }, + { + "name": "Look out! Look out again! Look out some more!", + "id": "e5aeccc5-893d-4c71-92f7-6236e28bf2ae", + "position": { + "x": 1085, + "y": 517 + }, + "end": { + "flying": false, + "x": 1055, + "y": 445 + }, + "images": [ + { + "type": "location", + "id": "5164940f-6aab-459d-a877-31f10a2ab902", + "url": "https://mkw.techtangents.net/marker/pswitch/Look out! Look out again! Look out some more!/location.jpg" + }, + { + "type": "title", + "id": "fe6e82bb-cf62-4969-8ecb-4048954a8e4f", + "url": "https://mkw.techtangents.net/marker/pswitch/Look out! Look out again! Look out some more!/title.jpg" + } + ] + }, + { + "name": "Race around a tribute to Ghost Valley 1!", + "id": "e5e9d79f-c7c0-4849-84c1-8db6826f5012", + "position": { + "x": 1122, + "y": 202 + }, + "end": { + "flying": false, + "x": 1085, + "y": 167 + }, + "images": [ + { + "type": "location", + "id": "c0fbd406-8f7a-4dc8-a339-be43568f6a5a", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Ghost Valley 1!/location.jpg" + }, + { + "type": "title", + "id": "5bcad8b6-1de8-4c36-a24d-a33c7a2e03b9", + "url": "https://mkw.techtangents.net/marker/pswitch/Race around a tribute to Ghost Valley 1!/title.jpg" + } + ] + }, + { + "name": "Slip by line after line of Rocky Wrenches!", + "id": "f9ffc6fc-666f-4ce0-b278-d9c933e61bb4", + "position": { + "x": 497, + "y": 354 + }, + "end": { + "flying": false, + "x": 456, + "y": 303 + }, + "images": [ + { + "type": "location", + "id": "5f946f25-9e21-4239-aa15-3ed455b69c03", + "url": "https://mkw.techtangents.net/marker/pswitch/Slip by line after line of Rocky Wrenches!/location.jpg" + }, + { + "type": "title", + "id": "3c7b3f83-d3a8-4540-8689-b328314f6b96", + "url": "https://mkw.techtangents.net/marker/pswitch/Slip by line after line of Rocky Wrenches!/title.jpg" + } + ] + }, + { + "name": "Follow the coin-strewn path to the goal!", + "id": "320e87f0-f430-48a6-a056-b629cf5c34b5", + "position": { + "x": 1425, + "y": 564 + }, + "end": { + "flying": false, + "x": 1410, + "y": 582 + }, + "images": [ + { + "type": "location", + "id": "cf49285c-69dc-488a-aae5-b1809606c300", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the coin-strewn path to the goal!/location.jpg" + }, + { + "type": "title", + "id": "872ad236-e7bf-46db-9748-4eb77003963c", + "url": "https://mkw.techtangents.net/marker/pswitch/Follow the coin-strewn path to the goal!/title.jpg" + } + ] + }, + { + "name": "Hop for boosts as Cheep Cheeps cheer you on!", + "id": "766213ea-fb49-45e9-9409-9f5646d3907c", + "position": { + "x": 1179, + "y": 666 + }, + "end": { + "flying": false, + "x": 1229, + "y": 651 + }, + "images": [ + { + "type": "location", + "id": "3eec583e-903a-4fbd-8401-7c7945d59922", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop for boosts as Cheep Cheeps cheer you on!/location.jpg" + }, + { + "type": "title", + "id": "20db3011-2ff4-4031-aff8-b058e8b409a4", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop for boosts as Cheep Cheeps cheer you on!/title.jpg" + } + ] + }, + { + "name": "Test your endurance in a race all over town!", + "id": "dd637c14-2bf0-4e17-b998-0b46c2333682", + "position": { + "x": 751, + "y": 804 + }, + "end": { + "flying": false, + "x": 765, + "y": 785 + }, + "images": [ + { + "type": "location", + "id": "139d5489-101d-4d3f-b633-fb9db79dccbd", + "url": "https://mkw.techtangents.net/marker/pswitch/Test your endurance in a race all over town!/location.jpg" + }, + { + "type": "title", + "id": "4f8ab8b4-3f78-4d44-83c7-440af3775708", + "url": "https://mkw.techtangents.net/marker/pswitch/Test your endurance in a race all over town!/title.jpg" + } + ] + }, + { + "name": "Brave the unfinished shortcut!", + "id": "ddba9572-2351-4036-9dd8-39e789009a64", + "position": { + "x": 1305, + "y": 320 + }, + "end": { + "flying": false, + "x": 1300, + "y": 313 + }, + "images": [ + { + "type": "location", + "id": "5699b662-9fff-45f6-af87-508f7fc35825", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the unfinished shortcut!/location.jpg" + }, + { + "type": "title", + "id": "cbb62000-2616-487f-b3c7-57e5c4a0a74a", + "url": "https://mkw.techtangents.net/marker/pswitch/Brave the unfinished shortcut!/title.jpg" + } + ] + }, + { + "name": "Hop over the meadows and launch to the goal!", + "id": "376d2699-57ff-4dce-9bd9-34c11c4f61ad", + "position": { + "x": 947, + "y": 457 + }, + "end": { + "flying": false, + "x": 929, + "y": 456 + }, + "images": [ + { + "type": "location", + "id": "f77961c2-2fa3-4bd0-9489-49ce318bce87", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop over the meadows and launch to the goal!/location.jpg" + }, + { + "type": "title", + "id": "03d6ab5d-c43b-4170-98dc-a3e39285a795", + "url": "https://mkw.techtangents.net/marker/pswitch/Hop over the meadows and launch to the goal!/title.jpg" + } + ] + }, + { + "name": "Take a long-distance rail ride to the goal!", + "id": "6a03fa03-c5e3-4487-bca7-b21bdde8d7e7", + "position": { + "x": 472, + "y": 590 + }, + "end": { + "flying": false, + "x": 413, + "y": 708 + }, + "images": [ + { + "type": "location", + "id": "a591f0bd-24b4-476a-a6b1-33e0b2dde78e", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a long-distance rail ride to the goal!/location.jpg" + }, + { + "type": "title", + "id": "15de002d-6edb-49e8-a862-eae19b917270", + "url": "https://mkw.techtangents.net/marker/pswitch/Take a long-distance rail ride to the goal!/title.jpg" + } + ] + }, + { + "name": "Power upstream with the might of the stars!", + "id": "c308748f-8e98-498e-85b0-dff979d1afba", + "position": { + "x": 1034, + "y": 285 + }, + "end": { + "flying": false, + "x": 1015, + "y": 299 + }, + "images": [ + { + "type": "location", + "id": "b793738f-c38d-4d33-be4e-900add27b78c", + "url": "https://mkw.techtangents.net/marker/pswitch/Power upstream with the might of the stars!/location.jpg" + }, + { + "type": "title", + "id": "f3d12b60-f97b-406b-83b5-340c89cf89f1", + "url": "https://mkw.techtangents.net/marker/pswitch/Power upstream with the might of the stars!/title.jpg" + } + ] + }, + { + "name": "Collect the blue coins the Wigglers have hoarded!", + "id": "642ee232-9f62-4909-917e-d5d8b80481be", + "position": { + "x": 994, + "y": 223 + }, + "end": { + "flying": false, + "x": 960, + "y": 178 + }, + "images": [ + { + "type": "location", + "id": "f0fa7455-a87e-47bb-b458-f4693cd85f16", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect the blue coins the Wigglers have hoarded!/location.jpg" + }, + { + "type": "title", + "id": "60bec7ee-f2c8-4a6a-bf50-21f072ef65c2", + "url": "https://mkw.techtangents.net/marker/pswitch/Collect the blue coins the Wigglers have hoarded!/title.jpg" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/images/chucks.png b/src/main/resources/assets/images/chucks.png new file mode 100644 index 0000000..3787e43 Binary files /dev/null and b/src/main/resources/assets/images/chucks.png differ diff --git a/src/main/resources/assets/images/chucks_disabled.png b/src/main/resources/assets/images/chucks_disabled.png new file mode 100644 index 0000000..c661f5f Binary files /dev/null and b/src/main/resources/assets/images/chucks_disabled.png differ diff --git a/src/main/resources/assets/images/map.png b/src/main/resources/assets/images/map.png new file mode 100644 index 0000000..17aaeed Binary files /dev/null and b/src/main/resources/assets/images/map.png differ diff --git a/src/main/resources/assets/images/medal.png b/src/main/resources/assets/images/medal.png new file mode 100644 index 0000000..3569860 Binary files /dev/null and b/src/main/resources/assets/images/medal.png differ diff --git a/src/main/resources/assets/images/medal_disabled.png b/src/main/resources/assets/images/medal_disabled.png new file mode 100644 index 0000000..9d16a3c Binary files /dev/null and b/src/main/resources/assets/images/medal_disabled.png differ diff --git a/src/main/resources/assets/images/panel.png b/src/main/resources/assets/images/panel.png new file mode 100644 index 0000000..dfe781f Binary files /dev/null and b/src/main/resources/assets/images/panel.png differ diff --git a/src/main/resources/assets/images/panel_disabled.png b/src/main/resources/assets/images/panel_disabled.png new file mode 100644 index 0000000..2854abd Binary files /dev/null and b/src/main/resources/assets/images/panel_disabled.png differ diff --git a/src/main/resources/assets/images/pswitch.png b/src/main/resources/assets/images/pswitch.png new file mode 100644 index 0000000..888414e Binary files /dev/null and b/src/main/resources/assets/images/pswitch.png differ diff --git a/src/main/resources/assets/images/pswitch_disabled.png b/src/main/resources/assets/images/pswitch_disabled.png new file mode 100644 index 0000000..984a7da Binary files /dev/null and b/src/main/resources/assets/images/pswitch_disabled.png differ diff --git a/src/test/java/Testing.java b/src/test/java/Testing.java new file mode 100644 index 0000000..da5c670 --- /dev/null +++ b/src/test/java/Testing.java @@ -0,0 +1,272 @@ +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.nio.file.DirectoryStream; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import javax.imageio.ImageIO; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.internal.Streams; +import com.google.gson.stream.JsonWriter; + +import speiger.src.data.Collectable; +import speiger.src.data.Registry; +import speiger.src.data.TaggedImage; + + +public class Testing { + + public static void main(String...args) { + applyPatches(); + downloadObjects(); + } + + private static void applyPatches() { + patch(getOrigin().resolve("src/main/resources/assets/data/medals.json"), getOrigin().resolve("backup/medal-patch.txt")); + patch(getOrigin().resolve("src/main/resources/assets/data/pswitches.json"), getOrigin().resolve("backup/pswitch-patch.txt")); + } + + private static void patch(Path baseFile, Path patchFile) { + Map patches = new HashMap<>(); + try { + for(String entry : Files.readAllLines(patchFile)) { + String[] split = entry.split(" = "); + if(split.length != 2) continue; + patches.put(split[0], split[1]); + } + + JsonObject obj = null; + try(BufferedReader reader = Files.newBufferedReader(baseFile)) { + obj = JsonParser.parseReader(reader).getAsJsonObject(); + } + catch(Exception e) { + e.printStackTrace(); + return; + } + for(JsonElement element : obj.getAsJsonArray("entries")) { + JsonObject entry = element.getAsJsonObject(); + for(JsonElement image : entry.getAsJsonArray("images")) { + JsonObject imageObj = image.getAsJsonObject(); + String replacement = patches.get(imageObj.get("url").getAsString().replace(" ", "%20")); + if(replacement == null) { + continue; + } + imageObj.addProperty("url", replacement); + System.out.println("Successfully Patched to: "+replacement); + } + } + try(JsonWriter writer = new JsonWriter(Files.newBufferedWriter(baseFile))) { + writer.setIndent("\t"); + Streams.write(obj, writer); + } + catch(Exception e) { + e.printStackTrace(); + } + + } + catch(Exception e) { + e.printStackTrace(); + } + } + + private static void downloadObjects() { + Registry.INSTANCE.load(); + ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + ExecutorCompletionService queue = new ExecutorCompletionService<>(service); + try(FileSystem system = FileSystems.newFileSystem(getOrigin().resolve("output/images.zip"), Map.of("create", "true"))) { + int toDo = 0; + for(Collectable collect : Registry.INSTANCE.collectables()) { + for(TaggedImage image : collect.images().values()) { + Path path = system.getPath(image.fileId().toString().replace("-", "_")+".jpg"); + if(Files.exists(path)) continue; + queue.submit(new Task(image)); + toDo++; + } + } + int total = toDo; + service.shutdown(); + while(toDo > 0) { + Future future = null; + while((future = queue.poll()) != null) { + DownloadedImage image = future.get(); + toDo--; + if(image.id() == null) continue; + Path path = system.getPath(image.id().toString().replace("-", "_")+".jpg"); + try { Files.write(path, image.data()); } + catch(Exception e) { e.printStackTrace(); } + System.out.println("Downloaded: "+(total - toDo)+" / "+total); + } + Thread.sleep(50); + } + } + catch(Exception e) { + e.printStackTrace(); + } + } + + public static void convertObjects() throws Exception { + Map data = Map.of("medals.json", "medal", "panels.json", "panel", "pswitches.json", "pswitch"); + + try(DirectoryStream files = Files.newDirectoryStream(Paths.get("D:\\Workspaces\\Java17\\MKW_Map\\src\\main\\resources\\assets\\data"))) { + List result = new ArrayList<>(); + files.forEach(result::add); + for(Path path : result) { + JsonObject obj = convert(JsonParser.parseReader(Files.newBufferedReader(path)).getAsJsonObject().getAsJsonArray("entries"), data.get(path.getFileName().toString())); + String name = path.getFileName().toString(); + name = name.substring(0, name.length()-5); + System.out.println("Testing: "+name); + try(JsonWriter writer = new JsonWriter(Files.newBufferedWriter(path.getParent().resolve(name+"new.json")))) { + writer.setIndent("\t"); + Streams.write(obj, writer); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + } + + private static JsonObject convert(JsonArray inputArray, String type) { + JsonArray result = new JsonArray(); + for(JsonElement entry : inputArray) { + JsonObject obj = entry.getAsJsonObject(); + String url = applyHTML(obj.get("name").getAsString(), type); + Set types = parseArray(obj.getAsJsonArray("imgs")); + JsonObject newEntry = new JsonObject(); + newEntry.addProperty("name", obj.get("name").getAsString()); + newEntry.addProperty("id", UUID.randomUUID().toString()); + newEntry.add("position", convert(obj.getAsJsonArray("map_position"), obj.getAsJsonArray("map_offset"))); + if(obj.has("end_position")) { + JsonArray array = obj.getAsJsonArray("end_position"); + JsonObject end = new JsonObject(); + end.addProperty("flying", obj.has("end_flying")); + end.addProperty("x", array.get(0).getAsInt()); + end.addProperty("y", array.get(1).getAsInt()); + newEntry.add("end", end); + } + JsonArray images = new JsonArray(); + if(types.contains("location")) { + JsonObject imageEntry = new JsonObject(); + imageEntry.addProperty("type", "location"); + imageEntry.addProperty("id", UUID.randomUUID().toString()); + imageEntry.addProperty("url", url+"/location.jpg"); + images.add(imageEntry); + } + if(types.contains("title")) { + JsonObject imageEntry = new JsonObject(); + imageEntry.addProperty("type", "title"); + imageEntry.addProperty("id", UUID.randomUUID().toString()); + imageEntry.addProperty("url", url+"/title.jpg"); + images.add(imageEntry); + } + newEntry.add("images", images); + result.add(newEntry); + } + JsonObject resultObj = new JsonObject(); + resultObj.add("entries", result); + return resultObj; + } + + private static JsonObject convert(JsonArray pos, JsonArray offset) { + int x = pos.get(0).getAsInt(); + int y = pos.get(1).getAsInt(); + if(offset != null && offset.size() == 2) { + x += offset.get(0).getAsInt(); + y += offset.get(1).getAsInt(); + } + JsonObject obj = new JsonObject(); + obj.addProperty("x", x); + obj.addProperty("y", y); + return obj; + } + + private static String applyHTML(String input, String type) { + return "https://mkw.techtangents.net/marker/"+type+"/"+input.replace("#", "").replace("?", "").replace("\"", ""); + } + + private static Set parseArray(JsonArray array) { + Set entry = new HashSet<>(); + for(JsonElement element : array) { + entry.add(element.toString().replace("\"", "")); + } + return entry; + } + + private static Path getOrigin() { + try { + Path data = Path.of(Registry.class.getProtectionDomain().getCodeSource().getLocation().toURI()); + if(!Files.isDirectory(data)) return data.getParent(); + } + catch(URISyntaxException e) { e.printStackTrace(); } + return Path.of(""); + } + + public static class Task implements Callable { + TaggedImage image; + + public Task(TaggedImage image) { + this.image = image; + } + + @Override + public Testing.DownloadedImage call() throws Exception { + try { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + WritableByteChannel output = Channels.newChannel(stream); + ReadableByteChannel input = Channels.newChannel(new URI(image.url().replace(" ", "%20")).toURL().openStream()); + ByteBuffer buffer = ByteBuffer.allocate(8192); + while(input.read(buffer) > 0) { + output.write(buffer.flip()); + buffer.flip(); + } + input.close(); + output.close(); + BufferedImage image = ImageIO.read(new ByteArrayInputStream(stream.toByteArray())); + stream.reset(); + ImageIO.write(image, "jpg", stream); + + return new DownloadedImage(this.image.fileId(), stream.toByteArray()); + } + catch(Exception e) { + e.printStackTrace(); + } + return new DownloadedImage(null, null); + } + + } + + public record DownloadedImage(UUID id, byte[] data) { + + } + //https://mkw.techtangents.net/marker/pswitch/Collect%20blue%20coins%20along%20a%20scenic%20back%20route!/300_location.jpg +}