Monday, September 27, 2021

The Return

Updates are going out tonight and tomorrow for all pyamsoft Android applications!

This update brings a visual refresh to FridgeFriend, as well as minor bugfixes to ZapTorch, Pasterino, WordWiz, Home Button, and SplatTrak.

Wait

SplatTrak?

That's right! A new app, quietly released some months back! SplatTrak is a simple Splatoon 2 map rotation tracker. It's very simple and barebones right now, simply displaying the rotation for the 3 different lobby game modes, but I hope in the future to update it with Salmon Run schedules, as well as notifications that can alert you to when a map you dislike is entering the rotation, or when a map you enjoy is coming up soon!

I've also been working for the past few months on a stock related application which should help you monitor (but not trade) your portfolio as you sit at home and wait out the pandemic still after a year. I will be able to share more information soon!

As the Android landscape changes, pyamsoft continues to change with it. With the recent release of Jetpack Compose, I look forward to updating the UI of all pyamsoft apps to take advantage of this new fancy way to create delightful frontends for apps. The rewrite will be slow and take a couple of months at least, but please stay patient as I move to the latest and greatest that Android has to offer!

Stay tuned!

========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================

Friday, April 16, 2021

PYDroid Updates

PYDroid's next version has been released!

There are major API changes to the library as detailed in my previous blog post.

Of note is the charge to the artifact path, now that PYDroid and other pyamsoft libraries are distributed via JitPack

The old artifact ID's used to be as follows

com.pyamsoft.pydroid:<library>

com.pyamsoft.cachify:cachify

com.pyamsoft.highlander:highlander

The IDs have now changed to the following

com.github.pyamsoft.pydroid:<library>

com.github.pyamsoft:cachify

com.github.pyamsoft:highlander

 

Notice the addition of github to the group ID, and the removal of cachify and highlander from the group ID 


With this change, the latest versions of the libraries are as follows

PYDroid: 23.0.1 (23.0.0 release exists but it is broken)

Cachify: 0.0.22 (0.0.21 release exists but it is broken)

Highlander: 0.0.17 (0.0.16 release exists but it is broken)


These new libraries will be used in future pyamsoft application updates, which will also be coming soon.


Stay tuned!


========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================

Thursday, April 8, 2021

Persona 5 Strikers and Sequelitis

I just finished Persona 5 Strikers on the Nintendo Switch, a wonderful little (30 hour) game that is a worthy follow up to the original. But it suffers from a bit of same-old-sequelitis in the shadow of its predecessor. Let's briefly chat about the good, bad, and ugly.

The Good

Well, I get to see Makoto again, so that's always good. Let's be very clear. First off - I did enjoy this game. I think it was a very good one. Was it better than the original - no way are you kidding me. But does it at least deliver what I expected it to - yes and quite well in fact. So many things are still here in the spirit of the original. 

All of your friends from vanilla are here (sorry Kasumi), though this time around your time with them is slightly less meaningful. Gone are the confidant levels, so you simply shoot the shit with Ryuji because you want to, not because he's gonna give you something. Gone are working shit jobs for shit pay, now you work no jobs for no pay. Gone is the ability to explicitly romance a partner throughout the game, and gone are the player-character stat-points controlling things like intelligence and guts. There is much less life-sim between dungeons and much less RPG style growth. There is a new cooking mechanic, though that ultimately just serves as a way for you to acquire better healing items now that Strikers removes the ability to visit the doctor in your free time. There are no jail deadlines anymore - as now jails take place over the course of a single in-universe day, regardless of how many times you enter and exit. Think of Strikers as a lighter P5, that doesn't make it bad - but it does make it different. Adjust your expectations accordingly when you go into this game - its a 30 hour not a 150 hour like P5.

Let's touch on the battle system too, as this is the most significant difference from the original P5. The entire elements, strengths, weakness, technicals system is here from P5, along with the showtimes from Royal, and all-out attacks. And Gun, which works as it does it Royal and refills after a fight instead of after a run. These are, in my opinion, very faithful to the original but have now be reformed to fit a real-time action oriented battle system.

