{"id":18391096,"url":"https://github.com/fragglet/imaginot","last_synced_at":"2025-04-07T02:35:32.362Z","repository":{"id":218252069,"uuid":"735046378","full_name":"fragglet/imaginot","owner":"fragglet","description":"Fixing Sopwith's multiplayer!","archived":false,"fork":false,"pushed_at":"2024-10-02T03:42:20.000Z","size":215,"stargazers_count":4,"open_issues_count":3,"forks_count":0,"subscribers_count":4,"default_branch":"trunk","last_synced_at":"2025-04-06T08:11:38.156Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fragglet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-23T13:25:35.000Z","updated_at":"2025-03-06T05:55:29.000Z","dependencies_parsed_at":"2024-01-25T04:28:27.169Z","dependency_job_id":"684d839f-d88f-4b1c-b4bb-b3fa857dc2ca","html_url":"https://github.com/fragglet/imaginot","commit_stats":null,"previous_names":["fragglet/imaginot"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fragglet%2Fimaginot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fragglet%2Fimaginot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fragglet%2Fimaginot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fragglet%2Fimaginot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fragglet","download_url":"https://codeload.github.com/fragglet/imaginot/tar.gz/refs/heads/trunk","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247583715,"owners_count":20962068,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T01:50:38.620Z","updated_at":"2025-04-07T02:35:31.871Z","avatar_url":"https://github.com/fragglet.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n![Imaginot logo](imaginot.svg)\n\nThis is an adapter program for the DOS versions of\n[Sopwith](https://en.wikipedia.org/wiki/Sopwith\\_%28video_game%29)\nto make its multiplayer feature work. In particular, it can be played\nover the\n[IPX protocol](https://en.wikipedia.org/wiki/Internetwork_Packet_Exchange)\nlike most other DOS games. This allows multiplayer\nSopwith to be played over the Internet in [DOSbox](https://www.dosbox.com/).\n\nA demo video [can be found here](https://www.youtube.com/watch?v=qgHfTwQQ8u8).\n\n## Background\n\nAlmost everyone who has played Sopwith has noticed the \"Multiplayer\"\noption on the main menu. Anyone curious enough to have tried to get it\nto work has invariably failed. It seemed like a broken feature.\n\nIn fact, it is not broken; you just need some very unusual networking\nhardware to use it. Sopwith was written as a demo program for BMB\nCompuscience's\n[\"Imaginet\" networking system](https://fragglet.github.io/sdl-sopwith/history.html#imaginet).\nImaginet allowed multiple computers to share a single disk drive to\nexchange data; Sopwith's multiplayer feature uses a shared file that is\nread and written by multiple computers to communicate. However, since it\nuses raw sector-level disk access, it is not possible to make it work\nusing something like Windows file sharing.\n\nNY00123 [recently had some success](https://www.youtube.com/watch?v=HxEBEqbuIqI)\ngetting Sopwith's multiplayer mode to work, by having multiple QEMU\nvirtual machines share a single floppy disk image. The game runs slow\nand clunky, and can only work on a single machine; however, it gave\nsome hope to the idea that it might be possible to get the feature\nworking properly at long last. In particular it was encouraging\nbecause it showed that only the standard PC hardware interfaces\nare needed; there is no need for any special drivers or emulation of\nthe BMB hardware.\n\n## Imaginot\n\nImaginot builds on NY00123's discovery by providing a full adapter\nprogram that allows Sopwith to be played using a normal networking\nstack. To accomplish this, it has to do some low-level hackery to\n\"trick\" Sopwith into thinking it's using the BMB hardware:\n\n* The program hooks a number of interrupt handlers: the PC BIOS API\n  (interrupt 13h), the DOS API (interrupt 21h) and the DOS low-level\n  sector read/write APIs (interrupts 25h and 26h). The goal here is to\n  emulate a floppy disk drive B: and respond to the API calls that\n  Sopwith uses to read and write to it.\n\n* When Sopwith reads from the virtual disk, it sees what looks like a\n  FAT12 file system containing the files it expects. Reads and writes\n  to these \"files\" are interpreted by the driver, which has special\n  knowledge of their format (thanks to the Sopwith source code having\n  been open sourced many years back!)\n\n* Sopwith's networking is supposed to work by different machines\n  reading and writing to a shared file.\n  This is inherently a [stop and wait](https://en.wikipedia.org/wiki/Stop-and-wait_ARQ)\n  protocol, which does not work well over long-distance networks.\n  Instead, *Imaginot* works by sending a pipeline of the input commands\n  between the different peers in the game. This approach helps to make\n  the game more playable over the Internet.\n\n* *Imaginot* reuses the [driver interface from Doom](https://doomwiki.org/wiki/Doom_networking_component).\n  This allows Sopwith to be played over a number of different networking\n  protocols and technologies: Serial/Modem, IPX, Parallel Port, Serial\n  Infrared and UDP, to name a few found in the\n  [Vanilla Utilities](https://github.com/fragglet/vanilla-utilities)\n  collection. Included are drivers for IPX and UDP.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffragglet%2Fimaginot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffragglet%2Fimaginot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffragglet%2Fimaginot/lists"}