diff --git a/src/mining.html b/src/mining.html
new file mode 100644
index 0000000..48b6836
--- /dev/null
+++ b/src/mining.html
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/_header.html b/templates/_header.html
index 59d060b..c42c020 100644
--- a/templates/_header.html
+++ b/templates/_header.html
@@ -27,5 +27,6 @@
UE Material Snippets
Documentation
Number Match
+ Mining Game
diff --git a/templates/_layout.html b/templates/_layout.html
index 7408d84..84924d9 100644
--- a/templates/_layout.html
+++ b/templates/_layout.html
@@ -8,7 +8,7 @@
-
+
diff --git a/website/blocks/anvil_base.png b/website/blocks/anvil_base.png
new file mode 100644
index 0000000..cfc1fc8
Binary files /dev/null and b/website/blocks/anvil_base.png differ
diff --git a/website/blocks/anvil_top_damaged_0.png b/website/blocks/anvil_top_damaged_0.png
new file mode 100644
index 0000000..395dea4
Binary files /dev/null and b/website/blocks/anvil_top_damaged_0.png differ
diff --git a/website/blocks/anvil_top_damaged_1.png b/website/blocks/anvil_top_damaged_1.png
new file mode 100644
index 0000000..eddc47f
Binary files /dev/null and b/website/blocks/anvil_top_damaged_1.png differ
diff --git a/website/blocks/anvil_top_damaged_2.png b/website/blocks/anvil_top_damaged_2.png
new file mode 100644
index 0000000..6cade1f
Binary files /dev/null and b/website/blocks/anvil_top_damaged_2.png differ
diff --git a/website/blocks/beacon.png b/website/blocks/beacon.png
new file mode 100644
index 0000000..a69e59d
Binary files /dev/null and b/website/blocks/beacon.png differ
diff --git a/website/blocks/bed_feet_end.png b/website/blocks/bed_feet_end.png
new file mode 100644
index 0000000..6e1a4be
Binary files /dev/null and b/website/blocks/bed_feet_end.png differ
diff --git a/website/blocks/bed_feet_side.png b/website/blocks/bed_feet_side.png
new file mode 100644
index 0000000..3ce06f3
Binary files /dev/null and b/website/blocks/bed_feet_side.png differ
diff --git a/website/blocks/bed_feet_top.png b/website/blocks/bed_feet_top.png
new file mode 100644
index 0000000..b96d357
Binary files /dev/null and b/website/blocks/bed_feet_top.png differ
diff --git a/website/blocks/bed_head_end.png b/website/blocks/bed_head_end.png
new file mode 100644
index 0000000..b684c9a
Binary files /dev/null and b/website/blocks/bed_head_end.png differ
diff --git a/website/blocks/bed_head_side.png b/website/blocks/bed_head_side.png
new file mode 100644
index 0000000..3270b4a
Binary files /dev/null and b/website/blocks/bed_head_side.png differ
diff --git a/website/blocks/bed_head_top.png b/website/blocks/bed_head_top.png
new file mode 100644
index 0000000..2ab1090
Binary files /dev/null and b/website/blocks/bed_head_top.png differ
diff --git a/website/blocks/bedrock.png b/website/blocks/bedrock.png
new file mode 100644
index 0000000..1643c99
Binary files /dev/null and b/website/blocks/bedrock.png differ
diff --git a/website/blocks/bookshelf.png b/website/blocks/bookshelf.png
new file mode 100644
index 0000000..4c87f0f
Binary files /dev/null and b/website/blocks/bookshelf.png differ
diff --git a/website/blocks/brewing_stand.png b/website/blocks/brewing_stand.png
new file mode 100644
index 0000000..60832aa
Binary files /dev/null and b/website/blocks/brewing_stand.png differ
diff --git a/website/blocks/brewing_stand_base.png b/website/blocks/brewing_stand_base.png
new file mode 100644
index 0000000..0742fbf
Binary files /dev/null and b/website/blocks/brewing_stand_base.png differ
diff --git a/website/blocks/brick.png b/website/blocks/brick.png
new file mode 100644
index 0000000..fd6959c
Binary files /dev/null and b/website/blocks/brick.png differ
diff --git a/website/blocks/cactus_bottom.png b/website/blocks/cactus_bottom.png
new file mode 100644
index 0000000..6f10bc0
Binary files /dev/null and b/website/blocks/cactus_bottom.png differ
diff --git a/website/blocks/cactus_side.png b/website/blocks/cactus_side.png
new file mode 100644
index 0000000..9c55503
Binary files /dev/null and b/website/blocks/cactus_side.png differ
diff --git a/website/blocks/cactus_top.png b/website/blocks/cactus_top.png
new file mode 100644
index 0000000..f182e84
Binary files /dev/null and b/website/blocks/cactus_top.png differ
diff --git a/website/blocks/cake_bottom.png b/website/blocks/cake_bottom.png
new file mode 100644
index 0000000..d93b15a
Binary files /dev/null and b/website/blocks/cake_bottom.png differ
diff --git a/website/blocks/cake_inner.png b/website/blocks/cake_inner.png
new file mode 100644
index 0000000..ce7ce69
Binary files /dev/null and b/website/blocks/cake_inner.png differ
diff --git a/website/blocks/cake_side.png b/website/blocks/cake_side.png
new file mode 100644
index 0000000..343a023
Binary files /dev/null and b/website/blocks/cake_side.png differ
diff --git a/website/blocks/cake_top.png b/website/blocks/cake_top.png
new file mode 100644
index 0000000..2947892
Binary files /dev/null and b/website/blocks/cake_top.png differ
diff --git a/website/blocks/carrots_stage_0.png b/website/blocks/carrots_stage_0.png
new file mode 100644
index 0000000..c1ef732
Binary files /dev/null and b/website/blocks/carrots_stage_0.png differ
diff --git a/website/blocks/carrots_stage_1.png b/website/blocks/carrots_stage_1.png
new file mode 100644
index 0000000..1275f4f
Binary files /dev/null and b/website/blocks/carrots_stage_1.png differ
diff --git a/website/blocks/carrots_stage_2.png b/website/blocks/carrots_stage_2.png
new file mode 100644
index 0000000..b7347df
Binary files /dev/null and b/website/blocks/carrots_stage_2.png differ
diff --git a/website/blocks/carrots_stage_3.png b/website/blocks/carrots_stage_3.png
new file mode 100644
index 0000000..2391be8
Binary files /dev/null and b/website/blocks/carrots_stage_3.png differ
diff --git a/website/blocks/cauldron_bottom.png b/website/blocks/cauldron_bottom.png
new file mode 100644
index 0000000..8328307
Binary files /dev/null and b/website/blocks/cauldron_bottom.png differ
diff --git a/website/blocks/cauldron_inner.png b/website/blocks/cauldron_inner.png
new file mode 100644
index 0000000..d5a30dd
Binary files /dev/null and b/website/blocks/cauldron_inner.png differ
diff --git a/website/blocks/cauldron_side.png b/website/blocks/cauldron_side.png
new file mode 100644
index 0000000..df42f98
Binary files /dev/null and b/website/blocks/cauldron_side.png differ
diff --git a/website/blocks/cauldron_top.png b/website/blocks/cauldron_top.png
new file mode 100644
index 0000000..e263fc5
Binary files /dev/null and b/website/blocks/cauldron_top.png differ
diff --git a/website/blocks/clay.png b/website/blocks/clay.png
new file mode 100644
index 0000000..c19e031
Binary files /dev/null and b/website/blocks/clay.png differ
diff --git a/website/blocks/coal_block.png b/website/blocks/coal_block.png
new file mode 100644
index 0000000..024404b
Binary files /dev/null and b/website/blocks/coal_block.png differ
diff --git a/website/blocks/coal_ore.png b/website/blocks/coal_ore.png
new file mode 100644
index 0000000..49486d2
Binary files /dev/null and b/website/blocks/coal_ore.png differ
diff --git a/website/blocks/coarse_dirt.png b/website/blocks/coarse_dirt.png
new file mode 100644
index 0000000..d646225
Binary files /dev/null and b/website/blocks/coarse_dirt.png differ
diff --git a/website/blocks/cobblestone.png b/website/blocks/cobblestone.png
new file mode 100644
index 0000000..da3498c
Binary files /dev/null and b/website/blocks/cobblestone.png differ
diff --git a/website/blocks/cobblestone_mossy.png b/website/blocks/cobblestone_mossy.png
new file mode 100644
index 0000000..29449e3
Binary files /dev/null and b/website/blocks/cobblestone_mossy.png differ
diff --git a/website/blocks/cocoa_stage_0.png b/website/blocks/cocoa_stage_0.png
new file mode 100644
index 0000000..25892eb
Binary files /dev/null and b/website/blocks/cocoa_stage_0.png differ
diff --git a/website/blocks/cocoa_stage_1.png b/website/blocks/cocoa_stage_1.png
new file mode 100644
index 0000000..d0098ff
Binary files /dev/null and b/website/blocks/cocoa_stage_1.png differ
diff --git a/website/blocks/cocoa_stage_2.png b/website/blocks/cocoa_stage_2.png
new file mode 100644
index 0000000..db28c7b
Binary files /dev/null and b/website/blocks/cocoa_stage_2.png differ
diff --git a/website/blocks/command_block.png b/website/blocks/command_block.png
new file mode 100644
index 0000000..4459675
Binary files /dev/null and b/website/blocks/command_block.png differ
diff --git a/website/blocks/comparator_off.png b/website/blocks/comparator_off.png
new file mode 100644
index 0000000..c9527bc
Binary files /dev/null and b/website/blocks/comparator_off.png differ
diff --git a/website/blocks/comparator_on.png b/website/blocks/comparator_on.png
new file mode 100644
index 0000000..2e4fb7a
Binary files /dev/null and b/website/blocks/comparator_on.png differ
diff --git a/website/blocks/crafting_table_front.png b/website/blocks/crafting_table_front.png
new file mode 100644
index 0000000..11986a4
Binary files /dev/null and b/website/blocks/crafting_table_front.png differ
diff --git a/website/blocks/crafting_table_side.png b/website/blocks/crafting_table_side.png
new file mode 100644
index 0000000..1c678b4
Binary files /dev/null and b/website/blocks/crafting_table_side.png differ
diff --git a/website/blocks/crafting_table_top.png b/website/blocks/crafting_table_top.png
new file mode 100644
index 0000000..5cd53a5
Binary files /dev/null and b/website/blocks/crafting_table_top.png differ
diff --git a/website/blocks/daylight_detector_inverted_top.png b/website/blocks/daylight_detector_inverted_top.png
new file mode 100644
index 0000000..194a30e
Binary files /dev/null and b/website/blocks/daylight_detector_inverted_top.png differ
diff --git a/website/blocks/daylight_detector_side.png b/website/blocks/daylight_detector_side.png
new file mode 100644
index 0000000..ac273ea
Binary files /dev/null and b/website/blocks/daylight_detector_side.png differ
diff --git a/website/blocks/daylight_detector_top.png b/website/blocks/daylight_detector_top.png
new file mode 100644
index 0000000..3bfb2da
Binary files /dev/null and b/website/blocks/daylight_detector_top.png differ
diff --git a/website/blocks/deadbush.png b/website/blocks/deadbush.png
new file mode 100644
index 0000000..c64e079
Binary files /dev/null and b/website/blocks/deadbush.png differ
diff --git a/website/blocks/destroy_stage_0.png b/website/blocks/destroy_stage_0.png
new file mode 100644
index 0000000..f65b7ed
Binary files /dev/null and b/website/blocks/destroy_stage_0.png differ
diff --git a/website/blocks/destroy_stage_1.png b/website/blocks/destroy_stage_1.png
new file mode 100644
index 0000000..7c91596
Binary files /dev/null and b/website/blocks/destroy_stage_1.png differ
diff --git a/website/blocks/destroy_stage_2.png b/website/blocks/destroy_stage_2.png
new file mode 100644
index 0000000..dadd6b0
Binary files /dev/null and b/website/blocks/destroy_stage_2.png differ
diff --git a/website/blocks/destroy_stage_3.png b/website/blocks/destroy_stage_3.png
new file mode 100644
index 0000000..583b436
Binary files /dev/null and b/website/blocks/destroy_stage_3.png differ
diff --git a/website/blocks/destroy_stage_4.png b/website/blocks/destroy_stage_4.png
new file mode 100644
index 0000000..9c18a58
Binary files /dev/null and b/website/blocks/destroy_stage_4.png differ
diff --git a/website/blocks/destroy_stage_5.png b/website/blocks/destroy_stage_5.png
new file mode 100644
index 0000000..e4cee78
Binary files /dev/null and b/website/blocks/destroy_stage_5.png differ
diff --git a/website/blocks/destroy_stage_6.png b/website/blocks/destroy_stage_6.png
new file mode 100644
index 0000000..1299454
Binary files /dev/null and b/website/blocks/destroy_stage_6.png differ
diff --git a/website/blocks/destroy_stage_7.png b/website/blocks/destroy_stage_7.png
new file mode 100644
index 0000000..1a69168
Binary files /dev/null and b/website/blocks/destroy_stage_7.png differ
diff --git a/website/blocks/destroy_stage_8.png b/website/blocks/destroy_stage_8.png
new file mode 100644
index 0000000..47a93a9
Binary files /dev/null and b/website/blocks/destroy_stage_8.png differ
diff --git a/website/blocks/destroy_stage_9.png b/website/blocks/destroy_stage_9.png
new file mode 100644
index 0000000..9313aff
Binary files /dev/null and b/website/blocks/destroy_stage_9.png differ
diff --git a/website/blocks/diamond_block.png b/website/blocks/diamond_block.png
new file mode 100644
index 0000000..f2e2e77
Binary files /dev/null and b/website/blocks/diamond_block.png differ
diff --git a/website/blocks/diamond_ore.png b/website/blocks/diamond_ore.png
new file mode 100644
index 0000000..735ecda
Binary files /dev/null and b/website/blocks/diamond_ore.png differ
diff --git a/website/blocks/dirt.png b/website/blocks/dirt.png
new file mode 100644
index 0000000..617d353
Binary files /dev/null and b/website/blocks/dirt.png differ
diff --git a/website/blocks/dirt_podzol_side.png b/website/blocks/dirt_podzol_side.png
new file mode 100644
index 0000000..5921d37
Binary files /dev/null and b/website/blocks/dirt_podzol_side.png differ
diff --git a/website/blocks/dirt_podzol_top.png b/website/blocks/dirt_podzol_top.png
new file mode 100644
index 0000000..ebeda86
Binary files /dev/null and b/website/blocks/dirt_podzol_top.png differ
diff --git a/website/blocks/dispenser_front_horizontal.png b/website/blocks/dispenser_front_horizontal.png
new file mode 100644
index 0000000..3e09fde
Binary files /dev/null and b/website/blocks/dispenser_front_horizontal.png differ
diff --git a/website/blocks/dispenser_front_vertical.png b/website/blocks/dispenser_front_vertical.png
new file mode 100644
index 0000000..87a7837
Binary files /dev/null and b/website/blocks/dispenser_front_vertical.png differ
diff --git a/website/blocks/door_acacia_lower.png b/website/blocks/door_acacia_lower.png
new file mode 100644
index 0000000..2f57508
Binary files /dev/null and b/website/blocks/door_acacia_lower.png differ
diff --git a/website/blocks/door_acacia_upper.png b/website/blocks/door_acacia_upper.png
new file mode 100644
index 0000000..9b7e742
Binary files /dev/null and b/website/blocks/door_acacia_upper.png differ
diff --git a/website/blocks/door_birch_lower.png b/website/blocks/door_birch_lower.png
new file mode 100644
index 0000000..2c6f7d3
Binary files /dev/null and b/website/blocks/door_birch_lower.png differ
diff --git a/website/blocks/door_birch_upper.png b/website/blocks/door_birch_upper.png
new file mode 100644
index 0000000..1345b41
Binary files /dev/null and b/website/blocks/door_birch_upper.png differ
diff --git a/website/blocks/door_dark_oak_lower.png b/website/blocks/door_dark_oak_lower.png
new file mode 100644
index 0000000..7bb3ff2
Binary files /dev/null and b/website/blocks/door_dark_oak_lower.png differ
diff --git a/website/blocks/door_dark_oak_upper.png b/website/blocks/door_dark_oak_upper.png
new file mode 100644
index 0000000..27fa6cc
Binary files /dev/null and b/website/blocks/door_dark_oak_upper.png differ
diff --git a/website/blocks/door_iron_lower.png b/website/blocks/door_iron_lower.png
new file mode 100644
index 0000000..dbc33ab
Binary files /dev/null and b/website/blocks/door_iron_lower.png differ
diff --git a/website/blocks/door_iron_upper.png b/website/blocks/door_iron_upper.png
new file mode 100644
index 0000000..56878fe
Binary files /dev/null and b/website/blocks/door_iron_upper.png differ
diff --git a/website/blocks/door_jungle_lower.png b/website/blocks/door_jungle_lower.png
new file mode 100644
index 0000000..4edfa3c
Binary files /dev/null and b/website/blocks/door_jungle_lower.png differ
diff --git a/website/blocks/door_jungle_upper.png b/website/blocks/door_jungle_upper.png
new file mode 100644
index 0000000..d5201f8
Binary files /dev/null and b/website/blocks/door_jungle_upper.png differ
diff --git a/website/blocks/door_spruce_lower.png b/website/blocks/door_spruce_lower.png
new file mode 100644
index 0000000..5faa6e7
Binary files /dev/null and b/website/blocks/door_spruce_lower.png differ
diff --git a/website/blocks/door_spruce_upper.png b/website/blocks/door_spruce_upper.png
new file mode 100644
index 0000000..38e2717
Binary files /dev/null and b/website/blocks/door_spruce_upper.png differ
diff --git a/website/blocks/door_wood_lower.png b/website/blocks/door_wood_lower.png
new file mode 100644
index 0000000..cc61731
Binary files /dev/null and b/website/blocks/door_wood_lower.png differ
diff --git a/website/blocks/door_wood_upper.png b/website/blocks/door_wood_upper.png
new file mode 100644
index 0000000..93319d5
Binary files /dev/null and b/website/blocks/door_wood_upper.png differ
diff --git a/website/blocks/double_plant_fern_bottom.png b/website/blocks/double_plant_fern_bottom.png
new file mode 100644
index 0000000..6a5fa6a
Binary files /dev/null and b/website/blocks/double_plant_fern_bottom.png differ
diff --git a/website/blocks/double_plant_fern_top.png b/website/blocks/double_plant_fern_top.png
new file mode 100644
index 0000000..393144c
Binary files /dev/null and b/website/blocks/double_plant_fern_top.png differ
diff --git a/website/blocks/double_plant_grass_bottom.png b/website/blocks/double_plant_grass_bottom.png
new file mode 100644
index 0000000..5ac15b4
Binary files /dev/null and b/website/blocks/double_plant_grass_bottom.png differ
diff --git a/website/blocks/double_plant_grass_top.png b/website/blocks/double_plant_grass_top.png
new file mode 100644
index 0000000..1ceb3de
Binary files /dev/null and b/website/blocks/double_plant_grass_top.png differ
diff --git a/website/blocks/double_plant_paeonia_bottom.png b/website/blocks/double_plant_paeonia_bottom.png
new file mode 100644
index 0000000..21285f5
Binary files /dev/null and b/website/blocks/double_plant_paeonia_bottom.png differ
diff --git a/website/blocks/double_plant_paeonia_top.png b/website/blocks/double_plant_paeonia_top.png
new file mode 100644
index 0000000..bc68241
Binary files /dev/null and b/website/blocks/double_plant_paeonia_top.png differ
diff --git a/website/blocks/double_plant_rose_bottom.png b/website/blocks/double_plant_rose_bottom.png
new file mode 100644
index 0000000..4d59f44
Binary files /dev/null and b/website/blocks/double_plant_rose_bottom.png differ
diff --git a/website/blocks/double_plant_rose_top.png b/website/blocks/double_plant_rose_top.png
new file mode 100644
index 0000000..028aa80
Binary files /dev/null and b/website/blocks/double_plant_rose_top.png differ
diff --git a/website/blocks/double_plant_sunflower_back.png b/website/blocks/double_plant_sunflower_back.png
new file mode 100644
index 0000000..d488923
Binary files /dev/null and b/website/blocks/double_plant_sunflower_back.png differ
diff --git a/website/blocks/double_plant_sunflower_bottom.png b/website/blocks/double_plant_sunflower_bottom.png
new file mode 100644
index 0000000..8a12ebe
Binary files /dev/null and b/website/blocks/double_plant_sunflower_bottom.png differ
diff --git a/website/blocks/double_plant_sunflower_front.png b/website/blocks/double_plant_sunflower_front.png
new file mode 100644
index 0000000..699e34f
Binary files /dev/null and b/website/blocks/double_plant_sunflower_front.png differ
diff --git a/website/blocks/double_plant_sunflower_top.png b/website/blocks/double_plant_sunflower_top.png
new file mode 100644
index 0000000..4d14203
Binary files /dev/null and b/website/blocks/double_plant_sunflower_top.png differ
diff --git a/website/blocks/double_plant_syringa_bottom.png b/website/blocks/double_plant_syringa_bottom.png
new file mode 100644
index 0000000..5b880b5
Binary files /dev/null and b/website/blocks/double_plant_syringa_bottom.png differ
diff --git a/website/blocks/double_plant_syringa_top.png b/website/blocks/double_plant_syringa_top.png
new file mode 100644
index 0000000..b00751f
Binary files /dev/null and b/website/blocks/double_plant_syringa_top.png differ
diff --git a/website/blocks/dragon_egg.png b/website/blocks/dragon_egg.png
new file mode 100644
index 0000000..02af123
Binary files /dev/null and b/website/blocks/dragon_egg.png differ
diff --git a/website/blocks/dropper_front_horizontal.png b/website/blocks/dropper_front_horizontal.png
new file mode 100644
index 0000000..7d5f260
Binary files /dev/null and b/website/blocks/dropper_front_horizontal.png differ
diff --git a/website/blocks/dropper_front_vertical.png b/website/blocks/dropper_front_vertical.png
new file mode 100644
index 0000000..68a56c8
Binary files /dev/null and b/website/blocks/dropper_front_vertical.png differ
diff --git a/website/blocks/emerald_block.png b/website/blocks/emerald_block.png
new file mode 100644
index 0000000..dc214ee
Binary files /dev/null and b/website/blocks/emerald_block.png differ
diff --git a/website/blocks/emerald_ore.png b/website/blocks/emerald_ore.png
new file mode 100644
index 0000000..a26c35f
Binary files /dev/null and b/website/blocks/emerald_ore.png differ
diff --git a/website/blocks/enchanting_table_bottom.png b/website/blocks/enchanting_table_bottom.png
new file mode 100644
index 0000000..0f492aa
Binary files /dev/null and b/website/blocks/enchanting_table_bottom.png differ
diff --git a/website/blocks/enchanting_table_side.png b/website/blocks/enchanting_table_side.png
new file mode 100644
index 0000000..f2f4614
Binary files /dev/null and b/website/blocks/enchanting_table_side.png differ
diff --git a/website/blocks/enchanting_table_top.png b/website/blocks/enchanting_table_top.png
new file mode 100644
index 0000000..0d5f68f
Binary files /dev/null and b/website/blocks/enchanting_table_top.png differ
diff --git a/website/blocks/end_stone.png b/website/blocks/end_stone.png
new file mode 100644
index 0000000..c2a91e3
Binary files /dev/null and b/website/blocks/end_stone.png differ
diff --git a/website/blocks/endframe_eye.png b/website/blocks/endframe_eye.png
new file mode 100644
index 0000000..afa1d5d
Binary files /dev/null and b/website/blocks/endframe_eye.png differ
diff --git a/website/blocks/endframe_side.png b/website/blocks/endframe_side.png
new file mode 100644
index 0000000..e6cb567
Binary files /dev/null and b/website/blocks/endframe_side.png differ
diff --git a/website/blocks/endframe_top.png b/website/blocks/endframe_top.png
new file mode 100644
index 0000000..35215a5
Binary files /dev/null and b/website/blocks/endframe_top.png differ
diff --git a/website/blocks/farmland_dry.png b/website/blocks/farmland_dry.png
new file mode 100644
index 0000000..d03a0f4
Binary files /dev/null and b/website/blocks/farmland_dry.png differ
diff --git a/website/blocks/farmland_wet.png b/website/blocks/farmland_wet.png
new file mode 100644
index 0000000..f8d460d
Binary files /dev/null and b/website/blocks/farmland_wet.png differ
diff --git a/website/blocks/fern.png b/website/blocks/fern.png
new file mode 100644
index 0000000..fd76950
Binary files /dev/null and b/website/blocks/fern.png differ
diff --git a/website/blocks/fire_layer_0.png b/website/blocks/fire_layer_0.png
new file mode 100644
index 0000000..cf8910f
Binary files /dev/null and b/website/blocks/fire_layer_0.png differ
diff --git a/website/blocks/fire_layer_0.png.mcmeta b/website/blocks/fire_layer_0.png.mcmeta
new file mode 100644
index 0000000..7644671
--- /dev/null
+++ b/website/blocks/fire_layer_0.png.mcmeta
@@ -0,0 +1,38 @@
+{
+ "animation": {
+ "frames": [
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15
+ ]
+ }
+}
diff --git a/website/blocks/fire_layer_1.png b/website/blocks/fire_layer_1.png
new file mode 100644
index 0000000..6db92ac
Binary files /dev/null and b/website/blocks/fire_layer_1.png differ
diff --git a/website/blocks/fire_layer_1.png.mcmeta b/website/blocks/fire_layer_1.png.mcmeta
new file mode 100644
index 0000000..4f0718a
--- /dev/null
+++ b/website/blocks/fire_layer_1.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
\ No newline at end of file
diff --git a/website/blocks/flower_allium.png b/website/blocks/flower_allium.png
new file mode 100644
index 0000000..b7b5a45
Binary files /dev/null and b/website/blocks/flower_allium.png differ
diff --git a/website/blocks/flower_blue_orchid.png b/website/blocks/flower_blue_orchid.png
new file mode 100644
index 0000000..51d7fd9
Binary files /dev/null and b/website/blocks/flower_blue_orchid.png differ
diff --git a/website/blocks/flower_dandelion.png b/website/blocks/flower_dandelion.png
new file mode 100644
index 0000000..873e3f5
Binary files /dev/null and b/website/blocks/flower_dandelion.png differ
diff --git a/website/blocks/flower_houstonia.png b/website/blocks/flower_houstonia.png
new file mode 100644
index 0000000..2f9127d
Binary files /dev/null and b/website/blocks/flower_houstonia.png differ
diff --git a/website/blocks/flower_oxeye_daisy.png b/website/blocks/flower_oxeye_daisy.png
new file mode 100644
index 0000000..6d48913
Binary files /dev/null and b/website/blocks/flower_oxeye_daisy.png differ
diff --git a/website/blocks/flower_paeonia.png b/website/blocks/flower_paeonia.png
new file mode 100644
index 0000000..01a92ee
Binary files /dev/null and b/website/blocks/flower_paeonia.png differ
diff --git a/website/blocks/flower_pot.png b/website/blocks/flower_pot.png
new file mode 100644
index 0000000..09c2523
Binary files /dev/null and b/website/blocks/flower_pot.png differ
diff --git a/website/blocks/flower_rose.png b/website/blocks/flower_rose.png
new file mode 100644
index 0000000..895d78f
Binary files /dev/null and b/website/blocks/flower_rose.png differ
diff --git a/website/blocks/flower_tulip_orange.png b/website/blocks/flower_tulip_orange.png
new file mode 100644
index 0000000..6715a62
Binary files /dev/null and b/website/blocks/flower_tulip_orange.png differ
diff --git a/website/blocks/flower_tulip_pink.png b/website/blocks/flower_tulip_pink.png
new file mode 100644
index 0000000..a757bf5
Binary files /dev/null and b/website/blocks/flower_tulip_pink.png differ
diff --git a/website/blocks/flower_tulip_red.png b/website/blocks/flower_tulip_red.png
new file mode 100644
index 0000000..3048b63
Binary files /dev/null and b/website/blocks/flower_tulip_red.png differ
diff --git a/website/blocks/flower_tulip_white.png b/website/blocks/flower_tulip_white.png
new file mode 100644
index 0000000..6aa12a9
Binary files /dev/null and b/website/blocks/flower_tulip_white.png differ
diff --git a/website/blocks/furnace_front_off.png b/website/blocks/furnace_front_off.png
new file mode 100644
index 0000000..0570c3a
Binary files /dev/null and b/website/blocks/furnace_front_off.png differ
diff --git a/website/blocks/furnace_front_on.png b/website/blocks/furnace_front_on.png
new file mode 100644
index 0000000..92c89f3
Binary files /dev/null and b/website/blocks/furnace_front_on.png differ
diff --git a/website/blocks/furnace_side.png b/website/blocks/furnace_side.png
new file mode 100644
index 0000000..115f73d
Binary files /dev/null and b/website/blocks/furnace_side.png differ
diff --git a/website/blocks/furnace_top.png b/website/blocks/furnace_top.png
new file mode 100644
index 0000000..a3a5a08
Binary files /dev/null and b/website/blocks/furnace_top.png differ
diff --git a/website/blocks/glass.png b/website/blocks/glass.png
new file mode 100644
index 0000000..acadb01
Binary files /dev/null and b/website/blocks/glass.png differ
diff --git a/website/blocks/glass_black.png b/website/blocks/glass_black.png
new file mode 100644
index 0000000..06f3427
Binary files /dev/null and b/website/blocks/glass_black.png differ
diff --git a/website/blocks/glass_blue.png b/website/blocks/glass_blue.png
new file mode 100644
index 0000000..38885de
Binary files /dev/null and b/website/blocks/glass_blue.png differ
diff --git a/website/blocks/glass_brown.png b/website/blocks/glass_brown.png
new file mode 100644
index 0000000..259b61c
Binary files /dev/null and b/website/blocks/glass_brown.png differ
diff --git a/website/blocks/glass_cyan.png b/website/blocks/glass_cyan.png
new file mode 100644
index 0000000..d30caa4
Binary files /dev/null and b/website/blocks/glass_cyan.png differ
diff --git a/website/blocks/glass_gray.png b/website/blocks/glass_gray.png
new file mode 100644
index 0000000..3f07a5d
Binary files /dev/null and b/website/blocks/glass_gray.png differ
diff --git a/website/blocks/glass_green.png b/website/blocks/glass_green.png
new file mode 100644
index 0000000..7c1f4e6
Binary files /dev/null and b/website/blocks/glass_green.png differ
diff --git a/website/blocks/glass_light_blue.png b/website/blocks/glass_light_blue.png
new file mode 100644
index 0000000..b62703d
Binary files /dev/null and b/website/blocks/glass_light_blue.png differ
diff --git a/website/blocks/glass_lime.png b/website/blocks/glass_lime.png
new file mode 100644
index 0000000..f1d3c46
Binary files /dev/null and b/website/blocks/glass_lime.png differ
diff --git a/website/blocks/glass_magenta.png b/website/blocks/glass_magenta.png
new file mode 100644
index 0000000..5cd9945
Binary files /dev/null and b/website/blocks/glass_magenta.png differ
diff --git a/website/blocks/glass_orange.png b/website/blocks/glass_orange.png
new file mode 100644
index 0000000..3a29e31
Binary files /dev/null and b/website/blocks/glass_orange.png differ
diff --git a/website/blocks/glass_pane_top.png b/website/blocks/glass_pane_top.png
new file mode 100644
index 0000000..02de587
Binary files /dev/null and b/website/blocks/glass_pane_top.png differ
diff --git a/website/blocks/glass_pane_top_black.png b/website/blocks/glass_pane_top_black.png
new file mode 100644
index 0000000..43d60c5
Binary files /dev/null and b/website/blocks/glass_pane_top_black.png differ
diff --git a/website/blocks/glass_pane_top_blue.png b/website/blocks/glass_pane_top_blue.png
new file mode 100644
index 0000000..55c614f
Binary files /dev/null and b/website/blocks/glass_pane_top_blue.png differ
diff --git a/website/blocks/glass_pane_top_brown.png b/website/blocks/glass_pane_top_brown.png
new file mode 100644
index 0000000..cbd791a
Binary files /dev/null and b/website/blocks/glass_pane_top_brown.png differ
diff --git a/website/blocks/glass_pane_top_cyan.png b/website/blocks/glass_pane_top_cyan.png
new file mode 100644
index 0000000..9a34b84
Binary files /dev/null and b/website/blocks/glass_pane_top_cyan.png differ
diff --git a/website/blocks/glass_pane_top_gray.png b/website/blocks/glass_pane_top_gray.png
new file mode 100644
index 0000000..bb06114
Binary files /dev/null and b/website/blocks/glass_pane_top_gray.png differ
diff --git a/website/blocks/glass_pane_top_green.png b/website/blocks/glass_pane_top_green.png
new file mode 100644
index 0000000..a7d9fc7
Binary files /dev/null and b/website/blocks/glass_pane_top_green.png differ
diff --git a/website/blocks/glass_pane_top_light_blue.png b/website/blocks/glass_pane_top_light_blue.png
new file mode 100644
index 0000000..6a0e661
Binary files /dev/null and b/website/blocks/glass_pane_top_light_blue.png differ
diff --git a/website/blocks/glass_pane_top_lime.png b/website/blocks/glass_pane_top_lime.png
new file mode 100644
index 0000000..0607d75
Binary files /dev/null and b/website/blocks/glass_pane_top_lime.png differ
diff --git a/website/blocks/glass_pane_top_magenta.png b/website/blocks/glass_pane_top_magenta.png
new file mode 100644
index 0000000..5419e52
Binary files /dev/null and b/website/blocks/glass_pane_top_magenta.png differ
diff --git a/website/blocks/glass_pane_top_orange.png b/website/blocks/glass_pane_top_orange.png
new file mode 100644
index 0000000..2866571
Binary files /dev/null and b/website/blocks/glass_pane_top_orange.png differ
diff --git a/website/blocks/glass_pane_top_pink.png b/website/blocks/glass_pane_top_pink.png
new file mode 100644
index 0000000..6b6cd76
Binary files /dev/null and b/website/blocks/glass_pane_top_pink.png differ
diff --git a/website/blocks/glass_pane_top_purple.png b/website/blocks/glass_pane_top_purple.png
new file mode 100644
index 0000000..23e208e
Binary files /dev/null and b/website/blocks/glass_pane_top_purple.png differ
diff --git a/website/blocks/glass_pane_top_red.png b/website/blocks/glass_pane_top_red.png
new file mode 100644
index 0000000..22b69db
Binary files /dev/null and b/website/blocks/glass_pane_top_red.png differ
diff --git a/website/blocks/glass_pane_top_silver.png b/website/blocks/glass_pane_top_silver.png
new file mode 100644
index 0000000..f226ecc
Binary files /dev/null and b/website/blocks/glass_pane_top_silver.png differ
diff --git a/website/blocks/glass_pane_top_white.png b/website/blocks/glass_pane_top_white.png
new file mode 100644
index 0000000..9a273c3
Binary files /dev/null and b/website/blocks/glass_pane_top_white.png differ
diff --git a/website/blocks/glass_pane_top_yellow.png b/website/blocks/glass_pane_top_yellow.png
new file mode 100644
index 0000000..1c8580f
Binary files /dev/null and b/website/blocks/glass_pane_top_yellow.png differ
diff --git a/website/blocks/glass_pink.png b/website/blocks/glass_pink.png
new file mode 100644
index 0000000..42d8739
Binary files /dev/null and b/website/blocks/glass_pink.png differ
diff --git a/website/blocks/glass_purple.png b/website/blocks/glass_purple.png
new file mode 100644
index 0000000..fcae3d2
Binary files /dev/null and b/website/blocks/glass_purple.png differ
diff --git a/website/blocks/glass_red.png b/website/blocks/glass_red.png
new file mode 100644
index 0000000..db4c5eb
Binary files /dev/null and b/website/blocks/glass_red.png differ
diff --git a/website/blocks/glass_silver.png b/website/blocks/glass_silver.png
new file mode 100644
index 0000000..8461664
Binary files /dev/null and b/website/blocks/glass_silver.png differ
diff --git a/website/blocks/glass_white.png b/website/blocks/glass_white.png
new file mode 100644
index 0000000..696c5aa
Binary files /dev/null and b/website/blocks/glass_white.png differ
diff --git a/website/blocks/glass_yellow.png b/website/blocks/glass_yellow.png
new file mode 100644
index 0000000..8e48e12
Binary files /dev/null and b/website/blocks/glass_yellow.png differ
diff --git a/website/blocks/glowstone.png b/website/blocks/glowstone.png
new file mode 100644
index 0000000..c7253b3
Binary files /dev/null and b/website/blocks/glowstone.png differ
diff --git a/website/blocks/gold_block.png b/website/blocks/gold_block.png
new file mode 100644
index 0000000..174002e
Binary files /dev/null and b/website/blocks/gold_block.png differ
diff --git a/website/blocks/gold_ore.png b/website/blocks/gold_ore.png
new file mode 100644
index 0000000..b1a7a55
Binary files /dev/null and b/website/blocks/gold_ore.png differ
diff --git a/website/blocks/grass_side.png b/website/blocks/grass_side.png
new file mode 100644
index 0000000..a4975e5
Binary files /dev/null and b/website/blocks/grass_side.png differ
diff --git a/website/blocks/grass_side_overlay.png b/website/blocks/grass_side_overlay.png
new file mode 100644
index 0000000..fc3fa9d
Binary files /dev/null and b/website/blocks/grass_side_overlay.png differ
diff --git a/website/blocks/grass_side_snowed.png b/website/blocks/grass_side_snowed.png
new file mode 100644
index 0000000..41f6197
Binary files /dev/null and b/website/blocks/grass_side_snowed.png differ
diff --git a/website/blocks/grass_top.png b/website/blocks/grass_top.png
new file mode 100644
index 0000000..eaa7e45
Binary files /dev/null and b/website/blocks/grass_top.png differ
diff --git a/website/blocks/gravel.png b/website/blocks/gravel.png
new file mode 100644
index 0000000..388e5c5
Binary files /dev/null and b/website/blocks/gravel.png differ
diff --git a/website/blocks/hardened_clay.png b/website/blocks/hardened_clay.png
new file mode 100644
index 0000000..2446380
Binary files /dev/null and b/website/blocks/hardened_clay.png differ
diff --git a/website/blocks/hardened_clay_stained_black.png b/website/blocks/hardened_clay_stained_black.png
new file mode 100644
index 0000000..59da22c
Binary files /dev/null and b/website/blocks/hardened_clay_stained_black.png differ
diff --git a/website/blocks/hardened_clay_stained_blue.png b/website/blocks/hardened_clay_stained_blue.png
new file mode 100644
index 0000000..7e38e27
Binary files /dev/null and b/website/blocks/hardened_clay_stained_blue.png differ
diff --git a/website/blocks/hardened_clay_stained_brown.png b/website/blocks/hardened_clay_stained_brown.png
new file mode 100644
index 0000000..f81745f
Binary files /dev/null and b/website/blocks/hardened_clay_stained_brown.png differ
diff --git a/website/blocks/hardened_clay_stained_cyan.png b/website/blocks/hardened_clay_stained_cyan.png
new file mode 100644
index 0000000..b05428c
Binary files /dev/null and b/website/blocks/hardened_clay_stained_cyan.png differ
diff --git a/website/blocks/hardened_clay_stained_gray.png b/website/blocks/hardened_clay_stained_gray.png
new file mode 100644
index 0000000..8f86904
Binary files /dev/null and b/website/blocks/hardened_clay_stained_gray.png differ
diff --git a/website/blocks/hardened_clay_stained_green.png b/website/blocks/hardened_clay_stained_green.png
new file mode 100644
index 0000000..e89162e
Binary files /dev/null and b/website/blocks/hardened_clay_stained_green.png differ
diff --git a/website/blocks/hardened_clay_stained_light_blue.png b/website/blocks/hardened_clay_stained_light_blue.png
new file mode 100644
index 0000000..3d9ebea
Binary files /dev/null and b/website/blocks/hardened_clay_stained_light_blue.png differ
diff --git a/website/blocks/hardened_clay_stained_lime.png b/website/blocks/hardened_clay_stained_lime.png
new file mode 100644
index 0000000..b459a0b
Binary files /dev/null and b/website/blocks/hardened_clay_stained_lime.png differ
diff --git a/website/blocks/hardened_clay_stained_magenta.png b/website/blocks/hardened_clay_stained_magenta.png
new file mode 100644
index 0000000..9663106
Binary files /dev/null and b/website/blocks/hardened_clay_stained_magenta.png differ
diff --git a/website/blocks/hardened_clay_stained_orange.png b/website/blocks/hardened_clay_stained_orange.png
new file mode 100644
index 0000000..40929db
Binary files /dev/null and b/website/blocks/hardened_clay_stained_orange.png differ
diff --git a/website/blocks/hardened_clay_stained_pink.png b/website/blocks/hardened_clay_stained_pink.png
new file mode 100644
index 0000000..c21c0aa
Binary files /dev/null and b/website/blocks/hardened_clay_stained_pink.png differ
diff --git a/website/blocks/hardened_clay_stained_purple.png b/website/blocks/hardened_clay_stained_purple.png
new file mode 100644
index 0000000..edece94
Binary files /dev/null and b/website/blocks/hardened_clay_stained_purple.png differ
diff --git a/website/blocks/hardened_clay_stained_red.png b/website/blocks/hardened_clay_stained_red.png
new file mode 100644
index 0000000..6561d12
Binary files /dev/null and b/website/blocks/hardened_clay_stained_red.png differ
diff --git a/website/blocks/hardened_clay_stained_silver.png b/website/blocks/hardened_clay_stained_silver.png
new file mode 100644
index 0000000..eae07f2
Binary files /dev/null and b/website/blocks/hardened_clay_stained_silver.png differ
diff --git a/website/blocks/hardened_clay_stained_white.png b/website/blocks/hardened_clay_stained_white.png
new file mode 100644
index 0000000..8066af0
Binary files /dev/null and b/website/blocks/hardened_clay_stained_white.png differ
diff --git a/website/blocks/hardened_clay_stained_yellow.png b/website/blocks/hardened_clay_stained_yellow.png
new file mode 100644
index 0000000..5da4687
Binary files /dev/null and b/website/blocks/hardened_clay_stained_yellow.png differ
diff --git a/website/blocks/hay_block_side.png b/website/blocks/hay_block_side.png
new file mode 100644
index 0000000..a2b32db
Binary files /dev/null and b/website/blocks/hay_block_side.png differ
diff --git a/website/blocks/hay_block_top.png b/website/blocks/hay_block_top.png
new file mode 100644
index 0000000..1d35593
Binary files /dev/null and b/website/blocks/hay_block_top.png differ
diff --git a/website/blocks/hopper_inside.png b/website/blocks/hopper_inside.png
new file mode 100644
index 0000000..24e8eae
Binary files /dev/null and b/website/blocks/hopper_inside.png differ
diff --git a/website/blocks/hopper_outside.png b/website/blocks/hopper_outside.png
new file mode 100644
index 0000000..50ed8d5
Binary files /dev/null and b/website/blocks/hopper_outside.png differ
diff --git a/website/blocks/hopper_top.png b/website/blocks/hopper_top.png
new file mode 100644
index 0000000..e0dbe96
Binary files /dev/null and b/website/blocks/hopper_top.png differ
diff --git a/website/blocks/ice.png b/website/blocks/ice.png
new file mode 100644
index 0000000..ac946e9
Binary files /dev/null and b/website/blocks/ice.png differ
diff --git a/website/blocks/ice_packed.png b/website/blocks/ice_packed.png
new file mode 100644
index 0000000..50f0f34
Binary files /dev/null and b/website/blocks/ice_packed.png differ
diff --git a/website/blocks/iron_bars.png b/website/blocks/iron_bars.png
new file mode 100644
index 0000000..732807f
Binary files /dev/null and b/website/blocks/iron_bars.png differ
diff --git a/website/blocks/iron_block.png b/website/blocks/iron_block.png
new file mode 100644
index 0000000..7816799
Binary files /dev/null and b/website/blocks/iron_block.png differ
diff --git a/website/blocks/iron_ore.png b/website/blocks/iron_ore.png
new file mode 100644
index 0000000..250d8bb
Binary files /dev/null and b/website/blocks/iron_ore.png differ
diff --git a/website/blocks/iron_trapdoor.png b/website/blocks/iron_trapdoor.png
new file mode 100644
index 0000000..d3c974c
Binary files /dev/null and b/website/blocks/iron_trapdoor.png differ
diff --git a/website/blocks/itemframe_background.png b/website/blocks/itemframe_background.png
new file mode 100644
index 0000000..b40ad65
Binary files /dev/null and b/website/blocks/itemframe_background.png differ
diff --git a/website/blocks/jukebox_side.png b/website/blocks/jukebox_side.png
new file mode 100644
index 0000000..a3c27c1
Binary files /dev/null and b/website/blocks/jukebox_side.png differ
diff --git a/website/blocks/jukebox_top.png b/website/blocks/jukebox_top.png
new file mode 100644
index 0000000..92ddb15
Binary files /dev/null and b/website/blocks/jukebox_top.png differ
diff --git a/website/blocks/ladder.png b/website/blocks/ladder.png
new file mode 100644
index 0000000..e2ec5f2
Binary files /dev/null and b/website/blocks/ladder.png differ
diff --git a/website/blocks/lapis_block.png b/website/blocks/lapis_block.png
new file mode 100644
index 0000000..0271489
Binary files /dev/null and b/website/blocks/lapis_block.png differ
diff --git a/website/blocks/lapis_ore.png b/website/blocks/lapis_ore.png
new file mode 100644
index 0000000..6144236
Binary files /dev/null and b/website/blocks/lapis_ore.png differ
diff --git a/website/blocks/lava_flow.png b/website/blocks/lava_flow.png
new file mode 100644
index 0000000..af07f91
Binary files /dev/null and b/website/blocks/lava_flow.png differ
diff --git a/website/blocks/lava_flow.png.mcmeta b/website/blocks/lava_flow.png.mcmeta
new file mode 100644
index 0000000..8e55e43
--- /dev/null
+++ b/website/blocks/lava_flow.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 3
+ }
+}
diff --git a/website/blocks/lava_still.png b/website/blocks/lava_still.png
new file mode 100644
index 0000000..78bb29d
Binary files /dev/null and b/website/blocks/lava_still.png differ
diff --git a/website/blocks/lava_still.png.mcmeta b/website/blocks/lava_still.png.mcmeta
new file mode 100644
index 0000000..7ceb363
--- /dev/null
+++ b/website/blocks/lava_still.png.mcmeta
@@ -0,0 +1,45 @@
+{
+ "animation": {
+ "frametime": 2,
+ "frames": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 18,
+ 17,
+ 16,
+ 15,
+ 14,
+ 13,
+ 12,
+ 11,
+ 10,
+ 9,
+ 8,
+ 7,
+ 6,
+ 5,
+ 4,
+ 3,
+ 2,
+ 1
+ ]
+ }
+}
\ No newline at end of file
diff --git a/website/blocks/leaves_acacia.png b/website/blocks/leaves_acacia.png
new file mode 100644
index 0000000..d54eb17
Binary files /dev/null and b/website/blocks/leaves_acacia.png differ
diff --git a/website/blocks/leaves_big_oak.png b/website/blocks/leaves_big_oak.png
new file mode 100644
index 0000000..a6773af
Binary files /dev/null and b/website/blocks/leaves_big_oak.png differ
diff --git a/website/blocks/leaves_birch.png b/website/blocks/leaves_birch.png
new file mode 100644
index 0000000..a6773af
Binary files /dev/null and b/website/blocks/leaves_birch.png differ
diff --git a/website/blocks/leaves_jungle.png b/website/blocks/leaves_jungle.png
new file mode 100644
index 0000000..e0cb935
Binary files /dev/null and b/website/blocks/leaves_jungle.png differ
diff --git a/website/blocks/leaves_oak.png b/website/blocks/leaves_oak.png
new file mode 100644
index 0000000..a6773af
Binary files /dev/null and b/website/blocks/leaves_oak.png differ
diff --git a/website/blocks/leaves_spruce.png b/website/blocks/leaves_spruce.png
new file mode 100644
index 0000000..602eab8
Binary files /dev/null and b/website/blocks/leaves_spruce.png differ
diff --git a/website/blocks/lever.png b/website/blocks/lever.png
new file mode 100644
index 0000000..051187f
Binary files /dev/null and b/website/blocks/lever.png differ
diff --git a/website/blocks/log_acacia.png b/website/blocks/log_acacia.png
new file mode 100644
index 0000000..d221210
Binary files /dev/null and b/website/blocks/log_acacia.png differ
diff --git a/website/blocks/log_acacia_top.png b/website/blocks/log_acacia_top.png
new file mode 100644
index 0000000..3d44878
Binary files /dev/null and b/website/blocks/log_acacia_top.png differ
diff --git a/website/blocks/log_big_oak.png b/website/blocks/log_big_oak.png
new file mode 100644
index 0000000..d4da03e
Binary files /dev/null and b/website/blocks/log_big_oak.png differ
diff --git a/website/blocks/log_big_oak_top.png b/website/blocks/log_big_oak_top.png
new file mode 100644
index 0000000..99137b6
Binary files /dev/null and b/website/blocks/log_big_oak_top.png differ
diff --git a/website/blocks/log_birch.png b/website/blocks/log_birch.png
new file mode 100644
index 0000000..bfb209d
Binary files /dev/null and b/website/blocks/log_birch.png differ
diff --git a/website/blocks/log_birch_top.png b/website/blocks/log_birch_top.png
new file mode 100644
index 0000000..f9b94f4
Binary files /dev/null and b/website/blocks/log_birch_top.png differ
diff --git a/website/blocks/log_jungle.png b/website/blocks/log_jungle.png
new file mode 100644
index 0000000..0b7120a
Binary files /dev/null and b/website/blocks/log_jungle.png differ
diff --git a/website/blocks/log_jungle_top.png b/website/blocks/log_jungle_top.png
new file mode 100644
index 0000000..26b0361
Binary files /dev/null and b/website/blocks/log_jungle_top.png differ
diff --git a/website/blocks/log_oak.png b/website/blocks/log_oak.png
new file mode 100644
index 0000000..914cb5f
Binary files /dev/null and b/website/blocks/log_oak.png differ
diff --git a/website/blocks/log_oak_top.png b/website/blocks/log_oak_top.png
new file mode 100644
index 0000000..7a44e77
Binary files /dev/null and b/website/blocks/log_oak_top.png differ
diff --git a/website/blocks/log_spruce.png b/website/blocks/log_spruce.png
new file mode 100644
index 0000000..dc1aa2f
Binary files /dev/null and b/website/blocks/log_spruce.png differ
diff --git a/website/blocks/log_spruce_top.png b/website/blocks/log_spruce_top.png
new file mode 100644
index 0000000..280c64e
Binary files /dev/null and b/website/blocks/log_spruce_top.png differ
diff --git a/website/blocks/melon_side.png b/website/blocks/melon_side.png
new file mode 100644
index 0000000..ec7b430
Binary files /dev/null and b/website/blocks/melon_side.png differ
diff --git a/website/blocks/melon_stem_connected.png b/website/blocks/melon_stem_connected.png
new file mode 100644
index 0000000..6a5c10e
Binary files /dev/null and b/website/blocks/melon_stem_connected.png differ
diff --git a/website/blocks/melon_stem_disconnected.png b/website/blocks/melon_stem_disconnected.png
new file mode 100644
index 0000000..38065ef
Binary files /dev/null and b/website/blocks/melon_stem_disconnected.png differ
diff --git a/website/blocks/melon_top.png b/website/blocks/melon_top.png
new file mode 100644
index 0000000..65cf169
Binary files /dev/null and b/website/blocks/melon_top.png differ
diff --git a/website/blocks/mob_spawner.png b/website/blocks/mob_spawner.png
new file mode 100644
index 0000000..7d55217
Binary files /dev/null and b/website/blocks/mob_spawner.png differ
diff --git a/website/blocks/mushroom_block_inside.png b/website/blocks/mushroom_block_inside.png
new file mode 100644
index 0000000..f0e7a04
Binary files /dev/null and b/website/blocks/mushroom_block_inside.png differ
diff --git a/website/blocks/mushroom_block_skin_brown.png b/website/blocks/mushroom_block_skin_brown.png
new file mode 100644
index 0000000..1f52ba8
Binary files /dev/null and b/website/blocks/mushroom_block_skin_brown.png differ
diff --git a/website/blocks/mushroom_block_skin_red.png b/website/blocks/mushroom_block_skin_red.png
new file mode 100644
index 0000000..66cf12c
Binary files /dev/null and b/website/blocks/mushroom_block_skin_red.png differ
diff --git a/website/blocks/mushroom_block_skin_stem.png b/website/blocks/mushroom_block_skin_stem.png
new file mode 100644
index 0000000..83c0840
Binary files /dev/null and b/website/blocks/mushroom_block_skin_stem.png differ
diff --git a/website/blocks/mushroom_brown.png b/website/blocks/mushroom_brown.png
new file mode 100644
index 0000000..bf33d34
Binary files /dev/null and b/website/blocks/mushroom_brown.png differ
diff --git a/website/blocks/mushroom_red.png b/website/blocks/mushroom_red.png
new file mode 100644
index 0000000..1b332b7
Binary files /dev/null and b/website/blocks/mushroom_red.png differ
diff --git a/website/blocks/mycelium_side.png b/website/blocks/mycelium_side.png
new file mode 100644
index 0000000..5547425
Binary files /dev/null and b/website/blocks/mycelium_side.png differ
diff --git a/website/blocks/mycelium_top.png b/website/blocks/mycelium_top.png
new file mode 100644
index 0000000..088a825
Binary files /dev/null and b/website/blocks/mycelium_top.png differ
diff --git a/website/blocks/nether_brick.png b/website/blocks/nether_brick.png
new file mode 100644
index 0000000..caaf66f
Binary files /dev/null and b/website/blocks/nether_brick.png differ
diff --git a/website/blocks/nether_wart_stage_0.png b/website/blocks/nether_wart_stage_0.png
new file mode 100644
index 0000000..514a95b
Binary files /dev/null and b/website/blocks/nether_wart_stage_0.png differ
diff --git a/website/blocks/nether_wart_stage_1.png b/website/blocks/nether_wart_stage_1.png
new file mode 100644
index 0000000..b4ad0d1
Binary files /dev/null and b/website/blocks/nether_wart_stage_1.png differ
diff --git a/website/blocks/nether_wart_stage_2.png b/website/blocks/nether_wart_stage_2.png
new file mode 100644
index 0000000..b9b6743
Binary files /dev/null and b/website/blocks/nether_wart_stage_2.png differ
diff --git a/website/blocks/netherrack.png b/website/blocks/netherrack.png
new file mode 100644
index 0000000..88129c4
Binary files /dev/null and b/website/blocks/netherrack.png differ
diff --git a/website/blocks/noteblock.png b/website/blocks/noteblock.png
new file mode 100644
index 0000000..a3c27c1
Binary files /dev/null and b/website/blocks/noteblock.png differ
diff --git a/website/blocks/obsidian.png b/website/blocks/obsidian.png
new file mode 100644
index 0000000..ff0a683
Binary files /dev/null and b/website/blocks/obsidian.png differ
diff --git a/website/blocks/piston_bottom.png b/website/blocks/piston_bottom.png
new file mode 100644
index 0000000..a3a5a08
Binary files /dev/null and b/website/blocks/piston_bottom.png differ
diff --git a/website/blocks/piston_inner.png b/website/blocks/piston_inner.png
new file mode 100644
index 0000000..1043929
Binary files /dev/null and b/website/blocks/piston_inner.png differ
diff --git a/website/blocks/piston_side.png b/website/blocks/piston_side.png
new file mode 100644
index 0000000..634f54a
Binary files /dev/null and b/website/blocks/piston_side.png differ
diff --git a/website/blocks/piston_top_normal.png b/website/blocks/piston_top_normal.png
new file mode 100644
index 0000000..eeaadab
Binary files /dev/null and b/website/blocks/piston_top_normal.png differ
diff --git a/website/blocks/piston_top_sticky.png b/website/blocks/piston_top_sticky.png
new file mode 100644
index 0000000..6ddd4ad
Binary files /dev/null and b/website/blocks/piston_top_sticky.png differ
diff --git a/website/blocks/planks_acacia.png b/website/blocks/planks_acacia.png
new file mode 100644
index 0000000..6858c51
Binary files /dev/null and b/website/blocks/planks_acacia.png differ
diff --git a/website/blocks/planks_big_oak.png b/website/blocks/planks_big_oak.png
new file mode 100644
index 0000000..e3fd4ea
Binary files /dev/null and b/website/blocks/planks_big_oak.png differ
diff --git a/website/blocks/planks_birch.png b/website/blocks/planks_birch.png
new file mode 100644
index 0000000..b113e3a
Binary files /dev/null and b/website/blocks/planks_birch.png differ
diff --git a/website/blocks/planks_jungle.png b/website/blocks/planks_jungle.png
new file mode 100644
index 0000000..e3fe82d
Binary files /dev/null and b/website/blocks/planks_jungle.png differ
diff --git a/website/blocks/planks_oak.png b/website/blocks/planks_oak.png
new file mode 100644
index 0000000..346f77d
Binary files /dev/null and b/website/blocks/planks_oak.png differ
diff --git a/website/blocks/planks_spruce.png b/website/blocks/planks_spruce.png
new file mode 100644
index 0000000..f45fa94
Binary files /dev/null and b/website/blocks/planks_spruce.png differ
diff --git a/website/blocks/portal.png b/website/blocks/portal.png
new file mode 100644
index 0000000..96859e2
Binary files /dev/null and b/website/blocks/portal.png differ
diff --git a/website/blocks/portal.png.mcmeta b/website/blocks/portal.png.mcmeta
new file mode 100644
index 0000000..4f0718a
--- /dev/null
+++ b/website/blocks/portal.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
\ No newline at end of file
diff --git a/website/blocks/potatoes_stage_0.png b/website/blocks/potatoes_stage_0.png
new file mode 100644
index 0000000..c1ef732
Binary files /dev/null and b/website/blocks/potatoes_stage_0.png differ
diff --git a/website/blocks/potatoes_stage_1.png b/website/blocks/potatoes_stage_1.png
new file mode 100644
index 0000000..1275f4f
Binary files /dev/null and b/website/blocks/potatoes_stage_1.png differ
diff --git a/website/blocks/potatoes_stage_2.png b/website/blocks/potatoes_stage_2.png
new file mode 100644
index 0000000..b7347df
Binary files /dev/null and b/website/blocks/potatoes_stage_2.png differ
diff --git a/website/blocks/potatoes_stage_3.png b/website/blocks/potatoes_stage_3.png
new file mode 100644
index 0000000..d7e8185
Binary files /dev/null and b/website/blocks/potatoes_stage_3.png differ
diff --git a/website/blocks/prismarine_bricks.png b/website/blocks/prismarine_bricks.png
new file mode 100644
index 0000000..5890690
Binary files /dev/null and b/website/blocks/prismarine_bricks.png differ
diff --git a/website/blocks/prismarine_dark.png b/website/blocks/prismarine_dark.png
new file mode 100644
index 0000000..07bed85
Binary files /dev/null and b/website/blocks/prismarine_dark.png differ
diff --git a/website/blocks/prismarine_rough.png b/website/blocks/prismarine_rough.png
new file mode 100644
index 0000000..fe133e2
Binary files /dev/null and b/website/blocks/prismarine_rough.png differ
diff --git a/website/blocks/prismarine_rough.png.mcmeta b/website/blocks/prismarine_rough.png.mcmeta
new file mode 100644
index 0000000..410b327
--- /dev/null
+++ b/website/blocks/prismarine_rough.png.mcmeta
@@ -0,0 +1,30 @@
+{
+ "animation": {
+ "frametime": 300,
+ "interpolate": true,
+ "frames": [
+ 0,
+ 1,
+ 0,
+ 2,
+ 0,
+ 3,
+ 0,
+ 1,
+ 2,
+ 1,
+ 3,
+ 1,
+ 0,
+ 2,
+ 1,
+ 2,
+ 3,
+ 2,
+ 0,
+ 3,
+ 1,
+ 3
+ ]
+ }
+}
diff --git a/website/blocks/pumpkin_face_off.png b/website/blocks/pumpkin_face_off.png
new file mode 100644
index 0000000..ecef025
Binary files /dev/null and b/website/blocks/pumpkin_face_off.png differ
diff --git a/website/blocks/pumpkin_face_on.png b/website/blocks/pumpkin_face_on.png
new file mode 100644
index 0000000..907f499
Binary files /dev/null and b/website/blocks/pumpkin_face_on.png differ
diff --git a/website/blocks/pumpkin_side.png b/website/blocks/pumpkin_side.png
new file mode 100644
index 0000000..75dfc47
Binary files /dev/null and b/website/blocks/pumpkin_side.png differ
diff --git a/website/blocks/pumpkin_stem_connected.png b/website/blocks/pumpkin_stem_connected.png
new file mode 100644
index 0000000..6a5c10e
Binary files /dev/null and b/website/blocks/pumpkin_stem_connected.png differ
diff --git a/website/blocks/pumpkin_stem_disconnected.png b/website/blocks/pumpkin_stem_disconnected.png
new file mode 100644
index 0000000..38065ef
Binary files /dev/null and b/website/blocks/pumpkin_stem_disconnected.png differ
diff --git a/website/blocks/pumpkin_top.png b/website/blocks/pumpkin_top.png
new file mode 100644
index 0000000..297ce3c
Binary files /dev/null and b/website/blocks/pumpkin_top.png differ
diff --git a/website/blocks/quartz_block_bottom.png b/website/blocks/quartz_block_bottom.png
new file mode 100644
index 0000000..7e16c7c
Binary files /dev/null and b/website/blocks/quartz_block_bottom.png differ
diff --git a/website/blocks/quartz_block_chiseled.png b/website/blocks/quartz_block_chiseled.png
new file mode 100644
index 0000000..80465a1
Binary files /dev/null and b/website/blocks/quartz_block_chiseled.png differ
diff --git a/website/blocks/quartz_block_chiseled_top.png b/website/blocks/quartz_block_chiseled_top.png
new file mode 100644
index 0000000..44073e5
Binary files /dev/null and b/website/blocks/quartz_block_chiseled_top.png differ
diff --git a/website/blocks/quartz_block_lines.png b/website/blocks/quartz_block_lines.png
new file mode 100644
index 0000000..184ecd2
Binary files /dev/null and b/website/blocks/quartz_block_lines.png differ
diff --git a/website/blocks/quartz_block_lines_top.png b/website/blocks/quartz_block_lines_top.png
new file mode 100644
index 0000000..6d20379
Binary files /dev/null and b/website/blocks/quartz_block_lines_top.png differ
diff --git a/website/blocks/quartz_block_side.png b/website/blocks/quartz_block_side.png
new file mode 100644
index 0000000..a2cd2ca
Binary files /dev/null and b/website/blocks/quartz_block_side.png differ
diff --git a/website/blocks/quartz_block_top.png b/website/blocks/quartz_block_top.png
new file mode 100644
index 0000000..a2cd2ca
Binary files /dev/null and b/website/blocks/quartz_block_top.png differ
diff --git a/website/blocks/quartz_ore.png b/website/blocks/quartz_ore.png
new file mode 100644
index 0000000..4d758c1
Binary files /dev/null and b/website/blocks/quartz_ore.png differ
diff --git a/website/blocks/rail_activator.png b/website/blocks/rail_activator.png
new file mode 100644
index 0000000..ce115ba
Binary files /dev/null and b/website/blocks/rail_activator.png differ
diff --git a/website/blocks/rail_activator_powered.png b/website/blocks/rail_activator_powered.png
new file mode 100644
index 0000000..a3aaca9
Binary files /dev/null and b/website/blocks/rail_activator_powered.png differ
diff --git a/website/blocks/rail_detector.png b/website/blocks/rail_detector.png
new file mode 100644
index 0000000..92c1466
Binary files /dev/null and b/website/blocks/rail_detector.png differ
diff --git a/website/blocks/rail_detector_powered.png b/website/blocks/rail_detector_powered.png
new file mode 100644
index 0000000..a1c6e6b
Binary files /dev/null and b/website/blocks/rail_detector_powered.png differ
diff --git a/website/blocks/rail_golden.png b/website/blocks/rail_golden.png
new file mode 100644
index 0000000..1fc52c3
Binary files /dev/null and b/website/blocks/rail_golden.png differ
diff --git a/website/blocks/rail_golden_powered.png b/website/blocks/rail_golden_powered.png
new file mode 100644
index 0000000..bd343be
Binary files /dev/null and b/website/blocks/rail_golden_powered.png differ
diff --git a/website/blocks/rail_normal.png b/website/blocks/rail_normal.png
new file mode 100644
index 0000000..d609236
Binary files /dev/null and b/website/blocks/rail_normal.png differ
diff --git a/website/blocks/rail_normal_turned.png b/website/blocks/rail_normal_turned.png
new file mode 100644
index 0000000..f394a23
Binary files /dev/null and b/website/blocks/rail_normal_turned.png differ
diff --git a/website/blocks/red_sand.png b/website/blocks/red_sand.png
new file mode 100644
index 0000000..b216a42
Binary files /dev/null and b/website/blocks/red_sand.png differ
diff --git a/website/blocks/red_sandstone_bottom.png b/website/blocks/red_sandstone_bottom.png
new file mode 100644
index 0000000..7e7a8c9
Binary files /dev/null and b/website/blocks/red_sandstone_bottom.png differ
diff --git a/website/blocks/red_sandstone_carved.png b/website/blocks/red_sandstone_carved.png
new file mode 100644
index 0000000..41070da
Binary files /dev/null and b/website/blocks/red_sandstone_carved.png differ
diff --git a/website/blocks/red_sandstone_normal.png b/website/blocks/red_sandstone_normal.png
new file mode 100644
index 0000000..f641784
Binary files /dev/null and b/website/blocks/red_sandstone_normal.png differ
diff --git a/website/blocks/red_sandstone_smooth.png b/website/blocks/red_sandstone_smooth.png
new file mode 100644
index 0000000..fd44a72
Binary files /dev/null and b/website/blocks/red_sandstone_smooth.png differ
diff --git a/website/blocks/red_sandstone_top.png b/website/blocks/red_sandstone_top.png
new file mode 100644
index 0000000..794dbeb
Binary files /dev/null and b/website/blocks/red_sandstone_top.png differ
diff --git a/website/blocks/redstone_block.png b/website/blocks/redstone_block.png
new file mode 100644
index 0000000..fcf6b40
Binary files /dev/null and b/website/blocks/redstone_block.png differ
diff --git a/website/blocks/redstone_dust_cross.png b/website/blocks/redstone_dust_cross.png
new file mode 100644
index 0000000..dcec893
Binary files /dev/null and b/website/blocks/redstone_dust_cross.png differ
diff --git a/website/blocks/redstone_dust_cross_overlay.png b/website/blocks/redstone_dust_cross_overlay.png
new file mode 100644
index 0000000..96729e1
Binary files /dev/null and b/website/blocks/redstone_dust_cross_overlay.png differ
diff --git a/website/blocks/redstone_dust_line.png b/website/blocks/redstone_dust_line.png
new file mode 100644
index 0000000..ff0fb23
Binary files /dev/null and b/website/blocks/redstone_dust_line.png differ
diff --git a/website/blocks/redstone_dust_line_overlay.png b/website/blocks/redstone_dust_line_overlay.png
new file mode 100644
index 0000000..9f24cbc
Binary files /dev/null and b/website/blocks/redstone_dust_line_overlay.png differ
diff --git a/website/blocks/redstone_lamp_off.png b/website/blocks/redstone_lamp_off.png
new file mode 100644
index 0000000..522765b
Binary files /dev/null and b/website/blocks/redstone_lamp_off.png differ
diff --git a/website/blocks/redstone_lamp_on.png b/website/blocks/redstone_lamp_on.png
new file mode 100644
index 0000000..9562ef3
Binary files /dev/null and b/website/blocks/redstone_lamp_on.png differ
diff --git a/website/blocks/redstone_ore.png b/website/blocks/redstone_ore.png
new file mode 100644
index 0000000..575a488
Binary files /dev/null and b/website/blocks/redstone_ore.png differ
diff --git a/website/blocks/redstone_torch_off.png b/website/blocks/redstone_torch_off.png
new file mode 100644
index 0000000..635eabd
Binary files /dev/null and b/website/blocks/redstone_torch_off.png differ
diff --git a/website/blocks/redstone_torch_on.png b/website/blocks/redstone_torch_on.png
new file mode 100644
index 0000000..2983d6c
Binary files /dev/null and b/website/blocks/redstone_torch_on.png differ
diff --git a/website/blocks/reeds.png b/website/blocks/reeds.png
new file mode 100644
index 0000000..64bbfe0
Binary files /dev/null and b/website/blocks/reeds.png differ
diff --git a/website/blocks/repeater_off.png b/website/blocks/repeater_off.png
new file mode 100644
index 0000000..8634669
Binary files /dev/null and b/website/blocks/repeater_off.png differ
diff --git a/website/blocks/repeater_on.png b/website/blocks/repeater_on.png
new file mode 100644
index 0000000..d71d0d9
Binary files /dev/null and b/website/blocks/repeater_on.png differ
diff --git a/website/blocks/sand.png b/website/blocks/sand.png
new file mode 100644
index 0000000..86b9654
Binary files /dev/null and b/website/blocks/sand.png differ
diff --git a/website/blocks/sandstone_bottom.png b/website/blocks/sandstone_bottom.png
new file mode 100644
index 0000000..e102220
Binary files /dev/null and b/website/blocks/sandstone_bottom.png differ
diff --git a/website/blocks/sandstone_carved.png b/website/blocks/sandstone_carved.png
new file mode 100644
index 0000000..9bd7fa1
Binary files /dev/null and b/website/blocks/sandstone_carved.png differ
diff --git a/website/blocks/sandstone_normal.png b/website/blocks/sandstone_normal.png
new file mode 100644
index 0000000..1b79145
Binary files /dev/null and b/website/blocks/sandstone_normal.png differ
diff --git a/website/blocks/sandstone_smooth.png b/website/blocks/sandstone_smooth.png
new file mode 100644
index 0000000..ef118bd
Binary files /dev/null and b/website/blocks/sandstone_smooth.png differ
diff --git a/website/blocks/sandstone_top.png b/website/blocks/sandstone_top.png
new file mode 100644
index 0000000..bb5b157
Binary files /dev/null and b/website/blocks/sandstone_top.png differ
diff --git a/website/blocks/sapling_acacia.png b/website/blocks/sapling_acacia.png
new file mode 100644
index 0000000..a1215cb
Binary files /dev/null and b/website/blocks/sapling_acacia.png differ
diff --git a/website/blocks/sapling_birch.png b/website/blocks/sapling_birch.png
new file mode 100644
index 0000000..b0dacc5
Binary files /dev/null and b/website/blocks/sapling_birch.png differ
diff --git a/website/blocks/sapling_jungle.png b/website/blocks/sapling_jungle.png
new file mode 100644
index 0000000..4e10b35
Binary files /dev/null and b/website/blocks/sapling_jungle.png differ
diff --git a/website/blocks/sapling_oak.png b/website/blocks/sapling_oak.png
new file mode 100644
index 0000000..1bf1bfa
Binary files /dev/null and b/website/blocks/sapling_oak.png differ
diff --git a/website/blocks/sapling_roofed_oak.png b/website/blocks/sapling_roofed_oak.png
new file mode 100644
index 0000000..dcf5588
Binary files /dev/null and b/website/blocks/sapling_roofed_oak.png differ
diff --git a/website/blocks/sapling_spruce.png b/website/blocks/sapling_spruce.png
new file mode 100644
index 0000000..5767d48
Binary files /dev/null and b/website/blocks/sapling_spruce.png differ
diff --git a/website/blocks/sea_lantern.png b/website/blocks/sea_lantern.png
new file mode 100644
index 0000000..4f08fd2
Binary files /dev/null and b/website/blocks/sea_lantern.png differ
diff --git a/website/blocks/sea_lantern.png.mcmeta b/website/blocks/sea_lantern.png.mcmeta
new file mode 100644
index 0000000..e8ac9bc
--- /dev/null
+++ b/website/blocks/sea_lantern.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 5
+ }
+}
diff --git a/website/blocks/slime.png b/website/blocks/slime.png
new file mode 100644
index 0000000..6dbe5cb
Binary files /dev/null and b/website/blocks/slime.png differ
diff --git a/website/blocks/snow.png b/website/blocks/snow.png
new file mode 100644
index 0000000..5c146cd
Binary files /dev/null and b/website/blocks/snow.png differ
diff --git a/website/blocks/soul_sand.png b/website/blocks/soul_sand.png
new file mode 100644
index 0000000..fca7e8f
Binary files /dev/null and b/website/blocks/soul_sand.png differ
diff --git a/website/blocks/sponge.png b/website/blocks/sponge.png
new file mode 100644
index 0000000..7850703
Binary files /dev/null and b/website/blocks/sponge.png differ
diff --git a/website/blocks/sponge_wet.png b/website/blocks/sponge_wet.png
new file mode 100644
index 0000000..d024995
Binary files /dev/null and b/website/blocks/sponge_wet.png differ
diff --git a/website/blocks/stone.png b/website/blocks/stone.png
new file mode 100644
index 0000000..87e19ff
Binary files /dev/null and b/website/blocks/stone.png differ
diff --git a/website/blocks/stone_andesite.png b/website/blocks/stone_andesite.png
new file mode 100644
index 0000000..680a899
Binary files /dev/null and b/website/blocks/stone_andesite.png differ
diff --git a/website/blocks/stone_andesite_smooth.png b/website/blocks/stone_andesite_smooth.png
new file mode 100644
index 0000000..a77809c
Binary files /dev/null and b/website/blocks/stone_andesite_smooth.png differ
diff --git a/website/blocks/stone_diorite.png b/website/blocks/stone_diorite.png
new file mode 100644
index 0000000..711c838
Binary files /dev/null and b/website/blocks/stone_diorite.png differ
diff --git a/website/blocks/stone_diorite_smooth.png b/website/blocks/stone_diorite_smooth.png
new file mode 100644
index 0000000..8b4f8e3
Binary files /dev/null and b/website/blocks/stone_diorite_smooth.png differ
diff --git a/website/blocks/stone_granite.png b/website/blocks/stone_granite.png
new file mode 100644
index 0000000..07c7af8
Binary files /dev/null and b/website/blocks/stone_granite.png differ
diff --git a/website/blocks/stone_granite_smooth.png b/website/blocks/stone_granite_smooth.png
new file mode 100644
index 0000000..d5b37f1
Binary files /dev/null and b/website/blocks/stone_granite_smooth.png differ
diff --git a/website/blocks/stone_slab_side.png b/website/blocks/stone_slab_side.png
new file mode 100644
index 0000000..fe2a204
Binary files /dev/null and b/website/blocks/stone_slab_side.png differ
diff --git a/website/blocks/stone_slab_top.png b/website/blocks/stone_slab_top.png
new file mode 100644
index 0000000..090657d
Binary files /dev/null and b/website/blocks/stone_slab_top.png differ
diff --git a/website/blocks/stonebrick.png b/website/blocks/stonebrick.png
new file mode 100644
index 0000000..69138cf
Binary files /dev/null and b/website/blocks/stonebrick.png differ
diff --git a/website/blocks/stonebrick_carved.png b/website/blocks/stonebrick_carved.png
new file mode 100644
index 0000000..b7e88db
Binary files /dev/null and b/website/blocks/stonebrick_carved.png differ
diff --git a/website/blocks/stonebrick_cracked.png b/website/blocks/stonebrick_cracked.png
new file mode 100644
index 0000000..918a884
Binary files /dev/null and b/website/blocks/stonebrick_cracked.png differ
diff --git a/website/blocks/stonebrick_mossy.png b/website/blocks/stonebrick_mossy.png
new file mode 100644
index 0000000..5b9fe37
Binary files /dev/null and b/website/blocks/stonebrick_mossy.png differ
diff --git a/website/blocks/tallgrass.png b/website/blocks/tallgrass.png
new file mode 100644
index 0000000..2869848
Binary files /dev/null and b/website/blocks/tallgrass.png differ
diff --git a/website/blocks/tnt_bottom.png b/website/blocks/tnt_bottom.png
new file mode 100644
index 0000000..cc2e586
Binary files /dev/null and b/website/blocks/tnt_bottom.png differ
diff --git a/website/blocks/tnt_side.png b/website/blocks/tnt_side.png
new file mode 100644
index 0000000..21109fb
Binary files /dev/null and b/website/blocks/tnt_side.png differ
diff --git a/website/blocks/tnt_top.png b/website/blocks/tnt_top.png
new file mode 100644
index 0000000..ceb44b6
Binary files /dev/null and b/website/blocks/tnt_top.png differ
diff --git a/website/blocks/torch_on.png b/website/blocks/torch_on.png
new file mode 100644
index 0000000..a2ce41b
Binary files /dev/null and b/website/blocks/torch_on.png differ
diff --git a/website/blocks/trapdoor.png b/website/blocks/trapdoor.png
new file mode 100644
index 0000000..4eadefc
Binary files /dev/null and b/website/blocks/trapdoor.png differ
diff --git a/website/blocks/trip_wire.png b/website/blocks/trip_wire.png
new file mode 100644
index 0000000..42126b8
Binary files /dev/null and b/website/blocks/trip_wire.png differ
diff --git a/website/blocks/trip_wire_source.png b/website/blocks/trip_wire_source.png
new file mode 100644
index 0000000..fbd464d
Binary files /dev/null and b/website/blocks/trip_wire_source.png differ
diff --git a/website/blocks/vine.png b/website/blocks/vine.png
new file mode 100644
index 0000000..df5e435
Binary files /dev/null and b/website/blocks/vine.png differ
diff --git a/website/blocks/water_flow.png b/website/blocks/water_flow.png
new file mode 100644
index 0000000..e72280c
Binary files /dev/null and b/website/blocks/water_flow.png differ
diff --git a/website/blocks/water_flow.png.mcmeta b/website/blocks/water_flow.png.mcmeta
new file mode 100644
index 0000000..4f0718a
--- /dev/null
+++ b/website/blocks/water_flow.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
\ No newline at end of file
diff --git a/website/blocks/water_still.png b/website/blocks/water_still.png
new file mode 100644
index 0000000..c7e90b0
Binary files /dev/null and b/website/blocks/water_still.png differ
diff --git a/website/blocks/water_still.png.mcmeta b/website/blocks/water_still.png.mcmeta
new file mode 100644
index 0000000..0645f48
--- /dev/null
+++ b/website/blocks/water_still.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frametime": 2
+ }
+}
diff --git a/website/blocks/waterlily.png b/website/blocks/waterlily.png
new file mode 100644
index 0000000..f6c84f8
Binary files /dev/null and b/website/blocks/waterlily.png differ
diff --git a/website/blocks/web.png b/website/blocks/web.png
new file mode 100644
index 0000000..7c097f1
Binary files /dev/null and b/website/blocks/web.png differ
diff --git a/website/blocks/wheat_stage_0.png b/website/blocks/wheat_stage_0.png
new file mode 100644
index 0000000..185af6f
Binary files /dev/null and b/website/blocks/wheat_stage_0.png differ
diff --git a/website/blocks/wheat_stage_1.png b/website/blocks/wheat_stage_1.png
new file mode 100644
index 0000000..67588c1
Binary files /dev/null and b/website/blocks/wheat_stage_1.png differ
diff --git a/website/blocks/wheat_stage_2.png b/website/blocks/wheat_stage_2.png
new file mode 100644
index 0000000..3d33792
Binary files /dev/null and b/website/blocks/wheat_stage_2.png differ
diff --git a/website/blocks/wheat_stage_3.png b/website/blocks/wheat_stage_3.png
new file mode 100644
index 0000000..4649f78
Binary files /dev/null and b/website/blocks/wheat_stage_3.png differ
diff --git a/website/blocks/wheat_stage_4.png b/website/blocks/wheat_stage_4.png
new file mode 100644
index 0000000..ac04b52
Binary files /dev/null and b/website/blocks/wheat_stage_4.png differ
diff --git a/website/blocks/wheat_stage_5.png b/website/blocks/wheat_stage_5.png
new file mode 100644
index 0000000..1ea81ac
Binary files /dev/null and b/website/blocks/wheat_stage_5.png differ
diff --git a/website/blocks/wheat_stage_6.png b/website/blocks/wheat_stage_6.png
new file mode 100644
index 0000000..cb5f195
Binary files /dev/null and b/website/blocks/wheat_stage_6.png differ
diff --git a/website/blocks/wheat_stage_7.png b/website/blocks/wheat_stage_7.png
new file mode 100644
index 0000000..7acafb3
Binary files /dev/null and b/website/blocks/wheat_stage_7.png differ
diff --git a/website/blocks/wool_colored_black.png b/website/blocks/wool_colored_black.png
new file mode 100644
index 0000000..b74d5c9
Binary files /dev/null and b/website/blocks/wool_colored_black.png differ
diff --git a/website/blocks/wool_colored_blue.png b/website/blocks/wool_colored_blue.png
new file mode 100644
index 0000000..ce9515f
Binary files /dev/null and b/website/blocks/wool_colored_blue.png differ
diff --git a/website/blocks/wool_colored_brown.png b/website/blocks/wool_colored_brown.png
new file mode 100644
index 0000000..b4dc3c5
Binary files /dev/null and b/website/blocks/wool_colored_brown.png differ
diff --git a/website/blocks/wool_colored_cyan.png b/website/blocks/wool_colored_cyan.png
new file mode 100644
index 0000000..ca0800a
Binary files /dev/null and b/website/blocks/wool_colored_cyan.png differ
diff --git a/website/blocks/wool_colored_gray.png b/website/blocks/wool_colored_gray.png
new file mode 100644
index 0000000..6409ff2
Binary files /dev/null and b/website/blocks/wool_colored_gray.png differ
diff --git a/website/blocks/wool_colored_green.png b/website/blocks/wool_colored_green.png
new file mode 100644
index 0000000..a7be6d7
Binary files /dev/null and b/website/blocks/wool_colored_green.png differ
diff --git a/website/blocks/wool_colored_light_blue.png b/website/blocks/wool_colored_light_blue.png
new file mode 100644
index 0000000..72d9d9e
Binary files /dev/null and b/website/blocks/wool_colored_light_blue.png differ
diff --git a/website/blocks/wool_colored_lime.png b/website/blocks/wool_colored_lime.png
new file mode 100644
index 0000000..bf56389
Binary files /dev/null and b/website/blocks/wool_colored_lime.png differ
diff --git a/website/blocks/wool_colored_magenta.png b/website/blocks/wool_colored_magenta.png
new file mode 100644
index 0000000..3af6747
Binary files /dev/null and b/website/blocks/wool_colored_magenta.png differ
diff --git a/website/blocks/wool_colored_orange.png b/website/blocks/wool_colored_orange.png
new file mode 100644
index 0000000..eefe6de
Binary files /dev/null and b/website/blocks/wool_colored_orange.png differ
diff --git a/website/blocks/wool_colored_pink.png b/website/blocks/wool_colored_pink.png
new file mode 100644
index 0000000..c2785af
Binary files /dev/null and b/website/blocks/wool_colored_pink.png differ
diff --git a/website/blocks/wool_colored_purple.png b/website/blocks/wool_colored_purple.png
new file mode 100644
index 0000000..76f68d6
Binary files /dev/null and b/website/blocks/wool_colored_purple.png differ
diff --git a/website/blocks/wool_colored_red.png b/website/blocks/wool_colored_red.png
new file mode 100644
index 0000000..0cff7a9
Binary files /dev/null and b/website/blocks/wool_colored_red.png differ
diff --git a/website/blocks/wool_colored_silver.png b/website/blocks/wool_colored_silver.png
new file mode 100644
index 0000000..756d9b0
Binary files /dev/null and b/website/blocks/wool_colored_silver.png differ
diff --git a/website/blocks/wool_colored_white.png b/website/blocks/wool_colored_white.png
new file mode 100644
index 0000000..abc7999
Binary files /dev/null and b/website/blocks/wool_colored_white.png differ
diff --git a/website/blocks/wool_colored_yellow.png b/website/blocks/wool_colored_yellow.png
new file mode 100644
index 0000000..4babaaa
Binary files /dev/null and b/website/blocks/wool_colored_yellow.png differ
diff --git a/website/items/apple.png b/website/items/apple.png
new file mode 100644
index 0000000..3e2ee59
Binary files /dev/null and b/website/items/apple.png differ
diff --git a/website/items/apple_golden.png b/website/items/apple_golden.png
new file mode 100644
index 0000000..6201989
Binary files /dev/null and b/website/items/apple_golden.png differ
diff --git a/website/items/arrow.png b/website/items/arrow.png
new file mode 100644
index 0000000..4f748a0
Binary files /dev/null and b/website/items/arrow.png differ
diff --git a/website/items/banner_base.png b/website/items/banner_base.png
new file mode 100644
index 0000000..a074f2a
Binary files /dev/null and b/website/items/banner_base.png differ
diff --git a/website/items/banner_overlay.png b/website/items/banner_overlay.png
new file mode 100644
index 0000000..560108f
Binary files /dev/null and b/website/items/banner_overlay.png differ
diff --git a/website/items/barrier.png b/website/items/barrier.png
new file mode 100644
index 0000000..7ccfa7b
Binary files /dev/null and b/website/items/barrier.png differ
diff --git a/website/items/bed.png b/website/items/bed.png
new file mode 100644
index 0000000..22a4cf0
Binary files /dev/null and b/website/items/bed.png differ
diff --git a/website/items/beef_cooked.png b/website/items/beef_cooked.png
new file mode 100644
index 0000000..7bf0fb9
Binary files /dev/null and b/website/items/beef_cooked.png differ
diff --git a/website/items/beef_raw.png b/website/items/beef_raw.png
new file mode 100644
index 0000000..82af4e7
Binary files /dev/null and b/website/items/beef_raw.png differ
diff --git a/website/items/blaze_powder.png b/website/items/blaze_powder.png
new file mode 100644
index 0000000..89c57d6
Binary files /dev/null and b/website/items/blaze_powder.png differ
diff --git a/website/items/blaze_rod.png b/website/items/blaze_rod.png
new file mode 100644
index 0000000..7050e10
Binary files /dev/null and b/website/items/blaze_rod.png differ
diff --git a/website/items/boat.png b/website/items/boat.png
new file mode 100644
index 0000000..235e0a2
Binary files /dev/null and b/website/items/boat.png differ
diff --git a/website/items/bone.png b/website/items/bone.png
new file mode 100644
index 0000000..3faca89
Binary files /dev/null and b/website/items/bone.png differ
diff --git a/website/items/book_enchanted.png b/website/items/book_enchanted.png
new file mode 100644
index 0000000..8742bee
Binary files /dev/null and b/website/items/book_enchanted.png differ
diff --git a/website/items/book_normal.png b/website/items/book_normal.png
new file mode 100644
index 0000000..f791ae4
Binary files /dev/null and b/website/items/book_normal.png differ
diff --git a/website/items/book_writable.png b/website/items/book_writable.png
new file mode 100644
index 0000000..fa95246
Binary files /dev/null and b/website/items/book_writable.png differ
diff --git a/website/items/book_written.png b/website/items/book_written.png
new file mode 100644
index 0000000..b2a2aa8
Binary files /dev/null and b/website/items/book_written.png differ
diff --git a/website/items/bow_pulling_0.png b/website/items/bow_pulling_0.png
new file mode 100644
index 0000000..2022aab
Binary files /dev/null and b/website/items/bow_pulling_0.png differ
diff --git a/website/items/bow_pulling_1.png b/website/items/bow_pulling_1.png
new file mode 100644
index 0000000..a132079
Binary files /dev/null and b/website/items/bow_pulling_1.png differ
diff --git a/website/items/bow_pulling_2.png b/website/items/bow_pulling_2.png
new file mode 100644
index 0000000..d459e68
Binary files /dev/null and b/website/items/bow_pulling_2.png differ
diff --git a/website/items/bow_standby.png b/website/items/bow_standby.png
new file mode 100644
index 0000000..d709b9c
Binary files /dev/null and b/website/items/bow_standby.png differ
diff --git a/website/items/bowl.png b/website/items/bowl.png
new file mode 100644
index 0000000..63d16ad
Binary files /dev/null and b/website/items/bowl.png differ
diff --git a/website/items/bread.png b/website/items/bread.png
new file mode 100644
index 0000000..c833604
Binary files /dev/null and b/website/items/bread.png differ
diff --git a/website/items/brewing_stand.png b/website/items/brewing_stand.png
new file mode 100644
index 0000000..97db9af
Binary files /dev/null and b/website/items/brewing_stand.png differ
diff --git a/website/items/brick.png b/website/items/brick.png
new file mode 100644
index 0000000..11e74be
Binary files /dev/null and b/website/items/brick.png differ
diff --git a/website/items/bucket_empty.png b/website/items/bucket_empty.png
new file mode 100644
index 0000000..f8e5369
Binary files /dev/null and b/website/items/bucket_empty.png differ
diff --git a/website/items/bucket_lava.png b/website/items/bucket_lava.png
new file mode 100644
index 0000000..13a1957
Binary files /dev/null and b/website/items/bucket_lava.png differ
diff --git a/website/items/bucket_milk.png b/website/items/bucket_milk.png
new file mode 100644
index 0000000..c77d92c
Binary files /dev/null and b/website/items/bucket_milk.png differ
diff --git a/website/items/bucket_water.png b/website/items/bucket_water.png
new file mode 100644
index 0000000..2f36acc
Binary files /dev/null and b/website/items/bucket_water.png differ
diff --git a/website/items/cake.png b/website/items/cake.png
new file mode 100644
index 0000000..46e94b8
Binary files /dev/null and b/website/items/cake.png differ
diff --git a/website/items/carrot.png b/website/items/carrot.png
new file mode 100644
index 0000000..2d08aab
Binary files /dev/null and b/website/items/carrot.png differ
diff --git a/website/items/carrot_golden.png b/website/items/carrot_golden.png
new file mode 100644
index 0000000..e0f1ea6
Binary files /dev/null and b/website/items/carrot_golden.png differ
diff --git a/website/items/carrot_on_a_stick.png b/website/items/carrot_on_a_stick.png
new file mode 100644
index 0000000..9e88571
Binary files /dev/null and b/website/items/carrot_on_a_stick.png differ
diff --git a/website/items/cauldron.png b/website/items/cauldron.png
new file mode 100644
index 0000000..e3186eb
Binary files /dev/null and b/website/items/cauldron.png differ
diff --git a/website/items/chainmail_boots.png b/website/items/chainmail_boots.png
new file mode 100644
index 0000000..54a4a15
Binary files /dev/null and b/website/items/chainmail_boots.png differ
diff --git a/website/items/chainmail_chestplate.png b/website/items/chainmail_chestplate.png
new file mode 100644
index 0000000..cd2115a
Binary files /dev/null and b/website/items/chainmail_chestplate.png differ
diff --git a/website/items/chainmail_helmet.png b/website/items/chainmail_helmet.png
new file mode 100644
index 0000000..a143338
Binary files /dev/null and b/website/items/chainmail_helmet.png differ
diff --git a/website/items/chainmail_leggings.png b/website/items/chainmail_leggings.png
new file mode 100644
index 0000000..dae4b26
Binary files /dev/null and b/website/items/chainmail_leggings.png differ
diff --git a/website/items/charcoal.png b/website/items/charcoal.png
new file mode 100644
index 0000000..20d5b25
Binary files /dev/null and b/website/items/charcoal.png differ
diff --git a/website/items/chicken_cooked.png b/website/items/chicken_cooked.png
new file mode 100644
index 0000000..890b5b3
Binary files /dev/null and b/website/items/chicken_cooked.png differ
diff --git a/website/items/chicken_raw.png b/website/items/chicken_raw.png
new file mode 100644
index 0000000..6d25922
Binary files /dev/null and b/website/items/chicken_raw.png differ
diff --git a/website/items/clay_ball.png b/website/items/clay_ball.png
new file mode 100644
index 0000000..5103d6c
Binary files /dev/null and b/website/items/clay_ball.png differ
diff --git a/website/items/clock.png b/website/items/clock.png
new file mode 100644
index 0000000..069a0ab
Binary files /dev/null and b/website/items/clock.png differ
diff --git a/website/items/clock.png.mcmeta b/website/items/clock.png.mcmeta
new file mode 100644
index 0000000..4f0718a
--- /dev/null
+++ b/website/items/clock.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
\ No newline at end of file
diff --git a/website/items/coal.png b/website/items/coal.png
new file mode 100644
index 0000000..5563b6f
Binary files /dev/null and b/website/items/coal.png differ
diff --git a/website/items/comparator.png b/website/items/comparator.png
new file mode 100644
index 0000000..28b8eec
Binary files /dev/null and b/website/items/comparator.png differ
diff --git a/website/items/compass.png b/website/items/compass.png
new file mode 100644
index 0000000..9dcbdfe
Binary files /dev/null and b/website/items/compass.png differ
diff --git a/website/items/compass.png.mcmeta b/website/items/compass.png.mcmeta
new file mode 100644
index 0000000..4f0718a
--- /dev/null
+++ b/website/items/compass.png.mcmeta
@@ -0,0 +1,3 @@
+{
+ "animation": {}
+}
\ No newline at end of file
diff --git a/website/items/cookie.png b/website/items/cookie.png
new file mode 100644
index 0000000..01fe56b
Binary files /dev/null and b/website/items/cookie.png differ
diff --git a/website/items/diamond.png b/website/items/diamond.png
new file mode 100644
index 0000000..10e70a0
Binary files /dev/null and b/website/items/diamond.png differ
diff --git a/website/items/diamond_axe.png b/website/items/diamond_axe.png
new file mode 100644
index 0000000..7627f87
Binary files /dev/null and b/website/items/diamond_axe.png differ
diff --git a/website/items/diamond_boots.png b/website/items/diamond_boots.png
new file mode 100644
index 0000000..70d9e5f
Binary files /dev/null and b/website/items/diamond_boots.png differ
diff --git a/website/items/diamond_chestplate.png b/website/items/diamond_chestplate.png
new file mode 100644
index 0000000..afdff93
Binary files /dev/null and b/website/items/diamond_chestplate.png differ
diff --git a/website/items/diamond_helmet.png b/website/items/diamond_helmet.png
new file mode 100644
index 0000000..1c88592
Binary files /dev/null and b/website/items/diamond_helmet.png differ
diff --git a/website/items/diamond_hoe.png b/website/items/diamond_hoe.png
new file mode 100644
index 0000000..c9a97e0
Binary files /dev/null and b/website/items/diamond_hoe.png differ
diff --git a/website/items/diamond_horse_armor.png b/website/items/diamond_horse_armor.png
new file mode 100644
index 0000000..b281aad
Binary files /dev/null and b/website/items/diamond_horse_armor.png differ
diff --git a/website/items/diamond_leggings.png b/website/items/diamond_leggings.png
new file mode 100644
index 0000000..a99c896
Binary files /dev/null and b/website/items/diamond_leggings.png differ
diff --git a/website/items/diamond_pickaxe.png b/website/items/diamond_pickaxe.png
new file mode 100644
index 0000000..c279828
Binary files /dev/null and b/website/items/diamond_pickaxe.png differ
diff --git a/website/items/diamond_shovel.png b/website/items/diamond_shovel.png
new file mode 100644
index 0000000..e4a8992
Binary files /dev/null and b/website/items/diamond_shovel.png differ
diff --git a/website/items/diamond_sword.png b/website/items/diamond_sword.png
new file mode 100644
index 0000000..2a1552d
Binary files /dev/null and b/website/items/diamond_sword.png differ
diff --git a/website/items/door_acacia.png b/website/items/door_acacia.png
new file mode 100644
index 0000000..c903484
Binary files /dev/null and b/website/items/door_acacia.png differ
diff --git a/website/items/door_birch.png b/website/items/door_birch.png
new file mode 100644
index 0000000..7c88c41
Binary files /dev/null and b/website/items/door_birch.png differ
diff --git a/website/items/door_dark_oak.png b/website/items/door_dark_oak.png
new file mode 100644
index 0000000..7862d9a
Binary files /dev/null and b/website/items/door_dark_oak.png differ
diff --git a/website/items/door_iron.png b/website/items/door_iron.png
new file mode 100644
index 0000000..b6715ed
Binary files /dev/null and b/website/items/door_iron.png differ
diff --git a/website/items/door_jungle.png b/website/items/door_jungle.png
new file mode 100644
index 0000000..cb3753d
Binary files /dev/null and b/website/items/door_jungle.png differ
diff --git a/website/items/door_spruce.png b/website/items/door_spruce.png
new file mode 100644
index 0000000..4eddb7e
Binary files /dev/null and b/website/items/door_spruce.png differ
diff --git a/website/items/door_wood.png b/website/items/door_wood.png
new file mode 100644
index 0000000..20b9be6
Binary files /dev/null and b/website/items/door_wood.png differ
diff --git a/website/items/dye_powder_black.png b/website/items/dye_powder_black.png
new file mode 100644
index 0000000..909bea5
Binary files /dev/null and b/website/items/dye_powder_black.png differ
diff --git a/website/items/dye_powder_blue.png b/website/items/dye_powder_blue.png
new file mode 100644
index 0000000..4713983
Binary files /dev/null and b/website/items/dye_powder_blue.png differ
diff --git a/website/items/dye_powder_brown.png b/website/items/dye_powder_brown.png
new file mode 100644
index 0000000..62eae8d
Binary files /dev/null and b/website/items/dye_powder_brown.png differ
diff --git a/website/items/dye_powder_cyan.png b/website/items/dye_powder_cyan.png
new file mode 100644
index 0000000..7b10c11
Binary files /dev/null and b/website/items/dye_powder_cyan.png differ
diff --git a/website/items/dye_powder_gray.png b/website/items/dye_powder_gray.png
new file mode 100644
index 0000000..4fce7e7
Binary files /dev/null and b/website/items/dye_powder_gray.png differ
diff --git a/website/items/dye_powder_green.png b/website/items/dye_powder_green.png
new file mode 100644
index 0000000..009e058
Binary files /dev/null and b/website/items/dye_powder_green.png differ
diff --git a/website/items/dye_powder_light_blue.png b/website/items/dye_powder_light_blue.png
new file mode 100644
index 0000000..a8b45c9
Binary files /dev/null and b/website/items/dye_powder_light_blue.png differ
diff --git a/website/items/dye_powder_lime.png b/website/items/dye_powder_lime.png
new file mode 100644
index 0000000..7a78764
Binary files /dev/null and b/website/items/dye_powder_lime.png differ
diff --git a/website/items/dye_powder_magenta.png b/website/items/dye_powder_magenta.png
new file mode 100644
index 0000000..ea7342a
Binary files /dev/null and b/website/items/dye_powder_magenta.png differ
diff --git a/website/items/dye_powder_orange.png b/website/items/dye_powder_orange.png
new file mode 100644
index 0000000..677a1aa
Binary files /dev/null and b/website/items/dye_powder_orange.png differ
diff --git a/website/items/dye_powder_pink.png b/website/items/dye_powder_pink.png
new file mode 100644
index 0000000..1acc483
Binary files /dev/null and b/website/items/dye_powder_pink.png differ
diff --git a/website/items/dye_powder_purple.png b/website/items/dye_powder_purple.png
new file mode 100644
index 0000000..7d201c2
Binary files /dev/null and b/website/items/dye_powder_purple.png differ
diff --git a/website/items/dye_powder_red.png b/website/items/dye_powder_red.png
new file mode 100644
index 0000000..2d1a742
Binary files /dev/null and b/website/items/dye_powder_red.png differ
diff --git a/website/items/dye_powder_silver.png b/website/items/dye_powder_silver.png
new file mode 100644
index 0000000..fa9e501
Binary files /dev/null and b/website/items/dye_powder_silver.png differ
diff --git a/website/items/dye_powder_white.png b/website/items/dye_powder_white.png
new file mode 100644
index 0000000..5b1833b
Binary files /dev/null and b/website/items/dye_powder_white.png differ
diff --git a/website/items/dye_powder_yellow.png b/website/items/dye_powder_yellow.png
new file mode 100644
index 0000000..95e0673
Binary files /dev/null and b/website/items/dye_powder_yellow.png differ
diff --git a/website/items/egg.png b/website/items/egg.png
new file mode 100644
index 0000000..a6fe2bf
Binary files /dev/null and b/website/items/egg.png differ
diff --git a/website/items/emerald.png b/website/items/emerald.png
new file mode 100644
index 0000000..98d953e
Binary files /dev/null and b/website/items/emerald.png differ
diff --git a/website/items/empty_armor_slot_boots.png b/website/items/empty_armor_slot_boots.png
new file mode 100644
index 0000000..fd7e05f
Binary files /dev/null and b/website/items/empty_armor_slot_boots.png differ
diff --git a/website/items/empty_armor_slot_chestplate.png b/website/items/empty_armor_slot_chestplate.png
new file mode 100644
index 0000000..6e632b9
Binary files /dev/null and b/website/items/empty_armor_slot_chestplate.png differ
diff --git a/website/items/empty_armor_slot_helmet.png b/website/items/empty_armor_slot_helmet.png
new file mode 100644
index 0000000..3a455f3
Binary files /dev/null and b/website/items/empty_armor_slot_helmet.png differ
diff --git a/website/items/empty_armor_slot_leggings.png b/website/items/empty_armor_slot_leggings.png
new file mode 100644
index 0000000..28b2c49
Binary files /dev/null and b/website/items/empty_armor_slot_leggings.png differ
diff --git a/website/items/ender_eye.png b/website/items/ender_eye.png
new file mode 100644
index 0000000..8c4ef4e
Binary files /dev/null and b/website/items/ender_eye.png differ
diff --git a/website/items/ender_pearl.png b/website/items/ender_pearl.png
new file mode 100644
index 0000000..4b752a6
Binary files /dev/null and b/website/items/ender_pearl.png differ
diff --git a/website/items/experience_bottle.png b/website/items/experience_bottle.png
new file mode 100644
index 0000000..ae4214f
Binary files /dev/null and b/website/items/experience_bottle.png differ
diff --git a/website/items/feather.png b/website/items/feather.png
new file mode 100644
index 0000000..d4c3be5
Binary files /dev/null and b/website/items/feather.png differ
diff --git a/website/items/fireball.png b/website/items/fireball.png
new file mode 100644
index 0000000..d62a6f4
Binary files /dev/null and b/website/items/fireball.png differ
diff --git a/website/items/fireworks.png b/website/items/fireworks.png
new file mode 100644
index 0000000..f1e07fd
Binary files /dev/null and b/website/items/fireworks.png differ
diff --git a/website/items/fireworks_charge.png b/website/items/fireworks_charge.png
new file mode 100644
index 0000000..5c89362
Binary files /dev/null and b/website/items/fireworks_charge.png differ
diff --git a/website/items/fireworks_charge_overlay.png b/website/items/fireworks_charge_overlay.png
new file mode 100644
index 0000000..d8b91a9
Binary files /dev/null and b/website/items/fireworks_charge_overlay.png differ
diff --git a/website/items/fish_clownfish_raw.png b/website/items/fish_clownfish_raw.png
new file mode 100644
index 0000000..41df72f
Binary files /dev/null and b/website/items/fish_clownfish_raw.png differ
diff --git a/website/items/fish_cod_cooked.png b/website/items/fish_cod_cooked.png
new file mode 100644
index 0000000..87564c7
Binary files /dev/null and b/website/items/fish_cod_cooked.png differ
diff --git a/website/items/fish_cod_raw.png b/website/items/fish_cod_raw.png
new file mode 100644
index 0000000..32996bf
Binary files /dev/null and b/website/items/fish_cod_raw.png differ
diff --git a/website/items/fish_pufferfish_raw.png b/website/items/fish_pufferfish_raw.png
new file mode 100644
index 0000000..aadbd88
Binary files /dev/null and b/website/items/fish_pufferfish_raw.png differ
diff --git a/website/items/fish_salmon_cooked.png b/website/items/fish_salmon_cooked.png
new file mode 100644
index 0000000..fb765ed
Binary files /dev/null and b/website/items/fish_salmon_cooked.png differ
diff --git a/website/items/fish_salmon_raw.png b/website/items/fish_salmon_raw.png
new file mode 100644
index 0000000..68bcd69
Binary files /dev/null and b/website/items/fish_salmon_raw.png differ
diff --git a/website/items/fishing_rod_cast.png b/website/items/fishing_rod_cast.png
new file mode 100644
index 0000000..a5ab378
Binary files /dev/null and b/website/items/fishing_rod_cast.png differ
diff --git a/website/items/fishing_rod_uncast.png b/website/items/fishing_rod_uncast.png
new file mode 100644
index 0000000..d4b53f0
Binary files /dev/null and b/website/items/fishing_rod_uncast.png differ
diff --git a/website/items/flint.png b/website/items/flint.png
new file mode 100644
index 0000000..5f51093
Binary files /dev/null and b/website/items/flint.png differ
diff --git a/website/items/flint_and_steel.png b/website/items/flint_and_steel.png
new file mode 100644
index 0000000..77bc340
Binary files /dev/null and b/website/items/flint_and_steel.png differ
diff --git a/website/items/flower_pot.png b/website/items/flower_pot.png
new file mode 100644
index 0000000..c4f26d2
Binary files /dev/null and b/website/items/flower_pot.png differ
diff --git a/website/items/ghast_tear.png b/website/items/ghast_tear.png
new file mode 100644
index 0000000..e5c741f
Binary files /dev/null and b/website/items/ghast_tear.png differ
diff --git a/website/items/glowstone_dust.png b/website/items/glowstone_dust.png
new file mode 100644
index 0000000..edd93a6
Binary files /dev/null and b/website/items/glowstone_dust.png differ
diff --git a/website/items/gold_axe.png b/website/items/gold_axe.png
new file mode 100644
index 0000000..0f47b60
Binary files /dev/null and b/website/items/gold_axe.png differ
diff --git a/website/items/gold_boots.png b/website/items/gold_boots.png
new file mode 100644
index 0000000..f6033d2
Binary files /dev/null and b/website/items/gold_boots.png differ
diff --git a/website/items/gold_chestplate.png b/website/items/gold_chestplate.png
new file mode 100644
index 0000000..e36076a
Binary files /dev/null and b/website/items/gold_chestplate.png differ
diff --git a/website/items/gold_helmet.png b/website/items/gold_helmet.png
new file mode 100644
index 0000000..9eb89a0
Binary files /dev/null and b/website/items/gold_helmet.png differ
diff --git a/website/items/gold_hoe.png b/website/items/gold_hoe.png
new file mode 100644
index 0000000..1685d47
Binary files /dev/null and b/website/items/gold_hoe.png differ
diff --git a/website/items/gold_horse_armor.png b/website/items/gold_horse_armor.png
new file mode 100644
index 0000000..7c5c3a5
Binary files /dev/null and b/website/items/gold_horse_armor.png differ
diff --git a/website/items/gold_ingot.png b/website/items/gold_ingot.png
new file mode 100644
index 0000000..ea781e7
Binary files /dev/null and b/website/items/gold_ingot.png differ
diff --git a/website/items/gold_leggings.png b/website/items/gold_leggings.png
new file mode 100644
index 0000000..da23771
Binary files /dev/null and b/website/items/gold_leggings.png differ
diff --git a/website/items/gold_nugget.png b/website/items/gold_nugget.png
new file mode 100644
index 0000000..3a9a2fe
Binary files /dev/null and b/website/items/gold_nugget.png differ
diff --git a/website/items/gold_pickaxe.png b/website/items/gold_pickaxe.png
new file mode 100644
index 0000000..ecccafe
Binary files /dev/null and b/website/items/gold_pickaxe.png differ
diff --git a/website/items/gold_shovel.png b/website/items/gold_shovel.png
new file mode 100644
index 0000000..150cbb9
Binary files /dev/null and b/website/items/gold_shovel.png differ
diff --git a/website/items/gold_sword.png b/website/items/gold_sword.png
new file mode 100644
index 0000000..0ddef04
Binary files /dev/null and b/website/items/gold_sword.png differ
diff --git a/website/items/gunpowder.png b/website/items/gunpowder.png
new file mode 100644
index 0000000..73cadec
Binary files /dev/null and b/website/items/gunpowder.png differ
diff --git a/website/items/hopper.png b/website/items/hopper.png
new file mode 100644
index 0000000..f8b244f
Binary files /dev/null and b/website/items/hopper.png differ
diff --git a/website/items/iron_axe.png b/website/items/iron_axe.png
new file mode 100644
index 0000000..8bf133e
Binary files /dev/null and b/website/items/iron_axe.png differ
diff --git a/website/items/iron_boots.png b/website/items/iron_boots.png
new file mode 100644
index 0000000..b69ca05
Binary files /dev/null and b/website/items/iron_boots.png differ
diff --git a/website/items/iron_chestplate.png b/website/items/iron_chestplate.png
new file mode 100644
index 0000000..e7993ce
Binary files /dev/null and b/website/items/iron_chestplate.png differ
diff --git a/website/items/iron_helmet.png b/website/items/iron_helmet.png
new file mode 100644
index 0000000..65e64cc
Binary files /dev/null and b/website/items/iron_helmet.png differ
diff --git a/website/items/iron_hoe.png b/website/items/iron_hoe.png
new file mode 100644
index 0000000..28d4c36
Binary files /dev/null and b/website/items/iron_hoe.png differ
diff --git a/website/items/iron_horse_armor.png b/website/items/iron_horse_armor.png
new file mode 100644
index 0000000..5d697d1
Binary files /dev/null and b/website/items/iron_horse_armor.png differ
diff --git a/website/items/iron_ingot.png b/website/items/iron_ingot.png
new file mode 100644
index 0000000..3833fa0
Binary files /dev/null and b/website/items/iron_ingot.png differ
diff --git a/website/items/iron_leggings.png b/website/items/iron_leggings.png
new file mode 100644
index 0000000..ad53673
Binary files /dev/null and b/website/items/iron_leggings.png differ
diff --git a/website/items/iron_pickaxe.png b/website/items/iron_pickaxe.png
new file mode 100644
index 0000000..d21440b
Binary files /dev/null and b/website/items/iron_pickaxe.png differ
diff --git a/website/items/iron_shovel.png b/website/items/iron_shovel.png
new file mode 100644
index 0000000..079b236
Binary files /dev/null and b/website/items/iron_shovel.png differ
diff --git a/website/items/iron_sword.png b/website/items/iron_sword.png
new file mode 100644
index 0000000..4d49c5a
Binary files /dev/null and b/website/items/iron_sword.png differ
diff --git a/website/items/item_frame.png b/website/items/item_frame.png
new file mode 100644
index 0000000..261c98a
Binary files /dev/null and b/website/items/item_frame.png differ
diff --git a/website/items/lead.png b/website/items/lead.png
new file mode 100644
index 0000000..0ef5312
Binary files /dev/null and b/website/items/lead.png differ
diff --git a/website/items/leather.png b/website/items/leather.png
new file mode 100644
index 0000000..13dc199
Binary files /dev/null and b/website/items/leather.png differ
diff --git a/website/items/leather_boots.png b/website/items/leather_boots.png
new file mode 100644
index 0000000..61d7198
Binary files /dev/null and b/website/items/leather_boots.png differ
diff --git a/website/items/leather_boots_overlay.png b/website/items/leather_boots_overlay.png
new file mode 100644
index 0000000..b6896d8
Binary files /dev/null and b/website/items/leather_boots_overlay.png differ
diff --git a/website/items/leather_chestplate.png b/website/items/leather_chestplate.png
new file mode 100644
index 0000000..e534aef
Binary files /dev/null and b/website/items/leather_chestplate.png differ
diff --git a/website/items/leather_chestplate_overlay.png b/website/items/leather_chestplate_overlay.png
new file mode 100644
index 0000000..125fd34
Binary files /dev/null and b/website/items/leather_chestplate_overlay.png differ
diff --git a/website/items/leather_helmet.png b/website/items/leather_helmet.png
new file mode 100644
index 0000000..6f64763
Binary files /dev/null and b/website/items/leather_helmet.png differ
diff --git a/website/items/leather_helmet_overlay.png b/website/items/leather_helmet_overlay.png
new file mode 100644
index 0000000..8040d77
Binary files /dev/null and b/website/items/leather_helmet_overlay.png differ
diff --git a/website/items/leather_leggings.png b/website/items/leather_leggings.png
new file mode 100644
index 0000000..c2d3f03
Binary files /dev/null and b/website/items/leather_leggings.png differ
diff --git a/website/items/leather_leggings_overlay.png b/website/items/leather_leggings_overlay.png
new file mode 100644
index 0000000..813ba26
Binary files /dev/null and b/website/items/leather_leggings_overlay.png differ
diff --git a/website/items/magma_cream.png b/website/items/magma_cream.png
new file mode 100644
index 0000000..b2be210
Binary files /dev/null and b/website/items/magma_cream.png differ
diff --git a/website/items/map_empty.png b/website/items/map_empty.png
new file mode 100644
index 0000000..8dc6e58
Binary files /dev/null and b/website/items/map_empty.png differ
diff --git a/website/items/map_filled.png b/website/items/map_filled.png
new file mode 100644
index 0000000..1381e21
Binary files /dev/null and b/website/items/map_filled.png differ
diff --git a/website/items/melon.png b/website/items/melon.png
new file mode 100644
index 0000000..590f47a
Binary files /dev/null and b/website/items/melon.png differ
diff --git a/website/items/melon_speckled.png b/website/items/melon_speckled.png
new file mode 100644
index 0000000..dee1bf5
Binary files /dev/null and b/website/items/melon_speckled.png differ
diff --git a/website/items/minecart_chest.png b/website/items/minecart_chest.png
new file mode 100644
index 0000000..78a3778
Binary files /dev/null and b/website/items/minecart_chest.png differ
diff --git a/website/items/minecart_command_block.png b/website/items/minecart_command_block.png
new file mode 100644
index 0000000..c597ee7
Binary files /dev/null and b/website/items/minecart_command_block.png differ
diff --git a/website/items/minecart_furnace.png b/website/items/minecart_furnace.png
new file mode 100644
index 0000000..5478f25
Binary files /dev/null and b/website/items/minecart_furnace.png differ
diff --git a/website/items/minecart_hopper.png b/website/items/minecart_hopper.png
new file mode 100644
index 0000000..8a138fb
Binary files /dev/null and b/website/items/minecart_hopper.png differ
diff --git a/website/items/minecart_normal.png b/website/items/minecart_normal.png
new file mode 100644
index 0000000..2046f2b
Binary files /dev/null and b/website/items/minecart_normal.png differ
diff --git a/website/items/minecart_tnt.png b/website/items/minecart_tnt.png
new file mode 100644
index 0000000..561279b
Binary files /dev/null and b/website/items/minecart_tnt.png differ
diff --git a/website/items/mushroom_stew.png b/website/items/mushroom_stew.png
new file mode 100644
index 0000000..5598bc7
Binary files /dev/null and b/website/items/mushroom_stew.png differ
diff --git a/website/items/mutton_cooked.png b/website/items/mutton_cooked.png
new file mode 100644
index 0000000..e1b62dc
Binary files /dev/null and b/website/items/mutton_cooked.png differ
diff --git a/website/items/mutton_raw.png b/website/items/mutton_raw.png
new file mode 100644
index 0000000..1222ff4
Binary files /dev/null and b/website/items/mutton_raw.png differ
diff --git a/website/items/name_tag.png b/website/items/name_tag.png
new file mode 100644
index 0000000..a88f559
Binary files /dev/null and b/website/items/name_tag.png differ
diff --git a/website/items/nether_star.png b/website/items/nether_star.png
new file mode 100644
index 0000000..6b848af
Binary files /dev/null and b/website/items/nether_star.png differ
diff --git a/website/items/nether_wart.png b/website/items/nether_wart.png
new file mode 100644
index 0000000..09da1e3
Binary files /dev/null and b/website/items/nether_wart.png differ
diff --git a/website/items/netherbrick.png b/website/items/netherbrick.png
new file mode 100644
index 0000000..e9c14ed
Binary files /dev/null and b/website/items/netherbrick.png differ
diff --git a/website/items/painting.png b/website/items/painting.png
new file mode 100644
index 0000000..b394f30
Binary files /dev/null and b/website/items/painting.png differ
diff --git a/website/items/paper.png b/website/items/paper.png
new file mode 100644
index 0000000..a1d9c7e
Binary files /dev/null and b/website/items/paper.png differ
diff --git a/website/items/porkchop_cooked.png b/website/items/porkchop_cooked.png
new file mode 100644
index 0000000..605d3f5
Binary files /dev/null and b/website/items/porkchop_cooked.png differ
diff --git a/website/items/porkchop_raw.png b/website/items/porkchop_raw.png
new file mode 100644
index 0000000..7e83c1a
Binary files /dev/null and b/website/items/porkchop_raw.png differ
diff --git a/website/items/potato.png b/website/items/potato.png
new file mode 100644
index 0000000..c1d8541
Binary files /dev/null and b/website/items/potato.png differ
diff --git a/website/items/potato_baked.png b/website/items/potato_baked.png
new file mode 100644
index 0000000..e4d765b
Binary files /dev/null and b/website/items/potato_baked.png differ
diff --git a/website/items/potato_poisonous.png b/website/items/potato_poisonous.png
new file mode 100644
index 0000000..6f154af
Binary files /dev/null and b/website/items/potato_poisonous.png differ
diff --git a/website/items/potion_bottle_drinkable.png b/website/items/potion_bottle_drinkable.png
new file mode 100644
index 0000000..87339d7
Binary files /dev/null and b/website/items/potion_bottle_drinkable.png differ
diff --git a/website/items/potion_bottle_empty.png b/website/items/potion_bottle_empty.png
new file mode 100644
index 0000000..87339d7
Binary files /dev/null and b/website/items/potion_bottle_empty.png differ
diff --git a/website/items/potion_bottle_splash.png b/website/items/potion_bottle_splash.png
new file mode 100644
index 0000000..03b1f90
Binary files /dev/null and b/website/items/potion_bottle_splash.png differ
diff --git a/website/items/potion_overlay.png b/website/items/potion_overlay.png
new file mode 100644
index 0000000..61864e9
Binary files /dev/null and b/website/items/potion_overlay.png differ
diff --git a/website/items/prismarine_crystals.png b/website/items/prismarine_crystals.png
new file mode 100644
index 0000000..7cf87d5
Binary files /dev/null and b/website/items/prismarine_crystals.png differ
diff --git a/website/items/prismarine_shard.png b/website/items/prismarine_shard.png
new file mode 100644
index 0000000..4030b4c
Binary files /dev/null and b/website/items/prismarine_shard.png differ
diff --git a/website/items/pumpkin_pie.png b/website/items/pumpkin_pie.png
new file mode 100644
index 0000000..c21a032
Binary files /dev/null and b/website/items/pumpkin_pie.png differ
diff --git a/website/items/quartz.png b/website/items/quartz.png
new file mode 100644
index 0000000..e403446
Binary files /dev/null and b/website/items/quartz.png differ
diff --git a/website/items/quiver.png b/website/items/quiver.png
new file mode 100644
index 0000000..818f728
Binary files /dev/null and b/website/items/quiver.png differ
diff --git a/website/items/rabbit_cooked.png b/website/items/rabbit_cooked.png
new file mode 100644
index 0000000..49657c3
Binary files /dev/null and b/website/items/rabbit_cooked.png differ
diff --git a/website/items/rabbit_foot.png b/website/items/rabbit_foot.png
new file mode 100644
index 0000000..f7d9140
Binary files /dev/null and b/website/items/rabbit_foot.png differ
diff --git a/website/items/rabbit_hide.png b/website/items/rabbit_hide.png
new file mode 100644
index 0000000..516b899
Binary files /dev/null and b/website/items/rabbit_hide.png differ
diff --git a/website/items/rabbit_raw.png b/website/items/rabbit_raw.png
new file mode 100644
index 0000000..4b54135
Binary files /dev/null and b/website/items/rabbit_raw.png differ
diff --git a/website/items/rabbit_stew.png b/website/items/rabbit_stew.png
new file mode 100644
index 0000000..93e83e6
Binary files /dev/null and b/website/items/rabbit_stew.png differ
diff --git a/website/items/record_11.png b/website/items/record_11.png
new file mode 100644
index 0000000..07ac487
Binary files /dev/null and b/website/items/record_11.png differ
diff --git a/website/items/record_13.png b/website/items/record_13.png
new file mode 100644
index 0000000..ead0c61
Binary files /dev/null and b/website/items/record_13.png differ
diff --git a/website/items/record_blocks.png b/website/items/record_blocks.png
new file mode 100644
index 0000000..3732d6c
Binary files /dev/null and b/website/items/record_blocks.png differ
diff --git a/website/items/record_cat.png b/website/items/record_cat.png
new file mode 100644
index 0000000..b3527ef
Binary files /dev/null and b/website/items/record_cat.png differ
diff --git a/website/items/record_chirp.png b/website/items/record_chirp.png
new file mode 100644
index 0000000..1b24e11
Binary files /dev/null and b/website/items/record_chirp.png differ
diff --git a/website/items/record_far.png b/website/items/record_far.png
new file mode 100644
index 0000000..2320efd
Binary files /dev/null and b/website/items/record_far.png differ
diff --git a/website/items/record_mall.png b/website/items/record_mall.png
new file mode 100644
index 0000000..811d046
Binary files /dev/null and b/website/items/record_mall.png differ
diff --git a/website/items/record_mellohi.png b/website/items/record_mellohi.png
new file mode 100644
index 0000000..879b6a4
Binary files /dev/null and b/website/items/record_mellohi.png differ
diff --git a/website/items/record_stal.png b/website/items/record_stal.png
new file mode 100644
index 0000000..c650d21
Binary files /dev/null and b/website/items/record_stal.png differ
diff --git a/website/items/record_strad.png b/website/items/record_strad.png
new file mode 100644
index 0000000..72d6e32
Binary files /dev/null and b/website/items/record_strad.png differ
diff --git a/website/items/record_wait.png b/website/items/record_wait.png
new file mode 100644
index 0000000..5306b51
Binary files /dev/null and b/website/items/record_wait.png differ
diff --git a/website/items/record_ward.png b/website/items/record_ward.png
new file mode 100644
index 0000000..b33b93d
Binary files /dev/null and b/website/items/record_ward.png differ
diff --git a/website/items/redstone_dust.png b/website/items/redstone_dust.png
new file mode 100644
index 0000000..6da938b
Binary files /dev/null and b/website/items/redstone_dust.png differ
diff --git a/website/items/reeds.png b/website/items/reeds.png
new file mode 100644
index 0000000..40872c6
Binary files /dev/null and b/website/items/reeds.png differ
diff --git a/website/items/repeater.png b/website/items/repeater.png
new file mode 100644
index 0000000..7a07381
Binary files /dev/null and b/website/items/repeater.png differ
diff --git a/website/items/rotten_flesh.png b/website/items/rotten_flesh.png
new file mode 100644
index 0000000..3f39998
Binary files /dev/null and b/website/items/rotten_flesh.png differ
diff --git a/website/items/ruby.png b/website/items/ruby.png
new file mode 100644
index 0000000..4f288d9
Binary files /dev/null and b/website/items/ruby.png differ
diff --git a/website/items/saddle.png b/website/items/saddle.png
new file mode 100644
index 0000000..b12eafa
Binary files /dev/null and b/website/items/saddle.png differ
diff --git a/website/items/seeds_melon.png b/website/items/seeds_melon.png
new file mode 100644
index 0000000..ef84499
Binary files /dev/null and b/website/items/seeds_melon.png differ
diff --git a/website/items/seeds_pumpkin.png b/website/items/seeds_pumpkin.png
new file mode 100644
index 0000000..8d8f076
Binary files /dev/null and b/website/items/seeds_pumpkin.png differ
diff --git a/website/items/seeds_wheat.png b/website/items/seeds_wheat.png
new file mode 100644
index 0000000..83d23a6
Binary files /dev/null and b/website/items/seeds_wheat.png differ
diff --git a/website/items/shears.png b/website/items/shears.png
new file mode 100644
index 0000000..f9c6de1
Binary files /dev/null and b/website/items/shears.png differ
diff --git a/website/items/sign.png b/website/items/sign.png
new file mode 100644
index 0000000..9b6e2ee
Binary files /dev/null and b/website/items/sign.png differ
diff --git a/website/items/slimeball.png b/website/items/slimeball.png
new file mode 100644
index 0000000..46478ee
Binary files /dev/null and b/website/items/slimeball.png differ
diff --git a/website/items/snowball.png b/website/items/snowball.png
new file mode 100644
index 0000000..340c639
Binary files /dev/null and b/website/items/snowball.png differ
diff --git a/website/items/spawn_egg.png b/website/items/spawn_egg.png
new file mode 100644
index 0000000..26cc6b2
Binary files /dev/null and b/website/items/spawn_egg.png differ
diff --git a/website/items/spawn_egg_overlay.png b/website/items/spawn_egg_overlay.png
new file mode 100644
index 0000000..83ec78f
Binary files /dev/null and b/website/items/spawn_egg_overlay.png differ
diff --git a/website/items/spider_eye.png b/website/items/spider_eye.png
new file mode 100644
index 0000000..35d8584
Binary files /dev/null and b/website/items/spider_eye.png differ
diff --git a/website/items/spider_eye_fermented.png b/website/items/spider_eye_fermented.png
new file mode 100644
index 0000000..226ffb8
Binary files /dev/null and b/website/items/spider_eye_fermented.png differ
diff --git a/website/items/stick.png b/website/items/stick.png
new file mode 100644
index 0000000..6f8ce13
Binary files /dev/null and b/website/items/stick.png differ
diff --git a/website/items/stone_axe.png b/website/items/stone_axe.png
new file mode 100644
index 0000000..fb33584
Binary files /dev/null and b/website/items/stone_axe.png differ
diff --git a/website/items/stone_hoe.png b/website/items/stone_hoe.png
new file mode 100644
index 0000000..d46b272
Binary files /dev/null and b/website/items/stone_hoe.png differ
diff --git a/website/items/stone_pickaxe.png b/website/items/stone_pickaxe.png
new file mode 100644
index 0000000..19a8e50
Binary files /dev/null and b/website/items/stone_pickaxe.png differ
diff --git a/website/items/stone_shovel.png b/website/items/stone_shovel.png
new file mode 100644
index 0000000..8e1c0c2
Binary files /dev/null and b/website/items/stone_shovel.png differ
diff --git a/website/items/stone_sword.png b/website/items/stone_sword.png
new file mode 100644
index 0000000..5810dfd
Binary files /dev/null and b/website/items/stone_sword.png differ
diff --git a/website/items/string.png b/website/items/string.png
new file mode 100644
index 0000000..0b04ddb
Binary files /dev/null and b/website/items/string.png differ
diff --git a/website/items/sugar.png b/website/items/sugar.png
new file mode 100644
index 0000000..0864df9
Binary files /dev/null and b/website/items/sugar.png differ
diff --git a/website/items/wheat.png b/website/items/wheat.png
new file mode 100644
index 0000000..bbd2fd9
Binary files /dev/null and b/website/items/wheat.png differ
diff --git a/website/items/wood_axe.png b/website/items/wood_axe.png
new file mode 100644
index 0000000..3a19203
Binary files /dev/null and b/website/items/wood_axe.png differ
diff --git a/website/items/wood_hoe.png b/website/items/wood_hoe.png
new file mode 100644
index 0000000..de1c7a6
Binary files /dev/null and b/website/items/wood_hoe.png differ
diff --git a/website/items/wood_pickaxe.png b/website/items/wood_pickaxe.png
new file mode 100644
index 0000000..ebc6756
Binary files /dev/null and b/website/items/wood_pickaxe.png differ
diff --git a/website/items/wood_shovel.png b/website/items/wood_shovel.png
new file mode 100644
index 0000000..b057911
Binary files /dev/null and b/website/items/wood_shovel.png differ
diff --git a/website/items/wood_sword.png b/website/items/wood_sword.png
new file mode 100644
index 0000000..c04dc0a
Binary files /dev/null and b/website/items/wood_sword.png differ
diff --git a/website/items/wooden_armorstand.png b/website/items/wooden_armorstand.png
new file mode 100644
index 0000000..6d27c47
Binary files /dev/null and b/website/items/wooden_armorstand.png differ
diff --git a/website/main.js b/website/main.js
index e2273a9..339d78f 100644
--- a/website/main.js
+++ b/website/main.js
@@ -349,6 +349,7 @@ let currentNumColumns = 0; // Variable to store the current number of columns
function createColumns(num) {
const postsContainer = document.getElementById("posts");
+ if (!postsContainer) return [];
postsContainer.innerHTML = "";
const columns = [];
for (let i = 0; i < num; i++) {
@@ -510,6 +511,8 @@ function layoutPosts(postElements) {
function showLoadingIndicator() {
const postsContainer = document.getElementById("posts");
+ if (!postsContainer) return;
+
const loadingDiv = document.createElement("div");
loadingDiv.id = "loading-posts";
loadingDiv.className = "loading-posts";
@@ -624,14 +627,16 @@ async function fetchPosts() {
// Show error message
const postsContainer = document.getElementById("posts");
- const errorDiv = document.createElement("div");
- errorDiv.className = "loading-posts";
- errorDiv.innerHTML = `
-
- âš Failed to load posts. Please refresh the page.
-
- `;
- postsContainer.appendChild(errorDiv);
+ if (postsContainer) {
+ const errorDiv = document.createElement("div");
+ errorDiv.className = "loading-posts";
+ errorDiv.innerHTML = `
+
+ âš Failed to load posts. Please refresh the page.
+
+ `;
+ postsContainer.appendChild(errorDiv);
+ }
}
}
@@ -664,4 +669,6 @@ window.addEventListener("resize", () => {
}
});
-fetchPosts();
\ No newline at end of file
+if (document.getElementById("posts")) {
+ fetchPosts();
+}
\ No newline at end of file
diff --git a/website/mining.js b/website/mining.js
new file mode 100644
index 0000000..788178a
--- /dev/null
+++ b/website/mining.js
@@ -0,0 +1,2189 @@
+document.addEventListener('DOMContentLoaded', () => {
+ const canvas = document.getElementById('game-canvas');
+ const depthDisplay = document.getElementById('depth-counter');
+ const scoreDisplay = document.getElementById('score-counter');
+
+ if (!canvas) return;
+
+ // --- Configuration ---
+ let GRID_SIZE = 5; // 5x5 grid (Dynamic)
+ const VISIBLE_LAYERS = 7; // How many layers deep we render
+ const BLOCK_SIZE = 1;
+
+ const SELL_PRICES = { coal: 10, iron: 20, gold: 50, diamond: 200, emerald: 500 };
+ const UPGRADE_COSTS = {
+ speed: (level) => Math.floor(100 * Math.pow(1.5, level)),
+ luck: (level) => Math.floor(500 * Math.pow(2, level)),
+ mining_area: (level) => Math.floor(1000 * Math.pow(3, level)), // Expensive!
+ vein_miner: (level) => Math.floor(2000 * Math.pow(2, level)),
+ tnt_frequency: (level) => Math.floor(5000 * Math.pow(1.5, level)),
+ tnt_power: (level) => Math.floor(10000 * Math.pow(2, level)),
+ pickup_range: (level) => Math.floor(300 * Math.pow(1.5, level)),
+ grid_size: (level) => Math.floor(10000 * Math.pow(4, level)) // Very Expensive!
+ };
+
+ // --- State ---
+ let depth = 0;
+ let score = 0;
+ let isAnimating = false;
+ let cameraOffsetY = 0;
+ let upgrades = { speed: 0, luck: 0, mining_area: 0, vein_miner: 0, tnt_frequency: 0, tnt_power: 0, pickup_range: 0, grid_size: 0 };
+ let tntTimer = 0;
+ const tntProjectiles = [];
+
+ // Store blocks: blocks[layerIndex][x][z]
+ // layerIndex 0 is the top-most visible layer.
+ let layers = [];
+ let extraBlocks = []; // Blocks above the ground (trees, etc)
+
+ // --- Three.js Setup ---
+ const scene = new THREE.Scene();
+ scene.background = new THREE.Color(0x87CEEB); // Sky blue background
+
+ // Orthographic Camera for Isometric view
+ const aspect = canvas.clientWidth / canvas.clientHeight;
+ const d = 5;
+ const camera = new THREE.OrthographicCamera(-d * aspect, d * aspect, d, -d, 1, 1000);
+
+ // Isometric angle
+ camera.position.set(20, 14, 20);
+ camera.lookAt(scene.position); // Look at 0,0,0
+ camera.updateProjectionMatrix();
+
+ const renderer = new THREE.WebGLRenderer({ canvas: canvas, alpha: false, antialias: true });
+ renderer.setSize(canvas.clientWidth, canvas.clientHeight);
+ renderer.setPixelRatio(window.devicePixelRatio);
+ // renderer.outputEncoding = THREE.sRGBEncoding; // We use GammaCorrectionShader instead
+ renderer.shadowMap.enabled = true;
+ renderer.shadowMap.type = THREE.PCFShadowMap;
+
+ // --- Post Processing (SSAO) ---
+ const composer = new THREE.EffectComposer(renderer);
+ const renderPass = new THREE.RenderPass(scene, camera);
+ composer.addPass(renderPass);
+
+ const ssaoPass = new THREE.SSAOPass(scene, camera, canvas.clientWidth, canvas.clientHeight);
+ ssaoPass.kernelRadius = 16;
+ ssaoPass.minDistance = 0.001;
+ ssaoPass.maxDistance = 0.1;
+ composer.addPass(ssaoPass);
+
+ const gammaCorrectionPass = new THREE.ShaderPass(THREE.GammaCorrectionShader);
+ composer.addPass(gammaCorrectionPass);
+
+ // Lighting
+ const hemiLight = new THREE.HemisphereLight(0xffffff, 0x444444, 0.6);
+ hemiLight.position.set(0, 50, 0);
+ scene.add(hemiLight);
+
+ const dirLight = new THREE.DirectionalLight(0xffffff, 1.0);
+ dirLight.position.set(-30, 50, 30);
+ dirLight.castShadow = true;
+ dirLight.shadow.mapSize.width = 2048;
+ dirLight.shadow.mapSize.height = 2048;
+ const dLight = 10;
+ dirLight.shadow.camera.left = -dLight;
+ dirLight.shadow.camera.right = dLight;
+ dirLight.shadow.camera.top = dLight;
+ dirLight.shadow.camera.bottom = -dLight;
+ scene.add(dirLight);
+
+ // --- Textures ---
+ const textureLoader = new THREE.TextureLoader();
+ const loadTexture = (name) => {
+ const tex = textureLoader.load(`blocks/${name}`);
+ tex.magFilter = THREE.NearestFilter;
+ tex.minFilter = THREE.NearestFilter;
+ tex.encoding = THREE.sRGBEncoding;
+ return tex;
+ };
+
+ const loadItemTexture = (name) => {
+ const tex = textureLoader.load(`items/${name}`);
+ tex.magFilter = THREE.NearestFilter;
+ tex.minFilter = THREE.NearestFilter;
+ tex.encoding = THREE.sRGBEncoding;
+ return tex;
+ };
+
+ const textures = {
+ stone: loadTexture('stone.png'),
+ dirt: loadTexture('dirt.png'),
+ cobblestone: loadTexture('cobblestone.png'),
+ coal: loadTexture('coal_ore.png'),
+ iron: loadTexture('iron_ore.png'),
+ gold: loadTexture('gold_ore.png'),
+ diamond: loadTexture('diamond_ore.png'),
+ emerald: loadTexture('emerald_ore.png'),
+ bedrock: loadTexture('bedrock.png'),
+ grass_top: loadTexture('grass_top.png'),
+ grass_side: loadTexture('grass_side.png'),
+ dirt: loadTexture('dirt.png'),
+ log_side: loadTexture('log_oak.png'),
+ log_top: loadTexture('log_oak_top.png'),
+ leaves: loadTexture('leaves_oak.png'),
+ apple: loadItemTexture('apple.png'),
+ stick: loadItemTexture('stick.png'),
+ sapling: loadTexture('sapling_oak.png'),
+ planks: loadTexture('planks_oak.png'),
+ wood_pickaxe: loadItemTexture('wood_pickaxe.png'),
+ stone_pickaxe: loadItemTexture('stone_pickaxe.png'),
+ iron_pickaxe: loadItemTexture('iron_pickaxe.png'),
+ gold_pickaxe: loadItemTexture('gold_pickaxe.png'),
+ diamond_pickaxe: loadItemTexture('diamond_pickaxe.png')
+ };
+
+ // Load destroy stages
+ const destroyTextures = [];
+ for (let i = 0; i < 10; i++) {
+ const tex = loadTexture(`destroy_stage_${i}.png`);
+ tex.magFilter = THREE.NearestFilter;
+ tex.minFilter = THREE.NearestFilter;
+ destroyTextures.push(tex);
+ }
+
+ // Materials cache
+ const materials = {};
+ const getMaterial = (type) => {
+ if (materials[type]) return materials[type];
+
+ let map = textures.stone;
+ if (textures[type]) map = textures[type];
+
+ // Special case for grass block to look nice
+ if (type === 'grass') {
+ const mat = [
+ new THREE.MeshLambertMaterial({ map: textures.grass_side }), // px
+ new THREE.MeshLambertMaterial({ map: textures.grass_side }), // nx
+ new THREE.MeshLambertMaterial({ map: textures.grass_top, color: 0x79C05A }), // py (top) - Tinted green
+ new THREE.MeshLambertMaterial({ map: textures.dirt }), // ny (bottom)
+ new THREE.MeshLambertMaterial({ map: textures.grass_side }), // pz
+ new THREE.MeshLambertMaterial({ map: textures.grass_side }) // nz
+ ];
+ materials[type] = mat;
+ return mat;
+ }
+
+ if (type === 'log') {
+ const mat = [
+ new THREE.MeshLambertMaterial({ map: textures.log_side }), // px
+ new THREE.MeshLambertMaterial({ map: textures.log_side }), // nx
+ new THREE.MeshLambertMaterial({ map: textures.log_top }), // py (top)
+ new THREE.MeshLambertMaterial({ map: textures.log_top }), // ny (bottom)
+ new THREE.MeshLambertMaterial({ map: textures.log_side }), // pz
+ new THREE.MeshLambertMaterial({ map: textures.log_side }) // nz
+ ];
+ materials[type] = mat;
+ return mat;
+ }
+
+ if (type === 'leaves') {
+ const mat = new THREE.MeshLambertMaterial({ map: textures.leaves, transparent: true, alphaTest: 0.5, color: 0x79C05A });
+ materials[type] = mat;
+ return mat;
+ }
+
+ if (type === 'apple') {
+ const mat = new THREE.MeshLambertMaterial({ map: textures.apple, transparent: true, alphaTest: 0.5, side: THREE.DoubleSide });
+ materials[type] = mat;
+ return mat;
+ }
+ if (type === 'stick') {
+ const mat = new THREE.MeshLambertMaterial({ map: textures.stick, transparent: true, alphaTest: 0.5, side: THREE.DoubleSide });
+ materials[type] = mat;
+ return mat;
+ }
+ if (type === 'sapling') {
+ const mat = new THREE.MeshLambertMaterial({ map: textures.sapling, transparent: true, alphaTest: 0.5, side: THREE.DoubleSide });
+ materials[type] = mat;
+ return mat;
+ }
+
+ const mat = new THREE.MeshLambertMaterial({ map: map });
+ materials[type] = mat;
+ return mat;
+ };
+
+ // Damage Overlay
+ const damageMaterial = new THREE.MeshBasicMaterial({
+ map: destroyTextures[0],
+ color: 0x808080,
+ transparent: true,
+ depthWrite: false,
+ polygonOffset: true,
+ polygonOffsetFactor: -1,
+ polygonOffsetUnits: -1,
+ blending: THREE.CustomBlending,
+ blendEquation: THREE.ReverseSubtractEquation,
+ blendSrc: THREE.SrcAlphaFactor,
+ blendDst: THREE.OneFactor
+ });
+ const damageGeometry = new THREE.BoxGeometry(BLOCK_SIZE * 1.002, BLOCK_SIZE * 1.002, BLOCK_SIZE * 1.002);
+ const damageOverlay = new THREE.Mesh(damageGeometry, damageMaterial);
+ damageOverlay.visible = false;
+ scene.add(damageOverlay);
+
+ // --- Game Logic ---
+
+ // Hardness reference: Stone (1.5) takes 4 seconds (4,000 ms)
+ // Multiplier = 4,000 / 1.5 = 2666.66 ms per hardness unit
+ const HARDNESS_MULTIPLIER = 2666.66;
+
+ const BLOCK_HEALTH = {
+ grass: 0.3 * HARDNESS_MULTIPLIER,
+ dirt: 0.2 * HARDNESS_MULTIPLIER,
+ stone: 1.5 * HARDNESS_MULTIPLIER,
+ cobblestone: 2 * HARDNESS_MULTIPLIER,
+ coal: 3 * HARDNESS_MULTIPLIER,
+ iron: 3 * HARDNESS_MULTIPLIER,
+ gold: 3 * HARDNESS_MULTIPLIER,
+ diamond: 3 * HARDNESS_MULTIPLIER,
+ emerald: 3 * HARDNESS_MULTIPLIER,
+ log: 2.0 * HARDNESS_MULTIPLIER,
+ leaves: 0.05 * HARDNESS_MULTIPLIER,
+ bedrock: Infinity
+ };
+
+ function createBlock(x, y, z, type) {
+ const geometry = new THREE.BoxGeometry(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
+ const material = getMaterial(type);
+ const cube = new THREE.Mesh(geometry, material);
+ cube.castShadow = true;
+ cube.receiveShadow = true;
+
+ // Center the grid
+ // GRID_SIZE is dynamic now
+ const offset = (GRID_SIZE * BLOCK_SIZE) / 2 - (BLOCK_SIZE / 2);
+
+ cube.position.set(
+ x * BLOCK_SIZE - offset,
+ y * BLOCK_SIZE, // Y is vertical
+ z * BLOCK_SIZE - offset
+ );
+
+ cube.userData = { gridX: x, gridY: y, gridZ: z, type: type };
+ scene.add(cube);
+ return cube;
+ }
+
+ function getBlockTypeForDepth(d) {
+ // Helper to reuse generation logic
+ if (d === 0) return 'grass';
+ if (d === 1) return 'dirt';
+ if (d === 2) return 'dirt';
+
+ // Bedrock at bottom? No, infinite mining.
+
+ const rand = Math.random();
+
+ // Ore probabilities based on depth
+ let coalProb = 0.05;
+ let ironProb = 0.0;
+ let goldProb = 0.0;
+ let diamondProb = 0.0;
+ let emeraldProb = 0.0;
+
+ if (d > 5) ironProb = 0.03;
+ if (d > 10) goldProb = 0.02;
+ if (d > 20) diamondProb = 0.01;
+ if (d > 50) emeraldProb = 0.005;
+
+ // Increase probs as we go deeper
+ if (d > 30) {
+ coalProb = 0.08;
+ ironProb = 0.05;
+ }
+ if (d > 60) {
+ goldProb = 0.04;
+ diamondProb = 0.02;
+ }
+
+ if (rand < emeraldProb) return 'emerald';
+ if (rand < emeraldProb + diamondProb) return 'diamond';
+ if (rand < emeraldProb + diamondProb + goldProb) return 'gold';
+ if (rand < emeraldProb + diamondProb + goldProb + ironProb) return 'iron';
+ if (rand < emeraldProb + diamondProb + goldProb + ironProb + coalProb) return 'coal';
+
+ if (d < 5) return 'dirt';
+ if (d < 10 && Math.random() < 0.5) return 'dirt';
+
+ return Math.random() < 0.8 ? 'stone' : 'cobblestone';
+ }
+
+ function generateLayer(layerIndex, absoluteDepth) {
+ const layer = [];
+ for (let x = 0; x < GRID_SIZE; x++) {
+ layer[x] = [];
+ for (let z = 0; z < GRID_SIZE; z++) {
+ // layerIndex corresponds to Y position.
+ // 0 is top, -1 is below, etc.
+ const type = getBlockTypeForDepth(absoluteDepth);
+ const block = createBlock(x, -layerIndex, z, type);
+ layer[x][z] = block;
+ }
+ }
+ return layer;
+ }
+
+ const STRUCTURES = {
+ tree: []
+ };
+
+ // Init Tree Structure
+ (() => {
+ const s = STRUCTURES.tree;
+ for(let y=0; y<3; y++) s.push({x:0, y:y, z:0, type:'log'});
+ for(let x=-2; x<=2; x++) {
+ for(let y=2; y<=3; y++) {
+ for(let z=-2; z<=2; z++) {
+ if(Math.abs(x)===2 && Math.abs(z)===2) continue;
+ if(x===0 && z===0 && y===2) continue;
+ s.push({x, y, z, type:'leaves'});
+ }
+ }
+ }
+ for(let x=-1; x<=1; x++) {
+ for(let z=-1; z<=1; z++) {
+ if(x===0 && z===0) continue;
+ s.push({x, y:4, z, type:'leaves'});
+ }
+ }
+ s.push({x:0, y:5, z:0, type:'leaves'});
+ })();
+
+ function placeStructure(gx, gy, gz, structureName) {
+ const structure = STRUCTURES[structureName];
+ if (!structure) return;
+
+ structure.forEach(block => {
+ spawnBlock(gx + block.x, gy + block.y, gz + block.z, block.type);
+ });
+ }
+
+ function generateTree() {
+ const cx = Math.floor(GRID_SIZE / 2);
+ const cz = Math.floor(GRID_SIZE / 2);
+ placeStructure(cx, 1, cz, 'tree');
+ }
+
+ function saveGame() {
+ const saveData = {
+ depth,
+ score,
+ inventory,
+ upgrades,
+ layers: layers.map(layer => layer.map(row => row.map(block => block ? block.userData.type : null))),
+ extraBlocks: extraBlocks.map(b => ({
+ type: b.userData.type,
+ gridX: b.userData.gridX,
+ gridZ: b.userData.gridZ,
+ y: Math.round(b.position.y / BLOCK_SIZE),
+ isSapling: b.userData.isSapling,
+ growthTimer: b.userData.growthTimer
+ })),
+ drops: drops.map(d => ({
+ type: d.userData.type,
+ count: d.userData.count || 1,
+ x: d.position.x,
+ y: d.position.y,
+ z: d.position.z,
+ vx: d.userData.velocity.x,
+ vy: d.userData.velocity.y,
+ vz: d.userData.velocity.z,
+ life: d.userData.life,
+ autoCollect: d.userData.autoCollect
+ }))
+ };
+ localStorage.setItem('miningGameSave', JSON.stringify(saveData));
+ }
+
+ function loadGame() {
+ const dataStr = localStorage.getItem('miningGameSave');
+ if (!dataStr) return false;
+
+ try {
+ const data = JSON.parse(dataStr);
+ depth = data.depth;
+ score = data.score;
+ inventory = Object.assign({}, data.inventory);
+ if (data.upgrades) {
+ upgrades = Object.assign(upgrades, data.upgrades);
+ // Ensure new upgrades are initialized if loading old save
+ if (upgrades.mining_area === undefined) upgrades.mining_area = 0;
+ if (upgrades.vein_miner === undefined) upgrades.vein_miner = 0;
+ if (upgrades.tnt_frequency === undefined) upgrades.tnt_frequency = 0;
+ if (upgrades.tnt_power === undefined) upgrades.tnt_power = 0;
+ if (upgrades.pickup_range === undefined) upgrades.pickup_range = 0;
+ if (upgrades.grid_size === undefined) upgrades.grid_size = 0;
+
+ // Update GRID_SIZE based on loaded upgrade
+ GRID_SIZE = 5 + (upgrades.grid_size * 2);
+
+ // Adjust camera for larger grids
+ if (upgrades.grid_size > 0) {
+ const d = 5 + upgrades.grid_size;
+ camera.left = -d * aspect;
+ camera.right = d * aspect;
+ camera.top = d;
+ camera.bottom = -d;
+ camera.updateProjectionMatrix();
+ }
+ }
+
+ depthDisplay.innerText = depth;
+ scoreDisplay.innerText = score;
+ updateInventoryUI();
+
+ // Rebuild layers
+ layers = [];
+ data.layers.forEach((savedLayer, layerIdx) => {
+ const layer = [];
+ // Handle grid size mismatch if save is old
+ const savedSize = savedLayer.length;
+ const offsetDiff = (GRID_SIZE - savedSize) / 2;
+
+ for(let x=0; x= 0 && oldX < savedSize && oldZ >= 0 && oldZ < savedSize) {
+ if (savedLayer[oldX] && savedLayer[oldX][oldZ]) {
+ type = savedLayer[oldX][oldZ];
+ }
+ } else {
+ // New outer block for expanded grid
+ // Only if we are expanding. If shrinking (not possible yet), we just clip.
+ // But wait, if we load an old save with smaller grid, we should probably fill the new space?
+ // Or just leave it empty?
+ // If we leave it empty, checkLayerCleared might trigger.
+ // So we should probably generate blocks for the new area.
+ if (GRID_SIZE > savedSize) {
+ type = getBlockTypeForDepth(depth + layerIdx);
+ }
+ }
+
+ if (type) {
+ const block = createBlock(x, -layerIdx, z, type);
+ layer[x][z] = block;
+ scene.add(block); // Ensure we add to scene!
+ } else {
+ layer[x][z] = null;
+ }
+ }
+ }
+ layers.push(layer);
+ });
+
+ // Rebuild extraBlocks
+ extraBlocks = [];
+ data.extraBlocks.forEach(bData => {
+ if (bData.isSapling) {
+ spawnSapling(bData.gridX, bData.y, bData.gridZ, bData.growthTimer);
+ } else {
+ spawnBlock(bData.gridX, bData.y, bData.gridZ, bData.type);
+ }
+ });
+
+ // Rebuild drops
+ if (data.drops) {
+ data.drops.forEach(dData => {
+ const pos = new THREE.Vector3(dData.x, dData.y, dData.z);
+ spawnDrop(pos, dData.type, dData.autoCollect);
+ // The last added drop is at drops[drops.length-1]
+ const drop = drops[drops.length-1];
+ if (drop) {
+ drop.userData.velocity.set(dData.vx, dData.vy, dData.vz);
+ drop.userData.life = dData.life || 0;
+ drop.userData.physicsPos.copy(pos);
+ drop.userData.count = dData.count || 1;
+
+ // Apply scale based on count
+ const count = drop.userData.count;
+ const newScale = Math.min(2.0, 0.6 + (count * 0.1));
+ if (drop.userData.isExtruded) {
+ drop.scale.set(newScale, newScale, newScale);
+ } else {
+ const blockScale = Math.min(1.5, 1.0 + (count * 0.1));
+ drop.scale.set(blockScale, blockScale, blockScale);
+ }
+ }
+ });
+ }
+
+ return true;
+ } catch (e) {
+ console.error("Failed to load save", e);
+ return false;
+ }
+ }
+
+ function initGame() {
+ if (loadGame()) {
+ console.log("Game loaded from save.");
+ } else {
+ // Generate initial layers
+ for (let i = 0; i < VISIBLE_LAYERS; i++) {
+ layers.push(generateLayer(i, depth + i));
+ }
+ generateTree();
+ }
+
+ // Set initial camera position for tree
+ if (extraBlocks.length > 0) {
+ cameraOffsetY = 3.5;
+ camera.position.set(20, 14 + cameraOffsetY, 20);
+ camera.lookAt(0, cameraOffsetY, 0);
+ }
+
+ // Auto-save
+ setInterval(saveGame, 5000);
+ }
+
+ function checkLayerCleared() {
+ // Check the top layer (index 0)
+ const topLayer = layers[0];
+ let isEmpty = true;
+
+ for (let x = 0; x < GRID_SIZE; x++) {
+ for (let z = 0; z < GRID_SIZE; z++) {
+ if (topLayer[x][z] !== null) {
+ isEmpty = false;
+ break;
+ }
+ }
+ if (!isEmpty) break;
+ }
+
+ if (isEmpty) {
+ advanceLevel();
+ }
+ }
+
+ function advanceLevel() {
+ if (isAnimating) return;
+ isAnimating = true;
+
+ // Remove empty top layer from array
+ layers.shift();
+
+ // Increment depth
+ depth++;
+ depthDisplay.innerText = depth;
+
+ // Generate new layer at the bottom
+ const newLayerDepth = depth + VISIBLE_LAYERS - 1;
+
+ // Create it one step lower (VISIBLE_LAYERS instead of VISIBLE_LAYERS - 1)
+ // so it can animate up into place
+ const newLayer = generateLayer(VISIBLE_LAYERS, newLayerDepth);
+
+ layers.push(newLayer);
+
+ // Animate all blocks moving up
+ const duration = 500; // ms
+ const start = Date.now();
+
+ const startPositions = [];
+ const allBlocks = [];
+
+ layers.forEach(layer => {
+ layer.forEach(row => {
+ row.forEach(block => {
+ if (block) {
+ allBlocks.push(block);
+ startPositions.push(block.position.y);
+ }
+ });
+ });
+ });
+
+ extraBlocks.forEach(block => {
+ allBlocks.push(block);
+ startPositions.push(block.position.y);
+ });
+
+ // Also animate drops
+ const dropStartPositions = [];
+ drops.forEach(drop => {
+ dropStartPositions.push(drop.userData.physicsPos.y);
+ });
+
+ function animate() {
+ const now = Date.now();
+ const progress = Math.min((now - start) / duration, 1);
+ const ease = 1 - Math.pow(1 - progress, 3); // Cubic ease out
+ const offset = ease * BLOCK_SIZE;
+
+ allBlocks.forEach((b, i) => {
+ b.position.y = startPositions[i] + offset;
+ });
+
+ drops.forEach((drop, i) => {
+ drop.userData.physicsPos.y = dropStartPositions[i] + offset;
+ drop.position.y = drop.userData.physicsPos.y; // Visual update handled in updateDrops but we force it here for smoothness
+ });
+
+ if (progress < 1) {
+ requestAnimationFrame(animate);
+ } else {
+ isAnimating = false;
+ // Correct positions exactly to avoid float drift
+ layers.forEach((layer, layerIdx) => {
+ layer.forEach(row => {
+ row.forEach(block => {
+ if (block) {
+ // The top layer (index 0) should now be at Y=0
+ block.position.y = -layerIdx * BLOCK_SIZE;
+ }
+ });
+ });
+ });
+ // Extra blocks just stay where they ended up (shifted up by 1)
+
+ // Finalize drop positions
+ drops.forEach((drop, i) => {
+ drop.userData.physicsPos.y = dropStartPositions[i] + BLOCK_SIZE;
+ });
+
+ saveGame();
+ checkLayerCleared(); // Check if the next layer is also empty
+ }
+ }
+
+ animate();
+ }
+
+ // --- Inventory ---
+ let inventory = {};
+ let selectedItem = null;
+ const inventoryDisplay = document.getElementById('inventory-display');
+
+ function isPlaceable(type) {
+ const placeables = ['log', 'planks', 'cobblestone', 'dirt', 'stone', 'leaves', 'sapling', 'grass'];
+ return placeables.includes(type);
+ }
+
+ function addToInventory(type) {
+ if (!inventory[type]) inventory[type] = 0;
+ inventory[type]++;
+ updateInventoryUI();
+ }
+
+ function updateInventoryUI() {
+ if (!inventoryDisplay) return;
+ inventoryDisplay.innerHTML = '';
+ for (const [type, count] of Object.entries(inventory)) {
+ if (count <= 0) continue; // Skip items with 0 count
+
+ const slot = document.createElement('div');
+ slot.className = 'inventory-slot';
+ slot.dataset.type = type; // For animation targeting
+
+ if (selectedItem === type) {
+ slot.style.borderColor = '#ffff00';
+ slot.style.borderWidth = '3px';
+ slot.style.transform = 'scale(1.1)';
+ }
+
+ slot.onclick = () => {
+ if (selectedItem === type) {
+ selectedItem = null;
+ } else {
+ if (isPlaceable(type)) {
+ selectedItem = type;
+ }
+ }
+ updateInventoryUI();
+ };
+
+ const img = document.createElement('img');
+ let iconName = type;
+ if (type === 'coal') iconName = 'coal_ore';
+ if (type === 'iron') iconName = 'iron_ore';
+ if (type === 'gold') iconName = 'gold_ore';
+ if (type === 'diamond') iconName = 'diamond_ore';
+ if (type === 'emerald') iconName = 'emerald_ore';
+ if (type === 'log') iconName = 'log_oak';
+ if (type === 'leaves') iconName = 'leaves_oak';
+ if (type === 'grass') iconName = 'grass_side';
+ if (type === 'stick') iconName = 'stick';
+ if (type === 'sapling') iconName = 'sapling_oak';
+ if (type === 'apple') iconName = 'apple';
+ if (type === 'planks') iconName = 'planks_oak';
+ if (type === 'wood_pickaxe') iconName = 'wood_pickaxe';
+ if (type === 'stone_pickaxe') iconName = 'stone_pickaxe';
+ if (type === 'iron_pickaxe') iconName = 'iron_pickaxe';
+ if (type === 'gold_pickaxe') iconName = 'gold_pickaxe';
+ if (type === 'diamond_pickaxe') iconName = 'diamond_pickaxe';
+
+ if (['apple', 'stick', 'wood_pickaxe', 'stone_pickaxe', 'iron_pickaxe', 'gold_pickaxe', 'diamond_pickaxe'].includes(type)) {
+ img.src = `items/${iconName}.png`;
+ } else {
+ img.src = `blocks/${iconName}.png`;
+ }
+
+ // Special handling for non-block items to tint them?
+ if (type === 'stick') {
+ img.style.transform = 'scale(0.8)';
+ }
+ if (type === 'sapling') {
+ img.style.transform = 'scale(0.8)';
+ }
+
+ const countDiv = document.createElement('div');
+ countDiv.className = 'inventory-count';
+ countDiv.innerText = count;
+
+ slot.appendChild(img);
+ slot.appendChild(countDiv);
+ inventoryDisplay.appendChild(slot);
+ }
+ updateCraftingUI();
+ }
+
+ // --- Crafting ---
+ const craftingDisplay = document.getElementById('crafting-display');
+ const RECIPES = [
+ {
+ output: 'planks',
+ count: 4,
+ inputs: { 'log': 1 }
+ },
+ {
+ output: 'stick',
+ count: 4,
+ inputs: { 'planks': 2 }
+ },
+ {
+ output: 'wood_pickaxe',
+ count: 1,
+ inputs: { 'planks': 3, 'stick': 2 }
+ },
+ {
+ output: 'stone_pickaxe',
+ count: 1,
+ inputs: { 'cobblestone': 3, 'stick': 2 }
+ },
+ {
+ output: 'iron_pickaxe',
+ count: 1,
+ inputs: { 'iron': 3, 'stick': 2 }
+ },
+ {
+ output: 'gold_pickaxe',
+ count: 1,
+ inputs: { 'gold': 3, 'stick': 2 }
+ },
+ {
+ output: 'diamond_pickaxe',
+ count: 1,
+ inputs: { 'diamond': 3, 'stick': 2 }
+ }
+ ];
+
+ function canCraft(recipe) {
+ for (const [item, count] of Object.entries(recipe.inputs)) {
+ if (!inventory[item] || inventory[item] < count) return false;
+ }
+ return true;
+ }
+
+ function craft(recipe) {
+ if (!canCraft(recipe)) return;
+
+ // Deduct inputs
+ for (const [item, count] of Object.entries(recipe.inputs)) {
+ inventory[item] -= count;
+ if (inventory[item] <= 0) delete inventory[item];
+ }
+
+ // Add output
+ if (!inventory[recipe.output]) inventory[recipe.output] = 0;
+ inventory[recipe.output] += recipe.count;
+
+ updateInventoryUI();
+ // updateCraftingUI called by updateInventoryUI
+ }
+
+ function updateCraftingUI() {
+ if (!craftingDisplay) return;
+ craftingDisplay.innerHTML = '';
+
+ RECIPES.forEach(recipe => {
+ const slot = document.createElement('div');
+ slot.className = 'crafting-slot';
+ if (canCraft(recipe)) {
+ slot.classList.add('can-craft');
+ slot.onclick = () => craft(recipe);
+ } else {
+ slot.style.opacity = '0.5';
+ slot.style.cursor = 'default';
+ }
+
+ const img = document.createElement('img');
+ let iconName = recipe.output;
+ if (iconName === 'planks') iconName = 'planks_oak';
+
+ if (['wood_pickaxe', 'stone_pickaxe', 'iron_pickaxe', 'gold_pickaxe', 'diamond_pickaxe', 'stick'].includes(recipe.output)) {
+ img.src = `items/${iconName}.png`;
+ } else {
+ img.src = `blocks/${iconName}.png`;
+ }
+
+ // Tooltip
+ const tooltip = document.createElement('div');
+ tooltip.className = 'crafting-tooltip';
+ let costText = [];
+ for (const [item, count] of Object.entries(recipe.inputs)) {
+ costText.push(`${count} ${item}`);
+ }
+ tooltip.innerText = `${recipe.output} (${costText.join(', ')})`;
+
+ slot.appendChild(img);
+ slot.appendChild(tooltip);
+ craftingDisplay.appendChild(slot);
+ });
+ }
+
+ // --- Drops ---
+ const drops = [];
+ const dropGeometry = new THREE.BoxGeometry(0.25, 0.25, 0.25);
+
+ // Shadow Texture
+ const shadowCanvas = document.createElement('canvas');
+ shadowCanvas.width = 64;
+ shadowCanvas.height = 64;
+ const shadowCtx = shadowCanvas.getContext('2d');
+ const shadowGradient = shadowCtx.createRadialGradient(32, 32, 0, 32, 32, 32);
+ shadowGradient.addColorStop(0, 'rgba(0, 0, 0, 0.5)');
+ shadowGradient.addColorStop(1, 'rgba(0, 0, 0, 0)');
+ shadowCtx.fillStyle = shadowGradient;
+ shadowCtx.fillRect(0, 0, 64, 64);
+ const shadowTexture = new THREE.CanvasTexture(shadowCanvas);
+ const shadowMaterial = new THREE.MeshBasicMaterial({ map: shadowTexture, transparent: true, depthWrite: false });
+ const shadowGeometry = new THREE.PlaneGeometry(0.4, 0.4);
+
+ function spawnDrop(position, type, autoCollect = false) {
+ // Check for existing drops to clump with
+ for (const existingDrop of drops) {
+ if (existingDrop.userData.type === type && !existingDrop.userData.collecting) {
+ const dist = existingDrop.userData.physicsPos.distanceTo(position);
+ if (dist < 1.0) { // Within 1 block radius
+ existingDrop.userData.count = (existingDrop.userData.count || 1) + 1;
+
+ // Visual feedback for clumping (scale up slightly, max 2x)
+ const newScale = Math.min(2.0, 0.6 + (existingDrop.userData.count * 0.1));
+ if (existingDrop.userData.isExtruded) {
+ existingDrop.scale.set(newScale, newScale, newScale);
+ } else {
+ // Standard blocks start at 1.0
+ const blockScale = Math.min(1.5, 1.0 + (existingDrop.userData.count * 0.1));
+ existingDrop.scale.set(blockScale, blockScale, blockScale);
+ }
+
+ // Reset life to keep it around longer
+ existingDrop.userData.life = 0;
+ return; // Merged, don't spawn new
+ }
+ }
+ }
+
+ const material = getMaterial(type);
+
+ // Adjust geometry based on type
+ let geometry = dropGeometry;
+ let isExtruded = false;
+
+ if (type === 'apple' || type === 'stick' || type === 'sapling') {
+ if (geometryCache[type]) {
+ geometry = geometryCache[type];
+ isExtruded = true;
+ } else {
+ // Try to generate
+ const tex = textures[type];
+ if (tex && tex.image && tex.image.complete && tex.image.width > 0) {
+ geometry = generateExtrudedGeometry(tex.image);
+ geometryCache[type] = geometry;
+ isExtruded = true;
+ } else if (tex && tex.image) {
+ // Load later
+ tex.image.onload = () => {
+ const geo = generateExtrudedGeometry(tex.image);
+ geometryCache[type] = geo;
+ // Update existing drops of this type?
+ // For simplicity, just next drops will be correct.
+ // Or we can update this drop:
+ if (drop.parent) { // If still in scene
+ drop.geometry = geo;
+ }
+ };
+ }
+ }
+ }
+
+ const drop = new THREE.Mesh(geometry, material);
+
+ drop.castShadow = false;
+ drop.receiveShadow = false;
+
+ // Physics state
+ drop.userData.physicsPos = position.clone();
+ drop.userData.velocity = new THREE.Vector3(
+ (Math.random() - 0.5) * 0.025, // Slower spread
+ 0.025 + Math.random() * 0.025, // Lower pop
+ (Math.random() - 0.5) * 0.025
+ );
+ drop.userData.life = 0;
+ drop.userData.bobOffset = Math.random() * Math.PI * 2; // Random start phase
+ drop.userData.type = type;
+ drop.userData.count = 1; // Start with 1 item
+ drop.userData.autoCollect = autoCollect;
+ drop.userData.autoCollectTimer = 0;
+ drop.userData.isExtruded = isExtruded;
+
+ if (isExtruded) {
+ drop.scale.set(0.6, 0.6, 0.6);
+ drop.userData.radius = 0.15; // 0.25 * 0.6
+ } else {
+ drop.userData.radius = 0.125;
+ }
+
+ // Shadow
+ const shadow = new THREE.Mesh(shadowGeometry, shadowMaterial);
+ shadow.rotation.x = -Math.PI / 2;
+ shadow.position.copy(position);
+ shadow.position.y = -100; // Hide initially
+
+ drop.userData.shadow = shadow;
+
+ scene.add(drop);
+ scene.add(shadow);
+ drops.push(drop);
+ }
+
+ function updateDrops() {
+ for (let i = drops.length - 1; i >= 0; i--) {
+ const drop = drops[i];
+
+ // Collecting animation
+ if (drop.userData.collecting) {
+ // Calculate screen position
+ const vector = drop.position.clone();
+ vector.project(camera);
+
+ const canvas = renderer.domElement;
+ const rect = canvas.getBoundingClientRect();
+ const scrollX = window.scrollX || window.pageXOffset;
+ const scrollY = window.scrollY || window.pageYOffset;
+
+ const x = (vector.x + 1) / 2 * rect.width + rect.left + scrollX;
+ const y = -(vector.y - 1) / 2 * rect.height + rect.top + scrollY;
+
+ // Create 2D floating item
+ createFloatingItem(drop.userData.type, x - 16, y - 16, drop.userData.count || 1);
+
+ // Remove 3D drop immediately
+ scene.remove(drop);
+ scene.remove(drop.userData.shadow);
+ drops.splice(i, 1);
+ continue;
+ }
+
+ const vel = drop.userData.velocity;
+ const pos = drop.userData.physicsPos;
+
+ // Gravity (Slower)
+ vel.y -= 0.002;
+
+ // Move Physics Position
+ pos.add(vel);
+
+ // Floor Collision Logic (using pos)
+ const gx = Math.round(pos.x / BLOCK_SIZE + (GRID_SIZE/2 - 0.5));
+ const gz = Math.round(pos.z / BLOCK_SIZE + (GRID_SIZE/2 - 0.5));
+
+ let floorY = -Infinity;
+
+ // Check layers
+ for (let l = 0; l < layers.length; l++) {
+ if (gx >= 0 && gx < GRID_SIZE && gz >= 0 && gz < GRID_SIZE) {
+ const block = layers[l][gx][gz];
+ if (block) {
+ const by = block.position.y;
+ if (by < pos.y && by > floorY) {
+ floorY = by;
+ }
+ }
+ }
+ }
+ // Check extra blocks
+ extraBlocks.forEach(b => {
+ if (Math.round(b.position.x / BLOCK_SIZE + (GRID_SIZE/2 - 0.5)) === gx &&
+ Math.round(b.position.z / BLOCK_SIZE + (GRID_SIZE/2 - 0.5)) === gz) {
+ if (b.position.y < pos.y && b.position.y > floorY) {
+ floorY = b.position.y;
+ }
+ }
+ });
+
+ // Collision check
+ // Top of block is floorY + 0.5
+ // Bottom of drop is pos.y - radius
+ const radius = drop.userData.radius || 0.125;
+ const bobAmplitude = 0.05;
+ if (floorY !== -Infinity) {
+ // Ensure we sit high enough so the bob doesn't clip
+ if (pos.y - radius - bobAmplitude < floorY + 0.5) {
+ pos.y = floorY + 0.5 + radius + bobAmplitude;
+ vel.y = 0; // No bounce
+ vel.x *= 0.7; // Friction
+ vel.z *= 0.7;
+ }
+ } else {
+ if (pos.y < -10) {
+ scene.remove(drop);
+ scene.remove(drop.userData.shadow);
+ drops.splice(i, 1);
+ continue;
+ }
+ }
+
+ // Wall Collision
+ const limit = (GRID_SIZE * BLOCK_SIZE) / 2 - 0.2;
+ if (pos.x > limit) { pos.x = limit; vel.x *= -0.5; }
+ if (pos.x < -limit) { pos.x = -limit; vel.x *= -0.5; }
+ if (pos.z > limit) { pos.z = limit; vel.z *= -0.5; }
+ if (pos.z < -limit) { pos.z = -limit; vel.z *= -0.5; }
+
+ // Update Visuals
+ drop.userData.life++;
+
+ // Rotation (Yaw)
+ drop.rotation.y += 0.01; // Slow rotation
+
+ // Bobbing
+ const bob = Math.sin(drop.userData.life * 0.02 + drop.userData.bobOffset) * 0.05;
+
+ drop.position.copy(pos);
+ drop.position.y += bob;
+
+ // Shadow Update
+ const shadow = drop.userData.shadow;
+ if (floorY !== -Infinity) {
+ shadow.position.set(pos.x, floorY + 0.5 + 0.01, pos.z);
+ shadow.visible = true;
+ } else {
+ shadow.visible = false;
+ }
+
+ // Despawn logic
+ // Removed auto-despawn. Items stay until collected.
+ if (pos.y < -10) {
+ scene.remove(drop);
+ scene.remove(shadow);
+ drops.splice(i, 1);
+ }
+ }
+ }
+
+ // --- Interaction ---
+ const raycaster = new THREE.Raycaster();
+ const mouse = new THREE.Vector2();
+
+ let isMining = false;
+ let miningBlock = null;
+ let miningStartTime = 0;
+ let miningDuration = 0;
+
+ function updateMouse(event) {
+ const rect = canvas.getBoundingClientRect();
+ const clientX = event.clientX || (event.touches && event.touches[0].clientX);
+ const clientY = event.clientY || (event.touches && event.touches[0].clientY);
+
+ if (clientX === undefined || clientY === undefined) return;
+
+ mouse.x = ((clientX - rect.left) / rect.width) * 2 - 1;
+ mouse.y = -((clientY - rect.top) / rect.height) * 2 + 1;
+ }
+
+ function getIntersection() {
+ raycaster.setFromCamera(mouse, camera);
+
+ const meshes = [];
+ layers.forEach(layer => {
+ layer.forEach(row => {
+ row.forEach(block => {
+ if (block) meshes.push(block);
+ });
+ });
+ });
+ extraBlocks.forEach(block => meshes.push(block));
+
+ const intersects = raycaster.intersectObjects(meshes);
+ if (intersects.length > 0) {
+ return intersects[0];
+ }
+ return null;
+ }
+
+ function getBlockUnderMouse() {
+ const intersect = getIntersection();
+ return intersect ? intersect.object : null;
+ }
+
+ function checkCollection() {
+ // Base radius in NDC (screen space -1 to 1)
+ // 0.15 is roughly 7.5% of screen width/height
+ let pickupRadius = 0.15 + (upgrades.pickup_range * 0.05);
+
+ drops.forEach(drop => {
+ if (drop.userData.collecting) return;
+
+ const vector = drop.position.clone();
+ vector.project(camera); // vector is now in NDC
+
+ // Check if in front of camera
+ if (vector.z > 1) return;
+
+ const dx = vector.x - mouse.x;
+ const dy = vector.y - mouse.y;
+ const dist = Math.sqrt(dx*dx + dy*dy);
+
+ if (dist < pickupRadius) {
+ drop.userData.collecting = true;
+ if (drop.userData.shadow) drop.userData.shadow.visible = false;
+ }
+ });
+ }
+
+ function getBlockAt(x, y, z) {
+ // Check layers
+ if (y <= 0) {
+ const layerIdx = -y;
+ if (layerIdx < layers.length) {
+ if (x >= 0 && x < GRID_SIZE && z >= 0 && z < GRID_SIZE) {
+ return layers[layerIdx][x][z];
+ }
+ }
+ }
+ // Check extra blocks
+ return extraBlocks.find(b =>
+ b.userData.gridX === x &&
+ Math.round(b.position.y / BLOCK_SIZE) === y &&
+ b.userData.gridZ === z
+ );
+ }
+
+ function getMiningSpeedMultiplier() {
+ let multiplier = 1;
+ if (inventory['wood_pickaxe']) multiplier = 2;
+ if (inventory['stone_pickaxe']) multiplier = 4;
+ if (inventory['iron_pickaxe']) multiplier = 6;
+ if (inventory['gold_pickaxe']) multiplier = 12;
+ if (inventory['diamond_pickaxe']) multiplier = 8;
+
+ // Apply speed upgrade
+ multiplier *= (1 + (upgrades.speed * 0.2));
+
+ return multiplier;
+ }
+
+ function startMining(block) {
+ if (miningBlock === block) return; // Already mining this block
+
+ cancelMining(); // Stop mining previous block
+
+ if (!block) return;
+
+ // Check if block is mineable (exposed)
+ const gx = block.userData.gridX;
+ const gz = block.userData.gridZ;
+ const gy = Math.round(block.position.y / BLOCK_SIZE);
+
+ // Check if there is a block above
+ const blockAbove = getBlockAt(gx, gy + 1, gz);
+ if (blockAbove) return;
+
+ miningBlock = block;
+ miningStartTime = performance.now();
+ const type = block.userData.type;
+
+ let baseDuration = BLOCK_HEALTH[type] || 1000;
+ miningDuration = baseDuration / getMiningSpeedMultiplier();
+
+ damageOverlay.position.copy(block.position);
+ damageOverlay.visible = true;
+ damageOverlay.material.map = destroyTextures[0];
+ }
+
+ function cancelMining() {
+ miningBlock = null;
+ damageOverlay.visible = false;
+ }
+
+ function processMining() {
+ if (!isMining || !miningBlock) return;
+
+ const elapsed = performance.now() - miningStartTime;
+ const progress = elapsed / miningDuration;
+
+ if (progress >= 1) {
+ breakBlock(miningBlock);
+ cancelMining();
+
+ // Continuous mining: check if mouse is still down and over a block
+ if (isMining) {
+ const nextBlock = getBlockUnderMouse();
+ if (nextBlock) {
+ startMining(nextBlock);
+ }
+ }
+ } else {
+ const stage = Math.floor(progress * 10);
+ if (stage >= 0 && stage < 10) {
+ damageOverlay.material.map = destroyTextures[stage];
+ }
+ }
+ }
+
+ function breakBlock(block, isChainReaction = false) {
+ if (!block) return;
+
+ const gx = block.userData.gridX;
+ const gz = block.userData.gridZ;
+ const type = block.userData.type;
+ const loot = getLoot(type);
+
+ // Handle drops
+ loot.forEach(itemType => {
+ spawnDrop(block.position, itemType, false);
+ });
+
+ // Check if it's in extra blocks
+ const extraIdx = extraBlocks.indexOf(block);
+ if (extraIdx !== -1) {
+ scene.remove(block);
+ extraBlocks.splice(extraIdx, 1);
+
+ // Score
+ let points = 1;
+ if (type === 'log') points = 5;
+ if (type === 'leaves') points = 1;
+ score += points;
+ scoreDisplay.innerText = score;
+ return;
+ }
+
+ // Find layer index
+ let foundLayerIdx = -1;
+ for(let l=0; l 0 && ['coal', 'iron', 'gold', 'diamond', 'emerald'].includes(type)) {
+ const maxVein = 2 + upgrades.vein_miner * 2;
+ mineVein(gx, foundLayerIdx, gz, type, maxVein);
+ }
+
+ // Area Mining (only for non-ores usually, but let's do it for stone/dirt/grass)
+ if (upgrades.mining_area > 0 && ['stone', 'dirt', 'grass', 'cobblestone'].includes(type)) {
+ const radius = upgrades.mining_area; // 1 = 3x3, 2 = 5x5
+ mineArea(gx, foundLayerIdx, gz, radius);
+ }
+
+ // Check for layer clear AFTER all chain reactions are done
+ // We check layer 0 specifically because that's the one that triggers advancement
+ checkLayerCleared();
+ }
+ }
+ }
+
+ function mineVein(gx, layerIdx, gz, type, maxBlocks) {
+ let minedCount = 0;
+ const queue = [{x: gx, z: gz, l: layerIdx}];
+ const visited = new Set();
+ visited.add(`${gx},${layerIdx},${gz}`);
+
+ while (queue.length > 0 && minedCount < maxBlocks) {
+ const current = queue.shift();
+
+ // Check neighbors (up, down, left, right, forward, back)
+ const neighbors = [
+ {x: current.x+1, z: current.z, l: current.l},
+ {x: current.x-1, z: current.z, l: current.l},
+ {x: current.x, z: current.z+1, l: current.l},
+ {x: current.x, z: current.z-1, l: current.l},
+ // Same layer only for now to keep it simple, or maybe check adjacent layers?
+ // Let's stick to same layer for simplicity first, or +/- 1 layer
+ ];
+
+ for (const n of neighbors) {
+ if (n.x < 0 || n.x >= GRID_SIZE || n.z < 0 || n.z >= GRID_SIZE) continue;
+
+ const key = `${n.x},${n.l},${n.z}`;
+ if (visited.has(key)) continue;
+
+ const block = layers[n.l][n.x][n.z];
+ if (block && block.userData.type === type) {
+ visited.add(key);
+ queue.push(n);
+ breakBlock(block, true); // Chain reaction
+ minedCount++;
+ if (minedCount >= maxBlocks) break;
+ }
+ }
+ }
+ }
+
+ function mineArea(gx, layerIdx, gz, radius) {
+ for (let x = gx - radius; x <= gx + radius; x++) {
+ for (let z = gz - radius; z <= gz + radius; z++) {
+ if (x === gx && z === gz) continue; // Already mined
+ if (x < 0 || x >= GRID_SIZE || z < 0 || z >= GRID_SIZE) continue;
+
+ const block = layers[layerIdx][x][z];
+ if (block) {
+ // Only mine common blocks with area miner
+ if (['stone', 'dirt', 'grass', 'cobblestone'].includes(block.userData.type)) {
+ breakBlock(block, true);
+ }
+ }
+ }
+ }
+ }
+
+ function spawnSapling(gx, gy, gz, growthTimer = 0) {
+ const type = 'sapling';
+ const geometry = new THREE.PlaneGeometry(0.7, 0.7);
+ const mat = new THREE.MeshLambertMaterial({
+ map: textures.sapling,
+ transparent: true,
+ side: THREE.DoubleSide,
+ alphaTest: 0.5
+ });
+
+ const plane1 = new THREE.Mesh(geometry, mat);
+ plane1.rotation.y = Math.PI / 4;
+
+ const plane2 = new THREE.Mesh(geometry, mat);
+ plane2.rotation.y = -Math.PI / 4;
+
+ const saplingGroup = new THREE.Group();
+ saplingGroup.add(plane1);
+ saplingGroup.add(plane2);
+
+ saplingGroup.position.set(
+ (gx - (GRID_SIZE/2 - 0.5)) * BLOCK_SIZE,
+ gy * BLOCK_SIZE, // Center of block
+ (gz - (GRID_SIZE/2 - 0.5)) * BLOCK_SIZE
+ );
+
+ // Adjust height. 0.7 height. Center is at 0.
+ // We want bottom at -0.5 relative to block center.
+ // So center should be at -0.5 + 0.35 = -0.15
+ plane1.position.y = -0.15;
+ plane2.position.y = -0.15;
+
+ saplingGroup.userData = {
+ type: type,
+ gridX: gx,
+ gridZ: gz,
+ isSapling: true,
+ growthTimer: growthTimer,
+ maxGrowthTime: 600 // 10 seconds at 60fps
+ };
+
+ // Progress Bar
+ const barBg = new THREE.Mesh(
+ new THREE.PlaneGeometry(0.8, 0.1),
+ new THREE.MeshBasicMaterial({ color: 0x000000 })
+ );
+ barBg.position.set(0, 0.5, 0);
+ // Billboard
+ barBg.userData.isBillboard = true;
+
+ const barFg = new THREE.Mesh(
+ new THREE.PlaneGeometry(0.78, 0.08),
+ new THREE.MeshBasicMaterial({ color: 0x00ff00 })
+ );
+ barFg.position.z = 0.01;
+ barFg.scale.x = 0;
+
+ barBg.add(barFg);
+ saplingGroup.add(barBg);
+ saplingGroup.userData.progressBar = barFg;
+ saplingGroup.userData.progressBarBg = barBg;
+
+ scene.add(saplingGroup);
+ extraBlocks.push(saplingGroup);
+ }
+
+ function placeBlock(gx, gy, gz, type) {
+ // Deduct from inventory
+ inventory[type]--;
+ if (inventory[type] <= 0) {
+ delete inventory[type];
+ selectedItem = null;
+ }
+ updateInventoryUI();
+
+ // Create Mesh
+ if (type === 'sapling') {
+ spawnSapling(gx, gy, gz);
+ return;
+ }
+
+ let geometry = new THREE.BoxGeometry(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
+ let material = getMaterial(type);
+
+ const block = new THREE.Mesh(geometry, material);
+ block.position.set(
+ (gx - (GRID_SIZE/2 - 0.5)) * BLOCK_SIZE,
+ gy * BLOCK_SIZE,
+ (gz - (GRID_SIZE/2 - 0.5)) * BLOCK_SIZE
+ );
+
+ block.castShadow = true;
+ block.receiveShadow = true;
+ block.userData = { type: type, gridX: gx, gridZ: gz }; // gridX/Z might be off if not in layer structure
+
+ scene.add(block);
+ extraBlocks.push(block);
+ }
+
+ function onMouseDown(event) {
+ if (isAnimating) return;
+ updateMouse(event);
+
+ if (selectedItem) {
+ const intersect = getIntersection();
+ if (intersect) {
+ const block = intersect.object;
+ const face = intersect.face;
+
+ const p = intersect.point.clone().add(face.normal.clone().multiplyScalar(BLOCK_SIZE * 0.5));
+
+ const nx = Math.round(p.x / BLOCK_SIZE + (GRID_SIZE/2 - 0.5));
+ const ny = Math.round(p.y / BLOCK_SIZE);
+ const nz = Math.round(p.z / BLOCK_SIZE + (GRID_SIZE/2 - 0.5));
+
+ if (nx >= 0 && nx < GRID_SIZE && nz >= 0 && nz < GRID_SIZE) {
+ if (!getBlockAt(nx, ny, nz)) {
+ placeBlock(nx, ny, nz, selectedItem);
+ return;
+ }
+ }
+ }
+ }
+
+ isMining = true;
+ const block = getBlockUnderMouse();
+ if (block) startMining(block);
+ }
+
+ function onMouseUp(event) {
+ isMining = false;
+ cancelMining();
+ }
+
+ function onMouseMove(event) {
+ updateMouse(event);
+ checkCollection(); // Check if hovering over drops
+
+ if (isMining) {
+ const block = getBlockUnderMouse();
+ if (block !== miningBlock) {
+ if (block) {
+ startMining(block);
+ } else {
+ cancelMining();
+ }
+ }
+ }
+ }
+
+ canvas.addEventListener('mousedown', onMouseDown);
+ canvas.addEventListener('mouseup', onMouseUp);
+ canvas.addEventListener('mouseleave', onMouseUp);
+ canvas.addEventListener('mousemove', onMouseMove);
+
+ // Touch support
+ canvas.addEventListener('touchstart', (e) => {
+ e.preventDefault();
+ if (e.touches.length > 0) {
+ onMouseDown(e);
+ }
+ }, { passive: false });
+
+ canvas.addEventListener('touchend', (e) => {
+ e.preventDefault();
+ onMouseUp(e);
+ });
+
+ canvas.addEventListener('touchmove', (e) => {
+ e.preventDefault();
+ if (isMining && e.touches.length > 0) {
+ onMouseMove(e);
+ }
+ }, { passive: false });
+
+
+ function spawnBlock(gx, gy, gz, type) {
+ // Check bounds
+ if (gx < 0 || gx >= GRID_SIZE || gz < 0 || gz >= GRID_SIZE) return;
+
+ // Helper to spawn block without inventory
+ let geometry = new THREE.BoxGeometry(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
+ let material = getMaterial(type);
+ const block = new THREE.Mesh(geometry, material);
+ block.position.set(
+ (gx - (GRID_SIZE/2 - 0.5)) * BLOCK_SIZE,
+ gy * BLOCK_SIZE,
+ (gz - (GRID_SIZE/2 - 0.5)) * BLOCK_SIZE
+ );
+ block.castShadow = true;
+ block.receiveShadow = true;
+ block.userData = { type: type, gridX: gx, gridZ: gz };
+ scene.add(block);
+ extraBlocks.push(block);
+ }
+
+ function updateSaplings() {
+ for (let i = extraBlocks.length - 1; i >= 0; i--) {
+ const block = extraBlocks[i];
+ if (block.userData.isSapling) {
+ block.userData.growthTimer++;
+
+ // Update Billboard
+ if (block.userData.progressBarBg) {
+ block.userData.progressBarBg.lookAt(camera.position);
+ }
+
+ // Update Progress
+ const progress = block.userData.growthTimer / block.userData.maxGrowthTime;
+ if (block.userData.progressBar) {
+ block.userData.progressBar.scale.x = progress;
+ // To scale from left, we need to adjust position?
+ // Default plane geometry is centered.
+ // If we scale x, it scales from center.
+ // We can just update scale.
+ }
+
+ if (block.userData.growthTimer >= block.userData.maxGrowthTime) {
+ // Grow!
+ const { gridX, gridY, gridZ } = block.userData;
+ // Wait, we didn't save gridY in userData in placeBlock for sapling?
+ // We saved gridX, gridZ.
+ // We can calculate gridY from position.
+ const gy = Math.round(block.position.y / BLOCK_SIZE);
+
+ scene.remove(block);
+ extraBlocks.splice(i, 1);
+
+ placeStructure(block.userData.gridX, gy, block.userData.gridZ, 'tree');
+ }
+ }
+ }
+ }
+
+ // --- Animation Loop ---
+ function animate() {
+ requestAnimationFrame(animate);
+ processMining();
+ updateDrops();
+ updateSaplings();
+ updateTNT();
+ checkCollection();
+
+ // Camera offset logic
+ const targetOffset = extraBlocks.length > 0 ? 3.5 : 0;
+ if (Math.abs(cameraOffsetY - targetOffset) > 0.01) {
+ cameraOffsetY += (targetOffset - cameraOffsetY) * 0.05;
+ camera.position.set(20, 14 + cameraOffsetY, 20);
+ camera.lookAt(0, cameraOffsetY, 0);
+ } else if (cameraOffsetY !== targetOffset) {
+ cameraOffsetY = targetOffset;
+ camera.position.set(20, 14 + cameraOffsetY, 20);
+ camera.lookAt(0, cameraOffsetY, 0);
+ }
+
+ composer.render();
+ }
+
+ // Handle resize
+ window.addEventListener('resize', () => {
+ const aspect = canvas.clientWidth / canvas.clientHeight;
+ const d = 5;
+ camera.left = -d * aspect;
+ camera.right = d * aspect;
+ camera.top = d;
+ camera.bottom = -d;
+ camera.updateProjectionMatrix();
+
+ renderer.setPixelRatio(window.devicePixelRatio);
+ renderer.setSize(canvas.clientWidth, canvas.clientHeight, false);
+ composer.setSize(canvas.clientWidth, canvas.clientHeight);
+ });
+
+ // Start
+ initGame();
+ animate();
+
+ // --- Loot Table ---
+ function getLoot(blockType) {
+ if (blockType === 'leaves') {
+ const drops = [];
+ if (Math.random() < 0.05) drops.push('apple');
+ if (Math.random() < 0.05) drops.push('stick');
+ if (Math.random() < 0.05) drops.push('sapling');
+ return drops;
+ }
+ if (blockType === 'stone') return ['cobblestone'];
+ if (blockType === 'grass') return ['dirt'];
+ if (blockType === 'coal') return ['coal'];
+ if (blockType === 'iron') return ['iron'];
+ if (blockType === 'gold') return ['gold'];
+ if (blockType === 'diamond') return ['diamond'];
+ if (blockType === 'emerald') return ['emerald'];
+ if (blockType === 'log') return ['log'];
+ if (blockType === 'dirt') return ['dirt'];
+ if (blockType === 'cobblestone') return ['cobblestone'];
+
+ return [blockType];
+ }
+
+ // --- Extrusion Logic ---
+ const geometryCache = {};
+ const extrusionCanvas = document.createElement('canvas');
+ const extrusionCtx = extrusionCanvas.getContext('2d');
+
+ function generateExtrudedGeometry(image, depth = 0.0625) { // 1/16
+ const w = image.width;
+ const h = image.height;
+ extrusionCanvas.width = w;
+ extrusionCanvas.height = h;
+ extrusionCtx.drawImage(image, 0, 0);
+ const data = extrusionCtx.getImageData(0, 0, w, h).data;
+
+ const positions = [];
+ const uvs = [];
+ const normals = [];
+ const indices = [];
+ let indexOffset = 0;
+
+ const addFace = (v1, v2, v3, v4, n, u1, u2, u3, u4) => {
+ positions.push(...v1, ...v2, ...v3, ...v4);
+ normals.push(...n, ...n, ...n, ...n);
+ uvs.push(...u1, ...u2, ...u3, ...u4);
+ indices.push(indexOffset, indexOffset + 1, indexOffset + 2);
+ indices.push(indexOffset, indexOffset + 2, indexOffset + 3);
+ indexOffset += 4;
+ };
+
+ const isOpaque = (x, y) => {
+ if (x < 0 || x >= w || y < 0 || y >= h) return false;
+ return data[(y * w + x) * 4 + 3] > 10;
+ };
+
+ const px = 1 / w;
+ const py = 1 / h;
+ const d = depth / 2;
+
+ // Scale factor to fit in 0.5x0.5 world unit
+ const scale = 0.5;
+ const sx = scale / w;
+ const sy = scale / h;
+ const ox = -scale / 2;
+ const oy = scale / 2;
+
+ for (let y = 0; y < h; y++) {
+ for (let x = 0; x < w; x++) {
+ if (isOpaque(x, y)) {
+ const x0 = ox + x * sx;
+ const x1 = ox + (x + 1) * sx;
+ const y0 = oy - y * sy;
+ const y1 = oy - (y + 1) * sy;
+
+ const u0 = x * px;
+ const u1 = (x + 1) * px;
+ const v0 = 1 - y * py;
+ const v1 = 1 - (y + 1) * py;
+
+ // Front
+ addFace(
+ [x0, y0, d], [x0, y1, d], [x1, y1, d], [x1, y0, d],
+ [0, 0, 1],
+ [u0, v1], [u0, v0], [u1, v0], [u1, v1]
+ );
+
+ // Back
+ addFace(
+ [x1, y0, -d], [x1, y1, -d], [x0, y1, -d], [x0, y0, -d],
+ [0, 0, -1],
+ [u1, v1], [u1, v0], [u0, v0], [u0, v1]
+ );
+
+ // Top
+ if (!isOpaque(x, y - 1)) {
+ addFace(
+ [x0, y0, -d], [x0, y0, d], [x1, y0, d], [x1, y0, -d],
+ [0, 1, 0],
+ [u0, v1], [u0, v1], [u1, v1], [u1, v1] // Map to pixel top edge
+ );
+ }
+ // Bottom
+ if (!isOpaque(x, y + 1)) {
+ addFace(
+ [x0, y1, d], [x0, y1, -d], [x1, y1, -d], [x1, y1, d],
+ [0, -1, 0],
+ [u0, v0], [u0, v0], [u1, v0], [u1, v0] // Map to pixel bottom edge
+ );
+ }
+ // Left
+ if (!isOpaque(x - 1, y)) {
+ addFace(
+ [x0, y0, -d], [x0, y1, -d], [x0, y1, d], [x0, y0, d],
+ [-1, 0, 0],
+ [u0, v1], [u0, v0], [u0, v0], [u0, v1] // Map to pixel left edge
+ );
+ }
+ // Right
+ if (!isOpaque(x + 1, y)) {
+ addFace(
+ [x1, y0, d], [x1, y1, d], [x1, y1, -d], [x1, y0, -d],
+ [1, 0, 0],
+ [u1, v1], [u1, v0], [u1, v0], [u1, v1] // Map to pixel right edge
+ );
+ }
+ }
+ }
+ }
+
+ const geometry = new THREE.BufferGeometry();
+ geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
+ geometry.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));
+ geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));
+ geometry.setIndex(indices);
+ return geometry;
+ }
+
+ // Shop System
+ window.toggleShop = function() {
+ const shop = document.getElementById('shop-modal');
+ if (shop.style.display === 'none' || !shop.style.display) {
+ shop.style.display = 'flex';
+ updateShopUI();
+ } else {
+ shop.style.display = 'none';
+ }
+ };
+
+ function updateShopUI() {
+ const content = document.getElementById('shop-content');
+ content.innerHTML = 'Shop
';
+
+ // Sell Section
+ const sellDiv = document.createElement('div');
+ sellDiv.className = 'shop-section';
+ sellDiv.innerHTML = 'Sell Ores
';
+
+ Object.entries(SELL_PRICES).forEach(([type, price]) => {
+ const count = inventory[type] || 0;
+ if (count > 0) {
+ const btn = document.createElement('button');
+ btn.className = 'shop-btn';
+ btn.innerHTML = `Sell ${type} (${count}) - $${price * count}`;
+ btn.onclick = () => sellOre(type);
+ sellDiv.appendChild(btn);
+ }
+ });
+ content.appendChild(sellDiv);
+
+ // Upgrade Section
+ const upgradeDiv = document.createElement('div');
+ upgradeDiv.className = 'shop-section';
+ upgradeDiv.innerHTML = 'Upgrades
';
+
+ Object.entries(UPGRADE_COSTS).forEach(([type, costFunc]) => {
+ const currentLevel = upgrades[type];
+ const cost = costFunc(currentLevel);
+
+ const btn = document.createElement('button');
+ btn.className = 'shop-btn';
+ btn.innerHTML = `Upgrade ${type} (Lvl ${currentLevel}) - $${cost}`;
+ if (score < cost) btn.disabled = true;
+ btn.onclick = () => buyUpgrade(type);
+ upgradeDiv.appendChild(btn);
+ });
+ content.appendChild(upgradeDiv);
+
+ // Close button
+ const closeBtn = document.createElement('button');
+ closeBtn.className = 'shop-btn close-btn';
+ closeBtn.innerText = 'Close';
+ closeBtn.style.marginTop = '20px';
+ closeBtn.onclick = window.toggleShop;
+ content.appendChild(closeBtn);
+ }
+
+ function sellOre(type) {
+ const count = inventory[type] || 0;
+ if (count > 0) {
+ const price = SELL_PRICES[type];
+ score += price * count;
+ inventory[type] = 0;
+ scoreDisplay.innerText = score;
+ updateInventoryUI();
+ updateShopUI();
+ saveGame();
+ }
+ }
+
+ function buyUpgrade(type) {
+ const costFunc = UPGRADE_COSTS[type];
+ const currentLevel = upgrades[type];
+ const cost = costFunc(currentLevel);
+
+ if (score >= cost) {
+ score -= cost;
+ upgrades[type]++;
+
+ if (type === 'grid_size') {
+ expandGrid();
+ }
+
+ scoreDisplay.innerText = score;
+ updateShopUI();
+ saveGame();
+ }
+ }
+
+ function expandGrid() {
+ const oldSize = GRID_SIZE;
+ GRID_SIZE = 5 + (upgrades.grid_size * 2);
+ const offsetDiff = (GRID_SIZE - oldSize) / 2;
+
+ // Adjust camera
+ const d = 5 + upgrades.grid_size;
+ camera.left = -d * aspect;
+ camera.right = d * aspect;
+ camera.top = d;
+ camera.bottom = -d;
+ camera.updateProjectionMatrix();
+
+ // Migrate layers
+ const newLayers = [];
+ layers.forEach((oldLayer, layerIdx) => {
+ const newLayer = [];
+ for (let x = 0; x < GRID_SIZE; x++) {
+ newLayer[x] = [];
+ for (let z = 0; z < GRID_SIZE; z++) {
+ // Map old coordinates to new centered coordinates
+ const oldX = x - offsetDiff;
+ const oldZ = z - offsetDiff;
+
+ if (oldX >= 0 && oldX < oldSize && oldZ >= 0 && oldZ < oldSize) {
+ // Existing block
+ const block = oldLayer[oldX][oldZ];
+ newLayer[x][z] = block;
+ if (block) {
+ // Update position
+ const offset = (GRID_SIZE * BLOCK_SIZE) / 2 - (BLOCK_SIZE / 2);
+ block.position.x = x * BLOCK_SIZE - offset;
+ block.position.z = z * BLOCK_SIZE - offset;
+ }
+ } else {
+ // New outer block
+ // Generate block based on depth
+ // We use the global 'depth' variable + layerIdx
+ const absDepth = depth + layerIdx;
+ const type = getBlockTypeForDepth(absDepth);
+
+ const block = createBlock(x, -layerIdx, z, type);
+ newLayer[x][z] = block;
+ scene.add(block);
+ }
+
+ }
+ }
+ newLayers.push(newLayer);
+ });
+ layers = newLayers;
+ }
+
+ // --- TNT System ---
+ function updateTNT() {
+ // Spawning
+ if (upgrades.tnt_frequency > 0) {
+ // Base interval 60s, decreases by 5s per level, min 5s
+ const interval = Math.max(5000, 60000 - (upgrades.tnt_frequency * 5000));
+
+ // Use performance.now() for smoother timing if needed, but simple counter is fine for now
+ // Actually, let's use a delta time approach if we had one, but we don't.
+ // Assuming 60fps, 16.6ms per frame.
+ tntTimer += 16.6;
+
+ if (tntTimer >= interval) {
+ tntTimer = 0;
+ spawnTNT();
+ }
+ }
+
+ // Physics
+ for (let i = tntProjectiles.length - 1; i >= 0; i--) {
+ const tnt = tntProjectiles[i];
+ tnt.position.y -= 0.2; // Fall speed
+ tnt.rotation.x += 0.05;
+ tnt.rotation.z += 0.05;
+
+ // Check collision
+ // Simple check: if y < something and hits a block
+ const gx = Math.round(tnt.position.x / BLOCK_SIZE + (GRID_SIZE/2 - 0.5));
+ const gz = Math.round(tnt.position.z / BLOCK_SIZE + (GRID_SIZE/2 - 0.5));
+ const gy = Math.round(tnt.position.y / BLOCK_SIZE);
+
+ // Check if we hit a block
+ const block = getBlockAt(gx, gy, gz);
+ if (block || gy < -depth - 1) { // Hit block or fell too far
+ explodeTNT(tnt);
+ tntProjectiles.splice(i, 1);
+ }
+ }
+ }
+
+ function spawnTNT() {
+ const gx = Math.floor(Math.random() * GRID_SIZE);
+ const gz = Math.floor(Math.random() * GRID_SIZE);
+
+ const geometry = new THREE.BoxGeometry(0.6, 0.6, 0.6);
+ const material = new THREE.MeshLambertMaterial({ color: 0xff0000 }); // Red block for now
+ const tnt = new THREE.Mesh(geometry, material);
+
+ tnt.position.set(
+ (gx - (GRID_SIZE/2 - 0.5)) * BLOCK_SIZE,
+ 10, // Start high up
+ (gz - (GRID_SIZE/2 - 0.5)) * BLOCK_SIZE
+ );
+
+ scene.add(tnt);
+ tntProjectiles.push(tnt);
+ }
+
+ function explodeTNT(tnt) {
+ scene.remove(tnt);
+
+ // Explosion effect (simple)
+ // Radius based on power: 0 -> 1 (3x3), 1 -> 2 (5x5)
+ const radius = 1 + upgrades.tnt_power;
+
+ const gx = Math.round(tnt.position.x / BLOCK_SIZE + (GRID_SIZE/2 - 0.5));
+ const gz = Math.round(tnt.position.z / BLOCK_SIZE + (GRID_SIZE/2 - 0.5));
+
+ // Find the layer we hit. Since TNT falls, it likely hit the top-most block at gx,gz.
+ // But we might have hit a specific Y.
+ // Let's just explode around the impact point.
+ // We need to find the layer index corresponding to the impact Y.
+ // tnt.position.y is roughly the block Y.
+
+ const impactY = Math.round(tnt.position.y / BLOCK_SIZE);
+
+ // Find layer index
+ // layers[0] is at y = -depth
+ // layers[1] is at y = -depth - 1
+ // So y = -depth - layerIdx
+ // layerIdx = -depth - y
+
+ // Wait, layers are generated at `depth + i`.
+ // `createBlock` uses `y = -layerIdx`.
+ // But `generateLayer` calls `createBlock` with `y`?
+ // No, `generateLayer` returns a 2D array of types.
+ // `loadGame` rebuilds layers: `createBlock(x, -layerIdx, z, type)`.
+ // So visually, layer 0 is at Y=0?
+
+ // Ah, `createBlock` sets `block.position.y = y * BLOCK_SIZE`.
+ // In `loadGame`, `y` is passed as `-layerIdx`.
+ // So layer 0 is at Y=0. Layer 1 is at Y=-1.
+ // But `advanceLevel` shifts layers. `layers.shift()`.
+ // And `animate` moves blocks up.
+ // `allBlocks.forEach((b, i) => { b.position.y = startPositions[i] + offset; });`
+ // So the visual Y position changes!
+
+ // This makes `getBlockAt` tricky if it relies on `layers` array index matching Y.
+ // `getBlockAt`:
+ // `if (y <= 0) { const layerIdx = -y; ... }`
+ // This assumes layer 0 is at Y=0, layer 1 at Y=-1.
+ // But if we advanced a level, the blocks moved UP.
+ // So the block that was at Y=-1 is now at Y=0.
+ // And it is now in `layers[0]`.
+ // So `getBlockAt` logic holds: `layers[0]` is always at Y=0 (visually, after animation).
+
+ // So `impactY` should correspond to `-layerIdx`.
+ // `layerIdx = -impactY`.
+
+ const centerLayerIdx = -impactY;
+
+ // Explode in radius
+ // We want a sphere or cylinder explosion?
+ // Let's do a simple cube/cylinder explosion across layers.
+
+ for (let l = centerLayerIdx - radius; l <= centerLayerIdx + radius; l++) {
+ if (l < 0 || l >= layers.length) continue;
+
+ for (let x = gx - radius; x <= gx + radius; x++) {
+ for (let z = gz - radius; z <= gz + radius; z++) {
+ if (x < 0 || x >= GRID_SIZE || z < 0 || z >= GRID_SIZE) continue;
+
+ // Distance check for round explosion
+ const dx = x - gx;
+ const dz = z - gz;
+ const dl = l - centerLayerIdx;
+ if (dx*dx + dz*dz + dl*dl > radius*radius) continue;
+
+ const block = layers[l][x][z];
+ if (block) {
+ breakBlock(block, true);
+ }
+ }
+ }
+ }
+
+ // Also check extra blocks (trees)
+ for (let i = extraBlocks.length - 1; i >= 0; i--) {
+ const b = extraBlocks[i];
+ const bx = b.userData.gridX;
+ const bz = b.userData.gridZ;
+ const by = Math.round(b.position.y / BLOCK_SIZE);
+
+ const dx = bx - gx;
+ const dz = bz - gz;
+ const dy = by - impactY;
+
+ if (dx*dx + dz*dz + dy*dy <= radius*radius) {
+ breakBlock(b, true);
+ }
+ }
+
+ checkLayerCleared();
+ }
+
+ // Floating Item Animation
+ function createFloatingItem(type, startX, startY, count) {
+ const img = document.createElement('img');
+ let iconName = type;
+ if (type === 'coal') iconName = 'coal_ore';
+ if (type === 'iron') iconName = 'iron_ore';
+ if (type === 'gold') iconName = 'gold_ore';
+ if (type === 'diamond') iconName = 'diamond_ore';
+ if (type === 'emerald') iconName = 'emerald_ore';
+ if (type === 'log') iconName = 'log_oak';
+ if (type === 'leaves') iconName = 'leaves_oak';
+ if (type === 'grass') iconName = 'grass_side';
+ if (type === 'stick') iconName = 'stick';
+ if (type === 'sapling') iconName = 'sapling_oak';
+ if (type === 'apple') iconName = 'apple';
+ if (type === 'planks') iconName = 'planks_oak';
+ if (type === 'wood_pickaxe') iconName = 'wood_pickaxe';
+ if (type === 'stone_pickaxe') iconName = 'stone_pickaxe';
+ if (type === 'iron_pickaxe') iconName = 'iron_pickaxe';
+ if (type === 'gold_pickaxe') iconName = 'gold_pickaxe';
+ if (type === 'diamond_pickaxe') iconName = 'diamond_pickaxe';
+
+ if (['apple', 'stick', 'wood_pickaxe', 'stone_pickaxe', 'iron_pickaxe', 'gold_pickaxe', 'diamond_pickaxe'].includes(type)) {
+ img.src = `items/${iconName}.png`;
+ } else {
+ img.src = `blocks/${iconName}.png`;
+ }
+
+ img.style.position = 'absolute';
+ img.style.left = `${startX}px`;
+ img.style.top = `${startY}px`;
+ img.style.width = '32px';
+ img.style.height = '32px';
+ img.style.pointerEvents = 'none';
+ img.style.zIndex = '1000';
+
+ document.body.appendChild(img);
+
+ // Find target
+ const scrollX = window.scrollX || window.pageXOffset;
+ const scrollY = window.scrollY || window.pageYOffset;
+
+ let targetX = (window.innerWidth / 2) + scrollX;
+ let targetY = (window.innerHeight - 50) + scrollY;
+
+ const slot = document.querySelector(`.inventory-slot[data-type="${type}"]`);
+ if (slot) {
+ const rect = slot.getBoundingClientRect();
+ targetX = rect.left + rect.width / 2 - 16 + scrollX;
+ targetY = rect.top + rect.height / 2 - 16 + scrollY;
+ }
+
+ // Control point for Bezier curve
+ // "Fly away from inv bar" -> Fly UP first
+ // We want a point that is higher (lower Y) than both start and end
+ const cpX = (startX + targetX) / 2 + (Math.random() * 100 - 50);
+ const cpY = Math.min(startY, targetY) - 150 - (Math.random() * 50);
+
+ const startTime = Date.now();
+ const duration = 600; // ms
+
+ function animate() {
+ const now = Date.now();
+ const progress = Math.min((now - startTime) / duration, 1);
+
+ // Quadratic Bezier
+ // B(t) = (1-t)^2 * P0 + 2(1-t)t * P1 + t^2 * P2
+ const t = progress;
+ const invT = 1 - t;
+
+ const x = (invT * invT * startX) + (2 * invT * t * cpX) + (t * t * targetX);
+ const y = (invT * invT * startY) + (2 * invT * t * cpY) + (t * t * targetY);
+
+ img.style.left = `${x}px`;
+ img.style.top = `${y}px`;
+
+ // Scale and opacity effects
+ if (progress > 0.8) {
+ img.style.opacity = `${1 - (progress - 0.8) * 5}`; // Fade out in last 20%
+ img.style.transform = `scale(${1 - (progress - 0.8) * 2.5})`; // Shrink in last 20%
+ }
+
+ if (progress < 1) {
+ requestAnimationFrame(animate);
+ } else {
+ if (img.parentNode) {
+ document.body.removeChild(img);
+ }
+ addToInventory(type, count);
+ }
+ }
+
+ requestAnimationFrame(animate);
+
+ }
+});
diff --git a/website/sitemap.xml b/website/sitemap.xml
index 7cfb4e2..efadfad 100644
--- a/website/sitemap.xml
+++ b/website/sitemap.xml
@@ -28,4 +28,9 @@
2025-02-09T22:00:52+00:00
0.50
+
+ https://lit.ruv.wtf/mining/
+ 2025-11-24T00:00:00+00:00
+ 0.70
+