diff --git a/assets/audio/bounce.wav b/assets/audio/bounce.wav
new file mode 100644
index 00000000..9849a2a0
Binary files /dev/null and b/assets/audio/bounce.wav differ
diff --git a/assets/audio/collect_fruit.wav b/assets/audio/collect_fruit.wav
new file mode 100644
index 00000000..2a5d453e
Binary files /dev/null and b/assets/audio/collect_fruit.wav differ
diff --git a/assets/audio/collision.wav b/assets/audio/collision.wav
new file mode 100644
index 00000000..1533ab42
Binary files /dev/null and b/assets/audio/collision.wav differ
diff --git a/assets/audio/disappear.wav b/assets/audio/disappear.wav
new file mode 100644
index 00000000..50ff820c
Binary files /dev/null and b/assets/audio/disappear.wav differ
diff --git a/assets/audio/hit.wav b/assets/audio/hit.wav
new file mode 100644
index 00000000..942df53c
Binary files /dev/null and b/assets/audio/hit.wav differ
diff --git a/assets/audio/jump.wav b/assets/audio/jump.wav
new file mode 100644
index 00000000..3919b046
Binary files /dev/null and b/assets/audio/jump.wav differ
diff --git a/assets/audio/point.wav b/assets/audio/point.wav
new file mode 100644
index 00000000..f0bbd419
Binary files /dev/null and b/assets/audio/point.wav differ
diff --git a/assets/badges_images/achiever_badge.png b/assets/badges_images/achiever_badge.png
new file mode 100644
index 00000000..b7a902bd
Binary files /dev/null and b/assets/badges_images/achiever_badge.png differ
diff --git a/assets/badges_images/collector_badge.png b/assets/badges_images/collector_badge.png
new file mode 100644
index 00000000..afb3abef
Binary files /dev/null and b/assets/badges_images/collector_badge.png differ
diff --git a/assets/badges_images/customizer_badge.png b/assets/badges_images/customizer_badge.png
new file mode 100644
index 00000000..fb0c08c3
Binary files /dev/null and b/assets/badges_images/customizer_badge.png differ
diff --git a/assets/badges_images/event_planner_badge.png b/assets/badges_images/event_planner_badge.png
new file mode 100644
index 00000000..993a8fa7
Binary files /dev/null and b/assets/badges_images/event_planner_badge.png differ
diff --git a/assets/badges_images/explorer_badge.png b/assets/badges_images/explorer_badge.png
new file mode 100644
index 00000000..4d3f1477
Binary files /dev/null and b/assets/badges_images/explorer_badge.png differ
diff --git a/assets/badges_images/gamer_badge.png b/assets/badges_images/gamer_badge.png
new file mode 100644
index 00000000..f8c4f4a2
Binary files /dev/null and b/assets/badges_images/gamer_badge.png differ
diff --git a/assets/badges_images/loyalty_badge.png b/assets/badges_images/loyalty_badge.png
new file mode 100644
index 00000000..d5145d1d
Binary files /dev/null and b/assets/badges_images/loyalty_badge.png differ
diff --git a/assets/badges_images/newbie_badge.png b/assets/badges_images/newbie_badge.png
new file mode 100644
index 00000000..ff69b091
Binary files /dev/null and b/assets/badges_images/newbie_badge.png differ
diff --git a/assets/badges_images/night_owl_badge.png b/assets/badges_images/night_owl_badge.png
new file mode 100644
index 00000000..7ffb08fc
Binary files /dev/null and b/assets/badges_images/night_owl_badge.png differ
diff --git a/assets/badges_images/social_butterfly_badge.png b/assets/badges_images/social_butterfly_badge.png
new file mode 100644
index 00000000..914eeee5
Binary files /dev/null and b/assets/badges_images/social_butterfly_badge.png differ
diff --git a/assets/fonts/ThaleahFat.ttf b/assets/fonts/ThaleahFat.ttf
new file mode 100644
index 00000000..91fc7dc3
Binary files /dev/null and b/assets/fonts/ThaleahFat.ttf differ
diff --git a/assets/images/20 Enemies.png b/assets/images/20 Enemies.png
new file mode 100644
index 00000000..bf0f7e8e
Binary files /dev/null and b/assets/images/20 Enemies.png differ
diff --git a/assets/images/Background/Blue.png b/assets/images/Background/Blue.png
new file mode 100644
index 00000000..3a854225
Binary files /dev/null and b/assets/images/Background/Blue.png differ
diff --git a/assets/images/Background/Brown.png b/assets/images/Background/Brown.png
new file mode 100644
index 00000000..4925f718
Binary files /dev/null and b/assets/images/Background/Brown.png differ
diff --git a/assets/images/Background/Gray.png b/assets/images/Background/Gray.png
new file mode 100644
index 00000000..07d6792a
Binary files /dev/null and b/assets/images/Background/Gray.png differ
diff --git a/assets/images/Background/Green.png b/assets/images/Background/Green.png
new file mode 100644
index 00000000..c95d78d5
Binary files /dev/null and b/assets/images/Background/Green.png differ
diff --git a/assets/images/Background/Pink.png b/assets/images/Background/Pink.png
new file mode 100644
index 00000000..d313606b
Binary files /dev/null and b/assets/images/Background/Pink.png differ
diff --git a/assets/images/Background/Purple.png b/assets/images/Background/Purple.png
new file mode 100644
index 00000000..b64b504e
Binary files /dev/null and b/assets/images/Background/Purple.png differ
diff --git a/assets/images/Background/Yellow.png b/assets/images/Background/Yellow.png
new file mode 100644
index 00000000..6f90ecfa
Binary files /dev/null and b/assets/images/Background/Yellow.png differ
diff --git a/assets/images/Battlecruiser.png b/assets/images/Battlecruiser.png
new file mode 100644
index 00000000..e123b801
Binary files /dev/null and b/assets/images/Battlecruiser.png differ
diff --git a/assets/images/Enemies/AngryPig/Hit 1 (36x30).png b/assets/images/Enemies/AngryPig/Hit 1 (36x30).png
new file mode 100644
index 00000000..a3e336d6
Binary files /dev/null and b/assets/images/Enemies/AngryPig/Hit 1 (36x30).png differ
diff --git a/assets/images/Enemies/AngryPig/Hit 2 (36x30).png b/assets/images/Enemies/AngryPig/Hit 2 (36x30).png
new file mode 100644
index 00000000..23c3f351
Binary files /dev/null and b/assets/images/Enemies/AngryPig/Hit 2 (36x30).png differ
diff --git a/assets/images/Enemies/AngryPig/Idle (36x30).png b/assets/images/Enemies/AngryPig/Idle (36x30).png
new file mode 100644
index 00000000..8c474917
Binary files /dev/null and b/assets/images/Enemies/AngryPig/Idle (36x30).png differ
diff --git a/assets/images/Enemies/AngryPig/Run (36x30).png b/assets/images/Enemies/AngryPig/Run (36x30).png
new file mode 100644
index 00000000..a7b656d4
Binary files /dev/null and b/assets/images/Enemies/AngryPig/Run (36x30).png differ
diff --git a/assets/images/Enemies/AngryPig/Walk (36x30).png b/assets/images/Enemies/AngryPig/Walk (36x30).png
new file mode 100644
index 00000000..4b0d7b24
Binary files /dev/null and b/assets/images/Enemies/AngryPig/Walk (36x30).png differ
diff --git a/assets/images/Enemies/Bat/Ceiling In (46x30).png b/assets/images/Enemies/Bat/Ceiling In (46x30).png
new file mode 100644
index 00000000..51b9f9d7
Binary files /dev/null and b/assets/images/Enemies/Bat/Ceiling In (46x30).png differ
diff --git a/assets/images/Enemies/Bat/Ceiling Out (46x30).png b/assets/images/Enemies/Bat/Ceiling Out (46x30).png
new file mode 100644
index 00000000..ce414709
Binary files /dev/null and b/assets/images/Enemies/Bat/Ceiling Out (46x30).png differ
diff --git a/assets/images/Enemies/Bat/Flying (46x30).png b/assets/images/Enemies/Bat/Flying (46x30).png
new file mode 100644
index 00000000..7dd4f9ce
Binary files /dev/null and b/assets/images/Enemies/Bat/Flying (46x30).png differ
diff --git a/assets/images/Enemies/Bat/Hit (46x30).png b/assets/images/Enemies/Bat/Hit (46x30).png
new file mode 100644
index 00000000..4601ac07
Binary files /dev/null and b/assets/images/Enemies/Bat/Hit (46x30).png differ
diff --git a/assets/images/Enemies/Bat/Idle (46x30).png b/assets/images/Enemies/Bat/Idle (46x30).png
new file mode 100644
index 00000000..594aa271
Binary files /dev/null and b/assets/images/Enemies/Bat/Idle (46x30).png differ
diff --git a/assets/images/Enemies/Bee/Attack (36x34).png b/assets/images/Enemies/Bee/Attack (36x34).png
new file mode 100644
index 00000000..af535a05
Binary files /dev/null and b/assets/images/Enemies/Bee/Attack (36x34).png differ
diff --git a/assets/images/Enemies/Bee/Bullet Pieces.png b/assets/images/Enemies/Bee/Bullet Pieces.png
new file mode 100644
index 00000000..8f08e81a
Binary files /dev/null and b/assets/images/Enemies/Bee/Bullet Pieces.png differ
diff --git a/assets/images/Enemies/Bee/Bullet.png b/assets/images/Enemies/Bee/Bullet.png
new file mode 100644
index 00000000..dd39950e
Binary files /dev/null and b/assets/images/Enemies/Bee/Bullet.png differ
diff --git a/assets/images/Enemies/Bee/Hit (36x34).png b/assets/images/Enemies/Bee/Hit (36x34).png
new file mode 100644
index 00000000..0321fc8b
Binary files /dev/null and b/assets/images/Enemies/Bee/Hit (36x34).png differ
diff --git a/assets/images/Enemies/Bee/Idle (36x34).png b/assets/images/Enemies/Bee/Idle (36x34).png
new file mode 100644
index 00000000..3ecd1e93
Binary files /dev/null and b/assets/images/Enemies/Bee/Idle (36x34).png differ
diff --git a/assets/images/Enemies/BlueBird/Flying (32x32).png b/assets/images/Enemies/BlueBird/Flying (32x32).png
new file mode 100644
index 00000000..51faeeb2
Binary files /dev/null and b/assets/images/Enemies/BlueBird/Flying (32x32).png differ
diff --git a/assets/images/Enemies/BlueBird/Hit (32x32).png b/assets/images/Enemies/BlueBird/Hit (32x32).png
new file mode 100644
index 00000000..add84928
Binary files /dev/null and b/assets/images/Enemies/BlueBird/Hit (32x32).png differ
diff --git a/assets/images/Enemies/Bunny/Fall.png b/assets/images/Enemies/Bunny/Fall.png
new file mode 100644
index 00000000..6c0eedd6
Binary files /dev/null and b/assets/images/Enemies/Bunny/Fall.png differ
diff --git a/assets/images/Enemies/Bunny/Hit (34x44).png b/assets/images/Enemies/Bunny/Hit (34x44).png
new file mode 100644
index 00000000..11dbeb17
Binary files /dev/null and b/assets/images/Enemies/Bunny/Hit (34x44).png differ
diff --git a/assets/images/Enemies/Bunny/Idle (34x44).png b/assets/images/Enemies/Bunny/Idle (34x44).png
new file mode 100644
index 00000000..70bdb2d4
Binary files /dev/null and b/assets/images/Enemies/Bunny/Idle (34x44).png differ
diff --git a/assets/images/Enemies/Bunny/Jump.png b/assets/images/Enemies/Bunny/Jump.png
new file mode 100644
index 00000000..a1cd5bba
Binary files /dev/null and b/assets/images/Enemies/Bunny/Jump.png differ
diff --git a/assets/images/Enemies/Bunny/Run (34x44).png b/assets/images/Enemies/Bunny/Run (34x44).png
new file mode 100644
index 00000000..3297ddb4
Binary files /dev/null and b/assets/images/Enemies/Bunny/Run (34x44).png differ
diff --git a/assets/images/Enemies/Chameleon/Attack (84x38).png b/assets/images/Enemies/Chameleon/Attack (84x38).png
new file mode 100644
index 00000000..07e62682
Binary files /dev/null and b/assets/images/Enemies/Chameleon/Attack (84x38).png differ
diff --git a/assets/images/Enemies/Chameleon/Hit (84x38).png b/assets/images/Enemies/Chameleon/Hit (84x38).png
new file mode 100644
index 00000000..f3722095
Binary files /dev/null and b/assets/images/Enemies/Chameleon/Hit (84x38).png differ
diff --git a/assets/images/Enemies/Chameleon/Idle (84x38).png b/assets/images/Enemies/Chameleon/Idle (84x38).png
new file mode 100644
index 00000000..f62a7ba4
Binary files /dev/null and b/assets/images/Enemies/Chameleon/Idle (84x38).png differ
diff --git a/assets/images/Enemies/Chameleon/Run (84x38).png b/assets/images/Enemies/Chameleon/Run (84x38).png
new file mode 100644
index 00000000..63b90abd
Binary files /dev/null and b/assets/images/Enemies/Chameleon/Run (84x38).png differ
diff --git a/assets/images/Enemies/Chicken/Hit (32x34).png b/assets/images/Enemies/Chicken/Hit (32x34).png
new file mode 100644
index 00000000..e07013f7
Binary files /dev/null and b/assets/images/Enemies/Chicken/Hit (32x34).png differ
diff --git a/assets/images/Enemies/Chicken/Idle (32x34).png b/assets/images/Enemies/Chicken/Idle (32x34).png
new file mode 100644
index 00000000..90ed02e3
Binary files /dev/null and b/assets/images/Enemies/Chicken/Idle (32x34).png differ
diff --git a/assets/images/Enemies/Chicken/Run (32x34).png b/assets/images/Enemies/Chicken/Run (32x34).png
new file mode 100644
index 00000000..dc06bfa4
Binary files /dev/null and b/assets/images/Enemies/Chicken/Run (32x34).png differ
diff --git a/assets/images/Enemies/Duck/Fall (36x36).png b/assets/images/Enemies/Duck/Fall (36x36).png
new file mode 100644
index 00000000..885f7374
Binary files /dev/null and b/assets/images/Enemies/Duck/Fall (36x36).png differ
diff --git a/assets/images/Enemies/Duck/Hit (36x36).png b/assets/images/Enemies/Duck/Hit (36x36).png
new file mode 100644
index 00000000..e5471732
Binary files /dev/null and b/assets/images/Enemies/Duck/Hit (36x36).png differ
diff --git a/assets/images/Enemies/Duck/Idle (36x36).png b/assets/images/Enemies/Duck/Idle (36x36).png
new file mode 100644
index 00000000..26f48255
Binary files /dev/null and b/assets/images/Enemies/Duck/Idle (36x36).png differ
diff --git a/assets/images/Enemies/Duck/Jump (36x36).png b/assets/images/Enemies/Duck/Jump (36x36).png
new file mode 100644
index 00000000..62386044
Binary files /dev/null and b/assets/images/Enemies/Duck/Jump (36x36).png differ
diff --git a/assets/images/Enemies/Duck/Jump Anticipation (36x36).png b/assets/images/Enemies/Duck/Jump Anticipation (36x36).png
new file mode 100644
index 00000000..e64b08e8
Binary files /dev/null and b/assets/images/Enemies/Duck/Jump Anticipation (36x36).png differ
diff --git a/assets/images/Enemies/FatBird/Fall (40x48).png b/assets/images/Enemies/FatBird/Fall (40x48).png
new file mode 100644
index 00000000..5741f728
Binary files /dev/null and b/assets/images/Enemies/FatBird/Fall (40x48).png differ
diff --git a/assets/images/Enemies/FatBird/Ground (40x48).png b/assets/images/Enemies/FatBird/Ground (40x48).png
new file mode 100644
index 00000000..8eeed1e3
Binary files /dev/null and b/assets/images/Enemies/FatBird/Ground (40x48).png differ
diff --git a/assets/images/Enemies/FatBird/Hit (40x48).png b/assets/images/Enemies/FatBird/Hit (40x48).png
new file mode 100644
index 00000000..4f86d5e3
Binary files /dev/null and b/assets/images/Enemies/FatBird/Hit (40x48).png differ
diff --git a/assets/images/Enemies/FatBird/Idle (40x48).png b/assets/images/Enemies/FatBird/Idle (40x48).png
new file mode 100644
index 00000000..81737fab
Binary files /dev/null and b/assets/images/Enemies/FatBird/Idle (40x48).png differ
diff --git a/assets/images/Enemies/Ghost/Appear (44x30).png b/assets/images/Enemies/Ghost/Appear (44x30).png
new file mode 100644
index 00000000..cc2c5369
Binary files /dev/null and b/assets/images/Enemies/Ghost/Appear (44x30).png differ
diff --git a/assets/images/Enemies/Ghost/Desappear (44x30).png b/assets/images/Enemies/Ghost/Desappear (44x30).png
new file mode 100644
index 00000000..1b44ac78
Binary files /dev/null and b/assets/images/Enemies/Ghost/Desappear (44x30).png differ
diff --git a/assets/images/Enemies/Ghost/Gost Particles (48x16).png b/assets/images/Enemies/Ghost/Gost Particles (48x16).png
new file mode 100644
index 00000000..62cf582c
Binary files /dev/null and b/assets/images/Enemies/Ghost/Gost Particles (48x16).png differ
diff --git a/assets/images/Enemies/Ghost/Hit (44x30).png b/assets/images/Enemies/Ghost/Hit (44x30).png
new file mode 100644
index 00000000..9e02c3cf
Binary files /dev/null and b/assets/images/Enemies/Ghost/Hit (44x30).png differ
diff --git a/assets/images/Enemies/Ghost/Idle (44x30).png b/assets/images/Enemies/Ghost/Idle (44x30).png
new file mode 100644
index 00000000..38783b05
Binary files /dev/null and b/assets/images/Enemies/Ghost/Idle (44x30).png differ
diff --git a/assets/images/Enemies/Mushroom/Hit.png b/assets/images/Enemies/Mushroom/Hit.png
new file mode 100644
index 00000000..44b8dbc2
Binary files /dev/null and b/assets/images/Enemies/Mushroom/Hit.png differ
diff --git a/assets/images/Enemies/Mushroom/Idle (32x32).png b/assets/images/Enemies/Mushroom/Idle (32x32).png
new file mode 100644
index 00000000..b1d643b8
Binary files /dev/null and b/assets/images/Enemies/Mushroom/Idle (32x32).png differ
diff --git a/assets/images/Enemies/Mushroom/Run (32x32).png b/assets/images/Enemies/Mushroom/Run (32x32).png
new file mode 100644
index 00000000..4b142186
Binary files /dev/null and b/assets/images/Enemies/Mushroom/Run (32x32).png differ
diff --git a/assets/images/Enemies/Plant/Attack (44x42).png b/assets/images/Enemies/Plant/Attack (44x42).png
new file mode 100644
index 00000000..efa3ca49
Binary files /dev/null and b/assets/images/Enemies/Plant/Attack (44x42).png differ
diff --git a/assets/images/Enemies/Plant/Bullet Pieces.png b/assets/images/Enemies/Plant/Bullet Pieces.png
new file mode 100644
index 00000000..569c32c0
Binary files /dev/null and b/assets/images/Enemies/Plant/Bullet Pieces.png differ
diff --git a/assets/images/Enemies/Plant/Bullet.png b/assets/images/Enemies/Plant/Bullet.png
new file mode 100644
index 00000000..531ddf3b
Binary files /dev/null and b/assets/images/Enemies/Plant/Bullet.png differ
diff --git a/assets/images/Enemies/Plant/Hit (44x42).png b/assets/images/Enemies/Plant/Hit (44x42).png
new file mode 100644
index 00000000..5a76995b
Binary files /dev/null and b/assets/images/Enemies/Plant/Hit (44x42).png differ
diff --git a/assets/images/Enemies/Plant/Idle (44x42).png b/assets/images/Enemies/Plant/Idle (44x42).png
new file mode 100644
index 00000000..64cc352a
Binary files /dev/null and b/assets/images/Enemies/Plant/Idle (44x42).png differ
diff --git a/assets/images/Enemies/Radish/Hit (30x38).png b/assets/images/Enemies/Radish/Hit (30x38).png
new file mode 100644
index 00000000..0566de40
Binary files /dev/null and b/assets/images/Enemies/Radish/Hit (30x38).png differ
diff --git a/assets/images/Enemies/Radish/Idle 1 (30x38).png b/assets/images/Enemies/Radish/Idle 1 (30x38).png
new file mode 100644
index 00000000..9e52e005
Binary files /dev/null and b/assets/images/Enemies/Radish/Idle 1 (30x38).png differ
diff --git a/assets/images/Enemies/Radish/Idle 2 (30x38).png b/assets/images/Enemies/Radish/Idle 2 (30x38).png
new file mode 100644
index 00000000..a56b50c8
Binary files /dev/null and b/assets/images/Enemies/Radish/Idle 2 (30x38).png differ
diff --git a/assets/images/Enemies/Radish/Leafs.png b/assets/images/Enemies/Radish/Leafs.png
new file mode 100644
index 00000000..a7a46157
Binary files /dev/null and b/assets/images/Enemies/Radish/Leafs.png differ
diff --git a/assets/images/Enemies/Radish/Run (30x38).png b/assets/images/Enemies/Radish/Run (30x38).png
new file mode 100644
index 00000000..01ea032b
Binary files /dev/null and b/assets/images/Enemies/Radish/Run (30x38).png differ
diff --git a/assets/images/Enemies/Rino/Hit (52x34).png b/assets/images/Enemies/Rino/Hit (52x34).png
new file mode 100644
index 00000000..ca107593
Binary files /dev/null and b/assets/images/Enemies/Rino/Hit (52x34).png differ
diff --git a/assets/images/Enemies/Rino/Hit Wall (52x34).png b/assets/images/Enemies/Rino/Hit Wall (52x34).png
new file mode 100644
index 00000000..89e539ac
Binary files /dev/null and b/assets/images/Enemies/Rino/Hit Wall (52x34).png differ
diff --git a/assets/images/Enemies/Rino/Idle (52x34).png b/assets/images/Enemies/Rino/Idle (52x34).png
new file mode 100644
index 00000000..9977aa3c
Binary files /dev/null and b/assets/images/Enemies/Rino/Idle (52x34).png differ
diff --git a/assets/images/Enemies/Rino/Run (52x34).png b/assets/images/Enemies/Rino/Run (52x34).png
new file mode 100644
index 00000000..c82b1951
Binary files /dev/null and b/assets/images/Enemies/Rino/Run (52x34).png differ
diff --git a/assets/images/Enemies/Rocks/Rock1_Hit.png b/assets/images/Enemies/Rocks/Rock1_Hit.png
new file mode 100644
index 00000000..99c7c8a8
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock1_Hit.png differ
diff --git a/assets/images/Enemies/Rocks/Rock1_Idle (38x34).png b/assets/images/Enemies/Rocks/Rock1_Idle (38x34).png
new file mode 100644
index 00000000..3ed0f892
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock1_Idle (38x34).png differ
diff --git a/assets/images/Enemies/Rocks/Rock1_Run (38x34).png b/assets/images/Enemies/Rocks/Rock1_Run (38x34).png
new file mode 100644
index 00000000..6d8998c7
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock1_Run (38x34).png differ
diff --git a/assets/images/Enemies/Rocks/Rock2_Hit (32x28).png b/assets/images/Enemies/Rocks/Rock2_Hit (32x28).png
new file mode 100644
index 00000000..454adfaf
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock2_Hit (32x28).png differ
diff --git a/assets/images/Enemies/Rocks/Rock2_Idle (32x28).png b/assets/images/Enemies/Rocks/Rock2_Idle (32x28).png
new file mode 100644
index 00000000..72e74cf0
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock2_Idle (32x28).png differ
diff --git a/assets/images/Enemies/Rocks/Rock2_Run (32x28).png b/assets/images/Enemies/Rocks/Rock2_Run (32x28).png
new file mode 100644
index 00000000..518d555f
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock2_Run (32x28).png differ
diff --git a/assets/images/Enemies/Rocks/Rock3_Hit (22x18).png b/assets/images/Enemies/Rocks/Rock3_Hit (22x18).png
new file mode 100644
index 00000000..01c930a4
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock3_Hit (22x18).png differ
diff --git a/assets/images/Enemies/Rocks/Rock3_Idle (22x18).png b/assets/images/Enemies/Rocks/Rock3_Idle (22x18).png
new file mode 100644
index 00000000..4498a705
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock3_Idle (22x18).png differ
diff --git a/assets/images/Enemies/Rocks/Rock3_Run (22x18).png b/assets/images/Enemies/Rocks/Rock3_Run (22x18).png
new file mode 100644
index 00000000..dcf9b922
Binary files /dev/null and b/assets/images/Enemies/Rocks/Rock3_Run (22x18).png differ
diff --git a/assets/images/Enemies/Skull/Hit (52x54).png b/assets/images/Enemies/Skull/Hit (52x54).png
new file mode 100644
index 00000000..2f65038e
Binary files /dev/null and b/assets/images/Enemies/Skull/Hit (52x54).png differ
diff --git a/assets/images/Enemies/Skull/Hit Wall 1 (52x54).png b/assets/images/Enemies/Skull/Hit Wall 1 (52x54).png
new file mode 100644
index 00000000..e3862116
Binary files /dev/null and b/assets/images/Enemies/Skull/Hit Wall 1 (52x54).png differ
diff --git a/assets/images/Enemies/Skull/Hit Wall 2 (52x54).png b/assets/images/Enemies/Skull/Hit Wall 2 (52x54).png
new file mode 100644
index 00000000..f53924f0
Binary files /dev/null and b/assets/images/Enemies/Skull/Hit Wall 2 (52x54).png differ
diff --git a/assets/images/Enemies/Skull/Idle 1 (52x54).png b/assets/images/Enemies/Skull/Idle 1 (52x54).png
new file mode 100644
index 00000000..ef03c0f3
Binary files /dev/null and b/assets/images/Enemies/Skull/Idle 1 (52x54).png differ
diff --git a/assets/images/Enemies/Skull/Idle 2 (52x54).png b/assets/images/Enemies/Skull/Idle 2 (52x54).png
new file mode 100644
index 00000000..1793851c
Binary files /dev/null and b/assets/images/Enemies/Skull/Idle 2 (52x54).png differ
diff --git a/assets/images/Enemies/Skull/Orange Particle.png b/assets/images/Enemies/Skull/Orange Particle.png
new file mode 100644
index 00000000..3abe6e9b
Binary files /dev/null and b/assets/images/Enemies/Skull/Orange Particle.png differ
diff --git a/assets/images/Enemies/Skull/Red Particle.png b/assets/images/Enemies/Skull/Red Particle.png
new file mode 100644
index 00000000..1068e500
Binary files /dev/null and b/assets/images/Enemies/Skull/Red Particle.png differ
diff --git a/assets/images/Enemies/Slime/Hit (44x30).png b/assets/images/Enemies/Slime/Hit (44x30).png
new file mode 100644
index 00000000..731f77c8
Binary files /dev/null and b/assets/images/Enemies/Slime/Hit (44x30).png differ
diff --git a/assets/images/Enemies/Slime/Idle-Run (44x30).png b/assets/images/Enemies/Slime/Idle-Run (44x30).png
new file mode 100644
index 00000000..aa905ee5
Binary files /dev/null and b/assets/images/Enemies/Slime/Idle-Run (44x30).png differ
diff --git a/assets/images/Enemies/Slime/Particles (62x16).png b/assets/images/Enemies/Slime/Particles (62x16).png
new file mode 100644
index 00000000..ac630b1e
Binary files /dev/null and b/assets/images/Enemies/Slime/Particles (62x16).png differ
diff --git a/assets/images/Enemies/Snail/Hit (38x24).png b/assets/images/Enemies/Snail/Hit (38x24).png
new file mode 100644
index 00000000..9233ef8b
Binary files /dev/null and b/assets/images/Enemies/Snail/Hit (38x24).png differ
diff --git a/assets/images/Enemies/Snail/Idle (38x24).png b/assets/images/Enemies/Snail/Idle (38x24).png
new file mode 100644
index 00000000..65c49c2d
Binary files /dev/null and b/assets/images/Enemies/Snail/Idle (38x24).png differ
diff --git a/assets/images/Enemies/Snail/Shell Idle (38x24).png b/assets/images/Enemies/Snail/Shell Idle (38x24).png
new file mode 100644
index 00000000..960a8fd5
Binary files /dev/null and b/assets/images/Enemies/Snail/Shell Idle (38x24).png differ
diff --git a/assets/images/Enemies/Snail/Shell Top Hit (38x24).png b/assets/images/Enemies/Snail/Shell Top Hit (38x24).png
new file mode 100644
index 00000000..8a21291e
Binary files /dev/null and b/assets/images/Enemies/Snail/Shell Top Hit (38x24).png differ
diff --git a/assets/images/Enemies/Snail/Shell Wall Hit (38x24).png b/assets/images/Enemies/Snail/Shell Wall Hit (38x24).png
new file mode 100644
index 00000000..2de14010
Binary files /dev/null and b/assets/images/Enemies/Snail/Shell Wall Hit (38x24).png differ
diff --git a/assets/images/Enemies/Snail/Snail without shell.png b/assets/images/Enemies/Snail/Snail without shell.png
new file mode 100644
index 00000000..f913860e
Binary files /dev/null and b/assets/images/Enemies/Snail/Snail without shell.png differ
diff --git a/assets/images/Enemies/Snail/Walk (38x24).png b/assets/images/Enemies/Snail/Walk (38x24).png
new file mode 100644
index 00000000..12d4fdc2
Binary files /dev/null and b/assets/images/Enemies/Snail/Walk (38x24).png differ
diff --git a/assets/images/Enemies/Trunk/Attack (64x32).png b/assets/images/Enemies/Trunk/Attack (64x32).png
new file mode 100644
index 00000000..822e74cc
Binary files /dev/null and b/assets/images/Enemies/Trunk/Attack (64x32).png differ
diff --git a/assets/images/Enemies/Trunk/Bullet Pieces.png b/assets/images/Enemies/Trunk/Bullet Pieces.png
new file mode 100644
index 00000000..c221a2d1
Binary files /dev/null and b/assets/images/Enemies/Trunk/Bullet Pieces.png differ
diff --git a/assets/images/Enemies/Trunk/Bullet.png b/assets/images/Enemies/Trunk/Bullet.png
new file mode 100644
index 00000000..405802f9
Binary files /dev/null and b/assets/images/Enemies/Trunk/Bullet.png differ
diff --git a/assets/images/Enemies/Trunk/Hit (64x32).png b/assets/images/Enemies/Trunk/Hit (64x32).png
new file mode 100644
index 00000000..97ab464e
Binary files /dev/null and b/assets/images/Enemies/Trunk/Hit (64x32).png differ
diff --git a/assets/images/Enemies/Trunk/Idle (64x32).png b/assets/images/Enemies/Trunk/Idle (64x32).png
new file mode 100644
index 00000000..537015df
Binary files /dev/null and b/assets/images/Enemies/Trunk/Idle (64x32).png differ
diff --git a/assets/images/Enemies/Trunk/Run (64x32).png b/assets/images/Enemies/Trunk/Run (64x32).png
new file mode 100644
index 00000000..16165937
Binary files /dev/null and b/assets/images/Enemies/Trunk/Run (64x32).png differ
diff --git a/assets/images/Enemies/Turtle/Hit (44x26).png b/assets/images/Enemies/Turtle/Hit (44x26).png
new file mode 100644
index 00000000..6a092ecd
Binary files /dev/null and b/assets/images/Enemies/Turtle/Hit (44x26).png differ
diff --git a/assets/images/Enemies/Turtle/Idle 1 (44x26).png b/assets/images/Enemies/Turtle/Idle 1 (44x26).png
new file mode 100644
index 00000000..15b099f9
Binary files /dev/null and b/assets/images/Enemies/Turtle/Idle 1 (44x26).png differ
diff --git a/assets/images/Enemies/Turtle/Idle 2 (44x26).png b/assets/images/Enemies/Turtle/Idle 2 (44x26).png
new file mode 100644
index 00000000..01ccd68c
Binary files /dev/null and b/assets/images/Enemies/Turtle/Idle 2 (44x26).png differ
diff --git a/assets/images/Enemies/Turtle/Spikes in (44x26).png b/assets/images/Enemies/Turtle/Spikes in (44x26).png
new file mode 100644
index 00000000..26b653d3
Binary files /dev/null and b/assets/images/Enemies/Turtle/Spikes in (44x26).png differ
diff --git a/assets/images/Enemies/Turtle/Spikes out (44x26).png b/assets/images/Enemies/Turtle/Spikes out (44x26).png
new file mode 100644
index 00000000..1a9747b7
Binary files /dev/null and b/assets/images/Enemies/Turtle/Spikes out (44x26).png differ
diff --git a/assets/images/Frigate.png b/assets/images/Frigate.png
new file mode 100644
index 00000000..6bb5105e
Binary files /dev/null and b/assets/images/Frigate.png differ
diff --git a/assets/images/Frigate_Destruction.png b/assets/images/Frigate_Destruction.png
new file mode 100644
index 00000000..86a63651
Binary files /dev/null and b/assets/images/Frigate_Destruction.png differ
diff --git a/assets/images/HUD/Joystick.png b/assets/images/HUD/Joystick.png
new file mode 100644
index 00000000..8e9a09c5
Binary files /dev/null and b/assets/images/HUD/Joystick.png differ
diff --git a/assets/images/HUD/JumpButton.png b/assets/images/HUD/JumpButton.png
new file mode 100644
index 00000000..c9879aeb
Binary files /dev/null and b/assets/images/HUD/JumpButton.png differ
diff --git a/assets/images/HUD/Knob.png b/assets/images/HUD/Knob.png
new file mode 100644
index 00000000..081371db
Binary files /dev/null and b/assets/images/HUD/Knob.png differ
diff --git a/assets/images/Hello.png b/assets/images/Hello.png
new file mode 100644
index 00000000..c72a3845
Binary files /dev/null and b/assets/images/Hello.png differ
diff --git a/assets/images/Items/Boxes/Box1/Break.png b/assets/images/Items/Boxes/Box1/Break.png
new file mode 100644
index 00000000..a90d6118
Binary files /dev/null and b/assets/images/Items/Boxes/Box1/Break.png differ
diff --git a/assets/images/Items/Boxes/Box1/Hit (28x24).png b/assets/images/Items/Boxes/Box1/Hit (28x24).png
new file mode 100644
index 00000000..dabdddd2
Binary files /dev/null and b/assets/images/Items/Boxes/Box1/Hit (28x24).png differ
diff --git a/assets/images/Items/Boxes/Box1/Idle.png b/assets/images/Items/Boxes/Box1/Idle.png
new file mode 100644
index 00000000..998aa4fc
Binary files /dev/null and b/assets/images/Items/Boxes/Box1/Idle.png differ
diff --git a/assets/images/Items/Boxes/Box2/Break.png b/assets/images/Items/Boxes/Box2/Break.png
new file mode 100644
index 00000000..0a254e95
Binary files /dev/null and b/assets/images/Items/Boxes/Box2/Break.png differ
diff --git a/assets/images/Items/Boxes/Box2/Hit (28x24).png b/assets/images/Items/Boxes/Box2/Hit (28x24).png
new file mode 100644
index 00000000..e69597ef
Binary files /dev/null and b/assets/images/Items/Boxes/Box2/Hit (28x24).png differ
diff --git a/assets/images/Items/Boxes/Box2/Idle.png b/assets/images/Items/Boxes/Box2/Idle.png
new file mode 100644
index 00000000..a2d6657f
Binary files /dev/null and b/assets/images/Items/Boxes/Box2/Idle.png differ
diff --git a/assets/images/Items/Boxes/Box3/Break.png b/assets/images/Items/Boxes/Box3/Break.png
new file mode 100644
index 00000000..6fc1a138
Binary files /dev/null and b/assets/images/Items/Boxes/Box3/Break.png differ
diff --git a/assets/images/Items/Boxes/Box3/Hit (28x24).png b/assets/images/Items/Boxes/Box3/Hit (28x24).png
new file mode 100644
index 00000000..71f4adfd
Binary files /dev/null and b/assets/images/Items/Boxes/Box3/Hit (28x24).png differ
diff --git a/assets/images/Items/Boxes/Box3/Idle.png b/assets/images/Items/Boxes/Box3/Idle.png
new file mode 100644
index 00000000..bd262d52
Binary files /dev/null and b/assets/images/Items/Boxes/Box3/Idle.png differ
diff --git a/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (Flag Idle)(64x64).png b/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (Flag Idle)(64x64).png
new file mode 100644
index 00000000..2d9be559
Binary files /dev/null and b/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (Flag Idle)(64x64).png differ
diff --git a/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (Flag Out) (64x64).png b/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (Flag Out) (64x64).png
new file mode 100644
index 00000000..fb558360
Binary files /dev/null and b/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (Flag Out) (64x64).png differ
diff --git a/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (No Flag).png b/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (No Flag).png
new file mode 100644
index 00000000..82cb0a3b
Binary files /dev/null and b/assets/images/Items/Checkpoints/Checkpoint/Checkpoint (No Flag).png differ
diff --git a/assets/images/Items/Checkpoints/End/End (Idle).png b/assets/images/Items/Checkpoints/End/End (Idle).png
new file mode 100644
index 00000000..6e677482
Binary files /dev/null and b/assets/images/Items/Checkpoints/End/End (Idle).png differ
diff --git a/assets/images/Items/Checkpoints/End/End (Pressed) (64x64).png b/assets/images/Items/Checkpoints/End/End (Pressed) (64x64).png
new file mode 100644
index 00000000..8f5f7329
Binary files /dev/null and b/assets/images/Items/Checkpoints/End/End (Pressed) (64x64).png differ
diff --git a/assets/images/Items/Checkpoints/Start/Start (Idle).png b/assets/images/Items/Checkpoints/Start/Start (Idle).png
new file mode 100644
index 00000000..39c04ce6
Binary files /dev/null and b/assets/images/Items/Checkpoints/Start/Start (Idle).png differ
diff --git a/assets/images/Items/Checkpoints/Start/Start (Moving) (64x64).png b/assets/images/Items/Checkpoints/Start/Start (Moving) (64x64).png
new file mode 100644
index 00000000..98df5ee7
Binary files /dev/null and b/assets/images/Items/Checkpoints/Start/Start (Moving) (64x64).png differ
diff --git a/assets/images/Items/Fruits/Apple.png b/assets/images/Items/Fruits/Apple.png
new file mode 100644
index 00000000..7736b463
Binary files /dev/null and b/assets/images/Items/Fruits/Apple.png differ
diff --git a/assets/images/Items/Fruits/Bananas.png b/assets/images/Items/Fruits/Bananas.png
new file mode 100644
index 00000000..3473ed31
Binary files /dev/null and b/assets/images/Items/Fruits/Bananas.png differ
diff --git a/assets/images/Items/Fruits/Cherries.png b/assets/images/Items/Fruits/Cherries.png
new file mode 100644
index 00000000..d9297c3f
Binary files /dev/null and b/assets/images/Items/Fruits/Cherries.png differ
diff --git a/assets/images/Items/Fruits/Collected.png b/assets/images/Items/Fruits/Collected.png
new file mode 100644
index 00000000..44c3f63e
Binary files /dev/null and b/assets/images/Items/Fruits/Collected.png differ
diff --git a/assets/images/Items/Fruits/Kiwi.png b/assets/images/Items/Fruits/Kiwi.png
new file mode 100644
index 00000000..c2518012
Binary files /dev/null and b/assets/images/Items/Fruits/Kiwi.png differ
diff --git a/assets/images/Items/Fruits/Melon.png b/assets/images/Items/Fruits/Melon.png
new file mode 100644
index 00000000..1ca39fa2
Binary files /dev/null and b/assets/images/Items/Fruits/Melon.png differ
diff --git a/assets/images/Items/Fruits/Orange.png b/assets/images/Items/Fruits/Orange.png
new file mode 100644
index 00000000..a6e1d752
Binary files /dev/null and b/assets/images/Items/Fruits/Orange.png differ
diff --git a/assets/images/Items/Fruits/Pineapple.png b/assets/images/Items/Fruits/Pineapple.png
new file mode 100644
index 00000000..25423840
Binary files /dev/null and b/assets/images/Items/Fruits/Pineapple.png differ
diff --git a/assets/images/Items/Fruits/Strawberry.png b/assets/images/Items/Fruits/Strawberry.png
new file mode 100644
index 00000000..d105fc71
Binary files /dev/null and b/assets/images/Items/Fruits/Strawberry.png differ
diff --git a/assets/images/Main Characters/Appearing (96x96).png b/assets/images/Main Characters/Appearing (96x96).png
new file mode 100644
index 00000000..93899e1b
Binary files /dev/null and b/assets/images/Main Characters/Appearing (96x96).png differ
diff --git a/assets/images/Main Characters/Disappearing (96x96).png b/assets/images/Main Characters/Disappearing (96x96).png
new file mode 100644
index 00000000..5153049a
Binary files /dev/null and b/assets/images/Main Characters/Disappearing (96x96).png differ
diff --git a/assets/images/Main Characters/Mask Dude/Double Jump (32x32).png b/assets/images/Main Characters/Mask Dude/Double Jump (32x32).png
new file mode 100644
index 00000000..9ea27092
Binary files /dev/null and b/assets/images/Main Characters/Mask Dude/Double Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Mask Dude/Fall (32x32).png b/assets/images/Main Characters/Mask Dude/Fall (32x32).png
new file mode 100644
index 00000000..b6b9400f
Binary files /dev/null and b/assets/images/Main Characters/Mask Dude/Fall (32x32).png differ
diff --git a/assets/images/Main Characters/Mask Dude/Hit (32x32).png b/assets/images/Main Characters/Mask Dude/Hit (32x32).png
new file mode 100644
index 00000000..461446a6
Binary files /dev/null and b/assets/images/Main Characters/Mask Dude/Hit (32x32).png differ
diff --git a/assets/images/Main Characters/Mask Dude/Idle (32x32).png b/assets/images/Main Characters/Mask Dude/Idle (32x32).png
new file mode 100644
index 00000000..d3ecedbe
Binary files /dev/null and b/assets/images/Main Characters/Mask Dude/Idle (32x32).png differ
diff --git a/assets/images/Main Characters/Mask Dude/Jump (32x32).png b/assets/images/Main Characters/Mask Dude/Jump (32x32).png
new file mode 100644
index 00000000..5d30a0a3
Binary files /dev/null and b/assets/images/Main Characters/Mask Dude/Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Mask Dude/Run (32x32).png b/assets/images/Main Characters/Mask Dude/Run (32x32).png
new file mode 100644
index 00000000..a06b359f
Binary files /dev/null and b/assets/images/Main Characters/Mask Dude/Run (32x32).png differ
diff --git a/assets/images/Main Characters/Mask Dude/Wall Jump (32x32).png b/assets/images/Main Characters/Mask Dude/Wall Jump (32x32).png
new file mode 100644
index 00000000..25e00a40
Binary files /dev/null and b/assets/images/Main Characters/Mask Dude/Wall Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Ninja Frog/Double Jump (32x32).png b/assets/images/Main Characters/Ninja Frog/Double Jump (32x32).png
new file mode 100644
index 00000000..7715a90a
Binary files /dev/null and b/assets/images/Main Characters/Ninja Frog/Double Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Ninja Frog/Fall (32x32).png b/assets/images/Main Characters/Ninja Frog/Fall (32x32).png
new file mode 100644
index 00000000..3b9715fe
Binary files /dev/null and b/assets/images/Main Characters/Ninja Frog/Fall (32x32).png differ
diff --git a/assets/images/Main Characters/Ninja Frog/Hit (32x32).png b/assets/images/Main Characters/Ninja Frog/Hit (32x32).png
new file mode 100644
index 00000000..413c24b3
Binary files /dev/null and b/assets/images/Main Characters/Ninja Frog/Hit (32x32).png differ
diff --git a/assets/images/Main Characters/Ninja Frog/Idle (32x32).png b/assets/images/Main Characters/Ninja Frog/Idle (32x32).png
new file mode 100644
index 00000000..4cbc0708
Binary files /dev/null and b/assets/images/Main Characters/Ninja Frog/Idle (32x32).png differ
diff --git a/assets/images/Main Characters/Ninja Frog/Jump (32x32).png b/assets/images/Main Characters/Ninja Frog/Jump (32x32).png
new file mode 100644
index 00000000..20b6dfee
Binary files /dev/null and b/assets/images/Main Characters/Ninja Frog/Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Ninja Frog/Run (32x32).png b/assets/images/Main Characters/Ninja Frog/Run (32x32).png
new file mode 100644
index 00000000..cf7599cd
Binary files /dev/null and b/assets/images/Main Characters/Ninja Frog/Run (32x32).png differ
diff --git a/assets/images/Main Characters/Ninja Frog/Wall Jump (32x32).png b/assets/images/Main Characters/Ninja Frog/Wall Jump (32x32).png
new file mode 100644
index 00000000..477542dc
Binary files /dev/null and b/assets/images/Main Characters/Ninja Frog/Wall Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Pink Man/Double Jump (32x32).png b/assets/images/Main Characters/Pink Man/Double Jump (32x32).png
new file mode 100644
index 00000000..c47eeef2
Binary files /dev/null and b/assets/images/Main Characters/Pink Man/Double Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Pink Man/Fall (32x32).png b/assets/images/Main Characters/Pink Man/Fall (32x32).png
new file mode 100644
index 00000000..8990b87e
Binary files /dev/null and b/assets/images/Main Characters/Pink Man/Fall (32x32).png differ
diff --git a/assets/images/Main Characters/Pink Man/Hit (32x32).png b/assets/images/Main Characters/Pink Man/Hit (32x32).png
new file mode 100644
index 00000000..5d6d0684
Binary files /dev/null and b/assets/images/Main Characters/Pink Man/Hit (32x32).png differ
diff --git a/assets/images/Main Characters/Pink Man/Idle (32x32).png b/assets/images/Main Characters/Pink Man/Idle (32x32).png
new file mode 100644
index 00000000..620ff925
Binary files /dev/null and b/assets/images/Main Characters/Pink Man/Idle (32x32).png differ
diff --git a/assets/images/Main Characters/Pink Man/Jump (32x32).png b/assets/images/Main Characters/Pink Man/Jump (32x32).png
new file mode 100644
index 00000000..d7f69d42
Binary files /dev/null and b/assets/images/Main Characters/Pink Man/Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Pink Man/Run (32x32).png b/assets/images/Main Characters/Pink Man/Run (32x32).png
new file mode 100644
index 00000000..a5d5b9c9
Binary files /dev/null and b/assets/images/Main Characters/Pink Man/Run (32x32).png differ
diff --git a/assets/images/Main Characters/Pink Man/Wall Jump (32x32).png b/assets/images/Main Characters/Pink Man/Wall Jump (32x32).png
new file mode 100644
index 00000000..d9f1c6ff
Binary files /dev/null and b/assets/images/Main Characters/Pink Man/Wall Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Virtual Guy/Double Jump (32x32).png b/assets/images/Main Characters/Virtual Guy/Double Jump (32x32).png
new file mode 100644
index 00000000..aa310820
Binary files /dev/null and b/assets/images/Main Characters/Virtual Guy/Double Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Virtual Guy/Fall (32x32).png b/assets/images/Main Characters/Virtual Guy/Fall (32x32).png
new file mode 100644
index 00000000..4af21e64
Binary files /dev/null and b/assets/images/Main Characters/Virtual Guy/Fall (32x32).png differ
diff --git a/assets/images/Main Characters/Virtual Guy/Hit (32x32).png b/assets/images/Main Characters/Virtual Guy/Hit (32x32).png
new file mode 100644
index 00000000..5036795d
Binary files /dev/null and b/assets/images/Main Characters/Virtual Guy/Hit (32x32).png differ
diff --git a/assets/images/Main Characters/Virtual Guy/Idle (32x32).png b/assets/images/Main Characters/Virtual Guy/Idle (32x32).png
new file mode 100644
index 00000000..d5b2e580
Binary files /dev/null and b/assets/images/Main Characters/Virtual Guy/Idle (32x32).png differ
diff --git a/assets/images/Main Characters/Virtual Guy/Jump (32x32).png b/assets/images/Main Characters/Virtual Guy/Jump (32x32).png
new file mode 100644
index 00000000..84177603
Binary files /dev/null and b/assets/images/Main Characters/Virtual Guy/Jump (32x32).png differ
diff --git a/assets/images/Main Characters/Virtual Guy/Run (32x32).png b/assets/images/Main Characters/Virtual Guy/Run (32x32).png
new file mode 100644
index 00000000..de4d53e5
Binary files /dev/null and b/assets/images/Main Characters/Virtual Guy/Run (32x32).png differ
diff --git a/assets/images/Main Characters/Virtual Guy/Wall Jump (32x32).png b/assets/images/Main Characters/Virtual Guy/Wall Jump (32x32).png
new file mode 100644
index 00000000..8458b296
Binary files /dev/null and b/assets/images/Main Characters/Virtual Guy/Wall Jump (32x32).png differ
diff --git a/assets/images/Menu/Buttons/Achievements.png b/assets/images/Menu/Buttons/Achievements.png
new file mode 100644
index 00000000..e51d5361
Binary files /dev/null and b/assets/images/Menu/Buttons/Achievements.png differ
diff --git a/assets/images/Menu/Buttons/Back.png b/assets/images/Menu/Buttons/Back.png
new file mode 100644
index 00000000..fc58bf15
Binary files /dev/null and b/assets/images/Menu/Buttons/Back.png differ
diff --git a/assets/images/Menu/Buttons/Close.png b/assets/images/Menu/Buttons/Close.png
new file mode 100644
index 00000000..6a1a3029
Binary files /dev/null and b/assets/images/Menu/Buttons/Close.png differ
diff --git a/assets/images/Menu/Buttons/Leaderboard.png b/assets/images/Menu/Buttons/Leaderboard.png
new file mode 100644
index 00000000..706aad4b
Binary files /dev/null and b/assets/images/Menu/Buttons/Leaderboard.png differ
diff --git a/assets/images/Menu/Buttons/Levels.png b/assets/images/Menu/Buttons/Levels.png
new file mode 100644
index 00000000..11ba8d1a
Binary files /dev/null and b/assets/images/Menu/Buttons/Levels.png differ
diff --git a/assets/images/Menu/Buttons/Next.png b/assets/images/Menu/Buttons/Next.png
new file mode 100644
index 00000000..a342507c
Binary files /dev/null and b/assets/images/Menu/Buttons/Next.png differ
diff --git a/assets/images/Menu/Buttons/Play.png b/assets/images/Menu/Buttons/Play.png
new file mode 100644
index 00000000..04f3791e
Binary files /dev/null and b/assets/images/Menu/Buttons/Play.png differ
diff --git a/assets/images/Menu/Buttons/Previous.png b/assets/images/Menu/Buttons/Previous.png
new file mode 100644
index 00000000..fc0a4612
Binary files /dev/null and b/assets/images/Menu/Buttons/Previous.png differ
diff --git a/assets/images/Menu/Buttons/Restart.png b/assets/images/Menu/Buttons/Restart.png
new file mode 100644
index 00000000..b12b24d5
Binary files /dev/null and b/assets/images/Menu/Buttons/Restart.png differ
diff --git a/assets/images/Menu/Buttons/Settings.png b/assets/images/Menu/Buttons/Settings.png
new file mode 100644
index 00000000..dd713675
Binary files /dev/null and b/assets/images/Menu/Buttons/Settings.png differ
diff --git a/assets/images/Menu/Buttons/Volume.png b/assets/images/Menu/Buttons/Volume.png
new file mode 100644
index 00000000..e3f8eba3
Binary files /dev/null and b/assets/images/Menu/Buttons/Volume.png differ
diff --git a/assets/images/Menu/Levels/01.png b/assets/images/Menu/Levels/01.png
new file mode 100644
index 00000000..b0867983
Binary files /dev/null and b/assets/images/Menu/Levels/01.png differ
diff --git a/assets/images/Menu/Levels/02.png b/assets/images/Menu/Levels/02.png
new file mode 100644
index 00000000..4f1b3bbe
Binary files /dev/null and b/assets/images/Menu/Levels/02.png differ
diff --git a/assets/images/Menu/Levels/03.png b/assets/images/Menu/Levels/03.png
new file mode 100644
index 00000000..384d5655
Binary files /dev/null and b/assets/images/Menu/Levels/03.png differ
diff --git a/assets/images/Menu/Levels/04.png b/assets/images/Menu/Levels/04.png
new file mode 100644
index 00000000..455cf13f
Binary files /dev/null and b/assets/images/Menu/Levels/04.png differ
diff --git a/assets/images/Menu/Levels/05.png b/assets/images/Menu/Levels/05.png
new file mode 100644
index 00000000..9d77410f
Binary files /dev/null and b/assets/images/Menu/Levels/05.png differ
diff --git a/assets/images/Menu/Levels/06.png b/assets/images/Menu/Levels/06.png
new file mode 100644
index 00000000..3452f660
Binary files /dev/null and b/assets/images/Menu/Levels/06.png differ
diff --git a/assets/images/Menu/Levels/07.png b/assets/images/Menu/Levels/07.png
new file mode 100644
index 00000000..8107e63e
Binary files /dev/null and b/assets/images/Menu/Levels/07.png differ
diff --git a/assets/images/Menu/Levels/08.png b/assets/images/Menu/Levels/08.png
new file mode 100644
index 00000000..219534e6
Binary files /dev/null and b/assets/images/Menu/Levels/08.png differ
diff --git a/assets/images/Menu/Levels/09.png b/assets/images/Menu/Levels/09.png
new file mode 100644
index 00000000..3abfa09d
Binary files /dev/null and b/assets/images/Menu/Levels/09.png differ
diff --git a/assets/images/Menu/Levels/10.png b/assets/images/Menu/Levels/10.png
new file mode 100644
index 00000000..d6efe1b5
Binary files /dev/null and b/assets/images/Menu/Levels/10.png differ
diff --git a/assets/images/Menu/Levels/11.png b/assets/images/Menu/Levels/11.png
new file mode 100644
index 00000000..5d650f54
Binary files /dev/null and b/assets/images/Menu/Levels/11.png differ
diff --git a/assets/images/Menu/Levels/12.png b/assets/images/Menu/Levels/12.png
new file mode 100644
index 00000000..e5583ba8
Binary files /dev/null and b/assets/images/Menu/Levels/12.png differ
diff --git a/assets/images/Menu/Levels/13.png b/assets/images/Menu/Levels/13.png
new file mode 100644
index 00000000..ae31ed0d
Binary files /dev/null and b/assets/images/Menu/Levels/13.png differ
diff --git a/assets/images/Menu/Levels/14.png b/assets/images/Menu/Levels/14.png
new file mode 100644
index 00000000..adc69ff4
Binary files /dev/null and b/assets/images/Menu/Levels/14.png differ
diff --git a/assets/images/Menu/Levels/15.png b/assets/images/Menu/Levels/15.png
new file mode 100644
index 00000000..e0db40ae
Binary files /dev/null and b/assets/images/Menu/Levels/15.png differ
diff --git a/assets/images/Menu/Levels/16.png b/assets/images/Menu/Levels/16.png
new file mode 100644
index 00000000..bba7bbb1
Binary files /dev/null and b/assets/images/Menu/Levels/16.png differ
diff --git a/assets/images/Menu/Levels/17.png b/assets/images/Menu/Levels/17.png
new file mode 100644
index 00000000..c7804cea
Binary files /dev/null and b/assets/images/Menu/Levels/17.png differ
diff --git a/assets/images/Menu/Levels/18.png b/assets/images/Menu/Levels/18.png
new file mode 100644
index 00000000..544be9c4
Binary files /dev/null and b/assets/images/Menu/Levels/18.png differ
diff --git a/assets/images/Menu/Levels/19.png b/assets/images/Menu/Levels/19.png
new file mode 100644
index 00000000..b6bb42db
Binary files /dev/null and b/assets/images/Menu/Levels/19.png differ
diff --git a/assets/images/Menu/Levels/20.png b/assets/images/Menu/Levels/20.png
new file mode 100644
index 00000000..76e4e8a4
Binary files /dev/null and b/assets/images/Menu/Levels/20.png differ
diff --git a/assets/images/Menu/Levels/21.png b/assets/images/Menu/Levels/21.png
new file mode 100644
index 00000000..0135aaf5
Binary files /dev/null and b/assets/images/Menu/Levels/21.png differ
diff --git a/assets/images/Menu/Levels/22.png b/assets/images/Menu/Levels/22.png
new file mode 100644
index 00000000..5c759544
Binary files /dev/null and b/assets/images/Menu/Levels/22.png differ
diff --git a/assets/images/Menu/Levels/23.png b/assets/images/Menu/Levels/23.png
new file mode 100644
index 00000000..8d4cfcd2
Binary files /dev/null and b/assets/images/Menu/Levels/23.png differ
diff --git a/assets/images/Menu/Levels/24.png b/assets/images/Menu/Levels/24.png
new file mode 100644
index 00000000..bb2af542
Binary files /dev/null and b/assets/images/Menu/Levels/24.png differ
diff --git a/assets/images/Menu/Levels/25.png b/assets/images/Menu/Levels/25.png
new file mode 100644
index 00000000..d86fa213
Binary files /dev/null and b/assets/images/Menu/Levels/25.png differ
diff --git a/assets/images/Menu/Levels/26.png b/assets/images/Menu/Levels/26.png
new file mode 100644
index 00000000..adbbacda
Binary files /dev/null and b/assets/images/Menu/Levels/26.png differ
diff --git a/assets/images/Menu/Levels/27.png b/assets/images/Menu/Levels/27.png
new file mode 100644
index 00000000..d008cd3a
Binary files /dev/null and b/assets/images/Menu/Levels/27.png differ
diff --git a/assets/images/Menu/Levels/28.png b/assets/images/Menu/Levels/28.png
new file mode 100644
index 00000000..4ed39916
Binary files /dev/null and b/assets/images/Menu/Levels/28.png differ
diff --git a/assets/images/Menu/Levels/29.png b/assets/images/Menu/Levels/29.png
new file mode 100644
index 00000000..bfdb0c73
Binary files /dev/null and b/assets/images/Menu/Levels/29.png differ
diff --git a/assets/images/Menu/Levels/30.png b/assets/images/Menu/Levels/30.png
new file mode 100644
index 00000000..31125642
Binary files /dev/null and b/assets/images/Menu/Levels/30.png differ
diff --git a/assets/images/Menu/Levels/31.png b/assets/images/Menu/Levels/31.png
new file mode 100644
index 00000000..f2ad13ac
Binary files /dev/null and b/assets/images/Menu/Levels/31.png differ
diff --git a/assets/images/Menu/Levels/32.png b/assets/images/Menu/Levels/32.png
new file mode 100644
index 00000000..51165972
Binary files /dev/null and b/assets/images/Menu/Levels/32.png differ
diff --git a/assets/images/Menu/Levels/33.png b/assets/images/Menu/Levels/33.png
new file mode 100644
index 00000000..ad2b2479
Binary files /dev/null and b/assets/images/Menu/Levels/33.png differ
diff --git a/assets/images/Menu/Levels/34.png b/assets/images/Menu/Levels/34.png
new file mode 100644
index 00000000..01808407
Binary files /dev/null and b/assets/images/Menu/Levels/34.png differ
diff --git a/assets/images/Menu/Levels/35.png b/assets/images/Menu/Levels/35.png
new file mode 100644
index 00000000..c0628a99
Binary files /dev/null and b/assets/images/Menu/Levels/35.png differ
diff --git a/assets/images/Menu/Levels/36.png b/assets/images/Menu/Levels/36.png
new file mode 100644
index 00000000..75c8eadf
Binary files /dev/null and b/assets/images/Menu/Levels/36.png differ
diff --git a/assets/images/Menu/Levels/37.png b/assets/images/Menu/Levels/37.png
new file mode 100644
index 00000000..72bd7fc5
Binary files /dev/null and b/assets/images/Menu/Levels/37.png differ
diff --git a/assets/images/Menu/Levels/38.png b/assets/images/Menu/Levels/38.png
new file mode 100644
index 00000000..dc6bb78b
Binary files /dev/null and b/assets/images/Menu/Levels/38.png differ
diff --git a/assets/images/Menu/Levels/39.png b/assets/images/Menu/Levels/39.png
new file mode 100644
index 00000000..1a10f348
Binary files /dev/null and b/assets/images/Menu/Levels/39.png differ
diff --git a/assets/images/Menu/Levels/40.png b/assets/images/Menu/Levels/40.png
new file mode 100644
index 00000000..d6f6fd8f
Binary files /dev/null and b/assets/images/Menu/Levels/40.png differ
diff --git a/assets/images/Menu/Levels/41.png b/assets/images/Menu/Levels/41.png
new file mode 100644
index 00000000..a46ae020
Binary files /dev/null and b/assets/images/Menu/Levels/41.png differ
diff --git a/assets/images/Menu/Levels/42.png b/assets/images/Menu/Levels/42.png
new file mode 100644
index 00000000..2a0bc198
Binary files /dev/null and b/assets/images/Menu/Levels/42.png differ
diff --git a/assets/images/Menu/Levels/43.png b/assets/images/Menu/Levels/43.png
new file mode 100644
index 00000000..ab9d7349
Binary files /dev/null and b/assets/images/Menu/Levels/43.png differ
diff --git a/assets/images/Menu/Levels/44.png b/assets/images/Menu/Levels/44.png
new file mode 100644
index 00000000..8d94ce3e
Binary files /dev/null and b/assets/images/Menu/Levels/44.png differ
diff --git a/assets/images/Menu/Levels/45.png b/assets/images/Menu/Levels/45.png
new file mode 100644
index 00000000..13d2437e
Binary files /dev/null and b/assets/images/Menu/Levels/45.png differ
diff --git a/assets/images/Menu/Levels/46.png b/assets/images/Menu/Levels/46.png
new file mode 100644
index 00000000..887e7fa0
Binary files /dev/null and b/assets/images/Menu/Levels/46.png differ
diff --git a/assets/images/Menu/Levels/47.png b/assets/images/Menu/Levels/47.png
new file mode 100644
index 00000000..2b518fd0
Binary files /dev/null and b/assets/images/Menu/Levels/47.png differ
diff --git a/assets/images/Menu/Levels/48.png b/assets/images/Menu/Levels/48.png
new file mode 100644
index 00000000..6aeccca0
Binary files /dev/null and b/assets/images/Menu/Levels/48.png differ
diff --git a/assets/images/Menu/Levels/49.png b/assets/images/Menu/Levels/49.png
new file mode 100644
index 00000000..268eb293
Binary files /dev/null and b/assets/images/Menu/Levels/49.png differ
diff --git a/assets/images/Menu/Levels/50.png b/assets/images/Menu/Levels/50.png
new file mode 100644
index 00000000..c4f54f07
Binary files /dev/null and b/assets/images/Menu/Levels/50.png differ
diff --git a/assets/images/Menu/Text/Text (Black) (8x10).png b/assets/images/Menu/Text/Text (Black) (8x10).png
new file mode 100644
index 00000000..8ac8c48f
Binary files /dev/null and b/assets/images/Menu/Text/Text (Black) (8x10).png differ
diff --git a/assets/images/Menu/Text/Text (White) (8x10).png b/assets/images/Menu/Text/Text (White) (8x10).png
new file mode 100644
index 00000000..22df13e2
Binary files /dev/null and b/assets/images/Menu/Text/Text (White) (8x10).png differ
diff --git a/assets/images/Other/Confetti (16x16).png b/assets/images/Other/Confetti (16x16).png
new file mode 100644
index 00000000..47af1538
Binary files /dev/null and b/assets/images/Other/Confetti (16x16).png differ
diff --git a/assets/images/Other/Dust Particle.png b/assets/images/Other/Dust Particle.png
new file mode 100644
index 00000000..b2ade473
Binary files /dev/null and b/assets/images/Other/Dust Particle.png differ
diff --git a/assets/images/Other/Shadow.png b/assets/images/Other/Shadow.png
new file mode 100644
index 00000000..668f3258
Binary files /dev/null and b/assets/images/Other/Shadow.png differ
diff --git a/assets/images/Other/Transition.png b/assets/images/Other/Transition.png
new file mode 100644
index 00000000..2d2dd602
Binary files /dev/null and b/assets/images/Other/Transition.png differ
diff --git a/assets/images/Scout.png b/assets/images/Scout.png
new file mode 100644
index 00000000..b4483391
Binary files /dev/null and b/assets/images/Scout.png differ
diff --git a/assets/images/Scout_Destruction.png b/assets/images/Scout_Destruction.png
new file mode 100644
index 00000000..e3e9796a
Binary files /dev/null and b/assets/images/Scout_Destruction.png differ
diff --git a/assets/images/Terrain/Terrain (16x16).png b/assets/images/Terrain/Terrain (16x16).png
new file mode 100644
index 00000000..6674ca16
Binary files /dev/null and b/assets/images/Terrain/Terrain (16x16).png differ
diff --git a/assets/images/Traps/Arrow/Hit (18x18).png b/assets/images/Traps/Arrow/Hit (18x18).png
new file mode 100644
index 00000000..49a1e68b
Binary files /dev/null and b/assets/images/Traps/Arrow/Hit (18x18).png differ
diff --git a/assets/images/Traps/Arrow/Idle (18x18).png b/assets/images/Traps/Arrow/Idle (18x18).png
new file mode 100644
index 00000000..7685537b
Binary files /dev/null and b/assets/images/Traps/Arrow/Idle (18x18).png differ
diff --git a/assets/images/Traps/Blocks/HitSide (22x22).png b/assets/images/Traps/Blocks/HitSide (22x22).png
new file mode 100644
index 00000000..7f57a9e7
Binary files /dev/null and b/assets/images/Traps/Blocks/HitSide (22x22).png differ
diff --git a/assets/images/Traps/Blocks/HitTop (22x22).png b/assets/images/Traps/Blocks/HitTop (22x22).png
new file mode 100644
index 00000000..e42a963d
Binary files /dev/null and b/assets/images/Traps/Blocks/HitTop (22x22).png differ
diff --git a/assets/images/Traps/Blocks/Idle.png b/assets/images/Traps/Blocks/Idle.png
new file mode 100644
index 00000000..68bb59c5
Binary files /dev/null and b/assets/images/Traps/Blocks/Idle.png differ
diff --git a/assets/images/Traps/Blocks/Part 1 (22x22).png b/assets/images/Traps/Blocks/Part 1 (22x22).png
new file mode 100644
index 00000000..502961f2
Binary files /dev/null and b/assets/images/Traps/Blocks/Part 1 (22x22).png differ
diff --git a/assets/images/Traps/Blocks/Part 2 (22x22).png b/assets/images/Traps/Blocks/Part 2 (22x22).png
new file mode 100644
index 00000000..778f8935
Binary files /dev/null and b/assets/images/Traps/Blocks/Part 2 (22x22).png differ
diff --git a/assets/images/Traps/Falling Platforms/Off.png b/assets/images/Traps/Falling Platforms/Off.png
new file mode 100644
index 00000000..819a0a1e
Binary files /dev/null and b/assets/images/Traps/Falling Platforms/Off.png differ
diff --git a/assets/images/Traps/Falling Platforms/On (32x10).png b/assets/images/Traps/Falling Platforms/On (32x10).png
new file mode 100644
index 00000000..06e58cc8
Binary files /dev/null and b/assets/images/Traps/Falling Platforms/On (32x10).png differ
diff --git a/assets/images/Traps/Fan/Off.png b/assets/images/Traps/Fan/Off.png
new file mode 100644
index 00000000..48010847
Binary files /dev/null and b/assets/images/Traps/Fan/Off.png differ
diff --git a/assets/images/Traps/Fan/On (24x8).png b/assets/images/Traps/Fan/On (24x8).png
new file mode 100644
index 00000000..c362a035
Binary files /dev/null and b/assets/images/Traps/Fan/On (24x8).png differ
diff --git a/assets/images/Traps/Fire/Hit (16x32).png b/assets/images/Traps/Fire/Hit (16x32).png
new file mode 100644
index 00000000..20e37209
Binary files /dev/null and b/assets/images/Traps/Fire/Hit (16x32).png differ
diff --git a/assets/images/Traps/Fire/Off.png b/assets/images/Traps/Fire/Off.png
new file mode 100644
index 00000000..63a5bc2b
Binary files /dev/null and b/assets/images/Traps/Fire/Off.png differ
diff --git a/assets/images/Traps/Fire/On (16x32).png b/assets/images/Traps/Fire/On (16x32).png
new file mode 100644
index 00000000..f6a0adc7
Binary files /dev/null and b/assets/images/Traps/Fire/On (16x32).png differ
diff --git a/assets/images/Traps/Platforms/Brown Off.png b/assets/images/Traps/Platforms/Brown Off.png
new file mode 100644
index 00000000..a0e8f409
Binary files /dev/null and b/assets/images/Traps/Platforms/Brown Off.png differ
diff --git a/assets/images/Traps/Platforms/Brown On (32x8).png b/assets/images/Traps/Platforms/Brown On (32x8).png
new file mode 100644
index 00000000..a66da57a
Binary files /dev/null and b/assets/images/Traps/Platforms/Brown On (32x8).png differ
diff --git a/assets/images/Traps/Platforms/Chain.png b/assets/images/Traps/Platforms/Chain.png
new file mode 100644
index 00000000..14871762
Binary files /dev/null and b/assets/images/Traps/Platforms/Chain.png differ
diff --git a/assets/images/Traps/Platforms/Grey Off.png b/assets/images/Traps/Platforms/Grey Off.png
new file mode 100644
index 00000000..4cb5d73c
Binary files /dev/null and b/assets/images/Traps/Platforms/Grey Off.png differ
diff --git a/assets/images/Traps/Platforms/Grey On (32x8).png b/assets/images/Traps/Platforms/Grey On (32x8).png
new file mode 100644
index 00000000..9e319379
Binary files /dev/null and b/assets/images/Traps/Platforms/Grey On (32x8).png differ
diff --git a/assets/images/Traps/Rock Head/Blink (42x42).png b/assets/images/Traps/Rock Head/Blink (42x42).png
new file mode 100644
index 00000000..e4bf7511
Binary files /dev/null and b/assets/images/Traps/Rock Head/Blink (42x42).png differ
diff --git a/assets/images/Traps/Rock Head/Bottom Hit (42x42).png b/assets/images/Traps/Rock Head/Bottom Hit (42x42).png
new file mode 100644
index 00000000..3d4b8062
Binary files /dev/null and b/assets/images/Traps/Rock Head/Bottom Hit (42x42).png differ
diff --git a/assets/images/Traps/Rock Head/Idle.png b/assets/images/Traps/Rock Head/Idle.png
new file mode 100644
index 00000000..5d45206b
Binary files /dev/null and b/assets/images/Traps/Rock Head/Idle.png differ
diff --git a/assets/images/Traps/Rock Head/Left Hit (42x42).png b/assets/images/Traps/Rock Head/Left Hit (42x42).png
new file mode 100644
index 00000000..2bb018ad
Binary files /dev/null and b/assets/images/Traps/Rock Head/Left Hit (42x42).png differ
diff --git a/assets/images/Traps/Rock Head/Right Hit (42x42).png b/assets/images/Traps/Rock Head/Right Hit (42x42).png
new file mode 100644
index 00000000..ca287475
Binary files /dev/null and b/assets/images/Traps/Rock Head/Right Hit (42x42).png differ
diff --git a/assets/images/Traps/Rock Head/Top Hit (42x42).png b/assets/images/Traps/Rock Head/Top Hit (42x42).png
new file mode 100644
index 00000000..f29927a0
Binary files /dev/null and b/assets/images/Traps/Rock Head/Top Hit (42x42).png differ
diff --git a/assets/images/Traps/Sand Mud Ice/Ice Particle.png b/assets/images/Traps/Sand Mud Ice/Ice Particle.png
new file mode 100644
index 00000000..06ea6c68
Binary files /dev/null and b/assets/images/Traps/Sand Mud Ice/Ice Particle.png differ
diff --git a/assets/images/Traps/Sand Mud Ice/Mud Particle.png b/assets/images/Traps/Sand Mud Ice/Mud Particle.png
new file mode 100644
index 00000000..8c5cd07f
Binary files /dev/null and b/assets/images/Traps/Sand Mud Ice/Mud Particle.png differ
diff --git a/assets/images/Traps/Sand Mud Ice/Sand Mud Ice (16x6).png b/assets/images/Traps/Sand Mud Ice/Sand Mud Ice (16x6).png
new file mode 100644
index 00000000..cc942e1f
Binary files /dev/null and b/assets/images/Traps/Sand Mud Ice/Sand Mud Ice (16x6).png differ
diff --git a/assets/images/Traps/Sand Mud Ice/Sand Particle.png b/assets/images/Traps/Sand Mud Ice/Sand Particle.png
new file mode 100644
index 00000000..2e126c32
Binary files /dev/null and b/assets/images/Traps/Sand Mud Ice/Sand Particle.png differ
diff --git a/assets/images/Traps/Saw/Chain.png b/assets/images/Traps/Saw/Chain.png
new file mode 100644
index 00000000..d7416c41
Binary files /dev/null and b/assets/images/Traps/Saw/Chain.png differ
diff --git a/assets/images/Traps/Saw/Off.png b/assets/images/Traps/Saw/Off.png
new file mode 100644
index 00000000..1a3c128b
Binary files /dev/null and b/assets/images/Traps/Saw/Off.png differ
diff --git a/assets/images/Traps/Saw/On (38x38).png b/assets/images/Traps/Saw/On (38x38).png
new file mode 100644
index 00000000..9f3a811d
Binary files /dev/null and b/assets/images/Traps/Saw/On (38x38).png differ
diff --git a/assets/images/Traps/Spike Head/Blink (54x52).png b/assets/images/Traps/Spike Head/Blink (54x52).png
new file mode 100644
index 00000000..1c7f5c88
Binary files /dev/null and b/assets/images/Traps/Spike Head/Blink (54x52).png differ
diff --git a/assets/images/Traps/Spike Head/Bottom Hit (54x52).png b/assets/images/Traps/Spike Head/Bottom Hit (54x52).png
new file mode 100644
index 00000000..38bdc11f
Binary files /dev/null and b/assets/images/Traps/Spike Head/Bottom Hit (54x52).png differ
diff --git a/assets/images/Traps/Spike Head/Idle.png b/assets/images/Traps/Spike Head/Idle.png
new file mode 100644
index 00000000..92363c45
Binary files /dev/null and b/assets/images/Traps/Spike Head/Idle.png differ
diff --git a/assets/images/Traps/Spike Head/Left Hit (54x52).png b/assets/images/Traps/Spike Head/Left Hit (54x52).png
new file mode 100644
index 00000000..13f70ae0
Binary files /dev/null and b/assets/images/Traps/Spike Head/Left Hit (54x52).png differ
diff --git a/assets/images/Traps/Spike Head/Right Hit (54x52).png b/assets/images/Traps/Spike Head/Right Hit (54x52).png
new file mode 100644
index 00000000..9060f964
Binary files /dev/null and b/assets/images/Traps/Spike Head/Right Hit (54x52).png differ
diff --git a/assets/images/Traps/Spike Head/Top Hit (54x52).png b/assets/images/Traps/Spike Head/Top Hit (54x52).png
new file mode 100644
index 00000000..ae1e54eb
Binary files /dev/null and b/assets/images/Traps/Spike Head/Top Hit (54x52).png differ
diff --git a/assets/images/Traps/Spiked Ball/Chain.png b/assets/images/Traps/Spiked Ball/Chain.png
new file mode 100644
index 00000000..af1d3b81
Binary files /dev/null and b/assets/images/Traps/Spiked Ball/Chain.png differ
diff --git a/assets/images/Traps/Spiked Ball/Spiked Ball.png b/assets/images/Traps/Spiked Ball/Spiked Ball.png
new file mode 100644
index 00000000..c25f971f
Binary files /dev/null and b/assets/images/Traps/Spiked Ball/Spiked Ball.png differ
diff --git a/assets/images/Traps/Spikes/Idle.png b/assets/images/Traps/Spikes/Idle.png
new file mode 100644
index 00000000..133f5868
Binary files /dev/null and b/assets/images/Traps/Spikes/Idle.png differ
diff --git a/assets/images/Traps/Trampoline/Idle.png b/assets/images/Traps/Trampoline/Idle.png
new file mode 100644
index 00000000..c7d7f842
Binary files /dev/null and b/assets/images/Traps/Trampoline/Idle.png differ
diff --git a/assets/images/Traps/Trampoline/Jump (28x28).png b/assets/images/Traps/Trampoline/Jump (28x28).png
new file mode 100644
index 00000000..89c8d6fd
Binary files /dev/null and b/assets/images/Traps/Trampoline/Jump (28x28).png differ
diff --git a/assets/images/background.png b/assets/images/background.png
new file mode 100644
index 00000000..afcb5ec9
Binary files /dev/null and b/assets/images/background.png differ
diff --git a/assets/images/bird_downflap.png b/assets/images/bird_downflap.png
new file mode 100644
index 00000000..7792b91a
Binary files /dev/null and b/assets/images/bird_downflap.png differ
diff --git a/assets/images/bird_midflap.png b/assets/images/bird_midflap.png
new file mode 100644
index 00000000..5bb1652c
Binary files /dev/null and b/assets/images/bird_midflap.png differ
diff --git a/assets/images/bird_upflap.png b/assets/images/bird_upflap.png
new file mode 100644
index 00000000..6523f6ff
Binary files /dev/null and b/assets/images/bird_upflap.png differ
diff --git a/assets/images/bullet.png b/assets/images/bullet.png
new file mode 100644
index 00000000..68eb2f2b
Binary files /dev/null and b/assets/images/bullet.png differ
diff --git a/assets/images/enemy.png b/assets/images/enemy.png
new file mode 100644
index 00000000..77e00559
Binary files /dev/null and b/assets/images/enemy.png differ
diff --git a/assets/images/explosion.png b/assets/images/explosion.png
new file mode 100644
index 00000000..bda920e4
Binary files /dev/null and b/assets/images/explosion.png differ
diff --git a/assets/images/ground.png b/assets/images/ground.png
new file mode 100644
index 00000000..c374f2b3
Binary files /dev/null and b/assets/images/ground.png differ
diff --git a/assets/images/menu.jpg b/assets/images/menu.jpg
new file mode 100644
index 00000000..1e55519a
Binary files /dev/null and b/assets/images/menu.jpg differ
diff --git a/assets/images/message.png b/assets/images/message.png
new file mode 100644
index 00000000..9243ab58
Binary files /dev/null and b/assets/images/message.png differ
diff --git a/assets/images/pipe.png b/assets/images/pipe.png
new file mode 100644
index 00000000..d4bc5aae
Binary files /dev/null and b/assets/images/pipe.png differ
diff --git a/assets/images/pipe_rotated.png b/assets/images/pipe_rotated.png
new file mode 100644
index 00000000..2ae6bdb5
Binary files /dev/null and b/assets/images/pipe_rotated.png differ
diff --git a/assets/images/pixelbean.png b/assets/images/pixelbean.png
new file mode 100644
index 00000000..8fab39e8
Binary files /dev/null and b/assets/images/pixelbean.png differ
diff --git a/assets/images/player.png b/assets/images/player.png
new file mode 100644
index 00000000..6dfc79a2
Binary files /dev/null and b/assets/images/player.png differ
diff --git a/assets/images/stars_0.png b/assets/images/stars_0.png
new file mode 100644
index 00000000..893463d3
Binary files /dev/null and b/assets/images/stars_0.png differ
diff --git a/assets/images/stars_1.png b/assets/images/stars_1.png
new file mode 100644
index 00000000..b47422d8
Binary files /dev/null and b/assets/images/stars_1.png differ
diff --git a/assets/images/stars_2.png b/assets/images/stars_2.png
new file mode 100644
index 00000000..94fc8add
Binary files /dev/null and b/assets/images/stars_2.png differ
diff --git a/assets/images/thunderStrike.png b/assets/images/thunderStrike.png
new file mode 100644
index 00000000..a117599c
Binary files /dev/null and b/assets/images/thunderStrike.png differ
diff --git a/assets/models/customizer_badge.glb b/assets/models/customizer_badge.glb
new file mode 100644
index 00000000..bc323603
Binary files /dev/null and b/assets/models/customizer_badge.glb differ
diff --git a/assets/models/gamer_badge.glb b/assets/models/gamer_badge.glb
new file mode 100644
index 00000000..13896601
Binary files /dev/null and b/assets/models/gamer_badge.glb differ
diff --git a/assets/models/loyalty_badge.glb b/assets/models/loyalty_badge.glb
new file mode 100644
index 00000000..faf116cd
Binary files /dev/null and b/assets/models/loyalty_badge.glb differ
diff --git a/assets/models/mountain_badge.glb b/assets/models/mountain_badge.glb
deleted file mode 100644
index 6a98e627..00000000
Binary files a/assets/models/mountain_badge.glb and /dev/null differ
diff --git a/assets/models/newbie_badge.glb b/assets/models/newbie_badge.glb
new file mode 100644
index 00000000..0815d52b
Binary files /dev/null and b/assets/models/newbie_badge.glb differ
diff --git a/assets/tiles/GameyCon.tiled-project b/assets/tiles/GameyCon.tiled-project
new file mode 100644
index 00000000..d0eb5920
--- /dev/null
+++ b/assets/tiles/GameyCon.tiled-project
@@ -0,0 +1,14 @@
+{
+ "automappingRulesFile": "",
+ "commands": [
+ ],
+ "compatibilityVersion": 1100,
+ "extensionsPath": "extensions",
+ "folders": [
+ "."
+ ],
+ "properties": [
+ ],
+ "propertyTypes": [
+ ]
+}
diff --git a/assets/tiles/GameyCon.tiled-session b/assets/tiles/GameyCon.tiled-session
new file mode 100644
index 00000000..d7482fc2
--- /dev/null
+++ b/assets/tiles/GameyCon.tiled-session
@@ -0,0 +1,76 @@
+{
+ "Map/SizeTest": {
+ "height": 4300,
+ "width": 2
+ },
+ "activeFile": "Level-2.tmx",
+ "expandedProjectPaths": [
+ "."
+ ],
+ "fileStates": {
+ "GameyCon.tsx": {
+ "scaleInDock": 1
+ },
+ "Level-1.tmx": {
+ "expandedObjectLayers": [
+ 2,
+ 3
+ ],
+ "scale": 1.3240625,
+ "selectedLayer": 1,
+ "viewCenter": {
+ "x": 183.90370545197072,
+ "y": 320.2265754071277
+ }
+ },
+ "Level-2.tmx": {
+ "expandedObjectLayers": [
+ 2,
+ 3
+ ],
+ "scale": 1.3240625,
+ "selectedLayer": 1,
+ "viewCenter": {
+ "x": 259.42884116119893,
+ "y": 320.2265754071277
+ }
+ },
+ "Level-3.tmx": {
+ "expandedObjectLayers": [
+ 2
+ ],
+ "scale": 1.3240625,
+ "selectedLayer": 1,
+ "viewCenter": {
+ "x": 184.2813311305169,
+ "y": 319.8489497285816
+ }
+ }
+ },
+ "last.imagePath": "C:/Users/piery/OneDrive/Documents/GitHub/GameOnConnect/assets/images/Terrain",
+ "map.height": 40,
+ "map.lastUsedFormat": "tmx",
+ "map.tileHeight": 16,
+ "map.tileWidth": 16,
+ "map.width": 23,
+ "openFiles": [
+ "Level-1.tmx",
+ "Level-2.tmx",
+ "Level-3.tmx"
+ ],
+ "project": "GameyCon.tiled-project",
+ "property.type": "string",
+ "recentFiles": [
+ "Level-1.tmx",
+ "Level-3.tmx",
+ "Level-2.tmx",
+ "level-1.tmx",
+ "GameyCon.tsx",
+ "level-2.tmx"
+ ],
+ "tileset.lastUsedFormat": "tsx",
+ "tileset.tileSize": {
+ "height": 16,
+ "width": 16
+ }
+}
diff --git a/assets/tiles/GameyCon.tsx b/assets/tiles/GameyCon.tsx
new file mode 100644
index 00000000..ca812b20
--- /dev/null
+++ b/assets/tiles/GameyCon.tsx
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/tiles/Level-1.tmx b/assets/tiles/Level-1.tmx
new file mode 100644
index 00000000..0ddb49d9
--- /dev/null
+++ b/assets/tiles/Level-1.tmx
@@ -0,0 +1,95 @@
+
+
diff --git a/assets/tiles/Level-2.tmx b/assets/tiles/Level-2.tmx
new file mode 100644
index 00000000..474729e3
--- /dev/null
+++ b/assets/tiles/Level-2.tmx
@@ -0,0 +1,120 @@
+
+
diff --git a/assets/tiles/Level-3.tmx b/assets/tiles/Level-3.tmx
new file mode 100644
index 00000000..e79df202
--- /dev/null
+++ b/assets/tiles/Level-3.tmx
@@ -0,0 +1,51 @@
+
+
diff --git a/lib/GameyCon/components/background_tile.dart b/lib/GameyCon/components/background_tile.dart
new file mode 100644
index 00000000..e9ed65b4
--- /dev/null
+++ b/lib/GameyCon/components/background_tile.dart
@@ -0,0 +1,29 @@
+import 'dart:async';
+
+import 'package:flame/components.dart';
+import 'package:flame/parallax.dart';
+import 'package:flutter/material.dart';
+
+
+class BackgroundTile extends ParallaxComponent {
+ final String color;
+ BackgroundTile({
+ this.color = 'Gray',
+ super.position,
+ });
+
+ final double scrollSpeed = 40;
+
+ @override
+ FutureOr onLoad() async {
+ priority = -10;
+ size = Vector2.all(64);
+ parallax = await game.loadParallax(
+ [ParallaxImageData('Background/$color.png')],
+ baseVelocity: Vector2(0, -scrollSpeed),
+ repeat: ImageRepeat.repeat,
+ fill: LayerFill.none,
+ );
+ return super.onLoad();
+ }
+}
diff --git a/lib/GameyCon/components/checkpoint.dart b/lib/GameyCon/components/checkpoint.dart
new file mode 100644
index 00000000..1157f2fe
--- /dev/null
+++ b/lib/GameyCon/components/checkpoint.dart
@@ -0,0 +1,67 @@
+import 'dart:async';
+
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:gameonconnect/GameyCon/gameycon_game.dart';
+import 'package:gameonconnect/GameyCon/components/player.dart';
+
+class Checkpoint extends SpriteAnimationComponent
+ with HasGameRef, CollisionCallbacks {
+ Checkpoint({
+ super.position,
+ super.size,
+ });
+
+ @override
+ FutureOr onLoad() {
+ // debugMode = true;
+ add(RectangleHitbox(
+ position: Vector2(18, 56),
+ size: Vector2(12, 8),
+ collisionType: CollisionType.passive,
+ ));
+
+ animation = SpriteAnimation.fromFrameData(
+ game.images
+ .fromCache('Items/Checkpoints/Checkpoint/Checkpoint (No Flag).png'),
+ SpriteAnimationData.sequenced(
+ amount: 1,
+ stepTime: 1,
+ textureSize: Vector2.all(64),
+ ),
+ );
+ return super.onLoad();
+ }
+
+ @override
+ void onCollisionStart(
+ Set intersectionPoints, PositionComponent other) {
+ if (other is Player) _reachedCheckpoint();
+ super.onCollisionStart(intersectionPoints, other);
+ }
+
+ void _reachedCheckpoint() async {
+ animation = SpriteAnimation.fromFrameData(
+ game.images.fromCache(
+ 'Items/Checkpoints/Checkpoint/Checkpoint (Flag Out) (64x64).png'),
+ SpriteAnimationData.sequenced(
+ amount: 26,
+ stepTime: 0.05,
+ textureSize: Vector2.all(64),
+ loop: false,
+ ),
+ );
+
+ await animationTicker?.completed;
+
+ animation = SpriteAnimation.fromFrameData(
+ game.images.fromCache(
+ 'Items/Checkpoints/Checkpoint/Checkpoint (Flag Idle)(64x64).png'),
+ SpriteAnimationData.sequenced(
+ amount: 10,
+ stepTime: 0.05,
+ textureSize: Vector2.all(64),
+ ),
+ );
+ }
+}
diff --git a/lib/GameyCon/components/chicken.dart b/lib/GameyCon/components/chicken.dart
new file mode 100644
index 00000000..176d7a43
--- /dev/null
+++ b/lib/GameyCon/components/chicken.dart
@@ -0,0 +1,148 @@
+import 'dart:async';
+import 'dart:ui';
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:flame_audio/flame_audio.dart';
+import 'package:gameonconnect/GameyCon/components/player.dart';
+import 'package:gameonconnect/GameyCon/gameycon_game.dart';
+
+enum State { idle, run, hit }
+
+class Chicken extends SpriteAnimationGroupComponent
+ with HasGameRef, CollisionCallbacks {
+ final double offNeg;
+ final double offPos;
+ Chicken({
+ super.position,
+ super.size,
+ this.offNeg = 0,
+ this.offPos = 0,
+ });
+
+ static const stepTime = 0.05;
+ static const tileSize = 16;
+ static const runSpeed = 80;
+ static const _bounceHeight = 260.0;
+ final textureSize = Vector2(32, 34);
+
+ Vector2 velocity = Vector2.zero();
+ double rangeNeg = 0;
+ double rangePos = 0;
+ double moveDirection = 1;
+ double targetDirection = -1;
+ bool gotStomped = false;
+
+ late final Player player;
+ late final SpriteAnimation _idleAnimation;
+ late final SpriteAnimation _runAnimation;
+ late final SpriteAnimation _hitAnimation;
+
+ @override
+ FutureOr onLoad() {
+ // debugMode = true;
+ player = game.player;
+
+ add(
+ RectangleHitbox(
+ position: Vector2(4, 6),
+ size: Vector2(24, 26),
+ ),
+ );
+ _loadAllAnimations();
+ _calculateRange();
+ return super.onLoad();
+ }
+
+ @override
+ void update(double dt) {
+ if (!gotStomped) {
+ _updateState();
+ _movement(dt);
+ }
+
+ super.update(dt);
+ }
+
+ void _loadAllAnimations() {
+ _idleAnimation = _spriteAnimation('Idle', 13);
+ _runAnimation = _spriteAnimation('Run', 14);
+ _hitAnimation = _spriteAnimation('Hit', 15)..loop = false;
+
+ animations = {
+ State.idle: _idleAnimation,
+ State.run: _runAnimation,
+ State.hit: _hitAnimation,
+ };
+
+ current = State.idle;
+ }
+
+ SpriteAnimation _spriteAnimation(String state, int amount) {
+ return SpriteAnimation.fromFrameData(
+ game.images.fromCache('Enemies/Chicken/$state (32x34).png'),
+ SpriteAnimationData.sequenced(
+ amount: amount,
+ stepTime: stepTime,
+ textureSize: textureSize,
+ ),
+ );
+ }
+
+ void _calculateRange() {
+ rangeNeg = position.x -
+ offNeg *
+ tileSize; //multiply by tileSize to get the actual position of the chicken in the game
+ rangePos = position.x + offPos * tileSize;
+ }
+
+ void _movement(dt) {
+ velocity.x = 0;
+
+ double playerOffset = (player.scale.x > 0) ? 0 : -player.width;
+ double chickenOffset = (scale.x > 0) ? 0 : -width;
+
+ if (playerInRange()) {
+ //player is in range of the chicken, meaning the chicken should start moving
+ targetDirection =
+ (player.x + playerOffset < position.x + chickenOffset) ? -1 : 1;
+ velocity.x = targetDirection * runSpeed;
+ }
+
+ moveDirection = lerpDouble(moveDirection, targetDirection, 0.1) ?? 1;
+
+ position.x += velocity.x * dt;
+ }
+
+ bool playerInRange() {
+ double playerOffset = (player.scale.x > 0) ? 0 : -player.width;
+
+ return player.x + playerOffset >= rangeNeg &&
+ player.x + playerOffset <= rangePos &&
+ player.y + player.height > position.y &&
+ player.y < position.y + height;
+ }
+
+ void _updateState() {
+ current = (velocity.x != 0) ? State.run : State.idle;
+
+ if ((moveDirection > 0 && scale.x > 0) ||
+ (moveDirection < 0 && scale.x < 0)) {
+ flipHorizontallyAroundCenter();
+ }
+ }
+
+ void collidedWithPlayer() async {
+ if (player.velocity.y > 0 && player.y + player.height > position.y) {
+ if (game.playSounds) {
+ FlameAudio.play('bounce.wav', volume: game.soundVolume);
+ }
+ gotStomped = true;
+ current = State.hit;
+ player.velocity.y = -_bounceHeight;
+ await animationTicker?.completed;
+ removeFromParent();
+ } else {
+ player.collidedwithEnemy();
+ }
+ }
+}
diff --git a/lib/GameyCon/components/collision_block.dart b/lib/GameyCon/components/collision_block.dart
new file mode 100644
index 00000000..d62074ea
--- /dev/null
+++ b/lib/GameyCon/components/collision_block.dart
@@ -0,0 +1,6 @@
+import 'package:flame/components.dart';
+
+class CollisionBlock extends PositionComponent {
+ bool isPlatform;
+ CollisionBlock({super.position, super.size, this.isPlatform = false});
+}
diff --git a/lib/GameyCon/components/custom_hitbox.dart b/lib/GameyCon/components/custom_hitbox.dart
new file mode 100644
index 00000000..ef373d5c
--- /dev/null
+++ b/lib/GameyCon/components/custom_hitbox.dart
@@ -0,0 +1,13 @@
+class CustomHitbox {
+ final double x;
+ final double y;
+ final double width;
+ final double height;
+
+ CustomHitbox({
+ required this.x,
+ required this.y,
+ required this.width,
+ required this.height,
+ });
+}
\ No newline at end of file
diff --git a/lib/GameyCon/components/fruit.dart b/lib/GameyCon/components/fruit.dart
new file mode 100644
index 00000000..20fa6d38
--- /dev/null
+++ b/lib/GameyCon/components/fruit.dart
@@ -0,0 +1,76 @@
+import 'dart:async';
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:flame_audio/flame_audio.dart';
+import 'package:gameonconnect/GameyCon/components/custom_hitbox.dart';
+import 'package:gameonconnect/GameyCon/components/score.dart';
+import 'package:gameonconnect/GameyCon/gameycon_game.dart';
+
+class Fruit extends SpriteAnimationComponent
+ with HasGameRef, CollisionCallbacks {
+ final String fruit;
+ final int value;
+
+ Fruit({
+ this.fruit = 'Apple',
+ required this.value,
+ super.position,
+ super.size,
+ });
+
+ final double stepTime = 0.05;
+ final hitbox = CustomHitbox(
+ x: 10,
+ y: 10,
+ width: 12,
+ height: 12,
+ );
+ bool collected = false;
+
+ @override
+ FutureOr onLoad() {
+ //debugMode = true;
+ priority = -1;
+
+ add(
+ RectangleHitbox(
+ position: Vector2(hitbox.x, hitbox.y),
+ size: Vector2(hitbox.width, hitbox.height),
+ collisionType: CollisionType.passive,
+ ),
+ );
+
+ animation = SpriteAnimation.fromFrameData(
+ game.images.fromCache('Items/Fruits/$fruit.png'),
+ SpriteAnimationData.sequenced(
+ amount: 17,
+ stepTime: stepTime,
+ textureSize: Vector2.all(32),
+ ),
+ );
+ return super.onLoad();
+ }
+
+ void collidedWithPlayer() async {
+ if (!collected) {
+ collected = true;
+ if (game.playSounds) {
+ FlameAudio.play('collect_fruit.wav', volume: game.soundVolume);
+ }
+ animation = SpriteAnimation.fromFrameData(
+ game.images.fromCache('Items/Fruits/Collected.png'),
+ SpriteAnimationData.sequenced(
+ amount: 6,
+ stepTime: stepTime,
+ textureSize: Vector2.all(32),
+ loop: false,
+ ),
+ );
+
+ ScoreManager().increaseScore(value); //we increase the score by the value of the fruit
+
+ await animationTicker?.completed;
+ removeFromParent();
+ }
+ }
+}
diff --git a/lib/GameyCon/components/jump_button.dart b/lib/GameyCon/components/jump_button.dart
new file mode 100644
index 00000000..35af1241
--- /dev/null
+++ b/lib/GameyCon/components/jump_button.dart
@@ -0,0 +1,39 @@
+import 'dart:async';
+
+import 'package:flame/components.dart';
+import 'package:flame/events.dart';
+import 'package:gameonconnect/GameyCon/gameycon_game.dart';
+
+class JumpButton extends SpriteComponent
+ with HasGameRef, TapCallbacks {
+ JumpButton();
+
+ final margin = 32;
+ final buttonSize = 64;
+
+ @override
+ FutureOr onLoad() {
+ sprite = Sprite(game.images.fromCache('HUD/JumpButton.png'));
+ position = Vector2(
+ game.size.x - margin - buttonSize,
+ game.size.y - margin - buttonSize + 30,
+ );
+ priority = 10;
+ return super.onLoad();
+ }
+
+ @override
+ void onTapDown(TapDownEvent event) {
+ game.player.hasJumped = true;
+ super.onTapDown(event);
+ }
+
+ @override
+ void onTapUp(TapUpEvent event) {
+ game.player.hasJumped = false;
+ super.onTapUp(event);
+ }
+}
+
+
+
diff --git a/lib/GameyCon/components/leavebutton.dart b/lib/GameyCon/components/leavebutton.dart
new file mode 100644
index 00000000..7f1d7bb4
--- /dev/null
+++ b/lib/GameyCon/components/leavebutton.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+import 'package:gameonconnect/GameyCon/components/score.dart';
+
+class LeaveButton extends StatelessWidget {
+ const LeaveButton({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return ElevatedButton.icon(
+ style: ButtonStyle(
+ backgroundColor: WidgetStateProperty.all(
+ Theme.of(context).colorScheme.primaryContainer,
+ ),
+ side: WidgetStateProperty.all(
+ BorderSide(
+ color: Theme.of(context).colorScheme.primary,
+ width: 1,
+ ),
+ ),
+ ),
+ onPressed: () {
+ ScoreManager().resetScore();
+ Navigator.of(context).pop();
+ },
+ icon: const Icon(Icons.arrow_back),
+ label: Text(
+ 'Leave',
+ style: TextStyle(
+ color: Theme.of(context).colorScheme.primary,
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/GameyCon/components/levels.dart b/lib/GameyCon/components/levels.dart
new file mode 100644
index 00000000..6bc66fb4
--- /dev/null
+++ b/lib/GameyCon/components/levels.dart
@@ -0,0 +1,158 @@
+import 'dart:async';
+import 'package:flame/components.dart';
+import 'package:flame_tiled/flame_tiled.dart';
+import 'package:gameonconnect/GameyCon/components/background_tile.dart';
+import 'package:gameonconnect/GameyCon/components/checkpoint.dart';
+import 'package:gameonconnect/GameyCon/components/chicken.dart';
+import 'package:gameonconnect/GameyCon/components/collision_block.dart';
+import 'package:gameonconnect/GameyCon/components/fruit.dart';
+import 'package:gameonconnect/GameyCon/components/player.dart';
+import 'package:gameonconnect/GameyCon/components/saw.dart';
+import 'package:gameonconnect/GameyCon/gameycon_game.dart';
+
+class Level extends World with HasGameRef {
+ final String levelName;
+ final Player player;
+ Level({required this.levelName, required this.player});
+ late TiledComponent level;
+ List collisionBlocks = [];
+
+ @override
+ FutureOr onLoad() async {
+ level = await TiledComponent.load('$levelName.tmx', Vector2.all(16.0));
+
+ //level.position = Vector2(0, -50);
+
+ add(level);
+
+ _scrollingBackground();
+ _spawningObjects();
+ _addCollisions();
+ return super.onLoad();
+ }
+
+ void _scrollingBackground() {
+ final backgroundLayer = level.tileMap.getLayer('Background');
+
+ if (backgroundLayer != null) {
+ final backgroundColor =
+ backgroundLayer.properties.getValue('BackgroundColor');
+ final backgroundTile = BackgroundTile(
+ color: backgroundColor ?? 'Gray',
+ position: Vector2(0, 0),
+ );
+ add(backgroundTile);
+ }
+ }
+
+ void _spawningObjects() {
+ final spawnPointsLayer = level.tileMap.getLayer('Spawnpoints');
+
+ if (spawnPointsLayer != null) {
+ for (final spawnPoint in spawnPointsLayer.objects) {
+ switch (spawnPoint.class_) {
+ case 'Player':
+ player.position = Vector2(spawnPoint.x, spawnPoint.y);
+ player.scale.x = 1;
+ add(player);
+ break;
+ case 'Fruit':
+ int fruitValue = getFruitValue(spawnPoint.name);
+ final fruit = Fruit(
+ fruit: spawnPoint.name,
+ value: fruitValue,
+ position: Vector2(spawnPoint.x, spawnPoint.y),
+ size: Vector2(spawnPoint.width, spawnPoint.height),
+ );
+ add(fruit);
+ break;
+ case 'Saw':
+ final isVertical = spawnPoint.properties.getValue('isVertical');
+ final offNeg = spawnPoint.properties.getValue('offNeg');
+ final offPos = spawnPoint.properties.getValue('offPos');
+
+ final saw = Saw(
+ isVertical: isVertical,
+ offNeg: offNeg,
+ offPos: offPos,
+ position: Vector2(spawnPoint.x, spawnPoint.y),
+ size: Vector2(spawnPoint.width, spawnPoint.height),
+ );
+ add(saw);
+ break;
+ case 'Checkpoint':
+ final checkpoint = Checkpoint(
+ position: Vector2(spawnPoint.x, spawnPoint.y),
+ size: Vector2(spawnPoint.width, spawnPoint.height),
+ );
+ add(checkpoint);
+ break;
+ case 'Chicken':
+ final offNeg = spawnPoint.properties.getValue('offNeg');
+ final offPos = spawnPoint.properties.getValue('offPos');
+ final chicken = Chicken(
+ position: Vector2(spawnPoint.x, spawnPoint.y),
+ size: Vector2(spawnPoint.width, spawnPoint.height),
+ offNeg: offNeg,
+ offPos: offPos,
+ );
+ add(chicken);
+ break;
+ default:
+ }
+ }
+ }
+ }
+
+ void _addCollisions() {
+ final collisionsLayer = level.tileMap.getLayer('Collisions');
+
+ if (collisionsLayer != null) {
+ for (final collision in collisionsLayer.objects) {
+ switch (collision.class_) {
+ case 'Platform':
+ final platform = CollisionBlock(
+ position: Vector2(collision.x, collision.y),
+ size: Vector2(collision.width, collision.height),
+ isPlatform: true,
+ );
+ collisionBlocks.add(platform);
+ add(platform);
+ break;
+ default:
+ final block = CollisionBlock(
+ position: Vector2(collision.x, collision.y),
+ size: Vector2(collision.width, collision.height),
+ );
+ collisionBlocks.add(block);
+ add(block);
+ }
+ }
+ }
+
+ player.collisionBlocks = collisionBlocks;
+ }
+
+ int getFruitValue(String fruit) {
+ switch (fruit) {
+ case 'Apple':
+ return 5;
+ case 'Orange':
+ return 3;
+ case 'Bananas':
+ return 7;
+ case 'Cherries':
+ return 2;
+ case 'Kiwi':
+ return 8;
+ case 'Pineapple':
+ return 10;
+ case 'Melon':
+ return 3;
+ case 'Strawberry':
+ return 4;
+ default:
+ return 1;
+ }
+ }
+}
diff --git a/lib/GameyCon/components/player.dart b/lib/GameyCon/components/player.dart
new file mode 100644
index 00000000..86afced3
--- /dev/null
+++ b/lib/GameyCon/components/player.dart
@@ -0,0 +1,333 @@
+import 'dart:async';
+
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:flame_audio/flame_audio.dart';
+import 'package:gameonconnect/GameyCon/components/checkpoint.dart';
+import 'package:gameonconnect/GameyCon/components/chicken.dart';
+import 'package:gameonconnect/GameyCon/components/collision_block.dart';
+import 'package:gameonconnect/GameyCon/components/custom_hitbox.dart';
+import 'package:gameonconnect/GameyCon/components/fruit.dart';
+import 'package:gameonconnect/GameyCon/components/saw.dart';
+import 'package:gameonconnect/GameyCon/components/tools.dart';
+import 'package:gameonconnect/GameyCon/gameycon_game.dart';
+import 'package:flutter/services.dart';
+
+enum PlayerState {
+ idle,
+ running,
+ jumping,
+ falling,
+ hit,
+ appearing,
+ disappearing,
+}
+
+class Player extends SpriteAnimationGroupComponent
+ with HasGameRef, KeyboardHandler, CollisionCallbacks {
+ String character;
+ Player({
+ super.position,
+ this.character = 'Ninja Frog',
+ });
+
+ final double stepTime = 0.05;
+ late final SpriteAnimation idleAnimation;
+ late final SpriteAnimation runningAnimation;
+ late final SpriteAnimation jumpingAnimation;
+ late final SpriteAnimation fallingAnimation;
+ late final SpriteAnimation hitAnimation;
+ late final SpriteAnimation appearingAnimation;
+ late final SpriteAnimation disappearingAnimation;
+
+ final double _gravity = 9.8;
+ final double _jumpForce = 260;
+ final double terminalVelocity = 300;
+ double horizontalMovement = 0;
+ double moveSpeed = 100;
+ Vector2 startingPosition = Vector2.zero();
+ Vector2 velocity = Vector2.zero();
+ bool isOnGround = false;
+ bool hasJumped = false;
+ bool gotHit = false;
+ bool reachedCheckpoint = false;
+ List collisionBlocks = [];
+ CustomHitbox hitbox = CustomHitbox(
+ x: 10,
+ y: 4,
+ width: 14,
+ height: 28,
+ );
+
+ double fixedDeltaTime = 1 / 60;
+ double accumulatedTime = 0;
+
+ @override
+ FutureOr onLoad() {
+ _loadAllAnimations();
+ //debugMode = true;
+ startingPosition = Vector2(position.x, position.y);
+ add(RectangleHitbox(
+ position: Vector2(hitbox.x, hitbox.y),
+ size: Vector2(hitbox.width, hitbox.height),
+ ));
+ return super.onLoad();
+ }
+
+ @override
+ void update(double dt) {
+ accumulatedTime += dt;
+ while (accumulatedTime >= fixedDeltaTime) {
+ if (!gotHit && !reachedCheckpoint) {
+ _updatePlayerState();
+ _updatePlayerMovement(fixedDeltaTime);
+ _checkHorizontalCollisions();
+ _applyGravity(fixedDeltaTime);
+ _checkVerticalCollisions();
+ }
+
+ accumulatedTime -= fixedDeltaTime;
+ }
+ super.update(
+ dt); //dt is the delta time between the last frame and the current frame
+ }
+
+ @override
+ bool onKeyEvent(KeyEvent event, Set keysPressed) {
+ horizontalMovement = 0;
+ final isLeftKeyPressed =
+ keysPressed.contains(LogicalKeyboardKey.arrowLeft) ||
+ keysPressed.contains(LogicalKeyboardKey.keyA);
+ final isRightKeyPressed =
+ keysPressed.contains(LogicalKeyboardKey.arrowRight) ||
+ keysPressed.contains(LogicalKeyboardKey.keyD);
+ horizontalMovement += isLeftKeyPressed ? -1 : 0;
+ horizontalMovement += isRightKeyPressed ? 1 : 0;
+
+ hasJumped = keysPressed.contains(LogicalKeyboardKey.space);
+ return super.onKeyEvent(event, keysPressed);
+ }
+
+ @override
+ void onCollisionStart(
+ Set intersectionPoints, PositionComponent other) {
+ if (!reachedCheckpoint) {
+ if (other is Fruit) {
+ other.collidedWithPlayer();
+ }
+ if (other is Saw) {
+ _respawn();
+ }
+ if (other is Checkpoint) {
+ _reachedCheckpoint();
+ }
+ if (other is Chicken) {
+ other.collidedWithPlayer();
+ }
+ }
+ super.onCollisionStart(intersectionPoints, other);
+ }
+
+ void _loadAllAnimations() {
+ idleAnimation = _spriteAnimation('Idle', 11);
+ runningAnimation = _spriteAnimation('Run', 12);
+ jumpingAnimation = _spriteAnimation('Jump', 1);
+ fallingAnimation = _spriteAnimation('Fall', 1);
+ hitAnimation = _spriteAnimation('Hit', 7)..loop = false;
+ appearingAnimation = _specialspriteAnimation('Appearing', 7);
+ disappearingAnimation = _specialspriteAnimation('Disappearing', 7);
+
+ //here is the list of all the animations
+ animations = {
+ PlayerState.idle: idleAnimation,
+ PlayerState.running: runningAnimation,
+ PlayerState.jumping: jumpingAnimation,
+ PlayerState.falling: fallingAnimation,
+ PlayerState.hit: hitAnimation,
+ PlayerState.appearing: appearingAnimation,
+ PlayerState.disappearing: disappearingAnimation,
+ };
+
+ //this is the current animation
+ current = PlayerState.idle;
+ }
+
+ SpriteAnimation _spriteAnimation(String state, int amount) {
+ return SpriteAnimation.fromFrameData(
+ game.images.fromCache('Main Characters/$character/$state (32x32).png'),
+ SpriteAnimationData.sequenced(
+ amount: amount,
+ stepTime: stepTime,
+ textureSize: Vector2(32, 32),
+ ),
+ );
+ }
+
+ SpriteAnimation _specialspriteAnimation(String state, int amount) {
+ return SpriteAnimation.fromFrameData(
+ game.images.fromCache('Main Characters/$state (96x96).png'),
+ SpriteAnimationData.sequenced(
+ amount: amount,
+ stepTime: stepTime,
+ textureSize: Vector2.all(96),
+ loop: false,
+ ),
+ );
+ }
+
+ void _updatePlayerMovement(double dt) {
+ if (hasJumped && isOnGround) {
+ _playerJump(dt);
+ }
+
+ //comment out the below if statement to let the player double jump
+ if (velocity.y > _gravity) {
+ isOnGround = false;
+ }
+
+ velocity.x = horizontalMovement * moveSpeed;
+ position.x += velocity.x * dt;
+ }
+
+ void _updatePlayerState() {
+ PlayerState playerState = PlayerState.idle;
+ if (velocity.x < 0 && scale.x > 0) {
+ flipHorizontallyAroundCenter();
+ } else if (velocity.x > 0 && scale.x < 0) {
+ flipHorizontallyAroundCenter();
+ }
+
+ //check to see if the player is moving
+ if (velocity.x > 0 || velocity.x < 0) {
+ playerState = PlayerState.running;
+ }
+
+ //check to see if the player is falling
+ if (velocity.y > _gravity) {
+ playerState = PlayerState.falling;
+ }
+ //check to see if the player is jumping
+ if (velocity.y < 0) {
+ playerState = PlayerState.jumping;
+ }
+
+ current = playerState;
+ }
+
+ void _playerJump(double dt) {
+ if (game.playSounds) {
+ FlameAudio.play('jump.wav', volume: game.soundVolume);
+ }
+ velocity.y = -_jumpForce;
+ position.y += velocity.y * dt;
+ isOnGround = false;
+ hasJumped = false;
+ }
+
+ void _checkHorizontalCollisions() {
+ for (final block in collisionBlocks) {
+ if (!block.isPlatform) {
+ if (checkCollision(this, block)) {
+ if (velocity.x > 0) {
+ velocity.x = 0;
+ position.x = block.x - hitbox.x - hitbox.width;
+ break;
+ }
+ if (velocity.x < 0) {
+ velocity.x = 0;
+ position.x = block.x + block.width + hitbox.width + hitbox.x;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ void _applyGravity(double dt) {
+ velocity.y += _gravity;
+ velocity.y = velocity.y.clamp(-_jumpForce, terminalVelocity);
+ position.y += velocity.y * dt;
+ }
+
+ void _checkVerticalCollisions() {
+ for (final block in collisionBlocks) {
+ if (block.isPlatform) {
+ if (checkCollision(this, block)) {
+ if (velocity.y > 0) {
+ velocity.y = 0;
+ position.y = block.y - hitbox.height - hitbox.y;
+ isOnGround = true;
+ break;
+ }
+ }
+ } else {
+ if (checkCollision(this, block)) {
+ if (velocity.y > 0) {
+ velocity.y = 0;
+ position.y = block.y - hitbox.height - hitbox.y;
+ isOnGround = true;
+ break;
+ }
+ if (velocity.y < 0) {
+ velocity.y = 0;
+ position.y = block.y + block.height - hitbox.y;
+ }
+ }
+ }
+ }
+ }
+
+ void _respawn() async {
+ if (game.playSounds) {
+ FlameAudio.play('hit.wav', volume: game.soundVolume);
+ }
+ const canMoveDuration = Duration(milliseconds: 400);
+ gotHit = true;
+ current = PlayerState.hit;
+
+ await animationTicker?.completed;
+ animationTicker?.reset();
+
+ scale.x = 1;
+ position = startingPosition - Vector2.all(32);
+ current = PlayerState.appearing;
+
+ await animationTicker?.completed;
+ animationTicker?.reset();
+
+ velocity = Vector2.zero();
+ position = startingPosition;
+ _updatePlayerState();
+ Future.delayed(canMoveDuration, () {
+ gotHit = false;
+ });
+ }
+
+ void _reachedCheckpoint() async {
+ reachedCheckpoint = true;
+ if (game.playSounds) {
+ FlameAudio.play('disappear.wav', volume: game.soundVolume);
+ }
+ if (scale.x > 0) {
+ position = position - Vector2.all(32);
+ } else if (scale.x < 0) {
+ position = position + Vector2(32, -32);
+ }
+
+ current = PlayerState.disappearing;
+ await animationTicker?.completed;
+ animationTicker?.reset();
+
+ reachedCheckpoint = false;
+ position = Vector2.all(-640);
+
+ const waitToChangeDuration = Duration(seconds: 3);
+ Future.delayed(waitToChangeDuration, () {
+ game.loadNextLevel();
+ });
+ }
+
+ void collidedwithEnemy() {
+ _respawn();
+ }
+}
diff --git a/lib/GameyCon/components/saw.dart b/lib/GameyCon/components/saw.dart
new file mode 100644
index 00000000..de1ede04
--- /dev/null
+++ b/lib/GameyCon/components/saw.dart
@@ -0,0 +1,76 @@
+import 'dart:async';
+
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:gameonconnect/GameyCon/gameycon_game.dart';
+
+class Saw extends SpriteAnimationComponent with HasGameRef {
+ final bool isVertical;
+ final double offNeg;
+ final double offPos;
+ Saw({
+ this.isVertical = false,
+ this.offNeg = 0,
+ this.offPos = 0,
+ super.position,
+ super.size,
+ });
+
+ static const double sawSpeed = 0.03;
+ static const moveSpeed = 50;
+ static const tileSize = 16;
+ double moveDirection = 1;
+ double rangeNeg = 0;
+ double rangePos = 0;
+
+ @override
+ FutureOr onLoad() {
+ priority = -1;
+ add(CircleHitbox());
+
+ if (isVertical) {
+ rangeNeg = position.y - offNeg * tileSize;
+ rangePos = position.y + offPos * tileSize;
+ } else {
+ rangeNeg = position.x - offNeg * tileSize;
+ rangePos = position.x + offPos * tileSize;
+ }
+
+ animation = SpriteAnimation.fromFrameData(
+ game.images.fromCache('Traps/Saw/On (38x38).png'),
+ SpriteAnimationData.sequenced(
+ amount: 8,
+ stepTime: sawSpeed,
+ textureSize: Vector2.all(38),
+ ));
+ return super.onLoad();
+ }
+
+ @override
+ void update(double dt) {
+ if (isVertical) {
+ _moveVertically(dt);
+ } else {
+ _moveHorizontally(dt);
+ }
+ super.update(dt);
+ }
+
+ void _moveVertically(double dt) {
+ if (position.y >= rangePos) {
+ moveDirection = -1;
+ } else if (position.y <= rangeNeg) {
+ moveDirection = 1;
+ }
+ position.y += moveDirection * moveSpeed * dt;
+ }
+
+ void _moveHorizontally(double dt) {
+ if (position.x >= rangePos) {
+ moveDirection = -1;
+ } else if (position.x <= rangeNeg) {
+ moveDirection = 1;
+ }
+ position.x += moveDirection * moveSpeed * dt;
+ }
+}
\ No newline at end of file
diff --git a/lib/GameyCon/components/score.dart b/lib/GameyCon/components/score.dart
new file mode 100644
index 00000000..f3e7cab0
--- /dev/null
+++ b/lib/GameyCon/components/score.dart
@@ -0,0 +1,24 @@
+import 'package:flutter/foundation.dart';
+
+class ScoreManager {
+ static final ScoreManager _instance = ScoreManager._internal();
+ final ValueNotifier _scoreNotifier = ValueNotifier(0); //this notifies listeners when the score changes
+
+ factory ScoreManager() {
+ return _instance; //creates a new instance of the ScoreManager class
+ }
+
+ ScoreManager._internal();
+
+ ValueNotifier get scoreNotifier => _scoreNotifier;
+
+ int get score => _scoreNotifier.value; //returns the current score
+
+ void increaseScore(int points) {
+ _scoreNotifier.value += points; //increases the score by the points of the fruit
+ }
+
+ void resetScore() {
+ _scoreNotifier.value = 0; //reset the score to 0
+ }
+}
\ No newline at end of file
diff --git a/lib/GameyCon/components/score_overlay.dart b/lib/GameyCon/components/score_overlay.dart
new file mode 100644
index 00000000..1c88e741
--- /dev/null
+++ b/lib/GameyCon/components/score_overlay.dart
@@ -0,0 +1,24 @@
+import 'package:flame/components.dart';
+import 'package:flame/text.dart';
+import 'package:flutter/material.dart';
+import 'package:gameonconnect/GameyCon/components/score.dart';
+
+class ScoreComponent extends TextComponent {
+ ScoreComponent()
+ : super(
+ text: 'Score: 0',
+ textRenderer: TextPaint(
+ style: const TextStyle(
+ color: Colors.white,
+ fontSize: 24,
+ ),
+ ),
+ );
+
+ @override
+ void update(double dt) { //updates the score
+ super.update(dt);
+ text = 'Score: ${ScoreManager().score}';
+ }
+
+}
\ No newline at end of file
diff --git a/lib/GameyCon/components/tools.dart b/lib/GameyCon/components/tools.dart
new file mode 100644
index 00000000..401d513b
--- /dev/null
+++ b/lib/GameyCon/components/tools.dart
@@ -0,0 +1,22 @@
+bool checkCollision(player, block) {
+ final hitbox = player.hitbox;
+ final playerX = player.position.x + hitbox.x;
+ final playerY = player.position.y + hitbox.y;
+ final playerWidth = hitbox.width;
+ final playerHeight = hitbox.height;
+
+ final blockX = block.x;
+ final blockY = block.y;
+ final blockWidth = block.width;
+ final blockHeight = block.height;
+
+ final fixedX = player.scale.x < 0
+ ? playerX - (hitbox.x * 2) - playerWidth
+ : playerX;
+ final fixedY = block.isPlatform ? playerY + playerHeight : playerY;
+
+ return (fixedY < blockY + blockHeight &&
+ playerY + playerHeight > blockY &&
+ fixedX < blockX + blockWidth &&
+ fixedX + playerWidth > blockX);
+}
\ No newline at end of file
diff --git a/lib/GameyCon/gameycon_game.dart b/lib/GameyCon/gameycon_game.dart
new file mode 100644
index 00000000..7c832b87
--- /dev/null
+++ b/lib/GameyCon/gameycon_game.dart
@@ -0,0 +1,129 @@
+import 'dart:async';
+import 'package:flame/components.dart';
+import 'package:flame/events.dart';
+import 'package:flame/game.dart';
+import 'package:flame/input.dart';
+import 'package:flutter/painting.dart';
+import 'package:gameonconnect/GameyCon/components/jump_button.dart';
+import 'package:gameonconnect/GameyCon/components/player.dart';
+import 'package:gameonconnect/GameyCon/components/levels.dart';
+
+class GameyCon extends FlameGame
+ with
+ HasKeyboardHandlerComponents,
+ DragCallbacks,
+ HasCollisionDetection,
+ TapCallbacks {
+ @override
+ //const Color.fromARGB(255, 97, 11, 155)
+ Color backgroundColor() => const Color.fromRGBO(42, 42, 42, 1.0);
+ late CameraComponent cam;
+ Player player = Player(character: 'Ninja Frog');
+ late JoystickComponent joystick;
+ bool showControls = true;
+ bool playSounds = true;
+ double soundVolume = 1.0;
+ List levelNames = ['Level-1', 'Level-2'];
+ int currentLevelIndex = 0;
+
+ GameyCon({required String selectedCharacter}) {
+ player = Player(character: selectedCharacter);
+ }
+
+ @override
+ FutureOr onLoad() async {
+ // Load all images into cache
+ await images.loadAllImages();
+
+ _loadLevel();
+
+ if (showControls) {
+ addJoystick();
+ add(JumpButton());
+ }
+
+ return super.onLoad();
+ }
+
+ @override
+ void update(double dt) {
+ if (showControls) {
+ updateJoystick();
+ }
+ super.update(dt);
+ }
+
+ void addJoystick() {
+ // final knobPaint = BasicPalette.blue.withAlpha(200).paint();
+ // final backgroundPaint = BasicPalette.blue.withAlpha(100).paint();
+
+ joystick = JoystickComponent(
+ priority: 2,
+ knob:
+ SpriteComponent(
+ sprite: Sprite(
+ images.fromCache('HUD/Knob.png'),
+ ),
+ ),
+ background:
+ SpriteComponent(
+ sprite: Sprite(
+ images.fromCache('HUD/Joystick.png'),
+ ),
+ ),
+ margin: const EdgeInsets.only(left: 48, bottom: 5),
+ );
+
+ add(joystick);
+ }
+
+ void updateJoystick() {
+ switch (joystick.direction) {
+ case JoystickDirection.left:
+ case JoystickDirection.upLeft:
+ case JoystickDirection.downLeft:
+ player.horizontalMovement = -1;
+ break;
+ case JoystickDirection.right:
+ case JoystickDirection.upRight:
+ case JoystickDirection.downRight:
+ player.horizontalMovement = 1;
+ break;
+ default:
+ player.horizontalMovement = 0;
+ break;
+ }
+ }
+
+ void loadNextLevel() {
+ removeWhere((component) => component is Level);
+
+ if (currentLevelIndex < levelNames.length - 1) {
+ currentLevelIndex++;
+ _loadLevel();
+ } else {
+ // no more levels
+ //add game over screen here
+ currentLevelIndex = 0;
+ _loadLevel();
+ }
+ }
+
+ void _loadLevel() {
+ Future.delayed(const Duration(seconds: 1), () {
+ Level world = Level(
+ player: player,
+ levelName: levelNames[currentLevelIndex],
+ );
+
+ cam = CameraComponent.withFixedResolution(
+ world: world,
+ width: 367,
+ height: 640,
+ );
+ cam.viewfinder.anchor = Anchor.topLeft;
+
+ addAll([cam, world]);
+ });
+ }
+}
diff --git a/lib/main.dart b/lib/main.dart
index 87783b48..6c780dfb 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,7 +1,9 @@
// ignore_for_file: prefer_const_constructors
+import 'package:flame/flame.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
+import 'package:flutter/services.dart';
import 'package:gameonconnect/view/pages/messaging/messaging_page.dart';
import 'package:gameonconnect/view/pages/settings/appearance.dart';
import 'package:gameonconnect/view/pages/settings/customize_page.dart';
@@ -40,6 +42,11 @@ void main() async {
androidProvider: AndroidProvider.debug,
appleProvider: AppleProvider.debug,
);
+
+ SystemChrome.setSystemUIOverlayStyle(
+ const SystemUiOverlayStyle(statusBarColor: Colors.transparent));
+ WidgetsFlutterBinding.ensureInitialized();
+ await Flame.device.fullScreen();
//TO turn off APP check
//FirebaseAppCheck.instance.setTokenAutoRefreshEnabled(false);
diff --git a/lib/model/space_shooter_game_M/space_shooter_game_model.dart b/lib/model/space_shooter_game_M/space_shooter_game_model.dart
new file mode 100644
index 00000000..96bfd763
--- /dev/null
+++ b/lib/model/space_shooter_game_M/space_shooter_game_model.dart
@@ -0,0 +1,75 @@
+// import 'package:flame/components.dart';
+// import 'package:flame/events.dart';
+// import 'package:flame/game.dart';
+// import 'package:flame/input.dart';
+// import 'package:flutter/material.dart';
+
+// class Player extends PositionComponent {
+// static final _paint = Paint()..color = Colors.white;
+
+// @override
+// void render(Canvas canvas) {
+// canvas.drawRect(size.toRect(), _paint);
+// }
+
+// void move(Vector2 delta) {
+// position.add(delta);
+// }
+// }
+
+// class SpaceShooterGame extends FlameGame with PanDetector {
+// late Player player;
+
+// @override
+// Future onLoad() async {
+// await super.onLoad();
+
+// player = Player()
+// ..position = size / 2
+// ..width = 50
+// ..height = 100
+// ..anchor = Anchor.center;
+
+// add(player);
+// }
+
+// @override
+// void onPanUpdate(DragUpdateInfo info) {
+// player.move(info.delta as Vector2); //check this later
+// }
+// }
+
+// class Bullet extends SpriteAnimationComponent
+// with HasGameReference {
+// Bullet({
+// super.position,
+// }) : super(
+// size: Vector2(25, 50),
+// anchor: Anchor.center,
+// );
+
+// @override
+// Future onLoad() async {
+// await super.onLoad();
+
+// animation = await game.loadSpriteAnimation(
+// 'bullet.png',
+// SpriteAnimationData.sequenced(
+// amount: 4,
+// stepTime: .2,
+// textureSize: Vector2(8, 16),
+// ),
+// );
+// }
+
+// @override
+// void update(double dt) {
+// super.update(dt);
+
+// position.y += dt * -500;
+
+// if (position.y < -height) {
+// removeFromParent();
+// }
+// }
+// }
\ No newline at end of file
diff --git a/lib/view/components/flappy_bird/background.dart b/lib/view/components/flappy_bird/background.dart
new file mode 100644
index 00000000..9e5275f0
--- /dev/null
+++ b/lib/view/components/flappy_bird/background.dart
@@ -0,0 +1,15 @@
+import 'package:flame/components.dart';
+import 'package:flame/flame.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+
+class Background extends SpriteComponent with HasGameRef{
+ Background();
+
+ @override
+ Future onLoad() async {
+ final background = await Flame.images.load('background.png');
+ size = gameRef.size;
+ sprite = Sprite(background);
+ }
+}
+
diff --git a/lib/view/components/flappy_bird/bird.dart b/lib/view/components/flappy_bird/bird.dart
new file mode 100644
index 00000000..fe57ba58
--- /dev/null
+++ b/lib/view/components/flappy_bird/bird.dart
@@ -0,0 +1,84 @@
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:flame/effects.dart';
+import 'package:flame_audio/flame_audio.dart';
+import 'package:flutter/widgets.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+
+enum MovingBird { middle, up, down }
+
+class Bird extends SpriteGroupComponent with HasGameRef,CollisionCallbacks {
+ Bird() : super(size: Vector2(50, 40));
+ final double velocity =210;
+ int totalScore =0;
+ @override
+ Future onLoad() async {
+ try {
+ final birdMidFlap = await gameRef.loadSprite('bird_midflap.png');
+ final birdUpFlap = await gameRef.loadSprite('bird_upflap.png');
+ final birdDownFlap = await gameRef.loadSprite('bird_downflap.png');
+
+ sprites = {
+ MovingBird.middle: birdMidFlap,
+ MovingBird.up: birdUpFlap,
+ MovingBird.down: birdDownFlap,
+ };
+
+ position = Vector2(50, gameRef.size.y / 2 - size.y / 2);
+
+
+ current = MovingBird.middle;
+ add(RectangleHitbox()); // add box around it
+
+ } catch (e) {
+ //print('Error loading sprites: $e');
+ }
+ }
+
+ @override
+ void update(double dt) {
+ super.update(dt);
+ position.y += velocity * dt;
+
+ }
+
+ void flyUp(){
+ add(
+ MoveByEffect(
+ Vector2(0, -100),
+ EffectController(
+ duration: 0.2,
+ curve: Curves.decelerate,
+ ),
+ onComplete: () => current =MovingBird.down,
+ ));
+ current = MovingBird.up;
+ //add flying sound
+ }
+
+ @override
+ void onCollisionStart(
+ Set intersectionPoints,
+ PositionComponent other,
+ ){
+ super.onCollisionStart(intersectionPoints, other);
+ gameIsOver();
+ }
+
+ void gameIsOver(){
+ FlameAudio.play('collision.wav');
+ game.collision=true;
+ gameRef.overlays.add('gameOver');
+ gameRef.pauseEngine();
+ }
+
+ void resetBirdPosition(){
+ position = Vector2(50, gameRef.size.y / 2 - size.y / 2);
+ }
+
+ void resetTotalScore(){
+ totalScore=0;
+ }
+
+}
+
diff --git a/lib/view/components/flappy_bird/floor.dart b/lib/view/components/flappy_bird/floor.dart
new file mode 100644
index 00000000..e7d8b8ee
--- /dev/null
+++ b/lib/view/components/flappy_bird/floor.dart
@@ -0,0 +1,37 @@
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:flame/flame.dart';
+import 'package:flame/parallax.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+
+class Floor extends ParallaxComponentwith HasGameRef{
+ Floor();
+ final double speed = 200;
+ final double floorHeight = 110;
+
+ @override
+ Future onLoad() async{
+ final floor = await Flame.images.load('ground.png');
+ parallax = Parallax([
+ ParallaxLayer(
+ ParallaxImage(
+ floor, fill: LayerFill.none),
+ ),
+ ]);
+
+ add(
+ //box arround object
+ RectangleHitbox(
+ position: Vector2(0, gameRef.size.y- floorHeight),
+ size: Vector2(gameRef.size.x, floorHeight),
+ ),
+ );
+ }
+
+ @override
+ void update(double dt) {
+ super.update(dt);
+ parallax?.baseVelocity.x = speed;
+ }
+}
+
diff --git a/lib/view/components/flappy_bird/pipe.dart b/lib/view/components/flappy_bird/pipe.dart
new file mode 100644
index 00000000..c9b6dd18
--- /dev/null
+++ b/lib/view/components/flappy_bird/pipe.dart
@@ -0,0 +1,40 @@
+
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:flame/flame.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+
+enum WhichPipe { top, bottom }
+class Pipe extends SpriteComponent with HasGameRef{
+ Pipe({
+ required this.pipePosition,
+ required this.height
+ });
+
+ @override
+ final double height;
+ final WhichPipe pipePosition;
+ final double floorHeight=110;
+
+ @override
+ Future onLoad() async {
+ final pipe = await Flame.images.load('pipe.png');
+ final upsideDownPipe = await Flame.images.load('pipe_rotated.png');
+ size = Vector2(50, height);
+
+ if(pipePosition== WhichPipe.top){
+ position.y = 0;
+ sprite = Sprite(upsideDownPipe);
+ }
+ else if(pipePosition== WhichPipe.bottom){
+ position.y = gameRef.size.y - size.y - floorHeight;
+ sprite = Sprite(pipe);
+ }
+
+ add(RectangleHitbox());
+
+
+ }
+}
+
+
diff --git a/lib/view/components/flappy_bird/pipe_combination.dart b/lib/view/components/flappy_bird/pipe_combination.dart
new file mode 100644
index 00000000..338da00d
--- /dev/null
+++ b/lib/view/components/flappy_bird/pipe_combination.dart
@@ -0,0 +1,53 @@
+import 'dart:math';
+import 'package:flame/components.dart';
+import 'package:flame_audio/flame_audio.dart';
+import 'package:gameonconnect/view/components/flappy_bird/pipe.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+
+class PipeCombination extends PositionComponent with HasGameRef {
+
+ final double floorHeight = 110;
+ final double speed = 200;
+ final _random = Random();
+
+ PipeCombination();
+
+ @override
+ Future onLoad() async {
+ position.x = gameRef.size.x;
+
+ final skyHeight = gameRef.size.y - floorHeight;
+ final pathHeight = 100 + _random.nextDouble() * (skyHeight / 4);
+ final centerYaxis = pathHeight + _random.nextDouble() * (skyHeight - pathHeight);
+
+ // Add top pipe
+ add(Pipe(pipePosition: WhichPipe.top, height: centerYaxis - pathHeight / 2));
+
+ // Calculate the bottom pipe height
+ final bottomPipeHeight = skyHeight - (centerYaxis + pathHeight / 2);
+
+ // Ensure the bottom pipe does not overlap the ground
+ if (bottomPipeHeight > 0 && bottomPipeHeight < skyHeight - floorHeight) {
+ add(Pipe(pipePosition: WhichPipe.bottom, height: bottomPipeHeight));
+ }
+ }
+
+ @override
+ void update(double dt) {
+ super.update(dt);
+ position.x -= speed * dt;
+
+ if (position.x < -10) {
+ removeFromParent();
+ gameRef.bird.totalScore += 1; // Increment score when the bird passes a pipe
+ FlameAudio.play('point.wav');
+ }
+
+ if (gameRef.collision) {
+ removeFromParent(); // Remove pipes from the screen on collision
+ gameRef.collision = false;
+ }
+ }
+}
+
+
\ No newline at end of file
diff --git a/lib/view/components/flappy_bird/seed.dart b/lib/view/components/flappy_bird/seed.dart
new file mode 100644
index 00000000..72b34ad4
--- /dev/null
+++ b/lib/view/components/flappy_bird/seed.dart
@@ -0,0 +1,54 @@
+import 'dart:math';
+
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:flame_audio/flame_audio.dart';
+import 'package:gameonconnect/view/components/flappy_bird/bird.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+
+class Seed extends SpriteComponent with HasGameRef,
+ CollisionCallbacks {
+ final double seedSize = 100;
+ final double fallSpeed = 100;
+
+ Seed() : super(size: Vector2(100, 100));
+
+ @override
+ Future onLoad() async {
+ sprite = await gameRef.loadSprite('pixelbean.png');
+ position = Vector2(
+ _randomXPosition(),
+ 0, // Start at the top of the screen
+ );
+ add(RectangleHitbox());
+ }
+
+
+ double _randomXPosition() {
+ return gameRef.size.x * Random().nextDouble();
+ }
+
+ @override
+ void update(double dt) {
+ super.update(dt);
+
+ // Move down the screen
+ position.y += fallSpeed * dt;
+
+ // Remove if it goes off the screen
+ if (position.y > gameRef.size.y) {
+ removeFromParent();
+ }
+ }
+
+ @override
+ void onCollision(Set intersectionPoints, PositionComponent other) {
+ super.onCollision(intersectionPoints, other);
+
+ if (other is Bird) {
+ gameRef.bird.totalScore += 2;
+ FlameAudio.play('point.wav');
+ removeFromParent();
+ }
+ }
+}
diff --git a/lib/view/pages/GameyCon/gameycon_page.dart b/lib/view/pages/GameyCon/gameycon_page.dart
new file mode 100644
index 00000000..3097eba5
--- /dev/null
+++ b/lib/view/pages/GameyCon/gameycon_page.dart
@@ -0,0 +1,74 @@
+import 'package:flutter/material.dart';
+import 'package:flame/game.dart';
+import 'package:gameonconnect/GameyCon/components/leavebutton.dart';
+import 'package:gameonconnect/GameyCon/gameycon_game.dart';
+import 'package:gameonconnect/GameyCon/components/score.dart';
+
+class GameyConPage extends StatefulWidget {
+ final String selectedCharacter;
+
+ const GameyConPage({required this.selectedCharacter, super.key});
+
+ @override
+ State createState() => _GameyConPageState();
+}
+
+class _GameyConPageState extends State {
+ late GameyCon game;
+
+ @override
+ void initState() {
+ super.initState();
+ game = GameyCon(selectedCharacter: widget.selectedCharacter);
+ }
+
+ @override
+ void dispose() {
+ game.onRemove();
+ ScoreManager().resetScore();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: Stack(
+ children: [
+ Positioned.fill(
+ child: GameWidget(
+ game: game,
+ overlayBuilderMap: {
+ 'LeaveButton': (context, game) {
+ return const Positioned(
+ top: 10,
+ left: 20,
+ child: LeaveButton(),
+ );
+ },
+ 'ScoreOverlay': (context, game) {
+ return Positioned(
+ top: 18,
+ right: 20,
+ child: ValueListenableBuilder(
+ valueListenable: ScoreManager().scoreNotifier,
+ builder: (context, score, child) {
+ return Text(
+ 'Score: $score',
+ style: TextStyle(
+ color: Theme.of(context).colorScheme.primary,
+ fontSize: 22,
+ ),
+ );
+ },
+ ),
+ );
+ },
+ },
+ initialActiveOverlays: const ['LeaveButton', 'ScoreOverlay'],
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/view/pages/GameyCon/loadingpage.dart b/lib/view/pages/GameyCon/loadingpage.dart
new file mode 100644
index 00000000..62362315
--- /dev/null
+++ b/lib/view/pages/GameyCon/loadingpage.dart
@@ -0,0 +1,187 @@
+import 'package:flutter/material.dart';
+import 'package:flame/components.dart';
+import 'package:flame/game.dart';
+import 'package:gameonconnect/GameyCon/components/leavebutton.dart';
+import 'package:gameonconnect/view/pages/GameyCon/gameycon_page.dart';
+
+class LoadingGameyConPage extends StatefulWidget {
+ const LoadingGameyConPage({super.key});
+
+ @override
+ State createState() => _LoadingGameyConPageState();
+}
+
+class _LoadingGameyConPageState extends State {
+ int selectedCharacterIndex = -1;
+
+ final List characterSprites = [
+ 'Ninja Frog',
+ 'Pink Man',
+ 'Virtual Guy',
+ 'Mask Dude',
+ ];
+
+ void selectCharacter(int index) {
+ setState(() {
+ selectedCharacterIndex = index;
+ });
+ }
+
+ void startGame() {
+ if (selectedCharacterIndex != -1) {
+ Navigator.pushReplacement(
+ context,
+ MaterialPageRoute(
+ builder: (context) => GameyConPage(
+ selectedCharacter: characterSprites[selectedCharacterIndex],
+ ),
+ ),
+ );
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ body: Stack(
+ children: [
+ Center(
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ const SizedBox(height: 100),
+ Image.asset(
+ Theme.of(context).brightness == Brightness.dark
+ ? 'assets/icons/GameOnConnect_Logo_Transparent_White.png'
+ : 'assets/icons/GameOnConnect_Logo_Transparent.png',
+ width: 100,
+ height: 100,
+ ),
+ const SizedBox(height: 20),
+ Text(
+ "Welcome to GameyCon!",
+ style: TextStyle(
+ fontSize: 32,
+ fontWeight: FontWeight.bold,
+ color: Theme.of(context).colorScheme.primary),
+ ),
+ const SizedBox(height: 20),
+ const Text(
+ 'Select a character',
+ style: TextStyle(
+ fontSize: 32,
+ fontWeight: FontWeight.bold,
+ ),
+ ),
+ const SizedBox(height: 20),
+ SizedBox(
+ height: 100,
+ child: GridView.builder(
+ gridDelegate:
+ const SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 4,
+ childAspectRatio: 1,
+ crossAxisSpacing: 5,
+ mainAxisSpacing: 5,
+ ),
+ itemCount: characterSprites.length,
+ itemBuilder: (context, index) {
+ return GestureDetector(
+ onTap: () => selectCharacter(index),
+ child: Container(
+ margin: const EdgeInsets.all(4.0),
+ decoration: BoxDecoration(
+ border: Border.all(
+ color: selectedCharacterIndex == index
+ ? Theme.of(context).colorScheme.primary
+ : Colors.transparent,
+ width: 2,
+ ),
+ ),
+ child: SpriteAnimationWidget(
+ character: characterSprites[index],
+ ),
+ ),
+ );
+ },
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 20.0),
+ child: ElevatedButton(
+ onPressed: startGame,
+ style: ElevatedButton.styleFrom(
+ padding: const EdgeInsets.symmetric(
+ horizontal: 40, vertical: 20),
+ textStyle: const TextStyle(fontSize: 20),
+ backgroundColor:
+ Theme.of(context).colorScheme.primaryContainer,
+ side: BorderSide(
+ color: Theme.of(context).colorScheme.primary,
+ width: 1,
+ ),
+ ),
+ child: const Text('Start Game'),
+ ),
+ ),
+ const SizedBox(
+ height: 225,
+ ),
+ const Text('Credits: Spellthorn (Youtube)'),
+ ],
+ ),
+ ),
+ const Positioned(
+ top: 10,
+ left: 20,
+ child: LeaveButton(),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
+class SpriteAnimationWidget extends StatelessWidget {
+ final String character;
+
+ const SpriteAnimationWidget({required this.character, super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return GameWidget(
+ game: SpriteAnimationGame(character: character),
+ );
+ }
+}
+
+class SpriteAnimationGame extends FlameGame {
+ final String character;
+
+ SpriteAnimationGame({required this.character});
+
+ @override
+ Future onLoad() async {
+ final animation = await _loadAnimation(character);
+ add(
+ SpriteAnimationComponent(
+ animation: animation,
+ size: Vector2(50, 50),
+ position: size / 2 - Vector2(25, 25),
+ ),
+ );
+ }
+
+ Future _loadAnimation(String character) async {
+ final spriteSheet =
+ await images.load('Main Characters/$character/Idle (32x32).png');
+ return SpriteAnimation.fromFrameData(
+ spriteSheet,
+ SpriteAnimationData.sequenced(
+ amount: 11,
+ stepTime: 0.1,
+ textureSize: Vector2(32, 32),
+ ),
+ );
+ }
+}
diff --git a/lib/view/pages/badges/achievement_badges.dart b/lib/view/pages/badges/achievement_badges.dart
new file mode 100644
index 00000000..0b7ff026
--- /dev/null
+++ b/lib/view/pages/badges/achievement_badges.dart
@@ -0,0 +1,103 @@
+import 'package:flutter/material.dart';
+import 'package:gameonconnect/view/pages/models/specific_badge_page.dart';
+
+class AchievementBadgesPage extends StatefulWidget {
+ const AchievementBadgesPage({super.key});
+
+ @override
+ State createState() => _AchievementBadgesPageState();
+}
+
+class _AchievementBadgesPageState extends State {
+ //this is temporary
+ List badges = [
+ 'Loyalty',
+ 'Gamer',
+ 'Night Owl',
+ 'Newbie',
+ 'Explorer',
+ 'Event Planner',
+ 'Customizer',
+ 'Collector',
+ 'Achiever',
+ 'Social Butterfly'
+ ];
+
+ List badgeFiles = [
+ 'loyalty_badge',
+ 'gamer_badge',
+ 'night_owl_badge',
+ 'newbie_badge',
+ 'explorer_badge',
+ 'event_planner_badge',
+ 'customizer_badge',
+ 'collector_badge',
+ 'achiever_badge',
+ 'social_butterfly_badge'
+ ];
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('My Badges'),
+ ),
+ body: Padding(
+ padding: const EdgeInsets.all(12),
+ child: GridView.builder(
+ gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+ crossAxisCount: 2,
+ crossAxisSpacing: 20,
+ mainAxisSpacing: 20,
+ ),
+ itemCount: badges.length,
+ itemBuilder: (context, index) {
+ return GestureDetector(
+ onTap: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(builder: (context) => SpecificBadgePage(badgeName: badges[index] ,badgeFileName: badgeFiles[index])),
+ );
+ },
+ child: Container(
+ decoration: BoxDecoration(
+ color: Theme.of(context).colorScheme.primaryContainer,
+ borderRadius: BorderRadius.circular(15),
+ ),
+ child: Center(
+ child: Column(
+ children: [
+ Expanded(
+ child: Image.asset(
+ 'assets/badges_images/${badgeFiles[index]}.png',
+ height: 85,
+ width: 85,
+ fit: BoxFit.contain)),
+ Padding(
+ padding: const EdgeInsets.only(top: 9),
+ child: Text(
+ "${badges[index]} Badge",
+ style: const TextStyle(
+ color: Colors.white,
+ fontSize: 14,
+ fontWeight: FontWeight.bold),
+ ),
+ ),
+ const Padding(
+ padding: EdgeInsets.all(9),
+ child: Text(
+ "2024/01/02",
+ style: TextStyle(color: Colors.grey, fontSize: 12),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ },
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/view/pages/connections/connections_search_page.dart b/lib/view/pages/connections/connections_search_page.dart
index 53c48fb6..7a4d43c0 100644
--- a/lib/view/pages/connections/connections_search_page.dart
+++ b/lib/view/pages/connections/connections_search_page.dart
@@ -181,7 +181,7 @@ class FriendSearchState extends State {
uniqueNum: i.uniqueNum.toString(),
uid: i.uid,
page: 'search',
- loggedInUser: i.uid,
+ loggedInUser: _currentUserId,
isOwnProfile: true,
onSelected: (uid, selected) {});
},
diff --git a/lib/view/pages/flappy_bird/flappy_bird.dart b/lib/view/pages/flappy_bird/flappy_bird.dart
new file mode 100644
index 00000000..35906d52
--- /dev/null
+++ b/lib/view/pages/flappy_bird/flappy_bird.dart
@@ -0,0 +1,66 @@
+import 'dart:async';
+import 'package:flame/components.dart';
+import 'package:flutter/material.dart';
+import 'package:flame/events.dart';
+import 'package:flame/game.dart';
+import 'package:gameonconnect/view/components/flappy_bird/background.dart';
+import 'package:gameonconnect/view/components/flappy_bird/bird.dart';
+import 'package:gameonconnect/view/components/flappy_bird/floor.dart';
+import 'package:gameonconnect/view/components/flappy_bird/pipe_combination.dart';
+import 'package:gameonconnect/view/components/flappy_bird/seed.dart';
+
+class FlappyBird extends FlameGame with TapDetector,HasCollisionDetection{
+
+
+ late Bird bird;
+ Timer pipetimeInverval= Timer(1.5 , repeat:true);
+ Timer seedTimer = Timer(3.0, repeat: true); // Timer to spawn seeds
+ bool collision=false;
+ late TextComponent score;
+
+ @override
+ Future onLoad() async {
+ addAll([
+ Background(),
+ Floor(),
+ bird = Bird(),
+ score = displayScore(),
+ ]);
+
+
+ pipetimeInverval.onTick = () => add(PipeCombination());
+ seedTimer.onTick = () => add(Seed()); // Add seeds periodically
+ }
+
+ @override
+ void update(double dt) {
+ super.update(dt);
+ pipetimeInverval.update(dt);
+ seedTimer.update(dt); // Update the seed timer
+ score.text = 'Score : ${bird.totalScore}';
+ }
+
+ @override
+ void onTap(){
+ super.onTap();
+ bird.flyUp();
+ }
+
+ TextComponent displayScore(){
+ return TextComponent(
+ text:'Score : 0',
+ position: Vector2(size.x/2, size.y/2* 0.1),
+ anchor: Anchor.center,
+ textRenderer: TextPaint(
+ style: const TextStyle(
+ fontSize: 40,
+ fontFamily: 'ThaleahFat',
+ //fontWeight: FontWeight.bold),
+ color: Colors.white,
+ ),
+ )
+ );
+ }
+}
+
+
\ No newline at end of file
diff --git a/lib/view/pages/flappy_bird/game_over_screen.dart b/lib/view/pages/flappy_bird/game_over_screen.dart
new file mode 100644
index 00000000..881e7f3b
--- /dev/null
+++ b/lib/view/pages/flappy_bird/game_over_screen.dart
@@ -0,0 +1,85 @@
+import 'package:flutter/material.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+
+class GameOverScreen extends StatelessWidget {
+
+ const GameOverScreen({super.key, required this.game});
+ final FlappyBird game;
+ static const String id ='gameOver';
+
+ @override
+ Widget build(BuildContext context) => Material(
+ color: Colors.black38,
+ child: Center(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Text(
+ 'Score : ${game.bird.totalScore}',
+ style: const TextStyle(
+ fontSize: 60,
+ color: Colors.white,
+ fontFamily: 'ThaleahFat',
+ ),
+ ),
+ const SizedBox(height: 17),
+ //Image.asset('assets/images/gameover.png'),
+ Stack(
+ children: [
+ // Border text
+ Text(
+ 'Game Over',
+ style: TextStyle(
+ fontSize: 60,
+ fontFamily: 'ThaleahFat',
+ foreground: Paint()
+ ..style = PaintingStyle.stroke
+ ..strokeWidth = 6
+ ..color = Colors.white,
+ ),
+ ),
+ // Solid text
+ const Text(
+ 'Game Over',
+ style: TextStyle(
+ fontSize: 60,
+ color: Colors.orange,
+ fontFamily: 'ThaleahFat',
+ ),
+ ),
+ ],
+ ),
+
+ const SizedBox(height: 20),
+ ElevatedButton(
+ onPressed: restart,
+ style: ElevatedButton.styleFrom(
+ backgroundColor: Colors.orange,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(10),
+ ),
+ ),
+ child: const Padding(
+ padding: EdgeInsets.fromLTRB(12, 12, 12, 12),
+ child: Text(
+ 'Restart',
+ style: TextStyle(
+ fontSize: 25,
+ color: Colors.white,
+ ),
+ ),
+ ),
+
+ )
+ ],
+ ),
+ ),
+ );
+
+ void restart() {
+ game.bird.resetBirdPosition();
+ game.bird.resetTotalScore();
+ game.overlays.remove('gameOver');
+ game.resumeEngine();
+ }
+}
diff --git a/lib/view/pages/flappy_bird/game_screen_page.dart b/lib/view/pages/flappy_bird/game_screen_page.dart
new file mode 100644
index 00000000..aa698a3f
--- /dev/null
+++ b/lib/view/pages/flappy_bird/game_screen_page.dart
@@ -0,0 +1,29 @@
+import 'package:flame/game.dart';
+import 'package:flutter/material.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/game_over_screen.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/start_game_screen.dart';
+
+class GameScreen extends StatelessWidget {
+ const GameScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final game = FlappyBird();
+ return Scaffold(
+ body: GameWidget(
+ game: game,
+ initialActiveOverlays: const [StartScreen.id],
+ overlayBuilderMap: {
+ 'start' : (context,_)=> StartScreen(
+ game: game,
+ ),
+ 'gameOver' : (context,_)=> GameOverScreen(
+ game: game,
+ ),
+ },
+
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/view/pages/flappy_bird/start_game_screen.dart b/lib/view/pages/flappy_bird/start_game_screen.dart
new file mode 100644
index 00000000..849e8133
--- /dev/null
+++ b/lib/view/pages/flappy_bird/start_game_screen.dart
@@ -0,0 +1,38 @@
+import 'package:flutter/material.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/flappy_bird.dart';
+
+class StartScreen extends StatelessWidget {
+
+ const StartScreen({
+ super.key,
+ required this.game,
+ });
+
+ final FlappyBird game;
+ static const String id = 'start';
+
+ @override
+ Widget build(BuildContext context) {
+ game.pauseEngine();
+
+ return Scaffold(
+ body:GestureDetector(
+ onTap: () {
+ game.overlays.remove('start');
+ game.resumeEngine();
+ },
+ child: Container(
+ width: double.infinity,
+ height: double.infinity,
+ decoration: const BoxDecoration(
+ image: DecorationImage(
+ image: AssetImage('assets/images/menu.jpg'),
+ fit: BoxFit.cover,
+ ),
+ ),
+ child: Image.asset('assets/images/message.png'),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/view/pages/home/home_page.dart b/lib/view/pages/home/home_page.dart
index 56eaf268..97329e6c 100644
--- a/lib/view/pages/home/home_page.dart
+++ b/lib/view/pages/home/home_page.dart
@@ -3,6 +3,7 @@ import 'dart:io';
import 'package:delightful_toast/delight_toast.dart';
import 'package:delightful_toast/toast/utils/enums.dart';
import 'package:firebase_auth/firebase_auth.dart';
+import 'package:flame/flame.dart';
import 'package:flutter/material.dart';
import 'package:gameonconnect/services/profile_S/profile_service.dart';
import 'package:gameonconnect/view/components/card/custom_toast_card.dart';
@@ -10,15 +11,18 @@ import 'package:gameonconnect/view/components/home/connection_updates.dart';
import 'package:gameonconnect/view/components/home/event_invite_list.dart';
import 'package:gameonconnect/view/components/home/online_friends_list.dart';
import 'package:gameonconnect/view/components/home/start_timer.dart';
+import 'package:gameonconnect/view/pages/badges/achievement_badges.dart';
+import 'package:gameonconnect/view/pages/GameyCon/loadingpage.dart';
+import 'package:gameonconnect/view/pages/flappy_bird/game_screen_page.dart';
import 'package:gameonconnect/view/pages/game_library/game_library_page.dart';
import 'package:gameonconnect/view/pages/messaging/messaging_page.dart';
-import 'package:gameonconnect/view/pages/models/mountain_badge_page.dart';
import 'package:gameonconnect/view/pages/profile/profile_page.dart';
import 'package:gameonconnect/view/pages/events/create_events_page.dart';
import 'package:internet_connection_checker_plus/internet_connection_checker_plus.dart';
// import 'package:gameonconnect/view/pages/events/events_page.dart';
// import 'package:gameonconnect/services/messaging_S/messaging_service.dart';
import 'package:gameonconnect/view/pages/events/view_events_page.dart';
+import 'package:gameonconnect/view/pages/space_shooter_game/game_page.dart';
class HomePage extends StatefulWidget {
final String title;
@@ -41,6 +45,7 @@ class _HomePageState extends State {
late String currentUserId; // Declare currentUserId here
late List _pages; // Declare _pages as late
+
@override
void initState() {
@@ -409,7 +414,7 @@ class _HomePageDisplayState extends State<_HomePageDisplay> {
Navigator.push(
context,
MaterialPageRoute(
- builder: (context) => const MountainBadgePage(),
+ builder: (context) => const AchievementBadgesPage(),
),
);
},
@@ -419,6 +424,63 @@ class _HomePageDisplayState extends State<_HomePageDisplay> {
),
),
),
+ Padding(
+
+ padding: const EdgeInsets.only(right: 20.0,top: 16.0),
+
+ child: IconButton(
+ onPressed: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => GamePage(), //GameWidget(game: SpaceShooterGame())
+ ),
+ );
+ },
+ icon: Icon(
+ Icons.sports_score,
+ color: Theme.of(context).colorScheme.primary,
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(right: 20.0,top: 16.0),
+ child: IconButton(
+ onPressed: () {
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => GameScreen()
+ ),
+ );
+ },
+ icon: Icon(
+ Icons.flutter_dash,
+ color: Theme.of(context).colorScheme.primary,
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(right: 20.0,top: 16.0),
+ child: IconButton(
+ onPressed: () async {
+ await Flame.device.fullScreen();
+ if (!context.mounted) return;
+ Navigator.push(
+ context,
+ MaterialPageRoute(
+ builder: (context) => const LoadingGameyConPage(),
+ ),
+ );
+ },
+ icon: Icon(
+
+ Icons.games_outlined,
+
+ color: Theme.of(context).colorScheme.primary,
+ ),
+ ),
+ ),
],
centerTitle: false,
elevation: 0,
diff --git a/lib/view/pages/models/mountain_badge_page.dart b/lib/view/pages/models/mountain_badge_page.dart
deleted file mode 100644
index a1b62d74..00000000
--- a/lib/view/pages/models/mountain_badge_page.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:model_viewer_plus/model_viewer_plus.dart';
-
-class MountainBadgePage extends StatefulWidget {
- const MountainBadgePage({super.key});
-
- @override
- State createState() => _MountainBadgePageState();
-}
-
-class _MountainBadgePageState extends State {
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- title: const Text('Mountain Badge'),
- ),
- body: const Center(
- child: ModelViewer(
- src: 'assets/models/mountain_badge.glb',
- alt: 'A 3D model of a mountain badge',
- autoRotate: true,
- cameraControls: true,
- ),
- ),
- );
- }
-}
diff --git a/lib/view/pages/models/specific_badge_page.dart b/lib/view/pages/models/specific_badge_page.dart
new file mode 100644
index 00000000..d2d63664
--- /dev/null
+++ b/lib/view/pages/models/specific_badge_page.dart
@@ -0,0 +1,37 @@
+import 'package:flutter/material.dart';
+import 'package:model_viewer_plus/model_viewer_plus.dart';
+
+class SpecificBadgePage extends StatefulWidget {
+ final String badgeFileName;
+ final String badgeName;
+ const SpecificBadgePage({super.key, required this.badgeFileName, required this.badgeName});
+
+ @override
+ State createState() => _SpecificBadgePageState();
+}
+
+class _SpecificBadgePageState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('Badges'),
+ ),
+ body: Column(
+ children: [
+ Expanded(
+ child: ModelViewer(
+ disablePan: true,
+ disableZoom: true,
+ src: 'assets/models/${widget.badgeFileName}.glb',
+ alt: 'A 3D model of a badge',
+ autoRotate: true,
+ cameraControls: true,
+ ),
+ ),
+ Text(widget.badgeName, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 24))
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/view/pages/space_shooter_game/game_page.dart b/lib/view/pages/space_shooter_game/game_page.dart
new file mode 100644
index 00000000..a425c34d
--- /dev/null
+++ b/lib/view/pages/space_shooter_game/game_page.dart
@@ -0,0 +1,111 @@
+import 'package:flutter/material.dart';
+import 'package:flame/game.dart';
+import 'package:gameonconnect/view/pages/space_shooter_game/space_shooter_game.dart';
+
+class GamePage extends StatelessWidget {
+ const GamePage({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return GameWidget(
+ game: SpaceShooterGame(),
+ overlayBuilderMap: {
+ 'quitButton': (BuildContext context, SpaceShooterGame game) {
+ return Positioned(
+ top: 20,
+ right: 20,
+ child: IconButton(
+ icon: const Icon(Icons.exit_to_app, color: Colors.grey, size: 30),
+ onPressed: () {
+ Navigator.pop(context); // This will exit the game and return to the previous screen
+ },
+ ),
+ );
+ },
+ 'gameOver': (BuildContext context, SpaceShooterGame game) {
+ return Center(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Padding(
+ padding: const EdgeInsets.fromLTRB(20, 40, 20, 20),
+ child: Text(
+ 'Game Over',
+ style: TextStyle(
+ color: Theme.of(context).colorScheme.primary,
+ fontSize: 48,
+ fontWeight: FontWeight.bold,
+ decoration: TextDecoration.none,
+ ),
+ ),
+ ),
+ ElevatedButton(
+ onPressed: () {
+ Navigator.pop(context); // Navigate back to the home page
+ },
+ child: const Text('Go to Home'),
+ ),
+ const SizedBox(height: 20),
+ ElevatedButton(
+ onPressed: () {
+ game.overlays.remove('gameOver'); // Remove the game over overlay
+ game.reset(); // Restart the game by resetting its state
+ },
+ child: const Text('Restart Game'),
+ ),
+ const SizedBox(height: 20),
+ // const ScoreOverlay(isGameOver: true),
+ ],
+ )
+ );
+ },
+ 'scoreOverlay': (BuildContext context, SpaceShooterGame game) {
+ // Show score during the game
+ return const Positioned(
+ top: 20, // Initial position at the top when the game is not over
+ left: 20,
+ child: ScoreOverlay(isGameOver: false),
+ );
+ },
+ },
+ initialActiveOverlays: const ['quitButton', 'scoreOverlay'], // Display the quit button when the game starts
+ );
+ }
+}
+
+class ScoreOverlay extends StatelessWidget {
+ final bool isGameOver;
+
+ const ScoreOverlay({super.key, required this.isGameOver});
+
+ @override
+ Widget build(BuildContext context) {
+ final game = context.findAncestorWidgetOfExactType>()?.game;
+ final primaryColor = Theme.of(context).colorScheme.primary;
+
+ return StreamBuilder(
+ stream: Stream.periodic(const Duration(milliseconds: 100))
+ .asyncMap((_) => game?.score ?? 0),
+ builder: (context, snapshot) {
+ return Center(
+ child: Container(
+ padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
+ decoration: BoxDecoration(
+ border: Border.all(color: primaryColor, width: 3), // Border color
+ borderRadius: BorderRadius.circular(10),
+ ),
+ child: Text(
+ 'Score: ${snapshot.data ?? 0}',
+ style: TextStyle(
+ color: primaryColor, // Text color
+ fontSize: 18,
+ fontWeight: FontWeight.bold,
+ decoration: TextDecoration.none,
+ ),
+ ),
+ ),
+ );
+ },
+ );
+ }
+}
diff --git a/lib/view/pages/space_shooter_game/space_shooter_game.dart b/lib/view/pages/space_shooter_game/space_shooter_game.dart
new file mode 100644
index 00000000..57e344b7
--- /dev/null
+++ b/lib/view/pages/space_shooter_game/space_shooter_game.dart
@@ -0,0 +1,444 @@
+import 'package:flame/collisions.dart';
+import 'package:flame/components.dart';
+import 'package:flame/events.dart';
+import 'package:flame/experimental.dart';
+import 'package:flame/game.dart';
+import 'package:flame/input.dart';
+import 'package:flame/parallax.dart';
+import 'package:flutter/material.dart';
+
+class SpaceShooterGame extends FlameGame
+ with PanDetector, HasCollisionDetection {
+ late Player player;
+ bool isGameOver = false;
+ int score = 0;
+ double timeElapsed = 0;
+ double difficultyLevel = 1;
+ bool enemiesShoot = false;
+
+ @override
+ Future onLoad() async {
+ await initializeGame();
+
+ overlays.add('quitButton');
+
+ overlays.add('scoreOverlay');
+ }
+
+ Future initializeGame() async {
+ // Load parallax background
+ final parallax = await loadParallaxComponent(
+ [
+ ParallaxImageData('stars_2.png'),
+ ParallaxImageData('stars_1.png'),
+ ParallaxImageData('stars_0.png'),
+ ],
+ baseVelocity: Vector2(0, -5),
+ repeat: ImageRepeat.repeat,
+ velocityMultiplierDelta: Vector2(0, 5),
+ );
+ add(parallax);
+
+ // Add player to the game
+ player = Player();
+ add(player);
+
+ // Spawn enemies
+ add(
+ SpawnComponent(
+ factory: (index) {
+ return Enemy();
+ },
+ period: 1,
+ area: Rectangle.fromLTWH(0, 0, size.x, -Enemy.enemySize),
+ ),
+ );
+ }
+
+ @override
+ void onPanUpdate(DragUpdateInfo info) {
+ player.move(info.delta.global);
+ }
+
+ @override
+ void onPanStart(DragStartInfo info) {
+ player.startShooting();
+ }
+
+ @override
+ void onPanEnd(DragEndInfo info) {
+ player.stopShooting();
+ }
+
+ void triggerGameOver() {
+ isGameOver = true;
+ overlays.remove('scoreOverlay');
+ overlays.remove('quitButton');
+ overlays.add('gameOver');
+ }
+
+ void reset() {
+ removeAll(children);
+ score = 0;
+ isGameOver = false;
+ initializeGame();
+ overlays.remove('gameOver');
+ overlays.add('scoreOverlay');
+ overlays.add('quitButton');
+ }
+
+ void incrementScore() {
+ score++;
+ overlays
+ ..remove('scoreOverlay')
+ ..add('scoreOverlay');
+ }
+
+ @override
+void update(double dt) {
+ super.update(dt);
+
+ // Track time elapsed
+ if (!isGameOver) {
+ timeElapsed += dt;
+
+ // Increase difficulty after every 30 seconds
+ if (timeElapsed > 30 * difficultyLevel) {
+ difficultyLevel++;
+ increaseDifficulty();
+ }
+
+ // After 1 minute, enemies will start shooting
+ if (timeElapsed > 60 && !enemiesShoot) {
+ enemiesShoot = true;
+ }
+ }
+}
+
+void increaseDifficulty() {
+ // Increase the speed of enemies
+ children.whereType().forEach((enemy) {
+ enemy.increaseSpeed(difficultyLevel);
+ });
+}
+
+}
+
+class Player extends SpriteAnimationComponent
+ with HasGameReference, CollisionCallbacks {
+ Player()
+ : super(
+ size: Vector2(110, 120), //size: Vector2(120, 130), frigate
+ anchor: Anchor.center,
+ );
+
+ late final SpawnComponent _bulletSpawner;
+
+ @override
+ Future onLoad() async {
+ await super.onLoad();
+
+ // animation = await game.loadSpriteAnimation(
+ // 'Battlecruiser.png',
+ // SpriteAnimationData.sequenced(
+ // amount: 30,
+ // stepTime: .2,
+ // textureSize: Vector2(128, 128),
+ // ),
+ // );
+
+ animation = await game.loadSpriteAnimation(
+ 'Frigate.png',
+ SpriteAnimationData.sequenced(
+ amount: 6,
+ stepTime: .2,
+ textureSize: Vector2(64, 64),
+ ),
+ );
+
+ position = game.size / 2;
+
+ _bulletSpawner = SpawnComponent(
+ period: .2,
+ selfPositioning: true,
+ factory: (index) {
+ return Bullet(
+ position: position +
+ Vector2(
+ 0,
+ -height / 2,
+ ),
+ );
+
+ },
+ autoStart: false,
+ );
+
+ game.add(_bulletSpawner);
+
+ add(RectangleHitbox.relative(
+ Vector2(0.3, 0.3),
+ parentSize: size,
+ ));
+ }
+
+ void move(Vector2 delta) {
+ position.add(delta);
+ }
+
+ void startShooting() {
+ _bulletSpawner.timer.start();
+ }
+
+ void stopShooting() {
+ _bulletSpawner.timer.stop();
+ }
+
+ @override
+ void onCollisionStart(
+ Set intersectionPoints,
+ PositionComponent other,
+ ) {
+ super.onCollisionStart(intersectionPoints, other);
+
+ if (other is Enemy) {
+ removeFromParent();
+ other.removeFromParent();
+ game.add(PlayerExplosion(position: position));
+
+ game.overlays.add('gameOver');
+ }
+ }
+}
+
+class Bullet extends SpriteAnimationComponent
+ with HasGameReference {
+ Bullet({
+ super.position,
+ }) : super(
+ size: Vector2(25, 50),
+ anchor: Anchor.center,
+ );
+
+ @override
+ Future onLoad() async {
+ await super.onLoad();
+
+ animation = await game.loadSpriteAnimation(
+ 'bullet.png',
+ SpriteAnimationData.sequenced(
+ amount: 2,
+ stepTime: .2,
+ textureSize: Vector2(8, 8),
+ ),
+ );
+
+ // add(
+ // RectangleHitbox(
+ // collisionType: CollisionType.passive,
+ // ),
+ // );
+ add(RectangleHitbox.relative(
+ Vector2(0.5, 0.5),
+ parentSize: size,
+ collisionType: CollisionType.passive,
+ ));
+
+ }
+
+ @override
+ void update(double dt) {
+ super.update(dt);
+
+ position.y += dt * -500;
+
+ if (position.y < -height) {
+ removeFromParent();
+ }
+ }
+}
+
+class Enemy extends SpriteAnimationComponent
+ with HasGameReference, CollisionCallbacks {
+ Enemy({
+ super.position,
+ }) : super(
+ size: Vector2.all(enemySize),
+ anchor: Anchor.center,
+ );
+
+ double speed = 250;
+ double shootTimer = 0;
+
+ static const enemySize = 100.0;
+
+ @override
+ Future onLoad() async {
+ await super.onLoad();
+
+ animation = await game.loadSpriteAnimation(
+ 'Scout.png',
+ SpriteAnimationData.sequenced(
+ amount: 6,
+ stepTime: .2,
+ textureSize: Vector2.all(64),
+ ),
+ );
+
+ add(RectangleHitbox.relative(
+ Vector2(0.5, 0.5),
+ parentSize: size,
+ ));
+
+ }
+
+ @override
+ void update(double dt) {
+ super.update(dt);
+
+ position.y += dt * 250;
+
+ if (position.y > game.size.y) {
+ removeFromParent();
+ }
+
+ // Enemy shooting logic
+ if (game.enemiesShoot) {
+ shootTimer += dt;
+ if (shootTimer > 2) {
+ shoot();
+ shootTimer = 0;
+ }
+ }
+ }
+
+ void increaseSpeed(double difficultyLevel) {
+ speed = 250 * difficultyLevel;
+ }
+
+ void shoot() {
+ game.add(EnemyBullet(position: position + Vector2(0, height / 2)));
+ }
+
+ @override
+ void onCollisionStart(
+ Set intersectionPoints,
+ PositionComponent other,
+ ) {
+ super.onCollisionStart(intersectionPoints, other);
+
+ if (other is Bullet) {
+ removeFromParent();
+ other.removeFromParent();
+ game.incrementScore();
+ game.add(EnemyExplosion(position: position));
+ }
+ }
+}
+
+class EnemyBullet extends SpriteAnimationComponent
+ with HasGameReference, CollisionCallbacks {
+ EnemyBullet({
+ super.position,
+ }) : super(
+ size: Vector2(15, 30),
+ anchor: Anchor.center,
+ );
+
+ @override
+ Future onLoad() async {
+ await super.onLoad();
+
+ animation = await game.loadSpriteAnimation(
+ 'bullet.png',
+ SpriteAnimationData.sequenced(
+ amount: 2,
+ stepTime: .2,
+ textureSize: Vector2(8, 8),
+ ),
+ );
+
+ add(RectangleHitbox.relative(
+ Vector2(0.5, 0.5),
+ parentSize: size,
+ collisionType: CollisionType.passive,
+ ));
+ }
+
+ @override
+ void update(double dt) {
+ super.update(dt);
+
+ position.y += dt * 300; // Move bullet down
+
+ if (position.y > game.size.y) {
+ removeFromParent();
+ }
+ }
+
+ @override
+ void onCollisionStart(
+ Set intersectionPoints,
+ PositionComponent other,
+ ) {
+ super.onCollisionStart(intersectionPoints, other);
+
+ if (other is Player) {
+ other.removeFromParent();
+ game.triggerGameOver(); // End game when player is hit by an enemy bullet
+ }
+ }
+}
+
+
+class EnemyExplosion extends SpriteAnimationComponent
+ with HasGameReference {
+ EnemyExplosion({
+ super.position,
+ }) : super(
+ size: Vector2.all(100),
+ anchor: Anchor.center,
+ removeOnFinish: true,
+ );
+
+ @override
+ Future onLoad() async {
+ await super.onLoad();
+
+ animation = await game.loadSpriteAnimation(
+ 'Scout_Destruction.png',
+ SpriteAnimationData.sequenced(
+ amount: 10,
+ stepTime: .1,
+ textureSize: Vector2.all(64),
+ loop: false,
+ ),
+ );
+ }
+}
+
+class PlayerExplosion extends SpriteAnimationComponent
+ with HasGameReference {
+ PlayerExplosion({
+ super.position,
+ }) : super(
+ size: Vector2(120, 130),
+ anchor: Anchor.center,
+ removeOnFinish: true,
+ );
+
+ @override
+ Future onLoad() async {
+ await super.onLoad();
+
+ animation = await game.loadSpriteAnimation(
+ 'Frigate_Destruction.png',
+ SpriteAnimationData.sequenced(
+ amount: 9,
+ stepTime: .2,
+ textureSize: Vector2.all(64),
+ loop: false,
+ ),
+ );
+ }
+}
diff --git a/pubspec.lock b/pubspec.lock
index b156ee33..da8da5db 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -5,10 +5,10 @@ packages:
dependency: transitive
description:
name: _flutterfire_internals
- sha256: "9371d13b8ee442e3bfc08a24e3a1b3742c839abbfaf5eef11b79c4b862c89bf7"
+ sha256: ddc6f775260b89176d329dee26f88b9469ef46aa3228ff6a0b91caf2b2989692
url: "https://pub.dev"
source: hosted
- version: "1.3.41"
+ version: "1.3.42"
android_intent_plus:
dependency: transitive
description:
@@ -41,6 +41,62 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.11.0"
+ audioplayers:
+ dependency: transitive
+ description:
+ name: audioplayers
+ sha256: c346ba5a39dc208f1bab55fc239855f573d69b0e832402114bf0b793622adc4d
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.0"
+ audioplayers_android:
+ dependency: transitive
+ description:
+ name: audioplayers_android
+ sha256: de576b890befe27175c2f511ba8b742bec83765fa97c3ce4282bba46212f58e4
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.0.0"
+ audioplayers_darwin:
+ dependency: transitive
+ description:
+ name: audioplayers_darwin
+ sha256: e507887f3ff18d8e5a10a668d7bedc28206b12e10b98347797257c6ae1019c3b
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.0.0"
+ audioplayers_linux:
+ dependency: transitive
+ description:
+ name: audioplayers_linux
+ sha256: "3d3d244c90436115417f170426ce768856d8fe4dfc5ed66a049d2890acfa82f9"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.0"
+ audioplayers_platform_interface:
+ dependency: transitive
+ description:
+ name: audioplayers_platform_interface
+ sha256: "6834dd48dfb7bc6c2404998ebdd161f79cd3774a7e6779e1348d54a3bfdcfaa5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "7.0.0"
+ audioplayers_web:
+ dependency: transitive
+ description:
+ name: audioplayers_web
+ sha256: "3609bdf0e05e66a3d9750ee40b1e37f2a622c4edb796cc600b53a90a30a2ace4"
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.0.1"
+ audioplayers_windows:
+ dependency: transitive
+ description:
+ name: audioplayers_windows
+ sha256: "8605762dddba992138d476f6a0c3afd9df30ac5b96039929063eceed416795c2"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.0"
auto_size_text:
dependency: "direct main"
description:
@@ -69,10 +125,10 @@ packages:
dependency: "direct main"
description:
name: cached_network_image
- sha256: "4a5d8d2c728b0f3d0245f69f921d7be90cae4c2fd5288f773088672c0893f819"
+ sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916"
url: "https://pub.dev"
source: hosted
- version: "3.4.0"
+ version: "3.4.1"
cached_network_image_platform_interface:
dependency: transitive
description:
@@ -85,10 +141,10 @@ packages:
dependency: transitive
description:
name: cached_network_image_web
- sha256: "6322dde7a5ad92202e64df659241104a43db20ed594c41ca18de1014598d7996"
+ sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062"
url: "https://pub.dev"
source: hosted
- version: "1.3.0"
+ version: "1.3.1"
carousel_slider:
dependency: "direct main"
description:
@@ -117,10 +173,10 @@ packages:
dependency: "direct main"
description:
name: chewie
- sha256: "2243e41e79e865d426d9dd9c1a9624aa33c4ad11de2d0cd680f826e2cd30e879"
+ sha256: "335df378c025588aef400c704bd71f0daea479d4cd57c471c88c056c1144e7cd"
url: "https://pub.dev"
source: hosted
- version: "1.8.3"
+ version: "1.8.5"
cli_util:
dependency: transitive
description:
@@ -141,26 +197,26 @@ packages:
dependency: "direct main"
description:
name: cloud_firestore
- sha256: "77ac40d66a0fd585ca1e80ef3cbfd9df34462103bd4c1cf5950cb7d1f4c2e188"
+ sha256: faa61fd92d775d2277a112ba1a515bc24b5e4b82399562b781e20271fd288559
url: "https://pub.dev"
source: hosted
- version: "5.3.0"
+ version: "5.4.1"
cloud_firestore_platform_interface:
dependency: transitive
description:
name: cloud_firestore_platform_interface
- sha256: da0fa07284bc845b4a517449365eac0346a084676b3ed399f75a0ed25c3ec4c8
+ sha256: "13f516263a1b2b51491f4089173d3d78b577db5bb3c235832704218720ea6328"
url: "https://pub.dev"
source: hosted
- version: "6.3.2"
+ version: "6.4.1"
cloud_firestore_web:
dependency: transitive
description:
name: cloud_firestore_web
- sha256: "98dca6f864141cd3f79cf42a036f45233b8e2a3940b0011e6a370dd2283c45db"
+ sha256: "34665625a9bf2be3ca8a198a7a184030ca623163a7383171d941604223a9bf17"
url: "https://pub.dev"
source: hosted
- version: "4.1.2"
+ version: "4.3.0"
collection:
dependency: transitive
description:
@@ -189,10 +245,10 @@ packages:
dependency: "direct dev"
description:
name: coverage
- sha256: "7b594a150942e0d3be99cd45a1d0b5caff27ba5a27f292ed8e8d904ba3f167b5"
+ sha256: c1fb2dce3c0085f39dc72668e85f8e0210ec7de05345821ff58530567df345a5
url: "https://pub.dev"
source: hosted
- version: "1.9.1"
+ version: "1.9.2"
cross_file:
dependency: transitive
description:
@@ -293,10 +349,10 @@ packages:
dependency: "direct main"
description:
name: file_picker
- sha256: "825aec673606875c33cd8d3c4083f1a3c3999015a84178b317b7ef396b7384f3"
+ sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12"
url: "https://pub.dev"
source: hosted
- version: "8.0.7"
+ version: "8.1.2"
file_selector_linux:
dependency: transitive
description:
@@ -333,58 +389,58 @@ packages:
dependency: "direct main"
description:
name: firebase_app_check
- sha256: c4a49a32573aca1de6d0beee4f122a8389d5e02aa8dddfdbef249105fe12a430
+ sha256: "833721ad74dad0132d7ac207fdee356adde9086c3b637b54a30281e8a7451b63"
url: "https://pub.dev"
source: hosted
- version: "0.3.0+5"
+ version: "0.3.1+1"
firebase_app_check_platform_interface:
dependency: transitive
description:
name: firebase_app_check_platform_interface
- sha256: "243232c27a498a2cf3980d6b51ac9687a3a8a87ec2a9c657c199b0602795c3b6"
+ sha256: "509e5aa7c1615109b0af060b588bdbc04a6ea5411264aa11c6ab950a0af2b200"
url: "https://pub.dev"
source: hosted
- version: "0.1.0+35"
+ version: "0.1.0+36"
firebase_app_check_web:
dependency: transitive
description:
name: firebase_app_check_web
- sha256: "489688f4f465136997dfabb08eb900af42ce7b45649b5ac00969d1b6a80ec451"
+ sha256: "056d33f16d6ef09c9704eecb9ce18902f58bba2ea3470a888727a055c65b92b7"
url: "https://pub.dev"
source: hosted
- version: "0.1.2+13"
+ version: "0.1.3"
firebase_auth:
dependency: "direct main"
description:
name: firebase_auth
- sha256: "6f5792bdc208416bfdfbfe3363b78ce01667b6ebc4c5cb47cfa891f2fca45ab7"
+ sha256: f03a6cdbee1006f65cc6e64dc8f93a0179b10a4b54e6287430057dd9b8556ee4
url: "https://pub.dev"
source: hosted
- version: "5.2.0"
+ version: "5.2.1"
firebase_auth_platform_interface:
dependency: transitive
description:
name: firebase_auth_platform_interface
- sha256: "80237bb8a92bb0a5e3b40de1c8dbc80254e49ac9e3907b4b47b8e95ac3dd3fad"
+ sha256: "48ed1841dbe617082d3b3b1db5a86dbce41503c4021d43982cfdcec598bb403e"
url: "https://pub.dev"
source: hosted
- version: "7.4.4"
+ version: "7.4.5"
firebase_auth_web:
dependency: transitive
description:
name: firebase_auth_web
- sha256: "9d315491a6be65ea83511cb0e078544a309c39dd54c0ee355c51dbd6d8c03cc8"
+ sha256: "7d4a0f8a9234eda0622aaf8344c74d57adf9eb36bf714f37df4114492d0e34bc"
url: "https://pub.dev"
source: hosted
- version: "5.12.6"
+ version: "5.13.0"
firebase_core:
dependency: "direct main"
description:
name: firebase_core
- sha256: "06537da27db981947fa535bb91ca120b4e9cb59cb87278dbdde718558cafc9ff"
+ sha256: "40921de9795fbf5887ed5c0adfdf4972d5a8d7ae7e1b2bb98dea39bc02626a88"
url: "https://pub.dev"
source: hosted
- version: "3.4.0"
+ version: "3.4.1"
firebase_core_platform_interface:
dependency: transitive
description:
@@ -397,34 +453,34 @@ packages:
dependency: transitive
description:
name: firebase_core_web
- sha256: "362e52457ed2b7b180964769c1e04d1e0ea0259fdf7025fdfedd019d4ae2bd88"
+ sha256: f4ee170441ca141c5f9ee5ad8737daba3ee9c8e7efb6902aee90b4fbd178ce25
url: "https://pub.dev"
source: hosted
- version: "2.17.5"
+ version: "2.18.0"
firebase_storage:
dependency: "direct main"
description:
name: firebase_storage
- sha256: dfc06d783dbc0b6200a4b936d8cdbd826bd1571c959854d14a70259188d96e85
+ sha256: d25b7a39661a7195733a45c36d6435fa6e38e640afdf01b7be100012ca02d3ff
url: "https://pub.dev"
source: hosted
- version: "12.2.0"
+ version: "12.3.0"
firebase_storage_platform_interface:
dependency: transitive
description:
name: firebase_storage_platform_interface
- sha256: "3da511301b77514dee5370281923fbbc6d5725c2a0b96004c5c45415e067f234"
+ sha256: "65d29507abc78a179449bc41fe386fec4056afbcc0e4cc9812756e39818f0a91"
url: "https://pub.dev"
source: hosted
- version: "5.1.28"
+ version: "5.1.29"
firebase_storage_web:
dependency: transitive
description:
name: firebase_storage_web
- sha256: "7ad67b1c1c46c995a6bd4f225d240fc9a5fb277fade583631ae38750ffd9be17"
+ sha256: c5affb63909a1809afd1376239a517c60f577c953dfa214ce8e87742d9da9805
url: "https://pub.dev"
source: hosted
- version: "3.9.13"
+ version: "3.10.0"
fixnum:
dependency: transitive
description:
@@ -441,6 +497,32 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.68.0"
+ flame:
+ dependency: "direct main"
+ description:
+ name: flame
+ sha256: e6873a8540a197a9bfe251e10c9e1f200329041d6e6d70df2cf38aa681cf2ef7
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.19.0"
+ flame_audio:
+ dependency: "direct main"
+ description:
+ name: flame_audio
+ sha256: a86839f1448bbf9e2cd9c5d396be8dfc745428a9d27db6dfcdd9680466d8370e
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.10.3"
+
+ flame_tiled:
+ dependency: "direct main"
+ description:
+ name: flame_tiled
+ sha256: bb00888e0893413ffeb083e24cee3d5f7c08cbae5d8df551f14a564fdf7c5282
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.20.3"
+
flutter:
dependency: "direct main"
description: flutter
@@ -646,10 +728,10 @@ packages:
dependency: transitive
description:
name: google_sign_in_android
- sha256: "5a47ebec9af97daf0822e800e4f101c3340b5ebc3f6898cf860c1a71b53cf077"
+ sha256: "0608de03fc541ece4f91ba3e01a68b17cce7a6cf42bd59e40bbe5c55cc3a49d8"
url: "https://pub.dev"
source: hosted
- version: "6.1.28"
+ version: "6.1.30"
google_sign_in_ios:
dependency: transitive
description:
@@ -827,18 +909,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
- sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
+ sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
url: "https://pub.dev"
source: hosted
- version: "10.0.5"
+ version: "10.0.4"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
+ sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
url: "https://pub.dev"
source: hosted
- version: "3.0.5"
+ version: "3.0.3"
leak_tracker_testing:
dependency: transitive
description:
@@ -899,18 +981,18 @@ packages:
dependency: transitive
description:
name: material_color_utilities
- sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
+ sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev"
source: hosted
- version: "0.11.1"
+ version: "0.8.0"
meta:
dependency: transitive
description:
name: meta
- sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
+ sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
url: "https://pub.dev"
source: hosted
- version: "1.15.0"
+ version: "1.12.0"
mime:
dependency: transitive
description:
@@ -923,10 +1005,10 @@ packages:
dependency: "direct main"
description:
name: model_viewer_plus
- sha256: ad1a349510e199eb40d5da5c9f8fb1f63442f07842f7544a31d9d38ba9658c0d
+ sha256: dd69c3551ec16c9d90277a482206ee6bccc1c1a063d76c1b01314e87b4946eca
url: "https://pub.dev"
source: hosted
- version: "1.8.0"
+ version: "1.9.0"
nested:
dependency: transitive
description:
@@ -951,6 +1033,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.0"
+ ordered_set:
+ dependency: transitive
+ description:
+ name: ordered_set
+ sha256: "3129515e563a14817adebbdeee2acbb845fc69b6fc99a94349b641d1c829d5cd"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.0"
package_config:
dependency: transitive
description:
@@ -1051,10 +1141,10 @@ packages:
dependency: transitive
description:
name: platform
- sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
+ sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
url: "https://pub.dev"
source: hosted
- version: "3.1.5"
+ version: "3.1.4"
plugin_platform_interface:
dependency: transitive
description:
@@ -1099,10 +1189,10 @@ packages:
dependency: "direct main"
description:
name: share_plus
- sha256: "59dfd53f497340a0c3a81909b220cfdb9b8973a91055c4e5ab9b9b9ad7c513c0"
+ sha256: "468c43f285207c84bcabf5737f33b914ceb8eb38398b91e5e3ad1698d1b72a52"
url: "https://pub.dev"
source: hosted
- version: "10.0.0"
+ version: "10.0.2"
share_plus_platform_interface:
dependency: transitive
description:
@@ -1256,10 +1346,18 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
+ sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.0"
+ tiled:
+ dependency: transitive
+ description:
+ name: tiled
+ sha256: "988a57a07df280bb4a5d722c9e400b282d8d9a652b5a2afc8b68e1308bbf8222"
url: "https://pub.dev"
source: hosted
- version: "0.7.2"
+ version: "0.10.2"
timeago:
dependency: "direct main"
description:
@@ -1360,10 +1458,10 @@ packages:
dependency: transitive
description:
name: uuid
- sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90"
+ sha256: f33d6bb662f0e4f79dcd7ada2e6170f3b3a2530c28fc41f49a411ddedd576a77
url: "https://pub.dev"
source: hosted
- version: "4.4.2"
+ version: "4.5.0"
vector_graphics:
dependency: transitive
description:
@@ -1440,10 +1538,10 @@ packages:
dependency: transitive
description:
name: vm_service
- sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
+ sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev"
source: hosted
- version: "14.2.5"
+ version: "14.2.1"
wakelock_plus:
dependency: transitive
description:
@@ -1464,10 +1562,10 @@ packages:
dependency: transitive
description:
name: web
- sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
+ sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062
url: "https://pub.dev"
source: hosted
- version: "0.5.1"
+ version: "1.0.0"
webdriver:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index cd5c21b3..d9474ee9 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -72,11 +72,17 @@ dependencies:
html_unescape: ^2.0.0
insta_image_viewer: ^1.0.4
youtube_player_flutter: ^9.0.3
+
+ flame: ^1.19.0
+ flame_tiled: ^1.20.3
+ flame_audio: ^2.10.3
share_plus: ^10.0.0
super_tooltip: ^2.0.8
+
+
dev_dependencies:
flutter_test:
sdk: flutter
@@ -116,7 +122,42 @@ flutter:
- assets/gifs/gaming_animation.gif
- assets/images/stats_icon1.png
- assets/images/stats_icon2.png
+ - "assets/images/"
+ - assets/images/bird_midflap.png
+ - assets/images/bird_upflap.png
+ - assets/images/bird_downflap.png
- "assets/models/"
+ - "assets/audio/"
+ - assets/images/Terrain/
+ - assets/tiles/
+ - assets/images/Main Characters/Ninja Frog/
+ - assets/images/Main Characters/Mask Dude/
+ - assets/images/Main Characters/Pink Man/
+ - assets/images/Main Characters/Virtual Guy/
+ - assets/images/Main Characters/
+ - assets/images/HUD/
+ - assets/images/Background/
+ - assets/images/Items/Fruits/
+ - assets/images/Items/Checkpoints/Checkpoint/
+ - assets/images/Traps/Saw/
+ - assets/audio/
+ - assets/images/Enemies/Chicken/
+ - assets/badges_images/
+ # - assets/images/player-sprite.png
+ - assets/images/stars_0.png
+ - assets/images/stars_1.png
+ - assets/images/stars_2.png
+ - assets/images/bullet.png
+ - assets/images/enemy.png
+ - assets/images/explosion.png
+ - assets/images/player.png
+ - assets/images/Frigate.png
+ - assets/images/Battlecruiser.png
+ - assets/images/Scout.png
+ - assets/images/Scout_Destruction.png
+ - assets/images/Frigate_Destruction.png
+ # - assets/images/Bullet.png
+
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
@@ -126,6 +167,9 @@ flutter:
- family: Inter
fonts:
- asset: assets/fonts/Inter-VariableFont_slnt,wght.ttf
+ - family: ThaleahFat
+ fonts:
+ - asset: assets/fonts/ThaleahFat.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro