Ok so whilst working on volleystats I updates some things in the api small bugfixes, documentation and yesterday I got a mail that I have to ship volleyscores api and I really don’t know in detail what I’ve changed but it are probably all small bug fixes. Looking at the docs I also added like this match function but It’s already over 2 months ago so don’t blame me XD!
Ok this is the last one and it’s a big one. The game is actually a game now.
First I rewrote the hitboxes. Everything has a real hitbox now, circles, rectangles and triangles. Circles and rectangles were pretty doable but triangles were a pain, so for those I used the Separating Axis Theorem (basically if you can find a line between 2 shapes they don’t touch). Every hit gives back which way to push and how deep they’re inside each other, whait wha-, holdup, I didn’t just say that and uhm the push is split by mass so a bird doesn’t just shove a whole tower away.
Then for the physics I added some stuff like:
Stuff can stand on stuff without sinking or jittering
Balls, pigs and the bird roll (and the image actually rotates)
Rolling friction so they stop eventually
Everything takes damage based on how hard it got hit
Blocks and pigs get more and more broken images until they just despawn
Then for the fancy pantsy parts:
A slingshot with rubber bands that stretch while you aim
Birds waiting in line doing little hops, and they jump onto the slingshot when it’s their turn (this is so cool)
Pigs (small, medium, large, helmet, mustache and king) A score with stars and an end screen
Levels in json so I can build towers without touching the code, or employ claude to write levels for me hehehe.
Oh and fun fact, evalXML rebuilds the whole construction every time you call it. With every block having 4 images, loading a level took forever. So now everything gets queued and added in one go. But it still takes like 30s to load the game.
Ok I refactored the whole game (only js) to use node so I can have multiple js files. Node then bundles them and automatically builds the .ggb file for me. Lof you node <3.
Then for the physics I added some stuff like:
I won’t go in the technical details cause I would write a whole darn book about them. But I’ll go deeper into it on my readme.
I’ve done a lot like a lot lot. First I had to figure out how I would even set the game up. After a lot of just playing around with geogebra. I got set up with a circle with inside a point, if I move that point inside, it makes a parabolic move around. That’s like the core mechanic of the game so it was nice to have that. I was doing that stuff with lapse and then I noticed I can unzip the .ggb files that geogebra provides you with when you press download, so I of course unzipped it to see for myself what’s in there. At it core it comes down to 2 files. geogebra.xml and geogebra_javascript.js the xml file just stores all your variables and stuff an the javascript file is used to run some javascript. I started coding in js and noticed that it’s running a sandboxed js which means I didn’t hat access to timer.setinterval and stuff. At a certain point the mechanic of making the image move over the curve was working, but I didn’t feel satisfied enough, so I moved everything over to js. All items are first seeded by js. Then I started to create classes for everything ’cause I have multiple entities etc for this. I had to use a slider that updates at ticks geogebra provides me but god nows how long such a tick takes so I need to calculate time between ticks with dates to get some sort of consistency in my physics engine. Currently when you launch the bird, it just sets it speed upwards and gives it a forward speed, then it always calculates the current position based on the previous position and the time elapsed during 2 ticks. So I can work with some kind of vectors. Next up is building a tower to hit and adding physics to destroy that tower. Oh btw I also added a timer when the bird is on the ground for 3s it just resets ‘cause otherwise the bird just lies down and you’d have to reopen the file to shoot again.
Also keep in mind that this is a calculator and not even a complete html/css/js setup.
This was a rather short project ‘cause I already have a lot of expierence developing frontend stuff. It was a rather interesting project ‘cause I didn’t now I could use vite for gh pages and haven’t really ever written a github workflow.
Uhh okay so a lot happened the last couple days, let’s see if I remember it all. Club detail pages now render instantly from data the backend was already sending me, instead of firing off a fetch per team just to show one line. Added a filter on the home feed so you can pick a single favorite team when you’ve got a few, and match reminders, a notification 2h before your favorite teams play. Also found out my “cancel all notifications” call was silently wiping out those reminders every time daily summaries rescheduled. Fixed that.
Shipped club favoriting, result notifications, win and loss coloring on match cards, and a set scores bottom sheet you can share. Also fixed a really annoying race condition where pull to refresh on club pages looked like it worked but was actually serving stale data.
Then I paused feature work and finally added tests and CI, since somehow none existed until now. Consolidated the team and club caching into one thing instead of two almost identical copies, and put all my error logging behind one helper. Also found an embarrassing bug where none of the settings toggles responded when you tapped the switch itself, only when you tapped the text next to it.
Last thing, I wired up Firebase Crashlytics. New Firebase project, uncaught errors now get reported automatically, tested it end to end on my phone and watched a fake error show up in the console with the right stack trace. No more finding out about crashes by accident.
Did some last bugfixes, wrote a readme and built the release apk
Uhh Appearently I forgot to log : (. Ok so I’ve been doing a lot but like a lot lot, first off all, the app is now almost ready. It now fetches all it’s data dynamically from my other project volleyscoresapi. I added some features, you can now sync matches with your calendar, get notifications for matches that are happening today. Change the app to a light mode. I created an app icon and a banner. I worked a little on caching for faster startup and I think it’s ready for production.
Been refactoring scraper.py to handle seasons properly. Fixed a bunch of parsing bugs in get_team(), added get_ranking(), and ripped out the /history/{season}/ URL hack in favor of just passing a se param. Now it figures out the current season from the date so I don’t have to manually update a constant every summer. Pretty happy with it.
While working on my other project volleystats I stumbeled upon some bugs that needed to be fixed regarding the json output, dates and times that where in the wrong place. These 40 mins also account for debugging that I did on volleystats.
What have I been doing the last 5 hours, well that’s actually a pretty good question. Let’s see how good my memory still works. (I recommend opening the video in a new tab)
First off I added some new models:
After that, I had to fix my pages because I now had to fetch data to build these models via my api (checkout volleyscoresapi). Then I noticed some bugs in my api so I also fixed those. Short after I battled with some edge cases where suffixes, that sabotage the lookup of the team. Eventually I lost my patience waiting for models to load so I added a caching system for teams and clubs. Lastly I had to fix some issues where the matchdata of a team wasn’t correctly rendered. Now everything related to search works, I also have models so I don’t have to rely on static data. Next up I’ll be completely revamping the home page so that that also works dynamically, with a cache/ storage system to store your favorite teams.
I made the search page now dynamically fetch club data. You can now easily look up a club and fetch it’s data. Next up is the team data. I’ll probably be creating a custom TeamModel for the ease of use.
Wel uhm maybe I should have devlogged more. I created an app to view all belgian volleybal matches clubs etc… Currently only the search function uses the api I created (volleyscoresapi) and is also available in stardance. I think that this video would suffice what I’ve been doing the past 4h and 24mins.
Fought with dokploy not wanting to start my container after I changed the swagger docs a little. Dokploy now does what it needs to do for deployment and my docs are up to date!
(Image of me fighting dokploy)