├── .dockerignore ├── .github ├── ISSUE_TEMPLATE │ └── add-game-template.md ├── languages.yml └── workflows │ ├── main.yml │ ├── pr_check.py │ ├── pr_check.yml │ ├── pr_comment.py │ └── pr_comment.yml ├── .gitignore ├── .yamllint.yml ├── CHECKS ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── _ext.py ├── feed.xml ├── game.html ├── games ├── 0.yaml ├── a.yaml ├── b.yaml ├── c.yaml ├── d.yaml ├── e.yaml ├── f.yaml ├── g.yaml ├── h.yaml ├── i.yaml ├── j.yaml ├── k.yaml ├── l.yaml ├── m.yaml ├── n.yaml ├── o.yaml ├── p.yaml ├── q.yaml ├── r.yaml ├── s.yaml ├── t.yaml ├── u.yaml ├── v.yaml ├── w.yaml ├── x.yaml ├── y.yaml └── z.yaml ├── index.html ├── originals ├── 0scumm.yaml ├── a.yaml ├── b.yaml ├── c.yaml ├── d.yaml ├── e.yaml ├── f.yaml ├── g.yaml ├── h.yaml ├── i.yaml ├── j.yaml ├── k.yaml ├── l.yaml ├── m.yaml ├── n.yaml ├── o.yaml ├── p.yaml ├── q.yaml ├── r.yaml ├── s.yaml ├── t.yaml ├── u.yaml ├── v.yaml ├── w.yaml ├── x.yaml ├── y.yaml └── z.yaml ├── poetry.lock ├── pyproject.toml ├── render.py ├── schema ├── games.yaml └── originals.yaml ├── scripts ├── awesome_game_remakes.py ├── check_links.py ├── hacktoberfest.py ├── scrape_good_scummvm_games.py ├── scrape_osgl_inspirations.py ├── top_frameworks.py ├── update-development-status.py └── utils.py ├── static ├── black.png ├── dark-theme.js ├── main.css └── main.js ├── templates ├── common.html ├── forms │ ├── form_group.jinja2 │ ├── page.jinja2 │ ├── static │ │ ├── main.js │ │ └── tagsinput │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── package.json │ │ │ ├── tagsinput.css │ │ │ └── tagsinput.js │ └── types │ │ ├── any.jinja2 │ │ ├── date.jinja2 │ │ ├── int.jinja2 │ │ ├── map.jinja2 │ │ ├── seq.jinja2 │ │ ├── str.jinja2 │ │ └── text.jinja2 ├── games.html ├── tags.html └── video.html └── vhost.conf /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/add-game-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Add game template 3 | about: Add a new game 4 | title: Add [game name] 5 | labels: game-addition 6 | assignees: '' 7 | 8 | --- 9 | 10 | 20 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy 2 | on: [push, pull_request, pull_request_target] 3 | jobs: 4 | yamllint: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - name: Checkout 8 | uses: actions/checkout@master 9 | 10 | - name: Yamllint 11 | uses: ibiqlik/action-yamllint@v3 12 | with: 13 | file_or_dir: games/*.yaml originals/*.yaml schema/*.yaml 14 | env: 15 | GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} 16 | 17 | build: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@master 22 | 23 | - name: Install poetry 24 | uses: abatilo/actions-poetry@v4.0.0 25 | 26 | - name: Setup Python 27 | uses: actions/setup-python@v4 28 | with: 29 | python-version: '3.12' 30 | cache: 'poetry' 31 | 32 | - name: Build 33 | run: | 34 | make ci 35 | test 6000 -lt $(cat _build/index.html | wc -l) 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 38 | 39 | - name: Minify 40 | run: make min 41 | 42 | - uses: actions/upload-pages-artifact@v3 43 | with: 44 | path: _build 45 | 46 | deploy: 47 | runs-on: ubuntu-latest 48 | needs: build 49 | if: github.ref == 'refs/heads/master' 50 | permissions: 51 | pages: write 52 | id-token: write 53 | environment: 54 | name: github-pages 55 | url: ${{ steps.deployment.outputs.page_url }} 56 | steps: 57 | - name: Deploy to GitHub Pages 58 | id: deployment 59 | uses: actions/deploy-pages@v4 60 | -------------------------------------------------------------------------------- /.github/workflows/pr_check.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import re 4 | from pathlib import Path 5 | 6 | import yaml 7 | from github import Github, GithubException 8 | from thefuzz import process 9 | 10 | GITHUB_TOKEN = os.environ["GITHUB_TOKEN"] 11 | GITHUB_REPOSITORY = os.environ["GITHUB_REPOSITORY"] 12 | PR_NUMBER = int(os.environ["PR_NUMBER"]) 13 | GH_PATH = Path(__file__).parent.parent 14 | # https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml 15 | GH_LANGUAGES = set(yaml.safe_load(open(GH_PATH / "languages.yml")).keys()) | {"Delphi"} 16 | KNOWN_FRAMEWORKS = [ 17 | '.NET', 18 | 'Adobe AIR', 19 | 'Adventure Game Studio', 20 | 'Allegro', 21 | 'angular', 22 | 'Avalonia', 23 | 'BackBone.js', 24 | 'bgfx', 25 | 'Box2D', 26 | 'Bullet3', 27 | 'Carbon', 28 | 'Castle Game Engine', 29 | 'CreateJS', 30 | 'Cocos2d', 31 | 'Construct', 32 | 'Construct2', 33 | 'Crystal Space', 34 | 'Cube 2 Engine', 35 | 'Daemon Engine', 36 | 'DirectX', 37 | 'DIV Games Studio', 38 | 'Duality', 39 | 'Ebitengine', 40 | 'EntityX', 41 | 'EnTT', 42 | 'Flash', 43 | 'Fyne', 44 | 'FMOD', 45 | 'FNA', 46 | 'GameMaker Studio', 47 | 'GameSprockets', 48 | 'gLib2D', 49 | 'Godot', 50 | 'Graphics32', 51 | 'GTK', 52 | 'HaxeFlixel', 53 | 'Impact', 54 | 'Inform', 55 | 'Irrlicht', 56 | 'JavaFX', 57 | 'JMonkeyEngine', 58 | 'jQuery', 59 | 'Kylix', 60 | 'Laravel', 61 | 'Lazarus', 62 | 'libGDX', 63 | 'libretro', 64 | 'LÖVE', 65 | 'LowRes NX', 66 | 'Luanti', 67 | 'LWJGL', 68 | 'macroquad', 69 | 'melonJS', 70 | 'Mono', 71 | 'MonoGame', 72 | 'ncurses', 73 | 'NeoAxis Engine', 74 | 'Netty.io', 75 | 'nya-engine', 76 | 'OGRE', 77 | 'Open Dynamics Engine', 78 | 'OpenAL', 79 | 'OpenFL', 80 | 'OpenGL', 81 | 'OpenRA', 82 | 'OpenSceneGraph', 83 | 'OpenTK', 84 | 'OpenXR', 85 | 'osu!framework', 86 | 'Oxygine', 87 | 'Panda3D', 88 | 'PandaJS', 89 | 'Phaser', 90 | 'PICO-8', 91 | 'Piston', 92 | 'PixiJS', 93 | 'pygame', 94 | 'QB64', 95 | 'Qt', 96 | 'raylib', 97 | 'React', 98 | 'Redux', 99 | 'rot.js', 100 | 'Rx.js', 101 | 'SDL', 102 | 'SDL2', 103 | 'SDL3', 104 | 'SDL.NET', 105 | 'Sea3D', 106 | 'SFML', 107 | 'Slick2D', 108 | 'Solarus', 109 | 'Source SDK', 110 | 'Spring RTS Engine', 111 | 'Starling', 112 | 'Swing', 113 | 'SWT', 114 | 'three.js', 115 | 'TGUI', 116 | 'TIC-80', 117 | 'Torque 3D', 118 | 'Tween.js', 119 | 'Unity', 120 | 'Unreal Engine 5', 121 | 'VDrift Engine', 122 | 'Vue.js', 123 | 'Vulkan', 124 | 'WebGL', 125 | 'wxWidgets', 126 | 'XNA' 127 | ] 128 | FRAMEWORK_LANGUAGES = { 129 | "SDL2": {"C++", "C"}, 130 | "SDL": {"C++", "C"}, 131 | "SDL.NET": {"C#"}, 132 | "OpenGL": {"C++", "C"}, 133 | "Unity": {"C#"}, 134 | "SFML": {"C++"}, 135 | "libGDX": {"Java", "Kotlin"}, 136 | "Qt": {"C++"}, 137 | "Allegro": {"C++", "C"}, 138 | "pygame": {"Python"}, 139 | "OGRE": {"C++"}, 140 | "Fyne": {"Go"}, 141 | } 142 | MIN_FUZZ_SCORE = 95 143 | unknown_languages = False 144 | unknown_frameworks = False 145 | 146 | g = Github(GITHUB_TOKEN) 147 | repo = g.get_repo(GITHUB_REPOSITORY) 148 | pr = repo.get_pull(PR_NUMBER) 149 | print("PR", pr.url) 150 | output = { 151 | "content": "Hey there! Thanks for contributing a PR to osgameclones! 🎉", 152 | "labels": set(label.name for label in pr.labels), 153 | "pr": PR_NUMBER, 154 | } 155 | 156 | # Get game changes 157 | files = pr.get_files() 158 | changed_files = [str(file) for file in files] 159 | print("Changed files", changed_files) 160 | 161 | 162 | def load_games_file(filename: str, sha: str): 163 | try: 164 | contents = repo.get_contents(filename, sha) 165 | except GithubException as e: 166 | print("Cannot get file at", filename, e) 167 | return {} 168 | file = contents.decoded_content.decode() 169 | parsed = yaml.safe_load(file) 170 | return {game["name"]: game for game in parsed} 171 | 172 | 173 | def added_checks(game): 174 | if match := re.search(r"github.com/([^/]+)/", game.get("repo", "")): 175 | author = match[1] 176 | yield f"💌 Hey @{author}, we're adding your game to osgameclones!" 177 | 178 | 179 | def common_checks(game): 180 | yield from check_has_added(game) 181 | yield from check_not_same_repo_and_url(game) 182 | yield from check_has_images_or_videos(game) 183 | yield from check_language_known(game) 184 | yield from check_framework_known(game) 185 | yield from check_framework_language(game) 186 | yield from check_repo_google_code(game) 187 | 188 | 189 | def check_has_added(game): 190 | if "added" not in game: 191 | yield f"📅 {game['name']} has no added date" 192 | 193 | 194 | def check_not_same_repo_and_url(game): 195 | if game.get("url") == game.get("repo"): 196 | yield f"👯 {game['name']}'s url and repo are the same - " \ 197 | "please use repo for the development project page (such as GitHub) " \ 198 | "and url as the public-facing page, if any" 199 | 200 | 201 | def check_has_images_or_videos(game): 202 | if not game.get("images") and not game.get("video"): 203 | yield f"🖼 {game['name']} has no images or videos. " \ 204 | "Please help improve the entry by finding some!" 205 | 206 | 207 | def check_language_known(game): 208 | if u := {lang for lang in game.get("langs", []) if lang not in GH_LANGUAGES}: 209 | yield f"🔢 {game['name']} has unknown language{'s'[:len(u)^1]} \"{', '.join(u)}\". " \ 210 | "Please check for spelling errors." 211 | for ul in u: 212 | choice, score = process.extractOne(ul, GH_LANGUAGES) 213 | print("Fuzz match language", ul, "->", choice, ":", score) 214 | if score >= MIN_FUZZ_SCORE: 215 | yield f"- Suggested fix: {ul} -> **{choice}**" 216 | global unknown_languages 217 | unknown_languages = True 218 | 219 | 220 | def check_framework_known(game): 221 | if not (frameworks := game.get("frameworks")): 222 | return 223 | if u := [f for f in frameworks if f not in KNOWN_FRAMEWORKS]: 224 | yield f"🌇 {game['name']} has unknown framework{'s'[:len(u)^1]} \"{', '.join(u)}\". " \ 225 | "Please check for spelling errors." 226 | for uf in u: 227 | choice, score = process.extractOne(uf, KNOWN_FRAMEWORKS) 228 | print("Fuzz match framework", uf, "->", choice, ":", score) 229 | if score >= MIN_FUZZ_SCORE: 230 | yield f"- Suggested fix: {uf} -> **{choice}**" 231 | global unknown_frameworks 232 | unknown_frameworks = True 233 | 234 | 235 | def check_framework_language(game): 236 | if not (frameworks := game.get("frameworks")): 237 | return 238 | for framework in frameworks: 239 | if not (framework_langs := FRAMEWORK_LANGUAGES.get(framework, set())): 240 | continue 241 | if not set(game.get("langs", [])) & framework_langs: 242 | yield f"🏗 {game['name']} uses \"{framework}\" as a framework, " \ 243 | f"but doesn't have {', '.join(framework_langs)} in its languages." 244 | 245 | 246 | def check_repo_google_code(game): 247 | if "code.google" in game.get("repo", ""): 248 | yield f"⚰️ {game['name']}'s repo is Google Code, a dead service. " \ 249 | "Please check if there is an updated repo elsewhere." 250 | 251 | 252 | # Scan files for changes 253 | games_added = set() 254 | games_changed = set() 255 | games_removed = set() 256 | has_py = False 257 | has_js = False 258 | check_messages = [] 259 | for file in files: 260 | if file.filename.endswith(".py"): 261 | has_py = True 262 | elif file.filename.endswith(".js"): 263 | has_js = True 264 | elif re.match(r"^games/\w+\.yaml$", file.filename): 265 | print("Game file changed", file) 266 | old_games = load_games_file(file.filename, pr.base.sha) 267 | new_games = load_games_file(file.filename, pr.head.sha) 268 | 269 | for game in old_games: 270 | if game not in new_games: 271 | games_removed.add(game) 272 | for game in new_games: 273 | if game not in old_games: 274 | games_added.add(game) 275 | for message in added_checks(new_games[game]): 276 | check_messages.append(message) 277 | for message in common_checks(new_games[game]): 278 | check_messages.append(message) 279 | for game in old_games: 280 | if game in new_games: 281 | if old_games[game] != new_games[game]: 282 | games_changed.add(game) 283 | for message in common_checks(new_games[game]): 284 | check_messages.append(message) 285 | 286 | # Update comment based on changed games and checks 287 | if games_added: 288 | output["content"] += f"\nGame{'s'[:len(games_added) ^ 1]} added: {', '.join(games_added)} 🎊" 289 | if games_changed: 290 | output["content"] += f"\nGame{'s'[:len(games_changed) ^ 1]} updated: {', '.join(games_changed)} 👏" 291 | if games_removed: 292 | output["content"] += f"\nGame{'s'[:len(games_removed) ^ 1]} removed: {', '.join(games_removed)} 😿" 293 | if check_messages: 294 | output["content"] += "\n### Issues found\n- " + "\n- ".join(check_messages) 295 | if unknown_languages: 296 | output["content"] += "\n### Known Languages\n" + ", ".join(sorted(GH_LANGUAGES, key=str.casefold)) 297 | if unknown_frameworks: 298 | output["content"] += "\n### Known Frameworks\n" + ", ".join(sorted(KNOWN_FRAMEWORKS, key=str.casefold)) 299 | 300 | # Update issue labels 301 | if has_py: 302 | output["labels"].add("python") 303 | if has_js: 304 | output["labels"].add("javascript") 305 | if games_added: 306 | output["labels"].add("game-addition") 307 | if games_changed or games_removed: 308 | output["labels"].add("game-correction") 309 | 310 | # Update GitHub PR 311 | path = Path("./pr/output.json") 312 | path.parent.mkdir(exist_ok=True, parents=True) 313 | output["labels"] = list(output["labels"]) 314 | path.write_text(json.dumps(output)) 315 | 316 | """ 317 | Ideas for more PR suggestions 318 | - Scrape repo and url and look for screenshot candidates 319 | - Scrape github repo to find 320 | - matching license 321 | - dev status 322 | - releases feed 323 | - languages 324 | - Make suggested changes in PR 325 | """ -------------------------------------------------------------------------------- /.github/workflows/pr_check.yml: -------------------------------------------------------------------------------- 1 | name: Check PR for common problems 2 | on: 3 | pull_request: 4 | jobs: 5 | pr_check: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - name: Checkout 9 | uses: actions/checkout@master 10 | 11 | - name: Install poetry 12 | uses: abatilo/actions-poetry@v4.0.0 13 | 14 | - name: Setup Python 15 | uses: actions/setup-python@v4 16 | with: 17 | python-version: '3.12' 18 | cache: 'poetry' 19 | 20 | - name: PR Check 21 | run: | 22 | poetry install --no-root --with dev 23 | poetry run python .github/workflows/pr_check.py 24 | env: 25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 26 | GITHUB_REPOSITORY: ${{ github.repository }} 27 | PR_NUMBER: ${{ github.event.pull_request.number }} 28 | 29 | - uses: actions/upload-artifact@v4 30 | with: 31 | name: pr 32 | path: pr/ -------------------------------------------------------------------------------- /.github/workflows/pr_comment.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import sys 4 | import zipfile 5 | from pathlib import Path 6 | 7 | import httpx 8 | from github import Github, GithubException 9 | from github.Artifact import Artifact 10 | 11 | GITHUB_TOKEN = os.environ["GITHUB_TOKEN"] 12 | GITHUB_REPOSITORY = os.environ["GITHUB_REPOSITORY"] 13 | RUN_ID = int(os.environ["RUN_ID"]) 14 | GITHUB_BOT_LOGIN = "github-actions[bot]" 15 | 16 | g = Github(GITHUB_TOKEN) 17 | repo = g.get_repo(GITHUB_REPOSITORY) 18 | 19 | # Download artifact 20 | run = repo.get_workflow_run(RUN_ID) 21 | print("Run", run) 22 | artifacts = run.get_artifacts() 23 | artifact: Artifact 24 | for a in artifacts: 25 | print("Artifact", a) 26 | if a.name == "pr": 27 | artifact = a 28 | break 29 | else: 30 | print("Could not find pr artifact") 31 | sys.exit(1) 32 | resp = httpx.get( 33 | artifact.archive_download_url, headers={"Authorization": f"Bearer {GITHUB_TOKEN}"}, follow_redirects=True) 34 | if not resp.is_success: 35 | print("Download request failed", resp) 36 | sys.exit(1) 37 | with(open("out.zip", "wb")) as f: 38 | f.write(resp.content) 39 | with zipfile.ZipFile("out.zip", "r") as zip_ref: 40 | zip_ref.extractall(".") 41 | 42 | # Get PR content 43 | output = json.loads(Path("output.json").read_text()) 44 | print("Comment content", output) 45 | pr = repo.get_pull(output["pr"]) 46 | print("PR", pr.url) 47 | output["labels"] = set(output["labels"]) 48 | 49 | # Update GitHub PR 50 | for c in pr.get_issue_comments(): 51 | print("checking comment", c.user.login) 52 | if c.user.login == GITHUB_BOT_LOGIN: 53 | print("found bot comment", c.body) 54 | comment = c 55 | if comment.body != output["content"]: 56 | comment.edit(output["content"]) 57 | break 58 | else: 59 | print("bot comment not found") 60 | try: 61 | comment = pr.create_issue_comment(output["content"]) 62 | except GithubException as e: 63 | print("cannot create issue comment - possibly a non-standard PR", e) 64 | 65 | # Update labels 66 | if output["labels"] != set(label.name for label in pr.labels): 67 | print("Updating labels from", pr.labels, "to", output["labels"]) 68 | pr.set_labels(*output["labels"]) -------------------------------------------------------------------------------- /.github/workflows/pr_comment.yml: -------------------------------------------------------------------------------- 1 | name: Comment on the pull request 2 | on: 3 | workflow_run: 4 | workflows: [Check PR for common problems] 5 | types: 6 | - completed 7 | jobs: 8 | upload: 9 | runs-on: ubuntu-latest 10 | if: > 11 | github.event.workflow_run.event == 'pull_request' && 12 | github.event.workflow_run.conclusion == 'success' 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@master 16 | 17 | - name: Install poetry 18 | uses: abatilo/actions-poetry@v4.0.0 19 | 20 | - name: Setup Python 21 | uses: actions/setup-python@v4 22 | with: 23 | python-version: '3.12' 24 | cache: 'poetry' 25 | 26 | - name: PR comment 27 | run: | 28 | poetry install --no-root --with dev 29 | poetry run python .github/workflows/pr_comment.py 30 | env: 31 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 32 | GITHUB_REPOSITORY: ${{ github.repository }} 33 | RUN_ID: ${{ github.event.workflow_run.id }} 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _build/ 2 | .env/ 3 | .venv/ 4 | .vs/ 5 | node_modules/ 6 | *.pyc 7 | -------------------------------------------------------------------------------- /.yamllint.yml: -------------------------------------------------------------------------------- 1 | rules: 2 | key-duplicates: {} 3 | indentation: 4 | spaces: 2 5 | indent-sequences: false 6 | level: error 7 | -------------------------------------------------------------------------------- /CHECKS: -------------------------------------------------------------------------------- 1 | /index.html Open Source Game Clones 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine AS builder 2 | 3 | RUN mkdir /src /app 4 | WORKDIR /src 5 | COPY . /src/ 6 | COPY CHECKS /app/CHECKS 7 | 8 | RUN apk add --no-cache curl make gcc musl-dev libffi-dev python3 python3-dev 9 | RUN env 10 | RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/etc/poetry python3 - 11 | 12 | ENV PATH /etc/poetry/bin/:$PATH 13 | 14 | RUN poetry install 15 | RUN make run 16 | 17 | FROM nginx:1.27.4-alpine 18 | 19 | COPY --from=builder /src/_build /www 20 | COPY vhost.conf /etc/nginx/conf.d/default.conf 21 | COPY CHECKS /app/CHECKS 22 | EXPOSE 80 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Code 2 | ---- 3 | 4 | Copyright (c) 2011-2016 Vsevolod Solovyov, Alexander Solovyov, and other 5 | contributors under the terms of MIT License. 6 | 7 | https://opensource.org/licenses/MIT 8 | 9 | 10 | Content 11 | ------- 12 | 13 | Copyright (c) 2011-2016 Vsevolod Solovyov, Alexander Solovyov, and other 14 | contributors under the terms of Creative Commons Attribution 4.0 License. 15 | 16 | https://creativecommons.org/licenses/by/4.0/ 17 | 18 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PORT=80 2 | 3 | run: 4 | poetry run python render.py 5 | 6 | min: 7 | poetry run htmlmin _build/index.html _build/index.html 8 | 9 | poetry: 10 | pipx install poetry 11 | 12 | poetry-install: 13 | poetry install --no-root 14 | 15 | prod: poetry poetry-install run min 16 | ci: poetry-install run 17 | 18 | docker-build: 19 | docker build -t opengaming/osgameclones . 20 | 21 | docker-run: 22 | -docker rm -f osgameclones-site 23 | docker run -d -p${PORT}:80 --name osgameclones-site opengaming/osgameclones 24 | 25 | .PHONY: 26 | run prod docker-build docker-run 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Open Source Game Clones 2 | 3 | [![Build and Deploy](https://github.com/opengaming/osgameclones/actions/workflows/main.yml/badge.svg)](https://github.com/opengaming/osgameclones/actions/workflows/main.yml) 4 | 5 | This is the source of [https://osgameclones.com](https://osgameclones.com). 6 | Feel free to add new games or improve information about those already in the database 7 | by submitting a pull request or opening an issue. 8 | 9 | ## Games database 10 | 11 | All of the games and their references to the original games are stored in YAML files under 12 | [`games`][games] and [`originals`][originals]. All information is inside, and you should 13 | more or less understand what's going on by reading it. Sorting is alphabetical, with the 14 | exception of ScummVM, just because it's so many games at once. 15 | 16 | ## Add a clone / remake of a game 17 | 18 | Fill in the [game form][game_form] presented when you create 19 | a new issue. Even better if you edit the files in the [`games`][games] directory directly. Your 20 | changes will be submitted as a pull request. All games are validated against the rules 21 | in the [`schema/games.yaml`][schema_games] validation file. 22 | 23 | ## Add a reference to the original game 24 | 25 | Fill in the [add original form][original_form]. 26 | All the games listed need an original game they re-implement or clone. If there is no 27 | existing game entry in [`originals`][originals] directory you can create a new entry 28 | for it by following the following format. All originals are validated against the rules 29 | in the [`schema/originals.yaml`][schema_originals] validation file. 30 | 31 | ## Contributing 32 | 33 | ### Pre-requisites 34 | 35 | * [poetry][poetry] 36 | 37 | 38 | ### Install 39 | 40 | Clone this repository and run inside the directory: 41 | 42 | ``` 43 | poetry install 44 | ``` 45 | ### Building 46 | 47 | Simply run the following to build the project into the `_build` directory. 48 | 49 | ``` 50 | make 51 | ``` 52 | 53 | ### Running the server with Docker 54 | 55 | You must first build a Docker image 56 | 57 | ```bash 58 | make docker-build 59 | ``` 60 | 61 | After building the docker image, run the server with Docker 62 | 63 | ```bash 64 | make docker-run 65 | ``` 66 | 67 | The server will be available at http://localhost:80, you can choose the port with the **PORT** variable. 68 | 69 | ```bash 70 | # The server will be available at http://localhost:3000 71 | make docker-run PORT=3000 72 | ``` 73 | 74 | ## License 75 | 76 | See [LICENSE][license] 77 | 78 | [games]: games/ 79 | [originals]: originals/ 80 | [schema_games]: schema/games.yaml 81 | [schema_originals]: schema/originals.yaml 82 | [game_form]: https://osgameclones.com/add_game.html 83 | [original_form]: https://osgameclones.com/add_original.html 84 | [license]: LICENSE 85 | 86 | [python]: https://www.python.org 87 | [poetry]: https://python-poetry.org/ 88 | -------------------------------------------------------------------------------- /feed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Open Source Game Clones: New/Updated Games 4 | Games entries that have been added or updated in the last 30 days 5 | 6 | {{ updated.strftime('%Y-%m-%dT%H:%M:%SZ') }} 7 | https://osgameclones.com/ 8 | 9 | 10 | 11 | {%- for names, meta, game in site.new_games.values() %} 12 | 13 | {{ game.name | e }} 14 | 15 | OSGC 16 | 17 | https://osgameclones.com/game/{{ game.name | slugify }} 18 | 19 | {{ game.updated.strftime('%Y-%m-%dT%H:%M:%SZ') }} 20 | {{ game.type }} of {{ ', '.join(names) | e }} {{ game.info | e }} 21 | 22 | {%- endfor %} 23 | 24 | -------------------------------------------------------------------------------- /game.html: -------------------------------------------------------------------------------- 1 | {%- import 'templates/common.html' as common with context %} 2 | {%- import 'templates/games.html' as games with context %} 3 | 4 | {# TODO: pass keywords #} 5 | {{- common.head(title, None, description) }} 6 | {{ common.nav() }} 7 | 8 |
9 |

10 | Back to list 11 | Add Game 12 |

13 | 14 |
15 | {{ games.render(game, true) }} 16 |
17 |
18 |
19 | 20 | {{ common.footer() -}} 21 | -------------------------------------------------------------------------------- /games/0.yaml: -------------------------------------------------------------------------------- 1 | - name: 0 A.D. 2 | images: 3 | - https://play0ad.com/wp-content/gallery/screenshots/screenshot0088.png 4 | - https://play0ad.com/wp-content/gallery/screenshots/screenshot0072.jpg 5 | - https://play0ad.com/wp-content/gallery/screenshots/water-depth-rendering.jpg 6 | langs: 7 | - C++ 8 | - JavaScript 9 | licenses: 10 | - GPL2 11 | - CC-BY-SA 12 | development: active 13 | originals: 14 | - Age of Empires 15 | repo: https://trac.wildfiregames.com/timeline 16 | status: playable 17 | type: similar 18 | url: https://play0ad.com/ 19 | feed: http://feeds.feedburner.com/0adrevisions 20 | multiplayer: 21 | - Online 22 | - LAN 23 | content: open 24 | updated: 2020-06-27 25 | video: 26 | youtube: SjDNRgVAdkc 27 | 28 | - name: 07th-Mod 29 | originals: 30 | - 'Higurashi: When They Cry Hou' 31 | - 'Umineko: When They Cry Saku' 32 | type: remake 33 | repo: 'https://github.com/07th-mod' 34 | url: 'https://07th-mod.com' 35 | development: very active 36 | status: playable 37 | content: free 38 | licenses: 39 | - As-is 40 | updated: '2023-06-24' 41 | images: 42 | - 'https://07th-mod.com/wiki/Higurashi/img/console.webp' 43 | 44 | - name: 1010! Klooni 45 | originals: 46 | - '1010' 47 | type: clone 48 | repo: 'https://github.com/LonamiWebs/Klooni1010' 49 | url: 'https://lonami.dev/klooni/' 50 | development: complete 51 | status: playable 52 | content: open 53 | langs: 54 | - Java 55 | frameworks: 56 | - libGDX 57 | licenses: 58 | - GPL3 59 | added: '2024-10-03' 60 | updated: '2024-10-03' 61 | images: 62 | - 'https://f-droid.org/repo/dev.lonami.klooni/en-US/phoneScreenshots/1-game.jpg' 63 | - 'https://f-droid.org/repo/dev.lonami.klooni/en-US/phoneScreenshots/2-pause.jpg' 64 | - 'https://f-droid.org/repo/dev.lonami.klooni/en-US/phoneScreenshots/3-themes.jpg' 65 | 66 | - name: 1JETPACK.EXE 67 | originals: 68 | - Jetpack 69 | type: remake 70 | url: 'https://verysoftwares.itch.io/1jetpackexe' 71 | development: active 72 | status: semi-playable 73 | content: free 74 | langs: 75 | - Lua 76 | frameworks: 77 | - TIC-80 78 | licenses: 79 | - As-is 80 | updated: '2021-05-31' 81 | images: 82 | - 'https://img.itch.zone/aW1nLzYwMzM2MDQuZ2lm/500x/tqFSlM.gif' 83 | - 'https://img.itch.zone/aW1nLzU5NzgxNDkuZ2lm/original/wmWcAz.gif' 84 | 85 | - name: 1oom 86 | development: complete 87 | frameworks: 88 | - SDL 89 | - SDL2 90 | - Allegro 91 | images: 92 | - https://kilgoretroutmaskreplicant.gitlab.io/plain-html/pic01.png 93 | - https://kilgoretroutmaskreplicant.gitlab.io/plain-html/pic02.png 94 | - https://kilgoretroutmaskreplicant.gitlab.io/plain-html/pic03.png 95 | langs: 96 | - C 97 | licenses: 98 | - GPL2 99 | content: commercial 100 | originals: 101 | - Master of Orion 102 | repo: https://gitlab.com/KilgoreTroutMaskReplicant/1oom 103 | status: playable 104 | type: remake 105 | updated: 2019-04-15 106 | url: https://kilgoretroutmaskreplicant.gitlab.io/plain-html/ 107 | 108 | - name: 1oom-fork 109 | originals: 110 | - Master of Orion 111 | type: remake 112 | repo: https://github.com/1oom-fork/1oom 113 | feed: https://github.com/1oom-fork/1oom/releases.atom 114 | development: active 115 | status: playable 116 | content: commercial 117 | langs: 118 | - C 119 | frameworks: 120 | - SDL2 121 | licenses: 122 | - GPL2 123 | info: '1oom development is continuing! ' 124 | added: 2025-03-26 125 | updated: 2025-03-26 126 | 127 | - name: 2004scape 128 | originals: 129 | - RuneScape 130 | type: remake 131 | repo: 'https://github.com/2004scape/Server' 132 | url: 'https://2004scape.org/' 133 | development: very active 134 | status: semi-playable 135 | multiplayer: 136 | - Competitive 137 | - Online 138 | - Co-op 139 | content: commercial 140 | langs: 141 | - TypeScript 142 | licenses: 143 | - MIT 144 | added: 2024-09-07 145 | updated: 2024-09-07 146 | images: 147 | - 'https://i.imgur.com/7ZToFdR.jpeg' 148 | info: Lost City's from-scratch game server 149 | 150 | - name: 2006scape 151 | originals: 152 | - RuneScape 153 | type: remake 154 | repo: https://github.com/2006-Scape/2006Scape 155 | url: https://2006scape.org/ 156 | feed: https://github.com/2006-Scape/2006Scape/releases.atom 157 | development: halted 158 | status: playable 159 | multiplayer: 160 | - Competitive 161 | - Online 162 | - Co-op 163 | content: commercial 164 | langs: 165 | - Java 166 | licenses: 167 | - BSD2 168 | info: Open source 2006 RuneScape emulation with botting, based on decompiled code 169 | added: 2019-10-14 170 | updated: 2024-08-31 171 | images: 172 | - 'https://i.imgur.com/X9SS8ep.png' 173 | - 'https://i.imgur.com/HxIctfS.png' 174 | - 'https://i.imgur.com/iDbwd2C.png' 175 | 176 | - name: 2009scape 177 | originals: 178 | - RuneScape 179 | type: remake 180 | repo: 'https://gitlab.com/2009scape/2009scape' 181 | url: 'https://2009scape.org' 182 | development: very active 183 | status: playable 184 | multiplayer: 185 | - Competitive 186 | - Online 187 | - Co-op 188 | content: free 189 | langs: 190 | - Kotlin 191 | licenses: 192 | - AGPL3 193 | info: a free & open-source remake of 2009 era RuneScape 194 | added: 2023-06-04 195 | updated: 2023-06-04 196 | video: 197 | youtube: jtkID-OZMsQ 198 | 199 | - name: '2048' 200 | originals: 201 | - '2048' 202 | type: official 203 | repo: 'https://github.com/gabrielecirulli/2048' 204 | development: complete 205 | status: playable 206 | content: open 207 | langs: 208 | - JavaScript 209 | licenses: 210 | - MIT 211 | updated: '2023-09-28' 212 | 213 | - name: 2048-in-terminal 214 | originals: 215 | - '2048' 216 | type: clone 217 | repo: 'https://github.com/alewmoose/2048-in-terminal' 218 | development: complete 219 | status: playable 220 | content: open 221 | langs: 222 | - C 223 | frameworks: 224 | - ncurses 225 | licenses: 226 | - MIT 227 | updated: '2022-01-03' 228 | images: 229 | - 'https://raw.githubusercontent.com/alewmoose/2048-in-terminal/master/screen.gif' 230 | 231 | - name: 2048-python 232 | originals: 233 | - '2048' 234 | type: remake 235 | repo: 'https://github.com/yangshun/2048-python' 236 | development: halted 237 | status: playable 238 | content: open 239 | langs: 240 | - Python 241 | licenses: 242 | - MIT 243 | updated: 2023-12-21 244 | images: 245 | - >- 246 | https://raw.githubusercontent.com/yangshun/2048-python/master/img/screenshot.png 247 | 248 | - name: 2ooM 249 | originals: 250 | - Master of Orion 2 251 | type: remake 252 | repo: 'https://sourceforge.net/projects/toom/' 253 | url: http://toom.sourceforge.net/home/ 254 | development: halted 255 | status: unplayable 256 | content: commercial 257 | langs: 258 | - C++ 259 | - C 260 | licenses: 261 | - GPL2 262 | updated: 2022-04-02 263 | 264 | - name: 2ship2harkinian 265 | originals: 266 | - 'The Legend of Zelda: Majora''s Mask' 267 | type: remake 268 | repo: 'https://github.com/HarbourMasters/2ship2harkinian' 269 | development: very active 270 | status: playable 271 | content: commercial 272 | langs: 273 | - C 274 | - C++ 275 | licenses: 276 | - CC0 277 | added: '2024-12-28' 278 | updated: '2024-12-28' 279 | 280 | - name: 3d.city 281 | frameworks: 282 | - three.js 283 | - Sea3D 284 | langs: 285 | - JavaScript 286 | licenses: 287 | - GPL3 288 | development: sporadic 289 | originals: 290 | - SimCity 291 | repo: https://github.com/lo-th/3d.city 292 | type: clone 293 | updated: 2022-06-10 294 | url: https://lo-th.github.io/3d.city/index.html 295 | status: playable 296 | content: open 297 | images: 298 | - https://lo-th.github.io/3d.city/assets/img/preview01.jpg 299 | - https://lo-th.github.io/3d.city/assets/img/preview02.jpg 300 | - https://lo-th.github.io/3d.city/assets/img/preview03.jpg 301 | 302 | - name: 3DGE 303 | originals: 304 | - Doom 305 | - Heretic 306 | - Rise of the Triad 307 | - Wolfenstein 3D 308 | type: remake 309 | repo: https://github.com/3dfxdev/EDGE 310 | url: https://sourceforge.net/projects/edge2/ 311 | development: halted 312 | status: playable 313 | content: commercial 314 | langs: 315 | - C++ 316 | frameworks: 317 | - OpenGL 318 | - SDL2 319 | licenses: 320 | - GPL2 321 | info: 'A Doom source port that also supports other games like Rise of the Triad and Wolfenstein 3D' 322 | updated: 2023-12-22 323 | images: 324 | - https://a.fsdn.com/con/app/proj/edge2/screenshots/shot02.png/245/183/1 325 | - https://a.fsdn.com/con/app/proj/edge2/screenshots/shot06.png/max/max/1 326 | - https://a.fsdn.com/con/app/proj/edge2/screenshots/shot355.png/245/183/1 327 | 328 | - name: 4DTris 329 | langs: 330 | - C 331 | licenses: 332 | - GPL2 333 | development: halted 334 | originals: 335 | - Tetris 336 | repo: https://bazaar.launchpad.net/~4dtris-dev/4dtris/trunk/files 337 | type: clone 338 | updated: 2019-04-15 339 | url: https://sourceforge.net/projects/dtris/ 340 | status: playable 341 | frameworks: 342 | - SDL 343 | - OpenGL 344 | content: open 345 | video: 346 | youtube: WO9SNW5Tp7A 347 | 348 | - name: 64doom 349 | originals: 350 | - Doom 351 | type: remake 352 | repo: 'https://github.com/jnmartin84/64doom' 353 | development: sporadic 354 | status: playable 355 | content: commercial 356 | langs: 357 | - C 358 | licenses: 359 | - GPL2 360 | info: >- 361 | A port of the PC Doom to the N64 (NOTE: this isn't the same as Doom 64, this 362 | ports the actual vanilla PC version.) 363 | updated: '2021-10-23' 364 | images: 365 | - 'https://doomwiki.org/w/images/d/d7/64doom_ntsc_1.png' 366 | video: 367 | youtube: ygIZoTyTygc 368 | -------------------------------------------------------------------------------- /games/i.yaml: -------------------------------------------------------------------------------- 1 | - name: I Have No Tomatoes 2 | images: 3 | - https://a.fsdn.com/con/app/proj/tomatoes/screenshots/11798.jpg/max/max/1 4 | - https://a.fsdn.com/con/app/proj/tomatoes/screenshots/11800.jpg/max/max/1 5 | - https://a.fsdn.com/con/app/proj/tomatoes/screenshots/11804.jpg/max/max/1 6 | - https://a.fsdn.com/con/app/proj/tomatoes/screenshots/11802.jpg/max/max/1 7 | langs: 8 | - C++ 9 | frameworks: 10 | - SDL 11 | licenses: 12 | - Zlib 13 | development: halted 14 | originals: 15 | - Bomberman 16 | status: playable 17 | repo: https://sourceforge.net/projects/tomatoes/ 18 | type: remake 19 | updated: 2022-08-26 20 | url: https://tomatoes.sourceforge.net/ 21 | 22 | - name: ICBM3D 23 | langs: 24 | - C 25 | licenses: 26 | - GPL2 27 | development: complete 28 | originals: 29 | - Missile Command 30 | status: playable 31 | type: clone 32 | updated: 2022-02-12 33 | url: http://www.newbreedsoftware.com/icbm3d/ 34 | 35 | - name: Ice Breaker 36 | images: 37 | - https://mattdm.org/icebreaker/images/screenshot-level1-linux.png 38 | - https://mattdm.org/icebreaker/images/screenshot-level2-billg.png 39 | - https://mattdm.org/icebreaker/images/screenshot-level5-jz-like.png 40 | - https://mattdm.org/icebreaker/images/screenshot-level6-stars.png 41 | originals: 42 | - JezzBall 43 | status: playable 44 | licenses: 45 | - GPL2 46 | type: remake 47 | langs: 48 | - C 49 | frameworks: 50 | - SDL 51 | development: sporadic 52 | updated: 2022-09-07 53 | url: https://mattdm.org/icebreaker/ 54 | 55 | - name: Iceball 56 | development: halted 57 | status: playable 58 | langs: 59 | - C 60 | - Lua 61 | licenses: 62 | - GPL3 63 | - CC-BY-SA 64 | content: open 65 | originals: 66 | - Ace of Spades 67 | repo: https://github.com/iamgreaser/iceball 68 | type: remake 69 | updated: 2022-04-26 70 | images: 71 | - https://i.imgur.com/FL4nxDw.png 72 | 73 | - name: Imperialism Remake 74 | images: 75 | - https://remake.twelvepm.de/wp/wp-content/uploads/2014/09/Startscreen-0.2.0.jpg 76 | - https://remake.twelvepm.de/wp/wp-content/uploads/2015/02/Editor-0.2.1.jpg 77 | - https://remake.twelvepm.de/wp/wp-content/uploads/2015/02/Scenario-Preview-0.2.1.jpg 78 | langs: 79 | - Python 80 | licenses: 81 | - GPL3 82 | content: open 83 | development: halted 84 | originals: 85 | - Imperialism 86 | status: unplayable 87 | repo: https://github.com/Trilarion/Imperialism-Remake 88 | type: remake 89 | updated: 2022-01-18 90 | url: http://remake.twelvepm.de/ 91 | 92 | - name: Inertia Blast 93 | langs: 94 | - C 95 | frameworks: 96 | - SDL2 97 | licenses: 98 | - GPL2 99 | content: open 100 | development: halted 101 | originals: 102 | - Thrust 103 | repo: https://github.com/dulsi/thrust 104 | status: playable 105 | type: remake 106 | added: 2021-09-18 107 | updated: 2024-03-01 108 | url: https://identicalsoftware.com/inertiablast/ 109 | images: 110 | - https://identicalsoftware.com/inertiablast/screenshot1.png 111 | 112 | - name: Inexor 113 | frameworks: 114 | - Cube 2 Engine 115 | info: In addition to improving Sauerbraten one of the stated goals of the project is to remove/replace all content with 116 | unclear or non-free licenses from the game. 117 | langs: 118 | - C++ 119 | - JavaScript 120 | licenses: 121 | - Zlib 122 | development: active 123 | originals: 124 | - 'Cube 2: Sauerbraten' 125 | repo: https://github.com/inexorgame/vulkan-renderer 126 | status: semi-playable 127 | type: remake 128 | updated: 2020-08-31 129 | url: https://inexor.org/ 130 | 131 | - name: Interstate Outlaws 132 | langs: 133 | - Python 134 | frameworks: 135 | - Crystal Space 136 | licenses: 137 | - GPL2 138 | development: halted 139 | originals: 140 | - Interstate '76 141 | status: semi-playable 142 | type: remake 143 | updated: 2022-09-07 144 | url: http://web.archive.org/web/20071011202135/http://interstateoutlaws.com/ 145 | 146 | - name: IO Reboot 147 | development: complete 148 | frameworks: 149 | - Unity 150 | images: 151 | - https://lh3.googleusercontent.com/umCxkpuG_pBRWijjgE9i2Pc314qEdbg1uYgFCkCqtoRaiBGX4pBg9aFR7BFsSHjQ0sRe=h900-rw 152 | - https://lh3.googleusercontent.com/wXYHQFw9OKKcZZiDC9KEM-Qt6ZJVp6Vn1EJZlgRCwMmbuSqSQSFTC3YreAaZ2qF_KA=h900-rw 153 | - https://lh3.googleusercontent.com/jOWqEEME9LDyabTj2rHnb4iCyF1bElCWukqop98WVxrammgL8MfG1MuevnCmsivtpA=h900-rw 154 | langs: 155 | - C# 156 | licenses: 157 | - MIT 158 | content: open 159 | originals: 160 | - Infinity Loop 161 | repo: https://github.com/omarchehab98/io-reboot 162 | status: playable 163 | type: clone 164 | updated: 2020-08-31 165 | 166 | - name: ioquake3 167 | langs: 168 | - C 169 | frameworks: 170 | - SDL2 171 | licenses: 172 | - GPL2 173 | content: swappable 174 | development: active 175 | originals: 176 | - Quake 3 177 | repo: https://github.com/ioquake/ioq3 178 | status: playable 179 | type: remake 180 | url: http://ioquake3.org/ 181 | updated: 2021-02-07 182 | video: 183 | youtube: KavcvHixd6A 184 | 185 | - name: Iris2 186 | images: 187 | - https://libregamewiki.org/images/thumb/a/a9/Iris-2D.png/320px-Iris-2D.png 188 | - https://libregamewiki.org/images/thumb/e/e2/Iris-3D.png/320px-Iris-3D.png 189 | - https://www.iris2.de/images/4/48/20080106175329_188.png 190 | licenses: 191 | - GPL3 192 | content: commercial 193 | langs: 194 | - C++ 195 | frameworks: 196 | - OGRE 197 | development: halted 198 | originals: 199 | - Ultima Online 200 | repo: https://github.com/kblaschke/Iris2 201 | status: playable 202 | type: remake 203 | url: https://libregamewiki.org/Iris2_3D_Client_-_for_Ultima_Online 204 | updated: 2021-03-10 205 | 206 | - name: iortcw 207 | originals: 208 | - Return to Castle Wolfenstein 209 | type: remake 210 | repo: 'https://github.com/iortcw/iortcw' 211 | feed: 'https://github.com/iortcw/iortcw/releases.atom' 212 | development: sporadic 213 | status: playable 214 | multiplayer: 215 | - Competitive 216 | - Online 217 | - LAN 218 | - Co-op 219 | content: commercial 220 | langs: 221 | - C 222 | frameworks: 223 | - SDL2 224 | licenses: 225 | - Custom 226 | - GPL3 227 | info: Merge of ioquake3 features and fixes into RTCW code bases 228 | updated: '2019-11-20' 229 | video: 230 | youtube: iDwbo-ecJQw 231 | 232 | - name: Ironseed 233 | langs: 234 | - Pascal 235 | licenses: 236 | - GPL3 237 | content: open 238 | development: halted 239 | originals: 240 | - Ironseed 241 | status: playable 242 | repo: https://github.com/karynax/ironseed 243 | type: remake 244 | updated: 2021-07-02 245 | info: original DOS source release with DMP library stubbed 246 | 247 | - name: ironseed_fpc 248 | originals: 249 | - Ironseed 250 | type: remake 251 | repo: https://github.com/mnalis/ironseed_fpc 252 | development: halted 253 | status: playable 254 | content: open 255 | langs: 256 | - Pascal 257 | frameworks: 258 | - SDL 259 | licenses: 260 | - GPL3 261 | info: FreePascal SDL port with bug fixes 262 | updated: 2024-03-03 263 | images: 264 | - https://screenshots.debian.net/shrine/screenshot/19672/simage/large-4207f64f87b8fdbe46db0838d62f7e9a.png 265 | - https://screenshots.debian.net/shrine/screenshot/19658/simage/large-648126d2bd794b3e69b6981dc5bb5dc4.png 266 | - https://screenshots.debian.net/shrine/screenshot/19653/simage/large-07f0cd535bca6c4b9132ea62b2ec6629.png 267 | 268 | - name: irrlamb 269 | frameworks: 270 | - Irrlicht 271 | images: 272 | - https://i.imgur.com/EZhOF2Z.jpg 273 | - https://i.imgur.com/MoKnLml.jpg 274 | - https://i.imgur.com/B0Yg78D.jpg 275 | - https://i.imgur.com/FUiVvbl.jpg 276 | - https://i.imgur.com/8ibJCaB.jpg 277 | - https://i.imgur.com/cI3CN7W.jpg 278 | langs: 279 | - C++ 280 | licenses: 281 | - GPL3 282 | content: open 283 | development: sporadic 284 | originals: 285 | - Super Monkey Ball 286 | status: playable 287 | repo: https://gitlab.com/irrlamb/code 288 | url: https://irrlamb.gitlab.io 289 | type: remake 290 | updated: 2024-03-04 291 | 292 | - name: Isometric-Minesweeper 293 | originals: 294 | - Minesweeper 295 | type: clone 296 | repo: 'https://github.com/Bit-Sahil04/Isometric-Minesweeper' 297 | development: halted 298 | status: playable 299 | content: open 300 | langs: 301 | - Python 302 | frameworks: 303 | - pygame 304 | licenses: 305 | - MIT 306 | updated: 2024-03-05 307 | images: 308 | - >- 309 | https://raw.githubusercontent.com/Bit-Sahil04/Isometric-Minesweeper-/master/screenshots/screenshot3.png 310 | - >- 311 | https://raw.githubusercontent.com/Bit-Sahil04/Isometric-Minesweeper-/master/screenshots/screenshot1.png 312 | - >- 313 | https://raw.githubusercontent.com/Bit-Sahil04/Isometric-Minesweeper-/master/screenshots/screenshot2.png 314 | 315 | - name: Izmir 316 | originals: 317 | - Izmir 318 | type: official 319 | repo: 'https://github.com/idgmatrix/IZMIR' 320 | development: complete 321 | status: playable 322 | content: free 323 | langs: 324 | - Assembly 325 | - C 326 | licenses: 327 | - CC-BY-NC-SA 328 | added: '2025-02-24' 329 | updated: '2025-02-24' 330 | images: 331 | - 'https://github.com/idgmatrix/IZMIR/raw/master/Izmir1.jpg' 332 | - 'https://github.com/idgmatrix/IZMIR/raw/master/izmir2.png' 333 | - 'https://github.com/idgmatrix/IZMIR/raw/master/Izmir3.jpg' 334 | -------------------------------------------------------------------------------- /games/k.yaml: -------------------------------------------------------------------------------- 1 | - name: KaM Remake 2 | images: 3 | - https://www.kamremake.com/wp-content/uploads/2014/01/menu.png 4 | - https://www.kamremake.com/wp-content/uploads/2014/01/tsk4map.png 5 | - https://www.kamremake.com/wp-content/uploads/2014/01/tsk4.png 6 | langs: 7 | - Delphi 8 | frameworks: 9 | - OpenGL 10 | licenses: 11 | - AGPL3 12 | content: open 13 | development: active 14 | status: playable 15 | originals: 16 | - Knights and Merchants 17 | repo: https://github.com/reyandme/kam_remake 18 | type: remake 19 | added: 2012-04-06 20 | updated: 2025-01-07 21 | url: http://www.kamremake.com/ 22 | feed: https://www.kamremake.com/feed/ 23 | video: 24 | youtube: cjBwh0LLUFk 25 | 26 | - name: Kartering 27 | frameworks: 28 | - SDL2 29 | langs: 30 | - C 31 | licenses: 32 | - GPL2 33 | - MIT 34 | - ISC 35 | development: halted 36 | originals: 37 | - Mario Kart 38 | status: semi-playable 39 | repo: https://github.com/sandsmark/kart 40 | type: similar 41 | updated: 2022-09-20 42 | info: 2D racing game inspired by Mario Kart. Network play only, designed as a programming game, but supports human controls. 43 | images: 44 | - https://raw.githubusercontent.com/sandsmark/kart/master/startscreen.png 45 | - https://raw.githubusercontent.com/sandsmark/kart/master/screenshot.png 46 | 47 | - name: Kathodos 48 | frameworks: 49 | - Panda3D 50 | langs: 51 | - Python 52 | licenses: 53 | - As-is 54 | content: commercial 55 | development: halted 56 | originals: 57 | - Descent 58 | - Descent II 59 | status: unplayable 60 | repo: https://github.com/jvranish/Kathodos 61 | type: remake 62 | updated: 2022-09-20 63 | 64 | - name: KAtomic 65 | images: 66 | - https://cdn.kde.org/screenshots/katomic/katomic.png 67 | langs: 68 | - C++ 69 | frameworks: 70 | - Qt 71 | licenses: 72 | - GPL2 73 | development: active 74 | originals: 75 | - Atomix 76 | status: playable 77 | repo: https://invent.kde.org/games/katomic 78 | type: remake 79 | updated: 2022-09-20 80 | url: https://apps.kde.org/katomic/ 81 | 82 | - name: Keen Dreams 83 | langs: 84 | - C 85 | licenses: 86 | - GPL2 87 | content: commercial 88 | development: complete 89 | originals: 90 | - Commander Keen Series 91 | status: playable 92 | repo: https://github.com/keendreams/keen 93 | type: official 94 | updated: 2022-09-20 95 | video: 96 | youtube: 23SahL6eG6A 97 | 98 | - name: KeeperFX 99 | langs: 100 | - C 101 | frameworks: 102 | - SDL2 103 | licenses: 104 | - GPL2 105 | content: commercial 106 | development: very active 107 | originals: 108 | - Dungeon Keeper 109 | status: playable 110 | multiplayer: 111 | - Local 112 | - Online 113 | - LAN 114 | repo: https://github.com/dkfans/keeperfx 115 | type: remake 116 | updated: 2023-12-19 117 | url: https://keeperfx.net 118 | images: 119 | - 'https://keeperfx.net/screenshots/keeperfx-far-zoom.jpg' 120 | - 'https://keeperfx.net/screenshots/keeperfx-new-map-scripts.png' 121 | - 'https://keeperfx.net/screenshots/keeperfx-render-distance.png' 122 | - 'https://keeperfx.net/screenshots/keeperfx-shift-room-creation.png' 123 | video: 124 | youtube: JwDdLynZPag 125 | 126 | - name: KevEdit 127 | type: tool 128 | status: N/A 129 | originals: 130 | - ZZT 131 | repo: https://github.com/cknave/kevedit 132 | feed: https://github.com/cknave/kevedit/releases.atom 133 | development: halted 134 | langs: 135 | - C 136 | frameworks: 137 | - SDL2 138 | licenses: 139 | - GPL2 140 | info: Advanced world editor 141 | added: 2020-06-26 142 | updated: 2025-03-13 143 | images: 144 | - https://cloud.githubusercontent.com/assets/4196901/22183137/b51c68e6-e084-11e6-874d-3458041f4308.gif 145 | - https://cloud.githubusercontent.com/assets/4196901/22183135/b515754a-e084-11e6-9fe3-2483eb67ca79.gif 146 | - https://cloud.githubusercontent.com/assets/4196901/22183134/b514af02-e084-11e6-9ca7-7b21bedb479d.gif 147 | - https://cloud.githubusercontent.com/assets/4196901/22183131/b5142230-e084-11e6-95c1-19133c677388.gif 148 | - https://cloud.githubusercontent.com/assets/4196901/22183132/b5142208-e084-11e6-8ab1-568d217391ec.gif 149 | - https://cloud.githubusercontent.com/assets/4196901/22183133/b51426b8-e084-11e6-8ce7-e01b7d6a06ed.gif 150 | - https://cloud.githubusercontent.com/assets/4196901/22183136/b516dd4a-e084-11e6-8e9b-30201734480a.gif 151 | 152 | - name: KGoldrunner 153 | frameworks: 154 | - SDL2 155 | images: 156 | - https://cdn.kde.org/screenshots/kgoldrunner/kgoldrunner.png 157 | langs: 158 | - C++ 159 | licenses: 160 | - GPL2 161 | development: active 162 | originals: 163 | - Lode Runner 164 | repo: https://invent.kde.org/games/kgoldrunner 165 | status: playable 166 | type: remake 167 | updated: 2021-11-20 168 | url: https://apps.kde.org/kgoldrunner/ 169 | 170 | - name: KidChameleonRemake 171 | langs: 172 | - C# 173 | licenses: 174 | - As-is 175 | development: halted 176 | originals: 177 | - Kid Chameleon 178 | status: unplayable 179 | repo: https://github.com/mp1011/KidChameleonRemake 180 | type: remake 181 | updated: 2022-09-20 182 | 183 | - name: King under the Mountain 184 | originals: 185 | - King under the Mountain 186 | type: official 187 | repo: 'https://github.com/rossturner/king-under-the-mountain' 188 | development: complete 189 | status: playable 190 | content: open 191 | langs: 192 | - Java 193 | frameworks: 194 | - libGDX 195 | licenses: 196 | - MIT 197 | added: '2024-05-25' 198 | updated: '2024-05-25' 199 | images: 200 | - >- 201 | https://cdn.mobygames.com/promos/5841981-king-under-the-mountain-screenshot.jpg 202 | - >- 203 | https://cdn.mobygames.com/promos/5858387-king-under-the-mountain-screenshot.jpg 204 | - >- 205 | https://cdn.mobygames.com/promos/5878705-king-under-the-mountain-screenshot.jpg 206 | - >- 207 | https://cdn.mobygames.com/promos/5852619-king-under-the-mountain-screenshot.jpg 208 | - >- 209 | https://cdn.mobygames.com/promos/5862012-king-under-the-mountain-screenshot.jpg 210 | 211 | - name: KittenMaxit 212 | langs: 213 | - Java 214 | frameworks: 215 | - libGDX 216 | licenses: 217 | - MIT 218 | development: halted 219 | originals: 220 | - Maxit 221 | status: playable 222 | repo: https://github.com/ahmetkasif/kmaxit 223 | type: remake 224 | updated: 2022-09-20 225 | images: 226 | - https://i.imgur.com/3QvTDrN.png 227 | - https://i.imgur.com/G1rezQr.png 228 | 229 | - name: KnightOfWor 230 | langs: 231 | - Java 232 | licenses: 233 | - GPL3 234 | content: open 235 | development: halted 236 | originals: 237 | - Wizard of Wor 238 | status: semi-playable 239 | repo: https://github.com/Sanguinik/KnightOfWor 240 | url: https://www.sanguinik.de/2012/11/11/knight-of-wor-ein-wizard-of-wor-remake/ 241 | type: remake 242 | updated: 2022-09-20 243 | images: 244 | - https://www.sanguinik.de/wp-content/uploads/2012/11/titlescreen.png 245 | - https://www.sanguinik.de/wp-content/uploads/2012/11/spiel.png 246 | - https://www.sanguinik.de/wp-content/uploads/2012/11/credits.png 247 | 248 | - name: Knights 249 | images: 250 | - https://www.knightsgame.org.uk/images/knights1.png 251 | - https://www.knightsgame.org.uk/images/knights2.png 252 | - https://www.knightsgame.org.uk/images/knights3.png 253 | - https://www.knightsgame.org.uk/images/knights4.png 254 | - https://www.knightsgame.org.uk/images/knights5.png 255 | - https://www.knightsgame.org.uk/images/quest_selection.png 256 | langs: 257 | - C++ 258 | licenses: 259 | - GPL3 260 | content: open 261 | development: active 262 | originals: 263 | - Knights 264 | status: playable 265 | multiplayer: 266 | - Online 267 | type: remake 268 | updated: 2022-07-13 269 | url: https://www.knightsgame.org.uk/ 270 | 271 | - name: KRaptor 272 | originals: 273 | - 'Raptor: Call of the Shadows' 274 | type: clone 275 | repo: https://sourceforge.net/projects/kraptor 276 | development: complete 277 | status: playable 278 | content: open 279 | langs: 280 | - C 281 | frameworks: 282 | - Allegro 283 | licenses: 284 | - MIT 285 | info: >- 286 | Vertical scrolling shooter heavily inspired by Raptor: Call of the Shadows, 287 | but not an exact recreation of that game. 288 | updated: 2021-08-29 289 | images: 290 | - https://a.fsdn.com/con/app/proj/kraptor/screenshots/71665.jpg/max/max/1 291 | - https://a.fsdn.com/con/app/proj/kraptor/screenshots/71659.jpg/max/max/1 292 | - https://a.fsdn.com/con/app/proj/kraptor/screenshots/71663.jpg/max/max/1 293 | 294 | - name: Kroz 295 | originals: 296 | - Kroz 297 | type: official 298 | repo: https://github.com/tangentforks/kroz 299 | development: complete 300 | status: playable 301 | content: free 302 | langs: 303 | - Pascal 304 | licenses: 305 | - GPL2 306 | info: Open-sourced by Apogee on 2009 307 | updated: '2022-08-21' 308 | 309 | - name: Krystal Drop 310 | langs: 311 | - C++ 312 | licenses: 313 | - GPL2 314 | development: halted 315 | originals: 316 | - Magical Drop 317 | status: playable 318 | multiplayer: 319 | - Competitive 320 | - Local 321 | repo: https://sourceforge.net/projects/krystaldrop/ 322 | type: remake 323 | updated: 2022-07-11 324 | url: http://krystaldrop.sourceforge.net/ 325 | 326 | - name: KZap 327 | langs: 328 | - C++ 329 | licenses: 330 | - GPL2 331 | development: halted 332 | originals: 333 | - Zoop 334 | status: playable 335 | repo: https://sourceforge.net/projects/kzap/ 336 | type: remake 337 | updated: 2022-09-18 338 | url: http://kzap.sourceforge.net/ 339 | -------------------------------------------------------------------------------- /games/q.yaml: -------------------------------------------------------------------------------- 1 | - name: Q-Gears 2 | images: 3 | - https://a.fsdn.com/con/app/proj/q-gears/screenshots/116089.jpg/max/max/1 4 | - https://a.fsdn.com/con/app/proj/q-gears/screenshots/116091.jpg/max/max/1 5 | - https://a.fsdn.com/con/app/proj/q-gears/screenshots/116085.jpg/max/max/1 6 | langs: 7 | - C++ 8 | frameworks: 9 | - OGRE 10 | licenses: 11 | - GPL2 12 | content: commercial 13 | development: halted 14 | originals: 15 | - Final Fantasy VII 16 | status: unplayable 17 | repo: https://github.com/q-gears/q-gears 18 | type: remake 19 | updated: 2021-09-29 20 | url: http://q-gears.sourceforge.net/ 21 | video: 22 | youtube: YPnej8iKMPg 23 | 24 | - name: Q2Pro 25 | originals: 26 | - Quake 2 27 | type: remake 28 | repo: 'https://github.com/skullernet/q2pro' 29 | development: active 30 | status: playable 31 | multiplayer: 32 | - Competitive 33 | - Online 34 | - LAN 35 | content: commercial 36 | langs: 37 | - C 38 | frameworks: 39 | - OpenGL 40 | - OpenAL 41 | licenses: 42 | - GPL2 43 | info: Enhanced Quake 2 client and server 44 | added: '2025-02-08' 45 | updated: '2025-02-08' 46 | 47 | - name: QB64 48 | originals: 49 | - Gorillas 50 | type: remake 51 | repo: 'https://github.com/QB64Official/qb64' 52 | url: https://qb64.com/ 53 | development: sporadic 54 | status: playable 55 | multiplayer: 56 | - Local 57 | content: free 58 | langs: 59 | - C 60 | frameworks: 61 | - OpenGL 62 | licenses: 63 | - MIT 64 | info: >- 65 | QB64 converts QBasic code to C++ and compiles it into native code, includes some Classic QBasic 66 | games as sample programs 67 | added: 2024-07-21 68 | updated: 2024-07-21 69 | images: 70 | - 'https://qb64.com/samples/gorillas/img/screenshot.png' 71 | 72 | - name: Quadrapassel 73 | originals: 74 | - Tetris 75 | type: clone 76 | repo: https://gitlab.gnome.org/GNOME/quadrapassel 77 | url: https://wiki.gnome.org/Apps/Quadrapassel 78 | development: sporadic 79 | status: playable 80 | content: open 81 | langs: 82 | - Vala 83 | licenses: 84 | - GPL2 85 | updated: 2023-07-31 86 | images: 87 | - https://people.gnome.org/~mcatanzaro/quadrapassel.png 88 | 89 | - name: Quake 2 90 | originals: 91 | - Quake 2 92 | type: official 93 | repo: 'https://github.com/id-Software/Quake-2' 94 | development: complete 95 | status: playable 96 | multiplayer: 97 | - Competitive 98 | - Online 99 | - LAN 100 | content: commercial 101 | langs: 102 | - C 103 | frameworks: 104 | - OpenGL 105 | licenses: 106 | - GPL2 107 | info: Quake 2 GPL Source Release 108 | updated: '2023-09-28' 109 | 110 | - name: Quake II Rerelease 111 | originals: 112 | - Quake 2 113 | type: official 114 | repo: 'https://github.com/id-Software/quake2-rerelease-dll' 115 | development: complete 116 | status: playable 117 | multiplayer: 118 | - Competitive 119 | - Local 120 | - Online 121 | - LAN 122 | - Split-screen 123 | - Co-op 124 | content: commercial 125 | langs: 126 | - C 127 | - C++ 128 | licenses: 129 | - GPL2 130 | info: game code for the 2023 rerelease of Quake II 131 | updated: '2023-10-07' 132 | 133 | - name: Quake3e 134 | originals: 135 | - Quake 3 136 | type: remake 137 | repo: 'https://github.com/ec-/Quake3e' 138 | feed: 'https://github.com/ec-/Quake3e/releases.atom' 139 | development: very active 140 | status: playable 141 | multiplayer: 142 | - Competitive 143 | - Local 144 | - LAN 145 | content: commercial 146 | langs: 147 | - C 148 | frameworks: 149 | - Vulkan 150 | - OpenGL 151 | - SDL2 152 | licenses: 153 | - GPL2 154 | updated: 2024-02-21 155 | video: 156 | youtube: hkvmwMo7Sto 157 | 158 | - name: QuakeJS 159 | langs: 160 | - JavaScript 161 | licenses: 162 | - MIT 163 | development: halted 164 | originals: 165 | - Quake 3 166 | status: playable 167 | repo: https://github.com/inolen/quakejs 168 | type: remake 169 | updated: 2020-12-21 170 | url: http://www.quakejs.com/ 171 | video: 172 | youtube: FM6RldNmpPg 173 | 174 | - name: QuakeSpasm 175 | langs: 176 | - C 177 | frameworks: 178 | - SDL 179 | - SDL2 180 | licenses: 181 | - GPL2 182 | content: swappable 183 | development: active 184 | originals: 185 | - Quake 186 | status: playable 187 | repo: https://sourceforge.net/projects/quakespasm/ 188 | type: remake 189 | added: 2015-07-02 190 | updated: 2022-02-14 191 | url: http://quakespasm.sourceforge.net/ 192 | images: 193 | - https://a.fsdn.com/con/app/proj/quakespasm/screenshots/ad_1.png/max/max/1 194 | - https://a.fsdn.com/con/app/proj/quakespasm/screenshots/spasm0000.png/max/max/1 195 | - https://a.fsdn.com/con/app/proj/quakespasm/screenshots/spasm0000-2173.png/max/max/1 196 | 197 | - name: Quick Curver 198 | originals: 199 | - Achtung, die Kurve! 200 | type: clone 201 | repo: https://github.com/vimpostor/quickcurver 202 | development: active 203 | status: playable 204 | multiplayer: 205 | - Local 206 | - Online 207 | content: open 208 | langs: 209 | - C++ 210 | frameworks: 211 | - Qt 212 | licenses: 213 | - GPL3 214 | updated: 2022-06-05 215 | images: 216 | - https://user-images.githubusercontent.com/21310755/93923083-2ed2e300-fd13-11ea-86f1-d79bc09ce96a.png 217 | -------------------------------------------------------------------------------- /games/y.yaml: -------------------------------------------------------------------------------- 1 | - name: Yamagi Quake II 2 | langs: 3 | - C 4 | frameworks: 5 | - SDL2 6 | - Vulkan 7 | - OpenGL 8 | licenses: 9 | - GPL2 10 | content: commercial 11 | development: active 12 | originals: 13 | - Quake 2 14 | status: playable 15 | repo: https://github.com/yquake2/yquake2 16 | type: remake 17 | added: 2015-04-05 18 | updated: 2022-01-27 19 | url: https://www.yamagi.org/quake2/ 20 | video: 21 | youtube: oswh8-jsSV4 22 | 23 | - name: YARG (Yet Another Rhythm Game) 24 | images: 25 | - https://media.githubusercontent.com/media/YARC-Official/YARG/master/Images/Banner.png 26 | langs: 27 | - C# 28 | frameworks: 29 | - Unity 30 | licenses: 31 | - LGPL3 32 | development: active 33 | originals: 34 | - Guitar Hero 35 | repo: https://github.com/YARC-Official/YARG 36 | status: playable 37 | type: similar 38 | added: 2023-12-25 39 | updated: 2024-07-27 40 | url: https://yarg.in/ 41 | video: 42 | youtube: 8IZ_f-BtcLk 43 | 44 | - name: YKnytt 45 | type: remake 46 | originals: 47 | - Knytt Stories 48 | repo: https://github.com/youkaicountry/yknytt 49 | feed: https://github.com/youkaicountry/yknytt/releases.atom 50 | development: sporadic 51 | status: playable 52 | langs: 53 | - C# 54 | frameworks: 55 | - Godot 56 | licenses: 57 | - MIT 58 | content: free 59 | added: 2021-01-22 60 | updated: 2024-08-29 61 | images: 62 | - https://raw.githubusercontent.com/youkaicountry/yknytt/master/screenshots/screen1.png 63 | - https://raw.githubusercontent.com/youkaicountry/yknytt/master/screenshots/screen2.png 64 | - https://raw.githubusercontent.com/youkaicountry/yknytt/master/screenshots/screen3.png 65 | - https://raw.githubusercontent.com/youkaicountry/yknytt/master/screenshots/screen4.png 66 | - https://raw.githubusercontent.com/youkaicountry/yknytt/master/screenshots/screen5.png 67 | 68 | - name: Yorg 69 | originals: 70 | - Micro Machines 71 | type: clone 72 | repo: https://github.com/cflavio/yorg 73 | url: https://ya2.itch.io/yorg 74 | development: halted 75 | status: playable 76 | multiplayer: 77 | - Local 78 | - Online 79 | - Competitive 80 | content: open 81 | langs: 82 | - Python 83 | frameworks: 84 | - Panda3D 85 | licenses: 86 | - CC-BY-SA 87 | - GPL3 88 | added: 2019-11-15 89 | updated: 2024-08-30 90 | images: 91 | - https://www.ya2.it/images/yorg/yorg_0_11_a.jpg 92 | video: 93 | youtube: 1-ePMtYUMv0 94 | 95 | - name: YSoccer 96 | images: 97 | - https://ysoccer.sourceforge.io/images/screenshot_goal.jpg 98 | - https://ysoccer.sourceforge.io/images/screenshot_rain.jpg 99 | - https://ysoccer.sourceforge.io/images/screenshot_tactics.jpg 100 | - https://ysoccer.sourceforge.io/images/screenshot_set_team.png 101 | - https://ysoccer.sourceforge.io/images/screenshot_team_editor.jpg 102 | langs: 103 | - BlitzBasic 104 | licenses: 105 | - GPL2 106 | content: open 107 | development: sporadic 108 | originals: 109 | - Sensible World of Soccer 110 | repo: https://sourceforge.net/projects/ysoccer/ 111 | status: playable 112 | type: remake 113 | added: 2015-04-03 114 | updated: 2019-12-12 115 | url: https://ysoccer.sourceforge.io 116 | video: 117 | vimeo: 360152627 118 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | {%- import 'templates/common.html' as common with context %} 2 | {%- import 'templates/games.html' as games with context %} 3 | 4 | {{- common.head() }} 5 | {{ common.nav() }} 6 | 7 |
8 |

Open Source Game Clones

9 | 10 |

11 | This site tries to gather open-source 12 | or source-available 13 | remakes of great old games in one place. If you think that 14 | something is missing from the list - please go to 15 | our GitHub 16 | repository and create an issue or even a pull request! 17 |

18 |

19 | Since all these projects are open-source you can help them and make this 20 | world a better place. Or at least you can play something to appreciate the 21 | effort people put in them. 22 |

23 |

24 | Similar resources: 25 |

26 | 33 |

34 | A Remake is a game where the executable and sometimes the assets as well are remade open source. Some of these games aren't exact remakes but evolution of original ones, which were eventually open sourced. 35 |
36 | A Clone is a game which is very similar to or heavily inspired by a game or series. 37 |
38 | An Official project is the official source code release for a game that was formerly closed-source, maintained by the original creators and has minimal changes. 39 |
40 | A Similar game is one which has similar gameplay but is not a clone. 41 |
42 | A Tool is not a game, but something that assists in playing or modding the game, such as a high resolution patch, or resource extractor. 43 |

44 |
45 | 46 |
47 |

48 | New and updated games 49 | 50 |

51 |
52 | {% for names, meta, clone in site.new_games.values() %} 53 | {{ games.render_clone(names, meta, clone, true, false) }} 54 | {% endfor %} 55 |
56 |
57 | 58 |
59 |

60 | List of games 61 | Add Game 62 | Add Original Game 63 |

64 |
65 | {% for game in site.games %} 66 | {{ games.render(game, false) }} 67 | {% endfor %} 68 |
69 |
70 |
71 | 72 | {{ common.footer() -}} 73 | -------------------------------------------------------------------------------- /originals/0scumm.yaml: -------------------------------------------------------------------------------- 1 | - name: SCUMM 2 | external: 3 | wikipedia: SCUMM 4 | meta: 5 | genres: 6 | - Adventure 7 | - Compilation 8 | 9 | - name: '1010' 10 | external: 11 | website: 'https://www.mobygames.com/game/162116/1010/' 12 | platforms: 13 | - Windows 14 | meta: 15 | genres: 16 | - Puzzle 17 | themes: 18 | - Abstract 19 | 20 | - name: "1½ Ritter: Auf der Suche nach der hinreißenden Herzelinde" 21 | external: 22 | website: https://www.mobygames.com/game/44924 23 | meta: 24 | genres: 25 | - Adventure 26 | subgenres: 27 | - Point and click 28 | themes: 29 | - Comedy 30 | - Medieval 31 | platforms: 32 | - Windows 33 | 34 | - name: The 11th Hour 35 | names: 36 | - 'The 11th Hour: The Sequel to The 7th Guest' 37 | external: 38 | website: https://www.mobygames.com/game/567 39 | wikipedia: The 11th Hour (video game) 40 | meta: 41 | genres: 42 | - Adventure 43 | - Puzzle 44 | themes: 45 | - Horror 46 | platforms: 47 | - DOS 48 | - Classic Mac OS 49 | - Windows 50 | 51 | - name: '2048' 52 | external: 53 | website: 'https://play2048.co/' 54 | wikipedia: 2048 (video game) 55 | platforms: 56 | - Android 57 | - Apple TV 58 | - 3DS 59 | - iOS 60 | - Web 61 | meta: 62 | genres: 63 | - Puzzle 64 | 65 | - name: 3 Skulls of the Toltecs 66 | external: 67 | website: https://www.mobygames.com/game/3286 68 | wikipedia: 3 Skulls of the Toltecs 69 | meta: 70 | genres: 71 | - Adventure 72 | subgenres: 73 | - Point and click 74 | themes: 75 | - Western 76 | platforms: 77 | - DOS 78 | 79 | - name: The 7th Guest 80 | external: 81 | website: https://www.mobygames.com/game/283 82 | wikipedia: The 7th Guest 83 | meta: 84 | genres: 85 | - Adventure 86 | - Puzzle 87 | themes: 88 | - Horror 89 | platforms: 90 | - DOS 91 | - CD-i 92 | - iOS 93 | - Classic Mac OS 94 | - Linux 95 | - Nintendo Switch 96 | - OSX 97 | - Windows 98 | -------------------------------------------------------------------------------- /originals/e.yaml: -------------------------------------------------------------------------------- 1 | - name: E.T. the Extra-Terrestrial 2 | external: 3 | wikipedia: E.T. the Extra-Terrestrial (video game) 4 | meta: 5 | genres: 6 | - Arcade 7 | - Adventure 8 | 9 | - name: Earth 2140 10 | external: 11 | wikipedia: Earth 2140 12 | meta: 13 | genres: 14 | - Real-Time Strategy 15 | themes: 16 | - Sci-Fi 17 | 18 | - name: Earth Shaker 19 | external: 20 | wikipedia: Earth Shaker (video game) 21 | meta: 22 | genres: 23 | - Puzzle 24 | 25 | - name: Earthsiege 2 26 | external: 27 | wikipedia: Earthsiege 2 28 | platforms: 29 | - Windows 30 | meta: 31 | genres: 32 | - Simulation 33 | subgenres: 34 | - Vehicular Combat 35 | themes: 36 | - Sci-Fi 37 | 38 | - name: Eastern Mind 39 | names: 40 | - 'Eastern Mind: The Lost Souls of Tong Nou' 41 | external: 42 | website: https://www.mobygames.com/game/22032 43 | wikipedia: 'Eastern Mind: The Lost Souls of Tong Nou' 44 | meta: 45 | genres: 46 | - Adventure 47 | subgenres: 48 | - Point and click 49 | themes: 50 | - Fantasy 51 | platforms: 52 | - Classic Mac OS 53 | - Windows 54 | 55 | - name: Eat The Whistle 56 | external: 57 | website: http://www.ggsoft.org/etw/ 58 | meta: 59 | genres: 60 | - Sports 61 | subgenres: 62 | - Soccer 63 | 64 | - name: Echochrome 65 | external: 66 | wikipedia: Echochrome 67 | meta: 68 | genres: 69 | - Puzzle 70 | names: 71 | - "Mugen Kair\u014D" 72 | - "\u7121\u9650\u56DE\u5ECA" 73 | 74 | - name: 'EcoQuest: The Search for Cetus' 75 | external: 76 | website: https://www.mobygames.com/game/584 77 | wikipedia: 'EcoQuest: The Search for Cetus' 78 | meta: 79 | genres: 80 | - Adventure 81 | - Educational 82 | themes: 83 | - Aquatic 84 | platforms: 85 | - DOS 86 | 87 | - name: Elasto Mania 88 | external: 89 | wikipedia: Elasto Mania 90 | meta: 91 | genres: 92 | - Platform 93 | 94 | - name: 'The Elder Scrolls II: Daggerfall' 95 | external: 96 | wikipedia: 'The Elder Scrolls II: Daggerfall' 97 | meta: 98 | genres: 99 | - RPG 100 | 101 | - name: 'The Elder Scrolls III: Morrowind' 102 | external: 103 | wikipedia: 'The Elder Scrolls III: Morrowind' 104 | meta: 105 | genres: 106 | - RPG 107 | themes: 108 | - Fantasy 109 | 110 | - name: 'The Elder Scrolls Adventures: Redguard' 111 | external: 112 | wikipedia: 'The Elder Scrolls Adventures: Redguard' 113 | platforms: 114 | - DOS 115 | meta: 116 | genres: 117 | - Action 118 | - Adventure 119 | themes: 120 | - Fantasy 121 | 122 | - name: 'The Elder Scrolls: Arena' 123 | external: 124 | wikipedia: 'The Elder Scrolls: Arena' 125 | meta: 126 | genres: 127 | - RPG 128 | 129 | - name: Elements 130 | external: 131 | website: http://www.mobygames.com/game/browser/elements_ 132 | meta: 133 | genres: 134 | - Turn-Based Strategy 135 | 136 | - name: Elifoot 98 137 | external: 138 | website: 'https://www.elifoot.net/contents/history' 139 | platforms: 140 | - Windows 141 | meta: 142 | genres: 143 | - Sports 144 | - Simulation 145 | subgenres: 146 | - Soccer 147 | themes: 148 | - Management 149 | 150 | - name: Elite 151 | external: 152 | wikipedia: Elite_(video_game) 153 | meta: 154 | genres: 155 | - Action 156 | - Simulation 157 | subgenres: 158 | - Flight Simulator 159 | themes: 160 | - Sci-Fi 161 | 162 | - name: Elite II 163 | external: 164 | wikipedia: 'Frontier: Elite II' 165 | meta: 166 | genres: 167 | - Action 168 | - Simulation 169 | subgenres: 170 | - Flight Simulator 171 | themes: 172 | - Sci-Fi 173 | - Espionage 174 | 175 | - name: Elite III 176 | external: 177 | wikipedia: 'Frontier: First Encounters' 178 | meta: 179 | genres: 180 | - Action 181 | - Simulation 182 | subgenres: 183 | - Flight Simulator 184 | themes: 185 | - Sci-Fi 186 | - Espionage 187 | names: 188 | - 'Frontier: First Encounters' 189 | - FFE 190 | 191 | - name: Elona 192 | external: 193 | wikipedia: 'Elona (video game)' 194 | meta: 195 | genres: 196 | - Roguelike 197 | subgenres: 198 | - Sandbox 199 | themes: 200 | - Fantasy 201 | names: 202 | - 'Eternal League of Nefia' 203 | 204 | - name: 'Elvira: Mistress of the Dark' 205 | external: 206 | website: https://www.mobygames.com/game/4050 207 | wikipedia: 'Elvira: Mistress of the Dark (video game)' 208 | meta: 209 | genres: 210 | - Action 211 | - Adventure 212 | themes: 213 | - Fantasy 214 | - Horror 215 | platforms: 216 | - Amiga 217 | - Atari 218 | - Commodore 64 219 | - DOS 220 | - Linux 221 | - OSX 222 | - PC-98 223 | - Windows 224 | 225 | - name: 'Elvira II: The Jaws of Cerberus' 226 | external: 227 | website: https://www.mobygames.com/game/1779 228 | wikipedia: 'Elvira II: The Jaws of Cerberus' 229 | meta: 230 | genres: 231 | - Adventure 232 | - RPG 233 | themes: 234 | - Fantasy 235 | - Horror 236 | platforms: 237 | - Amiga 238 | - Atari 239 | - Commodore 64 240 | - DOS 241 | - Linux 242 | - OSX 243 | - Windows 244 | 245 | - name: 'Emperor: Battle for Dune' 246 | external: 247 | wikipedia: 'Emperor: Battle for Dune' 248 | meta: 249 | genres: 250 | - Real-Time Strategy 251 | 252 | - name: Emperor of the Fading Suns 253 | external: 254 | wikipedia: Emperor of the Fading Suns 255 | meta: 256 | genres: 257 | - Turn-Based Strategy 258 | 259 | - name: Empire 260 | names: 261 | - 'VMS Empire' 262 | - 'Empire: Wargame of the Century' 263 | - 'Empire Deluxe' 264 | external: 265 | wikipedia: Empire (1977 video game) 266 | meta: 267 | genres: 268 | - Strategy 269 | - Turn-Based Strategy 270 | 271 | - name: Encounter 272 | external: 273 | wikipedia: Encounter (video game) 274 | meta: 275 | genres: 276 | - Shmup 277 | 278 | - name: Enduro 279 | external: 280 | wikipedia: Enduro (video game) 281 | platforms: 282 | - Atari 283 | - ZX Spectrum 284 | meta: 285 | genres: 286 | - Racing 287 | 288 | - name: Enemy Engaged 289 | names: 290 | - 'Enemy Engaged: Apache vs Havoc' 291 | - 'Enemy Engaged: RAH-66 Comanche vs. KA-52 Hokum' 292 | external: 293 | wikipedia: Enemy Engaged 294 | platforms: 295 | - Windows 296 | - OSX 297 | meta: 298 | genres: 299 | - Simulation 300 | subgenres: 301 | - Flight Simulator 302 | themes: 303 | - Modern Military 304 | 305 | - name: Entombed! 306 | external: 307 | wikipedia: Entombed (1982 video game) 308 | meta: 309 | genres: 310 | - Adventure 311 | 312 | - name: Escape from Colditz 313 | external: 314 | wikipedia: Escape from Colditz 315 | meta: 316 | genres: 317 | - Action 318 | - Adventure 319 | 320 | - name: Escape from Monkey Island 321 | external: 322 | wikipedia: Escape from Monkey Island 323 | meta: 324 | genres: 325 | - Adventure 326 | 327 | - name: Escape from the Mansion 328 | external: 329 | website: https://negator2vc.itch.io/escape-from-the-mansion 330 | meta: 331 | genres: 332 | - Adventure 333 | themes: 334 | - Horror 335 | platforms: 336 | - Windows 337 | 338 | - name: Escape Velocity 339 | external: 340 | wikipedia: Escape Velocity (video game) 341 | meta: 342 | genres: 343 | - Action 344 | - Simulation 345 | 346 | - name: Even the Ocean 347 | external: 348 | website: 'https://www.mobygames.com/game/97626/even-the-ocean/' 349 | platforms: 350 | - Nintendo Switch 351 | - OSX 352 | - PlayStation 4 353 | - Windows 354 | - Xbox One 355 | meta: 356 | genres: 357 | - Action 358 | - Platform 359 | themes: 360 | - Fantasy 361 | - Sci-Fi 362 | 363 | - name: Exile 1988 364 | external: 365 | wikipedia: Exile_(1988_video_game) 366 | meta: 367 | genres: 368 | - Action 369 | - Adventure 370 | 371 | - name: Exolon 372 | external: 373 | wikipedia: Exolon 374 | meta: 375 | genres: 376 | - Shmup 377 | 378 | - name: Eye of the Beholder 379 | external: 380 | website: https://www.mobygames.com/game/835 381 | wikipedia: Eye of the Beholder (video game) 382 | meta: 383 | genres: 384 | - RPG 385 | subgenres: 386 | - Point and click 387 | themes: 388 | - Fantasy 389 | platforms: 390 | - Amiga 391 | - DOS 392 | - PC-98 393 | - Sega CD 394 | - SNES 395 | 396 | - name: Eye of the Beholder II 397 | names: 398 | - 'Eye of the Beholder II: The Legend of Darkmoon' 399 | external: 400 | website: https://www.mobygames.com/game/307 401 | wikipedia: Eye of the Beholder II 402 | meta: 403 | genres: 404 | - RPG 405 | - Action 406 | platforms: 407 | - Amiga 408 | - DOS 409 | - FM Towns 410 | - PC-98 411 | -------------------------------------------------------------------------------- /originals/g.yaml: -------------------------------------------------------------------------------- 1 | - name: 'Gabriel Knight: Sins of the Fathers' 2 | external: 3 | website: https://www.mobygames.com/game/116 4 | wikipedia: 'Gabriel Knight: Sins of the Fathers' 5 | meta: 6 | genres: 7 | - Adventure 8 | themes: 9 | - Horror 10 | platforms: 11 | - DOS 12 | - Classic Mac OS 13 | - Windows 14 | 15 | - name: Galactic Civilizations 16 | external: 17 | wikipedia: Galactic Civilizations 18 | platforms: 19 | - Windows 20 | meta: 21 | genres: 22 | - Turn-Based Strategy 23 | subgenres: 24 | - 4X 25 | themes: 26 | - Sci-Fi 27 | 28 | - name: Galaxian 29 | external: 30 | wikipedia: Galaxian 31 | meta: 32 | genres: 33 | - Arcade 34 | 35 | - name: 'Ganbare! Inuchan: Rock''n Roll Edition' 36 | external: 37 | website: https://www.mobygames.com/game/189552 38 | meta: 39 | genres: 40 | - Adventure 41 | themes: 42 | - Anime 43 | platforms: 44 | - Classic Mac OS 45 | - Windows 46 | 47 | - name: 'Ganbare! Inuchan: Trip Around the World' 48 | external: 49 | website: https://cdrom.ca/games/2022/07/26/ganbare-inuchan.html 50 | meta: 51 | genres: 52 | - Compilation 53 | platforms: 54 | - Classic Mac OS 55 | 56 | - name: Gauntlet 57 | external: 58 | wikipedia: Gauntlet (1985 video game) 59 | platforms: 60 | - Amstrad CPC 61 | - Apple II 62 | - Arcade 63 | - Atari 64 | - Classic Mac OS 65 | - Commodore 64 66 | - DOS 67 | - Genesis 68 | - Master System 69 | - MSX 70 | - NES 71 | - PlayStation 72 | - ZX Spectrum 73 | meta: 74 | genres: 75 | - Action 76 | - Arcade 77 | themes: 78 | - Fantasy 79 | - Medieval 80 | 81 | - name: Geisha 82 | external: 83 | website: https://www.mobygames.com/game/3844 84 | wikipedia: Geisha (video game) 85 | meta: 86 | genres: 87 | - Adventure 88 | themes: 89 | - Adult 90 | platforms: 91 | - Amiga 92 | - Atari 93 | - DOS 94 | 95 | - name: Geometry Wars 96 | external: 97 | wikipedia: Geometry Wars 98 | meta: 99 | genres: 100 | - Shmup 101 | 102 | - name: Gish 103 | external: 104 | wikipedia: Gish (video game) 105 | meta: 106 | genres: 107 | - Platform 108 | themes: 109 | - Comedy 110 | 111 | - name: Gikopoi 112 | names: 113 | - BARギコっぽいONLINE 114 | - Bar Gikopoi Online 115 | external: 116 | website: 'http://l4cs.jpn.org/gikopoi/' 117 | platforms: 118 | - Web 119 | 120 | - name: Gladiator 121 | external: 122 | wikipedia: Gladiator 123 | meta: 124 | genres: 125 | - Action 126 | - RPG 127 | 128 | - name: Glest 129 | external: 130 | wikipedia: Glest 131 | meta: 132 | genres: 133 | - Real-Time Strategy 134 | themes: 135 | - Medieval 136 | - Fantasy 137 | 138 | - name: Gloom 139 | external: 140 | wikipedia: Gloom (video game) 141 | platforms: 142 | - Amiga 143 | meta: 144 | genres: 145 | - FPS 146 | themes: 147 | - Sci-Fi 148 | 149 | - name: Gloom (Quake) 150 | external: 151 | website: http://www.planetgloom.com 152 | meta: 153 | genres: 154 | - FPS 155 | themes: 156 | - Sci-Fi 157 | 158 | - name: Gobliiins 159 | external: 160 | website: https://www.mobygames.com/game/1154 161 | wikipedia: Gobliiins 162 | meta: 163 | genres: 164 | - Puzzle 165 | themes: 166 | - Fantasy 167 | platforms: 168 | - Amiga 169 | - CD-i 170 | - DOS 171 | - Classic Mac OS 172 | - iOS 173 | - Windows 174 | 175 | - name: 'Gobliins 2: The Prince Buffoon' 176 | external: 177 | website: https://www.mobygames.com/game/2625 178 | wikipedia: 'Gobliiins#Gobliins 2: The Prince Buffoon' 179 | meta: 180 | genres: 181 | - Puzzle 182 | themes: 183 | - Fantasy 184 | platforms: 185 | - Amiga 186 | - Atari 187 | - DOS 188 | - Classic Mac OS 189 | - iOS 190 | - Windows 191 | 192 | - name: Goblins Quest 3 193 | external: 194 | website: https://www.mobygames.com/game/2870 195 | wikipedia: Gobliiins#Goblins Quest 3 196 | meta: 197 | genres: 198 | - Puzzle 199 | themes: 200 | - Fantasy 201 | platforms: 202 | - Amiga 203 | - DOS 204 | - Classic Mac OS 205 | - Windows 206 | 207 | - name: Gods 208 | external: 209 | wikipedia: Gods (video game) 210 | meta: 211 | genres: 212 | - Platform 213 | 214 | - name: Gold Rush! 215 | external: 216 | website: https://www.mobygames.com/game/440 217 | wikipedia: Gold Rush! 218 | meta: 219 | genres: 220 | - Adventure 221 | themes: 222 | - Western 223 | platforms: 224 | - Amiga 225 | - Apple II 226 | - Atari 227 | - CoCo 228 | - DOS 229 | - Classic Mac OS 230 | 231 | - name: A Golden Wake 232 | external: 233 | website: https://www.mobygames.com/game/71204 234 | wikipedia: A Golden Wake 235 | meta: 236 | genres: 237 | - Adventure 238 | subgenres: 239 | - Point and click 240 | platforms: 241 | - Linux 242 | - Classic Mac OS 243 | - Windows 244 | 245 | - name: GoldenEye 007 246 | external: 247 | wikipedia: GoldenEye 007 (1997 video game) 248 | meta: 249 | genres: 250 | - FPS 251 | 252 | - name: The Goonies 253 | external: 254 | wikipedia: The Goonies (video game) 255 | meta: 256 | genres: 257 | - Platform 258 | 259 | - name: Gorillas 260 | names: 261 | - Gorilla.Bas 262 | external: 263 | wikipedia: Gorillas (video game) 264 | meta: 265 | genres: 266 | - Arcade 267 | subgenres: 268 | - Artillery 269 | 270 | - name: Gothic 271 | names: 272 | - Gothic II 273 | external: 274 | wikipedia: Gothic (video game) 275 | meta: 276 | genres: 277 | - RPG 278 | - Action 279 | 280 | - name: Grand Theft Auto 281 | external: 282 | wikipedia: Grand Theft Auto (video game) 283 | meta: 284 | genres: 285 | - Action 286 | - Adventure 287 | subgenres: 288 | - Vehicular Combat 289 | themes: 290 | - Crime 291 | 292 | - name: Grand Theft Auto 2 293 | external: 294 | wikipedia: Grand Theft Auto 2 295 | meta: 296 | genres: 297 | - Action 298 | - Adventure 299 | subgenres: 300 | - Vehicular Combat 301 | themes: 302 | - Crime 303 | 304 | - name: Grand Theft Auto III 305 | external: 306 | wikipedia: Grand Theft Auto III 307 | meta: 308 | genres: 309 | - Action 310 | - Adventure 311 | subgenres: 312 | - Sandbox 313 | - Vehicular Combat 314 | themes: 315 | - Crime 316 | 317 | - name: "Grand Theft Auto: San Andreas" 318 | external: 319 | wikipedia: "Grand Theft Auto: San Andreas" 320 | meta: 321 | genres: 322 | - Action 323 | - Adventure 324 | subgenres: 325 | - Sandbox 326 | - Vehicular Combat 327 | themes: 328 | - Crime 329 | 330 | - name: 'Grand Theft Auto: Vice City' 331 | external: 332 | wikipedia: 'Grand Theft Auto: Vice City' 333 | platforms: 334 | - Android 335 | - iOS 336 | - OSX 337 | - PlayStation 2 338 | - Windows 339 | - Xbox 340 | meta: 341 | genres: 342 | - Action 343 | - Adventure 344 | subgenres: 345 | - Sandbox 346 | - Vehicular Combat 347 | themes: 348 | - Crime 349 | 350 | - name: Gravity Force 351 | external: 352 | wikipedia: Gravity Force 353 | meta: 354 | genres: 355 | - Arcade 356 | 357 | - name: The Great Escape 358 | external: 359 | wikipedia: The Great Escape (video game) 360 | meta: 361 | genres: 362 | - Arcade 363 | 364 | - name: The Great Giana Sisters 365 | external: 366 | wikipedia: The Great Giana Sisters 367 | meta: 368 | genres: 369 | - Platform 370 | 371 | - name: Green Eggs and Ham 372 | external: 373 | website: https://www.mobygames.com/game/71853 374 | meta: 375 | genres: 376 | - Educational 377 | platforms: 378 | - Classic Mac OS 379 | - Windows 380 | 381 | - name: Gregory and the Hot Air Balloon 382 | external: 383 | website: https://www.mobygames.com/game/99115 384 | wikipedia: Gregory and the Hot Air Balloon 385 | meta: 386 | genres: 387 | - Adventure 388 | - Educational 389 | platforms: 390 | - Classic Mac OS 391 | - Windows 392 | 393 | - name: The Griffon Legend 394 | external: 395 | website: http://syn9.thehideoutgames.com/index_backup.php?table=griffonlegend 396 | meta: 397 | genres: 398 | - Adventure 399 | - Action 400 | themes: 401 | - Fantasy 402 | platforms: 403 | - Windows 404 | 405 | - name: Grim Fandango 406 | external: 407 | wikipedia: Grim Fandango 408 | meta: 409 | genres: 410 | - Adventure 411 | 412 | - name: Gruntz 413 | external: 414 | wikipedia: Gruntz 415 | platforms: 416 | - Windows 417 | meta: 418 | genres: 419 | - Strategy 420 | - Puzzle 421 | 422 | - name: The Guild of Thieves 423 | external: 424 | website: https://www.mobygames.com/game/1323 425 | wikipedia: The Guild of Thieves 426 | meta: 427 | genres: 428 | - Adventure 429 | subgenres: 430 | - Text Adventure 431 | themes: 432 | - Fantasy 433 | platforms: 434 | - Acorn 32-bit 435 | - Amstrad CPC 436 | - Apple II 437 | - Atari 438 | - Classic Mac OS 439 | - Commodore 64 440 | - DOS 441 | - ZX Spectrum 442 | 443 | - name: Guitar Hero 444 | external: 445 | wikipedia: Guitar Hero 446 | meta: 447 | genres: 448 | - Rhythm 449 | 450 | - name: Gunbound 451 | external: 452 | website: 'http://www.gunbound.com/' 453 | wikipedia: Gunbound 454 | platforms: 455 | - Windows 456 | meta: 457 | genres: 458 | - Strategy 459 | subgenres: 460 | - Artillery 461 | 462 | - name: Gunpoint 463 | external: 464 | wikipedia: Gunpoint (video game) 465 | meta: 466 | genres: 467 | - Platform 468 | - Puzzle 469 | themes: 470 | - Sci-Fi 471 | 472 | - name: Gwent 473 | external: 474 | wikipedia: 'Gwent: The Witcher Card Game' 475 | platforms: 476 | - Windows 477 | meta: 478 | genres: 479 | - Turn-Based Strategy 480 | subgenres: 481 | - Board Game 482 | themes: 483 | - Fantasy 484 | -------------------------------------------------------------------------------- /originals/h.yaml: -------------------------------------------------------------------------------- 1 | - name: Hack 2 | external: 3 | wikipedia: Hack (video game) 4 | meta: 5 | genres: 6 | - Roguelike 7 | 8 | - name: Hades Challenge 9 | external: 10 | website: https://www.mobygames.com/game/26769 11 | wikipedia: Hercules (franchise)#Hades Challenge 12 | meta: 13 | genres: 14 | - Adventure 15 | - Puzzle 16 | themes: 17 | - Fantasy 18 | platforms: 19 | - Classic Mac OS 20 | - Windows 21 | 22 | - name: Half-Life 23 | external: 24 | wikipedia: Half-Life 25 | platforms: 26 | - Linux 27 | - OSX 28 | - PlayStation 2 29 | - Windows 30 | meta: 31 | genres: 32 | - FPS 33 | themes: 34 | - Sci-Fi 35 | 36 | - name: Half-Life 2 37 | external: 38 | wikipedia: Half-Life 2 39 | platforms: 40 | - Android 41 | - Linux 42 | - OSX 43 | - PlayStation 3 44 | - Windows 45 | - Xbox 46 | - Xbox 360 47 | meta: 48 | genres: 49 | - FPS 50 | themes: 51 | - Sci-Fi 52 | 53 | - name: 'Halls of the Dead: Faery Tale Adventure II' 54 | names: 55 | - Faery Tale Adventure II 56 | external: 57 | website: https://www.mobygames.com/game/3414 58 | wikipedia: 'Faery Tale Adventure II: Halls of the Dead' 59 | meta: 60 | genres: 61 | - RPG 62 | themes: 63 | - Fantasy 64 | platforms: 65 | - DOS 66 | - Windows 67 | 68 | - name: 'Halo: Combat Evolved' 69 | names: 70 | - Halo 71 | - Halo CE 72 | - 'Halo: Custom Edition' 73 | external: 74 | wikipedia: 'Halo: Combat Evolved' 75 | platforms: 76 | - OSX 77 | - Windows 78 | - Xbox 79 | - Xbox 360 80 | meta: 81 | genres: 82 | - FPS 83 | themes: 84 | - Sci-Fi 85 | 86 | - name: Hard Vacuum 87 | external: 88 | website: https://lostgarden.home.blog/2005/03/27/game-post-mortem-hard-vacuum/ 89 | meta: 90 | genres: 91 | - Real-Time Strategy 92 | themes: 93 | - Sci-Fi 94 | 95 | - name: Hardwar 96 | external: 97 | wikipedia: Hardwar (video game) 98 | meta: 99 | genres: 100 | - Action 101 | - Simulation 102 | subgenres: 103 | - Flight Simulator 104 | themes: 105 | - Sci-Fi 106 | - Cyberpunk 107 | 108 | - name: Harry and the Haunted House 109 | external: 110 | website: https://www.mobygames.com/game/4723 111 | meta: 112 | genres: 113 | - Educational 114 | subgenres: 115 | - Point and click 116 | themes: 117 | - Fantasy 118 | platforms: 119 | - Android 120 | - Classic Mac OS 121 | - iOS 122 | - Windows 123 | 124 | - name: Haunted House 125 | external: 126 | wikipedia: Haunted House 127 | meta: 128 | genres: 129 | - Action 130 | - Adventure 131 | subgenres: 132 | - Survival 133 | themes: 134 | - Horror 135 | 136 | - name: Head over Heels 137 | external: 138 | wikipedia: Head over Heels (video game) 139 | meta: 140 | genres: 141 | - Platform 142 | 143 | - name: Heart of Darkness 144 | external: 145 | wikipedia: Heart of Darkness (video game) 146 | meta: 147 | genres: 148 | - Platform 149 | - Adventure 150 | 151 | - name: Heavy Smash 152 | external: 153 | website: http://www.mobygames.com/game/arcade/heavy-smash 154 | meta: 155 | genres: 156 | - Sports 157 | subgenres: 158 | - Handball 159 | themes: 160 | - Sci-Fi 161 | 162 | - name: Helga Deep In Trouble 163 | external: 164 | website: http://www.helgagame.com 165 | meta: 166 | genres: 167 | - Adventure 168 | subgenres: 169 | - Point and click 170 | themes: 171 | - Comedy 172 | platforms: 173 | - iOS 174 | - Windows 175 | 176 | - name: Heretic 177 | external: 178 | wikipedia: Heretic (video game) 179 | meta: 180 | genres: 181 | - FPS 182 | 183 | - name: Heroes of Might and Magic II 184 | external: 185 | wikipedia: Heroes of Might and Magic II 186 | meta: 187 | genres: 188 | - Turn-Based Strategy 189 | 190 | - name: Heroes of Might and Magic III 191 | external: 192 | wikipedia: Heroes of Might and Magic III 193 | meta: 194 | genres: 195 | - Turn-Based Strategy 196 | 197 | - name: Herzog Zwei 198 | external: 199 | wikipedia: Herzog Zwei 200 | meta: 201 | genres: 202 | - Real-Time Strategy 203 | 204 | - name: Hexen 205 | external: 206 | wikipedia: Hexen 207 | meta: 208 | genres: 209 | - FPS 210 | 211 | - name: Hexen II 212 | external: 213 | wikipedia: Hexen II 214 | meta: 215 | genres: 216 | - FPS 217 | 218 | - name: Highway Encounter 219 | external: 220 | wikipedia: Highway Encounter 221 | meta: 222 | genres: 223 | - Action 224 | 225 | - name: 'Higurashi: When They Cry Hou' 226 | external: 227 | website: 'https://entergram.co.jp/higurashihou/' 228 | wikipedia: Higurashi When They Cry 229 | platforms: 230 | - Nintendo Switch 231 | - PlayStation 4 232 | meta: 233 | genres: 234 | - Adventure 235 | subgenres: 236 | - Visual Novel 237 | themes: 238 | - Anime 239 | - Comedy 240 | - Crime 241 | - Horror 242 | 243 | 244 | - name: 'History Line: 1914-1918' 245 | external: 246 | wikipedia: 'History Line: 1914-1918' 247 | meta: 248 | genres: 249 | - Strategy 250 | - Turn-Based Tactics 251 | themes: 252 | - World War I 253 | 254 | - name: The Hobbit 255 | external: 256 | wikipedia: The Hobbit (1982 video game) 257 | meta: 258 | genres: 259 | - Adventure 260 | 261 | - name: Hogs of War 262 | external: 263 | wikipedia: Hogs of War 264 | meta: 265 | genres: 266 | - Turn-Based Strategy 267 | 268 | - name: Homeworld 269 | external: 270 | wikipedia: Homeworld 271 | meta: 272 | genres: 273 | - Real-Time Strategy 274 | themes: 275 | - Sci-Fi 276 | 277 | - name: Hopkins FBI 278 | external: 279 | website: https://www.mobygames.com/game/3994 280 | wikipedia: Hopkins FBI 281 | meta: 282 | genres: 283 | - Adventure 284 | - Puzzle 285 | themes: 286 | - Crime 287 | platforms: 288 | - BeOS 289 | - Linux 290 | - OS/2 291 | - Windows 292 | 293 | - name: Hotline Miami 294 | external: 295 | wikipedia: Hotline Miami 296 | platforms: 297 | - Linux 298 | - Nintendo Switch 299 | - OSX 300 | - PlayStation 3 301 | - PlayStation 4 302 | - PlayStation 5 303 | - PlayStation Vita 304 | - Windows 305 | - Xbox One 306 | - Xbox Series S/X 307 | meta: 308 | genres: 309 | - Shmup 310 | themes: 311 | - Crime 312 | 313 | - name: HoverRace 314 | external: 315 | wikipedia: HoverRace 316 | meta: 317 | genres: 318 | - Racing 319 | 320 | - name: Hovertank 3D 321 | external: 322 | wikipedia: Hovertank 3D 323 | meta: 324 | genres: 325 | - FPS 326 | 327 | - name: Hoyle Classic Card Games 328 | external: 329 | website: https://www.mobygames.com/game/30264 330 | wikipedia: Hoyle%27s Official Book of Games#Hoyle Classic Card Games (Hoyle 4) 331 | meta: 332 | genres: 333 | - Card Game 334 | - Puzzle 335 | subgenres: 336 | - Board Game 337 | platforms: 338 | - DOS 339 | - Classic Mac OS 340 | - Windows 341 | 342 | - name: Hoyle Classic Games 343 | external: 344 | website: https://www.mobygames.com/game/28770 345 | wikipedia: Hoyle%27s Official Book of Games#Hoyle Classic Games (Hoyle 5) 346 | meta: 347 | genres: 348 | - Card Game 349 | - Puzzle 350 | platforms: 351 | - Classic Mac OS 352 | - Windows 353 | 354 | - name: Hoyle Solitaire 355 | external: 356 | website: https://www.mobygames.com/game/1232 357 | meta: 358 | genres: 359 | - Card Game 360 | platforms: 361 | - Classic Mac OS 362 | - Windows 363 | 364 | - name: 'Hoyle''s Official Book of Games: Volume 1' 365 | external: 366 | website: https://www.mobygames.com/game/759 367 | wikipedia: Hoyle%27s Official Book of Games#Volume 1 368 | meta: 369 | genres: 370 | - Card Game 371 | platforms: 372 | - Amiga 373 | - Atari 374 | - Classic Mac OS 375 | - DOS 376 | 377 | - name: 'Hoyle''s Official Book of Games: Volume 2' 378 | external: 379 | website: https://www.mobygames.com/game/760 380 | wikipedia: Hoyle%27s Official Book of Games#Volume 2 381 | meta: 382 | genres: 383 | - Card Game 384 | platforms: 385 | - Amiga 386 | - Atari 387 | - DOS 388 | - Classic Mac OS 389 | 390 | - name: 'Hoyle''s Official Book of Games: Volume 3' 391 | external: 392 | website: https://www.mobygames.com/game/2124 393 | wikipedia: Hoyle%27s Official Book of Games#Volume 3 394 | meta: 395 | subgenres: 396 | - Board Game 397 | platforms: 398 | - Amiga 399 | - DOS 400 | 401 | - name: 'Hugo II: Whodunit?' 402 | names: 403 | - Hugo's Mystery Adventure 404 | external: 405 | website: https://www.mobygames.com/game/1158 406 | wikipedia: Hugo II, Whodunit%3F 407 | meta: 408 | genres: 409 | - Adventure 410 | themes: 411 | - Crime 412 | platforms: 413 | - DOS 414 | - Windows 415 | 416 | - name: 'Hugo III: Jungle of Doom' 417 | names: 418 | - Hugo's Amazon Adventure 419 | external: 420 | website: https://www.mobygames.com/game/4962 421 | wikipedia: Hugo III, Jungle of Doom! 422 | meta: 423 | genres: 424 | - Adventure 425 | platforms: 426 | - DOS 427 | - Windows 428 | 429 | - name: Hugo's House of Horrors 430 | external: 431 | website: https://www.mobygames.com/game/1023 432 | wikipedia: Hugo%27s House of Horrors 433 | meta: 434 | genres: 435 | - Adventure 436 | themes: 437 | - Horror 438 | platforms: 439 | - DOS 440 | - Windows 441 | 442 | - name: HuniePop 443 | external: 444 | wikipedia: HuniePop 445 | meta: 446 | genres: 447 | - Puzzle 448 | 449 | - name: Hyperspace Delivery Boy! 450 | external: 451 | website: https://www.mobygames.com/game/8754 452 | wikipedia: Hyperspace Delivery Boy! 453 | meta: 454 | genres: 455 | - Action 456 | - Puzzle 457 | themes: 458 | - Sci-Fi 459 | platforms: 460 | - Linux 461 | - Windows 462 | -------------------------------------------------------------------------------- /originals/i.yaml: -------------------------------------------------------------------------------- 1 | - name: I Have No Mouth, and I Must Scream 2 | names: 3 | - 'Harlan Ellison: I Have No Mouth, and I Must Scream' 4 | external: 5 | website: https://www.mobygames.com/game/617 6 | wikipedia: I Have No Mouth, and I Must Scream (video game) 7 | meta: 8 | genres: 9 | - Adventure 10 | subgenres: 11 | - Point and click 12 | themes: 13 | - Horror 14 | - Post-Apocalyptic 15 | - Sci-Fi 16 | platforms: 17 | - Android 18 | - DOS 19 | - Classic Mac OS 20 | - iOS 21 | - Linux 22 | - OSX 23 | - Windows 24 | 25 | - name: Icewind Dale 26 | names: 27 | - 'Icewind Dale: Heart of Winter' 28 | - Icewind Dale II 29 | external: 30 | wikipedia: Icewind Dale 31 | meta: 32 | genres: 33 | - RPG 34 | themes: 35 | - Fantasy 36 | - Medieval 37 | 38 | - name: Imperialism 39 | external: 40 | wikipedia: Imperialism (video game) 41 | meta: 42 | genres: 43 | - Turn-Based Strategy 44 | 45 | - name: Imperium Galactica 46 | external: 47 | wikipedia: Imperium Galactica 48 | meta: 49 | genres: 50 | - Strategy 51 | subgenres: 52 | - 4X 53 | themes: 54 | - Sci-Fi 55 | 56 | - name: In Pursuit of Greed 57 | names: 58 | - Assassinators 59 | external: 60 | wikipedia: In Pursuit of Greed 61 | platforms: 62 | - DOS 63 | meta: 64 | genres: 65 | - FPS 66 | themes: 67 | - Sci-Fi 68 | 69 | - name: The Incredible Machine 70 | external: 71 | wikipedia: The_Incredible_Machine_(video_game) 72 | meta: 73 | genres: 74 | - Puzzle 75 | - Simulation 76 | 77 | - name: The Incredible Machine 2 78 | external: 79 | wikipedia: The Incredible Machine 2 80 | meta: 81 | genres: 82 | - Puzzle 83 | - Simulation 84 | 85 | - name: The Incredible Machine 3 86 | external: 87 | wikipedia: The Incredible Machine 3 88 | meta: 89 | genres: 90 | - Puzzle 91 | - Simulation 92 | 93 | - name: 'The Incredible Machine: Even More Contraptions' 94 | external: 95 | wikipedia: 'The Incredible Machine: Even More Contraptions' 96 | meta: 97 | genres: 98 | - Puzzle 99 | - Simulation 100 | 101 | - name: Incredible Toons 102 | external: 103 | wikipedia: Sid & Al's Incredible Toons 104 | meta: 105 | genres: 106 | - Puzzle 107 | - Simulation 108 | 109 | - name: Indiana Jones and his Desktop Adventures 110 | external: 111 | wikipedia: Indiana Jones and his Desktop Adventures 112 | meta: 113 | genres: 114 | - RPG 115 | 116 | - name: Indiana Jones and the Fate of Atlantis 117 | external: 118 | website: https://www.mobygames.com/game/316 119 | wikipedia: Indiana Jones and the Fate of Atlantis 120 | meta: 121 | genres: 122 | - Adventure 123 | subgenres: 124 | - Point and click 125 | platforms: 126 | - Amiga 127 | - DOS 128 | - FM Towns 129 | - Classic Mac OS 130 | - Linux 131 | - Windows 132 | 133 | - name: 'Indiana Jones and the Last Crusade: The Graphic Adventure' 134 | external: 135 | website: https://www.mobygames.com/game/534 136 | wikipedia: 'Indiana Jones and the Last Crusade: The Graphic Adventure' 137 | meta: 138 | genres: 139 | - Adventure 140 | subgenres: 141 | - Point and click 142 | platforms: 143 | - Amiga 144 | - Atari 145 | - DOS 146 | - FM Towns 147 | - Classic Mac OS 148 | - Linux 149 | - Windows 150 | 151 | - name: Infinity Loop 152 | external: 153 | website: http://loopgame.co 154 | meta: 155 | genres: 156 | - Puzzle 157 | 158 | - name: Inherit the Earth 159 | names: 160 | - 'Inherit the Earth: Quest for the Orb' 161 | external: 162 | website: https://www.mobygames.com/game/4008 163 | wikipedia: Inherit the Earth 164 | meta: 165 | genres: 166 | - Adventure 167 | themes: 168 | - Sci-Fi 169 | platforms: 170 | - Amiga 171 | - DOS 172 | - Linux 173 | - Classic Mac OS 174 | - iOS 175 | - PC-98 176 | - Windows 177 | 178 | - name: Interstate '76 179 | external: 180 | wikipedia: Interstate '76 181 | meta: 182 | genres: 183 | - Action 184 | - Racing 185 | themes: 186 | - Post-Apocalyptic 187 | 188 | - name: Ironseed 189 | external: 190 | wikipedia: Ironseed 191 | platforms: 192 | - DOS 193 | meta: 194 | genres: 195 | - Simulation 196 | subgenres: 197 | - Space Flight 198 | - Vehicular Combat 199 | themes: 200 | - Sci-Fi 201 | 202 | - name: The Island of Dr. Brain 203 | external: 204 | website: https://www.mobygames.com/game/1524 205 | wikipedia: The Island of Dr. Brain 206 | meta: 207 | genres: 208 | - Educational 209 | - Puzzle 210 | platforms: 211 | - DOS 212 | 213 | - name: Izmir 214 | names: 215 | - 이즈미르 216 | external: 217 | website: 'https://www.mobygames.com/game/56500/izmir/' 218 | platforms: 219 | - DOS 220 | meta: 221 | genres: 222 | - Action 223 | - Arcade 224 | - Shooter 225 | themes: 226 | - Sci-Fi 227 | -------------------------------------------------------------------------------- /originals/j.yaml: -------------------------------------------------------------------------------- 1 | - name: Jack in the Dark 2 | external: 3 | wikipedia: Jack in the Dark 4 | meta: 5 | genres: 6 | - Action 7 | - Adventure 8 | themes: 9 | - Horror 10 | - Alternate Historical 11 | 12 | - name: Jade Empire 13 | external: 14 | wikipedia: Jade Empire 15 | meta: 16 | genres: 17 | - RPG 18 | themes: 19 | - Martial Arts 20 | 21 | - name: Jagged Alliance 2 22 | external: 23 | wikipedia: Jagged Alliance 2 24 | meta: 25 | genres: 26 | - RPG 27 | - Strategy 28 | - Turn-Based Tactics 29 | themes: 30 | - Sci-Fi 31 | - Modern Military 32 | 33 | - name: 'Jak and Daxter: The Precursor Legacy' 34 | external: 35 | wikipedia: 'Jak and Daxter: The Precursor Legacy' 36 | meta: 37 | genres: 38 | - Platform 39 | themes: 40 | - Fantasy 41 | - Sci-Fi 42 | 43 | - name: Jazz Jackrabbit 44 | external: 45 | wikipedia: Jazz Jackrabbit 46 | meta: 47 | genres: 48 | - Platform 49 | 50 | - name: Jazz Jackrabbit 2 51 | external: 52 | wikipedia: Jazz Jackrabbit 2 53 | meta: 54 | genres: 55 | - Platform 56 | 57 | - name: Jet-Story 58 | external: 59 | wikipedia: Jet-Story 60 | meta: 61 | genres: 62 | - Platform 63 | 64 | - name: Jetpac 65 | external: 66 | wikipedia: Jetpac 67 | meta: 68 | genres: 69 | - Arcade 70 | 71 | - name: Jetpack 72 | external: 73 | website: 'https://www.adeptsoftware.com/jetpack/' 74 | wikipedia: Jetpack (video game) 75 | platforms: 76 | - DOS 77 | meta: 78 | genres: 79 | - Platform 80 | 81 | - name: Jewel Thief 82 | external: 83 | website: http://www.mobygames.com/game/win3x/jewel-thief 84 | meta: 85 | genres: 86 | - Arcade 87 | 88 | - name: JezzBall 89 | external: 90 | wikipedia: JezzBall 91 | meta: 92 | genres: 93 | - Arcade 94 | 95 | - name: Jinxter 96 | external: 97 | website: https://www.mobygames.com/game/1291 98 | wikipedia: Jinxter 99 | meta: 100 | genres: 101 | - Adventure 102 | subgenres: 103 | - Text Adventure 104 | themes: 105 | - Sci-Fi 106 | - Fantasy 107 | - Comedy 108 | platforms: 109 | - Amiga 110 | - Amstrad CPC 111 | - Apple II 112 | - Atari 113 | - Commodore 64 114 | - Classic Mac OS 115 | - DOS 116 | - ZX Spectrum 117 | 118 | - name: Jones in the Fast Lane 119 | external: 120 | website: https://www.mobygames.com/game/370 121 | wikipedia: Jones in the Fast Lane 122 | meta: 123 | genres: 124 | - Simulation 125 | platforms: 126 | - DOS 127 | - Windows 128 | 129 | - name: 'The Journeyman Project: Pegasus Prime' 130 | external: 131 | website: https://www.mobygames.com/game/23526 132 | wikipedia: 'The Journeyman Project: Pegasus Prime' 133 | meta: 134 | genres: 135 | - Adventure 136 | themes: 137 | - Sci-Fi 138 | platforms: 139 | - Classic Mac OS 140 | - Linux 141 | - Windows 142 | 143 | - name: 'The Journeyman Project 2: Buried in Time' 144 | external: 145 | website: https://www.mobygames.com/game/2149 146 | wikipedia: 'The Journeyman Project 2: Buried in Time' 147 | meta: 148 | genres: 149 | - Adventure 150 | themes: 151 | - Sci-Fi 152 | platforms: 153 | - Classic Mac OS 154 | - Windows 155 | 156 | - name: Joust 157 | external: 158 | wikipedia: Joust (video game) 159 | meta: 160 | genres: 161 | - Arcade 162 | 163 | - name: Jump 'n Bump 164 | external: 165 | wikipedia: Jump 'n Bump 166 | meta: 167 | genres: 168 | - Platform 169 | 170 | - name: 'Jumpgate: The Reconstruction Initiative' 171 | external: 172 | wikipedia: 'Jumpgate: The Reconstruction Initiative' 173 | meta: 174 | genres: 175 | - MMORPG 176 | 177 | - name: Jumping Jack 178 | external: 179 | wikipedia: Jumping Jack (video game) 180 | meta: 181 | genres: 182 | - Arcade 183 | 184 | - name: Jumpman 185 | external: 186 | wikipedia: Jumpman 187 | meta: 188 | genres: 189 | - Platform 190 | 191 | - name: Just Grandma and Me 192 | external: 193 | website: https://www.mobygames.com/game/17688 194 | meta: 195 | genres: 196 | - Educational 197 | themes: 198 | - Fantasy 199 | platforms: 200 | - Classic Mac OS 201 | - Windows 202 | -------------------------------------------------------------------------------- /originals/k.yaml: -------------------------------------------------------------------------------- 1 | - name: Kaboom! 2 | external: 3 | wikipedia: Kaboom! (video game) 4 | meta: 5 | genres: 6 | - Arcade 7 | 8 | - name: Kathy Rain 9 | external: 10 | website: https://www.mobygames.com/game/79519 11 | wikipedia: Kathy Rain 12 | meta: 13 | genres: 14 | - Adventure 15 | subgenres: 16 | - Point and click 17 | platforms: 18 | - Android 19 | - Classic Mac OS 20 | - iOS 21 | - Windows 22 | 23 | - name: Ken's Labyrinth 24 | external: 25 | wikipedia: Ken's Labyrinth 26 | meta: 27 | genres: 28 | - FPS 29 | 30 | - name: Kick Off 31 | names: 32 | - Kick Off 2 33 | external: 34 | wikipedia: Kick Off (series) 35 | platforms: 36 | - Amiga 37 | - Atari 38 | - DOS 39 | meta: 40 | genres: 41 | - Sports 42 | subgenres: 43 | - Football 44 | 45 | - name: Kid Chameleon 46 | external: 47 | wikipedia: Kid Chameleon (video game) 48 | meta: 49 | genres: 50 | - Platform 51 | 52 | - name: King under the Mountain 53 | external: 54 | website: 'https://www.mobygames.com/game/175832/king-under-the-mountain/' 55 | platforms: 56 | - Linux 57 | - OSX 58 | - Windows 59 | meta: 60 | genres: 61 | - Simulation 62 | - Strategy 63 | subgenres: 64 | - City Building 65 | 66 | - name: King's Quest I 67 | names: 68 | - 'Quest for the Crown' 69 | external: 70 | website: https://www.mobygames.com/game/122 71 | wikipedia: King%27s Quest I 72 | meta: 73 | genres: 74 | - Adventure 75 | themes: 76 | - Fantasy 77 | - Medieval 78 | platforms: 79 | - Amiga 80 | - Apple II 81 | - Atari 82 | - CoCo 83 | - DOS 84 | - Classic Mac OS 85 | - Master System 86 | 87 | - name: King's Quest II 88 | names: 89 | - 'King''s Quest II: Romancing the Throne' 90 | external: 91 | website: https://www.mobygames.com/game/123 92 | wikipedia: King%27s Quest II 93 | meta: 94 | genres: 95 | - Adventure 96 | themes: 97 | - Fantasy 98 | - Medieval 99 | platforms: 100 | - Amiga 101 | - Apple II 102 | - Atari 103 | - CoCo 104 | - DOS 105 | - Classic Mac OS 106 | 107 | - name: King's Quest III 108 | names: 109 | - 'King''s Quest III: To Heir Is Human' 110 | external: 111 | website: https://www.mobygames.com/game/126 112 | wikipedia: King%27s Quest III 113 | meta: 114 | genres: 115 | - Adventure 116 | themes: 117 | - Fantasy 118 | - Medieval 119 | platforms: 120 | - Amiga 121 | - Apple II 122 | - Atari 123 | - CoCo 124 | - DOS 125 | - Classic Mac OS 126 | 127 | - name: King's Quest IV 128 | names: 129 | - 'King''s Quest IV: The Perils of Rosella' 130 | external: 131 | website: https://www.mobygames.com/game/129 132 | wikipedia: King%27s Quest IV 133 | meta: 134 | genres: 135 | - Adventure 136 | themes: 137 | - Fantasy 138 | - Medieval 139 | platforms: 140 | - Amiga 141 | - Atari 142 | - DOS 143 | 144 | - name: King's Quest V 145 | names: 146 | - 'King''s Quest V: Absence Makes the Heart Go Yonder!' 147 | external: 148 | website: https://www.mobygames.com/game/130 149 | wikipedia: King%27s Quest V 150 | meta: 151 | genres: 152 | - Adventure 153 | themes: 154 | - Fantasy 155 | - Medieval 156 | platforms: 157 | - Amiga 158 | - DOS 159 | - FM Towns 160 | - Classic Mac OS 161 | - NES 162 | - PC-98 163 | - Windows 164 | 165 | - name: King's Quest VI 166 | names: 167 | - 'King''s Quest VI: Heir Today, Gone Tomorrow' 168 | external: 169 | website: https://www.mobygames.com/game/131 170 | wikipedia: King%27s Quest VI 171 | meta: 172 | genres: 173 | - Adventure 174 | themes: 175 | - Fantasy 176 | - Medieval 177 | platforms: 178 | - DOS 179 | - Classic Mac OS 180 | - Windows 181 | 182 | - name: King's Quest VII 183 | names: 184 | - 'King''s Quest VII: The Princeless Bride' 185 | external: 186 | website: https://www.mobygames.com/game/135 187 | wikipedia: King%27s Quest VII 188 | meta: 189 | genres: 190 | - Adventure 191 | subgenres: 192 | - Point and click 193 | themes: 194 | - Fantasy 195 | - Medieval 196 | platforms: 197 | - Classic Mac OS 198 | - DOS 199 | - Windows 200 | 201 | - name: Klondike 202 | names: 203 | - Solitaire 204 | external: 205 | wikipedia: Microsoft Solitaire 206 | platforms: 207 | - Windows 208 | meta: 209 | genres: 210 | - Card Game 211 | 212 | - name: Knights 213 | external: 214 | wikipedia: Knights (video game) 215 | meta: 216 | genres: 217 | - Arcade 218 | 219 | - name: Knights and Merchants 220 | external: 221 | wikipedia: Knights and Merchants 222 | meta: 223 | genres: 224 | - Real-Time Strategy 225 | themes: 226 | - Medieval 227 | 228 | - name: Knytt Stories 229 | external: 230 | wikipedia: Nicklas Nygren 231 | platforms: 232 | - Windows 233 | meta: 234 | genres: 235 | - Platform 236 | 237 | - name: Kroz 238 | external: 239 | wikipedia: Kroz 240 | platforms: 241 | - DOS 242 | meta: 243 | genres: 244 | - Roguelike 245 | themes: 246 | - Fantasy 247 | 248 | - name: Krush, Kill 'n' Destroy 249 | names: 250 | - KKND 251 | - "Krush, Kill 'n' Destroy Xtreme" 252 | - "Krush, Kill 'n' Destroy 2: Krossfire" 253 | external: 254 | wikipedia: KKnD (series) 255 | platforms: 256 | - Windows 257 | meta: 258 | genres: 259 | - Real-Time Strategy 260 | themes: 261 | - Post-Apocalyptic 262 | 263 | - name: Kula World 264 | external: 265 | wikipedia: Kula World 266 | meta: 267 | genres: 268 | - Platform 269 | - Puzzle 270 | names: 271 | - Roll Away 272 | - Kula Quest 273 | 274 | - name: Kye 275 | external: 276 | wikipedia: Kye (video game) 277 | meta: 278 | genres: 279 | - Puzzle 280 | -------------------------------------------------------------------------------- /originals/n.yaml: -------------------------------------------------------------------------------- 1 | - name: NAM 2 | names: 3 | - Napalm 4 | external: 5 | wikipedia: NAM (video game) 6 | platforms: 7 | - DOS 8 | meta: 9 | genres: 10 | - FPS 11 | themes: 12 | - Vietnam 13 | 14 | - name: 'Nancy Drew: Secrets Can Kill' 15 | external: 16 | website: https://www.mobygames.com/game/4907 17 | wikipedia: 'Nancy Drew: Secrets Can Kill' 18 | meta: 19 | genres: 20 | - Adventure 21 | - Puzzle 22 | themes: 23 | - Crime 24 | platforms: 25 | - Windows 26 | 27 | - name: Nanosaur 28 | external: 29 | wikipedia: Nanosaur 30 | platforms: 31 | - OSX 32 | - Windows 33 | meta: 34 | genres: 35 | - TPS 36 | themes: 37 | - Prehistoric 38 | - Sci-Fi 39 | 40 | - name: Nanosaur 2 41 | names: 42 | - 'Nanosaur 2: Hatchling' 43 | external: 44 | website: 'https://www.pangeasoft.net/nano2/index.html' 45 | wikipedia: 'Nanosaur 2: Hatchling' 46 | platforms: 47 | - iOS 48 | - OSX 49 | - Windows 50 | meta: 51 | genres: 52 | - TPS 53 | themes: 54 | - Prehistoric 55 | - Sci-Fi 56 | 57 | - name: Natural Selection 58 | external: 59 | wikipedia: Natural Selection (video game) 60 | meta: 61 | genres: 62 | - FPS 63 | - Real-Time Strategy 64 | themes: 65 | - Sci-Fi 66 | 67 | - name: Nebulus 68 | external: 69 | wikipedia: Nebulus (video game) 70 | meta: 71 | genres: 72 | - Arcade 73 | 74 | - name: The Need for Speed 75 | external: 76 | wikipedia: The Need for Speed 77 | meta: 78 | genres: 79 | - Racing 80 | 81 | - name: Need For Speed II 82 | external: 83 | wikipedia: Need For Speed II 84 | meta: 85 | genres: 86 | - Racing 87 | 88 | - name: 'Need For Speed III: Hot Pursuit' 89 | external: 90 | wikipedia: 'Need for Speed III: Hot Pursuit' 91 | meta: 92 | genres: 93 | - Racing 94 | 95 | - name: Nemurenu Yoru no Chiisana O-Hanashi 96 | names: 97 | - 眠れぬ夜の小さなお話 98 | external: 99 | website: https://www.mobygames.com/game/54553 100 | meta: 101 | genres: 102 | - Adventure 103 | themes: 104 | - Anime 105 | platforms: 106 | - 3DO 107 | - Classic Mac OS 108 | - FM Towns 109 | - Pippin 110 | - Windows 111 | 112 | - name: NetHack 113 | external: 114 | wikipedia: NetHack 115 | meta: 116 | genres: 117 | - Roguelike 118 | 119 | - name: Nether Earth 120 | external: 121 | wikipedia: Nether Earth 122 | platforms: 123 | - Amstrad CPC 124 | - Commodore 64 125 | - ZX Spectrum 126 | meta: 127 | genres: 128 | - Strategy 129 | themes: 130 | - Sci-Fi 131 | 132 | - name: The Neverhood 133 | external: 134 | website: https://www.mobygames.com/game/1037 135 | wikipedia: The Neverhood 136 | meta: 137 | genres: 138 | - Adventure 139 | subgenres: 140 | - Point and click 141 | themes: 142 | - Comedy 143 | - Fantasy 144 | platforms: 145 | - PlayStation 146 | - Windows 147 | 148 | - name: Neverwinter Nights 149 | external: 150 | wikipedia: Neverwinter Nights 151 | meta: 152 | genres: 153 | - RPG 154 | themes: 155 | - Fantasy 156 | 157 | - name: Neverwinter Nights 2 158 | external: 159 | wikipedia: Neverwinter Nights 2 160 | meta: 161 | genres: 162 | - RPG 163 | themes: 164 | - Fantasy 165 | 166 | - name: The New Kid on the Block 167 | external: 168 | website: https://www.mobygames.com/game/62289 169 | meta: 170 | genres: 171 | - Educational 172 | platforms: 173 | - Classic Mac OS 174 | - iOS 175 | - Windows 176 | 177 | - name: Nexuiz 178 | external: 179 | wikipedia: Nexuiz 180 | meta: 181 | genres: 182 | - FPS 183 | 184 | - name: Night Stalker 185 | external: 186 | wikipedia: Night Stalker (video game) 187 | meta: 188 | genres: 189 | - Arcade 190 | 191 | - name: 'Nightlong: Union City Conspiracy' 192 | external: 193 | website: https://www.mobygames.com/game/2564 194 | wikipedia: 'Nightlong: Union City Conspiracy' 195 | meta: 196 | genres: 197 | - Adventure 198 | themes: 199 | - Cyberpunk 200 | - Crime 201 | platforms: 202 | - Amiga 203 | - Windows 204 | 205 | - name: Nippon Safes, Inc. 206 | external: 207 | website: https://www.mobygames.com/game/13613/nippon-safes-inc 208 | meta: 209 | genres: 210 | - Adventure 211 | themes: 212 | - Comedy 213 | - Crime 214 | platforms: 215 | - Amiga 216 | - DOS 217 | 218 | - name: Nitemare 3D 219 | names: 220 | - N3D 221 | external: 222 | wikipedia: Nitemare 3D 223 | platforms: 224 | - DOS 225 | - Windows 226 | meta: 227 | genres: 228 | - FPS 229 | themes: 230 | - Horror 231 | 232 | - name: Nodes of Yesod 233 | external: 234 | wikipedia: Nodes of Yesod 235 | meta: 236 | genres: 237 | - Platform 238 | 239 | - name: No One Lives Forever 2 240 | external: 241 | wikipedia: No One Lives Forever 2 242 | platforms: 243 | - Windows 244 | - OSX 245 | meta: 246 | genres: 247 | - FPS 248 | themes: 249 | - Espionage 250 | 251 | - name: Notrium 252 | external: 253 | website: https://www.instantkingdom.com/notrium/ 254 | wikipedia: Notrium 255 | platforms: 256 | - Windows 257 | meta: 258 | genres: 259 | - Action 260 | subgenres: 261 | - Survival 262 | themes: 263 | - Sci-Fi 264 | 265 | - name: Nox 266 | external: 267 | wikipedia: Nox (video game) 268 | platforms: 269 | - Windows 270 | meta: 271 | genres: 272 | - Action 273 | - RPG 274 | themes: 275 | - Fantasy 276 | 277 | - name: Nuclear Reaction 278 | external: 279 | website: http://gamescoffer.co.uk/configtest.php?gd=nuclearreaction 280 | meta: 281 | genres: 282 | - Puzzle 283 | platforms: 284 | - Amiga 285 | -------------------------------------------------------------------------------- /originals/o.yaml: -------------------------------------------------------------------------------- 1 | - name: Obsidian 2 | external: 3 | website: https://www.mobygames.com/game/1564 4 | wikipedia: Obsidian (1997 video game) 5 | meta: 6 | genres: 7 | - Adventure 8 | themes: 9 | - Sci-Fi 10 | platforms: 11 | - Classic Mac OS 12 | - Windows 13 | 14 | - name: Octopus 15 | external: 16 | wikipedia: List of Game & Watch games#Octopus 17 | meta: 18 | genres: 19 | - Arcade 20 | 21 | - name: 'Oddworld: Abe''s Exoddus' 22 | external: 23 | wikipedia: 'Oddworld: Abe''s Exoddus' 24 | meta: 25 | genres: 26 | - Platform 27 | - Adventure 28 | 29 | - name: 'Oddworld: Abe''s Oddysee' 30 | external: 31 | wikipedia: 'Oddworld: Abe''s Oddysee' 32 | meta: 33 | genres: 34 | - Platform 35 | - Adventure 36 | 37 | - name: Old School RuneScape 38 | external: 39 | wikipedia: Old School RuneScape 40 | meta: 41 | genres: 42 | - MMORPG 43 | themes: 44 | - Fantasy 45 | - Medieval 46 | 47 | - name: Omega Race 48 | external: 49 | wikipedia: Omega Race 50 | meta: 51 | genres: 52 | - Arcade 53 | 54 | - name: 'Once Upon A Time: Little Red Riding Hood' 55 | external: 56 | website: https://www.mobygames.com/game/31658 57 | meta: 58 | genres: 59 | - Action 60 | - Adventure 61 | - Educational 62 | themes: 63 | - Fantasy 64 | platforms: 65 | - Amiga 66 | - Atari 67 | - DOS 68 | - Windows 69 | 70 | - name: 'One Must Fall: 2097' 71 | external: 72 | wikipedia: 'One Must Fall: 2097' 73 | meta: 74 | genres: 75 | - Fighting 76 | themes: 77 | - Sci-Fi 78 | 79 | - name: Oo-Topos 80 | external: 81 | website: https://www.mobygames.com/game/148433 82 | wikipedia: Oo-Topos 83 | meta: 84 | genres: 85 | - Adventure 86 | subgenres: 87 | - Text Adventure 88 | themes: 89 | - Sci-Fi 90 | platforms: 91 | - Amiga 92 | - Atari 93 | - Apple II 94 | - Commodore 64 95 | - DOS 96 | 97 | - name: Operation Stealth 98 | names: 99 | - '007: James Bond - The Stealth Affair' 100 | external: 101 | website: https://www.mobygames.com/game/2236 102 | wikipedia: Operation Stealth 103 | meta: 104 | genres: 105 | - Adventure 106 | themes: 107 | - Espionage 108 | platforms: 109 | - Amiga 110 | - Atari 111 | - DOS 112 | 113 | - name: The Oregon Trail 114 | external: 115 | wikipedia: 'The_Oregon_Trail_(series)' 116 | meta: 117 | genres: 118 | - Adventure 119 | 120 | - name: Osu! Tatakae! Ouendan 121 | names: 122 | - Ouendan 123 | external: 124 | wikipedia: Osu! Tatakae! Ouendan 125 | platforms: 126 | - DS 127 | meta: 128 | genres: 129 | - Rhythm 130 | 131 | - name: Outcast 132 | external: 133 | wikipedia: Outcast (video game) 134 | meta: 135 | genres: 136 | - Adventure 137 | - Action 138 | 139 | - name: Outlaws 140 | external: 141 | wikipedia: Outlaws (1997 video game) 142 | meta: 143 | genres: 144 | - FPS 145 | 146 | - name: Outpost 147 | platforms: 148 | - DOS 149 | - Windows 150 | meta: 151 | genres: 152 | - Simulation 153 | - Strategy 154 | themes: 155 | - Sci-Fi 156 | external: 157 | wikipedia: Outpost (1994 video game) 158 | 159 | - name: Out Run 160 | external: 161 | wikipedia: Out Run 162 | meta: 163 | genres: 164 | - Arcade 165 | - Racing 166 | names: 167 | - "\u30A2\u30A6\u30C8 \u30E9\u30F3" 168 | - Auto Ran 169 | 170 | - name: Over-Ring-Under 171 | external: 172 | website: https://www.macintoshrepository.org/64648-over-ring-under 173 | meta: 174 | genres: 175 | - Adventure 176 | themes: 177 | - Abstract 178 | platforms: 179 | - Classic Mac OS 180 | 181 | - name: Overflow 182 | external: 183 | website: http://amigagamer.blogspot.co.uk/2012/11/overflow-amiga-pipemania-clone.html 184 | meta: 185 | genres: 186 | - Puzzle 187 | 188 | - name: Overgrowth 189 | external: 190 | website: https://overgrowth.wolfire.com/ 191 | wikipedia: Overgrowth (video game) 192 | platforms: 193 | - Linux 194 | - Windows 195 | - OSX 196 | meta: 197 | genres: 198 | - Action 199 | - Fighting 200 | themes: 201 | - Martial Arts 202 | 203 | - name: Oxyd 204 | external: 205 | wikipedia: Oxyd 206 | meta: 207 | genres: 208 | - Puzzle 209 | -------------------------------------------------------------------------------- /originals/q.yaml: -------------------------------------------------------------------------------- 1 | - name: Q*bert 2 | external: 3 | wikipedia: Q*bert 4 | meta: 5 | genres: 6 | - Arcade 7 | 8 | - name: Quadnet 9 | external: 10 | website: https://www.mobygames.com/game/dos/quadnet 11 | meta: 12 | genres: 13 | - Arcade 14 | 15 | - name: Quake 16 | external: 17 | wikipedia: Quake 18 | meta: 19 | genres: 20 | - FPS 21 | 22 | - name: Quake 2 23 | external: 24 | wikipedia: Quake 2 25 | meta: 26 | genres: 27 | - FPS 28 | 29 | - name: Quake 3 30 | external: 31 | wikipedia: Quake 3 32 | meta: 33 | genres: 34 | - FPS 35 | 36 | - name: 'Quest for Glory: So You Want To Be A Hero' 37 | names: 38 | - "Hero's Quest: So You Want to Be a Hero" 39 | - Quest for Glory I 40 | external: 41 | website: https://www.mobygames.com/game/16075 42 | wikipedia: 'Quest for Glory: So You Want to Be a Hero' 43 | meta: 44 | genres: 45 | - Adventure 46 | - RPG 47 | themes: 48 | - Fantasy 49 | platforms: 50 | - Amiga 51 | - Atari 52 | - DOS 53 | - Classic Mac OS 54 | - PC-98 55 | 56 | - name: 'Quest for Glory II: Trial by Fire' 57 | external: 58 | website: https://www.mobygames.com/game/169 59 | wikipedia: 'Quest for Glory II: Trial by Fire' 60 | meta: 61 | genres: 62 | - Adventure 63 | - RPG 64 | themes: 65 | - Fantasy 66 | platforms: 67 | - Amiga 68 | - DOS 69 | 70 | - name: 'Quest for Glory III: Wages of War' 71 | external: 72 | website: https://www.mobygames.com/game/173 73 | wikipedia: 'Quest for Glory III: Wages of War' 74 | meta: 75 | genres: 76 | - Adventure 77 | - RPG 78 | themes: 79 | - Fantasy 80 | platforms: 81 | - DOS 82 | 83 | - name: Quest for Glory IV 84 | names: 85 | - 'Quest for Glory: Shadows of Darkness' 86 | external: 87 | website: https://www.mobygames.com/game/119 88 | wikipedia: 'Quest for Glory: Shadows of Darkness' 89 | meta: 90 | genres: 91 | - Action 92 | - Adventure 93 | - RPG 94 | themes: 95 | - Fantasy 96 | platforms: 97 | - DOS 98 | - Windows -------------------------------------------------------------------------------- /originals/u.yaml: -------------------------------------------------------------------------------- 1 | - name: U.F.O.s 2 | external: 3 | website: https://www.mobygames.com/game/4556 4 | wikipedia: U.F.O.s (video game) 5 | meta: 6 | genres: 7 | - Adventure 8 | subgenres: 9 | - Point and click 10 | themes: 11 | - Comedy 12 | - Sci-Fi 13 | platforms: 14 | - Classic Mac OS 15 | - Windows 16 | 17 | - name: U95 18 | external: 19 | website: https://www.mobygames.com/game/93911/u-95/ 20 | meta: 21 | genres: 22 | - Arcade 23 | subgenres: 24 | - Submarine Simulator 25 | themes: 26 | - Aquatic 27 | platforms: 28 | - Windows 29 | 30 | - name: Ugh! 31 | external: 32 | wikipedia: Ugh! 33 | meta: 34 | genres: 35 | - Arcade 36 | 37 | - name: 'Ultima II: The Revenge of the Enchantress' 38 | external: 39 | wikipedia: 'Ultima II: The Revenge of the Enchantress' 40 | meta: 41 | genres: 42 | - RPG 43 | 44 | - name: 'Ultima III: Exodus' 45 | external: 46 | wikipedia: Ultima III 47 | meta: 48 | genres: 49 | - RPG 50 | 51 | - name: Ultima IV 52 | names: 53 | - 'Ultima IV: Quest of the Avatar' 54 | external: 55 | wikipedia: Ultima IV 56 | meta: 57 | genres: 58 | - RPG 59 | platforms: 60 | - DOS 61 | 62 | - name: Ultima Online 63 | external: 64 | wikipedia: Ultima Online 65 | meta: 66 | genres: 67 | - MMORPG 68 | 69 | - name: Ultima Underworld 70 | external: 71 | wikipedia: Ultima_Underworld 72 | platforms: 73 | - DOS 74 | - PlayStation 75 | meta: 76 | genres: 77 | - RPG 78 | subgenres: 79 | - Action RPG 80 | themes: 81 | - Fantasy 82 | 83 | - name: 'Ultima Underworld II: Labyrinth of Worlds' 84 | external: 85 | wikipedia: 'Ultima_Underworld_II:_Labyrinth_of_Worlds' 86 | platforms: 87 | - DOS 88 | meta: 89 | genres: 90 | - RPG 91 | subgenres: 92 | - Action RPG 93 | themes: 94 | - Fantasy 95 | 96 | - name: 'Ultima V: Warriors of Destiny' 97 | external: 98 | wikipedia: Ultima V 99 | meta: 100 | genres: 101 | - RPG 102 | 103 | - name: Ultima VI 104 | names: 105 | - 'Ultima VI: The False Prophet' 106 | external: 107 | wikipedia: Ultima VI 108 | meta: 109 | genres: 110 | - RPG 111 | platforms: 112 | - DOS 113 | 114 | - name: 'Ultima VII: The Black Gate' 115 | external: 116 | wikipedia: Ultima VII 117 | meta: 118 | genres: 119 | - RPG 120 | 121 | - name: Ultima VIII 122 | names: 123 | - 'Ultima VIII: Pagan' 124 | external: 125 | wikipedia: Ultima VIII 126 | meta: 127 | genres: 128 | - RPG 129 | 130 | - name: 'Ultima: Worlds of Adventure 2: Martian Dreams' 131 | external: 132 | wikipedia: 'Ultima: Worlds of Adventure 2: Martian Dreams' 133 | meta: 134 | genres: 135 | - RPG 136 | 137 | - name: Ulysses and the Golden Fleece 138 | names: 139 | - 'Hi-Res Adventure #4' 140 | external: 141 | website: https://www.mobygames.com/game/10343 142 | wikipedia: Ulysses and the Golden Fleece 143 | meta: 144 | genres: 145 | - Adventure 146 | subgenres: 147 | - Text Adventure 148 | themes: 149 | - Fantasy 150 | platforms: 151 | - Apple II 152 | - Atari 153 | - Commodore 64 154 | - FM Towns 155 | - PC-98 156 | 157 | - name: 'Umineko: When They Cry Saku' 158 | external: 159 | website: 'https://entergram.co.jp/umineko/' 160 | wikipedia: Umineko When They Cry 161 | platforms: 162 | - Nintendo Switch 163 | - PlayStation 4 164 | meta: 165 | genres: 166 | - Adventure 167 | subgenres: 168 | - Visual Novel 169 | themes: 170 | - Anime 171 | - Comedy 172 | - Crime 173 | - Fantasy 174 | 175 | - name: Uncharted Waters 176 | external: 177 | wikipedia: Uncharted Waters 178 | meta: 179 | genres: 180 | - Adventure 181 | - Strategy 182 | - RPG 183 | themes: 184 | - Alternate Historical 185 | 186 | - name: Uncle Henry's Playhouse 187 | external: 188 | website: https://www.mobygames.com/game/4531 189 | wikipedia: Uncle Henry%27s Playhouse 190 | meta: 191 | genres: 192 | - Puzzle 193 | platforms: 194 | - Windows 195 | 196 | - name: Under a Killing Moon 197 | external: 198 | wikipedia: Under a Killing Moon 199 | platforms: 200 | - Classic Mac OS 201 | - DOS 202 | meta: 203 | genres: 204 | - Adventure 205 | subgenres: 206 | - Point and click 207 | themes: 208 | - Post-Apocalyptic 209 | 210 | - name: Undertale 211 | external: 212 | wikipedia: Undertale 213 | platforms: 214 | - Linux 215 | - Nintendo Switch 216 | - OSX 217 | - PlayStation 4 218 | - PlayStation Vita 219 | - Windows 220 | meta: 221 | genres: 222 | - RPG 223 | themes: 224 | - Comedy 225 | - Fantasy 226 | 227 | - name: Uninvited 228 | external: 229 | wikipedia: Uninvited (video game) 230 | meta: 231 | genres: 232 | - Adventure 233 | 234 | - name: Unreal Tournament 235 | external: 236 | wikipedia: Unreal Tournament 237 | platforms: 238 | - Classic Mac OS 239 | - Dreamcast 240 | - Linux 241 | - PlayStation 2 242 | - Windows 243 | meta: 244 | genres: 245 | - FPS 246 | themes: 247 | - Sci-Fi 248 | 249 | - name: Urban Assault 250 | external: 251 | wikipedia: Urban Assault 252 | meta: 253 | genres: 254 | - FPS 255 | 256 | - name: Urban Runner 257 | external: 258 | website: https://www.mobygames.com/game/3809 259 | wikipedia: Urban Runner 260 | meta: 261 | genres: 262 | - Adventure 263 | themes: 264 | - Crime 265 | platforms: 266 | - Windows 267 | 268 | - name: Utopia 269 | external: 270 | wikipedia: Utopia (video game) 271 | meta: 272 | genres: 273 | - Turn-Based Strategy 274 | -------------------------------------------------------------------------------- /originals/v.yaml: -------------------------------------------------------------------------------- 1 | - name: The Vampire Diaries 2 | external: 3 | website: https://www.mobygames.com/game/24234 4 | meta: 5 | genres: 6 | - Adventure 7 | themes: 8 | - Horror 9 | platforms: 10 | - Windows 11 | 12 | - name: Vangers 13 | external: 14 | wikipedia: Vangers 15 | platforms: 16 | - Linux 17 | - OSX 18 | - Windows 19 | meta: 20 | genres: 21 | - Racing 22 | - RPG 23 | subgenres: 24 | - Vehicular Combat 25 | themes: 26 | - Sci-Fi 27 | 28 | - name: Versailles 1685 29 | external: 30 | website: https://www.mobygames.com/game/6889 31 | wikipedia: Versailles 1685 32 | meta: 33 | genres: 34 | - Adventure 35 | - Educational 36 | themes: 37 | - Crime 38 | platforms: 39 | - DOS 40 | - Classic Mac OS 41 | - PlayStation 42 | - Windows 43 | 44 | - name: Vib-Ribbon 45 | external: 46 | wikipedia: Vib-Ribbon 47 | platforms: 48 | - PlayStation 49 | meta: 50 | genres: 51 | - Rhythm 52 | 53 | - name: Victoria II 54 | names: 55 | - Victoria 2 56 | external: 57 | website: 'https://www.paradoxinteractive.com/games/victoria-ii/about' 58 | wikipedia: Victoria II 59 | platforms: 60 | - OSX 61 | - Windows 62 | meta: 63 | genres: 64 | - Real-Time Tactics 65 | - Strategy 66 | themes: 67 | - Alternate Historical 68 | 69 | - name: Viper 70 | external: 71 | website: http://www.mobygames.com/game/amiga/viper__ 72 | meta: 73 | genres: 74 | - Arcade 75 | 76 | - name: Visual Pinball 77 | external: 78 | wikipedia: Visual Pinball 79 | meta: 80 | genres: 81 | - Arcade 82 | 83 | - name: Vlak 84 | external: 85 | website: http://www.mobygames.com/game/dos/vlak 86 | meta: 87 | genres: 88 | - Arcade 89 | 90 | - name: Voyeur 91 | external: 92 | website: https://www.mobygames.com/game/1661 93 | wikipedia: Voyeur (video game) 94 | meta: 95 | genres: 96 | - Adventure 97 | themes: 98 | - Adult 99 | - Crime 100 | platforms: 101 | - CD-i 102 | - Classic Mac OS 103 | - DOS 104 | - Windows 105 | 106 | - name: VVVVVV 107 | external: 108 | wikipedia: VVVVVV 109 | meta: 110 | genres: 111 | - Puzzle 112 | - Platform 113 | 114 | -------------------------------------------------------------------------------- /originals/w.yaml: -------------------------------------------------------------------------------- 1 | - name: War Thunder 2 | external: 3 | website: 'http://warthunder.com/' 4 | wikipedia: War Thunder 5 | platforms: 6 | - Linux 7 | - OSX 8 | - PlayStation 4 9 | - PlayStation 5 10 | - Windows 11 | - Xbox One 12 | - Xbox Series S/X 13 | meta: 14 | genres: 15 | - Action 16 | subgenres: 17 | - Flight Simulator 18 | - Vehicular Combat 19 | themes: 20 | - Modern Military 21 | - Vietnam 22 | - World War I 23 | - World War II 24 | 25 | - name: 'Warcraft 2000' 26 | names: 27 | - 'Warcraft 2000: Nuclear Epidemic' 28 | external: 29 | website: 'https://www.myabandonware.com/game/warcraft-2000-nuclear-epidemic-bip' 30 | platforms: 31 | - Windows 32 | meta: 33 | genres: 34 | - Real-Time Strategy 35 | themes: 36 | - Fantasy 37 | - Medieval 38 | - Sci-Fi 39 | 40 | - name: Warcraft II 41 | external: 42 | wikipedia: Warcraft II 43 | meta: 44 | genres: 45 | - Real-Time Strategy 46 | themes: 47 | - Fantasy 48 | - Medieval 49 | 50 | - name: Warcraft III 51 | external: 52 | wikipedia: Warcraft III 53 | meta: 54 | genres: 55 | - Real-Time Strategy 56 | themes: 57 | - Fantasy 58 | - Medieval 59 | 60 | - name: 'Warcraft: Orcs & Humans' 61 | external: 62 | wikipedia: 'Warcraft: Orcs & Humans' 63 | meta: 64 | genres: 65 | - Real-Time Strategy 66 | themes: 67 | - Fantasy 68 | - Medieval 69 | 70 | - name: 'Warhammer 40,000: Chaos Gate' 71 | external: 72 | wikipedia: 'Warhammer 40,000: Chaos Gate' 73 | meta: 74 | genres: 75 | - 'Turn-Based Tactics' 76 | themes: 77 | - Sci-Fi 78 | platforms: 79 | - Windows 80 | 81 | - name: Wario Land 3 82 | external: 83 | wikipedia: Wario Land 3 84 | meta: 85 | genres: 86 | - Platform 87 | 88 | - name: WarioWare 89 | external: 90 | wikipedia: Wario (series)#WarioWare series 91 | meta: 92 | genres: 93 | - Arcade 94 | - Compilation 95 | 96 | - name: Warlords II 97 | external: 98 | wikipedia: Warlords (game series)#Warlords II 99 | meta: 100 | genres: 101 | - Turn-Based Strategy 102 | 103 | - name: Warrior Kings 104 | external: 105 | wikipedia: Warrior Kings 106 | meta: 107 | genres: 108 | - Real-Time Strategy 109 | 110 | - name: Warsong 111 | external: 112 | wikipedia: Warsong 113 | meta: 114 | genres: 115 | - Turn-Based Strategy 116 | themes: 117 | - Fantasy 118 | 119 | - name: Warzone 2100 120 | external: 121 | wikipedia: Warzone 2100 122 | meta: 123 | genres: 124 | - Real-Time Strategy 125 | themes: 126 | - Sci-Fi 127 | 128 | - name: Waxworks 129 | external: 130 | website: https://www.mobygames.com/game/1269 131 | wikipedia: Waxworks (1992 video game) 132 | meta: 133 | genres: 134 | - Adventure 135 | - RPG 136 | themes: 137 | - Fantasy 138 | - Horror 139 | - Sci-Fi 140 | platforms: 141 | - Amiga 142 | - Classic Mac OS 143 | - DOS 144 | - Windows 145 | 146 | - name: Wetlands 147 | external: 148 | website: https://www.mobygames.com/game/862 149 | wikipedia: Wetlands (video game) 150 | meta: 151 | genres: 152 | - Action 153 | - Shooter 154 | themes: 155 | - Sci-Fi 156 | platforms: 157 | - DOS 158 | - OSX 159 | - Windows 160 | 161 | - name: Where in the World Is Carmen Sandiego? (1985) 162 | external: 163 | wikipedia: Where in the World Is Carmen Sandiego? (1985) 164 | meta: 165 | genres: 166 | - Puzzle 167 | 168 | - name: The White Chamber 169 | external: 170 | website: https://www.mobygames.com/game/17172 171 | wikipedia: The White Chamber 172 | meta: 173 | genres: 174 | - Adventure 175 | themes: 176 | - Anime 177 | - Sci-Fi 178 | - Horror 179 | platforms: 180 | - OSX 181 | - Windows 182 | 183 | - name: Willow 184 | external: 185 | wikipedia: Willow (arcade game) 186 | meta: 187 | genres: 188 | - Arcade 189 | 190 | - name: 'Wing Commander: Privateer' 191 | external: 192 | wikipedia: 'Wing Commander: Privateer' 193 | meta: 194 | genres: 195 | - Action 196 | - Adventure 197 | - Simulation 198 | themes: 199 | - Sci-Fi 200 | 201 | - name: Winnie the Pooh in the Hundred Acre Wood 202 | external: 203 | website: https://www.mobygames.com/game/7274 204 | wikipedia: Winnie the Pooh in the Hundred Acre Wood 205 | meta: 206 | genres: 207 | - Adventure 208 | platforms: 209 | - Amiga 210 | - Apple II 211 | - Atari 212 | - CoCo 213 | - Commodore 64 214 | - DOS 215 | 216 | - name: Wipeout 217 | external: 218 | wikipedia: Wipeout (video game) 219 | meta: 220 | genres: 221 | - Racing 222 | 223 | - name: Witchaven 224 | external: 225 | wikipedia: Witchaven 226 | platforms: 227 | - DOS 228 | meta: 229 | genres: 230 | - FPS 231 | - RPG 232 | themes: 233 | - Medieval 234 | 235 | - name: The Witcher 236 | external: 237 | wikipedia: The Witcher (video game) 238 | meta: 239 | genres: 240 | - RPG 241 | themes: 242 | - Fantasy 243 | 244 | - name: The Wizard and the Princess 245 | names: 246 | - 'Hi-Res Adventure #2' 247 | - Wizard and the Princess 248 | external: 249 | website: https://www.mobygames.com/game/1761 250 | wikipedia: Wizard and the Princess 251 | meta: 252 | genres: 253 | - Adventure 254 | subgenres: 255 | - Text Adventure 256 | themes: 257 | - Fantasy 258 | platforms: 259 | - Apple II 260 | - Atari 261 | - Commodore 64 262 | - FM Towns 263 | - PC-98 264 | 265 | - name: Wizard of Wor 266 | external: 267 | wikipedia: Wizard of Wor 268 | meta: 269 | genres: 270 | - Arcade 271 | 272 | - name: Wizardry 273 | external: 274 | wikipedia: Wizardry 275 | meta: 276 | genres: 277 | - RPG 278 | 279 | - name: Wolfenstein 3D 280 | external: 281 | wikipedia: Wolfenstein 3D 282 | meta: 283 | genres: 284 | - FPS 285 | 286 | - name: 'Wolfenstein: Enemy Territory' 287 | external: 288 | wikipedia: 'Wolfenstein: Enemy Territory' 289 | meta: 290 | genres: 291 | - FPS 292 | 293 | - name: Wonderland 294 | external: 295 | website: https://www.mobygames.com/game/97 296 | wikipedia: Wonderland (video game) 297 | meta: 298 | genres: 299 | - Adventure 300 | subgenres: 301 | - Text Adventure 302 | themes: 303 | - Fantasy 304 | platforms: 305 | - Acorn 32-bit 306 | - Amiga 307 | - Atari 308 | - DOS 309 | 310 | - name: World Builder 311 | external: 312 | wikipedia: World Builder 313 | platforms: 314 | - Classic Mac OS 315 | meta: 316 | subgenres: 317 | - Point and click 318 | 319 | - name: World of Goo 320 | external: 321 | wikipedia: World of Goo 322 | meta: 323 | genres: 324 | - Puzzle 325 | 326 | - name: World of Warcraft 327 | external: 328 | wikipedia: World of Warcraft 329 | meta: 330 | genres: 331 | - MMORPG 332 | subgenres: [] 333 | themes: 334 | - Fantasy 335 | 336 | - name: 'Worlds of Ultima: The Savage Empire' 337 | external: 338 | wikipedia: 'Worlds of Ultima: The Savage Empire' 339 | meta: 340 | genres: 341 | - RPG 342 | 343 | - name: Worms Series 344 | external: 345 | wikipedia: Worms (series) 346 | meta: 347 | genres: 348 | - Turn-Based Strategy 349 | 350 | - name: WWII GI 351 | external: 352 | wikipedia: WWII GI 353 | platforms: 354 | - DOS 355 | meta: 356 | genres: 357 | - FPS 358 | themes: 359 | - World War II 360 | -------------------------------------------------------------------------------- /originals/x.yaml: -------------------------------------------------------------------------------- 1 | - name: 'X-COM: Apocalypse' 2 | external: 3 | wikipedia: 'X-COM: Apocalypse' 4 | meta: 5 | genres: 6 | - Strategy 7 | - Turn-Based Tactics 8 | themes: 9 | - Horror 10 | - Sci-Fi 11 | 12 | - name: 'X-COM: Terror from the Deep' 13 | external: 14 | wikipedia: 'X-COM: Terror from the Deep' 15 | meta: 16 | genres: 17 | - Strategy 18 | - Turn-Based Tactics 19 | themes: 20 | - Horror 21 | - Sci-Fi 22 | 23 | - name: 'X-COM: UFO Defense' 24 | names: 25 | - 'UFO: Enemy Unknown' 26 | external: 27 | wikipedia: 'X-COM: UFO Defense' 28 | meta: 29 | genres: 30 | - Strategy 31 | - Turn-Based Tactics 32 | themes: 33 | - Horror 34 | - Sci-Fi 35 | 36 | - name: X-It 37 | external: 38 | website: http://www.mobygames.com/game/x-it 39 | meta: 40 | genres: 41 | - Puzzle 42 | 43 | - name: Xargon 44 | names: 45 | - 'Xargon: The Mystery of the Blue Builders' 46 | external: 47 | wikipedia: Xargon 48 | platforms: 49 | - DOS 50 | meta: 51 | genres: 52 | - Platform 53 | themes: 54 | - Fantasy 55 | 56 | - name: Xenon 2 Megablast 57 | names: ['Xenon 2000: Project PCF'] 58 | external: 59 | wikipedia: Xenon 2 Megablast 60 | meta: 61 | genres: 62 | - Shmup 63 | 64 | - name: XOR 65 | external: 66 | wikipedia: XOR (video game) 67 | meta: 68 | genres: 69 | - Puzzle 70 | 71 | - name: XPilot 72 | external: 73 | wikipedia: XPilot 74 | meta: 75 | genres: 76 | - Arcade 77 | 78 | - name: XQuest 79 | external: 80 | website: http://www.swallowtail.org/xquest/ 81 | meta: 82 | genres: 83 | - Arcade 84 | -------------------------------------------------------------------------------- /originals/y.yaml: -------------------------------------------------------------------------------- 1 | - name: Yandere Simulator 2 | external: 3 | website: 'https://yanderesimulator.com/' 4 | wikipedia: Yandere Simulator 5 | platforms: 6 | - Windows 7 | meta: 8 | genres: 9 | - Action 10 | themes: 11 | - Anime 12 | 13 | - name: Yu-Gi-Oh! 14 | external: 15 | wikipedia: Yu-Gi-Oh! Trading Card Game 16 | meta: 17 | genres: 18 | - Card Game 19 | -------------------------------------------------------------------------------- /originals/z.yaml: -------------------------------------------------------------------------------- 1 | - name: Z 2 | external: 3 | wikipedia: Z (video game) 4 | meta: 5 | genres: 6 | - Real-Time Strategy 7 | themes: 8 | - Sci-Fi 9 | 10 | - name: Zak McKracken and the Alien Mindbenders 11 | external: 12 | website: https://www.mobygames.com/game/305 13 | wikipedia: Zak McKracken and the Alien Mindbenders 14 | meta: 15 | genres: 16 | - Adventure 17 | subgenres: 18 | - Point and click 19 | themes: 20 | - Comedy 21 | - Sci-Fi 22 | platforms: 23 | - Amiga 24 | - Atari 25 | - Commodore 64 26 | - DOS 27 | - FM Towns 28 | - Linux 29 | - OSX 30 | - Windows 31 | 32 | - name: Zarch 33 | external: 34 | wikipedia: Zarch 35 | meta: 36 | genres: 37 | - Action 38 | - TPS 39 | names: 40 | - Virus 41 | 42 | - name: Zombie Apocalypse 43 | external: 44 | website: http://www.mobygames.com/game/zombie-apocalypse 45 | meta: 46 | genres: 47 | - Shmup 48 | 49 | - name: Zoop 50 | external: 51 | wikipedia: Zoop 52 | meta: 53 | genres: 54 | - Puzzle 55 | 56 | - name: Zork 57 | external: 58 | wikipedia: Zork 59 | meta: 60 | genres: 61 | - Adventure 62 | 63 | - name: 'Zork: Grand Inquisitor' 64 | external: 65 | website: https://www.mobygames.com/game/1951 66 | wikipedia: 'Zork: Grand Inquisitor' 67 | meta: 68 | genres: 69 | - Adventure 70 | themes: 71 | - Fantasy 72 | platforms: 73 | - Windows 74 | - Classic Mac OS 75 | 76 | - name: Zork Nemesis 77 | names: 78 | - 'Zork Nemesis: The Forbidden Lands' 79 | external: 80 | website: https://www.mobygames.com/game/560 81 | wikipedia: Zork Nemesis 82 | meta: 83 | genres: 84 | - Adventure 85 | themes: 86 | - Fantasy 87 | platforms: 88 | - Classic Mac OS 89 | - DOS 90 | - Windows 91 | 92 | - name: Zuma 93 | external: 94 | wikipedia: Zuma (video game) 95 | meta: 96 | genres: 97 | - Puzzle 98 | 99 | - name: ZZT 100 | external: 101 | wikipedia: ZZT 102 | platforms: 103 | - DOS 104 | meta: 105 | genres: 106 | - Action 107 | - Adventure 108 | - Puzzle 109 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "osgameclones" 3 | version = "1.0.0" 4 | description = "Open Source Game Clones" 5 | authors = [ 6 | {name="Alexander Solovyov", email="alexander@solovyov.net"} 7 | ] 8 | license = "MIT" 9 | requires-python = ">=3.12,<4.0" 10 | dependencies = [ 11 | "natsort", 12 | "pykwalify", 13 | "pykwalify-webform", 14 | "Unidecode", 15 | "htmlmin", 16 | "python-slugify", 17 | ] 18 | 19 | [tool.poetry.group.dev.dependencies] 20 | beautifulsoup4 = "^4.12.2" 21 | httpx = "^0.27.0" 22 | mistletoe = "^1.4.0" 23 | pandas = "^2.2.2" 24 | feedparser = "^6.0.11" 25 | tenacity = "^8.2.2" 26 | yamllint = "^1.27.1" 27 | pygithub = "^2.6.1" 28 | thefuzz = "^0.22.1" 29 | 30 | [build-system] 31 | requires = ["poetry-core>=1.0.0"] 32 | build-backend = "poetry.core.masonry.api" 33 | -------------------------------------------------------------------------------- /render.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import html 4 | import json 5 | import os, os.path as op 6 | import shutil 7 | import functools 8 | import argparse 9 | import logging 10 | from pathlib import Path 11 | 12 | import markupsafe 13 | import unidecode 14 | 15 | import jinja2 16 | from pykwalify_webform.renderer import Renderer 17 | from slugify import slugify 18 | from yaml import safe_load 19 | 20 | import _ext 21 | 22 | HERE = Path(__file__).parent 23 | 24 | 25 | logging.basicConfig(level=logging.INFO) 26 | log = logging.getLogger() 27 | 28 | 29 | DIR = op.dirname(__file__) 30 | 31 | 32 | class Site: 33 | pass 34 | 35 | 36 | @functools.lru_cache(10) 37 | def env(): 38 | return jinja2.Environment(loader=jinja2.FileSystemLoader(DIR)) 39 | 40 | 41 | @functools.lru_cache(10) 42 | def ctx(): 43 | site = Site() 44 | _ext.parse_data(site) 45 | return site 46 | 47 | 48 | def render_to(src, dst, **ctx): 49 | t = env().get_template(src) 50 | 51 | log.info(f'Rendering {src} -> {dst}') 52 | res = t.render(**ctx) 53 | 54 | os.makedirs(op.dirname(dst), exist_ok=True) 55 | with open(dst, 'w', encoding='utf-8') as f: 56 | f.write(res) 57 | 58 | 59 | def copy_to(src, dst): 60 | log.info(f'Copying {src} -> {dst}') 61 | shutil.copytree(src, dst) 62 | 63 | 64 | def render_all(target): 65 | if op.exists(target): 66 | shutil.rmtree(target) 67 | 68 | copy_to('static', target + '/static') 69 | 70 | site = ctx() 71 | render_to('index.html', f'{target}/index.html', site=site) 72 | updated = max(game['updated'] for names, meta, game in site.new_games.values()) 73 | render_to('feed.xml', f'{target}/feed.xml', site=site, updated=updated) 74 | for game in site.games: 75 | render_to( 76 | 'game.html', 77 | f'{target}/{game.slug}/index.html', 78 | site=site, 79 | game=game, 80 | title=f"{game.names[0]} clones - OSGC", 81 | description=f"List of open source clones and remakes for {game.names[0]}" 82 | ) 83 | render_data(f"{target}/{game.slug}/data.json", game.item) 84 | # Render data for edit game/clone forms 85 | clones = {clone["name"]: clone for game in site.games for clone in game.clones} 86 | for name, clone in clones.items(): 87 | render_data(f"{target}/_clones/{slugify(name)}.json", clone) 88 | 89 | 90 | def normalize(text): 91 | if not text: 92 | return '' 93 | return html.escape(unidecode.unidecode(text.lower())) 94 | 95 | 96 | def render_game_form(schema: str, out_path: str, form_name: str, value=None): 97 | log.info(f"Rendering game form {schema=} -> {out_path}") 98 | with open(schema) as f: 99 | schemata = safe_load(f) 100 | renderer = Renderer(schemata, HERE / "templates/forms") 101 | os.makedirs(os.path.dirname(out_path), exist_ok=True) 102 | with open(out_path, "w") as f: 103 | f.write(renderer.render("", name=form_name, value=value, static_url="/_add_form")) 104 | 105 | 106 | def render_data(out_path: str, value): 107 | Path(out_path).parent.mkdir(parents=True, exist_ok=True) 108 | with open(out_path, "w") as f: 109 | json.dump(value, f, indent=2, default=str) 110 | 111 | 112 | def main(): 113 | parser = argparse.ArgumentParser(description='Render OSGC') 114 | parser.add_argument('-d', '--dest', default='_build') 115 | args = parser.parse_args() 116 | 117 | env().filters['normalize'] = normalize 118 | env().filters['slugify'] = slugify 119 | env().filters['e'] = markupsafe.escape 120 | render_all(args.dest) 121 | 122 | # Render add game forms 123 | render_game_form("schema/games.yaml", f"{args.dest}/add_game.html", "Add Game") 124 | render_game_form("schema/originals.yaml", f"{args.dest}/add_original.html", "Add Original") 125 | 126 | # Copy static files 127 | shutil.copytree(str(HERE / "templates/forms/static"), f"{args.dest}/_add_form") 128 | 129 | 130 | if __name__ == '__main__': 131 | main() 132 | -------------------------------------------------------------------------------- /schema/games.yaml: -------------------------------------------------------------------------------- 1 | type: seq 2 | sequence: 3 | - include: game 4 | 5 | schema;game: 6 | type: map 7 | mapping: 8 | name: 9 | required: True 10 | type: str 11 | desc: Name of the clone 12 | originals: 13 | required: True 14 | type: seq 15 | sequence: 16 | - type: str 17 | unique: True 18 | desc: Name(s) of games this clones 19 | type: 20 | required: True 21 | type: str 22 | enum: ['remake', 'clone', 'official', 'similar', 'tool'] 23 | repo: 24 | required: False # Work towards making it True 25 | type: str 26 | desc: URL where the source code can be found; e.g. a GitHub project page 27 | url: 28 | type: str 29 | desc: URL of the game's main page (if any; should be different from repo) 30 | feed: 31 | type: str 32 | desc: URL of RSS/Atom feed for the game's news, or releases 33 | development: 34 | type: str 35 | enum: ['complete', 'very active', 'active', 'sporadic', 'halted'] 36 | desc: | 37 | Complete: development stopped but game is complete
38 | Very active: many commits within the past week
39 | Active: commits within the past month
40 | Sporadic: commits within the past year
41 | Halted: no commits within the past year 42 | status: 43 | required: True 44 | type: str 45 | enum: ['playable', 'semi-playable', 'unplayable', 'N/A'] 46 | desc: | 47 | Playable: all major features working, full game can be completed
48 | Semi-playable: game runs and some parts of the game playable
49 | Unplayable: game cannot be played, e.g. can only load assets
50 | N/A: does not apply, i.e. for tools 51 | multiplayer: 52 | type: seq 53 | sequence: 54 | - type: str 55 | enum: ['Competitive', 'Local', 'Online', 'LAN', 'Split-screen', 'Co-op', 'Hotseat', 'Matchmaking'] 56 | unique: True 57 | content: 58 | type: str 59 | enum: ['commercial', 'free', 'open', 'swappable'] 60 | desc: | 61 | Commercial: requires data from original game, which is not free
62 | Free: game data is free or can be obtained for free
63 | Open: game data has an open source license
64 | Swappable: game data is commercial but can be swapped with open source replacements 65 | langs: 66 | type: seq 67 | desc: Main programming language(s) used for the game, e.g. C++ 68 | sequence: 69 | - type: str 70 | unique: True 71 | frameworks: 72 | type: seq 73 | desc: Framework(s) or engine(s) used for the game, e.g. SDL2 74 | sequence: 75 | - type: str 76 | unique: True 77 | licenses: 78 | required: True 79 | type: seq 80 | sequence: 81 | - include: licenses 82 | unique: True 83 | info: 84 | type: str 85 | desc: Any notable information about the game 86 | added: 87 | type: date 88 | format: "%Y-%m-%d" 89 | desc: Date when this game was first added to OSGC 90 | updated: 91 | required: True 92 | type: date 93 | format: "%Y-%m-%d" 94 | desc: Date when this game entry was last updated in OSGC (use today's date) 95 | images: 96 | type: seq 97 | sequence: 98 | - type: str 99 | pattern: https:\/\/.+ 100 | unique: True 101 | desc: URLs of screenshots for the game (HTTPS only) 102 | video: 103 | type: map 104 | mapping: 105 | youtube: 106 | type: str 107 | range: 108 | min: 11 109 | max: 11 110 | desc: 11-char video ID e.g. for https://www.youtube.com/watch?v=DowgWKtGAD8, use "DowgWKtGAD8" 111 | vimeo: 112 | type: int 113 | desc: Numeric video ID e.g. for https://vimeo.com/10245458, use "10245458" 114 | moddb: 115 | type: int 116 | desc: Numeric video ID; copy the embed code, look for e.g. https://www.moddb.com/media/iframe/535281, use "535281" 117 | indiedb: 118 | type: int 119 | desc: Numeric video ID; copy the embed code, look for e.g. https://www.indiedb.com/media/iframe/535281, use "535281" 120 | 121 | 122 | # Based on SPDX license codes 123 | # https://spdx.org/licenses/ 124 | schema;licenses: 125 | type: str 126 | enum: [ 127 | 'Custom', # Catch-all for custom licenses 128 | 'Multiple', # Catch-all for multiple licenses 129 | 'PD', # Public Domain 130 | 'As-is', # Catch-all for as-is, as-available licenses 131 | 'AFL3', # Academic Free License 132 | 'AGPL3', 133 | 'Apache', 134 | 'Artistic', 135 | 'BSD', 136 | 'BSD2', 137 | 'BSD4', 138 | 'BSL', 139 | 'bzip2', 140 | 'CC0', 141 | 'CC-BY', 142 | 'CC-BY-NC', 143 | 'CC-BY-NC-ND', 144 | 'CC-BY-NC-SA', 145 | 'CC-BY-SA', 146 | 'GPL1', 147 | 'GPL2', 148 | 'GPL3', 149 | 'IJG', # Independent JPEG Group License 150 | 'ISC', 151 | 'JRL', # Java Research License 152 | 'LGPL2', 153 | 'LGPL3', 154 | 'Libpng', 155 | 'MAME', # MAME or MAME-like License 156 | 'MIT', 157 | 'MPL', # Mozilla Public License 158 | 'MS-PL', # Microsoft Public License 159 | 'NGPL', # Nethack General Public License, 160 | 'OFL', # SIL Open Font License 161 | 'Unlicense', 162 | 'WTFPL', # Do What The F*ck You Want To Public License 163 | 'Zlib', 164 | ] 165 | -------------------------------------------------------------------------------- /schema/originals.yaml: -------------------------------------------------------------------------------- 1 | type: seq 2 | sequence: 3 | - type: map 4 | mapping: 5 | name: 6 | required: True 7 | type: str 8 | names: 9 | type: seq 10 | sequence: 11 | - type: str 12 | desc: Alternate names for this game 13 | external: 14 | required: True 15 | type: map 16 | mapping: 17 | website: 18 | type: str 19 | desc: URL of official website 20 | wikipedia: 21 | type: str 22 | desc: Title of Wikipedia article 23 | platforms: 24 | type: seq 25 | sequence: 26 | - include: platforms 27 | unique: True 28 | meta: 29 | include: meta 30 | 31 | schema;meta: 32 | type: map 33 | mapping: 34 | genres: 35 | type: seq 36 | sequence: 37 | - include: genres 38 | unique: True 39 | subgenres: 40 | type: seq 41 | sequence: 42 | - include: subgenres 43 | unique: True 44 | themes: 45 | type: seq 46 | sequence: 47 | - include: themes 48 | unique: True 49 | 50 | 51 | schema;platforms: 52 | type: str 53 | enum: [ 54 | '3DO', 55 | '3DS', 56 | 'Acorn 32-bit', 57 | 'Amiga', 58 | 'Amstrad CPC', 59 | 'Android', 60 | 'Apple II', 61 | 'Apple TV', 62 | 'Arcade', 63 | 'Atari', 64 | 'BeOS', 65 | 'CD-i', 66 | 'Classic Mac OS', 67 | 'CoCo', 68 | 'Commodore 64', 69 | 'DOS', 70 | 'Dreamcast', 71 | 'DS', 72 | 'FM Towns', 73 | 'Game Boy', 74 | 'GameCube', 75 | 'GBA', 76 | 'Genesis', 77 | 'iOS', 78 | 'Linux', 79 | 'Lynx', 80 | 'Master System', 81 | 'Mobile', 82 | 'MSX', 83 | 'NES', 84 | 'N64', 85 | 'Nintendo Switch', 86 | 'OS/2', 87 | 'OSX', 88 | 'PC Booter', 89 | 'PC-98', 90 | 'Pippin', 91 | 'PlayStation', 92 | 'PlayStation 2', 93 | 'PlayStation 3', 94 | 'PlayStation 4', 95 | 'PlayStation 5', 96 | 'PlayStation Vita', 97 | 'PSP', 98 | 'Saturn', 99 | 'Sega CD', 100 | 'SNES', 101 | 'TurboGrafx-16', 102 | 'Web', 103 | 'Wii', 104 | 'Windows', 105 | 'Xbox', 106 | 'Xbox 360', 107 | 'Xbox One', 108 | 'Xbox Series S/X', 109 | 'ZX Spectrum', 110 | ] 111 | 112 | # -- ADD NEW GENRES TO 'SUBGENRE' SCHEMA -- 113 | # Based on Giant Bomb genres / Wikipedia 114 | # http://www.giantbomb.com/games/ 115 | # https://en.wikipedia.org/wiki/Template:Video_game_genre 116 | schema;genres: 117 | type: str 118 | enum: [ 119 | 'Action', 120 | 'Adventure', 121 | 'Arcade', 122 | 'Card Game', 123 | 'Compilation', 124 | 'Educational', 125 | 'Fighting', 126 | 'Flight', 127 | 'FPS', 128 | 'MMORPG', 129 | 'MOBA', 130 | 'Party', 131 | 'Platform', 132 | 'Puzzle', 133 | 'Racing', 134 | 'RPG', 135 | 'Real-Time Strategy', 136 | 'Real-Time Tactics', 137 | 'Sports', 138 | 'Turn-Based Strategy', 139 | 'Turn-Based Tactics', 140 | 'TPS', 141 | 'Rhythm', 142 | 'Roguelike', 143 | 'Shooter', 144 | 'Shmup', 145 | 'Simulation', 146 | 'Strategy', 147 | ] 148 | 149 | schema;subgenres: 150 | type: str 151 | enum: [ 152 | '4X', 153 | 'Action RPG', 154 | 'Artillery', 155 | 'Baseball', 156 | 'Basketball', 157 | 'Billiards', 158 | 'Board Game', 159 | 'Bowling', 160 | 'Boxing', 161 | 'Bullet Hell', 162 | 'City Building', 163 | 'Cricket', 164 | 'Dual-Joystick Shooter', 165 | 'Fishing', 166 | 'Fitness', 167 | 'Flight Simulator', 168 | 'Football', 169 | 'Gambling', 170 | 'Golf', 171 | 'Handball', 172 | 'Hockey', 173 | 'Life', 174 | 'Light-Gun Shooter', 175 | 'MOBA', 176 | 'Pinball', 177 | 'Point and click', 178 | 'Run and gun', 179 | 'Sandbox', 180 | 'Skateboarding', 181 | 'Skiing', 182 | 'Snowboarding', 183 | 'Soccer', 184 | 'Space Flight', 185 | 'Surfing', 186 | 'Submarine Simulator', 187 | 'Survival', 188 | 'Tennis', 189 | 'Text Adventure', 190 | 'Tower Defense', 191 | 'Track & Field', 192 | 'Train Simulator', 193 | 'Vehicular Combat', 194 | 'Visual Novel', 195 | 'Volleyball', 196 | 'Wrestling', 197 | ] 198 | 199 | # Based on Giant Bomb themes 200 | # http://www.giantbomb.com/games/ 201 | schema;themes: 202 | type: str 203 | enum: [ 204 | 'Abstract', 205 | 'Adult', 206 | 'Alternate Historical', 207 | 'Anime', 208 | 'Aquatic', 209 | 'Civil War', 210 | 'Comedy', 211 | 'Comic Book', 212 | 'Crime', 213 | 'Cyberpunk', 214 | 'Dating', 215 | 'Egyptian', 216 | 'Espionage', 217 | 'Fantasy', 218 | 'Game Show', 219 | 'Horror', 220 | 'Management', 221 | 'Martial Arts', 222 | 'Mayan', 223 | 'Medieval', 224 | 'Meditative', 225 | 'Modern Military', 226 | 'Motorsports', 227 | 'Post-Apocalyptic', 228 | 'Prehistoric', 229 | 'Sci-Fi', 230 | 'Steampunk', 231 | 'Superhero', 232 | 'Vietnam', 233 | 'Western', 234 | 'World War I', 235 | 'World War II', 236 | ] 237 | -------------------------------------------------------------------------------- /scripts/awesome_game_remakes.py: -------------------------------------------------------------------------------- 1 | """ 2 | Scrape Awesome Game Remakes and find games OSGC doesn't have 3 | 4 | To run, install from pip: 5 | - aiohttp 6 | - markdown 7 | - lxml 8 | """ 9 | import aiohttp 10 | import asyncio 11 | import markdown 12 | import re 13 | 14 | from lxml import etree 15 | 16 | from scripts.utils import games 17 | 18 | URL = "https://raw.githubusercontent.com/radek-sprta/awesome-game-remakes/master/README.md" 19 | BLACKLIST_PATTERNS = [ 20 | re.compile(pat) for pat in [ 21 | "https://awesome.re", 22 | "^#.+", 23 | ] 24 | ] 25 | 26 | async def main(): 27 | # Find links from AGR 28 | async with aiohttp.ClientSession() as session: 29 | async with session.get(URL) as resp: 30 | content = await resp.text() 31 | md = markdown.markdown(content) 32 | doc = etree.fromstring(f"
{md}
") 33 | urls = set() 34 | for link in doc.xpath("//a"): 35 | url = link.attrib["href"] 36 | for pat in BLACKLIST_PATTERNS: 37 | if pat.match(url): 38 | break 39 | else: 40 | urls.add(url) 41 | # Find URLs and repos from OSGC 42 | osgc_urls = set() 43 | for game in games(): 44 | if repo := game.get("repo", ""): 45 | osgc_urls.add(repo) 46 | if url := game.get("repo", ""): 47 | osgc_urls.add(url) 48 | # Print URLS that OSGC doesn't have 49 | for url in urls - osgc_urls: 50 | print(url) 51 | 52 | if __name__ == "__main__": 53 | asyncio.run(main()) 54 | -------------------------------------------------------------------------------- /scripts/check_links.py: -------------------------------------------------------------------------------- 1 | """ 2 | Check game URLs and repos for broken links 3 | """ 4 | import asyncio 5 | import httpx 6 | 7 | from scripts.utils import games 8 | 9 | 10 | async def check_link(q): 11 | while True: 12 | game, url = await q.get() 13 | resp = httpx.get(url) 14 | if not resp.is_success: 15 | print(f"{url} returned {resp.status_code} ({game['name']})") 16 | q.task_done() 17 | 18 | 19 | async def main(): 20 | q = asyncio.Queue() 21 | # start workers 22 | worker_tasks = [] 23 | for i in range(10): 24 | task = asyncio.create_task(check_link(q)) 25 | worker_tasks.append(task) 26 | # add urls to queue 27 | for game in games(): 28 | print(f"Checking {game['name']}...") 29 | if "repo" in game: 30 | await q.put((game, game["repo"])) 31 | if "url" in game: 32 | await q.put((game, game["url"])) 33 | for img in game.get("images", []): 34 | await q.put((game, img)) 35 | # TODO: check videos 36 | # wait for tasks to complete 37 | print("Waiting for workers...") 38 | await q.join() 39 | # stop workers 40 | for task in worker_tasks: 41 | task.cancel() 42 | await asyncio.gather(*worker_tasks, return_exceptions=True) 43 | 44 | 45 | if __name__ == "__main__": 46 | asyncio.run(main()) 47 | -------------------------------------------------------------------------------- /scripts/hacktoberfest.py: -------------------------------------------------------------------------------- 1 | """ 2 | This script finds repos participating in hacktoberfest: 3 | - Hosted on GitHub or gitlab 4 | - Includes the "hacktoberfest" topic 5 | 6 | To run, install from pip: 7 | - pygithub 8 | - python-gitlab 9 | 10 | Add environment variables: 11 | - GH_TOKEN (see https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token) 12 | - with public_repo permission 13 | - GL_TOKEN (see https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token) 14 | - with read_api scope 15 | """ 16 | import os 17 | import re 18 | 19 | from github import Github, GithubException 20 | from gitlab import Gitlab, GitlabHttpError, GitlabGetError 21 | 22 | from scripts.utils import games 23 | 24 | GH_REGEX = re.compile(r"https://github.com/([^/]+)/([^/]+)") 25 | GL_REGEX = re.compile(r"https://gitlab.com/([^/]+/[^/]+)") 26 | 27 | 28 | def main(): 29 | gh = Github(os.environ["GH_TOKEN"]) 30 | gl = Gitlab("https://gitlab.com", private_token=os.environ["GL_TOKEN"]) 31 | hacktober_games = {} 32 | for game in games(): 33 | repo_url = game.get("repo", "") 34 | if not repo_url: 35 | continue 36 | match = re.match(GH_REGEX, repo_url) 37 | if match: 38 | owner, repo = match.groups() 39 | try: 40 | gh_repo = gh.get_repo(f"{owner}/{repo}") 41 | except GithubException as e: 42 | print(f"Error getting GitHub repo info for {owner}/{repo}: {e}") 43 | continue 44 | topics = gh_repo.get_topics() 45 | if "hacktoberfest" in topics: 46 | game["platform"] = "github" 47 | game["stars"] = gh_repo.stargazers_count 48 | hacktober_games[game["name"]] = game 49 | else: 50 | match = re.match(GL_REGEX, repo_url) 51 | if match: 52 | project_namespace = match.groups()[0] 53 | try: 54 | project = gl.projects.get(project_namespace) 55 | except (GitlabHttpError, GitlabGetError) as e: 56 | print(f"Error getting Gitlab repo info for {project_namespace}: {e}") 57 | continue 58 | if "hacktoberfest" in project.topics: 59 | game["platform"] = "gitlab" 60 | game["stars"] = project.star_count 61 | hacktober_games[game["name"]] = game 62 | for name, game in hacktober_games.items(): 63 | stars_badge = f"![stars](https://img.shields.io/badge/{game['platform']}%20stars-{game['stars']}-blue)" 64 | langs = ", ".join(f"`{lang}`" for lang in game.get('langs', [])) 65 | frameworks = ", ".join(f"`{fw}`" for fw in game.get('frameworks', [])) 66 | print(f"- [**{name}** {stars_badge}]({game['repo']}): ({game.get('development', '')} {game.get('status', '')} {langs} {frameworks})") 67 | 68 | 69 | if __name__ == "__main__": 70 | main() 71 | -------------------------------------------------------------------------------- /scripts/scrape_good_scummvm_games.py: -------------------------------------------------------------------------------- 1 | """ 2 | Scrape ScummVM supported games at good or excellent level, and create YAML clone templates 3 | 4 | Uses libraries: 5 | - beautifulsoup4 6 | - httpx 7 | - tenacity 8 | """ 9 | import re 10 | from pathlib import Path 11 | from typing import Container, Optional 12 | 13 | import httpx 14 | import yaml 15 | from bs4 import BeautifulSoup 16 | from tenacity import stop_after_attempt, retry, wait_exponential 17 | from utils import originals 18 | 19 | SCUMMVM_LIST = "https://www.scummvm.org/compatibility/" 20 | SCUMMVM_BASE_URL = "https://www.scummvm.org" 21 | SUPPORT_LEVELS = {"Good", "Excellent"} 22 | PLATFORM_ALIASES = { 23 | "Apple IIgs": "Apple II", 24 | "Atari ST": "Atari", 25 | "Macintosh": "Classic Mac OS", 26 | "Sega CD": "Genesis", 27 | "Steam": "Windows", 28 | "Tandy Color Computer 3": "CoCo", 29 | } 30 | # These games are not games or compilations/demos that shouldn't have their own game entries 31 | BLACKLIST = { 32 | "Inside the Chest", 33 | "King's Questions", 34 | "Passport to Adventure (Indiana Jones and the Last Crusade, The Secret of Monkey Island, Loom)", 35 | "Mission Supernova 1", 36 | "Mission Supernova 2" 37 | } 38 | 39 | 40 | def main(): 41 | # Get list of OSGC originals 42 | osgc_originals = set() 43 | for original in originals(): 44 | osgc_originals.add(original["name"]) 45 | for name in original.get("names", []): 46 | osgc_originals.add(name) 47 | 48 | # Get platforms 49 | platforms = yaml.safe_load(open(Path("schema") / "originals.yaml", encoding="utf-8"))["schema;platforms"]["enum"] 50 | 51 | # Get list of games 52 | resp = httpx.get(SCUMMVM_LIST) 53 | content = resp.text 54 | soup = BeautifulSoup(content, "html.parser") 55 | game_links = {} 56 | for td_name, td_support_level in zip(soup.find_all("td", class_="gameFullName"), soup.find_all("td", class_="gameSupportLevel")): 57 | # Filter out those that aren't good enough 58 | if td_support_level.text not in SUPPORT_LEVELS: 59 | continue 60 | name = td_name.text.strip() 61 | # Filter out engines 62 | if name.endswith(" games"): 63 | continue 64 | # Filter out blacklist 65 | if name in BLACKLIST: 66 | continue 67 | # Use name in parens if present 68 | if match := re.match(r".+ \((.+)\)", name): 69 | name = match.group(1) 70 | game_links[name] = SCUMMVM_BASE_URL + td_name.a.attrs["href"] 71 | 72 | # Generate originals list 73 | origs = list(game_links) 74 | 75 | # Filter out those we already have (match case-insensitive) 76 | def game_is_in_original(game: str) -> bool: 77 | if game in osgc_originals: 78 | return True 79 | # Try case-insensitive 80 | if game.lower() in {o.lower() for o in osgc_originals}: 81 | return True 82 | # Try using the name before or after the colon 83 | if (match := re.match(r"(.+):(.+)", game)) and (match.group(1).strip() in osgc_originals or match.group(2).strip() in osgc_originals): 84 | return True 85 | # Try matching without certain punctuation 86 | if game.replace("!", "") in {o.replace("!", "") for o in osgc_originals}: 87 | return True 88 | return False 89 | missing_originals = {original for original in origs if not game_is_in_original(original)} 90 | print("ScummVM originals:") 91 | for original in sorted(missing_originals): 92 | print(f"- {original}") 93 | 94 | for original in missing_originals: 95 | if game_info := scrape_game_info(game_links[original], platforms): 96 | print(yaml.dump(game_info)) 97 | 98 | 99 | @retry(stop=stop_after_attempt(10), wait=wait_exponential(multiplier=1, min=2, max=10)) 100 | def scrape_game_info(link: str, platforms: Container[str]) -> Optional[dict]: 101 | # Go to game subpage 102 | resp = httpx.get(link) 103 | content = resp.text 104 | soup = BeautifulSoup(content, "html.parser") 105 | 106 | # Don't add games that aren't clones 107 | if soup.find("a", string="ScummVM Freeware Games"): 108 | return None 109 | 110 | # Generate game entry, with name 111 | game = { 112 | "name": soup.find("td", class_="gameFullName").text, 113 | "external": {}, 114 | "platforms": [], 115 | "meta": { 116 | "genres": [], 117 | "themes": [], 118 | } 119 | } 120 | # Add Supported Platforms 121 | supported_platforms_title = soup.find("h3", string="Supported Platforms") 122 | if supported_platforms_lis := supported_platforms_title.find_next_sibling("ul"): 123 | for li in supported_platforms_lis.find_all("li"): 124 | platform = li.text.strip() 125 | platform = PLATFORM_ALIASES.get(platform, platform) 126 | if platform not in platforms: 127 | print(f"{platform=} unknown") 128 | elif platform not in game["platforms"]: 129 | game["platforms"].append(platform) 130 | 131 | # Find links 132 | if wikipedia_link := soup.find("a", string="Wikipedia"): 133 | game["external"]["wikipedia"] = wikipedia_name(wikipedia_link.attrs["href"]) 134 | if mobygames_link := soup.find("a", string="MobyGames"): 135 | game["external"]["website"] = mobygames_link.attrs["href"] 136 | if not wikipedia_link and not mobygames_link: 137 | # Use ScummVM wiki as fallback 138 | if scummvm_link := soup.find("a", string="ScummVM Wiki"): 139 | game["external"]["website"] = scummvm_link.attrs["href"] 140 | else: 141 | print(f"Cannot find link for {game['name']}") 142 | 143 | return game 144 | 145 | 146 | def wikipedia_name(link: str) -> str: 147 | """ 148 | >>> wikipedia_name("https://en.wikipedia.org/wiki/Operation_Stealth") 149 | 'Operation Stealth' 150 | """ 151 | return link.split("/")[-1].replace("_", " ") 152 | 153 | 154 | if __name__ == "__main__": 155 | main() 156 | -------------------------------------------------------------------------------- /scripts/scrape_osgl_inspirations.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | import httpx 4 | from mistletoe import Document 5 | from mistletoe.block_token import Heading, List 6 | from scripts.utils import games, originals 7 | 8 | INSPIRATION_PATTERN = re.compile(r"(.+) \[\d+\]") 9 | INSPIRED_PATTERN = re.compile(r"Inspired entries: (.+)") 10 | # OSGL name to OSGC alias 11 | ALIASES = { 12 | "Alone in the Dark series": "Alone in the Dark", 13 | "Anno (series)": "Anno series", 14 | "Anno 1404": "Anno series", 15 | "BioWare's Aurora engine": "Neverwinter Nights", 16 | "Blake Stone: Aliens of Gold": "Blake Stone: Planet Strike", 17 | "Blasteroids": "Asteroids", 18 | "Caesar 3": "Caesar III", 19 | "Civilization series": "Civilization", 20 | "Company of Heroes: Opposing Fronts": "Company of Heroes", 21 | "Company of Heroes: Tales of Valor": "Company of Heroes", 22 | "CrossFire 1981": "Crossfire", 23 | "CrossUO": "CrossUO: Ultima Online", 24 | "Final Fantasy series": "Final Fantasy", 25 | "Krush Kill 'n' Destroy": "Krush, Kill 'n' Destroy", 26 | "Marathon 2: Durandal": "Marathon 2", 27 | "Microprose Falcon 4.0 Combat Simulator": "Falcon", 28 | "Panzer General 2": "Panzer General", 29 | "Quake II": "Quake 2", 30 | "Quake III Arena": "Quake 3", 31 | "QUakeWorld": "Quake", 32 | "Runescape Classic": "RuneScape Classic", 33 | "S.T.A.L.K.E.R: Call of Pripyat": "S.T.A.L.K.E.R.: Call of Pripyat", 34 | "Settlers": "The Settlers", 35 | "Shobon Action": "Syobon Action", 36 | "Simon Says": "Simon", 37 | "Sonic the Hedgehog series": "Sonic the Hedgehog", 38 | "Super Methane Brothers for Wii and GameCube": "Super Methane Brothers (homebrew edition)", 39 | "Super Pang": "Pang", 40 | "The Incredible Machine series": "The Incredible Machine", 41 | "Ultima series": "Ultima", 42 | "Ultima Underworld 1": "Ultima Underworld", 43 | "Warcraft": "Warcraft: Orcs & Humans", 44 | "World of Might and Magic": "OpenEnroth", 45 | "Worms": "Worms Series", 46 | "X-COM: Enemy Unknown": "X-COM: UFO Defense", 47 | } 48 | # Games that aren't games, aren't interesting enough or weren't closed source 49 | BLACKLIST = { 50 | "Angband", 51 | "arithmetic", 52 | "Black Shades", 53 | "Blob Wars Attrition", 54 | "Blobby Volley", 55 | "Brogue", 56 | "Cards Against Humanity", 57 | "Catan", 58 | "Chromium B.S.U.", 59 | "CorsixTH", 60 | "Cube", 61 | "Cube 2: Sauerbraten", 62 | "CUBE engine", 63 | "Daimonin", 64 | "Dragon Wars", 65 | "DragonBall", 66 | "Dungeon Crawl Stone Soup", 67 | "Elite Command", 68 | "Emerald Mine", # clone of Boulder Dash 69 | "Eternal Lands", 70 | "Falcon's Eye", 71 | "Final Fantasy series", # not specific enough 72 | "Flixel", 73 | "FooBillard", 74 | "GalaxyMage", 75 | "Game of Life", # ambiguous, combines >1 game 76 | "GearHead", 77 | "GL-117", 78 | "Kobold's Quest", 79 | "Konquest", 80 | "LBreakout", 81 | "Linley's Dungeon Crawl", 82 | "Liquid War", 83 | "LÖVE", 84 | "Metroidvania", 85 | "Noiz2", 86 | "NScripter", 87 | "OGRE", 88 | "Open Dune", 89 | "RARS", 90 | "Red Eclipse", 91 | "Revenge Of The Cats: Ethernet", 92 | "sfxr", 93 | "Teeworlds", 94 | "The Clans", 95 | "The Mana World", 96 | "Tower defense", 97 | "Transball", 98 | "TuxMath", 99 | "Tux Racer", 100 | "Urho3D", 101 | "Vavoom", 102 | "Volleyball", 103 | "Webhangman", 104 | "XKobo", 105 | "XRay engine", 106 | "Xtank", 107 | } 108 | # Valid clones but we don't want to add it to OSGC unless we really have to 109 | BLACKLIST_CLONES = { 110 | "Colonization too", # halted long ago, status unknown 111 | "CommonDrops", # halted, unknown status 112 | "DOOM-iOS", # Superseded by DOOM-iOS2 113 | "Slot-Racers", # 404, inactive 114 | "Story of a Lost Sky", # halted, unclear how good/playable it is 115 | } 116 | 117 | 118 | def main(): 119 | resp = httpx.get("https://raw.githubusercontent.com/Trilarion/opensourcegames/master/inspirations.md") 120 | doc = Document(resp.text) 121 | # Only look at level 2 headings 122 | children = [child for child in doc.children if not isinstance(child, Heading) or child.level == 2] 123 | inspiration = None 124 | osgl_games = {} 125 | for child in children: 126 | if isinstance(child, Heading): 127 | inspiration = INSPIRATION_PATTERN.match(child.children[0].content).group(1) 128 | else: 129 | assert isinstance(child, List) 130 | for subchild in child.children: 131 | text = subchild.children[0].children[0].content 132 | if matches := INSPIRED_PATTERN.match(text): 133 | inspireds = matches.group(1).split(", ") 134 | osgl_games[inspiration] = inspireds 135 | # Find games and clones from OSGC 136 | osgc_originals = set() 137 | for original in originals(): 138 | osgc_originals.add(original["name"]) 139 | for name in original.get("names", []): 140 | osgc_originals.add(name) 141 | osgc_games = {game["name"] for game in games()} 142 | osgl_inspireds = { 143 | inspired 144 | for inspireds in osgl_games.values() 145 | for inspired in inspireds 146 | } 147 | for game in osgl_games: 148 | if game in BLACKLIST: 149 | continue 150 | # Exclude games that are open source clones to begin with 151 | if game in osgc_games and game not in osgc_originals: 152 | continue 153 | # Exclude transitive inspirations - we only want the originals 154 | if game in osgl_inspireds: 155 | continue 156 | alias = ALIASES.get(game) 157 | if game not in osgc_originals and (not alias or alias not in osgc_originals): 158 | print(f"Missing original: {game}") 159 | for inspired in osgl_inspireds: 160 | if inspired in BLACKLIST_CLONES: 161 | continue 162 | if inspired not in osgc_games: 163 | print(f"Missing clone: {inspired}") 164 | 165 | 166 | if __name__ == "__main__": 167 | main() 168 | -------------------------------------------------------------------------------- /scripts/top_frameworks.py: -------------------------------------------------------------------------------- 1 | from collections import Counter, defaultdict 2 | 3 | from scripts.utils import games 4 | 5 | import pandas as pd 6 | 7 | 8 | def main(): 9 | c = Counter() 10 | framework_langs = defaultdict(Counter) 11 | for game in games(): 12 | for framework in game.get("frameworks", []): 13 | c[framework] += 1 14 | for lang in game.get("langs", []): 15 | framework_langs[framework][lang] += 1 16 | most_common = c.most_common(10) 17 | rows = [] 18 | for framework, count in most_common: 19 | framework_lang_counts = framework_langs[framework].most_common(5) 20 | row = {"framework": framework, "total": count} 21 | for i, lang in enumerate(framework_lang_counts): 22 | row[f"lang{i+1}"] = lang 23 | rows.append(row) 24 | df = pd.DataFrame(rows) 25 | print(df) 26 | 27 | 28 | if __name__ == "__main__": 29 | main() 30 | -------------------------------------------------------------------------------- /scripts/update-development-status.py: -------------------------------------------------------------------------------- 1 | """ 2 | This script updates games development status 3 | 4 | To run, install from pip: 5 | - pygithub 6 | - python-gitlab 7 | 8 | Add environment variables: 9 | - GH_TOKEN 10 | - https://github.com/settings/tokens?type=beta 11 | - (see https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token) 12 | - GL_TOKEN 13 | - https://gitlab.com/-/user_settings/personal_access_tokens 14 | - (see https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token) 15 | - With read_api scope 16 | """ 17 | import os 18 | import re 19 | from typing import Optional 20 | 21 | import yaml 22 | 23 | import feedparser 24 | 25 | from pathlib import Path 26 | from datetime import datetime, timedelta 27 | from github import Github, GithubException 28 | from gitlab import Gitlab 29 | from time import mktime 30 | 31 | GL_HOST = 'https://gitlab.com' 32 | SF_HOST = 'https://sourceforge.net' 33 | 34 | GH_REGEX = re.compile(r'https://github.com/([^/]+)/([^/]+)') 35 | GL_REGEX = re.compile(GL_HOST + r'/([^/]+/[^/]+)') 36 | SF_REGEX = re.compile(SF_HOST + r"/projects/([^/]+)") 37 | 38 | GH_DT_FMT = "%a, %d %b %Y %H:%M:%S %Z" 39 | 40 | 41 | def main(): 42 | gh = Github(os.environ["GH_TOKEN"]) 43 | gl = Gitlab(GL_HOST, private_token=os.environ["GL_TOKEN"]) 44 | 45 | for filename in Path('games').iterdir(): 46 | if not filename.is_file() or filename.suffix != '.yaml': 47 | continue 48 | 49 | games = yaml.safe_load(open(filename, encoding='utf-8')) 50 | for game in games: 51 | if 'added' not in game: 52 | print(f"{game['name']} has no added field") 53 | continue 54 | 55 | repo_url = game.get('repo', '') 56 | 57 | if len(repo_url) == 0 or game.get('development', '') == 'complete': 58 | continue 59 | 60 | if (latest_commit_date := get_latest_commit_date(repo_url, gh, gl)) is None: 61 | continue 62 | 63 | diff = datetime.now() - latest_commit_date 64 | 65 | status_original = game.get("development", "unknown") 66 | if diff < timedelta(weeks=1): 67 | game['development'] = 'very active' 68 | elif diff < timedelta(weeks=4): 69 | game['development'] = 'active' 70 | elif diff < timedelta(days=365): 71 | game['development'] = 'sporadic' 72 | else: 73 | game['development'] = 'halted' 74 | if status_original != game["development"]: 75 | print(f"{game['name']} status should be {game['development']} ({status_original=})") 76 | 77 | # yaml.dump(games, open(filename, 'w', encoding='utf-8'), sort_keys=False) 78 | # print(filename, 'has been updated') 79 | 80 | 81 | def is_github_repo(repo): 82 | return repo.startswith('https://github.') 83 | 84 | 85 | def is_gitlab_repo(repo): 86 | return repo.startswith(GL_HOST) 87 | 88 | 89 | def is_sourceforge_repo(repo): 90 | return repo.startswith(SF_HOST) 91 | 92 | 93 | def get_latest_commit_date(repo_url, gh, gl): 94 | if is_github_repo(repo_url): 95 | return get_latest_commit_date_for_github(gh, repo_url) 96 | elif is_gitlab_repo(repo_url): 97 | return get_latest_commit_date_for_gitlab(gl, repo_url) 98 | elif is_sourceforge_repo(repo_url): 99 | return get_latest_commit_date_for_sourceforge(repo_url) 100 | 101 | print('The', repo_url, 'repository could not be updated') 102 | 103 | 104 | def get_latest_commit_date_for_github(gh, repo_url): 105 | match = re.match(GH_REGEX, repo_url) 106 | if not match: 107 | return 108 | 109 | owner, repo = match.groups() 110 | try: 111 | gh_repo = gh.get_repo(f"{owner}/{repo}") 112 | branches = list(gh_repo.get_branches()) 113 | commit_dates = {datetime.strptime(branch.commit.last_modified, GH_DT_FMT) for branch in branches if branch.commit.last_modified} 114 | except GithubException as e: 115 | print(f'Error getting repo info for {owner}/{repo}: {e}') 116 | return 117 | return max(commit_dates) if commit_dates else None 118 | 119 | 120 | def get_latest_commit_date_for_gitlab(gl, repo_url): 121 | match = re.match(GL_REGEX, repo_url) 122 | 123 | if not match: 124 | return 125 | 126 | project_namespace = match.groups()[0] 127 | project = gl.projects.get(project_namespace) 128 | 129 | branches = project.branches.list(get_all=True) 130 | created_dates = {branch.commit["created_at"] for branch in branches} 131 | last_commit = max(created_dates) 132 | 133 | return datetime.strptime( 134 | ''.join(last_commit.rsplit(':', 1)), 135 | '%Y-%m-%dT%H:%M:%S.%f%z' 136 | ).replace(tzinfo=None) 137 | 138 | 139 | def get_latest_commit_date_for_sourceforge(repo_url: str) -> Optional[datetime]: 140 | if not (match := re.match(SF_REGEX, repo_url)): 141 | return 142 | 143 | project_name = match.groups()[0] 144 | feed = feedparser.parse(f"https://sourceforge.net/p/{project_name}/activity/feed.rss") 145 | for entry in feed.entries: 146 | # Only look for commits 147 | if " committed " not in entry["title"]: 148 | continue 149 | return datetime.fromtimestamp(mktime(entry["published_parsed"])) 150 | return None 151 | 152 | 153 | if __name__ == "__main__": 154 | main() 155 | -------------------------------------------------------------------------------- /scripts/utils.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from typing import Iterable 3 | 4 | import yaml 5 | 6 | PROJECT_ROOT_PATH = Path(__file__).parent.parent.resolve() 7 | 8 | 9 | def originals() -> Iterable[dict]: 10 | for p in (PROJECT_ROOT_PATH / "originals").iterdir(): 11 | if p.is_file() and p.suffix == ".yaml": 12 | originals = yaml.safe_load(open(p, encoding="utf-8")) 13 | for original in originals: 14 | yield original 15 | 16 | 17 | def games() -> Iterable[dict]: 18 | for p in (PROJECT_ROOT_PATH / "games").iterdir(): 19 | if p.is_file() and p.suffix == ".yaml": 20 | games = yaml.safe_load(open(p, encoding="utf-8")) 21 | for game in games: 22 | yield game 23 | -------------------------------------------------------------------------------- /static/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opengaming/osgameclones/88920b52b93d2af11dcd474b3614c9eecf5df27e/static/black.png -------------------------------------------------------------------------------- /static/dark-theme.js: -------------------------------------------------------------------------------- 1 | const DARK_THEME_CLASS = 'dark-theme'; 2 | const LIGHT_THEME_CLASS = 'light-theme'; 3 | const THEME_KEY = 'theme'; 4 | 5 | function setDarkTheme() { 6 | document.body.classList.remove(LIGHT_THEME_CLASS); 7 | document.body.classList.add(DARK_THEME_CLASS); 8 | } 9 | 10 | function setLightTheme() { 11 | document.body.classList.remove(DARK_THEME_CLASS); 12 | document.body.classList.add(LIGHT_THEME_CLASS); 13 | } 14 | 15 | function toggleDarkTheme() { 16 | if (document.body.classList.contains(DARK_THEME_CLASS)) { 17 | setLightTheme(); 18 | localStorage.setItem(THEME_KEY, 'light') 19 | } else { 20 | setDarkTheme(); 21 | localStorage.setItem(THEME_KEY, 'dark') 22 | } 23 | } 24 | 25 | // enable dark theme as soon as possible so first paint is already dark mode 26 | (function () { 27 | window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { 28 | if (localStorage.getItem(THEME_KEY) === null) { 29 | if (event.matches) { 30 | setDarkTheme(); 31 | } else { 32 | setLightTheme(); 33 | } 34 | } 35 | }); 36 | 37 | if (localStorage.getItem(THEME_KEY) === 'dark') { 38 | setDarkTheme(); 39 | } else if (localStorage.getItem(THEME_KEY) === 'light') { 40 | setLightTheme(); 41 | } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) { 42 | setDarkTheme(); 43 | } else { 44 | setLightTheme(); 45 | } 46 | })(); 47 | 48 | // handle theme button label and listener once DOM fully loaded 49 | window.addEventListener('DOMContentLoaded', function () { 50 | const isDarkTheme = document.body.classList.contains(DARK_THEME_CLASS) 51 | document.getElementById('dark-theme-button').addEventListener('click', toggleDarkTheme) 52 | }) 53 | -------------------------------------------------------------------------------- /templates/common.html: -------------------------------------------------------------------------------- 1 | {%- import 'templates/tags.html' as tags -%} 2 | 3 | {%- macro head(title, keywords, description) -%} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 20 | 21 | {{ title|default('Open Source Game Clones', true) }} 22 | 23 | 24 | 25 | 26 | 27 | {%- endmacro -%} 28 | 29 | 30 | {%- macro footer() -%} 31 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | {%- endmacro -%} 49 | 50 | 51 | {%- macro nav() -%} 52 |
53 |
54 | 55 | 56 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | ........ 113 | 114 |
115 |
116 | {%- endmacro -%} 117 | -------------------------------------------------------------------------------- /templates/forms/form_group.jinja2: -------------------------------------------------------------------------------- 1 |
2 | {% block content %} 3 | 6 |
7 | {% block control %}{% endblock %} 8 |
9 | {% endblock %} 10 |
-------------------------------------------------------------------------------- /templates/forms/page.jinja2: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {{ name|title }} form 10 | 11 | 12 |
13 |
14 |
15 | 16 | {# Schema modal #} 17 |
18 |
19 |
20 | 23 |
24 | 44 |
45 |
46 | 47 | {# Main content #} 48 |
49 | {{ contents }} 50 |
51 |
77 | 78 | 79 |
80 |
81 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 147 | 148 | 149 | -------------------------------------------------------------------------------- /templates/forms/static/main.js: -------------------------------------------------------------------------------- 1 | function submitForm() { 2 | var $form = $("form"); 3 | if (validate($form)) { 4 | // https://github.com/marioizquierdo/jquery.serializeJSON 5 | var data = $form.serializeJSON({ 6 | customTypes: { 7 | csv: function(str) { 8 | if (str === "") { 9 | return null; 10 | } 11 | return $.csv.toArray(str); 12 | }, 13 | } 14 | }); 15 | // Remove empty nodes 16 | data = trimObject(data); 17 | var dumped = jsyaml.safeDump(data, { 18 | noArrayIndent: true, 19 | }); 20 | console.log(dumped); 21 | $('#add-game-yaml-body').val(dumped); 22 | $('#yaml-modal').modal(); 23 | return false; 24 | } else { 25 | // Form is invalid; let the browser's built in validation show 26 | return true; 27 | } 28 | } 29 | 30 | function validate($form) { 31 | // Check required for multiple checkboxes 32 | var valid = true; 33 | $form.find('.checkbox-group-required').each(function(i, elem) { 34 | $(elem).find(':checkbox').removeAttr('required'); 35 | if ($(elem).find(':checkbox:checked').length === 0) { 36 | // Set one of them to required to use the browser's own validation message 37 | $(elem).find(':checkbox').attr('required', 'required'); 38 | valid = false; 39 | } 40 | }); 41 | valid = valid && $form.get()[0].checkValidity(); 42 | return valid; 43 | } 44 | 45 | function trimObject(o) { 46 | if (typeof o === 'object') { 47 | for (var a in o) { 48 | o[a] = trimObject(o[a]); 49 | if (!o[a] || (o[a].constructor === Object && Object.keys(o[a]).length === 0)) { 50 | delete o[a]; 51 | } 52 | } 53 | } else if (Array.isArray(o)) { 54 | o = o.map(function(e) { 55 | return trimObject(e); 56 | }); 57 | } 58 | return o; 59 | } 60 | 61 | function copy() { 62 | $("#add-game-yaml-body").select(); 63 | document.execCommand("copy"); 64 | } 65 | 66 | $("input.tagsinput").each(function() { 67 | $(this).tagsinput({ 68 | allowDuplicates: this.hasAttribute("data-allow-duplicates") 69 | }); 70 | }); 71 | 72 | $("input.datepicker").datepicker({ 73 | format: "yyyy-mm-dd", 74 | autoclose: true, 75 | todayBtn: "linked", 76 | todayHighlight: true 77 | }); 78 | -------------------------------------------------------------------------------- /templates/forms/static/tagsinput/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 James Nodws 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /templates/forms/static/tagsinput/README.md: -------------------------------------------------------------------------------- 1 | # Bootstrap Tags Input 2 | Bootstrap Tags Input is a jQuery plugin providing a Twitter Bootstrap user interface for managing tags. 3 | 4 | 5 | ## Usage 6 | Examples can be found [here](http://bootstrap-tagsinput.github.io/bootstrap-tagsinput/examples/). 7 | 8 | ## Features 9 | * Objects as tags 10 | * True multi value 11 | * Typeahead 12 | * Modified for Bootstrap 4 Alpha 13 | 14 | ## Unmantained code AS-IS 15 | If you need this plugin please fork and continue development, as I only needed it for a single project and will not continue further maintenance :) 16 | -------------------------------------------------------------------------------- /templates/forms/static/tagsinput/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap4-tagsinput", 3 | "title": "Bootstrap 4 Tagsinput", 4 | "description": "jQuery tags input plugin based on Twitter Bootstrap 4", 5 | "version": "4.1.2", 6 | "repository": 7 | { 8 | "type": "git", 9 | "url": "https://github.com/Nodws/bootstrap4-tagsinput.git" 10 | }, 11 | "license": "MIT", 12 | "homepage": "https://github.com/Nodws/bootstrap4-tagsinput" 13 | } 14 | -------------------------------------------------------------------------------- /templates/forms/static/tagsinput/tagsinput.css: -------------------------------------------------------------------------------- 1 | /* 2 | * bootstrap-tagsinput v0.8.0 3 | * 4 | */ 5 | 6 | .bootstrap-tagsinput { 7 | border: 1px solid var(--bs-border-color); 8 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 9 | display: inline-block; 10 | padding: 4px 6px; 11 | color: #555; 12 | vertical-align: middle; 13 | border-radius: 4px; 14 | width: 100%; 15 | line-height: 22px; 16 | cursor: text; 17 | } 18 | .bootstrap-tagsinput input { 19 | border: none; 20 | box-shadow: none; 21 | outline: none; 22 | background-color: transparent; 23 | padding: 0 6px; 24 | margin: 0; 25 | width: 100%; 26 | max-width: inherit; 27 | } 28 | .bootstrap-tagsinput.form-control input::-moz-placeholder { 29 | color: #777; 30 | opacity: 1; 31 | } 32 | .bootstrap-tagsinput.form-control input:-ms-input-placeholder { 33 | color: #777; 34 | } 35 | .bootstrap-tagsinput.form-control input::-webkit-input-placeholder { 36 | color: #777; 37 | } 38 | .bootstrap-tagsinput input:focus { 39 | border: none; 40 | box-shadow: none; 41 | } 42 | .bootstrap-tagsinput .badge { 43 | margin: 2px 0; 44 | padding:5px 8px; 45 | } 46 | .bootstrap-tagsinput .badge [data-role="remove"] { 47 | margin-left: 8px; 48 | cursor: pointer; 49 | } 50 | .bootstrap-tagsinput .badge [data-role="remove"]:after { 51 | content: "×"; 52 | padding: 0px 4px; 53 | background-color:rgba(0, 0, 0, 0.1); 54 | border-radius:50%; 55 | font-size:13px 56 | } 57 | .bootstrap-tagsinput .badge [data-role="remove"]:hover:after { 58 | 59 | background-color:rgba(0, 0, 0, 0.62); 60 | } 61 | .bootstrap-tagsinput .badge [data-role="remove"]:hover:active { 62 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 63 | } 64 | 65 | .tt-menu { 66 | position: absolute; 67 | top: 100%; 68 | left: 0; 69 | z-index: 1000; 70 | display: none; 71 | float: left; 72 | min-width: 160px; 73 | padding: 5px 0; 74 | margin: 2px 0 0; 75 | list-style: none; 76 | font-size: 14px; 77 | background-color: #ffffff; 78 | border: 1px solid #cccccc; 79 | border: 1px solid rgba(0, 0, 0, 0.15); 80 | border-radius: 4px; 81 | -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); 82 | box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); 83 | background-clip: padding-box; 84 | cursor: pointer; 85 | } 86 | 87 | .tt-suggestion { 88 | display: block; 89 | padding: 3px 20px; 90 | clear: both; 91 | font-weight: normal; 92 | line-height: 1.428571429; 93 | color: #333333; 94 | white-space: nowrap; 95 | } 96 | 97 | .tt-suggestion:hover, 98 | .tt-suggestion:focus { 99 | color: #ffffff; 100 | text-decoration: none; 101 | outline: 0; 102 | background-color: #428bca; 103 | } 104 | -------------------------------------------------------------------------------- /templates/forms/types/any.jinja2: -------------------------------------------------------------------------------- 1 | {% extends "form_group.jinja2" %} 2 | {% block control %} 3 | 14 | {% endblock %} -------------------------------------------------------------------------------- /templates/forms/types/date.jinja2: -------------------------------------------------------------------------------- 1 | {% extends "form_group.jinja2" %} 2 | {% block control %} 3 | 14 | {% endblock %} -------------------------------------------------------------------------------- /templates/forms/types/int.jinja2: -------------------------------------------------------------------------------- 1 | {% extends "form_group.jinja2" %} 2 | {% block control %} 3 | 14 | {% endblock %} -------------------------------------------------------------------------------- /templates/forms/types/map.jinja2: -------------------------------------------------------------------------------- 1 |
2 |
{{ name|title }}
3 |
4 | {{ contents }} 5 |
6 |
7 | -------------------------------------------------------------------------------- /templates/forms/types/seq.jinja2: -------------------------------------------------------------------------------- 1 | {# 2 | TODO: multiple sequences? 3 | #} 4 | {% extends "form_group.jinja2" %} 5 | {% block control %} 6 | 7 | {% set sequence = schema["sequence"][0] if "sequence" in schema else None %} 8 | {% set MAX_CHECKBOXES = 5 %} 9 | {# TODO non-unique enum sequences #} 10 | {% if sequence and "enum" in sequence and sequence.get("unique", False) %} 11 | {# Need to use JS to validate required checkbox groups #} 12 |
13 | {% for s_value in sequence["enum"] %} 14 |
MAX_CHECKBOXES else "" }}"> 15 | 22 | 23 |
24 | {% endfor %} 25 |
26 | {% else %} 27 | 41 | {% endif %} 42 | 43 | {% endblock %} -------------------------------------------------------------------------------- /templates/forms/types/str.jinja2: -------------------------------------------------------------------------------- 1 | {# 2 | TODO: range min-ex max-ex 3 | https://pykwalify.readthedocs.io/en/unstable/validation-rules.html#range 4 | #} 5 | {% extends "form_group.jinja2" %} 6 | {% block control %} 7 | 8 | {% set MAX_RADIO_BUTTONS = 5 %} 9 | {% if schema.get("enum") %} 10 | {% if schema["enum"]|length <= MAX_RADIO_BUTTONS %} 11 | {% for s_value in schema["enum"] %} 12 |
15 | 23 | 24 |
25 | {% endfor %} 26 | {% else %} 27 | 42 | {% endif %} 43 | {% else %} 44 | 63 | {% endif %} 64 | 65 | {% endblock %} -------------------------------------------------------------------------------- /templates/forms/types/text.jinja2: -------------------------------------------------------------------------------- 1 | {% extends "form_group.jinja2" %} 2 | {% block control %} 3 | 14 | {% endblock %} -------------------------------------------------------------------------------- /templates/games.html: -------------------------------------------------------------------------------- 1 | {% import 'templates/video.html' as video %} 2 | {% import 'templates/tags.html' as tags %} 3 | 4 | {% macro render_name(name, game, first, show_details) %} 5 | {%- if show_details -%} 6 | {% set link = game.wikilink %} 7 | {%- else -%} 8 | {% set link = "/" + game.slug %} 9 | {%- endif -%} 10 |
11 | {{ name }} 12 | {% if first %} 13 | {{ tags.render_tag_groups('genres', game.meta['genres']) }} 14 | {{ tags.render_tag_groups('subgenres', game.meta['subgenres']) }} 15 | {{ tags.render_tag_groups('themes', game.meta['themes']) }} 16 | {% if show_details %} 17 | Edit 18 | {% endif %} 19 | {% endif %} 20 |
21 | {% endmacro %} 22 | 23 | {% macro show_id(name) -%} 24 | {{ name | lower | replace(' ', '-') }} 25 | {%- endmacro %} 26 | 27 | {% macro show_tags(game) -%} 28 | {%- if 'multiplayer' in game %} 29 | {{ game.tags.append('multiplayer') }} 30 | {% endif -%} 31 | 32 | {{ game.tags | join(' ') }} 33 | {%- endmacro %} 34 | 35 | {% macro show_keywords_names(names) -%} 36 | {% for n in names -%} 37 | {% if n is not string -%} 38 | {% for i in n -%} 39 | {{ i | normalize -}}{{ ' ' -}} 40 | {% endfor -%} 41 | {% else -%} 42 | {{ n | normalize -}} 43 | {% endif -%} 44 | {{ ' ' -}} 45 | {% endfor -%} 46 | {%- endmacro %} 47 | 48 | {% macro show_keywords(game, names, meta) -%} 49 | {{ game.name | normalize -}}{{ ' ' -}} 50 | {{ game.tags | join(' ') | normalize -}}{{ ' ' -}} 51 | {{ game.info | normalize -}}{{ ' ' -}} 52 | 53 | {%- if game.new %} 54 | {{ 'new updated added ' -}} 55 | {% endif %} 56 | 57 | {%- if 'multiplayer' in game -%} 58 | {{ 'multiplayer ' }} 59 | {%- endif -%} 60 | 61 | {{ show_keywords_names(names) }} 62 | {{ show_keywords_names(meta.names_ascii) }} 63 | {%- endmacro %} 64 | 65 | {% macro render_clone(names, meta, game, show_details, expand_gallery) %} 66 |
67 | {%- set show_gallery = show_details and ('images' in game or 'video' in game) -%} 68 |
86 | 87 | {%- if 'url' in game -%} 88 | 89 | {%- else -%} 90 | {{ game['name'] }} 91 | {%- endif %} 92 | {%- if game.new -%} 93 | NEW 94 | {%- elif game.is_updated -%} 95 | UPDATED 96 | {%- endif -%} 97 | {%- if 'feed' in game %} 98 | 99 | {%- endif %} 100 | {%- if 'repo' in game %} 101 | ( 102 | repo 103 | {%- if 'repoiconname' in game %} 104 | 105 | {%- endif %} 106 | {%- if 'repobadge' in game %}{{ game['repobadge'] }}{%- endif %} 107 | 108 | ) 109 | {%- endif %} 110 | {{ tags.render_tag_groups('type', game['type'] | title) if show_details }} 111 | {{ tags.render_tag_groups('status', game['status'] | title) if game['type'] != 'tool' }} 112 | {{ tags.render_tag_groups('development', game['development'] | title) }} 113 | {{ tags.render_tag_groups('langs', game['langs']) }} 114 | {{ tags.render_tag_groups('frameworks', game['frameworks']) if show_details }} 115 | {{ tags.render_tag_groups('content', game['content'] | title) if show_details }} 116 | {{ tags.render_tag_groups('licenses', game['licenses']) }} 117 | {{ tags.render_tag_groups('multiplayer', game['multiplayer']) if 'multiplayer' in game and show_details }} 118 | {% if show_details %} 119 | Edit 120 | {% endif %} 121 | {%- if 'info' in game and show_details %} 122 |
{{ game['info'] }}
123 | {% endif %} 124 | {% if show_gallery %} 125 | 126 | {% if game['images'] | length > 0 -%} 127 | 130 | {% endif %} 131 | 148 | {% endif %} 149 |
150 |
151 | {% endmacro %} 152 | 153 | {% macro render(game, show_details) %} 154 |
155 | {% for name in game.names %} 156 | {{ render_name(name, game, loop.index0 == 0, show_details) }} 157 | {% endfor %} 158 | 159 | {% for clone in game.clones %} 160 | {{ render_clone(game.names, game.meta, clone, show_details, show_details) }} 161 | {% endfor %} 162 | {% endmacro %} 163 | -------------------------------------------------------------------------------- /templates/tags.html: -------------------------------------------------------------------------------- 1 | {% macro render_tag(tag_class, tag_names, tag_props) %} 2 | {%- if tag_names -%} 3 | {%- if tag_names is string -%} 4 | {% set tag_names = [tag_names] %} 5 | {%- endif -%} 6 | 7 | {%- for tag_name in tag_names %} 8 | {%- set className = ["tag", tag_class.lower(), tag_name.lower().replace(' ', '-')] -%} 9 | {%- set dataName = tag_name.lower().replace(' ', '-') -%} 10 | 11 | {{- tag_name -}} 12 | {%- if tag_props -%}{{ tag_props }}{%- endif -%} 13 | 14 | {% endfor -%} 15 | {%- endif -%} 16 | {% endmacro %} 17 | 18 | {% macro render_tag_groups(tag_class, tag_names, tag_props) %} 19 | {%- if tag_names -%} 20 | {%- if tag_names is string -%} 21 | {% set tag_names = [tag_names] %} 22 | {%- endif -%} 23 | 24 | {{ tag_class }}: 25 | {%- for tag_name in tag_names %} 26 | {%- set className = ["tag", tag_class.lower(), tag_name.lower().replace(' ', '-')] -%} 27 | {%- set dataName = tag_name.lower().replace(' ', '-') -%} 28 | 30 | {{- tag_name -}} 31 | {%- if tag_props -%}{{ tag_props }}{%- endif -%} 32 | 33 | {% endfor -%} 34 | 35 | {%- endif -%} 36 | {% endmacro %} 37 | -------------------------------------------------------------------------------- /templates/video.html: -------------------------------------------------------------------------------- 1 | {% macro render_video(game_name, video_url, img_url) -%} 2 | 7 | 8 | 9 | {%- endmacro %} 10 | 11 | {% macro render_youtube(game_name, youtube_id) -%} 12 | {{ render_video(game_name, 'https://www.youtube-nocookie.com/embed/%s?rel=0&showinfo=0' % youtube_id, 'https://img.youtube.com/vi/%s/0.jpg' % youtube_id) }} 13 | {%- endmacro %} 14 | 15 | {% macro render_vimeo(game_name, vimeo_id) -%} 16 | {{ render_video(game_name, 'https://player.vimeo.com/video/%s?title=0&byline=0&portrait=0' % vimeo_id, 'https://vumbnail.com/%s.jpg' % vimeo_id) }} 17 | {%- endmacro %} 18 | 19 | {%- macro render_moddb(game_name, moddb_id) -%} 20 | {{ render_video(game_name, 'https://www.moddb.com/media/iframe/%s' % moddb_id, '/static/black.png') }} 21 | {%- endmacro %} 22 | 23 | {%- macro render_indiedb(game_name, indiedb_id) -%} 24 | {{ render_video(game_name, 'https://www.indiedb.com/media/iframe/%s' % indiedb_id, '/static/black.png') }} 25 | {%- endmacro %} 26 | -------------------------------------------------------------------------------- /vhost.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name osgameclones.com ""; 4 | root /www; 5 | index index.html; 6 | } 7 | --------------------------------------------------------------------------------