Instead of the P5 turn-based system, now you move, dodge, and attack in real time against an enemy who moves and attacks in response. This dramatically shifts how battles are approached. Before, some battles would literally not be possible by the sheer fact that, if you were level 1 fighting a level 10, the enemy would absolutely win because there was nothing you could do to avoid an attack directed at you. In this new system, you now have player agency, and could in theory take on and defeat a boss 100 levels higher than you, just by dodging and whittling down it's health. Interestingly enough, this actually makes random battles less fun, and you are slightly less motivated to fight because you know that any boss no matter how big can be out-dodged. It does however, make battles more exciting, as you now are the single most important variable in deciding whether your party wins or loses the fight. With this new system comes your new greatest enemy though. The Reaper don't got shit on the Camera. The camera spinning around violently or clipping into a wall during a fight will get you hit more than anything any shadow can put out. If you can survive the camera though, the new system is a lot more engaging and involved. Gone are the days of press start to watch the game play itself. Gone are the days of Morgana moves faster than I do and he always goes first and the shadows are weak to wind. Gone are the days of Rivers in the Desert playing to start off the epic "last" boss, before shifting to buff guy Shido just standing there while you pick whether to smack him with a knife or eat a parfait. Now when Rivers starts playing, you know the fight is about to go down. And you'd better - because Rivers is used and re-used in the end game for maybe 3 or 4 or 5 different fights, so I hope you like it.

The Bad

Re-use. So many things are re-used. While character re-use is generally a positive, almost all music is the same, or remixed from P5, which is both cool, and not cool. Even though Last Surprise is super dank - it's also the song for Persona 5, just with some instrumentation changes. Same with Rivers in the Desert, same with Life Will Change or Beneath the Mask. It's cool to hear these songs again, but we've lost out on being able to fall in love with another banging Persona soundtrack because they've instead opted to re-use hit music. Such wasted potential it seems like.

Another big re-use though, is story structure. Strikers follows an almost identical story progression, so much so that the character in game remark about how similar places and events are. While this generally helps tie the story of this game back to the first game, it also brings the focus front and center on just how similar everything is again.

Game starts. Ryuji, Morgana, and HaremFucker69 are thrown into the Metaverse unexpectedly, and then thrown into a prison. First dungeon is Ann's story, second is Yusuke's. A person of "the law" is trying to take you down on the side. You meet someone early on who is in a respectable position in society and you generally like them, and they help you. You go to the beach and have a party. Ryuji makes a boob joke. You and Makoto fall in love. Police person converts to your side. You beat the final boss, politics guy who thinks he is a hero, and then the game says "wha-oh guess what that wasn't the final boss" and then it drops you back into a Mementos dungeon for the real final boss. Nice person betrays you. Guess what, still not the real final boss. Metaverse and real world combine except only your party and the villain are aware. You climb a skyscraper and then get to the real real final final boss boss, and it's second form the superduper final forreal endboss boss. You win. Everyone else forgets, and things go back to normal. Boss makes coffee and curry. Credits roll, but the music is not Hoshi to Bokura to, so you throw your controller at the wall.

Let me be very clear, Strikers is not the masterclass of a game that vanilla was, but its also not trying to be. Strikers' story is passable, and let's be honest you don't really care. If you are in to Strikers, then you are here for more game with the P5 characters you've come to enjoy, but with a new action-orientated battle system. You know just as well as I do that if Strikers was just the Persona 5 characters sitting and talking in Leblanc doing generally nothing for 10 real time days, you'd play it too. You're in too deep with the cult and you can't leave now.

Strikers is a solid follow up to the game you've come to love, but I do not think that on it's own it stands as a strong title. I would certainly not have picked this game up if I had not played 5 first, and the game seems to agree since it explains almost nothing at the start because, well, you already know right. You played Persona 5 right.

But, at just below 2 dollars per hour of your time, I would say that Strikers is highly worth it. It's a very solid game - though admittedly just more of the same working formula - but I could see myself replaying this in the future, though, only as a follow up after replaying the original one first.

The Ugly

Morgana is extra simpy in this one.


Code stuff soon, stay tuned!

========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================

Monday, March 22, 2021

Spiritfarer and game exhaustion

Spiritfarer is a wonderful game. It's charming - the artstyle feels hand drawn and light and lively. The characters are emotive and huggable. Your travelling companion is a cat. You grow gardens and weave and cook and herd sheep and plant trees and catch fish. You play music and chop logs and smash rocks and glide around through the air and play with movement physics. I love it, it's a magical first-time experience game.

And I've never finished it.

I purchased Spiritfarer back in August of 2020, and played it for 1 or 2 hours each evening after work for about a month. I took it slow, as I was never the person for these kind of games, and had just gotten done seeing my girlfriend take a break from Animal Crossing for literally the entire month of July after playing it every day for 3 months, so I knew that the grind of playing a game every day could be killer. I stuck to only a couple of hours each evening. In that time with a couple hours each night, I was able to meet and send off Gwen, Summer, and Alice. I took a break from Spiritfarer around October - one evening I simply didn't turn it on like I had every other night for the past month or so, and my planned break of that single evening turned into days, into weeks - into months. I started up once more in January of this year, helping Atul find his Fried Chicken and started planning his dinner party (though he's still waiting for Gustav's Tuna Tataki before we can sit down to eat). I played again for 2 or 3 days before once again putting the game down, and I sadly haven't picked it up since.

