{"id":17653876,"url":"https://github.com/arcomage/arcomage-hd","last_synced_at":"2025-10-12T15:45:41.795Z","repository":{"id":37760425,"uuid":"353447127","full_name":"arcomage/arcomage-hd","owner":"arcomage","description":"Web-based, free and open source, remastered 3D clone of 3DO/NWC's 2000 card game Arcomage. 14 languages. Desktop or mobile Android iOS. Online or offline PWA. Against AI or Multiplayer (P2P, no server). 🧝👾🃏 (ts+react+redux+rxjs, CSS-based anim, WebRTC)","archived":false,"fork":false,"pushed_at":"2025-03-17T19:30:25.000Z","size":61383,"stargazers_count":157,"open_issues_count":23,"forks_count":36,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-09-12T07:58:35.970Z","etag":null,"topics":["3do","arcomage","card-game","game","game-clone","might-and-magic","minigame","multiplayer","nwc","pwa","react","react-game","redux","redux-observable","remaster","rxjs","tower-defense","typescript","typescript-game","webrtc"],"latest_commit_sha":null,"homepage":"https://arcomage.github.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arcomage.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.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,"zenodo":null}},"created_at":"2021-03-31T18:04:54.000Z","updated_at":"2025-09-07T10:52:24.000Z","dependencies_parsed_at":"2025-02-06T19:12:17.369Z","dependency_job_id":"74353ec8-c5a3-4a88-9ada-439836ed19f4","html_url":"https://github.com/arcomage/arcomage-hd","commit_stats":{"total_commits":451,"total_committers":4,"mean_commits":112.75,"dds":"0.019955654101995512","last_synced_commit":"4c7e6011ecebcc861df0b9fc675fca66db7435ec"},"previous_names":[],"tags_count":139,"template":false,"template_full_name":null,"purl":"pkg:github/arcomage/arcomage-hd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcomage%2Farcomage-hd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcomage%2Farcomage-hd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcomage%2Farcomage-hd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcomage%2Farcomage-hd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arcomage","download_url":"https://codeload.github.com/arcomage/arcomage-hd/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arcomage%2Farcomage-hd/sbom","scorecard":{"id":205731,"data":{"date":"2025-08-11","repo":{"name":"github.com/arcomage/arcomage-hd","commit":"51c597c38d4a388da7bf2afdacab6b094f81fa99"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/deploy.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/arcomage/arcomage-hd/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/arcomage/arcomage-hd/deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/arcomage/arcomage-hd/deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/arcomage/arcomage-hd/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/arcomage/arcomage-hd/test.yml/main?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.0.0-beta.26 not signed: https://api.github.com/repos/arcomage/arcomage-hd/releases/41242458","Warn: release artifact v1.0.0-beta.26 does not have provenance: https://api.github.com/repos/arcomage/arcomage-hd/releases/41242458"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-16T23:41:22.938Z","repository_id":37760425,"created_at":"2025-08-16T23:41:22.938Z","updated_at":"2025-08-16T23:41:22.938Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279011861,"owners_count":26085005,"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","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["3do","arcomage","card-game","game","game-clone","might-and-magic","minigame","multiplayer","nwc","pwa","react","react-game","redux","redux-observable","remaster","rxjs","tower-defense","typescript","typescript-game","webrtc"],"created_at":"2024-10-23T12:07:22.494Z","updated_at":"2025-10-12T15:45:41.776Z","avatar_url":"https://github.com/arcomage.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003ca href=\"https://arcomage.github.io/\"\u003e\u003cimg width=\"250\" src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/assets/logo/logo.svg\" alt=\"ArcoMage HD logo\"\u003e\u003cbr\u003e\u003cbr\u003e\u003cstrong\u003earcomage.github.io\u003c/strong\u003e\u003c/a\u003e\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eArcoMage HD - Open Source Card Game\u003c/h1\u003e\n\n**ArcoMage HD** is a web-based, free and open source, remastered 3D clone of 3DO and New World Computing's 2000 PC card game, _Arcomage_, which was featured in the _Might and Magic_ RPG series.\n\nThis non-profit fan remake brings the classic tower defense and resource management fantasy game to modern platforms, and is developed by [@tomchen](https://github.com/tomchen) using TypeScript, React, Redux, redux-observable, RxJS, CSS animations, and WebRTC (see [§ Development](#development)). If you enjoy the game, please support me by starring the repository or following me on [GitHub](https://github.com/tomchen).\n\nArcoMage HD is available in 14 languages: English, French, German, Simplified Chinese, Traditional Chinese, Spanish, Italian, Russian, Czech, Polish, Brazilian Portuguese, Japanese, Ukrainian, and Arabic (with RTL support). ([§ Translation Credits](#translation-credits))\n\nIt's compatible with the latest versions of \u003ca href=\"https://www.google.com/chrome/\" title=\"Google Chrome\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/browsers/chrome.svg\" alt=\"Google Chrome\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://www.mozilla.org/firefox/browsers/\" title=\"Firefox\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/browsers/firefox.svg\" alt=\"Firefox\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://www.apple.com/safari/\" title=\"Safari 14+\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/browsers/safari.svg\" alt=\"Safari 14+\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://www.microsoft.com/edge\" title=\"Microsoft Edge\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/browsers/edge.svg\" alt=\"Microsoft Edge\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://www.opera.com/\" title=\"Opera\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/browsers/opera.svg\" alt=\"Opera\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://www.samsung.com/us/support/owners/app/samsung-internet\" title=\"Samsung Internet\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/browsers/samsung_internet.svg\" alt=\"Samsung Internet\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e and other modern [browsers](troubleshooting.md#browser-support).\n\nThe game is fully responsive, supporting desktop, tablet, and mobile devices 🖥️💻📱. [As a PWA, you can install it and play offline](#play-offline-pwa). It is fully controllable with [mouse](gamecontrols.md#mouse), [touch device](gamecontrols.md#touch-device), [keyboard](gamecontrols.md#keyboard), or [gamepad](gamecontrols.md#gamepad) 🖱️📱⌨️🎮, and includes comprehensive [accessibility features for users with disabilities](#game-controls--accessibility).\n\nBy default, you'll play against the computer AI 🤖 in Single Player Mode. You can also switch to [Multiplayer Mode 🧑‍🤝‍🧑](#multiplayer-mode).\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://arcomage.github.io/\"\u003e\u003cstrong\u003eClick here to play it now!\u003c/strong\u003e\u003cbr\u003e\u003cbr\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/assets/logo/ogimage.jpg\" alt=\"ArcoMage HD screenshot\"\u003e\u003c/a\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/arcomage/arcomage-hd/blob/main/CHANGELOG.md\"\u003e\u003cimg src=\"https://img.shields.io/github/package-json/v/arcomage/arcomage-hd\" alt=\"version number\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/arcomage/arcomage-hd/actions/workflows/test.yml\"\u003e\u003cimg src=\"https://github.com/arcomage/arcomage-hd/actions/workflows/test.yml/badge.svg\" alt=\"Actions Status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/arcomage/arcomage-hd/blob/main/CREDIT.md\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-brightgreen\" alt=\"License\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Gameplay\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/manual.jpg\" alt=\"ArcoMage HD Manual Image\"\u003e\u003c/a\u003e\u003c/p\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cstrong\u003eClick to view the game rules in text format\u003c/strong\u003e\u003c/summary\u003e\n\n\u003e Victory conditions vary per tavern. Build your tower, destroy your opponent's tower, or collect enough resources before your opponent does.\n\u003e\n\u003e Large yellow numbers in column are the productions. This is how many new units of a particular resource you will receive on your next turn. Small black numbers in column are the resources. This is how many units you have available to spend on your current turn.\n\u003e\n\u003e Cards: Each have their own cost to play, indicated in a small circle in the lower right corner of the card. The cost will be deducted from your resources according to the color of the card. Left click on a card plays the card. Right click on a card to discard without playing.\n\u003e\n\u003e Red represents your Quarry Generator which produces your Brick 🧱 resources, blue represents your Magic Generator which produces Gem 💎 resources, green represents your Dungeon (aka. Zoo) generator which produces Recruit (aka. Beast) 🐲 resources.\n\n\u003c/details\u003e\n\n## Play Offline (PWA)\n\nThe image and sound files, along with your card and language settings, are automatically stored in your browser. Additionally, you can install this \"Progressive Web App\" (PWA) on your computer or smartphone. For installation instructions, please refer to [Google Chrome's guide](https://support.google.com/chrome/answer/9658361) and [Mozilla's guide](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Installing).\n\nDepending on your browser, you may need to press \u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eF5\u003c/kbd\u003e to clear the cache and reload the [arcomage.github.io](https://arcomage.github.io) webpage to ensure you're using the latest version of the game.\n\n## Game Controls \u0026 Accessibility\n\nThe game is fully controllable using either a **[mouse](gamecontrols.md#mouse)**, **[touch device](gamecontrols.md#touch-device)**, **[keyboard](gamecontrols.md#keyboard)**, or **[gamepad](gamecontrols.md#gamepad)** (click these links to view detailed instructions).\n\nThe game is fully compatible with and easy to use with a [screen reader](https://en.wikipedia.org/wiki/Screen_reader). You can also disable animations in the graphics settings if desired.\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://arcomage.github.io/\" title=\"Blind Friendly\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Blind_Friendly-black\" alt=\"Blind Friendly\"\u003e\u003c/a\u003e\n\u003ca href=\"https://arcomage.github.io/\" title=\"Color Blind Friendly\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Color_Blind_Friendly-white\" alt=\"Color Blind Friendly\"\u003e\u003c/a\u003e\n\u003ca href=\"https://arcomage.github.io/\" title=\"Deaf Friendly\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Deaf_Friendly-purple\" alt=\"Deaf Friendly\"\u003e\u003c/a\u003e\n\u003ca href=\"https://arcomage.github.io/\" title=\"Motion Sickness Friendly\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Motion_Sickness_Friendly-yellow\" alt=\"Motion Sickness Friendly\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Multiplayer Mode\n\n### How to Use Multiplayer Mode\n\nhttps://user-images.githubusercontent.com/529949/115864733-941cbd00-a437-11eb-955d-f6a341c8ea64.mp4\n\n1. Both players enable \"Multiplayer\" Mode (click the gear ⚙️ icon in the game to open the \"Preferences\" window)\n2. Bob 🧝 must copy and **share his ID with Alice 👧 via Discord, forums, etc.**\n3. Alice 👧 enters Bob 🧝's ID and connects to him\n4. Alice 👧 becomes the host 🏠 (her computer deals the cards), and Bob 🧝 is the guest 💼\n\n**Note:** Multiplayer Mode may not function if both players are behind symmetric NAT. You can [test if you're behind \"bad\", symmetric NAT](https://tomchen.github.io/symmetric-nat-test/).\n\n\u003cdetails\u003e\u003csummary\u003e\u003cstrong\u003eClick to show technical details\u003c/strong\u003e\u003c/summary\u003e\n\n### Technical Details\n\nIn Multiplayer Mode, the game establishes a direct Peer-to-Peer (P2P) connection with the opponent, eliminating the need for a central server. However, it still relies on free public [STUN](https://en.wikipedia.org/wiki/STUN) servers (provided by Google and others) and a signaling server (via [PeerJS](https://peerjs.com/docs/)) for peer discovery and exchanging connection details. Once the connection is established, players communicate directly without requiring any servers.\n\nThe game doesn't use any servers, so there isn't a central \"list of online players\" for easy matchmaking. Instead, you must share your ID with your opponent through platforms like Discord.\n\nFor more details, see [WebRTC (Web Real-Time Communication)](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) and [PeerJS library](https://peerjs.com/).\n\nCurrently, since the game doesn't use a [TURN](https://en.wikipedia.org/wiki/Traversal_Using_Relays_around_NAT) server, it cannot connect two users who are both behind symmetric NAT (a rare scenario).\n\n\u003c/details\u003e\n\n## Troubleshooting\n\nIf you're experiencing performance issues while running the game, or if the game doesn't run at all in your browser (likely an older or non-major browser), you can refer to the [troubleshooting guide](troubleshooting.md). It includes a [list of tested browsers](troubleshooting.md#browser-support) that are known to run the game without major issues. Additionally, you may consider installing the Windows [Desktop Version](troubleshooting.md#desktop-version) of the game ([click to download](https://github.com/arcomage/arcomage-hd/releases/download/v1.0.0-beta.26/ArcoMage.HD.Setup.1.0.0.7z)), though please note that the current desktop version is not recommended in most cases.\n\nIf you encounter any issues, please [open an issue](https://github.com/arcomage/arcomage-hd/issues).\n\n## Development\n\nThe stack :\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://www.typescriptlang.org/\" title=\"Typescript\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/typescript-icon.svg\" alt=\"Typescript\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://reactjs.org/\" title=\"React\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/react.svg\" alt=\"React\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://redux.js.org/\" title=\"Redux\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/redux.svg\" alt=\"Redux\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/redux-observable/redux-observable\" title=\"redux-observable\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/redux-observable.svg\" alt=\"redux-observable\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://rxjs.dev/\" title=\"RxJS (ReactiveX)\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/reactivex.svg\" alt=\"RxJS (ReactiveX)\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://webrtc.org/\" title=\"WebRTC\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/webrtc.svg\" alt=\"WebRTC\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://developers.google.com/web/tools/workbox\" title=\"Workbox\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/workbox-icon.svg\" alt=\"Workbox\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://peerjs.com/\" title=\"PeerJS\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/peerjs.png\" alt=\"PeerJS\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript\" title=\"JavaScript\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/javascript.svg\" alt=\"JavaScript\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://tc39.es/ecma262/\" title=\"ECMAScript 6+\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/es6.svg\" alt=\"ECMAScript 6+\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://bun.sh/\" title=\"bun\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/bun.svg\" alt=\"bun\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://vite.dev/\" title=\"Vite\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/vite.svg\" alt=\"Vite\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://sass-lang.com/\" title=\"Sass\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/sass.svg\" alt=\"Sass\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://tailwindcss.com/\" title=\"Tailwind CSS\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/tailwindcss-icon.svg\" alt=\"Tailwind CSS\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://prettier.io/\" title=\"Prettier\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/prettier.svg\" alt=\"Prettier\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://eslint.org/\" title=\"ESLint\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/eslint.svg\" alt=\"ESLint\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/postcss/postcss\" title=\"PostCSS\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/postcss.svg\" alt=\"PostCSS\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/postcss/autoprefixer\" title=\"Autoprefixer\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/autoprefixer.svg\" alt=\"Autoprefixer\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.cursor.com/\" title=\"Cursor\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/cursor.svg\" alt=\"Cursor\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://code.visualstudio.com/\" title=\"Visual Studio Code\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/visual-studio-code.svg\" alt=\"Visual Studio Code\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://testing-library.com/\" title=\"Testing Library\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/testing-library.svg\" alt=\"Testing Library\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://istanbul.js.org/\" title=\"Istanbul\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/istanbul.svg\" alt=\"Istanbul\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://codecov.io/\" title=\"Codecov\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/codecov.svg\" alt=\"Codecov\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://inkscape.org/\" title=\"Inkscape\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/inkscape.svg\" alt=\"Inkscape\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.adobe.com/products/illustrator.html\" title=\"Adobe Illustrator\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/adobe-illustrator.svg\" alt=\"Adobe Illustrator\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.adobe.com/products/photoshop.html\" title=\"Adobe Photoshop\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/adobe-photoshop.svg\" alt=\"Adobe Photoshop\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n(Used in ≤1.4.x but not in 2.0+: \u003ca href=\"https://yarnpkg.com/\" title=\"yarn\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/yarn.svg\" alt=\"yarn\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://webpack.js.org/\" title=\"webpack\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/webpack.svg\" alt=\"webpack\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://cssinjs.org/\" title=\"JSS\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/jss.svg\" alt=\"JSS\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://material-ui.com/\" title=\"Material-UI\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/material-ui.svg\" alt=\"Material-UI\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://jestjs.io/\" title=\"Jest\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/jest.svg\" alt=\"Jest\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://github.com/enzymejs/enzyme\" title=\"Enzyme\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/enzyme.svg\" alt=\"Enzyme\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e \u003ca href=\"https://howlerjs.com/\" title=\"howler.js\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/howler.svg\" alt=\"howler.js\" width=\"21px\" height=\"21px\"\u003e\u003c/a\u003e)\n\u003c/p\u003e\n\n[TypeScript](https://www.typescriptlang.org/) + [React](https://reactjs.org/) + [Redux](https://redux.js.org/) + [redux-observable](https://redux-observable.js.org/) + [RxJS](https://rxjs.dev/). [PWA](https://web.dev/progressive-web-apps/) (using [Workbox](https://developers.google.com/web/tools/workbox)).\n\nThe game doesn't use [rAF](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) (except for a few cases), [WebGL](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API), or `\u003ccanvas\u003e` at all. Instead, it relies on DOM and CSS-based animations, which can improve SEO and accessibility, while making it feel more like a \"standard web app.\" While CSS animations may not perform as well as `\u003ccanvas\u003e`, they still provide excellent performance on Blink-based browsers on modern devices.\n\nWith [WebRTC](https://webrtc.org/) (using [PeerJS](https://peerjs.com/)), the game features P2P Multiplayer Mode without a server, utilizing only [STUN](https://en.wikipedia.org/wiki/STUN) servers and a signaling server (via [PeerJS](https://peerjs.com/docs/)) for peer discovery and connection establishment.\n\nIt also supports stereo sound, WebP and SVG images, with images upscaled using [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN-ncnn-vulkan). Card text is extracted using the OCR library [tesseract.js](https://tesseract.projectnaptha.com/).\n\nDeveloper scripts and tools are located in the [`tools` folder](https://github.com/arcomage/arcomage-hd/tree/main/tools). For more details, see the [development notes](https://github.com/arcomage/arcomage-hd/blob/main/DEVELOPMENT.md), [changelog](CHANGELOG.md), and the `scripts` section in [`package.json`](https://github.com/arcomage/arcomage-hd/blob/main/package.json).\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://codecov.io/gh/arcomage/arcomage-hd\" title=\"Codecov\"\u003e\u003cimg src=\"https://codecov.io/gh/arcomage/arcomage-hd/branch/main/graph/badge.svg?token=5rrZ38jtVr\" alt=\"Codecov\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://developers.google.com/web/tools/lighthouse\" title=\"Google Lighthouse\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/stack/lighthouse.svg\" alt=\"Google Lighthouse\" width=\"32px\" height=\"32px\"\u003e\u003c/a\u003e\u003cbr\u003eGoogle Lighthouse score\u003cbr\u003e\u003ca href=\"https://github.com/arcomage/arcomage-hd/issues/41\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/arcomage/arcomage-hd/main/misc/readme_images/lighthouse_score.png\" alt=\"ArcoMage HD Google Lighthouse score\"\u003e\u003c/a\u003e\u003c/p\u003e\n\n## Translation Credits\n\n- **[Cards](https://github.com/arcomage/arcomage-hd/tree/main/src/i18n/cards)**: Extracted from _Might and Magic VIII_ \u0026 _VI_ original games (or translated/retranslated) by:\n  - English (`en`): [Black Rabite on GameFAQs](https://gamefaqs.gamespot.com/pc/929601-arcomage/faqs/44131)\n  - Russian (`ru`) (retranslated): [rayburn](https://github.com/TombOfVARN)\n  - Simplified Chinese (`zh-Hans`): (extracted) [Liar-zzy](https://github.com/Liar-zzy/Arcomage/blob/master/Arcomage.cpp), (fixed/retranslated) [Tom Chen](https://github.com/tomchen)\n  - Polish (`pl`) (retranslated): [acidcave](https://www.arcomage.acidcave.net/czerwone_karty.html)\n  - Czech (`cs`): Yym\n  - Brazilian Portuguese (`pt-BR`) (translated): [mateuscv](https://github.com/mateuscv)\n  - Ukrainian (`uk`) (translated): [troyane](https://github.com/troyane)\n  - Japanese (`ja`) (translated): [Tom Chen](https://github.com/tomchen) with help from [Google Translate](https://translate.google.com/) \u0026 [DeepL](https://www.deepl.com/translator)\n  - Arabic (`ar`) (translated): [Tom Chen](https://github.com/tomchen) with help from [Google Translate](https://translate.google.com/)\n  - All others: [Tom Chen](https://github.com/tomchen) with OCR tool [tesseract.js](https://tesseract.projectnaptha.com/) \u0026 [other scripts](https://github.com/arcomage/arcomage-hd/tree/main/tools)\n  - Traditional Chinese (`zh-Hant`): Converted from `zh-Hans` by [Tom Chen](https://github.com/tomchen) using [his scripts](https://github.com/arcomage/arcomage-hd/tree/main/tools/zhconvert) and [opencc-js](https://github.com/nk2028/opencc-js)\n- **[Main](https://github.com/arcomage/arcomage-hd/tree/main/src/i18n/main)** string translators (some from the original games):\n\n  - Russian (`ru`): [rayburn](https://github.com/TombOfVARN)\n  - Polish (`pl`): (partially by) Plamcia\n  - Brazilian Portuguese (`pt-BR`): [mateuscv](https://github.com/mateuscv)\n  - Ukrainian (`uk`): [troyane](https://github.com/troyane)\n  - All others: [Tom Chen](https://github.com/tomchen) by himself and/or with help from [Google Translate](https://translate.google.com/) \u0026 [DeepL](https://www.deepl.com/translator)\n  - Traditional Chinese (`zh-Hant`): Converted from `zh-Hans` by [Tom Chen](https://github.com/tomchen) using [his scripts](https://github.com/arcomage/arcomage-hd/tree/main/tools/zhconvert) and [opencc-js](https://github.com/nk2028/opencc-js)\n\n- **[Taverns](https://github.com/arcomage/arcomage-hd/tree/main/src/i18n/taverns)**: Extracted from _Might and Magic VIII_ \u0026 _VI_ original games by [Tom Chen](https://github.com/tomchen) using [his script](https://github.com/arcomage/arcomage-hd/tree/main/tools/i18n-extraction). Except for:\n  - Brazilian Portuguese (`pt-BR`) (translated): [mateuscv](https://github.com/mateuscv)\n  - Japanese (`ja`) (translated): [Tom Chen](https://github.com/tomchen) with help from [Google Translate](https://translate.google.com/) \u0026 [DeepL](https://www.deepl.com/translator)\n  - Arabic (`ar`) (translated): [Tom Chen](https://github.com/tomchen) with help from [Google Translate](https://translate.google.com/)\n  - Ukrainian (`uk`) (translated): [troyane](https://github.com/troyane)\n\n_See also [I18N Issue Page](https://github.com/arcomage/arcomage-hd/issues/9)_\n\n## Arcomage Original Game\n\nArcomage was initially developed by Stickman Games and later sold to The 3DO Company (3DO). The game appeared as a mini-game in _Might and Magic VII: For Blood and Honor_ (MM7) and _Might and Magic VIII: Day of the Destroyer_ (MM8), the seventh and eighth games in New World Computing (NWC)'s _Might and Magic_ (MM) series. (It's similar to _Gwent_ in _The Witcher_.) NWC and its parent company, 3DO, also released a standalone version in 2000, which can be played in single-player or multiplayer mode. The original standalone Arcomage has a resolution of 800 x 600 pixels and works in 16-bit color mode on Windows 10, but the graphics are unstable.\n\n## Copyright\n\nThe code for the ArcoMage HD game: MIT License (c) [Tom Chen](https://tomchen.org/).\n\nThe assets, text, appearance, and other copyrightable elements of the game: (c) 2001 The 3DO Company.\n\nSee the [CREDIT.md file](CREDIT.md) for a detailed presentation of the copyright status, licenses, and credits for the game's components.\n\n## Links\n\n[![Changelog](https://img.shields.io/badge/-Changelog-green)](CHANGELOG.md) [![Credit](https://img.shields.io/badge/-Credit-yellow)](CREDIT.md) [![MIT License](https://img.shields.io/badge/-MIT_License-pink)](LICENSE.md) [![Development Notes](https://img.shields.io/badge/-Development_Notes-tan)](DEVELOPMENT.md) [![Game Control Details](https://img.shields.io/badge/-Game_Control_Details-blue)](gamecontrols.md) [![Troubleshooting](https://img.shields.io/badge/-Troubleshooting-red)](troubleshooting.md)\n\n [![Game Home Page](https://img.shields.io/badge/-Game_Home_Page-coral)](https://arcomage.github.io/) [![GitHub Project Page](https://img.shields.io/badge/-GitHub_Project_Page-forestgreen)](https://github.com/arcomage/arcomage-hd) [![Issues](https://img.shields.io/badge/-Issues-darkslateblue)](https://github.com/arcomage/arcomage-hd/issues)   [![@tomchen on GitHub](https://img.shields.io/badge/-@tomchen_on_GitHub-black)](https://github.com/tomchen)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farcomage%2Farcomage-hd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farcomage%2Farcomage-hd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farcomage%2Farcomage-hd/lists"}