I have loved playing VASSAL for years, it was actually my gateway into ASL, Space Empires and others. However I am now quite time-poor and travel frequently. I want to play wargames on the go, but my main hardware consists of iOS devices.
I tried setting up UTM and virtual machines on my iPad/iPhone, but that is nearly impossible without jailbreaking. Onboard wifi is not always standard (and not even at high speeds) and remote areas don’t allow me to reliably remote into a desktop, and I don’t want to lump an extra mini PC around. Frustratingly those exact offline transit hours are the prime downtime I want to use for gaming.
Suffice to say this desire + the Fable 5 allowance frenzy in the last few days has led me to hack together a self-hostable, local, iOS friendly, browser-based Vassal emulator. It runs locally in the browser and can:
Import standard modules and parse various elements (tested on grand total of 3 games so far).
Displays a fast counter browser for chits and game elements.
Handle pop-up game aids and right-click context menus, and one module has a mini-map.
Import and export compatible .vsav game files (currently limited for VASL itself).
It is admittedly very rough around the edges and heavily vibe-coded, BUT it is finally starting to become functional. I know Android benefits from the linux desktop and explained in docs, but cleary this would work on Android/any JVM-less potato as well.
Before I sink more time into polishing it / becomes possible to publicise a repo, I wanted to test the waters: is this something the community would be interested in trying or helping to test? I would love to hear your thoughts!
PS: This litteraly comes at the same time as DrEvil’s prototype which is a completely separate topic about (this is just a replacement for the Vassal JVM UI, using AI to code - not play) - and I loved Midwinter as a kid!
It’s a typescript interpreter of the vmod file format (and associated extensions/vsav) - relying on two approaches:
the engine porting piece: parsing of the buildFile as a typed model the java class, interpretation of traits, rendering of components onto a canvas → it aims to be module agnostic and ships with no assets
its reason to exist = be a bit more mobile friendly, for example:
pan vs selection mode
counters presented with a filter/search bar for easier navigation
there is an ability to lock counters onto the canvas, so you don’t accidentally move the wrong tokens
there is the concept of ‘layers’ so chits go to a ‘model’ layer, terrain to a terrain one, game aids to an aids one ->this does work based on classification on module layer names so for now is a bit hit and miss (but locking works if you don’t want to drag a big Start Fleet Battles starship SSD!)
Here is Star Fleet Battles - another favorite hours-long game that can now be played a bit more on the go: this is literally on first open to illustrate how it can just parse modules generically like the Java implementation.
If this is considered ok and there’s interest, I’m going to clean up the repo (the tests still refer to specific module names/content checks which I think will be a problem), and link. After a bit more polish on features (you can see the right click menus on the chits aren’t perfect, ability to draw cards and custom LOS parsing), this is basically where the bulk will end (no multiplayer aspect, no AI in the playing of the game itself on this ‘emulator’).
Yes this is very close to what I have done and am ready for people to test. My version has UI tiers:
Tier 0 - looks and plays like current vassal in HTML
Tier 1 - imposes movement rules according the published rule book
Tier 2 - resolves all combat
Tier 3a - you play against a basic AI that tries to beat you but also teaches you
Tier 3b - the AI is attached to active LLM and will likely crush you, responding to your unique strategy
I have this now for Tobruk and Afrika Corp. Looking for beta testers. Should be portable to any platform or maybe better - merge with the work in this thread??
I should add that this goes at least some distance in providing an API for Vassal, with an MCP being easy to bolt on, so you could literally play a game with verbal instruction. Like “move all elements of the 508 PIR to positions on roads approaching Nijmegen from the south”
I’m having a hard time understanding the effort being put into building atop V3 at exactly the time when I’m trying to wind down V3 development and retire the V3 file format. Would you like to say something regarding that?
How are you managing to read modules, saves, and logs from the browser, and write saves and logs?
On V3: I’m not building on V3 or extending its format — I’m reading V3 modules as an input, not treating them as a foundation. Thousands of games live in that format today, so my tool ingests a .vmod, pulls the rules/art/pieces out into a neutral data representation, and runs from that. My engine and its own save/log format are independent of V3 and deliberately line up with where V4 is heading (a JSON command stream), not with perpetuating V3. So it’s less “building atop V3” and more “reading V3 once to get the content out.”
On the mechanism: modules, saves, and logs are all just ZIP archives. In the browser I unzip them and parse the contents — the buildFile for module structure, the serialized command/state for saves and logs. For writing, I don’t emit V3 saves/logs at all — I write my own append-only command log (essentially the shape you use in the V4 log: move/rotate/clone with object IDs and coordinates), which is what my legality gate and verifier run against.
If I can get one person to be hooked on any game they discovered in the vassal library so as to want to play it on commute to work or on a long haul flight, and get into a game enough to share with their friends, bought the physical version and even used the original vassal engine for multiplayer, then mission accomplished.