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 @@
+
-
-
-
+
+