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 @@ + + + + + + + + +1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,7,8,9,0,0,7,8,9,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,7,8,9,0,0,0,0,7,8,9,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,9,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,7,8,9,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,9,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,7,8,9,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,96,97,0,0,0,25, +23,0,0,0,0,0,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,7,8,9,0,0,0,0,0,0,0,0,0,0,0,95,96,97,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,7,7,7,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,25, +45,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,47 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + +216,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,216, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,195,195,195,195,196,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,194,195,196,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,18,19,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,194,195,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,18,19,20,0,0,0,0,0,0,0,18,19,20,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,194,195,195,195,195,195,195,195,195,195,195,195,196,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,194,195,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,194,195,196,0,0,0,0,0,0,0,194,195,196,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,194,195,196,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,18,19,20,0,0,0,0,0,0,0,18,19,20,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,194,195,195,195,195,195,195,195,195,195,195,195,196,0,219, +219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,217,218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,239,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,0,0,0,0,0,0,0,18,19,20,0,0,0,0,0,0,0,18,19,20,0,219, +219,217,218,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,239,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,219, +219,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,219, +216,189,190,191,189,190,191,189,190,191,189,190,191,189,190,191,189,190,191,189,190,191,216 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + +1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,7,8,9,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25, +45,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,47 + + + + + + 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