diff --git a/GJ_GameSheet-uhd/blackCogwheel_01_001.png b/GJ_GameSheet-uhd/blackCogwheel_01_001.png new file mode 100644 index 00000000..6e99abc3 Binary files /dev/null and b/GJ_GameSheet-uhd/blackCogwheel_01_001.png differ diff --git a/GJ_GameSheet-uhd/blackCogwheel_01_color_001.png b/GJ_GameSheet-uhd/blackCogwheel_01_color_001.png new file mode 100644 index 00000000..963b82a6 Binary files /dev/null and b/GJ_GameSheet-uhd/blackCogwheel_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/blackCogwheel_02_001.png b/GJ_GameSheet-uhd/blackCogwheel_02_001.png new file mode 100644 index 00000000..5cb69202 Binary files /dev/null and b/GJ_GameSheet-uhd/blackCogwheel_02_001.png differ diff --git a/GJ_GameSheet-uhd/blackCogwheel_02_color_001.png b/GJ_GameSheet-uhd/blackCogwheel_02_color_001.png new file mode 100644 index 00000000..ad359cb7 Binary files /dev/null and b/GJ_GameSheet-uhd/blackCogwheel_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/blackCogwheel_03_001.png b/GJ_GameSheet-uhd/blackCogwheel_03_001.png new file mode 100644 index 00000000..c1097231 Binary files /dev/null and b/GJ_GameSheet-uhd/blackCogwheel_03_001.png differ diff --git a/GJ_GameSheet-uhd/blackCogwheel_03_color_001.png b/GJ_GameSheet-uhd/blackCogwheel_03_color_001.png new file mode 100644 index 00000000..068141a4 Binary files /dev/null and b/GJ_GameSheet-uhd/blackCogwheel_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/bladeTrap01_001.png b/GJ_GameSheet-uhd/bladeTrap01_001.png new file mode 100644 index 00000000..a0488180 Binary files /dev/null and b/GJ_GameSheet-uhd/bladeTrap01_001.png differ diff --git a/GJ_GameSheet-uhd/bladeTrap01_color_001.png b/GJ_GameSheet-uhd/bladeTrap01_color_001.png new file mode 100644 index 00000000..97d716dd Binary files /dev/null and b/GJ_GameSheet-uhd/bladeTrap01_color_001.png differ diff --git a/GJ_GameSheet-uhd/bladeTrap02_001.png b/GJ_GameSheet-uhd/bladeTrap02_001.png new file mode 100644 index 00000000..0cc19a44 Binary files /dev/null and b/GJ_GameSheet-uhd/bladeTrap02_001.png differ diff --git a/GJ_GameSheet-uhd/bladeTrap02_color_001.png b/GJ_GameSheet-uhd/bladeTrap02_color_001.png new file mode 100644 index 00000000..b25e3ef8 Binary files /dev/null and b/GJ_GameSheet-uhd/bladeTrap02_color_001.png differ diff --git a/GJ_GameSheet-uhd/bladeTrap03_001.png b/GJ_GameSheet-uhd/bladeTrap03_001.png new file mode 100644 index 00000000..bfb9a9e5 Binary files /dev/null and b/GJ_GameSheet-uhd/bladeTrap03_001.png differ diff --git a/GJ_GameSheet-uhd/bladeTrap03_color_001.png b/GJ_GameSheet-uhd/bladeTrap03_color_001.png new file mode 100644 index 00000000..ba1794cc Binary files /dev/null and b/GJ_GameSheet-uhd/bladeTrap03_color_001.png differ diff --git a/GJ_GameSheet-uhd/blade_01_001.png b/GJ_GameSheet-uhd/blade_01_001.png new file mode 100644 index 00000000..8ffaf02b Binary files /dev/null and b/GJ_GameSheet-uhd/blade_01_001.png differ diff --git a/GJ_GameSheet-uhd/blade_02_001.png b/GJ_GameSheet-uhd/blade_02_001.png new file mode 100644 index 00000000..2adb8750 Binary files /dev/null and b/GJ_GameSheet-uhd/blade_02_001.png differ diff --git a/GJ_GameSheet-uhd/blade_03_001.png b/GJ_GameSheet-uhd/blade_03_001.png new file mode 100644 index 00000000..86454891 Binary files /dev/null and b/GJ_GameSheet-uhd/blade_03_001.png differ diff --git a/GJ_GameSheet-uhd/blade_b_01_001.png b/GJ_GameSheet-uhd/blade_b_01_001.png new file mode 100644 index 00000000..6e7083d4 Binary files /dev/null and b/GJ_GameSheet-uhd/blade_b_01_001.png differ diff --git a/GJ_GameSheet-uhd/blade_b_02_001.png b/GJ_GameSheet-uhd/blade_b_02_001.png new file mode 100644 index 00000000..d093faf2 Binary files /dev/null and b/GJ_GameSheet-uhd/blade_b_02_001.png differ diff --git a/GJ_GameSheet-uhd/blade_b_03_001.png b/GJ_GameSheet-uhd/blade_b_03_001.png new file mode 100644 index 00000000..0272e305 Binary files /dev/null and b/GJ_GameSheet-uhd/blade_b_03_001.png differ diff --git a/GJ_GameSheet-uhd/block001_01_001.png b/GJ_GameSheet-uhd/block001_01_001.png new file mode 100644 index 00000000..38b7efad Binary files /dev/null and b/GJ_GameSheet-uhd/block001_01_001.png differ diff --git a/GJ_GameSheet-uhd/block001_02_001.png b/GJ_GameSheet-uhd/block001_02_001.png new file mode 100644 index 00000000..f292f1aa Binary files /dev/null and b/GJ_GameSheet-uhd/block001_02_001.png differ diff --git a/GJ_GameSheet-uhd/block001_02_color_001.png b/GJ_GameSheet-uhd/block001_02_color_001.png new file mode 100644 index 00000000..da457196 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block001_03_001.png b/GJ_GameSheet-uhd/block001_03_001.png new file mode 100644 index 00000000..db92ab54 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_03_001.png differ diff --git a/GJ_GameSheet-uhd/block001_03_color_001.png b/GJ_GameSheet-uhd/block001_03_color_001.png new file mode 100644 index 00000000..bc3a91b0 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block001_04_001.png b/GJ_GameSheet-uhd/block001_04_001.png new file mode 100644 index 00000000..506e459e Binary files /dev/null and b/GJ_GameSheet-uhd/block001_04_001.png differ diff --git a/GJ_GameSheet-uhd/block001_04_color_001.png b/GJ_GameSheet-uhd/block001_04_color_001.png new file mode 100644 index 00000000..ec206d0a Binary files /dev/null and b/GJ_GameSheet-uhd/block001_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block001_05_001.png b/GJ_GameSheet-uhd/block001_05_001.png new file mode 100644 index 00000000..5e383026 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_05_001.png differ diff --git a/GJ_GameSheet-uhd/block001_05_color_001.png b/GJ_GameSheet-uhd/block001_05_color_001.png new file mode 100644 index 00000000..6beee10d Binary files /dev/null and b/GJ_GameSheet-uhd/block001_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block001_06_001.png b/GJ_GameSheet-uhd/block001_06_001.png new file mode 100644 index 00000000..4fcb6439 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_06_001.png differ diff --git a/GJ_GameSheet-uhd/block001_06_color_001.png b/GJ_GameSheet-uhd/block001_06_color_001.png new file mode 100644 index 00000000..e8f9f1d2 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block001_07_001.png b/GJ_GameSheet-uhd/block001_07_001.png new file mode 100644 index 00000000..e6a9f3ea Binary files /dev/null and b/GJ_GameSheet-uhd/block001_07_001.png differ diff --git a/GJ_GameSheet-uhd/block001_07_color_001.png b/GJ_GameSheet-uhd/block001_07_color_001.png new file mode 100644 index 00000000..52948e3f Binary files /dev/null and b/GJ_GameSheet-uhd/block001_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block001_slope_01_001.png b/GJ_GameSheet-uhd/block001_slope_01_001.png new file mode 100644 index 00000000..4624b844 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block001_slope_01_color_001.png b/GJ_GameSheet-uhd/block001_slope_01_color_001.png new file mode 100644 index 00000000..d2e29cc7 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block001_slope_02_001.png b/GJ_GameSheet-uhd/block001_slope_02_001.png new file mode 100644 index 00000000..6366ee02 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block001_slope_02_color_001.png b/GJ_GameSheet-uhd/block001_slope_02_color_001.png new file mode 100644 index 00000000..9d28ee67 Binary files /dev/null and b/GJ_GameSheet-uhd/block001_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_01_001.png b/GJ_GameSheet-uhd/block002_01_001.png new file mode 100644 index 00000000..708a84f1 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_01_001.png differ diff --git a/GJ_GameSheet-uhd/block002_01_color_001.png b/GJ_GameSheet-uhd/block002_01_color_001.png new file mode 100644 index 00000000..e3c74c33 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_02_001.png b/GJ_GameSheet-uhd/block002_02_001.png new file mode 100644 index 00000000..309ef259 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_02_001.png differ diff --git a/GJ_GameSheet-uhd/block002_02_color_001.png b/GJ_GameSheet-uhd/block002_02_color_001.png new file mode 100644 index 00000000..04491082 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_03_001.png b/GJ_GameSheet-uhd/block002_03_001.png new file mode 100644 index 00000000..f173f668 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_03_001.png differ diff --git a/GJ_GameSheet-uhd/block002_03_color_001.png b/GJ_GameSheet-uhd/block002_03_color_001.png new file mode 100644 index 00000000..930618e5 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_04_001.png b/GJ_GameSheet-uhd/block002_04_001.png new file mode 100644 index 00000000..e74d33be Binary files /dev/null and b/GJ_GameSheet-uhd/block002_04_001.png differ diff --git a/GJ_GameSheet-uhd/block002_04_color_001.png b/GJ_GameSheet-uhd/block002_04_color_001.png new file mode 100644 index 00000000..6936a25a Binary files /dev/null and b/GJ_GameSheet-uhd/block002_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_05_001.png b/GJ_GameSheet-uhd/block002_05_001.png new file mode 100644 index 00000000..309ef259 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_05_001.png differ diff --git a/GJ_GameSheet-uhd/block002_05_color_001.png b/GJ_GameSheet-uhd/block002_05_color_001.png new file mode 100644 index 00000000..f043cc77 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_06_001.png b/GJ_GameSheet-uhd/block002_06_001.png new file mode 100644 index 00000000..7cbac835 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_06_001.png differ diff --git a/GJ_GameSheet-uhd/block002_06_color_001.png b/GJ_GameSheet-uhd/block002_06_color_001.png new file mode 100644 index 00000000..c72ac63c Binary files /dev/null and b/GJ_GameSheet-uhd/block002_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_07_001.png b/GJ_GameSheet-uhd/block002_07_001.png new file mode 100644 index 00000000..309ef259 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_07_001.png differ diff --git a/GJ_GameSheet-uhd/block002_07_color_001.png b/GJ_GameSheet-uhd/block002_07_color_001.png new file mode 100644 index 00000000..a1e90a05 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_slope_01_001.png b/GJ_GameSheet-uhd/block002_slope_01_001.png new file mode 100644 index 00000000..cdbcc2a0 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block002_slope_01_color_001.png b/GJ_GameSheet-uhd/block002_slope_01_color_001.png new file mode 100644 index 00000000..e17c13de Binary files /dev/null and b/GJ_GameSheet-uhd/block002_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block002_slope_02_001.png b/GJ_GameSheet-uhd/block002_slope_02_001.png new file mode 100644 index 00000000..a682e132 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block002_slope_02_color_001.png b/GJ_GameSheet-uhd/block002_slope_02_color_001.png new file mode 100644 index 00000000..720f5d19 Binary files /dev/null and b/GJ_GameSheet-uhd/block002_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block003_color_01_001.png b/GJ_GameSheet-uhd/block003_color_01_001.png new file mode 100644 index 00000000..51a9f7cc Binary files /dev/null and b/GJ_GameSheet-uhd/block003_color_01_001.png differ diff --git a/GJ_GameSheet-uhd/block003_color_02_001.png b/GJ_GameSheet-uhd/block003_color_02_001.png new file mode 100644 index 00000000..a07df527 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_color_02_001.png differ diff --git a/GJ_GameSheet-uhd/block003_color_03_001.png b/GJ_GameSheet-uhd/block003_color_03_001.png new file mode 100644 index 00000000..ec6085be Binary files /dev/null and b/GJ_GameSheet-uhd/block003_color_03_001.png differ diff --git a/GJ_GameSheet-uhd/block003_color_04_001.png b/GJ_GameSheet-uhd/block003_color_04_001.png new file mode 100644 index 00000000..11afe1e2 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_color_04_001.png differ diff --git a/GJ_GameSheet-uhd/block003_color_05_001.png b/GJ_GameSheet-uhd/block003_color_05_001.png new file mode 100644 index 00000000..f417aae5 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_color_05_001.png differ diff --git a/GJ_GameSheet-uhd/block003_color_06_001.png b/GJ_GameSheet-uhd/block003_color_06_001.png new file mode 100644 index 00000000..584975f4 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_color_06_001.png differ diff --git a/GJ_GameSheet-uhd/block003_part01_001.png b/GJ_GameSheet-uhd/block003_part01_001.png new file mode 100644 index 00000000..e588c8c7 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_part01_001.png differ diff --git a/GJ_GameSheet-uhd/block003_part02_001.png b/GJ_GameSheet-uhd/block003_part02_001.png new file mode 100644 index 00000000..e14a4947 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_part02_001.png differ diff --git a/GJ_GameSheet-uhd/block003_part03_001.png b/GJ_GameSheet-uhd/block003_part03_001.png new file mode 100644 index 00000000..00f8dd34 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_part03_001.png differ diff --git a/GJ_GameSheet-uhd/block003_part04_001.png b/GJ_GameSheet-uhd/block003_part04_001.png new file mode 100644 index 00000000..a99c7a7a Binary files /dev/null and b/GJ_GameSheet-uhd/block003_part04_001.png differ diff --git a/GJ_GameSheet-uhd/block003_part05_001.png b/GJ_GameSheet-uhd/block003_part05_001.png new file mode 100644 index 00000000..e681560c Binary files /dev/null and b/GJ_GameSheet-uhd/block003_part05_001.png differ diff --git a/GJ_GameSheet-uhd/block003_part06_001.png b/GJ_GameSheet-uhd/block003_part06_001.png new file mode 100644 index 00000000..edfc0804 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_part06_001.png differ diff --git a/GJ_GameSheet-uhd/block003_slope_01_001.png b/GJ_GameSheet-uhd/block003_slope_01_001.png new file mode 100644 index 00000000..1ab18d45 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block003_slope_01_color_001.png b/GJ_GameSheet-uhd/block003_slope_01_color_001.png new file mode 100644 index 00000000..99450c6d Binary files /dev/null and b/GJ_GameSheet-uhd/block003_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block003_slope_02_001.png b/GJ_GameSheet-uhd/block003_slope_02_001.png new file mode 100644 index 00000000..caa910c6 Binary files /dev/null and b/GJ_GameSheet-uhd/block003_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block003_slope_02_color_001.png b/GJ_GameSheet-uhd/block003_slope_02_color_001.png new file mode 100644 index 00000000..3f57137f Binary files /dev/null and b/GJ_GameSheet-uhd/block003_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block004_slope_01_001.png b/GJ_GameSheet-uhd/block004_slope_01_001.png new file mode 100644 index 00000000..8723151c Binary files /dev/null and b/GJ_GameSheet-uhd/block004_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block004_slope_01b_001.png b/GJ_GameSheet-uhd/block004_slope_01b_001.png new file mode 100644 index 00000000..44039a6f Binary files /dev/null and b/GJ_GameSheet-uhd/block004_slope_01b_001.png differ diff --git a/GJ_GameSheet-uhd/block004_slope_01c_001.png b/GJ_GameSheet-uhd/block004_slope_01c_001.png new file mode 100644 index 00000000..13a5b761 Binary files /dev/null and b/GJ_GameSheet-uhd/block004_slope_01c_001.png differ diff --git a/GJ_GameSheet-uhd/block004_slope_01d_001.png b/GJ_GameSheet-uhd/block004_slope_01d_001.png new file mode 100644 index 00000000..1639e0cd Binary files /dev/null and b/GJ_GameSheet-uhd/block004_slope_01d_001.png differ diff --git a/GJ_GameSheet-uhd/block004_slope_02_001.png b/GJ_GameSheet-uhd/block004_slope_02_001.png new file mode 100644 index 00000000..954a8352 Binary files /dev/null and b/GJ_GameSheet-uhd/block004_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block004_slope_02b_001.png b/GJ_GameSheet-uhd/block004_slope_02b_001.png new file mode 100644 index 00000000..1c4b75fe Binary files /dev/null and b/GJ_GameSheet-uhd/block004_slope_02b_001.png differ diff --git a/GJ_GameSheet-uhd/block004_slope_02c_001.png b/GJ_GameSheet-uhd/block004_slope_02c_001.png new file mode 100644 index 00000000..0d981484 Binary files /dev/null and b/GJ_GameSheet-uhd/block004_slope_02c_001.png differ diff --git a/GJ_GameSheet-uhd/block004_slope_02d_001.png b/GJ_GameSheet-uhd/block004_slope_02d_001.png new file mode 100644 index 00000000..a06c53a4 Binary files /dev/null and b/GJ_GameSheet-uhd/block004_slope_02d_001.png differ diff --git a/GJ_GameSheet-uhd/block005_02_001.png b/GJ_GameSheet-uhd/block005_02_001.png new file mode 100644 index 00000000..e986b5fb Binary files /dev/null and b/GJ_GameSheet-uhd/block005_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005_02_color_001.png b/GJ_GameSheet-uhd/block005_02_color_001.png new file mode 100644 index 00000000..e0d30ea2 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_02b_001.png b/GJ_GameSheet-uhd/block005_02b_001.png new file mode 100644 index 00000000..23166d69 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_02b_001.png differ diff --git a/GJ_GameSheet-uhd/block005_03_001.png b/GJ_GameSheet-uhd/block005_03_001.png new file mode 100644 index 00000000..ff54e2ff Binary files /dev/null and b/GJ_GameSheet-uhd/block005_03_001.png differ diff --git a/GJ_GameSheet-uhd/block005_03_color_001.png b/GJ_GameSheet-uhd/block005_03_color_001.png new file mode 100644 index 00000000..6cb474f2 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_04_001.png b/GJ_GameSheet-uhd/block005_04_001.png new file mode 100644 index 00000000..b7b24694 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_04_001.png differ diff --git a/GJ_GameSheet-uhd/block005_04_color_001.png b/GJ_GameSheet-uhd/block005_04_color_001.png new file mode 100644 index 00000000..b5fe2a68 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_04b_001.png b/GJ_GameSheet-uhd/block005_04b_001.png new file mode 100644 index 00000000..09edd5b6 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_04b_001.png differ diff --git a/GJ_GameSheet-uhd/block005_05_001.png b/GJ_GameSheet-uhd/block005_05_001.png new file mode 100644 index 00000000..73a7a737 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_05_001.png differ diff --git a/GJ_GameSheet-uhd/block005_06_001.png b/GJ_GameSheet-uhd/block005_06_001.png new file mode 100644 index 00000000..28395ca6 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_06_001.png differ diff --git a/GJ_GameSheet-uhd/block005_06_color_001.png b/GJ_GameSheet-uhd/block005_06_color_001.png new file mode 100644 index 00000000..e56974fc Binary files /dev/null and b/GJ_GameSheet-uhd/block005_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_07_001.png b/GJ_GameSheet-uhd/block005_07_001.png new file mode 100644 index 00000000..32f9443b Binary files /dev/null and b/GJ_GameSheet-uhd/block005_07_001.png differ diff --git a/GJ_GameSheet-uhd/block005_07_color_001.png b/GJ_GameSheet-uhd/block005_07_color_001.png new file mode 100644 index 00000000..91f6189f Binary files /dev/null and b/GJ_GameSheet-uhd/block005_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_08_001.png b/GJ_GameSheet-uhd/block005_08_001.png new file mode 100644 index 00000000..e3f3c572 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_08_001.png differ diff --git a/GJ_GameSheet-uhd/block005_09_001.png b/GJ_GameSheet-uhd/block005_09_001.png new file mode 100644 index 00000000..d79c72ef Binary files /dev/null and b/GJ_GameSheet-uhd/block005_09_001.png differ diff --git a/GJ_GameSheet-uhd/block005_09_color_001.png b/GJ_GameSheet-uhd/block005_09_color_001.png new file mode 100644 index 00000000..b086ae80 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_09_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_10_001.png b/GJ_GameSheet-uhd/block005_10_001.png new file mode 100644 index 00000000..da9e248e Binary files /dev/null and b/GJ_GameSheet-uhd/block005_10_001.png differ diff --git a/GJ_GameSheet-uhd/block005_10_color_001.png b/GJ_GameSheet-uhd/block005_10_color_001.png new file mode 100644 index 00000000..983a7483 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_10_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_11_001.png b/GJ_GameSheet-uhd/block005_11_001.png new file mode 100644 index 00000000..a6eabba1 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_11_001.png differ diff --git a/GJ_GameSheet-uhd/block005_11_color_001.png b/GJ_GameSheet-uhd/block005_11_color_001.png new file mode 100644 index 00000000..2170ba56 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_11_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_12_001.png b/GJ_GameSheet-uhd/block005_12_001.png new file mode 100644 index 00000000..0c2df65a Binary files /dev/null and b/GJ_GameSheet-uhd/block005_12_001.png differ diff --git a/GJ_GameSheet-uhd/block005_13_001.png b/GJ_GameSheet-uhd/block005_13_001.png new file mode 100644 index 00000000..e00ddcee Binary files /dev/null and b/GJ_GameSheet-uhd/block005_13_001.png differ diff --git a/GJ_GameSheet-uhd/block005_16_001.png b/GJ_GameSheet-uhd/block005_16_001.png new file mode 100644 index 00000000..e4ca4439 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_16_001.png differ diff --git a/GJ_GameSheet-uhd/block005_17_001.png b/GJ_GameSheet-uhd/block005_17_001.png new file mode 100644 index 00000000..f230dd69 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_17_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_01_001.png b/GJ_GameSheet-uhd/block005_slope_01_001.png new file mode 100644 index 00000000..3087e98f Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_01_color_001.png b/GJ_GameSheet-uhd/block005_slope_01_color_001.png new file mode 100644 index 00000000..a92efc6c Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_02_001.png b/GJ_GameSheet-uhd/block005_slope_02_001.png new file mode 100644 index 00000000..c301c509 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_02_color_001.png b/GJ_GameSheet-uhd/block005_slope_02_color_001.png new file mode 100644 index 00000000..2f6e20f9 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_03_001.png b/GJ_GameSheet-uhd/block005_slope_03_001.png new file mode 100644 index 00000000..da956bcf Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_03_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_03_color_001.png b/GJ_GameSheet-uhd/block005_slope_03_color_001.png new file mode 100644 index 00000000..a92efc6c Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_04_001.png b/GJ_GameSheet-uhd/block005_slope_04_001.png new file mode 100644 index 00000000..b7009786 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_04_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_04_color_001.png b/GJ_GameSheet-uhd/block005_slope_04_color_001.png new file mode 100644 index 00000000..2f6e20f9 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_05_001.png b/GJ_GameSheet-uhd/block005_slope_05_001.png new file mode 100644 index 00000000..ed1b6e9f Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_05_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_06_001.png b/GJ_GameSheet-uhd/block005_slope_06_001.png new file mode 100644 index 00000000..b3a812e1 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_06_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_01_001.png b/GJ_GameSheet-uhd/block005_slope_square_01_001.png new file mode 100644 index 00000000..5cbd4b04 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_01_color_001.png b/GJ_GameSheet-uhd/block005_slope_square_01_color_001.png new file mode 100644 index 00000000..28791685 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_02_001.png b/GJ_GameSheet-uhd/block005_slope_square_02_001.png new file mode 100644 index 00000000..da767164 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_02_color_001.png b/GJ_GameSheet-uhd/block005_slope_square_02_color_001.png new file mode 100644 index 00000000..c5e16643 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_03_001.png b/GJ_GameSheet-uhd/block005_slope_square_03_001.png new file mode 100644 index 00000000..79541c8c Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_03_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_04_001.png b/GJ_GameSheet-uhd/block005_slope_square_04_001.png new file mode 100644 index 00000000..00472745 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_04_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_04_color_001.png b/GJ_GameSheet-uhd/block005_slope_square_04_color_001.png new file mode 100644 index 00000000..28791685 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_05_001.png b/GJ_GameSheet-uhd/block005_slope_square_05_001.png new file mode 100644 index 00000000..c40b41cb Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_05_001.png differ diff --git a/GJ_GameSheet-uhd/block005_slope_square_05_color_001.png b/GJ_GameSheet-uhd/block005_slope_square_05_color_001.png new file mode 100644 index 00000000..c5e16643 Binary files /dev/null and b/GJ_GameSheet-uhd/block005_slope_square_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_02_001.png b/GJ_GameSheet-uhd/block005b_02_001.png new file mode 100644 index 00000000..1b2edf0e Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_02_color_001.png b/GJ_GameSheet-uhd/block005b_02_color_001.png new file mode 100644 index 00000000..e0d30ea2 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_02b_001.png b/GJ_GameSheet-uhd/block005b_02b_001.png new file mode 100644 index 00000000..6d0e8f63 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_02b_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_03_001.png b/GJ_GameSheet-uhd/block005b_03_001.png new file mode 100644 index 00000000..ba1c141e Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_03_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_03_color_001.png b/GJ_GameSheet-uhd/block005b_03_color_001.png new file mode 100644 index 00000000..6cb474f2 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_04_001.png b/GJ_GameSheet-uhd/block005b_04_001.png new file mode 100644 index 00000000..090c5f70 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_04_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_04_color_001.png b/GJ_GameSheet-uhd/block005b_04_color_001.png new file mode 100644 index 00000000..b5fe2a68 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_04b_001.png b/GJ_GameSheet-uhd/block005b_04b_001.png new file mode 100644 index 00000000..ce7cd992 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_04b_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_05_001.png b/GJ_GameSheet-uhd/block005b_05_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_05_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_06_001.png b/GJ_GameSheet-uhd/block005b_06_001.png new file mode 100644 index 00000000..ed314e9b Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_06_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_06_color_001.png b/GJ_GameSheet-uhd/block005b_06_color_001.png new file mode 100644 index 00000000..e56974fc Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_07_001.png b/GJ_GameSheet-uhd/block005b_07_001.png new file mode 100644 index 00000000..7e175fec Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_07_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_07_color_001.png b/GJ_GameSheet-uhd/block005b_07_color_001.png new file mode 100644 index 00000000..91f6189f Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_08_001.png b/GJ_GameSheet-uhd/block005b_08_001.png new file mode 100644 index 00000000..35d23ff1 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_08_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_09_001.png b/GJ_GameSheet-uhd/block005b_09_001.png new file mode 100644 index 00000000..bacf1bc6 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_09_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_09_color_001.png b/GJ_GameSheet-uhd/block005b_09_color_001.png new file mode 100644 index 00000000..b086ae80 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_09_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_10_001.png b/GJ_GameSheet-uhd/block005b_10_001.png new file mode 100644 index 00000000..dc9d8576 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_10_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_10_color_001.png b/GJ_GameSheet-uhd/block005b_10_color_001.png new file mode 100644 index 00000000..983a7483 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_10_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_11_001.png b/GJ_GameSheet-uhd/block005b_11_001.png new file mode 100644 index 00000000..22610f3f Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_11_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_11_color_001.png b/GJ_GameSheet-uhd/block005b_11_color_001.png new file mode 100644 index 00000000..2170ba56 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_11_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_12_001.png b/GJ_GameSheet-uhd/block005b_12_001.png new file mode 100644 index 00000000..1518ebce Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_12_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_13_001.png b/GJ_GameSheet-uhd/block005b_13_001.png new file mode 100644 index 00000000..a583a765 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_13_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_16_001.png b/GJ_GameSheet-uhd/block005b_16_001.png new file mode 100644 index 00000000..f94fe875 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_16_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_17_001.png b/GJ_GameSheet-uhd/block005b_17_001.png new file mode 100644 index 00000000..30ce8745 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_17_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_01_001.png b/GJ_GameSheet-uhd/block005b_slope_01_001.png new file mode 100644 index 00000000..0e694da4 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_01_color_001.png b/GJ_GameSheet-uhd/block005b_slope_01_color_001.png new file mode 100644 index 00000000..a92efc6c Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_02_001.png b/GJ_GameSheet-uhd/block005b_slope_02_001.png new file mode 100644 index 00000000..74e51117 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_02_color_001.png b/GJ_GameSheet-uhd/block005b_slope_02_color_001.png new file mode 100644 index 00000000..2f6e20f9 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_03_001.png b/GJ_GameSheet-uhd/block005b_slope_03_001.png new file mode 100644 index 00000000..2874e85a Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_03_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_03_color_001.png b/GJ_GameSheet-uhd/block005b_slope_03_color_001.png new file mode 100644 index 00000000..a92efc6c Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_04_001.png b/GJ_GameSheet-uhd/block005b_slope_04_001.png new file mode 100644 index 00000000..14d6e206 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_04_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_04_color_001.png b/GJ_GameSheet-uhd/block005b_slope_04_color_001.png new file mode 100644 index 00000000..2f6e20f9 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_05_001.png b/GJ_GameSheet-uhd/block005b_slope_05_001.png new file mode 100644 index 00000000..2b6f1822 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_05_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_06_001.png b/GJ_GameSheet-uhd/block005b_slope_06_001.png new file mode 100644 index 00000000..12c23d5c Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_06_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_01_001.png b/GJ_GameSheet-uhd/block005b_slope_square_01_001.png new file mode 100644 index 00000000..b1c56f5b Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_01_color_001.png b/GJ_GameSheet-uhd/block005b_slope_square_01_color_001.png new file mode 100644 index 00000000..28791685 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_02_001.png b/GJ_GameSheet-uhd/block005b_slope_square_02_001.png new file mode 100644 index 00000000..04edcddd Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_02_color_001.png b/GJ_GameSheet-uhd/block005b_slope_square_02_color_001.png new file mode 100644 index 00000000..c5e16643 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_03_001.png b/GJ_GameSheet-uhd/block005b_slope_square_03_001.png new file mode 100644 index 00000000..018c7f70 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_03_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_04_001.png b/GJ_GameSheet-uhd/block005b_slope_square_04_001.png new file mode 100644 index 00000000..d91c6154 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_04_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_04_color_001.png b/GJ_GameSheet-uhd/block005b_slope_square_04_color_001.png new file mode 100644 index 00000000..28791685 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_05_001.png b/GJ_GameSheet-uhd/block005b_slope_square_05_001.png new file mode 100644 index 00000000..099f2754 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_05_001.png differ diff --git a/GJ_GameSheet-uhd/block005b_slope_square_05_color_001.png b/GJ_GameSheet-uhd/block005b_slope_square_05_color_001.png new file mode 100644 index 00000000..c5e16643 Binary files /dev/null and b/GJ_GameSheet-uhd/block005b_slope_square_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_02_001.png b/GJ_GameSheet-uhd/block005c_02_001.png new file mode 100644 index 00000000..61286d57 Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_03_001.png b/GJ_GameSheet-uhd/block005c_03_001.png new file mode 100644 index 00000000..25bfd97a Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_03_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_04_001.png b/GJ_GameSheet-uhd/block005c_04_001.png new file mode 100644 index 00000000..c9e4e9ca Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_04_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_06_001.png b/GJ_GameSheet-uhd/block005c_06_001.png new file mode 100644 index 00000000..3e9eda53 Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_06_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_10_001.png b/GJ_GameSheet-uhd/block005c_10_001.png new file mode 100644 index 00000000..44271adb Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_10_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_11_001.png b/GJ_GameSheet-uhd/block005c_11_001.png new file mode 100644 index 00000000..ab28c836 Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_11_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_slope_01_001.png b/GJ_GameSheet-uhd/block005c_slope_01_001.png new file mode 100644 index 00000000..3f9bb1bb Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_slope_02_001.png b/GJ_GameSheet-uhd/block005c_slope_02_001.png new file mode 100644 index 00000000..2c02040a Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_slope_square_01_001.png b/GJ_GameSheet-uhd/block005c_slope_square_01_001.png new file mode 100644 index 00000000..de6fe4b2 Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_slope_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_slope_square_02_001.png b/GJ_GameSheet-uhd/block005c_slope_square_02_001.png new file mode 100644 index 00000000..f461cd6d Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_slope_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/block005c_slope_square_03_001.png b/GJ_GameSheet-uhd/block005c_slope_square_03_001.png new file mode 100644 index 00000000..47b60d2c Binary files /dev/null and b/GJ_GameSheet-uhd/block005c_slope_square_03_001.png differ diff --git a/GJ_GameSheet-uhd/block006_01_001.png b/GJ_GameSheet-uhd/block006_01_001.png new file mode 100644 index 00000000..bb1d3e19 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_01_001.png differ diff --git a/GJ_GameSheet-uhd/block006_02_001.png b/GJ_GameSheet-uhd/block006_02_001.png new file mode 100644 index 00000000..3f97716d Binary files /dev/null and b/GJ_GameSheet-uhd/block006_02_001.png differ diff --git a/GJ_GameSheet-uhd/block006_03_001.png b/GJ_GameSheet-uhd/block006_03_001.png new file mode 100644 index 00000000..328d46d6 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_03_001.png differ diff --git a/GJ_GameSheet-uhd/block006_04_001.png b/GJ_GameSheet-uhd/block006_04_001.png new file mode 100644 index 00000000..a6932127 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_04_001.png differ diff --git a/GJ_GameSheet-uhd/block006_05_001.png b/GJ_GameSheet-uhd/block006_05_001.png new file mode 100644 index 00000000..ee2426f5 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_05_001.png differ diff --git a/GJ_GameSheet-uhd/block006_06_001.png b/GJ_GameSheet-uhd/block006_06_001.png new file mode 100644 index 00000000..d3333f8a Binary files /dev/null and b/GJ_GameSheet-uhd/block006_06_001.png differ diff --git a/GJ_GameSheet-uhd/block006_07_001.png b/GJ_GameSheet-uhd/block006_07_001.png new file mode 100644 index 00000000..d947692a Binary files /dev/null and b/GJ_GameSheet-uhd/block006_07_001.png differ diff --git a/GJ_GameSheet-uhd/block006_08_001.png b/GJ_GameSheet-uhd/block006_08_001.png new file mode 100644 index 00000000..eecd233c Binary files /dev/null and b/GJ_GameSheet-uhd/block006_08_001.png differ diff --git a/GJ_GameSheet-uhd/block006_09_001.png b/GJ_GameSheet-uhd/block006_09_001.png new file mode 100644 index 00000000..472b797b Binary files /dev/null and b/GJ_GameSheet-uhd/block006_09_001.png differ diff --git a/GJ_GameSheet-uhd/block006_10_001.png b/GJ_GameSheet-uhd/block006_10_001.png new file mode 100644 index 00000000..356b003b Binary files /dev/null and b/GJ_GameSheet-uhd/block006_10_001.png differ diff --git a/GJ_GameSheet-uhd/block006_11_001.png b/GJ_GameSheet-uhd/block006_11_001.png new file mode 100644 index 00000000..d9a59cf1 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_11_001.png differ diff --git a/GJ_GameSheet-uhd/block006_12_001.png b/GJ_GameSheet-uhd/block006_12_001.png new file mode 100644 index 00000000..ac67a18d Binary files /dev/null and b/GJ_GameSheet-uhd/block006_12_001.png differ diff --git a/GJ_GameSheet-uhd/block006_13_001.png b/GJ_GameSheet-uhd/block006_13_001.png new file mode 100644 index 00000000..a301e331 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_13_001.png differ diff --git a/GJ_GameSheet-uhd/block006_14_001.png b/GJ_GameSheet-uhd/block006_14_001.png new file mode 100644 index 00000000..86b85660 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_14_001.png differ diff --git a/GJ_GameSheet-uhd/block006_15_001.png b/GJ_GameSheet-uhd/block006_15_001.png new file mode 100644 index 00000000..8c21884e Binary files /dev/null and b/GJ_GameSheet-uhd/block006_15_001.png differ diff --git a/GJ_GameSheet-uhd/block006_16_001.png b/GJ_GameSheet-uhd/block006_16_001.png new file mode 100644 index 00000000..d0ffe676 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_16_001.png differ diff --git a/GJ_GameSheet-uhd/block006_17_001.png b/GJ_GameSheet-uhd/block006_17_001.png new file mode 100644 index 00000000..b0db9684 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_17_001.png differ diff --git a/GJ_GameSheet-uhd/block006_18_001.png b/GJ_GameSheet-uhd/block006_18_001.png new file mode 100644 index 00000000..cbe7c1f3 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_18_001.png differ diff --git a/GJ_GameSheet-uhd/block006_19_001.png b/GJ_GameSheet-uhd/block006_19_001.png new file mode 100644 index 00000000..43be77e2 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_19_001.png differ diff --git a/GJ_GameSheet-uhd/block006_20_001.png b/GJ_GameSheet-uhd/block006_20_001.png new file mode 100644 index 00000000..3eac1638 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_20_001.png differ diff --git a/GJ_GameSheet-uhd/block006_21_001.png b/GJ_GameSheet-uhd/block006_21_001.png new file mode 100644 index 00000000..d6f5e49d Binary files /dev/null and b/GJ_GameSheet-uhd/block006_21_001.png differ diff --git a/GJ_GameSheet-uhd/block006_22_001.png b/GJ_GameSheet-uhd/block006_22_001.png new file mode 100644 index 00000000..65c8e318 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_22_001.png differ diff --git a/GJ_GameSheet-uhd/block006_23_001.png b/GJ_GameSheet-uhd/block006_23_001.png new file mode 100644 index 00000000..7a7d5cfa Binary files /dev/null and b/GJ_GameSheet-uhd/block006_23_001.png differ diff --git a/GJ_GameSheet-uhd/block006_24_001.png b/GJ_GameSheet-uhd/block006_24_001.png new file mode 100644 index 00000000..9894baf8 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_24_001.png differ diff --git a/GJ_GameSheet-uhd/block006_25_001.png b/GJ_GameSheet-uhd/block006_25_001.png new file mode 100644 index 00000000..832ec867 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_25_001.png differ diff --git a/GJ_GameSheet-uhd/block006_26_001.png b/GJ_GameSheet-uhd/block006_26_001.png new file mode 100644 index 00000000..744305f6 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_26_001.png differ diff --git a/GJ_GameSheet-uhd/block006_color_01_001.png b/GJ_GameSheet-uhd/block006_color_01_001.png new file mode 100644 index 00000000..c2c5b49c Binary files /dev/null and b/GJ_GameSheet-uhd/block006_color_01_001.png differ diff --git a/GJ_GameSheet-uhd/block006_color_02_001.png b/GJ_GameSheet-uhd/block006_color_02_001.png new file mode 100644 index 00000000..b2b53a8d Binary files /dev/null and b/GJ_GameSheet-uhd/block006_color_02_001.png differ diff --git a/GJ_GameSheet-uhd/block006_color_03_001.png b/GJ_GameSheet-uhd/block006_color_03_001.png new file mode 100644 index 00000000..b8c15d66 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_color_03_001.png differ diff --git a/GJ_GameSheet-uhd/block006_color_04_001.png b/GJ_GameSheet-uhd/block006_color_04_001.png new file mode 100644 index 00000000..58efbebf Binary files /dev/null and b/GJ_GameSheet-uhd/block006_color_04_001.png differ diff --git a/GJ_GameSheet-uhd/block006_color_05_001.png b/GJ_GameSheet-uhd/block006_color_05_001.png new file mode 100644 index 00000000..c1fdcc1f Binary files /dev/null and b/GJ_GameSheet-uhd/block006_color_05_001.png differ diff --git a/GJ_GameSheet-uhd/block006_color_06_001.png b/GJ_GameSheet-uhd/block006_color_06_001.png new file mode 100644 index 00000000..cb603d70 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_color_06_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_01_001.png b/GJ_GameSheet-uhd/block006_slope_01_001.png new file mode 100644 index 00000000..9d2d67a6 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_01_color_001.png b/GJ_GameSheet-uhd/block006_slope_01_color_001.png new file mode 100644 index 00000000..7a6bfa21 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_02_001.png b/GJ_GameSheet-uhd/block006_slope_02_001.png new file mode 100644 index 00000000..98fc1c51 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_02_color_001.png b/GJ_GameSheet-uhd/block006_slope_02_color_001.png new file mode 100644 index 00000000..d47ba5ba Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_square_01_001.png b/GJ_GameSheet-uhd/block006_slope_square_01_001.png new file mode 100644 index 00000000..b5dd0353 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_square_01_color_001.png b/GJ_GameSheet-uhd/block006_slope_square_01_color_001.png new file mode 100644 index 00000000..48181bac Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_square_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_square_02_001.png b/GJ_GameSheet-uhd/block006_slope_square_02_001.png new file mode 100644 index 00000000..dbe965f4 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_square_02_color_001.png b/GJ_GameSheet-uhd/block006_slope_square_02_color_001.png new file mode 100644 index 00000000..f4a9ae00 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_square_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_square_03_001.png b/GJ_GameSheet-uhd/block006_slope_square_03_001.png new file mode 100644 index 00000000..e0985140 Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_square_03_001.png differ diff --git a/GJ_GameSheet-uhd/block006_slope_square_04_001.png b/GJ_GameSheet-uhd/block006_slope_square_04_001.png new file mode 100644 index 00000000..a6b8417f Binary files /dev/null and b/GJ_GameSheet-uhd/block006_slope_square_04_001.png differ diff --git a/GJ_GameSheet-uhd/block007_01_001.png b/GJ_GameSheet-uhd/block007_01_001.png new file mode 100644 index 00000000..ea537ac8 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_01_001.png differ diff --git a/GJ_GameSheet-uhd/block007_01_small_001.png b/GJ_GameSheet-uhd/block007_01_small_001.png new file mode 100644 index 00000000..3b82d304 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_01_small_001.png differ diff --git a/GJ_GameSheet-uhd/block007_02_001.png b/GJ_GameSheet-uhd/block007_02_001.png new file mode 100644 index 00000000..39633313 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_02_001.png differ diff --git a/GJ_GameSheet-uhd/block007_03_001.png b/GJ_GameSheet-uhd/block007_03_001.png new file mode 100644 index 00000000..35a43fd0 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_03_001.png differ diff --git a/GJ_GameSheet-uhd/block007_04_001.png b/GJ_GameSheet-uhd/block007_04_001.png new file mode 100644 index 00000000..dd27e91a Binary files /dev/null and b/GJ_GameSheet-uhd/block007_04_001.png differ diff --git a/GJ_GameSheet-uhd/block007_05_001.png b/GJ_GameSheet-uhd/block007_05_001.png new file mode 100644 index 00000000..af541977 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_05_001.png differ diff --git a/GJ_GameSheet-uhd/block007_06_001.png b/GJ_GameSheet-uhd/block007_06_001.png new file mode 100644 index 00000000..b7801e33 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_06_001.png differ diff --git a/GJ_GameSheet-uhd/block007_06_color_001.png b/GJ_GameSheet-uhd/block007_06_color_001.png new file mode 100644 index 00000000..c0236fb4 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007_07_001.png b/GJ_GameSheet-uhd/block007_07_001.png new file mode 100644 index 00000000..cc1ac7bd Binary files /dev/null and b/GJ_GameSheet-uhd/block007_07_001.png differ diff --git a/GJ_GameSheet-uhd/block007_07_color_001.png b/GJ_GameSheet-uhd/block007_07_color_001.png new file mode 100644 index 00000000..44c7e09e Binary files /dev/null and b/GJ_GameSheet-uhd/block007_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007_08_001.png b/GJ_GameSheet-uhd/block007_08_001.png new file mode 100644 index 00000000..a1da5d4f Binary files /dev/null and b/GJ_GameSheet-uhd/block007_08_001.png differ diff --git a/GJ_GameSheet-uhd/block007_08_color_001.png b/GJ_GameSheet-uhd/block007_08_color_001.png new file mode 100644 index 00000000..05401645 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007_09_001.png b/GJ_GameSheet-uhd/block007_09_001.png new file mode 100644 index 00000000..37b3a2bd Binary files /dev/null and b/GJ_GameSheet-uhd/block007_09_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_001_001.png b/GJ_GameSheet-uhd/block007_bgcolor_001_001.png new file mode 100644 index 00000000..e987b9ff Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_001_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_002_001.png b/GJ_GameSheet-uhd/block007_bgcolor_002_001.png new file mode 100644 index 00000000..85bb7d30 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_002_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_003_001.png b/GJ_GameSheet-uhd/block007_bgcolor_003_001.png new file mode 100644 index 00000000..8f1c8e05 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_003_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_004_001.png b/GJ_GameSheet-uhd/block007_bgcolor_004_001.png new file mode 100644 index 00000000..a847c308 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_004_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_005_001.png b/GJ_GameSheet-uhd/block007_bgcolor_005_001.png new file mode 100644 index 00000000..d43f3030 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_005_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_006_001.png b/GJ_GameSheet-uhd/block007_bgcolor_006_001.png new file mode 100644 index 00000000..112ed31c Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_006_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_007_001.png b/GJ_GameSheet-uhd/block007_bgcolor_007_001.png new file mode 100644 index 00000000..88e5f9bc Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_007_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_008_001.png b/GJ_GameSheet-uhd/block007_bgcolor_008_001.png new file mode 100644 index 00000000..9e9f801e Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_008_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_009_001.png b/GJ_GameSheet-uhd/block007_bgcolor_009_001.png new file mode 100644 index 00000000..77102684 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_009_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_010_001.png b/GJ_GameSheet-uhd/block007_bgcolor_010_001.png new file mode 100644 index 00000000..4c2554a8 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_010_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_011_001.png b/GJ_GameSheet-uhd/block007_bgcolor_011_001.png new file mode 100644 index 00000000..f7d58c96 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_011_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_012_001.png b/GJ_GameSheet-uhd/block007_bgcolor_012_001.png new file mode 100644 index 00000000..aaac17ab Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_012_001.png differ diff --git a/GJ_GameSheet-uhd/block007_bgcolor_013_001.png b/GJ_GameSheet-uhd/block007_bgcolor_013_001.png new file mode 100644 index 00000000..a106d29d Binary files /dev/null and b/GJ_GameSheet-uhd/block007_bgcolor_013_001.png differ diff --git a/GJ_GameSheet-uhd/block007_color_001_001.png b/GJ_GameSheet-uhd/block007_color_001_001.png new file mode 100644 index 00000000..15f3ccfc Binary files /dev/null and b/GJ_GameSheet-uhd/block007_color_001_001.png differ diff --git a/GJ_GameSheet-uhd/block007_color_002_001.png b/GJ_GameSheet-uhd/block007_color_002_001.png new file mode 100644 index 00000000..d4d16ef3 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_color_002_001.png differ diff --git a/GJ_GameSheet-uhd/block007_color_003_001.png b/GJ_GameSheet-uhd/block007_color_003_001.png new file mode 100644 index 00000000..4f5edfb8 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_color_003_001.png differ diff --git a/GJ_GameSheet-uhd/block007_color_004_001.png b/GJ_GameSheet-uhd/block007_color_004_001.png new file mode 100644 index 00000000..2fb24600 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_color_004_001.png differ diff --git a/GJ_GameSheet-uhd/block007_color_005_001.png b/GJ_GameSheet-uhd/block007_color_005_001.png new file mode 100644 index 00000000..e3272fbd Binary files /dev/null and b/GJ_GameSheet-uhd/block007_color_005_001.png differ diff --git a/GJ_GameSheet-uhd/block007_color_006_001.png b/GJ_GameSheet-uhd/block007_color_006_001.png new file mode 100644 index 00000000..c71c30dd Binary files /dev/null and b/GJ_GameSheet-uhd/block007_color_006_001.png differ diff --git a/GJ_GameSheet-uhd/block007_color_007_001.png b/GJ_GameSheet-uhd/block007_color_007_001.png new file mode 100644 index 00000000..4b55237d Binary files /dev/null and b/GJ_GameSheet-uhd/block007_color_007_001.png differ diff --git a/GJ_GameSheet-uhd/block007_color_008_001.png b/GJ_GameSheet-uhd/block007_color_008_001.png new file mode 100644 index 00000000..f3267240 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_color_008_001.png differ diff --git a/GJ_GameSheet-uhd/block007_corner_001.png b/GJ_GameSheet-uhd/block007_corner_001.png new file mode 100644 index 00000000..bbffb8a6 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_corner_001.png differ diff --git a/GJ_GameSheet-uhd/block007_slope_01_001.png b/GJ_GameSheet-uhd/block007_slope_01_001.png new file mode 100644 index 00000000..bca0dafc Binary files /dev/null and b/GJ_GameSheet-uhd/block007_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block007_slope_01_color_001.png b/GJ_GameSheet-uhd/block007_slope_01_color_001.png new file mode 100644 index 00000000..b58ff4cd Binary files /dev/null and b/GJ_GameSheet-uhd/block007_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007_slope_02_001.png b/GJ_GameSheet-uhd/block007_slope_02_001.png new file mode 100644 index 00000000..4544cc6d Binary files /dev/null and b/GJ_GameSheet-uhd/block007_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block007_slope_02_color_001.png b/GJ_GameSheet-uhd/block007_slope_02_color_001.png new file mode 100644 index 00000000..a8d79073 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007_slope_square_01_001.png b/GJ_GameSheet-uhd/block007_slope_square_01_001.png new file mode 100644 index 00000000..d663b9f4 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_slope_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/block007_slope_square_01_color_001.png b/GJ_GameSheet-uhd/block007_slope_square_01_color_001.png new file mode 100644 index 00000000..bd728f1e Binary files /dev/null and b/GJ_GameSheet-uhd/block007_slope_square_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007_slope_square_02_001.png b/GJ_GameSheet-uhd/block007_slope_square_02_001.png new file mode 100644 index 00000000..5caf54d0 Binary files /dev/null and b/GJ_GameSheet-uhd/block007_slope_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/block007_slope_square_02_color_001.png b/GJ_GameSheet-uhd/block007_slope_square_02_color_001.png new file mode 100644 index 00000000..4aeeeded Binary files /dev/null and b/GJ_GameSheet-uhd/block007_slope_square_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_01_001.png b/GJ_GameSheet-uhd/block007b_01_001.png new file mode 100644 index 00000000..e6af495e Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_01_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_01_color_001.png b/GJ_GameSheet-uhd/block007b_01_color_001.png new file mode 100644 index 00000000..d266e206 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_02_color_001.png b/GJ_GameSheet-uhd/block007b_02_color_001.png new file mode 100644 index 00000000..3a9da888 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_03_001.png b/GJ_GameSheet-uhd/block007b_03_001.png new file mode 100644 index 00000000..1fcf00de Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_03_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_03_color_001.png b/GJ_GameSheet-uhd/block007b_03_color_001.png new file mode 100644 index 00000000..872d6c51 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_04_color_001.png b/GJ_GameSheet-uhd/block007b_04_color_001.png new file mode 100644 index 00000000..cbbc05e2 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_05_001.png b/GJ_GameSheet-uhd/block007b_05_001.png new file mode 100644 index 00000000..6dd3a17c Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_05_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_05_color_001.png b/GJ_GameSheet-uhd/block007b_05_color_001.png new file mode 100644 index 00000000..1a1595c8 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_06_001.png b/GJ_GameSheet-uhd/block007b_06_001.png new file mode 100644 index 00000000..8e86cdd3 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_06_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_06_color_001.png b/GJ_GameSheet-uhd/block007b_06_color_001.png new file mode 100644 index 00000000..612dbee7 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_07_001.png b/GJ_GameSheet-uhd/block007b_07_001.png new file mode 100644 index 00000000..e5af6c7f Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_07_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_07_color_001.png b/GJ_GameSheet-uhd/block007b_07_color_001.png new file mode 100644 index 00000000..0f6986b6 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_08_001.png b/GJ_GameSheet-uhd/block007b_08_001.png new file mode 100644 index 00000000..16d778d9 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_08_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_08_color_001.png b/GJ_GameSheet-uhd/block007b_08_color_001.png new file mode 100644 index 00000000..434e95eb Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_bgcolor_01_001.png b/GJ_GameSheet-uhd/block007b_bgcolor_01_001.png new file mode 100644 index 00000000..8b8b77c1 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_bgcolor_01_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_bgcolor_02_001.png b/GJ_GameSheet-uhd/block007b_bgcolor_02_001.png new file mode 100644 index 00000000..4d6feef9 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_bgcolor_02_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_bgcolor_03_001.png b/GJ_GameSheet-uhd/block007b_bgcolor_03_001.png new file mode 100644 index 00000000..cbf64ef6 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_bgcolor_03_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_bgcolor_05_001.png b/GJ_GameSheet-uhd/block007b_bgcolor_05_001.png new file mode 100644 index 00000000..653332e5 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_bgcolor_05_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_bgcolor_06_001.png b/GJ_GameSheet-uhd/block007b_bgcolor_06_001.png new file mode 100644 index 00000000..362449b1 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_bgcolor_06_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_bgcolor_07_001.png b/GJ_GameSheet-uhd/block007b_bgcolor_07_001.png new file mode 100644 index 00000000..9a44b269 Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_bgcolor_07_001.png differ diff --git a/GJ_GameSheet-uhd/block007b_bgcolor_08_001.png b/GJ_GameSheet-uhd/block007b_bgcolor_08_001.png new file mode 100644 index 00000000..a351cfcd Binary files /dev/null and b/GJ_GameSheet-uhd/block007b_bgcolor_08_001.png differ diff --git a/GJ_GameSheet-uhd/block008_02_001.png b/GJ_GameSheet-uhd/block008_02_001.png new file mode 100644 index 00000000..0532abad Binary files /dev/null and b/GJ_GameSheet-uhd/block008_02_001.png differ diff --git a/GJ_GameSheet-uhd/block008_02_color_001.png b/GJ_GameSheet-uhd/block008_02_color_001.png new file mode 100644 index 00000000..e76a0a86 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block008_03_001.png b/GJ_GameSheet-uhd/block008_03_001.png new file mode 100644 index 00000000..12ae6a9e Binary files /dev/null and b/GJ_GameSheet-uhd/block008_03_001.png differ diff --git a/GJ_GameSheet-uhd/block008_03_color_001.png b/GJ_GameSheet-uhd/block008_03_color_001.png new file mode 100644 index 00000000..9be397ac Binary files /dev/null and b/GJ_GameSheet-uhd/block008_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block008_04_001.png b/GJ_GameSheet-uhd/block008_04_001.png new file mode 100644 index 00000000..3af34db7 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_04_001.png differ diff --git a/GJ_GameSheet-uhd/block008_04_color_001.png b/GJ_GameSheet-uhd/block008_04_color_001.png new file mode 100644 index 00000000..13f383c4 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block008_05_001.png b/GJ_GameSheet-uhd/block008_05_001.png new file mode 100644 index 00000000..195dac8a Binary files /dev/null and b/GJ_GameSheet-uhd/block008_05_001.png differ diff --git a/GJ_GameSheet-uhd/block008_05_color_001.png b/GJ_GameSheet-uhd/block008_05_color_001.png new file mode 100644 index 00000000..4bba8d23 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block008_06_001.png b/GJ_GameSheet-uhd/block008_06_001.png new file mode 100644 index 00000000..5e84b2a3 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_06_001.png differ diff --git a/GJ_GameSheet-uhd/block008_06_color_001.png b/GJ_GameSheet-uhd/block008_06_color_001.png new file mode 100644 index 00000000..e63aa6b5 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block008_06_color_b_001.png b/GJ_GameSheet-uhd/block008_06_color_b_001.png new file mode 100644 index 00000000..641b1da0 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_06_color_b_001.png differ diff --git a/GJ_GameSheet-uhd/block008_07_001.png b/GJ_GameSheet-uhd/block008_07_001.png new file mode 100644 index 00000000..821270ad Binary files /dev/null and b/GJ_GameSheet-uhd/block008_07_001.png differ diff --git a/GJ_GameSheet-uhd/block008_07_color_001.png b/GJ_GameSheet-uhd/block008_07_color_001.png new file mode 100644 index 00000000..4fa938a5 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block008_08_001.png b/GJ_GameSheet-uhd/block008_08_001.png new file mode 100644 index 00000000..f047ef4d Binary files /dev/null and b/GJ_GameSheet-uhd/block008_08_001.png differ diff --git a/GJ_GameSheet-uhd/block008_08_color_001.png b/GJ_GameSheet-uhd/block008_08_color_001.png new file mode 100644 index 00000000..17cc29ea Binary files /dev/null and b/GJ_GameSheet-uhd/block008_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/block008_09_001.png b/GJ_GameSheet-uhd/block008_09_001.png new file mode 100644 index 00000000..bdd6d7d6 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_09_001.png differ diff --git a/GJ_GameSheet-uhd/block008_10_001.png b/GJ_GameSheet-uhd/block008_10_001.png new file mode 100644 index 00000000..7178f50a Binary files /dev/null and b/GJ_GameSheet-uhd/block008_10_001.png differ diff --git a/GJ_GameSheet-uhd/block008_11_001.png b/GJ_GameSheet-uhd/block008_11_001.png new file mode 100644 index 00000000..d02ea93b Binary files /dev/null and b/GJ_GameSheet-uhd/block008_11_001.png differ diff --git a/GJ_GameSheet-uhd/block008_color_05b_001.png b/GJ_GameSheet-uhd/block008_color_05b_001.png new file mode 100644 index 00000000..641b1da0 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_color_05b_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_01_001.png b/GJ_GameSheet-uhd/block008_topcolor_01_001.png new file mode 100644 index 00000000..8b157530 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_01_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_02_001.png b/GJ_GameSheet-uhd/block008_topcolor_02_001.png new file mode 100644 index 00000000..0dbefa90 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_02_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_06_001.png b/GJ_GameSheet-uhd/block008_topcolor_06_001.png new file mode 100644 index 00000000..6785a1e6 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_06_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_07_001.png b/GJ_GameSheet-uhd/block008_topcolor_07_001.png new file mode 100644 index 00000000..bf9ff875 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_07_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_07b_001.png b/GJ_GameSheet-uhd/block008_topcolor_07b_001.png new file mode 100644 index 00000000..f1cb5992 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_07b_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_07c_001.png b/GJ_GameSheet-uhd/block008_topcolor_07c_001.png new file mode 100644 index 00000000..93adb567 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_07c_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_08_001.png b/GJ_GameSheet-uhd/block008_topcolor_08_001.png new file mode 100644 index 00000000..bdd6ca50 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_08_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_08b_001.png b/GJ_GameSheet-uhd/block008_topcolor_08b_001.png new file mode 100644 index 00000000..b2356bb7 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_08b_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_10_001.png b/GJ_GameSheet-uhd/block008_topcolor_10_001.png new file mode 100644 index 00000000..1ffc33b9 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_10_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_10b_001.png b/GJ_GameSheet-uhd/block008_topcolor_10b_001.png new file mode 100644 index 00000000..78e2c842 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_10b_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_11_001.png b/GJ_GameSheet-uhd/block008_topcolor_11_001.png new file mode 100644 index 00000000..52293af4 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_11_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_12_001.png b/GJ_GameSheet-uhd/block008_topcolor_12_001.png new file mode 100644 index 00000000..498dee8d Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_12_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_13_001.png b/GJ_GameSheet-uhd/block008_topcolor_13_001.png new file mode 100644 index 00000000..453c5988 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_13_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_15_001.png b/GJ_GameSheet-uhd/block008_topcolor_15_001.png new file mode 100644 index 00000000..1f2d66ce Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_15_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_16_001.png b/GJ_GameSheet-uhd/block008_topcolor_16_001.png new file mode 100644 index 00000000..6de6de4f Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_16_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_18_001.png b/GJ_GameSheet-uhd/block008_topcolor_18_001.png new file mode 100644 index 00000000..ab737661 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_18_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_22_001.png b/GJ_GameSheet-uhd/block008_topcolor_22_001.png new file mode 100644 index 00000000..b025c90e Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_22_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_23_001.png b/GJ_GameSheet-uhd/block008_topcolor_23_001.png new file mode 100644 index 00000000..fd27a391 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_23_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_24b_001.png b/GJ_GameSheet-uhd/block008_topcolor_24b_001.png new file mode 100644 index 00000000..01da609c Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_24b_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_25_001.png b/GJ_GameSheet-uhd/block008_topcolor_25_001.png new file mode 100644 index 00000000..88a79642 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_25_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_26_001.png b/GJ_GameSheet-uhd/block008_topcolor_26_001.png new file mode 100644 index 00000000..26ec1d87 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_26_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_27_001.png b/GJ_GameSheet-uhd/block008_topcolor_27_001.png new file mode 100644 index 00000000..6f23092d Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_27_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_28_001.png b/GJ_GameSheet-uhd/block008_topcolor_28_001.png new file mode 100644 index 00000000..91535b87 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_28_001.png differ diff --git a/GJ_GameSheet-uhd/block008_topcolor_29_001.png b/GJ_GameSheet-uhd/block008_topcolor_29_001.png new file mode 100644 index 00000000..613c1767 Binary files /dev/null and b/GJ_GameSheet-uhd/block008_topcolor_29_001.png differ diff --git a/GJ_GameSheet-uhd/block009_01_001.png b/GJ_GameSheet-uhd/block009_01_001.png new file mode 100644 index 00000000..680b5e59 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009_01_color_001.png b/GJ_GameSheet-uhd/block009_01_color_001.png new file mode 100644 index 00000000..3ce9b34a Binary files /dev/null and b/GJ_GameSheet-uhd/block009_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_02_001.png b/GJ_GameSheet-uhd/block009_02_001.png new file mode 100644 index 00000000..b5e28fe1 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009_02_color_001.png b/GJ_GameSheet-uhd/block009_02_color_001.png new file mode 100644 index 00000000..fa647262 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_03_001.png b/GJ_GameSheet-uhd/block009_03_001.png new file mode 100644 index 00000000..c6dbd668 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_03_001.png differ diff --git a/GJ_GameSheet-uhd/block009_03_color_001.png b/GJ_GameSheet-uhd/block009_03_color_001.png new file mode 100644 index 00000000..3d336800 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_04_001.png b/GJ_GameSheet-uhd/block009_04_001.png new file mode 100644 index 00000000..71be43e8 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_04_001.png differ diff --git a/GJ_GameSheet-uhd/block009_04_color_001.png b/GJ_GameSheet-uhd/block009_04_color_001.png new file mode 100644 index 00000000..10233c1b Binary files /dev/null and b/GJ_GameSheet-uhd/block009_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_05_001.png b/GJ_GameSheet-uhd/block009_05_001.png new file mode 100644 index 00000000..e3481970 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_05_001.png differ diff --git a/GJ_GameSheet-uhd/block009_05_color_001.png b/GJ_GameSheet-uhd/block009_05_color_001.png new file mode 100644 index 00000000..ad51a709 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_06_001.png b/GJ_GameSheet-uhd/block009_06_001.png new file mode 100644 index 00000000..fab5904b Binary files /dev/null and b/GJ_GameSheet-uhd/block009_06_001.png differ diff --git a/GJ_GameSheet-uhd/block009_06_color_001.png b/GJ_GameSheet-uhd/block009_06_color_001.png new file mode 100644 index 00000000..7a1eec5e Binary files /dev/null and b/GJ_GameSheet-uhd/block009_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_07_001.png b/GJ_GameSheet-uhd/block009_07_001.png new file mode 100644 index 00000000..12f80302 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_07_001.png differ diff --git a/GJ_GameSheet-uhd/block009_07_color_001.png b/GJ_GameSheet-uhd/block009_07_color_001.png new file mode 100644 index 00000000..ad51a709 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_08_001.png b/GJ_GameSheet-uhd/block009_08_001.png new file mode 100644 index 00000000..7eca7da7 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_08_001.png differ diff --git a/GJ_GameSheet-uhd/block009_08_color_001.png b/GJ_GameSheet-uhd/block009_08_color_001.png new file mode 100644 index 00000000..7a1eec5e Binary files /dev/null and b/GJ_GameSheet-uhd/block009_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_part_01_001.png b/GJ_GameSheet-uhd/block009_part_01_001.png new file mode 100644 index 00000000..0c51a3ec Binary files /dev/null and b/GJ_GameSheet-uhd/block009_part_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009_part_01_color_001.png b/GJ_GameSheet-uhd/block009_part_01_color_001.png new file mode 100644 index 00000000..f1d6351e Binary files /dev/null and b/GJ_GameSheet-uhd/block009_part_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_part_02_001.png b/GJ_GameSheet-uhd/block009_part_02_001.png new file mode 100644 index 00000000..e58ff3a3 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_part_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009_part_02_color_001.png b/GJ_GameSheet-uhd/block009_part_02_color_001.png new file mode 100644 index 00000000..f2a1ebc3 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_part_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_slope_01_001.png b/GJ_GameSheet-uhd/block009_slope_01_001.png new file mode 100644 index 00000000..5ac96fa6 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009_slope_01_color_001.png b/GJ_GameSheet-uhd/block009_slope_01_color_001.png new file mode 100644 index 00000000..bcb47cba Binary files /dev/null and b/GJ_GameSheet-uhd/block009_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009_slope_02_001.png b/GJ_GameSheet-uhd/block009_slope_02_001.png new file mode 100644 index 00000000..f43a0b7d Binary files /dev/null and b/GJ_GameSheet-uhd/block009_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009_slope_02_color_001.png b/GJ_GameSheet-uhd/block009_slope_02_color_001.png new file mode 100644 index 00000000..da5bbbf5 Binary files /dev/null and b/GJ_GameSheet-uhd/block009_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_01_001.png b/GJ_GameSheet-uhd/block009b_01_001.png new file mode 100644 index 00000000..019fe31a Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_01_color_001.png b/GJ_GameSheet-uhd/block009b_01_color_001.png new file mode 100644 index 00000000..4e5fc80e Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_02_001.png b/GJ_GameSheet-uhd/block009b_02_001.png new file mode 100644 index 00000000..3ddf07b4 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_02_color_001.png b/GJ_GameSheet-uhd/block009b_02_color_001.png new file mode 100644 index 00000000..2c1cd5ca Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_03_001.png b/GJ_GameSheet-uhd/block009b_03_001.png new file mode 100644 index 00000000..c94c0285 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_03_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_03_color_001.png b/GJ_GameSheet-uhd/block009b_03_color_001.png new file mode 100644 index 00000000..0e0d59fa Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_04_001.png b/GJ_GameSheet-uhd/block009b_04_001.png new file mode 100644 index 00000000..1b41000b Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_04_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_04_color_001.png b/GJ_GameSheet-uhd/block009b_04_color_001.png new file mode 100644 index 00000000..af2bb224 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_05_001.png b/GJ_GameSheet-uhd/block009b_05_001.png new file mode 100644 index 00000000..bbaf02e4 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_05_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_05_color_001.png b/GJ_GameSheet-uhd/block009b_05_color_001.png new file mode 100644 index 00000000..4f8146d0 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_06_001.png b/GJ_GameSheet-uhd/block009b_06_001.png new file mode 100644 index 00000000..da99bc94 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_06_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_06_color_001.png b/GJ_GameSheet-uhd/block009b_06_color_001.png new file mode 100644 index 00000000..f933fc08 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_07_001.png b/GJ_GameSheet-uhd/block009b_07_001.png new file mode 100644 index 00000000..49349e6c Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_07_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_07_color_001.png b/GJ_GameSheet-uhd/block009b_07_color_001.png new file mode 100644 index 00000000..cb73e3dd Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_08_001.png b/GJ_GameSheet-uhd/block009b_08_001.png new file mode 100644 index 00000000..f214d55e Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_08_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_08_color_001.png b/GJ_GameSheet-uhd/block009b_08_color_001.png new file mode 100644 index 00000000..4303fa2b Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_09_001.png b/GJ_GameSheet-uhd/block009b_09_001.png new file mode 100644 index 00000000..c896ddcf Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_09_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_09_color_001.png b/GJ_GameSheet-uhd/block009b_09_color_001.png new file mode 100644 index 00000000..b102ba3f Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_09_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_10_001.png b/GJ_GameSheet-uhd/block009b_10_001.png new file mode 100644 index 00000000..50788b49 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_10_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_10_color_001.png b/GJ_GameSheet-uhd/block009b_10_color_001.png new file mode 100644 index 00000000..27bd07b8 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_10_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_slope_01_001.png b/GJ_GameSheet-uhd/block009b_slope_01_001.png new file mode 100644 index 00000000..616e0e94 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_slope_01_color_001.png b/GJ_GameSheet-uhd/block009b_slope_01_color_001.png new file mode 100644 index 00000000..34d95fba Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_slope_02_001.png b/GJ_GameSheet-uhd/block009b_slope_02_001.png new file mode 100644 index 00000000..4c146288 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009b_slope_02_color_001.png b/GJ_GameSheet-uhd/block009b_slope_02_color_001.png new file mode 100644 index 00000000..b965a416 Binary files /dev/null and b/GJ_GameSheet-uhd/block009b_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_01_001.png b/GJ_GameSheet-uhd/block009c_01_001.png new file mode 100644 index 00000000..3542b241 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_02_001.png b/GJ_GameSheet-uhd/block009c_02_001.png new file mode 100644 index 00000000..b136483d Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_02_color_001.png b/GJ_GameSheet-uhd/block009c_02_color_001.png new file mode 100644 index 00000000..696c81bc Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_04_001.png b/GJ_GameSheet-uhd/block009c_04_001.png new file mode 100644 index 00000000..a841d1e3 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_04_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_04_color_001.png b/GJ_GameSheet-uhd/block009c_04_color_001.png new file mode 100644 index 00000000..d97624b7 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_05_001.png b/GJ_GameSheet-uhd/block009c_05_001.png new file mode 100644 index 00000000..95fc5647 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_05_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_05_color_001.png b/GJ_GameSheet-uhd/block009c_05_color_001.png new file mode 100644 index 00000000..a992ca80 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_10_001.png b/GJ_GameSheet-uhd/block009c_10_001.png new file mode 100644 index 00000000..4551248c Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_10_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_11_001.png b/GJ_GameSheet-uhd/block009c_11_001.png new file mode 100644 index 00000000..5fbae866 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_11_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_base_001.png b/GJ_GameSheet-uhd/block009c_base_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_base_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_01_001.png b/GJ_GameSheet-uhd/block009c_color_01_001.png new file mode 100644 index 00000000..77024c5a Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_02_001.png b/GJ_GameSheet-uhd/block009c_color_02_001.png new file mode 100644 index 00000000..1564a954 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_03_001.png b/GJ_GameSheet-uhd/block009c_color_03_001.png new file mode 100644 index 00000000..543a5cc9 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_03_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_04_001.png b/GJ_GameSheet-uhd/block009c_color_04_001.png new file mode 100644 index 00000000..8ab8c3e2 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_04_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_05_001.png b/GJ_GameSheet-uhd/block009c_color_05_001.png new file mode 100644 index 00000000..abcae8dd Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_05_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_06_001.png b/GJ_GameSheet-uhd/block009c_color_06_001.png new file mode 100644 index 00000000..b06c07dc Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_06_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_07_001.png b/GJ_GameSheet-uhd/block009c_color_07_001.png new file mode 100644 index 00000000..c72736a1 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_07_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_08_001.png b/GJ_GameSheet-uhd/block009c_color_08_001.png new file mode 100644 index 00000000..ca523e93 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_08_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_color_09_001.png b/GJ_GameSheet-uhd/block009c_color_09_001.png new file mode 100644 index 00000000..afb704d6 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_color_09_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_line_01_001.png b/GJ_GameSheet-uhd/block009c_line_01_001.png new file mode 100644 index 00000000..acf8fbe9 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_line_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_line_02_001.png b/GJ_GameSheet-uhd/block009c_line_02_001.png new file mode 100644 index 00000000..76658ca1 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_line_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_line_03_001.png b/GJ_GameSheet-uhd/block009c_line_03_001.png new file mode 100644 index 00000000..810ba6b5 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_line_03_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_line_04_001.png b/GJ_GameSheet-uhd/block009c_line_04_001.png new file mode 100644 index 00000000..7aa5c768 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_line_04_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_slope_01_001.png b/GJ_GameSheet-uhd/block009c_slope_01_001.png new file mode 100644 index 00000000..041ef15a Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_slope_01_color_001.png b/GJ_GameSheet-uhd/block009c_slope_01_color_001.png new file mode 100644 index 00000000..76db5096 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_slope_02_001.png b/GJ_GameSheet-uhd/block009c_slope_02_001.png new file mode 100644 index 00000000..865fe172 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_slope_02_color_001.png b/GJ_GameSheet-uhd/block009c_slope_02_color_001.png new file mode 100644 index 00000000..0c2750b7 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_slope_03_001.png b/GJ_GameSheet-uhd/block009c_slope_03_001.png new file mode 100644 index 00000000..90ce25f9 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_slope_03_001.png differ diff --git a/GJ_GameSheet-uhd/block009c_slope_04_001.png b/GJ_GameSheet-uhd/block009c_slope_04_001.png new file mode 100644 index 00000000..4e4de662 Binary files /dev/null and b/GJ_GameSheet-uhd/block009c_slope_04_001.png differ diff --git a/GJ_GameSheet-uhd/block010_01_001.png b/GJ_GameSheet-uhd/block010_01_001.png new file mode 100644 index 00000000..76f55b02 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_01_001.png differ diff --git a/GJ_GameSheet-uhd/block010_02_001.png b/GJ_GameSheet-uhd/block010_02_001.png new file mode 100644 index 00000000..01498762 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_02_001.png differ diff --git a/GJ_GameSheet-uhd/block010_03_001.png b/GJ_GameSheet-uhd/block010_03_001.png new file mode 100644 index 00000000..7c6b9ae7 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_03_001.png differ diff --git a/GJ_GameSheet-uhd/block010_04_001.png b/GJ_GameSheet-uhd/block010_04_001.png new file mode 100644 index 00000000..3d539ce5 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_04_001.png differ diff --git a/GJ_GameSheet-uhd/block010_06_001.png b/GJ_GameSheet-uhd/block010_06_001.png new file mode 100644 index 00000000..30cfcacd Binary files /dev/null and b/GJ_GameSheet-uhd/block010_06_001.png differ diff --git a/GJ_GameSheet-uhd/block010_07_001.png b/GJ_GameSheet-uhd/block010_07_001.png new file mode 100644 index 00000000..56ca73ef Binary files /dev/null and b/GJ_GameSheet-uhd/block010_07_001.png differ diff --git a/GJ_GameSheet-uhd/block010_08_001.png b/GJ_GameSheet-uhd/block010_08_001.png new file mode 100644 index 00000000..005b99e0 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_08_001.png differ diff --git a/GJ_GameSheet-uhd/block010_piece_01_001.png b/GJ_GameSheet-uhd/block010_piece_01_001.png new file mode 100644 index 00000000..2632f60f Binary files /dev/null and b/GJ_GameSheet-uhd/block010_piece_01_001.png differ diff --git a/GJ_GameSheet-uhd/block010_piece_02_001.png b/GJ_GameSheet-uhd/block010_piece_02_001.png new file mode 100644 index 00000000..af3c65f1 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_piece_02_001.png differ diff --git a/GJ_GameSheet-uhd/block010_piece_03_001.png b/GJ_GameSheet-uhd/block010_piece_03_001.png new file mode 100644 index 00000000..5b9ce863 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_piece_03_001.png differ diff --git a/GJ_GameSheet-uhd/block010_piece_04_001.png b/GJ_GameSheet-uhd/block010_piece_04_001.png new file mode 100644 index 00000000..fe99ec0d Binary files /dev/null and b/GJ_GameSheet-uhd/block010_piece_04_001.png differ diff --git a/GJ_GameSheet-uhd/block010_piece_05_001.png b/GJ_GameSheet-uhd/block010_piece_05_001.png new file mode 100644 index 00000000..b9421461 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_piece_05_001.png differ diff --git a/GJ_GameSheet-uhd/block010_piece_06_001.png b/GJ_GameSheet-uhd/block010_piece_06_001.png new file mode 100644 index 00000000..f986d6a4 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_piece_06_001.png differ diff --git a/GJ_GameSheet-uhd/block010_slope_01_001.png b/GJ_GameSheet-uhd/block010_slope_01_001.png new file mode 100644 index 00000000..512db57a Binary files /dev/null and b/GJ_GameSheet-uhd/block010_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block010_slope_02_001.png b/GJ_GameSheet-uhd/block010_slope_02_001.png new file mode 100644 index 00000000..5bb4e316 Binary files /dev/null and b/GJ_GameSheet-uhd/block010_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block010_slope_square_01_001.png b/GJ_GameSheet-uhd/block010_slope_square_01_001.png new file mode 100644 index 00000000..754d893f Binary files /dev/null and b/GJ_GameSheet-uhd/block010_slope_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/block010_slope_square_02_001.png b/GJ_GameSheet-uhd/block010_slope_square_02_001.png new file mode 100644 index 00000000..fb21b9fb Binary files /dev/null and b/GJ_GameSheet-uhd/block010_slope_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/block010_slope_square_03_001.png b/GJ_GameSheet-uhd/block010_slope_square_03_001.png new file mode 100644 index 00000000..95c7bfcd Binary files /dev/null and b/GJ_GameSheet-uhd/block010_slope_square_03_001.png differ diff --git a/GJ_GameSheet-uhd/block011_01_001.png b/GJ_GameSheet-uhd/block011_01_001.png new file mode 100644 index 00000000..9b832766 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_01_001.png differ diff --git a/GJ_GameSheet-uhd/block011_01_color_001.png b/GJ_GameSheet-uhd/block011_01_color_001.png new file mode 100644 index 00000000..2c5f07d7 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_02_001.png b/GJ_GameSheet-uhd/block011_02_001.png new file mode 100644 index 00000000..915bf6e6 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_02_001.png differ diff --git a/GJ_GameSheet-uhd/block011_02_color_001.png b/GJ_GameSheet-uhd/block011_02_color_001.png new file mode 100644 index 00000000..4232936d Binary files /dev/null and b/GJ_GameSheet-uhd/block011_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_03_001.png b/GJ_GameSheet-uhd/block011_03_001.png new file mode 100644 index 00000000..beb358f6 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_03_001.png differ diff --git a/GJ_GameSheet-uhd/block011_03_color_001.png b/GJ_GameSheet-uhd/block011_03_color_001.png new file mode 100644 index 00000000..daa71285 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_04_001.png b/GJ_GameSheet-uhd/block011_04_001.png new file mode 100644 index 00000000..be86befc Binary files /dev/null and b/GJ_GameSheet-uhd/block011_04_001.png differ diff --git a/GJ_GameSheet-uhd/block011_04_color_001.png b/GJ_GameSheet-uhd/block011_04_color_001.png new file mode 100644 index 00000000..e19e5725 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_01_001.png b/GJ_GameSheet-uhd/block011_edge_01_001.png new file mode 100644 index 00000000..7ee125d5 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_01_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_01_color_001.png b/GJ_GameSheet-uhd/block011_edge_01_color_001.png new file mode 100644 index 00000000..ef06a15d Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_02_001.png b/GJ_GameSheet-uhd/block011_edge_02_001.png new file mode 100644 index 00000000..7d55be91 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_02_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_02_color_001.png b/GJ_GameSheet-uhd/block011_edge_02_color_001.png new file mode 100644 index 00000000..d448e268 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_03_001.png b/GJ_GameSheet-uhd/block011_edge_03_001.png new file mode 100644 index 00000000..3f5bad12 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_03_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_03_color_001.png b/GJ_GameSheet-uhd/block011_edge_03_color_001.png new file mode 100644 index 00000000..46ee6e74 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_04_001.png b/GJ_GameSheet-uhd/block011_edge_04_001.png new file mode 100644 index 00000000..d1ed4253 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_04_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_04_color_001.png b/GJ_GameSheet-uhd/block011_edge_04_color_001.png new file mode 100644 index 00000000..8362ac47 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_05_001.png b/GJ_GameSheet-uhd/block011_edge_05_001.png new file mode 100644 index 00000000..2a258196 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_05_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_05_color_001.png b/GJ_GameSheet-uhd/block011_edge_05_color_001.png new file mode 100644 index 00000000..b1e6c79c Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_06_001.png b/GJ_GameSheet-uhd/block011_edge_06_001.png new file mode 100644 index 00000000..5f37d871 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_06_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_06_color_001.png b/GJ_GameSheet-uhd/block011_edge_06_color_001.png new file mode 100644 index 00000000..a6bb18d5 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_07_001.png b/GJ_GameSheet-uhd/block011_edge_07_001.png new file mode 100644 index 00000000..a77714b0 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_07_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_07_color_001.png b/GJ_GameSheet-uhd/block011_edge_07_color_001.png new file mode 100644 index 00000000..e61b2d6f Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_08_001.png b/GJ_GameSheet-uhd/block011_edge_08_001.png new file mode 100644 index 00000000..8ab78223 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_08_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_08_color_001.png b/GJ_GameSheet-uhd/block011_edge_08_color_001.png new file mode 100644 index 00000000..a0927523 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_09_001.png b/GJ_GameSheet-uhd/block011_edge_09_001.png new file mode 100644 index 00000000..830400c2 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_09_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_09_color_001.png b/GJ_GameSheet-uhd/block011_edge_09_color_001.png new file mode 100644 index 00000000..aa52efbc Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_09_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_10_001.png b/GJ_GameSheet-uhd/block011_edge_10_001.png new file mode 100644 index 00000000..33a00750 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_10_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_10_color_001.png b/GJ_GameSheet-uhd/block011_edge_10_color_001.png new file mode 100644 index 00000000..83ee9241 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_10_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_11_001.png b/GJ_GameSheet-uhd/block011_edge_11_001.png new file mode 100644 index 00000000..03d33fb4 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_11_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_11_color_001.png b/GJ_GameSheet-uhd/block011_edge_11_color_001.png new file mode 100644 index 00000000..0ad41da8 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_11_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011_edge_12_001.png b/GJ_GameSheet-uhd/block011_edge_12_001.png new file mode 100644 index 00000000..77fbdd0a Binary files /dev/null and b/GJ_GameSheet-uhd/block011_edge_12_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_01_001.png b/GJ_GameSheet-uhd/block011_light_01_001.png new file mode 100644 index 00000000..9f1edb86 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_01_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_02_001.png b/GJ_GameSheet-uhd/block011_light_02_001.png new file mode 100644 index 00000000..c0c42e16 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_02_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_03_001.png b/GJ_GameSheet-uhd/block011_light_03_001.png new file mode 100644 index 00000000..3c01a197 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_03_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_04_001.png b/GJ_GameSheet-uhd/block011_light_04_001.png new file mode 100644 index 00000000..415c7cfa Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_04_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_05_001.png b/GJ_GameSheet-uhd/block011_light_05_001.png new file mode 100644 index 00000000..ffa44e78 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_05_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_06_001.png b/GJ_GameSheet-uhd/block011_light_06_001.png new file mode 100644 index 00000000..35a6b492 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_06_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_07_001.png b/GJ_GameSheet-uhd/block011_light_07_001.png new file mode 100644 index 00000000..fe5105e4 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_07_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_08_001.png b/GJ_GameSheet-uhd/block011_light_08_001.png new file mode 100644 index 00000000..8dbccd36 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_08_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_09_001.png b/GJ_GameSheet-uhd/block011_light_09_001.png new file mode 100644 index 00000000..3f445e6e Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_09_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_10_001.png b/GJ_GameSheet-uhd/block011_light_10_001.png new file mode 100644 index 00000000..c23a235b Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_10_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_11_001.png b/GJ_GameSheet-uhd/block011_light_11_001.png new file mode 100644 index 00000000..2204cf31 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_11_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_12_001.png b/GJ_GameSheet-uhd/block011_light_12_001.png new file mode 100644 index 00000000..177e0b8f Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_12_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_13_001.png b/GJ_GameSheet-uhd/block011_light_13_001.png new file mode 100644 index 00000000..986075a9 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_13_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_14_001.png b/GJ_GameSheet-uhd/block011_light_14_001.png new file mode 100644 index 00000000..0ba8c19a Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_14_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_15_001.png b/GJ_GameSheet-uhd/block011_light_15_001.png new file mode 100644 index 00000000..2a7f4742 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_15_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_16_001.png b/GJ_GameSheet-uhd/block011_light_16_001.png new file mode 100644 index 00000000..fb949149 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_16_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_17_001.png b/GJ_GameSheet-uhd/block011_light_17_001.png new file mode 100644 index 00000000..1c62d988 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_17_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_18_001.png b/GJ_GameSheet-uhd/block011_light_18_001.png new file mode 100644 index 00000000..445a37f1 Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_18_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_19_001.png b/GJ_GameSheet-uhd/block011_light_19_001.png new file mode 100644 index 00000000..1a7b1fdd Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_19_001.png differ diff --git a/GJ_GameSheet-uhd/block011_light_20_001.png b/GJ_GameSheet-uhd/block011_light_20_001.png new file mode 100644 index 00000000..1befed2e Binary files /dev/null and b/GJ_GameSheet-uhd/block011_light_20_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_01_001.png b/GJ_GameSheet-uhd/block011b_01_001.png new file mode 100644 index 00000000..2bd593c0 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_01_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_01_color_001.png b/GJ_GameSheet-uhd/block011b_01_color_001.png new file mode 100644 index 00000000..94832415 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_02_001.png b/GJ_GameSheet-uhd/block011b_02_001.png new file mode 100644 index 00000000..43504807 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_02_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_02_color_001.png b/GJ_GameSheet-uhd/block011b_02_color_001.png new file mode 100644 index 00000000..05c00ed5 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_03_001.png b/GJ_GameSheet-uhd/block011b_03_001.png new file mode 100644 index 00000000..12eb4fc9 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_03_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_03_color_001.png b/GJ_GameSheet-uhd/block011b_03_color_001.png new file mode 100644 index 00000000..e9bfafdd Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_04_001.png b/GJ_GameSheet-uhd/block011b_04_001.png new file mode 100644 index 00000000..edc24443 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_04_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_04_color_001.png b/GJ_GameSheet-uhd/block011b_04_color_001.png new file mode 100644 index 00000000..7b24a3d9 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_01_001.png b/GJ_GameSheet-uhd/block011b_piece_01_001.png new file mode 100644 index 00000000..836e58c7 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_01_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_01_color_001.png b/GJ_GameSheet-uhd/block011b_piece_01_color_001.png new file mode 100644 index 00000000..bb566cc6 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_02_001.png b/GJ_GameSheet-uhd/block011b_piece_02_001.png new file mode 100644 index 00000000..d8ceacac Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_02_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_02_color_001.png b/GJ_GameSheet-uhd/block011b_piece_02_color_001.png new file mode 100644 index 00000000..169b2f31 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_03_001.png b/GJ_GameSheet-uhd/block011b_piece_03_001.png new file mode 100644 index 00000000..f277cfdd Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_03_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_03_color_001.png b/GJ_GameSheet-uhd/block011b_piece_03_color_001.png new file mode 100644 index 00000000..cca0cf79 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_04_001.png b/GJ_GameSheet-uhd/block011b_piece_04_001.png new file mode 100644 index 00000000..8493b543 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_04_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_04_color_001.png b/GJ_GameSheet-uhd/block011b_piece_04_color_001.png new file mode 100644 index 00000000..86e2941a Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_05_001.png b/GJ_GameSheet-uhd/block011b_piece_05_001.png new file mode 100644 index 00000000..eb6aeeeb Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_05_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_05_color_001.png b/GJ_GameSheet-uhd/block011b_piece_05_color_001.png new file mode 100644 index 00000000..fc4b5015 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_06_001.png b/GJ_GameSheet-uhd/block011b_piece_06_001.png new file mode 100644 index 00000000..db98d887 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_06_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_06_color_001.png b/GJ_GameSheet-uhd/block011b_piece_06_color_001.png new file mode 100644 index 00000000..7278fdb9 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_07_001.png b/GJ_GameSheet-uhd/block011b_piece_07_001.png new file mode 100644 index 00000000..f74a5371 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_07_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_07_color_001.png b/GJ_GameSheet-uhd/block011b_piece_07_color_001.png new file mode 100644 index 00000000..cd602901 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_08_001.png b/GJ_GameSheet-uhd/block011b_piece_08_001.png new file mode 100644 index 00000000..4787412b Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_08_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_piece_08_color_001.png b/GJ_GameSheet-uhd/block011b_piece_08_color_001.png new file mode 100644 index 00000000..3a801547 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_piece_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_slope_01_001.png b/GJ_GameSheet-uhd/block011b_slope_01_001.png new file mode 100644 index 00000000..23860d4a Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_slope_01_color_001.png b/GJ_GameSheet-uhd/block011b_slope_01_color_001.png new file mode 100644 index 00000000..0bab9b81 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_slope_02_001.png b/GJ_GameSheet-uhd/block011b_slope_02_001.png new file mode 100644 index 00000000..8a82341f Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/block011b_slope_02_color_001.png b/GJ_GameSheet-uhd/block011b_slope_02_color_001.png new file mode 100644 index 00000000..24527628 Binary files /dev/null and b/GJ_GameSheet-uhd/block011b_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_01_001.png b/GJ_GameSheet-uhd/block012_01_001.png new file mode 100644 index 00000000..0aef0335 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_01_001.png differ diff --git a/GJ_GameSheet-uhd/block012_01_color_001.png b/GJ_GameSheet-uhd/block012_01_color_001.png new file mode 100644 index 00000000..de82fb7f Binary files /dev/null and b/GJ_GameSheet-uhd/block012_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_02_001.png b/GJ_GameSheet-uhd/block012_02_001.png new file mode 100644 index 00000000..40cad9d2 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_02_001.png differ diff --git a/GJ_GameSheet-uhd/block012_02_color_001.png b/GJ_GameSheet-uhd/block012_02_color_001.png new file mode 100644 index 00000000..9d2bd90e Binary files /dev/null and b/GJ_GameSheet-uhd/block012_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_03_001.png b/GJ_GameSheet-uhd/block012_03_001.png new file mode 100644 index 00000000..18bfd009 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_03_001.png differ diff --git a/GJ_GameSheet-uhd/block012_03_color_001.png b/GJ_GameSheet-uhd/block012_03_color_001.png new file mode 100644 index 00000000..33c09399 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_04_001.png b/GJ_GameSheet-uhd/block012_04_001.png new file mode 100644 index 00000000..23e6d372 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_04_001.png differ diff --git a/GJ_GameSheet-uhd/block012_04_color_001.png b/GJ_GameSheet-uhd/block012_04_color_001.png new file mode 100644 index 00000000..a1af717d Binary files /dev/null and b/GJ_GameSheet-uhd/block012_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_05_001.png b/GJ_GameSheet-uhd/block012_05_001.png new file mode 100644 index 00000000..e43a8899 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_05_001.png differ diff --git a/GJ_GameSheet-uhd/block012_05_color_001.png b/GJ_GameSheet-uhd/block012_05_color_001.png new file mode 100644 index 00000000..22b92674 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_06_001.png b/GJ_GameSheet-uhd/block012_06_001.png new file mode 100644 index 00000000..7dff7e5b Binary files /dev/null and b/GJ_GameSheet-uhd/block012_06_001.png differ diff --git a/GJ_GameSheet-uhd/block012_06_color_001.png b/GJ_GameSheet-uhd/block012_06_color_001.png new file mode 100644 index 00000000..03ce23ff Binary files /dev/null and b/GJ_GameSheet-uhd/block012_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_07_001.png b/GJ_GameSheet-uhd/block012_07_001.png new file mode 100644 index 00000000..3c957ad2 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_07_001.png differ diff --git a/GJ_GameSheet-uhd/block012_07_color_001.png b/GJ_GameSheet-uhd/block012_07_color_001.png new file mode 100644 index 00000000..740e1a85 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_08_001.png b/GJ_GameSheet-uhd/block012_08_001.png new file mode 100644 index 00000000..6f861aa0 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_08_001.png differ diff --git a/GJ_GameSheet-uhd/block012_08_color_001.png b/GJ_GameSheet-uhd/block012_08_color_001.png new file mode 100644 index 00000000..8fe12673 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_09_001.png b/GJ_GameSheet-uhd/block012_09_001.png new file mode 100644 index 00000000..49a5820f Binary files /dev/null and b/GJ_GameSheet-uhd/block012_09_001.png differ diff --git a/GJ_GameSheet-uhd/block012_09_color_001.png b/GJ_GameSheet-uhd/block012_09_color_001.png new file mode 100644 index 00000000..9802e211 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_09_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_10_001.png b/GJ_GameSheet-uhd/block012_10_001.png new file mode 100644 index 00000000..7839e258 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_10_001.png differ diff --git a/GJ_GameSheet-uhd/block012_10_color_001.png b/GJ_GameSheet-uhd/block012_10_color_001.png new file mode 100644 index 00000000..4f8d7d18 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_10_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_11_001.png b/GJ_GameSheet-uhd/block012_11_001.png new file mode 100644 index 00000000..af3bcce1 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_11_001.png differ diff --git a/GJ_GameSheet-uhd/block012_12_001.png b/GJ_GameSheet-uhd/block012_12_001.png new file mode 100644 index 00000000..4735396a Binary files /dev/null and b/GJ_GameSheet-uhd/block012_12_001.png differ diff --git a/GJ_GameSheet-uhd/block012_12_color_001.png b/GJ_GameSheet-uhd/block012_12_color_001.png new file mode 100644 index 00000000..82de25d4 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_12_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_13_001.png b/GJ_GameSheet-uhd/block012_13_001.png new file mode 100644 index 00000000..193f12bb Binary files /dev/null and b/GJ_GameSheet-uhd/block012_13_001.png differ diff --git a/GJ_GameSheet-uhd/block012_13_color_001.png b/GJ_GameSheet-uhd/block012_13_color_001.png new file mode 100644 index 00000000..619aaab0 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_13_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_14_001.png b/GJ_GameSheet-uhd/block012_14_001.png new file mode 100644 index 00000000..85b69323 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_14_001.png differ diff --git a/GJ_GameSheet-uhd/block012_14_color_001.png b/GJ_GameSheet-uhd/block012_14_color_001.png new file mode 100644 index 00000000..c8a38280 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_14_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012_light_01_001.png b/GJ_GameSheet-uhd/block012_light_01_001.png new file mode 100644 index 00000000..47f9bf78 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_light_01_001.png differ diff --git a/GJ_GameSheet-uhd/block012_light_02_001.png b/GJ_GameSheet-uhd/block012_light_02_001.png new file mode 100644 index 00000000..6e5e16fb Binary files /dev/null and b/GJ_GameSheet-uhd/block012_light_02_001.png differ diff --git a/GJ_GameSheet-uhd/block012_light_03_001.png b/GJ_GameSheet-uhd/block012_light_03_001.png new file mode 100644 index 00000000..90c517e7 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_light_03_001.png differ diff --git a/GJ_GameSheet-uhd/block012_light_04_001.png b/GJ_GameSheet-uhd/block012_light_04_001.png new file mode 100644 index 00000000..bd387284 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_light_04_001.png differ diff --git a/GJ_GameSheet-uhd/block012_light_05_001.png b/GJ_GameSheet-uhd/block012_light_05_001.png new file mode 100644 index 00000000..245f8b11 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_light_05_001.png differ diff --git a/GJ_GameSheet-uhd/block012_light_06_001.png b/GJ_GameSheet-uhd/block012_light_06_001.png new file mode 100644 index 00000000..e3c97ec2 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_light_06_001.png differ diff --git a/GJ_GameSheet-uhd/block012_light_07_001.png b/GJ_GameSheet-uhd/block012_light_07_001.png new file mode 100644 index 00000000..01c3ce53 Binary files /dev/null and b/GJ_GameSheet-uhd/block012_light_07_001.png differ diff --git a/GJ_GameSheet-uhd/block012_light_08_001.png b/GJ_GameSheet-uhd/block012_light_08_001.png new file mode 100644 index 00000000..f31104da Binary files /dev/null and b/GJ_GameSheet-uhd/block012_light_08_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_01_001.png b/GJ_GameSheet-uhd/block012b_01_001.png new file mode 100644 index 00000000..fb93ab7c Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_01_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_01_color_001.png b/GJ_GameSheet-uhd/block012b_01_color_001.png new file mode 100644 index 00000000..489cce09 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_02_001.png b/GJ_GameSheet-uhd/block012b_02_001.png new file mode 100644 index 00000000..0cea31d3 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_02_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_02_color_001.png b/GJ_GameSheet-uhd/block012b_02_color_001.png new file mode 100644 index 00000000..608068ee Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_03_001.png b/GJ_GameSheet-uhd/block012b_03_001.png new file mode 100644 index 00000000..b5764ea7 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_03_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_03_color_001.png b/GJ_GameSheet-uhd/block012b_03_color_001.png new file mode 100644 index 00000000..08796cc0 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_04_001.png b/GJ_GameSheet-uhd/block012b_04_001.png new file mode 100644 index 00000000..c1e0a05e Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_04_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_04_color_001.png b/GJ_GameSheet-uhd/block012b_04_color_001.png new file mode 100644 index 00000000..07094dde Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_05_001.png b/GJ_GameSheet-uhd/block012b_05_001.png new file mode 100644 index 00000000..e791362c Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_05_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_05_color_001.png b/GJ_GameSheet-uhd/block012b_05_color_001.png new file mode 100644 index 00000000..cd80a3ce Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_06_001.png b/GJ_GameSheet-uhd/block012b_06_001.png new file mode 100644 index 00000000..8230c507 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_06_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_06_color_001.png b/GJ_GameSheet-uhd/block012b_06_color_001.png new file mode 100644 index 00000000..885c5f93 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_07_001.png b/GJ_GameSheet-uhd/block012b_07_001.png new file mode 100644 index 00000000..7b7c6a81 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_07_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_07_color_001.png b/GJ_GameSheet-uhd/block012b_07_color_001.png new file mode 100644 index 00000000..6da0abe5 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_08_001.png b/GJ_GameSheet-uhd/block012b_08_001.png new file mode 100644 index 00000000..eb53dd68 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_08_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_09_001.png b/GJ_GameSheet-uhd/block012b_09_001.png new file mode 100644 index 00000000..4610d2fc Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_09_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_10_001.png b/GJ_GameSheet-uhd/block012b_10_001.png new file mode 100644 index 00000000..41eb9ae5 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_10_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_11_001.png b/GJ_GameSheet-uhd/block012b_11_001.png new file mode 100644 index 00000000..d9d45ab0 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_11_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_12_001.png b/GJ_GameSheet-uhd/block012b_12_001.png new file mode 100644 index 00000000..ae46c1e6 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_12_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_12_color_001.png b/GJ_GameSheet-uhd/block012b_12_color_001.png new file mode 100644 index 00000000..2e174fab Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_12_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_13_001.png b/GJ_GameSheet-uhd/block012b_13_001.png new file mode 100644 index 00000000..8952ef2a Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_13_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_13_color_001.png b/GJ_GameSheet-uhd/block012b_13_color_001.png new file mode 100644 index 00000000..cbb8364c Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_13_color_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_14_001.png b/GJ_GameSheet-uhd/block012b_14_001.png new file mode 100644 index 00000000..6d99cce0 Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_14_001.png differ diff --git a/GJ_GameSheet-uhd/block012b_14_color_001.png b/GJ_GameSheet-uhd/block012b_14_color_001.png new file mode 100644 index 00000000..b3b2df6e Binary files /dev/null and b/GJ_GameSheet-uhd/block012b_14_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_01c_001.png b/GJ_GameSheet-uhd/block013_01c_001.png new file mode 100644 index 00000000..2376a203 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_01c_001.png differ diff --git a/GJ_GameSheet-uhd/block013_01c_color_001.png b/GJ_GameSheet-uhd/block013_01c_color_001.png new file mode 100644 index 00000000..b4e28a22 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_01c_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_02c_001.png b/GJ_GameSheet-uhd/block013_02c_001.png new file mode 100644 index 00000000..0ef89801 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_02c_001.png differ diff --git a/GJ_GameSheet-uhd/block013_02c_color_001.png b/GJ_GameSheet-uhd/block013_02c_color_001.png new file mode 100644 index 00000000..2676b3d5 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_02c_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_03c_001.png b/GJ_GameSheet-uhd/block013_03c_001.png new file mode 100644 index 00000000..85f55c63 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_03c_001.png differ diff --git a/GJ_GameSheet-uhd/block013_03c_color_001.png b/GJ_GameSheet-uhd/block013_03c_color_001.png new file mode 100644 index 00000000..95e6c264 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_03c_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_04c_001.png b/GJ_GameSheet-uhd/block013_04c_001.png new file mode 100644 index 00000000..7551eeb4 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_04c_001.png differ diff --git a/GJ_GameSheet-uhd/block013_04c_color_001.png b/GJ_GameSheet-uhd/block013_04c_color_001.png new file mode 100644 index 00000000..53a216f5 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_04c_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_01_001.png b/GJ_GameSheet-uhd/block013_detail_01_001.png new file mode 100644 index 00000000..73ac1d28 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_01_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_01_color_001.png b/GJ_GameSheet-uhd/block013_detail_01_color_001.png new file mode 100644 index 00000000..022e2e38 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_02_001.png b/GJ_GameSheet-uhd/block013_detail_02_001.png new file mode 100644 index 00000000..7beb69e6 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_02_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_02_color_001.png b/GJ_GameSheet-uhd/block013_detail_02_color_001.png new file mode 100644 index 00000000..2f9fc562 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_03_001.png b/GJ_GameSheet-uhd/block013_detail_03_001.png new file mode 100644 index 00000000..e1dac4b1 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_03_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_03_color_001.png b/GJ_GameSheet-uhd/block013_detail_03_color_001.png new file mode 100644 index 00000000..6d1e9e61 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_04_001.png b/GJ_GameSheet-uhd/block013_detail_04_001.png new file mode 100644 index 00000000..c180a54c Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_04_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_04_color_001.png b/GJ_GameSheet-uhd/block013_detail_04_color_001.png new file mode 100644 index 00000000..49faab45 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_05_001.png b/GJ_GameSheet-uhd/block013_detail_05_001.png new file mode 100644 index 00000000..9afeafb1 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_05_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_05_color_001.png b/GJ_GameSheet-uhd/block013_detail_05_color_001.png new file mode 100644 index 00000000..934622ce Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_06_001.png b/GJ_GameSheet-uhd/block013_detail_06_001.png new file mode 100644 index 00000000..66f21a56 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_06_001.png differ diff --git a/GJ_GameSheet-uhd/block013_detail_06_color_001.png b/GJ_GameSheet-uhd/block013_detail_06_color_001.png new file mode 100644 index 00000000..377e98a7 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_detail_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_01_001.png b/GJ_GameSheet-uhd/block013_edge_01_001.png new file mode 100644 index 00000000..d1200279 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_01_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_01_color_001.png b/GJ_GameSheet-uhd/block013_edge_01_color_001.png new file mode 100644 index 00000000..541f4954 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_02_001.png b/GJ_GameSheet-uhd/block013_edge_02_001.png new file mode 100644 index 00000000..bc0373f0 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_02_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_03_001.png b/GJ_GameSheet-uhd/block013_edge_03_001.png new file mode 100644 index 00000000..6d673c4a Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_03_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_03_color_001.png b/GJ_GameSheet-uhd/block013_edge_03_color_001.png new file mode 100644 index 00000000..295f68cf Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_04_001.png b/GJ_GameSheet-uhd/block013_edge_04_001.png new file mode 100644 index 00000000..abe0c988 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_04_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_04_color_001.png b/GJ_GameSheet-uhd/block013_edge_04_color_001.png new file mode 100644 index 00000000..bef4c76a Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_05_001.png b/GJ_GameSheet-uhd/block013_edge_05_001.png new file mode 100644 index 00000000..4afb1420 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_05_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_06_001.png b/GJ_GameSheet-uhd/block013_edge_06_001.png new file mode 100644 index 00000000..7922885d Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_06_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_07_001.png b/GJ_GameSheet-uhd/block013_edge_07_001.png new file mode 100644 index 00000000..748e2378 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_07_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_07_color_001.png b/GJ_GameSheet-uhd/block013_edge_07_color_001.png new file mode 100644 index 00000000..90c80f62 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_08_001.png b/GJ_GameSheet-uhd/block013_edge_08_001.png new file mode 100644 index 00000000..15c0fc73 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_08_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_09_001.png b/GJ_GameSheet-uhd/block013_edge_09_001.png new file mode 100644 index 00000000..12000b91 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_09_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_09_color_001.png b/GJ_GameSheet-uhd/block013_edge_09_color_001.png new file mode 100644 index 00000000..1cb98203 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_09_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_10_001.png b/GJ_GameSheet-uhd/block013_edge_10_001.png new file mode 100644 index 00000000..ba641deb Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_10_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_10_color_001.png b/GJ_GameSheet-uhd/block013_edge_10_color_001.png new file mode 100644 index 00000000..e5353cb6 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_10_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_11_001.png b/GJ_GameSheet-uhd/block013_edge_11_001.png new file mode 100644 index 00000000..dfc86227 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_11_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_11_color_001.png b/GJ_GameSheet-uhd/block013_edge_11_color_001.png new file mode 100644 index 00000000..5cef78ad Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_11_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_12_001.png b/GJ_GameSheet-uhd/block013_edge_12_001.png new file mode 100644 index 00000000..c56c956f Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_12_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_12_color_001.png b/GJ_GameSheet-uhd/block013_edge_12_color_001.png new file mode 100644 index 00000000..785926ce Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_12_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_13_001.png b/GJ_GameSheet-uhd/block013_edge_13_001.png new file mode 100644 index 00000000..d5a5dad3 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_13_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_14_001.png b/GJ_GameSheet-uhd/block013_edge_14_001.png new file mode 100644 index 00000000..a8ab664b Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_14_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_15_001.png b/GJ_GameSheet-uhd/block013_edge_15_001.png new file mode 100644 index 00000000..b6776a3f Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_15_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_16_001.png b/GJ_GameSheet-uhd/block013_edge_16_001.png new file mode 100644 index 00000000..78908236 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_16_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_01_001.png b/GJ_GameSheet-uhd/block013_edge_c_01_001.png new file mode 100644 index 00000000..1f755258 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_01_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_01_color_001.png b/GJ_GameSheet-uhd/block013_edge_c_01_color_001.png new file mode 100644 index 00000000..397f60fa Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_02_001.png b/GJ_GameSheet-uhd/block013_edge_c_02_001.png new file mode 100644 index 00000000..26dcb4c6 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_02_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_02_color_001.png b/GJ_GameSheet-uhd/block013_edge_c_02_color_001.png new file mode 100644 index 00000000..089a7a66 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_03_001.png b/GJ_GameSheet-uhd/block013_edge_c_03_001.png new file mode 100644 index 00000000..f90ede52 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_03_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_04_001.png b/GJ_GameSheet-uhd/block013_edge_c_04_001.png new file mode 100644 index 00000000..27d431ae Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_04_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_05_001.png b/GJ_GameSheet-uhd/block013_edge_c_05_001.png new file mode 100644 index 00000000..d03ff924 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_05_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_05_color_001.png b/GJ_GameSheet-uhd/block013_edge_c_05_color_001.png new file mode 100644 index 00000000..36cd64a4 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_06_001.png b/GJ_GameSheet-uhd/block013_edge_c_06_001.png new file mode 100644 index 00000000..dc0b6ee9 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_06_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_06_color_001.png b/GJ_GameSheet-uhd/block013_edge_c_06_color_001.png new file mode 100644 index 00000000..f2923d63 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_07_001.png b/GJ_GameSheet-uhd/block013_edge_c_07_001.png new file mode 100644 index 00000000..36411574 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_07_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_08_001.png b/GJ_GameSheet-uhd/block013_edge_c_08_001.png new file mode 100644 index 00000000..53040d04 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_08_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_09_001.png b/GJ_GameSheet-uhd/block013_edge_c_09_001.png new file mode 100644 index 00000000..c7374264 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_09_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_09_color_001.png b/GJ_GameSheet-uhd/block013_edge_c_09_color_001.png new file mode 100644 index 00000000..cfacaa58 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_09_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_10_001.png b/GJ_GameSheet-uhd/block013_edge_c_10_001.png new file mode 100644 index 00000000..f894ef39 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_10_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_10_color_001.png b/GJ_GameSheet-uhd/block013_edge_c_10_color_001.png new file mode 100644 index 00000000..4bbafc10 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_10_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_11_001.png b/GJ_GameSheet-uhd/block013_edge_c_11_001.png new file mode 100644 index 00000000..1178c47d Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_11_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_12_001.png b/GJ_GameSheet-uhd/block013_edge_c_12_001.png new file mode 100644 index 00000000..d2387113 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_12_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_13_001.png b/GJ_GameSheet-uhd/block013_edge_c_13_001.png new file mode 100644 index 00000000..8cd555df Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_13_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_13_color_001.png b/GJ_GameSheet-uhd/block013_edge_c_13_color_001.png new file mode 100644 index 00000000..6c380ac7 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_13_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_14_001.png b/GJ_GameSheet-uhd/block013_edge_c_14_001.png new file mode 100644 index 00000000..ffa6252e Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_14_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_14_color_001.png b/GJ_GameSheet-uhd/block013_edge_c_14_color_001.png new file mode 100644 index 00000000..eec2f19f Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_14_color_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_15_001.png b/GJ_GameSheet-uhd/block013_edge_c_15_001.png new file mode 100644 index 00000000..9c1cc7c1 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_15_001.png differ diff --git a/GJ_GameSheet-uhd/block013_edge_c_16_001.png b/GJ_GameSheet-uhd/block013_edge_c_16_001.png new file mode 100644 index 00000000..ce3bcc07 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_edge_c_16_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_01_001.png b/GJ_GameSheet-uhd/block013_light_01_001.png new file mode 100644 index 00000000..65b3cb8f Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_01_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_02_001.png b/GJ_GameSheet-uhd/block013_light_02_001.png new file mode 100644 index 00000000..db7bb9a5 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_02_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_03_001.png b/GJ_GameSheet-uhd/block013_light_03_001.png new file mode 100644 index 00000000..4c5fb7d7 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_03_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_04_001.png b/GJ_GameSheet-uhd/block013_light_04_001.png new file mode 100644 index 00000000..785bcac5 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_04_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_05_001.png b/GJ_GameSheet-uhd/block013_light_05_001.png new file mode 100644 index 00000000..7dd06d85 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_05_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_06_001.png b/GJ_GameSheet-uhd/block013_light_06_001.png new file mode 100644 index 00000000..6e403806 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_06_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_07_001.png b/GJ_GameSheet-uhd/block013_light_07_001.png new file mode 100644 index 00000000..010a873a Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_07_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_08_001.png b/GJ_GameSheet-uhd/block013_light_08_001.png new file mode 100644 index 00000000..d5cb744b Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_08_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_09_001.png b/GJ_GameSheet-uhd/block013_light_09_001.png new file mode 100644 index 00000000..d4c1f0d9 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_09_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_10_001.png b/GJ_GameSheet-uhd/block013_light_10_001.png new file mode 100644 index 00000000..4e51d293 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_10_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_11_001.png b/GJ_GameSheet-uhd/block013_light_11_001.png new file mode 100644 index 00000000..f7735d17 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_11_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_12_001.png b/GJ_GameSheet-uhd/block013_light_12_001.png new file mode 100644 index 00000000..6d7d7ece Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_12_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_13_001.png b/GJ_GameSheet-uhd/block013_light_13_001.png new file mode 100644 index 00000000..d5ea41e9 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_13_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_14_001.png b/GJ_GameSheet-uhd/block013_light_14_001.png new file mode 100644 index 00000000..3174eb6e Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_14_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_15_001.png b/GJ_GameSheet-uhd/block013_light_15_001.png new file mode 100644 index 00000000..0b49be08 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_15_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_16_001.png b/GJ_GameSheet-uhd/block013_light_16_001.png new file mode 100644 index 00000000..dff42b59 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_16_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_01_001.png b/GJ_GameSheet-uhd/block013_light_c_01_001.png new file mode 100644 index 00000000..a3626a1d Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_01_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_02_001.png b/GJ_GameSheet-uhd/block013_light_c_02_001.png new file mode 100644 index 00000000..2976d5d3 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_02_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_03_001.png b/GJ_GameSheet-uhd/block013_light_c_03_001.png new file mode 100644 index 00000000..ec9ccd76 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_03_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_04_001.png b/GJ_GameSheet-uhd/block013_light_c_04_001.png new file mode 100644 index 00000000..f8fa7a31 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_04_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_05_001.png b/GJ_GameSheet-uhd/block013_light_c_05_001.png new file mode 100644 index 00000000..379a233c Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_05_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_06_001.png b/GJ_GameSheet-uhd/block013_light_c_06_001.png new file mode 100644 index 00000000..75bde0aa Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_06_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_07_001.png b/GJ_GameSheet-uhd/block013_light_c_07_001.png new file mode 100644 index 00000000..d71c577e Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_07_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_08_001.png b/GJ_GameSheet-uhd/block013_light_c_08_001.png new file mode 100644 index 00000000..c63dafd9 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_08_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_09_001.png b/GJ_GameSheet-uhd/block013_light_c_09_001.png new file mode 100644 index 00000000..fe1c52da Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_09_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_10_001.png b/GJ_GameSheet-uhd/block013_light_c_10_001.png new file mode 100644 index 00000000..285c2e5d Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_10_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_11_001.png b/GJ_GameSheet-uhd/block013_light_c_11_001.png new file mode 100644 index 00000000..9f7fafec Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_11_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_12_001.png b/GJ_GameSheet-uhd/block013_light_c_12_001.png new file mode 100644 index 00000000..8269d085 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_12_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_13_001.png b/GJ_GameSheet-uhd/block013_light_c_13_001.png new file mode 100644 index 00000000..61661f75 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_13_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_14_001.png b/GJ_GameSheet-uhd/block013_light_c_14_001.png new file mode 100644 index 00000000..50221c05 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_14_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_15_001.png b/GJ_GameSheet-uhd/block013_light_c_15_001.png new file mode 100644 index 00000000..5fac891d Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_15_001.png differ diff --git a/GJ_GameSheet-uhd/block013_light_c_16_001.png b/GJ_GameSheet-uhd/block013_light_c_16_001.png new file mode 100644 index 00000000..35a82537 Binary files /dev/null and b/GJ_GameSheet-uhd/block013_light_c_16_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign01_01_001.png b/GJ_GameSheet-uhd/blockDesign01_01_001.png new file mode 100644 index 00000000..45d5047d Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign01_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign01_01_color_001.png b/GJ_GameSheet-uhd/blockDesign01_01_color_001.png new file mode 100644 index 00000000..745737c5 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign01_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign01_02_001.png b/GJ_GameSheet-uhd/blockDesign01_02_001.png new file mode 100644 index 00000000..ae637b56 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign01_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign01_02_color_001.png b/GJ_GameSheet-uhd/blockDesign01_02_color_001.png new file mode 100644 index 00000000..84f1ec8b Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign01_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign01_03_001.png b/GJ_GameSheet-uhd/blockDesign01_03_001.png new file mode 100644 index 00000000..7e1357e7 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign01_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign01_03_color_001.png b/GJ_GameSheet-uhd/blockDesign01_03_color_001.png new file mode 100644 index 00000000..8e1d5070 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign01_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign01_04_001.png b/GJ_GameSheet-uhd/blockDesign01_04_001.png new file mode 100644 index 00000000..5e88532b Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign01_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign01_04_color_001.png b/GJ_GameSheet-uhd/blockDesign01_04_color_001.png new file mode 100644 index 00000000..9ae014b5 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign01_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign02_01_001.png b/GJ_GameSheet-uhd/blockDesign02_01_001.png new file mode 100644 index 00000000..bed4561a Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign02_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign02_01_color_001.png b/GJ_GameSheet-uhd/blockDesign02_01_color_001.png new file mode 100644 index 00000000..46499acc Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign02_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign02_02_001.png b/GJ_GameSheet-uhd/blockDesign02_02_001.png new file mode 100644 index 00000000..882df960 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign02_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign02_02_color_001.png b/GJ_GameSheet-uhd/blockDesign02_02_color_001.png new file mode 100644 index 00000000..873207c1 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign02_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign02_03_001.png b/GJ_GameSheet-uhd/blockDesign02_03_001.png new file mode 100644 index 00000000..49b64171 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign02_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign02_03_color_001.png b/GJ_GameSheet-uhd/blockDesign02_03_color_001.png new file mode 100644 index 00000000..943c59f2 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign02_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign02_04_001.png b/GJ_GameSheet-uhd/blockDesign02_04_001.png new file mode 100644 index 00000000..3bebe336 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign02_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign02_04_color_001.png b/GJ_GameSheet-uhd/blockDesign02_04_color_001.png new file mode 100644 index 00000000..d5276475 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign02_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign03_01_001.png b/GJ_GameSheet-uhd/blockDesign03_01_001.png new file mode 100644 index 00000000..00e58248 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign03_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign03_01_color_001.png b/GJ_GameSheet-uhd/blockDesign03_01_color_001.png new file mode 100644 index 00000000..ab6b4416 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign03_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign03_02_001.png b/GJ_GameSheet-uhd/blockDesign03_02_001.png new file mode 100644 index 00000000..133f557d Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign03_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign03_02_color_001.png b/GJ_GameSheet-uhd/blockDesign03_02_color_001.png new file mode 100644 index 00000000..618b70f5 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign03_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign03_03_001.png b/GJ_GameSheet-uhd/blockDesign03_03_001.png new file mode 100644 index 00000000..77c55625 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign03_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign03_03_color_001.png b/GJ_GameSheet-uhd/blockDesign03_03_color_001.png new file mode 100644 index 00000000..3fea81aa Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign03_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign03_04_001.png b/GJ_GameSheet-uhd/blockDesign03_04_001.png new file mode 100644 index 00000000..62460c67 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign03_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign03_04_color_001.png b/GJ_GameSheet-uhd/blockDesign03_04_color_001.png new file mode 100644 index 00000000..8a91ea81 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign03_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign04_01_001.png b/GJ_GameSheet-uhd/blockDesign04_01_001.png new file mode 100644 index 00000000..090b26a5 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign04_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign04_01_color_001.png b/GJ_GameSheet-uhd/blockDesign04_01_color_001.png new file mode 100644 index 00000000..d0a0694d Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign04_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign05_01_001.png b/GJ_GameSheet-uhd/blockDesign05_01_001.png new file mode 100644 index 00000000..93e39abe Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign05_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign05_01_color_001.png b/GJ_GameSheet-uhd/blockDesign05_01_color_001.png new file mode 100644 index 00000000..c7292245 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign05_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign05_02_001.png b/GJ_GameSheet-uhd/blockDesign05_02_001.png new file mode 100644 index 00000000..57dff5db Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign05_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign05_02_color_001.png b/GJ_GameSheet-uhd/blockDesign05_02_color_001.png new file mode 100644 index 00000000..3fbe6717 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign05_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign05_03_001.png b/GJ_GameSheet-uhd/blockDesign05_03_001.png new file mode 100644 index 00000000..3455bc2c Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign05_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign05_03_color_001.png b/GJ_GameSheet-uhd/blockDesign05_03_color_001.png new file mode 100644 index 00000000..caedeb78 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign05_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign05_04_001.png b/GJ_GameSheet-uhd/blockDesign05_04_001.png new file mode 100644 index 00000000..3af75e70 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign05_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign05_04_color_001.png b/GJ_GameSheet-uhd/blockDesign05_04_color_001.png new file mode 100644 index 00000000..ec1aa045 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign05_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign06_01_001.png b/GJ_GameSheet-uhd/blockDesign06_01_001.png new file mode 100644 index 00000000..3f51b76b Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign06_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign06_01_color_001.png b/GJ_GameSheet-uhd/blockDesign06_01_color_001.png new file mode 100644 index 00000000..131f85f0 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign06_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign06_02_001.png b/GJ_GameSheet-uhd/blockDesign06_02_001.png new file mode 100644 index 00000000..7f496d09 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign06_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign06_02_color_001.png b/GJ_GameSheet-uhd/blockDesign06_02_color_001.png new file mode 100644 index 00000000..59a0e986 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign06_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign06_03_001.png b/GJ_GameSheet-uhd/blockDesign06_03_001.png new file mode 100644 index 00000000..8b3ba39e Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign06_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign06_03_color_001.png b/GJ_GameSheet-uhd/blockDesign06_03_color_001.png new file mode 100644 index 00000000..a0a2abf6 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign06_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign06_04_001.png b/GJ_GameSheet-uhd/blockDesign06_04_001.png new file mode 100644 index 00000000..72753ae9 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign06_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign06_04_color_001.png b/GJ_GameSheet-uhd/blockDesign06_04_color_001.png new file mode 100644 index 00000000..bf0d0d22 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign06_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign07_01_001.png b/GJ_GameSheet-uhd/blockDesign07_01_001.png new file mode 100644 index 00000000..55ee343f Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign07_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign07_01_color_001.png b/GJ_GameSheet-uhd/blockDesign07_01_color_001.png new file mode 100644 index 00000000..fb51d46f Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign07_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign07_02_001.png b/GJ_GameSheet-uhd/blockDesign07_02_001.png new file mode 100644 index 00000000..0851f4b6 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign07_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign07_02_color_001.png b/GJ_GameSheet-uhd/blockDesign07_02_color_001.png new file mode 100644 index 00000000..f55669ce Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign07_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign07_03_001.png b/GJ_GameSheet-uhd/blockDesign07_03_001.png new file mode 100644 index 00000000..6af0f949 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign07_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign07_03_color_001.png b/GJ_GameSheet-uhd/blockDesign07_03_color_001.png new file mode 100644 index 00000000..2dc5ffb3 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign07_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign07_04_001.png b/GJ_GameSheet-uhd/blockDesign07_04_001.png new file mode 100644 index 00000000..57e2d252 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign07_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockDesign07_04_color_001.png b/GJ_GameSheet-uhd/blockDesign07_04_color_001.png new file mode 100644 index 00000000..a401c0d4 Binary files /dev/null and b/GJ_GameSheet-uhd/blockDesign07_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineOuter1_01_001.png b/GJ_GameSheet-uhd/blockOutlineOuter1_01_001.png new file mode 100644 index 00000000..24aed66c Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineOuter1_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineOuter2_01_001.png b/GJ_GameSheet-uhd/blockOutlineOuter2_01_001.png new file mode 100644 index 00000000..d25fdcc2 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineOuter2_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineOuter3_01_001.png b/GJ_GameSheet-uhd/blockOutlineOuter3_01_001.png new file mode 100644 index 00000000..2c0d9834 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineOuter3_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThick_01_001.png b/GJ_GameSheet-uhd/blockOutlineThick_01_001.png new file mode 100644 index 00000000..441fdaad Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThick_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThick_02_001.png b/GJ_GameSheet-uhd/blockOutlineThick_02_001.png new file mode 100644 index 00000000..1ebe6ad3 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThick_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThick_03_001.png b/GJ_GameSheet-uhd/blockOutlineThick_03_001.png new file mode 100644 index 00000000..0ff04610 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThick_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThick_04_001.png b/GJ_GameSheet-uhd/blockOutlineThick_04_001.png new file mode 100644 index 00000000..0a04d967 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThick_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThick_05_001.png b/GJ_GameSheet-uhd/blockOutlineThick_05_001.png new file mode 100644 index 00000000..5284baa3 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThick_05_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThick_06_001.png b/GJ_GameSheet-uhd/blockOutlineThick_06_001.png new file mode 100644 index 00000000..4dce6a12 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThick_06_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThick_07_001.png b/GJ_GameSheet-uhd/blockOutlineThick_07_001.png new file mode 100644 index 00000000..31be43fa Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThick_07_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThick_08_001.png b/GJ_GameSheet-uhd/blockOutlineThick_08_001.png new file mode 100644 index 00000000..e4fa8fd1 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThick_08_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThickb_01_001.png b/GJ_GameSheet-uhd/blockOutlineThickb_01_001.png new file mode 100644 index 00000000..13b5f6fb Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThickb_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThickb_02_001.png b/GJ_GameSheet-uhd/blockOutlineThickb_02_001.png new file mode 100644 index 00000000..dc943bbe Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThickb_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThickb_03_001.png b/GJ_GameSheet-uhd/blockOutlineThickb_03_001.png new file mode 100644 index 00000000..2ff8454f Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThickb_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThickb_04_001.png b/GJ_GameSheet-uhd/blockOutlineThickb_04_001.png new file mode 100644 index 00000000..24dd1f50 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThickb_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThickb_05_001.png b/GJ_GameSheet-uhd/blockOutlineThickb_05_001.png new file mode 100644 index 00000000..b654c712 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThickb_05_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThickb_06_001.png b/GJ_GameSheet-uhd/blockOutlineThickb_06_001.png new file mode 100644 index 00000000..5045614e Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThickb_06_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutlineThickb_08_001.png b/GJ_GameSheet-uhd/blockOutlineThickb_08_001.png new file mode 100644 index 00000000..16a41803 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutlineThickb_08_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_01_001.png b/GJ_GameSheet-uhd/blockOutline_01_001.png new file mode 100644 index 00000000..b358562f Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_01_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_02_001.png b/GJ_GameSheet-uhd/blockOutline_02_001.png new file mode 100644 index 00000000..dd85e576 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_02_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_03_001.png b/GJ_GameSheet-uhd/blockOutline_03_001.png new file mode 100644 index 00000000..7404bad8 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_03_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_04_001.png b/GJ_GameSheet-uhd/blockOutline_04_001.png new file mode 100644 index 00000000..cd0a4620 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_04_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_05_001.png b/GJ_GameSheet-uhd/blockOutline_05_001.png new file mode 100644 index 00000000..8e048678 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_05_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_06_001.png b/GJ_GameSheet-uhd/blockOutline_06_001.png new file mode 100644 index 00000000..7f011dd8 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_06_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_07_001.png b/GJ_GameSheet-uhd/blockOutline_07_001.png new file mode 100644 index 00000000..f8d75ed9 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_07_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_08_001.png b/GJ_GameSheet-uhd/blockOutline_08_001.png new file mode 100644 index 00000000..82e8bc8c Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_08_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_09_001.png b/GJ_GameSheet-uhd/blockOutline_09_001.png new file mode 100644 index 00000000..8bacdda0 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_09_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_10_001.png b/GJ_GameSheet-uhd/blockOutline_10_001.png new file mode 100644 index 00000000..e8c3e545 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_10_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_11_001.png b/GJ_GameSheet-uhd/blockOutline_11_001.png new file mode 100644 index 00000000..156e674e Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_11_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_12_001.png b/GJ_GameSheet-uhd/blockOutline_12_001.png new file mode 100644 index 00000000..7d2b76d5 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_12_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_13_001.png b/GJ_GameSheet-uhd/blockOutline_13_001.png new file mode 100644 index 00000000..cc696442 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_13_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_14_001.png b/GJ_GameSheet-uhd/blockOutline_14_001.png new file mode 100644 index 00000000..f07e3f62 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_14_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_14new_001.png b/GJ_GameSheet-uhd/blockOutline_14new_001.png new file mode 100644 index 00000000..11b913b0 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_14new_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_15_001.png b/GJ_GameSheet-uhd/blockOutline_15_001.png new file mode 100644 index 00000000..90f6bd33 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_15_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_15_corner01_001.png b/GJ_GameSheet-uhd/blockOutline_15_corner01_001.png new file mode 100644 index 00000000..ca8189bf Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_15_corner01_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_15_corner02_001.png b/GJ_GameSheet-uhd/blockOutline_15_corner02_001.png new file mode 100644 index 00000000..d2da8194 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_15_corner02_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_15new_001.png b/GJ_GameSheet-uhd/blockOutline_15new_001.png new file mode 100644 index 00000000..812c9028 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_15new_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_16_001.png b/GJ_GameSheet-uhd/blockOutline_16_001.png new file mode 100644 index 00000000..08955758 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_16_001.png differ diff --git a/GJ_GameSheet-uhd/blockOutline_17_001.png b/GJ_GameSheet-uhd/blockOutline_17_001.png new file mode 100644 index 00000000..a2b8dc41 Binary files /dev/null and b/GJ_GameSheet-uhd/blockOutline_17_001.png differ diff --git a/GJ_GameSheet-uhd/brick_02_001.png b/GJ_GameSheet-uhd/brick_02_001.png new file mode 100644 index 00000000..114b6491 Binary files /dev/null and b/GJ_GameSheet-uhd/brick_02_001.png differ diff --git a/GJ_GameSheet-uhd/bump_01_001.png b/GJ_GameSheet-uhd/bump_01_001.png new file mode 100644 index 00000000..350f661f Binary files /dev/null and b/GJ_GameSheet-uhd/bump_01_001.png differ diff --git a/GJ_GameSheet-uhd/bump_02_001.png b/GJ_GameSheet-uhd/bump_02_001.png new file mode 100644 index 00000000..73e462a5 Binary files /dev/null and b/GJ_GameSheet-uhd/bump_02_001.png differ diff --git a/GJ_GameSheet-uhd/bump_03_001.png b/GJ_GameSheet-uhd/bump_03_001.png new file mode 100644 index 00000000..57c87433 Binary files /dev/null and b/GJ_GameSheet-uhd/bump_03_001.png differ diff --git a/GJ_GameSheet-uhd/chain_01_001.png b/GJ_GameSheet-uhd/chain_01_001.png new file mode 100644 index 00000000..17335276 Binary files /dev/null and b/GJ_GameSheet-uhd/chain_01_001.png differ diff --git a/GJ_GameSheet-uhd/colorPlank_01_001.png b/GJ_GameSheet-uhd/colorPlank_01_001.png new file mode 100644 index 00000000..b035286d Binary files /dev/null and b/GJ_GameSheet-uhd/colorPlank_01_001.png differ diff --git a/GJ_GameSheet-uhd/colorPlank_01_color_001.png b/GJ_GameSheet-uhd/colorPlank_01_color_001.png new file mode 100644 index 00000000..9de44715 Binary files /dev/null and b/GJ_GameSheet-uhd/colorPlank_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/colorPlank_01_small_001.png b/GJ_GameSheet-uhd/colorPlank_01_small_001.png new file mode 100644 index 00000000..bda67fa0 Binary files /dev/null and b/GJ_GameSheet-uhd/colorPlank_01_small_001.png differ diff --git a/GJ_GameSheet-uhd/colorPlank_01_small_color_001.png b/GJ_GameSheet-uhd/colorPlank_01_small_color_001.png new file mode 100644 index 00000000..d1852390 Binary files /dev/null and b/GJ_GameSheet-uhd/colorPlank_01_small_color_001.png differ diff --git a/GJ_GameSheet-uhd/colorSpike_01_001.png b/GJ_GameSheet-uhd/colorSpike_01_001.png new file mode 100644 index 00000000..66a31d1e Binary files /dev/null and b/GJ_GameSheet-uhd/colorSpike_01_001.png differ diff --git a/GJ_GameSheet-uhd/colorSpike_01_color_001.png b/GJ_GameSheet-uhd/colorSpike_01_color_001.png new file mode 100644 index 00000000..1ddb9068 Binary files /dev/null and b/GJ_GameSheet-uhd/colorSpike_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/colorSpike_02_001.png b/GJ_GameSheet-uhd/colorSpike_02_001.png new file mode 100644 index 00000000..96096fbc Binary files /dev/null and b/GJ_GameSheet-uhd/colorSpike_02_001.png differ diff --git a/GJ_GameSheet-uhd/colorSpike_02_color_001.png b/GJ_GameSheet-uhd/colorSpike_02_color_001.png new file mode 100644 index 00000000..9a6ce1cc Binary files /dev/null and b/GJ_GameSheet-uhd/colorSpike_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/colorSpike_03_001.png b/GJ_GameSheet-uhd/colorSpike_03_001.png new file mode 100644 index 00000000..29bc3bbf Binary files /dev/null and b/GJ_GameSheet-uhd/colorSpike_03_001.png differ diff --git a/GJ_GameSheet-uhd/colorSpike_03_color_001.png b/GJ_GameSheet-uhd/colorSpike_03_color_001.png new file mode 100644 index 00000000..03e65083 Binary files /dev/null and b/GJ_GameSheet-uhd/colorSpike_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/colorSpike_04_001.png b/GJ_GameSheet-uhd/colorSpike_04_001.png new file mode 100644 index 00000000..590b0d20 Binary files /dev/null and b/GJ_GameSheet-uhd/colorSpike_04_001.png differ diff --git a/GJ_GameSheet-uhd/colorSpike_04_color_001.png b/GJ_GameSheet-uhd/colorSpike_04_color_001.png new file mode 100644 index 00000000..8162b30c Binary files /dev/null and b/GJ_GameSheet-uhd/colorSpike_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/colorSquare_01_small_001.png b/GJ_GameSheet-uhd/colorSquare_01_small_001.png new file mode 100644 index 00000000..e8c3e545 Binary files /dev/null and b/GJ_GameSheet-uhd/colorSquare_01_small_001.png differ diff --git a/GJ_GameSheet-uhd/colorSquare_01_small_color_001.png b/GJ_GameSheet-uhd/colorSquare_01_small_color_001.png new file mode 100644 index 00000000..72793513 Binary files /dev/null and b/GJ_GameSheet-uhd/colorSquare_01_small_color_001.png differ diff --git a/GJ_GameSheet-uhd/dA_blackSludge_01_001.png b/GJ_GameSheet-uhd/dA_blackSludge_01_001.png new file mode 100644 index 00000000..4d898b15 Binary files /dev/null and b/GJ_GameSheet-uhd/dA_blackSludge_01_001.png differ diff --git a/GJ_GameSheet-uhd/dA_blackSludge_02_001.png b/GJ_GameSheet-uhd/dA_blackSludge_02_001.png new file mode 100644 index 00000000..50d4df3d Binary files /dev/null and b/GJ_GameSheet-uhd/dA_blackSludge_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_02_chain_01_001.png b/GJ_GameSheet-uhd/d_02_chain_01_001.png new file mode 100644 index 00000000..37299d6b Binary files /dev/null and b/GJ_GameSheet-uhd/d_02_chain_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_02_chain_02_001.png b/GJ_GameSheet-uhd/d_02_chain_02_001.png new file mode 100644 index 00000000..3c9a3895 Binary files /dev/null and b/GJ_GameSheet-uhd/d_02_chain_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_03_chain_01_001.png b/GJ_GameSheet-uhd/d_03_chain_01_001.png new file mode 100644 index 00000000..d5ddf368 Binary files /dev/null and b/GJ_GameSheet-uhd/d_03_chain_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_03_chain_02_001.png b/GJ_GameSheet-uhd/d_03_chain_02_001.png new file mode 100644 index 00000000..7eba225e Binary files /dev/null and b/GJ_GameSheet-uhd/d_03_chain_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_001.png b/GJ_GameSheet-uhd/d_animLoading_01_001.png new file mode 100644 index 00000000..d3b2bf51 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_002.png b/GJ_GameSheet-uhd/d_animLoading_01_002.png new file mode 100644 index 00000000..833caa9f Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_002.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_003.png b/GJ_GameSheet-uhd/d_animLoading_01_003.png new file mode 100644 index 00000000..2539f4bb Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_003.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_004.png b/GJ_GameSheet-uhd/d_animLoading_01_004.png new file mode 100644 index 00000000..977851f8 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_004.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_005.png b/GJ_GameSheet-uhd/d_animLoading_01_005.png new file mode 100644 index 00000000..bbf5d995 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_005.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_006.png b/GJ_GameSheet-uhd/d_animLoading_01_006.png new file mode 100644 index 00000000..13dfbc9d Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_006.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_color_001.png b/GJ_GameSheet-uhd/d_animLoading_01_color_001.png new file mode 100644 index 00000000..fa5c7bdc Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_color_002.png b/GJ_GameSheet-uhd/d_animLoading_01_color_002.png new file mode 100644 index 00000000..cc91e7f1 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_color_002.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_color_003.png b/GJ_GameSheet-uhd/d_animLoading_01_color_003.png new file mode 100644 index 00000000..642044fe Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_color_003.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_color_004.png b/GJ_GameSheet-uhd/d_animLoading_01_color_004.png new file mode 100644 index 00000000..d128c422 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_color_004.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_color_005.png b/GJ_GameSheet-uhd/d_animLoading_01_color_005.png new file mode 100644 index 00000000..4824cafe Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_color_005.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_01_color_006.png b/GJ_GameSheet-uhd/d_animLoading_01_color_006.png new file mode 100644 index 00000000..9b626e5e Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_01_color_006.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_001.png b/GJ_GameSheet-uhd/d_animLoading_02_001.png new file mode 100644 index 00000000..d50c6a4b Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_002.png b/GJ_GameSheet-uhd/d_animLoading_02_002.png new file mode 100644 index 00000000..129eb29f Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_002.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_003.png b/GJ_GameSheet-uhd/d_animLoading_02_003.png new file mode 100644 index 00000000..c8c8eae5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_003.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_004.png b/GJ_GameSheet-uhd/d_animLoading_02_004.png new file mode 100644 index 00000000..dbb880c4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_004.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_005.png b/GJ_GameSheet-uhd/d_animLoading_02_005.png new file mode 100644 index 00000000..47a38dbd Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_005.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_006.png b/GJ_GameSheet-uhd/d_animLoading_02_006.png new file mode 100644 index 00000000..10389a31 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_006.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_007.png b/GJ_GameSheet-uhd/d_animLoading_02_007.png new file mode 100644 index 00000000..6089ccd8 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_007.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_color_001.png b/GJ_GameSheet-uhd/d_animLoading_02_color_001.png new file mode 100644 index 00000000..e688304e Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_color_002.png b/GJ_GameSheet-uhd/d_animLoading_02_color_002.png new file mode 100644 index 00000000..e25bf867 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_color_002.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_color_003.png b/GJ_GameSheet-uhd/d_animLoading_02_color_003.png new file mode 100644 index 00000000..85a50468 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_color_003.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_color_004.png b/GJ_GameSheet-uhd/d_animLoading_02_color_004.png new file mode 100644 index 00000000..3af207f5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_color_004.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_color_005.png b/GJ_GameSheet-uhd/d_animLoading_02_color_005.png new file mode 100644 index 00000000..cd9c2fa9 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_color_005.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_color_006.png b/GJ_GameSheet-uhd/d_animLoading_02_color_006.png new file mode 100644 index 00000000..d5603bfa Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_color_006.png differ diff --git a/GJ_GameSheet-uhd/d_animLoading_02_color_007.png b/GJ_GameSheet-uhd/d_animLoading_02_color_007.png new file mode 100644 index 00000000..430b8d97 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animLoading_02_color_007.png differ diff --git a/GJ_GameSheet-uhd/d_animSquare_01_001.png b/GJ_GameSheet-uhd/d_animSquare_01_001.png new file mode 100644 index 00000000..9d89498f Binary files /dev/null and b/GJ_GameSheet-uhd/d_animSquare_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_animSquare_01_002.png b/GJ_GameSheet-uhd/d_animSquare_01_002.png new file mode 100644 index 00000000..ab712b44 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animSquare_01_002.png differ diff --git a/GJ_GameSheet-uhd/d_animSquare_01_003.png b/GJ_GameSheet-uhd/d_animSquare_01_003.png new file mode 100644 index 00000000..6bd37eed Binary files /dev/null and b/GJ_GameSheet-uhd/d_animSquare_01_003.png differ diff --git a/GJ_GameSheet-uhd/d_animSquare_01_004.png b/GJ_GameSheet-uhd/d_animSquare_01_004.png new file mode 100644 index 00000000..ec667d28 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animSquare_01_004.png differ diff --git a/GJ_GameSheet-uhd/d_animSquare_01_005.png b/GJ_GameSheet-uhd/d_animSquare_01_005.png new file mode 100644 index 00000000..a5dd1d66 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animSquare_01_005.png differ diff --git a/GJ_GameSheet-uhd/d_animSquare_01_006.png b/GJ_GameSheet-uhd/d_animSquare_01_006.png new file mode 100644 index 00000000..dcc441d2 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animSquare_01_006.png differ diff --git a/GJ_GameSheet-uhd/d_animSquare_01_007.png b/GJ_GameSheet-uhd/d_animSquare_01_007.png new file mode 100644 index 00000000..d15cd071 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animSquare_01_007.png differ diff --git a/GJ_GameSheet-uhd/d_animSquare_01_008.png b/GJ_GameSheet-uhd/d_animSquare_01_008.png new file mode 100644 index 00000000..40b1085e Binary files /dev/null and b/GJ_GameSheet-uhd/d_animSquare_01_008.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_01_001.png b/GJ_GameSheet-uhd/d_animWave_01_001.png new file mode 100644 index 00000000..54f520b3 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_01_002.png b/GJ_GameSheet-uhd/d_animWave_01_002.png new file mode 100644 index 00000000..adbdfa6f Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_01_002.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_01_003.png b/GJ_GameSheet-uhd/d_animWave_01_003.png new file mode 100644 index 00000000..a8ae5a23 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_01_003.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_01_006.png b/GJ_GameSheet-uhd/d_animWave_01_006.png new file mode 100644 index 00000000..84f7e593 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_01_006.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_01_007.png b/GJ_GameSheet-uhd/d_animWave_01_007.png new file mode 100644 index 00000000..d9280a58 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_01_007.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_01_008.png b/GJ_GameSheet-uhd/d_animWave_01_008.png new file mode 100644 index 00000000..689637bf Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_01_008.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_01_base_001.png b/GJ_GameSheet-uhd/d_animWave_01_base_001.png new file mode 100644 index 00000000..eda36885 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_01_base_001.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_02_001.png b/GJ_GameSheet-uhd/d_animWave_02_001.png new file mode 100644 index 00000000..f5cd362a Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_02_002.png b/GJ_GameSheet-uhd/d_animWave_02_002.png new file mode 100644 index 00000000..68657853 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_02_002.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_02_003.png b/GJ_GameSheet-uhd/d_animWave_02_003.png new file mode 100644 index 00000000..627c0581 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_02_003.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_02_004.png b/GJ_GameSheet-uhd/d_animWave_02_004.png new file mode 100644 index 00000000..589bb607 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_02_004.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_02_005.png b/GJ_GameSheet-uhd/d_animWave_02_005.png new file mode 100644 index 00000000..91d9e67b Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_02_005.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_02_006.png b/GJ_GameSheet-uhd/d_animWave_02_006.png new file mode 100644 index 00000000..c1da3383 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_02_006.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_02_base_001.png b/GJ_GameSheet-uhd/d_animWave_02_base_001.png new file mode 100644 index 00000000..30a4cf2b Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_02_base_001.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_03_001.png b/GJ_GameSheet-uhd/d_animWave_03_001.png new file mode 100644 index 00000000..33e9dd43 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_03_002.png b/GJ_GameSheet-uhd/d_animWave_03_002.png new file mode 100644 index 00000000..4c9d76f1 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_03_002.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_03_003.png b/GJ_GameSheet-uhd/d_animWave_03_003.png new file mode 100644 index 00000000..60cd81f9 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_03_003.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_03_004.png b/GJ_GameSheet-uhd/d_animWave_03_004.png new file mode 100644 index 00000000..6f9c27e7 Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_03_004.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_03_005.png b/GJ_GameSheet-uhd/d_animWave_03_005.png new file mode 100644 index 00000000..53542c7b Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_03_005.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_03_006.png b/GJ_GameSheet-uhd/d_animWave_03_006.png new file mode 100644 index 00000000..30faac5f Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_03_006.png differ diff --git a/GJ_GameSheet-uhd/d_animWave_03_base_001.png b/GJ_GameSheet-uhd/d_animWave_03_base_001.png new file mode 100644 index 00000000..bac46f3a Binary files /dev/null and b/GJ_GameSheet-uhd/d_animWave_03_base_001.png differ diff --git a/GJ_GameSheet-uhd/d_arrow_01_001.png b/GJ_GameSheet-uhd/d_arrow_01_001.png new file mode 100644 index 00000000..c2eae13a Binary files /dev/null and b/GJ_GameSheet-uhd/d_arrow_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_arrow_02_001.png b/GJ_GameSheet-uhd/d_arrow_02_001.png new file mode 100644 index 00000000..c396b9f8 Binary files /dev/null and b/GJ_GameSheet-uhd/d_arrow_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_arrow_03_001.png b/GJ_GameSheet-uhd/d_arrow_03_001.png new file mode 100644 index 00000000..bb7b0cd4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_arrow_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_artCloud_01_001.png b/GJ_GameSheet-uhd/d_artCloud_01_001.png new file mode 100644 index 00000000..bab1a0bd Binary files /dev/null and b/GJ_GameSheet-uhd/d_artCloud_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_artCloud_02_001.png b/GJ_GameSheet-uhd/d_artCloud_02_001.png new file mode 100644 index 00000000..ada35a98 Binary files /dev/null and b/GJ_GameSheet-uhd/d_artCloud_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_artCloud_03_001.png b/GJ_GameSheet-uhd/d_artCloud_03_001.png new file mode 100644 index 00000000..ef229d79 Binary files /dev/null and b/GJ_GameSheet-uhd/d_artCloud_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_art_01_001.png b/GJ_GameSheet-uhd/d_art_01_001.png new file mode 100644 index 00000000..3bb968f6 Binary files /dev/null and b/GJ_GameSheet-uhd/d_art_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_art_02_001.png b/GJ_GameSheet-uhd/d_art_02_001.png new file mode 100644 index 00000000..0bda5470 Binary files /dev/null and b/GJ_GameSheet-uhd/d_art_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_01_001.png b/GJ_GameSheet-uhd/d_ball_01_001.png new file mode 100644 index 00000000..2be3886e Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_02_001.png b/GJ_GameSheet-uhd/d_ball_02_001.png new file mode 100644 index 00000000..b7f143b6 Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_03_001.png b/GJ_GameSheet-uhd/d_ball_03_001.png new file mode 100644 index 00000000..dca2e923 Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_04_001.png b/GJ_GameSheet-uhd/d_ball_04_001.png new file mode 100644 index 00000000..3f8cd385 Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_05_001.png b/GJ_GameSheet-uhd/d_ball_05_001.png new file mode 100644 index 00000000..f1123487 Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_06_001.png b/GJ_GameSheet-uhd/d_ball_06_001.png new file mode 100644 index 00000000..c1cd3690 Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_06_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_07_001.png b/GJ_GameSheet-uhd/d_ball_07_001.png new file mode 100644 index 00000000..78ccf60b Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_07_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_08_001.png b/GJ_GameSheet-uhd/d_ball_08_001.png new file mode 100644 index 00000000..f8efbd4e Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_08_001.png differ diff --git a/GJ_GameSheet-uhd/d_ball_09_001.png b/GJ_GameSheet-uhd/d_ball_09_001.png new file mode 100644 index 00000000..65ec9c74 Binary files /dev/null and b/GJ_GameSheet-uhd/d_ball_09_001.png differ diff --git a/GJ_GameSheet-uhd/d_bar_01_001.png b/GJ_GameSheet-uhd/d_bar_01_001.png new file mode 100644 index 00000000..20b46c09 Binary files /dev/null and b/GJ_GameSheet-uhd/d_bar_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_bar_02_001.png b/GJ_GameSheet-uhd/d_bar_02_001.png new file mode 100644 index 00000000..7ff64592 Binary files /dev/null and b/GJ_GameSheet-uhd/d_bar_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_bar_03_001.png b/GJ_GameSheet-uhd/d_bar_03_001.png new file mode 100644 index 00000000..a0e60c00 Binary files /dev/null and b/GJ_GameSheet-uhd/d_bar_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_bar_04_001.png b/GJ_GameSheet-uhd/d_bar_04_001.png new file mode 100644 index 00000000..2c10f767 Binary files /dev/null and b/GJ_GameSheet-uhd/d_bar_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_bar_07_001.png b/GJ_GameSheet-uhd/d_bar_07_001.png new file mode 100644 index 00000000..38da9fb6 Binary files /dev/null and b/GJ_GameSheet-uhd/d_bar_07_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece01_001.png b/GJ_GameSheet-uhd/d_block04_piece01_001.png new file mode 100644 index 00000000..25a8d35d Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece01_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece02_001.png b/GJ_GameSheet-uhd/d_block04_piece02_001.png new file mode 100644 index 00000000..1f767f01 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece02_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece03_001.png b/GJ_GameSheet-uhd/d_block04_piece03_001.png new file mode 100644 index 00000000..ab67de63 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece03_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece04_001.png b/GJ_GameSheet-uhd/d_block04_piece04_001.png new file mode 100644 index 00000000..bafb9c79 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece04_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece05_001.png b/GJ_GameSheet-uhd/d_block04_piece05_001.png new file mode 100644 index 00000000..11ec9d58 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece05_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece06_001.png b/GJ_GameSheet-uhd/d_block04_piece06_001.png new file mode 100644 index 00000000..7222e883 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece06_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece07_001.png b/GJ_GameSheet-uhd/d_block04_piece07_001.png new file mode 100644 index 00000000..f4ea2451 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece07_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece08_001.png b/GJ_GameSheet-uhd/d_block04_piece08_001.png new file mode 100644 index 00000000..35f0d36f Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece08_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece09_001.png b/GJ_GameSheet-uhd/d_block04_piece09_001.png new file mode 100644 index 00000000..ae6c9662 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece09_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece10_001.png b/GJ_GameSheet-uhd/d_block04_piece10_001.png new file mode 100644 index 00000000..e9af2e76 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece10_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece11_001.png b/GJ_GameSheet-uhd/d_block04_piece11_001.png new file mode 100644 index 00000000..e0179dcf Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece11_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece12_001.png b/GJ_GameSheet-uhd/d_block04_piece12_001.png new file mode 100644 index 00000000..db2deb2a Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece12_001.png differ diff --git a/GJ_GameSheet-uhd/d_block04_piece13_001.png b/GJ_GameSheet-uhd/d_block04_piece13_001.png new file mode 100644 index 00000000..ff0a34e4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_block04_piece13_001.png differ diff --git a/GJ_GameSheet-uhd/d_brick_01_001.png b/GJ_GameSheet-uhd/d_brick_01_001.png new file mode 100644 index 00000000..11f0312d Binary files /dev/null and b/GJ_GameSheet-uhd/d_brick_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_brick_02_001.png b/GJ_GameSheet-uhd/d_brick_02_001.png new file mode 100644 index 00000000..af4ad253 Binary files /dev/null and b/GJ_GameSheet-uhd/d_brick_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_brick_03_001.png b/GJ_GameSheet-uhd/d_brick_03_001.png new file mode 100644 index 00000000..71fab47e Binary files /dev/null and b/GJ_GameSheet-uhd/d_brick_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_cartwheel_01_001.png b/GJ_GameSheet-uhd/d_cartwheel_01_001.png new file mode 100644 index 00000000..9bfec372 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cartwheel_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_cartwheel_02_001.png b/GJ_GameSheet-uhd/d_cartwheel_02_001.png new file mode 100644 index 00000000..05d534a4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cartwheel_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_cartwheel_03_001.png b/GJ_GameSheet-uhd/d_cartwheel_03_001.png new file mode 100644 index 00000000..4cfff0c1 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cartwheel_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_chain_02_001.png b/GJ_GameSheet-uhd/d_chain_02_001.png new file mode 100644 index 00000000..f172ca2f Binary files /dev/null and b/GJ_GameSheet-uhd/d_chain_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_circle_01_001.png b/GJ_GameSheet-uhd/d_circle_01_001.png new file mode 100644 index 00000000..b6617df8 Binary files /dev/null and b/GJ_GameSheet-uhd/d_circle_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_circle_02_001.png b/GJ_GameSheet-uhd/d_circle_02_001.png new file mode 100644 index 00000000..e641898d Binary files /dev/null and b/GJ_GameSheet-uhd/d_circle_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_cloud_01_001.png b/GJ_GameSheet-uhd/d_cloud_01_001.png new file mode 100644 index 00000000..7cb07df7 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cloud_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_cloud_02_001.png b/GJ_GameSheet-uhd/d_cloud_02_001.png new file mode 100644 index 00000000..3cd83117 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cloud_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_cloud_03_001.png b/GJ_GameSheet-uhd/d_cloud_03_001.png new file mode 100644 index 00000000..8491e4e4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cloud_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_cloud_04_001.png b/GJ_GameSheet-uhd/d_cloud_04_001.png new file mode 100644 index 00000000..32064f6f Binary files /dev/null and b/GJ_GameSheet-uhd/d_cloud_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_cloud_05_001.png b/GJ_GameSheet-uhd/d_cloud_05_001.png new file mode 100644 index 00000000..cc81bdb7 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cloud_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_cogwheel_01_001.png b/GJ_GameSheet-uhd/d_cogwheel_01_001.png new file mode 100644 index 00000000..445b1013 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cogwheel_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_cogwheel_02_001.png b/GJ_GameSheet-uhd/d_cogwheel_02_001.png new file mode 100644 index 00000000..2aab6c46 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cogwheel_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_cogwheel_03_001.png b/GJ_GameSheet-uhd/d_cogwheel_03_001.png new file mode 100644 index 00000000..dd0626a1 Binary files /dev/null and b/GJ_GameSheet-uhd/d_cogwheel_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_cogwheel_04_001.png b/GJ_GameSheet-uhd/d_cogwheel_04_001.png new file mode 100644 index 00000000..a9aea8ee Binary files /dev/null and b/GJ_GameSheet-uhd/d_cogwheel_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_cross_01_001.png b/GJ_GameSheet-uhd/d_cross_01_001.png new file mode 100644 index 00000000..c3b6810b Binary files /dev/null and b/GJ_GameSheet-uhd/d_cross_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_exmark_01_001.png b/GJ_GameSheet-uhd/d_exmark_01_001.png new file mode 100644 index 00000000..77cf0f9a Binary files /dev/null and b/GJ_GameSheet-uhd/d_exmark_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_flashRing_01_001.png b/GJ_GameSheet-uhd/d_flashRing_01_001.png new file mode 100644 index 00000000..439b7796 Binary files /dev/null and b/GJ_GameSheet-uhd/d_flashRing_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_flashRing_02_001.png b/GJ_GameSheet-uhd/d_flashRing_02_001.png new file mode 100644 index 00000000..5b797c80 Binary files /dev/null and b/GJ_GameSheet-uhd/d_flashRing_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_flashRing_03_001.png b/GJ_GameSheet-uhd/d_flashRing_03_001.png new file mode 100644 index 00000000..7582ab00 Binary files /dev/null and b/GJ_GameSheet-uhd/d_flashRing_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_flower01_01_001.png b/GJ_GameSheet-uhd/d_flower01_01_001.png new file mode 100644 index 00000000..00c8527f Binary files /dev/null and b/GJ_GameSheet-uhd/d_flower01_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_flower01_01_color_001.png b/GJ_GameSheet-uhd/d_flower01_01_color_001.png new file mode 100644 index 00000000..b1e0eb57 Binary files /dev/null and b/GJ_GameSheet-uhd/d_flower01_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_flower01_01_shine_001.png b/GJ_GameSheet-uhd/d_flower01_01_shine_001.png new file mode 100644 index 00000000..68d5dda4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_flower01_01_shine_001.png differ diff --git a/GJ_GameSheet-uhd/d_geometric_01_001.png b/GJ_GameSheet-uhd/d_geometric_01_001.png new file mode 100644 index 00000000..a2aa7d60 Binary files /dev/null and b/GJ_GameSheet-uhd/d_geometric_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_geometric_02_001.png b/GJ_GameSheet-uhd/d_geometric_02_001.png new file mode 100644 index 00000000..769b138d Binary files /dev/null and b/GJ_GameSheet-uhd/d_geometric_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_geometric_03_001.png b/GJ_GameSheet-uhd/d_geometric_03_001.png new file mode 100644 index 00000000..7ab381c5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_geometric_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_01_001.png b/GJ_GameSheet-uhd/d_gradient_01_001.png new file mode 100644 index 00000000..7da08f88 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_02_001.png b/GJ_GameSheet-uhd/d_gradient_02_001.png new file mode 100644 index 00000000..4e1e3294 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_03_001.png b/GJ_GameSheet-uhd/d_gradient_03_001.png new file mode 100644 index 00000000..e304659e Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_04_001.png b/GJ_GameSheet-uhd/d_gradient_04_001.png new file mode 100644 index 00000000..1ae2b6b0 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_05_001.png b/GJ_GameSheet-uhd/d_gradient_05_001.png new file mode 100644 index 00000000..a2c31b4d Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_06_001.png b/GJ_GameSheet-uhd/d_gradient_06_001.png new file mode 100644 index 00000000..d19cabd2 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_06_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_b_02_001.png b/GJ_GameSheet-uhd/d_gradient_b_02_001.png new file mode 100644 index 00000000..5921aa39 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_b_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_b_03_001.png b/GJ_GameSheet-uhd/d_gradient_b_03_001.png new file mode 100644 index 00000000..d3965650 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_b_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_b_04_001.png b/GJ_GameSheet-uhd/d_gradient_b_04_001.png new file mode 100644 index 00000000..d31f99f0 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_b_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_b_05_001.png b/GJ_GameSheet-uhd/d_gradient_b_05_001.png new file mode 100644 index 00000000..e0a351f3 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_b_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_b_06_001.png b/GJ_GameSheet-uhd/d_gradient_b_06_001.png new file mode 100644 index 00000000..c64b44d5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_b_06_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_c_01_001.png b/GJ_GameSheet-uhd/d_gradient_c_01_001.png new file mode 100644 index 00000000..03d7a04f Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_c_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_c_02_001.png b/GJ_GameSheet-uhd/d_gradient_c_02_001.png new file mode 100644 index 00000000..018515f2 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_c_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_c_03_001.png b/GJ_GameSheet-uhd/d_gradient_c_03_001.png new file mode 100644 index 00000000..fbeb386e Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_c_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_c_04_001.png b/GJ_GameSheet-uhd/d_gradient_c_04_001.png new file mode 100644 index 00000000..3df4b620 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_c_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_c_05_001.png b/GJ_GameSheet-uhd/d_gradient_c_05_001.png new file mode 100644 index 00000000..317f77a4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_c_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_gradient_c_06_001.png b/GJ_GameSheet-uhd/d_gradient_c_06_001.png new file mode 100644 index 00000000..2960ef63 Binary files /dev/null and b/GJ_GameSheet-uhd/d_gradient_c_06_001.png differ diff --git a/GJ_GameSheet-uhd/d_grassArt_01_001.png b/GJ_GameSheet-uhd/d_grassArt_01_001.png new file mode 100644 index 00000000..4a8d27dc Binary files /dev/null and b/GJ_GameSheet-uhd/d_grassArt_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_grassArt_02_001.png b/GJ_GameSheet-uhd/d_grassArt_02_001.png new file mode 100644 index 00000000..e41cf0ac Binary files /dev/null and b/GJ_GameSheet-uhd/d_grassArt_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_grassArt_03_001.png b/GJ_GameSheet-uhd/d_grassArt_03_001.png new file mode 100644 index 00000000..a2fefb01 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grassArt_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_grassArt_04_001.png b/GJ_GameSheet-uhd/d_grassArt_04_001.png new file mode 100644 index 00000000..9ce6dda6 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grassArt_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_grassDetail_01_001.png b/GJ_GameSheet-uhd/d_grassDetail_01_001.png new file mode 100644 index 00000000..6d4bc1ff Binary files /dev/null and b/GJ_GameSheet-uhd/d_grassDetail_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_grassDetail_02_001.png b/GJ_GameSheet-uhd/d_grassDetail_02_001.png new file mode 100644 index 00000000..02201853 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grassDetail_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_grassDetail_03_001.png b/GJ_GameSheet-uhd/d_grassDetail_03_001.png new file mode 100644 index 00000000..69108947 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grassDetail_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_grass_01_001.png b/GJ_GameSheet-uhd/d_grass_01_001.png new file mode 100644 index 00000000..48a0dfb4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grass_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_grass_02_001.png b/GJ_GameSheet-uhd/d_grass_02_001.png new file mode 100644 index 00000000..b1dc40a1 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grass_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_grass_03_001.png b/GJ_GameSheet-uhd/d_grass_03_001.png new file mode 100644 index 00000000..07d99541 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grass_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_grass_04_001.png b/GJ_GameSheet-uhd/d_grass_04_001.png new file mode 100644 index 00000000..d096efc6 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grass_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_grass_05_001.png b/GJ_GameSheet-uhd/d_grass_05_001.png new file mode 100644 index 00000000..10e66064 Binary files /dev/null and b/GJ_GameSheet-uhd/d_grass_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_heart01_001.png b/GJ_GameSheet-uhd/d_heart01_001.png new file mode 100644 index 00000000..9fb8261e Binary files /dev/null and b/GJ_GameSheet-uhd/d_heart01_001.png differ diff --git a/GJ_GameSheet-uhd/d_heart01_color_001.png b/GJ_GameSheet-uhd/d_heart01_color_001.png new file mode 100644 index 00000000..ffc4199e Binary files /dev/null and b/GJ_GameSheet-uhd/d_heart01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_heart01_match_001.png b/GJ_GameSheet-uhd/d_heart01_match_001.png new file mode 100644 index 00000000..ebdb3b50 Binary files /dev/null and b/GJ_GameSheet-uhd/d_heart01_match_001.png differ diff --git a/GJ_GameSheet-uhd/d_heart01_match_color_001.png b/GJ_GameSheet-uhd/d_heart01_match_color_001.png new file mode 100644 index 00000000..3c55b3c7 Binary files /dev/null and b/GJ_GameSheet-uhd/d_heart01_match_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_key01_001.png b/GJ_GameSheet-uhd/d_key01_001.png new file mode 100644 index 00000000..15d67d6e Binary files /dev/null and b/GJ_GameSheet-uhd/d_key01_001.png differ diff --git a/GJ_GameSheet-uhd/d_key01_color_001.png b/GJ_GameSheet-uhd/d_key01_color_001.png new file mode 100644 index 00000000..e0d9b0a5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_key01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_keyHole01_001.png b/GJ_GameSheet-uhd/d_keyHole01_001.png new file mode 100644 index 00000000..d33d49d9 Binary files /dev/null and b/GJ_GameSheet-uhd/d_keyHole01_001.png differ diff --git a/GJ_GameSheet-uhd/d_keyHole01_color_001.png b/GJ_GameSheet-uhd/d_keyHole01_color_001.png new file mode 100644 index 00000000..7657923e Binary files /dev/null and b/GJ_GameSheet-uhd/d_keyHole01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_largeSquare_01_001.png b/GJ_GameSheet-uhd/d_largeSquare_01_001.png new file mode 100644 index 00000000..3e1667ae Binary files /dev/null and b/GJ_GameSheet-uhd/d_largeSquare_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_largeSquare_02_001.png b/GJ_GameSheet-uhd/d_largeSquare_02_001.png new file mode 100644 index 00000000..e4d8fc8f Binary files /dev/null and b/GJ_GameSheet-uhd/d_largeSquare_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_01_001.png b/GJ_GameSheet-uhd/d_link_01_001.png new file mode 100644 index 00000000..522a590a Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_02_001.png b/GJ_GameSheet-uhd/d_link_02_001.png new file mode 100644 index 00000000..c605d64a Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_03_001.png b/GJ_GameSheet-uhd/d_link_03_001.png new file mode 100644 index 00000000..1248ff15 Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_04_001.png b/GJ_GameSheet-uhd/d_link_04_001.png new file mode 100644 index 00000000..ed5056a8 Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_05_001.png b/GJ_GameSheet-uhd/d_link_05_001.png new file mode 100644 index 00000000..aa9e0958 Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_01_001.png b/GJ_GameSheet-uhd/d_link_b_01_001.png new file mode 100644 index 00000000..6341c1ad Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_01_color_001.png b/GJ_GameSheet-uhd/d_link_b_01_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_02_001.png b/GJ_GameSheet-uhd/d_link_b_02_001.png new file mode 100644 index 00000000..8e3b830a Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_02_color_001.png b/GJ_GameSheet-uhd/d_link_b_02_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_03_001.png b/GJ_GameSheet-uhd/d_link_b_03_001.png new file mode 100644 index 00000000..ed8d72fe Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_03_color_001.png b/GJ_GameSheet-uhd/d_link_b_03_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_04_001.png b/GJ_GameSheet-uhd/d_link_b_04_001.png new file mode 100644 index 00000000..54578b8d Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_04_color_001.png b/GJ_GameSheet-uhd/d_link_b_04_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_05_001.png b/GJ_GameSheet-uhd/d_link_b_05_001.png new file mode 100644 index 00000000..e0d75126 Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_05_color_001.png b/GJ_GameSheet-uhd/d_link_b_05_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_b_06_001.png b/GJ_GameSheet-uhd/d_link_b_06_001.png new file mode 100644 index 00000000..ebe5b43b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_b_06_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_01_001.png b/GJ_GameSheet-uhd/d_link_c_01_001.png new file mode 100644 index 00000000..1cbcf207 Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_01_color_001.png b/GJ_GameSheet-uhd/d_link_c_01_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_02_001.png b/GJ_GameSheet-uhd/d_link_c_02_001.png new file mode 100644 index 00000000..82df0b3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_02_color_001.png b/GJ_GameSheet-uhd/d_link_c_02_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_03_001.png b/GJ_GameSheet-uhd/d_link_c_03_001.png new file mode 100644 index 00000000..b21ef975 Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_03_color_001.png b/GJ_GameSheet-uhd/d_link_c_03_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_04_001.png b/GJ_GameSheet-uhd/d_link_c_04_001.png new file mode 100644 index 00000000..10adc426 Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_04_color_001.png b/GJ_GameSheet-uhd/d_link_c_04_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_05_001.png b/GJ_GameSheet-uhd/d_link_c_05_001.png new file mode 100644 index 00000000..c84b3e2e Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_c_05_color_001.png b/GJ_GameSheet-uhd/d_link_c_05_color_001.png new file mode 100644 index 00000000..90306c3b Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_c_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_01_001.png b/GJ_GameSheet-uhd/d_link_d_01_001.png new file mode 100644 index 00000000..335ca0ec Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_01_color_001.png b/GJ_GameSheet-uhd/d_link_d_01_color_001.png new file mode 100644 index 00000000..821c69dd Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_02_001.png b/GJ_GameSheet-uhd/d_link_d_02_001.png new file mode 100644 index 00000000..edf69e1a Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_02_color_001.png b/GJ_GameSheet-uhd/d_link_d_02_color_001.png new file mode 100644 index 00000000..821c69dd Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_03_001.png b/GJ_GameSheet-uhd/d_link_d_03_001.png new file mode 100644 index 00000000..37b56fca Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_03_color_001.png b/GJ_GameSheet-uhd/d_link_d_03_color_001.png new file mode 100644 index 00000000..821c69dd Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_04_001.png b/GJ_GameSheet-uhd/d_link_d_04_001.png new file mode 100644 index 00000000..9bb97adf Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_04_color_001.png b/GJ_GameSheet-uhd/d_link_d_04_color_001.png new file mode 100644 index 00000000..821c69dd Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_05_001.png b/GJ_GameSheet-uhd/d_link_d_05_001.png new file mode 100644 index 00000000..6221c0c5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_link_d_05_color_001.png b/GJ_GameSheet-uhd/d_link_d_05_color_001.png new file mode 100644 index 00000000..821c69dd Binary files /dev/null and b/GJ_GameSheet-uhd/d_link_d_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_pickupCircle_01_001.png b/GJ_GameSheet-uhd/d_pickupCircle_01_001.png new file mode 100644 index 00000000..fec98dd4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pickupCircle_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_pickupCircle_02_001.png b/GJ_GameSheet-uhd/d_pickupCircle_02_001.png new file mode 100644 index 00000000..cef905e2 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pickupCircle_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_pillar_01_001.png b/GJ_GameSheet-uhd/d_pillar_01_001.png new file mode 100644 index 00000000..8860d3c4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pillar_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_pillar_02_001.png b/GJ_GameSheet-uhd/d_pillar_02_001.png new file mode 100644 index 00000000..ce4d038d Binary files /dev/null and b/GJ_GameSheet-uhd/d_pillar_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_pillar_03_001.png b/GJ_GameSheet-uhd/d_pillar_03_001.png new file mode 100644 index 00000000..319d727e Binary files /dev/null and b/GJ_GameSheet-uhd/d_pillar_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_pit06wave_01_001.png b/GJ_GameSheet-uhd/d_pit06wave_01_001.png new file mode 100644 index 00000000..15d09cf5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pit06wave_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_pit06wave_02_001.png b/GJ_GameSheet-uhd/d_pit06wave_02_001.png new file mode 100644 index 00000000..f74127d9 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pit06wave_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_pixelArt01_001_001.png b/GJ_GameSheet-uhd/d_pixelArt01_001_001.png new file mode 100644 index 00000000..2f6ec222 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pixelArt01_001_001.png differ diff --git a/GJ_GameSheet-uhd/d_pixelArt01_002_001.png b/GJ_GameSheet-uhd/d_pixelArt01_002_001.png new file mode 100644 index 00000000..a136c957 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pixelArt01_002_001.png differ diff --git a/GJ_GameSheet-uhd/d_pixelArt01_003_001.png b/GJ_GameSheet-uhd/d_pixelArt01_003_001.png new file mode 100644 index 00000000..6aeb60ae Binary files /dev/null and b/GJ_GameSheet-uhd/d_pixelArt01_003_001.png differ diff --git a/GJ_GameSheet-uhd/d_pixelArt01_004_001.png b/GJ_GameSheet-uhd/d_pixelArt01_004_001.png new file mode 100644 index 00000000..3814c37e Binary files /dev/null and b/GJ_GameSheet-uhd/d_pixelArt01_004_001.png differ diff --git a/GJ_GameSheet-uhd/d_pixelArt01_005_001.png b/GJ_GameSheet-uhd/d_pixelArt01_005_001.png new file mode 100644 index 00000000..7ad56625 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pixelArt01_005_001.png differ diff --git a/GJ_GameSheet-uhd/d_pixelArt01_006_001.png b/GJ_GameSheet-uhd/d_pixelArt01_006_001.png new file mode 100644 index 00000000..8ec32ed6 Binary files /dev/null and b/GJ_GameSheet-uhd/d_pixelArt01_006_001.png differ diff --git a/GJ_GameSheet-uhd/d_potion01_001.png b/GJ_GameSheet-uhd/d_potion01_001.png new file mode 100644 index 00000000..9fb2fb41 Binary files /dev/null and b/GJ_GameSheet-uhd/d_potion01_001.png differ diff --git a/GJ_GameSheet-uhd/d_potion01_color_001.png b/GJ_GameSheet-uhd/d_potion01_color_001.png new file mode 100644 index 00000000..fc6ff197 Binary files /dev/null and b/GJ_GameSheet-uhd/d_potion01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_potion01_match_001.png b/GJ_GameSheet-uhd/d_potion01_match_001.png new file mode 100644 index 00000000..6af92e62 Binary files /dev/null and b/GJ_GameSheet-uhd/d_potion01_match_001.png differ diff --git a/GJ_GameSheet-uhd/d_potion01_match_color_001.png b/GJ_GameSheet-uhd/d_potion01_match_color_001.png new file mode 100644 index 00000000..852cf411 Binary files /dev/null and b/GJ_GameSheet-uhd/d_potion01_match_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_qmark_01_001.png b/GJ_GameSheet-uhd/d_qmark_01_001.png new file mode 100644 index 00000000..4ce7fa59 Binary files /dev/null and b/GJ_GameSheet-uhd/d_qmark_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_rainbow_01_001.png b/GJ_GameSheet-uhd/d_rainbow_01_001.png new file mode 100644 index 00000000..ccd34a33 Binary files /dev/null and b/GJ_GameSheet-uhd/d_rainbow_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_rainbow_02_001.png b/GJ_GameSheet-uhd/d_rainbow_02_001.png new file mode 100644 index 00000000..c3aa2239 Binary files /dev/null and b/GJ_GameSheet-uhd/d_rainbow_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_ringSeg_01_001.png b/GJ_GameSheet-uhd/d_ringSeg_01_001.png new file mode 100644 index 00000000..df716ace Binary files /dev/null and b/GJ_GameSheet-uhd/d_ringSeg_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_ringSeg_02_001.png b/GJ_GameSheet-uhd/d_ringSeg_02_001.png new file mode 100644 index 00000000..7f1013e5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_ringSeg_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_ringSeg_03_001.png b/GJ_GameSheet-uhd/d_ringSeg_03_001.png new file mode 100644 index 00000000..c2fd02e8 Binary files /dev/null and b/GJ_GameSheet-uhd/d_ringSeg_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_ringSeg_04_001.png b/GJ_GameSheet-uhd/d_ringSeg_04_001.png new file mode 100644 index 00000000..8ab6753a Binary files /dev/null and b/GJ_GameSheet-uhd/d_ringSeg_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_ringSpiral_01_001.png b/GJ_GameSheet-uhd/d_ringSpiral_01_001.png new file mode 100644 index 00000000..5c40fd7d Binary files /dev/null and b/GJ_GameSheet-uhd/d_ringSpiral_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingBall_01_001.png b/GJ_GameSheet-uhd/d_rotatingBall_01_001.png new file mode 100644 index 00000000..2eb6f39f Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingBall_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingBall_02_001.png b/GJ_GameSheet-uhd/d_rotatingBall_02_001.png new file mode 100644 index 00000000..243d724d Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingBall_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingBall_03_001.png b/GJ_GameSheet-uhd/d_rotatingBall_03_001.png new file mode 100644 index 00000000..d859b7cb Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingBall_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingBall_04_001.png b/GJ_GameSheet-uhd/d_rotatingBall_04_001.png new file mode 100644 index 00000000..17709200 Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingBall_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingLine_01_001.png b/GJ_GameSheet-uhd/d_rotatingLine_01_001.png new file mode 100644 index 00000000..fe47bc03 Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingLine_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingLine_02_001.png b/GJ_GameSheet-uhd/d_rotatingLine_02_001.png new file mode 100644 index 00000000..1b41c39b Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingLine_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingLine_03_001.png b/GJ_GameSheet-uhd/d_rotatingLine_03_001.png new file mode 100644 index 00000000..9eceb205 Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingLine_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingLine_04_001.png b/GJ_GameSheet-uhd/d_rotatingLine_04_001.png new file mode 100644 index 00000000..3bd9c3bd Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingLine_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingSquare_01_001.png b/GJ_GameSheet-uhd/d_rotatingSquare_01_001.png new file mode 100644 index 00000000..1b468bee Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingSquare_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingSquare_02_001.png b/GJ_GameSheet-uhd/d_rotatingSquare_02_001.png new file mode 100644 index 00000000..fed6885a Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingSquare_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingSquare_03_001.png b/GJ_GameSheet-uhd/d_rotatingSquare_03_001.png new file mode 100644 index 00000000..58507634 Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingSquare_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_rotatingSquare_04_001.png b/GJ_GameSheet-uhd/d_rotatingSquare_04_001.png new file mode 100644 index 00000000..92878bf2 Binary files /dev/null and b/GJ_GameSheet-uhd/d_rotatingSquare_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_roundCloud_01_001.png b/GJ_GameSheet-uhd/d_roundCloud_01_001.png new file mode 100644 index 00000000..8f1844d7 Binary files /dev/null and b/GJ_GameSheet-uhd/d_roundCloud_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_roundCloud_02_001.png b/GJ_GameSheet-uhd/d_roundCloud_02_001.png new file mode 100644 index 00000000..9189b03b Binary files /dev/null and b/GJ_GameSheet-uhd/d_roundCloud_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_roundCloud_03_001.png b/GJ_GameSheet-uhd/d_roundCloud_03_001.png new file mode 100644 index 00000000..0f7562fb Binary files /dev/null and b/GJ_GameSheet-uhd/d_roundCloud_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_scaleFadeRing_01_001.png b/GJ_GameSheet-uhd/d_scaleFadeRing_01_001.png new file mode 100644 index 00000000..9cea863f Binary files /dev/null and b/GJ_GameSheet-uhd/d_scaleFadeRing_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_scaleFadeRing_02_001.png b/GJ_GameSheet-uhd/d_scaleFadeRing_02_001.png new file mode 100644 index 00000000..98995e16 Binary files /dev/null and b/GJ_GameSheet-uhd/d_scaleFadeRing_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_scaleFadeRing_03_001.png b/GJ_GameSheet-uhd/d_scaleFadeRing_03_001.png new file mode 100644 index 00000000..b6a8fbdd Binary files /dev/null and b/GJ_GameSheet-uhd/d_scaleFadeRing_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_scaleFadeRing_04_001.png b/GJ_GameSheet-uhd/d_scaleFadeRing_04_001.png new file mode 100644 index 00000000..d36fab2a Binary files /dev/null and b/GJ_GameSheet-uhd/d_scaleFadeRing_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_01_001.png b/GJ_GameSheet-uhd/d_sign_01_001.png new file mode 100644 index 00000000..24460acf Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_01_color_001.png b/GJ_GameSheet-uhd/d_sign_01_color_001.png new file mode 100644 index 00000000..97ce48d3 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_01_color_02_001.png b/GJ_GameSheet-uhd/d_sign_01_color_02_001.png new file mode 100644 index 00000000..9a16f21e Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_01_color_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_img_01_001.png b/GJ_GameSheet-uhd/d_sign_img_01_001.png new file mode 100644 index 00000000..6613a204 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_img_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_img_02_001.png b/GJ_GameSheet-uhd/d_sign_img_02_001.png new file mode 100644 index 00000000..288119dc Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_img_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_img_03_001.png b/GJ_GameSheet-uhd/d_sign_img_03_001.png new file mode 100644 index 00000000..438578eb Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_img_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_img_04_001.png b/GJ_GameSheet-uhd/d_sign_img_04_001.png new file mode 100644 index 00000000..5d79617b Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_img_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_img_05_001.png b/GJ_GameSheet-uhd/d_sign_img_05_001.png new file mode 100644 index 00000000..c186240c Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_img_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_img_06_001.png b/GJ_GameSheet-uhd/d_sign_img_06_001.png new file mode 100644 index 00000000..87275bf2 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_img_06_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_paint_01_001.png b/GJ_GameSheet-uhd/d_sign_paint_01_001.png new file mode 100644 index 00000000..d665d5c3 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_paint_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_paint_02_001.png b/GJ_GameSheet-uhd/d_sign_paint_02_001.png new file mode 100644 index 00000000..804e7aaf Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_paint_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_paint_03_001.png b/GJ_GameSheet-uhd/d_sign_paint_03_001.png new file mode 100644 index 00000000..20b53299 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_paint_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_pole_001.png b/GJ_GameSheet-uhd/d_sign_pole_001.png new file mode 100644 index 00000000..1e7c3284 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_pole_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_pole_color_001.png b/GJ_GameSheet-uhd/d_sign_pole_color_001.png new file mode 100644 index 00000000..15d42139 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_pole_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_tile_01_001.png b/GJ_GameSheet-uhd/d_sign_tile_01_001.png new file mode 100644 index 00000000..4ffe0867 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_tile_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_sign_tile_01_color_001.png b/GJ_GameSheet-uhd/d_sign_tile_01_color_001.png new file mode 100644 index 00000000..c800c101 Binary files /dev/null and b/GJ_GameSheet-uhd/d_sign_tile_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_skull01_001.png b/GJ_GameSheet-uhd/d_skull01_001.png new file mode 100644 index 00000000..fe23d172 Binary files /dev/null and b/GJ_GameSheet-uhd/d_skull01_001.png differ diff --git a/GJ_GameSheet-uhd/d_skull01_color_001.png b/GJ_GameSheet-uhd/d_skull01_color_001.png new file mode 100644 index 00000000..9afc6b3f Binary files /dev/null and b/GJ_GameSheet-uhd/d_skull01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_skull01_match_001.png b/GJ_GameSheet-uhd/d_skull01_match_001.png new file mode 100644 index 00000000..b787919b Binary files /dev/null and b/GJ_GameSheet-uhd/d_skull01_match_001.png differ diff --git a/GJ_GameSheet-uhd/d_skull01_match_color_001.png b/GJ_GameSheet-uhd/d_skull01_match_color_001.png new file mode 100644 index 00000000..2cee6af5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_skull01_match_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_skull_01_001.png b/GJ_GameSheet-uhd/d_skull_01_001.png new file mode 100644 index 00000000..695e51ff Binary files /dev/null and b/GJ_GameSheet-uhd/d_skull_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_skull_02_001.png b/GJ_GameSheet-uhd/d_skull_02_001.png new file mode 100644 index 00000000..19cef87b Binary files /dev/null and b/GJ_GameSheet-uhd/d_skull_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_small_ball_01_001.png b/GJ_GameSheet-uhd/d_small_ball_01_001.png new file mode 100644 index 00000000..6baa2fb0 Binary files /dev/null and b/GJ_GameSheet-uhd/d_small_ball_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_small_ball_02_001.png b/GJ_GameSheet-uhd/d_small_ball_02_001.png new file mode 100644 index 00000000..1408a840 Binary files /dev/null and b/GJ_GameSheet-uhd/d_small_ball_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_small_ball_03_001.png b/GJ_GameSheet-uhd/d_small_ball_03_001.png new file mode 100644 index 00000000..5562d94b Binary files /dev/null and b/GJ_GameSheet-uhd/d_small_ball_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_small_ball_04_001.png b/GJ_GameSheet-uhd/d_small_ball_04_001.png new file mode 100644 index 00000000..58c49c11 Binary files /dev/null and b/GJ_GameSheet-uhd/d_small_ball_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_small_ball_05_001.png b/GJ_GameSheet-uhd/d_small_ball_05_001.png new file mode 100644 index 00000000..0a6c3638 Binary files /dev/null and b/GJ_GameSheet-uhd/d_small_ball_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_smallbar_01_001.png b/GJ_GameSheet-uhd/d_smallbar_01_001.png new file mode 100644 index 00000000..4db8f3e0 Binary files /dev/null and b/GJ_GameSheet-uhd/d_smallbar_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_smallbar_02_001.png b/GJ_GameSheet-uhd/d_smallbar_02_001.png new file mode 100644 index 00000000..27de4074 Binary files /dev/null and b/GJ_GameSheet-uhd/d_smallbar_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_smallbar_03_001.png b/GJ_GameSheet-uhd/d_smallbar_03_001.png new file mode 100644 index 00000000..a45cfe37 Binary files /dev/null and b/GJ_GameSheet-uhd/d_smallbar_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_smallbar_04_001.png b/GJ_GameSheet-uhd/d_smallbar_04_001.png new file mode 100644 index 00000000..88c2d6a6 Binary files /dev/null and b/GJ_GameSheet-uhd/d_smallbar_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_smallbar_05_001.png b/GJ_GameSheet-uhd/d_smallbar_05_001.png new file mode 100644 index 00000000..9e8c323f Binary files /dev/null and b/GJ_GameSheet-uhd/d_smallbar_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikeWave_01_001.png b/GJ_GameSheet-uhd/d_spikeWave_01_001.png new file mode 100644 index 00000000..ffe611ab Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikeWave_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikeWave_02_001.png b/GJ_GameSheet-uhd/d_spikeWave_02_001.png new file mode 100644 index 00000000..d40a8af9 Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikeWave_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikeWave_03_001.png b/GJ_GameSheet-uhd/d_spikeWave_03_001.png new file mode 100644 index 00000000..d0a9249c Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikeWave_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikeart_01_001.png b/GJ_GameSheet-uhd/d_spikeart_01_001.png new file mode 100644 index 00000000..71edeff0 Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikeart_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikeart_02_001.png b/GJ_GameSheet-uhd/d_spikeart_02_001.png new file mode 100644 index 00000000..8762452f Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikeart_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikeart_03_001.png b/GJ_GameSheet-uhd/d_spikeart_03_001.png new file mode 100644 index 00000000..228ff5d7 Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikeart_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikes_01_001.png b/GJ_GameSheet-uhd/d_spikes_01_001.png new file mode 100644 index 00000000..7090cb98 Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikes_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikes_02_001.png b/GJ_GameSheet-uhd/d_spikes_02_001.png new file mode 100644 index 00000000..0f79776c Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikes_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikes_03_001.png b/GJ_GameSheet-uhd/d_spikes_03_001.png new file mode 100644 index 00000000..57aca5f9 Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikes_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikes_04_001.png b/GJ_GameSheet-uhd/d_spikes_04_001.png new file mode 100644 index 00000000..de47dcdc Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikes_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikewheel_01_001.png b/GJ_GameSheet-uhd/d_spikewheel_01_001.png new file mode 100644 index 00000000..57919df5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikewheel_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikewheel_02_001.png b/GJ_GameSheet-uhd/d_spikewheel_02_001.png new file mode 100644 index 00000000..5584febe Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikewheel_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_spikewheel_03_001.png b/GJ_GameSheet-uhd/d_spikewheel_03_001.png new file mode 100644 index 00000000..9fbb51e1 Binary files /dev/null and b/GJ_GameSheet-uhd/d_spikewheel_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_spiral_01_001.png b/GJ_GameSheet-uhd/d_spiral_01_001.png new file mode 100644 index 00000000..2dff81eb Binary files /dev/null and b/GJ_GameSheet-uhd/d_spiral_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_spiral_02_001.png b/GJ_GameSheet-uhd/d_spiral_02_001.png new file mode 100644 index 00000000..33a2555d Binary files /dev/null and b/GJ_GameSheet-uhd/d_spiral_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_spiral_03_001.png b/GJ_GameSheet-uhd/d_spiral_03_001.png new file mode 100644 index 00000000..0096e8dd Binary files /dev/null and b/GJ_GameSheet-uhd/d_spiral_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_spiral_04_001.png b/GJ_GameSheet-uhd/d_spiral_04_001.png new file mode 100644 index 00000000..2f7f4eb5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_spiral_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_square_01_001.png b/GJ_GameSheet-uhd/d_square_01_001.png new file mode 100644 index 00000000..455bc662 Binary files /dev/null and b/GJ_GameSheet-uhd/d_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_square_02_001.png b/GJ_GameSheet-uhd/d_square_02_001.png new file mode 100644 index 00000000..870f8089 Binary files /dev/null and b/GJ_GameSheet-uhd/d_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_square_03_01_001.png b/GJ_GameSheet-uhd/d_square_03_01_001.png new file mode 100644 index 00000000..b3847247 Binary files /dev/null and b/GJ_GameSheet-uhd/d_square_03_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_square_03_02_001.png b/GJ_GameSheet-uhd/d_square_03_02_001.png new file mode 100644 index 00000000..9db00df9 Binary files /dev/null and b/GJ_GameSheet-uhd/d_square_03_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_square_03_03_001.png b/GJ_GameSheet-uhd/d_square_03_03_001.png new file mode 100644 index 00000000..c3118809 Binary files /dev/null and b/GJ_GameSheet-uhd/d_square_03_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_square_04_001.png b/GJ_GameSheet-uhd/d_square_04_001.png new file mode 100644 index 00000000..289d3cb2 Binary files /dev/null and b/GJ_GameSheet-uhd/d_square_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_square_05_001.png b/GJ_GameSheet-uhd/d_square_05_001.png new file mode 100644 index 00000000..6122cae4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_square_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_swirve_01_001.png b/GJ_GameSheet-uhd/d_swirve_01_001.png new file mode 100644 index 00000000..11e3467e Binary files /dev/null and b/GJ_GameSheet-uhd/d_swirve_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_swirve_02_001.png b/GJ_GameSheet-uhd/d_swirve_02_001.png new file mode 100644 index 00000000..d8385d72 Binary files /dev/null and b/GJ_GameSheet-uhd/d_swirve_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_swirve_03_001.png b/GJ_GameSheet-uhd/d_swirve_03_001.png new file mode 100644 index 00000000..a6c4da63 Binary files /dev/null and b/GJ_GameSheet-uhd/d_swirve_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_swirve_04_001.png b/GJ_GameSheet-uhd/d_swirve_04_001.png new file mode 100644 index 00000000..1b5fca5c Binary files /dev/null and b/GJ_GameSheet-uhd/d_swirve_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_thorn_01_001.png b/GJ_GameSheet-uhd/d_thorn_01_001.png new file mode 100644 index 00000000..0451e82b Binary files /dev/null and b/GJ_GameSheet-uhd/d_thorn_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_thorn_02_001.png b/GJ_GameSheet-uhd/d_thorn_02_001.png new file mode 100644 index 00000000..a8d06717 Binary files /dev/null and b/GJ_GameSheet-uhd/d_thorn_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_thorn_03_001.png b/GJ_GameSheet-uhd/d_thorn_03_001.png new file mode 100644 index 00000000..504b4720 Binary files /dev/null and b/GJ_GameSheet-uhd/d_thorn_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_thorn_04_001.png b/GJ_GameSheet-uhd/d_thorn_04_001.png new file mode 100644 index 00000000..17441ee5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_thorn_04_001.png differ diff --git a/GJ_GameSheet-uhd/d_thorn_05_001.png b/GJ_GameSheet-uhd/d_thorn_05_001.png new file mode 100644 index 00000000..c5dc7991 Binary files /dev/null and b/GJ_GameSheet-uhd/d_thorn_05_001.png differ diff --git a/GJ_GameSheet-uhd/d_thorn_06_001.png b/GJ_GameSheet-uhd/d_thorn_06_001.png new file mode 100644 index 00000000..33a68be5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_thorn_06_001.png differ diff --git a/GJ_GameSheet-uhd/d_waveBG_001.png b/GJ_GameSheet-uhd/d_waveBG_001.png new file mode 100644 index 00000000..45ae2984 Binary files /dev/null and b/GJ_GameSheet-uhd/d_waveBG_001.png differ diff --git a/GJ_GameSheet-uhd/d_wave_01_001.png b/GJ_GameSheet-uhd/d_wave_01_001.png new file mode 100644 index 00000000..d6813ef1 Binary files /dev/null and b/GJ_GameSheet-uhd/d_wave_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_wave_02_001.png b/GJ_GameSheet-uhd/d_wave_02_001.png new file mode 100644 index 00000000..c908ca5a Binary files /dev/null and b/GJ_GameSheet-uhd/d_wave_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_wave_03_001.png b/GJ_GameSheet-uhd/d_wave_03_001.png new file mode 100644 index 00000000..62016124 Binary files /dev/null and b/GJ_GameSheet-uhd/d_wave_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_wheel_01_001.png b/GJ_GameSheet-uhd/d_wheel_01_001.png new file mode 100644 index 00000000..460c469d Binary files /dev/null and b/GJ_GameSheet-uhd/d_wheel_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_wheel_02_001.png b/GJ_GameSheet-uhd/d_wheel_02_001.png new file mode 100644 index 00000000..4e082bed Binary files /dev/null and b/GJ_GameSheet-uhd/d_wheel_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_wheel_03_001.png b/GJ_GameSheet-uhd/d_wheel_03_001.png new file mode 100644 index 00000000..0b49f006 Binary files /dev/null and b/GJ_GameSheet-uhd/d_wheel_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_whiteBlock_01_001.png b/GJ_GameSheet-uhd/d_whiteBlock_01_001.png new file mode 100644 index 00000000..c1fdcc1f Binary files /dev/null and b/GJ_GameSheet-uhd/d_whiteBlock_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_whiteBlock_02_001.png b/GJ_GameSheet-uhd/d_whiteBlock_02_001.png new file mode 100644 index 00000000..5820f00d Binary files /dev/null and b/GJ_GameSheet-uhd/d_whiteBlock_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_zag_01_001.png b/GJ_GameSheet-uhd/d_zag_01_001.png new file mode 100644 index 00000000..fca15e74 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_01_001.png differ diff --git a/GJ_GameSheet-uhd/d_zag_01_002.png b/GJ_GameSheet-uhd/d_zag_01_002.png new file mode 100644 index 00000000..c7418be4 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_01_002.png differ diff --git a/GJ_GameSheet-uhd/d_zag_01_003.png b/GJ_GameSheet-uhd/d_zag_01_003.png new file mode 100644 index 00000000..2051d06e Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_01_003.png differ diff --git a/GJ_GameSheet-uhd/d_zag_01_color_001.png b/GJ_GameSheet-uhd/d_zag_01_color_001.png new file mode 100644 index 00000000..9ed796b1 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_zag_01_color_002.png b/GJ_GameSheet-uhd/d_zag_01_color_002.png new file mode 100644 index 00000000..860ffb97 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_01_color_002.png differ diff --git a/GJ_GameSheet-uhd/d_zag_01_color_003.png b/GJ_GameSheet-uhd/d_zag_01_color_003.png new file mode 100644 index 00000000..2c5d5dd5 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_01_color_003.png differ diff --git a/GJ_GameSheet-uhd/d_zag_02_001.png b/GJ_GameSheet-uhd/d_zag_02_001.png new file mode 100644 index 00000000..d803f88b Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_02_001.png differ diff --git a/GJ_GameSheet-uhd/d_zag_02_002.png b/GJ_GameSheet-uhd/d_zag_02_002.png new file mode 100644 index 00000000..49256665 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_02_002.png differ diff --git a/GJ_GameSheet-uhd/d_zag_02_color_001.png b/GJ_GameSheet-uhd/d_zag_02_color_001.png new file mode 100644 index 00000000..60764755 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_zag_02_color_002.png b/GJ_GameSheet-uhd/d_zag_02_color_002.png new file mode 100644 index 00000000..ae033410 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_02_color_002.png differ diff --git a/GJ_GameSheet-uhd/d_zag_03_001.png b/GJ_GameSheet-uhd/d_zag_03_001.png new file mode 100644 index 00000000..6f4e7608 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_03_001.png differ diff --git a/GJ_GameSheet-uhd/d_zag_03_002.png b/GJ_GameSheet-uhd/d_zag_03_002.png new file mode 100644 index 00000000..a0416f50 Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_03_002.png differ diff --git a/GJ_GameSheet-uhd/d_zag_03_color_001.png b/GJ_GameSheet-uhd/d_zag_03_color_001.png new file mode 100644 index 00000000..baa5249b Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/d_zag_03_color_002.png b/GJ_GameSheet-uhd/d_zag_03_color_002.png new file mode 100644 index 00000000..6c1ee90c Binary files /dev/null and b/GJ_GameSheet-uhd/d_zag_03_color_002.png differ diff --git a/GJ_GameSheet-uhd/darkblade_01_001.png b/GJ_GameSheet-uhd/darkblade_01_001.png new file mode 100644 index 00000000..4a77c43e Binary files /dev/null and b/GJ_GameSheet-uhd/darkblade_01_001.png differ diff --git a/GJ_GameSheet-uhd/darkblade_01_color_001.png b/GJ_GameSheet-uhd/darkblade_01_color_001.png new file mode 100644 index 00000000..f4c83d52 Binary files /dev/null and b/GJ_GameSheet-uhd/darkblade_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/darkblade_02_001.png b/GJ_GameSheet-uhd/darkblade_02_001.png new file mode 100644 index 00000000..3f89e52a Binary files /dev/null and b/GJ_GameSheet-uhd/darkblade_02_001.png differ diff --git a/GJ_GameSheet-uhd/darkblade_02_color_001.png b/GJ_GameSheet-uhd/darkblade_02_color_001.png new file mode 100644 index 00000000..ef071c4a Binary files /dev/null and b/GJ_GameSheet-uhd/darkblade_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/darkblade_03_001.png b/GJ_GameSheet-uhd/darkblade_03_001.png new file mode 100644 index 00000000..537c40c1 Binary files /dev/null and b/GJ_GameSheet-uhd/darkblade_03_001.png differ diff --git a/GJ_GameSheet-uhd/darkblade_03_color_001.png b/GJ_GameSheet-uhd/darkblade_03_color_001.png new file mode 100644 index 00000000..b1b16ed1 Binary files /dev/null and b/GJ_GameSheet-uhd/darkblade_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/dashRing_01_001.png b/GJ_GameSheet-uhd/dashRing_01_001.png new file mode 100644 index 00000000..242c074e Binary files /dev/null and b/GJ_GameSheet-uhd/dashRing_01_001.png differ diff --git a/GJ_GameSheet-uhd/dashRing_02_001.png b/GJ_GameSheet-uhd/dashRing_02_001.png new file mode 100644 index 00000000..2473f022 Binary files /dev/null and b/GJ_GameSheet-uhd/dashRing_02_001.png differ diff --git a/GJ_GameSheet-uhd/dropRing_01_001.png b/GJ_GameSheet-uhd/dropRing_01_001.png new file mode 100644 index 00000000..85fe9c2a Binary files /dev/null and b/GJ_GameSheet-uhd/dropRing_01_001.png differ diff --git a/GJ_GameSheet-uhd/dropRing_01_extra_001.png b/GJ_GameSheet-uhd/dropRing_01_extra_001.png new file mode 100644 index 00000000..f4d1f248 Binary files /dev/null and b/GJ_GameSheet-uhd/dropRing_01_extra_001.png differ diff --git a/GJ_GameSheet-uhd/edit_eParticleBtn_001.png b/GJ_GameSheet-uhd/edit_eParticleBtn_001.png new file mode 100644 index 00000000..e894a6c7 Binary files /dev/null and b/GJ_GameSheet-uhd/edit_eParticleBtn_001.png differ diff --git a/GJ_GameSheet-uhd/edit_eParticleBtn_color_001.png b/GJ_GameSheet-uhd/edit_eParticleBtn_color_001.png new file mode 100644 index 00000000..fc5131c9 Binary files /dev/null and b/GJ_GameSheet-uhd/edit_eParticleBtn_color_001.png differ diff --git a/GJ_GameSheet-uhd/emptyFrame.png b/GJ_GameSheet-uhd/emptyFrame.png new file mode 100644 index 00000000..83fb5f8c Binary files /dev/null and b/GJ_GameSheet-uhd/emptyFrame.png differ diff --git a/GJ_GameSheet-uhd/fakeSpike_01_001.png b/GJ_GameSheet-uhd/fakeSpike_01_001.png new file mode 100644 index 00000000..7b111f2a Binary files /dev/null and b/GJ_GameSheet-uhd/fakeSpike_01_001.png differ diff --git a/GJ_GameSheet-uhd/fakeSpike_02_001.png b/GJ_GameSheet-uhd/fakeSpike_02_001.png new file mode 100644 index 00000000..49625dc4 Binary files /dev/null and b/GJ_GameSheet-uhd/fakeSpike_02_001.png differ diff --git a/GJ_GameSheet-uhd/fakeSpike_03_001.png b/GJ_GameSheet-uhd/fakeSpike_03_001.png new file mode 100644 index 00000000..52af0038 Binary files /dev/null and b/GJ_GameSheet-uhd/fakeSpike_03_001.png differ diff --git a/GJ_GameSheet-uhd/fakeSpike_04_001.png b/GJ_GameSheet-uhd/fakeSpike_04_001.png new file mode 100644 index 00000000..1b749716 Binary files /dev/null and b/GJ_GameSheet-uhd/fakeSpike_04_001.png differ diff --git a/GJ_GameSheet-uhd/fireball_01_001.png b/GJ_GameSheet-uhd/fireball_01_001.png new file mode 100644 index 00000000..2354b9bd Binary files /dev/null and b/GJ_GameSheet-uhd/fireball_01_001.png differ diff --git a/GJ_GameSheet-uhd/fireball_01_color_001.png b/GJ_GameSheet-uhd/fireball_01_color_001.png new file mode 100644 index 00000000..d6835763 Binary files /dev/null and b/GJ_GameSheet-uhd/fireball_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/fireball_02_001.png b/GJ_GameSheet-uhd/fireball_02_001.png new file mode 100644 index 00000000..fb944bfd Binary files /dev/null and b/GJ_GameSheet-uhd/fireball_02_001.png differ diff --git a/GJ_GameSheet-uhd/fireball_02_002.png b/GJ_GameSheet-uhd/fireball_02_002.png new file mode 100644 index 00000000..2f21616f Binary files /dev/null and b/GJ_GameSheet-uhd/fireball_02_002.png differ diff --git a/GJ_GameSheet-uhd/fireball_02_003.png b/GJ_GameSheet-uhd/fireball_02_003.png new file mode 100644 index 00000000..9d8d6a3c Binary files /dev/null and b/GJ_GameSheet-uhd/fireball_02_003.png differ diff --git a/GJ_GameSheet-uhd/fireball_02_color_001.png b/GJ_GameSheet-uhd/fireball_02_color_001.png new file mode 100644 index 00000000..05f8cc99 Binary files /dev/null and b/GJ_GameSheet-uhd/fireball_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/fireball_02_color_002.png b/GJ_GameSheet-uhd/fireball_02_color_002.png new file mode 100644 index 00000000..34c8b74d Binary files /dev/null and b/GJ_GameSheet-uhd/fireball_02_color_002.png differ diff --git a/GJ_GameSheet-uhd/fireball_02_color_003.png b/GJ_GameSheet-uhd/fireball_02_color_003.png new file mode 100644 index 00000000..49b097b5 Binary files /dev/null and b/GJ_GameSheet-uhd/fireball_02_color_003.png differ diff --git a/GJ_GameSheet-uhd/floorLine_001.png b/GJ_GameSheet-uhd/floorLine_001.png new file mode 100644 index 00000000..aaffeacb Binary files /dev/null and b/GJ_GameSheet-uhd/floorLine_001.png differ diff --git a/GJ_GameSheet-uhd/gradientBar.png b/GJ_GameSheet-uhd/gradientBar.png new file mode 100644 index 00000000..66d6115c Binary files /dev/null and b/GJ_GameSheet-uhd/gradientBar.png differ diff --git a/GJ_GameSheet-uhd/gravJumpRing_01_001.png b/GJ_GameSheet-uhd/gravJumpRing_01_001.png new file mode 100644 index 00000000..56287f72 Binary files /dev/null and b/GJ_GameSheet-uhd/gravJumpRing_01_001.png differ diff --git a/GJ_GameSheet-uhd/gravJumpRing_01_extra_001.png b/GJ_GameSheet-uhd/gravJumpRing_01_extra_001.png new file mode 100644 index 00000000..2714a8a9 Binary files /dev/null and b/GJ_GameSheet-uhd/gravJumpRing_01_extra_001.png differ diff --git a/GJ_GameSheet-uhd/gravbump_01_001.png b/GJ_GameSheet-uhd/gravbump_01_001.png new file mode 100644 index 00000000..0859c670 Binary files /dev/null and b/GJ_GameSheet-uhd/gravbump_01_001.png differ diff --git a/GJ_GameSheet-uhd/gravring_01_001.png b/GJ_GameSheet-uhd/gravring_01_001.png new file mode 100644 index 00000000..5827b927 Binary files /dev/null and b/GJ_GameSheet-uhd/gravring_01_001.png differ diff --git a/GJ_GameSheet-uhd/gravring_01_extra_001.png b/GJ_GameSheet-uhd/gravring_01_extra_001.png new file mode 100644 index 00000000..723781a6 Binary files /dev/null and b/GJ_GameSheet-uhd/gravring_01_extra_001.png differ diff --git a/GJ_GameSheet-uhd/gridLine01_001.png b/GJ_GameSheet-uhd/gridLine01_001.png new file mode 100644 index 00000000..7f87afab Binary files /dev/null and b/GJ_GameSheet-uhd/gridLine01_001.png differ diff --git a/GJ_GameSheet-uhd/gridLine02_001.png b/GJ_GameSheet-uhd/gridLine02_001.png new file mode 100644 index 00000000..733a26d1 Binary files /dev/null and b/GJ_GameSheet-uhd/gridLine02_001.png differ diff --git a/GJ_GameSheet-uhd/gridLine03_001.png b/GJ_GameSheet-uhd/gridLine03_001.png new file mode 100644 index 00000000..88bce89c Binary files /dev/null and b/GJ_GameSheet-uhd/gridLine03_001.png differ diff --git a/GJ_GameSheet-uhd/gridLine04_001.png b/GJ_GameSheet-uhd/gridLine04_001.png new file mode 100644 index 00000000..4604b99c Binary files /dev/null and b/GJ_GameSheet-uhd/gridLine04_001.png differ diff --git a/GJ_GameSheet-uhd/iceSpike_01_001.png b/GJ_GameSheet-uhd/iceSpike_01_001.png new file mode 100644 index 00000000..e37466d6 Binary files /dev/null and b/GJ_GameSheet-uhd/iceSpike_01_001.png differ diff --git a/GJ_GameSheet-uhd/iceSpike_02_001.png b/GJ_GameSheet-uhd/iceSpike_02_001.png new file mode 100644 index 00000000..d88ac9ad Binary files /dev/null and b/GJ_GameSheet-uhd/iceSpike_02_001.png differ diff --git a/GJ_GameSheet-uhd/iceSpike_03_001.png b/GJ_GameSheet-uhd/iceSpike_03_001.png new file mode 100644 index 00000000..12420746 Binary files /dev/null and b/GJ_GameSheet-uhd/iceSpike_03_001.png differ diff --git a/GJ_GameSheet-uhd/invis_plank_01_001.png b/GJ_GameSheet-uhd/invis_plank_01_001.png new file mode 100644 index 00000000..5e7b5326 Binary files /dev/null and b/GJ_GameSheet-uhd/invis_plank_01_001.png differ diff --git a/GJ_GameSheet-uhd/invis_plank_01_small_001.png b/GJ_GameSheet-uhd/invis_plank_01_small_001.png new file mode 100644 index 00000000..8646a362 Binary files /dev/null and b/GJ_GameSheet-uhd/invis_plank_01_small_001.png differ diff --git a/GJ_GameSheet-uhd/invis_spike_01_001.png b/GJ_GameSheet-uhd/invis_spike_01_001.png new file mode 100644 index 00000000..f89fe4a5 Binary files /dev/null and b/GJ_GameSheet-uhd/invis_spike_01_001.png differ diff --git a/GJ_GameSheet-uhd/invis_spike_02_001.png b/GJ_GameSheet-uhd/invis_spike_02_001.png new file mode 100644 index 00000000..3c8cc507 Binary files /dev/null and b/GJ_GameSheet-uhd/invis_spike_02_001.png differ diff --git a/GJ_GameSheet-uhd/invis_spike_03_001.png b/GJ_GameSheet-uhd/invis_spike_03_001.png new file mode 100644 index 00000000..229507d0 Binary files /dev/null and b/GJ_GameSheet-uhd/invis_spike_03_001.png differ diff --git a/GJ_GameSheet-uhd/invis_spike_04_001.png b/GJ_GameSheet-uhd/invis_spike_04_001.png new file mode 100644 index 00000000..13251fd7 Binary files /dev/null and b/GJ_GameSheet-uhd/invis_spike_04_001.png differ diff --git a/GJ_GameSheet-uhd/invis_square_01_001.png b/GJ_GameSheet-uhd/invis_square_01_001.png new file mode 100644 index 00000000..dc1ff12a Binary files /dev/null and b/GJ_GameSheet-uhd/invis_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/invis_square_01_small_001.png b/GJ_GameSheet-uhd/invis_square_01_small_001.png new file mode 100644 index 00000000..030b21f8 Binary files /dev/null and b/GJ_GameSheet-uhd/invis_square_01_small_001.png differ diff --git a/GJ_GameSheet-uhd/invis_triangle_02_001.png b/GJ_GameSheet-uhd/invis_triangle_02_001.png new file mode 100644 index 00000000..3efcbf6b Binary files /dev/null and b/GJ_GameSheet-uhd/invis_triangle_02_001.png differ diff --git a/GJ_GameSheet-uhd/invis_triangle_04_001.png b/GJ_GameSheet-uhd/invis_triangle_04_001.png new file mode 100644 index 00000000..e8bd7827 Binary files /dev/null and b/GJ_GameSheet-uhd/invis_triangle_04_001.png differ diff --git a/GJ_GameSheet-uhd/invisibleOutline_01_001.png b/GJ_GameSheet-uhd/invisibleOutline_01_001.png new file mode 100644 index 00000000..d2c82330 Binary files /dev/null and b/GJ_GameSheet-uhd/invisibleOutline_01_001.png differ diff --git a/GJ_GameSheet-uhd/invisibleOutline_02_001.png b/GJ_GameSheet-uhd/invisibleOutline_02_001.png new file mode 100644 index 00000000..c1609824 Binary files /dev/null and b/GJ_GameSheet-uhd/invisibleOutline_02_001.png differ diff --git a/GJ_GameSheet-uhd/invisibleOutline_03_001.png b/GJ_GameSheet-uhd/invisibleOutline_03_001.png new file mode 100644 index 00000000..e215f1c8 Binary files /dev/null and b/GJ_GameSheet-uhd/invisibleOutline_03_001.png differ diff --git a/GJ_GameSheet-uhd/invisibleOutline_b_01_001.png b/GJ_GameSheet-uhd/invisibleOutline_b_01_001.png new file mode 100644 index 00000000..19897979 Binary files /dev/null and b/GJ_GameSheet-uhd/invisibleOutline_b_01_001.png differ diff --git a/GJ_GameSheet-uhd/invisibleOutline_b_02_001.png b/GJ_GameSheet-uhd/invisibleOutline_b_02_001.png new file mode 100644 index 00000000..db9d2c5b Binary files /dev/null and b/GJ_GameSheet-uhd/invisibleOutline_b_02_001.png differ diff --git a/GJ_GameSheet-uhd/invisibleOutline_b_03_001.png b/GJ_GameSheet-uhd/invisibleOutline_b_03_001.png new file mode 100644 index 00000000..9e526c6f Binary files /dev/null and b/GJ_GameSheet-uhd/invisibleOutline_b_03_001.png differ diff --git a/GJ_GameSheet-uhd/lava_top_001.png b/GJ_GameSheet-uhd/lava_top_001.png new file mode 100644 index 00000000..97065267 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_001.png differ diff --git a/GJ_GameSheet-uhd/lava_top_002.png b/GJ_GameSheet-uhd/lava_top_002.png new file mode 100644 index 00000000..ff948095 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_002.png differ diff --git a/GJ_GameSheet-uhd/lava_top_003.png b/GJ_GameSheet-uhd/lava_top_003.png new file mode 100644 index 00000000..a3fcf477 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_003.png differ diff --git a/GJ_GameSheet-uhd/lava_top_004.png b/GJ_GameSheet-uhd/lava_top_004.png new file mode 100644 index 00000000..58740272 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_004.png differ diff --git a/GJ_GameSheet-uhd/lava_top_005.png b/GJ_GameSheet-uhd/lava_top_005.png new file mode 100644 index 00000000..7c40924e Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_005.png differ diff --git a/GJ_GameSheet-uhd/lava_top_006.png b/GJ_GameSheet-uhd/lava_top_006.png new file mode 100644 index 00000000..407b14a1 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_006.png differ diff --git a/GJ_GameSheet-uhd/lava_top_007.png b/GJ_GameSheet-uhd/lava_top_007.png new file mode 100644 index 00000000..660d4c48 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_007.png differ diff --git a/GJ_GameSheet-uhd/lava_top_008.png b/GJ_GameSheet-uhd/lava_top_008.png new file mode 100644 index 00000000..c915f52e Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_008.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_001.png b/GJ_GameSheet-uhd/lava_top_bubble02_001.png new file mode 100644 index 00000000..636f83cc Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_001.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_002.png b/GJ_GameSheet-uhd/lava_top_bubble02_002.png new file mode 100644 index 00000000..dc92e431 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_002.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_003.png b/GJ_GameSheet-uhd/lava_top_bubble02_003.png new file mode 100644 index 00000000..35aca4f5 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_003.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_004.png b/GJ_GameSheet-uhd/lava_top_bubble02_004.png new file mode 100644 index 00000000..dd546762 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_004.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_005.png b/GJ_GameSheet-uhd/lava_top_bubble02_005.png new file mode 100644 index 00000000..6f932c09 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_005.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_006.png b/GJ_GameSheet-uhd/lava_top_bubble02_006.png new file mode 100644 index 00000000..1631b8f5 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_006.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_color_001.png b/GJ_GameSheet-uhd/lava_top_bubble02_color_001.png new file mode 100644 index 00000000..7675ef88 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_color_002.png b/GJ_GameSheet-uhd/lava_top_bubble02_color_002.png new file mode 100644 index 00000000..8408f455 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_color_002.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_color_003.png b/GJ_GameSheet-uhd/lava_top_bubble02_color_003.png new file mode 100644 index 00000000..8c075c6b Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_color_003.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_color_004.png b/GJ_GameSheet-uhd/lava_top_bubble02_color_004.png new file mode 100644 index 00000000..7b37e3ef Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_color_004.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_color_005.png b/GJ_GameSheet-uhd/lava_top_bubble02_color_005.png new file mode 100644 index 00000000..c4068362 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_color_005.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble02_color_006.png b/GJ_GameSheet-uhd/lava_top_bubble02_color_006.png new file mode 100644 index 00000000..3d82c449 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble02_color_006.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_001.png b/GJ_GameSheet-uhd/lava_top_bubble_001.png new file mode 100644 index 00000000..4ad1fa08 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_001.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_002.png b/GJ_GameSheet-uhd/lava_top_bubble_002.png new file mode 100644 index 00000000..1943f459 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_002.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_003.png b/GJ_GameSheet-uhd/lava_top_bubble_003.png new file mode 100644 index 00000000..58a1a87e Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_003.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_004.png b/GJ_GameSheet-uhd/lava_top_bubble_004.png new file mode 100644 index 00000000..6d869295 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_004.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_005.png b/GJ_GameSheet-uhd/lava_top_bubble_005.png new file mode 100644 index 00000000..50b02b29 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_005.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_006.png b/GJ_GameSheet-uhd/lava_top_bubble_006.png new file mode 100644 index 00000000..04a01c6f Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_006.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_007.png b/GJ_GameSheet-uhd/lava_top_bubble_007.png new file mode 100644 index 00000000..7cf772e5 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_007.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_008.png b/GJ_GameSheet-uhd/lava_top_bubble_008.png new file mode 100644 index 00000000..bfe439b4 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_008.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_color_001.png b/GJ_GameSheet-uhd/lava_top_bubble_color_001.png new file mode 100644 index 00000000..3a5194f7 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_color_001.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_color_002.png b/GJ_GameSheet-uhd/lava_top_bubble_color_002.png new file mode 100644 index 00000000..d7ba42c3 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_color_002.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_color_003.png b/GJ_GameSheet-uhd/lava_top_bubble_color_003.png new file mode 100644 index 00000000..78af1e82 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_color_003.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_color_004.png b/GJ_GameSheet-uhd/lava_top_bubble_color_004.png new file mode 100644 index 00000000..98346d84 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_color_004.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_color_005.png b/GJ_GameSheet-uhd/lava_top_bubble_color_005.png new file mode 100644 index 00000000..fd4fafd5 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_color_005.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_color_006.png b/GJ_GameSheet-uhd/lava_top_bubble_color_006.png new file mode 100644 index 00000000..a29401f4 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_color_006.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_color_007.png b/GJ_GameSheet-uhd/lava_top_bubble_color_007.png new file mode 100644 index 00000000..3dd45f59 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_color_007.png differ diff --git a/GJ_GameSheet-uhd/lava_top_bubble_color_008.png b/GJ_GameSheet-uhd/lava_top_bubble_color_008.png new file mode 100644 index 00000000..102fc805 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_bubble_color_008.png differ diff --git a/GJ_GameSheet-uhd/lava_top_color_001.png b/GJ_GameSheet-uhd/lava_top_color_001.png new file mode 100644 index 00000000..93eadb7a Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_color_001.png differ diff --git a/GJ_GameSheet-uhd/lava_top_color_002.png b/GJ_GameSheet-uhd/lava_top_color_002.png new file mode 100644 index 00000000..b6164124 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_color_002.png differ diff --git a/GJ_GameSheet-uhd/lava_top_color_003.png b/GJ_GameSheet-uhd/lava_top_color_003.png new file mode 100644 index 00000000..efe2090e Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_color_003.png differ diff --git a/GJ_GameSheet-uhd/lava_top_color_004.png b/GJ_GameSheet-uhd/lava_top_color_004.png new file mode 100644 index 00000000..7dc98b41 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_color_004.png differ diff --git a/GJ_GameSheet-uhd/lava_top_color_005.png b/GJ_GameSheet-uhd/lava_top_color_005.png new file mode 100644 index 00000000..189e011b Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_color_005.png differ diff --git a/GJ_GameSheet-uhd/lava_top_color_006.png b/GJ_GameSheet-uhd/lava_top_color_006.png new file mode 100644 index 00000000..4d49f7e5 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_color_006.png differ diff --git a/GJ_GameSheet-uhd/lava_top_color_007.png b/GJ_GameSheet-uhd/lava_top_color_007.png new file mode 100644 index 00000000..be64bef5 Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_color_007.png differ diff --git a/GJ_GameSheet-uhd/lava_top_color_008.png b/GJ_GameSheet-uhd/lava_top_color_008.png new file mode 100644 index 00000000..bc21567a Binary files /dev/null and b/GJ_GameSheet-uhd/lava_top_color_008.png differ diff --git a/GJ_GameSheet-uhd/lightBlade_01_001.png b/GJ_GameSheet-uhd/lightBlade_01_001.png new file mode 100644 index 00000000..17a5cb2c Binary files /dev/null and b/GJ_GameSheet-uhd/lightBlade_01_001.png differ diff --git a/GJ_GameSheet-uhd/lightBlade_01_color_001.png b/GJ_GameSheet-uhd/lightBlade_01_color_001.png new file mode 100644 index 00000000..7f9f3e22 Binary files /dev/null and b/GJ_GameSheet-uhd/lightBlade_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightBlade_02_001.png b/GJ_GameSheet-uhd/lightBlade_02_001.png new file mode 100644 index 00000000..b5308e10 Binary files /dev/null and b/GJ_GameSheet-uhd/lightBlade_02_001.png differ diff --git a/GJ_GameSheet-uhd/lightBlade_02_color_001.png b/GJ_GameSheet-uhd/lightBlade_02_color_001.png new file mode 100644 index 00000000..e2783c38 Binary files /dev/null and b/GJ_GameSheet-uhd/lightBlade_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightBlade_03_001.png b/GJ_GameSheet-uhd/lightBlade_03_001.png new file mode 100644 index 00000000..25b60ca7 Binary files /dev/null and b/GJ_GameSheet-uhd/lightBlade_03_001.png differ diff --git a/GJ_GameSheet-uhd/lightBlade_03_color_001.png b/GJ_GameSheet-uhd/lightBlade_03_color_001.png new file mode 100644 index 00000000..310b496e Binary files /dev/null and b/GJ_GameSheet-uhd/lightBlade_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_01_001.png b/GJ_GameSheet-uhd/lightsquare_01_01_001.png new file mode 100644 index 00000000..b358562f Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_01_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_01_color_001.png b/GJ_GameSheet-uhd/lightsquare_01_01_color_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_02_001.png b/GJ_GameSheet-uhd/lightsquare_01_02_001.png new file mode 100644 index 00000000..37f04c39 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_02_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_02_color_001.png b/GJ_GameSheet-uhd/lightsquare_01_02_color_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_03_001.png b/GJ_GameSheet-uhd/lightsquare_01_03_001.png new file mode 100644 index 00000000..7404bad8 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_03_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_03_color_001.png b/GJ_GameSheet-uhd/lightsquare_01_03_color_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_04_001.png b/GJ_GameSheet-uhd/lightsquare_01_04_001.png new file mode 100644 index 00000000..7f011dd8 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_04_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_04_color_001.png b/GJ_GameSheet-uhd/lightsquare_01_04_color_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_05_001.png b/GJ_GameSheet-uhd/lightsquare_01_05_001.png new file mode 100644 index 00000000..1d3b2649 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_05_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_05_color_001.png b/GJ_GameSheet-uhd/lightsquare_01_05_color_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_06_001.png b/GJ_GameSheet-uhd/lightsquare_01_06_001.png new file mode 100644 index 00000000..eaf1d5ad Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_06_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_06_color_001.png b/GJ_GameSheet-uhd/lightsquare_01_06_color_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_07_001.png b/GJ_GameSheet-uhd/lightsquare_01_07_001.png new file mode 100644 index 00000000..604a31bc Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_07_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_07_color_001.png b/GJ_GameSheet-uhd/lightsquare_01_07_color_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_01_08_color_001.png b/GJ_GameSheet-uhd/lightsquare_01_08_color_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_01_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_01_001.png b/GJ_GameSheet-uhd/lightsquare_02_01_001.png new file mode 100644 index 00000000..b358562f Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_01_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_01_color_001.png b/GJ_GameSheet-uhd/lightsquare_02_01_color_001.png new file mode 100644 index 00000000..fd21fd5d Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_02_001.png b/GJ_GameSheet-uhd/lightsquare_02_02_001.png new file mode 100644 index 00000000..37f04c39 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_02_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_02_color_001.png b/GJ_GameSheet-uhd/lightsquare_02_02_color_001.png new file mode 100644 index 00000000..622564d1 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_03_001.png b/GJ_GameSheet-uhd/lightsquare_02_03_001.png new file mode 100644 index 00000000..7404bad8 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_03_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_03_color_001.png b/GJ_GameSheet-uhd/lightsquare_02_03_color_001.png new file mode 100644 index 00000000..42b989b2 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_04_001.png b/GJ_GameSheet-uhd/lightsquare_02_04_001.png new file mode 100644 index 00000000..7f011dd8 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_04_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_04_color_001.png b/GJ_GameSheet-uhd/lightsquare_02_04_color_001.png new file mode 100644 index 00000000..72a727e2 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_05_001.png b/GJ_GameSheet-uhd/lightsquare_02_05_001.png new file mode 100644 index 00000000..1d3b2649 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_05_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_05_color_001.png b/GJ_GameSheet-uhd/lightsquare_02_05_color_001.png new file mode 100644 index 00000000..532ad7e1 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_06_001.png b/GJ_GameSheet-uhd/lightsquare_02_06_001.png new file mode 100644 index 00000000..eaf1d5ad Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_06_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_06_color_001.png b/GJ_GameSheet-uhd/lightsquare_02_06_color_001.png new file mode 100644 index 00000000..8de6e480 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_07_001.png b/GJ_GameSheet-uhd/lightsquare_02_07_001.png new file mode 100644 index 00000000..604a31bc Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_07_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_07_color_001.png b/GJ_GameSheet-uhd/lightsquare_02_07_color_001.png new file mode 100644 index 00000000..f04cff68 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_08_001.png b/GJ_GameSheet-uhd/lightsquare_02_08_001.png new file mode 100644 index 00000000..a4f1c666 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_08_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_02_08_color_001.png b/GJ_GameSheet-uhd/lightsquare_02_08_color_001.png new file mode 100644 index 00000000..5ac97a28 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_02_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_01_001.png b/GJ_GameSheet-uhd/lightsquare_03_01_001.png new file mode 100644 index 00000000..b358562f Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_01_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_01_color_001.png b/GJ_GameSheet-uhd/lightsquare_03_01_color_001.png new file mode 100644 index 00000000..018e4d78 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_02_001.png b/GJ_GameSheet-uhd/lightsquare_03_02_001.png new file mode 100644 index 00000000..37f04c39 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_02_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_02_color_001.png b/GJ_GameSheet-uhd/lightsquare_03_02_color_001.png new file mode 100644 index 00000000..018e4d78 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_03_001.png b/GJ_GameSheet-uhd/lightsquare_03_03_001.png new file mode 100644 index 00000000..7404bad8 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_03_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_03_color_001.png b/GJ_GameSheet-uhd/lightsquare_03_03_color_001.png new file mode 100644 index 00000000..018e4d78 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_04_001.png b/GJ_GameSheet-uhd/lightsquare_03_04_001.png new file mode 100644 index 00000000..7f011dd8 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_04_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_04_color_001.png b/GJ_GameSheet-uhd/lightsquare_03_04_color_001.png new file mode 100644 index 00000000..018e4d78 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_05_001.png b/GJ_GameSheet-uhd/lightsquare_03_05_001.png new file mode 100644 index 00000000..1d3b2649 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_05_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_05_color_001.png b/GJ_GameSheet-uhd/lightsquare_03_05_color_001.png new file mode 100644 index 00000000..018e4d78 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_06_001.png b/GJ_GameSheet-uhd/lightsquare_03_06_001.png new file mode 100644 index 00000000..eaf1d5ad Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_06_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_06_color_001.png b/GJ_GameSheet-uhd/lightsquare_03_06_color_001.png new file mode 100644 index 00000000..018e4d78 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_07_001.png b/GJ_GameSheet-uhd/lightsquare_03_07_001.png new file mode 100644 index 00000000..604a31bc Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_07_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_07_color_001.png b/GJ_GameSheet-uhd/lightsquare_03_07_color_001.png new file mode 100644 index 00000000..018e4d78 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_03_08_color_001.png b/GJ_GameSheet-uhd/lightsquare_03_08_color_001.png new file mode 100644 index 00000000..018e4d78 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_03_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_04_02_001.png b/GJ_GameSheet-uhd/lightsquare_04_02_001.png new file mode 100644 index 00000000..84d315bf Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_04_02_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_04_05_color_001.png b/GJ_GameSheet-uhd/lightsquare_04_05_color_001.png new file mode 100644 index 00000000..f9c8a750 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_04_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_04_sideLine_001.png b/GJ_GameSheet-uhd/lightsquare_04_sideLine_001.png new file mode 100644 index 00000000..089a008b Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_04_sideLine_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_01_001.png b/GJ_GameSheet-uhd/lightsquare_05_01_001.png new file mode 100644 index 00000000..b358562f Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_01_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_01_color_001.png b/GJ_GameSheet-uhd/lightsquare_05_01_color_001.png new file mode 100644 index 00000000..e40bc473 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_02_001.png b/GJ_GameSheet-uhd/lightsquare_05_02_001.png new file mode 100644 index 00000000..37f04c39 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_02_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_02_color_001.png b/GJ_GameSheet-uhd/lightsquare_05_02_color_001.png new file mode 100644 index 00000000..4a60f817 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_03_001.png b/GJ_GameSheet-uhd/lightsquare_05_03_001.png new file mode 100644 index 00000000..7404bad8 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_03_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_03_color_001.png b/GJ_GameSheet-uhd/lightsquare_05_03_color_001.png new file mode 100644 index 00000000..60e2bad1 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_04_001.png b/GJ_GameSheet-uhd/lightsquare_05_04_001.png new file mode 100644 index 00000000..7f011dd8 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_04_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_04_color_001.png b/GJ_GameSheet-uhd/lightsquare_05_04_color_001.png new file mode 100644 index 00000000..e8eb2498 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_05_001.png b/GJ_GameSheet-uhd/lightsquare_05_05_001.png new file mode 100644 index 00000000..1d3b2649 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_05_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_05_color_001.png b/GJ_GameSheet-uhd/lightsquare_05_05_color_001.png new file mode 100644 index 00000000..e8eb2498 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_06_001.png b/GJ_GameSheet-uhd/lightsquare_05_06_001.png new file mode 100644 index 00000000..eaf1d5ad Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_06_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_06_color_001.png b/GJ_GameSheet-uhd/lightsquare_05_06_color_001.png new file mode 100644 index 00000000..e40bc473 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_06_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_07_001.png b/GJ_GameSheet-uhd/lightsquare_05_07_001.png new file mode 100644 index 00000000..604a31bc Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_07_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_07_color_001.png b/GJ_GameSheet-uhd/lightsquare_05_07_color_001.png new file mode 100644 index 00000000..e40bc473 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_07_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_08_color_001.png b/GJ_GameSheet-uhd/lightsquare_05_08_color_001.png new file mode 100644 index 00000000..4a60f817 Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_08_color_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_brick02_001.png b/GJ_GameSheet-uhd/lightsquare_05_brick02_001.png new file mode 100644 index 00000000..1345d64e Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_brick02_001.png differ diff --git a/GJ_GameSheet-uhd/lightsquare_05_brick03_001.png b/GJ_GameSheet-uhd/lightsquare_05_brick03_001.png new file mode 100644 index 00000000..3748316a Binary files /dev/null and b/GJ_GameSheet-uhd/lightsquare_05_brick03_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_01_02_color_001.png b/GJ_GameSheet-uhd/lighttriangle_01_02_color_001.png new file mode 100644 index 00000000..90ba5f3a Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_01_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_01_04_color_001.png b/GJ_GameSheet-uhd/lighttriangle_01_04_color_001.png new file mode 100644 index 00000000..5df09be4 Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_01_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_02_02_color_001.png b/GJ_GameSheet-uhd/lighttriangle_02_02_color_001.png new file mode 100644 index 00000000..98a802ee Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_02_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_02_04_color_001.png b/GJ_GameSheet-uhd/lighttriangle_02_04_color_001.png new file mode 100644 index 00000000..e553267a Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_02_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_03_02_color_001.png b/GJ_GameSheet-uhd/lighttriangle_03_02_color_001.png new file mode 100644 index 00000000..96f34aef Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_03_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_03_04_color_001.png b/GJ_GameSheet-uhd/lighttriangle_03_04_color_001.png new file mode 100644 index 00000000..41c9ce85 Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_03_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_04_02_color_001.png b/GJ_GameSheet-uhd/lighttriangle_04_02_color_001.png new file mode 100644 index 00000000..9b9a5a2b Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_04_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_04_04_color_001.png b/GJ_GameSheet-uhd/lighttriangle_04_04_color_001.png new file mode 100644 index 00000000..8fc0acc3 Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_04_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_05_02_color_001.png b/GJ_GameSheet-uhd/lighttriangle_05_02_color_001.png new file mode 100644 index 00000000..878c95b5 Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_05_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/lighttriangle_05_04_color_001.png b/GJ_GameSheet-uhd/lighttriangle_05_04_color_001.png new file mode 100644 index 00000000..cf7d397f Binary files /dev/null and b/GJ_GameSheet-uhd/lighttriangle_05_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block001_01_001.png b/GJ_GameSheet-uhd/persp_block001_01_001.png new file mode 100644 index 00000000..5a14b996 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block001_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block001_02_001.png b/GJ_GameSheet-uhd/persp_block001_02_001.png new file mode 100644 index 00000000..48b52dc7 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block001_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block001_03_001.png b/GJ_GameSheet-uhd/persp_block001_03_001.png new file mode 100644 index 00000000..9a8f68ce Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block001_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block001_04_001.png b/GJ_GameSheet-uhd/persp_block001_04_001.png new file mode 100644 index 00000000..2e9fa4c2 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block001_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block001_05_001.png b/GJ_GameSheet-uhd/persp_block001_05_001.png new file mode 100644 index 00000000..35d93442 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block001_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block002_01_001.png b/GJ_GameSheet-uhd/persp_block002_01_001.png new file mode 100644 index 00000000..d3bef6da Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block002_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block002_02_001.png b/GJ_GameSheet-uhd/persp_block002_02_001.png new file mode 100644 index 00000000..a0cd20fe Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block002_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block002_03_001.png b/GJ_GameSheet-uhd/persp_block002_03_001.png new file mode 100644 index 00000000..1551845f Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block002_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block002_04_001.png b/GJ_GameSheet-uhd/persp_block002_04_001.png new file mode 100644 index 00000000..c8fa5878 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block002_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block002_05_001.png b/GJ_GameSheet-uhd/persp_block002_05_001.png new file mode 100644 index 00000000..1bb6fe9f Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block002_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005_01_001.png b/GJ_GameSheet-uhd/persp_block005_01_001.png new file mode 100644 index 00000000..01768223 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005_02_001.png b/GJ_GameSheet-uhd/persp_block005_02_001.png new file mode 100644 index 00000000..3b3f2657 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005_03_001.png b/GJ_GameSheet-uhd/persp_block005_03_001.png new file mode 100644 index 00000000..a180570b Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005_04_001.png b/GJ_GameSheet-uhd/persp_block005_04_001.png new file mode 100644 index 00000000..94c2ad64 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005_05_001.png b/GJ_GameSheet-uhd/persp_block005_05_001.png new file mode 100644 index 00000000..3b5f0344 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005b_01_001.png b/GJ_GameSheet-uhd/persp_block005b_01_001.png new file mode 100644 index 00000000..4710d903 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005b_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005b_02_001.png b/GJ_GameSheet-uhd/persp_block005b_02_001.png new file mode 100644 index 00000000..cf815ca9 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005b_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005b_03_001.png b/GJ_GameSheet-uhd/persp_block005b_03_001.png new file mode 100644 index 00000000..71dc9190 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005b_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005b_04_001.png b/GJ_GameSheet-uhd/persp_block005b_04_001.png new file mode 100644 index 00000000..63053a3e Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005b_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block005b_05_001.png b/GJ_GameSheet-uhd/persp_block005b_05_001.png new file mode 100644 index 00000000..065785d4 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block005b_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_01_001.png b/GJ_GameSheet-uhd/persp_block007_01_001.png new file mode 100644 index 00000000..59ef143a Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_01_color_001.png b/GJ_GameSheet-uhd/persp_block007_01_color_001.png new file mode 100644 index 00000000..70844f0b Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_02_001.png b/GJ_GameSheet-uhd/persp_block007_02_001.png new file mode 100644 index 00000000..4629cc38 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_02_color_001.png b/GJ_GameSheet-uhd/persp_block007_02_color_001.png new file mode 100644 index 00000000..461bbb01 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_03_001.png b/GJ_GameSheet-uhd/persp_block007_03_001.png new file mode 100644 index 00000000..47475924 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_03_color_001.png b/GJ_GameSheet-uhd/persp_block007_03_color_001.png new file mode 100644 index 00000000..94774a5b Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_04_001.png b/GJ_GameSheet-uhd/persp_block007_04_001.png new file mode 100644 index 00000000..dad21a1f Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_04_color_001.png b/GJ_GameSheet-uhd/persp_block007_04_color_001.png new file mode 100644 index 00000000..18acfd45 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_05_001.png b/GJ_GameSheet-uhd/persp_block007_05_001.png new file mode 100644 index 00000000..cf4a6d5a Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block007_05_color_001.png b/GJ_GameSheet-uhd/persp_block007_05_color_001.png new file mode 100644 index 00000000..93aaf9d2 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block007_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block009_01_001.png b/GJ_GameSheet-uhd/persp_block009_01_001.png new file mode 100644 index 00000000..8b126375 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block009_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block009_01b_001.png b/GJ_GameSheet-uhd/persp_block009_01b_001.png new file mode 100644 index 00000000..58084981 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block009_01b_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block009_02_001.png b/GJ_GameSheet-uhd/persp_block009_02_001.png new file mode 100644 index 00000000..90dab332 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block009_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block009_03_001.png b/GJ_GameSheet-uhd/persp_block009_03_001.png new file mode 100644 index 00000000..8e14e43c Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block009_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block009_04_001.png b/GJ_GameSheet-uhd/persp_block009_04_001.png new file mode 100644 index 00000000..c5d40210 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block009_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block009_04b_001.png b/GJ_GameSheet-uhd/persp_block009_04b_001.png new file mode 100644 index 00000000..15b09772 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block009_04b_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block009_05_001.png b/GJ_GameSheet-uhd/persp_block009_05_001.png new file mode 100644 index 00000000..84f8c49b Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block009_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block009_05b_001.png b/GJ_GameSheet-uhd/persp_block009_05b_001.png new file mode 100644 index 00000000..cf44371e Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block009_05b_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_01_001.png b/GJ_GameSheet-uhd/persp_block011_01_001.png new file mode 100644 index 00000000..889fce77 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_01_color_001.png b/GJ_GameSheet-uhd/persp_block011_01_color_001.png new file mode 100644 index 00000000..3432fcdd Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_01b_001.png b/GJ_GameSheet-uhd/persp_block011_01b_001.png new file mode 100644 index 00000000..83c9c2fb Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_01b_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_01b_color_001.png b/GJ_GameSheet-uhd/persp_block011_01b_color_001.png new file mode 100644 index 00000000..49221059 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_01b_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_02_001.png b/GJ_GameSheet-uhd/persp_block011_02_001.png new file mode 100644 index 00000000..67b079f3 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_02_color_001.png b/GJ_GameSheet-uhd/persp_block011_02_color_001.png new file mode 100644 index 00000000..e1cbefcd Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_03_001.png b/GJ_GameSheet-uhd/persp_block011_03_001.png new file mode 100644 index 00000000..f931c941 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_03_color_001.png b/GJ_GameSheet-uhd/persp_block011_03_color_001.png new file mode 100644 index 00000000..a3380bc7 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_04_001.png b/GJ_GameSheet-uhd/persp_block011_04_001.png new file mode 100644 index 00000000..8c2d61f5 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_04_color_001.png b/GJ_GameSheet-uhd/persp_block011_04_color_001.png new file mode 100644 index 00000000..8c2d61f5 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_04_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_05_001.png b/GJ_GameSheet-uhd/persp_block011_05_001.png new file mode 100644 index 00000000..b4384029 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block011_05_color_001.png b/GJ_GameSheet-uhd/persp_block011_05_color_001.png new file mode 100644 index 00000000..b4384029 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block011_05_color_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block012_01_001.png b/GJ_GameSheet-uhd/persp_block012_01_001.png new file mode 100644 index 00000000..de2ae309 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block012_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block012_02_001.png b/GJ_GameSheet-uhd/persp_block012_02_001.png new file mode 100644 index 00000000..288ba377 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block012_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block012_04_001.png b/GJ_GameSheet-uhd/persp_block012_04_001.png new file mode 100644 index 00000000..3fc114d0 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block012_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block012_05_001.png b/GJ_GameSheet-uhd/persp_block012_05_001.png new file mode 100644 index 00000000..011f99d4 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block012_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_01_001.png b/GJ_GameSheet-uhd/persp_block013_01_001.png new file mode 100644 index 00000000..0fc075a9 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_02_001.png b/GJ_GameSheet-uhd/persp_block013_02_001.png new file mode 100644 index 00000000..2da4fc72 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_03_001.png b/GJ_GameSheet-uhd/persp_block013_03_001.png new file mode 100644 index 00000000..7f7c8a70 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_04_001.png b/GJ_GameSheet-uhd/persp_block013_04_001.png new file mode 100644 index 00000000..ae04b611 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_05_001.png b/GJ_GameSheet-uhd/persp_block013_05_001.png new file mode 100644 index 00000000..935a1cd1 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_06_001.png b/GJ_GameSheet-uhd/persp_block013_06_001.png new file mode 100644 index 00000000..43d36cf6 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_06_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_07_001.png b/GJ_GameSheet-uhd/persp_block013_07_001.png new file mode 100644 index 00000000..f8b10709 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_07_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_08_001.png b/GJ_GameSheet-uhd/persp_block013_08_001.png new file mode 100644 index 00000000..a2c65b6d Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_08_001.png differ diff --git a/GJ_GameSheet-uhd/persp_block013_09_001.png b/GJ_GameSheet-uhd/persp_block013_09_001.png new file mode 100644 index 00000000..15e43a3d Binary files /dev/null and b/GJ_GameSheet-uhd/persp_block013_09_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockb_01_001.png b/GJ_GameSheet-uhd/persp_blockb_01_001.png new file mode 100644 index 00000000..2843d355 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockb_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockb_02_001.png b/GJ_GameSheet-uhd/persp_blockb_02_001.png new file mode 100644 index 00000000..7a8d4b1f Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockb_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockb_03_001.png b/GJ_GameSheet-uhd/persp_blockb_03_001.png new file mode 100644 index 00000000..868a3309 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockb_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockb_04_001.png b/GJ_GameSheet-uhd/persp_blockb_04_001.png new file mode 100644 index 00000000..2adfc69f Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockb_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockb_05_001.png b/GJ_GameSheet-uhd/persp_blockb_05_001.png new file mode 100644 index 00000000..5796b2c2 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockb_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockc_01_001.png b/GJ_GameSheet-uhd/persp_blockc_01_001.png new file mode 100644 index 00000000..3b34acf6 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockc_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockc_02_001.png b/GJ_GameSheet-uhd/persp_blockc_02_001.png new file mode 100644 index 00000000..20a0dfe7 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockc_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockc_03_001.png b/GJ_GameSheet-uhd/persp_blockc_03_001.png new file mode 100644 index 00000000..602decc6 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockc_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockc_04_001.png b/GJ_GameSheet-uhd/persp_blockc_04_001.png new file mode 100644 index 00000000..a8dcb106 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockc_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockc_05_001.png b/GJ_GameSheet-uhd/persp_blockc_05_001.png new file mode 100644 index 00000000..c4b9fb50 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockc_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockd_01_001.png b/GJ_GameSheet-uhd/persp_blockd_01_001.png new file mode 100644 index 00000000..a664f984 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockd_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockd_02_001.png b/GJ_GameSheet-uhd/persp_blockd_02_001.png new file mode 100644 index 00000000..230f6a90 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockd_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockd_03_001.png b/GJ_GameSheet-uhd/persp_blockd_03_001.png new file mode 100644 index 00000000..eba42633 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockd_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockd_04_001.png b/GJ_GameSheet-uhd/persp_blockd_04_001.png new file mode 100644 index 00000000..383a5fb4 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockd_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockd_05_001.png b/GJ_GameSheet-uhd/persp_blockd_05_001.png new file mode 100644 index 00000000..7dbe3a98 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockd_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blocke_01_001.png b/GJ_GameSheet-uhd/persp_blocke_01_001.png new file mode 100644 index 00000000..d1a8ec5d Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blocke_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blocke_02_001.png b/GJ_GameSheet-uhd/persp_blocke_02_001.png new file mode 100644 index 00000000..9dc030b4 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blocke_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blocke_03_001.png b/GJ_GameSheet-uhd/persp_blocke_03_001.png new file mode 100644 index 00000000..f2407fbf Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blocke_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blocke_04_001.png b/GJ_GameSheet-uhd/persp_blocke_04_001.png new file mode 100644 index 00000000..9fce0f1d Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blocke_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blocke_05_001.png b/GJ_GameSheet-uhd/persp_blocke_05_001.png new file mode 100644 index 00000000..d2a84d2c Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blocke_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockf_01_001.png b/GJ_GameSheet-uhd/persp_blockf_01_001.png new file mode 100644 index 00000000..7f55da98 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockf_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockf_02_001.png b/GJ_GameSheet-uhd/persp_blockf_02_001.png new file mode 100644 index 00000000..4752887f Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockf_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockf_03_001.png b/GJ_GameSheet-uhd/persp_blockf_03_001.png new file mode 100644 index 00000000..ba134c9a Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockf_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockf_04_001.png b/GJ_GameSheet-uhd/persp_blockf_04_001.png new file mode 100644 index 00000000..2713c7fc Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockf_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockf_05_001.png b/GJ_GameSheet-uhd/persp_blockf_05_001.png new file mode 100644 index 00000000..bb4872a5 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockf_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockg_01_001.png b/GJ_GameSheet-uhd/persp_blockg_01_001.png new file mode 100644 index 00000000..5ec274c0 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockg_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockg_02_001.png b/GJ_GameSheet-uhd/persp_blockg_02_001.png new file mode 100644 index 00000000..ced52f4b Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockg_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockg_03_001.png b/GJ_GameSheet-uhd/persp_blockg_03_001.png new file mode 100644 index 00000000..8a8b7ce0 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockg_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockg_04_001.png b/GJ_GameSheet-uhd/persp_blockg_04_001.png new file mode 100644 index 00000000..93293829 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockg_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockg_05_001.png b/GJ_GameSheet-uhd/persp_blockg_05_001.png new file mode 100644 index 00000000..6f513277 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockg_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockh_01_001.png b/GJ_GameSheet-uhd/persp_blockh_01_001.png new file mode 100644 index 00000000..833fa900 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockh_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockh_02_001.png b/GJ_GameSheet-uhd/persp_blockh_02_001.png new file mode 100644 index 00000000..1d077eb8 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockh_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockh_03_001.png b/GJ_GameSheet-uhd/persp_blockh_03_001.png new file mode 100644 index 00000000..0717ada6 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockh_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockh_04_001.png b/GJ_GameSheet-uhd/persp_blockh_04_001.png new file mode 100644 index 00000000..0b9fc2a7 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockh_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_blockh_05_001.png b/GJ_GameSheet-uhd/persp_blockh_05_001.png new file mode 100644 index 00000000..334e02f9 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_blockh_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock01_01_001.png b/GJ_GameSheet-uhd/persp_lblock01_01_001.png new file mode 100644 index 00000000..7abe816c Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock01_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock01_02_001.png b/GJ_GameSheet-uhd/persp_lblock01_02_001.png new file mode 100644 index 00000000..661f7304 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock01_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock01_03_001.png b/GJ_GameSheet-uhd/persp_lblock01_03_001.png new file mode 100644 index 00000000..7d0ab4cc Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock01_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock01_04_001.png b/GJ_GameSheet-uhd/persp_lblock01_04_001.png new file mode 100644 index 00000000..55af5bb5 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock01_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock01_05_001.png b/GJ_GameSheet-uhd/persp_lblock01_05_001.png new file mode 100644 index 00000000..8587ee62 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock01_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock01_06_001.png b/GJ_GameSheet-uhd/persp_lblock01_06_001.png new file mode 100644 index 00000000..7a599bea Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock01_06_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock02_01_001.png b/GJ_GameSheet-uhd/persp_lblock02_01_001.png new file mode 100644 index 00000000..3f64b2f6 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock02_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock02_02_001.png b/GJ_GameSheet-uhd/persp_lblock02_02_001.png new file mode 100644 index 00000000..153e8813 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock02_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock02_03_001.png b/GJ_GameSheet-uhd/persp_lblock02_03_001.png new file mode 100644 index 00000000..e99a53ef Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock02_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock02_04_001.png b/GJ_GameSheet-uhd/persp_lblock02_04_001.png new file mode 100644 index 00000000..70f0fe3c Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock02_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock02_05_001.png b/GJ_GameSheet-uhd/persp_lblock02_05_001.png new file mode 100644 index 00000000..10db3bf5 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock02_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock03_01_001.png b/GJ_GameSheet-uhd/persp_lblock03_01_001.png new file mode 100644 index 00000000..0e75c201 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock03_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock03_02_001.png b/GJ_GameSheet-uhd/persp_lblock03_02_001.png new file mode 100644 index 00000000..c9ba795c Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock03_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock03_03_001.png b/GJ_GameSheet-uhd/persp_lblock03_03_001.png new file mode 100644 index 00000000..d1c84c9e Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock03_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock03_04_001.png b/GJ_GameSheet-uhd/persp_lblock03_04_001.png new file mode 100644 index 00000000..8a8e38c0 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock03_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock03_05_001.png b/GJ_GameSheet-uhd/persp_lblock03_05_001.png new file mode 100644 index 00000000..ce9356ba Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock03_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock04_01_001.png b/GJ_GameSheet-uhd/persp_lblock04_01_001.png new file mode 100644 index 00000000..39767f81 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock04_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock04_02_001.png b/GJ_GameSheet-uhd/persp_lblock04_02_001.png new file mode 100644 index 00000000..7df07fec Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock04_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock04_03_001.png b/GJ_GameSheet-uhd/persp_lblock04_03_001.png new file mode 100644 index 00000000..be5a3d06 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock04_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock04_04_001.png b/GJ_GameSheet-uhd/persp_lblock04_04_001.png new file mode 100644 index 00000000..29b8b81f Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock04_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock04_05_001.png b/GJ_GameSheet-uhd/persp_lblock04_05_001.png new file mode 100644 index 00000000..ce66e9fa Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock04_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock05_01_001.png b/GJ_GameSheet-uhd/persp_lblock05_01_001.png new file mode 100644 index 00000000..42d82058 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock05_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock05_02_001.png b/GJ_GameSheet-uhd/persp_lblock05_02_001.png new file mode 100644 index 00000000..0e0fd9ea Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock05_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock05_03_001.png b/GJ_GameSheet-uhd/persp_lblock05_03_001.png new file mode 100644 index 00000000..5c626ccf Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock05_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock05_04_001.png b/GJ_GameSheet-uhd/persp_lblock05_04_001.png new file mode 100644 index 00000000..098552fd Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock05_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_lblock05_05_001.png b/GJ_GameSheet-uhd/persp_lblock05_05_001.png new file mode 100644 index 00000000..66f2cd3e Binary files /dev/null and b/GJ_GameSheet-uhd/persp_lblock05_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_01_001.png b/GJ_GameSheet-uhd/persp_outline_01_001.png new file mode 100644 index 00000000..0e7f480c Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_01_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_02_001.png b/GJ_GameSheet-uhd/persp_outline_02_001.png new file mode 100644 index 00000000..eb31a091 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_02_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_03_001.png b/GJ_GameSheet-uhd/persp_outline_03_001.png new file mode 100644 index 00000000..c3108e40 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_03_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_04_001.png b/GJ_GameSheet-uhd/persp_outline_04_001.png new file mode 100644 index 00000000..d1b59f9a Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_04_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_05_001.png b/GJ_GameSheet-uhd/persp_outline_05_001.png new file mode 100644 index 00000000..aefa2bbe Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_05_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_06_001.png b/GJ_GameSheet-uhd/persp_outline_06_001.png new file mode 100644 index 00000000..ea8877d6 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_06_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_07_001.png b/GJ_GameSheet-uhd/persp_outline_07_001.png new file mode 100644 index 00000000..6cffd8e1 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_07_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_08_001.png b/GJ_GameSheet-uhd/persp_outline_08_001.png new file mode 100644 index 00000000..a9597fac Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_08_001.png differ diff --git a/GJ_GameSheet-uhd/persp_outline_09_001.png b/GJ_GameSheet-uhd/persp_outline_09_001.png new file mode 100644 index 00000000..8e73ea78 Binary files /dev/null and b/GJ_GameSheet-uhd/persp_outline_09_001.png differ diff --git a/GJ_GameSheet-uhd/pit_01_001.png b/GJ_GameSheet-uhd/pit_01_001.png new file mode 100644 index 00000000..8b5d6e7b Binary files /dev/null and b/GJ_GameSheet-uhd/pit_01_001.png differ diff --git a/GJ_GameSheet-uhd/pit_01_low_001.png b/GJ_GameSheet-uhd/pit_01_low_001.png new file mode 100644 index 00000000..4ae6d787 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_01_low_001.png differ diff --git a/GJ_GameSheet-uhd/pit_01_slope_01_001.png b/GJ_GameSheet-uhd/pit_01_slope_01_001.png new file mode 100644 index 00000000..e548785d Binary files /dev/null and b/GJ_GameSheet-uhd/pit_01_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/pit_01_slope_02_001.png b/GJ_GameSheet-uhd/pit_01_slope_02_001.png new file mode 100644 index 00000000..1fb01d5d Binary files /dev/null and b/GJ_GameSheet-uhd/pit_01_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/pit_02_001.png b/GJ_GameSheet-uhd/pit_02_001.png new file mode 100644 index 00000000..31767bca Binary files /dev/null and b/GJ_GameSheet-uhd/pit_02_001.png differ diff --git a/GJ_GameSheet-uhd/pit_03_001.png b/GJ_GameSheet-uhd/pit_03_001.png new file mode 100644 index 00000000..319c8935 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_03_001.png differ diff --git a/GJ_GameSheet-uhd/pit_04_001.png b/GJ_GameSheet-uhd/pit_04_001.png new file mode 100644 index 00000000..ef7a09cb Binary files /dev/null and b/GJ_GameSheet-uhd/pit_04_001.png differ diff --git a/GJ_GameSheet-uhd/pit_04_02_001.png b/GJ_GameSheet-uhd/pit_04_02_001.png new file mode 100644 index 00000000..8dccd10a Binary files /dev/null and b/GJ_GameSheet-uhd/pit_04_02_001.png differ diff --git a/GJ_GameSheet-uhd/pit_04_03_001.png b/GJ_GameSheet-uhd/pit_04_03_001.png new file mode 100644 index 00000000..ac2ad30a Binary files /dev/null and b/GJ_GameSheet-uhd/pit_04_03_001.png differ diff --git a/GJ_GameSheet-uhd/pit_04_low_001.png b/GJ_GameSheet-uhd/pit_04_low_001.png new file mode 100644 index 00000000..3c6c7c69 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_04_low_001.png differ diff --git a/GJ_GameSheet-uhd/pit_04_slope_01_001.png b/GJ_GameSheet-uhd/pit_04_slope_01_001.png new file mode 100644 index 00000000..cdcb4a7a Binary files /dev/null and b/GJ_GameSheet-uhd/pit_04_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/pit_04_slope_02_001.png b/GJ_GameSheet-uhd/pit_04_slope_02_001.png new file mode 100644 index 00000000..9dcdc84f Binary files /dev/null and b/GJ_GameSheet-uhd/pit_04_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/pit_05_001.png b/GJ_GameSheet-uhd/pit_05_001.png new file mode 100644 index 00000000..f91f3e5d Binary files /dev/null and b/GJ_GameSheet-uhd/pit_05_001.png differ diff --git a/GJ_GameSheet-uhd/pit_05_02_001.png b/GJ_GameSheet-uhd/pit_05_02_001.png new file mode 100644 index 00000000..3369dbf6 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_05_02_001.png differ diff --git a/GJ_GameSheet-uhd/pit_05_03_001.png b/GJ_GameSheet-uhd/pit_05_03_001.png new file mode 100644 index 00000000..f74fa387 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_05_03_001.png differ diff --git a/GJ_GameSheet-uhd/pit_06_001.png b/GJ_GameSheet-uhd/pit_06_001.png new file mode 100644 index 00000000..cd8d8301 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_06_001.png differ diff --git a/GJ_GameSheet-uhd/pit_06_2_001.png b/GJ_GameSheet-uhd/pit_06_2_001.png new file mode 100644 index 00000000..1c8b9d63 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_06_2_001.png differ diff --git a/GJ_GameSheet-uhd/pit_07_001.png b/GJ_GameSheet-uhd/pit_07_001.png new file mode 100644 index 00000000..510acc58 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_07_001.png differ diff --git a/GJ_GameSheet-uhd/pit_07_2_001.png b/GJ_GameSheet-uhd/pit_07_2_001.png new file mode 100644 index 00000000..7f5433fb Binary files /dev/null and b/GJ_GameSheet-uhd/pit_07_2_001.png differ diff --git a/GJ_GameSheet-uhd/pit_07_2_shine_001.png b/GJ_GameSheet-uhd/pit_07_2_shine_001.png new file mode 100644 index 00000000..7b624f30 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_07_2_shine_001.png differ diff --git a/GJ_GameSheet-uhd/pit_07_3_001.png b/GJ_GameSheet-uhd/pit_07_3_001.png new file mode 100644 index 00000000..c46fdd8b Binary files /dev/null and b/GJ_GameSheet-uhd/pit_07_3_001.png differ diff --git a/GJ_GameSheet-uhd/pit_07_3_shine_001.png b/GJ_GameSheet-uhd/pit_07_3_shine_001.png new file mode 100644 index 00000000..9373d023 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_07_3_shine_001.png differ diff --git a/GJ_GameSheet-uhd/pit_07_4_001.png b/GJ_GameSheet-uhd/pit_07_4_001.png new file mode 100644 index 00000000..b865ee11 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_07_4_001.png differ diff --git a/GJ_GameSheet-uhd/pit_07_4_shine_001.png b/GJ_GameSheet-uhd/pit_07_4_shine_001.png new file mode 100644 index 00000000..dd9bcb40 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_07_4_shine_001.png differ diff --git a/GJ_GameSheet-uhd/pit_07_shine_001.png b/GJ_GameSheet-uhd/pit_07_shine_001.png new file mode 100644 index 00000000..57b700a6 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_07_shine_001.png differ diff --git a/GJ_GameSheet-uhd/pit_b_01_001.png b/GJ_GameSheet-uhd/pit_b_01_001.png new file mode 100644 index 00000000..6397966f Binary files /dev/null and b/GJ_GameSheet-uhd/pit_b_01_001.png differ diff --git a/GJ_GameSheet-uhd/pit_b_02_001.png b/GJ_GameSheet-uhd/pit_b_02_001.png new file mode 100644 index 00000000..3e23e07d Binary files /dev/null and b/GJ_GameSheet-uhd/pit_b_02_001.png differ diff --git a/GJ_GameSheet-uhd/pit_b_03_001.png b/GJ_GameSheet-uhd/pit_b_03_001.png new file mode 100644 index 00000000..dd254b22 Binary files /dev/null and b/GJ_GameSheet-uhd/pit_b_03_001.png differ diff --git a/GJ_GameSheet-uhd/pit_b_04_001.png b/GJ_GameSheet-uhd/pit_b_04_001.png new file mode 100644 index 00000000..4476942b Binary files /dev/null and b/GJ_GameSheet-uhd/pit_b_04_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_01_001.png b/GJ_GameSheet-uhd/plank005_01_001.png new file mode 100644 index 00000000..8baf306b Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_01_color_001.png b/GJ_GameSheet-uhd/plank005_01_color_001.png new file mode 100644 index 00000000..854681b9 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_02_001.png b/GJ_GameSheet-uhd/plank005_02_001.png new file mode 100644 index 00000000..f84bac0a Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_02_color_001.png b/GJ_GameSheet-uhd/plank005_02_color_001.png new file mode 100644 index 00000000..7cc23185 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_01_001.png b/GJ_GameSheet-uhd/plank005_slope_01_001.png new file mode 100644 index 00000000..8d70fa29 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_01_color_001.png b/GJ_GameSheet-uhd/plank005_slope_01_color_001.png new file mode 100644 index 00000000..a92efc6c Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_02_001.png b/GJ_GameSheet-uhd/plank005_slope_02_001.png new file mode 100644 index 00000000..6667c39d Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_02_color_001.png b/GJ_GameSheet-uhd/plank005_slope_02_color_001.png new file mode 100644 index 00000000..2f6e20f9 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_square_01_001.png b/GJ_GameSheet-uhd/plank005_slope_square_01_001.png new file mode 100644 index 00000000..3be4f8b5 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_square_01_color_001.png b/GJ_GameSheet-uhd/plank005_slope_square_01_color_001.png new file mode 100644 index 00000000..28791685 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_square_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_square_02_001.png b/GJ_GameSheet-uhd/plank005_slope_square_02_001.png new file mode 100644 index 00000000..e07c549a Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_square_02_color_001.png b/GJ_GameSheet-uhd/plank005_slope_square_02_color_001.png new file mode 100644 index 00000000..c5e16643 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_square_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005_slope_square_03_001.png b/GJ_GameSheet-uhd/plank005_slope_square_03_001.png new file mode 100644 index 00000000..9acae6f6 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005_slope_square_03_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_01_001.png b/GJ_GameSheet-uhd/plank005b_01_001.png new file mode 100644 index 00000000..3f51f933 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_01_color_001.png b/GJ_GameSheet-uhd/plank005b_01_color_001.png new file mode 100644 index 00000000..854681b9 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_02_001.png b/GJ_GameSheet-uhd/plank005b_02_001.png new file mode 100644 index 00000000..9fcbc8b6 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_02_color_001.png b/GJ_GameSheet-uhd/plank005b_02_color_001.png new file mode 100644 index 00000000..7cc23185 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_01_001.png b/GJ_GameSheet-uhd/plank005b_slope_01_001.png new file mode 100644 index 00000000..6b5c38de Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_01_color_001.png b/GJ_GameSheet-uhd/plank005b_slope_01_color_001.png new file mode 100644 index 00000000..a92efc6c Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_02_001.png b/GJ_GameSheet-uhd/plank005b_slope_02_001.png new file mode 100644 index 00000000..4aa1c11c Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_02_color_001.png b/GJ_GameSheet-uhd/plank005b_slope_02_color_001.png new file mode 100644 index 00000000..2f6e20f9 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_square_01_001.png b/GJ_GameSheet-uhd/plank005b_slope_square_01_001.png new file mode 100644 index 00000000..51c325fd Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_square_01_color_001.png b/GJ_GameSheet-uhd/plank005b_slope_square_01_color_001.png new file mode 100644 index 00000000..28791685 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_square_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_square_02_001.png b/GJ_GameSheet-uhd/plank005b_slope_square_02_001.png new file mode 100644 index 00000000..41cf150d Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_square_02_color_001.png b/GJ_GameSheet-uhd/plank005b_slope_square_02_color_001.png new file mode 100644 index 00000000..c5e16643 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_square_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank005b_slope_square_03_001.png b/GJ_GameSheet-uhd/plank005b_slope_square_03_001.png new file mode 100644 index 00000000..9114e5b5 Binary files /dev/null and b/GJ_GameSheet-uhd/plank005b_slope_square_03_001.png differ diff --git a/GJ_GameSheet-uhd/plank007_01_001.png b/GJ_GameSheet-uhd/plank007_01_001.png new file mode 100644 index 00000000..b0bd955a Binary files /dev/null and b/GJ_GameSheet-uhd/plank007_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank007_02_001.png b/GJ_GameSheet-uhd/plank007_02_001.png new file mode 100644 index 00000000..31e02c9a Binary files /dev/null and b/GJ_GameSheet-uhd/plank007_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank007_03_001.png b/GJ_GameSheet-uhd/plank007_03_001.png new file mode 100644 index 00000000..ff021afd Binary files /dev/null and b/GJ_GameSheet-uhd/plank007_03_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_001.png b/GJ_GameSheet-uhd/plank_01_001.png new file mode 100644 index 00000000..b035286d Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_02_001.png b/GJ_GameSheet-uhd/plank_01_02_001.png new file mode 100644 index 00000000..4c433e39 Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_03_001.png b/GJ_GameSheet-uhd/plank_01_03_001.png new file mode 100644 index 00000000..04312f4f Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_03_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_color_001.png b/GJ_GameSheet-uhd/plank_01_color_001.png new file mode 100644 index 00000000..540005a2 Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_slope_01_001.png b/GJ_GameSheet-uhd/plank_01_slope_01_001.png new file mode 100644 index 00000000..67db0cc7 Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_slope_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_slope_01_color_001.png b/GJ_GameSheet-uhd/plank_01_slope_01_color_001.png new file mode 100644 index 00000000..491a72c1 Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_slope_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_slope_02_001.png b/GJ_GameSheet-uhd/plank_01_slope_02_001.png new file mode 100644 index 00000000..9d60c20b Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_slope_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_slope_02_color_001.png b/GJ_GameSheet-uhd/plank_01_slope_02_color_001.png new file mode 100644 index 00000000..020e2eaf Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_slope_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_small_001.png b/GJ_GameSheet-uhd/plank_01_small_001.png new file mode 100644 index 00000000..bda67fa0 Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_small_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_small_color_001.png b/GJ_GameSheet-uhd/plank_01_small_color_001.png new file mode 100644 index 00000000..b7cd7e7d Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_small_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_square_01_001.png b/GJ_GameSheet-uhd/plank_01_square_01_001.png new file mode 100644 index 00000000..32fb4e8f Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_square_01_color_001.png b/GJ_GameSheet-uhd/plank_01_square_01_color_001.png new file mode 100644 index 00000000..af0d4733 Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_square_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_square_02_001.png b/GJ_GameSheet-uhd/plank_01_square_02_001.png new file mode 100644 index 00000000..4834ba88 Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/plank_01_square_02_color_001.png b/GJ_GameSheet-uhd/plank_01_square_02_color_001.png new file mode 100644 index 00000000..51aaee55 Binary files /dev/null and b/GJ_GameSheet-uhd/plank_01_square_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/puzzle_base_001.png b/GJ_GameSheet-uhd/puzzle_base_001.png new file mode 100644 index 00000000..3c626979 Binary files /dev/null and b/GJ_GameSheet-uhd/puzzle_base_001.png differ diff --git a/GJ_GameSheet-uhd/puzzle_base_color_001.png b/GJ_GameSheet-uhd/puzzle_base_color_001.png new file mode 100644 index 00000000..b35b8bba Binary files /dev/null and b/GJ_GameSheet-uhd/puzzle_base_color_001.png differ diff --git a/GJ_GameSheet-uhd/puzzle_piece_01_001.png b/GJ_GameSheet-uhd/puzzle_piece_01_001.png new file mode 100644 index 00000000..075fa6d6 Binary files /dev/null and b/GJ_GameSheet-uhd/puzzle_piece_01_001.png differ diff --git a/GJ_GameSheet-uhd/puzzle_piece_01_color_001.png b/GJ_GameSheet-uhd/puzzle_piece_01_color_001.png new file mode 100644 index 00000000..de059efe Binary files /dev/null and b/GJ_GameSheet-uhd/puzzle_piece_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/puzzle_piece_02_001.png b/GJ_GameSheet-uhd/puzzle_piece_02_001.png new file mode 100644 index 00000000..38862087 Binary files /dev/null and b/GJ_GameSheet-uhd/puzzle_piece_02_001.png differ diff --git a/GJ_GameSheet-uhd/puzzle_piece_02_color_001.png b/GJ_GameSheet-uhd/puzzle_piece_02_color_001.png new file mode 100644 index 00000000..8d4894bd Binary files /dev/null and b/GJ_GameSheet-uhd/puzzle_piece_02_color_001.png differ diff --git a/GJ_GameSheet-uhd/puzzle_piece_03_001.png b/GJ_GameSheet-uhd/puzzle_piece_03_001.png new file mode 100644 index 00000000..7814a145 Binary files /dev/null and b/GJ_GameSheet-uhd/puzzle_piece_03_001.png differ diff --git a/GJ_GameSheet-uhd/puzzle_piece_03_color_001.png b/GJ_GameSheet-uhd/puzzle_piece_03_color_001.png new file mode 100644 index 00000000..6f8bb208 Binary files /dev/null and b/GJ_GameSheet-uhd/puzzle_piece_03_color_001.png differ diff --git a/GJ_GameSheet-uhd/ring_01_001.png b/GJ_GameSheet-uhd/ring_01_001.png new file mode 100644 index 00000000..cf8fe85c Binary files /dev/null and b/GJ_GameSheet-uhd/ring_01_001.png differ diff --git a/GJ_GameSheet-uhd/ring_02_001.png b/GJ_GameSheet-uhd/ring_02_001.png new file mode 100644 index 00000000..cbf35329 Binary files /dev/null and b/GJ_GameSheet-uhd/ring_02_001.png differ diff --git a/GJ_GameSheet-uhd/ring_02_extra_001.png b/GJ_GameSheet-uhd/ring_02_extra_001.png new file mode 100644 index 00000000..eec5b864 Binary files /dev/null and b/GJ_GameSheet-uhd/ring_02_extra_001.png differ diff --git a/GJ_GameSheet-uhd/ring_03_001.png b/GJ_GameSheet-uhd/ring_03_001.png new file mode 100644 index 00000000..acc3dd20 Binary files /dev/null and b/GJ_GameSheet-uhd/ring_03_001.png differ diff --git a/GJ_GameSheet-uhd/ring_custom_01_001.png b/GJ_GameSheet-uhd/ring_custom_01_001.png new file mode 100644 index 00000000..50a590fe Binary files /dev/null and b/GJ_GameSheet-uhd/ring_custom_01_001.png differ diff --git a/GJ_GameSheet-uhd/ring_custom_01_color_001.png b/GJ_GameSheet-uhd/ring_custom_01_color_001.png new file mode 100644 index 00000000..2b38aa76 Binary files /dev/null and b/GJ_GameSheet-uhd/ring_custom_01_color_001.png differ diff --git a/GJ_GameSheet-uhd/rod_01_001.png b/GJ_GameSheet-uhd/rod_01_001.png new file mode 100644 index 00000000..5f8701c1 Binary files /dev/null and b/GJ_GameSheet-uhd/rod_01_001.png differ diff --git a/GJ_GameSheet-uhd/rod_02_001.png b/GJ_GameSheet-uhd/rod_02_001.png new file mode 100644 index 00000000..e48f3824 Binary files /dev/null and b/GJ_GameSheet-uhd/rod_02_001.png differ diff --git a/GJ_GameSheet-uhd/rod_03_001.png b/GJ_GameSheet-uhd/rod_03_001.png new file mode 100644 index 00000000..a27d176c Binary files /dev/null and b/GJ_GameSheet-uhd/rod_03_001.png differ diff --git a/GJ_GameSheet-uhd/rod_ball_01_001.png b/GJ_GameSheet-uhd/rod_ball_01_001.png new file mode 100644 index 00000000..36abea4d Binary files /dev/null and b/GJ_GameSheet-uhd/rod_ball_01_001.png differ diff --git a/GJ_GameSheet-uhd/rod_ball_02_001.png b/GJ_GameSheet-uhd/rod_ball_02_001.png new file mode 100644 index 00000000..2554d709 Binary files /dev/null and b/GJ_GameSheet-uhd/rod_ball_02_001.png differ diff --git a/GJ_GameSheet-uhd/rod_ball_03_001.png b/GJ_GameSheet-uhd/rod_ball_03_001.png new file mode 100644 index 00000000..e1e3db37 Binary files /dev/null and b/GJ_GameSheet-uhd/rod_ball_03_001.png differ diff --git a/GJ_GameSheet-uhd/sawblade_01_001.png b/GJ_GameSheet-uhd/sawblade_01_001.png new file mode 100644 index 00000000..a9048e19 Binary files /dev/null and b/GJ_GameSheet-uhd/sawblade_01_001.png differ diff --git a/GJ_GameSheet-uhd/sawblade_02_001.png b/GJ_GameSheet-uhd/sawblade_02_001.png new file mode 100644 index 00000000..a7b37ae3 Binary files /dev/null and b/GJ_GameSheet-uhd/sawblade_02_001.png differ diff --git a/GJ_GameSheet-uhd/sawblade_03_001.png b/GJ_GameSheet-uhd/sawblade_03_001.png new file mode 100644 index 00000000..a635ec66 Binary files /dev/null and b/GJ_GameSheet-uhd/sawblade_03_001.png differ diff --git a/GJ_GameSheet-uhd/smallOutline_01_001.png b/GJ_GameSheet-uhd/smallOutline_01_001.png new file mode 100644 index 00000000..93b1d734 Binary files /dev/null and b/GJ_GameSheet-uhd/smallOutline_01_001.png differ diff --git a/GJ_GameSheet-uhd/smallOutline_02_001.png b/GJ_GameSheet-uhd/smallOutline_02_001.png new file mode 100644 index 00000000..be736de9 Binary files /dev/null and b/GJ_GameSheet-uhd/smallOutline_02_001.png differ diff --git a/GJ_GameSheet-uhd/smallOutline_03_001.png b/GJ_GameSheet-uhd/smallOutline_03_001.png new file mode 100644 index 00000000..ea40b26d Binary files /dev/null and b/GJ_GameSheet-uhd/smallOutline_03_001.png differ diff --git a/GJ_GameSheet-uhd/smallOutline_04_001.png b/GJ_GameSheet-uhd/smallOutline_04_001.png new file mode 100644 index 00000000..565b8401 Binary files /dev/null and b/GJ_GameSheet-uhd/smallOutline_04_001.png differ diff --git a/GJ_GameSheet-uhd/smallOutline_05_001.png b/GJ_GameSheet-uhd/smallOutline_05_001.png new file mode 100644 index 00000000..3cbfb03e Binary files /dev/null and b/GJ_GameSheet-uhd/smallOutline_05_001.png differ diff --git a/GJ_GameSheet-uhd/spiderBump_001.png b/GJ_GameSheet-uhd/spiderBump_001.png new file mode 100644 index 00000000..2685352f Binary files /dev/null and b/GJ_GameSheet-uhd/spiderBump_001.png differ diff --git a/GJ_GameSheet-uhd/spiderRing_001.png b/GJ_GameSheet-uhd/spiderRing_001.png new file mode 100644 index 00000000..2813b91b Binary files /dev/null and b/GJ_GameSheet-uhd/spiderRing_001.png differ diff --git a/GJ_GameSheet-uhd/spike_01_001.png b/GJ_GameSheet-uhd/spike_01_001.png new file mode 100644 index 00000000..66f971d9 Binary files /dev/null and b/GJ_GameSheet-uhd/spike_01_001.png differ diff --git a/GJ_GameSheet-uhd/spike_02_001.png b/GJ_GameSheet-uhd/spike_02_001.png new file mode 100644 index 00000000..40c87e26 Binary files /dev/null and b/GJ_GameSheet-uhd/spike_02_001.png differ diff --git a/GJ_GameSheet-uhd/spike_03_001.png b/GJ_GameSheet-uhd/spike_03_001.png new file mode 100644 index 00000000..a21757ba Binary files /dev/null and b/GJ_GameSheet-uhd/spike_03_001.png differ diff --git a/GJ_GameSheet-uhd/spike_04_001.png b/GJ_GameSheet-uhd/spike_04_001.png new file mode 100644 index 00000000..300a9243 Binary files /dev/null and b/GJ_GameSheet-uhd/spike_04_001.png differ diff --git a/GJ_GameSheet-uhd/spinBlade01_001.png b/GJ_GameSheet-uhd/spinBlade01_001.png new file mode 100644 index 00000000..3be6fed6 Binary files /dev/null and b/GJ_GameSheet-uhd/spinBlade01_001.png differ diff --git a/GJ_GameSheet-uhd/spinBlade01_color_001.png b/GJ_GameSheet-uhd/spinBlade01_color_001.png new file mode 100644 index 00000000..bf79d4f6 Binary files /dev/null and b/GJ_GameSheet-uhd/spinBlade01_color_001.png differ diff --git a/GJ_GameSheet-uhd/spinBlade02_001.png b/GJ_GameSheet-uhd/spinBlade02_001.png new file mode 100644 index 00000000..5402a1cc Binary files /dev/null and b/GJ_GameSheet-uhd/spinBlade02_001.png differ diff --git a/GJ_GameSheet-uhd/spinBlade02_color_001.png b/GJ_GameSheet-uhd/spinBlade02_color_001.png new file mode 100644 index 00000000..ae6a47ea Binary files /dev/null and b/GJ_GameSheet-uhd/spinBlade02_color_001.png differ diff --git a/GJ_GameSheet-uhd/square_01_001.png b/GJ_GameSheet-uhd/square_01_001.png new file mode 100644 index 00000000..c165e0ed Binary files /dev/null and b/GJ_GameSheet-uhd/square_01_001.png differ diff --git a/GJ_GameSheet-uhd/square_01_small_001.png b/GJ_GameSheet-uhd/square_01_small_001.png new file mode 100644 index 00000000..e8c3e545 Binary files /dev/null and b/GJ_GameSheet-uhd/square_01_small_001.png differ diff --git a/GJ_GameSheet-uhd/square_01_small_color_001.png b/GJ_GameSheet-uhd/square_01_small_color_001.png new file mode 100644 index 00000000..c2dcf297 Binary files /dev/null and b/GJ_GameSheet-uhd/square_01_small_color_001.png differ diff --git a/GJ_GameSheet-uhd/square_02_001.png b/GJ_GameSheet-uhd/square_02_001.png new file mode 100644 index 00000000..f22fa6a4 Binary files /dev/null and b/GJ_GameSheet-uhd/square_02_001.png differ diff --git a/GJ_GameSheet-uhd/square_03_001.png b/GJ_GameSheet-uhd/square_03_001.png new file mode 100644 index 00000000..39bc8da7 Binary files /dev/null and b/GJ_GameSheet-uhd/square_03_001.png differ diff --git a/GJ_GameSheet-uhd/square_04_001.png b/GJ_GameSheet-uhd/square_04_001.png new file mode 100644 index 00000000..a5f45378 Binary files /dev/null and b/GJ_GameSheet-uhd/square_04_001.png differ diff --git a/GJ_GameSheet-uhd/square_05_001.png b/GJ_GameSheet-uhd/square_05_001.png new file mode 100644 index 00000000..b2d2c447 Binary files /dev/null and b/GJ_GameSheet-uhd/square_05_001.png differ diff --git a/GJ_GameSheet-uhd/square_06_001.png b/GJ_GameSheet-uhd/square_06_001.png new file mode 100644 index 00000000..0538517c Binary files /dev/null and b/GJ_GameSheet-uhd/square_06_001.png differ diff --git a/GJ_GameSheet-uhd/square_07_001.png b/GJ_GameSheet-uhd/square_07_001.png new file mode 100644 index 00000000..4d0b0285 Binary files /dev/null and b/GJ_GameSheet-uhd/square_07_001.png differ diff --git a/GJ_GameSheet-uhd/square_08_001.png b/GJ_GameSheet-uhd/square_08_001.png new file mode 100644 index 00000000..dc358dd9 Binary files /dev/null and b/GJ_GameSheet-uhd/square_08_001.png differ diff --git a/GJ_GameSheet-uhd/square_09_001.png b/GJ_GameSheet-uhd/square_09_001.png new file mode 100644 index 00000000..91ff8285 Binary files /dev/null and b/GJ_GameSheet-uhd/square_09_001.png differ diff --git a/GJ_GameSheet-uhd/square_b_01_001.png b/GJ_GameSheet-uhd/square_b_01_001.png new file mode 100644 index 00000000..7e2e2f0c Binary files /dev/null and b/GJ_GameSheet-uhd/square_b_01_001.png differ diff --git a/GJ_GameSheet-uhd/square_b_02_001.png b/GJ_GameSheet-uhd/square_b_02_001.png new file mode 100644 index 00000000..ceffe6d1 Binary files /dev/null and b/GJ_GameSheet-uhd/square_b_02_001.png differ diff --git a/GJ_GameSheet-uhd/square_b_03_001.png b/GJ_GameSheet-uhd/square_b_03_001.png new file mode 100644 index 00000000..98546875 Binary files /dev/null and b/GJ_GameSheet-uhd/square_b_03_001.png differ diff --git a/GJ_GameSheet-uhd/square_b_04_001.png b/GJ_GameSheet-uhd/square_b_04_001.png new file mode 100644 index 00000000..63ac1f1d Binary files /dev/null and b/GJ_GameSheet-uhd/square_b_04_001.png differ diff --git a/GJ_GameSheet-uhd/square_b_05_001.png b/GJ_GameSheet-uhd/square_b_05_001.png new file mode 100644 index 00000000..6db113ea Binary files /dev/null and b/GJ_GameSheet-uhd/square_b_05_001.png differ diff --git a/GJ_GameSheet-uhd/square_b_06_001.png b/GJ_GameSheet-uhd/square_b_06_001.png new file mode 100644 index 00000000..6016d123 Binary files /dev/null and b/GJ_GameSheet-uhd/square_b_06_001.png differ diff --git a/GJ_GameSheet-uhd/square_c_05_001.png b/GJ_GameSheet-uhd/square_c_05_001.png new file mode 100644 index 00000000..8bec3fca Binary files /dev/null and b/GJ_GameSheet-uhd/square_c_05_001.png differ diff --git a/GJ_GameSheet-uhd/square_d_05_001.png b/GJ_GameSheet-uhd/square_d_05_001.png new file mode 100644 index 00000000..db57f5ee Binary files /dev/null and b/GJ_GameSheet-uhd/square_d_05_001.png differ diff --git a/GJ_GameSheet-uhd/square_f_01_001.png b/GJ_GameSheet-uhd/square_f_01_001.png new file mode 100644 index 00000000..6976657a Binary files /dev/null and b/GJ_GameSheet-uhd/square_f_01_001.png differ diff --git a/GJ_GameSheet-uhd/square_f_02_001.png b/GJ_GameSheet-uhd/square_f_02_001.png new file mode 100644 index 00000000..564f6955 Binary files /dev/null and b/GJ_GameSheet-uhd/square_f_02_001.png differ diff --git a/GJ_GameSheet-uhd/square_f_03_001.png b/GJ_GameSheet-uhd/square_f_03_001.png new file mode 100644 index 00000000..a6e7258e Binary files /dev/null and b/GJ_GameSheet-uhd/square_f_03_001.png differ diff --git a/GJ_GameSheet-uhd/square_f_05_001.png b/GJ_GameSheet-uhd/square_f_05_001.png new file mode 100644 index 00000000..9e9d8b35 Binary files /dev/null and b/GJ_GameSheet-uhd/square_f_05_001.png differ diff --git a/GJ_GameSheet-uhd/square_f_06_001.png b/GJ_GameSheet-uhd/square_f_06_001.png new file mode 100644 index 00000000..0bd9cfa4 Binary files /dev/null and b/GJ_GameSheet-uhd/square_f_06_001.png differ diff --git a/GJ_GameSheet-uhd/square_f_07_001.png b/GJ_GameSheet-uhd/square_f_07_001.png new file mode 100644 index 00000000..782bc1dc Binary files /dev/null and b/GJ_GameSheet-uhd/square_f_07_001.png differ diff --git a/GJ_GameSheet-uhd/square_f_brick01_001.png b/GJ_GameSheet-uhd/square_f_brick01_001.png new file mode 100644 index 00000000..33a2a3e4 Binary files /dev/null and b/GJ_GameSheet-uhd/square_f_brick01_001.png differ diff --git a/GJ_GameSheet-uhd/square_f_brick02_001.png b/GJ_GameSheet-uhd/square_f_brick02_001.png new file mode 100644 index 00000000..20feb465 Binary files /dev/null and b/GJ_GameSheet-uhd/square_f_brick02_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_03_001.png b/GJ_GameSheet-uhd/square_g_03_001.png new file mode 100644 index 00000000..ae552163 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_03_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_04_001.png b/GJ_GameSheet-uhd/square_g_04_001.png new file mode 100644 index 00000000..db05b3d7 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_04_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_05_001.png b/GJ_GameSheet-uhd/square_g_05_001.png new file mode 100644 index 00000000..0f8cdf86 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_05_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_06_001.png b/GJ_GameSheet-uhd/square_g_06_001.png new file mode 100644 index 00000000..79b9d6e1 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_06_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_07_001.png b/GJ_GameSheet-uhd/square_g_07_001.png new file mode 100644 index 00000000..d5332fa2 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_07_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_08_001.png b/GJ_GameSheet-uhd/square_g_08_001.png new file mode 100644 index 00000000..daeec660 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_08_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_09_001.png b/GJ_GameSheet-uhd/square_g_09_001.png new file mode 100644 index 00000000..e3ff4d0b Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_09_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_10_001.png b/GJ_GameSheet-uhd/square_g_10_001.png new file mode 100644 index 00000000..523d755d Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_10_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_11_001.png b/GJ_GameSheet-uhd/square_g_11_001.png new file mode 100644 index 00000000..3af84c50 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_11_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_12_001.png b/GJ_GameSheet-uhd/square_g_12_001.png new file mode 100644 index 00000000..8ae699bb Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_12_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_13_001.png b/GJ_GameSheet-uhd/square_g_13_001.png new file mode 100644 index 00000000..b5e9599a Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_13_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_14_001.png b/GJ_GameSheet-uhd/square_g_14_001.png new file mode 100644 index 00000000..e95bdfb1 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_14_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_15_001.png b/GJ_GameSheet-uhd/square_g_15_001.png new file mode 100644 index 00000000..186c5e3e Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_15_001.png differ diff --git a/GJ_GameSheet-uhd/square_g_16_001.png b/GJ_GameSheet-uhd/square_g_16_001.png new file mode 100644 index 00000000..35cf5f14 Binary files /dev/null and b/GJ_GameSheet-uhd/square_g_16_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_01_001.png b/GJ_GameSheet-uhd/square_h_01_001.png new file mode 100644 index 00000000..280b3cbb Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_01_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_02_001.png b/GJ_GameSheet-uhd/square_h_02_001.png new file mode 100644 index 00000000..dde1a601 Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_02_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_03_001.png b/GJ_GameSheet-uhd/square_h_03_001.png new file mode 100644 index 00000000..b8b4d307 Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_03_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_04_001.png b/GJ_GameSheet-uhd/square_h_04_001.png new file mode 100644 index 00000000..44bfff06 Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_04_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_05_001.png b/GJ_GameSheet-uhd/square_h_05_001.png new file mode 100644 index 00000000..db79f93c Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_05_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_06_001.png b/GJ_GameSheet-uhd/square_h_06_001.png new file mode 100644 index 00000000..502b7277 Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_06_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_07_001.png b/GJ_GameSheet-uhd/square_h_07_001.png new file mode 100644 index 00000000..f066d4ff Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_07_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_08_001.png b/GJ_GameSheet-uhd/square_h_08_001.png new file mode 100644 index 00000000..58fd3c68 Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_08_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_09_001.png b/GJ_GameSheet-uhd/square_h_09_001.png new file mode 100644 index 00000000..c0dd392d Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_09_001.png differ diff --git a/GJ_GameSheet-uhd/square_h_10_001.png b/GJ_GameSheet-uhd/square_h_10_001.png new file mode 100644 index 00000000..9d42b739 Binary files /dev/null and b/GJ_GameSheet-uhd/square_h_10_001.png differ diff --git a/GJ_GameSheet-uhd/starAnim_001.png b/GJ_GameSheet-uhd/starAnim_001.png new file mode 100644 index 00000000..9c90b082 Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_001.png differ diff --git a/GJ_GameSheet-uhd/starAnim_002.png b/GJ_GameSheet-uhd/starAnim_002.png new file mode 100644 index 00000000..30aa9f39 Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_002.png differ diff --git a/GJ_GameSheet-uhd/starAnim_003.png b/GJ_GameSheet-uhd/starAnim_003.png new file mode 100644 index 00000000..941049df Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_003.png differ diff --git a/GJ_GameSheet-uhd/starAnim_004.png b/GJ_GameSheet-uhd/starAnim_004.png new file mode 100644 index 00000000..0f05a412 Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_004.png differ diff --git a/GJ_GameSheet-uhd/starAnim_005.png b/GJ_GameSheet-uhd/starAnim_005.png new file mode 100644 index 00000000..03fd708b Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_005.png differ diff --git a/GJ_GameSheet-uhd/starAnim_006.png b/GJ_GameSheet-uhd/starAnim_006.png new file mode 100644 index 00000000..bf42f9f6 Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_006.png differ diff --git a/GJ_GameSheet-uhd/starAnim_007.png b/GJ_GameSheet-uhd/starAnim_007.png new file mode 100644 index 00000000..be407469 Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_007.png differ diff --git a/GJ_GameSheet-uhd/starAnim_008.png b/GJ_GameSheet-uhd/starAnim_008.png new file mode 100644 index 00000000..451b937c Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_008.png differ diff --git a/GJ_GameSheet-uhd/starAnim_009.png b/GJ_GameSheet-uhd/starAnim_009.png new file mode 100644 index 00000000..494ceafb Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_009.png differ diff --git a/GJ_GameSheet-uhd/starAnim_010.png b/GJ_GameSheet-uhd/starAnim_010.png new file mode 100644 index 00000000..155a8721 Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_010.png differ diff --git a/GJ_GameSheet-uhd/starAnim_011.png b/GJ_GameSheet-uhd/starAnim_011.png new file mode 100644 index 00000000..ff56a914 Binary files /dev/null and b/GJ_GameSheet-uhd/starAnim_011.png differ diff --git a/GJ_GameSheet-uhd/teleportRing_001.png b/GJ_GameSheet-uhd/teleportRing_001.png new file mode 100644 index 00000000..836c4d71 Binary files /dev/null and b/GJ_GameSheet-uhd/teleportRing_001.png differ diff --git a/GJ_GameSheet-uhd/teleportRing_color_001.png b/GJ_GameSheet-uhd/teleportRing_color_001.png new file mode 100644 index 00000000..1275fc59 Binary files /dev/null and b/GJ_GameSheet-uhd/teleportRing_color_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_a_02_001.png b/GJ_GameSheet-uhd/triangle_a_02_001.png new file mode 100644 index 00000000..95e2ba65 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_a_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_a_04_001.png b/GJ_GameSheet-uhd/triangle_a_04_001.png new file mode 100644 index 00000000..76d9a2ca Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_a_04_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_b_01_001.png b/GJ_GameSheet-uhd/triangle_b_01_001.png new file mode 100644 index 00000000..130a006f Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_b_01_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_b_02_001.png b/GJ_GameSheet-uhd/triangle_b_02_001.png new file mode 100644 index 00000000..2f3d4d62 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_b_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_b_square_01_001.png b/GJ_GameSheet-uhd/triangle_b_square_01_001.png new file mode 100644 index 00000000..a15bb2c7 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_b_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_b_square_02_001.png b/GJ_GameSheet-uhd/triangle_b_square_02_001.png new file mode 100644 index 00000000..c3bc1e8f Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_b_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_c_02_001.png b/GJ_GameSheet-uhd/triangle_c_02_001.png new file mode 100644 index 00000000..7de476bd Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_c_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_c_04_001.png b/GJ_GameSheet-uhd/triangle_c_04_001.png new file mode 100644 index 00000000..41fd8aef Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_c_04_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_d_02_001.png b/GJ_GameSheet-uhd/triangle_d_02_001.png new file mode 100644 index 00000000..55fb95af Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_d_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_d_04_001.png b/GJ_GameSheet-uhd/triangle_d_04_001.png new file mode 100644 index 00000000..8c1cd743 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_d_04_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_f_02_001.png b/GJ_GameSheet-uhd/triangle_f_02_001.png new file mode 100644 index 00000000..86196fe0 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_f_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_f_04_001.png b/GJ_GameSheet-uhd/triangle_f_04_001.png new file mode 100644 index 00000000..4f480bfe Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_f_04_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_g_02_001.png b/GJ_GameSheet-uhd/triangle_g_02_001.png new file mode 100644 index 00000000..ef46af99 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_g_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_g_04_001.png b/GJ_GameSheet-uhd/triangle_g_04_001.png new file mode 100644 index 00000000..b388e236 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_g_04_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_g_square_01_001.png b/GJ_GameSheet-uhd/triangle_g_square_01_001.png new file mode 100644 index 00000000..5203f36c Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_g_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_g_square_02_001.png b/GJ_GameSheet-uhd/triangle_g_square_02_001.png new file mode 100644 index 00000000..d5312680 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_g_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_g_square_03_001.png b/GJ_GameSheet-uhd/triangle_g_square_03_001.png new file mode 100644 index 00000000..1fdb3376 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_g_square_03_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_h_01_001.png b/GJ_GameSheet-uhd/triangle_h_01_001.png new file mode 100644 index 00000000..6637b7bb Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_h_01_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_h_02_001.png b/GJ_GameSheet-uhd/triangle_h_02_001.png new file mode 100644 index 00000000..1ad58fd9 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_h_02_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_h_square_01_001.png b/GJ_GameSheet-uhd/triangle_h_square_01_001.png new file mode 100644 index 00000000..97a450f7 Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_h_square_01_001.png differ diff --git a/GJ_GameSheet-uhd/triangle_h_square_02_001.png b/GJ_GameSheet-uhd/triangle_h_square_02_001.png new file mode 100644 index 00000000..a7b5ddee Binary files /dev/null and b/GJ_GameSheet-uhd/triangle_h_square_02_001.png differ diff --git a/GJ_GameSheet-uhd/waterSplash_001.png b/GJ_GameSheet-uhd/waterSplash_001.png new file mode 100644 index 00000000..01fb5564 Binary files /dev/null and b/GJ_GameSheet-uhd/waterSplash_001.png differ diff --git a/GJ_GameSheet-uhd/waterSplash_002.png b/GJ_GameSheet-uhd/waterSplash_002.png new file mode 100644 index 00000000..413ca727 Binary files /dev/null and b/GJ_GameSheet-uhd/waterSplash_002.png differ diff --git a/GJ_GameSheet-uhd/waterSplash_003.png b/GJ_GameSheet-uhd/waterSplash_003.png new file mode 100644 index 00000000..b658bdee Binary files /dev/null and b/GJ_GameSheet-uhd/waterSplash_003.png differ diff --git a/GJ_GameSheet-uhd/waterSplash_004.png b/GJ_GameSheet-uhd/waterSplash_004.png new file mode 100644 index 00000000..eb132a80 Binary files /dev/null and b/GJ_GameSheet-uhd/waterSplash_004.png differ diff --git a/GJ_GameSheet-uhd/waterSplash_005.png b/GJ_GameSheet-uhd/waterSplash_005.png new file mode 100644 index 00000000..a71399bb Binary files /dev/null and b/GJ_GameSheet-uhd/waterSplash_005.png differ diff --git a/GJ_GameSheet-uhd/waterSplash_006.png b/GJ_GameSheet-uhd/waterSplash_006.png new file mode 100644 index 00000000..45318523 Binary files /dev/null and b/GJ_GameSheet-uhd/waterSplash_006.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_001.png b/GJ_GameSheet-uhd/waterfallAnim_001.png new file mode 100644 index 00000000..87bf45c1 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_001.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_002.png b/GJ_GameSheet-uhd/waterfallAnim_002.png new file mode 100644 index 00000000..813945a3 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_002.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_003.png b/GJ_GameSheet-uhd/waterfallAnim_003.png new file mode 100644 index 00000000..30b5e829 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_003.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_004.png b/GJ_GameSheet-uhd/waterfallAnim_004.png new file mode 100644 index 00000000..1904da64 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_004.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_005.png b/GJ_GameSheet-uhd/waterfallAnim_005.png new file mode 100644 index 00000000..ced7c76b Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_005.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_006.png b/GJ_GameSheet-uhd/waterfallAnim_006.png new file mode 100644 index 00000000..a2e9a04e Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_006.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_007.png b/GJ_GameSheet-uhd/waterfallAnim_007.png new file mode 100644 index 00000000..23ccdae9 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_007.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_008.png b/GJ_GameSheet-uhd/waterfallAnim_008.png new file mode 100644 index 00000000..3ebb6882 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_008.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_009.png b/GJ_GameSheet-uhd/waterfallAnim_009.png new file mode 100644 index 00000000..d8d3081d Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_009.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_010.png b/GJ_GameSheet-uhd/waterfallAnim_010.png new file mode 100644 index 00000000..b60655b5 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_010.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_001.png b/GJ_GameSheet-uhd/waterfallAnim_color_001.png new file mode 100644 index 00000000..9c9aad7e Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_001.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_002.png b/GJ_GameSheet-uhd/waterfallAnim_color_002.png new file mode 100644 index 00000000..5b89d398 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_002.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_003.png b/GJ_GameSheet-uhd/waterfallAnim_color_003.png new file mode 100644 index 00000000..8bd7134a Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_003.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_004.png b/GJ_GameSheet-uhd/waterfallAnim_color_004.png new file mode 100644 index 00000000..8c63dadc Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_004.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_005.png b/GJ_GameSheet-uhd/waterfallAnim_color_005.png new file mode 100644 index 00000000..4837ee79 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_005.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_006.png b/GJ_GameSheet-uhd/waterfallAnim_color_006.png new file mode 100644 index 00000000..4f44ff23 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_006.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_007.png b/GJ_GameSheet-uhd/waterfallAnim_color_007.png new file mode 100644 index 00000000..04375b58 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_007.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_008.png b/GJ_GameSheet-uhd/waterfallAnim_color_008.png new file mode 100644 index 00000000..443f7711 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_008.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_009.png b/GJ_GameSheet-uhd/waterfallAnim_color_009.png new file mode 100644 index 00000000..d4c36c37 Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_009.png differ diff --git a/GJ_GameSheet-uhd/waterfallAnim_color_010.png b/GJ_GameSheet-uhd/waterfallAnim_color_010.png new file mode 100644 index 00000000..5a377bca Binary files /dev/null and b/GJ_GameSheet-uhd/waterfallAnim_color_010.png differ diff --git a/GJ_GameSheet-uhd/whiteSquare20_001.png b/GJ_GameSheet-uhd/whiteSquare20_001.png new file mode 100644 index 00000000..c9240e77 Binary files /dev/null and b/GJ_GameSheet-uhd/whiteSquare20_001.png differ diff --git a/GJ_GameSheet-uhd/whiteSquare40_001.png b/GJ_GameSheet-uhd/whiteSquare40_001.png new file mode 100644 index 00000000..fe2fa956 Binary files /dev/null and b/GJ_GameSheet-uhd/whiteSquare40_001.png differ diff --git a/GJ_GameSheet-uhd/whiteSquare60_001.png b/GJ_GameSheet-uhd/whiteSquare60_001.png new file mode 100644 index 00000000..77b8af50 Binary files /dev/null and b/GJ_GameSheet-uhd/whiteSquare60_001.png differ diff --git a/GJ_GameSheet02-uhd/blockPiece_001_001.png b/GJ_GameSheet02-uhd/blockPiece_001_001.png new file mode 100644 index 00000000..c9240e77 Binary files /dev/null and b/GJ_GameSheet02-uhd/blockPiece_001_001.png differ diff --git a/GJ_GameSheet02-uhd/boost_01_001.png b/GJ_GameSheet02-uhd/boost_01_001.png new file mode 100644 index 00000000..629e3d59 Binary files /dev/null and b/GJ_GameSheet02-uhd/boost_01_001.png differ diff --git a/GJ_GameSheet02-uhd/boost_02_001.png b/GJ_GameSheet02-uhd/boost_02_001.png new file mode 100644 index 00000000..72de75f3 Binary files /dev/null and b/GJ_GameSheet02-uhd/boost_02_001.png differ diff --git a/GJ_GameSheet02-uhd/boost_03_001.png b/GJ_GameSheet02-uhd/boost_03_001.png new file mode 100644 index 00000000..7549a701 Binary files /dev/null and b/GJ_GameSheet02-uhd/boost_03_001.png differ diff --git a/GJ_GameSheet02-uhd/boost_04_001.png b/GJ_GameSheet02-uhd/boost_04_001.png new file mode 100644 index 00000000..704bce76 Binary files /dev/null and b/GJ_GameSheet02-uhd/boost_04_001.png differ diff --git a/GJ_GameSheet02-uhd/boost_05_001.png b/GJ_GameSheet02-uhd/boost_05_001.png new file mode 100644 index 00000000..5a3449bc Binary files /dev/null and b/GJ_GameSheet02-uhd/boost_05_001.png differ diff --git a/GJ_GameSheet02-uhd/bush_01_001.png b/GJ_GameSheet02-uhd/bush_01_001.png new file mode 100644 index 00000000..b0ccce14 Binary files /dev/null and b/GJ_GameSheet02-uhd/bush_01_001.png differ diff --git a/GJ_GameSheet02-uhd/bush_01_color_001.png b/GJ_GameSheet02-uhd/bush_01_color_001.png new file mode 100644 index 00000000..75d3a54a Binary files /dev/null and b/GJ_GameSheet02-uhd/bush_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/bush_02_001.png b/GJ_GameSheet02-uhd/bush_02_001.png new file mode 100644 index 00000000..a0c5004c Binary files /dev/null and b/GJ_GameSheet02-uhd/bush_02_001.png differ diff --git a/GJ_GameSheet02-uhd/bush_02_color_001.png b/GJ_GameSheet02-uhd/bush_02_color_001.png new file mode 100644 index 00000000..7db77f6b Binary files /dev/null and b/GJ_GameSheet02-uhd/bush_02_color_001.png differ diff --git a/GJ_GameSheet02-uhd/bush_03_001.png b/GJ_GameSheet02-uhd/bush_03_001.png new file mode 100644 index 00000000..9c59b770 Binary files /dev/null and b/GJ_GameSheet02-uhd/bush_03_001.png differ diff --git a/GJ_GameSheet02-uhd/bush_03_color_001.png b/GJ_GameSheet02-uhd/bush_03_color_001.png new file mode 100644 index 00000000..1930870e Binary files /dev/null and b/GJ_GameSheet02-uhd/bush_03_color_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_01_001.png b/GJ_GameSheet02-uhd/checkpoint_01_001.png new file mode 100644 index 00000000..f07f54bb Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_01_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_01_color_001.png b/GJ_GameSheet02-uhd/checkpoint_01_color_001.png new file mode 100644 index 00000000..6e118a2b Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_01_glow_001.png b/GJ_GameSheet02-uhd/checkpoint_01_glow_001.png new file mode 100644 index 00000000..174f4f69 Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_01_glow_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_01_shine_001.png b/GJ_GameSheet02-uhd/checkpoint_01_shine_001.png new file mode 100644 index 00000000..0faf273f Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_01_shine_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_d_01_001.png b/GJ_GameSheet02-uhd/checkpoint_d_01_001.png new file mode 100644 index 00000000..2e9a25b3 Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_d_01_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_d_01_color_001.png b/GJ_GameSheet02-uhd/checkpoint_d_01_color_001.png new file mode 100644 index 00000000..54509e80 Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_d_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_d_02_001.png b/GJ_GameSheet02-uhd/checkpoint_d_02_001.png new file mode 100644 index 00000000..acc468ae Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_d_02_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_d_02_color_001.png b/GJ_GameSheet02-uhd/checkpoint_d_02_color_001.png new file mode 100644 index 00000000..c363a421 Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_d_02_color_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_d_03_001.png b/GJ_GameSheet02-uhd/checkpoint_d_03_001.png new file mode 100644 index 00000000..e83190a3 Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_d_03_001.png differ diff --git a/GJ_GameSheet02-uhd/checkpoint_d_03_color_001.png b/GJ_GameSheet02-uhd/checkpoint_d_03_color_001.png new file mode 100644 index 00000000..9da7ae82 Binary files /dev/null and b/GJ_GameSheet02-uhd/checkpoint_d_03_color_001.png differ diff --git a/GJ_GameSheet02-uhd/d_time01_001.png b/GJ_GameSheet02-uhd/d_time01_001.png new file mode 100644 index 00000000..481e6304 Binary files /dev/null and b/GJ_GameSheet02-uhd/d_time01_001.png differ diff --git a/GJ_GameSheet02-uhd/d_time01_color_001.png b/GJ_GameSheet02-uhd/d_time01_color_001.png new file mode 100644 index 00000000..03db5623 Binary files /dev/null and b/GJ_GameSheet02-uhd/d_time01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_01_001.png b/GJ_GameSheet02-uhd/edge_01_01_001.png new file mode 100644 index 00000000..7f873cbd Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_01_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_01_color_001.png b/GJ_GameSheet02-uhd/edge_01_01_color_001.png new file mode 100644 index 00000000..0da75d57 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_02_001.png b/GJ_GameSheet02-uhd/edge_01_02_001.png new file mode 100644 index 00000000..1b06a021 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_02_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_02_color_001.png b/GJ_GameSheet02-uhd/edge_01_02_color_001.png new file mode 100644 index 00000000..5d34b1b2 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_02_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_03_001.png b/GJ_GameSheet02-uhd/edge_01_03_001.png new file mode 100644 index 00000000..76f2ffb6 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_03_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_03_color_001.png b/GJ_GameSheet02-uhd/edge_01_03_color_001.png new file mode 100644 index 00000000..f4fb8776 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_03_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_04_001.png b/GJ_GameSheet02-uhd/edge_01_04_001.png new file mode 100644 index 00000000..4e6ae32f Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_04_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_04_color_001.png b/GJ_GameSheet02-uhd/edge_01_04_color_001.png new file mode 100644 index 00000000..72bc8c33 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_04_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_05_001.png b/GJ_GameSheet02-uhd/edge_01_05_001.png new file mode 100644 index 00000000..5d9a8cd6 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_05_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_05_color_001.png b/GJ_GameSheet02-uhd/edge_01_05_color_001.png new file mode 100644 index 00000000..9586f413 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_05_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_06_001.png b/GJ_GameSheet02-uhd/edge_01_06_001.png new file mode 100644 index 00000000..c9240e77 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_06_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_07_001.png b/GJ_GameSheet02-uhd/edge_01_07_001.png new file mode 100644 index 00000000..3870b0b5 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_07_001.png differ diff --git a/GJ_GameSheet02-uhd/edge_01_07_color_001.png b/GJ_GameSheet02-uhd/edge_01_07_color_001.png new file mode 100644 index 00000000..5d34b1b2 Binary files /dev/null and b/GJ_GameSheet02-uhd/edge_01_07_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAdvFollowBtn_001.png b/GJ_GameSheet02-uhd/edit_eAdvFollowBtn_001.png new file mode 100644 index 00000000..4763ef95 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAdvFollowBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAdvRandomBtn_001.png b/GJ_GameSheet02-uhd/edit_eAdvRandomBtn_001.png new file mode 100644 index 00000000..c4293771 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAdvRandomBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAlphaBtn_001.png b/GJ_GameSheet02-uhd/edit_eAlphaBtn_001.png new file mode 100644 index 00000000..b3b7c6f7 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAlphaBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAnimateBtn_001.png b/GJ_GameSheet02-uhd/edit_eAnimateBtn_001.png new file mode 100644 index 00000000..2d9653ee Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAnimateBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAreaFadeBtn_001.png b/GJ_GameSheet02-uhd/edit_eAreaFadeBtn_001.png new file mode 100644 index 00000000..93c5b888 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAreaFadeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAreaMoveBtn_001.png b/GJ_GameSheet02-uhd/edit_eAreaMoveBtn_001.png new file mode 100644 index 00000000..1375bccd Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAreaMoveBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAreaRotateBtn_001.png b/GJ_GameSheet02-uhd/edit_eAreaRotateBtn_001.png new file mode 100644 index 00000000..ab382966 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAreaRotateBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAreaScaleBtn_001.png b/GJ_GameSheet02-uhd/edit_eAreaScaleBtn_001.png new file mode 100644 index 00000000..a54e3d8a Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAreaScaleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAreaStopBtn_001.png b/GJ_GameSheet02-uhd/edit_eAreaStopBtn_001.png new file mode 100644 index 00000000..b5bd1dac Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAreaStopBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eAreaTintBtn_001.png b/GJ_GameSheet02-uhd/edit_eAreaTintBtn_001.png new file mode 100644 index 00000000..6f2a8a11 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eAreaTintBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eBGEOff_001.png b/GJ_GameSheet02-uhd/edit_eBGEOff_001.png new file mode 100644 index 00000000..3f077ff5 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eBGEOff_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eBGEOn_001.png b/GJ_GameSheet02-uhd/edit_eBGEOn_001.png new file mode 100644 index 00000000..f81d7f1e Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eBGEOn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eBGSpeedBtn_001.png b/GJ_GameSheet02-uhd/edit_eBGSpeedBtn_001.png new file mode 100644 index 00000000..7723d5e1 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eBGSpeedBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eBPMBtn_001.png b/GJ_GameSheet02-uhd/edit_eBPMBtn_001.png new file mode 100644 index 00000000..22040c66 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eBPMBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCParticleBtn_001.png b/GJ_GameSheet02-uhd/edit_eCParticleBtn_001.png new file mode 100644 index 00000000..00625e98 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCParticleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCParticleBtn_color_001.png b/GJ_GameSheet02-uhd/edit_eCParticleBtn_color_001.png new file mode 100644 index 00000000..ffa344fe Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCParticleBtn_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCamGuideBtn_001.png b/GJ_GameSheet02-uhd/edit_eCamGuideBtn_001.png new file mode 100644 index 00000000..69669816 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCamGuideBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCamModeBtn_001.png b/GJ_GameSheet02-uhd/edit_eCamModeBtn_001.png new file mode 100644 index 00000000..6f238bb5 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCamModeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCamRotBtn_001.png b/GJ_GameSheet02-uhd/edit_eCamRotBtn_001.png new file mode 100644 index 00000000..3e48ee62 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCamRotBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eChangeBG_001.png b/GJ_GameSheet02-uhd/edit_eChangeBG_001.png new file mode 100644 index 00000000..f0fda98b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eChangeBG_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eChangeG_001.png b/GJ_GameSheet02-uhd/edit_eChangeG_001.png new file mode 100644 index 00000000..1c5a2511 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eChangeG_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eChangeMG_001.png b/GJ_GameSheet02-uhd/edit_eChangeMG_001.png new file mode 100644 index 00000000..a5b9fd8a Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eChangeMG_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCollisionBlock01_001.png b/GJ_GameSheet02-uhd/edit_eCollisionBlock01_001.png new file mode 100644 index 00000000..c50dd4cf Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCollisionBlock01_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCollisionBtn_001.png b/GJ_GameSheet02-uhd/edit_eCollisionBtn_001.png new file mode 100644 index 00000000..2fbd6024 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCollisionBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCollisionStateBtn_001.png b/GJ_GameSheet02-uhd/edit_eCollisionStateBtn_001.png new file mode 100644 index 00000000..cdd056fb Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCollisionStateBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCountBtn_001.png b/GJ_GameSheet02-uhd/edit_eCountBtn_001.png new file mode 100644 index 00000000..02d36950 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCountBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eCounterBtn_001.png b/GJ_GameSheet02-uhd/edit_eCounterBtn_001.png new file mode 100644 index 00000000..0df57954 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eCounterBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eDamageCircle_001.png b/GJ_GameSheet02-uhd/edit_eDamageCircle_001.png new file mode 100644 index 00000000..f00a068f Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eDamageCircle_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eDamageSquare_001.png b/GJ_GameSheet02-uhd/edit_eDamageSquare_001.png new file mode 100644 index 00000000..67342a09 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eDamageSquare_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEAreaFadeBtn_001.png b/GJ_GameSheet02-uhd/edit_eEAreaFadeBtn_001.png new file mode 100644 index 00000000..6ec3a555 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEAreaFadeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEAreaMoveBtn_001.png b/GJ_GameSheet02-uhd/edit_eEAreaMoveBtn_001.png new file mode 100644 index 00000000..f7b600de Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEAreaMoveBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEAreaRotateBtn_001.png b/GJ_GameSheet02-uhd/edit_eEAreaRotateBtn_001.png new file mode 100644 index 00000000..7a168983 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEAreaRotateBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEAreaScaleBtn_001.png b/GJ_GameSheet02-uhd/edit_eEAreaScaleBtn_001.png new file mode 100644 index 00000000..28428796 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEAreaScaleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEAreaTintBtn_001.png b/GJ_GameSheet02-uhd/edit_eEAreaTintBtn_001.png new file mode 100644 index 00000000..b24a3fc8 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEAreaTintBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEdgeBtn_001.png b/GJ_GameSheet02-uhd/edit_eEdgeBtn_001.png new file mode 100644 index 00000000..e1053085 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEdgeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEditAdvFollowBtn_001.png b/GJ_GameSheet02-uhd/edit_eEditAdvFollowBtn_001.png new file mode 100644 index 00000000..606d07f5 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEditAdvFollowBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEditSFXBtn_001.png b/GJ_GameSheet02-uhd/edit_eEditSFXBtn_001.png new file mode 100644 index 00000000..3adaca8b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEditSFXBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEditSongBtn_001.png b/GJ_GameSheet02-uhd/edit_eEditSongBtn_001.png new file mode 100644 index 00000000..0e839fcd Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEditSongBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEndBtn_001.png b/GJ_GameSheet02-uhd/edit_eEndBtn_001.png new file mode 100644 index 00000000..a6f1c51d Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEndBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEndPlatBtn_001.png b/GJ_GameSheet02-uhd/edit_eEndPlatBtn_001.png new file mode 100644 index 00000000..6f30d998 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEndPlatBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEnterFadeBtn_001.png b/GJ_GameSheet02-uhd/edit_eEnterFadeBtn_001.png new file mode 100644 index 00000000..735acc46 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEnterFadeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEnterMoveBtn_001.png b/GJ_GameSheet02-uhd/edit_eEnterMoveBtn_001.png new file mode 100644 index 00000000..ed0d88f5 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEnterMoveBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEnterRotateBtn_001.png b/GJ_GameSheet02-uhd/edit_eEnterRotateBtn_001.png new file mode 100644 index 00000000..7fabc8d0 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEnterRotateBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEnterScaleBtn_001.png b/GJ_GameSheet02-uhd/edit_eEnterScaleBtn_001.png new file mode 100644 index 00000000..22800964 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEnterScaleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEnterStopBtn_001.png b/GJ_GameSheet02-uhd/edit_eEnterStopBtn_001.png new file mode 100644 index 00000000..d2a62290 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEnterStopBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEnterTintBtn_001.png b/GJ_GameSheet02-uhd/edit_eEnterTintBtn_001.png new file mode 100644 index 00000000..7e195991 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEnterTintBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eEventLinkBtn_001.png b/GJ_GameSheet02-uhd/edit_eEventLinkBtn_001.png new file mode 100644 index 00000000..48904c19 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eEventLinkBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eFollowComBtn_001.png b/GJ_GameSheet02-uhd/edit_eFollowComBtn_001.png new file mode 100644 index 00000000..d8869be6 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eFollowComBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eFollowPComBtn_001.png b/GJ_GameSheet02-uhd/edit_eFollowPComBtn_001.png new file mode 100644 index 00000000..6d660d56 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eFollowPComBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eForceBlock01_001.png b/GJ_GameSheet02-uhd/edit_eForceBlock01_001.png new file mode 100644 index 00000000..dba7bcbb Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eForceBlock01_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eForceBlock02_001.png b/GJ_GameSheet02-uhd/edit_eForceBlock02_001.png new file mode 100644 index 00000000..131b1a8f Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eForceBlock02_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eGPOffsetBtn_001.png b/GJ_GameSheet02-uhd/edit_eGPOffsetBtn_001.png new file mode 100644 index 00000000..d8c33723 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eGPOffsetBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eGameRotBtn_001.png b/GJ_GameSheet02-uhd/edit_eGameRotBtn_001.png new file mode 100644 index 00000000..f1730612 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eGameRotBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eGhostDBtn_001.png b/GJ_GameSheet02-uhd/edit_eGhostDBtn_001.png new file mode 100644 index 00000000..2b1ba25f Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eGhostDBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eGhostEBtn_001.png b/GJ_GameSheet02-uhd/edit_eGhostEBtn_001.png new file mode 100644 index 00000000..2f9268bb Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eGhostEBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eGradientBtn_001.png b/GJ_GameSheet02-uhd/edit_eGradientBtn_001.png new file mode 100644 index 00000000..b8c778ae Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eGradientBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eGradientBtn_color_001.png b/GJ_GameSheet02-uhd/edit_eGradientBtn_color_001.png new file mode 100644 index 00000000..dc16f241 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eGradientBtn_color_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eGravity_001.png b/GJ_GameSheet02-uhd/edit_eGravity_001.png new file mode 100644 index 00000000..c9852204 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eGravity_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eInstantCollisionBtn_001.png b/GJ_GameSheet02-uhd/edit_eInstantCollisionBtn_001.png new file mode 100644 index 00000000..3637ea9c Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eInstantCollisionBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eInstantCountBtn_001.png b/GJ_GameSheet02-uhd/edit_eInstantCountBtn_001.png new file mode 100644 index 00000000..690805a9 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eInstantCountBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eItemCompBtn_001.png b/GJ_GameSheet02-uhd/edit_eItemCompBtn_001.png new file mode 100644 index 00000000..6edcbfea Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eItemCompBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eItemEditBtn_001.png b/GJ_GameSheet02-uhd/edit_eItemEditBtn_001.png new file mode 100644 index 00000000..57a9e5ab Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eItemEditBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eItemPersBtn_001.png b/GJ_GameSheet02-uhd/edit_eItemPersBtn_001.png new file mode 100644 index 00000000..3ff6f27b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eItemPersBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eKeyframeBtn_001.png b/GJ_GameSheet02-uhd/edit_eKeyframeBtn_001.png new file mode 100644 index 00000000..8e38a97b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eKeyframeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eLinkVisibleBtn_001.png b/GJ_GameSheet02-uhd/edit_eLinkVisibleBtn_001.png new file mode 100644 index 00000000..b56bf1ba Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eLinkVisibleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eMGSpeedBtn_001.png b/GJ_GameSheet02-uhd/edit_eMGSpeedBtn_001.png new file mode 100644 index 00000000..359e4e0c Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eMGSpeedBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eMoveComBtn_001.png b/GJ_GameSheet02-uhd/edit_eMoveComBtn_001.png new file mode 100644 index 00000000..d2622697 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eMoveComBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eOffsetBtn_001.png b/GJ_GameSheet02-uhd/edit_eOffsetBtn_001.png new file mode 100644 index 00000000..97f8fdfd Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eOffsetBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eOnDeathBtn_001.png b/GJ_GameSheet02-uhd/edit_eOnDeathBtn_001.png new file mode 100644 index 00000000..b8af31b6 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eOnDeathBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eOptionsBtn_001.png b/GJ_GameSheet02-uhd/edit_eOptionsBtn_001.png new file mode 100644 index 00000000..10c49bf6 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eOptionsBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_ePHideBtn_001.png b/GJ_GameSheet02-uhd/edit_ePHideBtn_001.png new file mode 100644 index 00000000..eeb303cd Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_ePHideBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_ePShowBtn_001.png b/GJ_GameSheet02-uhd/edit_ePShowBtn_001.png new file mode 100644 index 00000000..9292b37c Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_ePShowBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_ePauseBtn_001.png b/GJ_GameSheet02-uhd/edit_ePauseBtn_001.png new file mode 100644 index 00000000..e9a7db29 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_ePauseBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_ePickupBtn_001.png b/GJ_GameSheet02-uhd/edit_ePickupBtn_001.png new file mode 100644 index 00000000..4b8d2e27 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_ePickupBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_ePlayerControlBtn_001.png b/GJ_GameSheet02-uhd/edit_ePlayerControlBtn_001.png new file mode 100644 index 00000000..ae1bdf32 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_ePlayerControlBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_ePlayerTouchBtn_001.png b/GJ_GameSheet02-uhd/edit_ePlayerTouchBtn_001.png new file mode 100644 index 00000000..96188503 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_ePlayerTouchBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_ePulseBtn_001.png b/GJ_GameSheet02-uhd/edit_ePulseBtn_001.png new file mode 100644 index 00000000..ee97ea0b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_ePulseBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eRandomBtn_001.png b/GJ_GameSheet02-uhd/edit_eRandomBtn_001.png new file mode 100644 index 00000000..8794f860 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eRandomBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eReAdvFollowBtn_001.png b/GJ_GameSheet02-uhd/edit_eReAdvFollowBtn_001.png new file mode 100644 index 00000000..474d4f91 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eReAdvFollowBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eReleaseJumpBtn_001.png b/GJ_GameSheet02-uhd/edit_eReleaseJumpBtn_001.png new file mode 100644 index 00000000..ae1bdf32 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eReleaseJumpBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eResetBtn_001.png b/GJ_GameSheet02-uhd/edit_eResetBtn_001.png new file mode 100644 index 00000000..1f4d67fd Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eResetBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eResumeBtn_001.png b/GJ_GameSheet02-uhd/edit_eResumeBtn_001.png new file mode 100644 index 00000000..72a1867c Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eResumeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eReverseBtn_001.png b/GJ_GameSheet02-uhd/edit_eReverseBtn_001.png new file mode 100644 index 00000000..ed6fdf4d Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eReverseBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eRotateComBtn_001.png b/GJ_GameSheet02-uhd/edit_eRotateComBtn_001.png new file mode 100644 index 00000000..6a15e3fa Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eRotateComBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSFXBtn_001.png b/GJ_GameSheet02-uhd/edit_eSFXBtn_001.png new file mode 100644 index 00000000..3ab1d9bd Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSFXBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eScaleComBtn_001.png b/GJ_GameSheet02-uhd/edit_eScaleComBtn_001.png new file mode 100644 index 00000000..78fe5960 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eScaleComBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSequenceBtn_001.png b/GJ_GameSheet02-uhd/edit_eSequenceBtn_001.png new file mode 100644 index 00000000..16e46527 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSequenceBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSetupMGBtn_001.png b/GJ_GameSheet02-uhd/edit_eSetupMGBtn_001.png new file mode 100644 index 00000000..34acbd43 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSetupMGBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_BulgeBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_BulgeBtn_001.png new file mode 100644 index 00000000..0bd12224 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_BulgeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_ChromaticBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_ChromaticBtn_001.png new file mode 100644 index 00000000..93430451 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_ChromaticBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_ChromaticGlitchBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_ChromaticGlitchBtn_001.png new file mode 100644 index 00000000..b705b38b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_ChromaticGlitchBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_EditColorBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_EditColorBtn_001.png new file mode 100644 index 00000000..f50fc1bb Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_EditColorBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_GlitchBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_GlitchBtn_001.png new file mode 100644 index 00000000..37176d76 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_GlitchBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_GrayscaleBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_GrayscaleBtn_001.png new file mode 100644 index 00000000..28d2aa74 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_GrayscaleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_HueBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_HueBtn_001.png new file mode 100644 index 00000000..962d293b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_HueBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_InvertColorBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_InvertColorBtn_001.png new file mode 100644 index 00000000..14e10737 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_InvertColorBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_LensCircleBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_LensCircleBtn_001.png new file mode 100644 index 00000000..3129447c Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_LensCircleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_MotionBlurBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_MotionBlurBtn_001.png new file mode 100644 index 00000000..85e7ecd2 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_MotionBlurBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_PinchBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_PinchBtn_001.png new file mode 100644 index 00000000..af537464 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_PinchBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_PixelateBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_PixelateBtn_001.png new file mode 100644 index 00000000..67d761b0 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_PixelateBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_RadialBlurBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_RadialBlurBtn_001.png new file mode 100644 index 00000000..df9b5d38 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_RadialBlurBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_SepiaBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_SepiaBtn_001.png new file mode 100644 index 00000000..4c2b416b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_SepiaBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_ShockLineBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_ShockLineBtn_001.png new file mode 100644 index 00000000..10649725 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_ShockLineBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_ShockWaveBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_ShockWaveBtn_001.png new file mode 100644 index 00000000..5bafc926 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_ShockWaveBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSh_SplitScreenBtn_001.png b/GJ_GameSheet02-uhd/edit_eSh_SplitScreenBtn_001.png new file mode 100644 index 00000000..cc01dbc2 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSh_SplitScreenBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eShaderBtn_001.png b/GJ_GameSheet02-uhd/edit_eShaderBtn_001.png new file mode 100644 index 00000000..18db0472 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eShaderBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eShakeBtn_001.png b/GJ_GameSheet02-uhd/edit_eShakeBtn_001.png new file mode 100644 index 00000000..1a8e08f1 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eShakeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSongBtn_001.png b/GJ_GameSheet02-uhd/edit_eSongBtn_001.png new file mode 100644 index 00000000..50f382e6 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSongBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSpawnBtn_001.png b/GJ_GameSheet02-uhd/edit_eSpawnBtn_001.png new file mode 100644 index 00000000..271ba636 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSpawnBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eSpawnParticleBtn_001.png b/GJ_GameSheet02-uhd/edit_eSpawnParticleBtn_001.png new file mode 100644 index 00000000..13892d3d Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eSpawnParticleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eStartPosBtn_001.png b/GJ_GameSheet02-uhd/edit_eStartPosBtn_001.png new file mode 100644 index 00000000..b3214a05 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eStartPosBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eStaticBtn_001.png b/GJ_GameSheet02-uhd/edit_eStaticBtn_001.png new file mode 100644 index 00000000..11fe8781 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eStaticBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eStopMoverBtn_001.png b/GJ_GameSheet02-uhd/edit_eStopMoverBtn_001.png new file mode 100644 index 00000000..2d9608f1 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eStopMoverBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eTeleportBtn_001.png b/GJ_GameSheet02-uhd/edit_eTeleportBtn_001.png new file mode 100644 index 00000000..76601703 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eTeleportBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eTimeBtn_001.png b/GJ_GameSheet02-uhd/edit_eTimeBtn_001.png new file mode 100644 index 00000000..f142e99a Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eTimeBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eTimeControlBtn_001.png b/GJ_GameSheet02-uhd/edit_eTimeControlBtn_001.png new file mode 100644 index 00000000..164bfa23 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eTimeControlBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eTimeEventBtn_001.png b/GJ_GameSheet02-uhd/edit_eTimeEventBtn_001.png new file mode 100644 index 00000000..ff6d959a Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eTimeEventBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eTimeWarpBtn_001.png b/GJ_GameSheet02-uhd/edit_eTimeWarpBtn_001.png new file mode 100644 index 00000000..24ad2982 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eTimeWarpBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eTintCol01Btn_001.png b/GJ_GameSheet02-uhd/edit_eTintCol01Btn_001.png new file mode 100644 index 00000000..81596ce9 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eTintCol01Btn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eToggleBtn2_001.png b/GJ_GameSheet02-uhd/edit_eToggleBtn2_001.png new file mode 100644 index 00000000..15770bbd Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eToggleBtn2_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eToggleBtn_001.png b/GJ_GameSheet02-uhd/edit_eToggleBtn_001.png new file mode 100644 index 00000000..6b158f30 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eToggleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eTouchBtn_001.png b/GJ_GameSheet02-uhd/edit_eTouchBtn_001.png new file mode 100644 index 00000000..a0d1cd0a Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eTouchBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eUISettingsBtn_001.png b/GJ_GameSheet02-uhd/edit_eUISettingsBtn_001.png new file mode 100644 index 00000000..5512f7e6 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eUISettingsBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eZoomBtn_001.png b/GJ_GameSheet02-uhd/edit_eZoomBtn_001.png new file mode 100644 index 00000000..b8cafd93 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eZoomBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFABtn_001.png b/GJ_GameSheet02-uhd/edit_eeFABtn_001.png new file mode 100644 index 00000000..7cd3bf5a Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFABtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFALBtn_001.png b/GJ_GameSheet02-uhd/edit_eeFALBtn_001.png new file mode 100644 index 00000000..e31b9a74 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFALBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFARBtn_001.png b/GJ_GameSheet02-uhd/edit_eeFARBtn_001.png new file mode 100644 index 00000000..4cc98ea4 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFARBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFBBtn_001.png b/GJ_GameSheet02-uhd/edit_eeFBBtn_001.png new file mode 100644 index 00000000..3d256519 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFBBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFLBtn_001.png b/GJ_GameSheet02-uhd/edit_eeFLBtn_001.png new file mode 100644 index 00000000..d10ca44a Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFLBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFRBtn_001.png b/GJ_GameSheet02-uhd/edit_eeFRBtn_001.png new file mode 100644 index 00000000..19c79d6e Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFRBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFRHBtn_001.png b/GJ_GameSheet02-uhd/edit_eeFRHBtn_001.png new file mode 100644 index 00000000..e4cfbcca Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFRHBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFRHInvBtn_001.png b/GJ_GameSheet02-uhd/edit_eeFRHInvBtn_001.png new file mode 100644 index 00000000..1974ffa2 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFRHInvBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeFTBtn_001.png b/GJ_GameSheet02-uhd/edit_eeFTBtn_001.png new file mode 100644 index 00000000..a0897105 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeFTBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeNone2Btn_001.png b/GJ_GameSheet02-uhd/edit_eeNone2Btn_001.png new file mode 100644 index 00000000..ee485a4e Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeNone2Btn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeNoneBtn_001.png b/GJ_GameSheet02-uhd/edit_eeNoneBtn_001.png new file mode 100644 index 00000000..ebdf52db Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeNoneBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeSDBtn_001.png b/GJ_GameSheet02-uhd/edit_eeSDBtn_001.png new file mode 100644 index 00000000..e36b8ffe Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeSDBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_eeSUBtn_001.png b/GJ_GameSheet02-uhd/edit_eeSUBtn_001.png new file mode 100644 index 00000000..81864d08 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_eeSUBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_scaleBtn_001.png b/GJ_GameSheet02-uhd/edit_scaleBtn_001.png new file mode 100644 index 00000000..6057a745 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_scaleBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_scaleXYBtn_001.png b/GJ_GameSheet02-uhd/edit_scaleXYBtn_001.png new file mode 100644 index 00000000..5fe62a3b Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_scaleXYBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/edit_warpBtn_001.png b/GJ_GameSheet02-uhd/edit_warpBtn_001.png new file mode 100644 index 00000000..d0588102 Binary files /dev/null and b/GJ_GameSheet02-uhd/edit_warpBtn_001.png differ diff --git a/GJ_GameSheet02-uhd/floorLine_01_001.png b/GJ_GameSheet02-uhd/floorLine_01_001.png new file mode 100644 index 00000000..dcf5d736 Binary files /dev/null and b/GJ_GameSheet02-uhd/floorLine_01_001.png differ diff --git a/GJ_GameSheet02-uhd/floorLine_02_001.png b/GJ_GameSheet02-uhd/floorLine_02_001.png new file mode 100644 index 00000000..c3733707 Binary files /dev/null and b/GJ_GameSheet02-uhd/floorLine_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_001.png b/GJ_GameSheet02-uhd/gdh_01_1_001.png new file mode 100644 index 00000000..484bdd1b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_01_001.png b/GJ_GameSheet02-uhd/gdh_01_1_01_001.png new file mode 100644 index 00000000..ccbee302 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_01_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_01_o_001.png new file mode 100644 index 00000000..7172f477 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_01_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_01_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_01_s_001.png new file mode 100644 index 00000000..c9aa5515 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_01_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_01b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_01b_001.png new file mode 100644 index 00000000..f5e6a29a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_01b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_01b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_01b_o_001.png new file mode 100644 index 00000000..6e9aca15 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_01b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_01b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_01b_s_001.png new file mode 100644 index 00000000..49a72a25 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_01b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_02_001.png b/GJ_GameSheet02-uhd/gdh_01_1_02_001.png new file mode 100644 index 00000000..84cd5b77 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_02_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_02_o_001.png new file mode 100644 index 00000000..32aef249 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_02_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_02_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_02_s_001.png new file mode 100644 index 00000000..73a821c2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_02_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_02b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_02b_001.png new file mode 100644 index 00000000..e8e2abc4 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_02b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_02b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_02b_o_001.png new file mode 100644 index 00000000..1da06761 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_02b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_02b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_02b_s_001.png new file mode 100644 index 00000000..9f6e8093 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_02b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_03_001.png b/GJ_GameSheet02-uhd/gdh_01_1_03_001.png new file mode 100644 index 00000000..8b25887e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_03_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_03_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_03_o_001.png new file mode 100644 index 00000000..8972b0ce Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_03_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_03_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_03_s_001.png new file mode 100644 index 00000000..003a96a0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_03_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_03b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_03b_001.png new file mode 100644 index 00000000..868f045d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_03b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_03b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_03b_o_001.png new file mode 100644 index 00000000..ff252c3f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_03b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_03b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_03b_s_001.png new file mode 100644 index 00000000..971ddcdf Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_03b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_04_001.png b/GJ_GameSheet02-uhd/gdh_01_1_04_001.png new file mode 100644 index 00000000..6781dcab Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_04_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_04_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_04_o_001.png new file mode 100644 index 00000000..b6ae369c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_04_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_04_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_04_s_001.png new file mode 100644 index 00000000..49ff096b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_04_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_04b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_04b_001.png new file mode 100644 index 00000000..371760fb Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_04b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_04b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_04b_o_001.png new file mode 100644 index 00000000..f99f5e82 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_04b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_04b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_04b_s_001.png new file mode 100644 index 00000000..a9eaab96 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_04b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_05_001.png b/GJ_GameSheet02-uhd/gdh_01_1_05_001.png new file mode 100644 index 00000000..7ffdbefa Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_05_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_05_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_05_2_001.png new file mode 100644 index 00000000..bfa7f361 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_05_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_05_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_05_o_001.png new file mode 100644 index 00000000..3c670e2a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_05_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_05_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_05_s_001.png new file mode 100644 index 00000000..3ba7e9ca Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_05_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_05b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_05b_001.png new file mode 100644 index 00000000..8bed135c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_05b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_05b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_05b_2_001.png new file mode 100644 index 00000000..ea28b099 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_05b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_05b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_05b_o_001.png new file mode 100644 index 00000000..70bd7eed Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_05b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_05b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_05b_s_001.png new file mode 100644 index 00000000..263f0e9d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_05b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_06_001.png b/GJ_GameSheet02-uhd/gdh_01_1_06_001.png new file mode 100644 index 00000000..1d7ab180 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_06_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_06_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_06_2_001.png new file mode 100644 index 00000000..bb3036ad Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_06_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_06_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_06_o_001.png new file mode 100644 index 00000000..ae49a2ba Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_06_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_06_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_06_s_001.png new file mode 100644 index 00000000..b40343ff Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_06_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_06b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_06b_001.png new file mode 100644 index 00000000..cf4514a8 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_06b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_06b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_06b_2_001.png new file mode 100644 index 00000000..7e8d252a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_06b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_06b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_06b_o_001.png new file mode 100644 index 00000000..9229fb9b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_06b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_06b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_06b_s_001.png new file mode 100644 index 00000000..8f2d7faf Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_06b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_07_001.png b/GJ_GameSheet02-uhd/gdh_01_1_07_001.png new file mode 100644 index 00000000..92887f4a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_07_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_07_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_07_2_001.png new file mode 100644 index 00000000..f9106171 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_07_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_07b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_07b_001.png new file mode 100644 index 00000000..0f92a30f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_07b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_07b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_07b_2_001.png new file mode 100644 index 00000000..6d957d61 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_07b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_08_001.png b/GJ_GameSheet02-uhd/gdh_01_1_08_001.png new file mode 100644 index 00000000..9dc30f6f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_08_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_08_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_08_2_001.png new file mode 100644 index 00000000..c91a99e5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_08_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_08b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_08b_001.png new file mode 100644 index 00000000..798bc610 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_08b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_08b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_08b_2_001.png new file mode 100644 index 00000000..b3277949 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_08b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_09_001.png b/GJ_GameSheet02-uhd/gdh_01_1_09_001.png new file mode 100644 index 00000000..72014b9e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_09_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_09_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_09_2_001.png new file mode 100644 index 00000000..f7d7db68 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_09_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_09b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_09b_001.png new file mode 100644 index 00000000..bb6317c5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_09b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_09b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_09b_2_001.png new file mode 100644 index 00000000..aa6f4171 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_09b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_10_001.png b/GJ_GameSheet02-uhd/gdh_01_1_10_001.png new file mode 100644 index 00000000..386d7e0a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_10_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_10_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_10_2_001.png new file mode 100644 index 00000000..1e99da6e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_10_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_10b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_10b_001.png new file mode 100644 index 00000000..ba0999f6 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_10b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_10b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_10b_2_001.png new file mode 100644 index 00000000..01131979 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_10b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_11_001.png b/GJ_GameSheet02-uhd/gdh_01_1_11_001.png new file mode 100644 index 00000000..fd1ec307 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_11_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_11_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_11_2_001.png new file mode 100644 index 00000000..4e46f50c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_11_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_11_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_11_o_001.png new file mode 100644 index 00000000..44518278 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_11_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_11_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_11_s_001.png new file mode 100644 index 00000000..f8e25623 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_11_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_11b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_11b_001.png new file mode 100644 index 00000000..35c3b4cc Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_11b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_11b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_11b_2_001.png new file mode 100644 index 00000000..5ab1bd14 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_11b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_11b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_11b_o_001.png new file mode 100644 index 00000000..b9a52b8c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_11b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_11b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_11b_s_001.png new file mode 100644 index 00000000..02549836 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_11b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_12_001.png b/GJ_GameSheet02-uhd/gdh_01_1_12_001.png new file mode 100644 index 00000000..ebb2c125 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_12_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_12_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_12_2_001.png new file mode 100644 index 00000000..7ca37cda Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_12_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_12_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_12_o_001.png new file mode 100644 index 00000000..96c28ee8 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_12_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_12_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_12_s_001.png new file mode 100644 index 00000000..6fb0e504 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_12_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_12b_001.png b/GJ_GameSheet02-uhd/gdh_01_1_12b_001.png new file mode 100644 index 00000000..80840eec Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_12b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_12b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_1_12b_2_001.png new file mode 100644 index 00000000..56cb6a48 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_12b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_12b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_1_12b_o_001.png new file mode 100644 index 00000000..05dd7cfa Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_12b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_12b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_1_12b_s_001.png new file mode 100644 index 00000000..d3353b76 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_12b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_1_color_001.png b/GJ_GameSheet02-uhd/gdh_01_1_color_001.png new file mode 100644 index 00000000..7ec23b88 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_1_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_001.png new file mode 100644 index 00000000..67da99a3 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_01_001.png b/GJ_GameSheet02-uhd/gdh_01_2_01_001.png new file mode 100644 index 00000000..af6f09f6 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_01_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_01_2_001.png new file mode 100644 index 00000000..30c35c0d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_01_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_01b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_01b_001.png new file mode 100644 index 00000000..c68aad8f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_01b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_01b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_01b_2_001.png new file mode 100644 index 00000000..adbcf818 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_01b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_02_001.png b/GJ_GameSheet02-uhd/gdh_01_2_02_001.png new file mode 100644 index 00000000..84ebfc55 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_02_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_02_2_001.png new file mode 100644 index 00000000..a3d4e5ac Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_02_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_02b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_02b_001.png new file mode 100644 index 00000000..83cd24b5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_02b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_02b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_02b_2_001.png new file mode 100644 index 00000000..977e1a03 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_02b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_03_001.png b/GJ_GameSheet02-uhd/gdh_01_2_03_001.png new file mode 100644 index 00000000..6a0e064d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_03_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_03_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_03_2_001.png new file mode 100644 index 00000000..988f8825 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_03_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_03b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_03b_001.png new file mode 100644 index 00000000..4834a779 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_03b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_03b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_03b_2_001.png new file mode 100644 index 00000000..e14fecf5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_03b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_04_001.png b/GJ_GameSheet02-uhd/gdh_01_2_04_001.png new file mode 100644 index 00000000..fc0404b0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_04_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_04_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_04_2_001.png new file mode 100644 index 00000000..ab75a8dd Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_04_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_04b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_04b_001.png new file mode 100644 index 00000000..19b61fcf Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_04b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_04b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_04b_2_001.png new file mode 100644 index 00000000..d6b19171 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_04b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_05_001.png b/GJ_GameSheet02-uhd/gdh_01_2_05_001.png new file mode 100644 index 00000000..84f724b7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_05_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_05_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_05_2_001.png new file mode 100644 index 00000000..15b862da Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_05_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_05_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_05_o_001.png new file mode 100644 index 00000000..8cbca2e8 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_05_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_05_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_05_s_001.png new file mode 100644 index 00000000..92097c5c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_05_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_05b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_05b_001.png new file mode 100644 index 00000000..fc59edf8 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_05b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_05b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_05b_2_001.png new file mode 100644 index 00000000..6dd896ed Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_05b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_05b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_05b_o_001.png new file mode 100644 index 00000000..d8347a4f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_05b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_05b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_05b_s_001.png new file mode 100644 index 00000000..c8559a64 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_05b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_06_001.png b/GJ_GameSheet02-uhd/gdh_01_2_06_001.png new file mode 100644 index 00000000..8ba01ec2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_06_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_06_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_06_2_001.png new file mode 100644 index 00000000..8b14d6e1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_06_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_06_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_06_o_001.png new file mode 100644 index 00000000..433cdbb1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_06_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_06_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_06_s_001.png new file mode 100644 index 00000000..226e085a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_06_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_06b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_06b_001.png new file mode 100644 index 00000000..a9ae8cd4 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_06b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_06b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_06b_2_001.png new file mode 100644 index 00000000..42ba3a89 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_06b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_06b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_06b_o_001.png new file mode 100644 index 00000000..2ef6e37d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_06b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_06b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_06b_s_001.png new file mode 100644 index 00000000..59477b10 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_06b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_07_001.png b/GJ_GameSheet02-uhd/gdh_01_2_07_001.png new file mode 100644 index 00000000..a15e9910 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_07_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_07_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_07_o_001.png new file mode 100644 index 00000000..5c40fa99 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_07_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_07_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_07_s_001.png new file mode 100644 index 00000000..7ba353e7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_07_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_07b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_07b_001.png new file mode 100644 index 00000000..a555021b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_07b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_07b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_07b_o_001.png new file mode 100644 index 00000000..e0309c39 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_07b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_07b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_07b_s_001.png new file mode 100644 index 00000000..2939b92d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_07b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_08_001.png b/GJ_GameSheet02-uhd/gdh_01_2_08_001.png new file mode 100644 index 00000000..1312b969 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_08_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_08_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_08_o_001.png new file mode 100644 index 00000000..c16dda2b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_08_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_08_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_08_s_001.png new file mode 100644 index 00000000..7645639f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_08_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_08b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_08b_001.png new file mode 100644 index 00000000..9a468dd6 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_08b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_08b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_08b_o_001.png new file mode 100644 index 00000000..64cc7d7c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_08b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_08b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_08b_s_001.png new file mode 100644 index 00000000..5c8daa09 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_08b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_09_001.png b/GJ_GameSheet02-uhd/gdh_01_2_09_001.png new file mode 100644 index 00000000..d5630f76 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_09_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_09_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_09_o_001.png new file mode 100644 index 00000000..26d0b94a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_09_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_09_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_09_s_001.png new file mode 100644 index 00000000..47e638d5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_09_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_09b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_09b_001.png new file mode 100644 index 00000000..abbd0502 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_09b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_09b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_09b_o_001.png new file mode 100644 index 00000000..68fa44b3 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_09b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_09b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_09b_s_001.png new file mode 100644 index 00000000..52af984a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_09b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_10_001.png b/GJ_GameSheet02-uhd/gdh_01_2_10_001.png new file mode 100644 index 00000000..1b02f617 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_10_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_10_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_10_o_001.png new file mode 100644 index 00000000..04428068 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_10_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_10_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_10_s_001.png new file mode 100644 index 00000000..f569c9c0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_10_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_10b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_10b_001.png new file mode 100644 index 00000000..a07091a3 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_10b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_10b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_10b_o_001.png new file mode 100644 index 00000000..ae311378 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_10b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_10b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_10b_s_001.png new file mode 100644 index 00000000..1c3f22ec Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_10b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_11_001.png b/GJ_GameSheet02-uhd/gdh_01_2_11_001.png new file mode 100644 index 00000000..0fba0ea1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_11_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_11_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_11_2_001.png new file mode 100644 index 00000000..7bcdc49b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_11_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_11_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_11_o_001.png new file mode 100644 index 00000000..4d2456d0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_11_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_11_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_11_s_001.png new file mode 100644 index 00000000..e7d00e57 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_11_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_11b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_11b_001.png new file mode 100644 index 00000000..3abcac68 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_11b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_11b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_11b_2_001.png new file mode 100644 index 00000000..ed804bca Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_11b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_11b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_11b_o_001.png new file mode 100644 index 00000000..7033717a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_11b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_11b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_11b_s_001.png new file mode 100644 index 00000000..ae6ded64 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_11b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_12_001.png b/GJ_GameSheet02-uhd/gdh_01_2_12_001.png new file mode 100644 index 00000000..169f2312 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_12_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_12_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_12_2_001.png new file mode 100644 index 00000000..7c4608dd Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_12_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_12_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_12_o_001.png new file mode 100644 index 00000000..02efc562 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_12_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_12_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_12_s_001.png new file mode 100644 index 00000000..e87bc476 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_12_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_12b_001.png b/GJ_GameSheet02-uhd/gdh_01_2_12b_001.png new file mode 100644 index 00000000..709bd6f2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_12b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_12b_2_001.png b/GJ_GameSheet02-uhd/gdh_01_2_12b_2_001.png new file mode 100644 index 00000000..fbb3c67b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_12b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_12b_o_001.png b/GJ_GameSheet02-uhd/gdh_01_2_12b_o_001.png new file mode 100644 index 00000000..9e013ca5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_12b_o_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_12b_s_001.png b/GJ_GameSheet02-uhd/gdh_01_2_12b_s_001.png new file mode 100644 index 00000000..dd3debb2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_12b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_01_2_color_001.png b/GJ_GameSheet02-uhd/gdh_01_2_color_001.png new file mode 100644 index 00000000..82f4b2f5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_01_2_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_1_001.png b/GJ_GameSheet02-uhd/gdh_02_1_001.png new file mode 100644 index 00000000..38c1ed24 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_1_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_1_2_001.png b/GJ_GameSheet02-uhd/gdh_02_1_2_001.png new file mode 100644 index 00000000..9f5b5ad6 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_1_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_1b_001.png b/GJ_GameSheet02-uhd/gdh_02_1b_001.png new file mode 100644 index 00000000..eb7d8447 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_1b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_1b_2_001.png b/GJ_GameSheet02-uhd/gdh_02_1b_2_001.png new file mode 100644 index 00000000..cd32b4ee Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_1b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_1c_001.png b/GJ_GameSheet02-uhd/gdh_02_1c_001.png new file mode 100644 index 00000000..665521da Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_1c_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_1c_2_001.png b/GJ_GameSheet02-uhd/gdh_02_1c_2_001.png new file mode 100644 index 00000000..286822b0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_1c_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_2_001.png b/GJ_GameSheet02-uhd/gdh_02_2_001.png new file mode 100644 index 00000000..5c5f87a1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_2_2_001.png b/GJ_GameSheet02-uhd/gdh_02_2_2_001.png new file mode 100644 index 00000000..8dc3eb50 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_2_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_2b_001.png b/GJ_GameSheet02-uhd/gdh_02_2b_001.png new file mode 100644 index 00000000..c4b7e366 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_2b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_2b_2_001.png b/GJ_GameSheet02-uhd/gdh_02_2b_2_001.png new file mode 100644 index 00000000..5960aaeb Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_2b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_2c_001.png b/GJ_GameSheet02-uhd/gdh_02_2c_001.png new file mode 100644 index 00000000..7dbeb95a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_2c_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_2c_2_001.png b/GJ_GameSheet02-uhd/gdh_02_2c_2_001.png new file mode 100644 index 00000000..8dc3eb50 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_2c_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_3_001.png b/GJ_GameSheet02-uhd/gdh_02_3_001.png new file mode 100644 index 00000000..2b31b10f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_3_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_3_2_001.png b/GJ_GameSheet02-uhd/gdh_02_3_2_001.png new file mode 100644 index 00000000..3bbd9aab Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_3_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_3b_001.png b/GJ_GameSheet02-uhd/gdh_02_3b_001.png new file mode 100644 index 00000000..7dea04fc Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_3b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_3b_2_001.png b/GJ_GameSheet02-uhd/gdh_02_3b_2_001.png new file mode 100644 index 00000000..e671d84f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_3b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_3c_001.png b/GJ_GameSheet02-uhd/gdh_02_3c_001.png new file mode 100644 index 00000000..714d054c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_3c_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_3c_2_001.png b/GJ_GameSheet02-uhd/gdh_02_3c_2_001.png new file mode 100644 index 00000000..3bbd9aab Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_3c_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_4_001.png b/GJ_GameSheet02-uhd/gdh_02_4_001.png new file mode 100644 index 00000000..f90b779d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_4_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_4_2_001.png b/GJ_GameSheet02-uhd/gdh_02_4_2_001.png new file mode 100644 index 00000000..2b51ee4e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_4_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_4b_001.png b/GJ_GameSheet02-uhd/gdh_02_4b_001.png new file mode 100644 index 00000000..25160670 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_4b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_4b_2_001.png b/GJ_GameSheet02-uhd/gdh_02_4b_2_001.png new file mode 100644 index 00000000..2b51ee4e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_4b_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_4c_001.png b/GJ_GameSheet02-uhd/gdh_02_4c_001.png new file mode 100644 index 00000000..8e5df1d5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_4c_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_4c_2_001.png b/GJ_GameSheet02-uhd/gdh_02_4c_2_001.png new file mode 100644 index 00000000..2b51ee4e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_4c_2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_5_001.png b/GJ_GameSheet02-uhd/gdh_02_5_001.png new file mode 100644 index 00000000..c1fdcc1f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_5_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_5b_001.png b/GJ_GameSheet02-uhd/gdh_02_5b_001.png new file mode 100644 index 00000000..e22c0a04 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_5b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_01_001.png b/GJ_GameSheet02-uhd/gdh_02_o_01_001.png new file mode 100644 index 00000000..96560457 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_02_001.png b/GJ_GameSheet02-uhd/gdh_02_o_02_001.png new file mode 100644 index 00000000..66f7f74d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_03_001.png b/GJ_GameSheet02-uhd/gdh_02_o_03_001.png new file mode 100644 index 00000000..c81bb0ca Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_03_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_04_001.png b/GJ_GameSheet02-uhd/gdh_02_o_04_001.png new file mode 100644 index 00000000..d6f7ec4e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_04_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_05_001.png b/GJ_GameSheet02-uhd/gdh_02_o_05_001.png new file mode 100644 index 00000000..fcc334a4 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_05_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_06_001.png b/GJ_GameSheet02-uhd/gdh_02_o_06_001.png new file mode 100644 index 00000000..15c86d78 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_06_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_07_001.png b/GJ_GameSheet02-uhd/gdh_02_o_07_001.png new file mode 100644 index 00000000..f82fb7fa Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_07_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_08_001.png b/GJ_GameSheet02-uhd/gdh_02_o_08_001.png new file mode 100644 index 00000000..b6dfb702 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_08_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_09_001.png b/GJ_GameSheet02-uhd/gdh_02_o_09_001.png new file mode 100644 index 00000000..e27a17a1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_09_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_10_001.png b/GJ_GameSheet02-uhd/gdh_02_o_10_001.png new file mode 100644 index 00000000..87e59cfe Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_10_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_11_001.png b/GJ_GameSheet02-uhd/gdh_02_o_11_001.png new file mode 100644 index 00000000..72a58bd5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_11_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_02_o_12_001.png b/GJ_GameSheet02-uhd/gdh_02_o_12_001.png new file mode 100644 index 00000000..c0f9b889 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_02_o_12_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b1_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b1_001.png new file mode 100644 index 00000000..4feab474 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b1_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b1_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b1_s_001.png new file mode 100644 index 00000000..089c3875 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b1_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b2_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b2_001.png new file mode 100644 index 00000000..0c873f1b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b2_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b2_s_001.png new file mode 100644 index 00000000..d92d9e64 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b2_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b3_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b3_001.png new file mode 100644 index 00000000..a15d92a7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b3_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b3_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b3_s_001.png new file mode 100644 index 00000000..8f29d72c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b3_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b4_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b4_001.png new file mode 100644 index 00000000..55c5e12b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b4_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b4_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b4_s_001.png new file mode 100644 index 00000000..2f6d3478 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b4_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b5_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b5_001.png new file mode 100644 index 00000000..a5d40d34 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b5_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_b5_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_b5_s_001.png new file mode 100644 index 00000000..215c0c04 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_b5_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c1_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c1_001.png new file mode 100644 index 00000000..4471b43a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c1_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c1_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c1_s_001.png new file mode 100644 index 00000000..7fd10498 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c1_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c2_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c2_001.png new file mode 100644 index 00000000..b414d48b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c2_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c2_s_001.png new file mode 100644 index 00000000..6943b0a4 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c2_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c3_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c3_001.png new file mode 100644 index 00000000..f6e146e6 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c3_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c3_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c3_s_001.png new file mode 100644 index 00000000..3534a17a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c3_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c4_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c4_001.png new file mode 100644 index 00000000..3fbc61ae Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c4_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c4_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c4_s_001.png new file mode 100644 index 00000000..4790c605 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c4_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c4b_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c4b_001.png new file mode 100644 index 00000000..163acc72 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c4b_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c4b_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c4b_s_001.png new file mode 100644 index 00000000..56518ea0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c4b_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c5_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c5_001.png new file mode 100644 index 00000000..3f7647f9 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c5_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c5_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c5_s_001.png new file mode 100644 index 00000000..aafda61e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c5_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c6_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c6_001.png new file mode 100644 index 00000000..4238f7d3 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c6_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_c7_001.png b/GJ_GameSheet02-uhd/gdh_03_1_c7_001.png new file mode 100644 index 00000000..4bf68ccd Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_c7_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o10_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o10_001.png new file mode 100644 index 00000000..79e72be1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o10_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o1_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o1_001.png new file mode 100644 index 00000000..1f1a69e8 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o1_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o1_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o1_s_001.png new file mode 100644 index 00000000..f899806c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o1_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o2_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o2_001.png new file mode 100644 index 00000000..ec2e4713 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o2_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o2_s_001.png new file mode 100644 index 00000000..731253f3 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o2_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o3_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o3_001.png new file mode 100644 index 00000000..3c2c2f57 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o3_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o3_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o3_s_001.png new file mode 100644 index 00000000..330a7fe2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o3_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o4_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o4_001.png new file mode 100644 index 00000000..127bbea5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o4_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o4_s_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o4_s_001.png new file mode 100644 index 00000000..564f92e1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o4_s_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o5_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o5_001.png new file mode 100644 index 00000000..ebd9b4b0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o5_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o6_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o6_001.png new file mode 100644 index 00000000..ddd96fd3 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o6_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o7_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o7_001.png new file mode 100644 index 00000000..d4730b20 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o7_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o8_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o8_001.png new file mode 100644 index 00000000..68bbc3bf Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o8_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_03_1_o9_001.png b/GJ_GameSheet02-uhd/gdh_03_1_o9_001.png new file mode 100644 index 00000000..a833bb93 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_03_1_o9_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_chain_01_001.png b/GJ_GameSheet02-uhd/gdh_chain_01_001.png new file mode 100644 index 00000000..946faeb7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_chain_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_chain_01_color2_001.png b/GJ_GameSheet02-uhd/gdh_chain_01_color2_001.png new file mode 100644 index 00000000..502cc2a7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_chain_01_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_chain_01_color_001.png b/GJ_GameSheet02-uhd/gdh_chain_01_color_001.png new file mode 100644 index 00000000..196a7b68 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_chain_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_chain_02_001.png b/GJ_GameSheet02-uhd/gdh_chain_02_001.png new file mode 100644 index 00000000..372f74af Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_chain_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_chain_02_color2_001.png b/GJ_GameSheet02-uhd/gdh_chain_02_color2_001.png new file mode 100644 index 00000000..f497ffa5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_chain_02_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_chain_02_color_001.png b/GJ_GameSheet02-uhd/gdh_chain_02_color_001.png new file mode 100644 index 00000000..c1a37a45 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_chain_02_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_crystal_01_001.png b/GJ_GameSheet02-uhd/gdh_crystal_01_001.png new file mode 100644 index 00000000..0891ca87 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_crystal_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_crystal_01_color2_001.png b/GJ_GameSheet02-uhd/gdh_crystal_01_color2_001.png new file mode 100644 index 00000000..1a6e324f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_crystal_01_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_crystal_01_color_001.png b/GJ_GameSheet02-uhd/gdh_crystal_01_color_001.png new file mode 100644 index 00000000..1552537a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_crystal_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_crystal_02_001.png b/GJ_GameSheet02-uhd/gdh_crystal_02_001.png new file mode 100644 index 00000000..93fae098 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_crystal_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_crystal_02_color2_001.png b/GJ_GameSheet02-uhd/gdh_crystal_02_color2_001.png new file mode 100644 index 00000000..5cec3cb2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_crystal_02_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_crystal_02_color_001.png b/GJ_GameSheet02-uhd/gdh_crystal_02_color_001.png new file mode 100644 index 00000000..f244d9fc Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_crystal_02_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_01_001.png b/GJ_GameSheet02-uhd/gdh_g_01_01_001.png new file mode 100644 index 00000000..fadb6fc6 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_02_001.png b/GJ_GameSheet02-uhd/gdh_g_01_02_001.png new file mode 100644 index 00000000..637b6edf Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_03_001.png b/GJ_GameSheet02-uhd/gdh_g_01_03_001.png new file mode 100644 index 00000000..896067a9 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_03_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_04_001.png b/GJ_GameSheet02-uhd/gdh_g_01_04_001.png new file mode 100644 index 00000000..4437f0c4 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_04_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_05_001.png b/GJ_GameSheet02-uhd/gdh_g_01_05_001.png new file mode 100644 index 00000000..d1301576 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_05_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_06_001.png b/GJ_GameSheet02-uhd/gdh_g_01_06_001.png new file mode 100644 index 00000000..2892287e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_06_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_07_001.png b/GJ_GameSheet02-uhd/gdh_g_01_07_001.png new file mode 100644 index 00000000..4c7cb589 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_07_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_08_001.png b/GJ_GameSheet02-uhd/gdh_g_01_08_001.png new file mode 100644 index 00000000..e1728272 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_08_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_09_001.png b/GJ_GameSheet02-uhd/gdh_g_01_09_001.png new file mode 100644 index 00000000..c40965d7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_09_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_10_001.png b/GJ_GameSheet02-uhd/gdh_g_01_10_001.png new file mode 100644 index 00000000..a1384fc5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_10_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_11_001.png b/GJ_GameSheet02-uhd/gdh_g_01_11_001.png new file mode 100644 index 00000000..d85ac769 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_11_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_g_01_12_001.png b/GJ_GameSheet02-uhd/gdh_g_01_12_001.png new file mode 100644 index 00000000..39dd1f43 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_g_01_12_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_01_001.png b/GJ_GameSheet02-uhd/gdh_platform1_01_001.png new file mode 100644 index 00000000..f487eaa7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_01_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_01_color2_001.png new file mode 100644 index 00000000..481288e7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_01_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_01_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_01_color_001.png new file mode 100644 index 00000000..dae61e50 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_02_001.png b/GJ_GameSheet02-uhd/gdh_platform1_02_001.png new file mode 100644 index 00000000..edeeff68 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_02_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_02_color2_001.png new file mode 100644 index 00000000..203c1a85 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_02_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_02_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_02_color_001.png new file mode 100644 index 00000000..049e290a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_02_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_03_001.png b/GJ_GameSheet02-uhd/gdh_platform1_03_001.png new file mode 100644 index 00000000..1f67b3e8 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_03_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_03_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_03_color2_001.png new file mode 100644 index 00000000..bcd2d756 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_03_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_03_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_03_color_001.png new file mode 100644 index 00000000..9b4ebfa9 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_03_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_04_001.png b/GJ_GameSheet02-uhd/gdh_platform1_04_001.png new file mode 100644 index 00000000..beadbf31 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_04_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_04_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_04_color2_001.png new file mode 100644 index 00000000..f060f6cc Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_04_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_04_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_04_color_001.png new file mode 100644 index 00000000..60dd7097 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_04_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_05_001.png b/GJ_GameSheet02-uhd/gdh_platform1_05_001.png new file mode 100644 index 00000000..22757b7c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_05_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_05_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_05_color2_001.png new file mode 100644 index 00000000..e2bdd2f1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_05_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_05_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_05_color_001.png new file mode 100644 index 00000000..68abb369 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_05_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_06_001.png b/GJ_GameSheet02-uhd/gdh_platform1_06_001.png new file mode 100644 index 00000000..dc18a552 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_06_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_06_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_06_color2_001.png new file mode 100644 index 00000000..2b6cd149 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_06_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_06_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_06_color_001.png new file mode 100644 index 00000000..eb3d5e91 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_06_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_07_001.png b/GJ_GameSheet02-uhd/gdh_platform1_07_001.png new file mode 100644 index 00000000..f43959e2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_07_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_07_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_07_color2_001.png new file mode 100644 index 00000000..f38a0f7d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_07_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_07_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_07_color_001.png new file mode 100644 index 00000000..b17cb9cc Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_07_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_08_001.png b/GJ_GameSheet02-uhd/gdh_platform1_08_001.png new file mode 100644 index 00000000..e8c3e545 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_08_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_08_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_08_color2_001.png new file mode 100644 index 00000000..05e797b0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_08_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_08_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_08_color_001.png new file mode 100644 index 00000000..ac27ce53 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_08_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_09_001.png b/GJ_GameSheet02-uhd/gdh_platform1_09_001.png new file mode 100644 index 00000000..5c6d3590 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_09_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_09_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_09_color2_001.png new file mode 100644 index 00000000..e33dfeff Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_09_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_09_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_09_color_001.png new file mode 100644 index 00000000..326c880f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_09_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_10_001.png b/GJ_GameSheet02-uhd/gdh_platform1_10_001.png new file mode 100644 index 00000000..13116034 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_10_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_10_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_10_color2_001.png new file mode 100644 index 00000000..9bb6ff32 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_10_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_10_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_10_color_001.png new file mode 100644 index 00000000..95ac07a7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_10_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_11_001.png b/GJ_GameSheet02-uhd/gdh_platform1_11_001.png new file mode 100644 index 00000000..bdaff241 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_11_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_11_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_11_color2_001.png new file mode 100644 index 00000000..1a837b6a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_11_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_11_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_11_color_001.png new file mode 100644 index 00000000..bb584880 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_11_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_12_001.png b/GJ_GameSheet02-uhd/gdh_platform1_12_001.png new file mode 100644 index 00000000..c4f1f30d Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_12_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_12_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_12_color2_001.png new file mode 100644 index 00000000..92bbfff2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_12_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_12_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_12_color_001.png new file mode 100644 index 00000000..ca9ee481 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_12_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_13_001.png b/GJ_GameSheet02-uhd/gdh_platform1_13_001.png new file mode 100644 index 00000000..383cb3c1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_13_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_13_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_13_color2_001.png new file mode 100644 index 00000000..752f8e26 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_13_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_13_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_13_color_001.png new file mode 100644 index 00000000..831e82fe Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_13_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_14_001.png b/GJ_GameSheet02-uhd/gdh_platform1_14_001.png new file mode 100644 index 00000000..00d9c908 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_14_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_14_color2_001.png b/GJ_GameSheet02-uhd/gdh_platform1_14_color2_001.png new file mode 100644 index 00000000..485f2cd1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_14_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platform1_14_color_001.png b/GJ_GameSheet02-uhd/gdh_platform1_14_color_001.png new file mode 100644 index 00000000..9238162e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platform1_14_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_01_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_01_001.png new file mode 100644 index 00000000..729568f7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_01_color_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_01_color_001.png new file mode 100644 index 00000000..1c506eb0 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_02_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_02_001.png new file mode 100644 index 00000000..3f3eeda1 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_02_color_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_02_color_001.png new file mode 100644 index 00000000..cae9d0bf Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_02_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_03_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_03_001.png new file mode 100644 index 00000000..17a37ee5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_03_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_03_color_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_03_color_001.png new file mode 100644 index 00000000..a9deaa9c Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_03_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_04_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_04_001.png new file mode 100644 index 00000000..7ad8b62f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_04_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_04_color_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_04_color_001.png new file mode 100644 index 00000000..d972c960 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_04_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_05_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_05_001.png new file mode 100644 index 00000000..eaf0c059 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_05_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_05_color_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_05_color_001.png new file mode 100644 index 00000000..03161007 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_05_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_06_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_06_001.png new file mode 100644 index 00000000..5f23c69a Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_06_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_platformArt_06_color_001.png b/GJ_GameSheet02-uhd/gdh_platformArt_06_color_001.png new file mode 100644 index 00000000..0fe9d6f9 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_platformArt_06_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_01_001.png b/GJ_GameSheet02-uhd/gdh_spike_01_001.png new file mode 100644 index 00000000..66a31d1e Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_01_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_01_color2_001.png b/GJ_GameSheet02-uhd/gdh_spike_01_color2_001.png new file mode 100644 index 00000000..f4a96dc7 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_01_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_01_color_001.png b/GJ_GameSheet02-uhd/gdh_spike_01_color_001.png new file mode 100644 index 00000000..981b8d6f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_01_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_01_g2_001.png b/GJ_GameSheet02-uhd/gdh_spike_01_g2_001.png new file mode 100644 index 00000000..433b500b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_01_g2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_01_g_001.png b/GJ_GameSheet02-uhd/gdh_spike_01_g_001.png new file mode 100644 index 00000000..db946124 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_01_g_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_02_001.png b/GJ_GameSheet02-uhd/gdh_spike_02_001.png new file mode 100644 index 00000000..00668842 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_02_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_02_color2_001.png b/GJ_GameSheet02-uhd/gdh_spike_02_color2_001.png new file mode 100644 index 00000000..8c1017fb Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_02_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_02_color_001.png b/GJ_GameSheet02-uhd/gdh_spike_02_color_001.png new file mode 100644 index 00000000..b92fd876 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_02_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_02_g2_001.png b/GJ_GameSheet02-uhd/gdh_spike_02_g2_001.png new file mode 100644 index 00000000..3edfd826 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_02_g2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_02_g_001.png b/GJ_GameSheet02-uhd/gdh_spike_02_g_001.png new file mode 100644 index 00000000..c1bd2224 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_02_g_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_03_001.png b/GJ_GameSheet02-uhd/gdh_spike_03_001.png new file mode 100644 index 00000000..5a6f2955 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_03_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_03_color2_001.png b/GJ_GameSheet02-uhd/gdh_spike_03_color2_001.png new file mode 100644 index 00000000..5ce7e15b Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_03_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_03_color_001.png b/GJ_GameSheet02-uhd/gdh_spike_03_color_001.png new file mode 100644 index 00000000..36f0e3d2 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_03_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_03_g2_001.png b/GJ_GameSheet02-uhd/gdh_spike_03_g2_001.png new file mode 100644 index 00000000..63394594 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_03_g2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_03_g_001.png b/GJ_GameSheet02-uhd/gdh_spike_03_g_001.png new file mode 100644 index 00000000..1d7543ef Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_03_g_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_04_001.png b/GJ_GameSheet02-uhd/gdh_spike_04_001.png new file mode 100644 index 00000000..b126bf93 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_04_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_04_color2_001.png b/GJ_GameSheet02-uhd/gdh_spike_04_color2_001.png new file mode 100644 index 00000000..b89e40d5 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_04_color2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_04_color_001.png b/GJ_GameSheet02-uhd/gdh_spike_04_color_001.png new file mode 100644 index 00000000..f8799273 Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_04_color_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_04_g2_001.png b/GJ_GameSheet02-uhd/gdh_spike_04_g2_001.png new file mode 100644 index 00000000..62833daf Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_04_g2_001.png differ diff --git a/GJ_GameSheet02-uhd/gdh_spike_04_g_001.png b/GJ_GameSheet02-uhd/gdh_spike_04_g_001.png new file mode 100644 index 00000000..9689143f Binary files /dev/null and b/GJ_GameSheet02-uhd/gdh_spike_04_g_001.png differ diff --git a/GJ_GameSheet02-uhd/keyframeIcon_001.png b/GJ_GameSheet02-uhd/keyframeIcon_001.png new file mode 100644 index 00000000..df53304e Binary files /dev/null and b/GJ_GameSheet02-uhd/keyframeIcon_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_01_back_001.png b/GJ_GameSheet02-uhd/portal_01_back_001.png new file mode 100644 index 00000000..c6576054 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_01_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_01_extra_001.png b/GJ_GameSheet02-uhd/portal_01_extra_001.png new file mode 100644 index 00000000..f6743b44 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_01_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_01_extra_2_001.png b/GJ_GameSheet02-uhd/portal_01_extra_2_001.png new file mode 100644 index 00000000..77cdc05b Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_01_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_01_front_001.png b/GJ_GameSheet02-uhd/portal_01_front_001.png new file mode 100644 index 00000000..46d423ab Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_01_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_02_back_001.png b/GJ_GameSheet02-uhd/portal_02_back_001.png new file mode 100644 index 00000000..524f48b2 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_02_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_02_extra_001.png b/GJ_GameSheet02-uhd/portal_02_extra_001.png new file mode 100644 index 00000000..b581a3ee Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_02_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_02_extra_2_001.png b/GJ_GameSheet02-uhd/portal_02_extra_2_001.png new file mode 100644 index 00000000..8bfd2d85 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_02_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_02_front_001.png b/GJ_GameSheet02-uhd/portal_02_front_001.png new file mode 100644 index 00000000..a347201b Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_02_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_03_back_001.png b/GJ_GameSheet02-uhd/portal_03_back_001.png new file mode 100644 index 00000000..94dffe61 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_03_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_03_extra_001.png b/GJ_GameSheet02-uhd/portal_03_extra_001.png new file mode 100644 index 00000000..e69bdf3d Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_03_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_03_extra_2_001.png b/GJ_GameSheet02-uhd/portal_03_extra_2_001.png new file mode 100644 index 00000000..2bfd8e20 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_03_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_03_front_001.png b/GJ_GameSheet02-uhd/portal_03_front_001.png new file mode 100644 index 00000000..f4c78a40 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_03_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_04_back_001.png b/GJ_GameSheet02-uhd/portal_04_back_001.png new file mode 100644 index 00000000..2842e186 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_04_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_04_extra_001.png b/GJ_GameSheet02-uhd/portal_04_extra_001.png new file mode 100644 index 00000000..775e2daa Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_04_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_04_extra_2_001.png b/GJ_GameSheet02-uhd/portal_04_extra_2_001.png new file mode 100644 index 00000000..ee875e42 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_04_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_04_front_001.png b/GJ_GameSheet02-uhd/portal_04_front_001.png new file mode 100644 index 00000000..bb4dabb6 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_04_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_05_back_001.png b/GJ_GameSheet02-uhd/portal_05_back_001.png new file mode 100644 index 00000000..fc35a122 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_05_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_05_front_001.png b/GJ_GameSheet02-uhd/portal_05_front_001.png new file mode 100644 index 00000000..7aa76cd9 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_05_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_06_back_001.png b/GJ_GameSheet02-uhd/portal_06_back_001.png new file mode 100644 index 00000000..2076e93e Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_06_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_06_front_001.png b/GJ_GameSheet02-uhd/portal_06_front_001.png new file mode 100644 index 00000000..6e09cfe2 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_06_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_07_back_001.png b/GJ_GameSheet02-uhd/portal_07_back_001.png new file mode 100644 index 00000000..345ed9ca Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_07_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_07_extra_001.png b/GJ_GameSheet02-uhd/portal_07_extra_001.png new file mode 100644 index 00000000..25f8f580 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_07_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_07_extra_2_001.png b/GJ_GameSheet02-uhd/portal_07_extra_2_001.png new file mode 100644 index 00000000..42bcb9d8 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_07_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_07_front_001.png b/GJ_GameSheet02-uhd/portal_07_front_001.png new file mode 100644 index 00000000..e7a8af35 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_07_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_08_back_001.png b/GJ_GameSheet02-uhd/portal_08_back_001.png new file mode 100644 index 00000000..86b9a164 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_08_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_08_front_001.png b/GJ_GameSheet02-uhd/portal_08_front_001.png new file mode 100644 index 00000000..a349d866 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_08_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_09_back_001.png b/GJ_GameSheet02-uhd/portal_09_back_001.png new file mode 100644 index 00000000..daca589d Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_09_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_09_front_001.png b/GJ_GameSheet02-uhd/portal_09_front_001.png new file mode 100644 index 00000000..b685b773 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_09_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_10_back_001.png b/GJ_GameSheet02-uhd/portal_10_back_001.png new file mode 100644 index 00000000..643d6bde Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_10_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_10_extra_001.png b/GJ_GameSheet02-uhd/portal_10_extra_001.png new file mode 100644 index 00000000..3fda326e Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_10_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_10_extra_2_001.png b/GJ_GameSheet02-uhd/portal_10_extra_2_001.png new file mode 100644 index 00000000..94762455 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_10_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_10_front_001.png b/GJ_GameSheet02-uhd/portal_10_front_001.png new file mode 100644 index 00000000..2e0a15fd Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_10_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_11_back_001.png b/GJ_GameSheet02-uhd/portal_11_back_001.png new file mode 100644 index 00000000..a8bff289 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_11_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_11_front_001.png b/GJ_GameSheet02-uhd/portal_11_front_001.png new file mode 100644 index 00000000..4fb4d6af Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_11_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_12_back_001.png b/GJ_GameSheet02-uhd/portal_12_back_001.png new file mode 100644 index 00000000..0e284b94 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_12_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_12_front_001.png b/GJ_GameSheet02-uhd/portal_12_front_001.png new file mode 100644 index 00000000..6e966c4e Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_12_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_13_back_001.png b/GJ_GameSheet02-uhd/portal_13_back_001.png new file mode 100644 index 00000000..2e7e6a71 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_13_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_13_extra_001.png b/GJ_GameSheet02-uhd/portal_13_extra_001.png new file mode 100644 index 00000000..8a402326 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_13_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_13_extra_2_001.png b/GJ_GameSheet02-uhd/portal_13_extra_2_001.png new file mode 100644 index 00000000..19e8e97a Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_13_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_13_front_001.png b/GJ_GameSheet02-uhd/portal_13_front_001.png new file mode 100644 index 00000000..4db1b4f8 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_13_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_14_back_001.png b/GJ_GameSheet02-uhd/portal_14_back_001.png new file mode 100644 index 00000000..c4834b69 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_14_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_14_extra_001.png b/GJ_GameSheet02-uhd/portal_14_extra_001.png new file mode 100644 index 00000000..66da1901 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_14_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_14_extra_2_001.png b/GJ_GameSheet02-uhd/portal_14_extra_2_001.png new file mode 100644 index 00000000..7c5005f8 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_14_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_14_front_001.png b/GJ_GameSheet02-uhd/portal_14_front_001.png new file mode 100644 index 00000000..5114bfdb Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_14_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_15_back_001.png b/GJ_GameSheet02-uhd/portal_15_back_001.png new file mode 100644 index 00000000..4ecf2b33 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_15_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_15_front_001.png b/GJ_GameSheet02-uhd/portal_15_front_001.png new file mode 100644 index 00000000..22388162 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_15_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_16_back_001.png b/GJ_GameSheet02-uhd/portal_16_back_001.png new file mode 100644 index 00000000..5b3b47d0 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_16_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_16_front_001.png b/GJ_GameSheet02-uhd/portal_16_front_001.png new file mode 100644 index 00000000..ecc0e375 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_16_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_17_back_001.png b/GJ_GameSheet02-uhd/portal_17_back_001.png new file mode 100644 index 00000000..e3fdab88 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_17_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_17_extra_001.png b/GJ_GameSheet02-uhd/portal_17_extra_001.png new file mode 100644 index 00000000..9fdac2dc Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_17_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_17_extra_2_001.png b/GJ_GameSheet02-uhd/portal_17_extra_2_001.png new file mode 100644 index 00000000..90508d53 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_17_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_17_front_001.png b/GJ_GameSheet02-uhd/portal_17_front_001.png new file mode 100644 index 00000000..1c47320b Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_17_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_18_back_001.png b/GJ_GameSheet02-uhd/portal_18_back_001.png new file mode 100644 index 00000000..cc28411f Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_18_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_18_extra_001.png b/GJ_GameSheet02-uhd/portal_18_extra_001.png new file mode 100644 index 00000000..41e9ddc8 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_18_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_18_extra_2_001.png b/GJ_GameSheet02-uhd/portal_18_extra_2_001.png new file mode 100644 index 00000000..042ad587 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_18_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_18_front_001.png b/GJ_GameSheet02-uhd/portal_18_front_001.png new file mode 100644 index 00000000..1e937a0f Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_18_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_19_back_001.png b/GJ_GameSheet02-uhd/portal_19_back_001.png new file mode 100644 index 00000000..cc6131ef Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_19_back_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_19_extra_001.png b/GJ_GameSheet02-uhd/portal_19_extra_001.png new file mode 100644 index 00000000..2a459448 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_19_extra_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_19_extra_2_001.png b/GJ_GameSheet02-uhd/portal_19_extra_2_001.png new file mode 100644 index 00000000..c9b02f82 Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_19_extra_2_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_19_front_001.png b/GJ_GameSheet02-uhd/portal_19_front_001.png new file mode 100644 index 00000000..91d707cd Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_19_front_001.png differ diff --git a/GJ_GameSheet02-uhd/portal_extra_shine_001.png b/GJ_GameSheet02-uhd/portal_extra_shine_001.png new file mode 100644 index 00000000..efb72abf Binary files /dev/null and b/GJ_GameSheet02-uhd/portal_extra_shine_001.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_01_001.png b/GJ_GameSheet02-uhd/secretCoin_01_001.png new file mode 100644 index 00000000..1441cb3c Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_01_001.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_01_002.png b/GJ_GameSheet02-uhd/secretCoin_01_002.png new file mode 100644 index 00000000..9f15835e Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_01_002.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_01_003.png b/GJ_GameSheet02-uhd/secretCoin_01_003.png new file mode 100644 index 00000000..7853fb39 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_01_003.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_01_004.png b/GJ_GameSheet02-uhd/secretCoin_01_004.png new file mode 100644 index 00000000..e19e5065 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_01_004.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_2_01_001.png b/GJ_GameSheet02-uhd/secretCoin_2_01_001.png new file mode 100644 index 00000000..a67ad963 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_2_01_001.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_2_01_002.png b/GJ_GameSheet02-uhd/secretCoin_2_01_002.png new file mode 100644 index 00000000..ffbe663f Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_2_01_002.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_2_01_003.png b/GJ_GameSheet02-uhd/secretCoin_2_01_003.png new file mode 100644 index 00000000..bce75ca0 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_2_01_003.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_2_01_004.png b/GJ_GameSheet02-uhd/secretCoin_2_01_004.png new file mode 100644 index 00000000..9efd0022 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_2_01_004.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_2_b_01_001.png b/GJ_GameSheet02-uhd/secretCoin_2_b_01_001.png new file mode 100644 index 00000000..c89c23ea Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_2_b_01_001.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_2_b_01_002.png b/GJ_GameSheet02-uhd/secretCoin_2_b_01_002.png new file mode 100644 index 00000000..582fb637 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_2_b_01_002.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_2_b_01_003.png b/GJ_GameSheet02-uhd/secretCoin_2_b_01_003.png new file mode 100644 index 00000000..efb24d24 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_2_b_01_003.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_2_b_01_004.png b/GJ_GameSheet02-uhd/secretCoin_2_b_01_004.png new file mode 100644 index 00000000..582fb637 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_2_b_01_004.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_b_01_001.png b/GJ_GameSheet02-uhd/secretCoin_b_01_001.png new file mode 100644 index 00000000..39cee45d Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_b_01_001.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_b_01_002.png b/GJ_GameSheet02-uhd/secretCoin_b_01_002.png new file mode 100644 index 00000000..20cca6c4 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_b_01_002.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_b_01_003.png b/GJ_GameSheet02-uhd/secretCoin_b_01_003.png new file mode 100644 index 00000000..3a5400fe Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_b_01_003.png differ diff --git a/GJ_GameSheet02-uhd/secretCoin_b_01_004.png b/GJ_GameSheet02-uhd/secretCoin_b_01_004.png new file mode 100644 index 00000000..cc3f6757 Binary files /dev/null and b/GJ_GameSheet02-uhd/secretCoin_b_01_004.png differ diff --git a/GJ_GameSheet02-uhd/smartBlock01_001.png b/GJ_GameSheet02-uhd/smartBlock01_001.png new file mode 100644 index 00000000..007c866d Binary files /dev/null and b/GJ_GameSheet02-uhd/smartBlock01_001.png differ diff --git a/GJ_GameSheet02-uhd/smartBlock01b_001.png b/GJ_GameSheet02-uhd/smartBlock01b_001.png new file mode 100644 index 00000000..e3ea4a1f Binary files /dev/null and b/GJ_GameSheet02-uhd/smartBlock01b_001.png differ diff --git a/GJ_GameSheet02-uhd/smartBlock02_001.png b/GJ_GameSheet02-uhd/smartBlock02_001.png new file mode 100644 index 00000000..5d1c2c01 Binary files /dev/null and b/GJ_GameSheet02-uhd/smartBlock02_001.png differ diff --git a/GJ_GameSheet02-uhd/smartBlock02b_001.png b/GJ_GameSheet02-uhd/smartBlock02b_001.png new file mode 100644 index 00000000..9e4aed3e Binary files /dev/null and b/GJ_GameSheet02-uhd/smartBlock02b_001.png differ diff --git a/GJ_GameSheet02-uhd/smartBlock03_001.png b/GJ_GameSheet02-uhd/smartBlock03_001.png new file mode 100644 index 00000000..866e6ce5 Binary files /dev/null and b/GJ_GameSheet02-uhd/smartBlock03_001.png differ diff --git a/GJ_GameSheet02-uhd/smartBlock03b_001.png b/GJ_GameSheet02-uhd/smartBlock03b_001.png new file mode 100644 index 00000000..979c129e Binary files /dev/null and b/GJ_GameSheet02-uhd/smartBlock03b_001.png differ diff --git a/GJ_GameSheet03-uhd/GJLargeLock_001.png b/GJ_GameSheet03-uhd/GJLargeLock_001.png new file mode 100644 index 00000000..4a8ef273 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJLargeLock_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_BPMOffBtn_001.png b/GJ_GameSheet03-uhd/GJ_BPMOffBtn_001.png new file mode 100644 index 00000000..2d159e48 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_BPMOffBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_BPMOnBtn_001.png b/GJ_GameSheet03-uhd/GJ_BPMOnBtn_001.png new file mode 100644 index 00000000..e44db1e5 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_BPMOnBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_achBtn_001.png b/GJ_GameSheet03-uhd/GJ_achBtn_001.png new file mode 100644 index 00000000..13090a33 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_achBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_achImage_001.png b/GJ_GameSheet03-uhd/GJ_achImage_001.png new file mode 100644 index 00000000..4131f5f5 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_achImage_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_adChestBtn_001.png b/GJ_GameSheet03-uhd/GJ_adChestBtn_001.png new file mode 100644 index 00000000..fe86503a Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_adChestBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_arrow_01_001.png b/GJ_GameSheet03-uhd/GJ_arrow_01_001.png new file mode 100644 index 00000000..2e31ddf9 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_arrow_01_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_arrow_02_001.png b/GJ_GameSheet03-uhd/GJ_arrow_02_001.png new file mode 100644 index 00000000..5b8422f0 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_arrow_02_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_arrow_03_001.png b/GJ_GameSheet03-uhd/GJ_arrow_03_001.png new file mode 100644 index 00000000..fe1d27db Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_arrow_03_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_audioOffBtn_001.png b/GJ_GameSheet03-uhd/GJ_audioOffBtn_001.png new file mode 100644 index 00000000..bf9a083d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_audioOffBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_audioOnBtn_001.png b/GJ_GameSheet03-uhd/GJ_audioOnBtn_001.png new file mode 100644 index 00000000..70886436 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_audioOnBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_autoOffBtn_001.png b/GJ_GameSheet03-uhd/GJ_autoOffBtn_001.png new file mode 100644 index 00000000..ea99a594 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_autoOffBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_autoOnBtn_001.png b/GJ_GameSheet03-uhd/GJ_autoOnBtn_001.png new file mode 100644 index 00000000..34257297 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_autoOnBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_backBtn_001.png b/GJ_GameSheet03-uhd/GJ_backBtn_001.png new file mode 100644 index 00000000..cc24c4b3 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_backBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigDiamond_001.png b/GJ_GameSheet03-uhd/GJ_bigDiamond_001.png new file mode 100644 index 00000000..4211ce5a Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigDiamond_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigDiamond_glow_001.png b/GJ_GameSheet03-uhd/GJ_bigDiamond_glow_001.png new file mode 100644 index 00000000..6a4beabf Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigDiamond_glow_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigDiamond_noShadow_001.png b/GJ_GameSheet03-uhd/GJ_bigDiamond_noShadow_001.png new file mode 100644 index 00000000..3fd9571c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigDiamond_noShadow_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigGoldKey_001.png b/GJ_GameSheet03-uhd/GJ_bigGoldKey_001.png new file mode 100644 index 00000000..0cc7e866 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigGoldKey_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigGoldKey_glow_001.png b/GJ_GameSheet03-uhd/GJ_bigGoldKey_glow_001.png new file mode 100644 index 00000000..bea930ba Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigGoldKey_glow_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigKey_001.png b/GJ_GameSheet03-uhd/GJ_bigKey_001.png new file mode 100644 index 00000000..0a145ec7 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigKey_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigKey_glow_001.png b/GJ_GameSheet03-uhd/GJ_bigKey_glow_001.png new file mode 100644 index 00000000..e8973075 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigKey_glow_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigMoon_001.png b/GJ_GameSheet03-uhd/GJ_bigMoon_001.png new file mode 100644 index 00000000..23aa7ba3 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigMoon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigMoon_glow_001.png b/GJ_GameSheet03-uhd/GJ_bigMoon_glow_001.png new file mode 100644 index 00000000..4f1db696 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigMoon_glow_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigMoon_noShadow_001.png b/GJ_GameSheet03-uhd/GJ_bigMoon_noShadow_001.png new file mode 100644 index 00000000..8f31b2eb Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigMoon_noShadow_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigStar_001.png b/GJ_GameSheet03-uhd/GJ_bigStar_001.png new file mode 100644 index 00000000..7cbde51c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigStar_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigStar_glow_001.png b/GJ_GameSheet03-uhd/GJ_bigStar_glow_001.png new file mode 100644 index 00000000..3dbfc7ff Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigStar_glow_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_bigStar_noShadow_001.png b/GJ_GameSheet03-uhd/GJ_bigStar_noShadow_001.png new file mode 100644 index 00000000..f1a362dd Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_bigStar_noShadow_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_cancelDownloadBtn_001.png b/GJ_GameSheet03-uhd/GJ_cancelDownloadBtn_001.png new file mode 100644 index 00000000..f34237ae Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_cancelDownloadBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_changeSongBtn_001.png b/GJ_GameSheet03-uhd/GJ_changeSongBtn_001.png new file mode 100644 index 00000000..fb67d28c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_changeSongBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_chatBtn_001.png b/GJ_GameSheet03-uhd/GJ_chatBtn_001.png new file mode 100644 index 00000000..cf841826 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_chatBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_chatBtn_01_001.png b/GJ_GameSheet03-uhd/GJ_chatBtn_01_001.png new file mode 100644 index 00000000..ff6ef148 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_chatBtn_01_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_chatBtn_02_001.png b/GJ_GameSheet03-uhd/GJ_chatBtn_02_001.png new file mode 100644 index 00000000..f93ce071 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_chatBtn_02_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_checkOff_001.png b/GJ_GameSheet03-uhd/GJ_checkOff_001.png new file mode 100644 index 00000000..54809fc8 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_checkOff_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_checkOn_001.png b/GJ_GameSheet03-uhd/GJ_checkOn_001.png new file mode 100644 index 00000000..6740f512 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_checkOn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_checkpointBtn_001.png b/GJ_GameSheet03-uhd/GJ_checkpointBtn_001.png new file mode 100644 index 00000000..7c96491e Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_checkpointBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_chrSel_001.png b/GJ_GameSheet03-uhd/GJ_chrSel_001.png new file mode 100644 index 00000000..17579411 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_chrSel_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_closeBtn_001.png b/GJ_GameSheet03-uhd/GJ_closeBtn_001.png new file mode 100644 index 00000000..3ee7348d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_closeBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_coinsIcon2_001.png b/GJ_GameSheet03-uhd/GJ_coinsIcon2_001.png new file mode 100644 index 00000000..efecbdfe Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_coinsIcon2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_coinsIcon_001.png b/GJ_GameSheet03-uhd/GJ_coinsIcon_001.png new file mode 100644 index 00000000..86a2b0aa Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_coinsIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_coinsIcon_gray_001.png b/GJ_GameSheet03-uhd/GJ_coinsIcon_gray_001.png new file mode 100644 index 00000000..12412602 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_coinsIcon_gray_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_colorBtn_001.png b/GJ_GameSheet03-uhd/GJ_colorBtn_001.png new file mode 100644 index 00000000..03bfe223 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_colorBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_commentSide2_001.png b/GJ_GameSheet03-uhd/GJ_commentSide2_001.png new file mode 100644 index 00000000..941c1faf Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_commentSide2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_commentSide_001.png b/GJ_GameSheet03-uhd/GJ_commentSide_001.png new file mode 100644 index 00000000..1528ed0a Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_commentSide_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_commentTop2_001.png b/GJ_GameSheet03-uhd/GJ_commentTop2_001.png new file mode 100644 index 00000000..2c4b6c13 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_commentTop2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_commentTop_001.png b/GJ_GameSheet03-uhd/GJ_commentTop_001.png new file mode 100644 index 00000000..c40dc6c6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_commentTop_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_completesIcon_001.png b/GJ_GameSheet03-uhd/GJ_completesIcon_001.png new file mode 100644 index 00000000..5f5c476f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_completesIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_copyBtn2_001.png b/GJ_GameSheet03-uhd/GJ_copyBtn2_001.png new file mode 100644 index 00000000..df00587f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_copyBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_copyBtn_001.png b/GJ_GameSheet03-uhd/GJ_copyBtn_001.png new file mode 100644 index 00000000..2f0013c9 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_copyBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_copyStateBtn_001.png b/GJ_GameSheet03-uhd/GJ_copyStateBtn_001.png new file mode 100644 index 00000000..1f3b0853 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_copyStateBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_createLinesBtn_001.png b/GJ_GameSheet03-uhd/GJ_createLinesBtn_001.png new file mode 100644 index 00000000..ffe762be Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_createLinesBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_dailyRewardBtn_001.png b/GJ_GameSheet03-uhd/GJ_dailyRewardBtn_001.png new file mode 100644 index 00000000..ac432064 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_dailyRewardBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_deSelBtn2_001.png b/GJ_GameSheet03-uhd/GJ_deSelBtn2_001.png new file mode 100644 index 00000000..c0fe59e6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_deSelBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_deSelBtn_001.png b/GJ_GameSheet03-uhd/GJ_deSelBtn_001.png new file mode 100644 index 00000000..abde7272 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_deSelBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_deleteAllIcon_001.png b/GJ_GameSheet03-uhd/GJ_deleteAllIcon_001.png new file mode 100644 index 00000000..e14846a3 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_deleteAllIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_deleteBtn_001.png b/GJ_GameSheet03-uhd/GJ_deleteBtn_001.png new file mode 100644 index 00000000..30b3a802 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_deleteBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_deleteIcon_001.png b/GJ_GameSheet03-uhd/GJ_deleteIcon_001.png new file mode 100644 index 00000000..7a1d43be Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_deleteIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_deleteServerBtn_001.png b/GJ_GameSheet03-uhd/GJ_deleteServerBtn_001.png new file mode 100644 index 00000000..23463ea3 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_deleteServerBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_deleteSongBtn_001.png b/GJ_GameSheet03-uhd/GJ_deleteSongBtn_001.png new file mode 100644 index 00000000..88fae94a Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_deleteSongBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_demonIcon_001.png b/GJ_GameSheet03-uhd/GJ_demonIcon_001.png new file mode 100644 index 00000000..9b128ca9 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_demonIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_diamondsIcon_001.png b/GJ_GameSheet03-uhd/GJ_diamondsIcon_001.png new file mode 100644 index 00000000..309755de Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_diamondsIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_dislikeBtn_001.png b/GJ_GameSheet03-uhd/GJ_dislikeBtn_001.png new file mode 100644 index 00000000..bf1cec30 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_dislikeBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_dislikesIcon_001.png b/GJ_GameSheet03-uhd/GJ_dislikesIcon_001.png new file mode 100644 index 00000000..86e67f15 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_dislikesIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_downloadBtn_001.png b/GJ_GameSheet03-uhd/GJ_downloadBtn_001.png new file mode 100644 index 00000000..2d689bc9 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_downloadBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_downloadsIcon_001.png b/GJ_GameSheet03-uhd/GJ_downloadsIcon_001.png new file mode 100644 index 00000000..9694be37 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_downloadsIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_duplicateBtn_001.png b/GJ_GameSheet03-uhd/GJ_duplicateBtn_001.png new file mode 100644 index 00000000..bbad284b Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_duplicateBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_duplicateLockedBtn_001.png b/GJ_GameSheet03-uhd/GJ_duplicateLockedBtn_001.png new file mode 100644 index 00000000..267d1e47 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_duplicateLockedBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_duplicateObjectBtn2_001.png b/GJ_GameSheet03-uhd/GJ_duplicateObjectBtn2_001.png new file mode 100644 index 00000000..81da6a29 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_duplicateObjectBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_duplicateObjectBtn_001.png b/GJ_GameSheet03-uhd/GJ_duplicateObjectBtn_001.png new file mode 100644 index 00000000..681f726c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_duplicateObjectBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_editBtn_001.png b/GJ_GameSheet03-uhd/GJ_editBtn_001.png new file mode 100644 index 00000000..2b437d34 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_editBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_editHSVBtn2_001.png b/GJ_GameSheet03-uhd/GJ_editHSVBtn2_001.png new file mode 100644 index 00000000..008138d3 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_editHSVBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_editModeBtn_001.png b/GJ_GameSheet03-uhd/GJ_editModeBtn_001.png new file mode 100644 index 00000000..952212ed Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_editModeBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_editObjBtn3_001.png b/GJ_GameSheet03-uhd/GJ_editObjBtn3_001.png new file mode 100644 index 00000000..317bfe0b Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_editObjBtn3_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_editObjBtn4_001.png b/GJ_GameSheet03-uhd/GJ_editObjBtn4_001.png new file mode 100644 index 00000000..d408c5b1 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_editObjBtn4_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_epicCoin2_001.png b/GJ_GameSheet03-uhd/GJ_epicCoin2_001.png new file mode 100644 index 00000000..19787ab8 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_epicCoin2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_epicCoin3_001.png b/GJ_GameSheet03-uhd/GJ_epicCoin3_001.png new file mode 100644 index 00000000..3a4ff44c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_epicCoin3_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_epicCoin_001.png b/GJ_GameSheet03-uhd/GJ_epicCoin_001.png new file mode 100644 index 00000000..556994f5 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_epicCoin_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_everyplayBtn_001.png b/GJ_GameSheet03-uhd/GJ_everyplayBtn_001.png new file mode 100644 index 00000000..f0a01a4b Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_everyplayBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_extendedIcon_001.png b/GJ_GameSheet03-uhd/GJ_extendedIcon_001.png new file mode 100644 index 00000000..1b71739d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_extendedIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_featuredCoin_001.png b/GJ_GameSheet03-uhd/GJ_featuredCoin_001.png new file mode 100644 index 00000000..7f2c49de Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_featuredCoin_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_featuredIcon_001.png b/GJ_GameSheet03-uhd/GJ_featuredIcon_001.png new file mode 100644 index 00000000..59ca9519 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_featuredIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_filterIcon_001.png b/GJ_GameSheet03-uhd/GJ_filterIcon_001.png new file mode 100644 index 00000000..59f20973 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_filterIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_followTxt_001.png b/GJ_GameSheet03-uhd/GJ_followTxt_001.png new file mode 100644 index 00000000..ca6de22f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_followTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_freeChestBtn_001.png b/GJ_GameSheet03-uhd/GJ_freeChestBtn_001.png new file mode 100644 index 00000000..07df54db Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_freeChestBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_freeStuffBtn_001.png b/GJ_GameSheet03-uhd/GJ_freeStuffBtn_001.png new file mode 100644 index 00000000..f9b12958 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_freeStuffBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_fxOffBtn_001.png b/GJ_GameSheet03-uhd/GJ_fxOffBtn_001.png new file mode 100644 index 00000000..ccd6774f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_fxOffBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_fxOnBtn_001.png b/GJ_GameSheet03-uhd/GJ_fxOnBtn_001.png new file mode 100644 index 00000000..4373280c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_fxOnBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_garageBtn_001.png b/GJ_GameSheet03-uhd/GJ_garageBtn_001.png new file mode 100644 index 00000000..2a3caa57 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_garageBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_getSongInfoBtn_001.png b/GJ_GameSheet03-uhd/GJ_getSongInfoBtn_001.png new file mode 100644 index 00000000..8ad3e2f0 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_getSongInfoBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_gkBtn_001.png b/GJ_GameSheet03-uhd/GJ_gkBtn_001.png new file mode 100644 index 00000000..bf86d64f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_gkBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_goToLayerBtn_001.png b/GJ_GameSheet03-uhd/GJ_goToLayerBtn_001.png new file mode 100644 index 00000000..2aec6329 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_goToLayerBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_gpBtn_001.png b/GJ_GameSheet03-uhd/GJ_gpBtn_001.png new file mode 100644 index 00000000..892f7680 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_gpBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_gpgBtn_001.png b/GJ_GameSheet03-uhd/GJ_gpgBtn_001.png new file mode 100644 index 00000000..9da61a44 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_gpgBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_groupIDBtn2_001.png b/GJ_GameSheet03-uhd/GJ_groupIDBtn2_001.png new file mode 100644 index 00000000..43239020 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_groupIDBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_groupIDBtn_001.png b/GJ_GameSheet03-uhd/GJ_groupIDBtn_001.png new file mode 100644 index 00000000..803a790c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_groupIDBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_hammerIcon_001.png b/GJ_GameSheet03-uhd/GJ_hammerIcon_001.png new file mode 100644 index 00000000..9a6d978b Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_hammerIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_helpBtn2_001.png b/GJ_GameSheet03-uhd/GJ_helpBtn2_001.png new file mode 100644 index 00000000..e773c634 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_helpBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_helpBtn_001.png b/GJ_GameSheet03-uhd/GJ_helpBtn_001.png new file mode 100644 index 00000000..cead9422 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_helpBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_hsv2Btn_001.png b/GJ_GameSheet03-uhd/GJ_hsv2Btn_001.png new file mode 100644 index 00000000..5fec6338 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_hsv2Btn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_hsvBtn_001.png b/GJ_GameSheet03-uhd/GJ_hsvBtn_001.png new file mode 100644 index 00000000..9a8c67d6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_hsvBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_infoBtn_001.png b/GJ_GameSheet03-uhd/GJ_infoBtn_001.png new file mode 100644 index 00000000..281837a0 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_infoBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_infoIcon_001.png b/GJ_GameSheet03-uhd/GJ_infoIcon_001.png new file mode 100644 index 00000000..87e8c549 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_infoIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_levelComplete_001.png b/GJ_GameSheet03-uhd/GJ_levelComplete_001.png new file mode 100644 index 00000000..72470cd8 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_levelComplete_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_levelLeaderboardBtn_001.png b/GJ_GameSheet03-uhd/GJ_levelLeaderboardBtn_001.png new file mode 100644 index 00000000..2b1c7f52 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_levelLeaderboardBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_like2Btn2_001.png b/GJ_GameSheet03-uhd/GJ_like2Btn2_001.png new file mode 100644 index 00000000..c3daf1f1 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_like2Btn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_like2Btn_001.png b/GJ_GameSheet03-uhd/GJ_like2Btn_001.png new file mode 100644 index 00000000..250c6ed7 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_like2Btn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_likeBtn2_001.png b/GJ_GameSheet03-uhd/GJ_likeBtn2_001.png new file mode 100644 index 00000000..8e7e5753 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_likeBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_likeBtn_001.png b/GJ_GameSheet03-uhd/GJ_likeBtn_001.png new file mode 100644 index 00000000..47339812 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_likeBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_likesIcon_001.png b/GJ_GameSheet03-uhd/GJ_likesIcon_001.png new file mode 100644 index 00000000..419a607c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_likesIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_listAddBtn_001.png b/GJ_GameSheet03-uhd/GJ_listAddBtn_001.png new file mode 100644 index 00000000..e623142f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_listAddBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_lockGray_001.png b/GJ_GameSheet03-uhd/GJ_lockGray_001.png new file mode 100644 index 00000000..a439dedc Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_lockGray_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_lock_001.png b/GJ_GameSheet03-uhd/GJ_lock_001.png new file mode 100644 index 00000000..17127210 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_lock_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_lock_open_001.png b/GJ_GameSheet03-uhd/GJ_lock_open_001.png new file mode 100644 index 00000000..9bfb0d54 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_lock_open_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_longBtn01_001.png b/GJ_GameSheet03-uhd/GJ_longBtn01_001.png new file mode 100644 index 00000000..eb44d09b Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_longBtn01_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_longBtn02_001.png b/GJ_GameSheet03-uhd/GJ_longBtn02_001.png new file mode 100644 index 00000000..71358021 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_longBtn02_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_longBtn03_001.png b/GJ_GameSheet03-uhd/GJ_longBtn03_001.png new file mode 100644 index 00000000..2c3d50f4 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_longBtn03_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_longBtn04_001.png b/GJ_GameSheet03-uhd/GJ_longBtn04_001.png new file mode 100644 index 00000000..b0efe9bd Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_longBtn04_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_longBtn05_001.png b/GJ_GameSheet03-uhd/GJ_longBtn05_001.png new file mode 100644 index 00000000..98ed56d7 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_longBtn05_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_longBtn06_001.png b/GJ_GameSheet03-uhd/GJ_longBtn06_001.png new file mode 100644 index 00000000..e8f697d8 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_longBtn06_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_longBtn07_001.png b/GJ_GameSheet03-uhd/GJ_longBtn07_001.png new file mode 100644 index 00000000..817fe12a Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_longBtn07_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_lvlEditWorld_001.png b/GJ_GameSheet03-uhd/GJ_lvlEditWorld_001.png new file mode 100644 index 00000000..c9bee795 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_lvlEditWorld_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_lvlEdit_001.png b/GJ_GameSheet03-uhd/GJ_lvlEdit_001.png new file mode 100644 index 00000000..d27d5d24 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_lvlEdit_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_menuBtn_001.png b/GJ_GameSheet03-uhd/GJ_menuBtn_001.png new file mode 100644 index 00000000..a667a17d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_menuBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_moonsIcon_001.png b/GJ_GameSheet03-uhd/GJ_moonsIcon_001.png new file mode 100644 index 00000000..936a6008 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_moonsIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_musicIcon_001.png b/GJ_GameSheet03-uhd/GJ_musicIcon_001.png new file mode 100644 index 00000000..3638c917 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_musicIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_musicLibraryBtn_001.png b/GJ_GameSheet03-uhd/GJ_musicLibraryBtn_001.png new file mode 100644 index 00000000..f6e85bf5 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_musicLibraryBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_musicOffBtn_001.png b/GJ_GameSheet03-uhd/GJ_musicOffBtn_001.png new file mode 100644 index 00000000..4b49b9fd Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_musicOffBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_musicOnBtn_001.png b/GJ_GameSheet03-uhd/GJ_musicOnBtn_001.png new file mode 100644 index 00000000..b082e5ca Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_musicOnBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_myLevelsTxt_001.png b/GJ_GameSheet03-uhd/GJ_myLevelsTxt_001.png new file mode 100644 index 00000000..6a46459f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_myLevelsTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_myListsTxt_001.png b/GJ_GameSheet03-uhd/GJ_myListsTxt_001.png new file mode 100644 index 00000000..440c2737 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_myListsTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_myServerBtn_001.png b/GJ_GameSheet03-uhd/GJ_myServerBtn_001.png new file mode 100644 index 00000000..9e17a86f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_myServerBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_nameTxt_001.png b/GJ_GameSheet03-uhd/GJ_nameTxt_001.png new file mode 100644 index 00000000..e497e6cf Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_nameTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_ncsLibraryBtn_001.png b/GJ_GameSheet03-uhd/GJ_ncsLibraryBtn_001.png new file mode 100644 index 00000000..f782dddd Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_ncsLibraryBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_newBest_001.png b/GJ_GameSheet03-uhd/GJ_newBest_001.png new file mode 100644 index 00000000..cbc51776 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_newBest_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_newBtn_001.png b/GJ_GameSheet03-uhd/GJ_newBtn_001.png new file mode 100644 index 00000000..c74b2f5c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_newBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_ngBtn_001.png b/GJ_GameSheet03-uhd/GJ_ngBtn_001.png new file mode 100644 index 00000000..218a5184 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_ngBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_normalBtn_001.png b/GJ_GameSheet03-uhd/GJ_normalBtn_001.png new file mode 100644 index 00000000..55a6bc64 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_normalBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_noteIcon_001.png b/GJ_GameSheet03-uhd/GJ_noteIcon_001.png new file mode 100644 index 00000000..f110a1f5 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_noteIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_optionsBtn02_001.png b/GJ_GameSheet03-uhd/GJ_optionsBtn02_001.png new file mode 100644 index 00000000..fa6799e6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_optionsBtn02_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_optionsBtn_001.png b/GJ_GameSheet03-uhd/GJ_optionsBtn_001.png new file mode 100644 index 00000000..1fc3824f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_optionsBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_optionsTxt_001.png b/GJ_GameSheet03-uhd/GJ_optionsTxt_001.png new file mode 100644 index 00000000..36b05eb2 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_optionsTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_orderUpBtn_001.png b/GJ_GameSheet03-uhd/GJ_orderUpBtn_001.png new file mode 100644 index 00000000..36cfae69 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_orderUpBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_paintBtn_001.png b/GJ_GameSheet03-uhd/GJ_paintBtn_001.png new file mode 100644 index 00000000..82c09827 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_paintBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_pasteBtn2_001.png b/GJ_GameSheet03-uhd/GJ_pasteBtn2_001.png new file mode 100644 index 00000000..f09ced7b Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_pasteBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_pasteBtn_001.png b/GJ_GameSheet03-uhd/GJ_pasteBtn_001.png new file mode 100644 index 00000000..308007d2 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_pasteBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_pasteColorBtn_001.png b/GJ_GameSheet03-uhd/GJ_pasteColorBtn_001.png new file mode 100644 index 00000000..d5531f70 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_pasteColorBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_pasteStateBtn_001.png b/GJ_GameSheet03-uhd/GJ_pasteStateBtn_001.png new file mode 100644 index 00000000..b2e3edeb Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_pasteStateBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_pauseBtn_001.png b/GJ_GameSheet03-uhd/GJ_pauseBtn_001.png new file mode 100644 index 00000000..4a7a278f Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_pauseBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_pauseBtn_clean_001.png b/GJ_GameSheet03-uhd/GJ_pauseBtn_clean_001.png new file mode 100644 index 00000000..62c66733 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_pauseBtn_clean_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_pauseEditorBtn_001.png b/GJ_GameSheet03-uhd/GJ_pauseEditorBtn_001.png new file mode 100644 index 00000000..26bd7da9 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_pauseEditorBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_plainBtn_001.png b/GJ_GameSheet03-uhd/GJ_plainBtn_001.png new file mode 100644 index 00000000..3e856750 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_plainBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_playBtn2_001.png b/GJ_GameSheet03-uhd/GJ_playBtn2_001.png new file mode 100644 index 00000000..2054037b Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_playBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_playEditorBtn_001.png b/GJ_GameSheet03-uhd/GJ_playEditorBtn_001.png new file mode 100644 index 00000000..5a4b321e Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_playEditorBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_playMusicBtn_001.png b/GJ_GameSheet03-uhd/GJ_playMusicBtn_001.png new file mode 100644 index 00000000..9702e1d6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_playMusicBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_plus2Btn_001.png b/GJ_GameSheet03-uhd/GJ_plus2Btn_001.png new file mode 100644 index 00000000..6b38074b Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_plus2Btn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_plus3Btn_001.png b/GJ_GameSheet03-uhd/GJ_plus3Btn_001.png new file mode 100644 index 00000000..187cf697 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_plus3Btn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_plusBtn_001.png b/GJ_GameSheet03-uhd/GJ_plusBtn_001.png new file mode 100644 index 00000000..3f736229 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_plusBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_pointsIcon_001.png b/GJ_GameSheet03-uhd/GJ_pointsIcon_001.png new file mode 100644 index 00000000..2c54d44c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_pointsIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_practiceBtn_001.png b/GJ_GameSheet03-uhd/GJ_practiceBtn_001.png new file mode 100644 index 00000000..5b650f1d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_practiceBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_practiceComplete_001.png b/GJ_GameSheet03-uhd/GJ_practiceComplete_001.png new file mode 100644 index 00000000..ae60cc13 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_practiceComplete_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_practiceTxt_001.png b/GJ_GameSheet03-uhd/GJ_practiceTxt_001.png new file mode 100644 index 00000000..7e513a12 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_practiceTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_profileButton_001.png b/GJ_GameSheet03-uhd/GJ_profileButton_001.png new file mode 100644 index 00000000..339004fe Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_profileButton_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_rateDiffBtn2_001.png b/GJ_GameSheet03-uhd/GJ_rateDiffBtn2_001.png new file mode 100644 index 00000000..2c1a14a3 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_rateDiffBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_rateDiffBtnMod_001.png b/GJ_GameSheet03-uhd/GJ_rateDiffBtnMod_001.png new file mode 100644 index 00000000..18987c21 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_rateDiffBtnMod_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_rateDiffBtn_001.png b/GJ_GameSheet03-uhd/GJ_rateDiffBtn_001.png new file mode 100644 index 00000000..75e37890 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_rateDiffBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_redoBtn_001.png b/GJ_GameSheet03-uhd/GJ_redoBtn_001.png new file mode 100644 index 00000000..cd06703d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_redoBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_removeCheckBtn_001.png b/GJ_GameSheet03-uhd/GJ_removeCheckBtn_001.png new file mode 100644 index 00000000..09c0a399 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_removeCheckBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_replayBtn_001.png b/GJ_GameSheet03-uhd/GJ_replayBtn_001.png new file mode 100644 index 00000000..a5352579 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_replayBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_replayFullBtn_001.png b/GJ_GameSheet03-uhd/GJ_replayFullBtn_001.png new file mode 100644 index 00000000..f633f0e1 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_replayFullBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_reportBtn_001.png b/GJ_GameSheet03-uhd/GJ_reportBtn_001.png new file mode 100644 index 00000000..161f772d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_reportBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_resetBtn_001.png b/GJ_GameSheet03-uhd/GJ_resetBtn_001.png new file mode 100644 index 00000000..2a185d8d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_resetBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_restartCheckBtn_001.png b/GJ_GameSheet03-uhd/GJ_restartCheckBtn_001.png new file mode 100644 index 00000000..872bbbd0 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_restartCheckBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_rewardBtn_001.png b/GJ_GameSheet03-uhd/GJ_rewardBtn_001.png new file mode 100644 index 00000000..c34af056 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_rewardBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_rotationControlBtn01_001.png b/GJ_GameSheet03-uhd/GJ_rotationControlBtn01_001.png new file mode 100644 index 00000000..38c359e1 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_rotationControlBtn01_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_rotationControlBtn02_001.png b/GJ_GameSheet03-uhd/GJ_rotationControlBtn02_001.png new file mode 100644 index 00000000..4ac431fd Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_rotationControlBtn02_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sDownloadIcon_001.png b/GJ_GameSheet03-uhd/GJ_sDownloadIcon_001.png new file mode 100644 index 00000000..07b90d63 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sDownloadIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sFollowedIcon_001.png b/GJ_GameSheet03-uhd/GJ_sFollowedIcon_001.png new file mode 100644 index 00000000..9e77450e Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sFollowedIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sFriendsIcon_001.png b/GJ_GameSheet03-uhd/GJ_sFriendsIcon_001.png new file mode 100644 index 00000000..fb9c8ba8 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sFriendsIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sLikeIcon_001.png b/GJ_GameSheet03-uhd/GJ_sLikeIcon_001.png new file mode 100644 index 00000000..e8200ed1 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sLikeIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sMagicIcon_001.png b/GJ_GameSheet03-uhd/GJ_sMagicIcon_001.png new file mode 100644 index 00000000..5a9bce54 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sMagicIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sModIcon_001.png b/GJ_GameSheet03-uhd/GJ_sModIcon_001.png new file mode 100644 index 00000000..04472ffc Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sModIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sRecentIcon_001.png b/GJ_GameSheet03-uhd/GJ_sRecentIcon_001.png new file mode 100644 index 00000000..ee4b1cdc Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sRecentIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sStarsIcon_001.png b/GJ_GameSheet03-uhd/GJ_sStarsIcon_001.png new file mode 100644 index 00000000..af56c692 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sStarsIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sTrendingIcon_001.png b/GJ_GameSheet03-uhd/GJ_sTrendingIcon_001.png new file mode 100644 index 00000000..101f66b4 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sTrendingIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_savedSongsBtn_001.png b/GJ_GameSheet03-uhd/GJ_savedSongsBtn_001.png new file mode 100644 index 00000000..5261fca1 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_savedSongsBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_secretLock4_small_001.png b/GJ_GameSheet03-uhd/GJ_secretLock4_small_001.png new file mode 100644 index 00000000..33509c34 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_secretLock4_small_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_secretLock_001.png b/GJ_GameSheet03-uhd/GJ_secretLock_001.png new file mode 100644 index 00000000..db6ab254 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_secretLock_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_selectSongBtn_001.png b/GJ_GameSheet03-uhd/GJ_selectSongBtn_001.png new file mode 100644 index 00000000..9a9671b2 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_selectSongBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_selectSongOnBtn_001.png b/GJ_GameSheet03-uhd/GJ_selectSongOnBtn_001.png new file mode 100644 index 00000000..d35352c3 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_selectSongOnBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_select_001.png b/GJ_GameSheet03-uhd/GJ_select_001.png new file mode 100644 index 00000000..24adb371 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_select_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_shardsBtn_001.png b/GJ_GameSheet03-uhd/GJ_shardsBtn_001.png new file mode 100644 index 00000000..ac1383a6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_shardsBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_shareBtn_001.png b/GJ_GameSheet03-uhd/GJ_shareBtn_001.png new file mode 100644 index 00000000..529c8143 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_shareBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sideArt_001.png b/GJ_GameSheet03-uhd/GJ_sideArt_001.png new file mode 100644 index 00000000..5b8da9f5 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sideArt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_smallModeIcon_001.png b/GJ_GameSheet03-uhd/GJ_smallModeIcon_001.png new file mode 100644 index 00000000..4f4964d8 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_smallModeIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_sortIcon_001.png b/GJ_GameSheet03-uhd/GJ_sortIcon_001.png new file mode 100644 index 00000000..9fd0612c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_sortIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_starBtn2_001.png b/GJ_GameSheet03-uhd/GJ_starBtn2_001.png new file mode 100644 index 00000000..ec284766 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_starBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_starBtnMod_001.png b/GJ_GameSheet03-uhd/GJ_starBtnMod_001.png new file mode 100644 index 00000000..9c1e875d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_starBtnMod_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_starBtn_001.png b/GJ_GameSheet03-uhd/GJ_starBtn_001.png new file mode 100644 index 00000000..545cc4c4 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_starBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_starsIcon_001.png b/GJ_GameSheet03-uhd/GJ_starsIcon_001.png new file mode 100644 index 00000000..91f05bca Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_starsIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_starsIcon_gray_001.png b/GJ_GameSheet03-uhd/GJ_starsIcon_gray_001.png new file mode 100644 index 00000000..4b1c5d8c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_starsIcon_gray_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_statsBtn_001.png b/GJ_GameSheet03-uhd/GJ_statsBtn_001.png new file mode 100644 index 00000000..e4c8d621 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_statsBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_stopEditorBtn_001.png b/GJ_GameSheet03-uhd/GJ_stopEditorBtn_001.png new file mode 100644 index 00000000..f75321c6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_stopEditorBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_stopMusicBtn_001.png b/GJ_GameSheet03-uhd/GJ_stopMusicBtn_001.png new file mode 100644 index 00000000..a3348bdb Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_stopMusicBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_stuffTxt_001.png b/GJ_GameSheet03-uhd/GJ_stuffTxt_001.png new file mode 100644 index 00000000..a231607a Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_stuffTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_tabOff_001.png b/GJ_GameSheet03-uhd/GJ_tabOff_001.png new file mode 100644 index 00000000..c232a670 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_tabOff_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_tabOn_001.png b/GJ_GameSheet03-uhd/GJ_tabOn_001.png new file mode 100644 index 00000000..206dc2aa Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_tabOn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_table_bottom_001.png b/GJ_GameSheet03-uhd/GJ_table_bottom_001.png new file mode 100644 index 00000000..0bbe2142 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_table_bottom_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_table_corner_001.png b/GJ_GameSheet03-uhd/GJ_table_corner_001.png new file mode 100644 index 00000000..b50216d2 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_table_corner_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_table_side_001.png b/GJ_GameSheet03-uhd/GJ_table_side_001.png new file mode 100644 index 00000000..0212ba5c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_table_side_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_table_top02_001.png b/GJ_GameSheet03-uhd/GJ_table_top02_001.png new file mode 100644 index 00000000..3e464e75 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_table_top02_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_table_top_001.png b/GJ_GameSheet03-uhd/GJ_table_top_001.png new file mode 100644 index 00000000..1577be59 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_table_top_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_timeIcon_001.png b/GJ_GameSheet03-uhd/GJ_timeIcon_001.png new file mode 100644 index 00000000..4ac8eee6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_timeIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_topBar_001.png b/GJ_GameSheet03-uhd/GJ_topBar_001.png new file mode 100644 index 00000000..aef97c0d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_topBar_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_trailerBtn_001.png b/GJ_GameSheet03-uhd/GJ_trailerBtn_001.png new file mode 100644 index 00000000..ba4e250d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_trailerBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_trashBtn_001.png b/GJ_GameSheet03-uhd/GJ_trashBtn_001.png new file mode 100644 index 00000000..eaa12f35 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_trashBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_twitchTxt_001.png b/GJ_GameSheet03-uhd/GJ_twitchTxt_001.png new file mode 100644 index 00000000..f94bdbd4 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_twitchTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_twitterTxt_001.png b/GJ_GameSheet03-uhd/GJ_twitterTxt_001.png new file mode 100644 index 00000000..14180635 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_twitterTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_undoBtn_001.png b/GJ_GameSheet03-uhd/GJ_undoBtn_001.png new file mode 100644 index 00000000..b3992f52 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_undoBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_unlockTxt_001.png b/GJ_GameSheet03-uhd/GJ_unlockTxt_001.png new file mode 100644 index 00000000..816536b6 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_unlockTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_updateBtn_001.png b/GJ_GameSheet03-uhd/GJ_updateBtn_001.png new file mode 100644 index 00000000..2021307c Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_updateBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_viewLevelsBtn_001.png b/GJ_GameSheet03-uhd/GJ_viewLevelsBtn_001.png new file mode 100644 index 00000000..87a9f5a0 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_viewLevelsBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_viewListsBtn_001.png b/GJ_GameSheet03-uhd/GJ_viewListsBtn_001.png new file mode 100644 index 00000000..d4676b96 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_viewListsBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_viewProfileTxt_001.png b/GJ_GameSheet03-uhd/GJ_viewProfileTxt_001.png new file mode 100644 index 00000000..c6512c28 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_viewProfileTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_yourProfileTxt_001.png b/GJ_GameSheet03-uhd/GJ_yourProfileTxt_001.png new file mode 100644 index 00000000..c8e66747 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_yourProfileTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_youtubeTxt_001.png b/GJ_GameSheet03-uhd/GJ_youtubeTxt_001.png new file mode 100644 index 00000000..c7aa038d Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_youtubeTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_zoomInBtn_001.png b/GJ_GameSheet03-uhd/GJ_zoomInBtn_001.png new file mode 100644 index 00000000..e62659cc Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_zoomInBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/GJ_zoomOutBtn_001.png b/GJ_GameSheet03-uhd/GJ_zoomOutBtn_001.png new file mode 100644 index 00000000..f41f75a1 Binary files /dev/null and b/GJ_GameSheet03-uhd/GJ_zoomOutBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/PBtn_Arrow_001.png b/GJ_GameSheet03-uhd/PBtn_Arrow_001.png new file mode 100644 index 00000000..9bd90d83 Binary files /dev/null and b/GJ_GameSheet03-uhd/PBtn_Arrow_001.png differ diff --git a/GJ_GameSheet03-uhd/PBtn_Jump_001.png b/GJ_GameSheet03-uhd/PBtn_Jump_001.png new file mode 100644 index 00000000..4e12c05d Binary files /dev/null and b/GJ_GameSheet03-uhd/PBtn_Jump_001.png differ diff --git a/GJ_GameSheet03-uhd/PBtn_Move_001.png b/GJ_GameSheet03-uhd/PBtn_Move_001.png new file mode 100644 index 00000000..50c76a48 Binary files /dev/null and b/GJ_GameSheet03-uhd/PBtn_Move_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_blocked_001.png b/GJ_GameSheet03-uhd/accountBtn_blocked_001.png new file mode 100644 index 00000000..86b02326 Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_blocked_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_friends_001.png b/GJ_GameSheet03-uhd/accountBtn_friends_001.png new file mode 100644 index 00000000..0e600529 Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_friends_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_messages_001.png b/GJ_GameSheet03-uhd/accountBtn_messages_001.png new file mode 100644 index 00000000..8de64a5a Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_messages_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_messagessent_001.png b/GJ_GameSheet03-uhd/accountBtn_messagessent_001.png new file mode 100644 index 00000000..b4cf3645 Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_messagessent_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_myLevels_001.png b/GJ_GameSheet03-uhd/accountBtn_myLevels_001.png new file mode 100644 index 00000000..42c51f72 Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_myLevels_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_myLists_001.png b/GJ_GameSheet03-uhd/accountBtn_myLists_001.png new file mode 100644 index 00000000..91124a9d Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_myLists_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_pendingRequest_001.png b/GJ_GameSheet03-uhd/accountBtn_pendingRequest_001.png new file mode 100644 index 00000000..3895288d Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_pendingRequest_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_pending_001.png b/GJ_GameSheet03-uhd/accountBtn_pending_001.png new file mode 100644 index 00000000..3443d92a Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_pending_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_removeFriend_001.png b/GJ_GameSheet03-uhd/accountBtn_removeFriend_001.png new file mode 100644 index 00000000..083f3dc2 Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_removeFriend_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_requests_001.png b/GJ_GameSheet03-uhd/accountBtn_requests_001.png new file mode 100644 index 00000000..fc5ea822 Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_requests_001.png differ diff --git a/GJ_GameSheet03-uhd/accountBtn_settings_001.png b/GJ_GameSheet03-uhd/accountBtn_settings_001.png new file mode 100644 index 00000000..43f90660 Binary files /dev/null and b/GJ_GameSheet03-uhd/accountBtn_settings_001.png differ diff --git a/GJ_GameSheet03-uhd/achievementGlow_001.png b/GJ_GameSheet03-uhd/achievementGlow_001.png new file mode 100644 index 00000000..5707608e Binary files /dev/null and b/GJ_GameSheet03-uhd/achievementGlow_001.png differ diff --git a/GJ_GameSheet03-uhd/adRope_001.png b/GJ_GameSheet03-uhd/adRope_001.png new file mode 100644 index 00000000..147e1773 Binary files /dev/null and b/GJ_GameSheet03-uhd/adRope_001.png differ diff --git a/GJ_GameSheet03-uhd/backArrowPlain_01_001.png b/GJ_GameSheet03-uhd/backArrowPlain_01_001.png new file mode 100644 index 00000000..4d55290d Binary files /dev/null and b/GJ_GameSheet03-uhd/backArrowPlain_01_001.png differ diff --git a/GJ_GameSheet03-uhd/bonusShard2Small_001.png b/GJ_GameSheet03-uhd/bonusShard2Small_001.png new file mode 100644 index 00000000..f79e7bc1 Binary files /dev/null and b/GJ_GameSheet03-uhd/bonusShard2Small_001.png differ diff --git a/GJ_GameSheet03-uhd/bonusShardLabel_001.png b/GJ_GameSheet03-uhd/bonusShardLabel_001.png new file mode 100644 index 00000000..f972e4a0 Binary files /dev/null and b/GJ_GameSheet03-uhd/bonusShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/bonusShardSmall_001.png b/GJ_GameSheet03-uhd/bonusShardSmall_001.png new file mode 100644 index 00000000..beb2d1c6 Binary files /dev/null and b/GJ_GameSheet03-uhd/bonusShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/btn_chatHistory_001.png b/GJ_GameSheet03-uhd/btn_chatHistory_001.png new file mode 100644 index 00000000..443d5218 Binary files /dev/null and b/GJ_GameSheet03-uhd/btn_chatHistory_001.png differ diff --git a/GJ_GameSheet03-uhd/chestIcon_001.png b/GJ_GameSheet03-uhd/chestIcon_001.png new file mode 100644 index 00000000..9e4a3e53 Binary files /dev/null and b/GJ_GameSheet03-uhd/chestIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/collaborationIcon_001.png b/GJ_GameSheet03-uhd/collaborationIcon_001.png new file mode 100644 index 00000000..81cdcf27 Binary files /dev/null and b/GJ_GameSheet03-uhd/collaborationIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/communityCreditsBtn_001.png b/GJ_GameSheet03-uhd/communityCreditsBtn_001.png new file mode 100644 index 00000000..16c363db Binary files /dev/null and b/GJ_GameSheet03-uhd/communityCreditsBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/communityIcon_01_001.png b/GJ_GameSheet03-uhd/communityIcon_01_001.png new file mode 100644 index 00000000..de576723 Binary files /dev/null and b/GJ_GameSheet03-uhd/communityIcon_01_001.png differ diff --git a/GJ_GameSheet03-uhd/communityIcon_02_001.png b/GJ_GameSheet03-uhd/communityIcon_02_001.png new file mode 100644 index 00000000..23730146 Binary files /dev/null and b/GJ_GameSheet03-uhd/communityIcon_02_001.png differ diff --git a/GJ_GameSheet03-uhd/communityIcon_03_001.png b/GJ_GameSheet03-uhd/communityIcon_03_001.png new file mode 100644 index 00000000..800ededf Binary files /dev/null and b/GJ_GameSheet03-uhd/communityIcon_03_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_A_001.png b/GJ_GameSheet03-uhd/controllerBtn_A_001.png new file mode 100644 index 00000000..371ed5a2 Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_A_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_B_001.png b/GJ_GameSheet03-uhd/controllerBtn_B_001.png new file mode 100644 index 00000000..9ac912b4 Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_B_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_Back_001.png b/GJ_GameSheet03-uhd/controllerBtn_Back_001.png new file mode 100644 index 00000000..927a9b0c Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_Back_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_DPad_Down_001.png b/GJ_GameSheet03-uhd/controllerBtn_DPad_Down_001.png new file mode 100644 index 00000000..1314081d Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_DPad_Down_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_DPad_Left_001.png b/GJ_GameSheet03-uhd/controllerBtn_DPad_Left_001.png new file mode 100644 index 00000000..ec272f2d Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_DPad_Left_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_DPad_Right_001.png b/GJ_GameSheet03-uhd/controllerBtn_DPad_Right_001.png new file mode 100644 index 00000000..cd91b447 Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_DPad_Right_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_DPad_Up_001.png b/GJ_GameSheet03-uhd/controllerBtn_DPad_Up_001.png new file mode 100644 index 00000000..c642ae2a Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_DPad_Up_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_LThumb_001.png b/GJ_GameSheet03-uhd/controllerBtn_LThumb_001.png new file mode 100644 index 00000000..da95a5d6 Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_LThumb_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_RThumb_001.png b/GJ_GameSheet03-uhd/controllerBtn_RThumb_001.png new file mode 100644 index 00000000..7e8e1656 Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_RThumb_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_Start_001.png b/GJ_GameSheet03-uhd/controllerBtn_Start_001.png new file mode 100644 index 00000000..92503075 Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_Start_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_X_001.png b/GJ_GameSheet03-uhd/controllerBtn_X_001.png new file mode 100644 index 00000000..2755ef0c Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_X_001.png differ diff --git a/GJ_GameSheet03-uhd/controllerBtn_Y_001.png b/GJ_GameSheet03-uhd/controllerBtn_Y_001.png new file mode 100644 index 00000000..dcc45cd2 Binary files /dev/null and b/GJ_GameSheet03-uhd/controllerBtn_Y_001.png differ diff --git a/GJ_GameSheet03-uhd/creators_tab_off_001.png b/GJ_GameSheet03-uhd/creators_tab_off_001.png new file mode 100644 index 00000000..64179adc Binary files /dev/null and b/GJ_GameSheet03-uhd/creators_tab_off_001.png differ diff --git a/GJ_GameSheet03-uhd/creators_tab_on_001.png b/GJ_GameSheet03-uhd/creators_tab_on_001.png new file mode 100644 index 00000000..33c329b4 Binary files /dev/null and b/GJ_GameSheet03-uhd/creators_tab_on_001.png differ diff --git a/GJ_GameSheet03-uhd/currencyDiamondIcon_001.png b/GJ_GameSheet03-uhd/currencyDiamondIcon_001.png new file mode 100644 index 00000000..125f81df Binary files /dev/null and b/GJ_GameSheet03-uhd/currencyDiamondIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/currencyOrbIcon_001.png b/GJ_GameSheet03-uhd/currencyOrbIcon_001.png new file mode 100644 index 00000000..f36618dc Binary files /dev/null and b/GJ_GameSheet03-uhd/currencyOrbIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/currencyOrb_001.png b/GJ_GameSheet03-uhd/currencyOrb_001.png new file mode 100644 index 00000000..60ea8b8c Binary files /dev/null and b/GJ_GameSheet03-uhd/currencyOrb_001.png differ diff --git a/GJ_GameSheet03-uhd/dailyLevelCorner_001.png b/GJ_GameSheet03-uhd/dailyLevelCorner_001.png new file mode 100644 index 00000000..6df28e1d Binary files /dev/null and b/GJ_GameSheet03-uhd/dailyLevelCorner_001.png differ diff --git a/GJ_GameSheet03-uhd/dailyLevelLabel_001.png b/GJ_GameSheet03-uhd/dailyLevelLabel_001.png new file mode 100644 index 00000000..6344dce2 Binary files /dev/null and b/GJ_GameSheet03-uhd/dailyLevelLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/deleteFilter_custom_001.png b/GJ_GameSheet03-uhd/deleteFilter_custom_001.png new file mode 100644 index 00000000..bebf1f7c Binary files /dev/null and b/GJ_GameSheet03-uhd/deleteFilter_custom_001.png differ diff --git a/GJ_GameSheet03-uhd/deleteFilter_details_001.png b/GJ_GameSheet03-uhd/deleteFilter_details_001.png new file mode 100644 index 00000000..524b0465 Binary files /dev/null and b/GJ_GameSheet03-uhd/deleteFilter_details_001.png differ diff --git a/GJ_GameSheet03-uhd/deleteFilter_none_001.png b/GJ_GameSheet03-uhd/deleteFilter_none_001.png new file mode 100644 index 00000000..019d0b77 Binary files /dev/null and b/GJ_GameSheet03-uhd/deleteFilter_none_001.png differ diff --git a/GJ_GameSheet03-uhd/deleteFilter_static_001.png b/GJ_GameSheet03-uhd/deleteFilter_static_001.png new file mode 100644 index 00000000..74bd685c Binary files /dev/null and b/GJ_GameSheet03-uhd/deleteFilter_static_001.png differ diff --git a/GJ_GameSheet03-uhd/developedBy_001.png b/GJ_GameSheet03-uhd/developedBy_001.png new file mode 100644 index 00000000..d3e500fe Binary files /dev/null and b/GJ_GameSheet03-uhd/developedBy_001.png differ diff --git a/GJ_GameSheet03-uhd/diamond_small01_001.png b/GJ_GameSheet03-uhd/diamond_small01_001.png new file mode 100644 index 00000000..1f9c93d2 Binary files /dev/null and b/GJ_GameSheet03-uhd/diamond_small01_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_00_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_00_btn_001.png new file mode 100644 index 00000000..d0ea651a Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_00_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_01_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_01_btn_001.png new file mode 100644 index 00000000..c5f98878 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_01_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_02_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_02_btn_001.png new file mode 100644 index 00000000..4b76c6c6 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_02_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_03_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_03_btn_001.png new file mode 100644 index 00000000..134d7190 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_03_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_04_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_04_btn_001.png new file mode 100644 index 00000000..b0b8a383 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_04_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_05_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_05_btn_001.png new file mode 100644 index 00000000..7dc1d873 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_05_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_06_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_06_btn_001.png new file mode 100644 index 00000000..a069b54d Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_06_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_07_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_07_btn_001.png new file mode 100644 index 00000000..31fb78bd Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_07_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_08_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_08_btn_001.png new file mode 100644 index 00000000..bf901031 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_08_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_09_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_09_btn_001.png new file mode 100644 index 00000000..10305551 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_09_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_10_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_10_btn_001.png new file mode 100644 index 00000000..c8716528 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_10_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/diffIcon_auto_btn_001.png b/GJ_GameSheet03-uhd/diffIcon_auto_btn_001.png new file mode 100644 index 00000000..562eb8d3 Binary files /dev/null and b/GJ_GameSheet03-uhd/diffIcon_auto_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficultySelected_001.png b/GJ_GameSheet03-uhd/difficultySelected_001.png new file mode 100644 index 00000000..14d72f7d Binary files /dev/null and b/GJ_GameSheet03-uhd/difficultySelected_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_00_btn_001.png b/GJ_GameSheet03-uhd/difficulty_00_btn_001.png new file mode 100644 index 00000000..70efa097 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_00_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_01_btn_001.png b/GJ_GameSheet03-uhd/difficulty_01_btn_001.png new file mode 100644 index 00000000..b44d3a90 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_01_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_02_btn_001.png b/GJ_GameSheet03-uhd/difficulty_02_btn_001.png new file mode 100644 index 00000000..24691830 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_02_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_03_btn_001.png b/GJ_GameSheet03-uhd/difficulty_03_btn_001.png new file mode 100644 index 00000000..72400f88 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_03_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_04_btn_001.png b/GJ_GameSheet03-uhd/difficulty_04_btn_001.png new file mode 100644 index 00000000..cfe4c75a Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_04_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_05_btn_001.png b/GJ_GameSheet03-uhd/difficulty_05_btn_001.png new file mode 100644 index 00000000..b879ee03 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_05_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_06_btn2_001.png b/GJ_GameSheet03-uhd/difficulty_06_btn2_001.png new file mode 100644 index 00000000..ded8c0a9 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_06_btn2_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_06_btn_001.png b/GJ_GameSheet03-uhd/difficulty_06_btn_001.png new file mode 100644 index 00000000..79afd9d6 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_06_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_07_btn2_001.png b/GJ_GameSheet03-uhd/difficulty_07_btn2_001.png new file mode 100644 index 00000000..3c7bb8e0 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_07_btn2_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_07_btn_001.png b/GJ_GameSheet03-uhd/difficulty_07_btn_001.png new file mode 100644 index 00000000..14f4a502 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_07_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_08_btn2_001.png b/GJ_GameSheet03-uhd/difficulty_08_btn2_001.png new file mode 100644 index 00000000..f8eb8a41 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_08_btn2_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_08_btn_001.png b/GJ_GameSheet03-uhd/difficulty_08_btn_001.png new file mode 100644 index 00000000..5e514970 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_08_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_09_btn2_001.png b/GJ_GameSheet03-uhd/difficulty_09_btn2_001.png new file mode 100644 index 00000000..f7c40d3b Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_09_btn2_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_09_btn_001.png b/GJ_GameSheet03-uhd/difficulty_09_btn_001.png new file mode 100644 index 00000000..a652db3a Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_09_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_10_btn2_001.png b/GJ_GameSheet03-uhd/difficulty_10_btn2_001.png new file mode 100644 index 00000000..f35c9791 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_10_btn2_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_10_btn_001.png b/GJ_GameSheet03-uhd/difficulty_10_btn_001.png new file mode 100644 index 00000000..4214ee2b Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_10_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/difficulty_auto_btn_001.png b/GJ_GameSheet03-uhd/difficulty_auto_btn_001.png new file mode 100644 index 00000000..34172269 Binary files /dev/null and b/GJ_GameSheet03-uhd/difficulty_auto_btn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_addCBtn_001.png b/GJ_GameSheet03-uhd/edit_addCBtn_001.png new file mode 100644 index 00000000..0f08ae8f Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_addCBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_areaModeBtn01_001.png b/GJ_GameSheet03-uhd/edit_areaModeBtn01_001.png new file mode 100644 index 00000000..0cca0409 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_areaModeBtn01_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_areaModeBtn02_001.png b/GJ_GameSheet03-uhd/edit_areaModeBtn02_001.png new file mode 100644 index 00000000..e114491c Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_areaModeBtn02_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_areaModeBtn03_001.png b/GJ_GameSheet03-uhd/edit_areaModeBtn03_001.png new file mode 100644 index 00000000..b412f234 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_areaModeBtn03_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_areaModeBtn03b_001.png b/GJ_GameSheet03-uhd/edit_areaModeBtn03b_001.png new file mode 100644 index 00000000..2cf95846 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_areaModeBtn03b_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_areaModeBtn04_001.png b/GJ_GameSheet03-uhd/edit_areaModeBtn04_001.png new file mode 100644 index 00000000..1978763d Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_areaModeBtn04_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_areaModeBtn05_001.png b/GJ_GameSheet03-uhd/edit_areaModeBtn05_001.png new file mode 100644 index 00000000..15e692cb Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_areaModeBtn05_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_buildBtn_001.png b/GJ_GameSheet03-uhd/edit_buildBtn_001.png new file mode 100644 index 00000000..7b976bce Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_buildBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_buildSBtn_001.png b/GJ_GameSheet03-uhd/edit_buildSBtn_001.png new file mode 100644 index 00000000..6633ca07 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_buildSBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_ccwBtn_001.png b/GJ_GameSheet03-uhd/edit_ccwBtn_001.png new file mode 100644 index 00000000..6b00ba89 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_ccwBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_cwBtn_001.png b/GJ_GameSheet03-uhd/edit_cwBtn_001.png new file mode 100644 index 00000000..d56301d3 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_cwBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_delBtnSmall_001.png b/GJ_GameSheet03-uhd/edit_delBtnSmall_001.png new file mode 100644 index 00000000..45acc824 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_delBtnSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_delBtn_001.png b/GJ_GameSheet03-uhd/edit_delBtn_001.png new file mode 100644 index 00000000..e5398e18 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_delBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_delCBtn_001.png b/GJ_GameSheet03-uhd/edit_delCBtn_001.png new file mode 100644 index 00000000..4e9f81d3 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_delCBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_deleteBtn_001.png b/GJ_GameSheet03-uhd/edit_deleteBtn_001.png new file mode 100644 index 00000000..91a0108a Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_deleteBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_deleteSBtn_001.png b/GJ_GameSheet03-uhd/edit_deleteSBtn_001.png new file mode 100644 index 00000000..07dbe7cb Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_deleteSBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_deselectBtn_001.png b/GJ_GameSheet03-uhd/edit_deselectBtn_001.png new file mode 100644 index 00000000..f995809d Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_deselectBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_downBtn2_001.png b/GJ_GameSheet03-uhd/edit_downBtn2_001.png new file mode 100644 index 00000000..2bec4ffb Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_downBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_downBtn3_001.png b/GJ_GameSheet03-uhd/edit_downBtn3_001.png new file mode 100644 index 00000000..efc9f476 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_downBtn3_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_downBtn5_001.png b/GJ_GameSheet03-uhd/edit_downBtn5_001.png new file mode 100644 index 00000000..22a37cb0 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_downBtn5_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_downBtn_001.png b/GJ_GameSheet03-uhd/edit_downBtn_001.png new file mode 100644 index 00000000..4810378c Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_downBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_editBtn_001.png b/GJ_GameSheet03-uhd/edit_editBtn_001.png new file mode 100644 index 00000000..55d1a1e9 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_editBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_editSBtn_001.png b/GJ_GameSheet03-uhd/edit_editSBtn_001.png new file mode 100644 index 00000000..74417969 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_editSBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_enableRotateBtn_001.png b/GJ_GameSheet03-uhd/edit_enableRotateBtn_001.png new file mode 100644 index 00000000..fe864486 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_enableRotateBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_findBtn_001.png b/GJ_GameSheet03-uhd/edit_findBtn_001.png new file mode 100644 index 00000000..34b6069b Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_findBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_flipXBtn_001.png b/GJ_GameSheet03-uhd/edit_flipXBtn_001.png new file mode 100644 index 00000000..3f685b78 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_flipXBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_flipYBtn_001.png b/GJ_GameSheet03-uhd/edit_flipYBtn_001.png new file mode 100644 index 00000000..15f14ddf Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_flipYBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_freeMoveBtn_001.png b/GJ_GameSheet03-uhd/edit_freeMoveBtn_001.png new file mode 100644 index 00000000..adb56212 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_freeMoveBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_freeRotateBtn_001.png b/GJ_GameSheet03-uhd/edit_freeRotateBtn_001.png new file mode 100644 index 00000000..c30a0e92 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_freeRotateBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_leftBtn2_001.png b/GJ_GameSheet03-uhd/edit_leftBtn2_001.png new file mode 100644 index 00000000..7f92c748 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_leftBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_leftBtn3_001.png b/GJ_GameSheet03-uhd/edit_leftBtn3_001.png new file mode 100644 index 00000000..4ed39b94 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_leftBtn3_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_leftBtn5_001.png b/GJ_GameSheet03-uhd/edit_leftBtn5_001.png new file mode 100644 index 00000000..e3f8ba67 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_leftBtn5_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_leftBtn_001.png b/GJ_GameSheet03-uhd/edit_leftBtn_001.png new file mode 100644 index 00000000..d087ffad Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_leftBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_rightBtn2_001.png b/GJ_GameSheet03-uhd/edit_rightBtn2_001.png new file mode 100644 index 00000000..e24872e3 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_rightBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_rightBtn3_001.png b/GJ_GameSheet03-uhd/edit_rightBtn3_001.png new file mode 100644 index 00000000..127c599e Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_rightBtn3_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_rightBtn5_001.png b/GJ_GameSheet03-uhd/edit_rightBtn5_001.png new file mode 100644 index 00000000..9463cc8f Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_rightBtn5_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_rightBtn_001.png b/GJ_GameSheet03-uhd/edit_rightBtn_001.png new file mode 100644 index 00000000..e6658892 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_rightBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_rotate45lBtn_001.png b/GJ_GameSheet03-uhd/edit_rotate45lBtn_001.png new file mode 100644 index 00000000..f126e740 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_rotate45lBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_rotate45rBtn_001.png b/GJ_GameSheet03-uhd/edit_rotate45rBtn_001.png new file mode 100644 index 00000000..aab25986 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_rotate45rBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_rotateSnapBtn_001.png b/GJ_GameSheet03-uhd/edit_rotateSnapBtn_001.png new file mode 100644 index 00000000..cf532e8b Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_rotateSnapBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_snapBtn_001.png b/GJ_GameSheet03-uhd/edit_snapBtn_001.png new file mode 100644 index 00000000..e813eae2 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_snapBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_swipeBtn_001.png b/GJ_GameSheet03-uhd/edit_swipeBtn_001.png new file mode 100644 index 00000000..b81e4678 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_swipeBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_upBtn2_001.png b/GJ_GameSheet03-uhd/edit_upBtn2_001.png new file mode 100644 index 00000000..1c577edc Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_upBtn2_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_upBtn3_001.png b/GJ_GameSheet03-uhd/edit_upBtn3_001.png new file mode 100644 index 00000000..180630e7 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_upBtn3_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_upBtn5_001.png b/GJ_GameSheet03-uhd/edit_upBtn5_001.png new file mode 100644 index 00000000..ebe59f34 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_upBtn5_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_upBtn_001.png b/GJ_GameSheet03-uhd/edit_upBtn_001.png new file mode 100644 index 00000000..7b9bd210 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_upBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/edit_vLine_001.png b/GJ_GameSheet03-uhd/edit_vLine_001.png new file mode 100644 index 00000000..4dfde774 Binary files /dev/null and b/GJ_GameSheet03-uhd/edit_vLine_001.png differ diff --git a/GJ_GameSheet03-uhd/eventLevelLabel_001.png b/GJ_GameSheet03-uhd/eventLevelLabel_001.png new file mode 100644 index 00000000..0d2c2ce2 Binary files /dev/null and b/GJ_GameSheet03-uhd/eventLevelLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/exMark_001.png b/GJ_GameSheet03-uhd/exMark_001.png new file mode 100644 index 00000000..7c07dc54 Binary files /dev/null and b/GJ_GameSheet03-uhd/exMark_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_01_001.png b/GJ_GameSheet03-uhd/explosionIcon_01_001.png new file mode 100644 index 00000000..25aa50e5 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_01_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_02_001.png b/GJ_GameSheet03-uhd/explosionIcon_02_001.png new file mode 100644 index 00000000..3b2ec4a1 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_02_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_03_001.png b/GJ_GameSheet03-uhd/explosionIcon_03_001.png new file mode 100644 index 00000000..d90d8d0b Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_03_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_04_001.png b/GJ_GameSheet03-uhd/explosionIcon_04_001.png new file mode 100644 index 00000000..cbc29aaf Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_04_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_05_001.png b/GJ_GameSheet03-uhd/explosionIcon_05_001.png new file mode 100644 index 00000000..b8a66cb8 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_05_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_06_001.png b/GJ_GameSheet03-uhd/explosionIcon_06_001.png new file mode 100644 index 00000000..e8284b00 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_06_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_07_001.png b/GJ_GameSheet03-uhd/explosionIcon_07_001.png new file mode 100644 index 00000000..f552bb3f Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_07_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_08_001.png b/GJ_GameSheet03-uhd/explosionIcon_08_001.png new file mode 100644 index 00000000..5181c269 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_08_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_09_001.png b/GJ_GameSheet03-uhd/explosionIcon_09_001.png new file mode 100644 index 00000000..c92f8399 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_09_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_10_001.png b/GJ_GameSheet03-uhd/explosionIcon_10_001.png new file mode 100644 index 00000000..13c42fb4 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_10_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_11_001.png b/GJ_GameSheet03-uhd/explosionIcon_11_001.png new file mode 100644 index 00000000..e9a1dad7 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_11_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_12_001.png b/GJ_GameSheet03-uhd/explosionIcon_12_001.png new file mode 100644 index 00000000..0e6e66f6 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_12_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_13_001.png b/GJ_GameSheet03-uhd/explosionIcon_13_001.png new file mode 100644 index 00000000..bfb5d0d0 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_13_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_14_001.png b/GJ_GameSheet03-uhd/explosionIcon_14_001.png new file mode 100644 index 00000000..2961b1d2 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_14_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_15_001.png b/GJ_GameSheet03-uhd/explosionIcon_15_001.png new file mode 100644 index 00000000..bb7b94fe Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_15_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_16_001.png b/GJ_GameSheet03-uhd/explosionIcon_16_001.png new file mode 100644 index 00000000..b3527a26 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_16_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_17_001.png b/GJ_GameSheet03-uhd/explosionIcon_17_001.png new file mode 100644 index 00000000..727ed682 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_17_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_18_001.png b/GJ_GameSheet03-uhd/explosionIcon_18_001.png new file mode 100644 index 00000000..43773627 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_18_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_19_001.png b/GJ_GameSheet03-uhd/explosionIcon_19_001.png new file mode 100644 index 00000000..1fa954be Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_19_001.png differ diff --git a/GJ_GameSheet03-uhd/explosionIcon_20_001.png b/GJ_GameSheet03-uhd/explosionIcon_20_001.png new file mode 100644 index 00000000..3fb47a53 Binary files /dev/null and b/GJ_GameSheet03-uhd/explosionIcon_20_001.png differ diff --git a/GJ_GameSheet03-uhd/featuredLabel_001.png b/GJ_GameSheet03-uhd/featuredLabel_001.png new file mode 100644 index 00000000..f0be2180 Binary files /dev/null and b/GJ_GameSheet03-uhd/featuredLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/fireShardBig_001.png b/GJ_GameSheet03-uhd/fireShardBig_001.png new file mode 100644 index 00000000..1debb906 Binary files /dev/null and b/GJ_GameSheet03-uhd/fireShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/fireShardLabel_001.png b/GJ_GameSheet03-uhd/fireShardLabel_001.png new file mode 100644 index 00000000..5dc63d9c Binary files /dev/null and b/GJ_GameSheet03-uhd/fireShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/fireShardSmall_001.png b/GJ_GameSheet03-uhd/fireShardSmall_001.png new file mode 100644 index 00000000..0e2434fb Binary files /dev/null and b/GJ_GameSheet03-uhd/fireShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/folderIcon_001.png b/GJ_GameSheet03-uhd/folderIcon_001.png new file mode 100644 index 00000000..2c60ded4 Binary files /dev/null and b/GJ_GameSheet03-uhd/folderIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/friends_tab_off_001.png b/GJ_GameSheet03-uhd/friends_tab_off_001.png new file mode 100644 index 00000000..f22ad166 Binary files /dev/null and b/GJ_GameSheet03-uhd/friends_tab_off_001.png differ diff --git a/GJ_GameSheet03-uhd/friends_tab_on_001.png b/GJ_GameSheet03-uhd/friends_tab_on_001.png new file mode 100644 index 00000000..c6de847b Binary files /dev/null and b/GJ_GameSheet03-uhd/friends_tab_on_001.png differ diff --git a/GJ_GameSheet03-uhd/garageRope_001.png b/GJ_GameSheet03-uhd/garageRope_001.png new file mode 100644 index 00000000..b8656571 Binary files /dev/null and b/GJ_GameSheet03-uhd/garageRope_001.png differ diff --git a/GJ_GameSheet03-uhd/gauntletCorner_001.png b/GJ_GameSheet03-uhd/gauntletCorner_001.png new file mode 100644 index 00000000..d8ce49e5 Binary files /dev/null and b/GJ_GameSheet03-uhd/gauntletCorner_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_01_001.png b/GJ_GameSheet03-uhd/gjItem_01_001.png new file mode 100644 index 00000000..ca187e45 Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_01_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_02_001.png b/GJ_GameSheet03-uhd/gjItem_02_001.png new file mode 100644 index 00000000..cab9bf6b Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_02_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_03_001.png b/GJ_GameSheet03-uhd/gjItem_03_001.png new file mode 100644 index 00000000..8db7d9f5 Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_03_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_04_001.png b/GJ_GameSheet03-uhd/gjItem_04_001.png new file mode 100644 index 00000000..95677cdc Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_04_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_05_001.png b/GJ_GameSheet03-uhd/gjItem_05_001.png new file mode 100644 index 00000000..d433cb5b Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_05_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_16_001.png b/GJ_GameSheet03-uhd/gjItem_16_001.png new file mode 100644 index 00000000..c7d3c502 Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_16_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_17_001.png b/GJ_GameSheet03-uhd/gjItem_17_001.png new file mode 100644 index 00000000..d619c161 Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_17_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_18_001.png b/GJ_GameSheet03-uhd/gjItem_18_001.png new file mode 100644 index 00000000..d00804d3 Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_18_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_19_001.png b/GJ_GameSheet03-uhd/gjItem_19_001.png new file mode 100644 index 00000000..ea4e7780 Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_19_001.png differ diff --git a/GJ_GameSheet03-uhd/gjItem_20_001.png b/GJ_GameSheet03-uhd/gjItem_20_001.png new file mode 100644 index 00000000..9f37236f Binary files /dev/null and b/GJ_GameSheet03-uhd/gjItem_20_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_ballBtn_off_001.png b/GJ_GameSheet03-uhd/gj_ballBtn_off_001.png new file mode 100644 index 00000000..205c6f37 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_ballBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_ballBtn_on_001.png b/GJ_GameSheet03-uhd/gj_ballBtn_on_001.png new file mode 100644 index 00000000..1b66dc14 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_ballBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_birdBtn_off_001.png b/GJ_GameSheet03-uhd/gj_birdBtn_off_001.png new file mode 100644 index 00000000..d1abef14 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_birdBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_birdBtn_on_001.png b/GJ_GameSheet03-uhd/gj_birdBtn_on_001.png new file mode 100644 index 00000000..d5865454 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_birdBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_dartBtn_off_001.png b/GJ_GameSheet03-uhd/gj_dartBtn_off_001.png new file mode 100644 index 00000000..e6bd9553 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_dartBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_dartBtn_on_001.png b/GJ_GameSheet03-uhd/gj_dartBtn_on_001.png new file mode 100644 index 00000000..5051775e Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_dartBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_discordIcon_001.png b/GJ_GameSheet03-uhd/gj_discordIcon_001.png new file mode 100644 index 00000000..cae202eb Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_discordIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_explosionBtn_off_001.png b/GJ_GameSheet03-uhd/gj_explosionBtn_off_001.png new file mode 100644 index 00000000..07bb0646 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_explosionBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_explosionBtn_on_001.png b/GJ_GameSheet03-uhd/gj_explosionBtn_on_001.png new file mode 100644 index 00000000..2e5797ca Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_explosionBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_fbIcon_001.png b/GJ_GameSheet03-uhd/gj_fbIcon_001.png new file mode 100644 index 00000000..c1a8dc28 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_fbIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_findBtnOff_001.png b/GJ_GameSheet03-uhd/gj_findBtnOff_001.png new file mode 100644 index 00000000..f7ed18b9 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_findBtnOff_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_findBtn_001.png b/GJ_GameSheet03-uhd/gj_findBtn_001.png new file mode 100644 index 00000000..c7626bad Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_findBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_folderBtn_001.png b/GJ_GameSheet03-uhd/gj_folderBtn_001.png new file mode 100644 index 00000000..6502f90a Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_folderBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_globalRankTxt_001.png b/GJ_GameSheet03-uhd/gj_globalRankTxt_001.png new file mode 100644 index 00000000..b59fe569 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_globalRankTxt_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_heartOff_001.png b/GJ_GameSheet03-uhd/gj_heartOff_001.png new file mode 100644 index 00000000..79246775 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_heartOff_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_heartOn_001.png b/GJ_GameSheet03-uhd/gj_heartOn_001.png new file mode 100644 index 00000000..8bf1ec2d Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_heartOn_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_iconBtn_off_001.png b/GJ_GameSheet03-uhd/gj_iconBtn_off_001.png new file mode 100644 index 00000000..1b4f5c11 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_iconBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_iconBtn_on_001.png b/GJ_GameSheet03-uhd/gj_iconBtn_on_001.png new file mode 100644 index 00000000..28f68703 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_iconBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_jetpackBtn_off_001.png b/GJ_GameSheet03-uhd/gj_jetpackBtn_off_001.png new file mode 100644 index 00000000..6c06c511 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_jetpackBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_jetpackBtn_on_001.png b/GJ_GameSheet03-uhd/gj_jetpackBtn_on_001.png new file mode 100644 index 00000000..09aa373f Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_jetpackBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_linkBtnOff_001.png b/GJ_GameSheet03-uhd/gj_linkBtnOff_001.png new file mode 100644 index 00000000..39d2978a Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_linkBtnOff_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_linkBtn_001.png b/GJ_GameSheet03-uhd/gj_linkBtn_001.png new file mode 100644 index 00000000..48f9370f Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_linkBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_navDotBtn_off_001.png b/GJ_GameSheet03-uhd/gj_navDotBtn_off_001.png new file mode 100644 index 00000000..ec7e78f2 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_navDotBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_navDotBtn_on_001.png b/GJ_GameSheet03-uhd/gj_navDotBtn_on_001.png new file mode 100644 index 00000000..23fa90cc Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_navDotBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_rdIcon_001.png b/GJ_GameSheet03-uhd/gj_rdIcon_001.png new file mode 100644 index 00000000..198852f9 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_rdIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_robotBtn_off_001.png b/GJ_GameSheet03-uhd/gj_robotBtn_off_001.png new file mode 100644 index 00000000..1760a970 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_robotBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_robotBtn_on_001.png b/GJ_GameSheet03-uhd/gj_robotBtn_on_001.png new file mode 100644 index 00000000..c143e307 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_robotBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_shipBtn_off_001.png b/GJ_GameSheet03-uhd/gj_shipBtn_off_001.png new file mode 100644 index 00000000..af486ce3 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_shipBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_shipBtn_on_001.png b/GJ_GameSheet03-uhd/gj_shipBtn_on_001.png new file mode 100644 index 00000000..b3c2a734 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_shipBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_spiderBtn_off_001.png b/GJ_GameSheet03-uhd/gj_spiderBtn_off_001.png new file mode 100644 index 00000000..781fe8de Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_spiderBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_spiderBtn_on_001.png b/GJ_GameSheet03-uhd/gj_spiderBtn_on_001.png new file mode 100644 index 00000000..7eb209cb Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_spiderBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_streakBtn_off_001.png b/GJ_GameSheet03-uhd/gj_streakBtn_off_001.png new file mode 100644 index 00000000..247804ee Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_streakBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_streakBtn_on_001.png b/GJ_GameSheet03-uhd/gj_streakBtn_on_001.png new file mode 100644 index 00000000..709a6173 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_streakBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_swingBtn_off_001.png b/GJ_GameSheet03-uhd/gj_swingBtn_off_001.png new file mode 100644 index 00000000..9549a856 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_swingBtn_off_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_swingBtn_on_001.png b/GJ_GameSheet03-uhd/gj_swingBtn_on_001.png new file mode 100644 index 00000000..d5bdd061 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_swingBtn_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_twIcon_001.png b/GJ_GameSheet03-uhd/gj_twIcon_001.png new file mode 100644 index 00000000..73e4c929 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_twIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_twitchIcon_001.png b/GJ_GameSheet03-uhd/gj_twitchIcon_001.png new file mode 100644 index 00000000..8f321f09 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_twitchIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/gj_ytIcon_001.png b/GJ_GameSheet03-uhd/gj_ytIcon_001.png new file mode 100644 index 00000000..977950b1 Binary files /dev/null and b/GJ_GameSheet03-uhd/gj_ytIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/global_tab_off_001.png b/GJ_GameSheet03-uhd/global_tab_off_001.png new file mode 100644 index 00000000..8e07f7cf Binary files /dev/null and b/GJ_GameSheet03-uhd/global_tab_off_001.png differ diff --git a/GJ_GameSheet03-uhd/global_tab_on_001.png b/GJ_GameSheet03-uhd/global_tab_on_001.png new file mode 100644 index 00000000..0454de69 Binary files /dev/null and b/GJ_GameSheet03-uhd/global_tab_on_001.png differ diff --git a/GJ_GameSheet03-uhd/gplusSignIn_001.png b/GJ_GameSheet03-uhd/gplusSignIn_001.png new file mode 100644 index 00000000..525a8667 Binary files /dev/null and b/GJ_GameSheet03-uhd/gplusSignIn_001.png differ diff --git a/GJ_GameSheet03-uhd/gplusSignOut_001.png b/GJ_GameSheet03-uhd/gplusSignOut_001.png new file mode 100644 index 00000000..cd978f4b Binary files /dev/null and b/GJ_GameSheet03-uhd/gplusSignOut_001.png differ diff --git a/GJ_GameSheet03-uhd/groundSquareShadow_001.png b/GJ_GameSheet03-uhd/groundSquareShadow_001.png new file mode 100644 index 00000000..cad2046a Binary files /dev/null and b/GJ_GameSheet03-uhd/groundSquareShadow_001.png differ diff --git a/GJ_GameSheet03-uhd/hideBtn_001.png b/GJ_GameSheet03-uhd/hideBtn_001.png new file mode 100644 index 00000000..5dd2e5c0 Binary files /dev/null and b/GJ_GameSheet03-uhd/hideBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/highObjectIcon_001.png b/GJ_GameSheet03-uhd/highObjectIcon_001.png new file mode 100644 index 00000000..9cf89b05 Binary files /dev/null and b/GJ_GameSheet03-uhd/highObjectIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/iceShardBig_001.png b/GJ_GameSheet03-uhd/iceShardBig_001.png new file mode 100644 index 00000000..18c0b898 Binary files /dev/null and b/GJ_GameSheet03-uhd/iceShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/iceShardLabel_001.png b/GJ_GameSheet03-uhd/iceShardLabel_001.png new file mode 100644 index 00000000..4f2edd13 Binary files /dev/null and b/GJ_GameSheet03-uhd/iceShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/iceShardSmall_001.png b/GJ_GameSheet03-uhd/iceShardSmall_001.png new file mode 100644 index 00000000..53694c02 Binary files /dev/null and b/GJ_GameSheet03-uhd/iceShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/label_of_001.png b/GJ_GameSheet03-uhd/label_of_001.png new file mode 100644 index 00000000..118bf291 Binary files /dev/null and b/GJ_GameSheet03-uhd/label_of_001.png differ diff --git a/GJ_GameSheet03-uhd/label_paths_001.png b/GJ_GameSheet03-uhd/label_paths_001.png new file mode 100644 index 00000000..dd9ec9c7 Binary files /dev/null and b/GJ_GameSheet03-uhd/label_paths_001.png differ diff --git a/GJ_GameSheet03-uhd/label_power_001.png b/GJ_GameSheet03-uhd/label_power_001.png new file mode 100644 index 00000000..b4b35b68 Binary files /dev/null and b/GJ_GameSheet03-uhd/label_power_001.png differ diff --git a/GJ_GameSheet03-uhd/label_shards_001.png b/GJ_GameSheet03-uhd/label_shards_001.png new file mode 100644 index 00000000..3ce07abe Binary files /dev/null and b/GJ_GameSheet03-uhd/label_shards_001.png differ diff --git a/GJ_GameSheet03-uhd/lavaShardBig_001.png b/GJ_GameSheet03-uhd/lavaShardBig_001.png new file mode 100644 index 00000000..b5eee9fb Binary files /dev/null and b/GJ_GameSheet03-uhd/lavaShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/lavaShardLabel_001.png b/GJ_GameSheet03-uhd/lavaShardLabel_001.png new file mode 100644 index 00000000..9e19036c Binary files /dev/null and b/GJ_GameSheet03-uhd/lavaShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/lavaShardSmall_001.png b/GJ_GameSheet03-uhd/lavaShardSmall_001.png new file mode 100644 index 00000000..a65d1f01 Binary files /dev/null and b/GJ_GameSheet03-uhd/lavaShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/levelLeaderboard_friendsBtn_001.png b/GJ_GameSheet03-uhd/levelLeaderboard_friendsBtn_001.png new file mode 100644 index 00000000..d14dcaf9 Binary files /dev/null and b/GJ_GameSheet03-uhd/levelLeaderboard_friendsBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/levelLeaderboard_globalBtn_001.png b/GJ_GameSheet03-uhd/levelLeaderboard_globalBtn_001.png new file mode 100644 index 00000000..1350a5d7 Binary files /dev/null and b/GJ_GameSheet03-uhd/levelLeaderboard_globalBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/levelLeaderboard_globalWeeklyBtn_001.png b/GJ_GameSheet03-uhd/levelLeaderboard_globalWeeklyBtn_001.png new file mode 100644 index 00000000..c86b6a81 Binary files /dev/null and b/GJ_GameSheet03-uhd/levelLeaderboard_globalWeeklyBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/levelLeaderboard_localBtn_001.png b/GJ_GameSheet03-uhd/levelLeaderboard_localBtn_001.png new file mode 100644 index 00000000..1b7d1175 Binary files /dev/null and b/GJ_GameSheet03-uhd/levelLeaderboard_localBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/miniSkull_001.png b/GJ_GameSheet03-uhd/miniSkull_001.png new file mode 100644 index 00000000..6e4fb894 Binary files /dev/null and b/GJ_GameSheet03-uhd/miniSkull_001.png differ diff --git a/GJ_GameSheet03-uhd/modBadge_01_001.png b/GJ_GameSheet03-uhd/modBadge_01_001.png new file mode 100644 index 00000000..90d3a18b Binary files /dev/null and b/GJ_GameSheet03-uhd/modBadge_01_001.png differ diff --git a/GJ_GameSheet03-uhd/modBadge_02_001.png b/GJ_GameSheet03-uhd/modBadge_02_001.png new file mode 100644 index 00000000..d9571f61 Binary files /dev/null and b/GJ_GameSheet03-uhd/modBadge_02_001.png differ diff --git a/GJ_GameSheet03-uhd/modBadge_03_001.png b/GJ_GameSheet03-uhd/modBadge_03_001.png new file mode 100644 index 00000000..117f2fe1 Binary files /dev/null and b/GJ_GameSheet03-uhd/modBadge_03_001.png differ diff --git a/GJ_GameSheet03-uhd/moon_small01_001.png b/GJ_GameSheet03-uhd/moon_small01_001.png new file mode 100644 index 00000000..676fbb4a Binary files /dev/null and b/GJ_GameSheet03-uhd/moon_small01_001.png differ diff --git a/GJ_GameSheet03-uhd/navArrowBtn_001.png b/GJ_GameSheet03-uhd/navArrowBtn_001.png new file mode 100644 index 00000000..4395c132 Binary files /dev/null and b/GJ_GameSheet03-uhd/navArrowBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/ncs_large_001.png b/GJ_GameSheet03-uhd/ncs_large_001.png new file mode 100644 index 00000000..19a52565 Binary files /dev/null and b/GJ_GameSheet03-uhd/ncs_large_001.png differ diff --git a/GJ_GameSheet03-uhd/ncs_med_001.png b/GJ_GameSheet03-uhd/ncs_med_001.png new file mode 100644 index 00000000..7e9ae04f Binary files /dev/null and b/GJ_GameSheet03-uhd/ncs_med_001.png differ diff --git a/GJ_GameSheet03-uhd/ncs_small_001.png b/GJ_GameSheet03-uhd/ncs_small_001.png new file mode 100644 index 00000000..2646637e Binary files /dev/null and b/GJ_GameSheet03-uhd/ncs_small_001.png differ diff --git a/GJ_GameSheet03-uhd/newMusicIcon2_001.png b/GJ_GameSheet03-uhd/newMusicIcon2_001.png new file mode 100644 index 00000000..4d877350 Binary files /dev/null and b/GJ_GameSheet03-uhd/newMusicIcon2_001.png differ diff --git a/GJ_GameSheet03-uhd/newMusicIcon_001.png b/GJ_GameSheet03-uhd/newMusicIcon_001.png new file mode 100644 index 00000000..9fa901e2 Binary files /dev/null and b/GJ_GameSheet03-uhd/newMusicIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_01_001.png b/GJ_GameSheet03-uhd/pathIcon_01_001.png new file mode 100644 index 00000000..8cb018bd Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_01_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_02_001.png b/GJ_GameSheet03-uhd/pathIcon_02_001.png new file mode 100644 index 00000000..571774c5 Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_02_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_03_001.png b/GJ_GameSheet03-uhd/pathIcon_03_001.png new file mode 100644 index 00000000..2b9b3d5e Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_03_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_04_001.png b/GJ_GameSheet03-uhd/pathIcon_04_001.png new file mode 100644 index 00000000..d78637c5 Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_04_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_05_001.png b/GJ_GameSheet03-uhd/pathIcon_05_001.png new file mode 100644 index 00000000..9c1a4695 Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_05_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_06_001.png b/GJ_GameSheet03-uhd/pathIcon_06_001.png new file mode 100644 index 00000000..17d4b4bc Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_06_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_07_001.png b/GJ_GameSheet03-uhd/pathIcon_07_001.png new file mode 100644 index 00000000..a797d35d Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_07_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_08_001.png b/GJ_GameSheet03-uhd/pathIcon_08_001.png new file mode 100644 index 00000000..2fa39562 Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_08_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_09_001.png b/GJ_GameSheet03-uhd/pathIcon_09_001.png new file mode 100644 index 00000000..9765ace9 Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_09_001.png differ diff --git a/GJ_GameSheet03-uhd/pathIcon_10_001.png b/GJ_GameSheet03-uhd/pathIcon_10_001.png new file mode 100644 index 00000000..973ba61f Binary files /dev/null and b/GJ_GameSheet03-uhd/pathIcon_10_001.png differ diff --git a/GJ_GameSheet03-uhd/playerSquare_001.png b/GJ_GameSheet03-uhd/playerSquare_001.png new file mode 100644 index 00000000..22f3f9b4 Binary files /dev/null and b/GJ_GameSheet03-uhd/playerSquare_001.png differ diff --git a/GJ_GameSheet03-uhd/player_special_01_001.png b/GJ_GameSheet03-uhd/player_special_01_001.png new file mode 100644 index 00000000..7e01315b Binary files /dev/null and b/GJ_GameSheet03-uhd/player_special_01_001.png differ diff --git a/GJ_GameSheet03-uhd/player_special_02_001.png b/GJ_GameSheet03-uhd/player_special_02_001.png new file mode 100644 index 00000000..22fcaaab Binary files /dev/null and b/GJ_GameSheet03-uhd/player_special_02_001.png differ diff --git a/GJ_GameSheet03-uhd/player_special_03_001.png b/GJ_GameSheet03-uhd/player_special_03_001.png new file mode 100644 index 00000000..1ad890e1 Binary files /dev/null and b/GJ_GameSheet03-uhd/player_special_03_001.png differ diff --git a/GJ_GameSheet03-uhd/player_special_04_001.png b/GJ_GameSheet03-uhd/player_special_04_001.png new file mode 100644 index 00000000..da72f355 Binary files /dev/null and b/GJ_GameSheet03-uhd/player_special_04_001.png differ diff --git a/GJ_GameSheet03-uhd/player_special_05_001.png b/GJ_GameSheet03-uhd/player_special_05_001.png new file mode 100644 index 00000000..52d893d9 Binary files /dev/null and b/GJ_GameSheet03-uhd/player_special_05_001.png differ diff --git a/GJ_GameSheet03-uhd/player_special_06_001.png b/GJ_GameSheet03-uhd/player_special_06_001.png new file mode 100644 index 00000000..f61da736 Binary files /dev/null and b/GJ_GameSheet03-uhd/player_special_06_001.png differ diff --git a/GJ_GameSheet03-uhd/player_special_07_001.png b/GJ_GameSheet03-uhd/player_special_07_001.png new file mode 100644 index 00000000..7e8679df Binary files /dev/null and b/GJ_GameSheet03-uhd/player_special_07_001.png differ diff --git a/GJ_GameSheet03-uhd/poisonShardBig_001.png b/GJ_GameSheet03-uhd/poisonShardBig_001.png new file mode 100644 index 00000000..5af0cc77 Binary files /dev/null and b/GJ_GameSheet03-uhd/poisonShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/poisonShardLabel_001.png b/GJ_GameSheet03-uhd/poisonShardLabel_001.png new file mode 100644 index 00000000..2211ec70 Binary files /dev/null and b/GJ_GameSheet03-uhd/poisonShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/poisonShardSmall_001.png b/GJ_GameSheet03-uhd/poisonShardSmall_001.png new file mode 100644 index 00000000..bfcd7e2c Binary files /dev/null and b/GJ_GameSheet03-uhd/poisonShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/poweredBy_001.png b/GJ_GameSheet03-uhd/poweredBy_001.png new file mode 100644 index 00000000..6eac1832 Binary files /dev/null and b/GJ_GameSheet03-uhd/poweredBy_001.png differ diff --git a/GJ_GameSheet03-uhd/rankIcon_1_001.png b/GJ_GameSheet03-uhd/rankIcon_1_001.png new file mode 100644 index 00000000..f4abfefd Binary files /dev/null and b/GJ_GameSheet03-uhd/rankIcon_1_001.png differ diff --git a/GJ_GameSheet03-uhd/rankIcon_all_001.png b/GJ_GameSheet03-uhd/rankIcon_all_001.png new file mode 100644 index 00000000..caf40882 Binary files /dev/null and b/GJ_GameSheet03-uhd/rankIcon_all_001.png differ diff --git a/GJ_GameSheet03-uhd/rankIcon_top1000_001.png b/GJ_GameSheet03-uhd/rankIcon_top1000_001.png new file mode 100644 index 00000000..d2dce1a1 Binary files /dev/null and b/GJ_GameSheet03-uhd/rankIcon_top1000_001.png differ diff --git a/GJ_GameSheet03-uhd/rankIcon_top100_001.png b/GJ_GameSheet03-uhd/rankIcon_top100_001.png new file mode 100644 index 00000000..1fcf33b6 Binary files /dev/null and b/GJ_GameSheet03-uhd/rankIcon_top100_001.png differ diff --git a/GJ_GameSheet03-uhd/rankIcon_top10_001.png b/GJ_GameSheet03-uhd/rankIcon_top10_001.png new file mode 100644 index 00000000..ec7b9a4f Binary files /dev/null and b/GJ_GameSheet03-uhd/rankIcon_top10_001.png differ diff --git a/GJ_GameSheet03-uhd/rankIcon_top200_001.png b/GJ_GameSheet03-uhd/rankIcon_top200_001.png new file mode 100644 index 00000000..fd1294d0 Binary files /dev/null and b/GJ_GameSheet03-uhd/rankIcon_top200_001.png differ diff --git a/GJ_GameSheet03-uhd/rankIcon_top500_001.png b/GJ_GameSheet03-uhd/rankIcon_top500_001.png new file mode 100644 index 00000000..f18d4f8c Binary files /dev/null and b/GJ_GameSheet03-uhd/rankIcon_top500_001.png differ diff --git a/GJ_GameSheet03-uhd/rankIcon_top50_001.png b/GJ_GameSheet03-uhd/rankIcon_top50_001.png new file mode 100644 index 00000000..d1f31f33 Binary files /dev/null and b/GJ_GameSheet03-uhd/rankIcon_top50_001.png differ diff --git a/GJ_GameSheet03-uhd/rewardCorner_001.png b/GJ_GameSheet03-uhd/rewardCorner_001.png new file mode 100644 index 00000000..6faa12be Binary files /dev/null and b/GJ_GameSheet03-uhd/rewardCorner_001.png differ diff --git a/GJ_GameSheet03-uhd/rewardsLabel_001.png b/GJ_GameSheet03-uhd/rewardsLabel_001.png new file mode 100644 index 00000000..b7cb09ed Binary files /dev/null and b/GJ_GameSheet03-uhd/rewardsLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/robtoplogo_small.png b/GJ_GameSheet03-uhd/robtoplogo_small.png new file mode 100644 index 00000000..890892cc Binary files /dev/null and b/GJ_GameSheet03-uhd/robtoplogo_small.png differ diff --git a/GJ_GameSheet03-uhd/secretCoinUI2_001.png b/GJ_GameSheet03-uhd/secretCoinUI2_001.png new file mode 100644 index 00000000..78593293 Binary files /dev/null and b/GJ_GameSheet03-uhd/secretCoinUI2_001.png differ diff --git a/GJ_GameSheet03-uhd/secretCoinUI_001.png b/GJ_GameSheet03-uhd/secretCoinUI_001.png new file mode 100644 index 00000000..3c9e0904 Binary files /dev/null and b/GJ_GameSheet03-uhd/secretCoinUI_001.png differ diff --git a/GJ_GameSheet03-uhd/secretDoorBtn2_closed_001.png b/GJ_GameSheet03-uhd/secretDoorBtn2_closed_001.png new file mode 100644 index 00000000..cc69d089 Binary files /dev/null and b/GJ_GameSheet03-uhd/secretDoorBtn2_closed_001.png differ diff --git a/GJ_GameSheet03-uhd/secretDoorBtn2_open_001.png b/GJ_GameSheet03-uhd/secretDoorBtn2_open_001.png new file mode 100644 index 00000000..5da5afd5 Binary files /dev/null and b/GJ_GameSheet03-uhd/secretDoorBtn2_open_001.png differ diff --git a/GJ_GameSheet03-uhd/secretDoorBtn_closed_001.png b/GJ_GameSheet03-uhd/secretDoorBtn_closed_001.png new file mode 100644 index 00000000..6e1e6fef Binary files /dev/null and b/GJ_GameSheet03-uhd/secretDoorBtn_closed_001.png differ diff --git a/GJ_GameSheet03-uhd/secretDoorBtn_open_001.png b/GJ_GameSheet03-uhd/secretDoorBtn_open_001.png new file mode 100644 index 00000000..051f549e Binary files /dev/null and b/GJ_GameSheet03-uhd/secretDoorBtn_open_001.png differ diff --git a/GJ_GameSheet03-uhd/shadowShardBig_001.png b/GJ_GameSheet03-uhd/shadowShardBig_001.png new file mode 100644 index 00000000..1d176df1 Binary files /dev/null and b/GJ_GameSheet03-uhd/shadowShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/shadowShardLabel_001.png b/GJ_GameSheet03-uhd/shadowShardLabel_001.png new file mode 100644 index 00000000..c36539c8 Binary files /dev/null and b/GJ_GameSheet03-uhd/shadowShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/shadowShardSmall_001.png b/GJ_GameSheet03-uhd/shadowShardSmall_001.png new file mode 100644 index 00000000..9993893f Binary files /dev/null and b/GJ_GameSheet03-uhd/shadowShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0201ShardBig_001.png b/GJ_GameSheet03-uhd/shard0201ShardBig_001.png new file mode 100644 index 00000000..51045cbe Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0201ShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0201ShardLabel_001.png b/GJ_GameSheet03-uhd/shard0201ShardLabel_001.png new file mode 100644 index 00000000..036d5e91 Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0201ShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0201ShardSmall_001.png b/GJ_GameSheet03-uhd/shard0201ShardSmall_001.png new file mode 100644 index 00000000..88964e2d Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0201ShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0202ShardBig_001.png b/GJ_GameSheet03-uhd/shard0202ShardBig_001.png new file mode 100644 index 00000000..189ee712 Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0202ShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0202ShardLabel_001.png b/GJ_GameSheet03-uhd/shard0202ShardLabel_001.png new file mode 100644 index 00000000..73f597ba Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0202ShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0202ShardSmall_001.png b/GJ_GameSheet03-uhd/shard0202ShardSmall_001.png new file mode 100644 index 00000000..3dd5f2ec Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0202ShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0203ShardBig_001.png b/GJ_GameSheet03-uhd/shard0203ShardBig_001.png new file mode 100644 index 00000000..e4b589bd Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0203ShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0203ShardLabel_001.png b/GJ_GameSheet03-uhd/shard0203ShardLabel_001.png new file mode 100644 index 00000000..2533c225 Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0203ShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0203ShardSmall_001.png b/GJ_GameSheet03-uhd/shard0203ShardSmall_001.png new file mode 100644 index 00000000..4beb36ca Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0203ShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0204ShardBig_001.png b/GJ_GameSheet03-uhd/shard0204ShardBig_001.png new file mode 100644 index 00000000..3b4d940a Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0204ShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0204ShardLabel_001.png b/GJ_GameSheet03-uhd/shard0204ShardLabel_001.png new file mode 100644 index 00000000..55f33178 Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0204ShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0204ShardSmall_001.png b/GJ_GameSheet03-uhd/shard0204ShardSmall_001.png new file mode 100644 index 00000000..7715606d Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0204ShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0205ShardBig_001.png b/GJ_GameSheet03-uhd/shard0205ShardBig_001.png new file mode 100644 index 00000000..c802f708 Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0205ShardBig_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0205ShardLabel_001.png b/GJ_GameSheet03-uhd/shard0205ShardLabel_001.png new file mode 100644 index 00000000..f8f3ac2a Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0205ShardLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/shard0205ShardSmall_001.png b/GJ_GameSheet03-uhd/shard0205ShardSmall_001.png new file mode 100644 index 00000000..534a5007 Binary files /dev/null and b/GJ_GameSheet03-uhd/shard0205ShardSmall_001.png differ diff --git a/GJ_GameSheet03-uhd/shard2Shadow_001.png b/GJ_GameSheet03-uhd/shard2Shadow_001.png new file mode 100644 index 00000000..3e48712f Binary files /dev/null and b/GJ_GameSheet03-uhd/shard2Shadow_001.png differ diff --git a/GJ_GameSheet03-uhd/shard2_glow_001.png b/GJ_GameSheet03-uhd/shard2_glow_001.png new file mode 100644 index 00000000..10cd840c Binary files /dev/null and b/GJ_GameSheet03-uhd/shard2_glow_001.png differ diff --git a/GJ_GameSheet03-uhd/shardShadow_001.png b/GJ_GameSheet03-uhd/shardShadow_001.png new file mode 100644 index 00000000..f9a05f39 Binary files /dev/null and b/GJ_GameSheet03-uhd/shardShadow_001.png differ diff --git a/GJ_GameSheet03-uhd/shard_glow_001.png b/GJ_GameSheet03-uhd/shard_glow_001.png new file mode 100644 index 00000000..0f163000 Binary files /dev/null and b/GJ_GameSheet03-uhd/shard_glow_001.png differ diff --git a/GJ_GameSheet03-uhd/shineBurst_001.png b/GJ_GameSheet03-uhd/shineBurst_001.png new file mode 100644 index 00000000..d6cd7b29 Binary files /dev/null and b/GJ_GameSheet03-uhd/shineBurst_001.png differ diff --git a/GJ_GameSheet03-uhd/shipfireIcon_01_001.png b/GJ_GameSheet03-uhd/shipfireIcon_01_001.png new file mode 100644 index 00000000..b2a913d6 Binary files /dev/null and b/GJ_GameSheet03-uhd/shipfireIcon_01_001.png differ diff --git a/GJ_GameSheet03-uhd/shipfireIcon_02_001.png b/GJ_GameSheet03-uhd/shipfireIcon_02_001.png new file mode 100644 index 00000000..a19b777a Binary files /dev/null and b/GJ_GameSheet03-uhd/shipfireIcon_02_001.png differ diff --git a/GJ_GameSheet03-uhd/shipfireIcon_03_001.png b/GJ_GameSheet03-uhd/shipfireIcon_03_001.png new file mode 100644 index 00000000..8b267f30 Binary files /dev/null and b/GJ_GameSheet03-uhd/shipfireIcon_03_001.png differ diff --git a/GJ_GameSheet03-uhd/shipfireIcon_04_001.png b/GJ_GameSheet03-uhd/shipfireIcon_04_001.png new file mode 100644 index 00000000..47156584 Binary files /dev/null and b/GJ_GameSheet03-uhd/shipfireIcon_04_001.png differ diff --git a/GJ_GameSheet03-uhd/shipfireIcon_05_001.png b/GJ_GameSheet03-uhd/shipfireIcon_05_001.png new file mode 100644 index 00000000..89174416 Binary files /dev/null and b/GJ_GameSheet03-uhd/shipfireIcon_05_001.png differ diff --git a/GJ_GameSheet03-uhd/shipfireIcon_06_001.png b/GJ_GameSheet03-uhd/shipfireIcon_06_001.png new file mode 100644 index 00000000..dea845c3 Binary files /dev/null and b/GJ_GameSheet03-uhd/shipfireIcon_06_001.png differ diff --git a/GJ_GameSheet03-uhd/shopRope_001.png b/GJ_GameSheet03-uhd/shopRope_001.png new file mode 100644 index 00000000..2d17edde Binary files /dev/null and b/GJ_GameSheet03-uhd/shopRope_001.png differ diff --git a/GJ_GameSheet03-uhd/star_small01_001.png b/GJ_GameSheet03-uhd/star_small01_001.png new file mode 100644 index 00000000..25b52e18 Binary files /dev/null and b/GJ_GameSheet03-uhd/star_small01_001.png differ diff --git a/GJ_GameSheet03-uhd/storeItemIcon_001.png b/GJ_GameSheet03-uhd/storeItemIcon_001.png new file mode 100644 index 00000000..2bec6724 Binary files /dev/null and b/GJ_GameSheet03-uhd/storeItemIcon_001.png differ diff --git a/GJ_GameSheet03-uhd/theSafeLabel_001.png b/GJ_GameSheet03-uhd/theSafeLabel_001.png new file mode 100644 index 00000000..34089e34 Binary files /dev/null and b/GJ_GameSheet03-uhd/theSafeLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/tier1Icon_001.png b/GJ_GameSheet03-uhd/tier1Icon_001.png new file mode 100644 index 00000000..dd0ef5c6 Binary files /dev/null and b/GJ_GameSheet03-uhd/tier1Icon_001.png differ diff --git a/GJ_GameSheet03-uhd/tier2Icon_001.png b/GJ_GameSheet03-uhd/tier2Icon_001.png new file mode 100644 index 00000000..3c3d129a Binary files /dev/null and b/GJ_GameSheet03-uhd/tier2Icon_001.png differ diff --git a/GJ_GameSheet03-uhd/topListsLabel_001.png b/GJ_GameSheet03-uhd/topListsLabel_001.png new file mode 100644 index 00000000..5aad3c49 Binary files /dev/null and b/GJ_GameSheet03-uhd/topListsLabel_001.png differ diff --git a/GJ_GameSheet03-uhd/top_tab_off_001.png b/GJ_GameSheet03-uhd/top_tab_off_001.png new file mode 100644 index 00000000..6ae4b7c5 Binary files /dev/null and b/GJ_GameSheet03-uhd/top_tab_off_001.png differ diff --git a/GJ_GameSheet03-uhd/top_tab_on_001.png b/GJ_GameSheet03-uhd/top_tab_on_001.png new file mode 100644 index 00000000..83b230fc Binary files /dev/null and b/GJ_GameSheet03-uhd/top_tab_on_001.png differ diff --git a/GJ_GameSheet03-uhd/uiDot_001.png b/GJ_GameSheet03-uhd/uiDot_001.png new file mode 100644 index 00000000..43bff7d3 Binary files /dev/null and b/GJ_GameSheet03-uhd/uiDot_001.png differ diff --git a/GJ_GameSheet03-uhd/usercoin_small01_001.png b/GJ_GameSheet03-uhd/usercoin_small01_001.png new file mode 100644 index 00000000..8209b19a Binary files /dev/null and b/GJ_GameSheet03-uhd/usercoin_small01_001.png differ diff --git a/GJ_GameSheet03-uhd/warpBtn_01_001.png b/GJ_GameSheet03-uhd/warpBtn_01_001.png new file mode 100644 index 00000000..f9e2bade Binary files /dev/null and b/GJ_GameSheet03-uhd/warpBtn_01_001.png differ diff --git a/GJ_GameSheet03-uhd/warpBtn_02_001.png b/GJ_GameSheet03-uhd/warpBtn_02_001.png new file mode 100644 index 00000000..0df8acb9 Binary files /dev/null and b/GJ_GameSheet03-uhd/warpBtn_02_001.png differ diff --git a/GJ_GameSheet03-uhd/warpBtn_03_001.png b/GJ_GameSheet03-uhd/warpBtn_03_001.png new file mode 100644 index 00000000..a4b930f4 Binary files /dev/null and b/GJ_GameSheet03-uhd/warpBtn_03_001.png differ diff --git a/GJ_GameSheet03-uhd/warpLockOffBtn_001.png b/GJ_GameSheet03-uhd/warpLockOffBtn_001.png new file mode 100644 index 00000000..790114a6 Binary files /dev/null and b/GJ_GameSheet03-uhd/warpLockOffBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/warpLockOnBtn_001.png b/GJ_GameSheet03-uhd/warpLockOnBtn_001.png new file mode 100644 index 00000000..a561a85f Binary files /dev/null and b/GJ_GameSheet03-uhd/warpLockOnBtn_001.png differ diff --git a/GJ_GameSheet03-uhd/weeklyLevelLabel_001.png b/GJ_GameSheet03-uhd/weeklyLevelLabel_001.png new file mode 100644 index 00000000..31bff45d Binary files /dev/null and b/GJ_GameSheet03-uhd/weeklyLevelLabel_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_challengeBtn_001.png b/GJ_GameSheet04-uhd/GJ_challengeBtn_001.png new file mode 100644 index 00000000..340677c6 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_challengeBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_createBtn_001.png b/GJ_GameSheet04-uhd/GJ_createBtn_001.png new file mode 100644 index 00000000..7c1eed29 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_createBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_creatorBtn_001.png b/GJ_GameSheet04-uhd/GJ_creatorBtn_001.png new file mode 100644 index 00000000..299c7ef8 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_creatorBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_dailyBtn_001.png b/GJ_GameSheet04-uhd/GJ_dailyBtn_001.png new file mode 100644 index 00000000..61a91875 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_dailyBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_eventBtn_001.png b/GJ_GameSheet04-uhd/GJ_eventBtn_001.png new file mode 100644 index 00000000..47d40103 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_eventBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_featuredBtn_001.png b/GJ_GameSheet04-uhd/GJ_featuredBtn_001.png new file mode 100644 index 00000000..22ca1e19 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_featuredBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_freeLevelsBtn_001.png b/GJ_GameSheet04-uhd/GJ_freeLevelsBtn_001.png new file mode 100644 index 00000000..bb3b84af Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_freeLevelsBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_fullBtn_001.png b/GJ_GameSheet04-uhd/GJ_fullBtn_001.png new file mode 100644 index 00000000..5163b2c3 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_fullBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_gauntletsBtn_001.png b/GJ_GameSheet04-uhd/GJ_gauntletsBtn_001.png new file mode 100644 index 00000000..3a7b292f Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_gauntletsBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_highscoreBtn_001.png b/GJ_GameSheet04-uhd/GJ_highscoreBtn_001.png new file mode 100644 index 00000000..fddfeb52 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_highscoreBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_listsBtn_001.png b/GJ_GameSheet04-uhd/GJ_listsBtn_001.png new file mode 100644 index 00000000..296d76f5 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_listsBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_mapBtn_001.png b/GJ_GameSheet04-uhd/GJ_mapBtn_001.png new file mode 100644 index 00000000..aaa206ea Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_mapBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_mapPacksBtn_001.png b/GJ_GameSheet04-uhd/GJ_mapPacksBtn_001.png new file mode 100644 index 00000000..7b55255d Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_mapPacksBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_moreGamesBtn_001.png b/GJ_GameSheet04-uhd/GJ_moreGamesBtn_001.png new file mode 100644 index 00000000..f414edd7 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_moreGamesBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_pathsBtn_001.png b/GJ_GameSheet04-uhd/GJ_pathsBtn_001.png new file mode 100644 index 00000000..702f50ba Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_pathsBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_playBtn_001.png b/GJ_GameSheet04-uhd/GJ_playBtn_001.png new file mode 100644 index 00000000..3f4a6dc5 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_playBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_safeBtn_001.png b/GJ_GameSheet04-uhd/GJ_safeBtn_001.png new file mode 100644 index 00000000..aed54be8 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_safeBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_savedBtn_001.png b/GJ_GameSheet04-uhd/GJ_savedBtn_001.png new file mode 100644 index 00000000..49989cee Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_savedBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_searchBtn_001.png b/GJ_GameSheet04-uhd/GJ_searchBtn_001.png new file mode 100644 index 00000000..6decf6c8 Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_searchBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_versusBtn_001.png b/GJ_GameSheet04-uhd/GJ_versusBtn_001.png new file mode 100644 index 00000000..b5271e9e Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_versusBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/GJ_weeklyBtn_001.png b/GJ_GameSheet04-uhd/GJ_weeklyBtn_001.png new file mode 100644 index 00000000..882b0d7c Binary files /dev/null and b/GJ_GameSheet04-uhd/GJ_weeklyBtn_001.png differ diff --git a/GJ_GameSheet04-uhd/boost_01_shine_001.png b/GJ_GameSheet04-uhd/boost_01_shine_001.png new file mode 100644 index 00000000..99f4cb48 Binary files /dev/null and b/GJ_GameSheet04-uhd/boost_01_shine_001.png differ diff --git a/GJ_GameSheet04-uhd/boost_02_shine_001.png b/GJ_GameSheet04-uhd/boost_02_shine_001.png new file mode 100644 index 00000000..8d6d53ad Binary files /dev/null and b/GJ_GameSheet04-uhd/boost_02_shine_001.png differ diff --git a/GJ_GameSheet04-uhd/boost_03_shine_001.png b/GJ_GameSheet04-uhd/boost_03_shine_001.png new file mode 100644 index 00000000..b9cbfdd2 Binary files /dev/null and b/GJ_GameSheet04-uhd/boost_03_shine_001.png differ diff --git a/GJ_GameSheet04-uhd/boost_04_shine_001.png b/GJ_GameSheet04-uhd/boost_04_shine_001.png new file mode 100644 index 00000000..16295d86 Binary files /dev/null and b/GJ_GameSheet04-uhd/boost_04_shine_001.png differ diff --git a/GJ_GameSheet04-uhd/boost_05_shine_001.png b/GJ_GameSheet04-uhd/boost_05_shine_001.png new file mode 100644 index 00000000..63b02cd5 Binary files /dev/null and b/GJ_GameSheet04-uhd/boost_05_shine_001.png differ diff --git a/GJ_GameSheet04-uhd/gj_dailyCrown_001.png b/GJ_GameSheet04-uhd/gj_dailyCrown_001.png new file mode 100644 index 00000000..576e8979 Binary files /dev/null and b/GJ_GameSheet04-uhd/gj_dailyCrown_001.png differ diff --git a/GJ_GameSheet04-uhd/gj_eventCrown_001.png b/GJ_GameSheet04-uhd/gj_eventCrown_001.png new file mode 100644 index 00000000..021bc8ad Binary files /dev/null and b/GJ_GameSheet04-uhd/gj_eventCrown_001.png differ diff --git a/GJ_GameSheet04-uhd/gj_weeklyCrown_001.png b/GJ_GameSheet04-uhd/gj_weeklyCrown_001.png new file mode 100644 index 00000000..35f0eb43 Binary files /dev/null and b/GJ_GameSheet04-uhd/gj_weeklyCrown_001.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_001.png b/GJ_GameSheet04-uhd/playerDash2_boom2_001.png new file mode 100644 index 00000000..be95affc Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_001.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_002.png b/GJ_GameSheet04-uhd/playerDash2_boom2_002.png new file mode 100644 index 00000000..c37a52a1 Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_002.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_003.png b/GJ_GameSheet04-uhd/playerDash2_boom2_003.png new file mode 100644 index 00000000..b352b908 Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_003.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_004.png b/GJ_GameSheet04-uhd/playerDash2_boom2_004.png new file mode 100644 index 00000000..8b00cc69 Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_004.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_005.png b/GJ_GameSheet04-uhd/playerDash2_boom2_005.png new file mode 100644 index 00000000..4579b3be Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_005.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_006.png b/GJ_GameSheet04-uhd/playerDash2_boom2_006.png new file mode 100644 index 00000000..d7c7885f Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_006.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_007.png b/GJ_GameSheet04-uhd/playerDash2_boom2_007.png new file mode 100644 index 00000000..3edb9ee9 Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_007.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_008.png b/GJ_GameSheet04-uhd/playerDash2_boom2_008.png new file mode 100644 index 00000000..9a5dba0b Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_008.png differ diff --git a/GJ_GameSheet04-uhd/playerDash2_boom2_009.png b/GJ_GameSheet04-uhd/playerDash2_boom2_009.png new file mode 100644 index 00000000..dfc26dff Binary files /dev/null and b/GJ_GameSheet04-uhd/playerDash2_boom2_009.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_01_back_001.png b/GJ_GameSheet04-uhd/portalshine_01_back_001.png new file mode 100644 index 00000000..f8346d12 Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_01_back_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_01_front_001.png b/GJ_GameSheet04-uhd/portalshine_01_front_001.png new file mode 100644 index 00000000..d72ee6ec Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_01_front_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_02_back_001.png b/GJ_GameSheet04-uhd/portalshine_02_back_001.png new file mode 100644 index 00000000..4412728a Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_02_back_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_02_front_001.png b/GJ_GameSheet04-uhd/portalshine_02_front_001.png new file mode 100644 index 00000000..1e15dcd3 Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_02_front_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_03_back_001.png b/GJ_GameSheet04-uhd/portalshine_03_back_001.png new file mode 100644 index 00000000..f0ee9d26 Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_03_back_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_03_front_001.png b/GJ_GameSheet04-uhd/portalshine_03_front_001.png new file mode 100644 index 00000000..adb690a1 Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_03_front_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_04_back_001.png b/GJ_GameSheet04-uhd/portalshine_04_back_001.png new file mode 100644 index 00000000..f63c11b7 Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_04_back_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_04_front_001.png b/GJ_GameSheet04-uhd/portalshine_04_front_001.png new file mode 100644 index 00000000..e18940f0 Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_04_front_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_05_back_001.png b/GJ_GameSheet04-uhd/portalshine_05_back_001.png new file mode 100644 index 00000000..b988900f Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_05_back_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_05_front_001.png b/GJ_GameSheet04-uhd/portalshine_05_front_001.png new file mode 100644 index 00000000..b624b99d Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_05_front_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_06_back_001.png b/GJ_GameSheet04-uhd/portalshine_06_back_001.png new file mode 100644 index 00000000..356ce6d7 Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_06_back_001.png differ diff --git a/GJ_GameSheet04-uhd/portalshine_06_front_001.png b/GJ_GameSheet04-uhd/portalshine_06_front_001.png new file mode 100644 index 00000000..dde9194a Binary files /dev/null and b/GJ_GameSheet04-uhd/portalshine_06_front_001.png differ diff --git a/GJ_GameSheet04-uhd/spiderDash_001.png b/GJ_GameSheet04-uhd/spiderDash_001.png new file mode 100644 index 00000000..e802aaf4 Binary files /dev/null and b/GJ_GameSheet04-uhd/spiderDash_001.png differ diff --git a/GJ_GameSheet04-uhd/spiderDash_002.png b/GJ_GameSheet04-uhd/spiderDash_002.png new file mode 100644 index 00000000..4d0a06e0 Binary files /dev/null and b/GJ_GameSheet04-uhd/spiderDash_002.png differ diff --git a/GJ_GameSheet04-uhd/spiderDash_003.png b/GJ_GameSheet04-uhd/spiderDash_003.png new file mode 100644 index 00000000..27c00f67 Binary files /dev/null and b/GJ_GameSheet04-uhd/spiderDash_003.png differ diff --git a/GJ_GameSheet04-uhd/spiderDash_004.png b/GJ_GameSheet04-uhd/spiderDash_004.png new file mode 100644 index 00000000..f1c7ec97 Binary files /dev/null and b/GJ_GameSheet04-uhd/spiderDash_004.png differ diff --git a/GJ_GameSheet04-uhd/spiderDash_005.png b/GJ_GameSheet04-uhd/spiderDash_005.png new file mode 100644 index 00000000..924255f5 Binary files /dev/null and b/GJ_GameSheet04-uhd/spiderDash_005.png differ diff --git a/GJ_GameSheet04-uhd/spiderDash_006.png b/GJ_GameSheet04-uhd/spiderDash_006.png new file mode 100644 index 00000000..feb7864d Binary files /dev/null and b/GJ_GameSheet04-uhd/spiderDash_006.png differ diff --git a/GJ_GameSheet04-uhd/spiderDash_007.png b/GJ_GameSheet04-uhd/spiderDash_007.png new file mode 100644 index 00000000..fb47d8a2 Binary files /dev/null and b/GJ_GameSheet04-uhd/spiderDash_007.png differ diff --git a/GJ_GameSheet04-uhd/spiderDash_008.png b/GJ_GameSheet04-uhd/spiderDash_008.png new file mode 100644 index 00000000..8f163382 Binary files /dev/null and b/GJ_GameSheet04-uhd/spiderDash_008.png differ diff --git a/GJ_GameSheet04-uhd/theTowerDoor_001.png b/GJ_GameSheet04-uhd/theTowerDoor_001.png new file mode 100644 index 00000000..2adf326f Binary files /dev/null and b/GJ_GameSheet04-uhd/theTowerDoor_001.png differ diff --git a/GJ_GameSheet04-uhd/theTowerLabel_001.png b/GJ_GameSheet04-uhd/theTowerLabel_001.png new file mode 100644 index 00000000..73f6195c Binary files /dev/null and b/GJ_GameSheet04-uhd/theTowerLabel_001.png differ diff --git a/GJ_WebSheet-uhd/GJ_logo_001.png b/GJ_WebSheet-uhd/GJ_logo_001.png new file mode 100644 index 00000000..35d056af Binary files /dev/null and b/GJ_WebSheet-uhd/GJ_logo_001.png differ diff --git a/GJ_WebSheet-uhd/tryMe_001.png b/GJ_WebSheet-uhd/tryMe_001.png new file mode 100644 index 00000000..b747df2c Binary files /dev/null and b/GJ_WebSheet-uhd/tryMe_001.png differ diff --git a/README.md b/README.md index 8847f830..1fb5cab2 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,14 @@ width="400" height="400" alt="web-dashers logo" - src="https://github.com/user-attachments/assets/1b647556-ef74-47f9-be61-46696c57f04e" + src="https://github.com/user-attachments/assets/ce1ccbb1-b1e6-49c2-818c-f9c3ba1fda5c" /> -

Web Dashers

+

Lollipop Mod

- A Modded Geometry Dash demo with extra features added! (See list below!) + A Modded Web Dashers with extra features added! (See list below!)

{ const el = document.getElementById(id); if (el) el.remove(); }); + + // Universal GJ_GameSheet03/04 UHD overlay system. + // Intercepts every this.add.image call for those sheets and layers a native + // DOM over it so the browser renders UHD pixels at full DPR. + const _uhdCont = document.createElement('div'); + _uhdCont.id = 'gj-s03-uhd'; + _uhdCont.style.cssText = 'position:fixed;pointer-events:none;z-index:499;overflow:hidden;left:0;top:0;width:0;height:0;'; + document.body.appendChild(_uhdCont); + this._uhdCont = _uhdCont; + const _uhdFadeDiv = document.createElement('div'); + _uhdFadeDiv.id = 'gj-s03-uhd-fade'; + _uhdFadeDiv.style.cssText = 'position:fixed;pointer-events:none;z-index:500;left:0;top:0;width:0;height:0;background:#000;opacity:0;'; + document.body.appendChild(_uhdFadeDiv); + this._uhdFadeDiv = _uhdFadeDiv; + // Noclip death flash mirror — must sit above EVERYTHING, including all UHD + // overlay imgs and the black fade div. Driven by this.noclipFlash's alpha. + const _uhdFlashDiv = document.createElement('div'); + _uhdFlashDiv.id = 'gj-s03-uhd-flash'; + _uhdFlashDiv.style.cssText = 'position:fixed;pointer-events:none;z-index:9000;left:0;top:0;width:0;height:0;background:#f00;opacity:0;'; + document.body.appendChild(_uhdFlashDiv); + this._uhdFlashDiv = _uhdFlashDiv; + this._uhdContPos = null; // reset cache so update() resizes the new container immediately + this._uhdMap = new Map(); + this._uhdContext = null; // null = main menu; must be set before any add.image calls + this._searchResultsOpen = false; // scene restarts reuse the instance; don't let a stale flag win the ctx priority chain + // Sync overlay positions after update() has moved containers/cameras for the frame + // (off-before-on: scene restarts reuse the same instance, avoid double registration) + this.events.off('postupdate', this._syncUhdOverlays); + this.events.on('postupdate', this._syncUhdOverlays); + const _sc = this; + // On scene restart this.add is the same plugin instance, so the patch from the + // previous create() may still be in place. Always unwrap to the true original first. + if (this.add.image._uhd_orig) this.add.image = this.add.image._uhd_orig; + const _uhdDirs = { GJ_GameSheet03: 'GJ_GameSheet03-uhd/', GJ_GameSheet04: 'GJ_GameSheet04-uhd/', GJ_WebSheet: 'GJ_WebSheet-uhd/', GJ_GameSheet: 'GJ_GameSheet-uhd/', GJ_GameSheet02: 'GJ_GameSheet02-uhd/' }; + // Per-frame shrink applied only to the UHD overlay's own box (not the underlying sprite), + // so the replacement art renders smaller than the original frame while staying centered + // on it. Keyed as "textureKey:frameName". + const _uhdScaleOverrides = { 'GJ_WebSheet:GJ_logo_001.png': 0.95 }; + // Atlas-rotated frames normally get CSS rotation suppressed (their UHD PNGs are saved in + // final visual orientation). But frames listed here are drawn at several code rotations + // (editor move arrows), so their overlay must follow go.rotation; the value is the offset + // between the PNG's on-disk orientation (up) and the frame's design orientation (left). + const _uhdRotateOverrides = { + 'GJ_GameSheet03:edit_upBtn2_001.png': -Math.PI / 2, + 'GJ_GameSheet03:edit_upBtn3_001.png': -Math.PI / 2, + }; + // Per-frame position nudge (game units) applied only to the UHD overlay, not the + // underlying sprite. Keyed as "textureKey:frameName". + const _uhdOffsetOverrides = { 'GJ_WebSheet:GJ_logo_001.png': { x: -5, y: -5 } }; + // Per-frame object-fit override. Default 'contain' never crops but can leave the old + // sprite visible in the letterboxed gap when the replacement art's aspect ratio doesn't + // match the original frame; 'cover' guarantees full coverage of the old frame's box + // (cropping the replacement's edges slightly) for cases where that gap is worse than the crop. + const _uhdFitOverrides = {}; + // GJ_GameSheet03/04 have broad UHD coverage, so any frame from those sheets is safe to + // intercept (onerror hides the rare miss). GJ_WebSheet only has UHD art for the logo so + // far — intercepting every frame from it would create s that 404 for everything else + // (toggle buttons, progress bars, etc.), and a broken-image icon can flash briefly before + // onerror hides it. Whitelist which GJ_WebSheet frames actually have UHD art. + const _uhdWebSheetFrames = new Set(['GJ_logo_001.png']); + const _uhdFrameAllowed = (key, frame) => key !== 'GJ_WebSheet' || _uhdWebSheetFrames.has(frame); + // GJ_GameSheet/GJ_GameSheet02 hold the gameplay objects. Their overlays are tagged + // obj-mode: alpha maps to CSS opacity (not the disabled-button grayscale), and the + // overlay hides for color-tinted or additive-blend sprites (canvas fallback), since + // DOM imgs can't replicate arbitrary tints or blend modes. + const _uhdObjSheet = (key) => key === 'GJ_GameSheet' || key === 'GJ_GameSheet02'; + const _origAddImg = this.add.image.bind(this.add); + const _patchedAddImg = function(x, y, key, frame, ...rest) { + const go = _origAddImg(x, y, key, frame, ...rest); + if (_uhdDirs[key] && typeof frame === 'string' && _uhdFrameAllowed(key, frame)) { + // object-fit:contain (rather than the default fill/stretch) lets a UHD replacement + // whose own aspect ratio doesn't exactly match the original frame's sourceSize (e.g. + // a redrawn logo) scale in without distortion; it's a no-op when the aspect already + // matches, so it doesn't change anything for the existing GameSheet03/04 assets. + const _fitMode = _uhdFitOverrides[key + ':' + frame] || 'contain'; + // Editor build-tab preview icons draw from the object sheets but are UI, not + // in-game objects — exempt them from the In-Game UHD toggle & lazy lifecycle, + // or they'd vanish behind their button-background overlays when it's off. + const _isObj = _uhdObjSheet(key) && !_sc._uhdPreviewIcons; + // Object-sheet sprites (level objects) get their DOM img lazily, in the sync + // loop, only while actually on screen — a long level would otherwise create + // thousands of img nodes up front and keep them all alive forever. + let di = null; + if (!_isObj) { + di = document.createElement('img'); + di.style.cssText = 'position:absolute;left:0;top:0;pointer-events:none;display:none;object-fit:' + _fitMode + ';'; + di.onerror = () => { di.style.display = 'none'; }; + di.src = _uhdDirs[key] + frame; + _uhdCont.appendChild(di); + } + const entry = { img: di, src: _uhdDirs[key] + frame, fit: _fitMode, group: _sc._uhdContext, obj: _isObj, _sized: false, _vis: null, _t: null, uhdScale: _uhdScaleOverrides[key + ':' + frame] || 1, uhdOffset: _uhdOffsetOverrides[key + ':' + frame] || null, uhdRot: _uhdRotateOverrides[key + ':' + frame] != null ? _uhdRotateOverrides[key + ':' + frame] : null }; + _sc._uhdMap.set(go, entry); + // Follow dynamic texture swaps (nav dots, checkboxes, etc.) + const _oST = go.setTexture.bind(go); + go.setTexture = function(k, f, ...a) { + const r = _oST(k, f, ...a); + if (_uhdDirs[k] && typeof f === 'string' && _uhdFrameAllowed(k, f)) { + const e = _sc._uhdMap.get(go); + if (e) { e.src = _uhdDirs[k] + f; if (e.img) e.img.src = e.src; e._sized = false; e.obj = _uhdObjSheet(k); e.uhdScale = _uhdScaleOverrides[k + ':' + f] || 1; e.uhdOffset = _uhdOffsetOverrides[k + ':' + f] || null; e.uhdRot = _uhdRotateOverrides[k + ':' + f] != null ? _uhdRotateOverrides[k + ':' + f] : null; } + } + return r; + }; + // Follow same-texture frame swaps (editor build/edit/delete tabs, etc.) + const _oSFr = go.setFrame.bind(go); + go.setFrame = function(f, ...a) { + const r = _oSFr(f, ...a); + const k = go.texture && go.texture.key; + if (_uhdDirs[k] && typeof f === 'string' && _uhdFrameAllowed(k, f)) { + const e = _sc._uhdMap.get(go); + if (e) { e.src = _uhdDirs[k] + f; if (e.img) e.img.src = e.src; e._sized = false; e.obj = _uhdObjSheet(k); e.uhdScale = _uhdScaleOverrides[k + ':' + f] || 1; e.uhdOffset = _uhdOffsetOverrides[k + ':' + f] || null; e.uhdRot = _uhdRotateOverrides[k + ':' + f] != null ? _uhdRotateOverrides[k + ':' + f] : null; } + } + return r; + }; + // On by default; opt out via localStorage.setItem('uhdHideOldTextures', '0') + // (a plain window flag would reset on every refresh): + // give interactive UI icons a companion invisible Zone as their real input + // target. Phaser (3.52+) drops non-rendering objects from hit testing and + // the old alwaysEnabled escape hatch for that was removed, so a Zone is the + // only supported way to let the sync loop hide this sprite's own canvas + // rendering (behind its UHD overlay) without also killing its clicks. Once + // the zone takes over, the original sprite's own interactive state stops + // mattering for input at all, which is what makes that hiding safe. + if (!_isObj) { + const _oSetInteractive = go.setInteractive.bind(go); + const _oDisableInteractive = go.disableInteractive.bind(go); + go.setInteractive = function(...args) { + const r = _oSetInteractive(...args); + go._uhdWantsInteractive = true; + if (localStorage.getItem('uhdHideOldTextures') !== '0' && go.input) { + if (!go._uhdHitZone) { + const _cursor = go.input.cursor; + const zone = _sc.add.zone(go.x, go.y, go.width || 1, go.height || 1) + .setOrigin(go.originX, go.originY) + .setInteractive(_cursor ? { cursor: _cursor } : undefined); + go._uhdHitZone = zone; + ['pointerdown', 'pointerup', 'pointerover', 'pointerout', 'pointerupoutside', 'pointermove'] + .forEach(evt => zone.on(evt, (...a) => go.emit(evt, ...a))); + const e = _sc._uhdMap.get(go); + if (e) e.hitZone = zone; + } + // go's own hit-testing is never used again once its zone exists — the + // sync loop drives the zone's enabled state from _uhdWantsInteractive. + _oDisableInteractive(); + } + return r; + }; + go.disableInteractive = function(...args) { + const r = _oDisableInteractive(...args); + go._uhdWantsInteractive = false; + return r; + }; + } + } + return go; + }; + _patchedAddImg._uhd_orig = this.add.image; // keep reference to original for unwrap on restart + this.add.image = _patchedAddImg; + this._bgSpeedX = 0.1; this._bgSpeedY = 0.1; this._menuCameraX = -centerX; this._prevCameraX = -centerX; this._bg = this.add.tileSprite(0, 0, screenWidth, screenHeight, "game_bg_01").setOrigin(0, 0).setScrollFactor(0).setDepth(-10); - this._applyMirroredBackgroundTexture("game_bg_01"); + const _0x15d27a = this.textures.get("game_bg_01").source[0].height; + this._bgInitY = _0x15d27a - screenHeight - o; this._cameraX = -centerX; this._cameraY = 0; this._cameraXRef = { @@ -307,7 +466,6 @@ class GameScene extends Phaser.Scene { }; this._state = new PlayerState(); this._level = new window.LevelObject(this, this._cameraXRef); - this._levelEditor = new window.LevelEditor(this); this._orbGfx = null; this._orbGfxTimer = 0; this._player = new PlayerObject(this, this._state, this._level); @@ -318,7 +476,6 @@ class GameScene extends Phaser.Scene { this._player2.setShipVisible(false); this._player2.setBallVisible(false); this._player2.setWaveVisible(false); - this._player2.setRobotVisible(false); this._colorManager = new ColorManager(); this._practicedMode = new PracticeMode(); if (this._audio == null) { @@ -337,21 +494,22 @@ class GameScene extends Phaser.Scene { if (_0x591888) { this._level.loadLevel(_0x591888); } - const _resolveGdArtId = (key, fallback = 1) => { + const _resolveEditorArtId = (key, fallback, displayOffset = 0) => { const raw = window.settingsMap?.[key]; const parsed = parseInt(raw ?? fallback, 10); - return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback; + const value = Number.isFinite(parsed) ? parsed : fallback; + return String(value + displayOffset).padStart(2, "0"); }; - const _bgGdId = _resolveGdArtId("kA6", parseInt(window._backgroundId || "01", 10) || 1); - window._backgroundId = String(_bgGdId).padStart(2, "0"); + window._backgroundId = _resolveEditorArtId("kA6", parseInt(window._backgroundId || "01", 10) - 1, 1); + window._groundId = _resolveEditorArtId("kA7", parseInt(window._groundId || "00", 10), 0); - const _groundRaw = window.settingsMap?.["kA7"] ?? ((parseInt(window._groundId || "00", 10) || 0) + 1); - window._groundId = getGroundTextureId(_groundRaw); - - const _bgKey = "game_bg_" + getBackgroundTextureIndex(_bgGdId); + const _bgId = window._backgroundId || "01"; + const _bgKey = "game_bg_" + (parseInt(_bgId, 10) - 1); if (this.textures.exists(_bgKey)) { - this._applyMirroredBackgroundTexture(_bgKey); + this._bg.setTexture(_bgKey); + const _newBgH = this.textures.get(_bgKey).source[0].height; + this._bgInitY = _newBgH - screenHeight - o; } this._level.applyGroundTexture(); if (this._level._initialColors) { @@ -402,6 +560,10 @@ class GameScene extends Phaser.Scene { this._totalJumps = parseInt(localStorage.getItem("gd_totalJumps") || "0", 10); this._totalDeaths = parseInt(localStorage.getItem("gd_totalDeaths") || "0", 10); window._completedLevels = parseInt(localStorage.getItem("gd_completedLevels") || "0", 10); + window._totalStars = parseInt(localStorage.getItem("gd_totalStars") || "0", 10); + window._totalOrbs = parseInt(localStorage.getItem("gd_totalOrbs") || "0", 10); + this._coinsCollected = 0; + this._coinTotal = 0; this._playTime = 0; this._menuActive = true; this._slideIn = false; @@ -410,9 +572,9 @@ class GameScene extends Phaser.Scene { this._player.setCubeVisible(false); this._player.setShipVisible(false); this._player.setBallVisible(false); - this._logo = this.add.image(0, 100, "GJ_WebSheet", "GJ_logo_001.png").setScrollFactor(0).setDepth(30); - this._robLogo = this.add.image(110, 595, "GJ_WebSheet", "RobTopLogoBig_001.png").setScrollFactor(0).setDepth(30).setScale(0.525).setInteractive(); - this._makeBouncyButton(this._robLogo, 0.525, () => { + this._logo = this.add.image(0, 140, "GJ_WebSheet", "GJ_logo_001.png").setScrollFactor(0).setDepth(30); + this._robLogo = this.add.image(110, 595, "GJ_GameSheet03", "robtoplogo_small.png").setScrollFactor(0).setDepth(30).setScale(0.7).setInteractive(); + this._makeBouncyButton(this._robLogo, 0.7, () => { window.open("https://geometrydash.com", "_blank"); }, () => this._menuActive); const _socialIconDefs = [ @@ -422,14 +584,14 @@ class GameScene extends Phaser.Scene { {frame: "", url: "", angle: 0, row: 0, col: 3 }, { frame: "gj_twIcon_001.png", url: "https://x.com/rohanis0000gd", angle: -90, flipX: true, row: 1, col: 0 }, - { frame: "gj_ytIcon_001.png", url: "https://www.youtube.com/@rohanis0000gd", angle: 0, row: 1, col: 1 }, - { frame: "gj_tiktokIcon_001.png", url: "https://www.tiktok.com/@rohanis00000", angle: -90, flipX: true, row: 1, col: 2 }, - { frame: "gj_githubIcon_001.png", url: "https://github.com/web-dashers/web-dashers.github.io", angle: 0, row: 1, col: 3 }, + { frame: "gj_ytIcon_001.png", url: "https://www.youtube.com/@TheBlehLollipop", angle: 0, row: 1, col: 1 }, + { frame: "gj_discordIcon_001.png", url: "https://discord.gg/9ZJyuJARK6", angle: 90, row: 1, col: 2 }, + {frame: "", url: "", angle: 0, row: 1, col: 3 }, {frame: "", url: "", angle: 0, row: 2, col: 0 }, {frame: "", url: "", angle: 0, row: 2, col: 1 }, {frame: "", url: "", angle: 0, row: 2, col: 2 }, - { frame: "gj_discordIcon_001.png", url: "https://discord.gg/TfEzAVWPSJ", angle: 90, row: 2, col: 3 }, + {frame: "", url: "", angle: 0, row: 2, col: 3 }, //{ frame: "gj_instaIcon_001.png", url: "https://www.instagram.com/", angle: -90, flipX: true, row: 1, col: 3 }, @@ -465,38 +627,14 @@ class GameScene extends Phaser.Scene { color: "#ffffff", fontFamily: "Arial" }).setOrigin(1, 1).setScrollFactor(0).setDepth(30).setAlpha(0.3); - this._tryMeImg = this.add.image(0, 182.5, "GJ_WebSheet", "tryMe_001.png").setScrollFactor(0).setDepth(30); this._downloadBtns = []; - const _0x4fc67f = [{ - key: "downloadSteam_001", - url: "https://github.com/web-dashers/web-dashers.github.io" - }, - { - key: "downloadApple_001", - url: "https://discord.gg/TfEzAVWPSJ" - }]; - for (let _0xfeaf5c = 0; _0xfeaf5c < _0x4fc67f.length; _0xfeaf5c++) { - const _0x1ce2a6 = _0x4fc67f[_0xfeaf5c]; - const _0x6bf69f = 1 / 1.5; - const _0x1d293f = this.add.image(0, 0, "GJ_WebSheet", _0x1ce2a6.key + ".png").setScrollFactor(0).setDepth(30).setScale(_0x6bf69f).setInteractive(); - this._makeBouncyButton(_0x1d293f, _0x6bf69f, () => window.open(_0x1ce2a6.url, "_blank"), () => this._menuActive); - this._downloadBtns.push(_0x1d293f); - } - const _0x28fa5b = this.scale.isFullscreen; -this._menuFsBtn = this.add.image(33, 33, "GJ_WebSheet", _0x28fa5b ? "toggleFullscreenOff_001.png" : "toggleFullscreenOn_001.png").setScrollFactor(0).setDepth(30).setScale(0.64).setAlpha(0.8).setTint(Phaser.Display.Color.GetColor(255, 255, 255)).setInteractive(); - this._expandHitArea(this._menuFsBtn, 1.5); - this._makeBouncyButton(this._menuFsBtn, 0.64, () => { - const _0x26b7c = !this.scale.isFullscreen; - this._menuFsBtn.setTexture("GJ_WebSheet", _0x26b7c ? "toggleFullscreenOff_001.png" : "toggleFullscreenOn_001.png"); - this._expandHitArea(this._menuFsBtn, 1.5); - this._toggleFullscreen(); - }, () => this._menuActive); + // Fullscreen toggle moved into the Graphics (Video Options) menu — see _buildGraphicsPopup() this._menuInfoBtn = this.add.image(screenWidth + 20, 33, "GJ_GameSheet03", "communityCreditsBtn_001.png").setScrollFactor(0).setDepth(30).setScale(0.64).setTint(Phaser.Display.Color.GetColor(255, 255, 255)).setInteractive(); this._expandHitArea(this._menuInfoBtn, 1.5); this._makeBouncyButton(this._menuInfoBtn, 0.64, () => { this._buildInfoPopup(); }, () => this._menuActive && !this._infoPopup); -this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet", "GJ_infoIcon_001.png").setScrollFactor(0).setDepth(30).setScale(0.64).setTint(Phaser.Display.Color.GetColor(255, 255, 255)).setInteractive(); +this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_GameSheet03", "GJ_infoIcon_001.png").setScrollFactor(0).setDepth(30).setScale(0.64).setTint(Phaser.Display.Color.GetColor(255, 255, 255)).setInteractive(); this._expandHitArea(this._menuUpdateLogBtn, 1.5); this._makeBouncyButton(this._menuUpdateLogBtn, 0.64, () => { this._buildUpdateLogPopup(); @@ -511,15 +649,17 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._makeBouncyButton(this._menuStatsBtn, 1, () => { this._showStatsScreen(); }, () => this._menuActive); - this._menuAchievementsBtn = this.add.image(centerX - 12, screenHeight - 90, "GJ_GameSheet03", "GJ_achBtn_001.png").setScrollFactor(0).setDepth(30).setInteractive().setTint(0x666666); + this._menuAchievementsBtn = this.add.image(centerX - 12, screenHeight - 90, "GJ_GameSheet03", "GJ_achBtn_001.png").setScrollFactor(0).setDepth(30).setInteractive(); this._expandHitArea(this._menuAchievementsBtn, 1); this._makeBouncyButton(this._menuAchievementsBtn, 1, () => { + this._showAchievementsScreen(); }, () => this._menuActive); this._menuNewgroundsBtn = this.add.image(centerX + 312, screenHeight - 90, "GJ_GameSheet03", "GJ_ngBtn_001.png").setScrollFactor(0).setDepth(30).setInteractive().setRotation(-Math.PI / 2).setFlipX(true); this._expandHitArea(this._menuNewgroundsBtn, 1); this._makeBouncyButton(this._menuNewgroundsBtn, 1, () => { this._buildNewgroundsPopup(); }, () => this._menuActive && !this._newgroundsPopup); + this._menuGlitter = this.add.particles(0, 0, "GJ_WebSheet", { frame: "square.png", speed: 0, @@ -556,11 +696,12 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._creatorBtn = this.add.image(0, 0, "GJ_GameSheet04", "GJ_creatorBtn_001.png").setScrollFactor(0).setDepth(30).setInteractive().setScale(1); this._creatorOverlay = null; this._creatorOverlayObjects = null; + this._creatorMenuDomOverlay = null; this._openCreatorMenu = () => { if (this._creatorOverlay) return; + this._uhdContext = 'creator'; this._creatorMenuOpen = true; - const sw = screenWidth; const sh = screenHeight; @@ -627,44 +768,39 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" const rows = Math.ceil(menuButtons.length / cols); const gridH = rows * btnSize + (rows - 1) * gapY; const gridStartY = sh / 2 - gridH / 2 + btnSize / 2; + + const _activeFrames = { + "GJ_searchBtn_001.png": () => { this._closeCreatorMenu(true); this._openSearchMenu(); }, + "GJ_featuredBtn_001.png": () => { this._closeCreatorMenu(true); this._openOnlineLevelsScene({ type: 6 }); }, + "GJ_createBtn_001.png": () => { this._closeCreatorMenu(true); this._openEditorMenu(); }, + "GJ_savedBtn_001.png": () => { this._closeCreatorMenu(true); this._openSavedMenu(); }, + "GJ_highscoreBtn_001.png": () => { window.open("https://webdemonlist.org/leaderboard", "_blank"); }, + "GJ_challengeBtn_001.png": () => { this._buildQuestPopup(); }, + }; + menuButtons.forEach((frame, idx) => { const col = idx % cols; const row = Math.floor(idx / cols); const bx = gridStartX + col * (btnSize + gapX); const by = gridStartY + row * (btnSize + gapY); + const cb = _activeFrames[frame]; const btn = this.add.image(bx, by, "GJ_GameSheet04", frame) - .setScrollFactor(0).setDepth(104).setScale(btnScale); - const isSearchButton = frame === "GJ_searchBtn_001.png"; - const isFeaturedButton = frame === "GJ_featuredBtn_001.png"; - const isEditorButton = frame === "GJ_createBtn_001.png"; - if (isSearchButton) { - btn.setInteractive(); - this._makeBouncyButton(btn, btnScale, () => { - this._closeCreatorMenu(true); - this._openSearchMenu(); - }, () => true); - } else if (isFeaturedButton) { + .setScrollFactor(0).setDepth(103).setScale(btnScale); + if (!cb) btn.setAlpha(0.4); + if (cb) { btn.setInteractive(); - this._makeBouncyButton(btn, btnScale, () => { - this._closeCreatorMenu(true); - this._openOnlineLevelsScene({ type: 6 }); - }, () => true); - } else if (isEditorButton) { - btn.setInteractive(); - this._makeBouncyButton(btn, btnScale, () => { - this._closeCreatorMenu(true); - this._openEditorMenu(); - }, () => true); - } else { - btn.setTint(0x666666); + this._makeBouncyButton(btn, btnScale, cb); } this._creatorOverlayObjects.push(btn); }); }; + this._savedOverlay = null; this._searchOverlay = null; this._searchOverlayObjects = []; + this._levelViewOverlay = null; this._openEditorMenu = () => { if (this._editorOverlay) return; + this._uhdContext = 'editor'; const sw = screenWidth; const sh = screenHeight; const centerX = sw / 2; @@ -773,12 +909,12 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" if (createdLevels.length === 0) { container.add(this.add.bitmapText(centerX, tableY + (tableH/2), "bigFont", "No Levels", 30).setOrigin(0.5).setAlpha(0.5)); } - const sideFrame = this.textures.getFrame("GJ_WebSheet", "GJ_table_side_001.png"); + const sideFrame = this.textures.getFrame("GJ_GameSheet03", "GJ_table_side_001.png"); const sideScaleY = tableH / sideFrame.height; - container.add(this.add.image(tableX - 40, tableY, "GJ_WebSheet", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, sideScaleY)); - container.add(this.add.image(tableX + tableW + 40, tableY, "GJ_WebSheet", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, sideScaleY)); - container.add(this.add.image(centerX, tableY - 10, "GJ_WebSheet", "GJ_table_top_001.png")); - container.add(this.add.image(centerX, tableY + tableH + 20, "GJ_WebSheet", "GJ_table_bottom_001.png")); + container.add(this.add.image(tableX - 40, tableY, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, sideScaleY)); + container.add(this.add.image(tableX + tableW + 40, tableY, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, sideScaleY)); + container.add(this.add.image(centerX, tableY - 10, "GJ_GameSheet03", "GJ_table_top_001.png")); + container.add(this.add.image(centerX, tableY + tableH + 20, "GJ_GameSheet03", "GJ_table_bottom_001.png")); container.add(this.add.bitmapText(centerX, tableY - 15, "bigFont", "My Levels", 42).setOrigin(0.5).setScale(1.1)); let startY = tableY; @@ -1069,6 +1205,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" return "local_" + (maxId + 1); }; this._openLevelView = (level) => { + this._uhdContext = 'levelView'; const sw = screenWidth; const sh = screenHeight; const centerX = sw / 2; @@ -1107,6 +1244,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" overlay.fillStyle(bandColor, 1); overlay.fillRect(0, Math.floor(gi * sh / gradientSteps), sw, Math.ceil(sh / gradientSteps) + 1); } + this._levelViewOverlay = overlay; const container = this.add.container(0, 0).setDepth(150); const boxWidth = sw * 0.6; @@ -1200,6 +1338,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" container.destroy(); overlay.destroy(); blocker.destroy(); + this._levelViewOverlay = null; }; const btnY = sh * 0.58; @@ -1241,8 +1380,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" window._onlineLevelString = level.levelString; window._onlineLevelName = level.levelName; window._onlineLevelId = level.createdId; - window._onlineSongBuffer = null; - window._onlineSongKey = null; + if (!window._activeNongId) { window._onlineSongBuffer = null; window._onlineSongKey = null; } window._onlineSongOffset = 0; if (isEditor){ window.isEditor = true; @@ -1255,21 +1393,48 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" ["Local", "SongAuthor"] ]; if (level.songId < 0){ - window.currentlevel[0] = window.allLevels[Math.abs(level.songId) - 1][0]; - window.currentlevel[3] = ["Local", window.allLevels[Math.abs(level.songId) - 1][3]] + const mainLevel = window.allLevels[Math.abs(level.songId) - 1]; + window.currentlevel[0] = mainLevel[0]; + window.currentlevel[3] = ["Local", mainLevel[3]]; + const songKey = mainLevel[0]; + if (!this.cache.audio.exists(songKey)) { + const songFileName = mainLevel[1].replaceAll(" ", ""); + await new Promise((resolve) => { + this.load.audio(songKey, "assets/music/" + songFileName + ".mp3"); + this.load.once("complete", resolve); + this.load.start(); + }); + } } else { const songId = level.songId; + const LOCAL_SONGS = { + "467339": { file: "Bloodbath.mp3", artist: "Dimrain47" } + }; + + if (LOCAL_SONGS[String(songId)]) { + const localSong = LOCAL_SONGS[String(songId)]; + const localKey = `local_song_${songId}`; + window.currentlevel[0] = localKey; + if (!this.cache.audio.exists(localKey)) { + await new Promise((resolve) => { + this.load.audio(localKey, "assets/music/" + localSong.file); + this.load.once("complete", resolve); + this.load.start(); + }); + } + window.currentlevel[3] = ["Local", localSong.artist]; + } else { const songKey = `ng_song_${songId}`; window.currentlevel[0] = songKey; - + if (songInfoUrl && songId > 0) { - try { + try { const ngRes = await window.fetchGdApi("/getGJSongInfo.php", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: `songID=${songId}&secret=Wmfd2893gb7` }); - + const ngText = ngRes.ok ? await ngRes.text() : "-1"; if (ngText && ngText !== "-1") { const ngParts = ngText.split("~|~"); @@ -1283,15 +1448,16 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" if (songUrl) { const audioCtx = this.game.sound.context; if (audioCtx.state === "suspended") await audioCtx.resume(); - const proxiedUrl = (typeof window.getGdAudioUrl === "function" ? window.getGdAudioUrl(songUrl) : songUrl); - const audioRes = await fetch(proxiedUrl); + const audioRes = songUrl.includes("b-cdn.net") + ? await fetch((window.ApiWrapper ? window.ApiWrapper.getProxy() : "https://proxy.corsfix.com/?") + songUrl) + : await fetch(typeof window.getGdAudioUrl === "function" ? window.getGdAudioUrl(songUrl) : songUrl); + if (!audioRes.ok) throw new Error(`audio fetch returned ${audioRes.status}`); const arrayBuf = await audioRes.arrayBuffer(); const decoded = await audioCtx.decodeAudioData(arrayBuf); window._onlineSongBuffer = decoded; window._onlineSongKey = songKey; window._onlineSongTitle = songTitle; window._onlineSongArtist = songArtist; - window.currentlevel[3] = ["Local", window._onlineSongArtist] } } @@ -1299,6 +1465,10 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" console.warn("Failed to load custom song", err); } } + } + } + if (window._activeNongId && window._onlineSongBuffer) { + window._onlineSongKey = window.currentlevel[0]; } this.scene.restart(); }; @@ -1309,8 +1479,288 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._editorOverlay = null; this._editorObjects = null; }; + this._savedCurrentFolder = null; + this._openSavedMenu = (folder = null) => { + if (this._savedOverlay) return; + this._uhdContext = 'saved'; + this._savedCurrentFolder = folder; + const sw = screenWidth; + const sh = screenHeight; + const centerX = sw / 2; + + const fadeIn = this.add.graphics().setScrollFactor(0).setDepth(200); + fadeIn.fillStyle(0x000000, 1); + fadeIn.fillRect(0, 0, sw, sh); + this.tweens.add({ targets: fadeIn, alpha: 0, duration: 300, ease: "Linear", onComplete: () => fadeIn.destroy() }); + + const overlay = this.add.graphics().setScrollFactor(0).setDepth(100); + const gradientSteps = 80; + for (let gi = 0; gi < gradientSteps; gi++) { + const t = gi / (gradientSteps - 1); + const r1 = Math.round(0x00 + (0x01 - 0x00) * t); + const g1 = Math.round(0x65 + (0x2c - 0x65) * t); + const b1 = Math.round(0xff + (0x71 - 0xff) * t); + const bandColor = (r1 << 16) | (g1 << 8) | b1; + overlay.fillStyle(bandColor, 1); + overlay.fillRect(0, Math.floor(gi * sh / gradientSteps), sw, Math.ceil(sh / gradientSteps) + 1); + } + this._savedOverlay = overlay; + + const blocker = this.add.zone(centerX, sh / 2, sw, sh).setScrollFactor(0).setDepth(101).setInteractive(); + const container = this.add.container(0, 0).setScrollFactor(0).setDepth(102); + + const tableW = 712; + const tableH = 460; + const tableX = (sw - tableW) / 2; + const tableY = 85; + + const allLevels = JSON.parse(localStorage.getItem("saved_levels") || "[]"); + const folders = JSON.parse(localStorage.getItem("saved_folders") || "[]"); + const lengthValues = ["Tiny", "Short", "Medium", "Long", "XL"]; + + const listContainer = this.add.container(0, 0); + const maskShape = this.add.graphics().fillStyle(0xffffff).fillRect(tableX, tableY, tableW, tableH).setVisible(false); + const mask = maskShape.createGeometryMask(); + listContainer.setMask(mask); + container.add(this.add.graphics().setScrollFactor(0).setDepth(90).fillStyle(0xc2723e, 1).fillRect(tableX, tableY, tableW, tableH)); + container.add(listContainer); + + const spacing = 100; + let rowIndex = 0; + + if (!folder) { + folders.forEach((folderName) => { + const slotY = (rowIndex * spacing) + (spacing / 2); + const stripeColor = rowIndex % 2 !== 0 ? 0xc2723e : 0xa1582c; + const levelCount = allLevels.filter(l => l.folder === folderName).length; + + const bgStripe = this.add.rectangle(centerX, slotY, tableW - 10, spacing, stripeColor, 1); + const separator = this.add.rectangle(centerX, slotY + (spacing / 2), tableW - 10, 1, 0x502c16, 1); + const folderIcon = this.add.bitmapText(tableX + 20, slotY - 5, "bigFont", ">", 36).setOrigin(0, 0.5).setTint(0xffcc00); + const nameTxt = this.add.bitmapText(tableX + 45, slotY - 5, "bigFont", folderName, 36).setOrigin(0, 0.5).setTint(0xffcc00); + const countTxt = this.add.bitmapText(tableX + 45, slotY + 28, "bigFont", levelCount + " level" + (levelCount !== 1 ? "s" : ""), 18).setOrigin(0, 0.5).setAlpha(0.7); + + const openBtn = this.add.nineslice(tableX + tableW - 80, slotY - 5, "GJ_button01", null, 120, 60, 24, 24, 24, 24).setScale(0.75).setInteractive(); + const openTxt = this.add.bitmapText(openBtn.x - 2, openBtn.y - 1, "bigFont", "Open", 32).setOrigin(0.5).setScale(0.8); + this._makeBouncyButton(openBtn, 0.75, () => { + this._closeSavedMenu(true); + this._openSavedMenu(folderName); + }); + + const delFolderBtn = this.add.nineslice(tableX + tableW - 80, slotY + 32, "GJ_button01", null, 80, 40, 24, 24, 24, 24).setScale(0.55).setInteractive().setTint(0xff4444); + const delFolderTxt = this.add.bitmapText(delFolderBtn.x - 2, delFolderBtn.y - 1, "bigFont", "Del", 24).setOrigin(0.5).setScale(0.7); + this._makeBouncyButton(delFolderBtn, 0.55, () => { + const curFolders = JSON.parse(localStorage.getItem("saved_folders") || "[]"); + localStorage.setItem("saved_folders", JSON.stringify(curFolders.filter(f => f !== folderName))); + const levels = JSON.parse(localStorage.getItem("saved_levels") || "[]"); + levels.forEach(l => { if (l.folder === folderName) l.folder = null; }); + localStorage.setItem("saved_levels", JSON.stringify(levels)); + this._closeSavedMenu(true); + this._openSavedMenu(); + }); + + listContainer.add([bgStripe, separator, folderIcon, nameTxt, countTxt, openBtn, openTxt, delFolderBtn, delFolderTxt]); + rowIndex++; + }); + } + + const visibleLevels = folder + ? allLevels.filter(l => l.folder === folder) + : allLevels.filter(l => !l.folder); + + visibleLevels.forEach((level) => { + const slotY = (rowIndex * spacing) + (spacing / 2); + const stripeColor = rowIndex % 2 !== 0 ? 0xc2723e : 0xa1582c; + + const bgStripe = this.add.rectangle(centerX, slotY, tableW - 10, spacing, stripeColor, 1); + const separator = this.add.rectangle(centerX, slotY + (spacing / 2), tableW - 10, 1, 0x502c16, 1); + const nameTxt = this.add.bitmapText(tableX + 20, slotY - 22, "bigFont", level.levelName || "Unknown", 32).setOrigin(0, 0.5); + const infoY = slotY + 18; + const authorTxt = this.add.bitmapText(tableX + 20, infoY, "bigFont", "By " + (level.author || "Unknown"), 18).setOrigin(0, 0.5); + const lenIcon = this.add.image(tableX + 250, infoY, "GJ_GameSheet03", "GJ_timeIcon_001.png").setScale(0.65); + const lenTxt = this.add.bitmapText(lenIcon.x + 22, infoY, "bigFont", lengthValues[level.levelLength] || "NA", 18).setOrigin(0, 0.5); + + const viewBtn = this.add.nineslice(tableX + tableW - 80, slotY - 15, "GJ_button01", null, 120, 60, 24, 24, 24, 24).setScale(0.65).setInteractive(); + const viewTxt = this.add.bitmapText(viewBtn.x - 2, viewBtn.y - 1, "bigFont", "View", 28).setOrigin(0.5).setScale(0.8); + this._makeBouncyButton(viewBtn, 0.65, () => { + const levelData = { + id: (level.savedId || "").replace("online_", ""), + title: level.levelName || "Unknown", + author: level.author || "Unknown", + difficulty: 0, + stars: level.stars || 0, + downloads: level.downloads || 0, + likes: level.likes || 0, + length: level.levelLength || 0, + description: level.description || "", + orbs: 0, + officialSong: "0", + customSongID: level.songId > 0 ? String(level.songId) : "0", + isCustomSong: level.songId > 0, + }; + window._onlineLevelString = level.levelString; + window._onlineLevelName = level.levelName; + window._onlineLevelId = level.savedId; + window._onlineSongTitle = level.song || "Unknown"; + window._onlineSongArtist = "Unknown"; + const songKey = level.songId > 0 ? `ng_song_${level.songId}` : (window.allLevels[Math.abs(level.songId) - 1] || ["unknown"])[0]; + window.currentlevel = [songKey, level.levelName, level.savedId, ["Unknown"]]; + const onPlay = () => { + this._closeLevelInfoPage(); + this._closeSavedMenu(false); + this._startCreatedLevel(level, false); + }; + this._showLevelInfoPage(levelData, songKey, onPlay); + }); + + const moveBtn = this.add.nineslice(tableX + tableW - 135, slotY + 25, "GJ_button01", null, 80, 40, 24, 24, 24, 24).setScale(0.55).setInteractive().setTint(0x4488ff); + const moveTxt = this.add.bitmapText(moveBtn.x - 2, moveBtn.y - 1, "bigFont", "Move", 24).setOrigin(0.5).setScale(0.7); + this._makeBouncyButton(moveBtn, 0.55, () => { + this._showFolderPicker(level.savedId, folder); + }); + + const deleteBtn = this.add.nineslice(tableX + tableW - 55, slotY + 25, "GJ_button01", null, 80, 40, 24, 24, 24, 24).setScale(0.55).setInteractive().setTint(0xff4444); + const deleteTxt = this.add.bitmapText(deleteBtn.x - 2, deleteBtn.y - 1, "bigFont", "Del", 24).setOrigin(0.5).setScale(0.7); + this._makeBouncyButton(deleteBtn, 0.55, () => { + const levels = JSON.parse(localStorage.getItem("saved_levels") || "[]"); + localStorage.setItem("saved_levels", JSON.stringify(levels.filter(l => l.savedId !== level.savedId))); + this._closeSavedMenu(true); + this._openSavedMenu(folder); + }); + + listContainer.add([bgStripe, separator, nameTxt, authorTxt, lenIcon, lenTxt, viewBtn, viewTxt, moveBtn, moveTxt, deleteBtn, deleteTxt]); + rowIndex++; + }); + + if (rowIndex === 0) { + container.add(this.add.bitmapText(centerX, tableY + (tableH / 2), "bigFont", folder ? "Empty Folder" : "No Saved Levels", 30).setOrigin(0.5).setAlpha(0.5)); + } + + const sideFrame = this.textures.getFrame("GJ_GameSheet03", "GJ_table_side_001.png"); + const sideScaleY = tableH / sideFrame.height; + container.add(this.add.image(tableX - 40, tableY, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, sideScaleY)); + container.add(this.add.image(tableX + tableW + 40, tableY, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, sideScaleY)); + container.add(this.add.image(centerX, tableY - 10, "GJ_GameSheet03", "GJ_table_top_001.png")); + container.add(this.add.image(centerX, tableY + tableH + 20, "GJ_GameSheet03", "GJ_table_bottom_001.png")); + container.add(this.add.bitmapText(centerX, tableY - 15, "bigFont", folder ? folder : "Saved Levels", 42).setOrigin(0.5).setScale(1.1)); + + const newFolderBtn = this.add.image(sw - 60, sh - 55, "GJ_GameSheet03", "gj_folderBtn_001.png") + .setScale(0.9).setScrollFactor(0).setDepth(104).setInteractive(); + this._makeBouncyButton(newFolderBtn, 0.9, () => { + const name = prompt("Folder name:"); + if (!name || !name.trim()) return; + const curFolders = JSON.parse(localStorage.getItem("saved_folders") || "[]"); + if (curFolders.includes(name.trim())) return; + curFolders.push(name.trim()); + localStorage.setItem("saved_folders", JSON.stringify(curFolders)); + this._closeSavedMenu(true); + this._openSavedMenu(folder); + }); + + let startY = tableY; + const listHeight = rowIndex * spacing; + const minY = tableY - Math.max(0, listHeight - tableH) - 10; + const maxY = tableY + 22; + + listContainer.y = maxY; + this._savedScrollTargetY = maxY; + const onWheel = (pointer, gameObjects, deltaX, deltaY) => { + if (!this._savedOverlay) return; + this._savedScrollTargetY -= deltaY; + this._savedScrollTargetY = Phaser.Math.Clamp(this._savedScrollTargetY, minY, maxY); + this.tweens.add({ + targets: listContainer, + y: this._savedScrollTargetY, + duration: 250, + ease: 'Power2', + overwrite: true + }); + }; + this.input.on('wheel', onWheel); + + blocker.on('pointerdown', (pointer) => { startY = pointer.y - listContainer.y; }); + blocker.on('pointermove', (pointer) => { + if (pointer.isDown) { + listContainer.y = Phaser.Math.Clamp(pointer.y - startY, minY, maxY); + } + }); + + const backBtn = this.add.image(50, 48, "GJ_GameSheet03", "GJ_arrow_03_001.png") + .setScrollFactor(0).setDepth(104).setFlipX(true).setFlipY(true).setRotation(Math.PI).setInteractive(); + this._makeBouncyButton(backBtn, 1, () => { + if (folder) { + this._closeSavedMenu(true); + this._openSavedMenu(); + } else { + this._closeSavedMenu(); + this._openCreatorMenu(); + } + }); + + this._savedObjects = [overlay, blocker, container, backBtn, maskShape, newFolderBtn, { destroy: () => this.input.off('wheel', onWheel) }]; + }; + this._showFolderPicker = (levelSavedId, currentFolder) => { + const sw = screenWidth; + const sh = screenHeight; + const folders = JSON.parse(localStorage.getItem("saved_folders") || "[]"); + const options = [{ label: "No Folder", value: null }, ...folders.map(f => ({ label: f, value: f }))]; + const popupW = 300; + const popupH = Math.min(50 + options.length * 45, 400); + const popupX = sw / 2 - popupW / 2; + const popupY = sh / 2 - popupH / 2; + const popupObjects = []; + + const dimmer = this.add.graphics().setScrollFactor(0).setDepth(150); + dimmer.fillStyle(0x000000, 0.6); + dimmer.fillRect(0, 0, sw, sh); + const dimBlocker = this.add.zone(sw / 2, sh / 2, sw, sh).setScrollFactor(0).setDepth(151).setInteractive(); + popupObjects.push(dimmer, dimBlocker); + + const bg = this.add.graphics().setScrollFactor(0).setDepth(152); + bg.fillStyle(0x002e75, 0.95); + bg.fillRoundedRect(popupX, popupY, popupW, popupH, 12); + popupObjects.push(bg); + + const title = this.add.bitmapText(sw / 2, popupY + 20, "bigFont", "Move to Folder", 24).setScrollFactor(0).setDepth(153).setOrigin(0.5); + popupObjects.push(title); + + const cleanup = () => { popupObjects.forEach(o => { if (o && o.destroy) o.destroy(); }); }; + + options.forEach((opt, i) => { + const btnY = popupY + 55 + i * 45; + const isActive = opt.value === currentFolder; + const btn = this.add.nineslice(sw / 2, btnY, "GJ_button01", null, 240, 38, 24, 24, 24, 24) + .setScrollFactor(0).setDepth(153).setInteractive(); + if (isActive) btn.setTint(0x44aa44); + const lbl = this.add.bitmapText(sw / 2, btnY - 1, "bigFont", opt.label, 22) + .setScrollFactor(0).setDepth(154).setOrigin(0.5); + this._makeBouncyButton(btn, 1, () => { + const levels = JSON.parse(localStorage.getItem("saved_levels") || "[]"); + const lvl = levels.find(l => l.savedId === levelSavedId); + if (lvl) { + lvl.folder = opt.value; + localStorage.setItem("saved_levels", JSON.stringify(levels)); + } + cleanup(); + this._closeSavedMenu(true); + this._openSavedMenu(this._savedCurrentFolder); + }); + popupObjects.push(btn, lbl); + }); + + dimBlocker.on("pointerup", () => cleanup()); + }; + this._closeSavedMenu = (silent = false) => { + if (!this._savedOverlay) return; + if (this._savedObjects) { + this._savedObjects.forEach(obj => { if (obj && obj.destroy) obj.destroy(); }); + } + this._savedOverlay = null; + this._savedObjects = null; + }; this._openSearchMenu = () => { if (this._searchOverlay) return; + this._uhdContext = 'search'; const sw = screenWidth; const sh = screenHeight; @@ -1490,6 +1940,11 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" get value() { return inputText; }, }; const _repositionInput = () => {}; + let _activeDiff = []; + let _activeDemonFilter = null; + let _activeLen = []; + let _activeStar = false; + const qsLabelY = sh * 0.195; const qsPanelY = qsLabelY + 25; const qsPanelH = sh * 0.36; @@ -1498,9 +1953,6 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" gfx.fillStyle(panelColor, panelAlpha); gfx.fillRoundedRect(panelLeft, qsPanelY, panelW, qsPanelH, panelRadius); - const comingSoonLabel = this.add.bitmapText(sw / 2, qsPanelY + qsPanelH / 2, "bigFont", "Coming Soon!", 42) - .setScrollFactor(0).setDepth(105).setOrigin(0.5, 0.5).setTint(0xadd8e6).setAlpha(0.75); - this._searchOverlayObjects.push(comingSoonLabel); const filtersLabelY = qsPanelY + qsPanelH + 24; const filtersPanelY = filtersLabelY + 20; const filtersPanelH = sh * 0.16; @@ -1510,34 +1962,491 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" gfx.fillStyle(filtersPanelColor, panelAlpha); gfx.fillRoundedRect(panelLeft, filtersPanelY, panelW, filtersPanelH, panelRadius); - const filtersComingSoon = this.add.bitmapText(sw / 2, filtersPanelY + filtersPanelH / 2, "bigFont", "Coming Soon!", 42) - .setScrollFactor(0).setDepth(105).setOrigin(0.5, 0.5).setTint(0xadd8e6).setAlpha(0.75); - const extraPanelY = filtersPanelY + filtersPanelH + 18; const extraPanelH = sh * 0.11; gfx.fillStyle(extraPanelColor, panelAlpha); gfx.fillRoundedRect(panelLeft, extraPanelY, panelW, extraPanelH, panelRadius); - const extraComingSoon = this.add.bitmapText(sw / 2, extraPanelY + extraPanelH / 2, "bigFont", "Coming Soon!", 42) - .setScrollFactor(0).setDepth(105).setOrigin(0.5, 0.5).setTint(0xadd8e6).setAlpha(0.75); + // Quick Search 3x3 grid — sort types are well-documented boomlings API values; + // Sent/Followed/Friends need a real logged-in GD account (accountID + friend + // graph), which this client doesn't have, so they're shown but disabled. + const qsDefs = [ + { label: "Downloads", frame: "GJ_sDownloadIcon_001.png", rotated: false, type: 1 }, + { label: "Likes", frame: "GJ_sLikeIcon_001.png", rotated: true, type: 2 }, + // No confirmed boomlings API type for the mod-rating "Sent" queue — even + // GDBrowser's own search wrapper has no mapping for it (type 17 is actually + // "gdworld", a different thing entirely). Disabled until a real value turns up. + { label: "Sent", frame: "GJ_sModIcon_001.png", rotated: false, type: null, disabledReason: "Sent is coming soon" }, + { label: "Trending", frame: "GJ_sTrendingIcon_001.png", rotated: false, type: 3 }, + { label: "Recent", frame: "GJ_sRecentIcon_001.png", rotated: true, type: 4 }, + { label: "Magic", frame: "GJ_sMagicIcon_001.png", rotated: true, type: 7 }, + { label: "Awarded", frame: "GJ_starsIcon_001.png", rotated: false, type: 11, iconScale: 0.68 }, + { label: "Followed", frame: "GJ_sFollowedIcon_001.png", rotated: true, type: null }, + { label: "Friends", frame: "GJ_sFriendsIcon_001.png", rotated: false, type: null }, + ]; + const qsCols = 3; + const qsCellW = panelW / qsCols; + const qsCellH = qsPanelH / 3; + const qsObjs = []; + qsDefs.forEach((def, i) => { + const col = i % qsCols, row = Math.floor(i / qsCols); + const cx = panelLeft + col * qsCellW + qsCellW / 2; + const cy = qsPanelY + row * qsCellH + qsCellH / 2; + const btnW = qsCellW - 24; + const btnH = Math.min(56, qsCellH - 16); + const enabled = def.type !== null; + const btnBg = this.add.nineslice(cx, cy, "GJ_button01", null, btnW, btnH, 24, 24, 24, 24) + .setScrollFactor(0).setDepth(105).setInteractive(); + const label = this.add.bitmapText(cx - 16, cy, "bigFont", def.label.toUpperCase(), 20) + .setScrollFactor(0).setDepth(106).setOrigin(0.5, 0.5).setScale(1.2); + const icon = this.add.image(cx + btnW / 2 - 30, cy, "GJ_GameSheet03", def.frame) + .setScrollFactor(0).setDepth(106).setScale((def.iconScale || 1) * 1.05); + if (def.rotated) icon.setFlipY(true).setAngle(90); + if (!enabled) { + btnBg.setTint(0x777777).setAlpha(0.55); + label.setTint(0xbbbbbb); + icon.setAlpha(0.55); + } + qsObjs.push(btnBg, label, icon); + this._makeBouncyButton(btnBg, 1, () => { + if (!enabled) { _showStatus(def.disabledReason || (def.label + " requires a linked GD account"), "#ff6666"); return; } + _runQuickSearch(def.type, def.label); + }); + }); + + // Difficulty filter row + const diffDefs = [ + { label: "N/A", frame: "difficulty_00_btn_001.png", rotated: false, diff: -1 }, + { label: "Easy", frame: "difficulty_01_btn_001.png", rotated: true, diff: 1 }, + { label: "Normal", frame: "difficulty_02_btn_001.png", rotated: false, diff: 2 }, + { label: "Hard", frame: "difficulty_03_btn_001.png", rotated: true, diff: 3 }, + { label: "Harder", frame: "difficulty_04_btn_001.png", rotated: false, diff: 4 }, + { label: "Insane", frame: "difficulty_05_btn_001.png", rotated: true, diff: 5 }, + { label: "Easy Demon", frame: "difficulty_06_btn_001.png", rotated: true, diff: -2, demonFilter: 1 }, + { label: "Auto", frame: "difficulty_auto_btn_001.png", rotated: true, diff: -3 }, + ]; + const diffCellW = panelW / diffDefs.length; + const diffIconY = filtersPanelY + filtersPanelH * 0.5; + const diffButtons = []; + const diffObjs = []; + const DIFF_DIM_TINT = 0x999999; + const DIFF_TARGET_SIZE = 68; + diffDefs.forEach((def) => { + const idx = diffButtons.length; + const cx = panelLeft + idx * diffCellW + diffCellW / 2; + // The difficulty_XX_btn frames already have their name baked into the art — + // no separate caption needed (that's what was causing the doubled text). + const icon = this.add.image(cx, diffIconY, "GJ_GameSheet03", def.frame) + .setScrollFactor(0).setDepth(106).setTint(DIFF_DIM_TINT).setInteractive(); + // Scale to a consistent bounding box instead of one flat factor — the frames + // have different native pixel sizes, so a flat scale made some look wider/ + // bigger than others. + icon.setScale(DIFF_TARGET_SIZE / Math.max(icon.width, icon.height)); + if (def.rotated) icon.setFlipY(true).setAngle(90); + diffButtons.push({ def, icon }); + diffObjs.push(icon); + }); + const _refreshDiffVisuals = () => { + diffButtons.forEach(({ def, icon }) => { + const isSelected = def.diff < 0 + ? (_activeDiff.length === 1 && _activeDiff[0] === def.diff && + (def.diff !== -2 || _activeDemonFilter === def.demonFilter)) + : _activeDiff.includes(def.diff); + if (isSelected) icon.clearTint(); else icon.setTint(DIFF_DIM_TINT); + }); + }; + diffButtons.forEach(({ def, icon }) => { + this._makeBouncyButton(icon, icon.scale, () => { + if (def.diff < 0) { + const alreadyExclusive = _activeDiff.length === 1 && _activeDiff[0] === def.diff && + (def.diff !== -2 || _activeDemonFilter === def.demonFilter); + if (alreadyExclusive) { _activeDiff = []; _activeDemonFilter = null; } + else { _activeDiff = [def.diff]; _activeDemonFilter = def.demonFilter || null; } + } else { + _activeDemonFilter = null; + _activeDiff = _activeDiff.filter(d => d >= 0); + _activeDiff = _activeDiff.includes(def.diff) + ? _activeDiff.filter(d => d !== def.diff) + : [..._activeDiff, def.diff]; + } + _refreshDiffVisuals(); + }); + }); + _refreshDiffVisuals(); + + // Length + star filter row + const lenDefs = [ + { label: "Tiny", len: 0 }, { label: "Short", len: 1 }, { label: "Medium", len: 2 }, + { label: "Long", len: 3 }, { label: "XL", len: 4 }, { label: "Plat.", len: 5 }, + ]; + const lenCols = lenDefs.length + 2; + const lenCellW = panelW / lenCols; + const lenY = extraPanelY + extraPanelH / 2; + const lenButtons = []; + const lenObjs = []; + const clockCX = panelLeft + lenCellW / 2; + const clockIcon = this.add.image(clockCX, lenY, "GJ_GameSheet03", "GJ_timeIcon_001.png") + .setScrollFactor(0).setDepth(106).setScale(0.95); + lenObjs.push(clockIcon); + lenDefs.forEach((def, i) => { + const cx = panelLeft + (i + 1) * lenCellW + lenCellW / 2; + const label = this.add.bitmapText(cx - 10, lenY, "bigFont", def.label, 24) + .setScrollFactor(0).setDepth(106).setOrigin(0.5, 0.5).setTint(DIFF_DIM_TINT).setInteractive(); + lenButtons.push({ def, label }); + lenObjs.push(label); + }); + const starCX = panelLeft + (lenDefs.length + 1) * lenCellW + lenCellW / 2; + const starIcon = this.add.image(starCX, lenY, "GJ_GameSheet03", "GJ_starsIcon_001.png") + .setScrollFactor(0).setDepth(106).setScale(0.95).setTint(DIFF_DIM_TINT).setInteractive(); + lenObjs.push(starIcon); + const _refreshLenVisuals = () => { + lenButtons.forEach(({ def, label }) => { + label.setTint(_activeLen.includes(def.len) ? 0xffffff : DIFF_DIM_TINT); + }); + if (_activeStar) starIcon.clearTint(); else starIcon.setTint(DIFF_DIM_TINT); + }; + lenButtons.forEach(({ def, label }) => { + this._makeBouncyButton(label, 1, () => { + _activeLen = _activeLen.includes(def.len) + ? _activeLen.filter(l => l !== def.len) + : [..._activeLen, def.len]; + _refreshLenVisuals(); + }); + }); + this._makeBouncyButton(starIcon, 0.95, () => { _activeStar = !_activeStar; _refreshLenVisuals(); }); + _refreshLenVisuals(); + + // Right-edge icon stack: clear filters / advanced options + const rightIconX = sw - 55; + const clearBtn = this.add.image(rightIconX, topPanelY + topPanelH / 2, "GJ_GameSheet03", "GJ_closeBtn_001.png") + .setScrollFactor(0).setDepth(105).setScale(0.8).setInteractive().setFlipY(true).setAngle(90); + this._makeBouncyButton(clearBtn, 0.8, () => { + inputText = ""; + _updateInputDisplay(); + _activeDiff = []; + _activeDemonFilter = null; + _activeLen = []; + _activeStar = false; + _refreshDiffVisuals(); + _refreshLenVisuals(); + _hideStatus(); + }); + const advBtn = this.add.image(rightIconX, topPanelY + topPanelH / 2 + 100, "GJ_GameSheet03", "GJ_plusBtn_001.png") + .setScrollFactor(0).setDepth(105).setScale(0.8).setInteractive().setFlipY(true).setAngle(90); + this._makeBouncyButton(advBtn, 0.8, () => { _showStatus("Advanced filters coming soon"); }); this._searchOverlayObjects.push(gfx, qsLabel, filtersLabel, cornerBR, cornerBL, placeholderLabel, typedLabel, inputCursor, inputHitZone, innerBtn1, innerBtn2, innerBtn3, - filtersComingSoon, extraComingSoon); + clearBtn, advBtn, ...qsObjs, ...diffObjs, ...lenObjs); let _loading = false; + let _statusLabel = null; + let _statusTimer = null; + const _showStatus = (msg, color = "#ffffff") => { + const tint = typeof color === "string" ? parseInt(color.replace("#", "0x")) : color; + if (!_statusLabel) { + _statusLabel = this.add.bitmapText(sw / 2, topPanelY + topPanelH + 16, "bigFont", "", 22) + .setScrollFactor(0).setDepth(170).setOrigin(0.5, 0.5); + this._searchOverlayObjects.push(_statusLabel); + } + if (_statusTimer) { _statusTimer.remove(); _statusTimer = null; } + _statusLabel.setText(msg).setTint(tint).setVisible(true); + _statusTimer = this.time.delayedCall(2500, () => { if (_statusLabel) _statusLabel.setVisible(false); }); + }; + const _hideStatus = () => { + if (_statusTimer) { _statusTimer.remove(); _statusTimer = null; } + if (_statusLabel) _statusLabel.setVisible(false); + }; + + const _currentFilterOpts = () => ({ + diff: _activeDiff, demonFilter: _activeDemonFilter, len: _activeLen, star: _activeStar + }); + const _doSearch = async () => { if (_loading) return; - const levelId = htmlInput.value.trim().replace(/\D/g, ""); - if (!levelId) return; + const raw = htmlInput.value.trim(); + if (!raw) return; + _loading = true; + try { + if (/^\d+$/.test(raw)) { + await _doSearchInner(raw); + } else { + await _doNameSearch(raw, 0, _currentFilterOpts()); + } + } catch (err) { + } finally { + _loading = false; + } + }; + + const _runQuickSearch = async (type, title) => { + if (_loading) return; _loading = true; try { - await _doSearchInner(levelId); + await _doNameSearch(htmlInput.value.trim(), 0, { type, title, ..._currentFilterOpts() }); } catch (err) { } finally { _loading = false; } }; + + const _buildSearchBody = (query, page, opts) => { + const parts = [`type=${opts.type ?? 0}`, `page=${page}`, `secret=Wmfd2893gb7`]; + if (query) parts.push(`str=${encodeURIComponent(query)}`); + if (opts.diff && opts.diff.length) parts.push(`diff=${opts.diff.join(",")}`); + if (opts.demonFilter) parts.push(`demonFilter=${opts.demonFilter}`); + if (opts.len && opts.len.length) parts.push(`len=${opts.len.join(",")}`); + if (opts.star) parts.push(`star=1`); + return parts.join("&"); + }; + + const _doNameSearch = async (query, page, opts = {}) => { + const PROXY_BASE = (window._gdProxyUrl || "").replace(/\/$/, ""); + if (!PROXY_BASE) return; + _showStatus("Searching..."); + let raw; + try { + const res = await fetch(`${PROXY_BASE}/getGJLevels21.php`, { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: _buildSearchBody(query, page, opts) + }); + if (!res.ok) throw new Error(`Proxy returned ${res.status}`); + raw = await res.text(); + } catch (err) { + _showStatus("Search failed", "#ff6666"); + return; + } + if (!raw || raw === "-1" || !raw.includes(":")) { + _showStatus("No levels found", "#ff6666"); + return; + } + + const segments = raw.split("#"); + const authors = {}; + (segments[1] || "").split("|").forEach(c => { + const p = c.split(":"); + if (p.length >= 2) authors[p[0]] = p[1]; + }); + const songs = {}; + (segments[2] || "").split("~:~").forEach(s => { + const parts = s.split("~|~"); + const m = {}; + for (let i = 0; i + 1 < parts.length; i += 2) m[parts[i].trim()] = parts[i + 1]; + if (m["1"]) songs[m["1"].trim()] = (m["2"] || "").trim(); + }); + + const levels = (segments[0] || "").split("|").filter(Boolean).map(str => { + const parts = str.split(":"); + const m = {}; + for (let i = 0; i + 1 < parts.length; i += 2) m[parts[i]] = parts[i + 1]; + const customSongID = (m["35"] || "").trim(); + return { + id: m["1"] || "", + name: (m["2"] || "Unnamed").trim(), + author: authors[m["6"]] || "-", + diffNum: parseInt(m["9"]) || 0, + downloads: parseInt(m["10"]) || 0, + likes: parseInt(m["14"]) || 0, + length: parseInt(m["15"]) || 0, + demon: m["17"] == "1", + stars: parseInt(m["18"]) || 0, + featured: (parseInt(m["19"]) || 0) > 0, + auto: m["25"] == "1", + epic: (parseInt(m["42"]) || 0) > 0, + demonDiff: parseInt(m["43"]) || 0, + song: customSongID && customSongID !== "0" ? (songs[customSongID] || "") : "" + }; + }).filter(l => l.id); + + if (!levels.length) { + _showStatus("No levels found", "#ff6666"); + return; + } + if ((opts.type ?? 0) === 0) levels.sort((a, b) => b.likes - a.likes); + _hideStatus(); + _showSearchResults(opts.title || query, page, levels, { query, opts }); + }; + + let _resultsObjects = []; + let _resultsOpen = false; + let _resultsWheel = null; + const _closeResults = () => { + if (!_resultsOpen) return; + _resultsOpen = false; + this._searchResultsOpen = false; + if (_resultsWheel) { this.input.off('wheel', _resultsWheel); _resultsWheel = null; } + for (const obj of _resultsObjects) { if (obj && obj.destroy) obj.destroy(); } + _resultsObjects = []; + }; + const _diffFaceFrame = (lvl) => { + if (lvl.auto) return "diffIcon_auto_btn_001.png"; + if (lvl.demon) return ({ 3: "diffIcon_07_btn_001.png", 4: "diffIcon_08_btn_001.png", 5: "diffIcon_09_btn_001.png", 6: "diffIcon_10_btn_001.png" })[lvl.demonDiff] || "diffIcon_06_btn_001.png"; + return ({ 10: "diffIcon_01_btn_001.png", 20: "diffIcon_02_btn_001.png", 30: "diffIcon_03_btn_001.png", 40: "diffIcon_04_btn_001.png", 50: "diffIcon_05_btn_001.png" })[lvl.diffNum] || "diffIcon_00_btn_001.png"; + }; + const _fmtCount = (n) => n >= 1000000 ? (n / 1000000).toFixed(1) + "M" : n >= 10000 ? (n / 1000).toFixed(1) + "K" : String(n); + const _showSearchResults = (title, page, levels, searchCtx = { query: title, opts: {} }) => { + _closeResults(); + _blurInput(); + _resultsOpen = true; + // Own UHD group, distinct from the search menu underneath: overlays render + // above the canvas, so sharing 'search' would leave the menu's UHD buttons + // floating over this list (and these icons over the menu after closing). + // update() nulls _uhdContext each frame and this runs from an async fetch + // callback, so it must be (re-)tagged here. + this._uhdContext = 'searchResults'; + this._searchResultsOpen = true; + const centerX = sw / 2; + + const bg = this.add.graphics().setScrollFactor(0).setDepth(160); + const gradSteps = 80; + for (let gi = 0; gi < gradSteps; gi++) { + const t = gi / (gradSteps - 1); + const r1 = Math.round(0x01 * t); + const g1 = Math.round(0x65 + (0x2c - 0x65) * t); + const b1 = Math.round(0xff + (0x71 - 0xff) * t); + bg.fillStyle((r1 << 16) | (g1 << 8) | b1, 1); + bg.fillRect(0, Math.floor(gi * sh / gradSteps), sw, Math.ceil(sh / gradSteps) + 1); + } + const blocker2 = this.add.zone(centerX, sh / 2, sw, sh).setScrollFactor(0).setDepth(161).setInteractive(); + const container = this.add.container(0, 0).setScrollFactor(0).setDepth(162); + _resultsObjects.push(bg, blocker2, container); + + const tableW = 712; + const tableH = 460; + const tableX = (sw - tableW) / 2; + const tableY = 85; + const lengthNames = ["Tiny", "Short", "Medium", "Long", "XL", "Plat."]; + + const listContainer = this.add.container(0, 0); + const maskShape = this.add.graphics().fillStyle(0xffffff).fillRect(tableX, tableY, tableW, tableH).setVisible(false); + listContainer.setMask(maskShape.createGeometryMask()); + _resultsObjects.push(maskShape); + container.add(this.add.graphics().fillStyle(0xc2723e, 1).fillRect(tableX, tableY, tableW, tableH)); + container.add(listContainer); + + const spacing = 100; + const rowUhdImgs = []; + levels.forEach((lvl, rowIndex) => { + const slotY = (rowIndex * spacing) + (spacing / 2); + const stripeColor = rowIndex % 2 !== 0 ? 0xc2723e : 0xa1582c; + + const bgStripe = this.add.rectangle(centerX, slotY, tableW - 10, spacing, stripeColor, 1); + const separator = this.add.rectangle(centerX, slotY + (spacing / 2), tableW - 10, 1, 0x502c16, 1); + const diffFrame = _diffFaceFrame(lvl); + const diffFace = this.add.image(tableX + 50, slotY - (lvl.stars > 0 ? 12 : 0), "GJ_GameSheet03", diffFrame).setScale(0.85); + // frames stored rotated in the atlas need the same compensation as GJ_playBtn2 elsewhere + if (diffFrame === "diffIcon_06_btn_001.png" || diffFrame === "diffIcon_09_btn_001.png") diffFace.setFlipY(true).setAngle(90); + listContainer.add([bgStripe, separator, diffFace]); + rowUhdImgs.push(diffFace); + if (lvl.stars > 0) { + const starTxt = this.add.bitmapText(tableX + 44, slotY + 30, "bigFont", String(lvl.stars), 20).setOrigin(1, 0.5); + const starIcon = this.add.image(tableX + 55, slotY + 30, "GJ_GameSheet03", "GJ_starsIcon_001.png").setScale(0.6); + listContainer.add([starTxt, starIcon]); + rowUhdImgs.push(starIcon); + } + + const nameTxt = this.add.bitmapText(tableX + 105, slotY - 26, "bigFont", lvl.name, 30).setOrigin(0, 0.5); + const authorTxt = this.add.bitmapText(tableX + 105, slotY + 2, "goldFont", "By " + lvl.author, 20).setOrigin(0, 0.5); + const statsY = slotY + 30; + const dlIcon = this.add.image(tableX + 115, statsY, "GJ_GameSheet03", "GJ_downloadsIcon_001.png").setScale(0.55); + const dlTxt = this.add.bitmapText(dlIcon.x + 16, statsY, "bigFont", _fmtCount(lvl.downloads), 18).setOrigin(0, 0.5); + const likeIcon = this.add.image(tableX + 235, statsY, "GJ_GameSheet03", "GJ_likesIcon_001.png").setScale(0.55); + const likeTxt = this.add.bitmapText(likeIcon.x + 16, statsY, "bigFont", _fmtCount(lvl.likes), 18).setOrigin(0, 0.5); + const lenIcon = this.add.image(tableX + 355, statsY, "GJ_GameSheet03", "GJ_timeIcon_001.png").setScale(0.55); + const lenTxt = this.add.bitmapText(lenIcon.x + 16, statsY, "bigFont", lengthNames[lvl.length] || "?", 18).setOrigin(0, 0.5); + listContainer.add([nameTxt, authorTxt, dlIcon, dlTxt, likeIcon, likeTxt, lenIcon, lenTxt]); + rowUhdImgs.push(dlIcon, likeIcon, lenIcon); + + const viewBtn = this.add.nineslice(tableX + tableW - 80, slotY, "GJ_button01", null, 120, 60, 24, 24, 24, 24).setScale(0.75).setInteractive(); + const viewTxt = this.add.bitmapText(viewBtn.x - 2, viewBtn.y - 1, "bigFont", "View", 28).setOrigin(0.5).setScale(0.8); + listContainer.add([viewBtn, viewTxt]); + this._makeBouncyButton(viewBtn, 0.75, async () => { + if (_loading) return; + _loading = true; + const loadTxt = this.add.bitmapText(centerX, sh / 2, "bigFont", "Loading level...", 30) + .setScrollFactor(0).setDepth(170).setOrigin(0.5); + _resultsObjects.push(loadTxt); + try { + await _doSearchInner(lvl.id); + } catch (err) { + _showStatus("Level failed to load", "#ff6666"); + } finally { + _loading = false; + loadTxt.destroy(); + } + }); + }); + + const sideFrame = this.textures.getFrame("GJ_GameSheet03", "GJ_table_side_001.png"); + const sideScaleY = tableH / sideFrame.height; + container.add(this.add.image(tableX - 40, tableY, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, sideScaleY)); + container.add(this.add.image(tableX + tableW + 40, tableY, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, sideScaleY)); + container.add(this.add.image(centerX, tableY - 10, "GJ_GameSheet03", "GJ_table_top_001.png")); + container.add(this.add.image(centerX, tableY + tableH + 20, "GJ_GameSheet03", "GJ_table_bottom_001.png")); + container.add(this.add.bitmapText(centerX, tableY - 15, "bigFont", title.slice(0, 20), 42).setOrigin(0.5).setScale(1.1)); + container.add(this.add.bitmapText(sw - 20, 20, "bigFont", "Page " + (page + 1), 22).setOrigin(1, 0.5)); + + let startY = tableY; + const listHeight = levels.length * spacing; + const minY = tableY - Math.max(0, listHeight - tableH) - 10; + const maxY = tableY + 22; + listContainer.y = maxY; + let scrollTargetY = maxY; + // The DOM UHD overlays aren't clipped by the table's geometry mask, so hide + // an icon's overlay while it straddles the table edge (the masked canvas + // sprite shows through instead) by re-grouping its entry out of 'search'. + const _syncRowOverlays = () => { + if (!this._uhdMap) return; + for (const img of rowUhdImgs) { + const e = this._uhdMap.get(img); + if (!e) continue; + const half = (img.displayHeight || img.height) / 2; + const wy = listContainer.y + img.y; + e.group = (wy - half >= tableY && wy + half <= tableY + tableH) ? 'searchResults' : '_maskedOut'; + } + }; + _syncRowOverlays(); + _resultsWheel = (pointer, gameObjects, deltaX, deltaY) => { + if (!_resultsOpen) return; + scrollTargetY = Phaser.Math.Clamp(scrollTargetY - deltaY, minY, maxY); + this.tweens.add({ targets: listContainer, y: scrollTargetY, duration: 250, ease: 'Power2', overwrite: true, onUpdate: _syncRowOverlays }); + }; + this.input.on('wheel', _resultsWheel); + blocker2.on('pointerdown', (pointer) => { startY = pointer.y - listContainer.y; }); + blocker2.on('pointermove', (pointer) => { + if (pointer.isDown) { + listContainer.y = Phaser.Math.Clamp(pointer.y - startY, minY, maxY); + scrollTargetY = listContainer.y; + _syncRowOverlays(); + } + }); + + const resultsBack = this.add.image(50, 48, "GJ_GameSheet03", "GJ_arrow_03_001.png") + .setScrollFactor(0).setDepth(164).setFlipX(true).setFlipY(true).setRotation(Math.PI).setInteractive(); + this._makeBouncyButton(resultsBack, 1, () => _closeResults()); + _resultsObjects.push(resultsBack); + + const goPage = async (p) => { + if (_loading) return; + _loading = true; + try { await _doNameSearch(searchCtx.query, p, searchCtx.opts); } catch (err) {} finally { _loading = false; } + }; + if (page > 0) { + const prevArrow = this.add.image(45, sh / 2, "GJ_GameSheet03", "GJ_arrow_02_001.png") + .setScrollFactor(0).setDepth(164).setInteractive(); + this._makeBouncyButton(prevArrow, 1, () => goPage(page - 1)); + _resultsObjects.push(prevArrow); + } + if (levels.length >= 10) { + const nextArrow = this.add.image(sw - 45, sh / 2, "GJ_GameSheet03", "GJ_arrow_02_001.png") + .setScrollFactor(0).setDepth(164).setFlipX(true).setInteractive(); + this._makeBouncyButton(nextArrow, 1, () => goPage(page + 1)); + _resultsObjects.push(nextArrow); + } + }; + this._searchOverlayObjects.push({ destroy: _closeResults }); + this._closeSearchResults = _closeResults; // for the ESC handler's layer-by-layer back-out const _doSearchInner = async (levelId) => { const apiBase = (typeof window.getGdApiUrl === "function" ? window.getGdApiUrl("/downloadGJLevel22.php") : null); if (!apiBase) return; @@ -1559,8 +2468,14 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" for (let i = 0; i + 1 < lvlParts.length; i += 2) { lvlMap[lvlParts[i]] = lvlParts[i + 1]; } + let _levelAuthor = "Unknown"; + if (responseSegments[3]) { + const userParts = responseSegments[3].split(":"); + if (userParts.length >= 2) _levelAuthor = userParts[1]; + } const levelData = { + author: _levelAuthor, // Core Level Info id: lvlMap["1"] || levelId, title: (lvlMap["2"] || "Online Level").trim(), @@ -1610,8 +2525,26 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" window.currentlevel[0] = songKey; window._onlineSongOffset = levelData.offset; - if (levelData.isCustomSong) { - window._onlineSongBuffer = null; + const LOCAL_SONGS = { + "467339": { file: "Bloodbath.mp3", artist: "Dimrain47" } + }; + + if (levelData.isCustomSong && LOCAL_SONGS[levelData.customSongID]) { + const localSong = LOCAL_SONGS[levelData.customSongID]; + const localKey = `local_song_${levelData.customSongID}`; + window.currentlevel[0] = localKey; + window._onlineSongBuffer = null; + window._onlineSongKey = null; + if (!this.cache.audio.exists(localKey)) { + await new Promise((resolve) => { + this.load.audio(localKey, "assets/music/" + localSong.file); + this.load.once("complete", resolve); + this.load.start(); + }); + } + window.currentlevel[3] = [window.currentlevel[3][0], localSong.artist]; + } else if (levelData.isCustomSong) { + window._onlineSongBuffer = null; window._onlineSongKey = null; const songInfoUrl = (typeof window.getGdApiUrl === "function" ? window.getGdApiUrl("/getGJSongInfo.php") : null); const ngRes = await window.fetchGdApi("/getGJSongInfo.php", { @@ -1644,126 +2577,69 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" extraArtists: ngMap["15"] || "" }; - const isNCS = levelData.isLibrarySong || songData.nongType === 1; let songUrl = songData.rawUrl ? decodeURIComponent(songData.rawUrl) : null; - - if (!songUrl && isNCS) { - const songId = levelData.customSongID; - const path = `/music/${songId}.ogg`; - - function generateCdnAuth(path) { - const SALT = "8501f9c2-75ba-4230-8188-51037c4da102"; - const expires = Math.floor(Date.now() / 1000) + 3600; - const inputString = `${SALT}${path}${expires}`; - - const md5Cycle = (x, k) => { - let a = x[0], b = x[1], c = x[2], d = x[3]; - const f = (p, q, r, s, x, sft, t) => { - let val = p + (q & r | ~q & s) + x + t; - return ((val << sft) | (val >>> (32 - sft))) + q; - }; - const g = (p, q, r, s, x, sft, t) => { - let val = p + (q & s | r & ~s) + x + t; - return ((val << sft) | (val >>> (32 - sft))) + q; - }; - const h = (p, q, r, s, x, sft, t) => { - let val = p + (q ^ r ^ s) + x + t; - return ((val << sft) | (val >>> (32 - sft))) + q; - }; - const i = (p, q, r, s, x, sft, t) => { - let val = p + (r ^ (q | ~s)) + x + t; - return ((val << sft) | (val >>> (32 - sft))) + q; - }; - - a = f(a, b, c, d, k[0], 7, -680876936); d = f(d, a, b, c, k[1], 12, -389564586); - c = f(c, d, a, b, k[2], 17, 606105819); b = f(b, c, d, a, k[3], 22, -1044525330); - a = f(a, b, c, d, k[4], 7, -176418897); d = f(d, a, b, c, k[5], 12, 1200080426); - c = f(c, d, a, b, k[6], 17, -1473231341); b = f(b, c, d, a, k[7], 22, -45705983); - a = f(a, b, c, d, k[8], 7, 1770035416); d = f(d, a, b, c, k[9], 12, -1958414417); - c = f(c, d, a, b, k[10], 17, -42063); b = f(b, c, d, a, k[11], 22, -1990404162); - a = f(a, b, c, d, k[12], 7, 1804603682); d = f(d, a, b, c, k[13], 12, -40341101); - c = f(c, d, a, b, k[14], 17, -1502002290); b = f(b, c, d, a, k[15], 22, 1236535329); - - a = g(a, b, c, d, k[1], 5, -165796510); d = g(d, a, b, c, k[6], 9, -1069501632); - c = g(c, d, a, b, k[11], 14, 643717713); b = g(b, c, d, a, k[0], 20, -373897302); - a = g(a, b, c, d, k[5], 5, -701558691); d = g(d, a, b, c, k[10], 9, 38016083); - c = g(c, d, a, b, k[15], 14, -660478335); b = g(b, c, d, a, k[4], 20, -405537848); - a = g(a, b, c, d, k[9], 5, 568446438); d = g(d, a, b, c, k[14], 9, -1019803690); - c = g(c, d, a, b, k[3], 14, -187363961); b = g(b, c, d, a, k[8], 20, 1163531501); - a = g(a, b, c, d, k[13], 5, -1444681467); d = g(d, a, b, c, k[2], 9, -51403784); - c = g(c, d, a, b, k[7], 14, 1735328473); b = g(b, c, d, a, k[12], 20, -1926607734); - - a = h(a, b, c, d, k[5], 4, -378558); d = h(d, a, b, c, k[8], 11, -2022574463); - c = h(c, d, a, b, k[11], 16, 1839030562); b = h(b, c, d, a, k[14], 23, -35309556); - a = h(a, b, c, d, k[1], 4, -1530992060); d = h(d, a, b, c, k[4], 11, 1272893353); - c = h(c, d, a, b, k[7], 16, -155497632); b = h(b, c, d, a, k[10], 23, -1094730640); - a = h(a, b, c, d, k[13], 4, 681279174); d = h(d, a, b, c, k[0], 11, -358537222); - c = h(c, d, a, b, k[3], 16, -722521979); b = h(b, c, d, a, k[6], 23, 76029189); - a = h(a, b, c, d, k[9], 4, -640364487); d = h(d, a, b, c, k[12], 11, -421815835); - c = h(c, d, a, b, k[15], 16, 530742520); b = h(b, c, d, a, k[2], 23, -995338651); - - a = i(a, b, c, d, k[0], 6, -198630844); d = i(d, a, b, c, k[7], 10, 1126891415); - c = i(c, d, a, b, k[14], 15, -1416354905); b = i(b, c, d, a, k[5], 21, -57434055); - a = i(a, b, c, d, k[12], 6, 1700485571); d = i(d, a, b, c, k[3], 10, -1894986606); - c = i(c, d, a, b, k[10], 15, -1051523); b = i(b, c, d, a, k[1], 21, -2054922799); - a = i(a, b, c, d, k[8], 6, 1873313359); d = i(d, a, b, c, k[15], 10, -30611744); - c = i(c, d, a, b, k[6], 15, -1560198380); b = i(b, c, d, a, k[13], 21, 1309151649); - a = i(a, b, c, d, k[4], 6, -145523070); d = i(d, a, b, c, k[11], 10, -1120210379); - c = i(c, d, a, b, k[2], 15, 718787259); b = i(b, c, d, a, k[9], 21, -343485551); - - x[0] = (x[0] + a) | 0; x[1] = (x[1] + b) | 0; - x[2] = (x[2] + c) | 0; x[3] = (x[3] + d) | 0; - }; - - const md5Raw = (str) => { - let n = str.length, state = [1732584193, -271733879, -1732584194, 271733878], i; - let words = []; - for (i = 0; i <= n; i++) words[i >> 2] |= (str.charCodeAt(i) || 128) << ((i % 4) << 3); - words[(((n + 8) >> 6) << 4) + 14] = n * 8; - for (i = 0; i < words.length; i += 16) md5Cycle(state, words.slice(i, i + 16)); - return state.map(val => [val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF, (val >> 24) & 0xFF]).flat(); - }; - - const hashBytes = md5Raw(inputString); - const binaryStr = String.fromCharCode(...hashBytes); - const token = btoa(binaryStr) - .replace(/\+/g, '-') - .replace(/\//g, '_') - .replace(/=+$/, ''); - - return { token, expires }; - } - const auth = generateCdnAuth(path); + window._onlineSongKey = songKey; + window._onlineSongTitle = songData.title; + window._onlineSongArtist = songData.artistName; - songUrl = `https://geometrydashfiles.b-cdn.net${path}?token=${auth.token}&expires=${auth.expires}`; + if (songUrl && songUrl.includes("b-cdn.net")) { + try { + const parsed = new URL(songUrl); + const path = parsed.pathname; + const SALT = "8501f9c2-75ba-4230-8188-51037c4da102"; + const expires = Math.floor(Date.now() / 1000) + 3600; + const inp = `${SALT}${path}${expires}`; + const md5c = (x, k) => { + let a=x[0],b=x[1],c=x[2],d=x[3]; + const f=(p,q,r,s,x,t,u)=>{let v=p+(q&r|~q&s)+x+u;return((v<>>(32-t)))+q}; + const g=(p,q,r,s,x,t,u)=>{let v=p+(q&s|r&~s)+x+u;return((v<>>(32-t)))+q}; + const h=(p,q,r,s,x,t,u)=>{let v=p+(q^r^s)+x+u;return((v<>>(32-t)))+q}; + const i=(p,q,r,s,x,t,u)=>{let v=p+(r^(q|~s))+x+u;return((v<>>(32-t)))+q}; + a=f(a,b,c,d,k[0],7,-680876936);d=f(d,a,b,c,k[1],12,-389564586);c=f(c,d,a,b,k[2],17,606105819);b=f(b,c,d,a,k[3],22,-1044525330); + a=f(a,b,c,d,k[4],7,-176418897);d=f(d,a,b,c,k[5],12,1200080426);c=f(c,d,a,b,k[6],17,-1473231341);b=f(b,c,d,a,k[7],22,-45705983); + a=f(a,b,c,d,k[8],7,1770035416);d=f(d,a,b,c,k[9],12,-1958414417);c=f(c,d,a,b,k[10],17,-42063);b=f(b,c,d,a,k[11],22,-1990404162); + a=f(a,b,c,d,k[12],7,1804603682);d=f(d,a,b,c,k[13],12,-40341101);c=f(c,d,a,b,k[14],17,-1502002290);b=f(b,c,d,a,k[15],22,1236535329); + a=g(a,b,c,d,k[1],5,-165796510);d=g(d,a,b,c,k[6],9,-1069501632);c=g(c,d,a,b,k[11],14,643717713);b=g(b,c,d,a,k[0],20,-373897302); + a=g(a,b,c,d,k[5],5,-701558691);d=g(d,a,b,c,k[10],9,38016083);c=g(c,d,a,b,k[15],14,-660478335);b=g(b,c,d,a,k[4],20,-405537848); + a=g(a,b,c,d,k[9],5,568446438);d=g(d,a,b,c,k[14],9,-1019803690);c=g(c,d,a,b,k[3],14,-187363961);b=g(b,c,d,a,k[8],20,1163531501); + a=g(a,b,c,d,k[13],5,-1444681467);d=g(d,a,b,c,k[2],9,-51403784);c=g(c,d,a,b,k[7],14,1735328473);b=g(b,c,d,a,k[12],20,-1926607734); + a=h(a,b,c,d,k[5],4,-378558);d=h(d,a,b,c,k[8],11,-2022574463);c=h(c,d,a,b,k[11],16,1839030562);b=h(b,c,d,a,k[14],23,-35309556); + a=h(a,b,c,d,k[1],4,-1530992060);d=h(d,a,b,c,k[4],11,1272893353);c=h(c,d,a,b,k[7],16,-155497632);b=h(b,c,d,a,k[10],23,-1094730640); + a=h(a,b,c,d,k[13],4,681279174);d=h(d,a,b,c,k[0],11,-358537222);c=h(c,d,a,b,k[3],16,-722521979);b=h(b,c,d,a,k[6],23,76029189); + a=h(a,b,c,d,k[9],4,-640364487);d=h(d,a,b,c,k[12],11,-421815835);c=h(c,d,a,b,k[15],16,530742520);b=h(b,c,d,a,k[2],23,-995338651); + a=i(a,b,c,d,k[0],6,-198630844);d=i(d,a,b,c,k[7],10,1126891415);c=i(c,d,a,b,k[14],15,-1416354905);b=i(b,c,d,a,k[5],21,-57434055); + a=i(a,b,c,d,k[12],6,1700485571);d=i(d,a,b,c,k[3],10,-1894986606);c=i(c,d,a,b,k[10],15,-1051523);b=i(b,c,d,a,k[1],21,-2054922799); + a=i(a,b,c,d,k[8],6,1873313359);d=i(d,a,b,c,k[15],10,-30611744);c=i(c,d,a,b,k[6],15,-1560198380);b=i(b,c,d,a,k[13],21,1309151649); + a=i(a,b,c,d,k[4],6,-145523070);d=i(d,a,b,c,k[11],10,-1120210379);c=i(c,d,a,b,k[2],15,718787259);b=i(b,c,d,a,k[9],21,-343485551); + x[0]=(x[0]+a)|0;x[1]=(x[1]+b)|0;x[2]=(x[2]+c)|0;x[3]=(x[3]+d)|0; + }; + const md5r = (s) => { + let n=s.length,st=[1732584193,-271733879,-1732584194,271733878],i,w=[]; + for(i=0;i<=n;i++)w[i>>2]|=(s.charCodeAt(i)||128)<<((i%4)<<3); + w[(((n+8)>>6)<<4)+14]=n*8; + for(i=0;i[v&0xFF,(v>>8)&0xFF,(v>>16)&0xFF,(v>>24)&0xFF]).flat(); + }; + const token = btoa(String.fromCharCode(...md5r(inp))).replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/,''); + songUrl = `${parsed.origin}${path}?token=${token}&expires=${expires}`; + } catch(e) {} } - - console.groupCollapsed("song data"); - console.table({ ...songData}); - console.log(songUrl); - console.groupEnd(); if (songUrl) { const audioCtx = this.game.sound.context; if (audioCtx.state === "suspended") await audioCtx.resume(); - window._onlineSongKey = songKey; - window._onlineSongTitle = songData.title; - window._onlineSongArtist = songData.artistName; - try { - const audioRes = await window.fetchGdAudio(songUrl); - - if (!audioRes.ok) throw new Error(`audio proxy returned ${audioRes.status}`); - + const audioRes = songUrl.includes("b-cdn.net") + ? await fetch((window.ApiWrapper ? window.ApiWrapper.getProxy() : "https://proxy.corsfix.com/?") + songUrl) + : await window.fetchGdAudio(songUrl); + if (!audioRes.ok) throw new Error(`audio fetch returned ${audioRes.status}`); const arrayBuf = await audioRes.arrayBuffer(); const decoded = await audioCtx.decodeAudioData(arrayBuf); - window._onlineSongBuffer = decoded; } catch (error) { - console.error("Failed to load audio via proxy:", error.message); - + console.error("Failed to load audio:", error.message); window._onlineSongBuffer = null; } } else { @@ -1779,14 +2655,40 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" window._onlineLevelString = levelData.string; window._onlineLevelName = levelData.title; window._onlineLevelId = "online_" + levelData.id; - this.game.registry.set("autoStartGame", true); + + try { + const savedLevels = JSON.parse(localStorage.getItem("saved_levels") || "[]"); + const filtered = savedLevels.filter(l => l.savedId !== "online_" + levelData.id); + filtered.unshift({ + savedId: "online_" + levelData.id, + createdId: "online_" + levelData.id, + levelName: levelData.title, + author: levelData.author || "Unknown", + levelString: levelData.string, + levelLength: levelData.length, + songId: levelData.isCustomSong ? parseInt(levelData.customSongID) : -(parseInt(levelData.officialSong) + 1), + song: window._onlineSongTitle || "Unknown", + description: levelData.description || "", + version: levelData.version || 1, + status: "Online", + stars: levelData.stars || 0, + downloads: levelData.downloads || 0, + likes: levelData.likes || 0 + }); + if (filtered.length > 50) filtered.length = 50; + localStorage.setItem("saved_levels", JSON.stringify(filtered)); + } catch (e) {} + window.currentlevel = [ songKey, window._onlineLevelName, window._onlineLevelId, [window._onlineSongArtist || "Unknown"] ]; - this.time.delayedCall(600, () => { + + const _playLevel = () => { + this.game.registry.set("autoStartGame", true); + this._closeLevelInfoPage(); htmlInput.remove(); window.removeEventListener("resize", _repositionInput); this._closeSearchMenu(true); @@ -1796,9 +2698,16 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" flash.fillRect(0, 0, sw, sh); this.tweens.add({ targets: flash, alpha: 1, duration: 250, ease: "Linear", - onComplete: () => this.scene.restart() + onComplete: () => { + if (window._activeNongId && window._onlineSongBuffer) { + window._onlineSongKey = window.currentlevel[0]; + } + this.scene.restart(); + } }); - }); + }; + + this._showLevelInfoPage(levelData, songKey, _playLevel); }; this._searchOverlayObjects.push(overlay, blocker, backBtn); if (window.levelID && !window.alreadydownloaded) { // if there's an ID parameter, load it directly @@ -1837,6 +2746,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" } this._searchOverlayObjects = []; this._searchOverlay = null; + this._closeSearchResults = null; }; if (silent) { destroy(); if (onComplete) onComplete(); return; } const sw = screenWidth, sh = screenHeight; @@ -1933,129 +2843,36 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" "bird_41_001.png", "bird_42_001.png", "bird_43_001.png", "bird_44_001.png", "bird_45_001.png", "bird_46_001.png", "bird_47_001.png", "bird_48_001.png", "bird_49_001.png", "bird_50_001.png", "bird_51_001.png", + ], + robot: [ + "robot_01_01_001.png", "robot_02_01_001.png", "robot_03_01_001.png", "robot_04_01_001.png", "robot_05_01_001.png", + "robot_06_01_001.png", "robot_07_01_001.png", "robot_08_01_001.png", "robot_09_01_001.png", "robot_10_01_001.png", + "robot_11_01_001.png", "robot_12_01_001.png", "robot_13_01_001.png", "robot_14_01_001.png", "robot_15_01_001.png", + "robot_16_01_001.png", "robot_17_01_001.png", "robot_18_01_001.png", "robot_19_01_001.png", "robot_20_01_001.png", + "robot_21_01_001.png", "robot_22_01_001.png", "robot_23_01_001.png", "robot_24_01_001.png", "robot_25_01_001.png", + "robot_26_01_001.png", +], + spider: [ + "spider_01_01_001.png", "spider_02_01_001.png", "spider_03_01_001.png", "spider_04_01_001.png", "spider_05_01_001.png", + "spider_06_01_001.png", "spider_07_01_001.png", "spider_08_01_001.png", "spider_09_01_001.png", "spider_10_01_001.png", + "spider_11_01_001.png", "spider_12_01_001.png", "spider_13_01_001.png", "spider_14_01_001.png", "spider_15_01_001.png", + "spider_16_01_001.png", "spider_17_01_001.png", +], + swing: [ + "swing_01_001.png", ], }; - const _selectorParseAnimPair = (value, fallbackX = 0, fallbackY = 0) => { - const match = String(value ?? "").match(/\{\s*([-+]?\d*\.?\d+)\s*,\s*([-+]?\d*\.?\d+)\s*\}/); - if (!match) return { x: fallbackX, y: fallbackY }; - const x = parseFloat(match[1]); - const y = parseFloat(match[2]); - return { - x: Number.isFinite(x) ? x : fallbackX, - y: Number.isFinite(y) ? y : fallbackY - }; - }; - - const _selectorVariantFrameName = (frameName, variant) => { - if (!frameName) return frameName; - if (variant === "glow") return frameName.replace(/_001\.png$/, "_glow_001.png"); - if (variant === "overlay") return frameName.replace(/_001\.png$/, "_2_001.png"); - if (variant === "extra") return frameName.replace(/_001\.png$/, "_extra_001.png"); - return frameName; - }; - - const _segmentedIconConfig = { - spider: { - prop: "currentSpider", - prefix: "spider", - descKey: "Spider_AnimDesc", - fallbackBase: "spider_01", - idlePatterns: [/^Spider_idle01_001\.png$/, /^Spider_idle01_\d+\.png$/, /^Spider_idle02_\d+\.png$/, /^Spider_idle_\d+\.png$/, /^Spider_walk_\d+\.png$/], - defaultEntries: [ - { tag: "0", texture: "spider_01_02_001.png" }, - { tag: "1", texture: "spider_01_02_001.png" }, - { tag: "2", texture: "spider_01_04_001.png" }, - { tag: "3", texture: "spider_01_01_001.png" }, - { tag: "4", texture: "spider_01_03_001.png" }, - { tag: "5", texture: "spider_01_02_001.png" } - ] - }, - robot: { - prop: "currentRobot", - prefix: "robot", - descKey: "Robot_AnimDesc", - fallbackBase: "robot_01", - idlePatterns: [/^Robot_idle_001\.png$/, /^Robot_idle_\d+\.png$/, /^Robot_idle01_\d+\.png$/, /^Robot_idle02_\d+\.png$/, /^Robot_run_001\.png$/, /^Robot_run_\d+\.png$/], - defaultEntries: [ - { tag: "0", texture: "robot_01_03_001.png" }, - { tag: "1", texture: "robot_01_02_001.png" }, - { tag: "2", texture: "robot_01_04_001.png" }, - { tag: "3", texture: "robot_01_01_001.png" }, - { tag: "4", texture: "robot_01_03_001.png" }, - { tag: "5", texture: "robot_01_02_001.png" }, - { tag: "6", texture: "robot_01_04_001.png" } - ] - } - }; - - const _isSegmentedIconTab = (tab) => !!_segmentedIconConfig[tab]; - - const _getSegmentedAnimDesc = (tab) => { - const cfg = _segmentedIconConfig[tab]; - if (!cfg) return null; - let data = null; - try { data = this.cache?.json?.get?.(cfg.descKey) || null; } catch (e) { data = null; } - if (!data && typeof window !== "undefined") data = window[cfg.descKey] || null; - return data && data.animationContainer ? data : null; - }; - - const _getSegmentedIdleFrame = (tab) => { - const cfg = _segmentedIconConfig[tab]; - const desc = _getSegmentedAnimDesc(tab); - if (!cfg || !desc?.animationContainer) return null; - const keys = Object.keys(desc.animationContainer).sort((a, b) => { - const aa = parseInt((String(a).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; - const bb = parseInt((String(b).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; - return aa - bb; - }); - for (const pattern of cfg.idlePatterns) { - const match = keys.find(key => pattern.test(key)); - if (match) return desc.animationContainer[match]; - } - return desc.animationContainer[keys[0]] || null; - }; - - const _replaceSegmentedBase = (tab, textureName, baseName) => { - const cfg = _segmentedIconConfig[tab]; - if (!cfg) return textureName; - return String(textureName || "").replace(new RegExp("^" + cfg.prefix + "_\\d+"), baseName); - }; - - const _makeSegmentedIconFrames = (tab, max = 120) => { - const cfg = _segmentedIconConfig[tab]; - if (!cfg) return []; - const desc = _getSegmentedAnimDesc(tab); - const entries = desc?.usedTextures - ? Object.values(desc.usedTextures).slice().sort((a, b) => (parseInt(a.tag || "0", 10) || 0) - (parseInt(b.tag || "0", 10) || 0)) - : cfg.defaultEntries; - const frames = []; - for (let i = 1; i <= max; i++) { - const baseName = `${cfg.prefix}_${String(i).padStart(2, "0")}`; - const hasAnyPart = entries.some(entry => { - const frameName = _replaceSegmentedBase(tab, entry.texture, baseName); - return typeof getAtlasFrame === "function" && !!getAtlasFrame(this, frameName); - }); - if (hasAnyPart) frames.push(`${baseName}_001.png`); - } - return frames.length ? frames : [`${cfg.fallbackBase}_001.png`]; - }; - - window.currentSpider = window.currentSpider || localStorage.getItem("iconCurrentSpider") || "spider_01"; - window.currentRobot = window.currentRobot || localStorage.getItem("iconCurrentRobot") || "robot_01"; - _iconFrameSets.spider = _makeSegmentedIconFrames("spider"); - _iconFrameSets.robot = _makeSegmentedIconFrames("robot"); - - const _iconWindowProps = { icon: "currentPlayer", ship: "currentShip", ball: "currentBall", wave: "currentWave", ufo: "currentBird", - robot: "currentRobot", - spider: "currentSpider", + robot: "currentRobot", + spider: "currentSpider", + swing: "currentSwing", }; const _iconAtlas = { @@ -2064,28 +2881,34 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" ball: "GJ_GameSheetIcons", wave: "GJ_GameSheetIcons", ufo: "GJ_GameSheetIcons", - robot: "GJ_GameSheetIcons", - spider: "GJ_GameSheetIcons", + robot: "GJ_GameSheetIcons", + spider: "GJ_GameSheetIcons", + swing: "GJ_GameSheetIcons", }; const _tabBtnFrames = { - icon: { on: "gj_iconBtn_on_001.png", off: "gj_iconBtn_off_001.png" }, - ship: { on: "gj_shipBtn_on_001.png", off: "gj_shipBtn_off_001.png" }, - ball: { on: "gj_ballBtn_on_001.png", off: "gj_ballBtn_off_001.png" }, - wave: { on: "gj_dartBtn_on_001.png", off: "gj_dartBtn_off_001.png" }, - ufo: { on: "gj_birdBtn_on_001.png", off: "gj_birdBtn_off_001.png" }, - robot:{ on: "gj_robotBtn_on_001.png", off: "gj_robotBtn_off_001.png" }, - spider:{ on: "gj_spiderBtn_on_001.png", off: "gj_spiderBtn_off_001.png" }, + icon: { on: "gj_iconBtn_on_001.png", off: "gj_iconBtn_off_001.png" }, + ship: { on: "gj_shipBtn_on_001.png", off: "gj_shipBtn_off_001.png" }, + ball: { on: "gj_ballBtn_on_001.png", off: "gj_ballBtn_off_001.png" }, + wave: { on: "gj_dartBtn_on_001.png", off: "gj_dartBtn_off_001.png" }, + ufo: { on: "gj_birdBtn_on_001.png", off: "gj_birdBtn_off_001.png" }, + robot: { on: "gj_robotBtn_on_001.png", off: "gj_robotBtn_off_001.png" }, + spider: { on: "gj_spiderBtn_on_001.png", off: "gj_spiderBtn_off_001.png" }, + swing: { on: "gj_swingBtn_on_001.png", off: "gj_swingBtn_off_001.png" }, }; - - const _safeTabBtnFrame = (tab, state) => { - const frame = _tabBtnFrames[tab]?.[state] || _tabBtnFrames.icon[state]; - return (typeof getAtlasFrame === "function" && getAtlasFrame(this, frame)) ? frame : _tabBtnFrames.icon[state]; + const convertIconFrameToGameFrame = (frame, tab) => { + if (tab === "robot" || tab === "spider") { + return frame.replace(/_01_001\.png$/, "_001.png"); + } + return frame; + }; + const getCanonicalIconName = (frame, tab) => { + return convertIconFrameToGameFrame(frame, tab).replace("_001.png", ""); }; this._openIconSelector = (startTab = "icon") => { if (this._iconOverlay) return; - + this._uhdContext = 'icon'; const sw = screenWidth; const sh = screenHeight; @@ -2117,6 +2940,15 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._iconOverlayObjects = [overlay, blocker, titleTxt]; + const cornerTL = this.add.image(0, 0, "GJ_GameSheet03", "GJ_sideArt_001.png").setScrollFactor(0).setDepth(100).setOrigin(1, 0).setFlipX(false).setAngle(-90); + this._iconOverlayObjects.push(cornerTL); + + const starText = this.add.bitmapText(sw - 50, 50.5, "bigFont", String(window._totalStars || 0), 28) + .setScrollFactor(0).setDepth(105).setOrigin(1, 0.5); + const starIcon = this.add.image(starText.x + starText.width + 9, 50.5, "GJ_GameSheet03", "GJ_starsIcon_001.png") + .setScrollFactor(0).setDepth(105).setScale(0.65); + this._iconOverlayObjects.push(starIcon, starText); + const backBtn = this.add.image(50, 48, "GJ_GameSheet03", "GJ_arrow_03_001.png") .setScrollFactor(0).setDepth(104).setFlipY(true) .setFlipX(true) @@ -2172,10 +3004,6 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" gridBg.fillRoundedRect(containerX, containerY, containerWidth, containerHeight, 10); this._iconOverlayObjects.push(gridBg); - const cornerTL = this.add.image(0, 0, "GJ_GameSheet03", "GJ_sideArt_001.png").setScrollFactor(0).setDepth(100).setOrigin(1, 0).setFlipX(false).setAngle(-90) - const cornerTR = this.add.image(sw, 0, "GJ_GameSheet03", "GJ_sideArt_001.png").setScrollFactor(0).setDepth(103).setOrigin(0, 0).setFlipY(false).setFlipX(true).setAngle(90); - this._iconOverlayObjects.push(cornerTL, cornerTR); - const navDotSpacing = 35; const navDotY = containerY + containerHeight + 30; const navDot1 = this.add.image(sw / 2 - navDotSpacing / 2, navDotY, "GJ_GameSheet03", "gj_navDotBtn_on_001.png").setScrollFactor(0).setDepth(104).setScale(0.75); @@ -2189,16 +3017,25 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" const navDot9 = this.add.image(sw / 2 + navDotSpacing / 2, navDotY, "GJ_GameSheet03", "gj_navDotBtn_off_001.png").setScrollFactor(0).setDepth(104).setScale(0.75).setVisible(false); this._iconOverlayObjects.push(navDot1, navDot2, navDot3, navDot4, navDot5, navDot6, navDot7, navDot8, navDot9); const _updateNavDots = (page, tab) => { - const maxPages = Math.max(1, _getMaxPages(tab)); - const dots = [navDot1, navDot2, navDot3, navDot4, navDot5, navDot6, navDot7, navDot8, navDot9]; - dots.forEach(dot => dot.setVisible(false)); - const totalDotsToShow = Math.min(maxPages, dots.length); - const totalWidth = (totalDotsToShow - 1) * navDotSpacing; - const dotStartX = sw / 2 - totalWidth / 2; - for (let i = 0; i < totalDotsToShow; i++) { - dots[i].setPosition(dotStartX + i * navDotSpacing, navDotY).setVisible(true); - dots[i].setTexture("GJ_GameSheet03", page === i ? "gj_navDotBtn_on_001.png" : "gj_navDotBtn_off_001.png"); - } + const isShip = (tab || startTab) === "ship"; + const isIcon = (tab || startTab) === "icon"; + const maxPages = _getMaxPages(tab); + [navDot1, navDot2, navDot3, navDot4, navDot5, navDot6, navDot7, navDot8, navDot9].forEach(dot => dot.setVisible(false)); + if (isShip || isIcon) { + const dots = [navDot1, navDot2, navDot3, navDot4, navDot5, navDot6, navDot7, navDot8, navDot9]; + const totalDotsToShow = Math.min(maxPages, 9); + const totalWidth = (totalDotsToShow - 1) * navDotSpacing; + const startX = sw / 2 - totalWidth / 2; + for (let i = 0; i < totalDotsToShow; i++) { + dots[i].setPosition(startX + i * navDotSpacing, navDotY).setVisible(true); + dots[i].setTexture("GJ_GameSheet03", page === i ? "gj_navDotBtn_on_001.png" : "gj_navDotBtn_off_001.png"); + } + } else { + navDot1.setPosition(sw / 2 - navDotSpacing / 2, navDotY).setVisible(true); + navDot2.setPosition(sw / 2 + navDotSpacing / 2, navDotY).setVisible(true); + navDot1.setTexture("GJ_GameSheet03", page === 0 ? "gj_navDotBtn_on_001.png" : "gj_navDotBtn_off_001.png"); + navDot2.setTexture("GJ_GameSheet03", page === 1 ? "gj_navDotBtn_on_001.png" : "gj_navDotBtn_off_001.png"); + } }; const rainbowColors = [ @@ -2285,8 +3122,8 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" safeSetTint(this._player._shipSpriteLayer?.sprite, color); safeSetTint(this._player._ballSpriteLayer?.sprite, color); safeSetTint(this._player._waveSpriteLayer?.sprite, color); - for (const layer of this._player._robotLayers || []) safeSetTint(layer?.sprite, color); - for (const layer of this._player._spiderLayers || []) safeSetTint(layer?.sprite, color); + safeSetTint(this._player._robotSpriteLayer?.sprite, color); + safeSetTint(this._player._swingSpriteLayer?.sprite, color); if (this._player._particleEmitter) { try { this._player._particleEmitter.tint = color; @@ -2295,7 +3132,6 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" } } selectedIcon.setTint(color); - _refreshPreview(_currentTab, _getPreviewFrame(_currentTab)); }); this._makeBouncyButton(b2, 1.0, () => { window.secondaryColor = color; @@ -2319,8 +3155,6 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" safeSetTint(this._player._ballOverlayLayer?.sprite, color); safeSetTint(this._player._waveGlowLayer?.sprite, color); safeSetTint(this._player._waveOverlayLayer?.sprite, color); - for (const layer of this._player._robotLayers || []) safeSetTint(layer?.sprite, color); - for (const layer of this._player._spiderLayers || []) safeSetTint(layer?.sprite, color); if (this._player._streak) { try { this._player._streak._color = color; @@ -2329,7 +3163,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" } } selectedIconExtra.setTint(window.secondaryColor); - _refreshPreview(_currentTab, _getPreviewFrame(_currentTab)); + _refreshPreview(currentTab, _getPreviewFrame(currentTab)); }); })(rainbowColors[ci], btn1, btn2); } @@ -2337,97 +3171,15 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" const previewY = lineY - 35; const selectedIconExtra = this.add.image(sw / 2, previewY, _iconAtlas[startTab], null).setScrollFactor(0).setDepth(102).setVisible(false); const selectedIcon = this.add.image(sw / 2, previewY, _iconAtlas[startTab], null).setScrollFactor(0).setDepth(103); - let selectedSegmentedPreview = null; - - const _destroySegmentedPreview = () => { - if (selectedSegmentedPreview?.destroy) selectedSegmentedPreview.destroy(true); - selectedSegmentedPreview = null; - }; - - const _createSegmentedIconComposite = (tab, pseudoFrame, x, y, maxSize, depth, muted = false) => { - const cfg = _segmentedIconConfig[tab]; - const idleFrame = _getSegmentedIdleFrame(tab); - if (!cfg || !idleFrame) return null; - const baseName = String(pseudoFrame || `${cfg.fallbackBase}_001.png`).replace(/_001\.png$/, ""); - const container = this.add.container(x, y).setScrollFactor(0).setDepth(depth); - const parts = []; - for (const spriteKey of Object.keys(idleFrame)) { - if (!spriteKey.startsWith("sprite_")) continue; - const spriteData = idleFrame[spriteKey]; - const tag = parseInt(spriteData.tag || "0", 10) || 0; - const pos = _selectorParseAnimPair(spriteData.position, 0, 0); - const sc = _selectorParseAnimPair(spriteData.scale, 1, 1); - const fl = _selectorParseAnimPair(spriteData.flipped, 0, 0); - const zValue = parseFloat(spriteData.zValue || tag || "0") || 0; - const rotDeg = parseFloat(spriteData.rotation || "0") || 0; - const sourceTexture = _replaceSegmentedBase(tab, spriteData.texture || `${cfg.fallbackBase}_01_001.png`, baseName); - const isSpiderLegTag = tab === "spider" && [0, 1, 4, 5].includes(tag); - const isRobotLegTag = tab === "robot" && [0, 2, 4, 6].includes(tag); - const isRobotArmTag = tab === "robot" && [1, 5].includes(tag); - const localYOffset = tab === "spider" - ? (tag === 3 ? 5 : (isSpiderLegTag ? -9 : 0)) - : (tag === 3 ? 5 : (isRobotArmTag ? -1 : (isRobotLegTag ? -9 : 0))); - const localXScale = tab === "spider" - ? (isSpiderLegTag ? 1.8 : 1) - : ((isRobotLegTag || isRobotArmTag) ? 1.8 : 1); - const variants = [ - { kind: "base", frame: sourceTexture, tint: muted ? 0xAFAFAF : window.mainColor, z: zValue * 0.1 }, - { kind: "overlay", frame: _selectorVariantFrameName(sourceTexture, "overlay"), tint: muted ? 0xffffff : window.secondaryColor, z: zValue * 0.1 + 0.04 }, - { kind: "extra", frame: _selectorVariantFrameName(sourceTexture, "extra"), tint: null, z: zValue * 0.1 + 0.08 } - ]; - for (const variant of variants) { - if (typeof getAtlasFrame !== "function" || !getAtlasFrame(this, variant.frame)) continue; - const img = this.add.image(pos.x * localXScale, -(pos.y + localYOffset), "GJ_GameSheetIcons", variant.frame); - img.rotation = rotDeg * Math.PI / 180; - img.scaleX = sc.x * (fl.x ? -1 : 1); - img.scaleY = sc.y * (fl.y ? -1 : 1); - if (variant.tint !== null && variant.tint !== undefined) img.setTint(variant.tint); - img._selectorZ = variant.z; - parts.push(img); - } - } - parts.sort((a, b) => (a._selectorZ || 0) - (b._selectorZ || 0)); - parts.forEach(part => container.add(part)); - if (!parts.length) { - container.destroy(true); - return null; - } - let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; - for (const img of parts) { - const w = Math.abs((img.width || 1) * (img.scaleX || 1)); - const h = Math.abs((img.height || 1) * (img.scaleY || 1)); - minX = Math.min(minX, img.x - w / 2); - maxX = Math.max(maxX, img.x + w / 2); - minY = Math.min(minY, img.y - h / 2); - maxY = Math.max(maxY, img.y + h / 2); - } - const width = Math.max(1, maxX - minX); - const height = Math.max(1, maxY - minY); - const fitScale = muted ? (maxSize / height) : Math.min(maxSize / width, maxSize / height); - container.setScale(fitScale); - container._selectorBaseScale = fitScale; - return container; - }; const _getPreviewFrame = (tab) => { const prop = _iconWindowProps[tab]; - const frames = _iconFrameSets[tab] || []; - const currentValue = String(window[prop] || ""); - const match = frames.find(f => f.replace("_001.png", "") === currentValue); + const frames = _iconFrameSets[tab]; + const match = frames.find(f => getCanonicalIconName(f, tab) === window[prop]); return match || frames[0]; }; const _refreshPreview = (tab, frame) => { - if (_isSegmentedIconTab(tab)) { - _destroySegmentedPreview(); - selectedIcon.setVisible(false); - selectedIconExtra.setVisible(false); - selectedSegmentedPreview = _createSegmentedIconComposite(tab, frame, sw / 2, previewY, 82, 103, false); - if (selectedSegmentedPreview) this._iconOverlayObjects.push(selectedSegmentedPreview); - return; - } - _destroySegmentedPreview(); - selectedIcon.setVisible(true); selectedIcon.setTexture(_iconAtlas[tab], frame); const s = Math.min(80 / (selectedIcon.width || 80), 80 / (selectedIcon.height || 80)) * 0.85; selectedIcon.setScale(s); @@ -2445,27 +3197,28 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._iconOverlayObjects.push(selectedIconExtra, selectedIcon); const tabBtnY = containerY - 40; - const tabKeys = ["icon", "ship", "ball", "ufo", "wave", "robot", "spider"]; - const tabSpacing = 58; + const tabKeys = ["icon", "ship", "ball", "ufo", "wave", "robot", "spider", "swing"]; + const tabSpacing = 65; const tabOffsets = { - icon: -tabSpacing * 3, - ship: -tabSpacing * 2, - ball: -tabSpacing, - ufo: 0, - wave: tabSpacing, - robot: tabSpacing * 2, - spider: tabSpacing * 3, + icon: -tabSpacing * 3.5, + ship: -tabSpacing * 2.5, + ball: -tabSpacing * 1.5, + ufo: -tabSpacing * 0.5, + wave: tabSpacing * 0.5, + robot: tabSpacing * 1.5, + spider: tabSpacing * 2.5, + swing: tabSpacing * 3.5, }; const tabRotations = { icon: -Math.PI/2, ship: 0, ball: -Math.PI/2, ufo: Math.PI/2, wave: Math.PI/2, robot: 0, spider: 0 }; - const tabFlipXStates = { icon: true, ship: false, ball: true, ufo: false, wave: false, robot: false, spider: false }; - const tabFlipYStates = { icon: false, ship: false, ball: false, ufo: true, wave: true, robot: false, spider: false }; + const tabFlipXStates = { icon: true, ship: false, ball: true, ufo: false, wave: false, robot: false, spider: false, swing: false }; + const tabFlipYStates = { icon: false, ship: false, ball: false, ufo: true, wave: true, robot: false, spider: false, swing: false }; const tabBtnSprites = {}; const _switchTab = (tab) => { for (const k of tabKeys) { if (tabBtnSprites[k]) { tabBtnSprites[k].setTexture("GJ_GameSheet03", - _safeTabBtnFrame(k, k === tab ? "on" : "off")); + k === tab ? _tabBtnFrames[k].on : _tabBtnFrames[k].off); } } _refreshPreview(tab, _getPreviewFrame(tab)); @@ -2475,7 +3228,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" tabKeys.forEach((tab, i) => { const isActive = tab === startTab; const btn = this.add.image(sw / 2 + tabOffsets[tab], tabBtnY, "GJ_GameSheet03", - _safeTabBtnFrame(tab, isActive ? "on" : "off")) + isActive ? _tabBtnFrames[tab].on : _tabBtnFrames[tab].off) .setScrollFactor(0).setDepth(104).setScale(0.75) .setRotation(tabRotations[tab]).setFlipX(tabFlipXStates[tab]).setFlipY(tabFlipYStates[tab]) .setInteractive(); @@ -2535,34 +3288,20 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" const ix = startX + col * (iconSize + padding); const iy = startY + row * (iconSize + padding); const hitRect = this.add.rectangle(ix, iy, iconSize, iconSize, 0x000000, 0).setScrollFactor(0).setDepth(104).setInteractive(); - let iconImg; - let extraImg = null; - let origScale; - if (_isSegmentedIconTab(tab)) { - iconImg = _createSegmentedIconComposite(tab, frame, ix, iy, iconSize * 0.76, 103, true); - if (!iconImg) { - iconImg = this.add.image(ix, iy, "GJ_GameSheetIcons", frame).setScrollFactor(0).setDepth(103).setTint(0xAFAFAF); - origScale = Math.min(iconSize / (iconImg.width || iconSize), iconSize / (iconImg.height || iconSize)) * 0.7; - iconImg.setScale(origScale); - } else { - origScale = iconImg._selectorBaseScale || iconImg.scaleX || 1; - } - } else { - iconImg = this.add.image(ix, iy, atlas, frame).setScrollFactor(0).setDepth(103).setTint(0xAFAFAF); - origScale = Math.min( - iconSize / (iconImg.width || iconSize), - iconSize / (iconImg.height || iconSize) - ) * 0.7; - iconImg.setScale(origScale); - const extraFrame = frame.replace("_001.png", "_2_001.png"); - const extraInfo = getAtlasFrame(this, extraFrame); - extraImg = extraInfo - ? this.add.image(ix, iy, extraInfo.atlas, extraInfo.frame).setScrollFactor(0).setDepth(102).setScale(origScale) - : null; - } + const iconImg = this.add.image(ix, iy, atlas, frame).setScrollFactor(0).setDepth(103).setTint(0xAFAFAF); + const origScale = Math.min( + iconSize / (iconImg.width || iconSize), + iconSize / (iconImg.height || iconSize) + ) * 0.7; + iconImg.setScale(origScale); + const extraFrame = frame.replace("_001.png", "_2_001.png"); + const extraInfo = getAtlasFrame(this, extraFrame); + const extraImg = extraInfo + ? this.add.image(ix, iy, extraInfo.atlas, extraInfo.frame).setScrollFactor(0).setDepth(102).setScale(origScale) + : null; if (extraImg) this._iconGridObjects.push(extraImg); this._iconGridObjects.push(iconImg, hitRect); - if (frame.replace("_001.png", "") === window[prop]) { + if (getCanonicalIconName(frame, tab) === window[prop]) { selLabel.setPosition(ix, iy).setScale(0.75).setVisible(true); } @@ -2588,7 +3327,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" selLabel.setPosition(capturedImg.x, capturedImg.y).setScale(0.75).setVisible(true); - window[prop] = capturedFrame.replace("_001.png", ""); + window[prop] = getCanonicalIconName(capturedFrame, tab); localStorage.setItem("icon" + prop.charAt(0).toUpperCase() + prop.slice(1), window[prop]); if (tab === "icon" && this._player) { @@ -2674,6 +3413,20 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" } } } + if (tab === "robot" && this._player) { + const layerMap = [ + { lp: "_robotSpriteLayer", suffix: "_001.png", tint: window.mainColor }, + ]; + for (const { lp, suffix, tint } of layerMap) { + const layer = this._player[lp]; + if (!layer || !layer.sprite) continue; + const found = getAtlasFrame(this, `${window.currentRobot}${suffix}`); + if (found) { + layer.sprite.setTexture(found.atlas, found.frame); + if (tint !== null) layer.sprite.setTint(tint); + } + } + } _refreshPreview(tab, capturedFrame); }); @@ -2691,7 +3444,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" for (const k of tabKeys) { if (tabBtnSprites[k]) { tabBtnSprites[k].setTexture("GJ_GameSheet03", - _safeTabBtnFrame(k, k === tab ? "on" : "off")); + k === tab ? _tabBtnFrames[k].on : _tabBtnFrames[k].off); } } _refreshPreview(tab, _getPreviewFrame(tab)); @@ -2788,6 +3541,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._spaceKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE); this._upKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.UP); this._wKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.W); + this._enterKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.ENTER); this._lKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.L); this._leftKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.LEFT); this._rightKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.RIGHT); @@ -2854,12 +3608,17 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._updatePracticeHUDBar = () => {}; - this._pauseBtn = this.add.image(screenWidth - 30, 30, "GJ_WebSheet", "GJ_pauseBtn_clean_001.png").setScrollFactor(0).setDepth(30).setAlpha(75 / 255).setVisible(false); + this._pauseBtn = this.add.image(screenWidth - 30, 30, "GJ_GameSheet03", "GJ_pauseBtn_clean_001.png").setScrollFactor(0).setDepth(30).setAlpha(75 / 255).setVisible(false); this._pauseBtn.setInteractive(); this._expandHitArea(this._pauseBtn, 2); this._pauseBtn.on("pointerdown", () => this._pauseGame()); this._escKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.ESC); this._escKey.on("down", () => { + // Level info page sits on top of search results / saved menu — close just it + if (this._levelInfoContainer) { + this._closeLevelInfoPage(); + return; + } if (this._levelSelectOverlay) { this._closeLevelSelect(); return; @@ -2873,6 +3632,11 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" return; } if (this._searchOverlay) { + // Results list open: step back to the search menu, not all the way out + if (this._searchResultsOpen && this._closeSearchResults) { + this._closeSearchResults(); + return; + } this._closeSearchMenu(true); this._openCreatorMenu(); return; @@ -2881,13 +3645,32 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._closeOnlineLevelsScene(); return; } + if (this._savedOverlay) { + if (this._savedCurrentFolder) { + this._closeSavedMenu(true); + this._openSavedMenu(); + } else { + this._closeSavedMenu(); + this._openCreatorMenu(); + } + return; + } + if (this._editorOverlay) { + this._closeEditorMenu(); + this._openCreatorMenu(); + return; + } if (this._creatorOverlay) { this._closeCreatorMenu(); return; } + if (this._questPopup) { + this._questPopup.destroy(); + this._questPopup = null; + return; + } if (this._settingsPopup) { - this._settingsPopup.destroy(); - this._settingsPopup = null; + this._closeSettingsPopup(); return; } if (this._macroPopup) { @@ -2911,14 +3694,9 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._closeNewgroundsPopup(); return; } - if (this._editorTriggerChannelPopup) { - if (typeof this._closeEditorTriggerChannelPopup === "function") { - this._closeEditorTriggerChannelPopup(); - } else { - this._editorTriggerChannelPopup.destroy(); - this._editorTriggerChannelPopup = null; - } - return; + if (this._achLayerOverlay) { + this._hideAchievementsScreen(); + return; } if (this._editorColorPickerPopup) { this._closeEditorColorPickerPopup(); @@ -3108,6 +3886,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" } _openLevelSelect() { if (this._levelSelectOverlay) return; + this._uhdContext = 'levelSelect'; const sw = screenWidth; const sh = screenHeight; const cx = sw / 2; @@ -3327,7 +4106,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" const lvl = window.currentlevel; const songID = lvl[0]; const levelFileName = lvl[2]; - const songFileName = lvl[4] ? lvl[4] : lvl[1].replaceAll(" ", ""); + const songFileName = (typeof lvl[4] === "string") ? lvl[4] : lvl[1].replaceAll(" ", ""); const loadingText = this.add.bitmapText(cx, cy, "goldFont", "Downloading Level Assets...", 20).setOrigin(0.5).setDepth(200); @@ -3441,6 +4220,53 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" nameLabel.setPosition(groupStartX + scaledIconW + scaledGap - cardX, 0); cardContentObjs.push(nameLabel); cardBounceContainer.add(nameLabel); + const levelStars = lvl[4] || 0; + if (levelStars > 0) { + const starIconScale = 0.7; + const starIcon = this.add.image(cardW / 1.98 - 30, -cardH / 2 + 28, "GJ_GameSheet03", "GJ_starsIcon_001.png") + .setScrollFactor(0).setDepth(155).setScale(starIconScale); + const starText = this.add.bitmapText(cardW / 2 - 48, -cardH / 2 + 28, "bigFont", String(levelStars), 28) + .setScrollFactor(0).setDepth(200).setOrigin(1, 0.5).setTint(0xf9ff32); + const completedSet = JSON.parse(localStorage.getItem("gd_completedSet") || "[]"); + if (completedSet.includes(levelId)) { + starText.setTint(0xffff00); + } else { + starText.setTint(0xffffff); + } + cardContentObjs.push(starIcon, starText); + cardBounceContainer.add([starIcon, starText]); + } + if (levelStars > 0) { + const maxOrbs = this._starsToOrbs(levelStars); + const bestPct = parseFloat(localStorage.getItem("bestPercent_" + levelId) || "0"); + const completedSet2 = JSON.parse(localStorage.getItem("gd_completedSet") || "[]"); + const progressOrbs = Math.round(maxOrbs * 0.8 * bestPct / 100); + const completionOrbs = completedSet2.includes(levelId) ? Math.round(maxOrbs * 0.2) : 0; + const earnedOrbs = progressOrbs + completionOrbs; + const orbText = this.add.bitmapText(-cardW / 2 + 65, cardH / 2 - 30, "bigFont", earnedOrbs + "/" + maxOrbs, 20) + .setScrollFactor(0).setDepth(155).setOrigin(0, 0.5).setTint(0xFFFFFF); + const orbIcon = this.add.image(-cardW / 2 + 45, cardH / 2 - 30, "GJ_GameSheet03", "currencyOrbIcon_001.png") + .setScrollFactor(0).setDepth(155).setScale(0.65); + cardContentObjs.push(orbText, orbIcon); + cardBounceContainer.add([orbText, orbIcon]); + } + const levelCoinCount = lvl[5] || 0; + if (levelCoinCount > 0) { + let savedCoins; + try { savedCoins = JSON.parse(localStorage.getItem("coins_" + levelId) || "[]"); } catch(e) { savedCoins = []; } + const coinSpacing = 50; + const coinsGroupW = (levelCoinCount - 1) * coinSpacing; + const coinBaseX = cardW / 2.2 - 50 - coinsGroupW / 2; + const coinY = cardH / 2 - 30; + for (let i = 0; i < levelCoinCount; i++) { + const collected = savedCoins.includes(i); + const coinFrame = collected ? "GJ_coinsIcon_001.png" : "GJ_coinsIcon_gray_001.png"; + const coinIcon = this.add.image(coinBaseX + i * coinSpacing, coinY, "GJ_GameSheet03", coinFrame) + .setScrollFactor(0).setDepth(155).setScale(0.95); + cardContentObjs.push(coinIcon); + cardBounceContainer.add(coinIcon); + } + } }; const barAreaY = cardY + cardH / 2 + 100; const barW2 = Math.min(600, sw - 200); @@ -3550,6 +4376,11 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" } cardContentObjs.length = 0; barObjs.length = 0; + // update() resets _uhdContext to null every frame; this runs from a "preupdate" + // handler on a later frame than _openLevelSelect()'s synchronous build, so it must + // re-assert the tag before creating new icons or their UHD overlays get group:null + // and stay hidden forever (same bug/fix as the settings-popup page rebuild). + this._uhdContext = 'levelSelect'; drawCardBg(newColors.bgHex, dark); buildCardContent(); buildBar(); @@ -3682,6 +4513,18 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" this._makeBouncyButton(leftArrow, 0.6, () => this.changeStartPos(-1)); this._makeBouncyButton(rightArrow, 0.6, () => this.changeStartPos(1)); + this._startPosFadeTimer = null; + } + _resetStartPosFade() { + if (!this._startPosGui) return; + this._startPosGui.setAlpha(1); + if (this._startPosFadeTimer) { this._startPosFadeTimer.remove(); this._startPosFadeTimer = null; } + if (this._startPosFadeTween) { this._startPosFadeTween.stop(); this._startPosFadeTween = null; } + this._startPosFadeTimer = this.time.delayedCall(5000, () => { + this._startPosFadeTween = this.tweens.add({ + targets: this._startPosGui, alpha: 0, duration: 800, ease: "Quad.Out" + }); + }); } changeStartPos(direction) { if (this._paused || this._levelWon || this._menuActive || this._slideIn) return; @@ -3702,6 +4545,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" if (this._startPosText) { const currentId = this._startPosIndex === -1 ? 0 : (this._startPosIndex + 1); this._startPosText.setText(`${currentId}/${totalPositions}`); + this._resetStartPosFade(); } this._practicedMode.clearCheckpoints(); @@ -3735,7 +4579,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" } } _pauseGame() { - if (!this._paused && !this._menuActive && !this._slideIn && !this._state.isDead && !this._levelWon) { + if (!this._paused && !this._menuActive && !this._slideIn && !this._levelWon) { this._paused = true; this._pauseBtn.setVisible(false); this._audio.pauseMusic(); @@ -3780,6 +4624,7 @@ this._menuUpdateLogBtn = this.add.image(screenWidth - 30 - 50, 33, "GJ_WebSheet" return _0x4864cc; } _buildPauseOverlay() { + this._uhdContext = 'pause'; const textureY = screenWidth / 2; const _0xf70e04 = 320; const _0x4eb71b = screenWidth - 40; @@ -3845,26 +4690,26 @@ _buildPauseOverlay() { const _0x4791ac = [ { frame: this._practicedMode.practiceMode ? "GJ_normalBtn_001.png" : "GJ_practiceBtn_001.png", atlas: "GJ_GameSheet03", action: null }, - { frame: "GJ_playBtn2_001.png", atlas: "GJ_WebSheet", action: () => this._resumeGame() }, - { frame: "GJ_menuBtn_001.png", atlas: "GJ_WebSheet", action: () => { + { frame: "GJ_playBtn2_001.png", atlas: "GJ_GameSheet03", action: () => this._resumeGame() }, + { frame: "GJ_menuBtn_001.png", atlas: "GJ_GameSheet03", action: () => { this._audio.playEffect("quitSound_01"); this._audio.stopMusic(); this._resumeGame(); this.scene.restart(); }}, - { frame: "GJ_replayBtn_001.png", atlas: "GJ_WebSheet", action: () => { + { frame: "GJ_replayBtn_001.png", atlas: "GJ_GameSheet03", action: () => { this._resumeGame(); this._restartLevel(); }} ]; const _0x25aa59 = _0x4791ac.map(btn => this.textures.getFrame(btn.atlas, btn.frame)?.width || 123); - let _0x599a9b = textureY - (_0x25aa59.reduce((a, b) => a + b, 0) + (_0x4791ac.length - 1) * 40) / 2; + let _0x599a9b = textureY - (_0x25aa59.reduce((a, b) => a + b, 0) + (_0x4791ac.length - 1) * 40) / 2 - 15; for (let i = 0; i < _0x4791ac.length; i++) { const item = _0x4791ac[i]; const width = _0x25aa59[i]; - const btn = this.add.image(_0x599a9b + width / 2, 390, item.atlas, item.frame).setInteractive(); + const btn = this.add.image(_0x599a9b + width / 2, 405, item.atlas, item.frame).setInteractive(); if (item.action === null) { this._pausePracticeBtn = btn; @@ -3919,6 +4764,7 @@ _buildPauseOverlay() { } _buildSettingsPopup() { if (this._settingsPopup) return; + this._uhdContext = 'settings'; const centerX = screenWidth / 2, centerY = 320, @@ -3937,12 +4783,9 @@ _buildSettingsPopup() { const panel = this._drawScale9(0, 0, panelWidth, panelHeight, 'GJ_square01', corner, 16777215, 1); innerContainer.add(panel); - const closeBtn = this.add.image(-(panelWidth / 2) + 10, -(panelHeight / 2) + 10, 'GJ_WebSheet', "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); + const closeBtn = this.add.image(-(panelWidth / 2) + 10, -(panelHeight / 2) + 10, 'GJ_GameSheet03', "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); innerContainer.add(closeBtn); - this._makeBouncyButton(closeBtn, 0.8, () => { - this._settingsPopup.destroy(); - this._settingsPopup = null; - }); + this._makeBouncyButton(closeBtn, 0.8, () => this._closeSettingsPopup()); const pages = ["Gameplay", "Visual", "Advanced"]; let currentPage = 0; @@ -4116,6 +4959,7 @@ _buildSettingsPopup() { if (this._startPosGui) this._startPosGui.setVisible(v); const total = this._level.getStartPositions().length; if (this._startPosText) this._startPosText.setText(`0/${total}`); + if (v) this._resetStartPosFade(); } ); @@ -4135,10 +4979,15 @@ _buildSettingsPopup() { (v) => window.macroBot = v ); - createNumberInput(container, column2X, startY, "Speedhack", - () => window.speedHack, + createNumberInput(container, column2X, startY, "Speedhack", + () => window.speedHack, (v) => window.speedHack = v ); + + createNumberInput(container, column2X, startY + spacingY, "Respawn Time", + () => window.respawnTime, + (v) => window.respawnTime = v + ); }; const buildVisualPage = (container) => { @@ -4181,20 +5030,20 @@ _buildSettingsPopup() { (v) => window.showCPS = v ); - createToggle(container, column2X, startY, "Show Glow", - () => window.showGlow, - (v) => window.showGlow = v, - () => { if (this._level && this._level._updateGlowVisibility) this._level._updateGlowVisibility(); } + createToggle(container, column2X, startY, "Object Glow", + () => window.showObjectGlow, + (v) => window.showObjectGlow = v, + (v) => { this._level._updateGlowVisibility(); } ); - createToggle(container, column2X, startY + spacingY, "Create Object ID labels", - () => window.createObjectIds, + createToggle(container, column2X, startY + (spacingY), "Create Object ID labels", + () => window.createObjectIds, (v) => window.createObjectIds = v, null, 17 ); - createToggle(container, column2X, startY + (spacingY * 2), "Show Object ID labels", - () => window.showObjectIds, + createToggle(container, column2X, startY + (spacingY * 2), "Show Object ID labels", + () => window.showObjectIds, (v) => window.showObjectIds = v, null, 17 ); @@ -4209,11 +5058,17 @@ _buildSettingsPopup() { }; const buildPage = (idx) => { + // update() clears _uhdContext to null every frame, so by the time this runs (inside + // an async pointerup handler, long after the frame that opened this popup) it's no + // longer 'settings' — re-assert it or every add.image() below tags its UHD overlay + // with group:null, permanently hiding it (_effectiveCtx is 'settings' while this + // popup is open, so group:null never matches and the checkbox overlay disappears). + this._uhdContext = 'settings'; pageContainer.destroy(); pageContainer = this.add.container(0, 0); innerContainer.add(pageContainer); pageTitle.setText(pages[idx]); - + if (idx === 0) buildGameplayPage(pageContainer); else if (idx === 1) buildVisualPage(pageContainer); else if (idx === 2) buildAdvancedPage(pageContainer); @@ -4238,6 +5093,125 @@ _buildSettingsPopup() { easeParams: [1, 0.6] }); } + _closeSettingsPopup() { + if (!this._settingsPopup) return; + this._settingsPopup.destroy(); + this._settingsPopup = null; + // Options is opened from the Settings screen with the Settings screen merely hidden + // (not destroyed) so it can reappear here, rather than dropping back to the pause/main menu. + if (this._settingsLayerInternal) this._settingsLayerInternal.setVisible(true); + if (this._settingsLayerOverlay) this._settingsLayerOverlay.setVisible(true); + } + // Graphics menu (Settings screen > Graphics), styled after GD's Video Options popup. + // Reuses this._settingsPopup so close/ESC handling and the UHD context chain behave + // exactly like Options. + _buildGraphicsPopup() { + if (this._settingsPopup) return; + this._uhdContext = 'settings'; + + const centerX = screenWidth / 2, + centerY = 320, + panelWidth = 700, + panelHeight = 440; + + this._settingsPopup = this.add.container(0, 0).setScrollFactor(0).setDepth(250); + + const dim = this.add.rectangle(centerX, centerY, screenWidth, screenHeight, 0, 150 / 255).setInteractive(); + this._settingsPopup.add(dim); + + const innerContainer = this.add.container(centerX, centerY).setScale(0); + this._settingsPopup.add(innerContainer); + + const corner = 0.325 * this.textures.get("GJ_square01").source[0].width; + const panel = this._drawScale9(0, 0, panelWidth, panelHeight, 'GJ_square01', corner, 16777215, 1); + innerContainer.add(panel); + + const closeBtn = this.add.image(-(panelWidth / 2) + 10, -(panelHeight / 2) + 10, 'GJ_GameSheet03', "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); + innerContainer.add(closeBtn); + this._makeBouncyButton(closeBtn, 0.8, () => this._closeSettingsPopup()); + + innerContainer.add(this.add.bitmapText(0, -(panelHeight / 2) + 45, "goldFont", "Video Options", 46).setOrigin(0.5)); + + // checkX/labelX are the checkbox centre and the label's left edge + const makeCheckbox = (checkX, y, label, fontSize, getVal, setVal) => { + const getTex = () => getVal() ? "GJ_checkOn_001.png" : "GJ_checkOff_001.png"; + const check = this.add.image(checkX, y, "GJ_GameSheet03", getTex()).setScale(0.9).setInteractive(); + const txt = this.add.bitmapText(checkX + 38, y, "bigFont", label, fontSize).setOrigin(0, 0.5); + innerContainer.add(check); + innerContainer.add(txt); + this._makeBouncyButton(check, 0.9, () => { + setVal(!getVal()); + check.setTexture("GJ_GameSheet03", getTex()); + if (this._saveSettings) this._saveSettings(); + }); + return check; + }; + + // Texture Quality <-> UHD flag mapping: + // Low = UHD off entirely + // Medium = UHD on, in-game objects off + // High = UHD on + in-game objects on + const QUALITIES = ["Low", "Medium", "High"]; + const deriveQuality = () => (window.uhdTextures === false) ? 0 : (!window.uhdInGameTextures ? 1 : 2); + let pendingQ = deriveQuality(); + + // Row 1: Fullscreen, centered (like GD's Video Options) + const fsCheck = makeCheckbox(-110, -110, "Fullscreen", 34, + () => this.scale.isFullscreen, + () => this._toggleFullscreen() + ); + // Fullscreen changes are async (and ESC can exit it), so sync the box to the + // real state whenever it flips; unhook when the popup is destroyed. + const _fsRefresh = () => { if (fsCheck.active) fsCheck.setTexture("GJ_GameSheet03", this.scale.isFullscreen ? "GJ_checkOn_001.png" : "GJ_checkOff_001.png"); }; + this.scale.on("enterfullscreen", _fsRefresh); + this.scale.on("leavefullscreen", _fsRefresh); + this._settingsPopup.once("destroy", () => { + this.scale.off("enterfullscreen", _fsRefresh); + this.scale.off("leavefullscreen", _fsRefresh); + }); + + // Texture Quality switcher — the arrow selection is pending until Apply + innerContainer.add(this.add.bitmapText(0, -25, "goldFont", "Texture Quality", 38).setOrigin(0.5)); + const qualityTxt = this.add.bitmapText(0, 40, "bigFont", QUALITIES[pendingQ], 42).setOrigin(0.5); + innerContainer.add(qualityTxt); + const _makeQualityArrow = (x, dir) => { + const arrow = this.add.image(x, 40, "GJ_GameSheet03", "edit_upBtn_001.png") + .setAngle(dir < 0 ? 270 : 90).setScale(1.15).setInteractive(); + innerContainer.add(arrow); + this._makeBouncyButton(arrow, 1.15, () => { + pendingQ = (pendingQ + dir + QUALITIES.length) % QUALITIES.length; + qualityTxt.setText(QUALITIES[pendingQ]); + }); + }; + _makeQualityArrow(-170, -1); + _makeQualityArrow(170, 1); + + // Bottom: Back / Apply buttons + const btnW = 220, btnH = 64, btnY = panelHeight / 2 - 60; + const btnBorder = this.textures.get("GJ_button01").source[0].width * 0.3; + const _makeBottomBtn = (x, label, action) => { + const btn = this.add.nineslice(x, btnY, "GJ_button01", null, btnW, btnH, btnBorder, btnBorder, btnBorder, btnBorder).setOrigin(0.5).setInteractive(); + const txt = this.add.bitmapText(x, btnY - 5, "goldFont", label, 40).setOrigin(0.5); + innerContainer.add(btn); + innerContainer.add(txt); + this._makeCompositeBouncyButton(btn, [btn, txt], 1, action); + }; + _makeBottomBtn(-125, "Back", () => this._closeSettingsPopup()); + _makeBottomBtn(125, "Apply", () => { + // Commit the pending quality to the two UHD flags + window.uhdTextures = pendingQ >= 1; + window.uhdInGameTextures = pendingQ >= 2; + if (this._saveSettings) this._saveSettings(); + }); + + this.tweens.add({ + targets: innerContainer, + scale: 1, + duration: 660, + ease: "Elastic.Out", + easeParams: [1, 0.6] + }); + } _saveSettings() { const settings = { noclip: window.noClip, @@ -4250,6 +5224,7 @@ _buildSettingsPopup() { solidWaveTrail: window.solidWave, noclipAccuracy: window.noClipAccuracy, hitboxesOnDeath: window.hitboxesOnDeath, + showEditorGlow: window.showEditorGlow, createObjectIds: window.createObjectIds, showObjectIds: window.showObjectIds, showCPS: window.showCPS, @@ -4257,6 +5232,10 @@ _buildSettingsPopup() { macroBot: window.macroBot, showGlow: window.showGlow, showEditorGlow: window.showEditorGlow, + showObjectGlow: window.showObjectGlow, + respawnTime: window.respawnTime, + uhdTextures: window.uhdTextures, + uhdInGameTextures: window.uhdInGameTextures, useDirectInternet: !!window.useDirectInternet }; localStorage.setItem("gd_settings", JSON.stringify(settings)); @@ -4275,6 +5254,7 @@ _buildSettingsPopup() { solidWaveTrail: false, noclipAccuracy: false, hitboxesOnDeath: false, + showEditorGlow: false, createObjectIds: false, showObjectIds: false, showCPS: false, @@ -4282,10 +5262,14 @@ _buildSettingsPopup() { macroBot: false, showGlow: true, showEditorGlow: false, + showObjectGlow: true, + respawnTime: 1.0, + uhdTextures: true, + uhdInGameTextures: false, useDirectInternet: true }; - const data = { ...defaults, ...(saved ? JSON.parse(saved) : {}) }; + const data = saved ? JSON.parse(saved) : defaults; window.noClip = data.noclip; window.showPercentage = data.showPercentage; @@ -4302,17 +5286,187 @@ _buildSettingsPopup() { window.macroBot = data.macroBot; window.showGlow = data.showGlow; window.showEditorGlow = data.showEditorGlow; + window.showObjectGlow = data.showObjectGlow ?? true; + window.respawnTime = data.respawnTime ?? 1.0; window.createObjectIds = data.createObjectIds; window.showObjectIds = data.showObjectIds; + window.uhdTextures = data.uhdTextures ?? true; + window.uhdInGameTextures = data.uhdInGameTextures ?? false; window.useDirectInternet = !!data.useDirectInternet; localStorage.setItem("gd_useDirectInternet", String(!!window.useDirectInternet)); } + _getActiveQuests() { + const QUEST_DURATION = 4 * 60 * 60 * 1000; + const QUEST_POOL = [ + { name: "Star Collector", desc: "Collect {n} Stars.", stat: "stars", targets: [5, 10, 15, 20], rewards: [10, 15, 20, 25] }, + { name: "Level Master", desc: "Complete {n} Levels.", stat: "completedLevels", targets: [1, 2, 3, 5], rewards: [10, 15, 20, 30] }, + { name: "Jump King", desc: "Jump {n} Times.", stat: "jumps", targets: [100, 200, 500, 1000], rewards: [5, 10, 15, 20] }, + { name: "Never Give Up", desc: "Die {n} Times.", stat: "deaths", targets: [10, 25, 50, 100], rewards: [5, 10, 15, 20] }, + { name: "Try Again", desc: "Make {n} Attempts.", stat: "attempts", targets: [10, 25, 50, 100], rewards: [5, 10, 15, 20] }, + ]; + + const now = Date.now(); + let saved; + try { saved = JSON.parse(localStorage.getItem("gd_quests")); } catch(e) { saved = null; } + const timestamp = parseInt(localStorage.getItem("gd_questsTimestamp") || "0", 10); + + if (saved && saved.length === 3 && timestamp > 0 && (now - timestamp) < QUEST_DURATION) { + return { quests: saved, expiresAt: timestamp + QUEST_DURATION }; + } + + const currentStats = { + stars: window._totalStars || 0, + completedLevels: window._completedLevels || 0, + jumps: parseInt(localStorage.getItem("gd_totalJumps") || "0", 10), + deaths: parseInt(localStorage.getItem("gd_totalDeaths") || "0", 10), + attempts: parseInt(localStorage.getItem("gd_totalAttempts") || "0", 10), + }; + + const shuffled = [...QUEST_POOL].sort(() => Math.random() - 0.5); + const picked = shuffled.slice(0, 3); + const quests = picked.map(q => { + const tierIdx = Math.floor(Math.random() * q.targets.length); + const target = q.targets[tierIdx]; + return { + name: q.name, + desc: q.desc.replace("{n}", target), + stat: q.stat, + target: target, + reward: q.rewards[tierIdx], + startValue: currentStats[q.stat] + }; + }); + + localStorage.setItem("gd_quests", JSON.stringify(quests)); + localStorage.setItem("gd_questsTimestamp", String(now)); + return { quests, expiresAt: now + QUEST_DURATION }; + } + _buildQuestPopup() { + if (this._questPopup) return; + this._uhdContext = 'quest'; + const centerX = screenWidth / 2; + const centerY = 320; + const panelWidth = 700; + const panelHeight = 500; + + this._questPopup = this.add.container(0, 0).setScrollFactor(0).setDepth(250); + + const dim = this.add.rectangle(centerX, centerY, screenWidth, screenHeight, 0, 150 / 255).setInteractive(); + this._questPopup.add(dim); + + const innerContainer = this.add.container(centerX, centerY).setScale(0); + this._questPopup.add(innerContainer); + + const corner = 0.325 * this.textures.get("GJ_square01").source[0].width; + const panel = this._drawScale9(0, 0, panelWidth, panelHeight, 'GJ_square01', corner, 16777215, 1); + innerContainer.add(panel); + + const closeBtn = this.add.image(-(panelWidth / 2) + 10, -(panelHeight / 2) + 10, 'GJ_GameSheet03', "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); + innerContainer.add(closeBtn); + this._makeBouncyButton(closeBtn, 0.8, () => { + this._questPopup.destroy(); + this._questPopup = null; + }); + + const title = this.add.bitmapText(0, -(panelHeight / 2) + 40, "bigFont", "Quests", 40).setOrigin(0.5); + innerContainer.add(title); + + const { quests, expiresAt } = this._getActiveQuests(); + + const currentStats = { + stars: window._totalStars || 0, + completedLevels: window._completedLevels || 0, + jumps: parseInt(localStorage.getItem("gd_totalJumps") || "0", 10), + deaths: parseInt(localStorage.getItem("gd_totalDeaths") || "0", 10), + attempts: parseInt(localStorage.getItem("gd_totalAttempts") || "0", 10), + }; + + const rowH = 120; + const rowW = panelWidth - 80; + const startY = -100; + + quests.forEach((quest, idx) => { + const ry = startY + idx * (rowH + 15); + + const rowBg = this.add.graphics(); + rowBg.fillStyle(0x3333AA, 0.9); + rowBg.fillRoundedRect(-rowW / 2, ry - rowH / 2, rowW, rowH, 12); + rowBg.lineStyle(2, 0x5555CC, 1); + rowBg.strokeRoundedRect(-rowW / 2, ry - rowH / 2, rowW, rowH, 12); + innerContainer.add(rowBg); + + const nameText = this.add.bitmapText(-rowW / 2 + 20, ry - 35, "bigFont", quest.name, 24).setOrigin(0, 0.5); + innerContainer.add(nameText); + + const descText = this.add.bitmapText(-rowW / 2 + 20, ry - 10, "goldFont", quest.desc, 18).setOrigin(0, 0.5); + innerContainer.add(descText); + + const progress = Math.max(0, currentStats[quest.stat] - quest.startValue); + const clamped = Math.min(progress, quest.target); + const pct = clamped / quest.target; + + const barW = 340; + const barH = 20; + const barX = -rowW / 2 + 20; + const barY = ry + 15; + + const barBg = this.add.graphics(); + barBg.fillStyle(0x111133, 1); + barBg.fillRoundedRect(barX, barY, barW, barH, barH / 2); + innerContainer.add(barBg); + + if (pct > 0) { + const barFg = this.add.graphics(); + const fillColor = clamped >= quest.target ? 0x00FF00 : 0x00AAFF; + barFg.fillStyle(fillColor, 1); + const fillW = Math.max(barH, barW * pct); + const rightR = pct >= 1 ? barH / 2 : 0; + barFg.fillRoundedRect(barX, barY, fillW, barH, { tl: barH / 2, bl: barH / 2, tr: rightR, br: rightR }); + innerContainer.add(barFg); + } + + const progressText = this.add.bitmapText(barX + barW / 2, barY + barH / 2, "goldFont", clamped + " / " + quest.target, 16) + .setOrigin(0.5); + innerContainer.add(progressText); + + const rewardText = this.add.bitmapText(rowW / 2 - 40, ry - 10, "bigFont", quest.reward + "x", 30) + .setOrigin(1, 0.5); + innerContainer.add(rewardText); + + const diamondIcon = this.add.image(rowW / 2 - 20, ry - 10, "GJ_GameSheet03", "GJ_diamondsIcon_001.png") + .setScale(0.8) + .setDepth(1.1) + .setAngle(90); + + innerContainer.add(diamondIcon); + + if (clamped >= quest.target) { + nameText.setTint(0x00FF00); + } + }); + + const remaining = Math.max(0, expiresAt - Date.now()); + const hours = Math.floor(remaining / 3600000); + const mins = Math.floor((remaining % 3600000) / 60000); + const timerText = this.add.bitmapText(0, panelHeight / 2 - 35, "goldFont", "New quests in: " + hours + "h " + mins + "min", 22) + .setOrigin(0.5); + innerContainer.add(timerText); + + this.tweens.add({ + targets: innerContainer, + scale: 1, + duration: 660, + ease: "Elastic.Out", + easeParams: [1, 0.6] + }); + } _buildMacroPopup() { if (this._macroPopup) return; const centerX = screenWidth / 2; const centerY = 320; const panelWidth = 800; const panelHeight = 400; + this._uhdContext = 'macro'; this._macroPopup = this.add.container(0, 0).setScrollFactor(0).setDepth(250); const dim = this.add.rectangle(centerX, centerY, screenWidth, screenHeight, 0x000000, 150 / 255).setInteractive(); this._macroPopup.add(dim); @@ -4336,7 +5490,7 @@ _buildSettingsPopup() { const optionsBtn = this.add.image(centerX, centerY - (panelHeight / 2) + 95, "GJ_GameSheet03", "GJ_optionsBtn02_001.png").setInteractive().setFlipY(true).setAngle(90).setScale(0.45); this._macroPopup.add(optionsBtn); - const closeBtn = this.add.image(centerX - (panelWidth / 2) + 20, centerY - (panelHeight / 2) + 20, "GJ_WebSheet", "GJ_closeBtn_001.png").setInteractive().setScale(0.8); + const closeBtn = this.add.image(centerX - (panelWidth / 2) + 20, centerY - (panelHeight / 2) + 20, "GJ_GameSheet03", "GJ_closeBtn_001.png").setInteractive().setScale(0.8); this._macroPopup.add(closeBtn); this._makeBouncyButton(closeBtn, 0.8, () => { @@ -4473,6 +5627,7 @@ _buildSettingsPopup() { if (this._infoPopup) { return; } + this._uhdContext = 'info'; const xPos = screenWidth / 2; const popupHeight = 320; const popupWidth = 336; @@ -4486,7 +5641,7 @@ _buildSettingsPopup() { const cornerRadius = this.textures.get("GJ_square02").source[0].width * 0.325; const popupBg = this._drawScale9(0, 0, 480, popupWidth, "GJ_square02", cornerRadius, 16777215, 1); bounceContainer.add(popupBg); - const closeBtn = this.add.image(-240 + 20, -148, "GJ_WebSheet", "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); + const closeBtn = this.add.image(-240 + 20, -148, "GJ_GameSheet03", "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); bounceContainer.add(closeBtn); this._expandHitArea(closeBtn, 2); this._makeBouncyButton(closeBtn, 0.8, () => this._closeInfoPopup()); @@ -4655,7 +5810,7 @@ _buildSettingsPopup() { this._howToPlayPopup.add(panelContainer); const _0x2c64c2 = this._drawScale9(0, 0, 830, 530, "GJ_square01", _0x14e46f, 16777215, 1); panelContainer.add(_0x2c64c2); - const _0x5a0f88 = this.add.image(-240 - 160, 172 - _0x4c3182 - 110, "GJ_WebSheet", "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); + const _0x5a0f88 = this.add.image(-240 - 160, 172 - _0x4c3182 - 110, "GJ_GameSheet03", "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); this._expandHitArea(_0x5a0f88, 2); this._makeBouncyButton(_0x5a0f88, 0.8, () => this._closeHowToPlayPopup()); panelContainer.add(_0x5a0f88); @@ -4770,6 +5925,7 @@ _buildSettingsPopup() { if (this._updateLogPopup || window.levelID) { return; } + this._uhdContext = 'updateLog'; const xPos = screenWidth / 2; const popupHeight = 320; const popupWidth = 336; @@ -4783,7 +5939,7 @@ _buildSettingsPopup() { const cornerRadius = this.textures.get("GJ_square02").source[0].width * 0.325; const popupBg = this._drawScale9(0, 0, 480, popupWidth, "GJ_square02", cornerRadius, 16777215, 1); bounceContainer.add(popupBg); - const closeBtn = this.add.image(-240 + 20, -148, "GJ_WebSheet", "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); + const closeBtn = this.add.image(-240 + 20, -148, "GJ_GameSheet03", "GJ_closeBtn_001.png").setScale(0.8).setInteractive(); bounceContainer.add(closeBtn); this._expandHitArea(closeBtn, 2); this._makeBouncyButton(closeBtn, 0.8, () => this._closeUpdateLogPopup()); @@ -4818,7 +5974,11 @@ _buildSettingsPopup() { { text: "checking for hazards lmao", scale: 0.7 }, { text: "There's probably more but I forgot", color: 0x808080, scale: 0.5 }, { text: "- Lasokar", scale: 0.7, color: 0x00e676 }, - ]; + { text: "Accurate GDWeb+ logo", scale: 0.65 }, + { text: "Credit to Altruist for making it", scale: 0.6 }, + { text: "is this update finally out?", scale: 0.65, color: 0xaaddff }, + { text: "- rohanis0000", scale: 0.65, color: 0xaaddff }, + ]; let yPos = 0; const lineItems = []; updateEntries.forEach(entry => { @@ -4904,6 +6064,7 @@ _buildSettingsPopup() { } _buildNewgroundsPopup() { if (this._newgroundsPopup || window.levelID) return; + this._uhdContext = 'newgrounds'; const xPos = screenWidth / 2; const centerY = screenHeight / 2; this._newgroundsPopup = this.add.container(0, 0).setScrollFactor(0).setDepth(1000); @@ -5020,6 +6181,13 @@ _buildSettingsPopup() { const _0x960250 = _0x46ea45 * (_0x37180a - 1) / 2; const _0x3f88a1 = _0x43b461 * (_0x37180a - 1) / 2; _0x122213.input.hitArea.setTo(-_0x960250, -_0x3f88a1, _0x46ea45 + _0x960250 * 2, _0x43b461 + _0x3f88a1 * 2); + // The UHD hit-zone experiment (localStorage.uhdHideOldTextures) redirects input + // to a same-sized companion Zone once setInteractive() has been called — mirror + // the same expansion onto it, or every _expandHitArea call site (there are 15+) + // silently stops doing anything once that zone takes over. + if (_0x122213._uhdHitZone && _0x122213._uhdHitZone.input) { + _0x122213._uhdHitZone.input.hitArea.setTo(-_0x960250, -_0x3f88a1, _0x46ea45 + _0x960250 * 2, _0x43b461 + _0x3f88a1 * 2); + } } _makeBouncyButton(textureX, _0x57b645, _0x2f13d0, _0xda0c21) { textureX._bouncyBaseScale = _0x57b645; @@ -5391,18 +6559,6 @@ _buildSettingsPopup() { } this._closeInfoPopup(); this._closeUpdateLogPopup(); - if (this._tryMeImg) { - this.tweens.add({ - targets: this._tryMeImg, - y: -this._tryMeImg.height, - duration: 300, - ease: "Quad.In", - onComplete: () => { - this._tryMeImg.destroy(); - this._tryMeImg = null; - } - }); - } if (this._downloadBtns) { for (const _0xaa3a95 of this._downloadBtns) { this.tweens.killTweensOf(_0xaa3a95); @@ -5453,7 +6609,7 @@ _buildSettingsPopup() { this._player2.setCubeVisible(false); this._attemptsLabel.setVisible(false); window.selectedObjId = 1; - this._levelEditor._initEditorLogic(); + this._initEditorLogic(); return; } this._cameraX = -centerX; @@ -5496,6 +6652,8 @@ _buildSettingsPopup() { this._attemptsLabel.setText("Attempt " + this._levelAttempts); this._attemptsLabel.setVisible(true); this._positionAttemptsLabel(); + this._coinsCollected = 0; + this._coinTotal = this._level._coinSprites.length; let gamemode = parseInt(window.settingsMap["kA2"] || "0"); if (gamemode == 1) { this._player.enterShipMode(); @@ -5506,10 +6664,6 @@ _buildSettingsPopup() { this._player.enterUfoMode(); } else if (gamemode == 4) { this._player.enterWaveMode(); - } else if (gamemode == 5) { - this._player.enterRobotMode(); - } else if (gamemode == 6) { - this._player.enterSpiderMode(); } this._applyLevelStartOptions(); @@ -5635,9 +6789,6 @@ _buildSettingsPopup() { if (this._copyrightText) { this._copyrightText.x = screenWidth - 20; } - if (this._tryMeImg) { - this._tryMeImg.x = _0x1e5db8 + 175; - } if (this._menuGlitter) { this._menuGlitter.x = _0x1e5db8; this._menuGlitter.y = 320; @@ -5746,7 +6897,6 @@ _buildSettingsPopup() { this._player2.setShipVisible(false); this._player2.setBallVisible(false); this._player2.setWaveVisible(false); - this._player2.setRobotVisible(false); this._glitterEmitter.stop(); let speedKey = parseInt(window.settingsMap["kA4"] || "0"); if (speedKey == 0) { @@ -5771,6 +6921,8 @@ _buildSettingsPopup() { this._level.resetSpawnTriggers(); this._level.resetMoveTriggers(); this._level.resetVisibility(); + this._level._updateGlowVisibility(); + this._coinsCollected = 0; if (this._orbGfx) { this._orbGfx.clear(); } this._colorManager.reset(); this._player.noclipStats.totalFrames = 0; @@ -5795,8 +6947,6 @@ _buildSettingsPopup() { this._player.enterUfoMode(); } else if (pos.gameMode == 4) { this._player.enterWaveMode(); - } else if (pos.gameMode == 5) { - this._player.enterRobotMode(); } else if (pos.gameMode == 6) { this._player.enterSpiderMode(); } @@ -5810,9 +6960,6 @@ _buildSettingsPopup() { SpeedPortal.FOUR_TIMES ][pos.speed]; this._state.mirrored = pos.mirrored; - if (pos.dualMode) { - this._enableDualMode(); - } this._level.fastForwardTriggers(pos.x, this._colorManager); } @@ -5841,8 +6988,6 @@ _buildSettingsPopup() { this._player.enterUfoMode(); } else if (gamemode == 4) { this._player.enterWaveMode(); - } else if (gamemode == 5) { - this._player.enterRobotMode(); } else if (gamemode == 6) { this._player.enterSpiderMode(); } @@ -5860,16 +7005,12 @@ _buildSettingsPopup() { if (this._macroBot?.playing == true){ this._macroBot?.clearPlayback(); } - this._level._updateGlowVisibility?.(); } _getStartPosMusicOffset(){ const startPositions = this._level.getStartPositions(); let musicOffset = 0; if (this._startPosIndex !== -1 && startPositions[this._startPosIndex]) { - const startX = startPositions[this._startPosIndex].x; - musicOffset = this._level?.getSongOffsetForX - ? this._level.getSongOffsetForX(startX, { sourceObjects: window.levelObjects }) - : startX / 623.16; + musicOffset = startPositions[this._startPosIndex].x / 623.16; } return musicOffset; } @@ -5913,15 +7054,12 @@ _buildSettingsPopup() { this._state.mirrored = checkpoint.mirrored; this._state.isDashing = checkpoint.isDashing; this._state.dashYVelocity = checkpoint.dashYVelocity; - this._state._robotHold = !!checkpoint.robotHold; - this._state._robotHoldTimer = checkpoint.robotHoldTimer || 0; this._player.reset(); this._state.isFlying = false; this._state.isBall = false; this._state.isWave = false; this._state.isUfo = false; this._state.isSpider = false; - this._state.isRobot = false; this._state.isBird = false; if (checkpoint.isFlying) { this._player.enterShipMode(null, true); // dont mess with y velocity if ur loading a checkpoint @@ -5931,8 +7069,6 @@ _buildSettingsPopup() { this._player.enterUfoMode(null, true); // dont mess with y velocity if ur loading a checkpoint } else if (checkpoint.isWave) { this._player.enterWaveMode(); - } else if (checkpoint.isRobot) { - this._player.enterRobotMode(); } else if (checkpoint.isSpider) { this._player.enterSpiderMode(); } else if (checkpoint.isBird) { @@ -5951,10 +7087,7 @@ _buildSettingsPopup() { this._state.isWave = checkpoint.isWave; this._state.isUfo = checkpoint.isUfo; this._state.isSpider = checkpoint.isSpider; - this._state.isRobot = checkpoint.isRobot; this._state.isBird = checkpoint.isBird; - this._state._robotHold = !!checkpoint.robotHold; - this._state._robotHoldTimer = checkpoint.robotHoldTimer || 0; this._state.ignorePortals = true; this._state2.ignorePortals = true; this._level.resetGroundTiles(this._cameraX); @@ -6030,7 +7163,7 @@ _buildSettingsPopup() { this._physicsFrame = checkpoint.physicsFrame; if (this._macroBot?.recording == true){ this._macroBot?.rollbackRecording(this._physicsFrame); - if (this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown){ + if (this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown || this._enterKey.isDown){ this._macroBot.recordEdge(true, this._physicsFrame); } else { this._macroBot.recordEdge(false, this._physicsFrame); @@ -6039,7 +7172,6 @@ _buildSettingsPopup() { if (this._macroBot?.playing == true){ this._macroBot?.rollbackPlayback(this._physicsFrame); } - this._level._updateGlowVisibility?.(); } _onFullscreenChange(_0x310c5b) { if (!_0x310c5b) { @@ -6085,57 +7217,10 @@ _buildSettingsPopup() { this._applyMirrorEffect(); } } - _createMirroredBackgroundTexture(textureKey) { - const mirroredKey = textureKey + "__mirror_y_loop"; - if (this.textures.exists(mirroredKey)) return mirroredKey; - - const texture = this.textures.get(textureKey); - const source = texture?.source?.[0]; - const image = source?.image || source?.canvas; - const width = source?.width || image?.width || image?.naturalWidth || 0; - const height = source?.height || image?.height || image?.naturalHeight || 0; - - if (!image || width <= 0 || height <= 0 || !this.textures.createCanvas) { - return textureKey; - } - - try { - const mirroredTexture = this.textures.createCanvas(mirroredKey, width, height * 2); - const ctx = mirroredTexture.getContext(); - ctx.clearRect(0, 0, width, height * 2); - ctx.drawImage(image, 0, 0, width, height, 0, 0, width, height); - ctx.save(); - ctx.translate(0, height * 2); - ctx.scale(1, -1); - ctx.drawImage(image, 0, 0, width, height, 0, 0, width, height); - ctx.restore(); - mirroredTexture.refresh(); - return mirroredKey; - } catch (err) { - console.warn("Failed to create mirrored background texture", textureKey, err); - if (this.textures.exists(mirroredKey)) this.textures.remove(mirroredKey); - return textureKey; - } - } - - _applyMirroredBackgroundTexture(textureKey) { - const texture = this.textures.get(textureKey); - const source = texture?.source?.[0]; - const sourceHeight = source?.height || source?.image?.height || source?.image?.naturalHeight || 0; - const mirroredKey = this._createMirroredBackgroundTexture(textureKey); - this._bg.setTexture(mirroredKey); - this._bgInitY = sourceHeight > 0 ? sourceHeight - screenHeight - o : 0; - this._bgMirrorTileHeight = sourceHeight > 0 ? sourceHeight * 2 : 0; - } - _updateBackground() { this._bg.tilePositionX += (this._cameraX - this._prevCameraX) * this._bgSpeedX; this._prevCameraX = this._cameraX; - let tileY = this._bgInitY - this._cameraY * this._bgSpeedY; - if (this._bgMirrorTileHeight > 0) { - tileY = ((tileY % this._bgMirrorTileHeight) + this._bgMirrorTileHeight) % this._bgMirrorTileHeight; - } - this._bg.tilePositionY = tileY; + this._bg.tilePositionY = this._bgInitY - this._cameraY * this._bgSpeedY; } _updateCameraY(_0xc7c517) { let explosionPiece = this._cameraY; @@ -6186,20 +7271,241 @@ _buildSettingsPopup() { this._deltaBuffer = _0x578d1b - _0xd8019e; return _0xd8019e * 60; } + // Per-frame sync: position every UHD DOM img overlay over its Phaser counterpart. + // Runs on the scene's POST_UPDATE event (registered in create) — i.e. AFTER update() + // has moved the level containers / camera for this frame. Running it inside update() + // (before the camera code) made every overlay trail the canvas by exactly one frame, + // which reads as severe motion blur / ghosting while scrolling. + _syncUhdOverlays = () => { + if (this._uhdCont && this._uhdMap && this._uhdMap.size > 0) { + const _cv = this.game.canvas; + const _cr = _cv.getBoundingClientRect(); + // Only re-set container position on resize (avoids layout thrash every frame) + const _pos = _cr.left + ',' + _cr.top + ',' + _cr.width + ',' + _cr.height; + if (this._uhdContPos !== _pos) { + const _css = 'position:fixed;pointer-events:none;overflow:hidden;left:' + _cr.left + 'px;top:' + _cr.top + 'px;width:' + _cr.width + 'px;height:' + _cr.height + 'px;'; + this._uhdCont.style.cssText = _css + 'z-index:499;'; + this._uhdFadeDiv.style.cssText = _css + 'z-index:500;background:#000;opacity:' + (this._uhdFadeDiv._op || '0') + ';'; + if (this._uhdFlashDiv) this._uhdFlashDiv.style.cssText = _css + 'z-index:9000;background:#f00;opacity:' + (this._uhdFlashDiv._op || '0') + ';'; + this._uhdContPos = _pos; + } + const _sx = _cr.width / screenWidth; + const _sy = _cr.height / screenHeight; + // Black fade div sits above UHD imgs and mirrors the Phaser depth-200 fade graphics + let _fadeCover = 0; + for (const _fc of this.children.list) { + if (_fc.depth === 200 && _fc.type === 'Graphics' && _fc.alpha > _fadeCover && _fc.scrollFactorX === 0) { + _fadeCover = _fc.alpha; + if (_fadeCover >= 1) break; + } + } + const _camA = this.cameras.main.alpha; + if (_camA < 1) _fadeCover = Math.max(_fadeCover, 1 - _camA); + const _fadeOp = _fadeCover.toFixed(2); + if (this._uhdFadeDiv._op !== _fadeOp) { this._uhdFadeDiv.style.opacity = _fadeOp; this._uhdFadeDiv._op = _fadeOp; } + // Noclip death flash: mirror the canvas rectangle's alpha above everything + if (this._uhdFlashDiv) { + const _flashOp = (this.noclipFlash && this.noclipFlash.alpha > 0) ? this.noclipFlash.alpha.toFixed(2) : '0'; + if (this._uhdFlashDiv._op !== _flashOp) { this._uhdFlashDiv.style.opacity = _flashOp; this._uhdFlashDiv._op = _flashOp; } + } + // Priority-ordered: most-nested overlay first. Only its group's DOM imgs are shown. + const _effectiveCtx = + this._editorColorPickerPopup ? 'editorColorPicker' : + this._editorHorizontalOptionPopup ? 'editorHorizontalOption' : + this._editorStartOptionsPopup ? 'editorStartOptions' : + this._editorLevelSettingsPopup ? 'editorSettings' : + (this._editorMenuContainer && this._editorMenuContainer.visible) ? 'editorPause' : + this._nongPopupObjs ? 'nong' : + this._levelInfoContainer ? 'levelInfo' : + this._questPopup ? 'quest' : + this._macroPopup ? 'macro' : + (this._settingsLayerOverlay || this._settingsPopup) ? 'settings' : + this._achLayerOverlay ? 'achLayer' : + this._statsLayerOverlay ? 'stats' : + this._iconOverlay ? 'icon' : + this._onlineLevelsOverlay ? 'online' : + this._searchResultsOpen ? 'searchResults' : + this._searchOverlay ? 'search' : + this._savedOverlay ? 'saved' : + this._newgroundsPopup ? 'newgrounds' : + this._infoPopup ? 'info' : + this._updateLogPopup ? 'updateLog' : + this._levelViewOverlay ? 'levelView' : + this._creatorOverlay ? 'creator' : + this._editorOverlay ? 'editor' : + this._levelSelectOverlay ? 'levelSelect' : + this._pauseContainer ? 'pause' : + null; + // Graphics settings: master UHD switch (default on) and in-game object UHD + // (default off). Checked live each frame so the toggles apply instantly. + const _uhdOn = window.uhdTextures !== false; + const _uhdObjOn = _uhdOn && !!window.uhdInGameTextures; + const _uhdHideOld = localStorage.getItem('uhdHideOldTextures') !== '0'; + for (const [go, entry] of this._uhdMap) { + if (!go.active) { + if (entry.img) entry.img.remove(); + if (entry.hitZone) entry.hitZone.destroy(); + this._uhdMap.delete(go); + continue; + } + // Fast path for culled level objects — the overwhelmingly common case in a long + // level. No DOM img exists and the section container is hidden: two reads, skip. + if (entry.obj && !entry.img) { + if (!_uhdObjOn) continue; + const _pc = go.parentContainer; + if (!go.visible || (_pc && !_pc.visible)) continue; + } + let _parVis = true; { let _chk = go.parentContainer; while (_chk) { if (!_chk.visible) { _parVis = false; break; } _chk = _chk.parentContainer; } } + // Keep the companion hit-zone (see the setInteractive patch above) tracking + // this sprite's current world transform and depth every frame, and mirror + // the game's own intended visibility (not the UHD-hiding state below, which + // is purely cosmetic) into whether it's actually clickable. + if (entry.hitZone) { + const _hz = entry.hitZone; + // Keep it in the same container as its sprite (image.setInteractive() often + // runs before container.add(image) — e.g. chained on the same line — so the + // zone can easily be created before that reparenting happens). Once actually + // parented alongside it, position/scale/rotation are plain local coordinates + // and Phaser's own container transform/depth handling does the rest, instead + // of hand-rolling a world-space walk that only covered position/scale. + if (_hz.parentContainer !== go.parentContainer) { + if (_hz.parentContainer) _hz.parentContainer.remove(_hz); + if (go.parentContainer) go.parentContainer.add(_hz); + else this.sys.displayList.add(_hz); + } + _hz.setPosition(go.x, go.y).setScale(go.scaleX, go.scaleY).setRotation(go.rotation); + _hz.setScrollFactor(go.scrollFactorX, go.scrollFactorY); + if (_hz.depth !== go.depth) _hz.setDepth(go.depth); + const _hzActive = go._uhdWantsInteractive && go.visible && _parVis; + if (_hz.input && _hz.input.enabled !== _hzActive) { + if (_hzActive) _hz.setInteractive(); else _hz.disableInteractive(); + } + } + // Object-sheet sprites with a color tint (not white/black) can't be replicated + // by a DOM img; nor can any sprite with a non-normal blend mode (e.g. the + // additive spider dash streak from GJ_GameSheet04) — hide the overlay so the + // canvas sprite shows through. + const _objUnsupported = (entry.obj && go.tintTopLeft !== 0xffffff && go.tintTopLeft !== 0) || (go.blendMode && go.blendMode !== 0); + const vis = go.visible && _parVis && entry.group === _effectiveCtx && !_objUnsupported && (entry.obj ? _uhdObjOn : _uhdOn); + if (!vis) { + if (entry.obj) { + // Level objects release their DOM node entirely while off screen; the + // browser's image cache makes re-creation on approach cheap. + if (entry.img) { entry.img.remove(); entry.img = null; entry._vis = false; entry._t = null; entry._al = ''; entry._op = ''; entry._sized = false; } + continue; + } + // Un-hide the canvas sprite (see below) now that its overlay isn't showing. + if (entry._forceHidden) { go.alpha = entry._authoredAlpha != null ? entry._authoredAlpha : 1; entry._forceHidden = false; } + if (entry._vis !== false) { entry.img.style.display = 'none'; entry._vis = false; } + continue; + } + if (_uhdHideOld && !entry.obj && (entry.hitZone || !go.input)) { + // Purely decorative sprites (corner art, backgrounds, etc.) were never made + // interactive at all, so there's no hitbox to protect — safe to hide + // outright. Interactive ones only get hidden once their own zone (see the + // setInteractive patch above) exists to keep handling clicks for them. + // The real alpha is stashed so the dim/disabled-look filter below still + // reflects what the game actually intended, not our forced 0. + if (!entry._forceHidden) { entry._authoredAlpha = go.alpha; entry._forceHidden = true; } + if (go.alpha !== 0) go.alpha = 0; + } + if (!entry.img) { + const _di = document.createElement('img'); + _di.style.cssText = 'position:absolute;left:0;top:0;pointer-events:none;object-fit:' + (entry.fit || 'contain') + ';'; + _di.onerror = () => { _di.style.display = 'none'; }; + _di.src = entry.src; + this._uhdCont.appendChild(_di); + entry.img = _di; + entry._vis = null; entry._t = null; entry._al = ''; entry._op = ''; entry._sized = false; + } + const _isSideArt = go.frame && go.frame.name === 'GJ_sideArt_001.png'; + const _uhdScale = entry.uhdScale || 1; + const dw = go.width * _sx * _uhdScale; + const dh = go.height * _sy * _uhdScale; + const ox = go.originX != null ? go.originX : 0.5; + const oy = go.originY != null ? go.originY : 0.5; + if (!entry._sized) { + entry.img.style.width = dw.toFixed(1) + 'px'; + entry.img.style.height = dh.toFixed(1) + 'px'; + entry.img.style.transformOrigin = _isSideArt ? '0% 0%' : ((ox * 100).toFixed(0) + '% ' + (oy * 100).toFixed(0) + '%'); + entry._sized = true; + } + if (entry._vis !== true) { entry.img.style.display = ''; entry._vis = true; } + let al = ''; + if (entry.obj) { + // World objects: alpha is a real gameplay fade, not a disabled-button look. + const op = go.alpha < 1 ? go.alpha.toFixed(2) : ''; + if (entry._op !== op) { entry.img.style.opacity = op; entry._op = op; } + } else if ((entry._forceHidden ? entry._authoredAlpha : go.alpha) < 1) { + al = 'grayscale(1) brightness(0.55)'; + } + // Grey-tinted sprites (sawblades use setTint(0); dimmed/unselected UI icons + // use a mid-grey tint) — a neutral multiply tint is equivalent to a CSS + // brightness() scale by the tint's channel value, with hue/saturation + // untouched (unlike grayscale()). Only exact/near-neutral tints are + // approximated this way; colored tints aren't used on non-obj UHD sprites. + if (go.tintTopLeft !== 0xffffff) { + const _tintR = (go.tintTopLeft >> 16) & 0xff; + al += (al ? ' ' : '') + 'brightness(' + (_tintR / 255).toFixed(2) + ')'; + } + if (entry._al !== al) { entry.img.style.filter = al; entry._al = al; } + let _wx = go.x, _wy = go.y, _ws = go.scaleX, _wsY = go.scaleY; + { let _wp = go.parentContainer; while (_wp) { _wx = _wp.x + _wx * (_wp.scaleX || 1); _wy = _wp.y + _wy * (_wp.scaleY || 1); _ws *= (_wp.scaleX || 1); _wsY *= (_wp.scaleY || 1); _wp = _wp.parentContainer; } } + let t; + if (_isSideArt) { + const _sFX = (_wx * _sx < _cr.width * 0.5 ? 1 : -1) * _ws; + const _sFY = (_wy * _sy < _cr.height * 0.5 ? -1 : 1) * _ws; + const _cX = (_sFX > 0 ? 0 : _wx * _sx).toFixed(1); + const _cY = (_sFY > 0 ? _wy * _sy - dh : dh).toFixed(1); + t = 'translate(' + _cX + 'px,' + _cY + 'px) scale(' + _sFX.toFixed(3) + ',' + _sFY.toFixed(3) + ')'; + } else { + const _isAtlasComp = go.frame && go.frame.rotated && go.flipX && Math.abs(go.rotation + Math.PI * 0.5) < 0.01; + if (_isAtlasComp) { + const _fr = go.frame; + const _corX = (_fr.realWidth - _fr.realHeight + (_fr.y - _fr.x) * 2 + _fr.height - _fr.width) * 0.5; + _wx += _corX; _wy -= _corX; + } + const _isAtlasRotated = go.frame && go.frame.rotated; + // CSS scale(-1) mirrors around the origin point, which relocates an off-center + // box's footprint to the other side of that point (it does NOT mirror in place + // like Phaser's flip, which just reverses texture sampling within a fixed quad). + // Compensate by shifting translate so the footprint stays where Phaser puts it. + const _flipCorX = (!_isAtlasRotated && go.flipX) ? dw * _ws * (1 - 2 * ox) : 0; + const _flipCorY = (!_isAtlasRotated && go.flipY) ? dh * _wsY * (1 - 2 * oy) : 0; + const _uhdOffX = entry.uhdOffset ? entry.uhdOffset.x * _sx : 0; + const _uhdOffY = entry.uhdOffset ? entry.uhdOffset.y * _sy : 0; + const tx = (_wx * _sx - dw * ox + _flipCorX + _uhdOffX).toFixed(1); + const ty = (_wy * _sy - dh * oy + _flipCorY + _uhdOffY).toFixed(1); + const _cFX = (!_isAtlasRotated && go.flipX) ? -_ws : _ws; + const _cFY = (!_isAtlasRotated && go.flipY) ? -_wsY : _wsY; + const _cRot = _isAtlasRotated ? (entry.uhdRot != null ? go.rotation + entry.uhdRot : 0) : go.rotation; + if (_cRot === 0 && _cFX === _cFY) { + t = 'translate(' + tx + 'px,' + ty + 'px) scale(' + _cFX.toFixed(3) + ')'; + } else { + t = 'translate(' + tx + 'px,' + ty + 'px)' + + (_cRot !== 0 ? ' rotate(' + _cRot.toFixed(4) + 'rad)' : '') + + ' scale(' + _cFX.toFixed(3) + ',' + _cFY.toFixed(3) + ')'; + } + } + if (entry._t !== t) { entry.img.style.transform = t; entry._t = t; } + } + } + }; update(_0x54fa47, deltaTime) { + this._uhdContext = null; // reset between frames so only current overlay's add.image calls get tagged if (window.isEditor) { if (this._editorPlaytestActive && !this._editorPlaytestPaused) { - this._levelEditor._updateEditorPlaytest(deltaTime); - this._levelEditor._updateEditorGrid(); - this._levelEditor._updateEditorTimeline(); + this._updateEditorPlaytest(deltaTime); + this._updateEditorGrid(); + this._updateEditorTimeline(); return; } if (window.isEditorPause) return; const pointer = this.input.activePointer; this._hitObjects = this.input.hitTestPointer(pointer); - this._levelEditor._handleEditorCamera(deltaTime); - this._levelEditor._updateEditorGrid(); + this._handleEditorCamera(deltaTime); + this._updateEditorGrid(); if (pointer.isDown && !this._isDraggingSlider) { if (this._isSwipeEnabled) { if (this._editorTab !== "edit") { @@ -6208,7 +7514,7 @@ _buildSettingsPopup() { const currentGridY = Math.floor((pointer.y + this._cameraY + 20) / 60) * 60; if (currentGridX !== this._lastSwipeGridX || currentGridY !== this._lastSwipeGridY) { - this._levelEditor._editorAction(); + this._editorAction(); this._lastSwipeGridX = currentGridX; this._lastSwipeGridY = currentGridY; } @@ -6225,10 +7531,10 @@ _buildSettingsPopup() { } } } - this._levelEditor._updateEditorTimeline(); + this._updateEditorTimeline(); if (this._editorPlaytestActive && this._editorPlaytestPaused) { - this._levelEditor._refreshEditorPlaytestGlowVisibility(); - this._levelEditor._syncEditorPlaytestPlayerVisual(deltaTime / 1000); + this._refreshEditorPlaytestGlowVisibility(); + this._syncEditorPlaytestPlayerVisual(deltaTime / 1000); } return; } @@ -6284,7 +7590,7 @@ _buildSettingsPopup() { this._fpsFrames = 0; } if (this._paused) { - if (!this._updateLogPopup && (this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown) && !this._spaceWasDown && !this._settingsPopup) { + if (!this._updateLogPopup && (this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown || this._enterKey.isDown) && !this._spaceWasDown && !this._settingsPopup) { setTimeout(() => { this._resumeGame(); }, 75); @@ -6296,7 +7602,7 @@ _buildSettingsPopup() { const _anyOverlayOpen = this._iconOverlay || this._creatorOverlay || this._searchOverlay || this._onlineLevelsOverlay || this._settingsLayerOverlay || this._settingsPopup || this._infoPopup || this._newgroundsPopup || this._statsLayerOverlay || this._updateLogPopup; - if (!_anyOverlayOpen && (this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown) && !this._spaceWasDown) { + if (!_anyOverlayOpen && (this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._enterKey.isDown) && !this._spaceWasDown) { if (this._creatorMenuOpen) return; this._spaceWasDown = true; if (this._levelSelectOverlay) { @@ -6319,7 +7625,7 @@ _buildSettingsPopup() { } } this._arrowWasDown = _arrowLeft || _arrowRight; - this._spaceWasDown = this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown; + this._spaceWasDown = this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown || this._enterKey.isDown; const menuDelta = Math.min(deltaTime / 1000 * 60, 2); const menuSpeed = 0.85; this._menuCameraX = (this._menuCameraX || 0) + menuDelta * playerSpeed * d * menuSpeed; @@ -6386,7 +7692,7 @@ _buildSettingsPopup() { return; } this._applyJumpInput = () => { - const jumpHeld = this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown; + const jumpHeld = this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown || this._enterKey.isDown; if (!this._updateLogPopup && jumpHeld && !this._spaceWasDown) { this._pushButton(); } else if (!jumpHeld && this._spaceWasDown) { @@ -6413,7 +7719,7 @@ _buildSettingsPopup() { this._state.upKeyPressed = false; this._state.queuedHold = false; } - this._level.updateEndPortalY(this._cameraY, this._state.isFlying || this._state.isWave || this._state.isUfo || this._state.isSpider); + this._level.updateEndPortalY(this._cameraY, this._state.isFlying || this._state.isWave || this._state.isUfo); if (!this._levelWon && !this._state.isDead && this._level.endXPos > 0) { const _0x448396 = 600; if (this._playerWorldX >= this._level.endXPos - _0x448396) { @@ -6460,9 +7766,23 @@ _buildSettingsPopup() { let _0x169d53 = this._playerWorldX; this._lastPercent = Math.min(99, Math.max(0, Math.floor(_0x169d53 / _0x435587 * 100))); if (this._lastPercent > this._bestPercent && !this._practicedMode.practiceMode) { + const prevBest = this._bestPercent; this._bestPercent = this._lastPercent; localStorage.setItem("bestPercent_" + (window.currentlevel[2] || "level_1"), this._bestPercent); this._hadNewBest = true; + const levelStars = window.currentlevel[4] || 0; + if (levelStars > 0) { + const maxOrbs = this._starsToOrbs(levelStars); + const progressPool = maxOrbs * 0.8; + const prevOrbs = Math.round(progressPool * prevBest / 100); + const newOrbs = Math.round(progressPool * this._lastPercent / 100); + const orbDelta = newOrbs - prevOrbs; + if (orbDelta > 0) { + window._totalOrbs = (window._totalOrbs || 0) + orbDelta; + localStorage.setItem("gd_totalOrbs", window._totalOrbs); + this._newBestOrbDelta = orbDelta; + } + } this._showNewBest(); } if (this._practicedMode.practiceMode) { @@ -6484,7 +7804,8 @@ _buildSettingsPopup() { } } this._deathTimer += deltaTime; - let _0x237728 = this._hadNewBest ? 1400 : 1000; + const baseDelay = (window.respawnTime ?? 1.0) * 1000; + let _0x237728 = this._hadNewBest ? baseDelay + 400 : baseDelay; if (this._deathTimer > _0x237728) { if (this._practicedMode.practiceMode) { this._respawnFromCheckpoint(); @@ -6513,7 +7834,8 @@ _buildSettingsPopup() { if (this._level && this._level._sawSprites) { const sawRotation = deltaTime * 0.003; for (let _saw of this._level._sawSprites) { - if (_saw && _saw.active) _saw.rotation += sawRotation; + // Culled saws don't need to spin — skips the transform dirty for off-screen sections + if (_saw && _saw.active && (!_saw.parentContainer || _saw.parentContainer.visible)) _saw.rotation += sawRotation; } } this._level.updateAudioScale(this._audio.getMeteringValue()); @@ -6666,24 +7988,11 @@ _buildSettingsPopup() { this._level.topContainer.x = -this._cameraX; this._level.topContainer.y = this._cameraY; let playerX = this._playerWorldX; - const applyColorTrigger = (colorTrigger) => { + for (let colorTrigger of this._level.checkColorTriggers(playerX)) { this._colorManager.triggerColor(colorTrigger.index, colorTrigger.color, colorTrigger.duration); if (colorTrigger.tintGround) { this._colorManager.triggerColor(gs, colorTrigger.color, colorTrigger.duration); } - }; - for (let colorTrigger of this._level.checkColorTriggers(playerX)) { - applyColorTrigger(colorTrigger); - } - if (this._level.checkTouchColorTriggers) { - for (let colorTrigger of this._level.checkTouchColorTriggers(playerX, this._state.y)) { - applyColorTrigger(colorTrigger); - } - if (this._isDual && !this._state2.isDead) { - for (let colorTrigger of this._level.checkTouchColorTriggers(playerX, this._state2.y)) { - applyColorTrigger(colorTrigger); - } - } } this._level.checkMoveTriggers(playerX); this._level.checkSpawnTriggers(playerX); @@ -6731,60 +8040,5054 @@ _buildSettingsPopup() { this._applyMirrorEffect(); } -_applyMirrorEffect() { - const isMirrored = this._state.mirrored; - const containers = [this._level.additiveContainer, this._level.container, this._level.topContainer]; - if (isMirrored) { - for (const c of containers) { - c.scaleX = -1; - c.x = this._cameraX + screenWidth; - } - for (const tile of this._level._groundTiles) { - tile.x = screenWidth - tile.x - this._level._tileW; - tile.setFlipX(true); - } - for (const tile of this._level._ceilingTiles) { - tile.x = screenWidth - tile.x - this._level._tileW; - tile.setFlipX(true); - } - } else { - for (const c of containers) { - if (c.scaleX !== 1) c.scaleX = 1; - } - for (const tile of this._level._groundTiles) { - tile.setFlipX(false); - } - for (const tile of this._level._ceilingTiles) { - tile.setFlipX(false); - } +_handleEditorCamera = (delta) => { + if (this._editorTextInputFocused) { + this._level.container.x = -this._cameraX; + this._level.container.y = -this._cameraY; + this._level.additiveContainer.x = -this._cameraX; + this._level.additiveContainer.y = -this._cameraY; + this._level.topContainer.x = -this._cameraX; + this._level.topContainer.y = -this._cameraY; + return; } - this._bg.setFlipX(isMirrored); - } - _getMirrorXOffset(xOffset) { - return this._state.mirrored ? screenWidth - xOffset : xOffset; - } - _enableDualMode() { - if (this._isDual) return; - this._isDual = true; - this._state2.reset(); - this._state2.y = this._state.y; - this._state2.yVelocity = 0; - this._state2.onGround = false; - this._state2.gravityFlipped = !this._state.gravityFlipped; - this._state2.isMini = this._state.isMini; - this._state2.mirrored = this._state.mirrored; - this._state2.isDead = false; - this._player2.reset(); - if (this._state.isFlying) { - this._player2.enterShipMode(); - } else if (this._state.isBall) { - this._player2.enterBallMode(); - } else if (this._state.isWave) { + + // Camera pans with arrow keys only — WASD is reserved for moving the selected object + const camSpeed = 15; + const cursors = this.input.keyboard.createCursorKeys(); + + if (cursors.left.isDown) { + this._cameraX -= camSpeed; + } else if (cursors.right.isDown) { + this._cameraX += camSpeed; + } + + if (cursors.up.isDown) { + this._cameraY -= camSpeed; + } else if (cursors.down.isDown) { + this._cameraY += camSpeed; + } + + this._level.container.x = -this._cameraX; + this._level.container.y = -this._cameraY; + this._level.additiveContainer.x = -this._cameraX; + this._level.additiveContainer.y = -this._cameraY; + this._level.topContainer.x = -this._cameraX; + this._level.topContainer.y = -this._cameraY; + + this._bg.tilePositionX = this._cameraX * 0.1; + this._bg.tilePositionY = this._bgInitY + this._cameraY * 0.1; +}; + +_initEditorLogic = () => { + if (this._editorGridGraphics) this._editorGridGraphics.destroy(); + this._editorGridGraphics = this.add.graphics().setDepth(5); +const allObj = window.allobjects(); +let maxId = 0; +for (const key in allObj) { + const num = parseInt(key, 10); + if (!isNaN(num) && num > maxId) maxId = num; +} +this._totalIds = maxId; + this._editorPage = 0; + this._maxPerPage = 12; + this._isSwipeEnabled = false; + this._lastSwipeGridX; + this._lastSwipeGridY; + this._clickStartPos = { x: 0, y: 0 }; + this._isDragging = false; + this._isDraggingSlider = false; + this._editorTab = "build"; + window.editorSelectedObject = -1; + this._editorZoom = 1.0; + this._editorPlaytestActive = false; + this._editorPlaytestPaused = false; + this._editorPlaytestSavedView = null; + this._editorPlaytestPauseView = null; + this._editorPlaytestLastTrailPoint = null; + this.input.on('pointerdown', (pointer) => { + if (this._editorPlaytestActive && !this._editorPlaytestPaused) return; + this._clickStartPos.x = pointer.x; + this._clickStartPos.y = pointer.y; + this._cameraStartX = this._cameraX; + this._cameraStartY = this._cameraY; + this._isDragging = false; + }); + this.input.on('pointerup', (pointer) => { + if (this._editorPlaytestActive && !this._editorPlaytestPaused) { + this._lastSwipeGridX = -1; + this._lastSwipeGridY = -1; + this._isDragging = false; + this._isDraggingSlider = false; + return; + } + if (!this._isSwipeEnabled && !this._isDragging && !this._isDraggingSlider && this._hitObjects.length === 0) { + this._editorAction(); + } + this._lastSwipeGridX = -1; + this._lastSwipeGridY = -1; + this._isDragging = false; + this._isDraggingSlider = false; + }); + this._createEditorGui(); +}; + +_createEditorGui = () => { + const centerX = screenWidth / 2; + const bottomY = screenHeight - 100; + + this._editorGui = this.add.container(screenWidth - 40, 40).setScrollFactor(0).setDepth(1000); + const editorSettings = this.add.image(-87, 0, "GJ_GameSheet03", "GJ_optionsBtn02_001.png").setInteractive().setAngle(-90).setFlipX(true); + const editorPause = this.add.image(0, 0, "GJ_GameSheet03", "GJ_pauseBtn_001.png").setInteractive().setFlipX(true).setAngle(-90); + this._deleteButton = this.add.image(-(screenWidth - 40) + 50, 0, "GJ_GameSheet03", "GJ_trashBtn_001.png").setInteractive(); + this._editorGui.add([editorSettings, editorPause, this._deleteButton]); + this._makeBouncyButton(editorSettings, 1.0, () => {this._openEditorLevelSettingsPopup();}, () => !this._editorLevelSettingsPopup); + this._makeBouncyButton(editorPause, 1.0, () => this._showEditorPauseMenu(true), () => true); + this._makeBouncyButton(this._deleteButton, 0.9, () => this._deleteSelectedObject(), () => true); + this._initEditorPauseMenu(); + + this._toolbox = this.add.container(0, 0).setScrollFactor(0).setDepth(1000); + + const bg = this.add.rectangle(0, screenHeight, screenWidth, 200, 0x000000).setOrigin(0, 1).setAlpha(0.75).setInteractive(); + this._toolbox.add(bg); + + this._leftArrow = this.add.image(screenWidth / 2 - 330, screenHeight - 100, "GJ_GameSheet03", "GJ_arrow_02_001.png") + .setInteractive().setScale(0.7); + + this._rightArrow = this.add.image(screenWidth / 2 + 330, screenHeight - 100, "GJ_GameSheet03", "GJ_arrow_02_001.png") + .setInteractive().setScale(0.7).setFlipX(true); + + this._toolbox.add([this._leftArrow, this._rightArrow]); + + const swipeX = centerX + 450; + const swipeY = screenHeight - 100; + + this._swipeContainer = this.add.container(swipeX, swipeY).setDepth(1001); + this._toolbox.add(this._swipeContainer); + + this._swipeBg = this.add.image(0, 0, "GJ_button01").setInteractive().setScale(0.8); + this._swipeText = this.add.bitmapText(-1, -2, "bigFont", "swipe", 16).setOrigin(0.5); + + this._swipeContainer.add([this._swipeBg, this._swipeText]); + + this._makeCompositeBouncyButton(this._swipeBg, [this._swipeBg, this._swipeText], 0.8, () => { + this._isSwipeEnabled = !this._isSwipeEnabled; + + if (this._isSwipeEnabled) { + this._swipeBg.setTexture("GJ_button02"); + } else { + this._swipeBg.setTexture("GJ_button01"); + } + }); + + const tabX = (screenWidth / 2) - 475; + const tabYStart = screenHeight - 150; + const tabSpacing = 55; + + this._separatorLeft = this.add.image(tabX + 100, screenHeight - 100, "GJ_GameSheet03", "edit_vLine_001.png"); + this._toolbox.add(this._separatorLeft); + + this._separatorRight = this.add.image(centerX + 375, screenHeight - 100, "GJ_GameSheet03", "edit_vLine_001.png"); + this._toolbox.add(this._separatorRight); + + const tabs = [ + { id: "build", frame: "edit_buildBtn_001.png" }, + { id: "edit", frame: "edit_editBtn_001.png" }, + { id: "delete", frame: "edit_deleteBtn_001.png" } + ]; + + this._tabButtons = {}; + tabs.forEach((tab, i) => { + const btn = this.add.image(tabX, tabYStart + (i * tabSpacing), "GJ_GameSheet03", tab.frame).setInteractive(); + this._toolbox.add(btn); + this._tabButtons[tab.id] = btn; + this._makeBouncyButton(btn, 1, () => { + this._editorTab = tab.id; + this._editorPage = 0; + this._updateTabVisuals(); + this._buildObjectGrid(); + }); + }); + + this._sideButtons = this.add.container(screenWidth - 48, 120).setScrollFactor(0).setDepth(1000); + this._copyPasteBtn = this.add.image(0, 0, "GJ_GameSheet03", "GJ_duplicateObjectBtn2_001.png").setInteractive().setAngle(90).setFlipY(true).setScale(1); + this._deselectBtn = this.add.image(0, 75, "GJ_GameSheet03", "GJ_deSelBtn2_001.png").setInteractive().setAngle(90).setFlipY(true).setScale(1); + + this._sideButtons.add([this._copyPasteBtn, this._deselectBtn]); + + this._makeBouncyButton(this._copyPasteBtn, 1, () => { + this._duplicateSelectedObject(); + }); + + this._makeBouncyButton(this._deselectBtn, 1, () => { + this._clearEditorSelection(); + }); + + this._zoomButtons = this.add.container(48, screenHeight / 2 - 20).setScrollFactor(0).setDepth(1000); + + const zoomInBtn = this.add.image(0, 0, "GJ_GameSheet03", "GJ_zoomInBtn_001.png").setAngle(90).setFlipY(true).setInteractive().setScale(0.9); + const zoomOutBtn = this.add.image(0, 75, "GJ_GameSheet03", "GJ_zoomOutBtn_001.png").setAngle(90).setFlipY(true).setInteractive().setScale(0.9); + + this._zoomButtons.add([zoomInBtn, zoomOutBtn]); + + this._makeBouncyButton(zoomInBtn, 0.9, () => this._adjustZoom(0.1)); + this._makeBouncyButton(zoomOutBtn, 0.9, () => this._adjustZoom(-0.1)); + + this._editorPlaytestControls = this.add.container(48, screenHeight / 2 - 110).setScrollFactor(0).setDepth(1500); + const playtestButtonScale = 1.1; + + this._editorPlaytestPlayBtn = this.add.image(0, 0, "GJ_GameSheet03", "GJ_playEditorBtn_001.png").setAngle(90).setFlipY(true).setInteractive().setScale(playtestButtonScale); + this._editorPlaytestPauseBtn = this.add.image(0, 0, "GJ_GameSheet03", "GJ_pauseEditorBtn_001.png").setAngle(90).setFlipY(true).setInteractive().setScale(playtestButtonScale).setVisible(false); + this._editorPlaytestStopBtn = this.add.image(90, 0, "GJ_GameSheet03", "GJ_stopEditorBtn_001.png").setAngle(90).setFlipY(true).setInteractive().setScale(playtestButtonScale).setVisible(false); + + this._editorPlaytestControls.add([ + this._editorPlaytestPlayBtn, + this._editorPlaytestPauseBtn, + this._editorPlaytestStopBtn + ]); + + this._makeBouncyButton(this._editorPlaytestPlayBtn, playtestButtonScale, () => this._startEditorPlaytest(), () => !this._editorPlaytestActive); + this._makeBouncyButton(this._editorPlaytestPauseBtn, playtestButtonScale, () => this._toggleEditorPlaytestPause(), () => this._editorPlaytestActive); + this._makeBouncyButton(this._editorPlaytestStopBtn, playtestButtonScale, () => this._stopEditorPlaytest(), () => this._editorPlaytestActive); + this._refreshEditorPlaytestControls(); + + this._zoomText = this.add.bitmapText(screenWidth / 2, 80, "bigFont", "Zoom: 1.00x", 40).setOrigin(0.5).setScrollFactor(0).setDepth(2000).setAlpha(0); + + this.input.on('wheel', (pointer, gameObjects, deltaX, deltaY, deltaZ) => { + const zoomAmount = deltaY > 0 ? -0.1 : 0.1; + this._adjustZoom(zoomAmount, pointer.x, pointer.y); + }); + + this._updateEditorActionButtons(); + this._updateTabVisuals(); + this._buildObjectGrid(); + + // Editor keybinds: Enter = playtest toggle, 1/2/3 = build/edit/delete tab, + // WASD = move selected object one grid block, Shift+WASD = fine step, + // Q/E = rotate CCW/CW (like GD), Backspace/Delete = delete selected object. + this.input.keyboard.on('keydown', (event) => { + if (!window.isEditor) return; + // Never fire while typing in a text field or while a popup / pause menu is up + if (this._editorTextInputFocused || window._activeCustomInput || this._activeInput) return; + if (window.isEditorPause || this._editorLevelSettingsPopup || this._editorStartOptionsPopup || + this._editorColorPickerPopup || this._editorHorizontalOptionPopup || this._settingsPopup) return; + + const code = event.code; + if (code === 'Enter' || code === 'NumpadEnter') { + if (event.repeat) return; + if (this._editorPlaytestActive) this._stopEditorPlaytest(); + else this._startEditorPlaytest(); + return; + } + if (this._editorPlaytestActive) return; // everything below is edit-mode only + + if (code === 'Digit1' || code === 'Digit2' || code === 'Digit3') { + if (event.repeat) return; + const tab = code === 'Digit1' ? 'build' : code === 'Digit2' ? 'edit' : 'delete'; + if (this._editorTab !== tab) { + this._editorTab = tab; + this._editorPage = 0; + this._updateTabVisuals(); + this._buildObjectGrid(); + } + return; + } + const _mv = event.shiftKey ? 3 : 60; // plain = one grid block, shift = fine step + if (code === 'KeyW') { this._moveObject(0, -_mv); return; } + if (code === 'KeyS') { this._moveObject(0, _mv); return; } + if (code === 'KeyA') { this._moveObject(-_mv, 0); return; } + if (code === 'KeyD') { this._moveObject(_mv, 0); return; } + if (code === 'KeyQ') { if (!event.repeat) this._rotateObject(-90); return; } + if (code === 'KeyE') { if (!event.repeat) this._rotateObject(90); return; } + if (code === 'Backspace' || code === 'Delete') { + event.preventDefault(); + if (event.repeat) return; + this._deleteSelectedObject(); + return; + } + }); + + this._initEditorTimeline(); +}; + +_refreshEditorPlaytestControls = () => { + if (!this._editorPlaytestPlayBtn || !this._editorPlaytestPauseBtn || !this._editorPlaytestStopBtn) return; + + const active = !!this._editorPlaytestActive; + this._editorPlaytestPlayBtn.setVisible(!active); + this._editorPlaytestPauseBtn.setVisible(active); + this._editorPlaytestStopBtn.setVisible(active); + + if (active) { + this._editorPlaytestPauseBtn + .setTexture( + "GJ_GameSheet03", + this._editorPlaytestPaused ? "GJ_playEditorBtn_001.png" : "GJ_pauseEditorBtn_001.png" + ) + .setAlpha(1); + this._editorPlaytestStopBtn.setAlpha(1); + } else { + this._editorPlaytestPauseBtn + .setTexture("GJ_GameSheet03", "GJ_pauseEditorBtn_001.png") + .setAlpha(1); + this._editorPlaytestStopBtn.setAlpha(1); + } +}; + +_setEditorPlaytestGuiVisible = (visible) => { + const guiObjects = [ + this._editorGui, + this._toolbox, + this._zoomButtons, + this._sideButtons, + this._timelineContainer, + this._zoomText + ]; + + for (const obj of guiObjects) { + if (obj && typeof obj.setVisible === "function") { + obj.setVisible(visible); + } + } +}; + +_setEditorLevelSectionsFullyVisible = () => { + if (!this._level?._sectionContainers) return; + + for (let i = 0; i < this._level._sectionContainers.length; i++) { + if (typeof this._level._setSectionVisible === "function") { + this._level._setSectionVisible(i, true); + continue; + } + + const section = this._level._sectionContainers[i]; + if (section?.additive) section.additive.visible = true; + if (section?.normal) section.normal.visible = true; + } + + this._level.resetVisibility?.(); +}; + +_resetEditorPlaytestSectionCulling = () => { + if (!this._level) return; + + this._level.resetVisibility?.(); + this._level.updateVisibility?.(this._cameraX); +}; + +_refreshEditorPlaytestGlowVisibility = () => { + if (!this._level) return; + + if (this._editorPlaytestActive) { + const glowVisible = !!window.showEditorGlow; + this._level.additiveContainer?.setVisible(glowVisible); + if (this._level._glowSprites) { + for (const glow of this._level._glowSprites) { + glow?.setVisible?.(glowVisible); + } + } + return; + } + + this._level.additiveContainer?.setVisible(true); + this._level._updateGlowVisibility?.(); +}; + +_getEditorPlaytestCameraYTarget = () => { + let currentNormalCameraY = -(this._cameraY || 0); + let targetNormalCameraY = currentNormalCameraY; + + if (this._level?.flyCameraTarget !== null && this._level?.flyCameraTarget !== undefined) { + targetNormalCameraY = this._level.flyCameraTarget; + } else { + const playerY = this._state?.y || 0; + const highMargin = 140; + const lowMargin = 80; + const cameraCenterY = currentNormalCameraY - o + 320; + + if (this._state?.gravityFlipped) { + if (playerY > cameraCenterY + lowMargin) { + targetNormalCameraY = playerY - 320 - lowMargin + o; + } else if (playerY < cameraCenterY - highMargin) { + targetNormalCameraY = playerY - 320 + highMargin + o; + } + } else { + if (playerY > cameraCenterY + highMargin) { + targetNormalCameraY = playerY - 320 - highMargin + o; + } else if (playerY < cameraCenterY - lowMargin) { + targetNormalCameraY = playerY - 320 + lowMargin + o; + } + } + } + + return -Math.max(0, targetNormalCameraY || 0); +}; + +_updateEditorPlaytestCameraY = (delta = 0, instant = false) => { + const targetCameraY = this._getEditorPlaytestCameraYTarget(); + + if (instant || delta === 0) { + this._cameraY = targetCameraY; + return; + } + + const currentNormalCameraY = -(this._cameraY || 0); + const targetNormalCameraY = -targetCameraY; + let nextNormalCameraY = currentNormalCameraY + ((targetNormalCameraY - currentNormalCameraY) / (10 / delta)); + + if (nextNormalCameraY < 0) nextNormalCameraY = 0; + this._cameraY = -nextNormalCameraY; +}; + +_updateEditorPlaytestBackground = () => { + this._bg.tilePositionX += (this._cameraX - this._prevCameraX) * this._bgSpeedX; + this._prevCameraX = this._cameraX; + this._bg.tilePositionY = this._bgInitY + this._cameraY * this._bgSpeedY; +}; + +_setEditorZoomInstant = (zoom, cameraX = this._cameraX, cameraY = this._cameraY) => { + this._editorZoom = Phaser.Math.Clamp(zoom, 0.1, 4.0); + this._cameraX = cameraX; + this._cameraY = cameraY; + + this._level.topContainer.setScale(this._editorZoom); + this._level.additiveContainer.setScale(this._editorZoom); + this._level.container.setScale(this._editorZoom); + + this._level.topContainer.x = -this._cameraX; + this._level.topContainer.y = -this._cameraY; + this._level.additiveContainer.x = -this._cameraX; + this._level.additiveContainer.y = -this._cameraY; + this._level.container.x = -this._cameraX; + this._level.container.y = -this._cameraY; + + this._cameraXRef._v = this._cameraX; + this._bg.tilePositionX = this._cameraX * 0.1; + this._bg.tilePositionY = this._bgInitY + this._cameraY * 0.1; + this._updateEditorGrid(); + this._updateEditorTimeline(); +}; + +_clearEditorPlaytestMarks = () => { + if (this._editorPlaytestTrailGfx) { + this._editorPlaytestTrailGfx.destroy(); + this._editorPlaytestTrailGfx = null; + } + + if (this._editorPlaytestDeathMarks) { + for (const mark of this._editorPlaytestDeathMarks) { + if (mark && mark.destroy) mark.destroy(); + } + } + + this._editorPlaytestDeathMarks = []; + this._editorPlaytestLastTrailPoint = null; +}; + +_ensureEditorPlaytestTrail = () => { + if (this._editorPlaytestTrailGfx) return this._editorPlaytestTrailGfx; + + const gfx = this.add.graphics(); + gfx.setDepth(100); + this._level.topContainer.add(gfx); + this._editorPlaytestTrailGfx = gfx; + return gfx; +}; + +_drawEditorPlaytestTrailPoint = () => { + if (!this._editorPlaytestActive || !this._player) return; + + const point = { + x: this._playerWorldX, + y: b(this._state.y) + }; + + const last = this._editorPlaytestLastTrailPoint; + if (last) { + const dx = point.x - last.x; + const dy = point.y - last.y; + if ((dx * dx) + (dy * dy) >= 2) { + const gfx = this._ensureEditorPlaytestTrail(); + gfx.lineStyle(2, 0x00ff00, 0.95); + gfx.lineBetween(last.x, last.y, point.x, point.y); + } + } + + this._editorPlaytestLastTrailPoint = point; +}; + +_addEditorPlaytestDeathMark = () => { + const x = this._playerWorldX; + const y = b(this._state.y); + const size = 28; + const mark = this.add.graphics(); + + mark.setDepth(110); + mark.lineStyle(13, 0xff0000, 1); + mark.lineBetween(x - size, y - size, x + size, y + size); + mark.lineBetween(x - size, y + size, x + size, y - size); + + this._level.topContainer.add(mark); + if (!this._editorPlaytestDeathMarks) this._editorPlaytestDeathMarks = []; + this._editorPlaytestDeathMarks.push(mark); +}; + +_resetEditorPlaytestLevelState = () => { + this._level.resetObjects(); + this._level.resetGroundState(); + this._level.resetColorTriggers(); + this._level.resetAlphaTriggers(); + this._level.resetRotateTriggers(); + this._level.resetPulseTriggers(); + this._level.resetEnterEffectTriggers(); + this._level.resetMoveTriggers(); + this._level.resetVisibility(); + + this._colorManager.reset(); + this._level.applyColorChannels(this._colorManager); + this._bg.setTint(this._colorManager.getHex(fs)); + this._level.setGroundColor(this._colorManager.getHex(gs)); +}; + +_refreshEditorCollisionCaches = () => { + if (!this._level) return; + + const liveObjectIds = new Set(); + if (Array.isArray(window.levelObjects)) { + window.levelObjects.forEach((obj, index) => { + if (!obj || !obj.id) return; + const linkedId = Number.isInteger(obj._eeObjectId) ? obj._eeObjectId : index; + liveObjectIds.add(linkedId); + }); + } + + const sourceColliders = Array.isArray(this._level.objects) ? this._level.objects : []; + this._level.objects = sourceColliders.filter(collider => { + if (!collider) return false; + const objectId = Number.isInteger(collider._eeObjectId) ? collider._eeObjectId : -1; + return liveObjectIds.has(objectId); + }); + + this._level._collisionSections = []; + this._level._groupColliders = {}; + + for (const collider of this._level.objects) { + if (!collider) continue; + + if (typeof this._level._addCollisionToSection === "function") { + this._level._addCollisionToSection(collider); + } + + if (Array.isArray(collider._eeGroups)) { + for (const groupId of collider._eeGroups) { + if (!this._level._groupColliders[groupId]) this._level._groupColliders[groupId] = []; + this._level._groupColliders[groupId].push(collider); + } + } + } +}; + +_getEditorSaveIndexForObjectId = (objectId) => { + if (!Array.isArray(window.levelObjects) || !Number.isInteger(objectId)) return -1; + + for (let i = 0; i < window.levelObjects.length; i++) { + const obj = window.levelObjects[i]; + if (obj && Number.isInteger(obj._eeObjectId) && obj._eeObjectId === objectId) { + return i; + } + } + + const fallback = window.levelObjects[objectId]; + return fallback && fallback.id ? objectId : -1; +}; + +_getEditorSaveObjectForObjectId = (objectId) => { + const saveIndex = this._getEditorSaveIndexForObjectId(objectId); + return saveIndex === -1 ? null : window.levelObjects[saveIndex]; +}; + +_getEditorCollidersForObjectId = (objectId) => { + if (!Array.isArray(this._level?.objects) || !Number.isInteger(objectId)) return []; + return this._level.objects.filter(collider => { + if (!collider) return false; + return Number.isInteger(collider._eeObjectId) && collider._eeObjectId === objectId; + }); +}; + +_hideEditorPlaytestGlowLayers = () => { + const hideForPlayer = (player) => { + if (!player) return; + + const glowLayers = [ + player._playerGlowLayer, + player._shipGlowLayer, + player._ballGlowLayer, + player._waveGlowLayer, + player._spiderGlowLayer, + player._birdGlowLayer + ]; + + if (!window.showEditorGlow) { + for (const layer of glowLayers) { + if (layer?.sprite) layer.sprite.setVisible(false); + } + } + + if (player._dashAnimationSprite) { + player._dashAnimationSprite.setVisible(false); + } + }; + + hideForPlayer(this._player); + hideForPlayer(this._player2); +}; + +_hideEditorPlaytestPlayer = () => { + const hidePlayer = (player) => { + if (!player) return; + player.setCubeVisible(false); + player.setShipVisible(false); + player.setBallVisible(false); + player.setWaveVisible(false); + player.setBirdVisible(false); + player.setSpiderVisible(false); + }; + + hidePlayer(this._player); + hidePlayer(this._player2); + this._hideEditorPlaytestGlowLayers(); +}; + +_syncEditorPlaytestPlayerVisual = (deltaSeconds = 0) => { + if (!this._editorPlaytestActive || !this._player || this._state.isDead) return; + + const zoom = this._editorZoom || 1; + const playerScreenX = (this._playerWorldX * zoom) - this._cameraX; + const playerScreenY = (b(this._state.y) * zoom) - this._cameraY; + const playerScreenYCameraOffset = (b(this._state.y) * (zoom - 1)) - this._cameraY; + + this._player.syncSprites( + this._cameraX, + playerScreenYCameraOffset, + deltaSeconds, + this._getMirrorXOffset(playerScreenX) + ); + + if (this._isDual && this._player2 && !this._state2.isDead) { + this._player2.syncSprites( + this._cameraX, + (b(this._state2.y) * (zoom - 1)) - this._cameraY, + deltaSeconds, + this._getMirrorXOffset(playerScreenX) + ); + } + + if (zoom !== 1) { + const scalePlayer = (player, anchorY) => { + for (const layer of (player?._allLayers || [])) { + if (!layer?.sprite) continue; + layer.sprite.x = playerScreenX + ((layer.sprite.x - playerScreenX) * zoom); + layer.sprite.y = anchorY + ((layer.sprite.y - anchorY) * zoom); + layer.sprite.scaleX *= zoom; + layer.sprite.scaleY *= zoom; + } + if (player?._dashAnimationSprite) { + player._dashAnimationSprite.x = playerScreenX + ((player._dashAnimationSprite.x - playerScreenX) * zoom); + player._dashAnimationSprite.y = anchorY + ((player._dashAnimationSprite.y - anchorY) * zoom); + player._dashAnimationSprite.scaleX *= zoom; + player._dashAnimationSprite.scaleY *= zoom; + } + }; + + scalePlayer(this._player, playerScreenY); + if (this._isDual && this._player2 && !this._state2.isDead) { + scalePlayer(this._player2, (b(this._state2.y) * zoom) - this._cameraY); + } + } + + this._hideEditorPlaytestGlowLayers(); +}; + +_applyEditorPlaytestStartMode = () => { + let speedKey = parseInt(window.settingsMap?.["kA4"] || "0", 10); + if (speedKey == 0) { + playerSpeed = SpeedPortal.ONE_TIMES; + } else if (speedKey == 1) { + playerSpeed = SpeedPortal.HALF; + } else if (speedKey == 2) { + playerSpeed = SpeedPortal.TWO_TIMES; + } else if (speedKey == 3) { + playerSpeed = SpeedPortal.THREE_TIMES; + } else if (speedKey == 4) { + playerSpeed = SpeedPortal.FOUR_TIMES; + } + + const gamemode = parseInt(window.settingsMap?.["kA2"] || "0", 10); + if (gamemode == 1) { + this._player.enterShipMode(); + } else if (gamemode == 2) { + this._state.y = 30; + this._player.enterBallMode({ y: 30 }); + } else if (gamemode == 3) { + this._player.enterUfoMode(); + } else if (gamemode == 4) { + this._player.enterWaveMode(); + } else if (gamemode == 6) { + this._player.enterSpiderMode(); + } + + const getBool = (key) => parseInt(window.settingsMap?.[key] || "0", 10) === 1; + this._state.isMini = getBool("kA3"); + this._state.gravityFlipped = getBool("kA11"); + this._state.mirrored = false; + + if (getBool("kA8")) { + this._enableDualMode(); + this._state2.mirrored = false; + } + + this._hideEditorPlaytestGlowLayers(); + this._refreshEditorPlaytestGlowVisibility(); +}; + +_startEditorPlaytest = () => { + if (this._editorPlaytestActive) return; + + this._closeEditorLevelSettingsPopup(); + this._closeEditorHorizontalOptionPopup(); + this._closeEditorColorPickerPopup(); + this._closeEditorStartOptionsPopup(); + this._clearEditorSelection(); + this._clearEditorPlaytestMarks(); + this._refreshEditorCollisionCaches(); + + this._editorPlaytestSavedView = { + zoom: this._editorZoom || 1, + cameraX: this._cameraX || 0, + cameraY: this._cameraY || 0 + }; + this._editorPlaytestPauseView = null; + + this._editorPlaytestActive = true; + this._editorPlaytestPaused = false; + this._spaceWasDown = !!this.input.activePointer?.isDown; + this._deltaBuffer = 0; + this._physicsFrame = 0; + this._playerWorldX = 0; + this._cameraX = -centerX; + this._cameraY = 0; + this._cameraXRef._v = this._cameraX; + this._prevCameraX = this._cameraX; + + this._resetEditorPlaytestLevelState(); + this._state.reset(); + this._player.reset(); + this._isDual = false; + this._state2.reset(); + this._player2.reset(); + this._player2.setCubeVisible(false); + this._player2.setShipVisible(false); + this._player2.setBallVisible(false); + this._player2.setWaveVisible(false); + this._player2.setBirdVisible(false); + this._player2.setSpiderVisible(false); + + this._state.y = 30; + this._state.onGround = true; + this._state.canJump = true; + this._player.setCubeVisible(true); + this._applyEditorPlaytestStartMode(); + this._state.mirrored = false; + this._state2.mirrored = false; + this._bg.setFlipX(false); + this._updateEditorPlaytestCameraY(0, true); + this._setEditorZoomInstant(1, -centerX, this._cameraY); + this._refreshEditorPlaytestGlowVisibility(); + this._audio.reset(); + this._audio.startMusic(0); + this._setEditorPlaytestGuiVisible(false); + this._refreshEditorPlaytestControls(); + this._drawEditorPlaytestTrailPoint(); +}; + +_toggleEditorPlaytestPause = () => { + if (!this._editorPlaytestActive) return; + + if (!this._editorPlaytestPaused) { + this._editorPlaytestPauseView = { + zoom: this._editorZoom || 1, + cameraX: this._cameraX || 0, + cameraY: this._cameraY || 0 + }; + this._editorPlaytestPaused = true; + this._audio.pauseMusic(); + this._setEditorPlaytestGuiVisible(true); + this._setEditorLevelSectionsFullyVisible(); + this._refreshEditorPlaytestControls(); + return; + } + + const resumeView = this._editorPlaytestPauseView || { + zoom: 1, + cameraX: this._playerWorldX - centerX, + cameraY: this._cameraY || 0 + }; + + this._editorPlaytestPaused = false; + this._setEditorPlaytestGuiVisible(false); + this._setEditorZoomInstant(resumeView.zoom || 1, resumeView.cameraX || 0, resumeView.cameraY || 0); + this._cameraXRef._v = this._cameraX; + this._prevCameraX = this._cameraX; + this._resetEditorPlaytestSectionCulling(); + this._editorPlaytestPauseView = null; + this._audio.resumeMusic(); + this._syncEditorPlaytestPlayerVisual(0); + this._refreshEditorPlaytestControls(); +}; + +_stopEditorPlaytest = (leaveDeathMark = false) => { + if (!this._editorPlaytestActive) return; + + if (leaveDeathMark) { + this._addEditorPlaytestDeathMark(); + } + + this._editorPlaytestActive = false; + this._editorPlaytestPaused = false; + this._spaceWasDown = false; + this._deltaBuffer = 0; + + this._audio.reset(); + this._hideEditorPlaytestPlayer(); + this._resetEditorPlaytestLevelState(); + this._refreshEditorPlaytestGlowVisibility(); + + const savedView = this._editorPlaytestSavedView; + const currentZoom = this._editorZoom || 1; + const restoreZoom = savedView?.zoom || currentZoom; + const worldCenterX = (this._cameraX + centerX) / currentZoom; + const worldCenterY = (this._cameraY + (screenHeight / 2)) / currentZoom; + const restoredCameraX = (worldCenterX * restoreZoom) - centerX; + const restoredCameraY = (worldCenterY * restoreZoom) - (screenHeight / 2); + + this._editorPlaytestSavedView = null; + this._editorPlaytestPauseView = null; + this._setEditorZoomInstant(restoreZoom, restoredCameraX, restoredCameraY); + this._setEditorLevelSectionsFullyVisible(); + + this._setEditorPlaytestGuiVisible(true); + this._refreshEditorPlaytestControls(); +}; + +_editorPlaytestPress = () => { + if (this._state.isDead) return; + + this._state.upKeyDown = true; + this._state.upKeyPressed = true; + this._state.queuedHold = true; + + if (!this._state.isFlying && !this._state.isWave && !this._state.isUfo && this._state.canJump) { + this._player.updateJump(0); + } else if (this._state.isUfo) { + this._player.updateJump(0); + } +}; + +_editorPlaytestRelease = () => { + this._state.upKeyDown = false; + this._state.upKeyPressed = false; + this._state.queuedHold = false; +}; + +_updateEditorPlaytestInput = () => { + const pointer = this.input.activePointer; + const hitObjects = this.input.hitTestPointer(pointer); + const overPlaytestControls = hitObjects.some(obj => + obj === this._editorPlaytestPauseBtn || + obj === this._editorPlaytestStopBtn || + obj === this._editorPlaytestPlayBtn + ); + const pointerHeld = pointer.isDown && !overPlaytestControls; + const jumpHeld = this._spaceKey.isDown || this._upKey.isDown || this._wKey.isDown || this._lKey.isDown || pointerHeld; + + if (jumpHeld && !this._spaceWasDown) { + this._editorPlaytestPress(); + } else if (!jumpHeld && this._spaceWasDown) { + this._editorPlaytestRelease(); + } + + this._spaceWasDown = jumpHeld; +}; + +_updateEditorPlaytest = (deltaTime) => { + if (!this._editorPlaytestActive || this._editorPlaytestPaused) return; + + this._updateEditorPlaytestInput(); + this._audio.update(deltaTime / 1000); + this._state.mirrored = false; + this._state2.mirrored = false; + this._bg.setFlipX(false); + this._refreshEditorPlaytestGlowVisibility(); + this._level.updateEndPortalY(-this._cameraY, this._state.isFlying || this._state.isWave || this._state.isUfo); + + let quantizedDelta = this._quantizeDelta(deltaTime); + let subSteps = quantizedDelta > 0 ? Math.max(1, Math.round(quantizedDelta * 4)) : 0; + if (subSteps > 60) subSteps = 60; + + const subStepDelta = subSteps > 0 ? quantizedDelta / subSteps : 0; + const verticalDelta = subStepDelta * d; + const horizontalDelta = subStepDelta * playerSpeed * d; + const previousNoClip = window.noClip; + + window.noClip = false; + + try { + for (let i = 0; i < subSteps; i++) { + this._state.lastY = this._state.y; + this._physicsFrame++; + this._player.updateJump(verticalDelta); + this._state.y += this._state.yVelocity * verticalDelta; + this._player.checkCollisions(this._playerWorldX - centerX); + + if (this._isDual && !this._state2.isDead) { + this._state2.upKeyDown = this._state.upKeyDown; + this._state2.upKeyPressed = this._state.upKeyPressed; + this._state2.queuedHold = this._state.queuedHold; + this._state2.lastY = this._state2.y; + this._player2.updateJump(verticalDelta); + this._state2.y += this._state2.yVelocity * verticalDelta; + this._player2.checkCollisions(this._playerWorldX - centerX); + if (this._state2.isDead && !this._state.isDead) { + this._player.killPlayer(); + } + } + + if (this._state.isDead) break; + + this._playerWorldX += horizontalDelta; + + if (!this._state.isFlying && !this._state.isWave && !this._state.isUfo) { + if (this._state.isBall) { + const ballOnSurface = this._state.onGround || this._state.onCeiling; + this._player.updateBallRoll(horizontalDelta, ballOnSurface); + } else if (this._state.onGround) { + this._player.updateGroundRotation(verticalDelta); + } else if (this._player.rotateActionActive) { + this._player.updateRotateAction(u); + } else if (this._state.isDashing) { + this._player.updateDashRotation(u); + } + } + } + } finally { + window.noClip = previousNoClip; + } + + if (this._state.isDead) { + this._drawEditorPlaytestTrailPoint(); + this._stopEditorPlaytest(true); + return; + } + + this._state.ignorePortals = false; + this._state2.ignorePortals = false; + + this._cameraX = this._playerWorldX - centerX; + this._updateEditorPlaytestCameraY(quantizedDelta); + this._cameraXRef._v = this._cameraX; + + this._level.additiveContainer.x = -this._cameraX; + this._level.additiveContainer.y = -this._cameraY; + this._level.container.x = -this._cameraX; + this._level.container.y = -this._cameraY; + this._level.topContainer.x = -this._cameraX; + this._level.topContainer.y = -this._cameraY; + + const playerX = this._playerWorldX; + for (let colorTrigger of this._level.checkColorTriggers(playerX)) { + this._colorManager.triggerColor(colorTrigger.index, colorTrigger.color, colorTrigger.duration); + if (colorTrigger.tintGround) { + this._colorManager.triggerColor(gs, colorTrigger.color, colorTrigger.duration); + } + } + + this._level.checkMoveTriggers(playerX); + this._level.stepMoveTriggers(deltaTime / 1000); + this._level.checkAlphaTriggers(playerX); + this._level.stepAlphaTriggers(deltaTime / 1000); + this._level.checkRotateTriggers(playerX); + this._level.stepRotateTriggers(deltaTime / 1000); + this._level.checkPulseTriggers(playerX); + this._level.stepPulseTriggers(deltaTime / 1000, this._colorManager); + this._colorManager.step(deltaTime / 1000); + this._level.stepGroundAnimation(deltaTime / 1000); + this._level.applyColorChannels(this._colorManager); + this._bg.setTint(this._colorManager.getHex(fs)); + this._level.setGroundColor(this._colorManager.getHex(gs)); + this._level.updateVisibility(this._cameraX); + this._level.updateObjectDebugIds(); + this._refreshEditorPlaytestGlowVisibility(); + + if (this._state.isFlying) { + this._player.updateShipRotation(quantizedDelta); + } + + this._syncEditorPlaytestPlayerVisual(deltaTime / 1000); + this._drawEditorPlaytestTrailPoint(); + this._updateEditorPlaytestBackground(); +}; + +_adjustZoom = (delta, anchorX = screenWidth / 2, anchorY = screenHeight / 2) => { + if (this._editorPlaytestActive && !this._editorPlaytestPaused) return; + + const oldZoom = this._editorZoom; + let newZoom = oldZoom + delta; + newZoom = Phaser.Math.Clamp(newZoom, 0.1, 4.0); + if (oldZoom === newZoom) return; + const worldAnchorX = (this._cameraX + anchorX) / oldZoom; + const worldAnchorY = (this._cameraY + anchorY) / oldZoom; + this._editorZoom = newZoom; + this._level.topContainer.setScale(newZoom); + this._level.additiveContainer.setScale(newZoom); + this._level.container.setScale(newZoom); + this._cameraX = (worldAnchorX * newZoom) - anchorX; + this._cameraY = (worldAnchorY * newZoom) - anchorY; + this._updateEditorGrid(); + this._zoomText.setText(`Zoom: ${newZoom.toFixed(2)}x`); + this._zoomText.setAlpha(1); + this.tweens.killTweensOf(this._zoomText); + this.tweens.add({ + targets: this._zoomText, + alpha: 0, + duration: 500, + delay: 500, + ease: 'Power1' + }); +}; + +_updateTabVisuals = () => { + Object.keys(this._tabButtons).forEach(id => { + const isSelected = this._editorTab === id; + const btn = this._tabButtons[id]; + let frameName = btn.frame.name.replace("SBtn", "Btn"); + if (isSelected) { + frameName = frameName.replace("Btn", "SBtn"); + } + btn.setFrame(frameName); + }); +}; + +_getSheetForFrameThingy = (frameName) => { + const sheets = ["GJ_WebSheet", "GJ_GameSheet", "GJ_GameSheet02", "GJ_GameSheet03", "GJ_GameSheet04", "GJ_GameSheetEditor"]; + for (const key of sheets) { + if (this.textures.exists(key) && this.textures.get(key).has(frameName)) { + return key; + } + } +}; + +_getTextureRefForFrameThingy = (frameName) => { // getSheetForFrameThingy: the sequel + const sheets = ["GJ_WebSheet", "GJ_GameSheet", "GJ_GameSheet02", "GJ_GameSheet03", "GJ_GameSheet04", "GJ_GameSheetEditor"]; + for (const key of sheets) { + if (this.textures.exists(key) && this.textures.get(key).has(frameName)) { + return { + key, + frame: frameName + }; + } + } + if (this.textures.exists(frameName)) { + return { + key: frameName, + frame: null + }; + } + return null; +}; + +_createEditorObjectButtonPreview = (x, y, objId) => { + const objectDef = getObjectFromId(objId); + if (!objectDef) return null; + + let frameName = objectDef.frame; + + if (objectDef.randomFrames && objectDef.randomFrames.length) { + frameName = objectDef.randomFrames[0]; + } + + if (!frameName) return null; + + // Object-sheet images created below are UI icons, not in-game objects + this._uhdPreviewIcons = true; + + const previewObj = { + id: objId, + x: 0, + y: 0, + flipX: false, + flipY: false, + rot: 0, + scale: 1, + zLayer: objectDef.default_z_layer || 0, + zOrder: objectDef.default_z_order || 0, + groups: "", + color1: 0, + color2: 0, + _raw: {} + }; + + const preview = this.add.container(x, y); + const sprites = []; + + const addPreviewSprite = (frame, localX = 0, localY = 0, colorData = null, previewDepth = 0, extra = {}) => { + const tex = this._getTextureRefForFrameThingy(frame); + if (!tex) return null; + + const spr = tex.frame + ? this.add.image(localX, localY, tex.key, tex.frame) + : this.add.image(localX, localY, tex.key); + + if (!spr) return null; + + if (this._level && this._level._applyVisualProps) { + this._level._applyVisualProps(this, spr, frame, previewObj, colorData); + } + + if (extra.blendMode !== undefined) { + spr.setBlendMode(extra.blendMode); + } + + if (extra.tint !== undefined) { + spr.setTint(extra.tint); + } + + if (extra.rotationOffset !== undefined) { + spr.rotation += extra.rotationOffset; + } + + spr._editorPreviewDepth = previewDepth; + sprites.push(spr); + + return spr; + }; + + const isPortalFront = + (objectDef.type === portalType || objectDef.type === speedType) && + frameName.includes("_front_"); + + let portalBackSprite = null; + + if (isPortalFront) { + const backFrame = frameName.replace("_front_", "_back_"); + if (this._getTextureRefForFrameThingy(backFrame)) { + portalBackSprite = addPreviewSprite(backFrame, 0, 0, null, -0.005); + } + } + + let glowSprite = null; + + if ( + false && + objectDef.glow && + this._level && + this._level._getGlowFrameName + ) { + const glowFrame = this._level._getGlowFrameName(frameName); + + if (glowFrame && this._getTextureRefForFrameThingy(glowFrame)) { + glowSprite = addPreviewSprite(glowFrame, 0, 0, null, -0.003, { + blendMode: S + }); + } + } + + const visualDef = isPortalFront + ? { + ...objectDef, + _portalFront: true + } + : objectDef; + + const mainSprite = addPreviewSprite(frameName, 0, 0, visualDef, 0); + + if (mainSprite && portalBackSprite) { + portalBackSprite.x = mainSprite.x; + portalBackSprite.y = mainSprite.y; + } + + if (objectDef.type === ringType) { + if (mainSprite) mainSprite.setScale(0.75); + if (glowSprite) glowSprite.setScale(0.75); + } + + if (frameName.indexOf("sawblade") >= 0 && mainSprite) { + mainSprite.setTint(0x000000); + + const sawMirror = addPreviewSprite(frameName, 0, 0, objectDef, 0.001, { + tint: 0x000000, + rotationOffset: Math.PI + }); + + if (sawMirror) { + sawMirror.x = mainSprite.x; + sawMirror.y = mainSprite.y; + } + } + + if (objectDef.type === solidType || objectDef.type === hazardType) { + const overlayFrame = frameName.replace("_001.png", "_2_001.png"); + + if (this._getTextureRefForFrameThingy(overlayFrame)) { + addPreviewSprite(overlayFrame, 0, 0, null, 0.002); + } + } + + if (objectDef.children) { + for (const childDef of objectDef.children) { + let childDx = childDef.dx || 0; + let childDy = childDef.dy || 0; + + if (childDef.localDx !== undefined || childDef.localDy !== undefined) { + let localDx = childDef.localDx || 0; + let localDy = childDef.localDy || 0; + + if (previewObj.flipX) localDx = -localDx; + if (previewObj.flipY) localDy = -localDy; + + const rot = (previewObj.rot || 0) * Math.PI / 180; + + childDx = localDx * Math.cos(rot) - localDy * Math.sin(rot); + childDy = localDx * Math.sin(rot) + localDy * Math.cos(rot); + } + + const childDepth = + (childDef.z !== undefined ? childDef.z : -1) < 0 + ? -0.003 + : 0.001; + + const childSprite = addPreviewSprite( + childDef.frame, + childDx, + childDy, + childDef, + childDepth + ); + + if (childSprite && childDef.audioScale) { + childSprite.setScale(0.1); + childSprite.setAlpha(0.9); + } + + if (frameName.indexOf("sawblade") >= 0 && childSprite) { + childSprite.setTint(0x000000); + + const childMirror = addPreviewSprite( + childDef.frame, + childDx, + childDy, + childDef, + childDepth + 0.001, + { + tint: 0x000000, + rotationOffset: Math.PI + } + ); + + if (childMirror) { + childMirror.x = childSprite.x; + childMirror.y = childSprite.y; + } + } + } + } + + if (!sprites.length) { + this._uhdPreviewIcons = false; + preview.destroy(); + return null; + } + + sprites.sort((a, b) => { + return (a._editorPreviewDepth || 0) - (b._editorPreviewDepth || 0); + }); + + preview.add(sprites); + + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + + for (const spr of sprites) { + const displayW = spr.displayWidth || spr.width || 1; + const displayH = spr.displayHeight || spr.height || 1; + + const left = spr.x - displayW * spr.originX; + const right = spr.x + displayW * (1 - spr.originX); + const top = spr.y - displayH * spr.originY; + const bottom = spr.y + displayH * (1 - spr.originY); + + minX = Math.min(minX, left); + maxX = Math.max(maxX, right); + minY = Math.min(minY, top); + maxY = Math.max(maxY, bottom); + } + + const visualW = Math.max(1, maxX - minX); + const visualH = Math.max(1, maxY - minY); + + const targetSize = 64; + const maxDim = Math.max(visualW, visualH); + const scaleMultiplier = targetSize / maxDim; + + preview.setScale(Math.min(scaleMultiplier, 0.6)); + + this._uhdPreviewIcons = false; + return preview; +}; + +_buildObjectGrid = () => { + if (this._gridContainer) this._gridContainer.destroy(); + if (this._pageDotsContainer) this._pageDotsContainer.destroy(); + if (this._categoryContainer) this._categoryContainer.destroy(); + + const OBJECT_CATEGORIES = [ + { id: "blocks", icon: "tab1", types: ["solid", "slope"] }, + { id: "hazards", icon: "tab2", types: ["hazard", "spike"] }, + { id: "orbs", icon: "tab3", types: ["ring", "pad", "portal", "speed"] }, + { id: "deco", icon: "tab4", types: ["deco"] }, + { id: "triggers",icon: "tab5", types: ["trigger"] }, + ]; + + this._gridContainer = this.add.container(0, 0); + this._toolbox.add(this._gridContainer); + + const allObjectsData = window.allobjects(); + const itemsForGrid = []; + this._currentBuildCategory = this._currentBuildCategory || "blocks"; + + if (this._editorTab === "build") { + this._categoryContainer = this.add.container(screenWidth / 2, screenHeight - 218); + this._toolbox.add(this._categoryContainer); + const catSpacing = 85; + const catStartX = -((OBJECT_CATEGORIES.length - 1) * catSpacing) / 2; + OBJECT_CATEGORIES.forEach((cat, i) => { + const isSelected = this._currentBuildCategory === cat.id; + const btn = this.add.image(catStartX + (i * catSpacing), 0, cat.icon).setInteractive().setScale(0.12).setTint(isSelected ? 0x888888 : 0xffffff).setAlpha(isSelected ? 1 : 0.33); + this._categoryContainer.add(btn); + this._makeBouncyButton(btn, 0.12, () => { + this._currentBuildCategory = cat.id; + this._editorPage = 0; + this._buildObjectGrid(); + }); + }); + const activeCatDef = OBJECT_CATEGORIES.find(c => c.id === this._currentBuildCategory); + for (let i = 1; i <= this._totalIds; i++) { + const def = getObjectFromId(i); + const rawDef = allObjectsData[String(i)]; + + if (def && rawDef) { + if (activeCatDef.types.includes(rawDef.type)) { + itemsForGrid.push({ type: "object", id: i, frame: def.frame }); + } + } + } + } else if (this._editorTab === "edit") { + const moveActions = [ + { dx: 0, dy: -3, icon: "edit_upBtn_001.png", angle: 0, scale: 1, flipX: false }, + { dx: 0, dy: 3, icon: "edit_upBtn_001.png", angle: 180, scale: 1, flipX: false }, + { dx: -3, dy: 0, icon: "edit_upBtn_001.png", angle: 270, scale: 1, flipX: false }, + { dx: 3, dy: 0, icon: "edit_upBtn_001.png", angle: 90, scale: 1, flipX: false }, + + { dx: 0, dy: -60, icon: "edit_upBtn2_001.png", angle: 90, scale: 1, flipX: false }, + { dx: 0, dy: 60, icon: "edit_upBtn2_001.png", angle: 270, scale: 1, flipX: false }, + { dx: -60, dy: 0, icon: "edit_upBtn2_001.png", angle: 0, scale: 1, flipX: false }, + { dx: 60, dy: 0, icon: "edit_upBtn2_001.png", angle: 180, scale: 1, flipX: false }, + + { dx: 0, dy: -300, icon: "edit_upBtn3_001.png", angle: 90, scale: 1, flipX: false }, + { dx: 0, dy: 300, icon: "edit_upBtn3_001.png", angle: 270, scale: 1, flipX: false }, + { dx: -300, dy: 0, icon: "edit_upBtn3_001.png", angle: 0, scale: 1, flipX: false }, + { dx: 300, dy: 0, icon: "edit_upBtn3_001.png", angle: 180, scale: 1, flipX: false }, + + { dx: 0, dy: -1, icon: "edit_upBtn_001.png", angle: 0, scale: 0.7, flipX: false }, + { dx: 0, dy: 1, icon: "edit_upBtn_001.png", angle: 180, scale: 0.7, flipX: false }, + { dx: -1, dy: 0, icon: "edit_upBtn_001.png", angle: 270, scale: 0.7, flipX: false }, + { dx: 1, dy: 0, icon: "edit_upBtn_001.png", angle: 90, scale: 0.7, flipX: false }, + + { dx: 0, dy: -30, icon: "edit_upBtn5_001.png", angle: 0, scale: 1, flipX: false }, + { dx: 0, dy: 30, icon: "edit_upBtn5_001.png", angle: 180, scale: 1, flipX: false }, + { dx: -30, dy: 0, icon: "edit_upBtn5_001.png", angle: 270, scale: 1, flipX: false }, + { dx: 30, dy: 0, icon: "edit_upBtn5_001.png", angle: 90, scale: 1, flipX: false } + ]; + moveActions.forEach(a => itemsForGrid.push({ type: "action", subType: "move", ...a })); + + const flipActions = [ + { axis: "x", icon: "edit_flipYBtn_001.png", angle: 90, scale: 0.8, flipX: false }, + { axis: "y", icon: "edit_flipXBtn_001.png", angle: 90, scale: 0.8, flipX: false } + ]; + flipActions.forEach(a => itemsForGrid.push({ type: "action", subType: "flip", ...a })); + + const rotateActions = [ + { degrees: 90, icon: "edit_ccwBtn_001.png", angle: 0, scale: 0.8, flipX: true }, + { degrees: -90, icon: "edit_ccwBtn_001.png", angle: 0, scale: 0.8, flipX: false }, + { degrees: 45, icon: "edit_rotate45rBtn_001.png", angle: 0, scale: 0.85, flipX: false }, + { degrees: -45, icon: "edit_rotate45lBtn_001.png", angle: 0, scale: 0.85, flipX: false } + ]; + rotateActions.forEach(a => itemsForGrid.push({ type: "action", subType: "rotate", ...a })); + } else if (this._editorTab === "delete") { + itemsForGrid.push({ + type: "delete", + icon: "edit_delBtn_001.png" + }); + } + + if (this._editorTab === "build") { + window.totalPages = Math.ceil(itemsForGrid.length / this._maxPerPage); + } else if (this._editorTab === "edit") { + window.totalPages = 3; + } else if (this._editorTab === "delete"){ + window.totalPages = 1; + } + + if (this._editorPage >= window.totalPages) this._editorPage = 0; + + const showArrows = this._editorTab !== "delete"; + if (this._leftArrow) { + this._leftArrow.setVisible(showArrows); + this._leftArrow.disableInteractive(); + if (showArrows) this._leftArrow.setInteractive(); + } + if (this._rightArrow) { + this._rightArrow.setVisible(showArrows); + this._rightArrow.disableInteractive(); + if (showArrows) this._rightArrow.setInteractive(); + } + + if (showArrows) { + this._makeBouncyButton(this._leftArrow, 0.8, () => { + if (this._editorTab === "edit") { + this._editorPage = (this._editorPage > 0) ? this._editorPage - 1 : 2; + } else { + this._editorPage = (this._editorPage > 0) ? this._editorPage - 1 : window.totalPages - 1; + } + + this._buildObjectGrid(); + }); + + this._makeBouncyButton(this._rightArrow, 0.8, () => { + this._editorPage = (this._editorPage < window.totalPages - 1) ? this._editorPage + 1 : 0; + this._buildObjectGrid(); + }); + } + + if (this._editorTab !== "delete") { + this._pageDotsContainer = this.add.container(0, 0); + this._toolbox.add(this._pageDotsContainer); + + const dotSpacing = 18; + const dotsStartX = (screenWidth / 2) - ((window.totalPages - 1) * dotSpacing) / 2; + const dotsY = screenHeight - 10; + + for (let i = 0; i < window.totalPages; i++) { + const dot = this.add.circle( + dotsStartX + (i * dotSpacing), + dotsY, + 4, + i === this._editorPage ? 0xffffff : 0x888888 + ); + if (i === this._editorPage) { + dot.setStrokeStyle(1, 0xffffff, 0.5); + } + this._pageDotsContainer.add(dot); + } + } + + const startIdx = this._editorPage * this._maxPerPage; + const pageItems = this._editorTab === "delete" + ? itemsForGrid + : itemsForGrid.slice(startIdx, startIdx + this._maxPerPage); + + const paddingX = 90; + const paddingY = 80; + const cols = 6; + const startX = (screenWidth / 2) - ((cols - 1) * paddingX) / 2; + const startY = screenHeight - 140; + + pageItems.forEach((item, index) => { + const col = index % cols; + const row = Math.floor(index / cols); + + const x = startX + (col * paddingX); + const y = startY + (row * paddingY); + + if (item.type === "object") { + const btnBg = this.add.image(x, y, "GJ_GameSheet03", "GJ_checkOff_001.png").setScale(1.2).setInteractive(); + const icon = this._createEditorObjectButtonPreview(x, y, item.id); + if (window.selectedObjId === item.id) { + btnBg.setTint(0x888888); + } + this._gridContainer.add(btnBg); + if (icon) { + this._gridContainer.add(icon); + } + this._makeCompositeBouncyButton(btnBg, [btnBg, icon], 1.2, () => { + window.selectedObjId = item.id; + this._buildObjectGrid(); + }); + } else if (item.type === "action") { + const btn = this.add.image(x, y, "GJ_button01") + .setInteractive() + .setScale(0.92); + + const icon = this.add.image(x, y, "GJ_GameSheet03", item.icon) + .setAngle(item.angle) + .setScale(item.scale) + .setFlipX(item.flipX); + + this._gridContainer.add([btn, icon]); + + this._makeCompositeBouncyButton(btn, [btn, icon], 0.92, () => { + if (item.subType === "move") { + this._moveObject(item.dx, item.dy); + } else if (item.subType === "rotate") { + this._rotateObject(item.degrees); + } else if (item.subType === "flip") { + this._flipObject(item.axis); + } + }); + } else if (item.type === "delete") { + const btnBg = this.add.image(x, y, "GJ_GameSheet03", "GJ_checkOff_001.png").setScale(1.2).setInteractive(); + + const icon = this.add.image(x, y, "GJ_GameSheet03", item.icon); + + this._deleteGridButton = btnBg; + + this._gridContainer.add([btnBg, icon]); + + this._makeCompositeBouncyButton(btnBg, [btnBg, icon], 1.2, () => { + this._deleteSelectedObject(); + }); + + this._updateEditorActionButtons(); + } + }); +}; + +_moveObject = (dx, dy) => { + const selectedObjectId = window.editorSelectedObject; + if (selectedObjectId === -1) return; + + const sprites = this._level.objectSprites[selectedObjectId]; + const saveObj = this._getEditorSaveObjectForObjectId(selectedObjectId); + const colliders = this._getEditorCollidersForObjectId(selectedObjectId); + + if (!saveObj) return; + + for (const collider of colliders) { + collider.x += dx; + collider.y += dy; + collider._baseX = (collider._baseX ?? collider.x - dx) + dx; + collider._baseY = (collider._baseY ?? collider.y - dy) + dy; + collider._origBaseX = (collider._origBaseX ?? collider.x - dx) + dx; + collider._origBaseY = (collider._origBaseY ?? collider.y - dy) + dy; + } + + saveObj.x += dx / 2; + saveObj.y -= dy / 2; + if (saveObj._raw) { + saveObj._raw["2"] = String(saveObj.x); + saveObj._raw["3"] = String(saveObj.y); + } + + if (sprites) { + for (const s of sprites) { + if (!s) continue; + s.x += dx; + s.y += dy; + if (s._eeWorldX !== undefined) s._eeWorldX += dx; + if (s._eeBaseY !== undefined) s._eeBaseY += dy; + if (s._origWorldX !== undefined) s._origWorldX += dx; + if (s._origBaseY !== undefined) s._origBaseY += dy; + } + } + + this._refreshEditorCollisionCaches(); +}; + +_rotateObject = (degrees) => { + const selectedObjectId = window.editorSelectedObject; + if (selectedObjectId === -1) return; + + const sprites = this._level.objectSprites[selectedObjectId]; + const saveObj = this._getEditorSaveObjectForObjectId(selectedObjectId); + const colliders = this._getEditorCollidersForObjectId(selectedObjectId); + + if (!saveObj) return; + + saveObj.rot = (saveObj.rot || 0) + degrees; + + if (saveObj._raw) { + saveObj._raw["6"] = String(saveObj.rot); + } + + for (const collider of colliders) { + collider.rotation = saveObj.rot; + collider.rotationDegrees = saveObj.rot; + } + + if (sprites) { + for (const s of sprites) { + if (!s) continue; + s.angle += degrees; + } + } + + // Pads re-seat against the cell wall their base now faces (like real GD): + // rot 0 = bottom, 90 = left wall, 180 = top, 270 = right wall + const _rotDef = getObjectFromId(saveObj.id); + if (_rotDef && _rotDef.type === "pad") { + const _off = 15 - (_rotDef.gridH || 0.2) * 15; + const _seat = (r) => { + r = ((r % 360) + 360) % 360; + if (r === 90) return { x: -_off, y: 0 }; + if (r === 180) return { x: 0, y: _off }; + if (r === 270) return { x: _off, y: 0 }; + return { x: 0, y: -_off }; + }; + const _prev = _seat(saveObj.rot - degrees); + const _next = _seat(saveObj.rot); + const _dxPx = (_next.x - _prev.x) * 2; + const _dyPx = -(_next.y - _prev.y) * 2; + if (_dxPx || _dyPx) this._moveObject(_dxPx, _dyPx); + } + + this._refreshEditorCollisionCaches(); +}; + +_flipObject = (axis) => { + const selectedObjectId = window.editorSelectedObject; + if (selectedObjectId === -1) return; + + const sprites = this._level.objectSprites[selectedObjectId]; + const saveObj = this._getEditorSaveObjectForObjectId(selectedObjectId); + const colliders = this._getEditorCollidersForObjectId(selectedObjectId); + + if (!saveObj) return; + + if (axis === "x") { + saveObj.flipX = !saveObj.flipX; + if (saveObj._raw) saveObj._raw["4"] = saveObj.flipX ? "1" : "0"; + + if (sprites) { + for (const s of sprites) { + if (!s) continue; + s.setFlipX(!s.flipX); + s.angle = -s.angle; + } + } + } else { + saveObj.flipY = !saveObj.flipY; + if (saveObj._raw) saveObj._raw["5"] = saveObj.flipY ? "1" : "0"; + + if (sprites) { + for (const s of sprites) { + if (!s) continue; + s.setFlipY(!s.flipY); + s.angle = -s.angle; + } + } + + for (const collider of colliders) { + collider.flipY = saveObj.flipY; + } + } + + saveObj.rot = -saveObj.rot; + if (saveObj._raw) saveObj._raw["6"] = String(saveObj.rot || 0); + for (const collider of colliders) { + collider.rotation = saveObj.rot; + collider.rotationDegrees = saveObj.rot; + } + this._refreshEditorCollisionCaches(); +}; + +_clearEditorSelection = () => { + if (this._currentSelectedSprites) { + for (const spr of this._currentSelectedSprites) { + if (!spr) continue; + + if (spr._editorPrevTint !== undefined && spr._editorPrevTint !== null) { + spr.setTint(spr._editorPrevTint); + } else { + spr.clearTint(); + } + + delete spr._editorPrevTint; + } + } + + this._currentSelectedSprites = []; + this._currentSelectedSprite = null; + window.editorSelectedObject = -1; + this._updateEditorActionButtons(); +}; + +_selectEditorObjectByIndex = (index) => { + this._clearEditorSelection(); + + const linkedSprites = this._level.objectSprites[index]; + if (!linkedSprites || !linkedSprites.length) return; + + for (const spr of linkedSprites) { + if (!spr) continue; + + if (spr._editorPrevTint === undefined) { + spr._editorPrevTint = + spr.tintTopLeft !== undefined + ? spr.tintTopLeft + : null; + } + + spr.setTint(0x00ff00); + this._currentSelectedSprites.push(spr); + } + + this._currentSelectedSprite = linkedSprites[0]; + window.editorSelectedObject = index; + this._updateEditorActionButtons(); +}; + +_duplicateSelectedObject = () => { + const selectedObjectId = window.editorSelectedObject; + if (selectedObjectId === -1) return; + + const src = this._getEditorSaveObjectForObjectId(selectedObjectId); + if (!src) { + this._clearEditorSelection(); + return; + } + + const clone = JSON.parse(JSON.stringify(src)); + delete clone._eeObjectId; + + window.levelObjects.push(clone); + this._level._spawnObject(clone); + + const newObjectId = Number.isInteger(clone._eeObjectId) + ? clone._eeObjectId + : Math.max(0, (this._level._nextObjectId || 1) - 1); + const newestSprites = this._level.objectSprites[newObjectId]; + + if (newestSprites && newestSprites.length) { + const depthBase = { + "-3": -6, + "-1": -3, + 0: 0, + 1: 3, + 3: 6, + 5: 9 + }; + + const finalDepth = + (depthBase[clone.zLayer] || 0) + + (clone.zOrder * 0.01); + + for (const spr of newestSprites) { + if (!spr) continue; + + spr.setDepth((spr._eeZDepth || finalDepth) + 10); + + if (spr._eeLayer === 2) { + if (this._level.topContainer && !this._level.topContainer.exists(spr)) { + this._level.topContainer.add(spr); + } + } else if (this._level.container && !this._level.container.exists(spr)) { + this._level.container.add(spr); + } + } + } + + this._selectEditorObjectByIndex(newObjectId); + this._refreshEditorCollisionCaches(); + this._buildObjectGrid(); +}; + +_deleteSelectedObject = () => { + const selectedObjectId = window.editorSelectedObject; + if (selectedObjectId === -1) return; + + const saveIndex = this._getEditorSaveIndexForObjectId(selectedObjectId); + + this._clearEditorSelection(); + + const sprites = this._level.objectSprites[selectedObjectId] || []; + for (const spr of sprites) { + if (spr && spr.destroy) spr.destroy(); + } + + if (Array.isArray(this._level.objectSprites)) { + this._level.objectSprites[selectedObjectId] = null; + } + + if (Array.isArray(this._level.objects)) { + this._level.objects = this._level.objects.filter(collider => { + if (!collider) return false; + const objectId = Number.isInteger(collider._eeObjectId) ? collider._eeObjectId : -1; + return objectId !== selectedObjectId; + }); + } + + if (Array.isArray(window.levelObjects) && saveIndex !== -1) { + window.levelObjects[saveIndex] = null; + } + + this._refreshEditorCollisionCaches(); + this._buildObjectGrid(); + this._updateEditorActionButtons(); +}; + +_updateEditorActionButtons = () => { + const hasSelection = window.editorSelectedObject !== -1; + const alpha = hasSelection ? 1 : 0.5; + + if (this._copyPasteBtn) { + this._copyPasteBtn.setAlpha(alpha); + + if (hasSelection) { + this._copyPasteBtn.setInteractive(); + } else { + this._copyPasteBtn.disableInteractive(); + } + } + + if (this._deselectBtn) { + this._deselectBtn.setAlpha(alpha); + + if (hasSelection) { + this._deselectBtn.setInteractive(); + } else { + this._deselectBtn.disableInteractive(); + } + } + + if (this._deleteButton) { + this._deleteButton.setAlpha(alpha); + + if (hasSelection) { + this._deleteButton.setInteractive(); + } else { + this._deleteButton.disableInteractive(); + } + } + + if (this._editorTab == "delete") { + this._deleteGridButton.setAlpha(alpha); + + if (hasSelection) { + this._deleteGridButton.setInteractive(); + } else { + this._deleteGridButton.disableInteractive(); + } + } +}; + +_updateEditorGrid = () => { + if (!this._editorGridGraphics) return; + const g = this._editorGridGraphics; + g.clear(); + const zoom = this._editorZoom || 1.0; + const gridSize = 60; + g.lineStyle(1, 0x000000, 0.4); + + const camX = this._cameraX / zoom; + const camY = this._cameraY / zoom; + const offsetX = -camX % gridSize; + const offsetY = (-camY - 20) % gridSize; + for (let x = offsetX; x < screenWidth / zoom + gridSize; x += gridSize) { + g.lineBetween(x * zoom, 0, x * zoom, screenHeight); + } + for (let y = offsetY; y < screenHeight / zoom + gridSize; y += gridSize) { + g.lineBetween(0, y * zoom, screenWidth, y * zoom); + } + g.lineStyle(1, 0xffffff, 1); + + const startLineX = (0 * zoom) - this._cameraX; + if (startLineX >= -50 && startLineX <= screenWidth + 50) { + g.lineBetween(startLineX, 0, startLineX, screenHeight); + } + let worldGroundY = -20 + (60 * 8); + if (this._editorPlaytestActive && this._level?.getFloorY) { + const floorY = this._level.getFloorY(); + if (floorY !== null && floorY !== undefined && Number.isFinite(floorY)) { + worldGroundY = b(floorY); + } + } + const groundLineY = (worldGroundY * zoom) - this._cameraY; + if (groundLineY >= -50 && groundLineY <= screenHeight + 50) { + g.lineBetween(0, groundLineY, screenWidth, groundLineY); + } + + if (this._editorPlaytestActive && this._level?.getCeilingY) { + const ceilingY = this._level.getCeilingY(); + if (ceilingY !== null && ceilingY !== undefined) { + const ceilingLineY = (b(ceilingY) * zoom) - this._cameraY; + if (ceilingLineY >= -50 && ceilingLineY <= screenHeight + 50) { + g.lineBetween(0, ceilingLineY, screenWidth, ceilingLineY); + } + } + } +}; + +_editorAction = () => { + if (this._editorPlaytestActive && !this._editorPlaytestPaused) return; + + if (this._editorTab === "build") { + this._placeObject(); + } else if (this._editorTab === "edit") { + this._selectObjectAtPointer(); + } else if (this._editorTab === "delete") { + this._deleteObjectAtPointer(); + } +} + +_placeObject = () => { + const pointer = this.input.activePointer; + + const worldX = (this.input.activePointer.x + this._cameraX) / this._editorZoom; + const worldY = (this.input.activePointer.y + this._cameraY) / this._editorZoom; + + const snapX = Math.floor(worldX / 60) * 60; + const snapY = Math.floor((worldY + 20) / 60) * 60; + + const transformedX = (snapX / 2) + 15; + let transformedY = -(snapY / 2) + 225; + + const objId = window.selectedObjId; + const objectDef = getObjectFromId(objId); + + if (!objectDef) return; + + // Pads sit flush against the cell's bottom edge like real GD, not centered + // (rotating one re-seats it against the matching cell wall — see _rotateObject) + if (objectDef.type === "pad") { + transformedY -= 15 - (objectDef.gridH || 0.2) * 15; + } + + const saveData = { + id: objId, + x: transformedX, + y: transformedY, + flipX: false, + flipY: false, + rot: 0, + scale: 1, + zLayer: objectDef.default_z_layer || 0, + zOrder: objectDef.default_z_order || 0, + groups: "", + color1: 0, + color2: 0, + gameMode: 0, + miniMode: 0, + speed: 0, + mirrored: 0, + flipGravity: false, + _raw: { + "1": String(objId), + "2": String(transformedX), + "3": String(transformedY), + "4": "0", + "5": "0", + "6": "0", + "21": "0", + "22": "0", + "24": String(objectDef.default_z_layer || 0), + "25": String(objectDef.default_z_order || 0), + "32": "1", + "57": "", + "kA2": "0", + "kA3": "0", + "kA4": "0", + "kA28": "0", + "kA11": "0" + } + }; + + window.levelObjects.push(saveData); + this._level._spawnObject(saveData); + + // teleport portal pairing + if (objId === 747) { + const outData = JSON.parse(JSON.stringify(saveData)); + outData.id = 749; + outData._raw["1"] = "749"; + window.levelObjects.push(outData); + this._level._spawnObject(outData); + const outIndex = this._level.objectSprites.length - 1; + this._selectEditorObjectByIndex(outIndex); + } + + const placedIndex = Math.max(0, (this._level._nextObjectId || 1) - 1); + const newestSprites = this._level.objectSprites[placedIndex]; + + if (newestSprites && newestSprites.length) { + const depthBase = { + "-3": -6, + "-1": -3, + 0: 0, + 1: 3, + 3: 6, + 5: 9 + }; + + const finalDepth = + (depthBase[saveData.zLayer] || 0) + + (saveData.zOrder * 0.01); + + for (const spr of newestSprites) { + if (!spr) continue; + + spr.setDepth((spr._eeZDepth || finalDepth) + 10); + + if (spr._eeLayer === 2) { + if (this._level.topContainer && !this._level.topContainer.exists(spr)) { + this._level.topContainer.add(spr); + } + } else { + if (this._level.container && !this._level.container.exists(spr)) { + this._level.container.add(spr); + } + } + } + } + + if (this._currentSelectedSprites) { + for (const spr of this._currentSelectedSprites) { + if (!spr) continue; + + if (spr._editorPrevTint !== undefined && spr._editorPrevTint !== null) { + spr.setTint(spr._editorPrevTint); + } else { + spr.clearTint(); + } + + delete spr._editorPrevTint; + } + } + + this._currentSelectedSprites = []; + if (newestSprites && newestSprites.length) { + for (const spr of newestSprites) { + if (!spr) continue; + + if (spr._editorPrevTint === undefined) { + spr._editorPrevTint = + spr.tintTopLeft !== undefined + ? spr.tintTopLeft + : null; + } + + spr.setTint(0x00ff00); + + this._currentSelectedSprites.push(spr); + } + + this._currentSelectedSprite = newestSprites[0]; + window.editorSelectedObject = placedIndex; + } + this._updateEditorActionButtons(); +}; + +_selectObjectAtPointer = () => { + const pointer = this.input.activePointer; + + if (this._currentSelectedSprites) { + for (const spr of this._currentSelectedSprites) { + if (!spr) continue; + + if (spr._editorPrevTint !== undefined && spr._editorPrevTint !== null) { + spr.setTint(spr._editorPrevTint); + } else { + spr.clearTint(); + } + + delete spr._editorPrevTint; + } + } + + this._currentSelectedSprites = []; + this._currentSelectedSprite = null; + window.editorSelectedObject = -1; + + let foundObjectIndex = -1; + + for (let i = this._level.objectSprites.length - 1; i >= 0; i--) { + const spriteList = this._level.objectSprites[i]; + + if (!spriteList || !spriteList.length) continue; + + for (let j = spriteList.length - 1; j >= 0; j--) { + const spr = spriteList[j]; + + if (!spr || !spr.active || !spr.visible) continue; + + const bounds = spr.getBounds(); + + if (bounds.contains(pointer.x, pointer.y)) { + foundObjectIndex = i; + break; + } + } + + if (foundObjectIndex !== -1) { + break; + } + } + + if (foundObjectIndex === -1) { + return; + } + const linkedSprites = this._level.objectSprites[foundObjectIndex]; + if (!linkedSprites || !linkedSprites.length) { + return; + } + for (const spr of linkedSprites) { + if (!spr) continue; + if (spr._editorPrevTint === undefined) { + spr._editorPrevTint = + spr.tintTopLeft !== undefined + ? spr.tintTopLeft + : null; + } + spr.setTint(0x00ff00); + this._currentSelectedSprites.push(spr); + } + + this._currentSelectedSprite = linkedSprites[0]; + window.editorSelectedObject = foundObjectIndex; + this._updateEditorActionButtons(); +}; + +_deleteObjectAtPointer = () => { + const pointer = this.input.activePointer; + + let foundObjectIndex = -1; + + for (let i = this._level.objectSprites.length - 1; i >= 0; i--) { + const spriteList = this._level.objectSprites[i]; + if (!spriteList || !spriteList.length) continue; + + for (let j = spriteList.length - 1; j >= 0; j--) { + const spr = spriteList[j]; + if (!spr || !spr.active || !spr.visible) continue; + + const bounds = spr.getBounds(); + if (bounds.contains(pointer.x, pointer.y)) { + foundObjectIndex = i; + break; + } + } + + if (foundObjectIndex !== -1) break; + } + + if (foundObjectIndex === -1) return; + + const saveIndex = this._getEditorSaveIndexForObjectId(foundObjectIndex); + + if (window.editorSelectedObject === foundObjectIndex) { + this._clearEditorSelection(); + } + + const linkedSprites = this._level.objectSprites[foundObjectIndex] || []; + + for (const spr of linkedSprites) { + if (spr && spr.destroy) spr.destroy(); + } + + if (Array.isArray(this._level.objectSprites)) { + this._level.objectSprites[foundObjectIndex] = null; + } + + if (Array.isArray(this._level.objects)) { + this._level.objects = this._level.objects.filter(collider => { + if (!collider) return false; + const objectId = Number.isInteger(collider._eeObjectId) ? collider._eeObjectId : -1; + return objectId !== foundObjectIndex; + }); + } + + if (Array.isArray(window.levelObjects) && saveIndex !== -1) { + window.levelObjects[saveIndex] = null; + } + + this._refreshEditorCollisionCaches(); + window.editorSelectedObject = -1; + this._updateEditorActionButtons(); +}; + +_closeEditorLevelSettingsPopup = () => { + this._editorTextInputFocused = false; + + if (!this._editorLevelSettingsPopup) return; + + this._closeEditorHorizontalOptionPopup(); + this._closeEditorColorPickerPopup(); + + if (this._editorLevelSettingsKeyHandler) { + window.removeEventListener("keydown", this._editorLevelSettingsKeyHandler); + this._editorLevelSettingsKeyHandler = null; + } + + this._editorLevelSettingsPopup.destroy(); + this._editorLevelSettingsPopup = null; +}; + +_closeEditorHorizontalOptionPopup = () => { + if (!this._editorHorizontalOptionPopup) return; + + this._editorHorizontalOptionPopup.destroy(); + this._editorHorizontalOptionPopup = null; +}; + +_closeEditorColorPickerPopup = () => { + this._editorTextInputFocused = false; + + if (this._editorColorPickerKeyHandler) { + window.removeEventListener("keydown", this._editorColorPickerKeyHandler); + this._editorColorPickerKeyHandler = null; + } + + if (!this._editorColorPickerPopup) return; + + this._editorColorPickerPopup.destroy(); + this._editorColorPickerPopup = null; +}; + +_editorSettingsToMap = () => { + const map = {}; + + const raw = window.settingslist || ""; + const parts = String(raw).split(","); + + for (let i = 0; i + 1 < parts.length; i += 2) { + map[parts[i]] = parts[i + 1]; + } + + window.settingsMap = window.settingsMap || {}; + + for (const key in window.settingsMap) { + if (map[key] === undefined) { + map[key] = window.settingsMap[key]; + } + } + + return map; +}; + +_editorMapToSettings = (map) => { + const parts = []; + + for (const key in map) { + if (map[key] === undefined || map[key] === null) continue; + parts.push(key, String(map[key])); + } + + window.settingsMap = map; + window.settingslist = parts.join(","); + + return window.settingslist; +}; + +_makeColorStringEntry = (channelId, color) => { + return [ + "1", String(color.r), + "2", String(color.g), + "3", String(color.b), + "6", String(channelId), + "5", "0", + "7", "0" + ].join("_"); +}; + +_parseColorStringEntry = (entry) => { + const props = {}; + const parts = String(entry || "").split("_"); + + for (let i = 0; i + 1 < parts.length; i += 2) { + props[parts[i]] = parts[i + 1]; + } + + return { + channel: parseInt(props["6"] || "0", 10), + r: parseInt(props["1"] || "255", 10), + g: parseInt(props["2"] || "255", 10), + b: parseInt(props["3"] || "255", 10) + }; +}; + +_getEditorColorChannel = (channelId, fallback = { r: 255, g: 255, b: 255 }) => { + const map = this._editorSettingsToMap(); + + if (map["kS38"]) { + const entries = map["kS38"].split("|").filter(Boolean); + + for (const entry of entries) { + const parsed = this._parseColorStringEntry(entry); + + if (parsed.channel === channelId) { + return { + r: parsed.r, + g: parsed.g, + b: parsed.b + }; + } + } + } + + const legacyKey = + channelId === 1000 + ? "kS29" + : channelId === 1001 + ? "kS30" + : null; + + if (legacyKey && map[legacyKey]) { + const parsed = this._parseColorStringEntry(map[legacyKey]); + + return { + r: parsed.r, + g: parsed.g, + b: parsed.b + }; + } + + return fallback; +}; + +_setEditorColorChannelDraft = (channelId, color) => { + const map = this._editorSettingsToMap(); + + const entries = map["kS38"] + ? map["kS38"].split("|").filter(Boolean) + : []; + + let replaced = false; + + for (let i = 0; i < entries.length; i++) { + const parsed = this._parseColorStringEntry(entries[i]); + + if (parsed.channel === channelId) { + entries[i] = this._makeColorStringEntry(channelId, color); + replaced = true; + break; + } + } + + if (!replaced) { + entries.push(this._makeColorStringEntry(channelId, color)); + } + + map["kS38"] = entries.join("|"); + + if (channelId === 1000) { + map["kS29"] = this._makeColorStringEntry(1000, color); + } else if (channelId === 1001) { + map["kS30"] = this._makeColorStringEntry(1001, color); + } + + this._editorMapToSettings(map); + + if (this._level) { + this._level._initialColors = this._level._initialColors || {}; + this._level._initialColors[channelId] = color; + } + + if (this._colorManager && this._colorManager.setInitialColor) { + this._colorManager.setInitialColor(channelId, color); + } + + const hex = Phaser.Display.Color.GetColor(color.r, color.g, color.b); + + if (channelId === 1000 && this._bg) { + this._bg.setTint(hex); + } + + if (channelId === 1001 && this._level && this._level.setGroundColor) { + this._level.setGroundColor(hex); + } +}; + +_setEditorStartValueDraft = (key, value) => { + const map = this._editorSettingsToMap(); + map[key] = String(value); + this._editorMapToSettings(map); +}; + +_getEditorStartValue = (key, fallback = 0) => { + const map = this._editorSettingsToMap(); + const val = parseInt(map[key] ?? fallback, 10); + + return isNaN(val) ? fallback : val; +}; + +_setEditorArtValueDraft = (key, value) => { + const numericValue = Math.max(0, parseInt(value ?? 0, 10) || 0); + + this._setEditorStartValueDraft(key, numericValue); + + if (key === "kA6") { + window._backgroundId = String(numericValue + 1).padStart(2, "0"); + + const bgKey = "game_bg_" + numericValue; + + if (this._bg && this.textures.exists(bgKey)) { + this._bg.setTexture(bgKey); + const newBgH = this.textures.get(bgKey).source?.[0]?.height; + + if (newBgH) { + this._bgInitY = newBgH - screenHeight - o; + } + } + } else if (key === "kA7") { + window._groundId = String(numericValue).padStart(2, "0"); + + if (this._level && typeof this._level.applyGroundTexture === "function") { + this._level.applyGroundTexture(); + } + } +}; + +_getCurrentEditorLevelRecord = () => { + const levels = JSON.parse(localStorage.getItem("created_levels") || "[]"); + const idx = levels.findIndex(l => l.createdId === window.currentlevel?.[2]); + + return { + levels, + idx, + level: idx !== -1 ? levels[idx] : null + }; +}; + +_setEditorSongDraft = (songId, songName) => { + this._editorPendingSongId = songId; + this._editorPendingSongName = songName; + + window.currentlevel = window.currentlevel || [ + "Placeholder", + "Unnamed", + window._onlineLevelId || "local_0", + ["Local", "SongAuthor"] + ]; + + if (songId < 0) { + const normalIndex = Math.abs(songId) - 1; + const levelSong = window.allLevels?.[normalIndex]; + + if (levelSong) { + window.currentlevel[0] = levelSong[0]; + window.currentlevel[3] = ["Local", levelSong[3]]; + } + } else { + window.currentlevel[0] = `ng_song_${songId}`; + window.currentlevel[3] = ["Local", "Newgrounds"]; + window._onlineSongBuffer = null; + window._onlineSongKey = null; + window._onlineSongTitle = `NG#${songId}`; + window._onlineSongArtist = "Newgrounds"; + } +}; + +_addSafeFrameImage = (x, y, frameName, scale = 1) => { + const tex = + this._getTextureRefForFrameThingy + ? this._getTextureRefForFrameThingy(frameName) + : null; + + if (tex) { + return tex.frame + ? this.add.image(x, y, tex.key, tex.frame).setScale(scale) + : this.add.image(x, y, tex.key).setScale(scale); + } + + return this.add.bitmapText(x, y, "bigFont", "?", 36) + .setOrigin(0.5) + .setScale(scale); +}; + +_getColourPickerFrameData = () => { + return { + "colourPicker.png": { + frame: { x: 1, y: 1591, w: 52, h: 52 }, + rotated: false, + sourceSize: { w: 52, h: 52 } + }, + "colourPickerBackground.png": { + frame: { x: 698, y: 325, w: 440, h: 440 }, + rotated: false, + sourceSize: { w: 440, h: 440 } + }, + "colourPickerOverlay.png": { + frame: { x: 698, y: 766, w: 440, h: 440 }, + rotated: false, + sourceSize: { w: 440, h: 440 } + }, + "colourPickerShadow.png": { + frame: { x: 602, y: 1207, w: 440, h: 440 }, + rotated: false, + sourceSize: { w: 440, h: 440 } + }, + "huePickerBackground.png": { + frame: { x: 1, y: 990, w: 600, h: 600 }, + rotated: false, + sourceSize: { w: 600, h: 600 } + }, + "menuColourPanelBackground.png": { + frame: { x: 1, y: 325, w: 696, h: 664 }, + rotated: false, + sourceSize: { w: 720, h: 664 }, + spriteSourceSize: { x: 24, y: 0, w: 696, h: 664 } + } + }; +}; + +_getColourPickerTextureRef = (frameName) => { + const sheet = "CCControlColourPickerSpriteSheet-uhd"; + + if ( + this.textures.exists(sheet) && + this.textures.get(sheet).has(frameName) + ) { + return { + key: sheet, + frame: frameName + }; + } + + const generatedKey = `__cc_picker_${frameName}`; + + if (this.textures.exists(generatedKey)) { + return { + key: generatedKey, + frame: null + }; + } + + if (!this.textures.exists(sheet)) { + return null; + } + + const tex = this.textures.get(sheet); + + const sourceImage = + typeof tex.getSourceImage === "function" + ? tex.getSourceImage() + : tex.source?.[0]?.image; + + if (!sourceImage) { + return null; + } + + const data = this._getColourPickerFrameData()[frameName]; + if (!data) return null; + + const frame = data.frame; + const outW = data.sourceSize.w; + const outH = data.sourceSize.h; + + const canvasTexture = this.textures.createCanvas(generatedKey, outW, outH); + const canvas = canvasTexture.getCanvas(); + const ctx = canvas.getContext("2d"); + + ctx.clearRect(0, 0, outW, outH); + + if (data.rotated) { + ctx.save(); + ctx.translate(outW / 2, outH / 2); + ctx.rotate(-Math.PI / 2); + ctx.drawImage( + sourceImage, + frame.x, + frame.y, + frame.w, + frame.h, + -frame.w / 2, + -frame.h / 2, + frame.w, + frame.h + ); + ctx.restore(); + } else { + ctx.drawImage( + sourceImage, + frame.x, + frame.y, + frame.w, + frame.h, + 0, + 0, + outW, + outH + ); + } + + canvasTexture.refresh(); + + return { + key: generatedKey, + frame: null + }; +}; + +_addColourPickerImage = (x, y, frameName, scale = 1) => { + const tex = this._getColourPickerTextureRef(frameName); + + if (tex) { + return tex.frame + ? this.add.image(x, y, tex.key, tex.frame).setScale(scale) + : this.add.image(x, y, tex.key).setScale(scale); + } + + return this.add.rectangle(x, y, 80 * scale, 80 * scale, 0xffffff, 0.4) + .setStrokeStyle(2, 0xff0000, 1); +}; + +_setPickerObjectColor = (obj, hex, alpha = 1) => { + if (!obj) return; + + if (typeof obj.setTint === "function") { + obj.setTint(hex); + return; + } + + if (typeof obj.setFillStyle === "function") { + obj.setFillStyle(hex, alpha); + } +}; + +_rgbToHsv = (r, g, b) => { + r /= 255; + g /= 255; + b /= 255; + + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const d = max - min; + + let h = 0; + + if (d !== 0) { + if (max === r) { + h = ((g - b) / d) % 6; + } else if (max === g) { + h = ((b - r) / d) + 2; + } else { + h = ((r - g) / d) + 4; + } + + h *= 60; + + if (h < 0) h += 360; + } + + const s = max === 0 ? 0 : d / max; + const v = max; + + return { h, s, v }; +}; + +_hsvToRgb = (h, s, v) => { + h = ((h % 360) + 360) % 360; + + const c = v * s; + const x = c * (1 - Math.abs((h / 60) % 2 - 1)); + const m = v - c; + + let r = 0; + let g = 0; + let b = 0; + + if (h < 60) { + r = c; + g = x; + } else if (h < 120) { + r = x; + g = c; + } else if (h < 180) { + g = c; + b = x; + } else if (h < 240) { + g = x; + b = c; + } else if (h < 300) { + r = x; + b = c; + } else { + r = c; + b = x; + } + + return { + r: Math.round((r + m) * 255), + g: Math.round((g + m) * 255), + b: Math.round((b + m) * 255) + }; +}; + +_makeEditorOkButton = (parent, x, y, text, callback) => { + const btnW = 124; + const btnH = 62; + const btnBorder = this.textures.exists("GJ_button01") ? this.textures.get("GJ_button01").source[0].width * 0.3 : 28; + + const grp = this.add.container(x, y); + + const btn = this.add.nineslice( + 0, + 0, + "GJ_button01", + null, + btnW, + btnH, + btnBorder, + btnBorder, + btnBorder, + btnBorder + ).setOrigin(0.5); + + const label = this.add.bitmapText(-5, -3, "goldFont", text, 42).setOrigin(0.5, 0.5); + const hitZone = this.add.zone(0, 0, btnW, btnH) .setInteractive(); + + grp.add([btn, label, hitZone]); + parent.add(grp); + + const baseScale = 1; + const pressedScale = baseScale * 1.16; + + hitZone.on("pointerdown", () => { + hitZone._pressed = true; + this.tweens.killTweensOf(grp, "scale"); + this.tweens.add({ + targets: grp, + scale: pressedScale, + duration: 300, + ease: "Bounce.Out" + }); + }); + + const release = (runCallback = false) => { + if (!hitZone._pressed) return; + + hitZone._pressed = false; + this.tweens.killTweensOf(grp, "scale"); + this.tweens.add({ + targets: grp, + scale: baseScale, + duration: 400, + ease: "Bounce.Out" + }); + + if (runCallback) { + callback?.(); + } + }; + + hitZone.on("pointerup", () => release(true)); + hitZone.on("pointerout", () => release(false)); + hitZone.on("pointerupoutside", () => release(false)); + + return grp; +}; + +_makeEditorVisualHitButton = (parent, x, y, hitW, hitH, buildVisual, callback) => { + const root = this.add.container(x, y); + const visualRoot = this.add.container(0, 0); + + const visual = buildVisual(visualRoot); + + const hit = this.add.rectangle(0, 0, hitW, hitH, 0xffffff, 0.001) + .setOrigin(0.5) + .setInteractive(); + + root.add([visualRoot, hit]); + parent.add(root); + + root._editorVisualBaseScale = visualRoot.scaleX || 1; + + const getBaseScale = () => root._editorVisualBaseScale || visualRoot.scaleX || 1; + + this._makeCompositeBouncyButton( + hit, + [{ target: visualRoot, getBaseScale }], + 1, + () => { + callback?.(); + } + ); + + return { + root, + hit, + visualRoot, + visual, + baseScale: getBaseScale(), + setBaseScale: (scale) => { + root._editorVisualBaseScale = scale; + visualRoot.setScale(scale); + } + }; +}; + +_makeCurrentSpeedPreview = (parent, x, y, objectId, callback, targetHeight = 76, heightMultiplier = 1) => { + const objectDef = typeof getObjectFromId === "function" ? getObjectFromId(objectId) : null; + let frameName = objectDef?.frame || null; + + if (objectDef?.randomFrames && objectDef.randomFrames.length) { + frameName = objectDef.randomFrames[0]; + } + + let icon = null; + + if (frameName) { + icon = this._addSafeFrameImage(x, y, frameName, 1); + } + + if (icon && typeof icon.setScale === "function") { + const rawHeight = icon.height || ((icon.displayHeight || 1) / (icon.scaleY || 1)) || 1; + let iconScale = (targetHeight * heightMultiplier) / rawHeight; + + if (!Number.isFinite(iconScale) || iconScale <= 0) { + iconScale = 1; + } + + icon.setScale(iconScale); + icon._bouncyBaseScale = iconScale; + + if (typeof icon.setInteractive === "function") { + icon.setInteractive(); + } + + parent.add(icon); + + this._makeBouncyButton(icon, iconScale, () => { + callback?.(); + }); + + return { + root: icon, + hit: icon, + visualRoot: icon, + visual: icon, + baseScale: iconScale, + setBaseScale: (scale) => { + icon._bouncyBaseScale = scale; + icon.setScale(scale); + } + }; + } + + const fallback = this.add.bitmapText(x, y, "bigFont", "?", 42) + .setOrigin(0.5) + .setInteractive(); + + parent.add(fallback); + + fallback._bouncyBaseScale = 1; + + this._makeBouncyButton(fallback, 1, () => { + callback?.(); + }); + + return { + root: fallback, + hit: fallback, + visualRoot: fallback, + visual: fallback, + baseScale: 1, + setBaseScale: (scale) => { + fallback._bouncyBaseScale = scale; + fallback.setScale(scale); + } + }; +}; + +_makeGamemodeIconButton = (parent, x, y, modeDef, callback) => { + const iconScale = 0.88; + const icon = this._addSafeFrameImage(x, y, modeDef.frame, iconScale); + + if (modeDef.rotateFlip) { + icon.setAngle(90); + icon.setFlipY(true); + } + + if (typeof icon.setInteractive === "function") { + icon.setInteractive(); + } + + parent.add(icon); + + this._makeBouncyButton(icon, iconScale, () => { + callback?.(); + }); + + return { + root: icon, + hit: icon, + visualRoot: icon, + visual: icon, + baseScale: iconScale + }; +}; + +_makeEditorAtlasIconButton = (parent, x, y, optionDef, callback, targetHeight = 58) => { + const icon = this._addSafeFrameImage(x, y, optionDef.frame, 1); + + let iconScale = 1; + const rawHeight = icon.height || ((icon.displayHeight || 1) / (icon.scaleY || 1)) || 1; + + if (rawHeight > 0) { + iconScale = targetHeight / rawHeight; + } + + if (!Number.isFinite(iconScale) || iconScale <= 0) { + iconScale = 1; + } + + if (typeof icon.setScale === "function") { + icon.setScale(iconScale); + icon._bouncyBaseScale = iconScale; + } + + if (typeof icon.setInteractive === "function") { + icon.setInteractive(); + } + + parent.add(icon); + + this._makeBouncyButton(icon, iconScale, () => { + callback?.(); + }); + + return { + root: icon, + hit: icon, + visualRoot: icon, + visual: icon, + baseScale: iconScale, + setBaseScale: (scale) => { + icon._bouncyBaseScale = scale; + icon.setScale(scale); + } + }; +}; + +_openEditorStartOptionsPopup = () => { + if (this._editorStartOptionsPopup) return; + this._uhdContext = 'editorStartOptions'; + + const sw = screenWidth; + const sh = screenHeight; + const panelW = 520; + const panelH = 420; + + const root = this.add.container(0, 0).setScrollFactor(0).setDepth(2650); + this._editorStartOptionsPopup = root; + + const blocker = this.add.rectangle(0, 0, sw, sh, 0x000000, 0.25) + .setOrigin(0) + .setInteractive(); + + root.add(blocker); + + const inner = this.add.container(sw / 2, sh / 2 + 15) + .setScale(1); + + root.add(inner); + + const corner = this.textures.exists("GJ_square01") ? this.textures.get("GJ_square01").source[0].width * 0.325 : 24; + + const panel = this._drawScale9( + 0, + 0, + panelW, + panelH, + "GJ_square01", + corner, + 0xffffff, + 1 + ); + + inner.add(panel); + + const closeBtn = this.add.image( + -(panelW / 2) + 10, + -(panelH / 2) + 10, + "GJ_GameSheet03", + "GJ_closeBtn_001.png" + ) + .setScale(0.8) + .setInteractive(); + + inner.add(closeBtn); + + this._makeBouncyButton(closeBtn, 0.8, () => { + this._closeEditorStartOptionsPopup(); + }); + + const optionDefs = [ + { label: "Mini Mode", key: "kA3" }, + { label: "Flip Gravity", key: "kA11" }, + { label: "Dual Mode", key: "kA8" }, + { label: "Mirror Mode", key: "kA28" } + ]; + + const makeToggle = (label, key, y) => { + const row = this.add.container(-150, y); + const check = this.add.image(0, 0, "GJ_GameSheet03", "GJ_checkOff_001.png").setScale(0.9).setInteractive(); + const text = this.add.bitmapText(48, -2, "bigFont", label, 28).setOrigin(0, 0.5).setInteractive(); + + row.add([check, text]); + inner.add(row); + + const refresh = () => { + const checked = this._getEditorStartValue(key, 0) === 1; + check.setTexture( + "GJ_GameSheet03", + checked ? "GJ_checkOn_001.png" : "GJ_checkOff_001.png" + ); + }; + + const toggle = () => { + const checked = this._getEditorStartValue(key, 0) === 1; + this._setEditorStartValueDraft(key, checked ? 0 : 1); + refresh(); + }; + + this._makeBouncyButton(check, 0.9, toggle); + text.on("pointerdown", toggle); + + refresh(); + + return row; + }; + + optionDefs.forEach((opt, i) => { + makeToggle(opt.label, opt.key, -130 + i * 80); + }); +}; + +_applyLevelStartOptions = () => { + const getBool = (key) => parseInt(window.settingsMap?.[key] || "0", 10) === 1; + + this._state.isMini = getBool("kA3"); + this._state.gravityFlipped = getBool("kA11"); + this._state.mirrored = getBool("kA28"); + + if (getBool("kA8")) { + this._enableDualMode(); + } +}; + +_closeEditorStartOptionsPopup = () => { + if (this._editorStartOptionsPopup) { + this._editorStartOptionsPopup.destroy(); + this._editorStartOptionsPopup = null; + } +}; + +_openEditorHorizontalOptionPopup = (titleText, options, selectedKey, onSelect, renderOption) => { + this._closeEditorHorizontalOptionPopup(); + + const sw = screenWidth; + const sh = screenHeight; + const isGamemodePopup = titleText === "Select Mode"; + const isSpeedPopup = titleText === "Select Speed"; + const isBgPopup = titleText === "Select Background"; + const isGroundPopup = titleText === "Select Ground"; + const isArtPopup = isBgPopup || isGroundPopup; + + const root = this.add.container(0, 0).setScrollFactor(0).setDepth(2600); + this._editorHorizontalOptionPopup = root; + + const blocker = this.add.rectangle(0, 0, sw, sh, 0x000000, 0.25).setOrigin(0).setInteractive(); + root.add(blocker); + + const optionCols = isArtPopup ? 10 : options.length; + const optionRows = isArtPopup ? Math.ceil(options.length / optionCols) : 1; + + const optionGapX = isArtPopup ? 76 : (isGamemodePopup ? 84 : (isSpeedPopup ? 150 : 142)); + const optionGapY = isArtPopup ? 68 : 0; + + const panelW = isArtPopup ? 860 : 760; + const panelH = isArtPopup ? Math.min(650, 225 + optionRows * optionGapY) - 45 : 340; + + const speedTargetHeight = 112; + const artGridYOffset = isArtPopup ? -20 : 0; + + const inner = this.add.container(sw / 2, sh / 2 + 15).setScale(1); + root.add(inner); + + const corner = this.textures.exists("GJ_square01") + ? this.textures.get("GJ_square01").source[0].width * 0.325 + : 24; + + const panel = this._drawScale9(0, 0, panelW, panelH, "GJ_square01", corner, 0xffffff, 1); + inner.add(panel); + + const title = this.add.bitmapText(0, -(panelH / 2) + 50, "bigFont", titleText, isArtPopup ? 52 : 60).setOrigin(0.5); + inner.add(title); + + let selected = selectedKey; + const optionObjects = []; + + const setTintDeep = (obj, tint) => { + if (!obj) return; + + if (tint === null) { + if (typeof obj.clearTint === "function") obj.clearTint(); + } else if (typeof obj.setTint === "function") { + obj.setTint(tint); + } + + if (Array.isArray(obj.list)) { + for (const child of obj.list) { + setTintDeep(child, tint); + } + } + }; + + const getVisualHeight = (obj) => { + if (!obj) return 0; + + if (typeof obj.getBounds === "function") { + const bounds = obj.getBounds(); + if (bounds && bounds.height > 0) { + return bounds.height; + } + } + + if (obj.displayHeight > 0) return obj.displayHeight; + if (obj.height > 0) return obj.height * (obj.scaleY || 1); + + return 0; + }; + + const refreshSelected = () => { + for (const entry of optionObjects) { + const isSelected = entry.key === selected; + const baseScale = entry.baseScale || 1; + + entry.visualRoot.setScale(baseScale); + entry.visualRoot.setAlpha(1); + setTintDeep(entry.visualRoot, isSelected ? null : 0x666666); + } + }; + + options.forEach((opt, i) => { + const row = isArtPopup ? Math.floor(i / optionCols) : 0; + const col = isArtPopup ? (i % optionCols) : i; + const itemsInRow = isArtPopup ? Math.min(optionCols, options.length - row * optionCols) : options.length; + + const ox = ((col - ((itemsInRow - 1) / 2)) * optionGapX) + (isSpeedPopup ? -15 : 0); + const oy = isArtPopup + ? (-(optionRows - 1) * optionGapY / 2) + row * optionGapY + 16 + artGridYOffset + : -2; + + const buttonObj = renderOption(inner, opt, ox, oy, () => { + selected = opt.key; + onSelect(opt); + refreshSelected(); + }, i); + + const visualRoot = buttonObj.visualRoot || buttonObj.root; + + let baseScale = buttonObj.baseScale || visualRoot.scaleX || 1; + + if (isSpeedPopup) { + const currentHeight = getVisualHeight(visualRoot); + + if (currentHeight > 0) { + const targetHeight = speedTargetHeight * (i === 0 ? 0.8 : 1); + baseScale = baseScale * (targetHeight / currentHeight); + } + } + + if (buttonObj.setBaseScale) { + buttonObj.setBaseScale(baseScale); + } else { + visualRoot._bouncyBaseScale = baseScale; + visualRoot.setScale(baseScale); + } + + optionObjects.push({ + key: opt.key, + root: buttonObj.root, + visualRoot, + baseScale + }); + }); + + this._makeEditorOkButton(inner, 0, (panelH / 2) - 52, "OK", () => { + this._closeEditorHorizontalOptionPopup(); + }); + + refreshSelected(); +}; + +_openEditorColorPickerPopup = (channelId, labelText, onColorChanged) => { + this._closeEditorColorPickerPopup(); + + const sw = screenWidth; + const sh = screenHeight; + + const root = this.add.container(0, 0).setScrollFactor(0).setDepth(2700); + this._editorColorPickerPopup = root; + + const blocker = this.add.rectangle(0, 0, sw, sh, 0x000000, 0.32).setOrigin(0).setInteractive(); + root.add(blocker); + + const panelW = 820; + const panelH = 520; + + const inner = this.add.container(sw / 2, sh / 2).setScale(1); + root.add(inner); + + const corner = this.textures.exists("GJ_square01") ? this.textures.get("GJ_square01").source[0].width * 0.325 : 24; + const panel = this._drawScale9(0, 0, panelW, panelH, "GJ_square01", corner, 0xffffff, 1); + inner.add(panel); + + const title = this.add.bitmapText(0, -(panelH / 2) + 40, "goldFont", "Select Color", 34).setOrigin(0.5); + inner.add(title); + + const currentColor = this._getEditorColorChannel(channelId); + const originalColor = { + r: currentColor.r, + g: currentColor.g, + b: currentColor.b + }; + const currentHsv = this._rgbToHsv(currentColor.r, currentColor.g, currentColor.b); + + const pickerX = 0; + const pickerY = 0; + const pickerScale = 0.42; + const hueRingInnerRadius = 94; + const hueRingOuterRadius = 126; + const shadowRadius = (220 * pickerScale) - 1; + const innerRadius = shadowRadius; + + const startHueAngle = Phaser.Math.DegToRad(currentHsv.h - 90); + + const state = { + h: currentHsv.h, + + innerX: 0, + innerY: 0, + + hueX: Math.cos(startHueAngle) * 110, + hueY: Math.sin(startHueAngle) * 110, + + sampledColor: { + r: currentColor.r, + g: currentColor.g, + b: currentColor.b + } + }; + + let activePickerTarget = null; + + const toHexNumber = (color) => { + return Phaser.Display.Color.GetColor(color.r, color.g, color.b); + }; + + const toHexString = (color) => { + const toPart = (v) => { + return Phaser.Math.Clamp(Math.round(v), 0, 255) + .toString(16) + .padStart(2, "0") + .toUpperCase(); + }; + + return `${toPart(color.r)}${toPart(color.g)}${toPart(color.b)}`; + }; + + const normalizeColor = (color) => { + return { + r: Phaser.Math.Clamp(parseInt(color.r, 10) || 0, 0, 255), + g: Phaser.Math.Clamp(parseInt(color.g, 10) || 0, 0, 255), + b: Phaser.Math.Clamp(parseInt(color.b, 10) || 0, 0, 255) + }; + }; + + const parseHexColor = (raw) => { + let value = String(raw || "") + .replace(/^#/, "") + .replace(/[^0-9a-fA-F]/g, "") + .toUpperCase(); + + if (value.length !== 6) return null; + + return { + r: parseInt(value.slice(0, 2), 16), + g: parseInt(value.slice(2, 4), 16), + b: parseInt(value.slice(4, 6), 16) + }; + }; + + const menuPanelBg = this._addColourPickerImage( + pickerX, + pickerY, + "menuColourPanelBackground.png", + pickerScale + ); + + if (menuPanelBg && typeof menuPanelBg.setFlipX === "function") { + menuPanelBg.setFlipX(true); + } + + const hueBg = this._addColourPickerImage( + pickerX, + pickerY, + "huePickerBackground.png", + pickerScale + ); + + const innerCircleBg = this._addColourPickerImage( + pickerX, + pickerY, + "colourPickerBackground.png", + pickerScale + ); + + const selectedColorCircle = this.add.circle( + pickerX, + pickerY, + innerRadius, + 0xffffff, + 1 + ); + + const innerShadow = this._addColourPickerImage( + pickerX, + pickerY, + "colourPickerShadow.png", + pickerScale + ); + + const innerOverlay = this._addColourPickerImage( + pickerX, + pickerY, + "colourPickerOverlay.png", + pickerScale + ); + + const hueHandle = this._addColourPickerImage( + pickerX, + pickerY, + "colourPicker.png", + pickerScale + ); + + const svHandle = this._addColourPickerImage( + pickerX, + pickerY, + "colourPicker.png", + pickerScale + ); + + const previewSize = 42; + const previewX = -(panelW / 2) + 46; + const previewY = -(panelH / 2) + 43; + + const currentPreview = this.add.rectangle( + previewX, + previewY, + previewSize, + previewSize, + toHexNumber(currentColor), + 1 + ); + + const originalPreview = this.add.rectangle( + previewX, + previewY + previewSize, + previewSize, + previewSize, + toHexNumber(originalColor), + 1 + ); + + const inputState = { + focused: null, + values: { + r: String(currentColor.r), + g: String(currentColor.g), + b: String(currentColor.b), + hex: toHexString(currentColor) + }, + fields: {} + }; + + const createInputField = (key, label, x, y, w, maxChars) => { + const labelObj = this.add.bitmapText(x, y - 37, "goldFont", label, 22).setOrigin(0.5).setAlpha(0.95); + const bg = this.add.rectangle(x, y, w, 34, 0x000000, 0.38).setOrigin(0.5).setInteractive(); + const valueText = this.add.bitmapText(x, y, "bigFont", "", 20).setOrigin(0.5); + const hit = this.add.rectangle(x, y, w, 40, 0xffffff, 0.001).setOrigin(0.5).setInteractive(); + + inputState.fields[key] = { + key, + label, + bg, + valueText, + maxChars + }; + + hit.on("pointerdown", (pointer) => { + inputState.focused = key; + this._editorTextInputFocused = true; + renderInputFields(); + + if (pointer && pointer.event) { + pointer.event.preventDefault?.(); + pointer.event.stopPropagation?.(); + pointer.event.stopImmediatePropagation?.(); + } + }); + + inner.add([labelObj, bg, valueText, hit]); + }; + + const inputLeftX = -(panelW / 2) + 60; + const rgbInputY = -34; + const rgbGap = 76; + + createInputField("r", "R:", inputLeftX, rgbInputY, 68, 3); + createInputField("g", "G:", inputLeftX + rgbGap, rgbInputY, 68, 3); + createInputField("b", "B:", inputLeftX + (rgbGap * 2), rgbInputY, 68, 3); + createInputField("hex", "HEX:", inputLeftX + rgbGap, 50, 152, 6); + + inner.add([ + menuPanelBg, + hueBg, + innerCircleBg, + selectedColorCircle, + innerShadow, + innerOverlay, + hueHandle, + svHandle, + currentPreview, + originalPreview + ]); + + const getTextureFrame = (frameName) => { + const ref = this._getColourPickerTextureRef(frameName); + if (!ref) return null; + + const tex = this.textures.get(ref.key); + if (!tex) return null; + + const frame = + typeof tex.get === "function" + ? tex.get(ref.frame || "__BASE") + : null; + + if (!frame || !frame.source || !frame.source.image) { + return null; + } + + return frame; + }; + + const drawFrameToCanvas = (ctx, frameName, destW, destH) => { + const frame = getTextureFrame(frameName); + if (!frame) return false; + + const sourceImage = frame.source.image; + + ctx.drawImage( + sourceImage, + frame.cutX, + frame.cutY, + frame.cutWidth, + frame.cutHeight, + 0, + 0, + destW, + destH + ); + + return true; + }; + + const colorDistanceSq = (a, b) => { + const dr = a.r - b.r; + const dg = a.g - b.g; + const db = a.b - b.b; + + return dr * dr + dg * dg + db * db; + }; + + const hueDistance = (a, b) => { + let d = Math.abs(a - b) % 360; + if (d > 180) d = 360 - d; + return d; + }; + + const sampleSize = Math.ceil(440 * pickerScale); + const sampleRadius = sampleSize / 2; + + const sampleCanvas = document.createElement("canvas"); + sampleCanvas.width = sampleSize; + sampleCanvas.height = sampleSize; + + const sampleCtx = sampleCanvas.getContext("2d", { + willReadFrequently: true + }); + + const hueSampleSize = Math.ceil(600 * pickerScale); + const hueSampleRadius = hueSampleSize / 2; + + const hueSampleCanvas = document.createElement("canvas"); + hueSampleCanvas.width = hueSampleSize; + hueSampleCanvas.height = hueSampleSize; + + const hueSampleCtx = hueSampleCanvas.getContext("2d", { + willReadFrequently: true + }); + + let hueSampleReady = false; + + const rebuildHueSampleCanvas = () => { + hueSampleCtx.clearRect(0, 0, hueSampleSize, hueSampleSize); + + hueSampleReady = drawFrameToCanvas( + hueSampleCtx, + "huePickerBackground.png", + hueSampleSize, + hueSampleSize + ); + }; + + const rebuildInnerSampleCanvas = () => { + const huePure = this._hsvToRgb(state.h, 1, 1); + const hueHex = Phaser.Display.Color.GetColor(huePure.r, huePure.g, huePure.b); + + selectedColorCircle.setFillStyle(hueHex, 1); + + sampleCtx.clearRect(0, 0, sampleSize, sampleSize); + + drawFrameToCanvas(sampleCtx, "colourPickerBackground.png", sampleSize, sampleSize); + + sampleCtx.save(); + sampleCtx.globalCompositeOperation = "source-over"; + sampleCtx.fillStyle = `rgb(${huePure.r}, ${huePure.g}, ${huePure.b})`; + sampleCtx.beginPath(); + sampleCtx.arc(sampleRadius, sampleRadius, sampleRadius, 0, Math.PI * 2); + sampleCtx.fill(); + sampleCtx.restore(); + + drawFrameToCanvas(sampleCtx, "colourPickerShadow.png", sampleSize, sampleSize); + drawFrameToCanvas(sampleCtx, "colourPickerOverlay.png", sampleSize, sampleSize); + }; + + const findHuePositionForLoadedColor = (targetColor) => { + if (!hueSampleReady) { + rebuildHueSampleCanvas(); + } + + const targetHsv = this._rgbToHsv(targetColor.r, targetColor.g, targetColor.b); + let best = null; + + const fallbackAngle = Phaser.Math.DegToRad(targetHsv.h - 90); + const fallback = { + x: Math.cos(fallbackAngle) * ((hueRingInnerRadius + hueRingOuterRadius) / 2), + y: Math.sin(fallbackAngle) * ((hueRingInnerRadius + hueRingOuterRadius) / 2) + }; + + if (!hueSampleReady) { + return fallback; + } + + for (let y = 0; y < hueSampleSize; y += 2) { + for (let x = 0; x < hueSampleSize; x += 2) { + const dx = x - hueSampleRadius; + const dy = y - hueSampleRadius; + const dist = Math.sqrt(dx * dx + dy * dy); + + if (dist < hueRingInnerRadius || dist > hueRingOuterRadius) continue; + + const pixel = hueSampleCtx.getImageData(x, y, 1, 1).data; + if (pixel[3] < 12) continue; + + const rgb = { + r: pixel[0], + g: pixel[1], + b: pixel[2] + }; + + const hsv = this._rgbToHsv(rgb.r, rgb.g, rgb.b); + if (hsv.s < 0.08) continue; + + const midRadius = (hueRingInnerRadius + hueRingOuterRadius) / 2; + const radiusPenalty = Math.abs(dist - midRadius) * 0.08; + const huePenalty = hueDistance(hsv.h, targetHsv.h); + + const score = huePenalty + radiusPenalty; + + if (!best || score < best.score) { + best = { + x: dx, + y: dy, + score + }; + } + } + } + + return best || fallback; + }; + + const sampleHuePixel = () => { + if (!hueSampleReady) { + rebuildHueSampleCanvas(); + } + + const canvasX = Math.round(hueSampleRadius + state.hueX); + const canvasY = Math.round(hueSampleRadius + state.hueY); + + const clampedX = Phaser.Math.Clamp(canvasX, 0, hueSampleSize - 1); + const clampedY = Phaser.Math.Clamp(canvasY, 0, hueSampleSize - 1); + + const pixel = hueSampleCtx.getImageData(clampedX, clampedY, 1, 1).data; + + const sampledRgb = { + r: pixel[0], + g: pixel[1], + b: pixel[2] + }; + + const sampledHsv = this._rgbToHsv(sampledRgb.r, sampledRgb.g, sampledRgb.b); + + if (sampledHsv.s > 0.08) { + state.h = sampledHsv.h; + } + + return sampledRgb; + }; + + const findInnerPositionForLoadedColor = (targetColor) => { + rebuildInnerSampleCanvas(); + + let best = null; + for (let y = 1; y < sampleSize - 1; y++) { + for (let x = 1; x < sampleSize - 1; x++) { + const dx = x - sampleRadius; + const dy = y - sampleRadius; + const dist = Math.sqrt(dx * dx + dy * dy); + + if (dist > innerRadius) continue; + + const pixel = sampleCtx.getImageData(x, y, 1, 1).data; + if (pixel[3] < 12) continue; + + const rgb = { + r: pixel[0], + g: pixel[1], + b: pixel[2] + }; + + const score = colorDistanceSq(rgb, targetColor); + + if (!best || score < best.score) { + best = { + x: dx, + y: dy, + color: rgb, + score + }; + } + } + } + + if (best) return best; + + return { + x: 0, + y: 0, + color: targetColor, + score: 0 + }; + }; + + const sampleInnerPixel = () => { + rebuildInnerSampleCanvas(); + + const canvasX = Math.round(sampleRadius + state.innerX); + const canvasY = Math.round(sampleRadius + state.innerY); + + const clampedX = Phaser.Math.Clamp(canvasX, 1, sampleSize - 2); + const clampedY = Phaser.Math.Clamp(canvasY, 1, sampleSize - 2); + + const pixel = sampleCtx.getImageData(clampedX, clampedY, 1, 1).data; + + if (pixel[3] < 12) { + return state.sampledColor; + } + + state.sampledColor = { + r: pixel[0], + g: pixel[1], + b: pixel[2] + }; + + return state.sampledColor; + }; + + const getLocalPointer = (pointer) => { + return { + x: pointer.x - (sw / 2), + y: pointer.y - (sh / 2) + }; + }; + + const getPointerDeltaFromPicker = (pointer) => { + const p = getLocalPointer(pointer); + + return { + dx: p.x - pickerX, + dy: p.y - pickerY + }; + }; + + const getPointerDistanceFromPicker = (pointer) => { + const { dx, dy } = getPointerDeltaFromPicker(pointer); + return Math.sqrt(dx * dx + dy * dy); + }; + + const clampPointToHuePickerBackground = (dx, dy) => { + let dist = Math.sqrt(dx * dx + dy * dy); + + if (dist < 0.0001) { + dx = 0; + dy = -hueRingInnerRadius; + dist = hueRingInnerRadius; + } + + const clampedDist = Phaser.Math.Clamp( + dist, + hueRingInnerRadius, + hueRingOuterRadius + ); + + return { + x: dx / dist * clampedDist, + y: dy / dist * clampedDist + }; + }; + + const clampPointToColourPickerShadow = (dx, dy) => { + const dist = Math.sqrt(dx * dx + dy * dy); + + if (dist > innerRadius && dist > 0.0001) { + return { + x: dx / dist * innerRadius, + y: dy / dist * innerRadius + }; + } + + return { + x: dx, + y: dy + }; + }; + + const isColourPickerShadowPointer = (pointer) => { + const dist = getPointerDistanceFromPicker(pointer); + + return dist <= innerRadius; + }; + + const isHueRingPointer = (pointer) => { + const dist = getPointerDistanceFromPicker(pointer); + + return dist >= hueRingInnerRadius && dist <= hueRingOuterRadius; + }; + + function renderInputFields() { + for (const key in inputState.fields) { + const field = inputState.fields[key]; + const isFocused = inputState.focused === key; + const raw = inputState.values[key] ?? ""; + const displayValue = raw; + + field.bg.setFillStyle(isFocused ? 0x000000 : 0x000000, isFocused ? 0.56 : 0.38); + field.valueText.setText(`${displayValue}${isFocused ? "|" : ""}`); + } + } + + const setInputValuesFromColor = (color) => { + const normalized = normalizeColor(color); + + inputState.values.r = String(normalized.r); + inputState.values.g = String(normalized.g); + inputState.values.b = String(normalized.b); + inputState.values.hex = toHexString(normalized); + + renderInputFields(); + }; + + const updateColorUi = (color, commitDraft = true, syncInputs = true) => { + const normalized = normalizeColor(color); + const hex = toHexNumber(normalized); + + state.sampledColor = normalized; + currentPreview.setFillStyle(hex, 1); + + hueHandle.setPosition( + pickerX + state.hueX, + pickerY + state.hueY + ); + + svHandle.setPosition( + pickerX + state.innerX, + pickerY + state.innerY + ); + + if (syncInputs) { + setInputValuesFromColor(normalized); + } + + if (commitDraft) { + this._setEditorColorChannelDraft(channelId, normalized); + } + + if (onColorChanged) { + onColorChanged(normalized); + } + }; + + const setPickerPositionForColor = (color) => { + const normalized = normalizeColor(color); + const loadedHuePos = findHuePositionForLoadedColor(normalized); + + state.hueX = loadedHuePos.x; + state.hueY = loadedHuePos.y; + + sampleHuePixel(); + + const loadedInnerPos = findInnerPositionForLoadedColor(normalized); + + state.innerX = loadedInnerPos.x; + state.innerY = loadedInnerPos.y; + }; + + const applyTypedColor = (color) => { + const normalized = normalizeColor(color); + + inputState.focused = inputState.focused; + setPickerPositionForColor(normalized); + updateColorUi(normalized, true, true); + }; + + const tryApplyRgbInputs = () => { + if ( + inputState.values.r === "" || + inputState.values.g === "" || + inputState.values.b === "" + ) { + renderInputFields(); + return; + } + + applyTypedColor({ + r: inputState.values.r, + g: inputState.values.g, + b: inputState.values.b + }); + }; + + const tryApplyHexInput = () => { + const parsed = parseHexColor(inputState.values.hex); + + if (!parsed) { + renderInputFields(); + return; + } + + applyTypedColor(parsed); + }; + + const applyColor = (commitDraft = true) => { + const color = sampleInnerPixel(); + updateColorUi(color, commitDraft, true); + }; + + const moveHuePickerToPointer = (pointer) => { + inputState.focused = null; + this._editorTextInputFocused = false; + renderInputFields(); + + let { dx, dy } = getPointerDeltaFromPicker(pointer); + const clamped = clampPointToHuePickerBackground(dx, dy); + + state.hueX = clamped.x; + state.hueY = clamped.y; + + sampleHuePixel(); + + applyColor(true); + }; + + const moveInnerPickerToPointer = (pointer) => { + inputState.focused = null; + this._editorTextInputFocused = false; + renderInputFields(); + + let { dx, dy } = getPointerDeltaFromPicker(pointer); + const clamped = clampPointToColourPickerShadow(dx, dy); + + state.innerX = clamped.x; + state.innerY = clamped.y; + + applyColor(true); + }; + + const beginPickerDrag = (pointer) => { + if (isColourPickerShadowPointer(pointer)) { + activePickerTarget = "inner"; + moveInnerPickerToPointer(pointer); + return; + } + + if (isHueRingPointer(pointer)) { + activePickerTarget = "hue"; + moveHuePickerToPointer(pointer); + return; + } + + activePickerTarget = null; + }; + + const continuePickerDrag = (pointer) => { + if (activePickerTarget === "inner") { + moveInnerPickerToPointer(pointer); + return; + } + + if (activePickerTarget === "hue") { + moveHuePickerToPointer(pointer); + } + }; + + const endPickerDrag = () => { + activePickerTarget = null; + }; + + const pickerHit = this.add.circle( + pickerX, + pickerY, + hueRingOuterRadius + 20, + 0xffffff, + 0.001 + ) + .setInteractive({ draggable: true }); + + inner.add(pickerHit); + + pickerHit.on("pointerdown", beginPickerDrag); + pickerHit.on("drag", continuePickerDrag); + pickerHit.on("pointerup", endPickerDrag); + pickerHit.on("pointerout", endPickerDrag); + pickerHit.on("pointerupoutside", endPickerDrag); + + this._editorColorPickerKeyHandler = (event) => { + if (!this._editorColorPickerPopup || !inputState.focused) return; + + this._editorTextInputFocused = true; + + const key = inputState.focused; + + if (event.key === "Escape" || event.key === "Enter") { + inputState.focused = null; + this._editorTextInputFocused = false; + renderInputFields(); + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation?.(); + return; + } + + if (event.key === "Backspace") { + inputState.values[key] = String(inputState.values[key] || "").slice(0, -1); + } else if (key === "hex") { + if (/^[0-9a-fA-F]$/.test(event.key) && inputState.values.hex.length < 6) { + inputState.values.hex += event.key.toUpperCase(); + } else { + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation?.(); + return; + } + } else if (/^[0-9]$/.test(event.key) && inputState.values[key].length < 3) { + inputState.values[key] += event.key; + } else { + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation?.(); + return; + } + + if (key === "hex") { + tryApplyHexInput(); + } else { + tryApplyRgbInputs(); + } + + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation?.(); + }; + + window.addEventListener("keydown", this._editorColorPickerKeyHandler); + + blocker.on("pointerdown", () => { + inputState.focused = null; + this._editorTextInputFocused = false; + renderInputFields(); + }); + + rebuildHueSampleCanvas(); + setPickerPositionForColor(currentColor); + state.sampledColor = normalizeColor(currentColor); + + this._makeEditorOkButton(inner, 0, (panelH / 2) - 42, "OK", () => { + this._closeEditorColorPickerPopup(); + }); + + updateColorUi(currentColor, false, true); +}; + +_openEditorLevelSettingsPopup = () => { + if (this._editorLevelSettingsPopup) return; + this._uhdContext = 'editorSettings'; + + const sw = screenWidth; + const sh = screenHeight; + const centerX = sw / 2; + const centerY = sh / 2; + const panelW = 1000; + const panelH = 600; + + this._editorLevelSettingsPopup = this.add.container(0, 0).setScrollFactor(0).setDepth(2300); + const dim = this.add.rectangle(0, 0, sw, sh, 0x000000, 0.55).setOrigin(0).setInteractive(); + this._editorLevelSettingsPopup.add(dim); + const inner = this.add.container(centerX, centerY).setScale(1); + this._editorLevelSettingsPopup.add(inner); + + const corner = this.textures.exists("GJ_square01") ? this.textures.get("GJ_square01").source[0].width * 0.325 : 24; + const panel = this._drawScale9(0, 0, panelW, panelH, "GJ_square01", corner, 0xffffff, 1); + inner.add(panel); + + const title = this.add.bitmapText(0, -(panelH / 2) + 42, "goldFont", "Select Color:", 40).setOrigin(0.5); + inner.add(title); + + const colorToHex = (color) => { + return Phaser.Display.Color.GetColor(color.r, color.g, color.b); + }; + + const makeColorTarget = (label, channelId, x, y) => { + const container = this.add.container(x, y); + const buttonW = 50; + const buttonH = 50; + const radius = 8; + + const labelText = this.add.bitmapText(0, -45, "bigFont", label, 24).setOrigin(0.5); + + const buttonVisual = this.add.container(0, 0); + buttonVisual._bouncyBaseScale = 1; + + const shadow = this.add.graphics(); + const swatch = this.add.graphics(); + + buttonVisual.add([shadow, swatch]); + + const hitZone = this.add.zone(0, 0, buttonW, buttonH) + .setOrigin(0.5) + .setInteractive(); + + container.add([labelText, buttonVisual, hitZone]); + inner.add(container); + + const getBouncyBaseScale = () => ( + buttonVisual._bouncyBaseScale !== undefined ? buttonVisual._bouncyBaseScale : 1 + ); + + hitZone.on("pointerdown", () => { + const baseScale = getBouncyBaseScale(); + + buttonVisual._pressed = true; + this.tweens.killTweensOf(buttonVisual); + + this.tweens.add({ + targets: buttonVisual, + scale: baseScale * 1.26, + duration: 300, + ease: "Bounce.Out" + }); + }); + + hitZone.on("pointerout", () => { + if (buttonVisual._pressed) { + buttonVisual._pressed = false; + this.tweens.killTweensOf(buttonVisual); + + this.tweens.add({ + targets: buttonVisual, + scale: getBouncyBaseScale(), + duration: 400, + ease: "Bounce.Out" + }); + } + }); + + hitZone.on("pointerup", () => { + if (buttonVisual._pressed) { + buttonVisual._pressed = false; + this.tweens.killTweensOf(buttonVisual); + buttonVisual.setScale(getBouncyBaseScale()); + + this._openEditorColorPickerPopup( + channelId, + label, + refresh + ); + } + }); + + hitZone.on("pointerupoutside", () => { + if (buttonVisual._pressed) { + buttonVisual._pressed = false; + this.tweens.killTweensOf(buttonVisual); + + this.tweens.add({ + targets: buttonVisual, + scale: getBouncyBaseScale(), + duration: 400, + ease: "Bounce.Out" + }); + } + }); + + const drawSwatch = (color) => { + const hex = colorToHex(color); + + shadow.clear(); + shadow.fillStyle(0x000000, 0.35); + shadow.fillRoundedRect( + -(buttonW / 2) + 4, + -(buttonH / 2) + 5, + buttonW, + buttonH, + radius + ); + + swatch.clear(); + swatch.fillStyle(hex, 1); + swatch.fillRoundedRect( + -(buttonW / 2), + -(buttonH / 2), + buttonW, + buttonH, + radius + ); + + swatch.lineStyle(2, 0x000000, 1); + swatch.strokeRoundedRect( + -(buttonW / 2), + -(buttonH / 2), + buttonW, + buttonH, + radius + ); + }; + + const refresh = () => { + const color = this._getEditorColorChannel(channelId); + drawSwatch(color); + }; + + refresh(); + }; + + makeColorTarget("BG:", 1000, -240, -170); + makeColorTarget("G:", 1001, -160, -170); + makeColorTarget("G2:", 1009, -80, -170); + makeColorTarget("Line:", 1002, 0, -170); + makeColorTarget("Obj:", 1004, 80, -170); + makeColorTarget("MG:", 1013, 160, -170); + makeColorTarget("MG2:", 1014, 240, -170); + + const speedDefs = [ + { key: 1, label: "0.5x", objectId: 200 }, + { key: 0, label: "1x", objectId: 201 }, + { key: 2, label: "2x", objectId: 202 }, + { key: 3, label: "3x", objectId: 203 }, + { key: 4, label: "4x", objectId: 1334 } + ]; + + const modeDefs = [ + { key: 0, label: "Cube", frame: "gj_iconBtn_off_001.png", rotateFlip: true }, + { key: 1, label: "Ship", frame: "gj_shipBtn_off_001.png", rotateFlip: false }, + { key: 2, label: "Ball", frame: "gj_ballBtn_off_001.png", rotateFlip: true }, + { key: 3, label: "UFO", frame: "gj_birdBtn_off_001.png", rotateFlip: true }, + { key: 4, label: "Wave", frame: "gj_dartBtn_off_001.png", rotateFlip: true }, + { key: 5, label: "Robot", frame: "gj_robotBtn_off_001.png", rotateFlip: false }, + { key: 6, label: "Spider", frame: "gj_spiderBtn_off_001.png", rotateFlip: false }, + { key: 7, label: "Swing", frame: "gj_swingBtn_off_001.png", rotateFlip: false } + ]; + + const makeArtDefs = (prefix, count) => { + const defs = []; + + for (let i = 1; i <= count; i++) { + defs.push({ + key: i - 1, + label: String(i), + frame: `${prefix}Icon_${String(i).padStart(2, "0")}_001.png` + }); + } + + return defs; + }; + + const bgArtDefs = makeArtDefs("bg", 59); + const groundArtDefs = makeArtDefs("g", 22); + + const leftX = -(panelW / 2) + 90; + + const startSpeedLabel = this.add.bitmapText(leftX, -262, "goldFont", "Speed:", 30).setOrigin(0.5); + inner.add(startSpeedLabel); + + let speedButtonObj = null; + + const refreshSpeedButton = () => { + if (speedButtonObj) { + speedButtonObj.root?.destroy(); + speedButtonObj = null; + } + + const speedKey = this._getEditorStartValue("kA4", 0); + const speedDef = speedDefs.find(s => s.key === speedKey) || speedDefs[0]; + const speedIndex = Math.max(0, speedDefs.findIndex(s => s.key === speedDef.key)); + + speedButtonObj = this._makeCurrentSpeedPreview( + inner, + leftX + 5, + -190, + speedDef.objectId, + () => { + this._openEditorHorizontalOptionPopup( + "Select Speed", + speedDefs, + this._getEditorStartValue("kA4", 0), + (opt) => { + this._setEditorStartValueDraft("kA4", opt.key); + refreshSpeedButton(); + }, + (parent, opt, ox, oy, choose, optionIndex = 0) => { + return this._makeCurrentSpeedPreview( + parent, + ox, + oy, + opt.objectId, + choose, + 89.6, + optionIndex === 0 ? 1.05 : 1.2 + ); + } + ); + }, + 60.8, + speedIndex === 0 ? 1.05 : 1.2 + ); + }; + + refreshSpeedButton(); + + const modeLabel = this.add.bitmapText(leftX, -105, "goldFont", "Mode:", 30).setOrigin(0.5); + inner.add(modeLabel); + + let modeButtonObj = null; + + const refreshModeButton = () => { + if (modeButtonObj) { + modeButtonObj.root?.destroy(); + modeButtonObj = null; + } + + const modeKey = this._getEditorStartValue("kA2", 0); + const modeDef = modeDefs.find(m => m.key === modeKey) || modeDefs[0]; + + modeButtonObj = this._makeGamemodeIconButton(inner, leftX, -40, modeDef, () => { + this._openEditorHorizontalOptionPopup( + "Select Mode", + modeDefs, + this._getEditorStartValue("kA2", 0), + (opt) => { + this._setEditorStartValueDraft("kA2", opt.key); + refreshModeButton(); + }, + (parent, opt, ox, oy, choose) => { + return this._makeGamemodeIconButton(parent, ox, oy, opt, choose); + } + ); + }); + }; + + refreshModeButton(); + + const editorOptionsLabel = this.add.bitmapText(leftX, 45, "goldFont", "Options:", 30).setOrigin(0.5); + inner.add(editorOptionsLabel); + + const editorOptionsBtn = this.add.image(leftX, 112, "GJ_GameSheet03", "GJ_optionsBtn_001.png").setScale(0.7).setAngle(-90).setFlipX(true).setInteractive(); + + inner.add(editorOptionsBtn); + + this._makeBouncyButton(editorOptionsBtn, 0.7, () => { + this._openEditorStartOptionsPopup(); + }); + + const rightX = (panelW / 2) - 90; + + const bgArtLabel = this.add.bitmapText(rightX, -262, "goldFont", "BG:", 30).setOrigin(0.5); + inner.add(bgArtLabel); + + let bgArtButtonObj = null; + + const refreshBgArtButton = () => { + if (bgArtButtonObj) { + bgArtButtonObj.root?.destroy(); + bgArtButtonObj = null; + } + + const bgKey = Phaser.Math.Clamp(this._getEditorStartValue("kA6", 0), 0, bgArtDefs.length - 1); + const bgDef = bgArtDefs.find(bg => bg.key === bgKey) || bgArtDefs[0]; + + bgArtButtonObj = this._makeEditorAtlasIconButton(inner, rightX, -190, bgDef, () => { + this._openEditorHorizontalOptionPopup( + "Select Background", + bgArtDefs, + this._getEditorStartValue("kA6", 0), + (opt) => { + this._setEditorArtValueDraft("kA6", opt.key); + refreshBgArtButton(); + }, + (parent, opt, ox, oy, choose) => { + return this._makeEditorAtlasIconButton(parent, ox, oy, opt, choose, 48); + } + ); + }, 90); + }; + + refreshBgArtButton(); + + const groundArtLabel = this.add.bitmapText(rightX, -112, "goldFont", "G:", 30).setOrigin(0.5); + inner.add(groundArtLabel); + + let groundArtButtonObj = null; + + const refreshGroundArtButton = () => { + if (groundArtButtonObj) { + groundArtButtonObj.root?.destroy(); + groundArtButtonObj = null; + } + + const groundKey = Phaser.Math.Clamp(this._getEditorStartValue("kA7", 0), 0, groundArtDefs.length - 1); + const groundDef = groundArtDefs.find(g => g.key === groundKey) || groundArtDefs[0]; + + groundArtButtonObj = this._makeEditorAtlasIconButton(inner, rightX, -40, groundDef, () => { + this._openEditorHorizontalOptionPopup( + "Select Ground", + groundArtDefs, + this._getEditorStartValue("kA7", 0), + (opt) => { + this._setEditorArtValueDraft("kA7", opt.key); + refreshGroundArtButton(); + }, + (parent, opt, ox, oy, choose) => { + return this._makeEditorAtlasIconButton(parent, ox, oy, opt, choose, 48); + } + ); + }, 90); + }; + + refreshGroundArtButton(); + + const songBgX = -315; + const songBgY = 40; + const songBgW = 630; + const songBgH = 175; + + const songTabY = songBgY - 25; + const songTabW = 110; + const songTextY = songBgY + (songBgH / 2); + + const songTitle = this.add.bitmapText(0, songTabY - 2, "goldFont", "Select Song:", 40).setOrigin(1, 0.5); + inner.add(songTitle); + + const songGroupW = songTitle.width + 42 + songTabW + 13 + songTabW; + const songGroupLeft = -(songGroupW / 2); + + const songTitleX = songGroupLeft + songTitle.width; + const normalTabX = songTitleX + 42 + (songTabW / 2); + const customTabX = normalTabX + songTabW + 13; + + songTitle.setPosition(songTitleX, songTabY - 2); + + let songCategory = "normal"; + + const { + level: currentLevel + } = this._getCurrentEditorLevelRecord(); + + if ((this._editorPendingSongId ?? currentLevel?.songId ?? -1) > 0) { + songCategory = "custom"; + } + + let normalIndex = 0; + const activeSongId = this._editorPendingSongId ?? currentLevel?.songId ?? -1; + + if (activeSongId < 0) { + normalIndex = Math.max(0, Math.abs(activeSongId) - 1); + } + + let customInput = activeSongId > 0 ? String(activeSongId) : ""; + let customFocused = false; + + const makeSongTabButton = (x, label, callback) => { + const tabRoot = this.add.container(x, songTabY); + const tabBg = this.add.nineslice(0, 0, "GJ_button01", null, songTabW, 40, 18, 18, 18, 18).setInteractive(); + const tabText = this.add.bitmapText(-3, -3, "bigFont", label, 22).setOrigin(0.5); + + tabRoot.add([tabBg, tabText]); + inner.add(tabRoot); + + this._makeCompositeBouncyButton(tabBg, tabRoot, 1, callback); + + return { + root: tabRoot, + bg: tabBg, + text: tabText + }; + }; + + const normalTab = makeSongTabButton(normalTabX, "Normal", () => { + const wasCustomSongTab = songCategory === "custom"; + + songCategory = "normal"; + customFocused = false; + this._editorTextInputFocused = false; + + if (wasCustomSongTab) { + normalIndex = 0; + commitNormalSongDraft(); + } + + updateSongUi(); + }); + + const customTab = makeSongTabButton(customTabX, "Custom", () => { + songCategory = "custom"; + customFocused = false; + this._editorTextInputFocused = false; + updateSongUi(); + }); + + const songAreaBg = this.add.graphics(); + songAreaBg.fillStyle(0x000000, 0.28); + songAreaBg.fillRoundedRect(songBgX, songBgY, songBgW, songBgH, 25); + inner.add(songAreaBg); + + const customSongInputW = 335; + const customSongInputH = 62; + const customSongInputRadius = 12; + const customSongInputBg = this.add.graphics(); + inner.add(customSongInputBg); + + const songText = this.add.bitmapText(0, songTextY, "bigFont", "", 50).setOrigin(0.5); + inner.add(songText); + + const customSongInputHit = this.add.zone(0, songTextY, customSongInputW, customSongInputH) + .setOrigin(0.5) + .setInteractive(); + inner.add(customSongInputHit); + + const prevSong = this.add.image(-250, songTextY + 2, "GJ_GameSheet03", "edit_leftBtn_001.png").setScale(1.2).setFlipX(false).setInteractive(); + const nextSong = this.add.image(250, songTextY + 2, "GJ_GameSheet03", "edit_leftBtn_001.png").setScale(1.2).setFlipX(true).setInteractive(); + + inner.add([prevSong, nextSong]); + + let customInputBeforeFocus = customInput; + + const stopInputEvent = (event) => { + event?.preventDefault?.(); + event?.stopPropagation?.(); + event?.stopImmediatePropagation?.(); + }; + + const blurCustomSongInput = (commit = false) => { + if (!customFocused) return; + + customFocused = false; + this._editorTextInputFocused = false; + + if (commit) { + commitCustomSongDraft(); + } + + updateSongUi(); + }; + + const cancelCustomSongInput = () => { + if (!customFocused) return; + + customInput = customInputBeforeFocus; + customFocused = false; + this._editorTextInputFocused = false; + updateSongUi(); + }; + + const focusCustomSongInput = (pointer = null) => { + if (songCategory !== "custom") return; + + customInputBeforeFocus = customInput; + customFocused = true; + this._editorTextInputFocused = true; + updateSongUi(); + stopInputEvent(pointer?.event); + }; + + const fitSongTextToArrows = () => { + const maxFontSize = songCategory === "custom" + ? ((!customFocused && !customInput) ? 30 : 42) + : 50; + const minFontSize = 8; + const padding = 18; + let maxTextW = customSongInputW - 34; + + if (songCategory !== "custom") { + const prevW = prevSong.displayWidth || prevSong.width || 0; + const nextW = nextSong.displayWidth || nextSong.width || 0; + + const leftLimit = prevSong.x + (prevW / 2) + padding; + const rightLimit = nextSong.x - (nextW / 2) - padding; + maxTextW = Math.max(40, rightLimit - leftLimit); + } + + songText.setScale(1); + + for (let size = maxFontSize; size >= minFontSize; size -= 2) { + songText.setFontSize(size); + + if (songText.width <= maxTextW) { + return; + } + } + + if (songText.width > maxTextW && songText.width > 0) { + songText.setScale(maxTextW / songText.width); + } + }; + + const setSongText = (value) => { + songText.setText(value); + fitSongTextToArrows(); + }; + + const drawCustomSongInput = () => { + customSongInputBg.clear(); + + if (songCategory !== "custom") { + customSongInputHit.setVisible(false); + customSongInputHit.disableInteractive(); + return; + } + + customSongInputHit.setVisible(true); + customSongInputHit.setInteractive(); + + customSongInputBg.fillStyle(0x000000, 0.42); + customSongInputBg.fillRoundedRect( + -(customSongInputW / 2), + songTextY - (customSongInputH / 2), + customSongInputW, + customSongInputH, + customSongInputRadius + ); + }; + + const updateSongUi = () => { + const setTabVisual = (tab, selected) => { + const selectedTexture = this.textures.exists("GJ_button01") ? "GJ_button01" : tab.bg.texture.key; + const deselectedTexture = this.textures.exists("GJ_button04") ? "GJ_button04" : selectedTexture; + + tab.bg.setTexture(selected ? selectedTexture : deselectedTexture); + tab.bg.clearTint(); + tab.text.clearTint(); + }; + + setTabVisual(normalTab, songCategory === "normal"); + setTabVisual(customTab, songCategory === "custom"); + + prevSong.setVisible(songCategory === "normal"); + nextSong.setVisible(songCategory === "normal"); + drawCustomSongInput(); + + if (songCategory === "normal") { + songText.setAlpha(1); + songText.clearTint(); + + const songs = window.allLevels || []; + + if (!songs.length) { + setSongText("No normal songs loaded"); + return; + } + + normalIndex = Phaser.Math.Wrap(normalIndex, 0, songs.length); + + const song = songs[normalIndex]; + const title = song?.[1] || `Song ${normalIndex + 1}`; + + setSongText(`${String(normalIndex + 1).padStart(2, "0")}: ${title}`); + } else { + const customPlaceholderVisible = !customFocused && !customInput; + + songText.setAlpha(1); + if (customPlaceholderVisible) { + songText.setTint(0x75aaf0); + } else { + songText.clearTint(); + } + setSongText( + customFocused + ? `${customInput}|` + : customInput + ? customInput + : "Newgrounds Song ID" + ); + } + }; + + const commitNormalSongDraft = () => { + const songs = window.allLevels || []; + if (!songs.length) return; + + normalIndex = Phaser.Math.Wrap(normalIndex, 0, songs.length); + + const song = songs[normalIndex]; + const title = song?.[1] || `Song ${normalIndex + 1}`; + + this._setEditorSongDraft(-(normalIndex + 1), title); + }; + + const commitCustomSongDraft = () => { + const id = parseInt(customInput || "0", 10); + + if (!id || id <= 0) return; + + this._setEditorSongDraft(id, `NG#${id}`); + }; + + this._makeBouncyButton(prevSong, 1.2, () => { + const songs = window.allLevels || []; + if (!songs.length) return; + + normalIndex = Phaser.Math.Wrap(normalIndex - 1, 0, songs.length); + commitNormalSongDraft(); + updateSongUi(); + }); + + this._makeBouncyButton(nextSong, 1.2, () => { + const songs = window.allLevels || []; + if (!songs.length) return; + + normalIndex = Phaser.Math.Wrap(normalIndex + 1, 0, songs.length); + commitNormalSongDraft(); + updateSongUi(); + }); + + customSongInputHit.on("pointerdown", (pointer) => { + focusCustomSongInput(pointer); + }); + + dim.on("pointerdown", () => { + blurCustomSongInput(false); + }); + + this._editorLevelSettingsKeyHandler = (event) => { + if (!this._editorLevelSettingsPopup) return; + if (songCategory !== "custom" || !customFocused) return; + + if (event.key === "Escape") { + cancelCustomSongInput(); + stopInputEvent(event); + return; + } + + if (event.key === "Enter") { + blurCustomSongInput(true); + stopInputEvent(event); + return; + } + + if (event.key === "Backspace") { + customInput = customInput.slice(0, -1); + updateSongUi(); + stopInputEvent(event); + return; + } + + if (/^[0-9]$/.test(event.key) && customInput.length < 12) { + customInput += event.key; + updateSongUi(); + stopInputEvent(event); + return; + } + + if (event.key.length === 1 || ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", " "].includes(event.key)) { + stopInputEvent(event); + } + }; + + window.addEventListener("keydown", this._editorLevelSettingsKeyHandler); + + updateSongUi(); + + this._makeEditorOkButton(inner, 0, (panelH / 2) - 45, "OK", () => { + if (songCategory === "custom") { + commitCustomSongDraft(); + } + + this._closeEditorLevelSettingsPopup(); + }); +}; + +_initEditorPauseMenu = () => { + this._uhdContext = 'editorPause'; + this._editorMenuContainer = this.add.container(0, 0).setDepth(2000).setVisible(false); + + const bgDim = this.add.rectangle(0, 0, screenWidth, screenHeight, 0x000000, 0.6) + .setOrigin(0) + .setInteractive(); + this._editorMenuContainer.add(bgDim); + + const buttonData = [ + { text: "Resume", cb: () => this._showEditorPauseMenu(false) }, + { + text: "Save and Play", + cb: async () => { + this._showEditorPauseMenu(false); + this._stopEditorPlaytest?.(); + this._saveEditorLevel(); + await this._showLoadingBuffer("Loading..."); + window.isEditor = false; + this.game.registry.set("autoStartGame", true); + this.scene.restart(); + } + }, + { + text: "Save and Exit", + cb: async () => { + this._showEditorPauseMenu(false); + this._stopEditorPlaytest?.(); + this._saveEditorLevel(); + await this._showLoadingBuffer("Loading..."); + window.isEditor = false; + this.scene.restart(); + } + }, + { text: "Save", cb: () => this._saveEditorLevel() }, + { text: "Exit", cb: () => { this._showEditorPauseMenu(false); this._stopEditorPlaytest?.(); window.isEditor = false; this.scene.restart(); } } + ]; + + buttonData.forEach((data, i) => { + const x = screenWidth / 2; + const y = (screenHeight / 2) - 150 + (i * 70); + + const btnImg = this.add.nineslice(x, y, "GJ_button01", null, 450, 65, 24, 24, 24, 24 ).setScale(0.75).setInteractive(); + const label = this.add.bitmapText(x, y - 2, "goldFont", data.text, 40).setOrigin(0.5, 0.5).setScale(0.8); + + this._editorMenuContainer.add([btnImg, label]); + + this._makeCompositeBouncyButton(btnImg, [btnImg, label], 0.75, () => { + data.cb(); + }, () => true); + }); + + const createToggle = (container, x, y, label, getVal, setVal, callback = null) => { + const getTex = () => getVal() ? "GJ_checkOn_001.png" : "GJ_checkOff_001.png"; + const check = this.add.image(x - 120, y, "GJ_GameSheet03", getTex()).setScale(0.8).setInteractive(); + const txt = this.add.bitmapText(x - 70, y, "bigFont", label, 25).setOrigin(0, 0.5); + container.add([check, txt]); + + this._makeBouncyButton(check, 0.8, () => { + setVal(!getVal()); + check.setTexture("GJ_GameSheet03", getTex()); + if (callback) callback(getVal()); + this._saveSettings(); + }); + }; + + createToggle(this._editorMenuContainer, 200, screenHeight - 60, "Show Glow", () => window.showEditorGlow, v => window.showEditorGlow = v,() => { + this._level._updateGlowVisibility(); + this._buildObjectGrid?.(); + } +); + // Init runs mid editor-GUI creation; reset so the toolbox images created after + // this call don't get tagged with the pause-menu context. + this._uhdContext = null; +}; + +_showLoadingBuffer = (statusText) => { + return new Promise((resolve) => { + const overlay = this.add.graphics().setDepth(2000).setScrollFactor(0); + overlay.fillStyle(0x000000, 1); + overlay.fillRect(0, 0, screenWidth, screenHeight); + + const loadingText = this.add.bitmapText( + screenWidth - 40, + screenHeight - 20, + "bigFont", + statusText, + 50 + ).setOrigin(1).setDepth(2001).setScrollFactor(0); + + setTimeout(() => { + resolve(); + }, 2500); + }); +}; + +_showEditorPauseMenu = (show) => { + this._editorMenuContainer.setVisible(show); + window.isEditorPaused = show; + window.isEditorPause = show; + + if (this._editorPlaytestControls && !this._editorPlaytestActive) { + this._editorPlaytestControls.setVisible(true); + this._editorPlaytestControls.setDepth(show ? 900 : 1500); + } +}; + +_serializeLevel(levelData) { + const settings = levelData.settings || ""; + const objectStrings = (levelData.objects || []).map(this._serializeObject).filter(Boolean); + const decompressedString = [settings, ...objectStrings].join(";"); + const compressed = pako.gzip(decompressedString); + + let binaryString = ""; + for (let i = 0; i < compressed.length; i++) { + binaryString += String.fromCharCode(compressed[i]); + } + + let base64 = btoa(binaryString); + + return base64 + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=+$/, ""); +} + +_serializeObject(object) { + if (!object || !object.id) { + return ""; + } + + let objectData = { ...(object._raw || {}) }; + + objectData[1] = String(object.id); + objectData[2] = String(object.x ?? 0); + objectData[3] = String(object.y ?? 0); + objectData[4] = object.flipX ? "1" : "0"; + objectData[5] = object.flipY ? "1" : "0"; + objectData[6] = String(object.rot ?? 0); + + objectData[32] = String(object.scale ?? 1); + + objectData[24] = String(object.zLayer ?? 0); + objectData[25] = String(object.zOrder ?? 0); + + objectData[57] = object.groups ?? ""; + + objectData[21] = String(object.color1 ?? 0); + objectData[22] = String(object.color2 ?? 0); + + objectData["kA2"] = String(object.gameMode ?? 0); + objectData["kA3"] = String(object.miniMode ?? 0); + objectData["kA4"] = String(object.speed ?? 0); + objectData["kA28"] = String(object.mirrored ?? 0); + objectData["kA11"] = object.flipGravity ? "1" : "0"; + + const parts = []; + + for (const key in objectData) { + if (objectData[key] === undefined) continue; + parts.push(key, String(objectData[key])); + } + + return parts.join(","); +} + +_saveEditorLevel = () => { + const levelData = { + objects: window.levelObjects, + settings: window.settingslist + }; + + const newLevelString = this._serializeLevel(levelData); + + let createdLevels = JSON.parse(localStorage.getItem("created_levels") || "[]"); + let levelIndex = createdLevels.findIndex(l => l.createdId === window.currentlevel[2]); + + if (levelIndex !== -1) { + createdLevels[levelIndex].levelString = newLevelString; + createdLevels[levelIndex].lastModified = Date.now(); + + if (this._editorPendingSongId !== undefined) { + createdLevels[levelIndex].songId = this._editorPendingSongId; + createdLevels[levelIndex].song = this._editorPendingSongName || createdLevels[levelIndex].song; + } + + localStorage.setItem("created_levels", JSON.stringify(createdLevels)); + + window._onlineLevelString = createdLevels[levelIndex].levelString; + window._onlineLevelName = createdLevels[levelIndex].levelName; + window._onlineLevelId = createdLevels[levelIndex].createdId; + + this._editorPendingSongId = undefined; + this._editorPendingSongName = undefined; + } +}; + +_initEditorTimeline = () => { + const y = 40; + this._timelineContainer = this.add.container(0, 0).setScrollFactor(0).setDepth(1500); + const width = screenWidth / 3; + const groove = this.add.image(screenWidth / 2, y, "slidergroove2").setDisplaySize(width, 26); + const thumb = this.add.image(screenWidth / 2, y, "GJ_moveBtn").setScale(0.4).setInteractive({ draggable: true }); + this._timelineContainer.add([groove, thumb]); + this._timelineSlider = {width, groove, thumb, y }; + const startX = screenWidth / 2 - (width / 2); + thumb.on("dragstart", () => { + this._isDraggingSlider = true; + thumb.setTexture("GJ_moveSBtn"); + }); + thumb.on("drag", (pointer, dragX) => { + const minX = startX; + const maxX = startX + width; + thumb.x = Phaser.Math.Clamp(dragX, minX, maxX); + const pct = (thumb.x - minX) / width; + const levelWidth = this._getEditorLevelWidth(); + this._cameraX = pct * levelWidth; + this._level.container.x = -this._cameraX; + this._level.container.y = -this._cameraY; + this._level.additiveContainer.x = -this._cameraX; + this._level.additiveContainer.y = -this._cameraY; + this._level.topContainer.x = -this._cameraX; + this._level.topContainer.y = -this._cameraY; + this._bg.tilePositionX = this._cameraX * 0.1; + }); + thumb.on("dragend", () => { + thumb.setTexture("GJ_moveBtn"); + }); +}; + +_getEditorLevelWidth = () => { + let furthestX = 0; + + for (const obj of window.levelObjects) { + if (!obj) continue; + + const worldX = (obj.x - 15) * 2; + + if (worldX > furthestX) { + furthestX = worldX; + } + } + + return Math.max(screenWidth, furthestX + screenWidth/2); +}; + +_updateEditorTimeline = () => { + if (!this._timelineSlider) return; + + const { + width, + thumb, + } = this._timelineSlider; + + const levelWidth = this._getEditorLevelWidth(); + + const pct = Phaser.Math.Clamp( + this._cameraX / levelWidth, + 0, + 1 + ); + + const startX = screenWidth / 2 - (width / 2); + + thumb.x = startX + (pct * width); +}; + +_applyMirrorEffect() { + const isMirrored = this._state.mirrored; + const containers = [this._level.additiveContainer, this._level.container, this._level.topContainer]; + if (isMirrored) { + for (const c of containers) { + c.scaleX = -1; + c.x = this._cameraX + screenWidth; + } + for (const tile of this._level._groundTiles) { + tile.x = screenWidth - tile.x - this._level._tileW; + tile.setFlipX(true); + } + for (const tile of this._level._ceilingTiles) { + tile.x = screenWidth - tile.x - this._level._tileW; + tile.setFlipX(true); + } + } else { + for (const c of containers) { + if (c.scaleX !== 1) c.scaleX = 1; + } + for (const tile of this._level._groundTiles) { + tile.setFlipX(false); + } + for (const tile of this._level._ceilingTiles) { + tile.setFlipX(false); + } + } + this._bg.setFlipX(isMirrored); + } + _getMirrorXOffset(xOffset) { + return this._state.mirrored ? screenWidth - xOffset : xOffset; + } + _enableDualMode() { + if (this._isDual) return; + this._isDual = true; + this._state2.reset(); + this._state2.y = this._state.y; + this._state2.yVelocity = 0; + this._state2.onGround = false; + this._state2.gravityFlipped = !this._state.gravityFlipped; + this._state2.isMini = this._state.isMini; + this._state2.mirrored = this._state.mirrored; + this._state2.isDead = false; + this._player2.reset(); + if (this._state.isFlying) { + this._player2.enterShipMode(); + } else if (this._state.isBall) { + this._player2.enterBallMode(); + } else if (this._state.isWave) { this._player2.enterWaveMode(); } else if (this._state.isUfo) { this._player2.enterUfoMode(); - } else if (this._state.isRobot) { - this._player2.enterRobotMode(); } else if (this._state.isSpider) { this._player2.enterSpiderMode(); } else { @@ -6800,13 +13103,20 @@ _applyMirrorEffect() { this._player2.setShipVisible(false); this._player2.setBallVisible(false); this._player2.setWaveVisible(false); - this._player2.setRobotVisible(false); } _showNewBest() { let _0x9f2437 = screenWidth / 2; - let _0x12bde3 = this.add.image(0, 0, "GJ_WebSheet", "GJ_newBest_001.png").setOrigin(0.5, 1); + let _0x12bde3 = this.add.image(0, 0, "GJ_GameSheet03", "GJ_newBest_001.png").setOrigin(0.5, 1); let _0x544c9c = this.add.bitmapText(0, 2, "bigFont", this._lastPercent + "%", 65).setOrigin(0.5, 0).setScale(1.1); - let _0x326cb9 = this.add.container(_0x9f2437, 300, [_0x12bde3, _0x544c9c]).setScrollFactor(0).setDepth(60).setScale(0.01); + const containerChildren = [_0x12bde3, _0x544c9c]; + const orbDelta = this._newBestOrbDelta || 0; + if (orbDelta > 0) { + const orbIcon = this.add.image(-30, 80, "GJ_GameSheet03", "currencyOrbIcon_001.png").setOrigin(0.5, 0.5).setScale(0.5); + const orbText = this.add.bitmapText(-8, 80, "bigFont", "+" + orbDelta, 28).setOrigin(0, 0.5).setTint(0x00ffff); + containerChildren.push(orbIcon, orbText); + this._newBestOrbDelta = 0; + } + let _0x326cb9 = this.add.container(_0x9f2437, 300, containerChildren).setScrollFactor(0).setDepth(60).setScale(0.01); this.tweens.add({ targets: _0x326cb9, scale: 1, @@ -6832,8 +13142,112 @@ _applyMirrorEffect() { _triggerEndPortal() { this._player.playEndAnimation(this._level.endXPos, () => this._levelComplete(), this._endPortalGameY); } + _onCoinCollected() { + this._coinsCollected++; + this._audio.playEffect("highscoreGet02"); + } + _getAchievements() { + return [ + { id: "stereo_bump", name: "Stereo Bump.", desc: "Complete Stereo Madness in Practice mode", level: "level_1", mode: "practice", reward: "Colour 4" }, + { id: "stereo_madness", name: "Stereo Madness!", desc: "Complete Stereo Madness in Normal mode", level: "level_1", mode: "normal", reward: "Cube 5" }, + { id: "on_my_way", name: "On my way!", desc: "Complete Back On Track in Practice mode", level: "level_2", mode: "practice", reward: "Colour 5" }, + { id: "back_on_track", name: "Back On Track!", desc: "Complete Back On Track in Normal mode", level: "level_2", mode: "normal", reward: "Cube 6" }, + { id: "polarbear", name: "Polarbear", desc: "Complete Polargeist in Practice mode", level: "level_3", mode: "practice", reward: "Colour 6" }, + { id: "polargeist", name: "Polargeist!!", desc: "Complete Polargeist in Normal mode", level: "level_3", mode: "normal", reward: "Cube 7" }, + { id: "dehydrated", name: "Dehydrated", desc: "Complete Dry Out in Practice mode", level: "level_4", mode: "practice", reward: "Colour 7" }, + { id: "dry_out", name: "Dry Out!", desc: "Complete Dry Out in Normal mode", level: "level_4", mode: "normal", reward: "Cube 8" }, + { id: "all_your_base", name: "All your base...", desc: "Complete Base After Base in Practice mode", level: "level_5", mode: "practice", reward: "Colour 8" }, + { id: "base_after_base", name: "Base After Base!", desc: "Complete Base After Base in Normal mode", level: "level_5", mode: "normal", reward: "Cube 9" }, + { id: "hold_on", name: "Hold on", desc: "Complete Can't Let Go in Practice mode", level: "level_6", mode: "practice", reward: "Colour 9" }, + { id: "cant_let_go", name: "Can't Let Go!", desc: "Complete Can't Let Go in Normal mode", level: "level_6", mode: "normal", reward: "Cube 10" }, + { id: "hop_hop", name: "Hop Hop...", desc: "Complete Jumper in Practice mode", level: "level_7", mode: "practice", reward: "Colour 10" }, + { id: "jumper", name: "Jumper!", desc: "Complete Jumper in Normal mode", level: "level_7", mode: "normal", reward: "Cube 11" }, + { id: "tick_tock", name: "Tick Tock", desc: "Complete Time Machine in Practice mode", level: "level_8", mode: "practice", reward: "Colour 12" }, + { id: "time_machine", name: "Time Machine!", desc: "Complete Time Machine in Normal mode", level: "level_8", mode: "normal", reward: "Cube 14" }, + { id: "loops", name: "Loops", desc: "Complete Cycles in Practice mode", level: "level_9", mode: "practice", reward: "Cube 15" }, + { id: "cycles", name: "Cycles!", desc: "Complete Cycles in Normal mode", level: "level_9", mode: "normal", reward: "Cube 16" }, + { id: "ystep", name: "yStep", desc: "Complete xStep in Practice mode", level: "level_10", mode: "practice", reward: "Cube 17" }, + { id: "xstep", name: "xStep!", desc: "Complete xStep in Normal mode", level: "level_10", mode: "normal", reward: "Cube 18" }, + { id: "funky", name: "Funky", desc: "Complete Clutterfunk in Practice mode", level: "level_11", mode: "practice", reward: "Colour 13" }, + { id: "clutterfunk", name: "Clutterfunk!", desc: "Complete Clutterfunk in Normal mode", level: "level_11", mode: "normal", reward: "Ship 2" }, + { id: "theory_of_something", name: "Theory of Something", desc: "Complete Theory of Everything in Practice mode", level: "level_12", mode: "practice", reward: "Colour 14" }, + { id: "theory_of_everything", name: "Theory of Everything!", desc: "Complete Theory of Everything in Normal mode", level: "level_12", mode: "normal", reward: "Cube 27" }, + { id: "electro_time", name: "Electro Time", desc: "Complete Electroman Adventures in Practice mode", level: "level_13", mode: "practice", reward: "Colour 16" }, + { id: "electroman_adventures", name: "Electroman Adventures!", desc: "Complete Electroman Adventures in Normal mode", level: "level_13", mode: "normal", reward: "Ship 9" }, + { id: "clubbin", name: "Clubbin", desc: "Complete Clubstep in Practice mode", level: "level_14", mode: "practice", reward: "UFO 2" }, + { id: "clubstep", name: "Clubstep!", desc: "Complete Clubstep in Normal mode", level: "level_14", mode: "normal", reward: "Colour 15" }, + { id: "electromaniac", name: "Electromaniac", desc: "Complete Electrodynamix in Practice mode", level: "level_15", mode: "practice", reward: "Colour 17" }, + { id: "electrodynamix", name: "Electrodynamix!", desc: "Complete Electrodynamix in Normal mode", level: "level_15", mode: "normal", reward: "Cube 35" }, + { id: "hexagonest", name: "Hexagonest", desc: "Complete Hexagon Force in Practice mode", level: "level_16", mode: "practice", reward: "Colour 18" }, + { id: "hexagon_force", name: "Hexagon Force!", desc: "Complete Hexagon Force in Normal mode", level: "level_16", mode: "normal", reward: "Cube 42" }, + { id: "blast_power", name: "Blast Power", desc: "Complete Blast Processing in Practice mode", level: "level_17", mode: "practice", reward: "Colour 20" }, + { id: "blast_processing", name: "Blast Processing!", desc: "Complete Blast Processing in Normal mode", level: "level_17", mode: "normal", reward: "Cube 44" }, + { id: "second_theory", name: "Second Theory", desc: "Complete Theory of Everything 2 in Practice mode", level: "level_18", mode: "practice", reward: "Colour 21" }, + { id: "toe2", name: "Theory of Everything 2!", desc: "Complete Theory of Everything 2 in Normal mode", level: "level_18", mode: "normal", reward: "Cube 45" }, + { id: "geometry_warrior", name: "Geometry Warrior", desc: "Complete Geometrical Dominator in Practice mode", level: "level_19", mode: "practice", reward: "Colour 24" }, + { id: "geometrical_dominator", name: "Geometrical Dominator!", desc: "Complete Geometrical Dominator in Normal mode", level: "level_19", mode: "normal", reward: "Robot 3" }, + { id: "living_open", name: "Living Open", desc: "Complete Deadlocked in Practice mode", level: "level_20", mode: "practice", reward: "Colour 25" }, + { id: "deadlocked", name: "Deadlocked!", desc: "Complete Deadlocked in Normal mode", level: "level_20", mode: "normal", reward: "Robot 5" }, + { id: "fingerdash_practice", name: "Fingerdash", desc: "Complete Fingerdash in Practice mode", level: "level_21", mode: "practice", reward: "Colour 29" }, + { id: "fingerdash_normal", name: "Fingerdash!", desc: "Complete Fingerdash in Normal mode", level: "level_21", mode: "normal", reward: "Cube 74" }, + ]; + } + _checkAchievements(levelId, mode) { + let earned; + try { earned = JSON.parse(localStorage.getItem("gd_achievements") || "[]"); } catch(e) { earned = []; } + const newAchievements = []; + for (const ach of this._getAchievements()) { + if (ach.level === levelId && ach.mode === mode && !earned.includes(ach.id)) { + earned.push(ach.id); + newAchievements.push(ach); + } + } + if (newAchievements.length > 0) { + localStorage.setItem("gd_achievements", JSON.stringify(earned)); + this._pendingAchievements = (this._pendingAchievements || []).concat(newAchievements); + } + } + _showAchievementNotification() { + if (!this._pendingAchievements || this._pendingAchievements.length === 0) return; + const ach = this._pendingAchievements.shift(); + const cx = screenWidth / 2; + const bannerW = 500; + const bannerH = 70; + const bannerY = -bannerH; + const banner = this.add.container(cx, bannerY).setScrollFactor(0).setDepth(300); + const bg = this.add.rectangle(0, 0, bannerW, bannerH, 0x000000, 0.85).setStrokeStyle(2, 0xffff00); + const title = this.add.bitmapText(0, -12, "bigFont", ach.name, 24).setOrigin(0.5, 0.5).setTint(0xffff00); + const desc = this.add.bitmapText(0, 18, "goldFont", ach.reward, 22).setOrigin(0.5, 0.5); + banner.add([bg, title, desc]); + this.tweens.add({ + targets: banner, + y: 50, + duration: 500, + ease: "Bounce.Out", + onComplete: () => { + this.tweens.add({ + targets: banner, + y: bannerY, + duration: 300, + delay: 2000, + ease: "Quad.In", + onComplete: () => { + banner.destroy(); + this._showAchievementNotification(); + } + }); + } + }); + } + _starsToOrbs(stars) { + const orbTable = { 1:0, 2:0, 3:0, 4:125, 5:175, 6:225, 7:275, 8:350, 9:425, 10:500, 11:500, 12:500, 13:500, 14:500, 15:500 }; + return orbTable[stars] || stars * 50; + } _levelComplete() { + this._starsAwarded = 0; + this._orbsAwarded = 0; if (!this._practicedMode.practiceMode) { + const prevBest = this._bestPercent || 0; this._bestPercent = 100; localStorage.setItem("bestPercent_" + (window.currentlevel[2] || "level_1"), 100); const completedKey = "gd_completedSet"; @@ -6845,6 +13259,34 @@ _applyMirrorEffect() { localStorage.setItem(completedKey, JSON.stringify(completedSet)); window._completedLevels = completedSet.length; localStorage.setItem("gd_completedLevels", window._completedLevels); + const levelStars = window.currentlevel[4] || 0; + if (levelStars > 0) { + this._starsAwarded = levelStars; + window._totalStars = (window._totalStars || 0) + levelStars; + localStorage.setItem("gd_totalStars", window._totalStars); + const maxOrbs = this._starsToOrbs(levelStars); + const progressPool = maxOrbs * 0.8; + const completionBonus = Math.round(maxOrbs * 0.2); + const alreadyEarned = Math.round(progressPool * prevBest / 100); + const remainingProgress = Math.round(progressPool) - alreadyEarned; + this._orbsAwarded = remainingProgress + completionBonus; + if (this._orbsAwarded > 0) { + window._totalOrbs = (window._totalOrbs || 0) + this._orbsAwarded; + localStorage.setItem("gd_totalOrbs", window._totalOrbs); + } + } + } + if (this._coinsCollected > 0 && this._coinTotal > 0) { + const coinKey = "coins_" + levelId; + let savedCoins; + try { savedCoins = JSON.parse(localStorage.getItem(coinKey) || "[]"); } catch(e) { savedCoins = []; } + const coinSprites = this._level._coinSprites; + for (let i = 0; i < coinSprites.length; i++) { + if (coinSprites[i] && !coinSprites[i].visible && !savedCoins.includes(i)) { + savedCoins.push(i); + } + } + localStorage.setItem(coinKey, JSON.stringify(savedCoins)); } } else { this._practiceBestPercent = 100; @@ -6858,6 +13300,9 @@ _applyMirrorEffect() { this.time.delayedCall(_0x481f7c * 50, () => circleEffect(this, _0x356782, _0x2d967b, 10, screenWidth, 500, false, true, window.mainColor)); } circleEffect(this, _0x356782, _0x2d967b, 10, 1000, 500, true, false, window.mainColor); + const levelId = window.currentlevel[2] || "level_1"; + const mode = this._practicedMode.practiceMode ? "practice" : "normal"; + this._checkAchievements(levelId, mode); this._showCompleteEffect(); } _showCompleteEffect() { @@ -6950,7 +13395,7 @@ _applyMirrorEffect() { const _0x56628c = screenWidth / 2; const _0x45ab26 = this._practicedMode.practiceMode ? this.add.image(_0x56628c, 250, "GJ_GameSheet03", "GJ_practiceComplete_001.png").setScrollFactor(0).setDepth(60).setScale(0.01) - : this.add.image(_0x56628c, 250, "GJ_WebSheet", "GJ_levelComplete_001.png").setScrollFactor(0).setDepth(60).setScale(0.01); + : this.add.image(_0x56628c, 250, "GJ_GameSheet03", "GJ_levelComplete_001.png").setScrollFactor(0).setDepth(60).setScale(0.01); this.tweens.add({ targets: _0x45ab26, scale: 1.1, @@ -7046,25 +13491,25 @@ _applyMirrorEffect() { onUpdate: () => { this._endLayerInternal.y = _0x59b9ab.p * 650 - 640; }, - onComplete: () => this._playStarAward() + onComplete: () => { this._playStarAward(); this.time.delayedCall(800, () => this._showAchievementNotification()); } }); const _0x595215 = 712; const _0x950c8d = 460; const _0x2a115c = (screenWidth - _0x595215) / 2; this._endLayerInternal.add(this.add.rectangle(_0x2a115c + 356, 310, _0x595215, _0x950c8d, 0, 180 / 255)); - const _0x43f2e3 = this.textures.getFrame("GJ_WebSheet", "GJ_table_side_001.png"); + const _0x43f2e3 = this.textures.getFrame("GJ_GameSheet03", "GJ_table_side_001.png"); const _0x3feccc = _0x43f2e3 ? _0x950c8d / _0x43f2e3.height : 1; - this._endLayerInternal.add(this.add.image(_0x2a115c - 40, 80, "GJ_WebSheet", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, _0x3feccc)); - this._endLayerInternal.add(this.add.image(_0x2a115c + _0x595215 + 40, 80, "GJ_WebSheet", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, _0x3feccc)); - const _0x33b564 = this.add.image(_0x2a115c + 356, 70, "GJ_WebSheet", "GJ_table_top_001.png"); + this._endLayerInternal.add(this.add.image(_0x2a115c - 40, 80, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, _0x3feccc)); + this._endLayerInternal.add(this.add.image(_0x2a115c + _0x595215 + 40, 80, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, _0x3feccc)); + const _0x33b564 = this.add.image(_0x2a115c + 356, 70, "GJ_GameSheet03", "GJ_table_top_001.png"); this._endLayerInternal.add(_0x33b564); - this._endLayerInternal.add(this.add.image(_0x2a115c + 356, 560, "GJ_WebSheet", "GJ_table_bottom_001.png")); + this._endLayerInternal.add(this.add.image(_0x2a115c + 356, 560, "GJ_GameSheet03", "GJ_table_bottom_001.png")); const _0x3e9c79 = _0x33b564.y - 35; this._endLayerInternal.add(this.add.image(containerX - 312, _0x3e9c79, "GJ_WebSheet", "chain_01_001.png").setOrigin(0.5, 1)); this._endLayerInternal.add(this.add.image(containerX + 312, _0x3e9c79, "GJ_WebSheet", "chain_01_001.png").setOrigin(0.5, 1)); const _completeBanner = this._practicedMode.practiceMode ? this.add.image(containerX, 170, "GJ_GameSheet03", "GJ_practiceComplete_001.png").setScale(0.8) - : this.add.image(containerX, 170, "GJ_WebSheet", "GJ_levelComplete_001.png").setScale(0.8); + : this.add.image(containerX, 170, "GJ_GameSheet03", "GJ_levelComplete_001.png").setScale(0.8); this._endLayerInternal.add(_completeBanner); const _0x45b6e4 = 0.8; let _0xe44f6d = 250; @@ -7087,21 +13532,6 @@ _applyMirrorEffect() { const _0x8e2b = ["\x5f\x6d\x61\x63\x72\x6f\x42\x6f\x74", "\x70\x6c\x61\x79\x69\x6e\x67"];let _0x3bc14 = 0xffffff; try {if (this[_0x8e2b[0]] && this[_0x8e2b[0]][_0x8e2b[1]]) {_0x3bc14 = (_0x3bc14 & 0xffff00) | 0xfa;}} catch (_0xe31) {}const _0x17fa2b = this.add.bitmapText(containerX + _0x45540f, _0x241209, "bigFont", _0x165c06, 40).setOrigin(0.5, 0.5).setScale(0.8).setCenterAlign();if (_0x3bc14 !== 0xffffff) _0x17fa2b.setTint(_0x3bc14); this._endLayerInternal.add(_0x17fa2b); this._endLayerInternal.add(this.add.image(containerX - _0x45540f, 352.5, "GJ_WebSheet", "getIt_001.png").setScale(1 / 1.5)); - const _0x34b1bd = [{ - key: "downloadApple_001", - url: "https://discord.gg/TfEzAVWPSJ" - }, { - key: "downloadSteam_001", - url: "https://github.com/web-dashers/web-dashers.github.io" - }]; - for (let _0x10f8cc = 0; _0x10f8cc < _0x34b1bd.length; _0x10f8cc++) { - const _0xd7310b = _0x34b1bd[_0x10f8cc]; - const _0x1e3f82 = (_0x10f8cc - 1) * _0x45540f; - const _0x55a82e = 1 / 1.5; - const _0x4c7fb8 = this.add.image(containerX + _0x1e3f82, 437.5, "GJ_WebSheet", _0xd7310b.key + ".png").setScale(_0x55a82e).setInteractive(); - this._endLayerInternal.add(_0x4c7fb8); - this._makeBouncyButton(_0x4c7fb8, _0x55a82e, () => window.open(_0xd7310b.url, "_blank")); - } _0x2de55e.width; this._endStarX = containerX + _0x45540f; this._endStarY = _0x241209 - 77.5; @@ -7134,12 +13564,13 @@ _applyMirrorEffect() { } }]; for (const _0x2d4335 of _0x45fc2b) { - const _0xdde774 = this.add.image(containerX + _0x2d4335.dx, 555, "GJ_WebSheet", _0x2d4335.frame).setInteractive(); + const _0xdde774 = this.add.image(containerX + _0x2d4335.dx, 555, "GJ_GameSheet03", _0x2d4335.frame).setInteractive(); this._endLayerInternal.add(_0xdde774); this._makeBouncyButton(_0xdde774, 1, _0x2d4335.action); } } _showSettingsScreen() { + this._uhdContext = 'settings'; this._settingsScreenClosing = false; if (this._pauseBtn) { this.tweens.add({ @@ -7177,13 +13608,13 @@ _applyMirrorEffect() { const _0x950c8d = 460; const _0x2a115c = (screenWidth - _0x595215) / 2; this._settingsLayerInternal.add(this.add.rectangle(_0x2a115c + 356, 310, _0x595215, _0x950c8d, 0, 180 / 255)); - const _0x43f2e3 = this.textures.getFrame("GJ_WebSheet", "GJ_table_side_001.png"); + const _0x43f2e3 = this.textures.getFrame("GJ_GameSheet03", "GJ_table_side_001.png"); const _0x3feccc = _0x43f2e3 ? _0x950c8d / _0x43f2e3.height : 1; - this._settingsLayerInternal.add(this.add.image(_0x2a115c - 40, 80, "GJ_WebSheet", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, _0x3feccc)); - this._settingsLayerInternal.add(this.add.image(_0x2a115c + _0x595215 + 40, 80, "GJ_WebSheet", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, _0x3feccc)); - const _0x33b564 = this.add.image(_0x2a115c + 356, 70, "GJ_WebSheet", "GJ_table_top_001.png"); + this._settingsLayerInternal.add(this.add.image(_0x2a115c - 40, 80, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, _0x3feccc)); + this._settingsLayerInternal.add(this.add.image(_0x2a115c + _0x595215 + 40, 80, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, _0x3feccc)); + const _0x33b564 = this.add.image(_0x2a115c + 356, 70, "GJ_GameSheet03", "GJ_table_top_001.png"); this._settingsLayerInternal.add(_0x33b564); - this._settingsLayerInternal.add(this.add.image(_0x2a115c + 356, 560, "GJ_WebSheet", "GJ_table_bottom_001.png")); + this._settingsLayerInternal.add(this.add.image(_0x2a115c + 356, 560, "GJ_GameSheet03", "GJ_table_bottom_001.png")); const _0x3e9c79 = _0x33b564.y - 35; this._settingsLayerInternal.add(this.add.image(containerX - 312, _0x3e9c79, "GJ_WebSheet", "chain_01_001.png").setOrigin(0.5, 1)); this._settingsLayerInternal.add(this.add.image(containerX + 312, _0x3e9c79, "GJ_WebSheet", "chain_01_001.png").setOrigin(0.5, 1)); @@ -7242,8 +13673,18 @@ _applyMirrorEffect() { _makeSettingsBtn(_sColL, _sRow1Y, "Account", _sBtnW2, false, null); _makeSettingsBtn(_sColR, _sRow1Y, "How To Play", _sBtnW2, true, () => { this._buildHowToPlayPopup(); }); - _makeSettingsBtn(_sColL, _sRow2Y, "Options", _sBtnW2, true, () => { this._buildSettingsPopup(); }); - _makeSettingsBtn(_sColR, _sRow2Y, "Graphics", _sBtnW2, false, null); + _makeSettingsBtn(_sColL, _sRow2Y, "Options", _sBtnW2, true, () => { + // Hide (don't destroy) so it reappears when the Options popup closes, via _closeSettingsPopup(). + if (this._settingsLayerInternal) this._settingsLayerInternal.setVisible(false); + if (this._settingsLayerOverlay) this._settingsLayerOverlay.setVisible(false); + this._buildSettingsPopup(); + }); + _makeSettingsBtn(_sColR, _sRow2Y, "Graphics", _sBtnW2, true, () => { + // Same hide/restore dance as Options: _closeSettingsPopup() brings the layer back. + if (this._settingsLayerInternal) this._settingsLayerInternal.setVisible(false); + if (this._settingsLayerOverlay) this._settingsLayerOverlay.setVisible(false); + this._buildGraphicsPopup(); + }); _makeSettingsBtn(_sCol3L, _sRow3Y, "Rate", _sBtnW3, false, null); _makeSettingsBtn(_sCol3M, _sRow3Y, "Songs", _sBtnW3, false, null); _makeSettingsBtn(_sCol3R, _sRow3Y, "Help", _sBtnW3, false, null); @@ -7331,7 +13772,7 @@ _applyMirrorEffect() { } const _0x4edc03 = containerX; const _0x5a0e9 = 200; - const _0x453043 = this.add.image(_0x4edc03, _0x5a0e9, "GJ_WebSheet", "GJ_bigStar_001.png").setScale(3).setAlpha(0); + const _0x453043 = this.add.image(_0x4edc03, _0x5a0e9, "GJ_GameSheet03", "GJ_bigStar_001.png").setScale(3).setAlpha(0); this._settingsLayerInternal.add(_0x453043); this.tweens.add({ targets: _0x453043, @@ -7387,7 +13828,374 @@ _applyMirrorEffect() { onComplete: _0x272eb1 }); } + _showLevelInfoPage(levelData, songKey, onPlay) { + if (this._levelInfoContainer) this._closeLevelInfoPage(); + this._uhdContext = 'levelInfo'; + const sw = screenWidth; + const sh = screenHeight; + const cx = sw / 2; + const cy = sh / 2; + + this._levelInfoBg = this.add.graphics().setScrollFactor(0).setDepth(249); + const gradientSteps = 80; + for (let gi = 0; gi < gradientSteps; gi++) { + const t = gi / (gradientSteps - 1); + const r1 = Math.round(0x00 + (0x01 - 0x00) * t); + const g1 = Math.round(0x65 + (0x2c - 0x65) * t); + const b1 = Math.round(0xff + (0x71 - 0xff) * t); + const bandColor = (r1 << 16) | (g1 << 8) | b1; + const bandY = Math.floor(gi * sh / gradientSteps); + const bandH = Math.ceil(sh / gradientSteps) + 1; + this._levelInfoBg.fillStyle(bandColor, 1); + this._levelInfoBg.fillRect(0, bandY, sw, bandH); + } + this._levelInfoBgImg = null; + this._levelInfoBlocker = this.add.rectangle(cx, cy, sw, sh, 0, 0).setScrollFactor(0).setDepth(249).setInteractive(); + this._levelInfoContainer = this.add.container(0, 0).setScrollFactor(0).setDepth(250); + const c = this._levelInfoContainer; + const fmtNum = (n) => String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ","); + + c.add(this.add.bitmapText(cx, 45, "bigFont", levelData.title, 48).setOrigin(0.5, 0.5)); + c.add(this.add.bitmapText(cx, 78, "goldFont", "By " + (levelData.author || "Unknown"), 26).setOrigin(0.5, 0.5)); + + const diffMap = { 0: "difficulty_00_btn_001.png", 10: "difficulty_01_btn_001.png", 20: "difficulty_02_btn_001.png", 30: "difficulty_03_btn_001.png", 40: "difficulty_04_btn_001.png", 50: "difficulty_05_btn_001.png" }; + const diffVal = levelData.difficulty || 0; + const diffFrame = diffMap[diffVal] || "difficulty_00_btn_001.png"; + const leftX = cx - 250; + + c.add(this.add.image(leftX, cy - 80, "GJ_GameSheet03", diffFrame).setScale(0.85)); + + if (levelData.stars > 0) { + c.add(this.add.bitmapText(leftX - 15, cy - 20, "bigFont", String(levelData.stars), 26).setOrigin(1, 0.5)); + c.add(this.add.image(leftX + 5, cy - 20, "GJ_GameSheet03", "GJ_bigStar_001.png").setScale(0.3)); + } + + const playBtn = this.add.image(cx, cy - 70, "GJ_GameSheet03", "GJ_playBtn2_001.png").setInteractive().setFlipY(true).setAngle(90).setScale(1.0); + c.add(playBtn); + this._makeBouncyButton(playBtn, 1.0, onPlay); + + const rightX = cx + 180; + const ry = cy - 125; + const gap = 32; + + c.add(this.add.image(rightX, ry, "GJ_GameSheet03", "GJ_downloadsIcon_001.png").setScale(0.65)); + c.add(this.add.bitmapText(rightX + 22, ry, "goldFont", fmtNum(levelData.downloads || 0), 22).setOrigin(0, 0.5)); + + c.add(this.add.image(rightX, ry + gap, "GJ_GameSheet03", "GJ_likesIcon_001.png").setScale(0.65)); + c.add(this.add.bitmapText(rightX + 22, ry + gap, "goldFont", fmtNum(levelData.likes || 0), 22).setOrigin(0, 0.5)); + + const lengthNames = ["Tiny", "Short", "Medium", "Long", "XL", "Plat."]; + c.add(this.add.image(rightX, ry + gap * 2, "GJ_GameSheet03", "GJ_timeIcon_001.png").setScale(0.65)); + c.add(this.add.bitmapText(rightX + 22, ry + gap * 2, "goldFont", lengthNames[levelData.length] || "?", 22).setOrigin(0, 0.5)); + + c.add(this.add.image(rightX, ry + gap * 3, "GJ_GameSheet03", "currencyOrbIcon_001.png").setScale(0.55)); + const maxOrbs = levelData.orbs || 0; + const savedId = "online_" + levelData.id; + const bestPctOrbs = parseFloat(localStorage.getItem("bestPercent_" + savedId) || "0"); + const earnedOrbs = Math.round(maxOrbs * 0.8 * bestPctOrbs / 100); + c.add(this.add.bitmapText(rightX + 22, ry + gap * 3, "goldFont", earnedOrbs + "/" + maxOrbs, 22).setOrigin(0, 0.5)); + + const bestNormal = parseFloat(localStorage.getItem("bestPercent_" + savedId) || "0"); + const bestPractice = parseFloat(localStorage.getItem("practiceBestPercent_" + savedId) || "0"); + const barW = Math.min(550, sw - 250); + const barH = 26; + const barX = cx - barW / 2; + + const normalY = cy + 65; + c.add(this.add.bitmapText(cx, normalY - 20, "bigFont", "Normal Mode", 22).setOrigin(0.5, 0.5)); + const nBarBg = this.add.graphics().setScrollFactor(0).setDepth(250); + nBarBg.fillStyle(0x000000, 0.6); nBarBg.fillRoundedRect(barX, normalY - barH / 2, barW, barH, barH / 2); + c.add(nBarBg); + if (bestNormal > 0) { + const nBarFg = this.add.graphics().setScrollFactor(0).setDepth(251); + nBarFg.fillStyle(0x00FF00, 1); + const fillW = Math.max(barH, barW * bestNormal / 100); + const rr = bestNormal >= 100 ? barH / 2 : 0; + nBarFg.fillRoundedRect(barX + 2, normalY - barH / 2 + 2, fillW - 4, barH - 4, { tl: barH / 2, bl: barH / 2, tr: rr, br: rr }); + c.add(nBarFg); + } + c.add(this.add.bitmapText(cx, normalY, "bigFont", Math.round(bestNormal) + "%", 16).setOrigin(0.5, 0.5).setDepth(252)); + + const practY = normalY + 50; + c.add(this.add.bitmapText(cx, practY - 20, "bigFont", "Practice Mode", 22).setOrigin(0.5, 0.5)); + const pBarBg = this.add.graphics().setScrollFactor(0).setDepth(250); + pBarBg.fillStyle(0x000000, 0.6); pBarBg.fillRoundedRect(barX, practY - barH / 2, barW, barH, barH / 2); + c.add(pBarBg); + if (bestPractice > 0) { + const pBarFg = this.add.graphics().setScrollFactor(0).setDepth(251); + pBarFg.fillStyle(0x00FFFF, 1); + const fillW = Math.max(barH, barW * bestPractice / 100); + const rr = bestPractice >= 100 ? barH / 2 : 0; + pBarFg.fillRoundedRect(barX + 2, practY - barH / 2 + 2, fillW - 4, barH - 4, { tl: barH / 2, bl: barH / 2, tr: rr, br: rr }); + c.add(pBarFg); + } + c.add(this.add.bitmapText(cx, practY, "bigFont", Math.round(bestPractice) + "%", 16).setOrigin(0.5, 0.5).setDepth(252)); + + const songCardW = Math.min(550, sw - 200); + const songCardH = 95; + const songCardX = cx; + const songCardY = sh - 55; + const songBg = this.add.graphics().setScrollFactor(0).setDepth(250); + songBg.fillStyle(0x8B4513, 1); + songBg.fillRoundedRect(songCardX - songCardW / 2, songCardY - songCardH / 2, songCardW, songCardH, 14); + songBg.lineStyle(2, 0x5a2d0c, 1); + songBg.strokeRoundedRect(songCardX - songCardW / 2, songCardY - songCardH / 2, songCardW, songCardH, 14); + c.add(songBg); + const sTitle = window._onlineSongTitle || "Unknown"; + const sArtist = window._onlineSongArtist || "Unknown"; + const songId = levelData.isCustomSong ? levelData.customSongID : levelData.officialSong; + const sLeft = songCardX - songCardW / 2 + 20; + const songTitleText = this.add.bitmapText(sLeft, songCardY - 20, "bigFont", sTitle, 24).setOrigin(0, 0.5).setInteractive(); + c.add(songTitleText); + c.add(this.add.bitmapText(sLeft, songCardY + 5, "goldFont", "By: " + sArtist, 20).setOrigin(0, 0.5)); + c.add(this.add.bitmapText(sLeft, songCardY + 27, "goldFont", "SongID: " + songId, 16).setOrigin(0, 0.5).setTint(0xcccccc)); + songTitleText.on("pointerdown", () => this._showNongPopup(songId, songKey)); + + const backArrow = this.add.image(50, 48, "GJ_GameSheet03", "GJ_arrow_01_001.png").setInteractive(); + c.add(backArrow); + this._makeBouncyButton(backArrow, 1, () => this._closeLevelInfoPage()); + + const btnX = sw - 45; + const infoBtn = this.add.image(btnX, 48, "GJ_GameSheet03", "GJ_infoBtn_001.png").setInteractive().setScale(0.85).setAngle(90); + c.add(infoBtn); + this._makeBouncyButton(infoBtn, 0.85, () => { + const desc = levelData.description || "No description."; + const descId = "ID: " + levelData.id; + if (this._infoPopupObjs) { this._infoPopupObjs.forEach(o => o.destroy()); this._infoPopupObjs = null; return; } + const popBg = this.add.rectangle(cx, cy, 500, 200, 0x000000, 0.9).setScrollFactor(0).setDepth(260).setStrokeStyle(2, 0xffffff).setInteractive(); + const popTitle = this.add.bitmapText(cx, cy - 60, "bigFont", descId, 24).setOrigin(0.5, 0.5).setScrollFactor(0).setDepth(261); + const popDesc = this.add.bitmapText(cx, cy + 10, "goldFont", desc, 22).setOrigin(0.5, 0.5).setScrollFactor(0).setDepth(261).setMaxWidth(460); + this._infoPopupObjs = [popBg, popTitle, popDesc]; + popBg.on("pointerdown", () => { this._infoPopupObjs.forEach(o => o.destroy()); this._infoPopupObjs = null; }); + }); + + c.add(this.add.image(0, sh, "GJ_GameSheet03", "GJ_sideArt_001.png").setOrigin(1, 1).setFlipY(true).setAngle(90)); + c.add(this.add.image(sw, sh, "GJ_GameSheet03", "GJ_sideArt_001.png").setOrigin(1, 0).setAngle(90)); + } + async _showNongPopup(songId, songKey) { + if (this._nongPopupObjs) { this._nongPopupObjs.forEach(o => o.destroy()); this._nongPopupObjs = null; return; } + this._uhdContext = 'nong'; + const cx = screenWidth / 2; + const cy = screenHeight / 2; + const popW = 620; + const popH = 420; + const d = 270; + + const overlay = this.add.rectangle(cx, cy, screenWidth, screenHeight, 0x000000, 0.5).setScrollFactor(0).setDepth(d).setInteractive(); + const bg = this.add.graphics().setScrollFactor(0).setDepth(d); + bg.fillStyle(0x1a1a3a, 1); + bg.fillRoundedRect(cx - popW / 2, cy - popH / 2, popW, popH, 16); + bg.lineStyle(3, 0x5555cc, 1); + bg.strokeRoundedRect(cx - popW / 2, cy - popH / 2, popW, popH, 16); + const titleBg = this.add.graphics().setScrollFactor(0).setDepth(d); + titleBg.fillStyle(0x2a2a5a, 1); + titleBg.fillRoundedRect(cx - popW / 2 + 10, cy - popH / 2 + 8, popW - 20, 40, 8); + const title = this.add.bitmapText(cx, cy - popH / 2 + 28, "bigFont", "Song Replacements", 26).setOrigin(0.5, 0.5).setScrollFactor(0).setDepth(d + 1); + const loadingText = this.add.bitmapText(cx, cy, "goldFont", "Loading...", 24).setOrigin(0.5, 0.5).setScrollFactor(0).setDepth(d + 1); + + const closeNong = () => { if (this._nongPopupObjs) { this._nongPopupObjs.forEach(o => o.destroy()); this._nongPopupObjs = null; } }; + overlay.on("pointerdown", closeNong); + const closeBtn = this.add.image(cx + popW / 2 - 25, cy - popH / 2 + 28, "GJ_GameSheet03", "GJ_deleteBtn_001.png").setScale(0.55).setScrollFactor(0).setDepth(d + 2).setInteractive().setAngle(90); + this._makeBouncyButton(closeBtn, 0.55, closeNong); + + this._nongPopupObjs = [overlay, bg, titleBg, title, loadingText, closeBtn]; + + try { + const res = await fetch(`https://api.songfilehub.com/songs?songID=${songId}`); + if (!res.ok) throw new Error("API returned " + res.status); + const songs = await res.json(); + this._uhdContext = 'nong'; // update() zeroes this every frame while we were awaiting the fetch + loadingText.destroy(); + + if (!songs || songs.length === 0) { + const noSongs = this.add.bitmapText(cx, cy, "goldFont", "No replacements found.", 24).setOrigin(0.5, 0.5).setScrollFactor(0).setDepth(d + 1); + this._nongPopupObjs.push(noSongs); + return; + } + + const listTop = cy - popH / 2 + 58; + const listBottom = cy + popH / 2 - 45; + const rowH = 55; + const maxVisible = Math.floor((listBottom - listTop) / rowH); + let page = 0; + const totalPages = Math.ceil(songs.length / maxVisible); + const rowObjs = []; + + const buildPage = () => { + rowObjs.forEach(o => o.destroy()); + rowObjs.length = 0; + const start = page * maxVisible; + const pageItems = songs.slice(start, start + maxVisible); + pageItems.forEach((song, i) => { + const y = listTop + i * rowH + rowH / 2; + const rowBg = this.add.rectangle(cx, y, popW - 24, rowH - 4, i % 2 === 0 ? 0x222250 : 0x2a2a60, 1) + .setScrollFactor(0).setDepth(d + 1); + const nameStr = (song.songName || "Unknown"); + const name = this.add.bitmapText(cx - popW / 2 + 25, y - 10, "bigFont", nameStr.length > 38 ? nameStr.substring(0, 36) + ".." : nameStr, 18) + .setOrigin(0, 0.5).setScrollFactor(0).setDepth(d + 2); + const tag = song.state ? song.state.charAt(0).toUpperCase() + song.state.slice(1) : ""; + const info = this.add.bitmapText(cx - popW / 2 + 25, y + 12, "goldFont", tag + (tag ? " - " : "") + (song.downloads || 0) + " downloads", 16) + .setOrigin(0, 0.5).setScrollFactor(0).setDepth(d + 2).setTint(0x999999); + const isActive = window._activeNongId === song._id; + const useBtn = this.add.nineslice(cx + popW / 2 - 55, y, "GJ_button01", null, 80, 36, 24, 24, 24, 24) + .setScale(0.6).setInteractive().setScrollFactor(0).setDepth(d + 2); + if (isActive) useBtn.setTint(0xffaa00); + const useTxt = this.add.bitmapText(cx + popW / 2 - 55, y - 1, "bigFont", isActive ? "Active" : "Use", 20) + .setOrigin(0.5, 0.5).setScrollFactor(0).setDepth(d + 3).setTint(isActive ? 0xffff00 : 0xffffff); + this._makeBouncyButton(useBtn, 0.6, async () => { + useTxt.setText("..."); + try { + const audioCtx = this.game.sound.context; + if (audioCtx.state === "suspended") await audioCtx.resume(); + const audioRes = await fetch(song.downloadUrl); + if (!audioRes.ok) throw new Error("Failed: " + audioRes.status); + const arrayBuf = await audioRes.arrayBuffer(); + const decoded = await audioCtx.decodeAudioData(arrayBuf); + window._onlineSongBuffer = decoded; + window._onlineSongKey = window.currentlevel[0]; + window._onlineSongTitle = song.songName || "NONG"; + window._activeNongId = song._id; + useTxt.setText("Active").setTint(0xffff00); + useBtn.setTint(0xffaa00); + } catch (e) { + console.error("NONG download failed:", e.message); + useTxt.setText("Fail").setTint(0xff0000); + } + }); + rowObjs.push(rowBg, name, info, useBtn, useTxt); + this._nongPopupObjs.push(rowBg, name, info, useBtn, useTxt); + }); + }; + buildPage(); + + const navY = cy + popH / 2 - 22; + const pgLabel = this.add.bitmapText(cx, navY, "goldFont", (page + 1) + " / " + totalPages, 22).setOrigin(0.5, 0.5).setScrollFactor(0).setDepth(d + 2); + this._nongPopupObjs.push(pgLabel); + + const prevBtn = this.add.image(cx - 80, navY, "GJ_GameSheet03", "GJ_arrow_03_001.png").setScale(0.6).setInteractive().setScrollFactor(0).setDepth(d + 2); + this._nongPopupObjs.push(prevBtn); + this._makeBouncyButton(prevBtn, 0.6, () => { + if (page > 0) { page--; buildPage(); pgLabel.setText((page + 1) + " / " + totalPages); } + }); + + const nextBtn = this.add.image(cx + 80, navY, "GJ_GameSheet03", "GJ_arrow_03_001.png").setScale(0.6).setFlipX(true).setInteractive().setScrollFactor(0).setDepth(d + 2); + this._nongPopupObjs.push(nextBtn); + this._makeBouncyButton(nextBtn, 0.6, () => { + if (page < totalPages - 1) { page++; buildPage(); pgLabel.setText((page + 1) + " / " + totalPages); } + }); + } catch (e) { + loadingText.setText("Failed to load."); + console.error("SongFileHub error:", e.message); + } + } + _closeLevelInfoPage() { + if (this._levelInfoContainer) { this._levelInfoContainer.destroy(); this._levelInfoContainer = null; } + if (this._levelInfoBg) { this._levelInfoBg.destroy(); this._levelInfoBg = null; } + if (this._levelInfoBgImg) { this._levelInfoBgImg.destroy(); this._levelInfoBgImg = null; } + if (this._levelInfoBlocker) { this._levelInfoBlocker.destroy(); this._levelInfoBlocker = null; } + if (this._infoPopupObjs) { this._infoPopupObjs.forEach(o => o.destroy()); this._infoPopupObjs = null; } + if (this._nongPopupObjs) { this._nongPopupObjs.forEach(o => o.destroy()); this._nongPopupObjs = null; } + } + _showAchievementsScreen() { + if (this._achLayerInternal) return; + this._uhdContext = 'achLayer'; + const cx = screenWidth / 2; + this._achLayerOverlay = this.add.rectangle(cx, 320, screenWidth, screenHeight, 0, 0).setScrollFactor(0).setDepth(200).setInteractive(); + this._achLayerInternal = this.add.container(0, -640).setScrollFactor(0).setDepth(201); + this.tweens.add({ targets: this._achLayerOverlay, alpha: 100 / 255, duration: 500 }); + const slideObj = { p: 0 }; + this.tweens.add({ + targets: slideObj, p: 1, duration: 800, ease: "Bounce.Out", + onUpdate: () => { this._achLayerInternal.y = slideObj.p * 650 - 640; } + }); + const panelW = 712; + const panelH = 460; + const panelX = (screenWidth - panelW) / 2; + this._achLayerInternal.add(this.add.rectangle(panelX + 356, 310, panelW, panelH, 0, 180 / 255)); + const sideFrame = this.textures.getFrame("GJ_GameSheet03", "GJ_table_side_001.png"); + const sideScale = sideFrame ? panelH / sideFrame.height : 1; + this._achLayerInternal.add(this.add.image(panelX - 40, 80, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, sideScale)); + this._achLayerInternal.add(this.add.image(panelX + panelW + 40, 80, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, sideScale)); + this._achLayerInternal.add(this.add.image(panelX + 356, 70, "GJ_GameSheet03", "GJ_table_top_001.png")); + this._achLayerInternal.add(this.add.image(panelX + 356, 560, "GJ_GameSheet03", "GJ_table_bottom_001.png")); + this._achLayerInternal.add(this.add.image(cx - 312, 35, "GJ_WebSheet", "chain_01_001.png").setOrigin(0.5, 1)); + this._achLayerInternal.add(this.add.image(cx + 312, 35, "GJ_WebSheet", "chain_01_001.png").setOrigin(0.5, 1)); + this._achLayerInternal.add(this.add.bitmapText(cx, 65, "bigFont", "Achievements", 45).setOrigin(0.5, 0.5)); + + let earned; + try { earned = JSON.parse(localStorage.getItem("gd_achievements") || "[]"); } catch(e) { earned = []; } + const allAch = this._getAchievements(); + + this._achPage = 0; + const rowTop = 100; + const rowBottom = 540; + const rowsPerPage = 3; + const rowLeft = panelX + 7.8; + const rowRight = panelX + panelW - 7.8; + const rowWidth = rowRight - rowLeft; + const rowH = (rowBottom - rowTop) / rowsPerPage; + this._achRowObjs = []; + + const buildAchPage = () => { + for (const o of this._achRowObjs) o.destroy(); + this._achRowObjs = []; + const start = this._achPage * rowsPerPage; + const end = Math.min(start + rowsPerPage, allAch.length); + const pageItems = allAch.slice(start, end); + + pageItems.forEach((ach, i) => { + const y = rowTop + i * rowH + rowH / 2; + const isEarned = earned.includes(ach.id); + const bg = this.add.rectangle(cx, y, rowWidth, rowH, i % 2 === 0 ? 0xac531e : 0xcf6d30).setOrigin(0.5, 0.5); + const lockFrame = isEarned ? "GJ_lock_open_001.png" : "GJ_lock_001.png"; + const lockIcon = this.add.image(rowLeft + 40, y, "GJ_GameSheet03", lockFrame); + const nameText = this.add.bitmapText(rowLeft + 90, y - 18, "bigFont", ach.name, 28).setOrigin(0, 0.5).setTint(0xffff00); + const descText = this.add.bitmapText(rowLeft + 90, y + 18, "goldFont", ach.desc, 24).setOrigin(0, 0.5); + this._achLayerInternal.add([bg, lockIcon, nameText, descText]); + this._achRowObjs.push(bg, lockIcon, nameText, descText); + if (i > 0) { + const line = this.add.rectangle(cx, rowTop + i * rowH, rowWidth, 1, 0x000000, 0.3).setOrigin(0.5, 0.5); + this._achLayerInternal.add(line); + this._achRowObjs.push(line); + } + }); + + if (this._achCountLabel) this._achCountLabel.destroy(); + const totalPages = Math.ceil(allAch.length / rowsPerPage); + this._achCountLabel = this.add.bitmapText(cx + 340, 20, "bigFont", (start + 1) + " to " + end + " of " + allAch.length, 22).setOrigin(1, 0.5).setTint(0xffff00); + this._achLayerInternal.add(this._achCountLabel); + this._achRowObjs.push(this._achCountLabel); + }; + buildAchPage(); + + const backBtn = this.add.image(cx - 535, 30, "GJ_GameSheet03", "GJ_arrow_03_001.png").setInteractive(); + this._achLayerInternal.add(backBtn); + this._makeBouncyButton(backBtn, 1, () => this._hideAchievementsScreen()); + + const nextBtn = this.add.image(cx + 535, 310, "GJ_GameSheet03", "GJ_arrow_03_001.png").setInteractive().setFlipX(true).setScale(1.2); + this._achLayerInternal.add(nextBtn); + this._makeBouncyButton(nextBtn, 1.2, () => { + const totalPages = Math.ceil(allAch.length / rowsPerPage); + if (this._achPage < totalPages - 1) { this._achPage++; buildAchPage(); } + }); + const prevBtn = this.add.image(cx - 535, 310, "GJ_GameSheet03", "GJ_arrow_03_001.png").setInteractive().setScale(1.2); + this._achLayerInternal.add(prevBtn); + this._makeBouncyButton(prevBtn, 1.2, () => { + if (this._achPage > 0) { this._achPage--; buildAchPage(); } + }); + } + _hideAchievementsScreen() { + if (!this._achLayerInternal) return; + this.tweens.add({ targets: this._achLayerOverlay, alpha: 0, duration: 300, onComplete: () => { this._achLayerOverlay.destroy(); this._achLayerOverlay = null; } }); + const slideObj = { p: 1 }; + this.tweens.add({ + targets: slideObj, p: 0, duration: 500, ease: "Quad.In", + onUpdate: () => { this._achLayerInternal.y = slideObj.p * 650 - 640; }, + onComplete: () => { this._achLayerInternal.destroy(); this._achLayerInternal = null; this._achRowObjs = []; } + }); + } _showStatsScreen() { + this._uhdContext = 'stats'; if (this._pauseBtn) { this.tweens.add({ targets: this._pauseBtn, @@ -7420,13 +14228,13 @@ _applyMirrorEffect() { const _0x950c8d = 460; const _0x2a115c = (screenWidth - _0x595215) / 2; this._statsLayerInternal.add(this.add.rectangle(_0x2a115c + 356, 310, _0x595215, _0x950c8d, 0xac531e)); - const _0x43f2e3 = this.textures.getFrame("GJ_WebSheet", "GJ_table_side_001.png"); + const _0x43f2e3 = this.textures.getFrame("GJ_GameSheet03", "GJ_table_side_001.png"); const _0x3feccc = _0x43f2e3 ? _0x950c8d / _0x43f2e3.height : 1; - this._statsLayerInternal.add(this.add.image(_0x2a115c - 40, 80, "GJ_WebSheet", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, _0x3feccc)); - this._statsLayerInternal.add(this.add.image(_0x2a115c + _0x595215 + 40, 80, "GJ_WebSheet", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, _0x3feccc)); - const _0x33b564 = this.add.image(_0x2a115c + 356, 70, "GJ_WebSheet", "GJ_table_top_001.png"); + this._statsLayerInternal.add(this.add.image(_0x2a115c - 40, 80, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(0, 0).setScale(1, _0x3feccc)); + this._statsLayerInternal.add(this.add.image(_0x2a115c + _0x595215 + 40, 80, "GJ_GameSheet03", "GJ_table_side_001.png").setOrigin(1, 0).setFlipX(true).setScale(1, _0x3feccc)); + const _0x33b564 = this.add.image(_0x2a115c + 356, 70, "GJ_GameSheet03", "GJ_table_top_001.png"); this._statsLayerInternal.add(_0x33b564); - this._statsLayerInternal.add(this.add.image(_0x2a115c + 356, 560, "GJ_WebSheet", "GJ_table_bottom_001.png")); + this._statsLayerInternal.add(this.add.image(_0x2a115c + 356, 560, "GJ_GameSheet03", "GJ_table_bottom_001.png")); const _0x3e9c79 = _0x33b564.y - 35; this._statsLayerInternal.add(this.add.image(containerX - 312, _0x3e9c79, "GJ_WebSheet", "chain_01_001.png").setOrigin(0.5, 1)); this._statsLayerInternal.add(this.add.image(containerX + 312, _0x3e9c79, "GJ_WebSheet", "chain_01_001.png").setOrigin(0.5, 1)); @@ -7440,13 +14248,13 @@ _applyMirrorEffect() { const _rowH = (_rowPanelBottom - _rowPanelTop) / _rowCount; const rows = [ + { label: "Total Stars:", value: String(window._totalStars || 0) }, { label: "Total Jumps:", value: String(this._totalJumps || 0) }, { label: "Total Attempts:", value: String(this._attempts || 1) }, { label: "Completed Levels:", value: String(window._completedLevels || 0) }, { label: "Total Deaths:", value: String(this._totalDeaths || 0) }, - { label: "???:", value: String(window._totalDiamonds || '?') }, - { label: "???:", value: String(window._totalOrbs || '?') }, - + { label: "Mana Orbs:", value: String(window._totalOrbs || 0) }, + ]; rows.forEach((row, index) => { const rowCenterY = _rowPanelTop + index * _rowH + _rowH / 2; @@ -7524,7 +14332,8 @@ _applyMirrorEffect() { } const _0x4edc03 = this._endStarX; const _0x5a0e9 = this._endStarY; - const _0x453043 = this.add.image(_0x4edc03, _0x5a0e9, "GJ_WebSheet", "GJ_bigStar_001.png").setScale(3).setAlpha(0); + const starCount = this._starsAwarded || 0; + const _0x453043 = this.add.image(_0x4edc03, _0x5a0e9, "GJ_GameSheet03", "GJ_bigStar_001.png").setScale(3).setAlpha(0); this._endLayerInternal.add(_0x453043); this.tweens.add({ targets: _0x453043, @@ -7534,6 +14343,42 @@ _applyMirrorEffect() { delay: 0, ease: "Bounce.Out" }); + if (starCount > 0) { + const starLabel = this.add.bitmapText(_0x4edc03, _0x5a0e9 + 35, "bigFont", "+" + starCount, 28).setOrigin(0.5, 0.5).setScale(3).setAlpha(0); + this._endLayerInternal.add(starLabel); + this.tweens.add({ + targets: starLabel, + scale: 1, + alpha: 1, + duration: 300, + delay: 100, + ease: "Bounce.Out" + }); + } + const orbCount = this._orbsAwarded || 0; + if (orbCount > 0) { + const orbY = _0x5a0e9 + 60; + const orbLabel = this.add.bitmapText(_0x4edc03 + 10, orbY, "bigFont", "+" + orbCount, 22).setOrigin(0, 0.5).setScale(3).setAlpha(0).setTint(0x00ffff); + this._endLayerInternal.add(orbLabel); + const orbIcon = this.add.image(_0x4edc03 - 8, orbY, "GJ_GameSheet03", "currencyOrbIcon_001.png").setScale(3).setAlpha(0).setOrigin(1, 0.5); + this._endLayerInternal.add(orbIcon); + this.tweens.add({ + targets: orbIcon, + scale: 0.4, + alpha: 1, + duration: 300, + delay: 300, + ease: "Bounce.Out" + }); + this.tweens.add({ + targets: orbLabel, + scale: 0.8, + alpha: 1, + duration: 300, + delay: 400, + ease: "Bounce.Out" + }); + } this.time.delayedCall(100, () => { this._audio.playEffect("highscoreGet02"); const _0x1204d3 = _0x4edc03; @@ -7652,22 +14497,22 @@ _applyMirrorEffect() { const addRow = () => { _rowCount++; _redrawStripes(); }; const clearRows = () => { _rowCount = 0; _redrawStripes(); }; - const sideFrame = this.textures.getFrame("GJ_WebSheet", "GJ_table_side_001.png"); + const sideFrame = this.textures.getFrame("GJ_GameSheet03", "GJ_table_side_001.png"); const sideScaleY = sideFrame ? panelH / sideFrame.height : 1; const leftBorder = this.add.image(listLeft - 40, 90, - "GJ_WebSheet", "GJ_table_side_001.png") + "GJ_GameSheet03", "GJ_table_side_001.png") .setScrollFactor(0).setDepth(203).setOrigin(0, 0).setScale(1, sideScaleY); objects.push(leftBorder); const rightBorder = this.add.image(listLeft + panelW + 40, 90, - "GJ_WebSheet", "GJ_table_side_001.png") + "GJ_GameSheet03", "GJ_table_side_001.png") .setScrollFactor(0).setDepth(203).setOrigin(1, 0).setFlipX(true).setScale(1, sideScaleY); objects.push(rightBorder); const topBorder = this.add.image(panelCX, 80, - "GJ_WebSheet", "GJ_table_top_001.png") + "GJ_GameSheet03", "GJ_table_top_001.png") .setScrollFactor(0).setDepth(203).setOrigin(0.5); objects.push(topBorder); const bottomBorder = this.add.image(panelCX, 570, - "GJ_WebSheet", "GJ_table_bottom_001.png") + "GJ_GameSheet03", "GJ_table_bottom_001.png") .setScrollFactor(0).setDepth(203).setOrigin(0.5); objects.push(bottomBorder); @@ -7711,7 +14556,7 @@ _applyMirrorEffect() { } _openOnlineLevelsScene(params = {}) { if (this._onlineLevelsOverlay) return; - + this._uhdContext = 'online'; const sw = screenWidth; const sh = screenHeight; const isFeatured = (params.type === 6); diff --git a/assets/scripts/core/level.js b/assets/scripts/core/level.js index 0cf8ab3e..98191247 100644 --- a/assets/scripts/core/level.js +++ b/assets/scripts/core/level.js @@ -7,56 +7,38 @@ class Collider { this.h = height; this.activated = false; this.rotationDegrees = rotation; - this.slopeAngleDeg = 0; - this.slopeDir = 1; - this.slopeIsFilled = false; - this.slopeFlipY = false; + this.hypoAx = 0; this.hypoAy = 0; + this.hypoBx = 0; this.hypoBy = 0; + this.rightAx = 0; this.rightAy = 0; + this.slopeSolidBelow = true; } getSlopeSurfaceY(worldX) { if (this.type !== slopeType) return null; - const halfW = this.w / 2; - const left = this.x - halfW; - const right = this.x + halfW; - if (worldX < left || worldX > right) return null; - const frac = (worldX - left) / (right - left); - let surfaceFrac = this.slopeDir > 0 ? frac : (1 - frac); - if (this.slopeFlipY) surfaceFrac = 1 - surfaceFrac; - return (this.y - this.h / 2) + surfaceFrac * this.h; - } + const ax = this.x + this.hypoAx, ay = this.y + this.hypoAy; + const bx = this.x + this.hypoBx, by = this.y + this.hypoBy; + const lo = ax <= bx ? { x: ax, y: ay } : { x: bx, y: by }; + const hi = ax <= bx ? { x: bx, y: by } : { x: ax, y: ay }; + if (hi.x - lo.x < 0.01) return null; + if (worldX < lo.x || worldX > hi.x) return null; + const t = (worldX - lo.x) / (hi.x - lo.x); + return lo.y + t * (hi.y - lo.y); + } + getSlopeAngleRad() { - let angleDeg = this.slopeAngleDeg; - if (this.slopeDir < 0) angleDeg = -angleDeg; - if (this.slopeFlipY) angleDeg = -angleDeg; - return angleDeg * Math.PI / 180; - } -} - -function _decodeTextObjectString(value) { - if (value === undefined || value === null) return ""; - const raw = String(value); - if (raw === "") return ""; - try { - if (!/^[A-Za-z0-9_-]+={0,2}$/.test(raw)) return raw; - let base64 = raw.replace(/-/g, "+").replace(/_/g, "/"); - while (base64.length % 4 !== 0) base64 += "="; - const binary = atob(base64); - const bytes = new Uint8Array(binary.length); - for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i); - return new TextDecoder("utf-8", { fatal: true }).decode(bytes); - } catch (err) { - return raw; + if (this.type !== slopeType) return 0; + return Math.atan2(this.hypoBy - this.hypoAy, this.hypoBx - this.hypoAx); } } -function _encodeTextObjectString(value) { - const bytes = new TextEncoder().encode(String(value ?? "")); - let binary = ""; - for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]); - return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); +function rotateSlopePoint(localX, localY, rotDeg) { + const theta = -rotDeg * Math.PI / 180; + const cosT = Math.cos(theta), sinT = Math.sin(theta); + return { x: localX * cosT - localY * sinT, y: localX * sinT + localY * cosT }; } function parseObject(objectString) { let objectParts = objectString.split(","); + let objectData = {}; for (let index = 0; index + 1 < objectParts.length; index += 2) { let key = objectParts[index]; @@ -93,12 +75,10 @@ function parseObject(objectString) { groups: groupString, color1: parseInt(objectData[21] || "0", 10), color2: parseInt(objectData[22] || "0", 10), - text: _decodeTextObjectString(objectData[31] ?? objectData["31"] ?? ""), // Following are for startpos gameMode: parseInt(objectData['kA2'] ?? '0', 10), miniMode: parseInt(objectData['kA3'] ?? '0', 10), speed: parseInt(objectData['kA4'] ?? '0', 10), - dualMode: parseInt(objectData['kA8'] ?? '0', 10), mirrored: parseInt(objectData['kA28'] ?? '0', 10), flipGravity: '1' === (objectData['kA11'] ?? '0'), _raw: objectData @@ -138,22 +118,10 @@ function parseLevel(levelString) { settings: settings, objects: objects }; - -} -function getBackgroundTextureIndex(backgroundSetting) { - const parsedBackgroundId = parseInt(String(backgroundSetting ?? "1"), 10); - const gdBackgroundId = isNaN(parsedBackgroundId) || parsedBackgroundId <= 1 ? 1 : parsedBackgroundId; - return gdBackgroundId - 1; -} - -function getBackgroundDisplayId(backgroundSetting) { - const parsedBackgroundId = parseInt(String(backgroundSetting ?? "1"), 10); - const gdBackgroundId = isNaN(parsedBackgroundId) || parsedBackgroundId <= 1 ? 1 : parsedBackgroundId; - return String(gdBackgroundId).padStart(2, "0"); } function getGroundTextureId(groundSetting) { - const parsedGroundId = parseInt(String(groundSetting ?? "1"), 10); + const parsedGroundId = parseInt(String(groundSetting ?? "0"), 10); const textureIndex = isNaN(parsedGroundId) || parsedGroundId <= 1 ? 0 : parsedGroundId - 1; return String(textureIndex).padStart(2, "0"); } @@ -168,7 +136,7 @@ const ringType = "ring"; const triggerType = "trigger"; const speedType = "speed"; const slopeType = "slope"; -// ── Slope ID registry ── +// this is slope id registry const _SLOPE_DATA = { 289:{gw:1,gh:1,angle:45,sq:false},291:{gw:2,gh:1,angle:22.5,sq:false}, 294:{gw:1,gh:1,angle:45,sq:false},295:{gw:2,gh:1,angle:22.5,sq:false}, @@ -277,26 +245,28 @@ const _SLOPE_DATA = { 1901:{gw:0.367,gh:0.433,angle:45,sq:true},1902:{gw:0.967,gh:0.45,angle:45,sq:true}, 1906:{gw:1,gh:1,angle:45,sq:false},1907:{gw:2,gh:1,angle:22.5,sq:false}, }; + +const _origAllobjects = window.allobjects; +window.allobjects = function() { + const result = _origAllobjects(); + for (const id in _SLOPE_DATA) { + const sd = _SLOPE_DATA[id]; + if (!sd || !result[id]) continue; + if (sd.sq) { + // corner-fill pieces — visual only, no hitbox + result[id] = Object.assign({}, result[id], { type: decoType }); + } else { + result[id] = Object.assign({}, result[id], { type: slopeType }); + } + } + return result; +}; + const flyPortal = "fly"; const cubePortal = "cube"; const portalWaveType = "portal_wave"; const portalUfoType = "portal_ufo"; const allObjects = window.allobjects(); -if (!allObjects[745]) { - allObjects[745] = { - "can_color": false, - "default_base_color_channel": 0, - "frame": "portal_16_front_001.png", - "glow_frame": "portal_16_front_glow_001.png", - "gridH": 2.866666555404663, - "gridW": 1.1333333253860474, - "spritesheet": "GJ_GameSheet02-uhd", - "type": "portal", - "z": 10, - "portalParticle": true, - "portalParticleColor": 0xffff00 - }; -} if (!allObjects[1331]) { allObjects[1331] = { "can_color": false, @@ -313,6 +283,7 @@ if (!allObjects[1331]) { }; } + const _speedPortalIds = [200, 201, 202, 203, 1334]; for (const _spId of _speedPortalIds) { if (!allObjects[_spId] || allObjects[_spId].type !== "speed") { @@ -323,91 +294,6 @@ for (const _spId of _speedPortalIds) { } } -const GD_SPEED_PIXELS_PER_SECOND = { - HALF: 502.38, - ONE_TIMES: 623.16, - TWO_TIMES: 774.84, - THREE_TIMES: 936.0, - FOUR_TIMES: 1152.0 -}; - -function getSpeedPixelsPerSecondFromKey(speedKey) { - const speedValues = [ - GD_SPEED_PIXELS_PER_SECOND.ONE_TIMES, - GD_SPEED_PIXELS_PER_SECOND.HALF, - GD_SPEED_PIXELS_PER_SECOND.TWO_TIMES, - GD_SPEED_PIXELS_PER_SECOND.THREE_TIMES, - GD_SPEED_PIXELS_PER_SECOND.FOUR_TIMES - ]; - const parsed = parseInt(speedKey ?? 0, 10); - return speedValues[parsed] ?? GD_SPEED_PIXELS_PER_SECOND.ONE_TIMES; -} - -function getSpeedPixelsPerSecondForPortalId(id) { - const speedMap = { - 200: GD_SPEED_PIXELS_PER_SECOND.HALF, - 201: GD_SPEED_PIXELS_PER_SECOND.ONE_TIMES, - 202: GD_SPEED_PIXELS_PER_SECOND.TWO_TIMES, - 203: GD_SPEED_PIXELS_PER_SECOND.THREE_TIMES, - 1334: GD_SPEED_PIXELS_PER_SECOND.FOUR_TIMES - }; - return speedMap[parseInt(id ?? 0, 10)] ?? null; -} - -function getSpeedPortalValueForId(id) { - const speedMap = { - 200: SpeedPortal.HALF, - 201: SpeedPortal.ONE_TIMES, - 202: SpeedPortal.TWO_TIMES, - 203: SpeedPortal.THREE_TIMES, - 1334: SpeedPortal.FOUR_TIMES - }; - return speedMap[parseInt(id ?? 0, 10)] ?? null; -} - -function calculateSongOffsetForX(targetX, startSpeedKey = 0, sourceObjects = null) { - const targetWorldX = Math.max(0, Number(targetX) || 0); - const objects = Array.isArray(sourceObjects) ? sourceObjects : []; - const speedEvents = []; - - for (const obj of objects) { - if (!obj) continue; - const speedPixelsPerSecond = getSpeedPixelsPerSecondForPortalId(obj.id); - if (speedPixelsPerSecond === null) continue; - - const raw = obj._raw || {}; - const rawX = Number(raw[2] ?? raw["2"] ?? obj.x ?? 0); - if (!Number.isFinite(rawX)) continue; - - const worldX = rawX * 2; - if (worldX < 0 || worldX > targetWorldX) continue; - speedEvents.push({ x: worldX, speedPixelsPerSecond }); - } - - speedEvents.sort((a, b) => a.x - b.x); - - let currentX = 0; - let currentPixelsPerSecond = getSpeedPixelsPerSecondFromKey(startSpeedKey); - let offsetSeconds = 0; - - const addSegment = (nextX) => { - const dx = Math.max(0, nextX - currentX); - offsetSeconds += dx / Math.max(0.000001, currentPixelsPerSecond); - currentX = nextX; - }; - - for (const event of speedEvents) { - const nextX = Math.max(0, Math.min(targetWorldX, event.x)); - addSegment(nextX); - currentPixelsPerSecond = event.speedPixelsPerSecond; - } - - addSegment(targetWorldX); - return Math.max(0, offsetSeconds); -} - -window.calculateGeometryDashSongOffsetForX = calculateSongOffsetForX; - const objsWithGlow = [1, 2, 3, 4, 6, 7, 83, 8, 39, 103, 392, 35, 36, 40, 140, 141, 62, 65, 66, 68, 195, 196, 1022, 1594]; for (let obj of objsWithGlow) { if (allObjects[obj]) { @@ -442,20 +328,17 @@ window.LevelObject = class LevelObject { this._flyFloorY = 0; this._flyCeilingY = null; this._flyVisualOnly = false; - this._flyVisualFloorInset = 0; - this._flyVisualCeilingInset = 0; this.flyCameraTarget = null; this._colorTriggers = []; this._colorTriggerIdx = 0; this._touchColorTriggerActivated = new Set(); this._touchSpawnTriggerActivated = new Set(); this._touchMoveTriggerActivated = new Set(); + this._glowSpriteKeys = new Set(); this._audioScaleSprites = []; - this._editorTriggerVisuals = []; this._orbSprites = []; this._coinSprites = []; this._sawSprites = []; - this._glowSpriteKeys = new Set(); this._enterEffectTriggers = []; this._enterEffectTriggerIdx = 0; this._activeEnterEffect = 0; @@ -483,7 +366,17 @@ window.LevelObject = class LevelObject { this._sections = []; this._sectionContainers = []; this._collisionSections = []; + this._portalEmitters = []; this._nearbyBuffer = []; + // Sprites/colliders whose position is driven by a Move or Rotate + // trigger can end up far from the spawn-position "section" bucket they + // were filed under (sections are a one-time, spawn-time spatial index + // used to cheaply hide/skip far-away content). Anything in a dynamic + // group is tracked here so it's never wrongly culled after it moves. + this._dynamicGroups = new Set(); + this._dynamicColliders = []; + this._dynamicSprites = []; + this._dynamicForceVisible = new Set(); this._visMinSec = -1; this._visMaxSec = -1; this._groundStartScreenY = b(0); @@ -540,6 +433,7 @@ window.LevelObject = class LevelObject { } fastForwardTriggers(targetX, colorManager) { + this._ensureInitialColorsApplied(colorManager); const triggers = this._colorTriggers.sort((a, b) => a.x - b.x); for (let trigger of triggers) { @@ -556,14 +450,62 @@ window.LevelObject = class LevelObject { objects: levelObjects, settings: settingslist } = parseLevel(levelData); - this._sourceLevelObjects = levelObjects; this._spawnLevelObjects(levelObjects); + this._setupDynamicObjects(); this._setUpSettings(settingslist); window.levelObjects = levelObjects; window.settingslist = settingslist; } + // Sprites/colliders that belong to a group targeted by a Move Trigger or + // Rotate Trigger get exempted from the spawn-time spatial culling: each + // frame their CURRENT (live) position is checked against the camera, so + // their section is shown only while they're actually nearby - not stuck + // hidden under a stale spawn-position bucket, and not forced visible + // forever either (which on a level with thousands of moved objects spread + // across half the map would mean permanently rendering a huge chunk of it + // - a real perf hit). Their collider is always included in nearby- + // collision queries regardless of which section it was filed under at + // spawn. Without this, an object that moves/rotates far enough from its + // spawn position can have its whole section hidden (it visually + // disappears) or get skipped by collision checks entirely (ground/hazards + // stop registering hits "randomly"). + _setupDynamicObjects() { + for (const trig of this._moveTriggers) { + if (trig.targetGroup > 0) this._dynamicGroups.add(trig.targetGroup); + } + for (const trig of this._rotateTriggers) { + if (trig.targetGroup > 0) this._dynamicGroups.add(trig.targetGroup); + if (trig.centerGroup > 0) this._dynamicGroups.add(trig.centerGroup); + } + if (this._dynamicGroups.size === 0) return; + + const seenSprites = new Set(); + const seenColliders = new Set(); + for (const gid of this._dynamicGroups) { + const sprites = this._groupSprites[gid]; + if (sprites) { + for (const spr of sprites) { + if (!spr || seenSprites.has(spr)) continue; + seenSprites.add(spr); + const baseX = spr._eeWorldX !== undefined ? spr._eeWorldX : spr.x; + spr._eeDynSection = Math.max(0, Math.floor(baseX / 400)); + this._dynamicSprites.push(spr); + } + } + const colliders = this._groupColliders[gid]; + if (colliders) { + for (const col of colliders) { + if (!col || seenColliders.has(col)) continue; + seenColliders.add(col); + col._eeDynamic = true; + this._dynamicColliders.push(col); + } + } + } + } _setUpSettings(settingsStr) { this._initialColors = {}; + this._initialColorsApplied = false; this._backgroundId = null; this._groundId = null; if (!settingsStr) return; @@ -573,49 +515,136 @@ window.LevelObject = class LevelObject { settingsMap[pairs[i]] = pairs[i + 1]; } let colorStr = settingsMap["kS38"]; - window._backgroundId = getBackgroundDisplayId(settingsMap["kA6"]); + window._backgroundId = settingsMap["kA6"] ? settingsMap["kA6"] : "01"; + if (window._backgroundId.length < 2) { + window._backgroundId = "0"+window._backgroundId; + } window._groundId = getGroundTextureId(settingsMap["kA7"]); + + const parseChannelProps = (props) => { + let cp = {}; + for (let j = 0; j + 1 < props.length; j += 2) { + cp[parseInt(props[j], 10)] = props[j + 1]; + } + return cp; + }; + + // channelId -> 1 (P1) or 2 (P2) for channels set to "use player color" + const playerColorLink = {}; + // channelId -> source channelId for channels set to "copy color" + const copyLink = {}; + if (colorStr) { + // Every special channel (1000 BG, 1001 G1, 1002 Line, 1003 3DL, + // 1004 Obj, 1005 P1, 1006 P2, 1007 LBG, 1009 G2, 1010-1012, 1013/1014 + // MG/MG2) and every custom channel (1-999) shows up here the same + // way, keyed by property 6 (channel ID), so they're all handled + // generically rather than singling out BG/Ground. let channels = colorStr.split("|"); for (let ch of channels) { if (!ch) continue; - let props = ch.split("_"); - let colorProps = {}; - for (let j = 0; j + 1 < props.length; j += 2) { - colorProps[parseInt(props[j], 10)] = props[j + 1]; - } + let colorProps = parseChannelProps(ch.split("_")); let channelId = parseInt(colorProps[6], 10); - if (!isNaN(channelId)) { - this._initialColors[channelId] = { - r: parseInt(colorProps[1] || "255", 10), - g: parseInt(colorProps[2] || "255", 10), - b: parseInt(colorProps[3] || "255", 10) - }; + if (isNaN(channelId)) continue; + + this._initialColors[channelId] = { + r: parseInt(colorProps[1] || "255", 10), + g: parseInt(colorProps[2] || "255", 10), + b: parseInt(colorProps[3] || "255", 10) + }; + + const playerColor = parseInt(colorProps[4], 10); + if (playerColor === 1 || playerColor === 2) { + playerColorLink[channelId] = playerColor; + } + + const copiedId = parseInt(colorProps[9], 10); + if (!isNaN(copiedId) && copiedId > 0) { + copyLink[channelId] = copiedId; } } } + let parseColorEntry = (str) => { if (!str) return null; - let props = str.split("_"); - let cp = {}; - for (let j = 0; j + 1 < props.length; j += 2) { - cp[parseInt(props[j], 10)] = props[j + 1]; - } + let cp = parseChannelProps(str.split("_")); return { r: parseInt(cp[1] || "255", 10), g: parseInt(cp[2] || "255", 10), b: parseInt(cp[3] || "255", 10) }; }; - if (!this._initialColors[1000] && settingsMap["kS29"]) { - let col = parseColorEntry(settingsMap["kS29"]); - if (col) this._initialColors[1000] = col; + // Pre-2.0 levels (or exports that still carry these for safety) store + // some channels under their own legacy key instead of in kS38. Same + // "don't override a value kS38 already gave us" guard as BG/Ground. + const legacyColorKeys = { + kS29: 1000, // BG + kS30: 1001, // Ground + kS31: 1002, // Line + kS32: 1004, // Obj + kS33: 1, // Color 1 + kS34: 2, // Color 2 + kS35: 3, // Color 3 + kS36: 4, // Color 4 + kS37: 1003 // 3DL + }; + for (let key in legacyColorKeys) { + const channelId = legacyColorKeys[key]; + if (!this._initialColors[channelId] && settingsMap[key]) { + let col = parseColorEntry(settingsMap[key]); + if (col) this._initialColors[channelId] = col; + } } - if (!this._initialColors[1001] && settingsMap["kS30"]) { - let col = parseColorEntry(settingsMap["kS30"]); - if (col) this._initialColors[1001] = col; + + // Resolve "use player color" channels (e.g. Obj/Line/Ground set to + // track P1/P2) to the actual P1 (1005) / P2 (1006) channel color. + // If the engine exposes the real player-selected icon color (e.g. + // window.playerColor1/playerColor2, set by an icon/settings screen), + // that takes priority over the level's own stored P1/P2 placeholder - + // matching how GD actually shows YOUR icon color here, not the level + // author's. Falls back to the level's stored value if none is set. + if (this._initialColors[1005] && typeof window !== "undefined" && window.playerColor1) { + this._initialColors[1005] = { ...window.playerColor1 }; + } + if (this._initialColors[1006] && typeof window !== "undefined" && window.playerColor2) { + this._initialColors[1006] = { ...window.playerColor2 }; + } + for (let chId in playerColorLink) { + const target = playerColorLink[chId] === 1 ? 1005 : 1006; + if (this._initialColors[target]) { + this._initialColors[chId] = { ...this._initialColors[target] }; + } + } + + // Resolve "copy color" channels (e.g. G2 copying G1, or a custom + // channel copying BG/Obj) by following the copy chain to a real color. + // Per-copy HSV fine-tuning isn't re-derived here, just the base color. + for (let chId in copyLink) { + let sourceId = copyLink[chId]; + let seen = new Set([parseInt(chId, 10)]); + while (copyLink[sourceId] !== undefined && !seen.has(sourceId)) { + seen.add(sourceId); + sourceId = copyLink[sourceId]; + } + if (this._initialColors[sourceId]) { + this._initialColors[chId] = { ...this._initialColors[sourceId] }; + } } } + + // The level's default channel colors (parsed above into _initialColors) + // need to land on the SAME ColorManager instance the game actually + // renders with. loadLevel() doesn't reliably have that instance in scope, + // so instead we piggyback on the methods below that already receive a + // live colorManager from the main loop every frame, and apply the + // level's colors the first time one of them runs after a level load. + _ensureInitialColorsApplied(colorManager) { + if (this._initialColorsApplied || !colorManager) return; + for (let chId in this._initialColors) { + colorManager.setInitialColor(parseInt(chId, 10), this._initialColors[chId]); + } + this._initialColorsApplied = true; + } _buildGround() { if (window.isEditor) return; // not dealing with ts rn const scene = this._scene; @@ -711,10 +740,8 @@ window.LevelObject = class LevelObject { rightTileIndex = b(this._flyCeilingY) + cameraY; } else if (this._flyGroundActive && this._groundTargetValue > 0.001) { let groundTarget = this._groundTargetValue; - const visualFloorInset = Number.isFinite(Number(this._flyVisualFloorInset)) ? Number(this._flyVisualFloorInset) : 0; - const visualCeilingInset = Number.isFinite(Number(this._flyVisualCeilingInset)) ? Number(this._flyVisualCeilingInset) : 0; - let targetGroundY = 620 - visualFloorInset; - let targetCeilingY = 20 + visualCeilingInset; + let targetGroundY = 620; + let targetCeilingY = 20; leftTileIndex = this._groundStartScreenY + (targetGroundY - this._groundStartScreenY) * groundTarget; rightTileIndex = this._ceilingStartScreenY + (targetCeilingY - this._ceilingStartScreenY) * groundTarget; let groundScreenY = b(0) + cameraY; @@ -780,8 +807,6 @@ window.LevelObject = class LevelObject { this._ceilingY = null; this._flyCeilingY = null; this._flyVisualOnly = false; - this._flyVisualFloorInset = 0; - this._flyVisualCeilingInset = 0; this.flyCameraTarget = null; } _computeFlyBounds(centerY, height = f, isPortal = false) { @@ -798,23 +823,18 @@ window.LevelObject = class LevelObject { ceilingY: floorY + height }; } - setFlyMode(enabled, centerY, height = f, visualOnly = false, cameraHeight = height) { + setFlyMode(enabled, centerY, height = f, visualOnly = false) { if (enabled) { let bounds = this._computeFlyBounds(centerY, height, visualOnly); this._flyFloorY = bounds.floorY; this._flyCeilingY = bounds.ceilingY; this._flyVisualOnly = visualOnly; - const cameraSpan = Number.isFinite(Number(cameraHeight)) ? Number(cameraHeight) : height; - const defaultFlySpan = Number.isFinite(Number(typeof f !== "undefined" ? f : cameraSpan)) ? Number(typeof f !== "undefined" ? f : cameraSpan) : cameraSpan; - const visualSpanShrink = Math.max(0, defaultFlySpan - cameraSpan); - this._flyVisualFloorInset = visualOnly ? 0 : visualSpanShrink / 2; - this._flyVisualCeilingInset = visualOnly ? 0 : visualSpanShrink / 2; if (visualOnly) { this._flyGroundActive = true; } else { this._flyGroundActive = true; } - let flyCenter = this._flyFloorY + cameraSpan / 2; + let flyCenter = this._flyFloorY + height / 2; this.flyCameraTarget = flyCenter - 320 + o; if (this.flyCameraTarget < 0) { this.flyCameraTarget = 0; @@ -832,8 +852,6 @@ window.LevelObject = class LevelObject { this._flyCeilingY = null; this._flyFloorY = null; this._flyVisualOnly = false; - this._flyVisualFloorInset = 0; - this._flyVisualCeilingInset = 0; if (this._flyGroundActive) { this._groundAnimFrom = this._groundTargetValue; this._groundAnimTo = 0; @@ -979,7 +997,7 @@ window.LevelObject = class LevelObject { } } _isGlowVisible = () => { - return window.showGlow !== false && (!window.isEditor || window.showEditorGlow); + return window.isEditor ? window.showEditorGlow : (window.showObjectGlow !== false); }; _getGlowAlphaMultiplier = () => { return window.glowOpacity !== undefined ? window.glowOpacity : 0.5; @@ -1015,11 +1033,11 @@ window.LevelObject = class LevelObject { glowSprite.setBlendMode(Phaser.BlendModes.ADD); glowSprite.setAlpha(this._getGlowAlphaMultiplier()); glowSprite._eeLayer = 0; + glowSprite._isGlowSprite = true; // skip collision hitbox drawing if (!this._glowSprites) { this._glowSprites = []; } this._glowSprites.push(glowSprite); - glowSprite._eeIsGlowSprite = true; glowSprite.setVisible(this._isGlowVisible()); if (worldX !== undefined) { glowSprite._eeWorldX = worldX; @@ -1326,9 +1344,6 @@ window.LevelObject = class LevelObject { this._colorTriggers.push({ ...triggerBase, x: levelObj.x * 2, - y: levelObj.y * 2, - uid: linkedObjectId, - touchTriggered: String(levelObj._raw?.[11] ?? levelObj._raw?.["11"] ?? "0") === "1", index: levelObj.id === 29 ? 1000 : 1001, color: { r: parseInt(levelObj._raw[7] ?? 255, 10), @@ -1379,16 +1394,13 @@ window.LevelObject = class LevelObject { }); } - if ([105, 744, 899, 900, 915].includes(levelObj.id)) { + if (levelObj.id === 899) { const _raw = levelObj._raw; const targetChannel = parseInt(_raw[23] ?? 0, 10); if (targetChannel > 0) { this._colorTriggers.push({ ...triggerBase, x: levelObj.x * 2, - y: levelObj.y * 2, - uid: linkedObjectId, - touchTriggered: String(_raw?.[11] ?? _raw?.["11"] ?? "0") === "1", index: targetChannel, color: { r: parseInt(_raw[7] ?? 255, 10), @@ -1458,18 +1470,11 @@ window.LevelObject = class LevelObject { gameMode: levelObj.gameMode, miniMode: levelObj.miniMode, speed: levelObj.speed, - dualMode: levelObj.dualMode, mirrored: levelObj.mirrored, gravityFlipped: levelObj.flipGravity }); } - if (objectDef.textObject) { - this._spawnTextObject(levelObj, objectDef, linkedObjectId); - return objectDef; - } - - this._spawnTriggerEditorVisual(levelObj, objectDef, linkedObjectId); return objectDef; } @@ -1477,8 +1482,6 @@ window.LevelObject = class LevelObject { this._nextObjectId = 0; } const linkedObjectId = this._nextObjectId++; - levelObj._eeObjectId = linkedObjectId; - if (levelObj._raw) delete levelObj._raw._eeObjectId; let hasCollisionEntry = false; const worldX = levelObj.x * 2; @@ -1509,6 +1512,26 @@ window.LevelObject = class LevelObject { (objectDef.type === portalType || objectDef.type === speedType) && frameName.includes("_front_"); + // define portalsub to stop reference errors + const portalSub = objectDef.sub || { + 10: "gravity_flip", + 11: "gravity_normal", + 12: "cube", + 13: "fly", + 45: "mirrora", + 46: "mirrorb", + 47: "ball", + 660: "wave", + 111: "ufo", + 745: "robot", + 747: "teleport_in", + 1933: "swing", + 749: "teleport_out", + 1331: "spider", + 286: "dual_on", + 287: "dual_off" + }[levelObj.id]; + const zLayer = levelObj.zLayer || (objectDef.default_z_layer !== undefined ? objectDef.default_z_layer : 0); const zOrd = @@ -1517,7 +1540,12 @@ window.LevelObject = class LevelObject { const objZDepth = (depthBase[zLayer] !== undefined ? depthBase[zLayer] : 0) + zOrd * 0.01; let col1 = levelObj.color1 || (objectDef.default_base_color_channel !== undefined ? objectDef.default_base_color_channel : 0); - if (col1 === 0 && (objectDef.type === solidType || objectDef.type === hazardType)) col1 = 1; + // Uncolored solids/hazards (plain blocks, spikes, etc.) fall back to GD's + // special "Obj" channel (1004), not custom channel 1. Channel 1 is just + // an ordinary custom channel a level may use for anything else, which is + // why spikes/ground tiles were picking up an unrelated accent color + // (e.g. a dark blue) instead of the level's real black Obj color. + if (col1 === 0 && (objectDef.type === solidType || objectDef.type === hazardType)) col1 = 1004; const col2 = levelObj.color2 || (objectDef.default_detail_color_channel !== undefined ? objectDef.default_detail_color_channel : -1); const canColor = objectDef.can_color !== false; @@ -1538,6 +1566,8 @@ window.LevelObject = class LevelObject { if (!objGids || !objGids.length || !spr) return; spr._origWorldX = baseWorldX; spr._origBaseY = baseBaseY; + spr._eeGroups = objGids; + if (spr._origRotation === undefined) spr._origRotation = spr.rotation; for (const gid of objGids) { if (!this._groupSprites[gid]) this._groupSprites[gid] = []; this._groupSprites[gid].push(spr); @@ -1661,7 +1691,7 @@ window.LevelObject = class LevelObject { overlaySprite._eeOrigAlpha = 1; let oc2 = col2; - if (oc2 <= 0) oc2 = 2; + if (oc2 <= 0) oc2 = col1; registerColor(overlaySprite, oc2); this._addToSection(overlaySprite); @@ -1743,9 +1773,7 @@ window.LevelObject = class LevelObject { } } } - } - - if (objectDef && objectDef.portalParticle && frameName && !window.isEditor && !scene?._editorPlaytestActive) { + } else if (objectDef && objectDef.portalParticle && frameName) { const particleWorldX = worldX; const particleWorldY = b(worldY); const radiusFactor = 2; @@ -1806,6 +1834,7 @@ window.LevelObject = class LevelObject { particles._eeWorldX = worldX; particles._eeBaseY = particleY; this._addToSection(particles); + this._portalEmitters.push(particles); } if (objectDef) { @@ -1814,6 +1843,10 @@ window.LevelObject = class LevelObject { col._baseY = col.y; col._origBaseX = col.x; col._origBaseY = col.y; + col._origRotationDeg = col.rotationDegrees; + col._origHypoAx = col.hypoAx; col._origHypoAy = col.hypoAy; + col._origHypoBx = col.hypoBx; col._origHypoBy = col.hypoBy; + col._origRightAx = col.rightAx; col._origRightAy = col.rightAy; col._eeObjectId = linkedObjectId; col._eeEditorLayer = parseInt(levelObj.editorLayer ?? levelObj._raw?.[20] ?? levelObj._raw?.["20"] ?? 0, 10) || 0; col._eeEditorLayer2 = parseInt(levelObj.editorLayer2 ?? levelObj._raw?.[61] ?? levelObj._raw?.["61"] ?? 0, 10) || 0; @@ -1888,6 +1921,9 @@ window.LevelObject = class LevelObject { 660: "wave", 111: "ufo", 745: "robot", + 747: "teleport_in", + 1933: "swing", + 749: "teleport_out", 1331: "spider", 286: "dual_on", 287: "dual_off" @@ -1905,18 +1941,23 @@ window.LevelObject = class LevelObject { wave: portalWaveType, ufo: portalUfoType, robot: "portal_robot", + swing: "portal_swing", spider: "portal_spider", mirrora: "portal_mirror_on", mirrorb: "portal_mirror_off", shrink: "portal_mini_on", grow: "portal_mini_off", + teleport_in: "portal_teleport_in", + teleport_out: "portal_teleport_out", dual_on: "portal_dual_on", dual_off: "portal_dual_off" }[portalSub] || null; if (portalColliderType) { const collider = new Collider(portalColliderType, worldX, worldY, portalW, portalH, levelObj.rot || 0); + // store portal Y for both portals collider.portalY = worldY; + collider.portalObjId = levelObj.id; registerCollider(collider); this.objects.push(collider); hasCollisionEntry = true; @@ -1927,6 +1968,7 @@ window.LevelObject = class LevelObject { const padH = objectDef.gridH * a; const padObj = new Collider(jumpPadType, worldX, worldY, padW, padH, levelObj.rot || 0); padObj.padId = levelObj.id; + padObj.flipY = !!levelObj.flipY; registerCollider(padObj); this.objects.push(padObj); hasCollisionEntry = true; @@ -1971,6 +2013,42 @@ window.LevelObject = class LevelObject { this.objects.push(speedObj); hasCollisionEntry = true; this._addCollisionToSection(speedObj); + } else if (objectDef.type === slopeType) { + const sd = _SLOPE_DATA[levelObj.id]; + if (sd) { + const hw0 = (sd.gw * a) / 2; + const hh0 = (sd.gh * a) / 2; + let vRight = { x: hw0, y: -hh0 }; + let vLo = { x: -hw0, y: -hh0 }; + let vHi = { x: hw0, y: hh0 }; + const fx = levelObj.flipX ? -1 : 1; + const fy = levelObj.flipY ? -1 : 1; + const flip = p => ({ x: p.x * fx, y: p.y * fy }); + vRight = flip(vRight); vLo = flip(vLo); vHi = flip(vHi); + const rotDeg = levelObj.rot || 0; + vRight = rotateSlopePoint(vRight.x, vRight.y, rotDeg); + vLo = rotateSlopePoint(vLo.x, vLo.y, rotDeg); + vHi = rotateSlopePoint(vHi.x, vHi.y, rotDeg); + const xs = [vRight.x, vLo.x, vHi.x]; + const ys = [vRight.y, vLo.y, vHi.y]; + const w = Math.max(...xs) - Math.min(...xs); + const h = Math.max(...ys) - Math.min(...ys); + // this is impossible bruv + const col = new Collider(slopeType, worldX, worldY, w, h, 0); + col.objid = levelObj.id; + col.hypoAx = vLo.x; col.hypoAy = vLo.y; + col.hypoBx = vHi.x; col.hypoBy = vHi.y; + col.rightAx = vRight.x; col.rightAy = vRight.y; + // 3 hours for all ts above and under + const hypoDx = vHi.x - vLo.x; + col.slopeSolidBelow = Math.abs(hypoDx) < 0.01 + ? vRight.x < vLo.x + : vRight.y < (vLo.y + ((vRight.x - vLo.x) / hypoDx) * (vHi.y - vLo.y)); + registerCollider(col); + this.objects.push(col); + hasCollisionEntry = true; + this._addCollisionToSection(col); + } } if (!hasCollisionEntry) { @@ -1998,8 +2076,94 @@ window.LevelObject = class LevelObject { } } - unknownObjectIds.size; if (unknownObjectIds.size > 0) { + console.log("[Level] Unknown object IDs skipped:", [...unknownObjectIds]); + } + + // portal logic once again + + const _tpInList = this.objects.filter(o => o.type === "portal_teleport_in"); + const _tpOutList = this.objects.filter(o => o.type === "portal_teleport_out"); + + // check if we need to create orange portals from blue portals key 54 offsets + if (_tpInList.length > 0 && _tpOutList.length === 0) { + let possibleOrangePortals = []; + for (const levelObj of _0x35f1ae) { + if (levelObj && levelObj.id === 749) { + possibleOrangePortals.push(levelObj); + } + } + + if (possibleOrangePortals.length > 0) { + for (const orangeObj of possibleOrangePortals) { + this._spawnObject(orangeObj); + } + } else { + // ONLy create orange portal offsets if a blue teleport portal exists, with the raw data + + for (const _tpIn of _tpInList) { + let rawBluePortal = null; + let key54Value = 0; + + for (const rawObj of _0x35f1ae) { + if (rawObj && rawObj.id === 747) { + const rawWorldX = rawObj.x * 2; + const rawWorldY = rawObj.y * 2; + + if (Math.abs(rawWorldX - _tpIn.x) < 5 && Math.abs(rawWorldY - _tpIn.y) < 5) { + rawBluePortal = rawObj; + key54Value = rawObj._raw && rawObj._raw["54"] ? parseFloat(rawObj._raw["54"]) : 0; + break; + } + } + } + + const _orangeWorldY = (_tpIn.y || _tpIn.portalY || 0) + (key54Value * 2); + + // orange portal should use its rotation on raw data + // will fix later + let orangeRotation = 0; + + for (const rawObj749 of _0x35f1ae) { + if (rawObj749 && rawObj749.id === 749) { + const raw749WorldX = rawObj749.x * 2; + const raw749WorldY = rawObj749.y * 2; + + if (Math.abs(raw749WorldX - _tpIn.x) < 5 && Math.abs(raw749WorldY - _orangeWorldY) < 5) { + orangeRotation = rawObj749._raw && rawObj749._raw["6"] ? parseFloat(rawObj749._raw["6"]) : (rawBluePortal._raw && rawBluePortal._raw["6"] ? parseFloat(rawBluePortal._raw["6"]) : 0); + break; + } + } + } + + if (orangeRotation === 0) { + orangeRotation = rawBluePortal._raw && rawBluePortal._raw["6"] ? parseFloat(rawBluePortal._raw["6"]) : 0; + } + + const _syntheticObj = { + id: 749, + x: _tpIn.x / 2, + y: _orangeWorldY / 2, + flipX: rawBluePortal.flipX || false, + flipY: rawBluePortal.flipY || false, + rot: orangeRotation, + scale: 1, + zLayer: 5, + zOrder: 10, + groups: "", + color1: 0, + color2: -1, + gameMode: 0, + miniMode: 0, + speed: 0, + mirrored: 0, + flipGravity: false, + _raw: {} + }; + + this._spawnObject(_syntheticObj); + } + } } const colTypeCounts = {}; @@ -2070,6 +2234,12 @@ window.LevelObject = class LevelObject { if (this.endXPos <= 0) { return; } + // Guard against leaking the previous set of objects if this is ever + // called again for the same level (container destroy(true) also + // destroys its child images). + if (this._endPortalContainer) { this._endPortalContainer.destroy(true); this._endPortalContainer = null; } + if (this._endPortalShine) { this._endPortalShine.destroy(); this._endPortalShine = null; } + if (this._endPortalEmitter) { this._endPortalEmitter.destroy(); this._endPortalEmitter = null; } const _0x3b56d4 = this.endXPos; const _0x1c3aea = b(240); const _0x46064b = Math.round(16); @@ -2149,7 +2319,6 @@ window.LevelObject = class LevelObject { if (!Number.isInteger(uid) || !Array.isArray(window.levelObjects)) return true; return window.levelObjects.some(obj => obj && Number.isInteger(obj._eeObjectId) && obj._eeObjectId === uid); } - checkColorTriggers(_0x2b00ce) { let _0x24b030 = []; while (this._colorTriggerIdx < this._colorTriggers.length) { @@ -2187,7 +2356,6 @@ window.LevelObject = class LevelObject { } resetColorTriggers() { this._colorTriggerIdx = 0; - this._touchColorTriggerActivated = new Set(); } _getSectionIndexForWorldX(worldX) { return Math.max(0, Math.floor((Number(worldX) || 0) / 400)); @@ -2306,12 +2474,51 @@ window.LevelObject = class LevelObject { _0x141e9c.normal.visible = _0x488507; } } + // Checks each dynamic (move/rotate-driven) sprite's CURRENT position + // against the camera and force-shows/hides its section accordingly, but + // only touches sections the normal range-based logic above isn't already + // handling - so this never fights the normal culling, it just patches the + // cases that culling gets wrong for objects that have moved away from + // their spawn-position bucket. + _updateDynamicSectionVisibility(cameraX) { + if (this._dynamicSprites.length === 0) return; + const lo = cameraX - 200; + const hi = cameraX + screenWidth + 200; + const needed = new Set(); + for (const spr of this._dynamicSprites) { + if (!spr) continue; + if (spr.x >= lo && spr.x <= hi) needed.add(spr._eeDynSection); + } + const minSec = this._visMinSec, maxSec = this._visMaxSec; + for (const idx of needed) { + if (!this._dynamicForceVisible.has(idx) && (idx < minSec || idx > maxSec)) { + this._setSectionVisible(idx, true); + } + } + for (const idx of this._dynamicForceVisible) { + if (!needed.has(idx) && (idx < minSec || idx > maxSec)) { + this._setSectionVisible(idx, false); + } + } + this._dynamicForceVisible = needed; + } updateVisibility(_0xa5f1e1) { - this.updateTriggerEditorVisuals(); const _0x1dce22 = this._sectionContainers.length - 1; if (_0x1dce22 < 0) { return; } + // Portal particle emitters sit in the always-visible topContainer (layer 2), so + // section culling never pauses them — in a long level every off-screen portal + // would keep simulating particles every frame. Stop + hide the far-away ones. + if (this._portalEmitters.length) { + const _emLo = _0xa5f1e1 - 600; + const _emHi = _0xa5f1e1 + screenWidth + 600; + for (const _em of this._portalEmitters) { + if (!_em || !_em.active) continue; + const _on = _em._eeWorldX >= _emLo && _em._eeWorldX <= _emHi; + if (_em.emitting !== _on) { _em.emitting = _on; _em.setVisible(_on); } + } + } const particleScale = Math.max(0, Math.floor((_0xa5f1e1 - 200) / 400)); const sliderHeight = Math.min(_0x1dce22, Math.floor((_0xa5f1e1 + screenWidth + 200) / 400)); const _0x1800fc = this._visMinSec; @@ -2322,6 +2529,7 @@ window.LevelObject = class LevelObject { } this._visMinSec = particleScale; this._visMaxSec = sliderHeight; + this._updateDynamicSectionVisibility(_0xa5f1e1); return; } if (particleScale !== _0x1800fc || sliderHeight !== _0xc31046) { @@ -2348,6 +2556,7 @@ window.LevelObject = class LevelObject { this._visMinSec = particleScale; this._visMaxSec = sliderHeight; } + this._updateDynamicSectionVisibility(_0xa5f1e1); } updateObjectDebugIds() { if (window.showObjectIds) { @@ -2374,10 +2583,15 @@ window.LevelObject = class LevelObject { const _0x2171db = this._collisionSections[_0xe2cbfa]; if (_0x2171db) { for (let _0x5cdca9 = 0; _0x5cdca9 < _0x2171db.length; _0x5cdca9++) { - _0x28a7c0.push(_0x2171db[_0x5cdca9]); + // Dynamic colliders are appended separately below (regardless of + // which stale section bucket they were originally filed under). + if (!_0x2171db[_0x5cdca9]._eeDynamic) _0x28a7c0.push(_0x2171db[_0x5cdca9]); } } } + for (let _0xd1 = 0; _0xd1 < this._dynamicColliders.length; _0xd1++) { + _0x28a7c0.push(this._dynamicColliders[_0xd1]); + } return _0x28a7c0; } checkEnterEffectTriggers(_0x5d0838) { @@ -2447,7 +2661,23 @@ window.LevelObject = class LevelObject { } } + // NOTE: an object can belong to more than one group (e.g. a platform put in + // both an "X move" group and a separate "Y move" group to get independent + // easing per axis, which is a very common GD building technique). The old + // code positioned every sprite/collider using ONLY the offset of whichever + // group's trigger happened to be processed last that frame, so it would + // overwrite (not add to) any movement coming from the object's other + // group. With two triggers active at once that made the object's real + // position flip between the "X only" result and the "Y only" result frame + // to frame instead of combining them - which is exactly the snapping / + // "teleporting" behavior, and why a moving hazard or platform could clip + // into (or drop out from under) the player when X and Y moved together. + // The fix below sums the accumulated offset of every group an object + // belongs to before positioning it, so simultaneous move triggers on + // overlapping groups combine the way they do in GD instead of stomping + // on each other. stepMoveTriggers(dt) { + const touchedGroups = new Set(); let i = 0; while (i < this._activeMoveTweens.length) { const anim = this._activeMoveTweens[i]; @@ -2478,38 +2708,13 @@ window.LevelObject = class LevelObject { anim.prevCameraY = followPos.cameraY; } - const sprites = this._groupSprites[trig.targetGroup]; - const colliders = this._groupColliders[trig.targetGroup]; - if (sprites || colliders) { - const off = this._groupOffsets[trig.targetGroup]; - off.x += deltaX; - off.y += deltaY; - if (sprites) { - for (const spr of sprites) { - if (!spr || !spr.active) continue; - spr.x = spr._origWorldX + off.x; - spr.y = spr._origBaseY + off.y; - spr._eeWorldX = spr.x; - spr._eeBaseY = spr.y; - this._refreshSpriteSection(spr); - if (spr._coinWorldX !== undefined) { - spr._coinWorldX = (spr._origWorldX + off.x) / 2; - } - if (spr._coinWorldY !== undefined) { - spr._coinWorldY = (460 - (spr._origBaseY + off.y)) / 2; - } - } - } - if (colliders) { - for (const col of colliders) { - col.x = col._origBaseX + off.x; - col.y = col._origBaseY - off.y; - col._baseX = col.x; - col._baseY = col.y; - this._refreshCollisionSection(col); - } - } + if (!this._groupOffsets[trig.targetGroup]) { + this._groupOffsets[trig.targetGroup] = { x: 0, y: 0 }; } + const off = this._groupOffsets[trig.targetGroup]; + off.x += deltaX; + off.y += deltaY; + touchedGroups.add(trig.targetGroup); if (progress >= 1) { this._activeMoveTweens.splice(i, 1); @@ -2517,6 +2722,56 @@ window.LevelObject = class LevelObject { i++; } } + + if (touchedGroups.size === 0) return; + + const movedSprites = new Set(); + const movedColliders = new Set(); + for (const gid of touchedGroups) { + const sprites = this._groupSprites[gid]; + if (sprites) for (const spr of sprites) movedSprites.add(spr); + const colliders = this._groupColliders[gid]; + if (colliders) for (const col of colliders) movedColliders.add(col); + } + + for (const spr of movedSprites) { + if (!spr || !spr.active) continue; + let totalX = 0, totalY = 0; + const groups = spr._eeGroups; + if (groups) { + for (const gid of groups) { + const off = this._groupOffsets[gid]; + if (off) { totalX += off.x; totalY += off.y; } + } + } + spr.x = spr._origWorldX + totalX; + spr.y = spr._origBaseY + totalY; + spr._eeWorldX = spr.x; + spr._eeBaseY = spr.y; + this._refreshSpriteSection(spr); + if (spr._coinWorldX !== undefined) { + spr._coinWorldX = (spr._origWorldX + totalX) / 2; + } + if (spr._coinWorldY !== undefined) { + spr._coinWorldY = (460 - (spr._origBaseY + totalY)) / 2; + } + } + + for (const col of movedColliders) { + let totalX = 0, totalY = 0; + const groups = col._eeGroups; + if (groups) { + for (const gid of groups) { + const off = this._groupOffsets[gid]; + if (off) { totalX += off.x; totalY += off.y; } + } + } + col.x = col._origBaseX + totalX; + col.y = col._origBaseY - totalY; + col._baseX = col.x; + col._baseY = col.y; + this._refreshCollisionSection(col); + } } resetMoveTriggers() { @@ -2699,7 +2954,7 @@ window.LevelObject = class LevelObject { for (const spr of sprites) { if (!spr || !spr.active) continue; if (spr._eeActive) continue; - spr.setAlpha(spr._eeIsGlowSprite ? op * this._getGlowAlphaMultiplier() : op); + spr.setAlpha(op); } } } @@ -2712,7 +2967,7 @@ window.LevelObject = class LevelObject { for (const spr of this._groupSprites[gid]) { if (!spr || !spr.active) continue; if (spr._eeActive) continue; - spr.setAlpha(spr._eeIsGlowSprite ? this._getGlowAlphaMultiplier() : 1); + spr.setAlpha(1); spr._eeOrigAlpha = 1; } } @@ -2740,6 +2995,30 @@ window.LevelObject = class LevelObject { anim.prevProgress = progress; const sprites = this._groupSprites[trig.targetGroup]; const colliders = this._groupColliders[trig.targetGroup]; + // Rotates a collider's local slope/edge vectors in place. Without + // this, a rotating slope's hitbox keeps its pre-rotation edge angle + // while the sprite visually spins, so the walkable surface ends up + // in the wrong place relative to what's drawn - the random deaths. + // + // The slope edge vectors were originally built by rotateSlopePoint() + // at spawn time, which negates the angle before rotating (theta = + // -rotDeg) to match the texture's actual orientation - sprite + // rotation itself (spr.rotation += deltaRot) is NOT negated. So the + // shape rotation here has to use that same negated handedness, or it + // spins opposite to the sprite and the two drift further apart the + // more the trigger rotates (e.g. ~180 degrees off by the time the + // total rotation reaches 90 degrees) - this was the actual cause of + // the random deaths on heavily-rotating hazards (wheels, gears). + const rotateColliderShape = (col, cosD, sinD) => { + const sinShape = -sinD; + let px = col.hypoAx, py = col.hypoAy; + col.hypoAx = px * cosD - py * sinShape; col.hypoAy = px * sinShape + py * cosD; + px = col.hypoBx; py = col.hypoBy; + col.hypoBx = px * cosD - py * sinShape; col.hypoBy = px * sinShape + py * cosD; + px = col.rightAx; py = col.rightAy; + col.rightAx = px * cosD - py * sinShape; col.rightAy = px * sinShape + py * cosD; + col.rotationDegrees += deltaRot * 180 / Math.PI; + }; if (trig.centerGroup > 0) { const centerSprites = this._groupSprites[trig.centerGroup]; if (centerSprites && centerSprites.length > 0) { @@ -2759,7 +3038,12 @@ window.LevelObject = class LevelObject { spr.y = cy + dx * sinD + dy * cosD; spr._eeWorldX = spr.x; spr._eeBaseY = spr.y; - if (spr._origWorldX !== undefined) { spr._origWorldX = spr.x; spr._origBaseY = spr.y; } + // _origWorldX/_origBaseY must stay at the sprite's true + // spawn position - Move Triggers use it as their baseline + // (origin + offset). Overwriting it with the live rotated + // position here used to corrupt that baseline for anything + // also targeted by a Move Trigger, and broke resetRotateTriggers()'s + // ability to restore the original spot on respawn. if (!trig.lockRotation) spr.rotation += deltaRot; } } @@ -2769,18 +3053,28 @@ window.LevelObject = class LevelObject { col.x = cx + dx * cosD - dy * sinD; col.y = cy + dx * sinD + dy * cosD; col._baseX = col.x; col._baseY = col.y; - if (col._origBaseX !== undefined) { col._origBaseX = col.x; col._origBaseY = col.y; } + if (!trig.lockRotation) rotateColliderShape(col, cosD, sinD); } } } } } else { + const cosD = Math.cos(deltaRot), sinD = Math.sin(deltaRot); if (sprites) { for (const spr of sprites) { if (!spr || !spr.active) continue; spr.rotation += deltaRot; } } + if (colliders) { + // Spin-in-place rotate triggers (no center group) previously + // never touched colliders at all, so a spinning slope's sprite + // would rotate while its hitbox stayed frozen at the original + // angle - same desync, just without the orbit. + for (const col of colliders) { + rotateColliderShape(col, cosD, sinD); + } + } } if (progress >= 1) { this._activeRotateTweens.splice(i, 1); } else { i++; } } @@ -2788,6 +3082,42 @@ window.LevelObject = class LevelObject { resetRotateTriggers() { this._rotateTriggerIdx = 0; this._activeRotateTweens = []; + const seen = new Set(); + for (const trig of this._rotateTriggers) { + const sprites = this._groupSprites[trig.targetGroup]; + if (sprites) { + for (const spr of sprites) { + if (!spr || seen.has(spr)) continue; + seen.add(spr); + if (spr._origWorldX !== undefined) { + spr.x = spr._origWorldX; + spr.y = spr._origBaseY; + spr._eeWorldX = spr._origWorldX; + spr._eeBaseY = spr._origBaseY; + } + if (spr._origRotation !== undefined) spr.rotation = spr._origRotation; + } + } + const colliders = this._groupColliders[trig.targetGroup]; + if (colliders) { + for (const col of colliders) { + if (!col || seen.has(col)) continue; + seen.add(col); + if (col._origBaseX !== undefined) { + col.x = col._origBaseX; + col.y = col._origBaseY; + col._baseX = col._origBaseX; + col._baseY = col._origBaseY; + } + if (col._origHypoAx !== undefined) { + col.hypoAx = col._origHypoAx; col.hypoAy = col._origHypoAy; + col.hypoBx = col._origHypoBx; col.hypoBy = col._origHypoBy; + col.rightAx = col._origRightAx; col.rightAy = col._origRightAy; + col.rotationDegrees = col._origRotationDeg; + } + } + } + } } checkPulseTriggers(playerX) { @@ -2799,6 +3129,7 @@ window.LevelObject = class LevelObject { } } stepPulseTriggers(dt, colorManager) { + this._ensureInitialColorsApplied(colorManager); let i = 0; while (i < this._activePulses.length) { const pulse = this._activePulses[i]; @@ -2860,6 +3191,7 @@ window.LevelObject = class LevelObject { } applyColorChannels(colorManager) { + this._ensureInitialColorsApplied(colorManager); for (const chId in this._colorChannelSprites) { const sprites = this._colorChannelSprites[chId]; if (!sprites || !sprites.length) continue; @@ -2885,7 +3217,7 @@ window.LevelObject = class LevelObject { for (let _0x13e116 = 0; _0x13e116 < _0x14a035.length; _0x13e116++) { const visMinSection = _0x14a035[_0x13e116]; visMinSection._eeActive = false; - visMinSection.visible = visMinSection._eeIsGlowSprite ? this._isGlowVisible() : true; + visMinSection.visible = true; visMinSection.x = visMinSection._eeWorldX; visMinSection.y = visMinSection._eeBaseY; if (!visMinSection._eeAudioScale) { @@ -2898,15 +3230,11 @@ window.LevelObject = class LevelObject { } _getGroupOpacityForSprite(spr) { const groups = spr && spr._eeGroups; + if (!groups || !groups.length) return 1; let op = 1; - if (groups && groups.length) { - for (const gid of groups) { - const g = this._groupOpacity[gid]; - if (g !== undefined && g < op) op = g; - } - } - if (spr && spr._eeIsGlowSprite) { - op *= this._getGlowAlphaMultiplier(); + for (const gid of groups) { + const g = this._groupOpacity[gid]; + if (g !== undefined && g < op) op = g; } return op; } @@ -3016,12 +3344,15 @@ window.LevelObject = class LevelObject { } updateAudioScale(_0x337bf7) { for (let _0x24afdb of this._audioScaleSprites) { + // Skip sprites in culled sections — no point dirtying their transforms + if (_0x24afdb.parentContainer && !_0x24afdb.parentContainer.visible) continue; _0x24afdb.setScale(_0x337bf7); } const _now = Date.now(); const _clickMult = window.orbClickScale || 2.0; const _shrinkMs = window.orbClickShrinkTime || 250; for (let _0xOrbSpr of this._orbSprites) { + if (!_0xOrbSpr._hitTime && _0xOrbSpr.parentContainer && !_0xOrbSpr.parentContainer.visible) continue; const _baseScale = 0.75 + _0x337bf7 * 0.15; if (_0xOrbSpr._hitTime) { const _elapsed = _now - _0xOrbSpr._hitTime; diff --git a/assets/scripts/core/loading-screen.js b/assets/scripts/core/loading-screen.js index 5cd6e8be..5b27457b 100644 --- a/assets/scripts/core/loading-screen.js +++ b/assets/scripts/core/loading-screen.js @@ -240,6 +240,7 @@ class BootScene extends Phaser.Scene { this.load.atlas("GJ_GameSheet02", "assets/sheets/GJ_GameSheet02.png", "assets/sheets/GJ_GameSheet02.json"); this.load.atlas("GJ_GameSheet03", "assets/sheets/GJ_GameSheet03.png", "assets/sheets/GJ_GameSheet03.json"); this.load.atlas("GJ_GameSheet04", "assets/sheets/GJ_GameSheet04.png", "assets/sheets/GJ_GameSheet04.json"); + this.load.atlas("GJ_GameSheet04_UHD", "assets/sheets/GJ_GameSheet04_UHD.png", "assets/sheets/GJ_GameSheet04_UHD.json"); this.load.atlas("GJ_GameSheetEditor", "assets/sheets/GJ_GameSheetEditor.png", "assets/sheets/GJ_GameSheetEditor.json"); this.load.atlas("GJ_GameSheetGlow", "assets/sheets/GJ_GameSheetGlow.png", "assets/sheets/GJ_GameSheetGlow.json"); this.load.atlas("GJ_GameSheetIcons", "assets/sheets/GJ_GameSheetIcons.png", "assets/sheets/GJ_GameSheetIcons.json"); diff --git a/assets/scripts/core/main.js b/assets/scripts/core/main.js index 4106d94d..ec1667e9 100644 --- a/assets/scripts/core/main.js +++ b/assets/scripts/core/main.js @@ -38,29 +38,36 @@ if (window.gameCache) { }, 3000); } } + + +// Fixed full-screen flex wrapper as the Phaser parent. Flexbox centering is +// completely immune to anything ScaleManager writes to canvas inline styles, +// so the game stays centered through scene restarts and resize callbacks. +var _gameWrapper = document.createElement('div'); +_gameWrapper.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:#000;pointer-events:none;'; +document.body.appendChild(_gameWrapper); + const phaserConfig = { type: Phaser.AUTO, width: screenWidth, height: screenHeight, - resolution: 1, - fps: { - smoothStep: true - }, + fps: { smoothStep: true }, backgroundColor: "#000000", - parent: document.body, - input: { - windowEvents: false - }, - render: { - powerPreference: "default" - }, + parent: _gameWrapper, + input: { windowEvents: false }, + render: { powerPreference: "default" }, scale: { mode: Phaser.Scale.FIT, - autoCenter: Phaser.Scale.CENTER_BOTH + autoCenter: Phaser.Scale.NO_CENTER }, scene: [BootScene, GameScene] }; -new Phaser.Game(phaserConfig); +const _phaserGame = new Phaser.Game(phaserConfig); + +// Re-enable pointer events on the canvas (wrapper has pointer-events:none). +_phaserGame.events.once('ready', function () { + _phaserGame.canvas.style.pointerEvents = 'auto'; +}); window.clearGameCache = () => { if (window.gameCache) { diff --git a/assets/scripts/core/player.js b/assets/scripts/core/player.js index 7e10809e..d9cd144b 100644 --- a/assets/scripts/core/player.js +++ b/assets/scripts/core/player.js @@ -32,12 +32,22 @@ class PlayerState { this.queuedHold = false; this.isDead = false; this.mirrored = false; + this._robotHold = false; + this._robotHoldTimer = 0; this.isDashing = false; this.dashYVelocity = 0; this.isDual = false; this.ignorePortals = false; - this._robotHold = false; - this._robotHoldTimer = 0; + this.robotCurrentAnimation = null; + this.robotAnimationFrame = 0; + this.robotAnimationTimer = 0; + this.robotAnimationFrameDuration = 45; + this.robotIsAnimating = false; + this._robotAnimState = 'GROUND'; + this.robotJumpStartTimer = 0; + this.robotFallStartTimer = 0; + this.robotSpeedMultiplier = 1.0; + this._robotGroundJump = false; this._spiderTeleportNoclipDeathPending = false; } } @@ -190,8 +200,7 @@ class WaveTrail { const n = pts.length; const upper = new Array(n); const lower = new Array(n); - - // precompute per-segment normals + const segNx = new Array(n - 1); const segNy = new Array(n - 1); for (let i = 0; i < n - 1; i++) { @@ -211,18 +220,18 @@ class WaveTrail { } else if (i === n - 1) { nx = segNx[n - 2]; ny = segNy[n - 2]; } else { - // miter: intersect the two offset edge lines for a sharp corner + // ez const n1x = segNx[i - 1], n1y = segNy[i - 1]; const n2x = segNx[i], n2y = segNy[i]; - // upper edge intersection + // dont even think code is fun const u1 = { x: pts[i - 1].x + n1x * halfW, y: pts[i - 1].y + n1y * halfW }; const u2 = { x: p.x + n1x * halfW, y: p.y + n1y * halfW }; const u3 = { x: p.x + n2x * halfW, y: p.y + n2y * halfW }; const u4 = { x: pts[i + 1].x + n2x * halfW, y: pts[i + 1].y + n2y * halfW }; const mu = this._intersect(u1, u2, u3, u4); - // lower edge intersection + // yeah this is shit const l1 = { x: pts[i - 1].x - n1x * halfW, y: pts[i - 1].y - n1y * halfW }; const l2 = { x: p.x - n1x * halfW, y: p.y - n1y * halfW }; const l3 = { x: p.x - n2x * halfW, y: p.y - n2y * halfW }; @@ -317,6 +326,7 @@ function ds(scene, x, y, frameName, depth, isVisible) { }; } +// --- Spider rig helpers (ported from upstream web-dashers automatons) --- function _textureHasFrameSafe(scene, textureKey, frameName) { try { const texture = scene?.textures?.get(textureKey); @@ -387,6 +397,8 @@ class PlayerObject { this.p = _0x3f50cc; this._gameLayer = _0x2811e1; this._rotation = 0; + this._slopeGroundAngle = null; + this._visualTilt = 0; this.rotateActionActive = false; this.rotateActionTime = 0; this.rotateActionDuration = 0; @@ -411,7 +423,6 @@ class PlayerObject { this._robotJumpFlameAnchorY = b(this.p.y); this._lastScreenX = centerX; this._lastScreenY = b(this.p.y); - this._hitboxTrail = []; this._createSprites(); this._hitboxGraphics = scene.add.graphics().setScrollFactor(0).setDepth(20); this._initParticles(scene); @@ -423,1165 +434,1420 @@ class PlayerObject { deaths: 0 }; } - _getSpiderIconBase() { - const rawBase = String(window.currentSpider || "spider_01"); - const match = rawBase.match(/^spider_\d+/); - return match ? match[0] : "spider_01"; - } - _resolveSpiderIconFrame(frameName) { - const base = this._getSpiderIconBase(); - const resolved = String(frameName || "").replace(/^spider_\d+/, base); - if (_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", resolved)) return resolved; - if (_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", frameName)) return frameName; - return resolved; + updateGroundRotation(delta) { + this._rotation += delta * 0.15; + for (const layer of this._playerLayers) { + if (layer && layer.sprite && layer.sprite.visible) { + layer.sprite.setRotation(this._rotation); + } } - _getSpiderAnimDesc() { - if (this._spiderAnimDesc !== undefined) return this._spiderAnimDesc; - let data = null; - try { - data = this._scene?.cache?.json?.get?.("Spider_AnimDesc") || null; - } catch (err) { - data = null; +} + _createSprites() { + const spriteY = this._scene; + const spriteX = b(this.p.y); + const particleY = centerX; + this._playerGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentPlayer}_glow_001.png`, 9, false); + this._playerSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentPlayer}_001.png`, 10, true); + this._playerOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentPlayer}_2_001.png`, 8, true); + this._playerExtraLayer = ds(spriteY, particleY, spriteX, `${window.currentPlayer}_extra_001.png`, 12, true); + if (this._playerGlowLayer) { + this._playerGlowLayer.sprite.setTint(window.secondaryColor); + this._playerGlowLayer.sprite._glowEnabled = false; } - if (!data && typeof window !== "undefined") data = window.Spider_AnimDesc || null; - if (!data || !data.animationContainer) { - this._spiderFrameGroups = {}; - return null; + if (this._playerSpriteLayer) { + this._playerSpriteLayer.sprite.setTint(window.mainColor); + } else { + let _0x3aecd9 = spriteY.add.rectangle(particleY, spriteX, g, g, window.mainColor); + _0x3aecd9.setDepth(10); + this._playerSpriteLayer = { + sprite: _0x3aecd9 + }; } - this._spiderAnimDesc = data; - this._spiderFrameGroups = {}; - if (this._spiderAnimDesc?.animationContainer) { - const frameKeys = Object.keys(this._spiderAnimDesc.animationContainer); - const sortBySuffix = (a, b) => { - const aa = parseInt((String(a).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; - const bb = parseInt((String(b).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; - return aa - bb; + if (this._playerOverlayLayer) { + this._playerOverlayLayer.sprite.setTint(window.secondaryColor); + } + this._shipGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentShip}_glow_001.png`, 9, false); + this._shipSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentShip}_001.png`, 10, false); + this._shipOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentShip}_2_001.png`, 8, false); + this._shipExtraLayer = ds(spriteY, particleY, spriteX, `${window.currentShip}_extra_001.png`, 12, false); + if (this._shipGlowLayer) { + this._shipGlowLayer.sprite.setTint(window.secondaryColor); + this._shipGlowLayer.sprite._glowEnabled = false; + } + if (this._shipSpriteLayer) { + this._shipSpriteLayer.sprite.setTint(window.mainColor); + } else { + let _0x100643 = spriteY.add.polygon(particleY, spriteX, [{ + x: -72, + y: 40 + }, { + x: 72, + y: 0 + }, { + x: -72, + y: -40 + }, { + x: -40, + y: 0 + }], window.mainColor); + _0x100643.setDepth(10).setVisible(false); + this._shipSpriteLayer = { + sprite: _0x100643 }; - this._spiderFrameGroups.run = frameKeys.filter(k => /^Spider_run_\d+\.png$/.test(k)).sort(sortBySuffix); - this._spiderFrameGroups.run2 = frameKeys.filter(k => /^Spider_run2_\d+\.png$/.test(k)).sort(sortBySuffix); - this._spiderFrameGroups.walk = frameKeys.filter(k => /^Spider_walk_\d+\.png$/.test(k)).sort(sortBySuffix); - this._spiderFrameGroups.fall = frameKeys.filter(k => /^Spider_fall_loop_\d+\.png$/.test(k)).sort(sortBySuffix); - this._spiderFrameGroups.idle = frameKeys.filter(k => /^Spider_idle01_\d+\.png$/.test(k)).sort(sortBySuffix); - this._spiderFrameGroups.idle2 = frameKeys.filter(k => /^Spider_idle02_\d+\.png$/.test(k)).sort(sortBySuffix); } - return this._spiderAnimDesc; - } - _createSpiderLayerSet(scene, x, y, textureName, tag) { - const resolvedBase = this._resolveSpiderIconFrame(textureName); - const layers = []; - const makeLayer = (variant, tint, depthOffset) => { - const frame = this._resolveSpiderIconFrame(_spiderVariantFrameName(resolvedBase, variant)); - const layer = _makeAtlasLayer(scene, x, y, "GJ_GameSheetIcons", frame, 8 + tag * 0.1 + depthOffset, false, tint, variant); - if (layer) layers.push(layer); - return layer; - }; - const glow = makeLayer("glow", window.secondaryColor, -0.04); - const base = makeLayer("base", window.mainColor, 0); - const overlay = makeLayer("overlay", window.secondaryColor, 0.04); - const extra = makeLayer("extra", null, 0.08); - return { tag, textureName, layers, glow, base, overlay, extra }; - } - _initSpiderAnimationParts(scene, x, y) { - this._spiderAnimTimer = 0; - this._spiderAnimDesc = undefined; - this._spiderPartsByTag = {}; - this._spiderLayers = []; - const desc = this._getSpiderAnimDesc(); - const usedTextures = desc?.usedTextures || null; - let entries = []; - if (usedTextures) { - entries = Object.values(usedTextures).slice().sort((a, b) => (parseInt(a.tag || "0", 10) || 0) - (parseInt(b.tag || "0", 10) || 0)); + if (this._shipOverlayLayer) { + this._shipOverlayLayer.sprite.setTint(window.secondaryColor); } - if (!entries.length) { - entries = [ - { tag: "0", texture: "spider_01_02_001.png" }, - { tag: "1", texture: "spider_01_02_001.png" }, - { tag: "2", texture: "spider_01_04_001.png" }, - { tag: "3", texture: "spider_01_01_001.png" }, - { tag: "4", texture: "spider_01_03_001.png" }, - { tag: "5", texture: "spider_01_02_001.png" } - ]; + this._ballGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentBall}_glow_001.png`, 9, false); + this._ballSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentBall}_001.png`, 10, false); + this._ballOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentBall}_2_001.png`, 8, false); + if (this._ballGlowLayer) { + this._ballGlowLayer.sprite.setTint(window.secondaryColor); + this._ballGlowLayer.sprite._glowEnabled = false; } - for (const entry of entries) { - const tag = parseInt(entry.tag || "0", 10) || 0; - const part = this._createSpiderLayerSet(scene, x, y, entry.texture, tag); - if (!part.layers.length) continue; - this._spiderPartsByTag[tag] = part; - this._spiderLayers.push(...part.layers); + if (this._ballSpriteLayer) { + this._ballSpriteLayer.sprite.setTint(window.mainColor); } - } - _selectSpiderFrameKey(dt) { - const desc = this._getSpiderAnimDesc(); - if (!desc?.animationContainer) return null; - if (this.p._spiderTeleportAnimTimer > 0 && desc.animationContainer["Spider_jump_001.png"]) { - this.p._spiderTeleportAnimTimer = Math.max(0, this.p._spiderTeleportAnimTimer - dt); - return "Spider_jump_001.png"; + if (this._ballOverlayLayer) { + this._ballOverlayLayer.sprite.setTint(window.secondaryColor); } - const _speedPortalRef = (typeof SpeedPortal !== "undefined" && SpeedPortal) ? SpeedPortal : null; - const _oneSpeed = Number(_speedPortalRef?.ONE_TIMES ?? 11.540004) || 11.540004; - const _halfSpeed = Number(_speedPortalRef?.HALF ?? (_oneSpeed * 0.8)) || (_oneSpeed * 0.8); - const _fourSpeed = Number(_speedPortalRef?.FOUR_TIMES ?? (_oneSpeed * 1.85)) || (_oneSpeed * 1.85); - const _activeSpeed = Number.isFinite(Number(playerSpeed)) ? Number(playerSpeed) : _oneSpeed; - let spiderAnimationSpeed = 1.75; - if (_activeSpeed >= _oneSpeed) { - const _fastT = Math.max(0, Math.min(1, (_activeSpeed - _oneSpeed) / Math.max(1e-6, _fourSpeed - _oneSpeed))); - spiderAnimationSpeed = 1.75 + _fastT * 0.35; - } else { - const _slowT = Math.max(0, Math.min(1, (_oneSpeed - _activeSpeed) / Math.max(1e-6, _oneSpeed - _halfSpeed))); - spiderAnimationSpeed = 1.75 - _slowT * 0.15; + this._waveGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentWave}_glow_001.png`, 9, false); + this._waveOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentWave}_2_001.png`, 8, false); + this._waveExtraLayer = null; + this._waveSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentWave}_001.png`, 10, false); + if (this._waveGlowLayer) { + this._waveGlowLayer.sprite.setTint(window.secondaryColor); + this._waveGlowLayer.sprite._glowEnabled = false; } - this._spiderAnimTimer = (this._spiderAnimTimer || 0) + Math.max(0, dt || 0) * spiderAnimationSpeed; - let group = null; - if (!this.p.onGround && !this.p.onCeiling) { - group = this._spiderFrameGroups?.fall; - } else { - group = this._spiderFrameGroups?.run; + if (this._waveSpriteLayer) { + this._waveSpriteLayer.sprite.setTint(window.mainColor); } - if (!group || !group.length) group = this._spiderFrameGroups?.walk; - if (!group || !group.length) group = this._spiderFrameGroups?.idle; - if (!group || !group.length) return desc.animationContainer["Spider_idle_001.png"] ? "Spider_idle_001.png" : null; - const fps = this.p.onGround || this.p.onCeiling ? 16 : 12; - const idx = Math.floor(this._spiderAnimTimer * fps) % group.length; - return group[idx]; - } - _applySpiderFrame(frameKey, baseX, baseY, dt) { - const desc = this._getSpiderAnimDesc(); - const frame = frameKey && desc?.animationContainer ? desc.animationContainer[frameKey] : null; - if (!frame || !this._spiderPartsByTag) return false; - const miniScale = this.p.isMini ? 0.6 : 1; - const mirrorSign = this.p.mirrored ? -1 : 1; - const gravitySign = this.p.gravityFlipped ? -1 : 1; - const positionYSign = this.p.gravityFlipped ? 1 : -1; - const seenTags = new Set(); - const robotFootTags = [2, 6]; - const robotFootPoints = []; - const robotLegPoints = []; + if (this._waveOverlayLayer) { + this._waveOverlayLayer.sprite.setTint(window.secondaryColor); + } + this.playerSprite = this._playerSpriteLayer.sprite; + this.shipSprite = this._shipSpriteLayer.sprite; + this._playerLayers = [this._playerSpriteLayer, this._playerGlowLayer, this._playerOverlayLayer, this._playerExtraLayer]; + this._shipLayers = [this._shipSpriteLayer, this._shipGlowLayer, this._shipOverlayLayer, this._shipExtraLayer]; + this._ballLayers = [this._ballSpriteLayer, this._ballGlowLayer, this._ballOverlayLayer].filter(_0x37ad93 => !!_0x37ad93); + this._waveLayers = [this._waveSpriteLayer, this._waveOverlayLayer, this._waveExtraLayer, this._waveGlowLayer].filter(_0x37ad93 => !!_0x37ad93); + // Multi-part animated spider rig (upstream automatons version) + this._initSpiderAnimationParts(spriteY, particleY, spriteX); + this._spiderSpriteLayer = this._spiderLayers.find(layer => layer.kind === "base") || null; + this._spiderGlowLayer = this._spiderLayers.find(layer => layer.kind === "glow") || null; + this._spiderOverlayLayer = this._spiderLayers.find(layer => layer.kind === "overlay") || null; + this._spiderExtraLayer = this._spiderLayers.find(layer => layer.kind === "extra") || null; + this._spiderDashEffectSprite = null; + if (_textureHasFrameSafe(spriteY, "GJ_GameSheet04", "spiderDash_001.png")) { + this._spiderDashEffectSprite = spriteY.add.image(particleY, spriteX, "GJ_GameSheet04", "spiderDash_001.png"); + this._spiderDashEffectSprite.setDepth(7.7); + this._spiderDashEffectSprite.setVisible(false); + this._spiderDashEffectSprite.setAlpha(0); + this._gameLayer?.container?.add?.(this._spiderDashEffectSprite); + this._spiderDashEffectSprite.setBlendMode('ADD'); + } + this._birdSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentBird}_001.png`, 10, false); + this._birdGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentBird}_2_001.png`, 9, false); + this._birdOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentBird}_3_001.png`, 8, false); + this._birdExtraLayer = ds(spriteY, particleY, spriteX, `${window.currentBird}_extra_001.png`, 12, false); + if (this._birdSpriteLayer) { + this._birdSpriteLayer.sprite.setTint(window.mainColor); + } + if (this._birdGlowLayer) { + this._birdGlowLayer.sprite.setTint(window.secondaryColor); + this._birdGlowLayer.sprite._glowEnabled = false; + } + if (this._birdOverlayLayer) { + this._birdOverlayLayer.sprite.setTint(window.secondaryColor); + } + this._birdLayers = [this._birdSpriteLayer, this._birdGlowLayer, this._birdOverlayLayer, this._birdExtraLayer].filter(x => !!x); - for (const spriteKey of Object.keys(frame)) { - if (!spriteKey.startsWith("sprite_")) continue; - const spriteData = frame[spriteKey]; - const tag = parseInt(spriteData.tag || "0", 10) || 0; - const part = this._spiderPartsByTag[tag]; - if (!part) continue; - seenTags.add(tag); - const pos = _parseAnimPair(spriteData.position, 0, 0); - const spiderLegTags = [0, 1, 4, 5]; - const isSpiderLegTag = spiderLegTags.includes(tag); - const spiderLocalYOffset = tag === 3 ? 5 : (isSpiderLegTag ? -9 : 0); - const spiderLocalXScale = isSpiderLegTag ? 1.8 : 1; - const sc = _parseAnimPair(spriteData.scale, 1, 1); - const fl = _parseAnimPair(spriteData.flipped, 0, 0); - const zValue = parseFloat(spriteData.zValue || tag || "0") || 0; - const rotDeg = parseFloat(spriteData.rotation || "0") || 0; - const baseTexture = this._resolveSpiderIconFrame(spriteData.texture || part.textureName); - const resolvedFrames = { - glow: this._resolveSpiderIconFrame(_spiderVariantFrameName(baseTexture, "glow")), - base: this._resolveSpiderIconFrame(baseTexture), - overlay: this._resolveSpiderIconFrame(_spiderVariantFrameName(baseTexture, "overlay")), - extra: this._resolveSpiderIconFrame(_spiderVariantFrameName(baseTexture, "extra")) - }; - const commonX = baseX + pos.x * spiderLocalXScale * mirrorSign * miniScale; - const commonY = baseY + (pos.y + spiderLocalYOffset) * positionYSign * miniScale; - let commonRot = rotDeg * Math.PI / 180; - if (this.p.mirrored) commonRot = -commonRot; - if (this.p.gravityFlipped) commonRot = -commonRot; - const baseScaleX = sc.x * (fl.x ? -1 : 1) * mirrorSign * miniScale; - const baseScaleY = sc.y * (fl.y ? -1 : 1) * gravitySign * miniScale; + // Multi-part animated robot rig (upstream automatons version) + this._initRobotAnimationParts(spriteY, particleY, spriteX); + this._robotSpriteLayer = this._robotLayers.find(layer => layer.kind === "base") || null; + this._robotGlowLayer = this._robotLayers.find(layer => layer.kind === "glow") || null; + this._robotOverlayLayer = this._robotLayers.find(layer => layer.kind === "overlay") || null; + this._robotExtraLayer = this._robotLayers.find(layer => layer.kind === "extra") || null; + this._robotJumpFlameSprite = null; + if (_textureHasFrameSafe(spriteY, "GJ_GameSheetIcons", "fireBoost_001.png")) { + this._robotJumpFlameSprite = spriteY.add.image(particleY, spriteX, "GJ_GameSheetIcons", "fireBoost_001.png"); + this._robotJumpFlameSprite.setDepth(7.75); + this._robotJumpFlameSprite.setVisible(false); + this._robotJumpFlameSprite.setAlpha(0); + this._robotJumpFlameSprite.setOrigin(0.5, 0); + this._robotJumpFlameSprite.setBlendMode('ADD'); + } - const flashDuration = Math.max(0.001, Number(this.p._spiderFlashDuration || 0.5)); - const flashTime = (!this._scene?._editorPlaytestActive && this.p._spiderFlashTimer > 0) - ? Math.max(0, Math.min(1, this.p._spiderFlashTimer / flashDuration)) - : 0; - const flashAmount = flashTime * flashTime; + // swing + const _swBase = window.currentSwing || 'swing_01'; + this._swingSpriteLayer = ds(spriteY, particleY, spriteX, `${_swBase}_001.png`, 10, false); + this._swingOverlayLayer = ds(spriteY, particleY, spriteX, `${_swBase}_2_001.png`, 8, false); + this._swingExtraLayer = ds(spriteY, particleY, spriteX, `${_swBase}_extra_001.png`, 12, false); + if (this._swingSpriteLayer) this._swingSpriteLayer.sprite.setTint(window.mainColor); + if (this._swingOverlayLayer) this._swingOverlayLayer.sprite.setTint(window.secondaryColor); + this._swingLayers = [this._swingSpriteLayer, this._swingOverlayLayer, this._swingExtraLayer].filter(x => !!x); - const applyLayer = (layer, kind, depthOffset) => { - if (!layer?.sprite) return; - const frameName = resolvedFrames[kind]; - if (!_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", frameName)) { - layer.sprite.setVisible(false); - return; - } - layer.sprite.setTexture("GJ_GameSheetIcons", frameName); - layer.sprite.x = commonX; - layer.sprite.y = commonY; - layer.sprite.rotation = commonRot; - layer.sprite.scaleX = baseScaleX; - layer.sprite.scaleY = baseScaleY; - layer.sprite.setDepth(8 + zValue * 0.1 + depthOffset); + this._allLayers = [...this._playerLayers, ...this._ballLayers, ...this._waveLayers, ...this._shipLayers, ...this._spiderLayers, ...this._birdLayers, ...this._robotLayers, ...this._swingLayers]; + + this._dashAnimationSprite = spriteY.add.image(particleY, spriteX, "GJ_GameSheetGlow", "playerDash2_001.png"); + this._dashAnimationSprite.setDepth(7); + this._dashAnimationSprite.setVisible(false); + this._dashAnimationSprite.setTint(0xffffff); + this._dashAnimationSprite.setBlendMode('ADD'); + } + _updateDashAnimation(deltaTime) { + if (this._scene?._editorPlaytestActive) { + if (this._dashAnimationSprite) this._dashAnimationSprite.setVisible(false); + return; + } - const normalTint = kind === "base" - ? window.mainColor - : (kind === "overlay" || kind === "glow") - ? window.secondaryColor - : null; - if (flashAmount > 0) { - layer.sprite.setTint(_mixTintTowardWhite(normalTint ?? 0xffffff, flashAmount)); - } else if (normalTint !== null && normalTint !== undefined) { - layer.sprite.setTint(normalTint); - } else if (typeof layer.sprite.clearTint === "function") { - layer.sprite.clearTint(); - } + if (!this._dashAnimationSprite) return; + if (this.p.isDashing) { + this._dashAnimationSprite.setVisible(true); + this._dashAnimationTimer += deltaTime; + if (this._dashAnimationTimer >= 16.67) { + this._dashAnimationTimer = 0; + this._dashAnimationFrame = (this._dashAnimationFrame % 12) + 1; + const frameName = `playerDash2_${String(this._dashAnimationFrame).padStart(3, '0')}.png`; + this._dashAnimationSprite.setFrame(frameName); + } + } else { + this._dashAnimationSprite.setVisible(false); + this._dashAnimationFrame = 0; + this._dashAnimationTimer = 0; + } + } - layer.sprite.setVisible(kind === "glow" ? !!layer.sprite._glowEnabled : true); - }; - applyLayer(part.glow, "glow", -0.04); - applyLayer(part.base, "base", 0); - applyLayer(part.overlay, "overlay", 0.04); - applyLayer(part.extra, "extra", 0.08); + // animation methods + getAnimationSpeedForMultiplier(multiplier) { + const speedMap = { + 0.5: 1.0, + 1: 1.35, + 2: 1.75, + 3: 2.20, + 4: 2.80 + }; + return speedMap[multiplier] || 1.0; + } + + playRobotAnimation(animationName, forceRestart = false) { + if (!this.p.isRobot) return; + if (this.p.robotCurrentAnimation === animationName && !forceRestart) return; + + const animData = getAnimation(animationName); + if (!animData) { + console.warn(`Robot animation "${animationName}" not found`); + return; } + + this.p.robotCurrentAnimation = animationName; + this.p.robotAnimationFrame = 0; + this.p.robotAnimationTimer = 0; + this.p.robotIsAnimating = true; + } - for (const tag of Object.keys(this._spiderPartsByTag)) { - if (seenTags.has(parseInt(tag, 10))) continue; - const part = this._spiderPartsByTag[tag]; - for (const layer of part.layers) layer?.sprite?.setVisible(false); + getRobotSpeedMultiplierFromPlayerSpeed() { + const baseSpeed = 11.540004; + const ratio = playerSpeed / baseSpeed; + if (ratio < 0.75) return 0.5; + if (ratio < 1.5) return 1; + if (ratio < 2.5) return 2; + if (ratio < 3.5) return 3; + return 4; + } + + updateRobotAnimation(deltaTime) { + if (!this.p.isRobot || !this.p.robotCurrentAnimation) return; + + const animData = getAnimation(this.p.robotCurrentAnimation); + if (!animData) return; + + let frameDuration = this.p.robotAnimationFrameDuration; + + if (this.p.robotCurrentAnimation === 'run') { + const speedMultiplier = this.getAnimationSpeedForMultiplier(this.getRobotSpeedMultiplierFromPlayerSpeed()); + frameDuration = frameDuration / speedMultiplier; } - if (this.p._spiderFlashTimer > 0) { - this.p._spiderFlashTimer = Math.max(0, this.p._spiderFlashTimer - Math.max(0, dt || 0)); + + this.p.robotAnimationTimer += deltaTime * 1000; + + if (this.p.robotAnimationTimer >= frameDuration) { + this.p.robotAnimationTimer -= frameDuration; + this.p.robotAnimationFrame++; + + if (this.p.robotAnimationFrame >= animData.frameCount) { + if (this.p.robotCurrentAnimation === 'run') { + this.p.robotAnimationFrame = 0; + } else { + this.p.robotAnimationFrame = animData.frameCount - 1; + this.p.robotIsAnimating = false; + } + } } - return true; + + this.applyRobotAnimationFrame(); } - _spawnSpiderTeleportEffects(oldGameY, newGameY) { - if (this._scene?._editorPlaytestActive || !this.p.isSpider) return; - const duration = 0.5; - const circleDuration = 0.4; - const teleportTint = _mixColors(0xffffff, window.mainColor, 0.42); - const worldX = Number.isFinite(Number(this._scene?._playerWorldX)) ? Number(this._scene._playerWorldX) : 0; - const oldWorldY = b(oldGameY); - const newWorldY = b(newGameY); - const midWorldY = (oldWorldY + newWorldY) * 0.5; - const goingUpOnScreen = newWorldY < oldWorldY; - const oldCircle = this._scene.add.circle(worldX, oldWorldY, 30, teleportTint, 0.45); - oldCircle.setDepth(7.5); - oldCircle.setBlendMode(S); - oldCircle.setScale(0.85); - this._gameLayer?.container?.add?.(oldCircle); - this._spiderTeleportCircles.push(oldCircle); - this._scene.tweens.add({ - targets: oldCircle, - scaleX: 0.03, - scaleY: 0.03, - alpha: 0, - duration: circleDuration * 750, - ease: "Cubic.easeOut", - onComplete: () => { - const idx = this._spiderTeleportCircles.indexOf(oldCircle); - if (idx >= 0) this._spiderTeleportCircles.splice(idx, 1); - if (oldCircle?.destroy) oldCircle.destroy(); - } - }); - const circle = this._scene.add.circle(worldX, newWorldY, 44, teleportTint, 1); - circle.setDepth(7.55); - circle.setBlendMode(S); - circle.setScale(1.25); - this._gameLayer?.container?.add?.(circle); - this._spiderTeleportCircles.push(circle); - this._scene.tweens.add({ - targets: circle, - x: worldX + (this.p.mirrored ? 28 : -28), - scaleX: 0.05, - scaleY: 0.05, - alpha: 0, - duration: circleDuration * 1000, - ease: "Cubic.easeOut", - onComplete: () => { - const idx = this._spiderTeleportCircles.indexOf(circle); - if (idx >= 0) this._spiderTeleportCircles.splice(idx, 1); - if (circle?.destroy) circle.destroy(); - } - }); + applyRobotAnimationFrame() { + const animData = getAnimation(this.p.robotCurrentAnimation); + if (!animData || !animData.frames[this.p.robotAnimationFrame]) return; - if (this._spiderDashEffectSprite && _textureHasFrameSafe(this._scene, "GJ_GameSheet04", "spiderDash_001.png")) { - this._spiderDashEffectTimer = duration; - this._spiderDashEffectDuration = duration; - this._spiderDashEffectSprite.setTexture("GJ_GameSheet04", "spiderDash_001.png"); - this._spiderDashEffectSprite.x = worldX; - this._spiderDashEffectSprite.y = midWorldY; - this._spiderDashEffectSprite.rotation = Phaser.Math.DegToRad(goingUpOnScreen ? 90 : -90); - const baseLength = 400; - const teleportDistance = Math.abs(newWorldY - oldWorldY); - const dashLength = Math.max(0.12, teleportDistance / baseLength); - this._spiderDashEffectSprite.scaleX = dashLength; - this._spiderDashEffectSprite.scaleY = 0.8; - this._spiderDashEffectSprite.setTint(teleportTint); - this._spiderDashEffectSprite.setAlpha(1); - this._spiderDashEffectSprite.setVisible(true); + const currentFrame = animData.frames[this.p.robotAnimationFrame]; + + const spriteMap = { + 0: this._robotLegStemBackLayer, + 1: this._robotThighBackLayer, + 2: this._robotFootBackLayer, + 3: this._robotHeadLayer, + 4: this._robotLegStemFrontLayer, + 5: this._robotThighFrontLayer, + 6: this._robotFootFrontLayer + }; + + const baseX = this._robotBaseX !== undefined ? this._robotBaseX : 0; + const baseY = this._robotBaseY !== undefined ? this._robotBaseY : 0; + + // sync sprites + const miniScale = this.p.isMini ? 0.6 : 1; + const mirrorMult = this.p.mirrored ? -1 : 1; + const gravityMult = this.p.gravityFlipped ? -1 : 1; + + const ROBOT_SCALE = 2; + + for (const layer of this._robotLayers) { + if (layer && layer.sprite) layer.sprite.setVisible(false); + } + + const sortedSprites = [...currentFrame.sprites].sort((a, b) => a.zValue - b.zValue); + + for (const spriteData of sortedSprites) { + const layer = spriteMap[spriteData.tag]; + if (!layer || !layer.sprite) continue; + + layer.sprite.setVisible(true); + + // reverse + const offsetX = spriteData.position[0] * ROBOT_SCALE * miniScale * mirrorMult; + const offsetY = -spriteData.position[1] * ROBOT_SCALE * miniScale * gravityMult; + layer.sprite.x = baseX + offsetX; + layer.sprite.y = baseY + offsetY; + + layer.sprite.scaleX = spriteData.scale[0] * miniScale * mirrorMult; + layer.sprite.scaleY = spriteData.scale[1] * miniScale * gravityMult; + + layer.sprite.rotation = spriteData.rotation * Math.PI / 180 + (this._robotTilt || 0); + + layer.sprite.setDepth(10 + spriteData.zValue); + + if (layer === this._robotHeadLayer && this._robotHeadOuterLayer) { + this._syncRobotOuterLayer(this._robotHeadOuterLayer, layer.sprite, 2); + } else if (layer === this._robotLegStemBackLayer && this._robotLegStemBackOuterLayer) { + this._syncRobotOuterLayer(this._robotLegStemBackOuterLayer, layer.sprite, 2); + } else if (layer === this._robotLegStemFrontLayer && this._robotLegStemFrontOuterLayer) { + this._syncRobotOuterLayer(this._robotLegStemFrontOuterLayer, layer.sprite, 2); + } } } - _updateSpiderTeleportEffects(dt) { - if (!this.p.isSpider || this._scene?._editorPlaytestActive) { - if (this._spiderDashEffectSprite) this._spiderDashEffectSprite.setVisible(false); - if (this._spiderTeleportCircles?.length) { - for (const circle of this._spiderTeleportCircles) if (circle?.destroy) circle.destroy(); - this._spiderTeleportCircles = []; + _syncRobotOuterLayer(outerLayer, innerSprite, depthOffset) { + if (!outerLayer || !outerLayer.sprite) return; + outerLayer.sprite.setVisible(innerSprite.visible); + outerLayer.sprite.x = innerSprite.x; + outerLayer.sprite.y = innerSprite.y; + outerLayer.sprite.rotation = innerSprite.rotation; + outerLayer.sprite.scaleX = innerSprite.scaleX; + outerLayer.sprite.scaleY = innerSprite.scaleY; + outerLayer.sprite.setDepth(innerSprite.depth - depthOffset); + } + + updateRobotAnimationState(deltaTime) { + if (!this.p.isRobot) return; + + // always run on ground + if (this.p.onGround && !this.p.isJumping) { + if (this.p.robotCurrentAnimation !== 'run') { + this.playRobotAnimation('run', true); } - this._spiderDashEffectTimer = 0; + this.p.robotJumpStartTimer = 0; + this.p.robotFallStartTimer = 0; return; } - if (this.p.isDead && this._spiderTeleportCircles?.length) { - for (const circle of this._spiderTeleportCircles) if (circle?.destroy) circle.destroy(); - this._spiderTeleportCircles = []; - } - if (!this._spiderDashEffectSprite || this._spiderDashEffectTimer <= 0) { - if (this._spiderDashEffectSprite) this._spiderDashEffectSprite.setVisible(false); + + if (this.p.isJumping && !this.p.onGround) { + if (this.p.robotCurrentAnimation !== 'jump_start' && this.p.robotCurrentAnimation !== 'jump_loop') { + this.p.robotJumpStartTimer = 0; + this.playRobotAnimation('jump_start', true); + } + + this.p.robotJumpStartTimer += deltaTime; + + if (this.p.robotJumpStartTimer >= 0.5 && this.p.robotCurrentAnimation === 'jump_start') { + this.playRobotAnimation('jump_loop', true); + } + + this.p.robotFallStartTimer = 0; return; } - const duration = Math.max(0.001, Number(this._spiderDashEffectDuration || 0.5)); - this._spiderDashEffectTimer = Math.max(0, this._spiderDashEffectTimer - Math.max(0, dt || 0)); - const progress = Math.max(0, Math.min(1, (duration - this._spiderDashEffectTimer) / duration)); - const frameIndex = Math.min(8, Math.max(1, Math.floor(progress * 8) + 1)); - const frameName = `spiderDash_${String(frameIndex).padStart(3, "0")}.png`; - if (_textureHasFrameSafe(this._scene, "GJ_GameSheet04", frameName)) { - this._spiderDashEffectSprite.setTexture("GJ_GameSheet04", frameName); - } - this._spiderDashEffectSprite.setAlpha(Math.max(0, 1 - progress)); - this._spiderDashEffectSprite.setVisible(this._spiderDashEffectTimer > 0); - } + + if (!this.p.onGround && !this.p.isJumping) { + if (this.p.robotCurrentAnimation !== 'fall_start' && this.p.robotCurrentAnimation !== 'fall_loop') { + this.p.robotFallStartTimer = 0; + this.playRobotAnimation('fall_start', true); + } + + this.p.robotFallStartTimer += deltaTime; - _syncSpiderAnimation(baseX, baseY, dt) { - if (this.p.isDead || !this.p.isSpider || !this._spiderLayers?.length) { - this.setSpiderVisible(false); + if (this.p.robotFallStartTimer >= 0.6 && this.p.robotCurrentAnimation === 'fall_start') { + this.playRobotAnimation('fall_loop', true); + } + + this.p.robotJumpStartTimer = 0; return; } - const frameKey = this._selectSpiderFrameKey(dt); - const applied = this._applySpiderFrame(frameKey, baseX, baseY, dt); - if (!applied) { - for (const layer of this._spiderLayers) { - if (!layer?.sprite) continue; - layer.sprite.x = baseX; - layer.sprite.y = baseY; - layer.sprite.rotation = this.p.mirrored ? -this._rotation : this._rotation; - const miniScale = this.p.isMini ? 0.6 : 1; - layer.sprite.scaleX = (this.p.mirrored ? -miniScale : miniScale); - layer.sprite.scaleY = (this.p.gravityFlipped ? -miniScale : miniScale); - layer.sprite.setVisible(layer.kind === "glow" ? !!layer.sprite._glowEnabled : true); + } + + rotateRobotDirect(newRotation) { + if (this.p.isRobot) { + this._rotation = this.p.gravityFlipped ? Math.PI : 0; + this.applyRobotLayerRotation(this._rotation); } - } } - _getRobotIconBase() { - const rawBase = String(window.currentRobot || "robot_01"); - const match = rawBase.match(/^robot_\d+/); - return match ? match[0] : "robot_01"; - } - _resolveRobotIconFrame(frameName) { - const base = this._getRobotIconBase(); - const resolved = String(frameName || "").replace(/^robot_\d+/, base); - if (_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", resolved)) return resolved; - if (_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", frameName)) return frameName; - return resolved; - } - _getRobotAnimDesc() { - if (this._robotAnimDesc !== undefined) return this._robotAnimDesc; - let data = null; - try { - data = this._scene?.cache?.json?.get?.("Robot_AnimDesc") || null; - } catch (err) { - data = null; - } - if (!data && typeof window !== "undefined") data = window.Robot_AnimDesc || null; - if (!data || !data.animationContainer) { - this._robotFrameGroups = {}; - return null; - } - this._robotAnimDesc = data; - this._robotFrameGroups = {}; - const frameKeys = Object.keys(data.animationContainer); - const sortBySuffix = (a, b) => { - const aa = parseInt((String(a).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; - const bb = parseInt((String(b).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; - return aa - bb; - }; - this._robotFrameGroups.run = frameKeys.filter(k => /^Robot_run_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.run2 = frameKeys.filter(k => /^Robot_run2_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.run3 = frameKeys.filter(k => /^Robot_run3_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.skip = frameKeys.filter(k => /^Robot_skip_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.jumpStart = frameKeys.filter(k => /^Robot_jump_start_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.jumpLoop = frameKeys.filter(k => /^Robot_jump_loop_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.fallStart = frameKeys.filter(k => /^Robot_fall_start_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.fallLoop = frameKeys.filter(k => /^Robot_fall_loop_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.idle = frameKeys.filter(k => /^Robot_idle_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.idle1 = frameKeys.filter(k => /^Robot_idle01_\d+\.png$/.test(k)).sort(sortBySuffix); - this._robotFrameGroups.idle2 = frameKeys.filter(k => /^Robot_idle02_\d+\.png$/.test(k)).sort(sortBySuffix); - return this._robotAnimDesc; - } - _createRobotLayerSet(scene, x, y, textureName, tag) { - const resolvedBase = this._resolveRobotIconFrame(textureName); - const layers = []; - const makeLayer = (variant, tint, depthOffset) => { - const frame = this._resolveRobotIconFrame(_spiderVariantFrameName(resolvedBase, variant)); - const layer = _makeAtlasLayer(scene, x, y, "GJ_GameSheetIcons", frame, 8 + tag * 0.1 + depthOffset, false, tint, variant); - if (layer) layers.push(layer); - return layer; - }; - const glow = makeLayer("glow", window.secondaryColor, -0.04); - const base = makeLayer("base", window.mainColor, 0); - const overlay = makeLayer("overlay", window.secondaryColor, 0.04); - const extra = makeLayer("extra", null, 0.08); - return { tag, textureName, layers, glow, base, overlay, extra }; + + rotateRobotOther(newRotation, duration = 200) { + if (!this.p.isRobot) return; + this._rotation = newRotation; + this.applyRobotLayerRotation(newRotation); } - _initRobotAnimationParts(scene, x, y) { - this._robotAnimTimer = 0; - this._robotAnimState = "run"; - this._robotAnimDesc = undefined; - this._robotPartsByTag = {}; - this._robotLayers = []; - const desc = this._getRobotAnimDesc(); - const usedTextures = desc?.usedTextures || null; - let entries = []; - if (usedTextures) { - entries = Object.values(usedTextures).slice().sort((a, b) => (parseInt(a.tag || "0", 10) || 0) - (parseInt(b.tag || "0", 10) || 0)); - } - if (!entries.length) { - entries = [ - { tag: "0", texture: "robot_01_03_001.png" }, - { tag: "1", texture: "robot_01_02_001.png" }, - { tag: "2", texture: "robot_01_04_001.png" }, - { tag: "3", texture: "robot_01_01_001.png" }, - { tag: "4", texture: "robot_01_03_001.png" }, - { tag: "5", texture: "robot_01_02_001.png" }, - { tag: "6", texture: "robot_01_04_001.png" } - ]; - } - for (const entry of entries) { - const tag = parseInt(entry.tag || "0", 10) || 0; - const part = this._createRobotLayerSet(scene, x, y, entry.texture, tag); - if (!part.layers.length) continue; - this._robotPartsByTag[tag] = part; - this._robotLayers.push(...part.layers); + + applyRobotLayerRotation(rotation) { + for (const layer of this._robotLayers) { + if (layer && layer.sprite) { + layer.sprite.rotation = this.p.mirrored ? -rotation : rotation; + } } } - _selectRobotFrameKey(dt) { - const desc = this._getRobotAnimDesc(); - if (!desc?.animationContainer) return null; - const _speedPortalRef = (typeof SpeedPortal !== "undefined" && SpeedPortal) ? SpeedPortal : null; - const _oneSpeed = Number(_speedPortalRef?.ONE_TIMES ?? 11.540004) || 11.540004; - const _halfSpeed = Number(_speedPortalRef?.HALF ?? (_oneSpeed * 0.8)) || (_oneSpeed * 0.8); - const _fourSpeed = Number(_speedPortalRef?.FOUR_TIMES ?? (_oneSpeed * 1.85)) || (_oneSpeed * 1.85); - const _activeSpeed = Number.isFinite(Number(playerSpeed)) ? Number(playerSpeed) : _oneSpeed; - let robotAnimationSpeed = 1.75; - if (_activeSpeed >= _oneSpeed) { - const _fastT = Math.max(0, Math.min(1, (_activeSpeed - _oneSpeed) / Math.max(1e-6, _fourSpeed - _oneSpeed))); - robotAnimationSpeed = 1.75 + _fastT * 0.35; - } else { - const _slowT = Math.max(0, Math.min(1, (_oneSpeed - _activeSpeed) / Math.max(1e-6, _oneSpeed - _halfSpeed))); - robotAnimationSpeed = 1.75 - _slowT * 0.15; - } - robotAnimationSpeed *= 1.2; - const grounded = this.p.onGround || this.p.onCeiling; - const goingUp = this.p.gravityFlipped ? this.p.yVelocity < 0 : this.p.yVelocity > 0; - const nextState = grounded ? "run" : (goingUp ? "jump" : "fall"); - if (this._robotAnimState !== nextState) { - this._robotAnimState = nextState; - this._robotAnimTimer = 0; - } - this._robotAnimTimer = (this._robotAnimTimer || 0) + Math.max(0, dt || 0) * robotAnimationSpeed; - const pickFromStartThenLoop = (startGroup, loopGroup, fps) => { - const start = startGroup || []; - const loop = loopGroup || []; - if (start.length) { - const startDuration = start.length / fps; - if (this._robotAnimTimer < startDuration || !loop.length) { - return start[Math.min(start.length - 1, Math.floor(this._robotAnimTimer * fps))]; - } - const loopTime = this._robotAnimTimer - startDuration; - return loop[Math.floor(loopTime * fps) % loop.length]; + _initParticles(scene) { + this._particleEmitter = scene.add.particles(0, 0, "GJ_WebSheet", { + frame: "square.png", + speed: { + min: 110, + max: 190 + }, + angle: { + min: 225, + max: 315 + }, + lifespan: { + min: 150, + max: 450 + }, + scale: { + start: 0.5, + end: 0 + }, + gravityY: 600, + frequency: 1000 / 30, + blendMode: "ADD", + alpha: { + start: 1, + end: 0 + }, + tint: window.mainColor + }); + this._particleEmitter.stop(); + this._particleEmitter.setDepth(9); + this._gameLayer.container.add(this._particleEmitter); + this._flyParticleEmitter = scene.add.particles(0, 0, "GJ_WebSheet", { + frame: "square.png", + speed: { + min: 22, + max: 38 + }, + angle: { + min: 225, + max: 315 + }, + lifespan: { + min: 150, + max: 450 + }, + scale: { + start: 0.5, + end: 0 + }, + gravityY: 600, + frequency: 1000 / 30, + blendMode: "ADD", + tint: { + start: 16737280, + end: 16711680 + }, + alpha: { + start: 1, + end: 0 } - if (loop.length) return loop[Math.floor(this._robotAnimTimer * fps) % loop.length]; - return null; + }); + this._flyParticleEmitter.stop(); + this._flyParticleEmitter.setDepth(9); + this._gameLayer.container.add(this._flyParticleEmitter); + this._flyParticle2Emitter = scene.add.particles(0, 0, "GJ_WebSheet", { + frame: "square.png", + speed: { + min: 220, + max: 380 + }, + angle: { + min: 180, + max: 360 + }, + lifespan: { + min: 150, + max: 450 + }, + scale: { + start: 0.75, + end: 0 + }, + gravityY: 600, + frequency: 1000 / 30, + blendMode: "ADD", + tint: { + start: 16760320, + end: 16711680 + }, + alpha: { + start: 1, + end: 0 + } + }); + this._flyParticle2Emitter.stop(); + this._flyParticle2Emitter.setDepth(9); + this._gameLayer.container.add(this._flyParticle2Emitter); + this._shipDragEmitter = scene.add.particles(0, 0, "GJ_WebSheet", { + frame: "square.png", + x: { + min: -18, + max: 18 + }, + speed: { + min: 223.79999999999998, + max: 343.79999999999995 + }, + angle: { + min: 205, + max: 295 + }, + lifespan: { + min: 80, + max: 220 + }, + scale: { + start: 0.375, + end: 0 + }, + gravityX: -700, + gravityY: 600, + frequency: 25, + blendMode: "ADD", + alpha: { + start: 1, + end: 0 + } + }); + this._shipDragEmitter.stop(); + this._shipDragEmitter.setDepth(22); + this._shipDragActive = false; + this._fireBoostSprite = scene.add.image(0, 0, "GJ_GameSheetIcons", "fireBoost_001.png"); + this._fireBoostSprite.setVisible(false); + this._fireBoostSprite.setDepth(20); + this._gameLayer.container.add(this._fireBoostSprite); + this._fireBoostActive = false; + this._fireBoostAnimFrame = 0; + this._fireBoostAnimTimer = 0; + this._fireBoostAnimDuration = 40; + this._particleActive = false; + this._flyParticle2Active = false; + this._flyParticleActive = false; + const _0x57911a = { + frame: "square.png", + speed: { + min: 250, + max: 350 + }, + angle: { + min: 210, + max: 330 + }, + lifespan: { + min: 50, + max: 600 + }, + scale: { + start: 0.625, + end: 0 + }, + gravityY: 1000, + blendMode: "ADD", + alpha: { + start: 1, + end: 0 + }, + tint: window.mainColor, + emitting: false }; - - if (this.p.isDashing) { - const group = this._robotFrameGroups.fallLoop; - return group[Math.floor(this._robotAnimTimer * 16) % group.length]; - } - if (nextState === "run") { - const group = this._robotFrameGroups?.run?.length ? this._robotFrameGroups.run : (this._robotFrameGroups?.idle1 || this._robotFrameGroups?.idle || []); - if (group?.length) return group[Math.floor(this._robotAnimTimer * 16) % group.length]; - } else if (nextState === "jump") { - const frame = pickFromStartThenLoop(this._robotFrameGroups?.jumpStart, this._robotFrameGroups?.jumpLoop, 15); - if (frame) return frame; - } else { - const frame = pickFromStartThenLoop(this._robotFrameGroups?.fallStart, this._robotFrameGroups?.fallLoop, 15); - if (frame) return frame; - } - return desc.animationContainer["Robot_idle_001.png"] ? "Robot_idle_001.png" : null; + this._landEmitter1 = scene.add.particles(0, 0, "GJ_WebSheet", Object.assign({}, _0x57911a)); + this._landEmitter2 = scene.add.particles(0, 0, "GJ_WebSheet", Object.assign({}, _0x57911a)); + this._aboveContainer = scene.add.container(0, 0); + this._aboveContainer.setDepth(13); + this._gameLayer.topContainer.add(this._landEmitter1); + this._gameLayer.topContainer.add(this._landEmitter2); + this._landIdx = false; + this._streak = new StreakManager(this._scene, "streak_01", 0.231, 10, 8, 100, window.secondaryColor, 0.7); + this._streak.addToContainer(this._gameLayer.container, 8); + this._waveTrail = new WaveTrail(this._scene, window.secondaryColor, window.secondaryColor); + this._waveTrail.addToContainer(this._gameLayer.container, 9); } - _applyRobotFrame(frameKey, baseX, baseY, dt) { - const desc = this._getRobotAnimDesc(); - const frame = frameKey && desc?.animationContainer ? desc.animationContainer[frameKey] : null; - if (!frame || !this._robotPartsByTag) return false; - const miniScale = this.p.isMini ? 0.6 : 1; - const mirrorSign = this.p.mirrored ? -1 : 1; - const gravitySign = this.p.gravityFlipped ? -1 : 1; - const positionYSign = this.p.gravityFlipped ? 1 : -1; - const seenTags = new Set(); - const robotFootTags = [2, 6]; - const robotFootPoints = []; - const robotLegPoints = []; - - for (const spriteKey of Object.keys(frame)) { - if (!spriteKey.startsWith("sprite_")) continue; - const spriteData = frame[spriteKey]; - const tag = parseInt(spriteData.tag || "0", 10) || 0; - const part = this._robotPartsByTag[tag]; - if (!part) continue; - seenTags.add(tag); - const pos = _parseAnimPair(spriteData.position, 0, 0); - const robotLegTags = [0, 2, 4, 6]; - const robotArmTags = [1, 5]; - const isRobotLegTag = robotLegTags.includes(tag); - const isRobotArmTag = robotArmTags.includes(tag); - const robotLocalYOffset = tag === 3 ? 5 : (isRobotArmTag ? -1 : (isRobotLegTag ? -9 : 0)); - const robotLocalXScale = (isRobotLegTag || isRobotArmTag) ? 1.8 : 1; - const sc = _parseAnimPair(spriteData.scale, 1, 1); - const fl = _parseAnimPair(spriteData.flipped, 0, 0); - const zValue = parseFloat(spriteData.zValue || tag || "0") || 0; - const rotDeg = parseFloat(spriteData.rotation || "0") || 0; - const baseTexture = this._resolveRobotIconFrame(spriteData.texture || part.textureName); - const resolvedFrames = { - glow: this._resolveRobotIconFrame(_spiderVariantFrameName(baseTexture, "glow")), - base: this._resolveRobotIconFrame(baseTexture), - overlay: this._resolveRobotIconFrame(_spiderVariantFrameName(baseTexture, "overlay")), - extra: this._resolveRobotIconFrame(_spiderVariantFrameName(baseTexture, "extra")) - }; - const commonX = baseX + pos.x * robotLocalXScale * mirrorSign * miniScale; - const commonY = baseY + (pos.y + robotLocalYOffset) * positionYSign * miniScale; - let commonRot = rotDeg * Math.PI / 180; - if (this.p.mirrored) commonRot = -commonRot; - if (this.p.gravityFlipped) commonRot = -commonRot; - const baseScaleX = sc.x * (fl.x ? -1 : 1) * mirrorSign * miniScale; - const baseScaleY = sc.y * (fl.y ? -1 : 1) * gravitySign * miniScale; - - const applyLayer = (layer, kind, depthOffset) => { - if (!layer?.sprite) return; - const frameName = resolvedFrames[kind]; - if (!_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", frameName)) { - layer.sprite.setVisible(false); - return; - } - layer.sprite.setTexture("GJ_GameSheetIcons", frameName); - layer.sprite.x = commonX; - layer.sprite.y = commonY; - layer.sprite.rotation = commonRot; - layer.sprite.scaleX = baseScaleX; - layer.sprite.scaleY = baseScaleY; - layer.sprite.setDepth(8 + zValue * 0.1 + depthOffset); - - const normalTint = kind === "base" - ? window.mainColor - : (kind === "overlay" || kind === "glow") - ? window.secondaryColor - : null; - if (normalTint !== null && normalTint !== undefined) { - layer.sprite.setTint(normalTint); - } else if (typeof layer.sprite.clearTint === "function") { - layer.sprite.clearTint(); - } - layer.sprite.setVisible(kind === "glow" ? !!layer.sprite._glowEnabled : true); - }; - applyLayer(part.glow, "glow", -0.04); - applyLayer(part.base, "base", 0); - applyLayer(part.overlay, "overlay", 0.04); - applyLayer(part.extra, "extra", 0.08); - const footSprite = part.base?.sprite || part.overlay?.sprite || part.extra?.sprite || part.glow?.sprite; - if (footSprite && (robotFootTags.includes(tag) || isRobotLegTag)) { - const footHalfHeight = Math.max(6 * miniScale, Math.abs(footSprite.displayHeight || (footSprite.height || 0) * baseScaleY) * 0.5); - const footEdgeY = commonY + (this.p.gravityFlipped ? -footHalfHeight : footHalfHeight); - const point = { x: commonX, y: footEdgeY }; - if (robotFootTags.includes(tag)) { - robotFootPoints.push(point); - } else if (isRobotLegTag) { - robotLegPoints.push(point); - } - } + _updateParticles(_0xc43238, _0x52b718, _0x5af874) { + if (this._scene?._editorPlaytestActive) { + this._particleEmitter.stop(); + this._particleActive = false; + this._flyParticleEmitter.stop(); + this._flyParticleActive = false; + this._flyParticle2Emitter.stop(); + this._flyParticle2Active = false; + this._shipDragEmitter.stop(); + this._shipDragActive = false; + this._streak.stop(); + this._streak.reset(); + this._waveTrail.stop(); + this._waveTrail.reset(); + return; } - const flameAnchorPoints = robotFootPoints.length ? robotFootPoints : robotLegPoints; - if (flameAnchorPoints.length) { - let attachedFoot = flameAnchorPoints[0]; - for (const pt of flameAnchorPoints) { - if (this.p.gravityFlipped ? pt.y < attachedFoot.y : pt.y > attachedFoot.y) { - attachedFoot = pt; - } - } - this._robotJumpFlameAnchorX = attachedFoot.x; - this._robotJumpFlameAnchorY = attachedFoot.y; + if (this.p.isDead) { + return; } - for (const tag of Object.keys(this._robotPartsByTag)) { - if (seenTags.has(parseInt(tag, 10))) continue; - const part = this._robotPartsByTag[tag]; - for (const layer of part.layers) layer?.sprite?.setVisible(false); + const _0x119eb7 = this._scene._playerWorldX; + const _0x519d38 = b(this.p.y); + this._particleEmitter.particleX = _0x119eb7 - 20; + this._particleEmitter.particleY = _0x519d38 + (this.p.gravityFlipped ? (-26 + (this.p.isUfo ? -5 : 0)) : (26 + (this.p.isUfo ? 5 : 0))); + const _0x4436ac = this.p.onGround && !this.p.isFlying && !this.p.isWave && !this.p.isSpider; + if (_0x4436ac && !this._particleActive) { + this._particleEmitter.start(); + this._particleActive = true; + } else if (!_0x4436ac && this._particleActive) { + this._particleEmitter.stop(); + this._particleActive = false; } - return true; - } - _hideRobotJumpFlame() { - if (!this._robotJumpFlameSprite) return; - this._robotJumpFlameSprite.setVisible(false); - this._robotJumpFlameSprite.setAlpha(0); - } - _updateRobotJumpFlame(dt) { - if (!this._robotJumpFlameSprite) return; - const goingUp = this.p.gravityFlipped ? this.p.yVelocity < -0.01 : this.p.yVelocity > 0.01; - if (!this._robotJumpFlameActive || this.p.isDead || !this.p.isRobot || !goingUp || this.p.onGround || this._endAnimating) { - this._robotJumpFlameActive = false; - this._hideRobotJumpFlame(); - return; + { + const _0xe76a85 = Math.cos(this._rotation); + const _0x26ec65 = Math.sin(this._rotation); + const _0x216018 = this.p.isWave ? 0 : (this.p.isUfo ? 0 : (this.p.isSwing ? 0 : -24)); + const _0x2baeac = (this.p.isWave ? 4 : (this.p.isUfo ? 5 : (this.p.isSwing ? 0 : 18))) * (this.p.gravityFlipped ? -1 : 1); + const _0x75c380 = _0x119eb7 + _0x216018 * _0xe76a85 - _0x2baeac * _0x26ec65; + const _0x2b31d7 = _0x519d38 + _0x216018 * _0x26ec65 + _0x2baeac * _0xe76a85; + const _0x5d66f4 = (Math.random() * 2 - 1) * 2 * 2; + this._flyParticleEmitter.particleX = _0x75c380; + this._flyParticleEmitter.particleY = _0x2b31d7 + _0x5d66f4; + this._flyParticle2Emitter.particleX = _0x75c380; + this._flyParticle2Emitter.particleY = _0x2b31d7 + _0x5d66f4; + this._streak.setPosition(this.p.isWave || this.p.isUfo || this.p.isSwing ? _0x75c380 : _0x75c380 + 8, _0x2b31d7); + this._waveTrail.setPosition(_0x119eb7, _0x519d38); } - const upwardVelocity = Math.max(0, this.p.gravityFlipped ? -this.p.yVelocity : this.p.yVelocity); - const fadeThreshold = this.p.isMini ? 7 : 10; - const fade = Math.max(0, Math.min(1, upwardVelocity / Math.max(0.001, fadeThreshold))); - if (fade <= 0.02) { - this._robotJumpFlameActive = false; - this._hideRobotJumpFlame(); - return; + this._streak.update(_0x5af874); + this._waveTrail.update(_0x5af874); + const _0x3d69d2 = this.p.isFlying || this.p.isUfo; + if (_0x3d69d2 && !this._flyParticleActive) { + this._flyParticleEmitter.start(); + this._flyParticleActive = true; + } else if (!_0x3d69d2 && this._flyParticleActive) { + this._flyParticleEmitter.stop(); + this._flyParticleActive = false; } - const miniScale = this.p.isMini ? 0.8 : 1.2; - this._robotJumpFlameFadeInTimer = (this._robotJumpFlameFadeInTimer || 0) + Math.max(0, dt || 0); - const fadeIn = Math.max(0, Math.min(1, this._robotJumpFlameFadeInTimer / 0.24)); - const visibleFade = Math.min(fade, fadeIn); - this._robotJumpFlamePulse = (this._robotJumpFlamePulse || 0) + Math.max(0, dt || 0) * (Math.PI * 4); - const pulse = (Math.sin(this._robotJumpFlamePulse) + 1) * 0.5; - const stretchY = 0.8 + 0.4 * pulse; - const overallScale = 0.82 * miniScale * visibleFade; - this._robotJumpFlameSprite.setPosition( - this._robotJumpFlameAnchorX, - this._robotJumpFlameAnchorY - ); - this._robotJumpFlameSprite.setScale(overallScale, overallScale * stretchY * (this.p.gravityFlipped ? -1 : 1)); - this._robotJumpFlameSprite.setAlpha(Math.max(0, Math.min(1, visibleFade))); - this._robotJumpFlameSprite.setVisible(true); - } - _syncRobotAnimation(baseX, baseY, dt) { - if (this.p.isDead || !this.p.isRobot || !this._robotLayers?.length) { - this.setRobotVisible(false); - return; + const _0x169e30 = (this.p.isFlying && this.p.upKeyDown) || (this.p.isUfo && this.p.isJumping); + if (_0x169e30 && !this._flyParticle2Active) { + this._flyParticle2Emitter.start(); + this._flyParticle2Active = true; + } else if (!_0x169e30 && this._flyParticle2Active) { + this._flyParticle2Emitter.stop(); + this._flyParticle2Active = false; } - const frameKey = this._selectRobotFrameKey(dt); - const applied = this._applyRobotFrame(frameKey, baseX, baseY, dt); - if (!applied) { - for (const layer of this._robotLayers) { - if (!layer?.sprite) continue; - layer.sprite.x = baseX; - layer.sprite.y = baseY; - layer.sprite.rotation = this.p.mirrored ? -this._rotation : this._rotation; - const miniScale = this.p.isMini ? 0.6 : 1; - layer.sprite.scaleX = (this.p.mirrored ? -miniScale : miniScale); - layer.sprite.scaleY = (this.p.gravityFlipped ? -miniScale : miniScale); - layer.sprite.setVisible(layer.kind === "glow" ? !!layer.sprite._glowEnabled : true); + const _0x2e5643 = _0xc43238 + this._scene._getMirrorXOffset(_0x119eb7 - _0xc43238); + this._shipDragEmitter.x = _0x2e5643; + this._shipDragEmitter.particleY = this.p.gravityFlipped ? b(this.p.y) + _0x52b718 + 10 : b(this.p.y) + _0x52b718 + 30; + this._shipDragEmitter.setAngle(this.p.mirrored ? { + min: 245, + max: 335 + } : { + min: 205, + max: 295 + }); + this._shipDragEmitter.gravityX = this.p.mirrored ? 700 : -700; + this._shipDragEmitter.setScale(this.p.gravityFlipped ? { x: -1, y: 1 } : { x: 1, y: 1 }); + const _0x2ac9d0 = this.p.isFlying && this.p.onGround && (this.p.gravityFlipped ? this.p.onCeiling : !this.p.onCeiling); + if (_0x2ac9d0 && !this._shipDragActive) { + this._shipDragEmitter.start(); + this._shipDragActive = true; + } else if (!_0x2ac9d0 && this._shipDragActive) { + this._shipDragEmitter.stop(); + this._shipDragActive = false; + } + const _robotGroundJumpActive = this.p.isRobot && this.p._robotGroundJump && this.p._robotHold; + if (_robotGroundJumpActive) { + this._fireBoostAnimTimer += _0x5af874; + if (this._fireBoostAnimTimer >= this._fireBoostAnimDuration) { + this._fireBoostAnimTimer = 0; + this._fireBoostAnimFrame = (this._fireBoostAnimFrame + 1) % 7; } - this._robotJumpFlameAnchorX = baseX; - this._robotJumpFlameAnchorY = baseY + (this.p.gravityFlipped ? (-8 * (this.p.isMini ? 0.6 : 1)) : (8 * (this.p.isMini ? 0.6 : 1))); + const frameName = `fireBoost_${String(this._fireBoostAnimFrame + 1).padStart(3, '0')}.png`; + this._fireBoostSprite.setFrame(frameName); + const footOffsetY = this.p.gravityFlipped ? -38 : 38; + this._fireBoostSprite.setPosition(_0x119eb7, _0x519d38 + footOffsetY); + this._fireBoostSprite.scaleY = this.p.gravityFlipped ? -1 : 1; + this._fireBoostSprite.setVisible(true); + } else { + this._fireBoostAnimFrame = 0; + this._fireBoostAnimTimer = 0; + this._fireBoostSprite.setVisible(false); } } - - _createSprites() { - const spriteY = this._scene; - const spriteX = b(this.p.y); - const particleY = centerX; - this._playerGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentPlayer}_glow_001.png`, 9, false); - this._playerSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentPlayer}_001.png`, 10, true); - this._playerOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentPlayer}_2_001.png`, 8, true); - this._playerExtraLayer = ds(spriteY, particleY, spriteX, `${window.currentPlayer}_extra_001.png`, 12, true); + setCubeVisible(_0x411813) { + this._playerSpriteLayer.sprite.setVisible(_0x411813); if (this._playerGlowLayer) { - this._playerGlowLayer.sprite.setTint(window.secondaryColor); - this._playerGlowLayer.sprite._glowEnabled = false; - } - if (this._playerSpriteLayer) { - this._playerSpriteLayer.sprite.setTint(window.mainColor); - } else { - let _0x3aecd9 = spriteY.add.rectangle(particleY, spriteX, g, g, window.mainColor); - _0x3aecd9.setDepth(10); - this._playerSpriteLayer = { - sprite: _0x3aecd9 - }; + this._playerGlowLayer.sprite.setVisible(_0x411813 && this._playerGlowLayer.sprite._glowEnabled); } if (this._playerOverlayLayer) { - this._playerOverlayLayer.sprite.setTint(window.secondaryColor); + this._playerOverlayLayer.sprite.setVisible(_0x411813); } - this._shipGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentShip}_glow_001.png`, 9, false); - this._shipSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentShip}_001.png`, 10, false); - this._shipOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentShip}_2_001.png`, 8, false); - this._shipExtraLayer = ds(spriteY, particleY, spriteX, `${window.currentShip}_extra_001.png`, 12, false); - if (this._shipGlowLayer) { - this._shipGlowLayer.sprite.setTint(window.secondaryColor); - this._shipGlowLayer.sprite._glowEnabled = false; + if (this._playerExtraLayer) { + this._playerExtraLayer.sprite.setVisible(_0x411813); } - if (this._shipSpriteLayer) { - this._shipSpriteLayer.sprite.setTint(window.mainColor); - } else { - let _0x100643 = spriteY.add.polygon(particleY, spriteX, [{ - x: -72, - y: 40 - }, { - x: 72, - y: 0 - }, { - x: -72, - y: -40 - }, { - x: -40, - y: 0 - }], window.mainColor); - _0x100643.setDepth(10).setVisible(false); - this._shipSpriteLayer = { - sprite: _0x100643 - }; + } + setShipVisible(_0x1c5620) { + this._shipSpriteLayer.sprite.setVisible(_0x1c5620); + if (this._shipGlowLayer) { + this._shipGlowLayer.sprite.setVisible(_0x1c5620 && this._shipGlowLayer.sprite._glowEnabled); } if (this._shipOverlayLayer) { - this._shipOverlayLayer.sprite.setTint(window.secondaryColor); + this._shipOverlayLayer.sprite.setVisible(_0x1c5620); } - this._ballGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentBall}_glow_001.png`, 9, false); - this._ballSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentBall}_001.png`, 10, false); - this._ballOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentBall}_2_001.png`, 8, false); - if (this._ballGlowLayer) { - this._ballGlowLayer.sprite.setTint(window.secondaryColor); - this._ballGlowLayer.sprite._glowEnabled = false; + if (this._shipExtraLayer) { + this._shipExtraLayer.sprite.setVisible(_0x1c5620); } + } + setBirdVisible(v) { + for (const layer of (this._birdLayers || [])) { + if (layer === this._birdGlowLayer) { + layer.sprite.setVisible(v && layer.sprite._glowEnabled); + } else { + layer.sprite.setVisible(v); + } + } + } + setBallVisible(_0x5685cf) { if (this._ballSpriteLayer) { - this._ballSpriteLayer.sprite.setTint(window.mainColor); + this._ballSpriteLayer.sprite.setVisible(_0x5685cf); } - if (this._ballOverlayLayer) { - this._ballOverlayLayer.sprite.setTint(window.secondaryColor); + if (this._ballGlowLayer) { + this._ballGlowLayer.sprite.setVisible(_0x5685cf && this._ballGlowLayer.sprite._glowEnabled); } - this._waveGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentWave}_glow_001.png`, 9, false); - this._waveOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentWave}_2_001.png`, 8, false); - this._waveExtraLayer = null; - this._waveSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentWave}_001.png`, 10, false); - if (this._waveGlowLayer) { - this._waveGlowLayer.sprite.setTint(window.secondaryColor); - this._waveGlowLayer.sprite._glowEnabled = false; + if (this._ballOverlayLayer) { + this._ballOverlayLayer.sprite.setVisible(_0x5685cf); } + } + setWaveVisible(_0x2d078b) { if (this._waveSpriteLayer) { - this._waveSpriteLayer.sprite.setTint(window.mainColor); + this._waveSpriteLayer.sprite.setVisible(_0x2d078b); } if (this._waveOverlayLayer) { - this._waveOverlayLayer.sprite.setTint(window.secondaryColor); + this._waveOverlayLayer.sprite.setVisible(_0x2d078b); } - this.playerSprite = this._playerSpriteLayer.sprite; - this.shipSprite = this._shipSpriteLayer.sprite; - this._playerLayers = [this._playerSpriteLayer, this._playerGlowLayer, this._playerOverlayLayer, this._playerExtraLayer]; - this._shipLayers = [this._shipSpriteLayer, this._shipGlowLayer, this._shipOverlayLayer, this._shipExtraLayer]; - this._ballLayers = [this._ballSpriteLayer, this._ballGlowLayer, this._ballOverlayLayer].filter(_0x37ad93 => !!_0x37ad93); - this._waveLayers = [this._waveSpriteLayer, this._waveOverlayLayer, this._waveExtraLayer, this._waveGlowLayer].filter(_0x37ad93 => !!_0x37ad93); - this._initSpiderAnimationParts(spriteY, particleY, spriteX); - this._spiderSpriteLayer = this._spiderLayers.find(layer => layer.kind === "base") || null; - this._spiderGlowLayer = this._spiderLayers.find(layer => layer.kind === "glow") || null; - this._spiderOverlayLayer = this._spiderLayers.find(layer => layer.kind === "overlay") || null; - this._spiderExtraLayer = this._spiderLayers.find(layer => layer.kind === "extra") || null; - this._initRobotAnimationParts(spriteY, particleY, spriteX); - this._robotSpriteLayer = this._robotLayers.find(layer => layer.kind === "base") || null; - this._robotGlowLayer = this._robotLayers.find(layer => layer.kind === "glow") || null; - this._robotOverlayLayer = this._robotLayers.find(layer => layer.kind === "overlay") || null; - this._robotExtraLayer = this._robotLayers.find(layer => layer.kind === "extra") || null; - this._birdSpriteLayer = ds(spriteY, particleY, spriteX, `${window.currentBird}_001.png`, 10, false); - this._birdGlowLayer = ds(spriteY, particleY, spriteX, `${window.currentBird}_2_001.png`, 9, false); - this._birdOverlayLayer = ds(spriteY, particleY, spriteX, `${window.currentBird}_3_001.png`, 8, false); - this._birdExtraLayer = ds(spriteY, particleY, spriteX, `${window.currentBird}_extra_001.png`, 12, false); - if (this._birdSpriteLayer) { - this._birdSpriteLayer.sprite.setTint(window.mainColor); + if (this._waveExtraLayer) { + this._waveExtraLayer.sprite.setVisible(_0x2d078b); } - if (this._birdGlowLayer) { - this._birdGlowLayer.sprite.setTint(window.secondaryColor); - this._birdGlowLayer.sprite._glowEnabled = false; + if (this._waveGlowLayer) { + this._waveGlowLayer.sprite.setVisible(_0x2d078b && this._waveGlowLayer.sprite._glowEnabled); } - if (this._birdOverlayLayer) { - this._birdOverlayLayer.sprite.setTint(window.secondaryColor); + } + setSpiderVisible(v) { + for (const layer of (this._spiderLayers || [])) { + if (!layer?.sprite) continue; + if (layer.kind === "glow") { + layer.sprite.setVisible(v && !!layer.sprite._glowEnabled); + } else { + layer.sprite.setVisible(v); + } } - this._birdLayers = [this._birdSpriteLayer, this._birdGlowLayer, this._birdOverlayLayer, this._birdExtraLayer].filter(x => !!x); - - this._allLayers = [...this._playerLayers, ...this._ballLayers, ...this._waveLayers, ...this._shipLayers, ...this._spiderLayers, ...this._robotLayers, ...this._birdLayers]; - - this._dashAnimationSprite = spriteY.add.image(particleY, spriteX, "GJ_GameSheetGlow", "playerDash2_001.png"); - this._dashAnimationSprite.setDepth(7); - this._dashAnimationSprite.setVisible(false); - this._dashAnimationSprite.setTint(0xffffff); - this._dashAnimationSprite.setBlendMode('ADD'); - this._spiderDashEffectSprite = null; - if (_textureHasFrameSafe(spriteY, "GJ_GameSheet04", "spiderDash_001.png")) { - this._spiderDashEffectSprite = spriteY.add.image(particleY, spriteX, "GJ_GameSheet04", "spiderDash_001.png"); - this._spiderDashEffectSprite.setDepth(7.7); - this._spiderDashEffectSprite.setVisible(false); - this._spiderDashEffectSprite.setAlpha(0); - this._gameLayer?.container?.add?.(this._spiderDashEffectSprite); - this._spiderDashEffectSprite.setBlendMode('ADD'); + } + _getSpiderIconBase() { + const rawBase = String(window.currentSpider || "spider_01"); + const match = rawBase.match(/^spider_\d+/); + return match ? match[0] : "spider_01"; + } + _resolveSpiderIconFrame(frameName) { + const base = this._getSpiderIconBase(); + const resolved = String(frameName || "").replace(/^spider_\d+/, base); + if (_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", resolved)) return resolved; + if (_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", frameName)) return frameName; + return resolved; + } + _getSpiderAnimDesc() { + if (this._spiderAnimDesc !== undefined) return this._spiderAnimDesc; + let data = null; + try { + data = this._scene?.cache?.json?.get?.("Spider_AnimDesc") || null; + } catch (err) { + data = null; + } + if (!data && typeof window !== "undefined") data = window.Spider_AnimDesc || null; + if (!data || !data.animationContainer) { + this._spiderFrameGroups = {}; + return null; + } + this._spiderAnimDesc = data; + this._spiderFrameGroups = {}; + if (this._spiderAnimDesc?.animationContainer) { + const frameKeys = Object.keys(this._spiderAnimDesc.animationContainer); + const sortBySuffix = (a, b) => { + const aa = parseInt((String(a).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; + const bb = parseInt((String(b).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; + return aa - bb; + }; + this._spiderFrameGroups.run = frameKeys.filter(k => /^Spider_run_\d+\.png$/.test(k)).sort(sortBySuffix); + this._spiderFrameGroups.run2 = frameKeys.filter(k => /^Spider_run2_\d+\.png$/.test(k)).sort(sortBySuffix); + this._spiderFrameGroups.walk = frameKeys.filter(k => /^Spider_walk_\d+\.png$/.test(k)).sort(sortBySuffix); + this._spiderFrameGroups.fall = frameKeys.filter(k => /^Spider_fall_loop_\d+\.png$/.test(k)).sort(sortBySuffix); + this._spiderFrameGroups.idle = frameKeys.filter(k => /^Spider_idle01_\d+\.png$/.test(k)).sort(sortBySuffix); + this._spiderFrameGroups.idle2 = frameKeys.filter(k => /^Spider_idle02_\d+\.png$/.test(k)).sort(sortBySuffix); + } + return this._spiderAnimDesc; + } + _createSpiderLayerSet(scene, x, y, textureName, tag) { + const resolvedBase = this._resolveSpiderIconFrame(textureName); + const layers = []; + const makeLayer = (variant, tint, depthOffset) => { + const frame = this._resolveSpiderIconFrame(_spiderVariantFrameName(resolvedBase, variant)); + const layer = _makeAtlasLayer(scene, x, y, "GJ_GameSheetIcons", frame, 8 + tag * 0.1 + depthOffset, false, tint, variant); + if (layer) layers.push(layer); + return layer; + }; + const glow = makeLayer("glow", window.secondaryColor, -0.04); + const base = makeLayer("base", window.mainColor, 0); + const overlay = makeLayer("overlay", window.secondaryColor, 0.04); + const extra = makeLayer("extra", null, 0.08); + return { tag, textureName, layers, glow, base, overlay, extra }; + } + _initSpiderAnimationParts(scene, x, y) { + this._spiderAnimTimer = 0; + this._spiderAnimDesc = undefined; + this._spiderPartsByTag = {}; + this._spiderLayers = []; + const desc = this._getSpiderAnimDesc(); + const usedTextures = desc?.usedTextures || null; + let entries = []; + if (usedTextures) { + entries = Object.values(usedTextures).slice().sort((a, b) => (parseInt(a.tag || "0", 10) || 0) - (parseInt(b.tag || "0", 10) || 0)); + } + if (!entries.length) { + entries = [ + { tag: "0", texture: "spider_01_02_001.png" }, + { tag: "1", texture: "spider_01_02_001.png" }, + { tag: "2", texture: "spider_01_04_001.png" }, + { tag: "3", texture: "spider_01_01_001.png" }, + { tag: "4", texture: "spider_01_03_001.png" }, + { tag: "5", texture: "spider_01_02_001.png" } + ]; + } + for (const entry of entries) { + const tag = parseInt(entry.tag || "0", 10) || 0; + const part = this._createSpiderLayerSet(scene, x, y, entry.texture, tag); + if (!part.layers.length) continue; + this._spiderPartsByTag[tag] = part; + this._spiderLayers.push(...part.layers); + } + } + _selectSpiderFrameKey(dt) { + const desc = this._getSpiderAnimDesc(); + if (!desc?.animationContainer) return null; + if (this.p._spiderTeleportAnimTimer > 0 && desc.animationContainer["Spider_jump_001.png"]) { + this.p._spiderTeleportAnimTimer = Math.max(0, this.p._spiderTeleportAnimTimer - dt); + return "Spider_jump_001.png"; } - if (_textureHasFrameSafe(spriteY, "GJ_GameSheetIcons", "fireBoost_001.png")) { - this._robotJumpFlameSprite = spriteY.add.image(particleY, spriteX, "GJ_GameSheetIcons", "fireBoost_001.png"); - this._robotJumpFlameSprite.setDepth(7.75); - this._robotJumpFlameSprite.setVisible(false); - this._robotJumpFlameSprite.setAlpha(0); - this._robotJumpFlameSprite.setOrigin(0.5, 0); - this._robotJumpFlameSprite.setBlendMode('ADD'); + const _speedPortalRef = (typeof SpeedPortal !== "undefined" && SpeedPortal) ? SpeedPortal : null; + const _oneSpeed = Number(_speedPortalRef?.ONE_TIMES ?? 11.540004) || 11.540004; + const _halfSpeed = Number(_speedPortalRef?.HALF ?? (_oneSpeed * 0.8)) || (_oneSpeed * 0.8); + const _fourSpeed = Number(_speedPortalRef?.FOUR_TIMES ?? (_oneSpeed * 1.85)) || (_oneSpeed * 1.85); + const _activeSpeed = Number.isFinite(Number(playerSpeed)) ? Number(playerSpeed) : _oneSpeed; + let spiderAnimationSpeed = 1.75; + if (_activeSpeed >= _oneSpeed) { + const _fastT = Math.max(0, Math.min(1, (_activeSpeed - _oneSpeed) / Math.max(1e-6, _fourSpeed - _oneSpeed))); + spiderAnimationSpeed = 1.75 + _fastT * 0.35; + } else { + const _slowT = Math.max(0, Math.min(1, (_oneSpeed - _activeSpeed) / Math.max(1e-6, _oneSpeed - _halfSpeed))); + spiderAnimationSpeed = 1.75 - _slowT * 0.15; + } + this._spiderAnimTimer = (this._spiderAnimTimer || 0) + Math.max(0, dt || 0) * spiderAnimationSpeed; + let group = null; + if (!this.p.onGround && !this.p.onCeiling) { + group = this._spiderFrameGroups?.fall; + } else { + group = this._spiderFrameGroups?.run; } + if (!group || !group.length) group = this._spiderFrameGroups?.walk; + if (!group || !group.length) group = this._spiderFrameGroups?.idle; + if (!group || !group.length) return desc.animationContainer["Spider_idle_001.png"] ? "Spider_idle_001.png" : null; + const fps = this.p.onGround || this.p.onCeiling ? 16 : 12; + const idx = Math.floor(this._spiderAnimTimer * fps) % group.length; + return group[idx]; } - _updateDashAnimation(deltaTime) { - if (this._scene?._editorPlaytestActive) { - if (this._dashAnimationSprite) this._dashAnimationSprite.setVisible(false); - return; + _applySpiderFrame(frameKey, baseX, baseY, dt) { + const desc = this._getSpiderAnimDesc(); + const frame = frameKey && desc?.animationContainer ? desc.animationContainer[frameKey] : null; + if (!frame || !this._spiderPartsByTag) return false; + const miniScale = this.p.isMini ? 0.6 : 1; + const mirrorSign = this.p.mirrored ? -1 : 1; + const gravitySign = this.p.gravityFlipped ? -1 : 1; + const positionYSign = this.p.gravityFlipped ? 1 : -1; + const seenTags = new Set(); + + for (const spriteKey of Object.keys(frame)) { + if (!spriteKey.startsWith("sprite_")) continue; + const spriteData = frame[spriteKey]; + const tag = parseInt(spriteData.tag || "0", 10) || 0; + const part = this._spiderPartsByTag[tag]; + if (!part) continue; + seenTags.add(tag); + const pos = _parseAnimPair(spriteData.position, 0, 0); + const spiderLegTags = [0, 1, 4, 5]; + const isSpiderLegTag = spiderLegTags.includes(tag); + const spiderLocalYOffset = tag === 3 ? 5 : (isSpiderLegTag ? -9 : 0); + const spiderLocalXScale = isSpiderLegTag ? 1.8 : 1; + const sc = _parseAnimPair(spriteData.scale, 1, 1); + const fl = _parseAnimPair(spriteData.flipped, 0, 0); + const zValue = parseFloat(spriteData.zValue || tag || "0") || 0; + const rotDeg = parseFloat(spriteData.rotation || "0") || 0; + const baseTexture = this._resolveSpiderIconFrame(spriteData.texture || part.textureName); + const resolvedFrames = { + glow: this._resolveSpiderIconFrame(_spiderVariantFrameName(baseTexture, "glow")), + base: this._resolveSpiderIconFrame(baseTexture), + overlay: this._resolveSpiderIconFrame(_spiderVariantFrameName(baseTexture, "overlay")), + extra: this._resolveSpiderIconFrame(_spiderVariantFrameName(baseTexture, "extra")) + }; + const commonX = baseX + pos.x * spiderLocalXScale * mirrorSign * miniScale; + const commonY = baseY + (pos.y + spiderLocalYOffset) * positionYSign * miniScale; + let commonRot = rotDeg * Math.PI / 180; + if (this.p.mirrored) commonRot = -commonRot; + if (this.p.gravityFlipped) commonRot = -commonRot; + const baseScaleX = sc.x * (fl.x ? -1 : 1) * mirrorSign * miniScale; + const baseScaleY = sc.y * (fl.y ? -1 : 1) * gravitySign * miniScale; + + const flashDuration = Math.max(0.001, Number(this.p._spiderFlashDuration || 0.5)); + const flashTime = (!this._scene?._editorPlaytestActive && this.p._spiderFlashTimer > 0) + ? Math.max(0, Math.min(1, this.p._spiderFlashTimer / flashDuration)) + : 0; + const flashAmount = flashTime * flashTime; + + const applyLayer = (layer, kind, depthOffset) => { + if (!layer?.sprite) return; + const frameName = resolvedFrames[kind]; + if (!_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", frameName)) { + layer.sprite.setVisible(false); + return; + } + layer.sprite.setTexture("GJ_GameSheetIcons", frameName); + layer.sprite.x = commonX; + layer.sprite.y = commonY; + layer.sprite.rotation = commonRot; + layer.sprite.scaleX = baseScaleX; + layer.sprite.scaleY = baseScaleY; + layer.sprite.setDepth(8 + zValue * 0.1 + depthOffset); + + const normalTint = kind === "base" + ? window.mainColor + : (kind === "overlay" || kind === "glow") + ? window.secondaryColor + : null; + if (flashAmount > 0) { + layer.sprite.setTint(_mixTintTowardWhite(normalTint ?? 0xffffff, flashAmount)); + } else if (normalTint !== null && normalTint !== undefined) { + layer.sprite.setTint(normalTint); + } else if (typeof layer.sprite.clearTint === "function") { + layer.sprite.clearTint(); + } + + layer.sprite.setVisible(kind === "glow" ? !!layer.sprite._glowEnabled : true); + }; + applyLayer(part.glow, "glow", -0.04); + applyLayer(part.base, "base", 0); + applyLayer(part.overlay, "overlay", 0.04); + applyLayer(part.extra, "extra", 0.08); } - if (!this._dashAnimationSprite) return; - if (this.p.isDashing) { - this._dashAnimationSprite.setVisible(true); - this._dashAnimationTimer += deltaTime; - if (this._dashAnimationTimer >= 16.67) { - this._dashAnimationTimer = 0; - this._dashAnimationFrame = (this._dashAnimationFrame % 12) + 1; - const frameName = `playerDash2_${String(this._dashAnimationFrame).padStart(3, '0')}.png`; - this._dashAnimationSprite.setFrame(frameName); - } - } else { - this._dashAnimationSprite.setVisible(false); - this._dashAnimationFrame = 0; - this._dashAnimationTimer = 0; + for (const tag of Object.keys(this._spiderPartsByTag)) { + if (seenTags.has(parseInt(tag, 10))) continue; + const part = this._spiderPartsByTag[tag]; + for (const layer of part.layers) layer?.sprite?.setVisible(false); + } + if (this.p._spiderFlashTimer > 0) { + this.p._spiderFlashTimer = Math.max(0, this.p._spiderFlashTimer - Math.max(0, dt || 0)); } + return true; } - _initParticles(scene) { - this._particleEmitter = scene.add.particles(0, 0, "GJ_WebSheet", { - frame: "square.png", - speed: { - min: 110, - max: 190 - }, - angle: { - min: 225, - max: 315 - }, - lifespan: { - min: 150, - max: 450 - }, - scale: { - start: 0.5, - end: 0 - }, - gravityY: 600, - frequency: 1000 / 30, - blendMode: "ADD", - alpha: { - start: 1, - end: 0 - }, - tint: window.mainColor - }); - this._particleEmitter.stop(); - this._particleEmitter.setDepth(9); - this._gameLayer.container.add(this._particleEmitter); - this._flyParticleEmitter = scene.add.particles(0, 0, "GJ_WebSheet", { - frame: "square.png", - speed: { - min: 22, - max: 38 - }, - angle: { - min: 225, - max: 315 - }, - lifespan: { - min: 150, - max: 450 - }, - scale: { - start: 0.5, - end: 0 - }, - gravityY: 600, - frequency: 1000 / 30, - blendMode: "ADD", - tint: { - start: 16737280, - end: 16711680 - }, - alpha: { - start: 1, - end: 0 - } - }); - this._flyParticleEmitter.stop(); - this._flyParticleEmitter.setDepth(9); - this._gameLayer.container.add(this._flyParticleEmitter); - this._flyParticle2Emitter = scene.add.particles(0, 0, "GJ_WebSheet", { - frame: "square.png", - speed: { - min: 220, - max: 380 - }, - angle: { - min: 180, - max: 360 - }, - lifespan: { - min: 150, - max: 450 - }, - scale: { - start: 0.75, - end: 0 - }, - gravityY: 600, - frequency: 1000 / 30, - blendMode: "ADD", - tint: { - start: 16760320, - end: 16711680 - }, - alpha: { - start: 1, - end: 0 + _spawnSpiderTeleportEffects(oldGameY, newGameY) { + if (this._scene?._editorPlaytestActive || !this.p.isSpider) return; + const duration = 0.5; + const circleDuration = 0.4; + const teleportTint = _mixColors(0xffffff, window.mainColor, 0.42); + const worldX = Number.isFinite(Number(this._scene?._playerWorldX)) ? Number(this._scene._playerWorldX) : 0; + const oldWorldY = b(oldGameY); + const newWorldY = b(newGameY); + const midWorldY = (oldWorldY + newWorldY) * 0.5; + const goingUpOnScreen = newWorldY < oldWorldY; + const oldCircle = this._scene.add.circle(worldX, oldWorldY, 30, teleportTint, 0.45); + oldCircle.setDepth(7.5); + oldCircle.setBlendMode(S); + oldCircle.setScale(0.85); + this._gameLayer?.container?.add?.(oldCircle); + this._spiderTeleportCircles.push(oldCircle); + this._scene.tweens.add({ + targets: oldCircle, + scaleX: 0.03, + scaleY: 0.03, + alpha: 0, + duration: circleDuration * 750, + ease: "Cubic.easeOut", + onComplete: () => { + const idx = this._spiderTeleportCircles.indexOf(oldCircle); + if (idx >= 0) this._spiderTeleportCircles.splice(idx, 1); + if (oldCircle?.destroy) oldCircle.destroy(); } }); - this._flyParticle2Emitter.stop(); - this._flyParticle2Emitter.setDepth(9); - this._gameLayer.container.add(this._flyParticle2Emitter); - this._shipDragEmitter = scene.add.particles(0, 0, "GJ_WebSheet", { - frame: "square.png", - x: { - min: -18, - max: 18 - }, - speed: { - min: 223.79999999999998, - max: 343.79999999999995 - }, - angle: { - min: 205, - max: 295 - }, - lifespan: { - min: 80, - max: 220 - }, - scale: { - start: 0.375, - end: 0 - }, - gravityX: -700, - gravityY: 600, - frequency: 25, - blendMode: "ADD", - alpha: { - start: 1, - end: 0 + + const circle = this._scene.add.circle(worldX, newWorldY, 44, teleportTint, 1); + circle.setDepth(7.55); + circle.setBlendMode(S); + circle.setScale(1.25); + this._gameLayer?.container?.add?.(circle); + this._spiderTeleportCircles.push(circle); + this._scene.tweens.add({ + targets: circle, + x: worldX + (this.p.mirrored ? 28 : -28), + scaleX: 0.05, + scaleY: 0.05, + alpha: 0, + duration: circleDuration * 1000, + ease: "Cubic.easeOut", + onComplete: () => { + const idx = this._spiderTeleportCircles.indexOf(circle); + if (idx >= 0) this._spiderTeleportCircles.splice(idx, 1); + if (circle?.destroy) circle.destroy(); } }); - this._shipDragEmitter.stop(); - this._shipDragEmitter.setDepth(22); - this._shipDragActive = false; - this._particleActive = false; - this._flyParticle2Active = false; - this._flyParticleActive = false; - const _0x57911a = { - frame: "square.png", - speed: { - min: 250, - max: 350 - }, - angle: { - min: 210, - max: 330 - }, - lifespan: { - min: 50, - max: 600 - }, - scale: { - start: 0.625, - end: 0 - }, - gravityY: 1000, - blendMode: "ADD", - alpha: { - start: 1, - end: 0 - }, - tint: window.mainColor, - emitting: false - }; - this._landEmitter1 = scene.add.particles(0, 0, "GJ_WebSheet", { - ..._0x57911a - }); - this._landEmitter2 = scene.add.particles(0, 0, "GJ_WebSheet", { - ..._0x57911a - }); - this._aboveContainer = scene.add.container(0, 0); - this._aboveContainer.setDepth(13); - this._gameLayer.topContainer.add(this._landEmitter1); - this._gameLayer.topContainer.add(this._landEmitter2); - this._landIdx = false; - this._streak = new StreakManager(this._scene, "streak_01", 0.231, 10, 8, 100, window.secondaryColor, 0.7); - this._streak.addToContainer(this._gameLayer.container, 8); - this._waveTrail = new WaveTrail(this._scene, window.secondaryColor, window.secondaryColor); - this._waveTrail.addToContainer(this._gameLayer.container, 9); + + if (this._spiderDashEffectSprite && _textureHasFrameSafe(this._scene, "GJ_GameSheet04", "spiderDash_001.png")) { + this._spiderDashEffectTimer = duration; + this._spiderDashEffectDuration = duration; + this._spiderDashEffectSprite.setTexture("GJ_GameSheet04", "spiderDash_001.png"); + this._spiderDashEffectSprite.x = worldX; + this._spiderDashEffectSprite.y = midWorldY; + this._spiderDashEffectSprite.rotation = Phaser.Math.DegToRad(goingUpOnScreen ? 90 : -90); + const baseLength = 400; + const teleportDistance = Math.abs(newWorldY - oldWorldY); + const dashLength = Math.max(0.12, teleportDistance / baseLength); + this._spiderDashEffectSprite.scaleX = dashLength; + this._spiderDashEffectSprite.scaleY = 0.8; + this._spiderDashEffectSprite.setTint(teleportTint); + this._spiderDashEffectSprite.setAlpha(1); + this._spiderDashEffectSprite.setVisible(true); + } } - _updateParticles(_0xc43238, _0x52b718, _0x5af874) { - if (this._scene?._editorPlaytestActive) { - this._particleEmitter.stop(); - this._particleActive = false; - this._flyParticleEmitter.stop(); - this._flyParticleActive = false; - this._flyParticle2Emitter.stop(); - this._flyParticle2Active = false; - this._shipDragEmitter.stop(); - this._shipDragActive = false; - this._streak.stop(); - this._streak.reset(); - this._waveTrail.stop(); - this._waveTrail.reset(); + _updateSpiderTeleportEffects(dt) { + if (!this.p.isSpider || this._scene?._editorPlaytestActive) { + if (this._spiderDashEffectSprite) this._spiderDashEffectSprite.setVisible(false); + if (this._spiderTeleportCircles?.length) { + for (const circle of this._spiderTeleportCircles) if (circle?.destroy) circle.destroy(); + this._spiderTeleportCircles = []; + } + this._spiderDashEffectTimer = 0; return; } - - if (this.p.isDead) { - return; + if (this.p.isDead && this._spiderTeleportCircles?.length) { + for (const circle of this._spiderTeleportCircles) if (circle?.destroy) circle.destroy(); + this._spiderTeleportCircles = []; } - const _0x119eb7 = this._scene._playerWorldX; - const _0x519d38 = b(this.p.y); - this._particleEmitter.particleX = _0x119eb7 - 20; - this._particleEmitter.particleY = _0x519d38 + (this.p.gravityFlipped ? (-26 + (this.p.isUfo ? -5 : 0)) : (26 + (this.p.isUfo ? 5 : 0))); - const _0x4436ac = this.p.onGround && !this.p.isFlying && !this.p.isWave; - if (_0x4436ac && !this._particleActive) { - this._particleEmitter.start(); - this._particleActive = true; - } else if (!_0x4436ac && this._particleActive) { - this._particleEmitter.stop(); - this._particleActive = false; + if (!this._spiderDashEffectSprite || this._spiderDashEffectTimer <= 0) { + if (this._spiderDashEffectSprite) this._spiderDashEffectSprite.setVisible(false); + return; } - { - const _0xe76a85 = Math.cos(this._rotation); - const _0x26ec65 = Math.sin(this._rotation); - const _0x216018 = this.p.isWave ? 0 : (this.p.isUfo ? 0 : -24); - const _0x2baeac = (this.p.isWave ? 4 : (this.p.isUfo ? 5 : 18)) * (this.p.gravityFlipped ? -1 : 1); - const _0x75c380 = _0x119eb7 + _0x216018 * _0xe76a85 - _0x2baeac * _0x26ec65; - const _0x2b31d7 = _0x519d38 + _0x216018 * _0x26ec65 + _0x2baeac * _0xe76a85; - const _0x5d66f4 = (Math.random() * 2 - 1) * 2 * 2; - this._flyParticleEmitter.particleX = _0x75c380; - this._flyParticleEmitter.particleY = _0x2b31d7 + _0x5d66f4; - this._flyParticle2Emitter.particleX = _0x75c380; - this._flyParticle2Emitter.particleY = _0x2b31d7 + _0x5d66f4; - this._streak.setPosition(this.p.isWave ? _0x75c380 : (this.p.isUfo ? _0x75c380 : _0x75c380 + 8), _0x2b31d7); - this._waveTrail.setPosition(_0x119eb7, _0x519d38); + const duration = Math.max(0.001, Number(this._spiderDashEffectDuration || 0.5)); + this._spiderDashEffectTimer = Math.max(0, this._spiderDashEffectTimer - Math.max(0, dt || 0)); + const progress = Math.max(0, Math.min(1, (duration - this._spiderDashEffectTimer) / duration)); + const frameIndex = Math.min(8, Math.max(1, Math.floor(progress * 8) + 1)); + const frameName = `spiderDash_${String(frameIndex).padStart(3, "0")}.png`; + if (_textureHasFrameSafe(this._scene, "GJ_GameSheet04", frameName)) { + this._spiderDashEffectSprite.setTexture("GJ_GameSheet04", frameName); } - this._streak.update(_0x5af874); - this._waveTrail.update(_0x5af874); - const _0x3d69d2 = this.p.isFlying || this.p.isUfo; - if (_0x3d69d2 && !this._flyParticleActive) { - this._flyParticleEmitter.start(); - this._flyParticleActive = true; - } else if (!_0x3d69d2 && this._flyParticleActive) { - this._flyParticleEmitter.stop(); - this._flyParticleActive = false; + this._spiderDashEffectSprite.setAlpha(Math.max(0, 1 - progress)); + this._spiderDashEffectSprite.setVisible(this._spiderDashEffectTimer > 0); + } + _syncSpiderAnimation(baseX, baseY, dt) { + if (this.p.isDead || !this.p.isSpider || !this._spiderLayers?.length) { + this.setSpiderVisible(false); + return; } - const _0x169e30 = (this.p.isFlying && this.p.upKeyDown) || (this.p.isUfo && this.p.isJumping); - if (_0x169e30 && !this._flyParticle2Active) { - this._flyParticle2Emitter.start(); - this._flyParticle2Active = true; - } else if (!_0x169e30 && this._flyParticle2Active) { - this._flyParticle2Emitter.stop(); - this._flyParticle2Active = false; + const frameKey = this._selectSpiderFrameKey(dt); + const applied = this._applySpiderFrame(frameKey, baseX, baseY, dt); + if (!applied) { + for (const layer of this._spiderLayers) { + if (!layer?.sprite) continue; + layer.sprite.x = baseX; + layer.sprite.y = baseY; + layer.sprite.rotation = this.p.mirrored ? -this._rotation : this._rotation; + const miniScale = this.p.isMini ? 0.6 : 1; + layer.sprite.scaleX = (this.p.mirrored ? -miniScale : miniScale); + layer.sprite.scaleY = (this.p.gravityFlipped ? -miniScale : miniScale); + layer.sprite.setVisible(layer.kind === "glow" ? !!layer.sprite._glowEnabled : true); + } } - const _0x2e5643 = _0xc43238 + this._scene._getMirrorXOffset(_0x119eb7 - _0xc43238); - this._shipDragEmitter.x = _0x2e5643; - this._shipDragEmitter.particleY = this.p.gravityFlipped ? b(this.p.y) + _0x52b718 + 10 : b(this.p.y) + _0x52b718 + 30; - this._shipDragEmitter.setAngle(this.p.mirrored ? { - min: 245, - max: 335 - } : { - min: 205, - max: 295 - }); - this._shipDragEmitter.gravityX = this.p.mirrored ? 700 : -700; - this._shipDragEmitter.setScale(this.p.gravityFlipped ? { x: -1, y: 1 } : { x: 1, y: 1 }); - const _0x2ac9d0 = this.p.isFlying && this.p.onGround && (this.p.gravityFlipped ? this.p.onCeiling : !this.p.onCeiling); - if (_0x2ac9d0 && !this._shipDragActive) { - this._shipDragEmitter.start(); - this._shipDragActive = true; - } else if (!_0x2ac9d0 && this._shipDragActive) { - this._shipDragEmitter.stop(); - this._shipDragActive = false; + } + _primeSpiderAnimationFrame(dt = 1 / 30) { + if (!this.p.isSpider || this.p.isDead || !this._spiderLayers?.length) return; + const screenX = Number.isFinite(this._lastScreenX) ? this._lastScreenX : centerX; + const screenY = Number.isFinite(this._lastScreenY) ? this._lastScreenY : b(this.p.y) + (this._scene?._cameraY || 0); + const frameKey = this._selectSpiderFrameKey(dt); + const applied = this._applySpiderFrame(frameKey, screenX, screenY, dt); + if (!applied) { + const miniScale = this.p.isMini ? 0.6 : 1; + for (const layer of (this._spiderLayers || [])) { + if (!layer?.sprite) continue; + layer.sprite.x = screenX; + layer.sprite.y = screenY; + layer.sprite.rotation = this.p.mirrored ? -this._rotation : this._rotation; + layer.sprite.scaleX = this.p.mirrored ? -miniScale : miniScale; + layer.sprite.scaleY = this.p.gravityFlipped ? -miniScale : miniScale; + } } + this.setSpiderVisible(true); + } + _getRobotIconBase() { + const rawBase = String(window.currentRobot || "robot_01"); + const match = rawBase.match(/^robot_\d+/); + return match ? match[0] : "robot_01"; } - setCubeVisible(_0x411813) { - this._playerSpriteLayer.sprite.setVisible(_0x411813); - if (this._playerGlowLayer) { - this._playerGlowLayer.sprite.setVisible(_0x411813 && this._playerGlowLayer.sprite._glowEnabled); - } - if (this._playerOverlayLayer) { - this._playerOverlayLayer.sprite.setVisible(_0x411813); + _resolveRobotIconFrame(frameName) { + const base = this._getRobotIconBase(); + const resolved = String(frameName || "").replace(/^robot_\d+/, base); + if (_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", resolved)) return resolved; + if (_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", frameName)) return frameName; + return resolved; + } + _getRobotAnimDesc() { + if (this._robotAnimDesc !== undefined) return this._robotAnimDesc; + let data = null; + try { + data = this._scene?.cache?.json?.get?.("Robot_AnimDesc") || null; + } catch (err) { + data = null; } - if (this._playerExtraLayer) { - this._playerExtraLayer.sprite.setVisible(_0x411813); + if (!data && typeof window !== "undefined") data = window.Robot_AnimDesc || null; + if (!data || !data.animationContainer) { + this._robotFrameGroups = {}; + return null; } + this._robotAnimDesc = data; + this._robotFrameGroups = {}; + const frameKeys = Object.keys(data.animationContainer); + const sortBySuffix = (a, b) => { + const aa = parseInt((String(a).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; + const bb = parseInt((String(b).match(/_(\d+)\.png$/) || [0, 0])[1], 10) || 0; + return aa - bb; + }; + this._robotFrameGroups.run = frameKeys.filter(k => /^Robot_run_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.run2 = frameKeys.filter(k => /^Robot_run2_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.run3 = frameKeys.filter(k => /^Robot_run3_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.skip = frameKeys.filter(k => /^Robot_skip_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.jumpStart = frameKeys.filter(k => /^Robot_jump_start_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.jumpLoop = frameKeys.filter(k => /^Robot_jump_loop_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.fallStart = frameKeys.filter(k => /^Robot_fall_start_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.fallLoop = frameKeys.filter(k => /^Robot_fall_loop_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.idle = frameKeys.filter(k => /^Robot_idle_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.idle1 = frameKeys.filter(k => /^Robot_idle01_\d+\.png$/.test(k)).sort(sortBySuffix); + this._robotFrameGroups.idle2 = frameKeys.filter(k => /^Robot_idle02_\d+\.png$/.test(k)).sort(sortBySuffix); + return this._robotAnimDesc; } - setShipVisible(_0x1c5620) { - this._shipSpriteLayer.sprite.setVisible(_0x1c5620); - if (this._shipGlowLayer) { - this._shipGlowLayer.sprite.setVisible(_0x1c5620 && this._shipGlowLayer.sprite._glowEnabled); + _createRobotLayerSet(scene, x, y, textureName, tag) { + const resolvedBase = this._resolveRobotIconFrame(textureName); + const layers = []; + const makeLayer = (variant, tint, depthOffset) => { + const frame = this._resolveRobotIconFrame(_spiderVariantFrameName(resolvedBase, variant)); + const layer = _makeAtlasLayer(scene, x, y, "GJ_GameSheetIcons", frame, 8 + tag * 0.1 + depthOffset, false, tint, variant); + if (layer) layers.push(layer); + return layer; + }; + const glow = makeLayer("glow", window.secondaryColor, -0.04); + const base = makeLayer("base", window.mainColor, 0); + const overlay = makeLayer("overlay", window.secondaryColor, 0.04); + const extra = makeLayer("extra", null, 0.08); + return { tag, textureName, layers, glow, base, overlay, extra }; + } + _initRobotAnimationParts(scene, x, y) { + this._robotAnimTimer = 0; + this._robotAnimState = "run"; + this._robotAnimDesc = undefined; + this._robotPartsByTag = {}; + this._robotLayers = []; + const desc = this._getRobotAnimDesc(); + const usedTextures = desc?.usedTextures || null; + let entries = []; + if (usedTextures) { + entries = Object.values(usedTextures).slice().sort((a, b) => (parseInt(a.tag || "0", 10) || 0) - (parseInt(b.tag || "0", 10) || 0)); } - if (this._shipOverlayLayer) { - this._shipOverlayLayer.sprite.setVisible(_0x1c5620); + if (!entries.length) { + entries = [ + { tag: "0", texture: "robot_01_03_001.png" }, + { tag: "1", texture: "robot_01_02_001.png" }, + { tag: "2", texture: "robot_01_04_001.png" }, + { tag: "3", texture: "robot_01_01_001.png" }, + { tag: "4", texture: "robot_01_03_001.png" }, + { tag: "5", texture: "robot_01_02_001.png" }, + { tag: "6", texture: "robot_01_04_001.png" } + ]; } - if (this._shipExtraLayer) { - this._shipExtraLayer.sprite.setVisible(_0x1c5620); + for (const entry of entries) { + const tag = parseInt(entry.tag || "0", 10) || 0; + const part = this._createRobotLayerSet(scene, x, y, entry.texture, tag); + if (!part.layers.length) continue; + this._robotPartsByTag[tag] = part; + this._robotLayers.push(...part.layers); } } - setBirdVisible(v) { - for (const layer of (this._birdLayers || [])) { - if (layer === this._birdGlowLayer) { - layer.sprite.setVisible(v && layer.sprite._glowEnabled); - } else { - layer.sprite.setVisible(v); - } + _selectRobotFrameKey(dt) { + const desc = this._getRobotAnimDesc(); + if (!desc?.animationContainer) return null; + const _speedPortalRef = (typeof SpeedPortal !== "undefined" && SpeedPortal) ? SpeedPortal : null; + const _oneSpeed = Number(_speedPortalRef?.ONE_TIMES ?? 11.540004) || 11.540004; + const _halfSpeed = Number(_speedPortalRef?.HALF ?? (_oneSpeed * 0.8)) || (_oneSpeed * 0.8); + const _fourSpeed = Number(_speedPortalRef?.FOUR_TIMES ?? (_oneSpeed * 1.85)) || (_oneSpeed * 1.85); + const _activeSpeed = Number.isFinite(Number(playerSpeed)) ? Number(playerSpeed) : _oneSpeed; + let robotAnimationSpeed = 1.75; + if (_activeSpeed >= _oneSpeed) { + const _fastT = Math.max(0, Math.min(1, (_activeSpeed - _oneSpeed) / Math.max(1e-6, _fourSpeed - _oneSpeed))); + robotAnimationSpeed = 1.75 + _fastT * 0.35; + } else { + const _slowT = Math.max(0, Math.min(1, (_oneSpeed - _activeSpeed) / Math.max(1e-6, _oneSpeed - _halfSpeed))); + robotAnimationSpeed = 1.75 - _slowT * 0.15; } - } - setBallVisible(_0x5685cf) { - if (this._ballSpriteLayer) { - this._ballSpriteLayer.sprite.setVisible(_0x5685cf); + robotAnimationSpeed *= 1.2; + + const grounded = this.p.onGround || this.p.onCeiling; + const goingUp = this.p.gravityFlipped ? this.p.yVelocity < 0 : this.p.yVelocity > 0; + const nextState = grounded ? "run" : (goingUp ? "jump" : "fall"); + if (this._robotAnimState !== nextState) { + this._robotAnimState = nextState; + this._robotAnimTimer = 0; } - if (this._ballGlowLayer) { - this._ballGlowLayer.sprite.setVisible(_0x5685cf && this._ballGlowLayer.sprite._glowEnabled); + this._robotAnimTimer = (this._robotAnimTimer || 0) + Math.max(0, dt || 0) * robotAnimationSpeed; + + const pickFromStartThenLoop = (startGroup, loopGroup, fps) => { + const start = startGroup || []; + const loop = loopGroup || []; + if (start.length) { + const startDuration = start.length / fps; + if (this._robotAnimTimer < startDuration || !loop.length) { + return start[Math.min(start.length - 1, Math.floor(this._robotAnimTimer * fps))]; + } + const loopTime = this._robotAnimTimer - startDuration; + return loop[Math.floor(loopTime * fps) % loop.length]; + } + if (loop.length) return loop[Math.floor(this._robotAnimTimer * fps) % loop.length]; + return null; + }; + + if (this.p.isDashing && this._robotFrameGroups?.fallLoop?.length) { + const group = this._robotFrameGroups.fallLoop; + return group[Math.floor(this._robotAnimTimer * 16) % group.length]; } - if (this._ballOverlayLayer) { - this._ballOverlayLayer.sprite.setVisible(_0x5685cf); + if (nextState === "run") { + const group = this._robotFrameGroups?.run?.length ? this._robotFrameGroups.run : (this._robotFrameGroups?.idle1 || this._robotFrameGroups?.idle || []); + if (group?.length) return group[Math.floor(this._robotAnimTimer * 16) % group.length]; + } else if (nextState === "jump") { + const frame = pickFromStartThenLoop(this._robotFrameGroups?.jumpStart, this._robotFrameGroups?.jumpLoop, 15); + if (frame) return frame; + } else { + const frame = pickFromStartThenLoop(this._robotFrameGroups?.fallStart, this._robotFrameGroups?.fallLoop, 15); + if (frame) return frame; + } + return desc.animationContainer["Robot_idle_001.png"] ? "Robot_idle_001.png" : null; + } + _applyRobotFrame(frameKey, baseX, baseY, dt) { + const desc = this._getRobotAnimDesc(); + const frame = frameKey && desc?.animationContainer ? desc.animationContainer[frameKey] : null; + if (!frame || !this._robotPartsByTag) return false; + const miniScale = this.p.isMini ? 0.6 : 1; + const mirrorSign = this.p.mirrored ? -1 : 1; + const gravitySign = this.p.gravityFlipped ? -1 : 1; + const positionYSign = this.p.gravityFlipped ? 1 : -1; + const seenTags = new Set(); + const robotFootTags = [2, 6]; + const robotFootPoints = []; + const robotLegPoints = []; + + for (const spriteKey of Object.keys(frame)) { + if (!spriteKey.startsWith("sprite_")) continue; + const spriteData = frame[spriteKey]; + const tag = parseInt(spriteData.tag || "0", 10) || 0; + const part = this._robotPartsByTag[tag]; + if (!part) continue; + seenTags.add(tag); + const pos = _parseAnimPair(spriteData.position, 0, 0); + const robotLegTags = [0, 2, 4, 6]; + const robotArmTags = [1, 5]; + const isRobotLegTag = robotLegTags.includes(tag); + const isRobotArmTag = robotArmTags.includes(tag); + const robotLocalYOffset = tag === 3 ? 5 : (isRobotArmTag ? -1 : (isRobotLegTag ? -9 : 0)); + const robotLocalXScale = (isRobotLegTag || isRobotArmTag) ? 1.8 : 1; + const sc = _parseAnimPair(spriteData.scale, 1, 1); + const fl = _parseAnimPair(spriteData.flipped, 0, 0); + const zValue = parseFloat(spriteData.zValue || tag || "0") || 0; + const rotDeg = parseFloat(spriteData.rotation || "0") || 0; + const baseTexture = this._resolveRobotIconFrame(spriteData.texture || part.textureName); + const resolvedFrames = { + glow: this._resolveRobotIconFrame(_spiderVariantFrameName(baseTexture, "glow")), + base: this._resolveRobotIconFrame(baseTexture), + overlay: this._resolveRobotIconFrame(_spiderVariantFrameName(baseTexture, "overlay")), + extra: this._resolveRobotIconFrame(_spiderVariantFrameName(baseTexture, "extra")) + }; + const commonX = baseX + pos.x * robotLocalXScale * mirrorSign * miniScale; + const commonY = baseY + (pos.y + robotLocalYOffset) * positionYSign * miniScale; + let commonRot = rotDeg * Math.PI / 180; + if (this.p.mirrored) commonRot = -commonRot; + if (this.p.gravityFlipped) commonRot = -commonRot; + const baseScaleX = sc.x * (fl.x ? -1 : 1) * mirrorSign * miniScale; + const baseScaleY = sc.y * (fl.y ? -1 : 1) * gravitySign * miniScale; + + const applyLayer = (layer, kind, depthOffset) => { + if (!layer?.sprite) return; + const frameName = resolvedFrames[kind]; + if (!_textureHasFrameSafe(this._scene, "GJ_GameSheetIcons", frameName)) { + layer.sprite.setVisible(false); + return; + } + layer.sprite.setTexture("GJ_GameSheetIcons", frameName); + layer.sprite.x = commonX; + layer.sprite.y = commonY; + layer.sprite.rotation = commonRot; + layer.sprite.scaleX = baseScaleX; + layer.sprite.scaleY = baseScaleY; + layer.sprite.setDepth(8 + zValue * 0.1 + depthOffset); + + const normalTint = kind === "base" + ? window.mainColor + : (kind === "overlay" || kind === "glow") + ? window.secondaryColor + : null; + if (normalTint !== null && normalTint !== undefined) { + layer.sprite.setTint(normalTint); + } else if (typeof layer.sprite.clearTint === "function") { + layer.sprite.clearTint(); + } + layer.sprite.setVisible(kind === "glow" ? !!layer.sprite._glowEnabled : true); + }; + applyLayer(part.glow, "glow", -0.04); + applyLayer(part.base, "base", 0); + applyLayer(part.overlay, "overlay", 0.04); + applyLayer(part.extra, "extra", 0.08); + + const footSprite = part.base?.sprite || part.overlay?.sprite || part.extra?.sprite || part.glow?.sprite; + if (footSprite && (robotFootTags.includes(tag) || isRobotLegTag)) { + const footHalfHeight = Math.max(6 * miniScale, Math.abs(footSprite.displayHeight || (footSprite.height || 0) * baseScaleY) * 0.5); + const footEdgeY = commonY + (this.p.gravityFlipped ? -footHalfHeight : footHalfHeight); + const point = { x: commonX, y: footEdgeY }; + if (robotFootTags.includes(tag)) { + robotFootPoints.push(point); + } else if (isRobotLegTag) { + robotLegPoints.push(point); + } + } } - } - setWaveVisible(_0x2d078b) { - if (this._waveSpriteLayer) { - this._waveSpriteLayer.sprite.setVisible(_0x2d078b); + + const flameAnchorPoints = robotFootPoints.length ? robotFootPoints : robotLegPoints; + if (flameAnchorPoints.length) { + let attachedFoot = flameAnchorPoints[0]; + for (const pt of flameAnchorPoints) { + if (this.p.gravityFlipped ? pt.y < attachedFoot.y : pt.y > attachedFoot.y) { + attachedFoot = pt; + } + } + this._robotJumpFlameAnchorX = attachedFoot.x; + this._robotJumpFlameAnchorY = attachedFoot.y; } - if (this._waveOverlayLayer) { - this._waveOverlayLayer.sprite.setVisible(_0x2d078b); + for (const tag of Object.keys(this._robotPartsByTag)) { + if (seenTags.has(parseInt(tag, 10))) continue; + const part = this._robotPartsByTag[tag]; + for (const layer of part.layers) layer?.sprite?.setVisible(false); } - if (this._waveExtraLayer) { - this._waveExtraLayer.sprite.setVisible(_0x2d078b); + return true; + } + _hideRobotJumpFlame() { + if (!this._robotJumpFlameSprite) return; + this._robotJumpFlameSprite.setVisible(false); + this._robotJumpFlameSprite.setAlpha(0); + } + _updateRobotJumpFlame(dt) { + if (!this._robotJumpFlameSprite) return; + const goingUp = this.p.gravityFlipped ? this.p.yVelocity < -0.01 : this.p.yVelocity > 0.01; + if (!this._robotJumpFlameActive || this.p.isDead || !this.p.isRobot || !goingUp || this.p.onGround || this._endAnimating) { + this._robotJumpFlameActive = false; + this._hideRobotJumpFlame(); + return; } - if (this._waveGlowLayer) { - this._waveGlowLayer.sprite.setVisible(_0x2d078b && this._waveGlowLayer.sprite._glowEnabled); + const upwardVelocity = Math.max(0, this.p.gravityFlipped ? -this.p.yVelocity : this.p.yVelocity); + const fadeThreshold = this.p.isMini ? 7 : 10; + const fade = Math.max(0, Math.min(1, upwardVelocity / Math.max(0.001, fadeThreshold))); + if (fade <= 0.02) { + this._robotJumpFlameActive = false; + this._hideRobotJumpFlame(); + return; } + const miniScale = this.p.isMini ? 0.8 : 1.2; + this._robotJumpFlameFadeInTimer = (this._robotJumpFlameFadeInTimer || 0) + Math.max(0, dt || 0); + const fadeIn = Math.max(0, Math.min(1, this._robotJumpFlameFadeInTimer / 0.24)); + const visibleFade = Math.min(fade, fadeIn); + this._robotJumpFlamePulse = (this._robotJumpFlamePulse || 0) + Math.max(0, dt || 0) * (Math.PI * 4); + const pulse = (Math.sin(this._robotJumpFlamePulse) + 1) * 0.5; + const stretchY = 0.8 + 0.4 * pulse; + const overallScale = 0.82 * miniScale * visibleFade; + this._robotJumpFlameSprite.setPosition( + this._robotJumpFlameAnchorX, + this._robotJumpFlameAnchorY + ); + this._robotJumpFlameSprite.setScale(overallScale, overallScale * stretchY * (this.p.gravityFlipped ? -1 : 1)); + this._robotJumpFlameSprite.setAlpha(Math.max(0, Math.min(1, visibleFade))); + this._robotJumpFlameSprite.setVisible(true); } - setSpiderVisible(v) { - for (const layer of (this._spiderLayers || [])) { - if (!layer?.sprite) continue; - if (layer.kind === "glow") { - layer.sprite.setVisible(v && !!layer.sprite._glowEnabled); - } else { - layer.sprite.setVisible(v); - } + _syncRobotAnimation(baseX, baseY, dt) { + if (this.p.isDead || !this.p.isRobot || !this._robotLayers?.length) { + this.setRobotVisible(false); + return; } - } - setRobotVisible(v) { - for (const layer of (this._robotLayers || [])) { - if (!layer?.sprite) continue; - if (layer.kind === "glow") { - layer.sprite.setVisible(v && !!layer.sprite._glowEnabled); - } else { - layer.sprite.setVisible(v); + const frameKey = this._selectRobotFrameKey(dt); + const applied = this._applyRobotFrame(frameKey, baseX, baseY, dt); + if (!applied) { + for (const layer of this._robotLayers) { + if (!layer?.sprite) continue; + layer.sprite.x = baseX; + layer.sprite.y = baseY; + layer.sprite.rotation = this.p.mirrored ? -this._rotation : this._rotation; + const miniScale = this.p.isMini ? 0.6 : 1; + layer.sprite.scaleX = (this.p.mirrored ? -miniScale : miniScale); + layer.sprite.scaleY = (this.p.gravityFlipped ? -miniScale : miniScale); + layer.sprite.setVisible(layer.kind === "glow" ? !!layer.sprite._glowEnabled : true); } - } - if (!v) { - this._hideRobotJumpFlame(); + this._robotJumpFlameAnchorX = baseX; + this._robotJumpFlameAnchorY = baseY + (this.p.gravityFlipped ? (-8 * (this.p.isMini ? 0.6 : 1)) : (8 * (this.p.isMini ? 0.6 : 1))); } } _primeRobotAnimationFrame(dt = 1 / 30) { @@ -1603,24 +1869,23 @@ class PlayerObject { } this.setRobotVisible(true); } - _primeSpiderAnimationFrame(dt = 1 / 30) { - if (!this.p.isSpider || this.p.isDead || !this._spiderLayers?.length) return; - const screenX = Number.isFinite(this._lastScreenX) ? this._lastScreenX : centerX; - const screenY = Number.isFinite(this._lastScreenY) ? this._lastScreenY : b(this.p.y) + (this._scene?._cameraY || 0); - const frameKey = this._selectSpiderFrameKey(dt); - const applied = this._applySpiderFrame(frameKey, screenX, screenY, dt); - if (!applied) { - const miniScale = this.p.isMini ? 0.6 : 1; - for (const layer of (this._spiderLayers || [])) { - if (!layer?.sprite) continue; - layer.sprite.x = screenX; - layer.sprite.y = screenY; - layer.sprite.rotation = this.p.mirrored ? -this._rotation : this._rotation; - layer.sprite.scaleX = this.p.mirrored ? -miniScale : miniScale; - layer.sprite.scaleY = this.p.gravityFlipped ? -miniScale : miniScale; + setRobotVisible(v) { + for (const layer of (this._robotLayers || [])) { + if (!layer?.sprite) continue; + if (layer.kind === "glow") { + layer.sprite.setVisible(v && !!layer.sprite._glowEnabled); + } else { + layer.sprite.setVisible(v); } } - this.setSpiderVisible(true); + if (!v) { + this._hideRobotJumpFlame(); + } + } + setSwingVisible(v) { + for (const layer of (this._swingLayers || [])) { + layer.sprite.setVisible(v); + } } syncSprites(cameraX, cameraY, _0x3afedf, mirrorOffset) { if (this._endAnimating) { @@ -1629,10 +1894,21 @@ class PlayerObject { const _0x7f0705 = mirrorOffset !== undefined ? mirrorOffset : centerX; const _0x1a433c = b(this.p.y) + cameraY; const playerRotation = this._rotation; + // WHEN DOES IT END?? + const tiltTarget = (!this.p.isFlying && this._slopeGroundAngle !== null) ? this._slopeGroundAngle + : (this.p.isUfo && !this.p.isFlying ? Math.max(-0.05, Math.min(0.05, -(this.p.y - this.p.lastY) * 0.008)) : 0); + // impossible + const tiltSpeed = Math.abs(tiltTarget) > Math.abs(this._visualTilt) ? 0.25 : 0.12; + this._visualTilt += (tiltTarget - this._visualTilt) * tiltSpeed; + if (Math.abs(this._visualTilt) < 0.001) this._visualTilt = 0; + // why does copilot write a message at every piece of code i make, like i didnt ask him shit + const halfPi = Math.PI / 2; + const renderBase = this._slopeGroundAngle !== null && !this.p.isFlying + ? Math.round(playerRotation / halfPi) * halfPi + : playerRotation; + const tiltedRotation = renderBase + this._visualTilt; this._lastCameraX = cameraX; this._lastCameraY = cameraY; - this._lastScreenX = _0x7f0705; - this._lastScreenY = _0x1a433c; this._aboveContainer.x = -cameraX; this._aboveContainer.y = cameraY; if (this.p.isFlying || this.p.isUfo) { @@ -1653,7 +1929,7 @@ if (this.p.isFlying || this.p.isUfo) { const _miniS = this.p.isMini ? 0.6 : 1; layer.sprite.x = _0x7f0705 + _0x1b1d28; layer.sprite.y = _0x1a433c + _0x185f91 + (this.p.gravityFlipped ? (-20 * _miniS) : 0) - layer.sprite.rotation = this.p.mirrored ? -playerRotation : playerRotation; + layer.sprite.rotation = this.p.mirrored ? -tiltedRotation : tiltedRotation; layer.sprite.scaleY = this.p.gravityFlipped ? -_miniS : _miniS; layer.sprite.scaleX = this.p.mirrored ? -_miniS : _miniS; } @@ -1665,7 +1941,7 @@ if (this.p.isFlying || this.p.isUfo) { layer.sprite.setVisible(true); layer.sprite.x = _0x7f0705 + _0x1b1d28; layer.sprite.y = _0x1a433c + _0x185f91 + (this.p.gravityFlipped ? -15 : 5); - layer.sprite.rotation = this.p.mirrored ? -playerRotation : playerRotation; + layer.sprite.rotation = this.p.mirrored ? -tiltedRotation : tiltedRotation; const _miniS = this.p.isMini ? 0.6 : 1; layer.sprite.scaleY = this.p.gravityFlipped ? -_miniS : _miniS; layer.sprite.scaleX = this.p.mirrored ? -_miniS : _miniS; @@ -1676,66 +1952,53 @@ if (this.p.isFlying || this.p.isUfo) { for (const playerLayerItem of this._playerLayers) { if (playerLayerItem) { const _miniS = this.p.isMini ? 0.6 : 1; - playerLayerItem.sprite.x = _0x7f0705 + _0x562424; - playerLayerItem.sprite.y = (_0x1a433c + _0x3011c9) + (this.p.isMini ? (8 * _miniS) : 0) + (this.p.gravityFlipped ? (-20 * _miniS) : 0); - playerLayerItem.sprite.rotation = this.p.mirrored ? -playerRotation : playerRotation; + // for ship: offset the cube icon inside the ship body + // for ufo: center the cube inside the ufo shell (same y as bird layers) + const _cubeX = this.p.isUfo ? _0x1b1d28 : _0x562424; + const _cubeY = this.p.isUfo + ? _0x185f91 // Back to the original flat center point + : (_0x3011c9 + (this.p.isMini ? (8 * _miniS) : 0) + (this.p.gravityFlipped ? (-20 * _miniS) : 0)); + playerLayerItem.sprite.x = _0x7f0705 + _cubeX; + playerLayerItem.sprite.y = _0x1a433c + _cubeY; + playerLayerItem.sprite.rotation = this.p.mirrored ? -tiltedRotation : tiltedRotation; + + // --- INVERTED UFO SLOPE OFFSET FIX --- + if (this.p.isUfo) { + const ufoDistance = 18 * _miniS; // Your 15 offset value + const direction = this.p.gravityFlipped ? 1 : -1; + const angleRad = tiltedRotation; + + // Swapped the mathematical operators to correctly realign with the game's slope physics + playerLayerItem.sprite.x -= Math.sin(angleRad) * ufoDistance * direction; + playerLayerItem.sprite.y += Math.cos(angleRad) * ufoDistance * direction; + } + // ------------------------------------- + const _shipCubeS = _miniS * 0.55; playerLayerItem.sprite.scaleY = this.p.gravityFlipped ? -_shipCubeS : _shipCubeS; playerLayerItem.sprite.scaleX = this.p.mirrored ? -_shipCubeS : _shipCubeS; } } - if (_ufoMode) { - const _ufoTilt = Math.max(-0.05, Math.min(0.05, -(this.p.y - this.p.lastY) * 0.008)); - for (const layer of this._birdLayers) { - if (layer) { - layer.sprite.rotation = this.p.mirrored ? -_ufoTilt : _ufoTilt; - } - } - for (const playerLayerItem of this._playerLayers) { - if (playerLayerItem) { - playerLayerItem.sprite.rotation = this.p.mirrored ? -_ufoTilt : _ufoTilt; - } - } - } } else { - for (const layer of this._spiderLayers) { - if (layer) { - layer.sprite.setVisible(false); - } - } - - for (const playerLayer of this._allLayers) { - if (playerLayer) { - playerLayer.sprite.x = _0x7f0705; - playerLayer.sprite.y = _0x1a433c; - const isBallLayer = this._ballLayers.includes(playerLayer); - playerLayer.sprite.rotation = isBallLayer ? playerRotation : (this.p.mirrored ? -playerRotation : playerRotation); - let _miniS = this.p.isMini ? 0.6 : 1; - if (this.p.isWave && this._waveLayers.includes(playerLayer)) { - _miniS *= 0.94; //fix wave size - } - playerLayer.sprite.scaleY = (this.p.gravityFlipped ? -_miniS : _miniS); - playerLayer.sprite.scaleX = (this.p.mirrored ? -_miniS : _miniS); - } - } - for (const layer of this._spiderLayers) { - if (layer) { - layer.sprite.setVisible(false); - } - } - for (const playerLayer of this._allLayers) { if (playerLayer) { - playerLayer.sprite.x = _0x7f0705; - playerLayer.sprite.y = _0x1a433c; - const isBallLayer = this._ballLayers.includes(playerLayer); - playerLayer.sprite.rotation = isBallLayer ? playerRotation : (this.p.mirrored ? -playerRotation : playerRotation); - let _miniS = this.p.isMini ? 0.6 : 1; - if (this.p.isWave && this._waveLayers.includes(playerLayer)) { - _miniS *= 0.94; //fix wave size - } - playerLayer.sprite.scaleY = (this.p.gravityFlipped ? -_miniS : _miniS); - playerLayer.sprite.scaleX = (this.p.mirrored ? -_miniS : _miniS); + playerLayer.sprite.x = _0x7f0705; + playerLayer.sprite.y = _0x1a433c; + const isBallLayer = this._ballLayers.includes(playerLayer); + const isRobotLayer = this._robotLayers.includes(playerLayer); + + if (!isRobotLayer) { + // This ensures your Cube and UFO rotate on slopes! + playerLayer.sprite.rotation = isBallLayer ? playerRotation : (this.p.mirrored ? -tiltedRotation : tiltedRotation); + } + + let _miniS = this.p.isMini ? 0.6 : 1; + if (this.p.isWave && this._waveLayers.includes(playerLayer)) { + _miniS *= 0.94; // fix wave size + } + + playerLayer.sprite.scaleY = (this.p.gravityFlipped && !this.p.isSwing) ? -_miniS : _miniS; + playerLayer.sprite.scaleX = (this.p.mirrored ? -_miniS : _miniS); } } } @@ -1744,31 +2007,25 @@ if (this.p.isFlying || this.p.isUfo) { this._waveSpriteLayer.sprite.x += 1.5 * _0x3f036a; this._waveSpriteLayer.sprite.y -= 1; } - if (this.p.isSpider && !this.p.isDead) { + // Animated spider/robot rigs (position/frame every part; override the generic + // _allLayers pass above). Hidden whenever not in their mode. + if (this.p.isSpider) { this.setCubeVisible(false); - this.setBallVisible(false); - this.setShipVisible(false); - this.setWaveVisible(false); - this.setBirdVisible(false); - this.setRobotVisible(false); this._syncSpiderAnimation(_0x7f0705, _0x1a433c, _0x3afedf); } else { this.setSpiderVisible(false); } - if (this.p.isRobot && !this.p.isDead) { + this._updateSpiderTeleportEffects(_0x3afedf); + if (this.p.isRobot) { this.setCubeVisible(false); - this.setBallVisible(false); - this.setShipVisible(false); - this.setWaveVisible(false); - this.setBirdVisible(false); - this.setSpiderVisible(false); this._syncRobotAnimation(_0x7f0705, _0x1a433c, _0x3afedf); this._updateRobotJumpFlame(_0x3afedf); } else { this.setRobotVisible(false); this._hideRobotJumpFlame(); } - this._updateSpiderTeleportEffects(_0x3afedf); + this._lastScreenX = _0x7f0705; + this._lastScreenY = _0x1a433c; this._updateParticles(cameraX, cameraY, _0x3afedf); this._updateDashAnimation(_0x3afedf * 1000); @@ -1792,13 +2049,14 @@ if (this.p.isFlying || this.p.isUfo) { if (this.p.isFlying) { return; } - this.exitSpiderMode(); - this.exitRobotMode(); this.exitBallMode(); + this.exitRobotMode(); this.exitWaveMode(); + this.exitSpiderMode(); + this.exitSwingMode(); this.p.isFlying = true; this._scene.toggleGlitter(true); - if (!fromCheckpoint){ // dont mess with y velocity if ur loading a checkpoint + if (!fromCheckpoint){ // hi web dasher this.p.yVelocity *= 0.5; } this.p.onGround = false; @@ -1859,103 +2117,205 @@ if (this.p.isFlying || this.p.isUfo) { if (this.p.isBall) { return; } + this.exitWaveMode(); + this.exitSpiderMode(); + this.exitSwingMode(); + this.p.isBall = true; + this.p.onGround = false; + this.p.canJump = false; + this.p.isJumping = false; + this.stopRotation(); + this._rotation = 0; + this.setCubeVisible(false); + this.setWaveVisible(false); + this.setBallVisible(true); + let _0x18df19 = this.p.y; + if (_0x36bb3d) { + _0x18df19 = _0x36bb3d.portalY !== undefined ? _0x36bb3d.portalY : _0x36bb3d.y; + } + this._gameLayer.setFlyMode(true, _0x18df19 + a, f - a * 2, true); + } + exitBallMode() { + if (!this.p.isBall) { + return; + } + this.p.isBall = false; + this.p.onGround = false; + this.p.canJump = false; + this.p.isJumping = false; + this.stopRotation(); + this._rotation = 0; + this.setBallVisible(false); + this.setWaveVisible(false); + this.setCubeVisible(true); + this._gameLayer.setFlyMode(false, 0); + } + enterWaveMode(_0x5a10cc = null) { + if (this.p.isWave) { + return; + } + this.exitShipMode(); + this.exitBallMode(); + this.exitRobotMode(); + this.exitSpiderMode(); + this.exitSwingMode(); + this.p.isWave = true; + this.p.yVelocity = 0; + this.p.onGround = false; + this.p.canJump = false; + this.p.isJumping = false; + this.stopRotation(); + this._rotation = 0; + this._streak.reset(); + this._streak.start(); + this._waveTrail.reset(); + this._waveTrail.start(); + this.setCubeVisible(false); + this.setBallVisible(false); + this.setShipVisible(false); + this.setWaveVisible(true); + let _0x38b484 = this.p.y; + if (_0x5a10cc) { + _0x38b484 = _0x5a10cc.portalY !== undefined ? _0x5a10cc.portalY : _0x5a10cc.y; + } + this._gameLayer.setFlyMode(true, _0x38b484, f, false); + } + exitWaveMode() { + if (!this.p.isWave) { + return; + } + this.p.isWave = false; + this.p.yVelocity = 0; + this.p.onGround = false; + this.p.canJump = false; + this.p.isJumping = false; + this.stopRotation(); + this._rotation = 0; + this._streak.stop(); + this._streak.reset(); + this._waveTrail.stop(); + this._waveTrail.reset(); + this.setWaveVisible(false); + this.setCubeVisible(!this.p.isBall && !this.p.isFlying); + this.setBallVisible(this.p.isBall); + this.setShipVisible(this.p.isFlying); + this.setSpiderVisible(false); + this._gameLayer.setFlyMode(false, 0); + } + enterRobotMode(portal = null, fromCheckpoint = false) { + if (this.p.isRobot) return; + this.exitShipMode(); + this.exitBallMode(); + this.exitWaveMode(); + this.exitUfoMode(); this.exitSpiderMode(); + this.exitSwingMode(); this.exitRobotMode(); - this.exitWaveMode(); - this.p.isBall = true; + this.p.isRobot = true; this.p.onGround = false; this.p.canJump = false; + this.p._robotHoldTimer = 0; this.p.isJumping = false; + this.p._robotHold = false; this.stopRotation(); this._rotation = 0; this.setCubeVisible(false); + this.setBallVisible(false); + this.setShipVisible(false); this.setWaveVisible(false); - this.setBallVisible(true); - let _0x18df19 = this.p.y; - if (_0x36bb3d) { - _0x18df19 = _0x36bb3d.portalY !== undefined ? _0x36bb3d.portalY : _0x36bb3d.y; - } - this._gameLayer.setFlyMode(true, _0x18df19, f - a * 2, false); + this.setBirdVisible(false); + this.setSpiderVisible(false); + this.setRobotVisible(true); + let _y = this.p.y; + if (portal) _y = portal.portalY !== undefined ? portal.portalY : portal.y; + + // init animated-rig state + this._robotAnimTimer = 0; + this._robotAnimState = "run"; + this._robotJumpFlameActive = false; + this._hideRobotJumpFlame(); + this._primeRobotAnimationFrame(1 / 30); } - exitBallMode() { - if (!this.p.isBall) { - return; - } - this.p.isBall = false; + + exitRobotMode() { + if (!this.p.isRobot) return; + this.p.isRobot = false; this.p.onGround = false; this.p.canJump = false; this.p.isJumping = false; + this.p._robotHold = false; + this.p._robotHoldTimer = 0; this.stopRotation(); this._rotation = 0; - this.setBallVisible(false); - this.setWaveVisible(false); + this.setRobotVisible(false); + this._robotJumpFlameActive = false; + this._hideRobotJumpFlame(); this.setCubeVisible(true); this._gameLayer.setFlyMode(false, 0); } - enterWaveMode(_0x5a10cc = null) { - if (this.p.isWave) { + enterSwingMode(_0x5a10cc = null) { + if (this.p.isSwing) { return; } - this.exitSpiderMode(); - this.exitRobotMode(); this.exitShipMode(); this.exitBallMode(); - this.p.isWave = true; - this.p.yVelocity = 0; + this.exitRobotMode(); + this.exitWaveMode(); + this.exitUfoMode(); + this.exitSpiderMode(); + this.p.isSwing = true; this.p.onGround = false; this.p.canJump = false; this.p.isJumping = false; this.stopRotation(); this._rotation = 0; - this._streak.reset(); - this._streak.start(); - this._waveTrail.reset(); - this._waveTrail.start(); this.setCubeVisible(false); this.setBallVisible(false); this.setShipVisible(false); - this.setWaveVisible(true); + this.setWaveVisible(false); + this.setBirdVisible(false); + this.setSpiderVisible(false); + this.setRobotVisible(false); + this.setSwingVisible(true); + this._streak.reset(); + this._streak.start(); let _0x38b484 = this.p.y; if (_0x5a10cc) { _0x38b484 = _0x5a10cc.portalY !== undefined ? _0x5a10cc.portalY : _0x5a10cc.y; } this._gameLayer.setFlyMode(true, _0x38b484, f, false); } - exitWaveMode() { - if (!this.p.isWave) { + exitSwingMode() { + if (!this.p.isSwing) { return; } - this.p.isWave = false; - this.p.yVelocity = 0; + this.p.isSwing = false; this.p.onGround = false; this.p.canJump = false; this.p.isJumping = false; this.stopRotation(); this._rotation = 0; + this.setSwingVisible(false); this._streak.stop(); this._streak.reset(); - this._waveTrail.stop(); - this._waveTrail.reset(); - this._hitboxTrail = []; - this.setWaveVisible(false); this.setCubeVisible(!this.p.isBall && !this.p.isFlying); this.setBallVisible(this.p.isBall); this.setShipVisible(this.p.isFlying); + this.setWaveVisible(this.p.isWave); + this.setBirdVisible(this.p.isUfo); this.setSpiderVisible(false); this._gameLayer.setFlyMode(false, 0); } enterSpiderMode(portal = null) { if (this.p.isSpider) return; this.exitShipMode(); - this.exitRobotMode(); this.exitBallMode(); + this.exitRobotMode(); this.exitWaveMode(); - const enteredFromPortal = !!portal; + this.exitSwingMode(); this.p.isSpider = true; - this.p.yVelocity = 0; - this.p.onGround = !enteredFromPortal; - this.p.onCeiling = !enteredFromPortal && !!this.p.gravityFlipped; - this.p.canJump = !enteredFromPortal; + this.p.onGround = false; + this.p.canJump = false; this.p.isJumping = false; this.p._spiderTeleportPending = false; this.p._spiderTeleportAnimTimer = 0; @@ -1971,16 +2331,12 @@ if (this.p.isFlying || this.p.isUfo) { this.setSpiderVisible(true); let _y = this.p.y; if (portal) _y = portal.portalY !== undefined ? portal.portalY : portal.y; - const spiderBlockSize = typeof a !== "undefined" ? a : 30; - const spiderBaseHeight = typeof f !== "undefined" ? f : 480; - const spiderFlyHeight = Math.max(spiderBlockSize, spiderBaseHeight - spiderBlockSize); - this._gameLayer.setFlyMode(true, _y, spiderFlyHeight, false, spiderFlyHeight); + this._gameLayer.setFlyMode(true, _y + a, f - a * 2, true); this._primeSpiderAnimationFrame(1 / 30); } exitSpiderMode() { if (!this.p.isSpider) return; this.p.isSpider = false; - this.p.yVelocity = 0; this.p.onGround = false; this.p.canJump = false; this.p.isJumping = false; @@ -1993,68 +2349,20 @@ if (this.p.isFlying || this.p.isUfo) { this.setSpiderVisible(false); if (this._spiderDashEffectSprite) this._spiderDashEffectSprite.setVisible(false); this._spiderDashEffectTimer = 0; - this._hideRobotJumpFlame(); - this._robotJumpFlameActive = false; - this._robotJumpFlamePulse = 0; - this._robotJumpFlameFadeInTimer = 0; this.setCubeVisible(true); this._gameLayer.setFlyMode(false, 0); } - enterRobotMode(portal = null) { - if (this.p.isRobot) return; - this.exitShipMode(); - this.exitBallMode(); - this.exitWaveMode(); - this.exitSpiderMode(); - this.exitUfoMode(); - const enteredFromPortal = !!portal; - this.p.isRobot = true; - this.p._robotHold = false; - this.p._robotHoldTimer = 0; - this.p.onGround = !enteredFromPortal; - this.p.onCeiling = !enteredFromPortal && !!this.p.gravityFlipped; - this.p.canJump = !enteredFromPortal; - this.p.isJumping = false; - this.stopRotation(); - this._rotation = 0; - this._robotAnimState = "run"; - this._robotAnimTimer = (this._robotAnimTimer || 0) + 0.12; - this.setCubeVisible(false); - this.setBallVisible(false); - this.setShipVisible(false); - this.setWaveVisible(false); - this.setSpiderVisible(false); - this.setBirdVisible(false); - this.setRobotVisible(true); - this._gameLayer.setFlyMode(false, 0); - this._primeRobotAnimationFrame(1 / 30); - } - exitRobotMode() { - if (!this.p.isRobot) return; - this.p.isRobot = false; - this.p._robotHold = false; - this.p._robotHoldTimer = 0; - this._robotJumpFlameActive = false; - this._hideRobotJumpFlame(); - this.p.onGround = false; - this.p.canJump = false; - this.p.isJumping = false; - this.stopRotation(); - this._rotation = 0; - this.setRobotVisible(false); - this.setCubeVisible(!this.p.isBall && !this.p.isFlying && !this.p.isWave && !this.p.isUfo && !this.p.isSpider); - this._gameLayer.setFlyMode(false, 0); - } enterUfoMode(_portal = null, fromCheckpoint = false) { if (this.p.isUfo) return; - this.exitSpiderMode(); - this.exitRobotMode(); this.exitBallMode(); + this.exitRobotMode(); this.exitWaveMode(); this.exitShipMode(); + this.exitSpiderMode(); + this.exitSwingMode(); this.p.isUfo = true; this._scene.toggleGlitter(true); - if (!fromCheckpoint){ // dont mess with y velocity if ur loading a checkpoint + if (!fromCheckpoint){ // random comment this.p.yVelocity *= 0.4; } this.p.onGround = false; @@ -2089,6 +2397,8 @@ if (this.p.isFlying || this.p.isUfo) { this.p.yVelocity *= 0.5; this.p.onGround = false; this.p.canJump = false; + this._streak.stop(); + this._streak.reset(); this.p.isJumping = false; this.stopRotation(); this._rotation = 0; @@ -2126,9 +2436,16 @@ if (this.p.isFlying || this.p.isUfo) { } } else if (this.p.isWave) { this._rotation = 0; + + } else if (this.p.isRobot) { + this._rotation = 0; + this.stopRotation(); + this.p._robotHold = false; + this.p._robotHoldTimer = 0; + this.p._robotGroundJump = false; } this.stopRotation(); - if (_0x4a38a5 && !this.p.isFlying && !this.p.isWave && !this.p.isSpider && !this._scene?._editorPlaytestActive) { + if (_0x4a38a5 && !this.p.isFlying && !this.p.isWave && !this.p.isSpider && !this.p.isSwing && !this._scene?._editorPlaytestActive) { this._landIdx = !this._landIdx; const _0x31584b = this._landIdx ? this._landEmitter1 : this._landEmitter2; const _0x2248d5 = this._scene._playerWorldX; @@ -2150,15 +2467,11 @@ if (this.p.isFlying || this.p.isUfo) { this._flyParticle2Active = false; this._shipDragEmitter.stop(); this._shipDragActive = false; + this._fireBoostSprite.setVisible(false); this._streak.stop(); this._streak.reset(); this._waveTrail.stop(); this._waveTrail.reset(); - this.setSpiderVisible(false); - if (this._spiderTeleportCircles?.length) { - for (const circle of this._spiderTeleportCircles) if (circle?.destroy) circle.destroy(); - this._spiderTeleportCircles = []; - } if (this._scene?._editorPlaytestActive) { this.setCubeVisible(false); @@ -2167,7 +2480,6 @@ if (this.p.isFlying || this.p.isUfo) { this.setWaveVisible(false); this.setBirdVisible(false); this.setSpiderVisible(false); - this.setRobotVisible(false); if (this._dashAnimationSprite) this._dashAnimationSprite.setVisible(false); return; } @@ -2235,7 +2547,7 @@ if (this.p.isFlying || this.p.isUfo) { this.setWaveVisible(false); this.setBirdVisible(false); this.setSpiderVisible(false); - this.setRobotVisible(false); + this.setSwingVisible(false); } _createExplosionPieces(_0x49be85, _0x13b56e, _0x349a09) { const _0x44acaf = this._scene; @@ -2248,7 +2560,7 @@ if (this.p.isFlying || this.p.isUfo) { height: sliderBar, add: false }); - const _0x5c571a = [this._playerGlowLayer, this._playerOverlayLayer, this._ballGlowLayer, this._ballOverlayLayer, this._waveGlowLayer, this._waveOverlayLayer, this._waveExtraLayer, this._shipGlowLayer, this._shipOverlayLayer, this._spiderGlowLayer, this._spiderOverlayLayer, this._robotGlowLayer, this._robotOverlayLayer, this._playerSpriteLayer, this._playerExtraLayer, this._ballSpriteLayer, this._waveSpriteLayer, this._shipSpriteLayer, this._shipExtraLayer, this._spiderSpriteLayer, this._spiderExtraLayer, this._robotSpriteLayer, this._robotExtraLayer, this._birdSpriteLayer, this._birdGlowLayer, this._birdOverlayLayer, this._birdExtraLayer, ...(this._robotLayers || [])]; + const _0x5c571a = [this._playerGlowLayer, this._playerOverlayLayer, this._ballGlowLayer, this._ballOverlayLayer, this._waveGlowLayer, this._waveOverlayLayer, this._waveExtraLayer, this._shipGlowLayer, this._shipOverlayLayer, this._playerSpriteLayer, this._playerExtraLayer, this._ballSpriteLayer, this._waveSpriteLayer, this._shipSpriteLayer, this._shipExtraLayer, this._birdSpriteLayer, this._birdGlowLayer, this._birdOverlayLayer, this._birdExtraLayer, this._robotHeadLayer, this._robotHeadOuterLayer, this._robotLegStemBackLayer, this._robotLegStemBackOuterLayer, this._robotThighBackLayer, this._robotFootBackLayer, this._robotLegStemFrontLayer, this._robotLegStemFrontOuterLayer, this._robotThighFrontLayer, this._robotFootFrontLayer, this._swingSpriteLayer, this._swingOverlayLayer, this._swingExtraLayer]; for (const _0x1f09e3 of _0x5c571a) { if (!_0x1f09e3) { continue; @@ -2437,217 +2749,28 @@ if (this.p.isFlying || this.p.isUfo) { } this._explosionPieces = null; } - _getPortalShineFrames(portalCollider, type = 1) { - const portalType = portalCollider?.type; - - if (portalType === speedType || portalType === "speed") { - const speedShineMap = { - 200: "boost_01_shine_001.png", - 201: "boost_02_shine_001.png", - 202: "boost_03_shine_001.png", - 203: "boost_04_shine_001.png", - 1334: "boost_05_shine_001.png" - }; - const speedFrame = speedShineMap[portalCollider?.speedId] || "boost_02_shine_001.png"; - return [{ frame: speedFrame, container: this._gameLayer.topContainer }]; - } - - const portalShineMap = { - portal_mirror_on: "03", - portal_mirror_off: "03", - portal_mini_on: "04", - portal_mini_off: "04", - portal_dual_on: "05", - portal_dual_off: "05" - }; - - const typeStr = portalShineMap[portalType] || ((type === 1) ? "02" : "01"); - return [ - { frame: `portalshine_${typeStr}_front_001.png`, container: this._gameLayer.topContainer }, - { frame: `portalshine_${typeStr}_back_001.png`, container: this._gameLayer.container } - ]; - } - - _getPortalShineAtlasFrameData(scene, frameName) { - if (!scene?.textures) return null; - - const requestedSheet = "GJ_GameSheet04"; - if (scene.textures.exists(requestedSheet)) { - const texture = scene.textures.get(requestedSheet); - const frameData = texture?.get?.(frameName); - if (frameData && frameData.name !== "__MISSING") { - return { - atlasFrame: { atlas: requestedSheet, frame: frameName }, - atlasTexture: texture, - frameData - }; - } - } - - if (typeof getAtlasFrame !== "function") return null; - const atlasFrame = getAtlasFrame(scene, frameName); - if (!atlasFrame) return null; - const atlasTexture = scene.textures.get(atlasFrame.atlas); - const frameData = atlasTexture?.get?.(atlasFrame.frame); - if (!atlasTexture || !frameData || frameData.name === "__MISSING") return null; - return { atlasFrame, atlasTexture, frameData }; - } - - _readPortalShineFrameRect(frameData, packedMeta = {}) { - const customData = frameData?.customData || {}; - const frameRect = customData.frame || packedMeta.frame || {}; - const sourceSize = customData.sourceSize || packedMeta.sourceSize || {}; - const spriteSourceSize = customData.spriteSourceSize || packedMeta.spriteSourceSize || {}; - - const frameX = Number(frameRect.x ?? frameData?.cutX ?? frameData?.x ?? 0) || 0; - const frameY = Number(frameRect.y ?? frameData?.cutY ?? frameData?.y ?? 0) || 0; - const frameW = Number(frameRect.w ?? frameRect.width ?? frameData?.realWidth ?? frameData?.width ?? frameData?.cutWidth ?? 0) || 0; - const frameH = Number(frameRect.h ?? frameRect.height ?? frameData?.realHeight ?? frameData?.height ?? frameData?.cutHeight ?? 0) || 0; - - const drawW = Number(spriteSourceSize.w ?? spriteSourceSize.width ?? frameW) || frameW; - const drawH = Number(spriteSourceSize.h ?? spriteSourceSize.height ?? frameH) || frameH; - const drawX = Number(spriteSourceSize.x ?? 0) || 0; - const drawY = Number(spriteSourceSize.y ?? 0) || 0; - const sourceW = Number(sourceSize.w ?? sourceSize.width ?? frameData?.realWidth ?? (drawX + drawW)) || (drawX + drawW); - const sourceH = Number(sourceSize.h ?? sourceSize.height ?? frameData?.realHeight ?? (drawY + drawH)) || (drawY + drawH); - - return { frameX, frameY, frameW, frameH, drawX, drawY, drawW, drawH, sourceW, sourceH }; - } - - _getPortalShinePackedFrameMeta(frameName) { - const shineAtlasMeta = { - "boost_01_shine_001.png": { rotated: false, frame: { x: 910, y: 1038, w: 64, h: 82 }, sourceSize: { w: 64, h: 82 }, spriteSourceSize: { x: 0, y: 0, w: 64, h: 82 } }, - "boost_02_shine_001.png": { rotated: true, frame: { x: 325, y: 1083, w: 61, h: 108 }, sourceSize: { w: 61, h: 108 }, spriteSourceSize: { x: 0, y: 0, w: 61, h: 108 } }, - "boost_03_shine_001.png": { rotated: true, frame: { x: 801, y: 1052, w: 96, h: 108 }, sourceSize: { w: 96, h: 108 }, spriteSourceSize: { x: 0, y: 0, w: 96, h: 108 } }, - "boost_04_shine_001.png": { rotated: true, frame: { x: 332, y: 957, w: 125, h: 108 }, sourceSize: { w: 125, h: 108 }, spriteSourceSize: { x: 0, y: 0, w: 125, h: 108 } }, - "boost_05_shine_001.png": { rotated: true, frame: { x: 937, y: 742, w: 128, h: 103 }, sourceSize: { w: 128, h: 103 }, spriteSourceSize: { x: 0, y: 0, w: 128, h: 103 } }, - "portalshine_03_front_001.png": { rotated: true, frame: { x: 971, y: 1, w: 72, h: 178 }, sourceSize: { w: 88, h: 178 }, spriteSourceSize: { x: 16, y: 0, w: 72, h: 178 } }, - "portalshine_04_front_001.png": { rotated: true, frame: { x: 1, y: 1092, w: 40, h: 174 }, sourceSize: { w: 50, h: 174 }, spriteSourceSize: { x: 10, y: 0, w: 40, h: 174 } }, - "portalshine_05_front_001.png": { rotated: true, frame: { x: 176, y: 1069, w: 66, h: 148 }, sourceSize: { w: 66, h: 148 }, spriteSourceSize: { x: 0, y: 0, w: 66, h: 148 } } - }; - return shineAtlasMeta[frameName] || null; - } - - _getCorrectedPortalShineTextureKey(scene, frameName) { - const data = this._getPortalShineAtlasFrameData(scene, frameName); - if (!data) return null; - - const { atlasFrame, atlasTexture, frameData } = data; - const customData = frameData.customData || {}; - const packedMeta = this._getPortalShinePackedFrameMeta(frameName) || {}; - const frameRect = this._readPortalShineFrameRect(frameData, packedMeta); - const isRotated = !!(frameData.rotated || customData.rotated || packedMeta.rotated); - const hasTrim = frameRect.sourceW !== frameRect.drawW || frameRect.sourceH !== frameRect.drawH || frameRect.drawX !== 0 || frameRect.drawY !== 0; - - if (!isRotated && !hasTrim) return null; - - const fixedKey = `__portal_shine_fixed_${String(atlasFrame.atlas)}_${String(frameName).replace(/[^a-zA-Z0-9_]/g, "_")}`; - if (scene.textures.exists(fixedKey)) return fixedKey; - - const sourceImage = - (typeof atlasTexture.getSourceImage === "function" ? atlasTexture.getSourceImage() : null) || - atlasTexture.source?.[0]?.image || - atlasTexture.source?.[0]?.source; - if (!sourceImage) return null; - - const outW = Math.max(1, Math.ceil(frameRect.sourceW)); - const outH = Math.max(1, Math.ceil(frameRect.sourceH)); - const canvasTexture = scene.textures.createCanvas(fixedKey, outW, outH); - if (!canvasTexture) return null; - - const canvas = canvasTexture.getCanvas(); - const ctx = canvas?.getContext?.("2d"); - if (!ctx || frameRect.frameW <= 0 || frameRect.frameH <= 0 || frameRect.drawW <= 0 || frameRect.drawH <= 0) { - scene.textures.remove(fixedKey); - return null; - } - - ctx.clearRect(0, 0, outW, outH); - if (isRotated) { - const frameRectUsesRotatedSize = - Math.abs(frameRect.frameW - frameRect.drawH) < 0.5 && - Math.abs(frameRect.frameH - frameRect.drawW) < 0.5; - const packedW = frameRectUsesRotatedSize ? frameRect.frameW : frameRect.frameH; - const packedH = frameRectUsesRotatedSize ? frameRect.frameH : frameRect.frameW; - ctx.save(); - ctx.translate(frameRect.drawX + frameRect.drawW / 2, frameRect.drawY + frameRect.drawH / 2); - ctx.rotate(-Math.PI / 2); - ctx.drawImage( - sourceImage, - frameRect.frameX, - frameRect.frameY, - packedW, - packedH, - -frameRect.drawH / 2, - -frameRect.drawW / 2, - frameRect.drawH, - frameRect.drawW - ); - ctx.restore(); - } else { - ctx.drawImage( - sourceImage, - frameRect.frameX, - frameRect.frameY, - frameRect.frameW, - frameRect.frameH, - frameRect.drawX, - frameRect.drawY, - frameRect.drawW, - frameRect.drawH - ); - } - - canvasTexture.refresh(); - return fixedKey; - } - - _createPortalShineSprite(scene, x, y, frameName, rotationDegrees = 0) { - const correctedTextureKey = this._getCorrectedPortalShineTextureKey(scene, frameName); - if (correctedTextureKey) { - return scene.add.image(x, y, correctedTextureKey).setAngle(rotationDegrees || 0); - } - - let shineSprite = null; - const data = this._getPortalShineAtlasFrameData(scene, frameName); - if (data) { - shineSprite = scene.add.image(x, y, data.atlasFrame.atlas, data.atlasFrame.frame); - } else if (typeof addImageToScene === "function") { - shineSprite = addImageToScene(scene, x, y, frameName); - } - - if (!shineSprite) return null; - - const visualPropsObject = { - rot: rotationDegrees || 0, - flipX: false, - flipY: false, - scale: 1 - }; - - if (this._gameLayer && typeof this._gameLayer._applyVisualProps === "function") { - this._gameLayer._applyVisualProps(scene, shineSprite, frameName, visualPropsObject); - } else { - shineSprite.setAngle(rotationDegrees || 0); - } - - return shineSprite; - } - _playPortalShine(_0x49e81f, type = 1) { const _0x4ed8ff = this._scene; const _0xf31b0d = _0x49e81f.x; const _0x3824c0 = b(_0x49e81f.portalY); - const shineFrames = this._getPortalShineFrames(_0x49e81f, type); - for (const shineDef of shineFrames) { - const pieceSize = this._createPortalShineSprite(_0x4ed8ff, _0xf31b0d, _0x3824c0, shineDef.frame, _0x49e81f.rotationDegrees); - if (!pieceSize) { + const typeStr = (type === 1) ? "02" : "01"; + const _0x19c6b0 = [ + `portalshine_${typeStr}_front_001.png`, + `portalshine_${typeStr}_back_001.png` + ]; + + const _0x5d636a = [this._gameLayer.topContainer, this._gameLayer.container]; + for (let _0x34fd8c = 0; _0x34fd8c < 2; _0x34fd8c++) { + const _0x4bfe30 = getAtlasFrame(_0x4ed8ff, _0x19c6b0[_0x34fd8c]); + if (!_0x4bfe30) { continue; } + const pieceSize = _0x4ed8ff.add.image(_0xf31b0d, _0x3824c0, _0x4bfe30.atlas, _0x4bfe30.frame); pieceSize.setBlendMode(S); pieceSize.setAlpha(0); - shineDef.container.add(pieceSize); + pieceSize.angle = _0x49e81f.rotationDegrees; + _0x5d636a[_0x34fd8c].add(pieceSize); _0x4ed8ff.tweens.add({ targets: pieceSize, alpha: { @@ -2666,6 +2789,61 @@ if (this.p.isFlying || this.p.isUfo) { }); } } + + // teleport portals + _findTeleportOut(fromPortal) { + // blue tp portal shares same X with orange + const sections = this._gameLayer && this._gameLayer._collisionSections; + if (!sections) { + return null; + } + + const SECTION_SIZE = 400; + const startSec = Math.max(0, Math.floor(fromPortal.x / SECTION_SIZE)); + const endSec = sections.length - 1; + + let bestOut = null; + let bestDist = Infinity; + + for (let si = startSec; si <= endSec; si++) { + const sec = sections[si]; + if (!sec) continue; + for (const obj of sec) { + if ((obj.type === "portal_teleport_out" || obj.sub === "teleport_out") && + obj !== fromPortal) { + const dist = obj.x - fromPortal.x; + const xDiff = Math.abs(obj.x - fromPortal.x); + + if (xDiff < 200 && dist >= 0 && dist < bestDist) { + bestDist = dist; + bestOut = obj; + } + } + } + } + + return bestOut; + } + + _teleportPlayer(toPortal) { + // only change Y pos, not X + const targetY = toPortal.portalY !== undefined ? toPortal.portalY : toPortal.y; + + this.p.y = targetY; + this.p.lastY = targetY; + this.p.lastGroundPosY = targetY; + + // reducing velocity after you teleport + this.p.vy *= 0.8; + this.p.yVelocity *= 0.8; + + this.p.onGround = false; + this.p.canJump = false; + this.p.isJumping = false; + + this._playPortalShine(toPortal, 1); + } + _checkSnapJump(_0x1f801b) { const _0x483058 = [{ dx: 240, @@ -2709,6 +2887,49 @@ if (this.p.isFlying || this.p.isUfo) { return this.p.yVelocity < -0.25; } } + _shouldPrioritizeGroundOrbInput() { + if (!(this.p.isBall || this.p.isSpider)) return false; + if (!this.p.upKeyPressed) return false; + if (!(this.p.canJump || this.p.onGround || this.p.onCeiling)) return false; + + const playerWorldX = this._scene?._playerWorldX ?? centerX; + const playerSize = this.p.isMini ? 18 : 30; + const nearbyObjects = this._gameLayer?.getNearbySectionObjects?.(playerWorldX) || []; + + for (const gameObj of nearbyObjects) { + if (!gameObj || gameObj.type !== jumpRingType || gameObj.activated) continue; + + const hasCircleHitbox = gameObj.hitbox_radius !== undefined && gameObj.hitbox_radius !== null; + if (hasCircleHitbox) { + const dx = playerWorldX - gameObj.x; + const dy = this.p.y - gameObj.y; + const hitRadius = gameObj.hitbox_radius + playerSize; + if ((dx * dx + dy * dy) <= hitRadius * hitRadius) { + return true; + } + continue; + } + + const rad = (gameObj.rotationDegrees || 0) * Math.PI / 180; + const cos = Math.cos(rad); + const sin = Math.sin(rad); + const halfW = gameObj.w / 2; + const halfH = gameObj.h / 2; + const rotatedHalfWidth = Math.abs(halfW * cos) + Math.abs(halfH * sin); + const rotatedHalfHeight = Math.abs(halfW * sin) + Math.abs(halfH * cos); + const left = gameObj.x - rotatedHalfWidth; + const right = gameObj.x + rotatedHalfWidth; + const top = gameObj.y - rotatedHalfHeight; + const bottom = gameObj.y + rotatedHalfHeight; + + if (!(playerWorldX + playerSize <= left) && !(playerWorldX - playerSize >= right) && + !(this.p.y + playerSize <= top) && !(this.p.y - playerSize >= bottom)) { + return true; + } + } + + return false; + } flipMod() { if (this.p.gravityFlipped) { return -1; @@ -2716,6 +2937,17 @@ if (this.p.isFlying || this.p.isUfo) { return 1; } } + _padMatchesGravity(gameObj) { + const rad = (gameObj.rotationDegrees || 0) * Math.PI / 180; + const baseUpY = gameObj.flipY ? 1 : -1; + const rotatedUpY = baseUpY * Math.cos(rad); + if (rotatedUpY > 0.01) { + return this.p.gravityFlipped; + } else if (rotatedUpY < -0.01) { + return !this.p.gravityFlipped; + } + return true; + } flipGravity(flipped, _0x11bbde = 0.5) { if (this.p.gravityFlipped === flipped) { return; @@ -2724,8 +2956,19 @@ if (this.p.isFlying || this.p.isUfo) { this.p.yVelocity *= _0x11bbde; this.p.onGround = false; this.p.canJump = false; + if (this.p.isRobot) { + this.runRotateAction(); + } } runRotateAction() { + // Robot has its own per-part flip (position/scale) driven by gravityFlipped in + // applyRobotAnimationFrame, and its slope lean comes from _visualTilt/_slopeGroundAngle. + // The cube-style 180deg spin this function performs isn't used by the robot rig and + // was causing double-flips (spin + mirror) on gravity toggles, orbs and pads. + if (this.p.isRobot) { + this.rotateActionActive = false; + return; + } this.rotateActionActive = true; this.rotateActionTime = 0; const _miniDurScale = this.p.isMini ? (1 / 1.4) : 1; @@ -2784,7 +3027,7 @@ if (this.p.isFlying || this.p.isUfo) { return out + out; } updateGroundRotation(_0x5c24f7) { - if (this.p.isBall || this.p.isWave || this.p.isSpider || this.p.isRobot) { + if (this.p.isBall || this.p.isWave || this.p.isSpider || this.p.isRobot || this.p.isSwing) { return; } let _0x183c2a = this.convertToClosestRotation(); @@ -2838,11 +3081,14 @@ if (this.p.isFlying || this.p.isUfo) { this._updateBallJump(_0x3d1c6f); } else if (this.p.isUfo) { this._updateUfoJump(_0x3d1c6f); - } else if (this.p.isSpider) { - this._updateSpiderJump(_0x3d1c6f); - } else if (this.p.isRobot) { - this._updateRobotJump(_0x3d1c6f); - } else if (this.p.upKeyDown && this.p.canJump) { + } else if (this.p.isSpider) { + this._updateSpiderJump(_0x3d1c6f); + } else if (this.p.isRobot) { + this._updateRobotJump(_0x3d1c6f); + } else if (this.p.isSwing) { + this._updateSwingJump(_0x3d1c6f); + this.updateSwingRotation(_0x3d1c6f); + } else if (this.p.upKeyDown && this.p.canJump) { this.p.isJumping = true; this.p.onGround = false; this.p.canJump = false; @@ -2878,49 +3124,6 @@ if (this.p.isFlying || this.p.isUfo) { } } } - _shouldPrioritizeGroundOrbInput() { - if (!(this.p.isBall || this.p.isSpider)) return false; - if (!this.p.upKeyPressed) return false; - if (!(this.p.canJump || this.p.onGround || this.p.onCeiling)) return false; - - const playerWorldX = this._scene?._playerWorldX ?? centerX; - const playerSize = this.p.isMini ? 18 : 30; - const nearbyObjects = this._gameLayer?.getNearbySectionObjects?.(playerWorldX) || []; - - for (const gameObj of nearbyObjects) { - if (!gameObj || gameObj.type !== jumpRingType || gameObj.activated) continue; - - const hasCircleHitbox = gameObj.hitbox_radius !== undefined && gameObj.hitbox_radius !== null; - if (hasCircleHitbox) { - const dx = playerWorldX - gameObj.x; - const dy = this.p.y - gameObj.y; - const hitRadius = gameObj.hitbox_radius + playerSize; - if ((dx * dx + dy * dy) <= hitRadius * hitRadius) { - return true; - } - continue; - } - - const rad = (gameObj.rotationDegrees || 0) * Math.PI / 180; - const cos = Math.cos(rad); - const sin = Math.sin(rad); - const halfW = gameObj.w / 2; - const halfH = gameObj.h / 2; - const rotatedHalfWidth = Math.abs(halfW * cos) + Math.abs(halfH * sin); - const rotatedHalfHeight = Math.abs(halfW * sin) + Math.abs(halfH * cos); - const left = gameObj.x - rotatedHalfWidth; - const right = gameObj.x + rotatedHalfWidth; - const top = gameObj.y - rotatedHalfHeight; - const bottom = gameObj.y + rotatedHalfHeight; - - if (!(playerWorldX + playerSize <= left) && !(playerWorldX - playerSize >= right) && - !(this.p.y + playerSize <= top) && !(this.p.y - playerSize >= bottom)) { - return true; - } - } - - return false; - } _updateFlyJump(_0x130c46) { const _shipMiniScale = this.p.isMini ? 1.176470588 : 1; let _0x203040 = 0.8; @@ -3005,82 +3208,6 @@ _updateWaveJump() { const _waveAngle = this.p.isMini ? Math.atan(0.5) : Math.PI / 4; this._rotation = _0x312a7f === 0 ? 0 : _0x312a7f > 0 ? -_waveAngle : _waveAngle; } - _updateRobotJump(dt) { - const dtSec = dt > 1 ? dt / 1000 : dt; - - const robotMiniJumpScale = this.p.isMini ? (1 / 1.2) : 1; - const robotJumpInit = 10.25 * robotMiniJumpScale; - const robotHoldMax = 15.5; - const robotHoldForce = p * 0.2 * robotMiniJumpScale; - const robotGravityHold = p * 0.15; - const robotGravityFall = p * 0.81; - const robotReleaseCut = 0.9; - const robotReleaseMinTime = 0; - const robotMaxFall = 28; - const robotMaxRise = 30 * robotMiniJumpScale; - - if (this.p.upKeyPressed && this.p.canJump) { - this.p.upKeyPressed = false; - this.p.isJumping = true; - this.p.onGround = false; - this.p.canJump = false; - this.p.queuedHold = false; - this.p.yVelocity = this.flipMod() * robotJumpInit; - this.p._robotHold = true; - this.p._robotHoldTimer = 0; - this._robotJumpFlameActive = true; - this._robotJumpFlamePulse = 0; - this._robotJumpFlameFadeInTimer = 0; - return; - } - - if (this.p.isJumping) { - if (this.p._robotHold) { - this.p._robotHoldTimer += dtSec; - - if (this.p._robotHoldTimer >= robotHoldMax || !this.p.upKeyDown) { - this.p._robotHold = false; - - const goingUp = this.p.gravityFlipped - ? this.p.yVelocity < 0 - : this.p.yVelocity > 0; - - if (goingUp && this.p._robotHoldTimer > robotReleaseMinTime) { - this.p.yVelocity *= robotReleaseCut; - } - } else { - this.p.yVelocity += this.flipMod() * robotHoldForce * dtSec; - } - } - - if (this.p._robotHold) { - this.p.yVelocity -= robotGravityHold * dtSec * this.flipMod(); - } else { - this.p.yVelocity -= robotGravityFall * dtSec * this.flipMod(); - } - - if (this.playerIsFalling()) { - this.p.isJumping = false; - this.p._robotHold = false; - this._robotJumpFlameActive = false; - } - } else { - this.p.yVelocity -= robotGravityFall * dtSec * this.flipMod(); - } - - if (this.p.gravityFlipped) { - this.p.yVelocity = Math.min(this.p.yVelocity, robotMaxRise); - this.p.yVelocity = Math.max(this.p.yVelocity, -robotMaxFall); - } else { - this.p.yVelocity = Math.max(this.p.yVelocity, -robotMaxRise); - this.p.yVelocity = Math.min(this.p.yVelocity, robotMaxFall); - } - - if (this.playerIsFalling()) { - this.p.canJump = false; - this._robotJumpFlameActive = false; - } - } _updateUfoJump(_dt) { const _ufoJump = this.p.isMini ? 13.296 : 13.742; const _ufoThreshold = 3.832796; @@ -3240,6 +3367,9 @@ _updateWaveJump() { if (blockingHazard && !window.noClip) { const hazardCenterY = (blockingHazard.bounds.lower + blockingHazard.bounds.upper) / 2; this.p.y = Number.isFinite(hazardCenterY) ? hazardCenterY : normalLandingY; + // prevent huge position jumps from breaking collision system + this.p.lastY = this.p.y; + this.p.lastGroundPosY = this.p.y; this._spawnSpiderTeleportEffects(oldSpiderTeleportY, this.p.y); this.p.yVelocity = 0; this.p.onGround = false; @@ -3261,6 +3391,9 @@ _updateWaveJump() { this.p._spiderTeleportNoclipDeathPending = true; this.p.diedThisFrame = true; } + // prevent huge position jumps from breaking collision system + this.p.lastY = this.p.y; + this.p.lastGroundPosY = this.p.y; this._spawnSpiderTeleportEffects(oldSpiderTeleportY, this.p.y); this.p.yVelocity = 0; this.p.onGround = true; @@ -3302,6 +3435,124 @@ _updateWaveJump() { } } } +_updateRobotJump(dt) { + const dtSec = dt > 1 ? dt / 1000 : dt + + const robotJumpInit = 10.25 + const robotHoldMax = 15.8 + const robotHoldForce = p * 0.2 + const robotGravityHold = p * 0.15 + const robotGravityFall = p * 0.81 + const robotReleaseCut = 0.9 + const robotReleaseMinTime = 0 + const robotMaxFall = 28 + const robotMaxRise = 30 + + if (this.p.upKeyPressed && this.p.canJump) { + this.p.upKeyPressed = false + this.p.isJumping = true + this.p.onGround = false + this.p.canJump = false + this.p.queuedHold = false + this.p.yVelocity = this.flipMod() * robotJumpInit + this.p._robotHold = true + this.p._robotHoldTimer = 0 + this.p._robotGroundJump = true + this._robotJumpFlameActive = true + this._robotJumpFlamePulse = 0 + this._robotJumpFlameFadeInTimer = 0 + return + } + + if (this.p.isJumping) { + if (this.p._robotHold) { + this.p._robotHoldTimer += dtSec + + if (this.p._robotHoldTimer >= robotHoldMax || !this.p.upKeyDown) { + this.p._robotHold = false + + const goingUp = this.p.gravityFlipped + ? this.p.yVelocity < 0 + : this.p.yVelocity > 0 + + if (goingUp && this.p._robotHoldTimer > robotReleaseMinTime) { + this.p.yVelocity *= robotReleaseCut + } + } else { + this.p.yVelocity += this.flipMod() * robotHoldForce * dtSec + } + } + + if (this.p._robotHold) { + this.p.yVelocity -= robotGravityHold * dtSec * this.flipMod() + } else { + this.p.yVelocity -= robotGravityFall * dtSec * this.flipMod() + } + + if (this.playerIsFalling()) { + this.p.isJumping = false + this.p._robotHold = false + } + } else { + this.p.yVelocity -= robotGravityFall * dtSec * this.flipMod() + } + + if (this.p.gravityFlipped) { + this.p.yVelocity = Math.min(this.p.yVelocity, robotMaxRise) + this.p.yVelocity = Math.max(this.p.yVelocity, -robotMaxFall) + } else { + this.p.yVelocity = Math.max(this.p.yVelocity, -robotMaxRise) + this.p.yVelocity = Math.min(this.p.yVelocity, robotMaxFall) + } + + if (this.playerIsFalling()) { + this.p.canJump = false + } +} + _updateSwingJump(_0x2fe319) { + const _swingGrav = p * 0.4; + const _swingCap = 13; + if (this.p.upKeyPressed) { + this.p.upKeyPressed = false; + this.p.queuedHold = false; + this.flipGravity(!this.p.gravityFlipped, 1.0); + this.p.onGround = false; + this.p.canJump = false; + this.p.isJumping = false; + return; + } + if (this.playerIsFalling()) { + this.p.canJump = false; + } + this.p.yVelocity -= _swingGrav * _0x2fe319 * this.flipMod(); + if (this.p.isJumping) { + if (this.playerIsFalling()) { + this.p.isJumping = false; + this.p.onGround = false; + } + } else { + if (this.p.gravityFlipped) { + this.p.yVelocity = Math.min(this.p.yVelocity, _swingCap); + } else { + this.p.yVelocity = Math.max(this.p.yVelocity, -_swingCap); + } + } + if (this.playerIsFalling()) { + const _fallingHard = this.p.gravityFlipped ? this.p.yVelocity > p * 2 : this.p.yVelocity < -(p * 2); + if (_fallingHard) { + this.p.onGround = false; + } + } + } + updateSwingRotation(_0x217ad3) { + const _0x58cb3a = 10.3860036; + const _0x5e6a2b = Math.atan2(-this.p.yVelocity, _0x58cb3a); + const _0x2371ed = 0.15; + const _0x1857d4 = Math.min(_0x217ad3 * 1, _0x2371ed * _0x217ad3); + this._rotation = this.slerp2D(this._rotation, _0x5e6a2b, _0x1857d4); + } + + checkCollisions(_0x2f5078) { this.noclipStats.totalFrames++; this.p.diedThisFrame = false; @@ -3314,13 +3565,14 @@ _updateWaveJump() { const pieceWidth = _0x2f5078 + centerX; const playersY = this.p.y; const playersLastY = this.p.lastY; - const gamemodeAddition = this.p.isFlying || this.p.isWave || this.p.isUfo ? 12 : 20; + const gamemodeAddition = this.p.isFlying || this.p.isWave || this.p.isUfo || this.p.isSwing ? 12 : 20; this.p.collideTop = 0; this.p.collideBottom = 0; this.p.onCeiling = false; this.p.touchingRing = false; let _0x30410f = false; let _boostedThisStep = false; + this._slopeGroundAngle = null; const _0x198534 = this._gameLayer.getNearbySectionObjects(pieceWidth); for (let gameObj of _0x198534) { let left = gameObj.x - gameObj.w / 2; @@ -3358,57 +3610,75 @@ _updateWaveJump() { if (!gameObj.activated) { gameObj.activated = true; this._playPortalShine(gameObj); - this.exitRobotMode(); this.exitBallMode(); + this.exitRobotMode(); this.exitWaveMode(); this.exitShipMode(); this.exitUfoMode(); + this.exitSwingMode(); this.enterShipMode(gameObj); } } else if (_colType === portalWaveType) { if (!gameObj.activated) { gameObj.activated = true; this._playPortalShine(gameObj); - this.exitRobotMode(); this.exitBallMode(); + this.exitRobotMode(); this.exitShipMode(); this.exitWaveMode(); this.exitUfoMode(); + this.exitSwingMode(); this.enterWaveMode(gameObj); } } else if (_colType === portalUfoType) { if (!gameObj.activated) { gameObj.activated = true; this._playPortalShine(gameObj); - this.exitRobotMode(); this.exitBallMode(); + this.exitRobotMode(); this.exitWaveMode(); this.exitShipMode(); + this.exitSwingMode(); this.enterUfoMode(gameObj); } } else if (_colType === "portal_cube") { if (!gameObj.activated) { gameObj.activated = true; this._playPortalShine(gameObj); - this.exitSpiderMode(); - this.exitRobotMode(); this.exitShipMode(); this.exitBallMode(); + this.exitRobotMode(); this.exitWaveMode(); this.exitUfoMode(); + this.exitSpiderMode(); + this.exitSwingMode(); } } else if (_colType === "portal_ball") { if (!gameObj.activated) { gameObj.activated = true; this._playPortalShine(gameObj); - this.exitRobotMode(); this.exitShipMode(); this.exitWaveMode(); this.exitUfoMode(); this.exitBallMode(); + this.exitRobotMode(); + this.exitSwingMode(); this.enterBallMode(gameObj); } - } else if (_colType === "portal_robot") { + } else if (_colType === "portal_spider") { + if (!gameObj.activated) { + gameObj.activated = true; + this._playPortalShine(gameObj); + this.exitShipMode(); + this.exitBallMode(); + this.exitRobotMode(); + this.exitWaveMode(); + this.exitUfoMode(); + this.exitSpiderMode(); + this.exitSwingMode(); + this.enterSpiderMode(gameObj); + } + } else if (_colType === "portal_robot" || gameObj.sub === "robot") { if (!gameObj.activated) { gameObj.activated = true; this._playPortalShine(gameObj); @@ -3417,20 +3687,35 @@ _updateWaveJump() { this.exitWaveMode(); this.exitUfoMode(); this.exitSpiderMode(); + this.exitSwingMode(); this.exitRobotMode(); this.enterRobotMode(gameObj); } - } else if (_colType === "portal_spider") { + } else if (_colType === "portal_swing" || gameObj.sub === "swing") { if (!gameObj.activated) { gameObj.activated = true; this._playPortalShine(gameObj); this.exitShipMode(); - this.exitRobotMode(); this.exitBallMode(); this.exitWaveMode(); this.exitUfoMode(); this.exitSpiderMode(); - this.enterSpiderMode(gameObj); + this.exitRobotMode(); + this.exitSwingMode(); + this.enterSwingMode(gameObj); + } + } else if (_colType === "portal_teleport_in" || gameObj.sub === "teleport_in") { + if (!gameObj.activated) { + gameObj.activated = true; + this._playPortalShine(gameObj); + const teleportOut = this._findTeleportOut(gameObj); + if (teleportOut) { + this._teleportPlayer(teleportOut); + } + } + } else if (_colType === "portal_teleport_out" || gameObj.sub === "teleport_out") { + if (!gameObj.activated) { + gameObj.activated = true; } } else if (_colType === "portal_gravity_down") { if (!gameObj.activated) { @@ -3500,8 +3785,11 @@ _updateWaveJump() { } } else if (_colType === jumpPadType) { if (!gameObj.activated) { - gameObj.activated = true; const _padId = gameObj.padId; + if (_padId === 67 && !this._padMatchesGravity(gameObj)) { + continue; + } + gameObj.activated = true; if (_padId === 67) { const now = Date.now(); if (!window.lastbluepad) { @@ -3542,7 +3830,7 @@ _updateWaveJump() { else if (_padId === 140) { _padVel = this.p.isMini ? 10.237037 : 12.8; } else if (_padId === 1332) { _padVel = this.p.isMini ? 25.6 : 16; } else if (_padId === 67) { _padVel = this.p.isMini ? 20.48 : 25.6; _padFlip = true; } - } else if (this.p.isBall || this.p.isSpider) { + } else if (this.p.isBall) { if (_padId === 35) { _padVel = 9.6 * _grav; } else if (_padId === 140) { _padVel = 6.72 * _grav; } else if (_padId === 1332) { _padVel = 12 * _grav; } @@ -3550,6 +3838,14 @@ _updateWaveJump() { if (this.p.isMini) { _padVel *= 0.8; } + } else if (this.p.isSpider) { + if (_padId === 35) { _padVel = 9.7 * _grav; } + else if (_padId === 140) { _padVel = 6.82 * _grav; } + else if (_padId === 1332) { _padVel = 12.1 * _grav; } + else if (_padId === 67) { _padVel = 10.1 * _grav; _padFlip = true; } + if (this.p.isMini) { + _padVel *= 0.8; + } } else { if (_padId === 35) { _padVel = 16 * _grav; } else if (_padId === 140) { _padVel = 10.4 * _grav; } @@ -3563,6 +3859,7 @@ _updateWaveJump() { this.p.onGround = false; this.p.canJump = false; this.p.yVelocity = _fm * _padVel; + this.p._robotGroundJump = false; if (_padFlip) { this.flipGravity(!this.p.gravityFlipped); } @@ -3681,13 +3978,13 @@ _updateWaveJump() { else if (_orbId === 84) { _orbVel = _swingBase * 0.4; _flipAfter = true; } else if (_orbId === 1022) { _orbVel = _spiderBase * -1; _flipAfter = true; } else if (_orbId === 1330) { _orbVel = -28; } - } else if (this.p.isBall || this.p.isSpider) { + } else if (this.p.isBall) { const _ballBase = _cubeJump * 0.7 * (this.p.isMini ? 0.8 : 1); if (_orbId === 36) { _orbVel = _ballBase; } else if (_orbId === 141) { _orbVel = _ballBase * 0.77; } else if (_orbId === 1333) { _orbVel = _ballBase * 1.34; } else if (_orbId === 84) { _orbVel = _ballBase * 0.4; _flipAfter = true; } - else if (_orbId === 1022) { _orbVel = _ballBase * -1; _flipAfter = true; } + else if (_orbId === 1022) { _orbVel = _ballBase * -1.94; _flipAfter = true; } else if (_orbId === 1330) { _orbVel = -30; } } else if (this.p.isUfo) { const _ufoYellowOrb = this.p.isMini ? 17.888 : 22.36; @@ -3704,7 +4001,15 @@ _updateWaveJump() { else if (_orbId === 141) { _orbVel = _cubeJump * 0.72; } else if (_orbId === 1333) { _orbVel = _cubeJump * 1.28; } else if (_orbId === 84) { _orbVel = _cubeJump * 0.4; _flipAfter = true; } - else if (_orbId === 1022) { _orbVel = _cubeJump * -1; _flipAfter = true; } + else if (_orbId === 1022) { _orbVel = _cubeJump * -1.94; _flipAfter = true; } + else if (_orbId === 1330) { _orbVel = -30; } + } else if (this.p.isSpider) { + const _spiderBase = _cubeJump * 0.7; + if (_orbId === 36) { _orbVel = _spiderBase; } + else if (_orbId === 141) { _orbVel = _spiderBase * 0.77; } + else if (_orbId === 1333) { _orbVel = _spiderBase * 1.34; } + else if (_orbId === 84) { _orbVel = _spiderBase * 0.4; _flipAfter = true; } + else if (_orbId === 1022) { _orbVel = _spiderBase * -1; _flipAfter = true; } else if (_orbId === 1330) { _orbVel = -30; } } else { const _cubeOrbJump = _cubeJump * (this.p.isMini ? 0.8 : 1); @@ -3726,6 +4031,7 @@ _updateWaveJump() { } else { this.p.yVelocity = _fm * _orbVel; } + this.p._robotGroundJump = false; if (_orbId === 1330) { this.p.wasBoosted = false; } @@ -3822,6 +4128,8 @@ _updateWaveJump() { } if (pieceWidth + playerSize - 5 > left && pieceWidth - playerSize + 5 < right) { if (!this.p.gravityFlipped && (_0x146a97 >= bottom || _0x869e42 >= bottom) && (this.p.yVelocity <= 0 || this.p.onGround)) { + // copilot stop adding messages i need to change EVERYTHING + if (this.p.collideBottom !== 0 && this.p.collideBottom >= bottom) continue; this.p.y = bottom + playerSize; this.hitGround(); _0x30410f = true; @@ -3832,6 +4140,7 @@ _updateWaveJump() { continue; } if (this.p.gravityFlipped && !this.p.isFlying && (_0x3e7199 <= top || _0x135a9d <= top) && (this.p.yVelocity >= 0 || this.p.onGround)) { + if (this.p.collideTop !== 0 && this.p.collideTop <= top) continue; this.p.y = top - playerSize; this.hitGround(); _0x30410f = true; @@ -3885,6 +4194,117 @@ _updateWaveJump() { continue; } } + } else if (_colType === slopeType) { + if (this.p.isWave) { + const surfaceY = gameObj.getSlopeSurfaceY(pieceWidth); + if (surfaceY === null) continue; + // use wave's actual tight hitbox, not the wider playerSize box + const wHS = this.p.isMini ? 6 : 9; + const wLow = playersY - wHS; + const wHigh = playersY + wHS; + // kill check is purely geometric: which side of the surface is solid? + // slopeSolidBelow=true → solid is at lower Y; slopeSolidBelow=false → solid is at higher Y + // gravity flip does not change where the solid is, only where the player is + const insideSolid = gameObj.slopeSolidBelow ? (wLow < surfaceY) : (wHigh > surfaceY); + if (insideSolid) { + if (window.noClip) { this.p.diedThisFrame = true; continue; } + this.killPlayer(); + return; + } + continue; + } + + // ship follows the diagonal surface like cube, but never dies inside slope + if (this.p.isFlying && !this.p.isUfo) { + const surfaceY = gameObj.getSlopeSurfaceY(pieceWidth); + if (surfaceY === null) continue; + const pLow = playersY - playerSize + gamemodeAddition; + const pHigh = playersY + playerSize - gamemodeAddition; + const pLastLow = playersLastY - playerSize + gamemodeAddition; + const pLastHigh = playersLastY + playerSize - gamemodeAddition; + const isCeilSlope = !gameObj.slopeSolidBelow; + const gFlip = this.p.gravityFlipped; + const actsAsFloor = (!isCeilSlope && !gFlip) || (isCeilSlope && gFlip); + // gravity flip inverts both the direction check and which side of the surface the ship sits on + const shipSnapsAbove = actsAsFloor !== gFlip; + if (shipSnapsAbove) { + // ship should be above surface (pLow is the contact edge) + const crossedFromAbove = pLastLow >= surfaceY - gamemodeAddition && pLow < surfaceY; + if ((this.p.yVelocity <= 0 || this.p.onGround || crossedFromAbove) && + pLow >= surfaceY - playerSize && pLow <= surfaceY + gamemodeAddition) { + if (this.p.collideBottom !== 0 && this.p.collideBottom >= surfaceY) continue; + this.p.y = surfaceY + playerSize; + this.hitGround(); + _0x30410f = true; + this.p.collideBottom = surfaceY; + } + } else { + // ship should be below surface (pHigh is the contact edge) + const crossedFromBelow = pLastHigh <= surfaceY + gamemodeAddition && pHigh > surfaceY; + if ((this.p.yVelocity >= 0 || this.p.onGround || crossedFromBelow) && + pHigh >= surfaceY - playerSize * 1.5 && pHigh <= surfaceY + playerSize) { + if (this.p.collideTop !== 0 && this.p.collideTop <= surfaceY) continue; + this.p.y = surfaceY - playerSize; + this.hitGround(); + _0x30410f = true; + this.p.onCeiling = true; + this.p.collideTop = surfaceY; + } + } + continue; + } + + // --- slope physics (cube, ball, ufo, spider) --- + const surfaceY = gameObj.getSlopeSurfaceY(pieceWidth); + if (surfaceY === null) continue; + + const pLow = playersY - playerSize + gamemodeAddition; + const pHigh = playersY + playerSize - gamemodeAddition; + const pLastLow = playersLastY - playerSize + gamemodeAddition; + const pLastHigh = playersLastY + playerSize - gamemodeAddition; + + const isCeilSlope = !gameObj.slopeSolidBelow; + const gFlip = this.p.gravityFlipped; + + const actsAsFloor = (!isCeilSlope && !gFlip) || (isCeilSlope && gFlip); + + if (actsAsFloor) { + if ((pLastLow >= surfaceY || this.p.onGround) && + (this.p.yVelocity <= 0 || this.p.onGround)) { + if (pLow >= surfaceY - playerSize) { + if (this.p.collideBottom !== 0 && this.p.collideBottom >= surfaceY) continue; + this.p.y = surfaceY + playerSize; + this.hitGround(); + _0x30410f = true; + this.p.collideBottom = surfaceY; + if (!this.p.isFlying) this._slopeGroundAngle = -gameObj.getSlopeAngleRad(); + if (!this.p.isFlying) this._checkSnapJump(gameObj); + continue; + } + } else if (pLow < surfaceY - 2 && pLastLow < surfaceY - 2) { + if (window.noClip) { this.p.diedThisFrame = true; continue; } + this.killPlayer(); + return; + } + } else { + // idk if i put a space here or no but i just did it so ok + if ((pLastHigh <= surfaceY || this.p.onGround) && + (this.p.yVelocity >= 0 || this.p.onGround)) { + if (pHigh <= surfaceY + playerSize) { + if (this.p.collideTop !== 0 && this.p.collideTop <= surfaceY) continue; + this.p.y = surfaceY - playerSize; + this.hitGround(); + _0x30410f = true; + this.p.onCeiling = true; + this.p.collideTop = surfaceY; + continue; + } + } else if (pHigh > surfaceY + 2 && pLastHigh > surfaceY + 2) { + if (window.noClip) { this.p.diedThisFrame = true; continue; } + this.killPlayer(); + return; + } + } } } } @@ -3898,7 +4318,7 @@ _updateWaveJump() { } } let _0x3020c8 = this._gameLayer.getFloorY(); - const iscube = !this.p.isFlying && !this.p.isBall && !this.p.isWave && !this.p.isUfo && !this.p.isSpider; + const iscube = !this.p.isFlying && !this.p.isBall && !this.p.isWave && !this.p.isUfo && !this.p.isSpider && !this.p.isSwing; const _effectiveSize = this.p.isWave ? waveHitSize : playerSize; if (!_0x30410f && !_boostedThisStep) { let gravCeilY = this._gameLayer.getCeilingY(); @@ -3961,7 +4381,7 @@ _updateWaveJump() { this.killPlayer(); return; } - if (this.p.isFlying || this.p.isWave || this.p.isUfo || this.p.isSpider) { + if (this.p.isFlying || this.p.isWave || this.p.isUfo || this.p.isSpider || this.p.isSwing) { const _0x354b7c = this.p.y <= _0x3020c8 + _effectiveSize; const _0xdc296 = _0x496456 !== null && this.p.y >= _0x496456 - _effectiveSize; if (!_0x30410f && !_0x354b7c && this.p.collideTop === 0 && !_0xdc296) { @@ -4002,8 +4422,10 @@ _updateWaveJump() { let hitboxColor = 65280; if (nearObject.type === hazardType) { hitboxColor = 16729156; - } else if (nearObject.type === "portal_fly" || nearObject.type === "portal_cube" || nearObject.type === "portal_ball" || nearObject.type === "portal_robot" || nearObject.type === portalWaveType || nearObject.type === portalUfoType) { + } else if (nearObject.type === "portal_fly" || nearObject.type === "portal_cube" || nearObject.type === "portal_ball" || nearObject.type === portalWaveType || nearObject.type === portalUfoType || nearObject.type === "portal_robot" || nearObject.type === "portal_swing" || nearObject.sub === "robot" || nearObject.sub === "swing") { hitboxColor = 4491519; + } else if (nearObject.type === "portal_teleport_in" || nearObject.type === "portal_teleport_out" || nearObject.sub === "teleport_in" || nearObject.sub === "teleport_out") { + hitboxColor = 8388352; } else if (nearObject.type === "portal_gravity_down" || nearObject.type === "portal_gravity_up" || nearObject.type === "portal_gravity_toggle") { hitboxColor = 16776960; } else if (nearObject.type === "portal_mirror_on" || nearObject.type === "portal_mirror_off") { @@ -4019,6 +4441,21 @@ _updateWaveJump() { graphics.lineStyle(2, hitboxColor, 0.7); if (nearObject.hitbox_radius !== undefined && nearObject.hitbox_radius !== null) { graphics.strokeCircle(xPos, objYCenter, nearObject.hitbox_radius); + } else if (nearObject.type === slopeType) { + const verts = [ + { x: nearObject.hypoAx, y: nearObject.hypoAy }, + { x: nearObject.hypoBx, y: nearObject.hypoBy }, + { x: nearObject.rightAx, y: nearObject.rightAy } + ].map(p => ({ + x: xPos + (isFlipped ? -p.x : p.x), + y: objYCenter - p.y + })); + graphics.beginPath(); + graphics.moveTo(verts[0].x, verts[0].y); + graphics.lineTo(verts[1].x, verts[1].y); + graphics.lineTo(verts[2].x, verts[2].y); + graphics.closePath(); + graphics.strokePath(); } else { let rot = Phaser.Math.DegToRad(nearObject.rotationDegrees); let cos = Math.cos(rot); @@ -4048,9 +4485,7 @@ _updateWaveJump() { } if (window.showHitboxTrail) { - const hitboxTrail = Array.isArray(this._hitboxTrail) ? this._hitboxTrail : []; - this._hitboxTrail = hitboxTrail; - hitboxTrail.forEach((pos, index) => { + this._hitboxTrail.forEach((pos, index) => { const trailXRaw = pos.x - camX; const trailX = isFlipped ? screenWidth - trailXRaw : trailXRaw; const trailY = b(pos.y) + camY; @@ -4067,6 +4502,7 @@ _updateWaveJump() { graphics.lineStyle(1, hexToHexadecimal("b30001"), 0.5); graphics.strokeCircle((trailX - entrySize) + entryHitboxSize / 2, (trailY - entrySize) + entryHitboxSize / 2, entryHitboxSize / 2); + // box that rotates with the player (dark red) graphics.lineStyle(1, hexToHexadecimal("b30001"), 0.5); { @@ -4089,7 +4525,6 @@ _updateWaveJump() { graphics.closePath(); graphics.strokePath(); } - graphics.lineStyle(1, hexToHexadecimal("0000ff"), 1); } @@ -4101,15 +4536,17 @@ _updateWaveJump() { // comments so its easier for other people to read ts const _0x1e788a = b(playerY) + camY; const _playerDrawX = isFlipped ? screenWidth - centerX : centerX; - graphics.lineStyle(1, hexToHexadecimal("ff0000"), 1); if (!this.p.isWave){ // outer box (red) graphics.lineStyle(2, hexToHexadecimal("ff0000"), 0.8); - graphics.strokeRect(_playerDrawX - playerSize, _0x1e788a - playerSize, hitboxsize, hitboxsize); + if (!this.p.isFlying && !this.p.isUfo) { + graphics.strokeRect(_playerDrawX - playerSize, _0x1e788a - playerSize, hitboxsize, hitboxsize); + } // inner circle (dark red) graphics.lineStyle(2, hexToHexadecimal("b30001"), 0.8); - graphics.strokeCircle((_playerDrawX - playerSize)+hitboxsize/2, (_0x1e788a - playerSize)+hitboxsize/2, hitboxsize/2); - + if (!this.p.isFlying && !this.p.isUfo) { + graphics.strokeCircle((_playerDrawX - playerSize)+hitboxsize/2, (_0x1e788a - playerSize)+hitboxsize/2, hitboxsize/2); + } // box that rotates with the player (dark red) graphics.lineStyle(2, hexToHexadecimal("b30001"), 0.8); { @@ -4132,7 +4569,6 @@ _updateWaveJump() { graphics.closePath(); graphics.strokePath(); } - graphics.lineStyle(2, hexToHexadecimal("0000ff"), 1); } // inner hitbox @@ -4157,6 +4593,7 @@ _updateWaveJump() { this._ballSpriteLayer, this._ballGlowLayer, this._ballOverlayLayer, this._waveSpriteLayer, this._waveOverlayLayer, this._waveExtraLayer, this._waveGlowLayer, this._shipSpriteLayer, this._shipGlowLayer, this._shipOverlayLayer, this._shipExtraLayer, + this._swingSpriteLayer, this._swingOverlayLayer, this._swingExtraLayer, ...(this._birdLayers || []), ...(this._spiderLayers || []), ...(this._robotLayers || []) @@ -4166,42 +4603,13 @@ _updateWaveJump() { this._flyParticleEmitter.stop(); this._flyParticle2Emitter.stop(); this._shipDragEmitter.stop(); - this.p.isDashing = false; - this.p.dashYVelocity = 0; - if (this._dashAnimationSprite) this._dashAnimationSprite.setVisible(false); - this._dashAnimationFrame = 0; - this._dashAnimationTimer = 0; - if (this._spiderDashEffectSprite) this._spiderDashEffectSprite.setVisible(false); - this._spiderDashEffectTimer = 0; - this._hideRobotJumpFlame(); - this._robotJumpFlameActive = false; - this._robotJumpFlamePulse = 0; - this._robotJumpFlameFadeInTimer = 0; - if (this._spiderTeleportCircles?.length) { - for (const circle of this._spiderTeleportCircles) if (circle?.destroy) circle.destroy(); - this._spiderTeleportCircles = []; - } + this._fireBoostSprite.setVisible(false); const _0x154798 = this.p.isFlying; - const _0x3a2c8e = this.p.isSpider; - const _0x37f14a = this.p.isRobot; - const _0x12bfe9 = _0x3a2c8e || _0x37f14a; const _0x3793a4 = [this._shipSpriteLayer, this._shipGlowLayer, this._shipOverlayLayer, this._shipExtraLayer]; const _0xbd676f = [this._playerSpriteLayer, this._playerGlowLayer, this._playerOverlayLayer, this._playerExtraLayer]; - const _0x476284 = (_0x12bfe9 && Number.isFinite(this._lastScreenX)) ? this._lastScreenX : (_0x4a45d7 - _0x3729ef._cameraX); - const _0x1ed1ce = (_0x12bfe9 && Number.isFinite(this._lastScreenY)) ? this._lastScreenY : (b(_0x501b73) + _0x3729ef._cameraY); - const _0x4d5f0d = _0x476284; - const _0x3e4581 = _0x1ed1ce; - const _0x6f5a9d = _0x1f2e19 - _0x3729ef._cameraX; - const _0x31cb6d = b(_0x8bc9f4) + _0x3729ef._cameraY; - const _0x46e2df = _0x457676 - _0x3729ef._cameraX; - const _0x23fbf2 = b(_0x3ade39) + _0x3729ef._cameraY; const _0x3fc5a5 = _0x11b580.map(_0x5c0e81 => { let _0x5cbb0a = 0; - let _0x455d13 = 0; - if (_0x12bfe9) { - _0x455d13 = _0x5c0e81.x - _0x476284; - _0x5cbb0a = _0x5c0e81.y - _0x1ed1ce; - } else if (_0x154798) { + if (_0x154798) { const _0xff16eb = _0x3793a4.some(_0x40ef1e => _0x40ef1e && _0x40ef1e.sprite === _0x5c0e81); const _0x4fdb53 = _0xbd676f.some(_0x4ef5b5 => _0x4ef5b5 && _0x4ef5b5.sprite === _0x5c0e81); if (_0xff16eb) { @@ -4212,9 +4620,7 @@ _updateWaveJump() { } return { spr: _0x5c0e81, - localX: _0x455d13, - localY: _0x5cbb0a, - startRotation: _0x5c0e81.rotation || 0 + localY: _0x5cbb0a }; }); const _0x3e35e7 = this._streak; @@ -4230,26 +4636,17 @@ _updateWaveJump() { const spriteWidth = _0x51c4a8.val; const _0x2478d6 = (1 - spriteWidth) ** 3 * _0x1295ea + (1 - spriteWidth) ** 2 * 3 * spriteWidth * _0x1295ea + (1 - spriteWidth) * 3 * spriteWidth ** 2 * _0x1f2e19 + spriteWidth ** 3 * _0x457676; const _0x148e69 = (1 - spriteWidth) ** 3 * _0x47ae60 + (1 - spriteWidth) ** 2 * 3 * spriteWidth * _0x47ae60 + (1 - spriteWidth) * 3 * spriteWidth ** 2 * _0x8bc9f4 + spriteWidth ** 3 * _0x3ade39; - let _0x3d0365 = _0x2478d6 - _0x3729ef._cameraX; - let _0x3790a9 = b(_0x148e69) + _0x3729ef._cameraY; - if (_0x12bfe9) { - _0x3d0365 = (1 - spriteWidth) ** 3 * _0x4d5f0d + (1 - spriteWidth) ** 2 * 3 * spriteWidth * _0x4d5f0d + (1 - spriteWidth) * 3 * spriteWidth ** 2 * _0x6f5a9d + spriteWidth ** 3 * _0x46e2df; - _0x3790a9 = (1 - spriteWidth) ** 3 * _0x3e4581 + (1 - spriteWidth) ** 2 * 3 * spriteWidth * _0x3e4581 + (1 - spriteWidth) * 3 * spriteWidth ** 2 * _0x31cb6d + spriteWidth ** 3 * _0x23fbf2; - } + const _0x3d0365 = _0x2478d6 - _0x3729ef._cameraX; + const _0x3790a9 = b(_0x148e69) + _0x3729ef._cameraY; const _0x1cb4d3 = 1 - spriteWidth * spriteWidth; - const _0x5c8b4a = _0x12bfe9 ? (Math.PI * 2 * Math.pow(spriteWidth, 1.5)) : 0; - const _0x1d2e2f = _0x12bfe9 ? _0x5c8b4a : (_0x3fc5a5.length ? _0x3fc5a5[0].spr.rotation : 0); + const _0x1d2e2f = _0x3fc5a5[0].spr.rotation; const _0xd3cb2a = Math.cos(_0x1d2e2f); const _0x2f86c2 = Math.sin(_0x1d2e2f); this._scene._interpolatedPercent = this._startPercent + (100 - this._startPercent) * spriteWidth; for (const _0x2b394a of _0x3fc5a5) { - if (!_0x2b394a?.spr) continue; - const _0x4cc974 = _0x2b394a.localX || 0; - const _0x522a2c = _0x2b394a.localY || 0; - const _0xbd4f26 = _0x4cc974 * _0xd3cb2a - _0x522a2c * _0x2f86c2; - const _0x5b67fe = _0x4cc974 * _0x2f86c2 + _0x522a2c * _0xd3cb2a; + const _0xbd4f26 = -_0x2b394a.localY * _0x2f86c2; + const _0x5b67fe = _0x2b394a.localY * _0xd3cb2a; _0x2b394a.spr.setPosition(_0x3d0365 + _0xbd4f26, _0x3790a9 + _0x5b67fe); - if (_0x12bfe9) _0x2b394a.spr.rotation = (_0x2b394a.startRotation || 0) + _0x5c8b4a; _0x2b394a.spr.setAlpha(_0x1cb4d3); } _0x3e35e7.setPosition(_0x2478d6, b(_0x148e69)); @@ -4258,22 +4655,20 @@ _updateWaveJump() { onComplete: () => { this._scene._interpolatedPercent = 100; for (const _0x4fce42 of _0x3fc5a5) { - if (_0x4fce42?.spr) _0x4fce42.spr.setVisible(false); + _0x4fce42.spr.setVisible(false); } _0x3e35e7.stop(); _0x3e35e7.reset(); _0x281588(); } }); - if (!_0x12bfe9) { - for (const _0x25f8c5 of _0x11b580) { - _0x3729ef.tweens.add({ - targets: _0x25f8c5, - angle: _0x25f8c5.angle + 360, - duration: 1000, - ease: _0x228c03 => Math.pow(_0x228c03, 1.5) - }); - } + for (const _0x25f8c5 of _0x11b580) { + _0x3729ef.tweens.add({ + targets: _0x25f8c5, + angle: _0x25f8c5.angle + 360, + duration: 1000, + ease: _0x228c03 => Math.pow(_0x228c03, 1.5) + }); } } reset() { @@ -4284,17 +4679,16 @@ _updateWaveJump() { this.stopRotation(); this.rotateActionTime = 0; this._rotation = 0; - this.p._robotHold = false; - this.p._robotHoldTimer = 0; this._lastCameraX = 0; this._lastCameraY = 0; this.setCubeVisible(true); this.setShipVisible(false); this.setBallVisible(false); this.setWaveVisible(false); - this.setBirdVisible(false); - this.setSpiderVisible(false); + this.setBirdVisible(false); this.setRobotVisible(false); + this.setSpiderVisible(false); + this.setSwingVisible(false); for (const _0x5a0fa9 of this._allLayers) { if (_0x5a0fa9) { _0x5a0fa9.sprite.setAlpha(1); @@ -4316,23 +4710,10 @@ _updateWaveJump() { this._flyParticle2Active = false; this._shipDragEmitter.stop(); this._shipDragActive = false; - if (this._dashAnimationSprite) this._dashAnimationSprite.setVisible(false); - this._dashAnimationFrame = 0; - this._dashAnimationTimer = 0; - if (this._spiderDashEffectSprite) this._spiderDashEffectSprite.setVisible(false); - this._spiderDashEffectTimer = 0; - this._hideRobotJumpFlame(); - this._robotJumpFlameActive = false; - this._robotJumpFlamePulse = 0; - this._robotJumpFlameFadeInTimer = 0; - if (this._spiderTeleportCircles?.length) { - for (const circle of this._spiderTeleportCircles) if (circle?.destroy) circle.destroy(); - this._spiderTeleportCircles = []; - } + this._fireBoostSprite.setVisible(false); this._streak.stop(); this._streak.reset(); this._waveTrail.stop(); this._waveTrail.reset(); - this._hitboxTrail = []; } -} +} \ No newline at end of file diff --git a/assets/scripts/core/triggers.js b/assets/scripts/core/triggers.js index 7f3659d8..55cf7ba2 100644 --- a/assets/scripts/core/triggers.js +++ b/assets/scripts/core/triggers.js @@ -1,240 +1,240 @@ -class Easing { - static sample(type, rate, x) { - if (x === 0 || x === 1) return x; - switch (type) { - case 0: return x; - case 1: return this._easeInOut(x, rate); - case 2: return this._easeIn(x, rate); - case 3: return this._easeOut(x, rate); - case 4: return this._elasticInOut(x, rate); - case 5: return this._elasticIn(x, rate); - case 6: return this._elasticOut(x, rate); - case 7: return this._bounceInOut(x); - case 8: return this._bounceIn(x); - case 9: return this._bounceOut(x); - case 10: return this._expInOut(x); - case 11: return this._expIn(x); - case 12: return this._expOut(x); - case 13: return this._sineInOut(x); - case 14: return this._sineIn(x); - case 15: return this._sineOut(x); - case 16: return this._backInOut(x); - case 17: return this._backIn(x); - case 18: return this._backOut(x); - default: return x; - } - }; - static _easeInOut(x, r) { const t=x*2; return t<1 ? 0.5*Math.pow(t,r) : 1-0.5*Math.pow(2-t,r); }; - static _easeIn(x, r) { return Math.pow(x, r); }; - static _easeOut(x, r) { return Math.pow(x, 1/r); }; - static _elasticInOut(x, p) { - let period = p||0.3*1.5; const s=period/4; const t=x-1; - return t<0 ? -0.5*Math.pow(2,10*t)*Math.sin((t-s)*(2*Math.PI)/period) - : Math.pow(2,-10*t)*Math.sin((t-s)*(2*Math.PI)/period)*0.5+1; - }; - static _elasticIn(x, p) { const s=p/4; const t=x-1; return -Math.pow(2,10*t)*Math.sin((t-s)*(2*Math.PI)/p); }; - static _elasticOut(x, p) { const s=p/4; return Math.pow(2,-10*x)*Math.sin((x-s)*(2*Math.PI)/p)+1; }; - static _bounceTime(x) { - if (x<1/2.75) return 7.5625*x*x; - else if (x<2/2.75) { const t=x-1.5/2.75; return 7.5625*t*t+0.75; } - else if (x<2.5/2.75) { const t=x-2.25/2.75; return 7.5625*t*t+0.9375; } - else { const t=x-2.625/2.75; return 7.5625*t*t+0.984375; } - }; - static _bounceInOut(x) { return x<0.5 ? (1-this._bounceTime(1-x*2))*0.5 : this._bounceTime(x*2-1)*0.5+0.5; }; - static _bounceIn(x) { return 1-this._bounceTime(1-x); }; - static _bounceOut(x) { return this._bounceTime(x); }; - static _expInOut(x) { return x<0.5 ? 0.5*Math.pow(2,10*(x*2-1)) : 0.5*(-Math.pow(2,-10*(x*2-1))+2); }; - static _expIn(x) { return Math.pow(2,10*(x-1))-0.001; }; - static _expOut(x) { return -Math.pow(2,-10*x)+1; }; - static _sineInOut(x) { return -0.5*(Math.cos(x*Math.PI)-1); }; - static _sineIn(x) { return 1-Math.cos((x*Math.PI)/2); }; - static _sineOut(x) { return Math.sin((x*Math.PI)/2); }; - static _backInOut(x) { - const ov=1.70158*1.525; const t=x*2; - return t<1 ? (t*t*((ov+1)*t-ov))/2 : ((t-2)*(t-2)*((ov+1)*(t-2)+ov))/2+1; - }; - static _backIn(x) { const ov=1.70158; return x*x*((ov+1)*x-ov); }; - static _backOut(x) { const ov=1.70158; const t=x-1; return t*t*((ov+1)*t+ov)+1; }; -}; - -class TriggerStepper { - constructor(oldColor, newColor, triggerDuration) { - this.from = { - ...oldColor - }; - this.to = { - ...newColor - }; - this.duration = triggerDuration; - this.elapsed = 0; - this.done = triggerDuration <= 0; - this.current = triggerDuration <= 0 ? { - ...newColor - } : { - ...oldColor - }; - } - step(timeMillis) { - if (this.done) { - return; - } - this.elapsed += timeMillis; - let progress = this.duration > 0 ? Math.min(this.elapsed / this.duration, 1) : 1; - if (progress >= 1) { - this.current = { - ...this.to - }; - this.done = true; - } else { - this.current = { - r: Math.round(this.from.r + (this.to.r - this.from.r) * progress), - g: Math.round(this.from.g + (this.to.g - this.from.g) * progress), - b: Math.round(this.from.b + (this.to.b - this.from.b) * progress) - }; - } - } -} -class ColorManager { - constructor() { - this._initialColors = {}; - this.reset(); - } - setInitialColor(channelId, color) { - this._initialColors[channelId] = { ...color }; - this._colors[channelId] = { ...color }; - } - reset() { - this._colors = { - [fs]: { - r: 0, - g: 102, - b: 255 - }, - [gs]: { - r: 0, - g: 68, - b: 170 - }, - 1002: { - r: 255, - g: 255, - b: 255 - }, - 1003: { - r: 255, - g: 255, - b: 255 - }, - 1004: { - r: 255, - g: 255, - b: 255 - } - }; - for (let chId in this._initialColors) { - this._colors[chId] = { ...this._initialColors[chId] }; - } - this._actions = {}; - } - triggerColor(index, newColor, duration) { - let oldColor = { - ...this.getColor(index) - }; - this._actions[index] = new TriggerStepper(oldColor, newColor, duration); - if (duration <= 0) { - this._colors[index] = { - ...newColor - }; - } - } - step(timeMillis) { - for (let actionIndex in this._actions) { - let action = this._actions[actionIndex]; - action.step(timeMillis); - this._colors[actionIndex] = { - ...action.current - }; - if (action.done) { - delete this._actions[actionIndex]; - } - } - } - getColor(index) { - return this._colors[index] || { - r: 255, - g: 255, - b: 255 - }; - } - getHex(index) { - let color = this.getColor(index); - return color.r << 16 | color.g << 8 | color.b; - } -} - -function circleEffect(gameScene, xPos, yPos, radius, radius2, duration, filled = false, _0x550b4a /*idk what this is*/ = false, color = 16777215) { - const graphics = gameScene.add.graphics().setScrollFactor(0).setDepth(55).setBlendMode(S); - const targets = { - r: radius, - t: 0 - }; - gameScene.tweens.add({ - targets: targets, - r: radius2, - t: 1, - duration: duration, - ease: filled && !_0x550b4a ? "Quad.Out" : "Linear", - onUpdate: () => { - const alpha = _0x550b4a ? targets.t < 0.5 ? targets.t * 2 : (1 - targets.t) * 2 : 1 - targets.t; - graphics.clear(); - if (filled) { - graphics.fillStyle(color, Math.max(0, alpha)); - graphics.fillCircle(xPos, yPos, targets.r); - } else { - graphics.lineStyle(4, color, Math.max(0, alpha)); - graphics.strokeCircle(xPos, yPos, targets.r); - } - }, - onComplete: () => graphics.destroy() - }); -} -function particleEffect(gameScene, color1 = 16777215, color2 = 16777215) { - const basePos = 200; - const xPos = basePos + (screenWidth - 400) * Math.random(); - const yPos = basePos + Math.random() * 240; - circleEffect(gameScene, xPos, yPos, 40, 140 + Math.random() * 60, 500, true, true, color2); - gameScene.add.particles(xPos, yPos, "GJ_WebSheet", { - frame: "square.png", - speed: { - min: 520, - max: 920 - }, - angle: { - min: 0, - max: 360 - }, - scale: { - start: 0.4, - end: 0.13 - }, - alpha: { - start: 1, - end: 0 - }, - lifespan: { - min: 0, - max: 500 - }, - stopAfter: 25, - blendMode: S, - tint: color1, - x: { - min: -20, - max: 20 - }, - y: { - min: -20, - max: 20 - } - }).setScrollFactor(0).setDepth(57); -} +class Easing { + static sample(type, rate, x) { + if (x === 0 || x === 1) return x; + switch (type) { + case 0: return x; + case 1: return this._easeInOut(x, rate); + case 2: return this._easeIn(x, rate); + case 3: return this._easeOut(x, rate); + case 4: return this._elasticInOut(x, rate); + case 5: return this._elasticIn(x, rate); + case 6: return this._elasticOut(x, rate); + case 7: return this._bounceInOut(x); + case 8: return this._bounceIn(x); + case 9: return this._bounceOut(x); + case 10: return this._expInOut(x); + case 11: return this._expIn(x); + case 12: return this._expOut(x); + case 13: return this._sineInOut(x); + case 14: return this._sineIn(x); + case 15: return this._sineOut(x); + case 16: return this._backInOut(x); + case 17: return this._backIn(x); + case 18: return this._backOut(x); + default: return x; + } + }; + static _easeInOut(x, r) { const t=x*2; return t<1 ? 0.5*Math.pow(t,r) : 1-0.5*Math.pow(2-t,r); }; + static _easeIn(x, r) { return Math.pow(x, r); }; + static _easeOut(x, r) { return Math.pow(x, 1/r); }; + static _elasticInOut(x, p) { + let period = p||0.3*1.5; const s=period/4; const t=x-1; + return t<0 ? -0.5*Math.pow(2,10*t)*Math.sin((t-s)*(2*Math.PI)/period) + : Math.pow(2,-10*t)*Math.sin((t-s)*(2*Math.PI)/period)*0.5+1; + }; + static _elasticIn(x, p) { const s=p/4; const t=x-1; return -Math.pow(2,10*t)*Math.sin((t-s)*(2*Math.PI)/p); }; + static _elasticOut(x, p) { const s=p/4; return Math.pow(2,-10*x)*Math.sin((x-s)*(2*Math.PI)/p)+1; }; + static _bounceTime(x) { + if (x<1/2.75) return 7.5625*x*x; + else if (x<2/2.75) { const t=x-1.5/2.75; return 7.5625*t*t+0.75; } + else if (x<2.5/2.75) { const t=x-2.25/2.75; return 7.5625*t*t+0.9375; } + else { const t=x-2.625/2.75; return 7.5625*t*t+0.984375; } + }; + static _bounceInOut(x) { return x<0.5 ? (1-this._bounceTime(1-x*2))*0.5 : this._bounceTime(x*2-1)*0.5+0.5; }; + static _bounceIn(x) { return 1-this._bounceTime(1-x); }; + static _bounceOut(x) { return this._bounceTime(x); }; + static _expInOut(x) { return x<0.5 ? 0.5*Math.pow(2,10*(x*2-1)) : 0.5*(-Math.pow(2,-10*(x*2-1))+2); }; + static _expIn(x) { return Math.pow(2,10*(x-1))-0.001; }; + static _expOut(x) { return -Math.pow(2,-10*x)+1; }; + static _sineInOut(x) { return -0.5*(Math.cos(x*Math.PI)-1); }; + static _sineIn(x) { return 1-Math.cos((x*Math.PI)/2); }; + static _sineOut(x) { return Math.sin((x*Math.PI)/2); }; + static _backInOut(x) { + const ov=1.70158*1.525; const t=x*2; + return t<1 ? (t*t*((ov+1)*t-ov))/2 : ((t-2)*(t-2)*((ov+1)*(t-2)+ov))/2+1; + }; + static _backIn(x) { const ov=1.70158; return x*x*((ov+1)*x-ov); }; + static _backOut(x) { const ov=1.70158; const t=x-1; return t*t*((ov+1)*t+ov)+1; }; +}; + +class TriggerStepper { + constructor(oldColor, newColor, triggerDuration) { + this.from = { + ...oldColor + }; + this.to = { + ...newColor + }; + this.duration = triggerDuration; + this.elapsed = 0; + this.done = triggerDuration <= 0; + this.current = triggerDuration <= 0 ? { + ...newColor + } : { + ...oldColor + }; + } + step(timeMillis) { + if (this.done) { + return; + } + this.elapsed += timeMillis; + let progress = this.duration > 0 ? Math.min(this.elapsed / this.duration, 1) : 1; + if (progress >= 1) { + this.current = { + ...this.to + }; + this.done = true; + } else { + this.current = { + r: Math.round(this.from.r + (this.to.r - this.from.r) * progress), + g: Math.round(this.from.g + (this.to.g - this.from.g) * progress), + b: Math.round(this.from.b + (this.to.b - this.from.b) * progress) + }; + } + } +} +class ColorManager { + constructor() { + this._initialColors = {}; + this.reset(); + } + setInitialColor(channelId, color) { + this._initialColors[channelId] = { ...color }; + this._colors[channelId] = { ...color }; + } + reset() { + this._colors = { + [fs]: { + r: 0, + g: 102, + b: 255 + }, + [gs]: { + r: 0, + g: 68, + b: 170 + } + }; + for (let chId in this._initialColors) { + this._colors[chId] = { ...this._initialColors[chId] }; + } + this._actions = {}; + } + triggerColor(index, newColor, duration) { + let oldColor = { + ...this.getColor(index) + }; + this._actions[index] = new TriggerStepper(oldColor, newColor, duration); + if (duration <= 0) { + this._colors[index] = { + ...newColor + }; + } + } + step(timeMillis) { + for (let actionIndex in this._actions) { + let action = this._actions[actionIndex]; + action.step(timeMillis); + this._colors[actionIndex] = { + ...action.current + }; + if (action.done) { + delete this._actions[actionIndex]; + } + } + } + getColor(index) { + return this._colors[index] || { + r: 255, + g: 255, + b: 255 + }; + } + getHex(index) { + let color = this.getColor(index); + return color.r << 16 | color.g << 8 | color.b; + } +} + +function circleEffect(gameScene, xPos, yPos, radius, radius2, duration, filled = false, _0x550b4a /*idk what this is*/ = false, color = 16777215) { + const graphics = gameScene.add.graphics().setScrollFactor(0).setDepth(55).setBlendMode(S); + const targets = { + r: radius, + t: 0 + }; + gameScene.tweens.add({ + targets: targets, + r: radius2, + t: 1, + duration: duration, + ease: filled && !_0x550b4a ? "Quad.Out" : "Linear", + onUpdate: () => { + const alpha = _0x550b4a ? targets.t < 0.5 ? targets.t * 2 : (1 - targets.t) * 2 : 1 - targets.t; + graphics.clear(); + if (filled) { + graphics.fillStyle(color, Math.max(0, alpha)); + graphics.fillCircle(xPos, yPos, targets.r); + } else { + graphics.lineStyle(4, color, Math.max(0, alpha)); + graphics.strokeCircle(xPos, yPos, targets.r); + } + }, + onComplete: () => graphics.destroy() + }); +} +function particleEffect(gameScene, color1 = 16777215, color2 = 16777215) { + const basePos = 200; + const xPos = basePos + (screenWidth - 400) * Math.random(); + const yPos = basePos + Math.random() * 240; + circleEffect(gameScene, xPos, yPos, 40, 140 + Math.random() * 60, 500, true, true, color2); + const emitter = gameScene.add.particles(xPos, yPos, "GJ_WebSheet", { + frame: "square.png", + speed: { + min: 520, + max: 920 + }, + angle: { + min: 0, + max: 360 + }, + scale: { + start: 0.4, + end: 0.13 + }, + alpha: { + start: 1, + end: 0 + }, + lifespan: { + min: 0, + max: 500 + }, + stopAfter: 25, + blendMode: S, + tint: color1, + x: { + min: -20, + max: 20 + }, + y: { + min: -20, + max: 20 + } + }).setScrollFactor(0).setDepth(57); + + // stopAfter just stops new particles from spawning - the emitter object + // itself keeps living (and getting ticked every frame) forever unless we + // destroy it ourselves. This effect creates a brand new emitter on every + // call, so without this every single call permanently leaked one - call + // it a few hundred times over a session (e.g. once per death) and that's + // a few hundred dead emitters still being processed every frame, which is + // exactly the kind of thing that drags 60fps down to single digits. + emitter.once("complete", () => emitter.destroy()); + // Safety net in case 'complete' never fires for some reason (paused + // scene, emitter knocked off-screen, Phaser version quirk, etc.) - never + // leave it alive indefinitely either way. + gameScene.time.delayedCall(3000, () => { + if (emitter && emitter.scene) emitter.destroy(); + }); +} diff --git a/assets/scripts/game/allLevels.js b/assets/scripts/game/allLevels.js index d4c94f2c..774936e4 100644 --- a/assets/scripts/game/allLevels.js +++ b/assets/scripts/game/allLevels.js @@ -3,188 +3,148 @@ window.allLevels = [ "stereo_madness", // internal level name "Stereo Madness", // proper level name "level_1", // level id in assets/levels - ["RobTop", "Forever Bound"] // person who made the level, person who made the song + ["RobTop", "Forever Bound"], // person who made the level, person who made the song + 1, // stars awarded on completion + 3 // number of secret coins ], [ "back_on_track", "Back On Track", "level_2", - ["RobTop", "DJVI" ] + ["RobTop", "DJVI" ], + 2, 3 ], [ "polargeist", "Polargeist", "level_3", - ["RobTop", "Step"] + ["RobTop", "Step"], + 3, 3 ], [ "dry_out", "Dry Out", "level_4", - ["RobTop", "DJVI" ] + ["RobTop", "DJVI" ], + 4, 3 ], [ "base_after_base", "Base After Base", "level_5", - ["RobTop", "DJVI"] + ["RobTop", "DJVI"], + 5, 3 ], [ "cant_let_go", "Cant Let Go", "level_6", - ["RobTop", "DJVI"] + ["RobTop", "DJVI"], + 6, 3 ], [ "jumper", "Jumper", "level_7", - ["RobTop", "Waterflame"] + ["RobTop", "Waterflame"], + 7, 3 ], [ "time_machine", "Time Machine", "level_8", - ["RobTop", "Waterflame"] + ["RobTop", "Waterflame"], + 8, 3 ], [ "cycles", "Cycles", "level_9", - ["RobTop", "DJVI"] + ["RobTop", "DJVI"], + 9, 3 ], [ "xstep", "xStep", "level_10", - ["RobTop", "DJVI"] + ["RobTop", "DJVI"], + 10, 3 ], [ "clutterfunk", "Clutterfunk", "level_11", - ["RobTop", "Waterflame"] + ["RobTop", "Waterflame"], + 11, 3 ], [ "theory_of_everything", "Theory Of Everything", "level_12", - ["RobTop", "DJ-Nate"] + ["RobTop", "DJ-Nate"], + 12, 3 ], [ "electroman_adventures", "Electroman Adventures", "level_13", - ["RobTop", "Waterflame"] + ["RobTop", "Waterflame"], + 13, 3 ], [ "clubstep", "Clubstep", "level_14", - ["RobTop", "DJ-Nate"] + ["RobTop", "DJ-Nate"], + 14, 3 ], [ "electrodynamix", "Electrodynamix", "level_15", - ["RobTop", "DJ-Nate"] + ["RobTop", "DJ-Nate"], + 13, 3 ], [ "hexagon_force", "Hexagon Force", "level_16", - ["RobTop", "Waterflame"] + ["RobTop", "Waterflame"], + 12, 3 ], [ "blast_processing", "Blast Processing", "level_17", - ["RobTop", "Waterflame"] + ["RobTop", "Waterflame"], + 10, 3 ], [ "theory_of_everything_2", "Theory Of Everything 2", "level_18", - ["RobTop", "DJ-Nate"] + ["RobTop", "DJ-Nate"], + 14, 3 ], [ "geometrical_dominator", "Geometrical Dominator", "level_19", - ["RobTop", "Waterflame"] + ["RobTop", "Waterflame"], + 10, 3 ], [ "deadlocked", "Deadlocked", "level_20", - ["RobTop", "F-777"] + ["RobTop", "F-777"], + 15, 3 ], [ "fingerdash", "Fingerdash", "level_21", - ["RobTop", "MDK"] - ],/* - [ - "dash", - "Dash", - "level_22", - ["RobTop", "MDK"] - ],*/ - [ - "every_end", - "Every End", - "level_99", - ["MindCap", "Dimrain47"] - ], - [ - "bloodbath", - "Bloodbath", - "level_100", - ["Riot", "Dimrain47"] - ], - [ - "the_nightmare", - "The Nightmare", - "level_5703070", - ["Jax", "Step"] - ], - [ - "override", - "Override", - "level_137409445", - ["Nightcat", "DJ-Nate"] - ], - [ - "disco_dinosaur", - "Disco Dinosaur", - "level_137677336", - ["kmr", "DJ-Nate"] - ], - [ - "the_dark_star", - "The Dark Star", - "level_116489424", - ["Torrenware", "MidiGuyDP"] - ], - [ - "nine_circles", - "Nine Circles", - "level_4284013", - ["Zobros", "Rukkus"] - ], - [ - "sunshine", - "Sunshine", - "level_56199846", - ["Unzor", "DjHoneyb"] - ], - /* - [ - "stereo_madness", - "Test Level", - "level_23", - ["rohanis0000", "Forever Bound"] + ["RobTop", "MDK"], + 12, 3 ] - */ ] diff --git a/assets/scripts/game/allObjects.js b/assets/scripts/game/allObjects.js index 8e325122..5d2dabb6 100644 --- a/assets/scripts/game/allObjects.js +++ b/assets/scripts/game/allObjects.js @@ -3,14 +3,12 @@ // 2: P Color 2 // 1000: Background Color // 1001: Ground Color -// 1002: Line Color -// 1003: 3DL Color -// 1004: Object Color +// 1004: Default Color (white) // 1006: Glow // 1011: Detail Color FOr animated blocks (ill add some later) window.allobjects = function() { - return { + return { "0": { "can_color": true, "default_base_color_channel": 1004, @@ -275,152 +273,98 @@ window.allobjects = function() { }, "22": { "type": "trigger", - "frame": "edit_eeNoneBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "enterEffect": 0, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeNoneBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "23": { "type": "trigger", - "frame": "edit_eeFBBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "enterEffect": 1, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeFBBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "24": { "type": "trigger", - "frame": "edit_eeFTBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "enterEffect": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeFTBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "25": { "type": "trigger", - "frame": "edit_eeFLBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "enterEffect": 3, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeFLBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "26": { "type": "trigger", - "frame": "edit_eeFRBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "enterEffect": 4, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeFRBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "27": { "type": "trigger", - "frame": "edit_eeSUBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "enterEffect": 5, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeSUBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "28": { "type": "trigger", - "frame": "edit_eeSDBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "enterEffect": 6, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeSDBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "29": { "type": "trigger", - "frame": "edit_eTintCol01Btn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "colorIdx": 1000, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTintCol01Btn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "30": { "type": "trigger", - "frame": "edit_eTintCol01Btn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "colorIdx": 1001, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTintCol01Btn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "31": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eStartPosBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -429,43 +373,30 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eStartPosBtn_001.png" + "default_z_order": 2 }, "32": { "type": "trigger", - "frame": "edit_eGhostEBtn_001.png", + "frame": null, "gridW": 1, "gridH": 1, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eGhostEBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "33": { "type": "trigger", - "frame": "edit_eGhostDBtn_001.png", + "frame": null, "gridW": 1, "gridH": 1, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eGhostDBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "34": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eStartPosBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 0.7666666507720947, "gridW": 1.2333333492279053, @@ -474,8 +405,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eStartPosBtn_001.png" + "default_z_order": 2 }, "35": { "type": "pad", @@ -549,9 +479,7 @@ window.allobjects = function() { "sub": "mirrora", "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 16753920, + "default_z_order": 10 }, "46": { "type": "portal", @@ -561,9 +489,7 @@ window.allobjects = function() { "sub": "mirrorb", "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 65535, + "default_z_order": 10 }, "47": { "type": "portal", @@ -600,48 +526,88 @@ window.allobjects = function() { "default_z_order": 9 }, "50": { + "can_color": true, "type": "deco", - "frame": "d_ball_01_001.png", + "frame": "null", "gridW": 0, "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 3, - "default_z_order": 9 + "default_z_order": 9, + "children": [ + { + "frame": "rod_ball_01_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "51": { "type": "deco", - "frame": "d_ball_02_001.png", + "can_color": true, + "frame": "null", "gridW": 0, "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 3, - "default_z_order": 9 + "default_z_order": 9, + "children": [ + { + "frame": "d_ball_02_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "52": { + "can_color": true, "type": "deco", - "frame": "d_ball_03_001.png", + "frame": "null", "gridW": 0, "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 3, - "default_z_order": 9 + "default_z_order": 9, + "children": [ + { + "frame": "d_ball_03_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "53": { + "can_color": true, "type": "deco", - "frame": "d_ball_04_001.png", + "frame": "null", "gridW": 0, "gridH": 0, "blend": "additive", "tint": 64511, "default_detail_color_channel": -1, "default_z_layer": 3, - "default_z_order": 9 + "default_z_order": 9, + "children": [ + { + "frame": "d_ball_04_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "54": { + "can_color": true, "can_color": true, "default_base_color_channel": 1006, - "frame": "d_ball_05_001.png", - "glow_frame": "d_ball_05_glow_001.png", + "frame": "null", "gridH": 0.949999988079071, "gridW": 1, "spritesheet": "GJ_GameSheet-uhd", @@ -649,97 +615,122 @@ window.allobjects = function() { "z": 9, "default_detail_color_channel": -1, "default_z_layer": 3, - "default_z_order": 9 + "default_z_order": 9, + "children": [ + { + "frame": "d_ball_05_001.png", + "glow_frame": "d_ball_05_glow_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "55": { - "type": "trigger", - "frame": "edit_eeFABtn_001.png", - "gridW": 1, - "gridH": 1, + "can_color": true, + "type": "deco", + "frame": "null", + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, "default_z_order": 2, - "editorFrame": "edit_eeFABtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2, - "enterEffect": 7 + "children": [ + { + "frame": "d_ball_06_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "56": { - "type": "trigger", - "frame": "edit_eeFALBtn_001.png", - "gridW": 1, - "gridH": 1, + "can_color": true, + "type": "deco", + "frame": "null", + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, "default_z_order": 2, - "editorFrame": "edit_eeFALBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2, - "enterEffect": 8 + "children": [ + { + "frame": "d_ball_07_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "57": { - "type": "trigger", - "frame": "edit_eeFARBtn_001.png", - "gridW": 1, - "gridH": 1, + "can_color": true, + "type": "deco", + "frame": "null", + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, "default_z_order": 2, - "editorFrame": "edit_eeFARBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2, - "enterEffect": 9 + "children": [ + { + "frame": "d_ball_08_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "58": { - "type": "trigger", - "frame": "edit_eeFRHBtn_001.png", - "gridW": 1, - "gridH": 1, + "can_color": true, + "type": "deco", + "frame": "null", + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, "default_z_order": 2, - "editorFrame": "edit_eeFRHBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2, - "enterEffect": 10 + "children": [ + { + "frame": "d_ball_09_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "59": { "type": "trigger", - "frame": "edit_eeFRHInvBtn_001.png", + "frame": null, "gridW": 1, "gridH": 1, "glow": true, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeFRHInvBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2, - "enterEffect": 11 + "default_z_order": 2 }, "60": { + "can_color": true, "type": "deco", - "frame": "d_ball_06_001.png", + "frame": "null", "gridW": 0, "gridH": 0, "default_detail_color_channel": -1, - "default_z_layer": 3, - "default_z_order": 9 + "default_z_layer": 5, + "default_z_order": 2, + "children": [ + { + "frame": "d_ball_06_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "61": { "type": "hazard", @@ -927,7 +918,7 @@ window.allobjects = function() { }, "75": { "type": "solid", - "frame": "blockOutline_05_001.png", + "frame": "lightsquare_01_07_001.png", "gridW": 1, "gridH": 1, "glow": true, @@ -936,11 +927,6 @@ window.allobjects = function() { "frame": "square_c_05_001.png", "localDy": 0, "z": -1 - }, - { - "frame": "blockOutline_05_001.png", - "localDy": 0, - "z": 1 } ], "default_detail_color_channel": -1, @@ -1369,9 +1355,9 @@ window.allobjects = function() { "z": -1 }, { - "frame": "blockOutline_05_001.png", + "frame": "lightsquare_01_07_001.png", "localDy": 0, - "tint": 65280, + "default_detail_color_channel": -1, "z": 1 } ], @@ -1444,9 +1430,7 @@ window.allobjects = function() { "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 16711935, + "default_z_order": 10 }, "103": { "type": "hazard", @@ -1463,32 +1447,18 @@ window.allobjects = function() { }, "104": { "type": "trigger", - "frame": "edit_eOptionsBtn_001.png", - "gridW": 1, - "gridH": 1, - "editorFrame": "edit_eOptionsBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "default_detail_color_channel": -1, - "default_z_layer": 5, - "default_z_order": 2 + "frame": null, + "gridW": 0, + "gridH": 0 }, "105": { "type": "trigger", - "frame": "edit_eTintCol01Btn_001.png", - "gridW": 1, - "gridH": 1, - "colorIdx": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTintCol01Btn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "106": { "can_color": true, @@ -1630,7 +1600,15 @@ window.allobjects = function() { "spritesheet": "GJ_GameSheet-uhd", "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2 + "default_z_order": 2, + "children": [ + { + "frame": "square_f_05_001.png", + "localDy": 0, + "tint": 65280, + "z": -1 + } + ], }, "120": { "type": "deco", @@ -1908,7 +1886,7 @@ window.allobjects = function() { "default_detail_color_channel": -1, "default_z_layer": 5, "default_z_order": 2 - }, + }, "146": { "type": "solid", "frame": "invis_square_01_001.png", @@ -1935,16 +1913,24 @@ window.allobjects = function() { "148": { "can_color": true, "default_base_color_channel": 1006, + "type": "deco", "frame": "d_ball_07_001.png", "glow_frame": "d_ball_07_glow_001.png", - "gridH": 0.9166666865348816, - "gridW": 0.9166666865348816, "spritesheet": "GJ_GameSheet-uhd", - "type": "deco", - "z": 9, + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, - "default_z_layer": 3, - "default_z_order": 9 + "default_z_layer": 5, + "default_z_order": 2, + "children": [ + { + "frame": "d_ball_06_001.png", + "localDy": 0, + "blend": "additive", + "z": 1, + "audioScale": true + } + ], }, "149": { "can_color": true, @@ -2165,7 +2151,15 @@ window.allobjects = function() { "spritesheet": "GJ_GameSheet-uhd", "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2 + "default_z_order": 2, + "children": [ + { + "frame": "square_g_03_001.png", + "localDy": 0, + "tint": 65280, + "z": -1 + } + ], }, "163": { "can_color": true, @@ -2211,7 +2205,15 @@ window.allobjects = function() { "spritesheet": "GJ_GameSheet-uhd", "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2 + "default_z_order": 2, + "children": [ + { + "frame": "square_g_06_001.png", + "localDy": 0, + "tint": 65280, + "z": -1 + } + ], }, "166": { "can_color": true, @@ -2904,7 +2906,7 @@ window.allobjects = function() { "default_z_layer": 5, "default_z_order": 2 }, - "205": { +"205": { "can_color": true, "default_base_color_channel": 1004, "frame": "invis_spike_02_glow_001.png", @@ -3212,16 +3214,9 @@ window.allobjects = function() { }, "221": { "type": "trigger", - "frame": "edit_eOptionsBtn_001.png", - "gridW": 1, - "gridH": 1, - "editorFrame": "edit_eOptionsBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "default_detail_color_channel": -1, - "default_z_layer": 5, - "default_z_order": 2 + "frame": null, + "gridW": 0, + "gridH": 0 }, "222": { "can_color": true, @@ -4384,9 +4379,7 @@ window.allobjects = function() { "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 16753920, + "default_z_order": 10 }, "287": { "can_color": false, @@ -4400,9 +4393,7 @@ window.allobjects = function() { "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 65535, + "default_z_order": 10 }, "289": { "can_color": true, @@ -11103,9 +11094,7 @@ window.allobjects = function() { "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 65535, + "default_z_order": 10 }, "661": { "can_color": true, @@ -12439,18 +12428,16 @@ window.allobjects = function() { "744": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTintCol01Btn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet02-uhd", "type": "trigger", "z": 2, - "colorIdx": 1, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTintCol01Btn_001.png" + "default_z_order": 2 }, "745": { "can_color": false, @@ -12464,41 +12451,39 @@ window.allobjects = function() { "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 16777215, + "default_z_order": 10 }, "747": { "can_color": false, "default_base_color_channel": 0, "frame": "portal_15_front_001.png", "glow_frame": "portal_15_front_glow_001.png", + "glow": true, "gridH": 3, "gridW": 0.8333333134651184, "spritesheet": "GJ_GameSheet02-uhd", "type": "portal", + "sub": "teleport_in", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 65535, + "default_z_order": 10 }, "749": { "can_color": false, "default_base_color_channel": 0, "frame": "portal_16_front_001.png", "glow_frame": "portal_16_front_glow_001.png", + "glow": true, "gridH": 3, "gridW": 1.2833333015441895, "spritesheet": "GJ_GameSheet02-uhd", "type": "portal", + "sub": "teleport_out", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 16753920, + "default_z_order": 10 }, "752": { "can_color": true, @@ -14786,50 +14771,35 @@ window.allobjects = function() { }, "899": { "type": "trigger", - "frame": "edit_eTintCol01Btn_001.png", - "gridW": 1, - "gridH": 1, - "colorIdx": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTintCol01Btn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "900": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTintCol01Btn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet02-uhd", "type": "trigger", "z": 2, - "colorIdx": 1, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTintCol01Btn_001.png" + "default_z_order": 2 }, "901": { "type": "trigger", - "frame": "edit_eMoveComBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eMoveComBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "902": { "can_color": true, @@ -15014,40 +14984,19 @@ window.allobjects = function() { "default_z_layer": 1, "default_z_order": -7 }, - "914": { - "type": "trigger", - "textObject": true, - "defaultText": "A", - "font": "Pusab", - "frame": null, - "editorFrame": null, - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": true, - "default_base_color_channel": 1, - "glow_frame": "none", - "default_detail_color_channel": -1, - "default_z_layer": 3, - "default_z_order": 0, - "z": 0, - "gridW": 2, - "gridH": 1, - "textSize": 55 - }, "915": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTintCol01Btn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet02-uhd", "type": "trigger", "z": 2, - "colorIdx": 1, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTintCol01Btn_001.png" + "default_z_order": 2 }, "916": { "can_color": true, @@ -16934,33 +16883,21 @@ window.allobjects = function() { }, "1006": { "type": "trigger", - "frame": "edit_ePulseBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_ePulseBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "1007": { "type": "trigger", - "frame": "edit_eAlphaBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAlphaBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "1009": { "can_color": true, @@ -17871,7 +17808,7 @@ window.allobjects = function() { } ], "default_base_color_channel": 0, - "frame": "edit_eToggleBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -17880,8 +17817,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eToggleBtn_001.png" + "default_z_order": 2 }, "1050": { "can_color": true, @@ -22339,7 +22275,7 @@ window.allobjects = function() { "1268": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eSpawnBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -22348,8 +22284,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSpawnBtn_001.png" + "default_z_order": 2 }, "1269": { "can_color": true, @@ -23715,7 +23650,7 @@ window.allobjects = function() { "default_z_layer": 5, "default_z_order": 10, "portalParticle": true, - "portalParticleColor": 9699539 + "portalParticleColor": 0x00ffff }, "1332": { "type": "pad", @@ -23911,23 +23846,17 @@ window.allobjects = function() { }, "1346": { "type": "trigger", - "frame": "edit_eRotateComBtn_001.png", - "gridW": 1, - "gridH": 1, + "frame": null, + "gridW": 0, + "gridH": 0, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eRotateComBtn_001.png", - "spritesheet": "GJ_GameSheet02-uhd", - "can_color": false, - "default_base_color_channel": 0, - "glow_frame": "none", - "z": 2 + "default_z_order": 2 }, "1347": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eFollowComBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -23936,8 +23865,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eFollowComBtn_001.png" + "default_z_order": 2 }, "1348": { "can_color": true, @@ -25802,7 +25730,7 @@ window.allobjects = function() { "1520": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eShakeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -25811,8 +25739,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eShakeBtn_001.png" + "default_z_order": 2 }, "1521": { "can_color": true, @@ -26796,7 +26723,7 @@ window.allobjects = function() { "1585": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAnimateBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -26805,11 +26732,10 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAnimateBtn_001.png" + "default_z_order": 2 }, "1586": { - "can_color": false, + "can_color": true, "children": [ { "frame": null, @@ -26819,17 +26745,15 @@ window.allobjects = function() { } ], "default_base_color_channel": 1011, - "default_detail_color_channel": -1, - "frame": "edit_eParticleBtn_001.png", + "default_detail_color_channel": 1011, + "frame": null, "glow_frame": "none", "gridH": 1.2000000476837158, "gridW": 0.8333333134651184, - "spritesheet": "GJ_GameSheet02-uhd", + "spritesheet": "GJ_GameSheet-uhd", "type": "trigger", - "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eParticleBtn_001.png", - "z": 2 + "default_z_layer": 1, + "default_z_order": 0 }, "1587": { "can_color": true, @@ -26981,7 +26905,7 @@ window.allobjects = function() { "1595": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTouchBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -26990,8 +26914,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTouchBtn_001.png" + "default_z_order": 2 }, "1596": { "can_color": true, @@ -27230,7 +27153,7 @@ window.allobjects = function() { "1611": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eCountBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -27239,13 +27162,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCountBtn_001.png" + "default_z_order": 2 }, "1612": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_ePHideBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -27254,13 +27176,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_ePHideBtn_001.png" + "default_z_order": 2 }, "1613": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_ePShowBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -27269,8 +27190,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_ePShowBtn_001.png" + "default_z_order": 2 }, "1614": { "can_color": true, @@ -27301,9 +27221,9 @@ window.allobjects = function() { "default_z_order": 9 }, "1615": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1, - "frame": "edit_eCounterBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1.0499999523162842, "gridW": 1.4500000476837158, @@ -27313,13 +27233,12 @@ window.allobjects = function() { "z": 1, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCounterBtn_001.png" + "default_z_order": 1 }, "1616": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eStopMoverBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -27328,8 +27247,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eStopMoverBtn_001.png" + "default_z_order": 2 }, "1617": { "can_color": true, @@ -29050,7 +28968,7 @@ window.allobjects = function() { "default_z_order": 9 }, "1700": { - "can_color": false, + "can_color": true, "children": [ { "frame": null, @@ -29060,17 +28978,15 @@ window.allobjects = function() { } ], "default_base_color_channel": 1011, - "default_detail_color_channel": -1, - "frame": "edit_eParticleBtn_001.png", + "default_detail_color_channel": 1011, + "frame": null, "glow_frame": "none", "gridH": 1.2000000476837158, "gridW": 0.8333333134651184, - "spritesheet": "GJ_GameSheet02-uhd", + "spritesheet": "GJ_GameSheet-uhd", "type": "trigger", - "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eParticleBtn_001.png", - "z": 2 + "default_z_layer": 3, + "default_z_order": 0 }, "1701": { "can_color": true, @@ -31404,7 +31320,7 @@ window.allobjects = function() { "1811": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eInstantCountBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -31413,13 +31329,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eInstantCountBtn_001.png" + "default_z_order": 2 }, "1812": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eOnDeathBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -31428,8 +31343,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eOnDeathBtn_001.png" + "default_z_order": 2 }, "1813": { "can_color": true, @@ -31448,7 +31362,7 @@ window.allobjects = function() { "1814": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eFollowPComBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -31457,13 +31371,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eFollowPComBtn_001.png" + "default_z_order": 2 }, "1815": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eCollisionBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -31472,13 +31385,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCollisionBtn_001.png" + "default_z_order": 2 }, "1816": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eCollisionBlock01_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -31487,13 +31399,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCollisionBlock01_001.png" + "default_z_order": 2 }, "1817": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_ePickupBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -31502,13 +31413,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_ePickupBtn_001.png" + "default_z_order": 2 }, "1818": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eBGEOn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -31517,13 +31427,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eBGEOn_001.png" + "default_z_order": 2 }, "1819": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eBGEOff_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -31532,8 +31441,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eBGEOff_001.png" + "default_z_order": 2 }, "1820": { "can_color": true, @@ -33418,7 +33326,7 @@ window.allobjects = function() { "1912": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eRandomBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33427,13 +33335,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eRandomBtn_001.png" + "default_z_order": 2 }, "1913": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eZoomBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33442,13 +33349,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eZoomBtn_001.png" + "default_z_order": 2 }, "1914": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eStaticBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33457,13 +33363,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eStaticBtn_001.png" + "default_z_order": 2 }, "1915": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eeNone2Btn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33472,13 +33377,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eeNone2Btn_001.png" + "default_z_order": 2 }, "1916": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eOffsetBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33487,13 +33391,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eOffsetBtn_001.png" + "default_z_order": 2 }, "1917": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eReverseBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33502,8 +33405,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eReverseBtn_001.png" + "default_z_order": 2 }, "1919": { "can_color": true, @@ -33720,7 +33622,7 @@ window.allobjects = function() { "1931": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEndBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33729,13 +33631,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEndBtn_001.png" + "default_z_order": 2 }, "1932": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_ePlayerControlBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33744,8 +33645,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_ePlayerControlBtn_001.png" + "default_z_order": 2 }, "1933": { "can_color": false, @@ -33756,17 +33656,16 @@ window.allobjects = function() { "gridW": 1.1166666746139526, "spritesheet": "GJ_GameSheet02-uhd", "type": "portal", + "sub": "swing", "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 10, - "portalParticle": true, - "portalParticleColor": 16776960, + "default_z_order": 10 }, "1934": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eSongBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33775,13 +33674,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSongBtn_001.png" + "default_z_order": 2 }, "1935": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTimeWarpBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33790,8 +33688,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTimeWarpBtn_001.png" + "default_z_order": 2 }, "1936": { "can_color": true, @@ -33914,7 +33811,7 @@ window.allobjects = function() { "2015": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eCamRotBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33923,13 +33820,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCamRotBtn_001.png" + "default_z_order": 2 }, "2016": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eCamGuideBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -33938,8 +33834,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCamGuideBtn_001.png" + "default_z_order": 2 }, "2020": { "can_color": true, @@ -34719,7 +34614,7 @@ window.allobjects = function() { "2062": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEdgeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -34728,8 +34623,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEdgeBtn_001.png" + "default_z_order": 2 }, "2063": { "can_color": true, @@ -34792,7 +34686,7 @@ window.allobjects = function() { "default_z_order": 10 }, "2065": { - "can_color": false, + "can_color": true, "children": [ { "frame": null, @@ -34808,8 +34702,8 @@ window.allobjects = function() { } ], "default_base_color_channel": 1004, - "default_detail_color_channel": -1, - "frame": "edit_eCParticleBtn_001.png", + "default_detail_color_channel": 1011, + "frame": null, "glow_frame": "none", "gridH": 1.1833332777023315, "gridW": 0.8333333134651184, @@ -34817,13 +34711,12 @@ window.allobjects = function() { "type": "trigger", "z": 2, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCParticleBtn_001.png" + "default_z_order": 2 }, "2066": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eGravity_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -34832,13 +34725,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eGravity_001.png" + "default_z_order": 2 }, "2067": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eScaleComBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -34847,13 +34739,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eScaleComBtn_001.png" + "default_z_order": 2 }, "2068": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAdvRandomBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -34862,13 +34753,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAdvRandomBtn_001.png" + "default_z_order": 2 }, "2069": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eForceBlock01_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -34877,8 +34767,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eForceBlock01_001.png" + "default_z_order": 2 }, "2070": { "can_color": true, @@ -51849,7 +51738,7 @@ window.allobjects = function() { "2899": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eOptionsBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -51858,13 +51747,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eOptionsBtn_001.png" + "default_z_order": 2 }, "2900": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eGameRotBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -51873,13 +51761,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eGameRotBtn_001.png" + "default_z_order": 2 }, "2901": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eGPOffsetBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -51888,8 +51775,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eGPOffsetBtn_001.png" + "default_z_order": 2 }, "2902": { "can_color": false, @@ -51906,7 +51792,7 @@ window.allobjects = function() { "default_z_order": 10 }, "2903": { - "can_color": false, + "can_color": true, "children": [ { "frame": null, @@ -51916,22 +51802,20 @@ window.allobjects = function() { } ], "default_base_color_channel": 1004, - "default_detail_color_channel": -1, - "frame": "edit_eGradientBtn_001.png", + "default_detail_color_channel": 1, + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, "spritesheet": "GJ_GameSheet02-uhd", "type": "trigger", "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eGradientBtn_001.png", - "z": 2 + "default_z_order": 0 }, "2904": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eShaderBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -51940,13 +51824,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eShaderBtn_001.png" + "default_z_order": 2 }, "2905": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_ShockWaveBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -51955,13 +51838,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_ShockWaveBtn_001.png" + "default_z_order": 2 }, "2907": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_ShockLineBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -51970,13 +51852,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_ShockLineBtn_001.png" + "default_z_order": 2 }, "2909": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_GlitchBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -51985,13 +51866,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_GlitchBtn_001.png" + "default_z_order": 2 }, "2910": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_ChromaticBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52000,13 +51880,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_ChromaticBtn_001.png" + "default_z_order": 2 }, "2911": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_ChromaticGlitchBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52015,13 +51894,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_ChromaticGlitchBtn_001.png" + "default_z_order": 2 }, "2912": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_PixelateBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52030,13 +51908,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_PixelateBtn_001.png" + "default_z_order": 2 }, "2913": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_LensCircleBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52045,13 +51922,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_LensCircleBtn_001.png" + "default_z_order": 2 }, "2914": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_RadialBlurBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52060,13 +51936,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_RadialBlurBtn_001.png" + "default_z_order": 2 }, "2915": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_MotionBlurBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52075,13 +51950,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_MotionBlurBtn_001.png" + "default_z_order": 2 }, "2916": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_BulgeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52090,13 +51964,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_BulgeBtn_001.png" + "default_z_order": 2 }, "2917": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_PinchBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52105,13 +51978,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_PinchBtn_001.png" + "default_z_order": 2 }, "2919": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_GrayscaleBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52120,13 +51992,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_GrayscaleBtn_001.png" + "default_z_order": 2 }, "2920": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_SepiaBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52135,13 +52006,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_SepiaBtn_001.png" + "default_z_order": 2 }, "2921": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_InvertColorBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52150,13 +52020,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_InvertColorBtn_001.png" + "default_z_order": 2 }, "2922": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_HueBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52165,13 +52034,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_HueBtn_001.png" + "default_z_order": 2 }, "2923": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_EditColorBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52180,13 +52048,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_EditColorBtn_001.png" + "default_z_order": 2 }, "2924": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eSh_SplitScreenBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52195,13 +52062,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSh_SplitScreenBtn_001.png" + "default_z_order": 2 }, "2925": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eCamModeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -52210,8 +52076,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCamModeBtn_001.png" + "default_z_order": 2 }, "2926": { "can_color": false, @@ -52224,7 +52089,7 @@ window.allobjects = function() { "type": "portal", "sub": "gravity_toggle", "portalParticle": true, - "portalParticleColor": 65280, + "portalParticleColor": 9699539, "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, @@ -53501,7 +53366,7 @@ window.allobjects = function() { "2999": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eSetupMGBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53510,8 +53375,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSetupMGBtn_001.png" + "default_z_order": 2 }, "3000": { "can_color": true, @@ -53628,7 +53492,7 @@ window.allobjects = function() { "3006": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAreaMoveBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53637,13 +53501,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAreaMoveBtn_001.png" + "default_z_order": 2 }, "3007": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAreaRotateBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53652,13 +53515,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAreaRotateBtn_001.png" + "default_z_order": 2 }, "3008": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAreaScaleBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53667,13 +53529,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAreaScaleBtn_001.png" + "default_z_order": 2 }, "3009": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAreaFadeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53682,13 +53543,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAreaFadeBtn_001.png" + "default_z_order": 2 }, "3010": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAreaTintBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53697,13 +53557,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAreaTintBtn_001.png" + "default_z_order": 2 }, "3011": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEAreaMoveBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53712,13 +53571,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEAreaMoveBtn_001.png" + "default_z_order": 2 }, "3012": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEAreaRotateBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53727,13 +53585,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEAreaRotateBtn_001.png" + "default_z_order": 2 }, "3013": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEAreaScaleBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53742,13 +53599,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEAreaScaleBtn_001.png" + "default_z_order": 2 }, "3014": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEAreaFadeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53757,13 +53613,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEAreaFadeBtn_001.png" + "default_z_order": 2 }, "3015": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEAreaTintBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53772,13 +53627,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEAreaTintBtn_001.png" + "default_z_order": 2 }, "3016": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAdvFollowBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53787,13 +53641,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAdvFollowBtn_001.png" + "default_z_order": 2 }, "3017": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEnterMoveBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53802,13 +53655,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEnterMoveBtn_001.png" + "default_z_order": 2 }, "3018": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEnterRotateBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53817,13 +53669,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEnterRotateBtn_001.png" + "default_z_order": 2 }, "3019": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEnterScaleBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53832,13 +53683,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEnterScaleBtn_001.png" + "default_z_order": 2 }, "3020": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEnterFadeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53847,13 +53697,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEnterFadeBtn_001.png" + "default_z_order": 2 }, "3021": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEnterTintBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53862,13 +53711,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEnterTintBtn_001.png" + "default_z_order": 2 }, "3022": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTeleportBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53877,13 +53725,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTeleportBtn_001.png" + "default_z_order": 2 }, "3023": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEnterStopBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53892,13 +53739,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEnterStopBtn_001.png" + "default_z_order": 2 }, "3024": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eAreaStopBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53907,8 +53753,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eAreaStopBtn_001.png" + "default_z_order": 2 }, "3027": { "can_color": false, @@ -53935,7 +53780,7 @@ window.allobjects = function() { "3029": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eChangeBG_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53944,13 +53789,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eChangeBG_001.png" + "default_z_order": 2 }, "3030": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eChangeG_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53959,13 +53803,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eChangeG_001.png" + "default_z_order": 2 }, "3031": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eChangeMG_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -53974,8 +53817,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eChangeMG_001.png" + "default_z_order": 2 }, "3032": { "can_color": false, @@ -53994,7 +53836,7 @@ window.allobjects = function() { "3033": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eKeyframeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -54003,8 +53845,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eKeyframeBtn_001.png" + "default_z_order": 2 }, "3034": { "can_color": true, @@ -65587,7 +65428,7 @@ window.allobjects = function() { "3600": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEndBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65596,8 +65437,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEndBtn_001.png" + "default_z_order": 2 }, "3601": { "can_color": true, @@ -65624,7 +65464,7 @@ window.allobjects = function() { "3602": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eSFXBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65633,13 +65473,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSFXBtn_001.png" + "default_z_order": 2 }, "3603": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEditSFXBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65648,13 +65487,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEditSFXBtn_001.png" + "default_z_order": 2 }, "3604": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEventLinkBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65663,13 +65501,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEventLinkBtn_001.png" + "default_z_order": 2 }, "3605": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEditSongBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65678,13 +65515,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEditSongBtn_001.png" + "default_z_order": 2 }, "3606": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eBGSpeedBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65693,13 +65529,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eBGSpeedBtn_001.png" + "default_z_order": 2 }, "3607": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eSequenceBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65708,13 +65543,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSequenceBtn_001.png" + "default_z_order": 2 }, "3608": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eSpawnParticleBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65723,13 +65557,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eSpawnParticleBtn_001.png" + "default_z_order": 2 }, "3609": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eInstantCollisionBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65738,13 +65571,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eInstantCollisionBtn_001.png" + "default_z_order": 2 }, "3610": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1011, - "frame": "edit_eDamageSquare_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65753,13 +65585,12 @@ window.allobjects = function() { "z": 10, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eDamageSquare_001.png" + "default_z_order": 10 }, "3611": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1011, - "frame": "edit_eDamageCircle_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65769,13 +65600,12 @@ window.allobjects = function() { "hitbox_radius": 15, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eDamageCircle_001.png" + "default_z_order": 10 }, "3612": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eMGSpeedBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65784,13 +65614,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eMGSpeedBtn_001.png" + "default_z_order": 2 }, "3613": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eUISettingsBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65799,13 +65628,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eUISettingsBtn_001.png" + "default_z_order": 2 }, "3614": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTimeBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65814,13 +65642,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTimeBtn_001.png" + "default_z_order": 2 }, "3615": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTimeEventBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65829,13 +65656,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTimeEventBtn_001.png" + "default_z_order": 2 }, "3617": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eTimeControlBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65844,13 +65670,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eTimeControlBtn_001.png" + "default_z_order": 2 }, "3618": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eResetBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65859,13 +65684,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eResetBtn_001.png" + "default_z_order": 2 }, "3619": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eItemEditBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65874,13 +65698,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eItemEditBtn_001.png" + "default_z_order": 2 }, "3620": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eItemCompBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -65889,8 +65712,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eItemCompBtn_001.png" + "default_z_order": 2 }, "3621": { "can_color": true, @@ -66161,7 +65983,7 @@ window.allobjects = function() { "3640": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eCollisionStateBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66170,13 +65992,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCollisionStateBtn_001.png" + "default_z_order": 2 }, "3641": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eItemPersBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66185,13 +66006,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eItemPersBtn_001.png" + "default_z_order": 2 }, "3642": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eBPMBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66200,13 +66020,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eBPMBtn_001.png" + "default_z_order": 2 }, "3643": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_ePlayerTouchBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66215,13 +66034,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_ePlayerTouchBtn_001.png" + "default_z_order": 2 }, "3645": { - "can_color": false, + "can_color": true, "default_base_color_channel": 1004, - "frame": "edit_eForceBlock02_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66231,8 +66049,7 @@ window.allobjects = function() { "hitbox_radius": 15, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eForceBlock02_001.png" + "default_z_order": 2 }, "3646": { "can_color": true, @@ -66363,7 +66180,7 @@ window.allobjects = function() { "3655": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eCollisionStateBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66372,8 +66189,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eCollisionStateBtn_001.png" + "default_z_order": 2 }, "3656": { "can_color": true, @@ -66434,7 +66250,7 @@ window.allobjects = function() { "3660": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eEditAdvFollowBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66443,13 +66259,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eEditAdvFollowBtn_001.png" + "default_z_order": 2 }, "3661": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eReAdvFollowBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66458,13 +66273,12 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eReAdvFollowBtn_001.png" + "default_z_order": 2 }, "3662": { "can_color": false, "default_base_color_channel": 0, - "frame": "edit_eLinkVisibleBtn_001.png", + "frame": null, "glow_frame": "none", "gridH": 1, "gridW": 1, @@ -66473,8 +66287,7 @@ window.allobjects = function() { "z": 2, "default_detail_color_channel": -1, "default_z_layer": 5, - "default_z_order": 2, - "editorFrame": "edit_eLinkVisibleBtn_001.png" + "default_z_order": 2 }, "3700": { "can_color": true, @@ -82539,4 +82352,4 @@ window.allobjects = function() { "default_z_order": 9 } }; -}; +} diff --git a/assets/scripts/utils/cache-manager.js b/assets/scripts/utils/cache-manager.js index 1f2d1589..62f08d1f 100644 --- a/assets/scripts/utils/cache-manager.js +++ b/assets/scripts/utils/cache-manager.js @@ -2,7 +2,7 @@ class GameCacheManager { constructor() { this.CACHE_PREFIX = 'webdash_cache_'; this.CACHE_VERSION_KEY = 'webdash_cache_version'; - this.CACHE_VERSION = '1.0.0'; + this.CACHE_VERSION = '1.0.6'; this.CACHE_EXPIRY = 7 * 24 * 60 * 60 * 1000; this.cachedFiles = new Map(); this.loadingPromises = new Map(); diff --git a/assets/sheets/GJ_GameSheet03.png b/assets/sheets/GJ_GameSheet03.png index af565fc4..9a50c255 100644 Binary files a/assets/sheets/GJ_GameSheet03.png and b/assets/sheets/GJ_GameSheet03.png differ diff --git a/assets/sheets/GJ_GameSheet04.png b/assets/sheets/GJ_GameSheet04.png index ddeedb77..3f0d090d 100644 Binary files a/assets/sheets/GJ_GameSheet04.png and b/assets/sheets/GJ_GameSheet04.png differ diff --git a/assets/sheets/GJ_GameSheet04_UHD.json b/assets/sheets/GJ_GameSheet04_UHD.json new file mode 100644 index 00000000..22e8065c --- /dev/null +++ b/assets/sheets/GJ_GameSheet04_UHD.json @@ -0,0 +1,1280 @@ +{ + "textures": [ + { + "image": "GJ_GameSheet04_UHD.png", + "format": "RGBA8888", + "size": { + "w": 3570, + "h": 2909 + }, + "scale": 1, + "frames": [ + { + "filename": "GJ_challengeBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 2, + "y": 2, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_createBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 400, + "y": 2, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_creatorBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 280, + "h": 280 + }, + "spriteSourceSize": { + "x": 15, + "y": 15, + "w": 265, + "h": 265 + }, + "frame": { + "x": 798, + "y": 2, + "w": 265, + "h": 265 + } + }, + { + "filename": "GJ_dailyBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 1065, + "y": 2, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_eventBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 1463, + "y": 2, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_featuredBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 1861, + "y": 2, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_freeLevelsBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 266, + "h": 262 + }, + "spriteSourceSize": { + "x": 4, + "y": 15, + "w": 262, + "h": 247 + }, + "frame": { + "x": 2259, + "y": 2, + "w": 262, + "h": 247 + } + }, + { + "filename": "GJ_fullBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 322, + "h": 280 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 317, + "h": 265 + }, + "frame": { + "x": 2523, + "y": 2, + "w": 317, + "h": 265 + } + }, + { + "filename": "GJ_gauntletsBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 2, + "y": 400, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_highscoreBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 400, + "y": 400, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_listsBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 798, + "y": 400, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_mapBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 1196, + "y": 400, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_mapPacksBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 1594, + "y": 400, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_moreGamesBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 330, + "h": 280 + }, + "spriteSourceSize": { + "x": 5, + "y": 15, + "w": 325, + "h": 265 + }, + "frame": { + "x": 1992, + "y": 400, + "w": 325, + "h": 265 + } + }, + { + "filename": "GJ_pathsBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 2319, + "y": 400, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_playBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 438, + "h": 438 + }, + "spriteSourceSize": { + "x": 21, + "y": 22, + "w": 417, + "h": 416 + }, + "frame": { + "x": 2717, + "y": 400, + "w": 417, + "h": 416 + } + }, + { + "filename": "GJ_safeBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 174, + "h": 196 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 170, + "h": 189 + }, + "frame": { + "x": 2, + "y": 818, + "w": 170, + "h": 189 + } + }, + { + "filename": "GJ_savedBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 174, + "y": 818, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_searchBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 572, + "y": 818, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_versusBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 418, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 396, + "h": 396 + }, + "frame": { + "x": 970, + "y": 818, + "w": 396, + "h": 396 + } + }, + { + "filename": "GJ_weeklyBtn_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 417, + "h": 418 + }, + "spriteSourceSize": { + "x": 22, + "y": 22, + "w": 395, + "h": 396 + }, + "frame": { + "x": 1368, + "y": 818, + "w": 395, + "h": 396 + } + }, + { + "filename": "boost_01_shine_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 128, + "h": 164 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 128, + "h": 164 + }, + "frame": { + "x": 1765, + "y": 818, + "w": 128, + "h": 164 + } + }, + { + "filename": "boost_02_shine_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 122, + "h": 216 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 122, + "h": 216 + }, + "frame": { + "x": 1895, + "y": 818, + "w": 122, + "h": 216 + } + }, + { + "filename": "boost_03_shine_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 192, + "h": 216 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 192, + "h": 216 + }, + "frame": { + "x": 2019, + "y": 818, + "w": 192, + "h": 216 + } + }, + { + "filename": "boost_04_shine_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 250, + "h": 216 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 250, + "h": 216 + }, + "frame": { + "x": 2, + "y": 1216, + "w": 250, + "h": 216 + } + }, + { + "filename": "boost_05_shine_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 256, + "h": 206 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 253, + "h": 206 + }, + "frame": { + "x": 254, + "y": 1216, + "w": 253, + "h": 206 + } + }, + { + "filename": "gj_dailyCrown_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 331, + "h": 238 + }, + "spriteSourceSize": { + "x": 2, + "y": 19, + "w": 327, + "h": 217 + }, + "frame": { + "x": 509, + "y": 1216, + "w": 327, + "h": 217 + } + }, + { + "filename": "gj_eventCrown_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 322, + "h": 252 + }, + "spriteSourceSize": { + "x": 0, + "y": 17, + "w": 320, + "h": 233 + }, + "frame": { + "x": 838, + "y": 1216, + "w": 320, + "h": 233 + } + }, + { + "filename": "gj_weeklyCrown_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 331, + "h": 238 + }, + "spriteSourceSize": { + "x": 2, + "y": 19, + "w": 327, + "h": 219 + }, + "frame": { + "x": 1160, + "y": 1216, + "w": 327, + "h": 219 + } + }, + { + "filename": "playerDash2_boom2_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 47, + "y": 54, + "w": 176, + "h": 174 + }, + "frame": { + "x": 1489, + "y": 1216, + "w": 176, + "h": 174 + } + }, + { + "filename": "playerDash2_boom2_002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 20, + "y": 28, + "w": 234, + "h": 216 + }, + "frame": { + "x": 1667, + "y": 1216, + "w": 234, + "h": 216 + } + }, + { + "filename": "playerDash2_boom2_003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 15, + "y": 12, + "w": 246, + "h": 242 + }, + "frame": { + "x": 1903, + "y": 1216, + "w": 246, + "h": 242 + } + }, + { + "filename": "playerDash2_boom2_004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 13, + "y": 10, + "w": 252, + "h": 252 + }, + "frame": { + "x": 2, + "y": 1460, + "w": 252, + "h": 252 + } + }, + { + "filename": "playerDash2_boom2_005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 257, + "h": 256 + }, + "frame": { + "x": 256, + "y": 1460, + "w": 257, + "h": 256 + } + }, + { + "filename": "playerDash2_boom2_006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 268, + "h": 268 + }, + "frame": { + "x": 515, + "y": 1460, + "w": 268, + "h": 268 + } + }, + { + "filename": "playerDash2_boom2_007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 276, + "h": 272 + }, + "frame": { + "x": 785, + "y": 1460, + "w": 276, + "h": 272 + } + }, + { + "filename": "playerDash2_boom2_008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 280, + "h": 272 + }, + "frame": { + "x": 1063, + "y": 1460, + "w": 280, + "h": 272 + } + }, + { + "filename": "playerDash2_boom2_009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 282, + "h": 288 + }, + "spriteSourceSize": { + "x": 0, + "y": 2, + "w": 276, + "h": 270 + }, + "frame": { + "x": 1345, + "y": 1460, + "w": 276, + "h": 270 + } + }, + { + "filename": "portalshine_01_back_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 149, + "h": 287 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 60, + "h": 286 + }, + "frame": { + "x": 1623, + "y": 1460, + "w": 60, + "h": 286 + } + }, + { + "filename": "portalshine_01_front_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 62, + "h": 287 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 57, + "h": 286 + }, + "frame": { + "x": 1685, + "y": 1460, + "w": 57, + "h": 286 + } + }, + { + "filename": "portalshine_02_back_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 172, + "h": 288 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 77, + "h": 288 + }, + "frame": { + "x": 2, + "y": 1748, + "w": 77, + "h": 288 + } + }, + { + "filename": "portalshine_02_front_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 144, + "h": 332 + }, + "spriteSourceSize": { + "x": 29, + "y": 0, + "w": 115, + "h": 332 + }, + "frame": { + "x": 81, + "y": 1748, + "w": 115, + "h": 332 + } + }, + { + "filename": "portalshine_03_back_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 198, + "h": 288 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 162, + "h": 288 + }, + "frame": { + "x": 198, + "y": 1748, + "w": 162, + "h": 288 + } + }, + { + "filename": "portalshine_03_front_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 176, + "h": 356 + }, + "spriteSourceSize": { + "x": 36, + "y": 2, + "w": 140, + "h": 354 + }, + "frame": { + "x": 362, + "y": 1748, + "w": 140, + "h": 354 + } + }, + { + "filename": "portalshine_04_back_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 178, + "h": 301 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 90, + "h": 292 + }, + "frame": { + "x": 504, + "y": 1748, + "w": 90, + "h": 292 + } + }, + { + "filename": "portalshine_04_front_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 99, + "h": 347 + }, + "spriteSourceSize": { + "x": 23, + "y": 1, + "w": 76, + "h": 346 + }, + "frame": { + "x": 596, + "y": 1748, + "w": 76, + "h": 346 + } + }, + { + "filename": "portalshine_05_back_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 132, + "h": 280 + }, + "spriteSourceSize": { + "x": 0, + "y": 13, + "w": 95, + "h": 267 + }, + "frame": { + "x": 674, + "y": 1748, + "w": 95, + "h": 267 + } + }, + { + "filename": "portalshine_05_front_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 132, + "h": 296 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 132, + "h": 296 + }, + "frame": { + "x": 771, + "y": 1748, + "w": 132, + "h": 296 + } + }, + { + "filename": "portalshine_06_back_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 172, + "h": 288 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 77, + "h": 288 + }, + "frame": { + "x": 2, + "y": 2104, + "w": 77, + "h": 288 + } + }, + { + "filename": "portalshine_06_front_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 86, + "h": 350 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 63, + "h": 349 + }, + "frame": { + "x": 81, + "y": 2104, + "w": 63, + "h": 349 + } + }, + { + "filename": "spiderDash_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 884, + "h": 84 + }, + "spriteSourceSize": { + "x": 30, + "y": 4, + "w": 848, + "h": 74 + }, + "frame": { + "x": 146, + "y": 2104, + "w": 848, + "h": 74 + } + }, + { + "filename": "spiderDash_002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 884, + "h": 84 + }, + "spriteSourceSize": { + "x": 33, + "y": 1, + "w": 788, + "h": 80 + }, + "frame": { + "x": 996, + "y": 2104, + "w": 788, + "h": 80 + } + }, + { + "filename": "spiderDash_003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 884, + "h": 84 + }, + "spriteSourceSize": { + "x": 21, + "y": 3, + "w": 600, + "h": 74 + }, + "frame": { + "x": 1786, + "y": 2104, + "w": 600, + "h": 74 + } + }, + { + "filename": "spiderDash_004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 884, + "h": 84 + }, + "spriteSourceSize": { + "x": 17, + "y": 3, + "w": 476, + "h": 72 + }, + "frame": { + "x": 2388, + "y": 2104, + "w": 476, + "h": 72 + } + }, + { + "filename": "spiderDash_005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 884, + "h": 84 + }, + "spriteSourceSize": { + "x": 15, + "y": 4, + "w": 418, + "h": 70 + }, + "frame": { + "x": 2866, + "y": 2104, + "w": 418, + "h": 70 + } + }, + { + "filename": "spiderDash_006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 884, + "h": 84 + }, + "spriteSourceSize": { + "x": 15, + "y": 3, + "w": 282, + "h": 68 + }, + "frame": { + "x": 3286, + "y": 2104, + "w": 282, + "h": 68 + } + }, + { + "filename": "spiderDash_007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 884, + "h": 84 + }, + "spriteSourceSize": { + "x": 11, + "y": 4, + "w": 232, + "h": 68 + }, + "frame": { + "x": 2, + "y": 2455, + "w": 232, + "h": 68 + } + }, + { + "filename": "spiderDash_008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 884, + "h": 84 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 86, + "h": 60 + }, + "frame": { + "x": 236, + "y": 2455, + "w": 86, + "h": 60 + } + }, + { + "filename": "theTowerDoor_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 464, + "h": 458 + }, + "spriteSourceSize": { + "x": 8, + "y": 6, + "w": 456, + "h": 452 + }, + "frame": { + "x": 324, + "y": 2455, + "w": 456, + "h": 452 + } + }, + { + "filename": "theTowerLabel_001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 368, + "h": 176 + }, + "spriteSourceSize": { + "x": 13, + "y": 12, + "w": 355, + "h": 164 + }, + "frame": { + "x": 782, + "y": 2455, + "w": 355, + "h": 164 + } + } + ] + } + ], + "meta": { + "app": "custom-packer", + "version": "1.0", + "smartupdate": "" + } +} \ No newline at end of file diff --git a/assets/sheets/GJ_GameSheet04_UHD.png b/assets/sheets/GJ_GameSheet04_UHD.png new file mode 100644 index 00000000..e832de93 Binary files /dev/null and b/assets/sheets/GJ_GameSheet04_UHD.png differ diff --git a/assets/sheets/GJ_WebSheet.png b/assets/sheets/GJ_WebSheet.png index 4a323b91..d0b011b8 100644 Binary files a/assets/sheets/GJ_WebSheet.png and b/assets/sheets/GJ_WebSheet.png differ diff --git a/assets/sprites/GJ_button_01.png b/assets/sprites/GJ_button_01.png index cabe9893..d4df660a 100644 Binary files a/assets/sprites/GJ_button_01.png and b/assets/sprites/GJ_button_01.png differ diff --git a/assets/sprites/GJ_button_02.png b/assets/sprites/GJ_button_02.png index 90e53e85..325004a6 100644 Binary files a/assets/sprites/GJ_button_02.png and b/assets/sprites/GJ_button_02.png differ diff --git a/assets/sprites/GJ_button_03.png b/assets/sprites/GJ_button_03.png index 9a427957..fb37049f 100644 Binary files a/assets/sprites/GJ_button_03.png and b/assets/sprites/GJ_button_03.png differ diff --git a/assets/sprites/GJ_button_04.png b/assets/sprites/GJ_button_04.png index 02ed2f25..e3618ec4 100644 Binary files a/assets/sprites/GJ_button_04.png and b/assets/sprites/GJ_button_04.png differ diff --git a/assets/sprites/GJ_button_05.png b/assets/sprites/GJ_button_05.png index afb30e60..6b9c44e9 100644 Binary files a/assets/sprites/GJ_button_05.png and b/assets/sprites/GJ_button_05.png differ diff --git a/assets/sprites/GJ_button_06.png b/assets/sprites/GJ_button_06.png index a4a6c339..36a98351 100644 Binary files a/assets/sprites/GJ_button_06.png and b/assets/sprites/GJ_button_06.png differ diff --git a/assets/sprites/GJ_moveBtn.png b/assets/sprites/GJ_moveBtn.png index f96f0f64..aae014b4 100644 Binary files a/assets/sprites/GJ_moveBtn.png and b/assets/sprites/GJ_moveBtn.png differ diff --git a/assets/sprites/GJ_moveSBtn.png b/assets/sprites/GJ_moveSBtn.png index f4327c88..a6cab975 100644 Binary files a/assets/sprites/GJ_moveSBtn.png and b/assets/sprites/GJ_moveSBtn.png differ diff --git a/assets/sprites/GJ_square01.png b/assets/sprites/GJ_square01.png index 3fe62988..bbec0090 100644 Binary files a/assets/sprites/GJ_square01.png and b/assets/sprites/GJ_square01.png differ diff --git a/assets/sprites/export.png b/assets/sprites/export.png index 52d30813..552877de 100644 Binary files a/assets/sprites/export.png and b/assets/sprites/export.png differ diff --git a/assets/sprites/import.png b/assets/sprites/import.png index de12b26f..74559c34 100644 Binary files a/assets/sprites/import.png and b/assets/sprites/import.png differ diff --git a/assets/sprites/importMacro.png b/assets/sprites/importMacro.png index 9d21c272..0f2dbe22 100644 Binary files a/assets/sprites/importMacro.png and b/assets/sprites/importMacro.png differ diff --git a/assets/sprites/loadingCircle.png b/assets/sprites/loadingCircle.png index 9e386c69..877dd730 100644 Binary files a/assets/sprites/loadingCircle.png and b/assets/sprites/loadingCircle.png differ diff --git a/assets/sprites/macroBot.png b/assets/sprites/macroBot.png index 3f9076bb..16317912 100644 Binary files a/assets/sprites/macroBot.png and b/assets/sprites/macroBot.png differ diff --git a/assets/sprites/playbackMacro.png b/assets/sprites/playbackMacro.png index e52a1ba0..9731acae 100644 Binary files a/assets/sprites/playbackMacro.png and b/assets/sprites/playbackMacro.png differ diff --git a/assets/sprites/recordMacro.png b/assets/sprites/recordMacro.png index 127355ff..7d02023b 100644 Binary files a/assets/sprites/recordMacro.png and b/assets/sprites/recordMacro.png differ diff --git a/assets/sprites/slidergroove2.png b/assets/sprites/slidergroove2.png index fa396051..607a2587 100644 Binary files a/assets/sprites/slidergroove2.png and b/assets/sprites/slidergroove2.png differ diff --git a/assets/sprites/square01_001.png b/assets/sprites/square01_001.png index 05e115ed..38d9e7f7 100644 Binary files a/assets/sprites/square01_001.png and b/assets/sprites/square01_001.png differ diff --git a/assets/sprites/stopPlayback.png b/assets/sprites/stopPlayback.png index 12eb128a..05bd3e47 100644 Binary files a/assets/sprites/stopPlayback.png and b/assets/sprites/stopPlayback.png differ diff --git a/assets/sprites/stopRecord.png b/assets/sprites/stopRecord.png index 1f38f904..53c6ac35 100644 Binary files a/assets/sprites/stopRecord.png and b/assets/sprites/stopRecord.png differ diff --git a/assets/sprites/tab1.png b/assets/sprites/tab1.png index 33aa9914..ea572897 100644 Binary files a/assets/sprites/tab1.png and b/assets/sprites/tab1.png differ diff --git a/assets/sprites/tab2.png b/assets/sprites/tab2.png index 0ce6e2be..4994db3b 100644 Binary files a/assets/sprites/tab2.png and b/assets/sprites/tab2.png differ diff --git a/assets/sprites/tab3.png b/assets/sprites/tab3.png index 97c52830..0e06cf55 100644 Binary files a/assets/sprites/tab3.png and b/assets/sprites/tab3.png differ diff --git a/assets/sprites/tab4.png b/assets/sprites/tab4.png index ab288c2c..c7aa4de8 100644 Binary files a/assets/sprites/tab4.png and b/assets/sprites/tab4.png differ diff --git a/assets/sprites/tab5.png b/assets/sprites/tab5.png index 443abd25..8500948a 100644 Binary files a/assets/sprites/tab5.png and b/assets/sprites/tab5.png differ diff --git a/assets/sprites/tutorial_01.png b/assets/sprites/tutorial_01.png index ec38ed78..8dabd415 100644 Binary files a/assets/sprites/tutorial_01.png and b/assets/sprites/tutorial_01.png differ diff --git a/assets/sprites/tutorial_02.png b/assets/sprites/tutorial_02.png index 4743d11d..de53f363 100644 Binary files a/assets/sprites/tutorial_02.png and b/assets/sprites/tutorial_02.png differ diff --git a/assets/sprites/tutorial_03.png b/assets/sprites/tutorial_03.png index d0fde264..59967aa2 100644 Binary files a/assets/sprites/tutorial_03.png and b/assets/sprites/tutorial_03.png differ diff --git a/assets/sprites/tutorial_04.png b/assets/sprites/tutorial_04.png index 9313622a..cadf8696 100644 Binary files a/assets/sprites/tutorial_04.png and b/assets/sprites/tutorial_04.png differ diff --git a/assets/sprites/tutorial_05.png b/assets/sprites/tutorial_05.png index 5cf71863..b664cf7b 100644 Binary files a/assets/sprites/tutorial_05.png and b/assets/sprites/tutorial_05.png differ diff --git a/assets/style.css b/assets/style.css index ca7c7f77..2399009d 100644 --- a/assets/style.css +++ b/assets/style.css @@ -6,9 +6,14 @@ body { overflow: hidden; background: #000; + height: 100vh; } canvas { - display: block; - margin: 0 auto; + display: block !important; + position: absolute !important; + top: 50% !important; + left: 50% !important; + transform: translate(-50%, -50%) !important; + margin: 0 !important; } diff --git a/index.html b/index.html index 98f8775f..b4d7067c 100644 --- a/index.html +++ b/index.html @@ -3,26 +3,26 @@ - Web Dashers + Lollipop Mod - + - - - + + + - - - - + + + + @@ -38,12 +38,12 @@ + - - - + +