Let me state that I do not think Spiritfarer is a bad game, it's just simply not my game. I played Spiritfarer for what I estimate is around 40 hours, and enjoyed it. It was not at all the kind of game I usually play, and frankly I'm surprised I stuck around for so long. I think the reasons I left the game mainly boil down to two things - uncertainty and exhaustion.

Let's touch on what I mean by uncertainty first. The beginning hours of the game are masterfully crafted. You meet Gwen and she takes you through the game's basic tutorial where you discover how things work and what kinds of things you will be expected to remember during your sessions. You learn about movement, arranging the boat, cooking food, spirit food likes and dislikes, spirit skills, and the basic "crafting" system. You meet Summer and learn about gardening and music and where to go when you need to find resources that are usually scarce. You learn more about Gwen as her backstory opens up, and you discover the locations relevant to her past and her journey. You send her off through the Everdoor. Maybe you cry a little.

And then - what now. The tutorial is done, the Spirit whom I've grown the closest too on my boat is now gone, and I'm left with Summer, Atul, Alice, and Astrid. Atul is easier since he will eat anything, but gone are the days where it was acceptable to just rotate between popcorn and coffee - now I need to actually start making food. Oh but, I've only got access to Coffee Beans, Corn, and basic thread, so if I want to start making foods that Summer and Alice will actually enjoy, I need to go find more materials. My first soft wall in the game that I've picked up as a way to de-stress - everyone wants something but nobody will tell me where to find it. I open up the map and no dice - I've visited all of the locations on my map already.

But wait, what about the dark zones on the map? What if I just go off into one of those zones and hope that I'll find the magical city of cabbage and fried chicken? Beats going around looking for crates in the hopes that one of them will have not-coffee-beans.

Looking back, I now realize that this exploration is exactly what I was meant to and expected to do. The game wanted me to venture off into the far unknowns and organically discover new places and new things. I did, and I enjoyed it! But, up until that point for me the destination had been mostly laid out and setup for me, with the only obstacles on the way being making sure I had enough materials, or had shown mastery of the loom and the sawmill. I had never been required to find a new location, but rather had always been gently or forcefully guided towards that outcome. Suddenly with Gwen gone, the game had decided that I had made it to the big leagues after just one Everdoor trip, and now I had to play or go home.

Armed with my new mindset to go wherever until I was stopped by ice or rocks, I eventually succeeded in finding Bruce and Mickey, Giovanni, and Gustav. I also helped see Summer and Alice off through the Everdoor. It was at this point that the game took a major turn for me and I had to put it down for the first time. It was at this point that the game became more of a chore, and the chore became exhausting.

Let me briefly speak on one point where I believe the game - as a game - does fall a little flat. The opening hours are supreme - there is no other feeling quite like picking up Spiritfarer for the first time. But as the game continues on and characters come and go, one thing I began to notice was that as I moved further and further into the game, the characters became less and less engaging. I sympathized with Gwen and was patient enough to wait for Summer and Atul, but my initial reaction to meeting Astrid and Gustav and Bruce were not those of patience. I didn't resonate with these later characters as much, and as a result never actually cracked their hard shells enough to get to the meat of what their stories were. Instead of the game building up more and more of it's wealth of characters and ending with a bang, it was beginning to fizzle out before it had finished. When I left the game, I was in the middle of Astrid and Giovanni's infidelity, and had just gotten done building homes for Gustav and Bruce, and I just couldn't be bothered.

I liked Gwen, really liked her. She had personality, she helped me through the first parts of the game - held my hand so to speak. Normally I'm not for that kind of thing in a game, but in Spiritfarer? In a game which I had hoped would be relaxing and stress free? In a game with wonderful music that allows you to hug all the characters? Heck yes I would want someone to help me along with a light suggestion of, at least, what to do next.

I liked Summer too, though to a lesser degree than Gwen. She and I never quite clicked the same way things were with Gwen. Alice was even less so - though I empathized with her story and how tough it became for her in the end, we never quite hit it off. It seems that I was opening up less and less to the later characters. In a strange way, Spiritfarer had burned me in a way I never thought possible.

