├── .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 | [](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 |
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 |
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""
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 |
57 |
58 | Languages
59 |
60 |
61 | {% for tag, tag_props in site.langs.items() %}
62 | {{ tags.render_tag('langs', tag, tag_props['tag_count']) }}
63 | {% endfor %}
64 |
65 |
66 |
67 |
68 |
69 | Genres
70 |
71 |
72 | {% for tag, tag_props in site.genres.items() %}
73 | {{ tags.render_tag('genres', tag, tag_props['tag_count']) }}
74 | {% endfor %}
75 |
76 |
77 |
78 |
79 |
80 | Subgenres
81 |
82 |
83 | {% for tag, tag_props in site.subgenres.items() %}
84 | {{ tags.render_tag('subgenres', tag, tag_props['tag_count']) }}
85 | {% endfor %}
86 |
87 |
88 |
89 |
90 |
91 | Themes
92 |
93 |
94 | {% for tag, tag_props in site.themes.items() %}
95 | {{ tags.render_tag('themes', tag, tag_props['tag_count']) }}
96 | {% endfor %}
97 |
98 |
99 |
100 |
101 |
102 | xxxx/yyyy games
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 | ........
113 |
114 |
115 |
116 | {%- endmacro -%}
117 |
--------------------------------------------------------------------------------
/templates/forms/form_group.jinja2:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/templates/forms/page.jinja2:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | {{ name|title }} form
10 |
11 |
12 |
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 |
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 | {{ s_value }}
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 | {{ s_value }}
24 |
25 | {% endfor %}
26 | {% else %}
27 |
33 | {% for s_value in schema["enum"] %}
34 |
38 | {{ s_value }}
39 |
40 | {% endfor %}
41 |
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 | {{ game['name'] }}
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 |
--------------------------------------------------------------------------------