A vintage KiSS doll viewer for modern Android.
DroidKiSS comes in "Full" and "Lite" editions. Don't worry, both editions are free of charge and contain no ads. There is no "premium" edition and I don't do ads.
The only real difference between the editions is that the Full edition incorporates LibVLC, whereas Lite does not. Now, you need to understand that LibVLC is a huge library; VLC is known to essentially incorporate every single media encoding known to man. Just by including this library alone, the Full edition is several times the size of Lite. Crazy, right?
Now, the reason I created a version incorporating LibVLC in the first place is because many old dolls contain non-PCM WAV files. Android's default MediaPlayer and SoundPool classes simply do not like non-PCM WAV files. (If you don't know what that means: let's just say that PCM is the "standard" for WAV, but technically they can use other codecs. The thing is though that those other codecs don't have universal support.)
This does mean that certain audio files simply will not play in the Lite edition; it's a tradeoff, and at this point, essentially by design. This problem does not exist in the Full edition, but as I said, the app size is much larger. I guess it all depends on how important you think audio in KiSS dolls is.
A related difference is the fact that I included a soundfont file for playing MIDIs in the Full version. This is because LibVLC requires one; it does not use the on-board MIDI card. The default Android media player does, however, and therefore it's not included in Lite. I made sure to use a good-sounding soundfont for the Full version with a compatible license. Either way, because of this, MIDIs will sound different in each version, although the actual quality difference should be minimal (the on-board Android card isn't actually that bad, in my opinion).
By the way, you can install both editions side by side, just in case you wanted to do that. They do not conflict.
KiSS dolls are vintage digital dress up games, first developed in Japan all the way back in the early 90s. They predate Flash, as well as most modern JavaScript standards. The term "KiSS" is an acronym for "Kisekae Set System" ("kisekae"(着せ替え(きせかえ))meaning "to dress up" in Japanese).
- The main information of a KiSS doll is stored in a CNF file.
- Has its own image format (CEL).
- Has its own palette format (KCF).
- Has its own scripting language, called "French KiSS" (often called "FKiSS" for short). This is written in the aforementioned CNF. It features all kinds of functions, from press actions, animations, showing and hiding elements... you name it.
- Multiple cels can be given the same object number, making them "stick" (e.g. the front and back of a T-shirt).
- Objects are draggable by default. You have to set a "fix" value (usually above 100) to make them non-draggable.
- A typical KCF file contains 16 or 256 colors. This means that most CEL files are in an indexed format. However, true color is possible (called "Cherry KiSS", or "CKiSS" for short).
- Audio (WAV, AU, MIDI) is supported.
- Typically, KiSS dolls are distributed by packaging every relevant file into an LZH archive.
As you can see, KiSS mostly uses its own exclusive file types and standards. On top of that, it traditionally used the archaic LZH format for compressing/packaging dolls. As a result, it is not a very accessible format for modern users. I hope to make it slightly more accessible with this app.
Long-pressing an object will "unfix" it if not draggable, and "fix" it if draggable. On desktop viewers, this is usually done through right-clicking the object and selecting "Unfix" and "Refix" from a context menu. Obviously, you can't right-click on a phone (and I thought a context menu would be overkill), so I utilized a simple long-press as a substitute.
As a child, I was obsessed with KiSS dolls. I didn't know how to do JavaScript yet, and Flash was also "too difficult", so at the time I never bothered with all that and instead stuck with KiSS. And to be fair, the FKiSS scripting language is relatively easy to understand, even for a child. So, in the days before Scratch, I attempted (keyword) to make my own dolls.
Therefore, it is sad to say that I never finished a single doll. Granted, they do take a lot of work to create. However, I did manage to join a collab at one point and contribute my own outfit to a doll at age 12. (If you ever see the name "Hikaru-chan" in a KiSS doll context, that's most likely me.)
Back to the modern day. While I've long since retired from creating KiSS dolls, I do still have an affinity for dress up games. I've long since moved on to JavaScript for creating them, especially since you can do much more with JavaScript than with FKiSS. But, playing with the old KiSS dolls is still a fun pastime to me, and I'd like to "preserve" the hobby in some way, including on modern systems. Not only that, but the idea of playing with your favorite old dolls anywhere you like is a very fun idea to me.
Now, this project is by no means the first viewer for Android. However, the other viewers have either been discontinued or lack some features I consider essential. Most importantly, though: none of them work on modern 64-bit Android systems. All of these factors have made me decide to create my own viewer. And thankfully, unlike when I was 12, I now actually know a little bit about programming, making it much less scary to create my own viewer. Though, I did have to restart like 5 times or so. In fact, I almost gave up; yet, here I am, with an actually functioning app.
- FKiSS 4, as of now, has limited to no support. FKiSS 3 is supported a little bit, but not everything.
- Sometimes, audio is a little bit laggy (especially in the full version). Looping audio often has a gap in-between and in the full version, sometimes sounds won't play (due to LibVLC). I'm trying to find a solution for this still, though I'm not entirely sure if that's even possible (LibVLC is known to be a bit iffy with this).
Some WAV/AU files will not play, remaining silent instead; this is a limitation of the native Android sound API. Basically, only PCM-encoded WAV/AU files will play. The only way to solve this problem would be to incorporate FFmpeg into the project. Given how huge that library is, I'm not sure yet if I wanna deal with that. Therefore, for now: tough luck, and I'm sorry. (I'm willing to consider FFmpeg again if enough feedback is given in its favor. Do keep the app size in mind, however.)No longer present in the Full version of the app. It persists in Lite; this is by design, since it keeps the app lightweight by not using LibVLC.Object bounding boxes are currently being calculated from the width and height of only one cel within said object, meaning that sometimes, objects can "clip" weirdly at the edges. One day, I hope to make this calculation object-dependent instead (I've tried before, and it sadly wasn't working out at the time, so for now, this will have to do).Fixed as of version1.7-beta.
If you encounter any more bugs that I perhaps missed, please feel free to open an issue.
The main place I recommend to download KiSS dolls from is the old website OtakuWorld. It used to be a paysite at one point, but hasn't been since 2014, meaning you can download everything on there for free nowadays (don't let the "Free KiSS Zone" distract you; it's an artifact of olden times).
Another good place to find dolls, including historical ones (many of which are otherwise gone from the internet), is William Miles' UltraKiss Web Portal. While designed for inclusion in UltraKiss, most of the dolls on there can be played in other viewers as well, including DroidKiSS.
There's also Ephralon's KiSS cafe, which is a place I hung out on a lot back in the day. And I may or may not have joined a certain KiSS doll collab there when I was 12.
There's also good ol' Archive.org, in both the "main" section as well as the Web Archive. Not only are there plenty of old KiSS doll websites archived, but the "main" archive also contains archived KiSS dolls (both indidivual ones and collections) for download. Take a look, I'd say.
In short: No, and it most likely never will. For one, there are certain features that are rather complicated and/or rarely used (I don't even understand what all of them do!). But also, there are some things that are simply very difficult to implement within the context of a phone/tablet.
Take keypress and mousein/mouseout as just a few examples.
The first one creates an event that gets triggered by a press on your keyboard. It's not impossible to implement, but I'd have to find a way to incorporate the phone/tablet keyboard into this.
The second two are hover events. Which is something you do with your mouse. Guess what most people don't use on a phone. Yeah, exactly. I guess in theory I could think of a different way to implement this (e.g. similar to how web pages do it), but I'm not yet sure whether I want to do that or not. And these aren't the only ones!
Now, of course, there are still plenty of functions that I'd love to support, but aren't yet at this time. I will work on them as the app matures. Just one example: implementing palette/color changes should definitely be possible down the road.
As for the functions that are already supported, I plan to write all that down in a longer dedicated FAQ page down the road, perhaps on a dedicated website.
ZIP archives have been implemented as of version 1.8-beta.
As for the rest, likely not. As convenient as these may seem to implement, the truth is that they're almost never used in KiSS dolls. I simply wanted to create a modern Android viewer to view vintage dolls with. I will consider it only if there's somehow ever a KiSS doll revival and people want to use more modern solutions to create dolls with. I mean, JavaScript is right there, but...
Maybe, but if I do, likely not everything. There are some FKiSS5 functions that don't seem too hard to implement (confirm dialogs, for example). But it's not a very high priority at the moment since they're rarely (if ever) used in KiSS dolls.
Simple: don't! Yes, that's right - the literal developer of a KiSS doll viewer recommends against creating your own KiSS dolls. Just use JavaScript - jQuery UI with Touch Punch, HTML5 game engines, maybe even vanilla JS if you want to be hardcore... anything except this old, obscure, crusty format. Trust me, you'll be a lot happier using modern web technology. You can do everything a KiSS doll can do with JavaScript and much more. Plus, every modern web browser supports it. There are even ways to make your JavaScript doll run offline in case you're worried about that.
But in case you really want to: GIMP can export KiSS CEL files. I'm not going to help you with the rest. Either way, as much as I think you should just use JavaScript, I can't stop you if you really want to do this.
F-Droid is planned on the long term, once DroidKiSS is out of beta state. Google Play, on the other hand, is a hard no. Not only does putting your app on Google Play cost money, but there are also a lot of privacy concerns associated with it. Therefore, I prefer to focus on repositories that respect developer privacy (and that are preferrably free of charge, though I consider privacy somewhat more important).
- First of all, I owe a huge thanks to William Miles and his fantastic UltraKiSS project. (There you go: a great cross-platform viewer for desktop.) I've incorporated the LZH extraction code from that project into my own, since nothing else seemed to be working. I would've still been stuck at the doll extraction state if I hadn't incorporated this code (thankfully Java and Kotlin can interoperate, so I had to change very little to nothing). I've licensed DroidKiSS under the GPL 3.0 to ensure compatibility with the used code.
- Some of my own code was written with the help of Google Gemini. I know this is enough to put some people off from the project, in which case... well, there's not much I can do about that. Please do understand though that I wrote plenty of the code by myself, and that everything is 100% human-vetted and human-tested. I mostly used it as a tool to relieve the workload somewhat and to stop myself from getting confused. I don't simply vibecode nonsense, you know. (As a sidenote, the logo and icons for this project were created 100% by hand, based on a similarly hand-drawn vector that I downloaded from Pixabay. I don't care for AI art and also don't consider it fun to make, so you'll never see me create and/or use it. And this readme wasn't written with AI either. I don't write text with AI.)