GithubHelp home page GithubHelp logo

jerboaburrow / jellycram Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 0.0 8.33 MB

A Tetris inspired jelly-physics game with button mashing elements and minor frustration

Home Page: https://jerboa-app.itch.io/jelly-cram

License: GNU General Public License v3.0

CMake 4.31% Shell 1.17% C++ 46.48% Kotlin 43.84% C 4.20%
2d-game casual opengl physics jelly itch-io itchio

jellycram's Introduction

jelly cram feature-graphics

Linux build macOS build Windows build Android build

JellyCram

A Tetris inspired jelly-physics game with button mashing elements. Free and open source.

Currently beta testing on itch.io and Google Play

Itch.io

ℹ️ Fill the board with tessellating jelly-ominoes to earn points.

ℹ️ Control the descent of each piece and its rotation to line them up perfectly.

ℹ️ Keep an eye on the Jiggleometer - pieces must be settled to get deleted!

ℹ️ if a piece goes over the top, it's game over. Clear pieces by filling rows, and keeping the Jiggleometer low!

Play now on Linux 🐧, macOS 🍎, Windows 🪟, and Android 🤖

Catch a release here

Settings

Desktop

  • By pressing the menu button (three stacked rounded boxes, or the word menu) you may rebind all keys however you wish.
  • On Linux and Windows a file settings.json contains key-bindings and a tutorial completion flag. These may be edited.
  • On macOS the settings are stored in ~Library/Application Support/app.jerboa.jellycram/settings.json

Android

  • By pressing the menu button (three stacked rounded boxes, or the word menu) you may invert tap and swipe controls and use the screen or object centric controls.
  • In screen centric (not inverted) tapping below the middle pushes up. In object centric tapping below the current piece pushes up instead.

Signing/Verifying your Download

The Android build is code-signed, with the same key as used on the Google Play store.