I was afraid to become engrossed in these new relationships with my other characters because, after Gwen left, there was a hole that was left unfilled. In both a figurative emotional sense, as one of the characters I had come to enjoy was gone forever, but also in the literal in-game sense - as her house was left on the boat but abandoned, unable to be removed or re-occupied. As the exact opposite of the principal goal of the game, I had not learned to cope with loss, and I had not learned to let go - rather - I had become more fearful of the idea than ever before. If I let go of Gwen, who was my favorite, and was miserable, what would happen when Summer and Alice and Atul left. I'd be stuck with Astrid, and Giovanni, ugh, or even Gustav. Or Stanley.

So progress would damn me, as I would be left with only characters I genuinely would not want to be on a boat with. But a lack of progress would also damn me just the same. Astrid would constantly complain for me to see what Giovanni was up to. Atul would keep asking for Fried Chicken and Pork Chops. My days in the game went from exploration and wonder into the very planned and carefully calculated game of optimally watering plants, picking crops, crushing seeds and rocks, smelting ores, travelling to the next city or event location, and cooking in preparation of whose favorite dish I would be making that evening. Spiritfarer became a stressful experience, just because there was always so much micro-managing to do. And to do it for characters that I wasn't really meshing with didn't help.

Let me put it out there, that I know Stanley had a troubled past for a mushroom-thing, but boy do I despise him as a character. He shows up, basically out of nowhere, and immediately starts demanding resources and consuming space. I was not prepared at all for Stanley. With the other characters, I could at least decide to speak with them once I knew I had space on the boat, or enough food to last a couple nights, but Stanley literally pops out of the ground and then suddenly demands food and takes over my guest house. Not cool Stanley.

This large amount of micro-managing took a once relaxing and genuinely enjoyable game into a chore combined with the fun of optimizing my route around the ship and the arrangement of my buildings for the shortest path with the least button presses. Yeah. That was how I survived what had otherwise become the monotony of watering crops and smashing seeds and cutting logs. Optimizing.

I saw off Gwen in August, Summer in September and Alice in October. I was so burned out that I put the game down in October and didn't pick it up again until January. In January I saw off Atul, and then returned to a ship with Giovanni, Gustav, Astrid, Bruce, and Stanley. I looked at my fields of crops that needed watering, and my sheep that needed trimming and my food that needed cooking. I looked at my characters demanding simple food, but also exotic food, but also nothing with veggies or fruit. I looked at the quest I had to go to a town which was locked behind an ice-walled zone because I didn't have a big enough ship. I needed metals I had never heard of from places I had never been.

I put the game down and haven't picked it up since. I probably will never pick it up again.

I did not dislike Spiritfarer, on the contrary, I loved it and would actually recommend it to people who are more easily swept up in these kinds of micromanage/simulator/farming style games. It's not for me, but it is for somebody. I'm just exhausted and burned out from playing it too much - and if I have to wait for the slow animation of that tiny bird turning that huge bull around before the dialog box pops up one more time - I'm gonna lose it.



Code stuff soon, stay tuned!

========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================

Tuesday, March 16, 2021

Libraries and You

It should come as no surprise to you at this point that JCenter will be shutting down. To prepare for the future where PYDroid libraries will no longer be hosted on JCenter, I am preparing to release the next and all future versions of pyamsoft Android libraries via JitPack

In order to prepare for this change, you will need to update the artifact ID for the next release. Instead of releasing under the usual com.pyamsoft.pydroid or similar artifact groups, it will be released under com.github.pyamsoft.pydroid. The same transition goes for Cachify and Highlander as well, which will be getting a new com.github prefixed artifact group. This will not change the package name.

With this change comes some important news about the next version of PYDroid, which will be a new major version - 23.

A major change is coming for how UiViewModel classes work with regards to creating a component. Before, you would have created the following kind of ViewModel





Notice how the ViewModel is strictly tied to one kind of ViewEvent, and knows how to handle all of those ViewEvent messages itself? This was largely nonsensical - as a ViewModel would not be connected to a ViewEvent publisher without wiring it up to the Component mindset via createComponent, which means that there would be a UiController present. This also led to issues that made it difficult to re-use a ViewModel with only a partial set of UiViews, as there would be ViewEvents which, in the context of the Component used, would never be called, but the ViewModel required handling it anyway, which was a code smell.

The new way in version 23 and onward will significantly change the ViewModel and createComponent calls in a few very important ways. First is that the UiViewModel no longer requires a strict ViewEvent type to be provided as part of the class signature, and as a result, will no longer support the handleViewEvent method.



The second significant change is that when creating a component via the createComponent function, a controller parameter is now explicitly required. The controller can be anything that inherits the UiController<C : UiControllerEvent> interface. You can either have your Android Controller class (Activity or Fragment for example) inherit this interface, or use the convenient inline method newUiController which creates an anonymous controller. The inline method is useful when a single Android Controller class handles different UiControllerEvent messages.

