When linking to these pages, please use the URL:
www.iki.fi/sol/ - it's permanent.
Sometime about a year ago Swytch had a marketing push about their e-bike conversion kits. I did some research, looking for alternatives, but there practically weren't any. The Swytch kit is (or was) simply the only game in town where it comes to a single package e-bike kits.
There are other options, naturally, but those come down to figuring out all the parts yourself, piece by piece.
Swytch has a pricing structure where the longer you're willing to wait, the less you pay. Since I'm not using my bicycle in the winter I was fine with waiting for half a year. Mine arrived in two separate shipments, probably because shipping batteries is more complicated than the rest, which meant that the battery arrived over a month later. The weather this spring has been really bad, though, so what I'd call bicycle season didn't really start before I got all the parts, anyway.
I did have to poke Swytch's support a few times to get the second package here. I don't know if it would have ever arrived if I had not.
Swytch's documentation is excellent. There's paper manual, interactive step by step web thingies, YouTube videos, and if all this fails, they have live people to talk to. I haven't tested the last of these, though, but the other stuff was easily comprehensible enough to solve all of the issues I had with installation.
Ironically the trickiest bit of the whole installation had to do with my bicycle's original breaks, which Swytch's documentation naturally had nothing to do with. I also had to file the front wheel's connectors a bit (as per Swytch's troubleshooting guide) to fit the front fork of my bicycle. There were some other smaller issues that were easily solved by the documentation, but nothing so severe that I'd recall anymore.
One odd thing is that they don't have a store for accessories, so if you didn't include some accessory in your initial order, you have to go through their support to buy them. I don't recommend going this route because it's pretty expensive.. probably better to order everything you might conceivably need on your initial order.
I haven't done any extensive testing as of yet, but here's my initial impressions. Most of my testing has been rather short 1-2km trips, with an occasional 5km one.
The battery is rather heavy, and you do notice it when walking your bike or when doing sharp turns, but other than that, on the go it doesn't really matter. If I visit a store I do detach the battery and carry it with me, or someone might steal it. Their next gen batteries are smaller so that might not be as much of a problem. I do need the capacity of the large battery for the primary thing I bought the whole thing for, though.
At minimum assist it feels like you have wind on your back. At middle assist, hills flatten. At maximum assist you more or less forget to switch gears.
On longer distances, when your speed is often over 20km/h this doesn't hold true, as the assist stops when you're going fast enough. What the speed limit there is, I don't know exactly.
When pulling some load in a trailer, you want to up the assist a notch or two, which is similar to using gears; when pulling a trailer you want to use a notch or two smaller gear.
Toggling the amount of assist by pushing buttons on top of the battery while riding isn't.. fun. I learned to predict when I'd need higher (or lower) assist and do the adjustments when it felt safe to do so. I assume the wired throttle exists for this, but I don't have it.
The assist triggers and stops with a slight delay. This causes a fun effect: when climbing a hill with the assist, you eventually come to a downhill and feel the speed increase. So you stop pedalling. After a while, the assist stops. And it feels like you're slowing down. Downhill. You don't actually slow down, the acceleration just reduces a bit, but it's a funny feeling.
Quality-wise I'm fine with most of the parts, but the pedalling detection disc is made of plastic and I'm afraid it might break. I contacted the support and they sold me a spare (at rather high price), but I was happy to pay it because I'd rather have a spare than to potentially have to wait months for a replacement.
I've also used my modified bicycle without the battery and it works just fine. I assume the front wheel is probably somewhat heavier but the additional weight is so close to the ground it doesn't affect the stability.
I'll probably write more of my experiences later on when I have made longer trips with it.
We don't drink coffee. But we have guests every now and then who do, and since we're not barbarians we don't give them instant coffee.
Since our consumption of coffee is so slow, store-ground coffee goes bad. One option would be to freeze it, but that's a hassle. So coffee beans are the way to go, as they keep longer.
I used a cheap spinny-blade grinder for a while, but the results were pretty uneven. So then I watched some hundreds of hours of coffee YouTube, and figured that yes, the coffee grinder is the most important piece of gear when brewing coffee.
So, 300 eur later I have the possibly cheapest "good" grade coffee grinder. And then I figure that I might as well try to make some "good" coffee.
Some further research later I have an aeropress and some fresh light roast beans. And I make coffee. It tastes like.. coffee.
Adjusting the grind I do quickly find what I find the best setting for me where the sourness is as low as possible before the acidity gets too high. This is really personal thing, and varies from one set of beans to the next.
The result is still coffee. It's not magical. But it's slightly better tasting coffee. Good enough that my wife, who also doesn't drink coffee, has voluntarily asked for a cup every now and then.
And then, after about a month of drinking one cup of coffee a day, I get a migraine attack. I have not had one for decades.
Looking things up, I can't figure out why exactly coffee would do this. Drinking coffee does rise your blood pressure, but only momentarily. I start measuring my blood pressure (as I promised myself to do years ago but never really got into it) and sure enough, my blood pressure is dangerously high.
I've been eating medication for it for a while now, and situation has improved enough that I've managed to drink an occasional cup since.
I don't think the coffee caused my high blood pressure, but it did lead me to get it treated.
While working on NextFli / FLX animation format for the zx spectrum next, I got this idea of using the next's tiled graphics mode as a video format. Cinepak, for example, uses tiles; it has 256 tiles that are 2x2 or 2x4 truecolor pixels, and the Cinepak stream contains replacement tiles to improve image quality by changing up the dictionary on the fly.
Next's tiles are huge in comparison - 8x8 pixels - but only 16 colors. On the other hand, there's 16 palettes. Since one index in the 16 color palette must be transparent, that means you have 16 palettes where 1 color must be the same and 15 can be different. On top of that, the next's color space is 3 bit deep, so you have 512 colors to choose from.
The tiled graphics mode has 40x32 tiles, or 1280 - that's exactly 2.5 times the number of tiles available, so in other words each of those 8x8 tiles is used 2.5 times on average.
In some ways this is kinda like rendering text mode, except you get to define your characters.
This was going to be lossy whatever I do (apart from maybe limiting the screen to 32x16), but it's constant bitrate; whatever you throw at it, the output will always have the same size. NextFli is lossless (by default), and the output rate varies based on compression ratio. NextFli will also (likely) never hit 50hz, while TileCine can.
The tile data size is 16384 bytes, tile map is 40x32x2=2560 bytes, plus palette which is 512 bytes, which comes to a total of 19456 bytes per frame.
Compare that to the 320x256=81920+512=82432 bytes of raw byte-per-pixel (plus palette) frame size and you have a compression ratio of about 24%. Compression ratio can be improved by compressing several frames to a single tileset; at 3 frames we're down to 10% and at 11 frames 5%. That's 4k per frame. The more frames you include the better the ratio, but at the same time the image turns into porridge.
The compression ratio won't get much better than that, though; at 100 frames we get (16384+512+2560*100)/100 bytes or about 3% compression ratio, and completely messed up video.
My initial approach to generating the tiles was to take the 8x8 tiles and generating 8x8x3 dimensional vector (x3 because r,g,b = 3 dimensions) and hitting it with vector quantization. The problem there was that I had 192 dimensions and each dimension had 3 bits - 8 positions - of wiggle room. So after splitting the space 8 times there's fairly little to split and we haven't even scratched the number of dimensions. So that didn't work too well.
Instead, I reduced the 8x8 tiles to 4 sum pixels, one for each quadrant, so I had 4x3=12 dimensions and 4x4x8=128 positions to move in. The results were much better.
After splitting the 12 dimensional space to 512 sub-spaces I could then just average the tiles in each subspace for my tile set. (This is not exactly optimal for various reasons but it's still a good set generated in relatively short timespan).
The next's hardware also supports horizontal and vertical mirroring of tiles as well as rotating them 90 degrees, or any combination of the above. I fit the resulting tiles to the screen. Sometimes a rotated or flipped tile fits better.
Next problem is reducing things to the 16 palettes. As a first step I went through every tile and reduced the number of colors down to 15 plus black by looking for colors that are used by fewest number of pixels and replacing it with the another existing color (the nearest one to the one being eliminated). This has the additional benefit of eliminating noisy pixels. If a tile is being reused it's probably better that it doesn't draw attention to itself.
This left me with 512 potentially unique 16 color palettes.
As a first step in eliminating the palettes I loop through the palettes and see if one is a complete subset of another, and eliminate the subset palette. (If two palettes are identical, one is considered the subset). In my test set this step alone reduced the number of palettes from 512 down to about 200.
Next up is the realization that not all tiles use the whole 16 colors. Many actually have much smaller number of colors. So another non-destructive step is to merge palettes that overlap a bit and have some free space. I do this by looking for the least additional space required and merge, repeating until no merges can be done. I'm sure there's more efficient ways of doing this step, as it's surprisingly heavy. The number of palettes after this step in my test data is down to about 100.
There's of course frames that fit 16 palettes on one go and others that result in over 300 unique palettes after these steps.
My normal approach would be to again apply vector quantization here, but I can't think of a way to do it. Each of the palettes has 1-15 values in any order. The benefit of having a group of values you merge is that the error generated by a single step of merging is minimized.
The best I can do is to have a distance function between palettes. This is done by comparing two palettes one color at a time; find the ones with smallest distance, pair them up, calculate their distance, stash the result away and repeat until all colors are processed. Any leftover colors are considered extra distance.
Then I find the two palettes with the least distance and... throw one away. Repeating until I'm at 16 colors.
I'm throwing one away because simply averaging two palettes, however I do it, is pretty futile when you're dealing with 3 bit color. If you have colors 100 and 001, add them together and you have 101, divide each component by two and you're at 000. In practice this resulted in a lot of duplicate colors and very little else.
To improve things a bit, before throwing a palette away, I try to fill any empty spaces in the remaining palette from the one that's being thrown away.
Like with LFAC, the result is better than I expected, which is pretty easy when you expect total garbage.
There's still a lot to do. I have zero code on the zx spectrum next side, but napkin calculations say it should be possible to play the videos. It will take a huge chunk of vertical blanking time to copy the tile data in, but the palette can be double buffered and if the tile map can't, it can be copied in racing the beam without an issue. That leaves most of the frame for loading up the next frame off disk. Audio is possible (with LFAC) using copper.
There's many places where the whole process can still be (potentially) improved; instead of 4 sum pixels I could try 16; that would lead to 48 dimensions and 32 positions. Doesn't sound too great but better than 192 vs 8. There's surely better ways to merge palettes. I could try a final re-fitting pass where each 8x8 pixel group is matched with each of the 8 rotations of each of the 512 tiles with each of the final 16 palettes; those 65536 compares per tile might yield in better matches and ever so slightly better image quality at the cost of taking several seconds per frame to encode.
But all this is starting to sound to me like I'm postponing the work on the target machine.
One thing I really should do to the encoder is to multi-tread it, though. It's pretty slow already.
It's a topic I've touched before, and playing Mass Effect again (currently on a paragon run, after I had finished my assh-, ahem, renegade run) made me ponder about them again.
To reiterate, what I consider a "space fantasy game" is something like Mass Effect, Starflight, Space Rogue, Lightspeed or Star Control 2.
As most of these are so old that most people probably don't know what I'm talking about, they all have you travel the stars, talk to aliens, and in many cases shoot them.
Concentrating on Mass Effect and more closely the first one, what does the player do in the game?
The first Mass Effect is a surprisingly simple game. If you ignore all side content and optional conversations, it's possible to get to the end in under six hours, and that is a proper play-through, not a speedrun.
In fact, now that I'm doing a more thorough, paragon playthrough I'm surprised just how much stuff I skipped in the renegade run; I saw maybe 25% of citadel to begin with =)
What Mass Effect does very well is what Tim Schafer called a promise of infinite possibility. I remember the first time I played the game, I had this feeling that I did not know what the limits are; a feeling I had not had in games for a long, long time.
But I digress.
To distil what I feel a space fantasy game needs, it's basically a few systems, which is pretty close to the previous one:
Distilled to the very minimum, all of these could be done through a multiple choice system. Even the fighting is not absolutely necessary, but is a common way to add more gameplay time as well as provide context and consequence. Basically all the games in the genre also have some kind of inventory and commerce system, too, but even that's not exactly essential.
Let's take a shop as an example. You could have a 3d environment where you have to walk through multiple aisles looking for the items you want, pull them from the shelf, rotate them to read the ingredients / statistics and check the price, carry the items you selected somewhere to process them through the store's system and pay for them.
Or you could have a 2D menu. Or even a single click option to "replenish ammo" or whatever.
Same goes for other systems. In Star Control 2, travelling through hyperspace, realspace and approaching orbits is a (relatively simple) physics-based game system by itself. In Mass Effect, it's basically a 2D menu, albeit a pretty one.
In Space Rogue when you docked with a station you could walk around in an ultima-esque tile based 2d map to find space station's shops and NPC:s etc. In Star Control 2, it's a menu from which you can choose to talk with the station commander or go shopping.
Space Rogue is actually a quite odd duck in that it has both 3D space flying and 2D walking on space stations, as well as 2D shooting stuff.
Mass Effect, for all of its space opera, has fairly few actual space battles, and those are all pre-rendered animations. Star Control 2's main gameplay is in one-on-one space battles happening in (simple) physics based 2D combat.
Many of these games also include exploration. Mass Effect 1 has you drive around on planets in 3D, much like Star Control 2 does in 2D; Mass Effect 2 simplifies this to "shoot probes on planets", and Mass Effect 3 goes even simpler. Star Control 2 has you visit and land on every single planet and moon in every single star system, and there's probably hundreds of stars. Mass Effect only ever has a handful of systems.
Most of the complexity in Mass Effect is in the conversations. In very many cases what you do, with whom and in what order will cause some conversation to change. On the other hand, time is a really strange concept in Mass Effect; time advances only when certain missions are played. After you play a mission, you're (more or less) expected to run through your menagerie of NPCs, checking if any of their conversations continue, or if they're just busy with calibrations.
The couple exceptions are if you recruit Liara way later than the game expects you to, you get some additional dialogue, and Mass Effect 2 punishes you for not going to the last mission right after doing the prerequisite missions, even though that, too, leads to some otherwise unseen dialogue.
Star Control 2 has time that is constantly progressing, which has the effect of possibly losing complete alien civilizations (and access to their ships) if you're not fast enough. I honestly have no idea how they balanced this. It works pretty well. On your first playthrough, at least.
Games in general have seen various iterations of dialogue systems over the years, but everything seems to gravitate to smaller number of more general choices; in this, Mass Effect actually broke a lot of ground (thanks to Alpha Protocol being delayed). But under everything we're still talking about dialogue trees, and some branches being taken based on what stage the plot is in and what choices the player has made before.
Given that everything else (even the fights) could be done using a multiple-choice engine, the whole game could be a visual novel.
Could even this be simplified? Oh yes. Starflight, the grand-daddy of all space fantasy games, has an extremely simple conversation system. You have a bunch of keywords you can hit, and then get a paragraph of text. It may be a bit deeper than this, but since I haven't played it I don't really know. But it shows it can be simpler.
Ye Olde Ultima games had a keyword-guessing based dialogue system where every NPC is a database of entries and you had to guess the keyword to see a paragraph of text. Each paragraph would have keywords hilighted, and then you could try those keywords with other NPCs. And in various Nintendo games, dialogue systems are even simpler, with basically the only option is to read text again.
This means the whole game could basically be a bunch of static HTML pages. But that's definitely taking things too far.
So to sum things up, you pretty much need two systems - discussions and some form of fighting - to make a game in the genre. Everything else you add will improve immersion and give the player more stuff to do.
Maybe I'll manage to make one in the future. Just have to keep things simple. Short plot, lots of distractions, that seems to be the key.
Continuing on the thread of "Sol rants about 10 year old games", another game that I had ignored initially but what fell into my lap was Max Payne 3. And, oh boy, do I have thoughts about it. Minor spoilers ahead.
Compared to Remedy's Max Payne and Max Payne 2, gone is the cool, gone is film noir, replaced with gritty realism, shaky cam and visual distortions. "Continuity" from earlier games are short comments here and there. Max grieves his wife, Mona is dismissed. Some mafia guys' graves yield a comment or two. That's about it.
They did keep bullet time, leap dodge, painkillers and inner monologue. But that's about it. The story is really linear chain of what I'd call shooting galleries.
The gameplay loop goes approximately - keeping in mind that I was playing on easy - enter a room, shoot everyone, more bad guys flood in, kill 95% of them, die, retry from beginning. Or if you manage to survive, go through the only possible door available, which locks behind you, shoot everyone, more bad guys flood in, etc.
That means that you can't even make a game plan for clearing a room, because there's always more bad guys flooding in. That's why I ended up calling them shooting galleries.
Speaking of shooting, if you hit a bad guy they go down, and then climb back up for more. In later parts of the game the enemies take a ridiculous amount of bullets to go down. You learn early on to just go for headshots because nothing else works. And naturally later on enemies get helmets so you have to do that several times. There's also an enemy type that pops up two or three times in the story which can take dozens of hits in the head before going down.
Max's arsenal is also simplified, possibly for further gritty realism - you can carry two guns/submachine guns and a heavy gun (rifle, shotgun, grenade launcher), and that's it. I really missed being able to lob a grenade every now and then.
There's an additional painkiller mechanism - if a bad guy kills you, and you have painkillers left, you get a chance of shooting back and if you succeed (and don't, for example, run out of bullets trying), you automatically use a painkiller instead of dying. I'm pretty sure that also recovers more health than proactively using painkillers.
Sometimes room transitions are accompanied by cutscenes where Max does everything you can't, like jumping, using items or whatever. Pretty much all you can actually do is enter cover, exit cover, jump dodge, aim and shoot. Oh, and climb over cover sometimes. There's one (1) place in the whole game where you have to use the "climb over obstacle" button to progress, and that's pretty late in the game, and I had to look it up in the settings.
Every time those cutscenes play - which may, in their simplest form, be entering through a door and looking around - the game reverts to Max holding a pistol. Even though you are carrying a rifle that you've been exclusively using for the past five rooms. Even if you don't have any bullets for the pistol.
Since it's all gritty realism, the game's atmosphere is just bleak. Oh, and since you're in Brazil, about 90% of the game's dialogue is in (non-translated) Portuguese. I'm presuming most of it is just variations of "die you bastard", but still. The game's story is told in non-linear manner because why not, and some missions are back in New York, but the shooting gallery structure remains the same.
When you try to do any exploration, which is both really limited due to the small size of each shooting gallery and also pretty important because otherwise you'll miss all the ubiquitous painkillers (or "evidence" or "golden gun parts", the game's purely cosmetic collectibles), either some NPC or Max's internal dialogue immediately starts shouting that you should keep going and/or keep shooting. And it never stops.
There's some televisions in the game which may have had fun things (like a Captain Baseball Bat Boy cartoon in Portuguese) but you're actively discouraged from looking at any of that by the constant droning of "hurry up Max!" or whatever.
There's maybe one or two levels near the end that almost feel like you might be doing some exploration, but even there the constant nagging to move on persists. The game also has a couple "puzzle" rooms where you have to do something that's not immediately obvious or you die after an invisible timer runs out. These are just about as fun as they sound; you'll die once or twice and then you get over them.
I don't really have anything to say about the storyline itself. Bad guys do bad stuff, tons of people die, bad guys die, Max ends up on a beach with a drink in his hand. I don't mind an older Max, nor does his loon transformation from "has hair, no beard" to "no hair, has beard" irritate me too much. It serves it's purpose - making the non-linear story make more sense.
Overall, the whole thing just feels like a series of missed opportunities.
As an insult to injury, the end sequence (after beating the last boss) bugged on my PC. I thought it might have been related to a longer play period (like a few glitches earlier on, like a cutscene where Max is a passenger in a car and the driver's model had not loaded), but when I restarted and re-did the last fight, the problem persisted. So I watched it on YouTube instead.
So yeah, I think I made the right call for not buying it back when it was new.
I recently played through the mass effect legendary edition and I have some thoughts.
First, though, I built a MIDI controller using Teensy-LC and a bunch of pots:
You can read a making of here with tons of pictures.
Spoilers ahead, as you might expect, but hey, these are relatively old games.
I loved the original Mass Effect, and when Mass Effect 2 was coming, bioware said that they had a list of complaints from players and would "address every single one". This sounded (and still sounds) like a very bad idea.
Then Mass Effect 2 came out and it was way more "gamey", much less immersive. Locations didn't feel so much as locations as setpieces; you run through them and press F to return to your ship.
Okay, granted, the original ME had a lot of tedious stuff like the inventory management and pretty much forcing you to pick one weapon (gun, rifle, etc) for your whole playthrough, which meant I didn't feel like playing it again.
The legendary edition revamps ME1, largely throwing away the inventory and weapon limitations. It's a much more enjoyable game than the original one.
Then Mass Effect 3 came out and was only available on EA:s Origin, so I didn't buy it. Reviews weren't kind to it, but later DLCs (free or otherwise) expanded on it.
Through one bundle or another, can't remember which, I ended up getting the legendary edition. I had never done a renegade run of ME, so I figured what the heck, and started from the beginning. Renegade run is very good for just running through the story missions: someone starts their plea talk and you answer "just skip to what you want me to do". The renegade run also skips all of the talks with the council, etc. ME1 took about 6 hours, and that's not even a speedrun.
ME2 took a lot longer, if for no other reason, because I had never played ME2 with all the DLC. I kept to a single romance and skipped a lot of optional dialogue. I did run all of the loyalty missions, but quite likely missed a lot of content. Apart from the DLC addition, I don't really know what has changed between original ME2 and the legendary edition.
Like I said, I'd never played ME3 before. I'm pretty sure I went through all the side missions, including all the DLC, and still it felt ... short? I'm fine with the ending, even though they we never really got a payoff for the "Shepard is part machine, part organic" buildup. Considering all the stuff that was added after original release I'm not surprised it got bad reviews originally.
ME3 has some really weird design decisions, like weight limits for guns. Move from ME1 to ME2 meant you could use weapons more dynamically, and ME3 suddenly wants to limit that for no obvious reason, making the battles less fun. Interactive elements in the environment are also harder to find in ME3 than ME2, meaning you keep running through empty rooms more in hopes of not missing something important. Random enemy spawns (falling from the sky) are not fun, and make no sense in the story - why are they dropping outside barricades, if they can drop anywhere? Shield-carrying enemies are also just not fun.
Parts of the ME3 is kind of weird, where you stop and wonder why the heck are you doing this while there's a war going on. Some parts are is "painfully DLC", where it feels like you're in a star trek episode; everything feels so important but is completely disconnected from everything else, and whatever you do, the continuity doesn't care.
And overall ME3 is really dark, while other MEs have kind of hopeful atmosphere.
All whining aside, I kinda feel like starting a new paragon run now..
Well dang, it took me a while to update the site to a new year.
Let's start off with the new year demo, which was released almost four months ago now..
As usual, there's a making of writeup.
The new year demos are always "take an idea and run with it" whether it works or not. This one is technically nice but the visuals aren't too hot.
Since this is a year when everything seems to be changing, the gfxile community server is winding down, so I had to find a new home for the site. Xenorio offered me a place on his community server, so I gratefully accepted. As you may have noticed from the URL, I figured I might as well set up a domain finally (after being in several subdomains for 15 years).
As I said, everything seems to be changing. The world has changed, the server has changed, my health situation has changed (but will hopefully get treated), and there's a few other changes I can't talk about yet, and some I'm not going to talk about.
There are several reasons for open sourcing it, primary being that it didn't really take off. Being open source people can take it further if they get inspired. Considering that it was always free to try, I hope nobody who paid money for it feels bad about this move.
I've put (quite bit of) work into the FLX animation format for the spectrum next. I'll probably write a blog post about this at some point. I also wrote an SD card benchmark for the next. I should make a separate section on this site for the stuff I've done for the next.
I also spent some time on a cinepak-style video compressor but that didn't go much anywhere. Files were small, though.
Revenue from the soloud book has been 1.90 eur so far. A smash hit! Granted, I've put author's share of the price to a minimum just to keep the book price as low as possible, and I never expected the book to sell a lot. Still fun to see the book out there.