The desktop code is signed with GPG, and md5sums are provided. However for macOS and Windows additional signing is required for Smart Screen and macOS GateKeeper, which is as yet not planned (costs $100's/year)

Windows SmartScreen/User Access Control - "Unkown publisher"

  • The code is not yet signed for Windows, you may run by left-click run anyway. You may need to click more info

macOS - "Unidentified developer"

  • The code is not yet signed for macOS, you may run by control-click`` open, and selecting openin the pop up. You may have tocontrol-click`` open twice.

GPG keys

The games key is hosted on keyserver.ubuntu.com, you may obtain it in gpg like so:

gpg --keyserver keyserver.ubuntu.com -v --recv-keys 18e4f6b191de23e7978be4b46534065e085babba

You should see something like:

gpg: pub  rsa3072/6534065E085BABBA 2024-01-26  Jerboa-app (JellyCram) <[email protected]>
gpg: key 6534065E085BABBA: "Jerboa-app (JellyCram) <[email protected]>" ...
...

Ways to verify

The files (executable and packed scripts) are provided with md5sums, and GPG signatures. The md5sums are contained within the file JellyCram.md5

On linux or macOS you may verify as follows

  • Check md5sum md5sum JellyCram
  • Check GPG gpg --verify JellyCram.sig

To install md5sum on macOS with brew brew install md5sha1sum

On windows

  • Check md5sum md5sum JellyCram.exe
  • Check GPG gpg --verify JellyCram.exe.sig

License

jellycram's People

Contributors

jerboa-app avatar

Watchers

 avatar

jellycram's Issues

only flash that which will be deleted

will need to:

  • remove the sub-meshes from the pieces
  • make them into temporary objects
  • pulse them
  • fully delete them (temporaries)
  • handle discontiguities in parents

bake lua

  • bake lua in desktop as well - no need for all the files here

split pieces when deleting them

currently if e.g. a line is split in the middle it is still one object.

  • detect splits
  • break into objects based upon contiguous pieces
  • resolve "bundling"

Android control scheme

  • object centric touch controls
  • screen centric
  • toggle option between them
  • toggle option to invert controls (object moves to tap)

Object centric is if tap is left or right, up or down of object center + some padding
Screen centric is if tap is left or right, up or down of screen center + some padding

Fill mode

  • fill the world with pieces, score is "density" out of full board
  • controls (nudge left, right, up)
  • density (each piece has set count, number of 3x3's, a full board is score 100)
  • show next piece indicator
  • difficulty progression: speed
  • difficulty progression: fill line
  • difficulty option: hide next piece

plays more into the soft body physics aspect - "not just Tetris"

tutorial

  • guide through touch controls on android

Pause with text stating to tap to "keep up"
unpause after a tap wait for piece to fall
Pause with text stating to swipe to "rotate"
unpause ...
Pause with text to move left or right
Indicate Jiggleometer
Done

Block colours

  • samplers for block colours rather than completely random

JellyCram roadmap

  • Tetronimo Meshes
  • stable-ish params
  • deletion of matching pieces?
  • move active piece (no rotation)
  • if a piece goes above y=1 = game over
  • credits
  • welcome screen
  • settings menu (tetronimo colour maps)
  • sound?
  • better name
  • "fill" mode
  • "classic mode" (i.e. tetris)

macOS files

  • icons are not found in macOS
  • settings.json is not found in macOS (tutorial is always active)

score achievements did not seem to work

  • got a score of 36 but no 20 ach
  • did get 5 mins at same time

Must be this insane code...

        renderViewModel.updateAchievement.observe(
            this, androidx.lifecycle.Observer {
                    s -> if(client.updateAchievement(s.first,s.second)){
                client.updatePlayServicesAchievement(this,s.first)
                client.updateLocalAchievement(s.first)
            }
            }
        )
        renderViewModel.updateAchievementSlot2.observe(
            this, androidx.lifecycle.Observer {
                    s -> if(client.updateAchievement(s.first,s.second)){
                client.updatePlayServicesAchievement(this,s.first)
                client.updateLocalAchievement(s.first)
            }
            }
        )

achievements, PGS

  • Achievements
  • Leaderboard
  • "soft landing"
  • "hard landing"
  • played a game with no touching/input
  • smasher used successfully
  • 20, 40, 60, 80, 100

check state in common, android will then call PGS.

Settings

  • Select any key or mouse click for controls
  • select colour maps
  • show colour maps on some meshes
  • randomise button to randomise the colours on the shown meshes
  • msaa

Android pieces size

y-axis is likely to be quite large, perhaps use 5 rather than 9 blocks for the width?

macOS crashes on checkDelete

==22049==ERROR: AddressSanitizer: container-overflow on address 0x6150000fb210 at pc 0x00010262b567 bp 0x7ff7bdaf3810 sp 0x7ff7bdaf3808
READ of size 8 at 0x6150000fb210 thread T0
    #0 0x10262b566 in std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>::operator->[abi:v160006]() const shared_ptr.h:857
    #1 0x102635e2b in Hop::System::Physics::CollisionMesh::getByTag(unsigned long long) collisionMesh.h:424
    #2 0x1026214ea in Hop::System::Physics::CollisionMesh::getBoundingBox(unsigned long long) collisionMesh.h:510
    #3 0x102620676 in checkDelete(std::__1::vector<Hop::Object::Id, std::__1::allocator<Hop::Object::Id>>&, Hop::Object::EntityComponentSystem&, double, unsigned char, double) common.cpp:85
    #4 0x102593b6d in JellyCramState::iteration(Hop::Object::EntityComponentSystem&, Hop::Console&, Hop::System::Physics::sCollision&, Hop::System::Physics::sPhysics&, std::__1::shared_ptr<Hop::World::AbstractWorld>, void (*)(Hop::Console&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>), unsigned char, bool) gameState.cpp:252
    #5 0x1024156f8 in main main.cpp:299
    #6 0x7ff80909f3a5 in start+0x795 (dyld:x86_64+0xfffffffffff5c3a5)

0x6150000fb210 is located 16 bytes inside of 512-byte region [0x6150000fb200,0x6150000fb400)
allocated by thread T0 here:
    #0 0x10398460d in wrap__Znwm+0x7d (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0xec60d)
    #1 0x102451984 in void* std::__1::__libcpp_operator_new[abi:v160006]<unsigned long>(unsigned long) new:285
    #2 0x10245190c in std::__1::__libcpp_allocate[abi:v160006](unsigned long, unsigned long) new:311
    #3 0x1026391dc in std::__1::allocator<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>>::allocate[abi:v160006](unsigned long) allocator.h:115
    #4 0x102638f7a in std::__1::__allocation_result<std::__1::allocator_traits<std::__1::allocator<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>>>::pointer> std::__1::__allocate_at_least[abi:v160006]<std::__1::allocator<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>>>(std::__1::allocator<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>>&, unsigned long) allocate_at_least.h:55
    #5 0x10264da35 in std::__1::vector<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>, std::__1::allocator<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>>>::__vallocate[abi:v160006](unsigned long) vector:688
    #6 0x10265267e in void std::__1::vector<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>, std::__1::allocator<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>>>::assign<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>*, 0>(std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>*, std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>*) vector:1388
    #7 0x1026508cb in std::__1::vector<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>, std::__1::allocator<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>>>::operator=[abi:v160006](std::__1::vector<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>, std::__1::allocator<std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>>> const&) vector:1344
    #8 0x10267a7a5 in Hop::System::Physics::CollisionMesh::operator=(Hop::System::Physics::CollisionMesh const&) collisionMesh.h:89
    #9 0x10267a760 in Hop::Object::Component::cCollideable::operator=(Hop::Object::Component::cCollideable const&) cCollideable.h:11
    #10 0x10267a3e4 in Hop::Object::Component::ComponentArray<Hop::Object::Component::cCollideable>::insert(Hop::Object::Id&, Hop::Object::Component::cCollideable) componentArray.h:185
    #11 0x1026281e3 in void Hop::Object::EntityComponentSystem::addComponent<Hop::Object::Component::cCollideable>(Hop::Object::Id, Hop::Object::Component::cCollideable) entityComponentSystem.h:157
    #12 0x1027ef9b9 in Hop::Object::EntityComponentSystem::lua_loadObject(lua_State*)+0xe79 (JellyCram:x86_64+0x1003e99b9)
    #13 0x10244859c in int Hop::dispatchEntityComponentSystem<&Hop::Object::EntityComponentSystem::lua_loadObject(lua_State*)>(lua_State*) console.h:55
    #14 0x10282b7c9 in luaD_precall+0x1a9 (JellyCram:x86_64+0x1004257c9)
    #15 0x10284f75e in luaV_execute+0x462e (JellyCram:x86_64+0x10044975e)
    #16 0x10282baa3 in luaD_callnoyield+0x53 (JellyCram:x86_64+0x100425aa3)
    #17 0x10282a657 in luaD_rawrunprotected+0x57 (JellyCram:x86_64+0x100424657)
    #18 0x10282bf55 in luaD_pcall+0x35 (JellyCram:x86_64+0x100425f55)
    #19 0x10281dee2 in lua_pcallk+0xe2 (JellyCram:x86_64+0x100417ee2)
    #20 0x10240f2fd in Hop::Console::runString(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>) console.h:148
    #21 0x10240f04a in run_lua_loop(Hop::Console&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>) main.cpp:10
    #22 0x1025903ba in JellyCramState::iteration(Hop::Object::EntityComponentSystem&, Hop::Console&, Hop::System::Physics::sCollision&, Hop::System::Physics::sPhysics&, std::__1::shared_ptr<Hop::World::AbstractWorld>, void (*)(Hop::Console&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>), unsigned char, bool) gameState.cpp:64
    #23 0x1024156f8 in main main.cpp:299
    #24 0x7ff80909f3a5 in start+0x795 (dyld:x86_64+0xfffffffffff5c3a5)

HINT: if you don't care about these errors you may set ASAN_OPTIONS=detect_container_overflow=0.
If you suspect a false positive see also: https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow.
SUMMARY: AddressSanitizer: container-overflow shared_ptr.h:857 in std::__1::shared_ptr<Hop::System::Physics::CollisionPrimitive>::operator->[abi:v160006]() const
Shadow bytes around the buggy address:
  0x6150000faf80: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x6150000fb000: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x6150000fb080: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x6150000fb100: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x6150000fb180: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
=>0x6150000fb200: 00 00[fc]fc fc fc fc fc fc fc fc fc fc fc fc fc
  0x6150000fb280: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
  0x6150000fb300: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
  0x6150000fb380: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
  0x6150000fb400: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x6150000fb480: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==22049==ABORTING
8 8 8 zsh: abort      ( cd build/JellyCram/; ./JellyCram; )

Bug report: blank screen

If the bug is mentioned in an issue already, please go to it and comment/ thumbs up it instead of opening a new issue.

Describe the bug

Android has a blank screen on startup sometimes

This appears connected only to the back button.

It turns out that android stores state between runs and we need to be certain to clear the shared ptrs

Feedback on unsettlement

  • Visual feedback on how "settled" the pieces must be?

The physics is feedback but is it clear enough?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.