By changing component creation in this way, the UiController now correctly drives all interactions between its individual layers. A UiView publishes a ViewEvent to the Controller, which handles it in the trailing lambda of createComponent. In many cases, this ViewEvent will be call to a UiViewModel method, which can set UiState, or publish a ControllerEvent. The ControllerEvent is then handled by the controller passed into the createComponent method. This allows you to bind the same ViewModel to multiple different ViewEvent types, since the ViewEvent class type used in the trailing lambda will be decided by the kinds of UiViews that you pass to the function.




PYDroid 23 still has a ways to go before it is ready for release, but keep in mind that these changes will be coming soon. Because it is a major code base overhaul, this release will not be backwards compatible, so you may have to invest some time to migrate apps over to the new version. I was able to migrate all of my applications in a single day, though your time spent may change based on the size of your application. If you want to get a head start, you can pull a SNAPSHOT version off of JitPack.


========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================

Wednesday, February 24, 2021

pydroid

A small update has been released for PYDroid bringing it to 22.6.1.

The only API change in this release is hopefully minor - it changes setState functions to allow for the stateChange lambda to be a suspending function. For Kotlin users there should be basically zero code change. For Java users, this will change the function signature because in Java suspending functions are implemented as Continuation resume callbacks. While this change may be slightly more painful for Java, as Android continues moving to a Kotlin first ecosystem modern codebases must be ready to follow. PYDroid is Kotlin first and Java friendly, but I cannot make Java compatibility guarantees as I largely do not use Java anymore.

If the change to suspending state change callbacks causes issues, please file a bug report and let me know.

Stay tuned! 

Saturday, February 20, 2021

Quick updates

A quick patch release was pushed for FridgeFriend that brings it to version 32. This fixes a bad buggy in the Group detail screen where the list of Items would normally be present. A bug was causing this list to be blank until at least one letter was inputted into the Search box - the recent update will fix this issue. Please update as soon as possible to get the latest fix!

An update to the Discord stock bot was released that brings very basic support for the nearest weekly options that are close to or in the money. Unfortunately, the options info is still incomplete, as I would like it to at least be able to list monthly or leap options, as well as provide delta info. I will continue working on this to make it more complete, but basic support is there for now.

An update to bubblewrap-wrap has been pushed which brings better isolation for user-specific runtime directories.

Stay tuned!

========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================

Monday, February 15, 2021

new stuff

Some quick updates

My nameless discord stock bot has gained basic support for displaying the upcoming weekly options chain for a given symbol.

ZapTorch has been updated with support for toggling on and off the various double click volume commands, so you can use some or all of the different volume commands.

FridgeFriend has been updated with simple bugfixes and a change to the search screen (although this one is sitting in Google review limbo)

Stay tuned!

========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================

Monday, January 25, 2021

New FridgeFriend

A new version of FridgeFriend has been released which includes some major changes!

First is the removal of the Map screen. This screen was originally envisioned to let you mark store locations on your device so that FridgeFriend could notify you when you were close by via geofencing. It was intended to be a hands off operation, so you wouldn't need the app open and could be, for example, driving around in the car and the app would notify you as you passed by a store. Unfortunately, the Google API and Policy changes with the new Android version made this feature much less useful - as you had to have the app open for it to remind you about nearby stores - and with the change in how society functions due to the pandemic, most people are not out and about anymore (and if they are, they usually have decided in advance to go to the store already). As such, the feature rarely saw any use and was not very useful when it did, so it has been dropped. A side effect of this is that FridgeFriend now requires zero permissions.

Instead, a global search screen has been added. Now when searching on this page, Items from any Group will be returned to you, allowing for a higher level birds-eye view over all of the things in your fridge. This way, even if you have items spread out among multiple Groups, you will be able to manage them all here as if they were in one large "super group".

The update has been published and should be rolling out to your device soon!

Stay tuned!

========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================

New pydroid

PYDroid version 22.6.0 has been released.

This officially removes the old deprecated methods, like saved instance support on plain UiViewModels.
This is largely the same release as 22.5.4 just with deprecated methods formally removed, but there is one change that can impact your application's behavior.

The setState function used to take an optional parameter andThen which would run only when the state was actually changed. This behavior has been modified, and the andThen callback will now run after every setState operation, regardless if state actually changes or not.

Stay tuned!

========================
Follow pyamsoft around the Web for updates and announcements about the newest applications!
Like what I do?

Send me an email at: pyam.soft@gmail.com
Or find me online at: https://pyamsoft.blogspot.com

Follow my Facebook Page
Check out my code on GitHub
=========================