further improvement of maintenance scripts
This commit is contained in:
parent
c985780dc2
commit
60f9523906
@ -566,6 +566,7 @@
|
||||
"https://github.com/dmecke/OpenSoccerStar.git",
|
||||
"https://github.com/dogballs/cattle-bity.git",
|
||||
"https://github.com/dorkster/freeblocks.git",
|
||||
"https://github.com/dougmencken/HeadOverHeels.git",
|
||||
"https://github.com/doxygen/doxygen.git",
|
||||
"https://github.com/dreamchess/dreamchess.git",
|
||||
"https://github.com/dsallen7/ransack-python.git",
|
||||
@ -666,6 +667,7 @@
|
||||
"https://github.com/ihofmann/open-websoccer.git",
|
||||
"https://github.com/indyjo/Thunder-Lightning.git",
|
||||
"https://github.com/inexorgame/inexor-core.git",
|
||||
"https://github.com/inexorgame/vulkan-renderer.git",
|
||||
"https://github.com/infidel-/cult.git",
|
||||
"https://github.com/inolen/quakejs.git",
|
||||
"https://github.com/instead-hub/instead.git",
|
||||
|
@ -1,298 +0,0 @@
|
||||
import json
|
||||
import textwrap
|
||||
import os
|
||||
import re
|
||||
|
||||
import utils.constants
|
||||
from utils import constants as c, utils
|
||||
|
||||
|
||||
def export_json(infos):
|
||||
"""
|
||||
Parses all entries, collects interesting info and stores it in a json file suitable for displaying
|
||||
with a dynamic table in a browser.
|
||||
"""
|
||||
|
||||
print('export to json for web display')
|
||||
|
||||
# make database out of it
|
||||
db = {'headings': ['Game', 'Description', 'Download', 'State', 'Keywords', 'Source']}
|
||||
|
||||
entries = []
|
||||
for info in infos:
|
||||
|
||||
# game & description
|
||||
entry = ['{} (<a href="{}">home</a>, <a href="{}">entry</a>)'.format(info['Name'], info['home'][0],
|
||||
r'https://github.com/Trilarion/opensourcegames/blob/master/entries/' +
|
||||
info['file']),
|
||||
textwrap.shorten(info['description'], width=60, placeholder='..')]
|
||||
|
||||
# download
|
||||
field = 'download'
|
||||
if field in info and info[field]:
|
||||
entry.append('<a href="{}">Link</a>'.format(info[field][0]))
|
||||
else:
|
||||
entry.append('')
|
||||
|
||||
# state (field state is essential)
|
||||
entry.append('{} / {}'.format(info['state'][0],
|
||||
'inactive since {}'.format(info['inactive']) if 'inactive' in info else 'active'))
|
||||
|
||||
# keywords
|
||||
field = 'keywords'
|
||||
if field in info and info[field]:
|
||||
entry.append(', '.join(info[field]))
|
||||
else:
|
||||
entry.append('')
|
||||
|
||||
# source
|
||||
text = []
|
||||
field = 'code repository'
|
||||
if field in info and info[field]:
|
||||
text.append('<a href="{}">Source</a>'.format(info[field][0]))
|
||||
field = 'code language'
|
||||
if field in info and info[field]:
|
||||
text.append(', '.join(info[field]))
|
||||
field = 'code license'
|
||||
if field in info and info[field]:
|
||||
text.append(info[field][0])
|
||||
entry.append(' - '.join(text))
|
||||
|
||||
# append to entries
|
||||
entries.append(entry)
|
||||
|
||||
# sort entries by game name
|
||||
entries.sort(key=lambda x: str.casefold(x[0]))
|
||||
|
||||
db['data'] = entries
|
||||
|
||||
# output
|
||||
json_path = os.path.join(c.entries_path, os.path.pardir, 'docs', 'data.json')
|
||||
text = json.dumps(db, indent=1)
|
||||
utils.write_text(json_path, text)
|
||||
|
||||
|
||||
def git_repo(repo):
|
||||
"""
|
||||
Tests if a repo is a git repo, then returns the repo url, possibly modifying it slightly.
|
||||
"""
|
||||
|
||||
# generic (https://*.git) or (http://*.git) ending on git
|
||||
if (repo.startswith('https://') or repo.startswith('http://')) and repo.endswith('.git'):
|
||||
return repo
|
||||
|
||||
# for all others we just check if they start with the typical urls of git services
|
||||
services = ['https://git.tuxfamily.org/', 'http://git.pond.sub.org/', 'https://gitorious.org/',
|
||||
'https://git.code.sf.net/p/']
|
||||
for service in services:
|
||||
if repo.startswith(service):
|
||||
return repo
|
||||
|
||||
if repo.startswith('git://'):
|
||||
return repo
|
||||
|
||||
# the rest is ignored
|
||||
return None
|
||||
|
||||
|
||||
def svn_repo(repo):
|
||||
"""
|
||||
|
||||
"""
|
||||
if repo.startswith('https://svn.code.sf.net/p/'):
|
||||
return repo
|
||||
|
||||
if repo.startswith('http://svn.uktrainsim.com/svn/'):
|
||||
return repo
|
||||
|
||||
if repo == 'https://rpg.hamsterrepublic.com/source/wip':
|
||||
return repo
|
||||
|
||||
if repo.startswith('http://svn.savannah.gnu.org/svn/'):
|
||||
return repo
|
||||
|
||||
if repo.startswith('svn://'):
|
||||
return repo
|
||||
|
||||
if repo.startswith('https://svn.icculus.org/') or repo.startswith('http://svn.icculus.org/'):
|
||||
return repo
|
||||
|
||||
# not svn
|
||||
return None
|
||||
|
||||
|
||||
def hg_repo(repo):
|
||||
"""
|
||||
|
||||
"""
|
||||
if repo.startswith('https://bitbucket.org/') and not repo.endswith('.git'):
|
||||
return repo
|
||||
|
||||
if repo.startswith('http://hg.'):
|
||||
return repo
|
||||
|
||||
# not hg
|
||||
return None
|
||||
|
||||
|
||||
def export_primary_code_repositories_json(infos):
|
||||
"""
|
||||
|
||||
"""
|
||||
|
||||
print('export to json for local repository update')
|
||||
|
||||
primary_repos = {'git': [], 'svn': [], 'hg': []}
|
||||
unconsumed_entries = []
|
||||
|
||||
# for every entry filter those that are known git repositories (add additional repositories)
|
||||
field = 'code repository-raw'
|
||||
for info in infos:
|
||||
# if field 'Code repository' is available
|
||||
if field in info:
|
||||
consumed = False
|
||||
repos = info[field]
|
||||
if repos:
|
||||
# split at comma
|
||||
repos = repos.split(',')
|
||||
# keep the first and all others containing "(+)"
|
||||
additional_repos = [x for x in repos[1:] if "(+)" in x]
|
||||
repos = repos[0:1]
|
||||
repos.extend(additional_repos)
|
||||
for repo in repos:
|
||||
# remove parenthesis and strip of white spaces
|
||||
repo = re.sub(r'\([^)]*\)', '', repo)
|
||||
repo = repo.strip()
|
||||
url = git_repo(repo)
|
||||
if url:
|
||||
primary_repos['git'].append(url)
|
||||
consumed = True
|
||||
continue
|
||||
url = svn_repo(repo)
|
||||
if url:
|
||||
primary_repos['svn'].append(url)
|
||||
consumed = True
|
||||
continue
|
||||
url = hg_repo(repo)
|
||||
if url:
|
||||
primary_repos['hg'].append(url)
|
||||
consumed = True
|
||||
continue
|
||||
|
||||
if not consumed:
|
||||
unconsumed_entries.append([info['Name'], info[field]])
|
||||
# print output
|
||||
if 'code repository' in info:
|
||||
print('Entry "{}" unconsumed repo: {}'.format(info['Name'], info[field]))
|
||||
|
||||
# sort them alphabetically (and remove duplicates)
|
||||
for k, v in primary_repos.items():
|
||||
primary_repos[k] = sorted(set(v))
|
||||
|
||||
# statistics of gits
|
||||
git_repos = primary_repos['git']
|
||||
print('{} Git repositories'.format(len(git_repos)))
|
||||
for domain in (
|
||||
'repo.or.cz', 'anongit.kde.org', 'bitbucket.org', 'git.code.sf.net', 'git.savannah', 'git.tuxfamily',
|
||||
'github.com',
|
||||
'gitlab.com', 'gitlab.com/osgames', 'gitlab.gnome.org'):
|
||||
print('{} on {}'.format(sum(1 if domain in x else 0 for x in git_repos), domain))
|
||||
|
||||
# write them to code/git
|
||||
json_path = os.path.join(c.root_path, 'code', 'archives.json')
|
||||
text = json.dumps(primary_repos, indent=1)
|
||||
utils.write_text(json_path, text)
|
||||
|
||||
|
||||
def export_git_code_repositories_json():
|
||||
"""
|
||||
|
||||
"""
|
||||
|
||||
urls = []
|
||||
field = 'code repository'
|
||||
|
||||
# for every entry, get all git
|
||||
for info in infos:
|
||||
# if field 'Code repository' is available
|
||||
if field in info:
|
||||
repos = info[field]
|
||||
if repos:
|
||||
# take the first
|
||||
repo = repos[0]
|
||||
url = git_repo(repo)
|
||||
if url:
|
||||
urls.append(url)
|
||||
|
||||
# sort them alphabetically (and remove duplicates)
|
||||
urls.sort()
|
||||
|
||||
# write them to code/git
|
||||
json_path = os.path.join(c.root_path, 'code', 'git_repositories.json')
|
||||
text = json.dumps(urls, indent=1)
|
||||
utils.write_text(json_path, text)
|
||||
|
||||
|
||||
def check_validity_backlog():
|
||||
import requests
|
||||
|
||||
# read backlog and split
|
||||
file = os.path.join(c.root_path, 'code', 'backlog.txt')
|
||||
text = utils.read_text(file)
|
||||
urls = text.split('\n')
|
||||
urls = [x.split(' ')[0] for x in urls]
|
||||
|
||||
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'}
|
||||
for url in urls:
|
||||
try:
|
||||
r = requests.get(url, headers=headers, timeout=5)
|
||||
except Exception as e:
|
||||
print('{} gave error: {}'.format(url, e))
|
||||
else:
|
||||
if r.status_code != requests.codes.ok:
|
||||
print('{} returned status code: {}'.format(url, r.status_code))
|
||||
|
||||
if r.is_redirect or r.history:
|
||||
print('{} redirected to {}, {}'.format(url, r.url, r.history))
|
||||
|
||||
|
||||
def check_code_dependencies(infos):
|
||||
"""
|
||||
|
||||
"""
|
||||
|
||||
# get all names of frameworks and library also using osg.code_dependencies_aliases
|
||||
valid_dependencies = list(utils.constants.general_code_dependencies_without_entry.keys())
|
||||
for info in infos:
|
||||
if any((x in ('framework', 'library', 'game engine') for x in info['keywords'])):
|
||||
name = info['Name']
|
||||
if name in utils.constants.code_dependencies_aliases:
|
||||
valid_dependencies.extend(utils.constants.code_dependencies_aliases[name])
|
||||
else:
|
||||
valid_dependencies.append(name)
|
||||
|
||||
# get all referenced code dependencies
|
||||
referenced_dependencies = {}
|
||||
for info in infos:
|
||||
deps = info.get('code dependencies', [])
|
||||
for dependency in deps:
|
||||
if dependency in referenced_dependencies:
|
||||
referenced_dependencies[dependency] += 1
|
||||
else:
|
||||
referenced_dependencies[dependency] = 1
|
||||
|
||||
# delete those that are valid dependencies
|
||||
referenced_dependencies = [(k, v) for k, v in referenced_dependencies.items() if k not in valid_dependencies]
|
||||
|
||||
# sort by number
|
||||
referenced_dependencies.sort(key=lambda x: x[1], reverse=True)
|
||||
|
||||
# print out
|
||||
print('Code dependencies not included as entry')
|
||||
for dep in referenced_dependencies:
|
||||
print('{} ({})'.format(*dep))
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,17 +1,40 @@
|
||||
"""
|
||||
Runs a series of maintenance operations on the collection of entry files, updating the table of content files for
|
||||
each category as well as creating a statistics file.
|
||||
Runs a series of maintenance operations on the collection of entry files, updating the table of content files for
|
||||
each category as well as creating a statistics file.
|
||||
|
||||
Counts the number of records each sub-folder and updates the overview.
|
||||
Sorts the entries in the contents files of each sub folder alphabetically.
|
||||
Counts the number of records each sub-folder and updates the overview.
|
||||
Sorts the entries in the contents files of each sub folder alphabetically.
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import datetime
|
||||
import json
|
||||
import textwrap
|
||||
from utils import osg, osg_ui, utils, constants as c
|
||||
import requests
|
||||
|
||||
def check_validity_backlog():
|
||||
import requests
|
||||
|
||||
# read backlog and split
|
||||
file = os.path.join(c.root_path, 'code', 'backlog.txt')
|
||||
text = utils.read_text(file)
|
||||
urls = text.split('\n')
|
||||
urls = [x.split(' ')[0] for x in urls]
|
||||
|
||||
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'}
|
||||
for url in urls:
|
||||
try:
|
||||
r = requests.get(url, headers=headers, timeout=5)
|
||||
except Exception as e:
|
||||
print('{} gave error: {}'.format(url, e))
|
||||
else:
|
||||
if r.status_code != requests.codes.ok:
|
||||
print('{} returned status code: {}'.format(url, r.status_code))
|
||||
|
||||
if r.is_redirect or r.history:
|
||||
print('{} redirected to {}, {}'.format(url, r.url, r.history))
|
||||
|
||||
def create_toc(title, file, entries):
|
||||
"""
|
||||
@ -89,6 +112,78 @@ class EntriesMaintainer:
|
||||
print('{}: found {}'.format(os.path.basename(entry_path), check_string))
|
||||
print('checked for template leftovers')
|
||||
|
||||
def check_inconsistencies(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
"""
|
||||
if not self.entries:
|
||||
print('entries not yet loaded')
|
||||
return
|
||||
# get all keywords and print similar keywords
|
||||
keywords = []
|
||||
for entry in self.entries:
|
||||
keywords.extend(entry['Keywords'])
|
||||
if b'first\xe2\x80\x90person'.decode() in entry['Keywords']:
|
||||
print(entry['File'])
|
||||
keywords = [x.value for x in keywords]
|
||||
|
||||
# reduce those starting with "multiplayer"
|
||||
keywords = [x if not x.startswith('multiplayer') else 'multiplayer' for x in keywords]
|
||||
|
||||
# check unique keywords
|
||||
unique_keywords = list(set(keywords))
|
||||
unique_keywords_counts = [keywords.count(l) for l in unique_keywords]
|
||||
for index, name in enumerate(unique_keywords):
|
||||
for other_index in range(index+1, len(unique_keywords)):
|
||||
other_name = unique_keywords[other_index]
|
||||
if osg.name_similarity(name, other_name) > 0.8:
|
||||
print(' Keywords {} ({}) - {} ({}) are similar'.format(name, unique_keywords_counts[index], other_name, unique_keywords_counts[other_index]))
|
||||
|
||||
# get all names of frameworks and library also using osg.code_dependencies_aliases
|
||||
valid_dependencies = list(c.general_code_dependencies_without_entry.keys())
|
||||
for entry in self.entries:
|
||||
if any((x in ('framework', 'library', 'game engine') for x in entry['Keywords'])):
|
||||
name = entry['Title']
|
||||
if name in c.code_dependencies_aliases:
|
||||
valid_dependencies.extend(c.code_dependencies_aliases[name])
|
||||
else:
|
||||
valid_dependencies.append(name)
|
||||
|
||||
# get all referenced code dependencies
|
||||
referenced_dependencies = {}
|
||||
for entry in self.entries:
|
||||
deps = entry.get('Code dependencies', [])
|
||||
for dependency in deps:
|
||||
dependency = dependency.value
|
||||
if dependency in referenced_dependencies:
|
||||
referenced_dependencies[dependency] += 1
|
||||
else:
|
||||
referenced_dependencies[dependency] = 1
|
||||
|
||||
# delete those that are valid dependencies
|
||||
referenced_dependencies = [(k, v) for k, v in referenced_dependencies.items() if k not in valid_dependencies]
|
||||
|
||||
# sort by number
|
||||
referenced_dependencies.sort(key=lambda x: x[1], reverse=True)
|
||||
|
||||
# print out
|
||||
print('Code dependencies not included as entry')
|
||||
for dep in referenced_dependencies:
|
||||
print('{} ({})'.format(*dep))
|
||||
|
||||
# if there is the "Play" field, it should have "Web" as Platform
|
||||
for entry in self.entries:
|
||||
name = entry['File']
|
||||
if 'Play' in entry:
|
||||
if not 'Platform' in entry:
|
||||
print('Entry "{}" has "Play" field but not "Platform" field, add it with "Web"'.format(name))
|
||||
elif not 'Web' in entry['Platform']:
|
||||
print('Entry "{}" has "Play" field but not "Web" in "Platform" field'.format(name))
|
||||
# javascript/typescript as language but not web as platform?
|
||||
|
||||
# if there is a @see-download there should be download fields...
|
||||
|
||||
def clean_rejected(self):
|
||||
"""
|
||||
|
||||
@ -548,10 +643,171 @@ class EntriesMaintainer:
|
||||
print('statistics updated')
|
||||
|
||||
def update_html(self):
|
||||
pass
|
||||
"""
|
||||
Parses all entries, collects interesting info and stores it in a json file suitable for displaying
|
||||
with a dynamic table in a browser.
|
||||
"""
|
||||
if not self.entries:
|
||||
print('entries not yet loaded')
|
||||
return
|
||||
|
||||
# make database out of it
|
||||
db = {'headings': ['Game', 'Description', 'Download', 'State', 'Keywords', 'Source']}
|
||||
|
||||
entries = []
|
||||
for info in self.entries:
|
||||
|
||||
# game & description
|
||||
entry = ['{} (<a href="{}">home</a>, <a href="{}">entry</a>)'.format(info['Title'], info['Home'][0],
|
||||
r'https://github.com/Trilarion/opensourcegames/blob/master/entries/' +
|
||||
info['File']),
|
||||
textwrap.shorten(info.get('Note', ''), width=60, placeholder='..')]
|
||||
|
||||
# download
|
||||
field = 'Download'
|
||||
if field in info and info[field]:
|
||||
entry.append('<a href="{}">Link</a>'.format(info[field][0]))
|
||||
else:
|
||||
entry.append('')
|
||||
|
||||
# state (field state is essential)
|
||||
entry.append('{} / {}'.format(info['State'][0],
|
||||
'inactive since {}'.format(osg.extract_inactive_year(info)) if osg.is_inactive(info) else 'active'))
|
||||
|
||||
# keywords
|
||||
keywords = info['Keywords']
|
||||
keywords = [x.value for x in keywords]
|
||||
entry.append(', '.join(keywords))
|
||||
|
||||
# source
|
||||
text = []
|
||||
field = 'Code repository'
|
||||
if field in info and info[field]:
|
||||
text.append('<a href="{}">Source</a>'.format(info[field][0].value))
|
||||
languages = info['Code language']
|
||||
languages = [x.value for x in languages]
|
||||
text.append(', '.join(languages))
|
||||
licenses = info['Code license']
|
||||
licenses = [x.value for x in licenses]
|
||||
text.append(', '.join(licenses))
|
||||
entry.append(' - '.join(text))
|
||||
|
||||
# append to entries
|
||||
entries.append(entry)
|
||||
|
||||
# sort entries by game name
|
||||
entries.sort(key=lambda x: str.casefold(x[0]))
|
||||
|
||||
db['data'] = entries
|
||||
|
||||
# output
|
||||
text = json.dumps(db, indent=1)
|
||||
utils.write_text(c.json_db_file, text)
|
||||
|
||||
print('HTML updated')
|
||||
|
||||
def update_repos(self):
|
||||
pass
|
||||
"""
|
||||
export to json for local repository update of primary repos
|
||||
"""
|
||||
if not self.entries:
|
||||
print('entries not yet loaded')
|
||||
return
|
||||
|
||||
primary_repos = {'git': [], 'svn': [], 'hg': []}
|
||||
unconsumed_entries = []
|
||||
|
||||
# for every entry filter those that are known git repositories (add additional repositories)
|
||||
for entry in self.entries:
|
||||
repos = entry['Code repository']
|
||||
repos = [x.value for x in repos]
|
||||
# keep the first and all others containing @add
|
||||
if not repos:
|
||||
continue
|
||||
repos = [repos[0]] + [x for x in repos[1:] if "@add" in x]
|
||||
for repo in repos:
|
||||
consumed = False
|
||||
repo = repo.split(' ')[0].strip()
|
||||
url = osg.git_repo(repo)
|
||||
if url:
|
||||
primary_repos['git'].append(url)
|
||||
consumed = True
|
||||
continue
|
||||
url = osg.svn_repo(repo)
|
||||
if url:
|
||||
primary_repos['svn'].append(url)
|
||||
consumed = True
|
||||
continue
|
||||
url = osg.hg_repo(repo)
|
||||
if url:
|
||||
primary_repos['hg'].append(url)
|
||||
consumed = True
|
||||
continue
|
||||
|
||||
if not consumed:
|
||||
unconsumed_entries.append([entry['Title'], repo])
|
||||
print('Entry "{}" unconsumed repo: {}'.format(entry['File'], repo))
|
||||
|
||||
# sort them alphabetically (and remove duplicates)
|
||||
for k, v in primary_repos.items():
|
||||
primary_repos[k] = sorted(set(v))
|
||||
|
||||
# statistics of gits
|
||||
git_repos = primary_repos['git']
|
||||
print('{} Git repositories'.format(len(git_repos)))
|
||||
for domain in (
|
||||
'repo.or.cz', 'anongit.kde.org', 'bitbucket.org', 'git.code.sf.net', 'git.savannah', 'git.tuxfamily',
|
||||
'github.com',
|
||||
'gitlab.com', 'gitlab.com/osgames', 'gitlab.gnome.org'):
|
||||
print('{} on {}'.format(sum(1 if domain in x else 0 for x in git_repos), domain))
|
||||
|
||||
# write them to code/git
|
||||
json_path = os.path.join(c.root_path, 'code', 'archives.json')
|
||||
text = json.dumps(primary_repos, indent=1)
|
||||
utils.write_text(json_path, text)
|
||||
|
||||
print('Repositories updated')
|
||||
|
||||
def collect_git_repos(self):
|
||||
"""
|
||||
for every entry, get all git
|
||||
:return:
|
||||
"""
|
||||
|
||||
git_repos = []
|
||||
for entry in self.entries:
|
||||
repos = entry['Code repository']
|
||||
repos = [x.value for x in repos]
|
||||
for repo in repos:
|
||||
repo = repo.split(' ')[0].strip()
|
||||
url = osg.git_repo(repo)
|
||||
if url:
|
||||
git_repos.append(repo)
|
||||
|
||||
# sort them alphabetically (and remove duplicates)
|
||||
git_repos = sorted(list(set(git_repos)), key=str.casefold)
|
||||
|
||||
# write them to code/git
|
||||
json_path = os.path.join(c.root_path, 'code', 'git_repositories.json')
|
||||
text = json.dumps(git_repos, indent=1)
|
||||
utils.write_text(json_path, text)
|
||||
|
||||
def special_ops(self):
|
||||
"""
|
||||
For special operations that are one-time and may change.
|
||||
:return:
|
||||
"""
|
||||
if not self.entries:
|
||||
print('entries not yet loaded')
|
||||
return
|
||||
# remove all downloads that only have a single entry with @see-home (this is the default anyway)
|
||||
field = 'Download'
|
||||
for entry in self.entries:
|
||||
if field in entry:
|
||||
content = entry[field]
|
||||
if len(content) == 1 and content[0].value == '@see-home' and not content[0].comment:
|
||||
del entry[field]
|
||||
print('special ops finished')
|
||||
|
||||
def complete_run(self):
|
||||
pass
|
||||
@ -566,6 +822,7 @@ if __name__ == "__main__":
|
||||
'Write entries': m.write_entries,
|
||||
'Check template leftovers': m.check_template_leftovers,
|
||||
'Check external links': m.check_external_links,
|
||||
'Check inconsistencies': m.check_inconsistencies,
|
||||
'Check rejected entries': m.clean_rejected,
|
||||
'Check external links (takes quite long)': m.check_external_links,
|
||||
'Clean backlog': m.clean_backlog,
|
||||
@ -573,6 +830,7 @@ if __name__ == "__main__":
|
||||
'Update statistics': m.update_statistics,
|
||||
'Update HTML': m.update_html,
|
||||
'Update repository list': m.update_repos,
|
||||
'Special': m.special_ops,
|
||||
'Complete run': m.complete_run
|
||||
}
|
||||
|
||||
|
@ -17,6 +17,7 @@ developer_file = os.path.join(root_path, 'developers.md')
|
||||
backlog_file = os.path.join(code_path, 'backlog.txt')
|
||||
rejected_file = os.path.join(code_path, 'rejected.txt')
|
||||
statistics_file = os.path.join(root_path, 'statistics.md')
|
||||
json_db_file = os.path.join(root_path, 'docs', 'data.json')
|
||||
|
||||
# local config
|
||||
local_config_file = os.path.join(root_path, 'local-config.ini')
|
||||
|
@ -504,4 +504,55 @@ def all_urls(entries):
|
||||
subvalue = subvalue.strip()
|
||||
if is_url(subvalue):
|
||||
urls[subvalue] = urls.get(subvalue, []) + [file]
|
||||
return urls
|
||||
return urls
|
||||
|
||||
|
||||
def git_repo(repo):
|
||||
"""
|
||||
Tests if a repo URL is a git repo, then returns the repo url.
|
||||
"""
|
||||
|
||||
# everything that starts with 'git://'
|
||||
if repo.startswith('git://'):
|
||||
return repo
|
||||
|
||||
# generic (https://*.git) or (http://*.git) ending on git
|
||||
if (repo.startswith('https://') or repo.startswith('http://')) and repo.endswith('.git'):
|
||||
return repo
|
||||
|
||||
# for all others we just check if they start with the typical urls of git services
|
||||
services = ['https://git.tuxfamily.org/', 'http://git.pond.sub.org/', 'https://gitorious.org/',
|
||||
'https://git.code.sf.net/p/']
|
||||
if any(repo.startswith(service) for service in services):
|
||||
return repo
|
||||
|
||||
# the rest is not recognized as a git url
|
||||
return None
|
||||
|
||||
|
||||
def svn_repo(repo):
|
||||
"""
|
||||
Tests if a repo URL is a svn repo, then returns the repo url.
|
||||
"""
|
||||
|
||||
# we can just go for known providers of svn
|
||||
services = ('svn://', 'https://svn.code.sf.net/p/', 'http://svn.savannah.gnu.org/svn/', 'https://svn.icculus.org/', 'http://svn.icculus.org/', 'http://svn.uktrainsim.com/svn/', 'https://rpg.hamsterrepublic.com/source/wip')
|
||||
if any(repo.startswith(service) for service in services):
|
||||
return repo
|
||||
|
||||
# not svn
|
||||
return None
|
||||
|
||||
|
||||
def hg_repo(repo):
|
||||
"""
|
||||
Tests if a repo URL is a hg repo, then returns the repo url.
|
||||
"""
|
||||
if repo.startswith('https://bitbucket.org/') and not repo.endswith('.git'):
|
||||
return repo
|
||||
|
||||
if repo.startswith('http://hg.'):
|
||||
return repo
|
||||
|
||||
# not hg
|
||||
return None
|
@ -10,6 +10,4 @@
|
||||
- Code license: MIT
|
||||
- Developer: Jan-Otto Kröpke, Ozan Kurt, Hilarious001
|
||||
|
||||
Space browsergame framework.
|
||||
|
||||
## Building
|
||||
|
@ -3,12 +3,10 @@
|
||||
- Home: http://www.newbreedsoftware.com/3dpong/
|
||||
- State: beta, inactive since 2004
|
||||
- Platform: Linux, macOS
|
||||
- Keywords: arcade, online
|
||||
- Keywords: arcade, online, 3D
|
||||
- Code repository: @see-home
|
||||
- Code language: C
|
||||
- Code license: GPL-2.0
|
||||
- Developer: New Breed Software
|
||||
|
||||
Three dimensional sports game.
|
||||
|
||||
## Building
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
- Home: https://packages.debian.org/sid/3dchess, http://www.ibiblio.org/pub/Linux/games/strategy/3Dc-0.8.1.tar.gz
|
||||
- State: mature, inactive since 2000
|
||||
- Keywords: board, puzzle, chess, open content
|
||||
- Keywords: board, puzzle, chess, open content, 3D
|
||||
- Code repository: @see-home
|
||||
- Code language: C
|
||||
- Code license: GPL-2.0
|
||||
@ -10,6 +10,4 @@
|
||||
- Assets license: GPL-2.0
|
||||
- Developer: Paul Hicks, Bernard Kennedy
|
||||
|
||||
Chess game on 3 boards.
|
||||
|
||||
## Building
|
||||
|
@ -1,9 +1,10 @@
|
||||
# 3d.city
|
||||
|
||||
- Home: http://lo-th.github.io/3d.city/index.html, https://github.com/lo-th/3d.city
|
||||
- Inspirations: SimCity
|
||||
- Inspirations: SimCity, micropolis
|
||||
- State: mature, inactive since 2016
|
||||
- Play: http://lo-th.github.io/3d.city/index.html
|
||||
- Platform: Web
|
||||
- Keywords: simulation, clone, open content
|
||||
- Code repository: https://github.com/lo-th/3d.city.git
|
||||
- Code language: JavaScript
|
||||
|
@ -3,6 +3,7 @@
|
||||
- Home: http://www.allureofthestars.com/
|
||||
- State: beta
|
||||
- Play: http://www.allureofthestars.com/play/
|
||||
- Platform: Web
|
||||
- Keywords: role playing, strategy, open content, roguelike, turn-based
|
||||
- Code repository: https://github.com/AllureOfTheStars/Allure.git
|
||||
- Code language: Haskell
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://arescentral.org/antares
|
||||
- Inspirations: Ares
|
||||
- State: beta
|
||||
- Download: @see-home
|
||||
- Keywords: remake, strategy, real time, shooter
|
||||
- Code repository: https://github.com/arescentral/antares.git
|
||||
- Code language: C++
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: https://www.atrinik.org/, https://github.com/atrinik
|
||||
- State: mature, inactive since 2016
|
||||
- Download: @see-home
|
||||
- Keywords: role playing
|
||||
- Code repository: https://github.com/atrinik/atrinik.git
|
||||
- Code language: C, Python
|
||||
|
@ -4,6 +4,7 @@
|
||||
- Media: https://en.wikipedia.org/wiki/BrowserQuest
|
||||
- State: mature
|
||||
- Play: @see-home
|
||||
- Platform: Web
|
||||
- Keywords: role playing, multiplayer online + massive
|
||||
- Code repository: https://github.com/mozilla/BrowserQuest.git
|
||||
- Code language: JavaScript
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: https://castle-engine.io/
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: framework, game engine
|
||||
- Code repository: https://github.com/castle-engine/castle-engine.git
|
||||
- Code language: Pascal
|
||||
|
@ -4,6 +4,7 @@
|
||||
- Inspirations: Castle of the Winds
|
||||
- State: beta, inactive since 2016
|
||||
- Play: http://game.castleofthewinds.com/
|
||||
- Platform: Web
|
||||
- Keywords: remake, role playing
|
||||
- Code repository: https://github.com/mordrax/cotwmtor.git
|
||||
- Code language: JavaScript
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://www.michaelfogleman.com/projects/craft/
|
||||
- Inspirations: Minecraft
|
||||
- State: mature, inactive since 2017
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: puzzle, clone, multiplayer online, open content, sandbox, voxel
|
||||
- Code repository: https://github.com/fogleman/Craft.git
|
||||
|
@ -4,6 +4,7 @@
|
||||
- Inspirations: Flappy Bird
|
||||
- State: mature, inactive since 2017
|
||||
- Play: @see-home
|
||||
- Platform: Web
|
||||
- Keywords: puzzle, remake
|
||||
- Code repository: https://github.com/varunpant/CrappyBird.git
|
||||
- Code language: JavaScript
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://www.descent2.de/, https://sourceforge.net/projects/d2x-xl/
|
||||
- Inspirations: Descent, Descent II
|
||||
- State: mature, inactive since 2015
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: remake, non-free content, shooter
|
||||
- Code repository: https://svn.code.sf.net/p/d2x-xl/code (svn)
|
||||
|
@ -5,7 +5,7 @@
|
||||
- State: mature
|
||||
- Download: https://www.dfworkshop.net/projects/daggerfall-unity/live-builds/
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: remake, role playing, requires additional content
|
||||
- Keywords: remake, role playing, requires original content
|
||||
- Code repository: https://github.com/Interkarma/daggerfall-unity.git
|
||||
- Code language: C#
|
||||
- Code license: MIT
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
- Home: http://www.darkdestiny.at/, http://www.thedarkdestiny.at/portalApp/#/, https://sourceforge.net/projects/darkdestiny/
|
||||
- State: mature, inactive since 2016
|
||||
- Keywords: strategy, multiplayer online + massive, turn based
|
||||
- Keywords: strategy, multiplayer online + massive, turn-based
|
||||
- Code repository: https://gitlab.com/osgames/darkdestiny.git (import of svn), https://svn.code.sf.net/p/darkdestiny/code (svn)
|
||||
- Code language: Java, JavaScript
|
||||
- Code license: ? (GPL version?)
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://scoutshonour.com/digital/
|
||||
- Media: https://web.archive.org/web/20160507142946/https://lgdb.org/game/digital_love_story
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: adventure, visual novel
|
||||
- Code repository: https://gitlab.com/osgames/digitalalovestory.git (copy of version 1.1)
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://emhsoft.com/dh.html, http://savannah.nongnu.org/projects/dragon-hunt
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: role playing
|
||||
- Code repository: https://gitlab.com/osgames/dragon-hunt.git (backup of cvs), http://savannah.nongnu.org/cvs/?group=dragon-hunt (cvs)
|
||||
- Code language: Python
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://www.emhsoft.com/singularity/
|
||||
- State: beta
|
||||
- Download: @see-home
|
||||
- Keywords: strategy
|
||||
- Code repository: https://github.com/singularity/singularity.git
|
||||
- Code language: Python
|
||||
|
@ -4,6 +4,7 @@
|
||||
- Inspirations: Enduro
|
||||
- State: mature
|
||||
- Play: https://rafaelcastrocouto.github.io/enduro/
|
||||
- Platform: Web
|
||||
- Keywords: remake, open content
|
||||
- Code repository: https://github.com/rafaelcastrocouto/enduro.git
|
||||
- Code language: JavaScript
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://fanwor.tuxfamily.org/
|
||||
- Inspirations: Legend of Zelda
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: adventure, remake
|
||||
- Code repository: https://git.tuxfamily.org/fanwor/fanwor.git
|
||||
- Code language: C
|
||||
|
@ -4,6 +4,7 @@
|
||||
- Inspirations: Plasma Pong
|
||||
- State: mature, inactive since 2013
|
||||
- Play: http://anirudhjoshi.github.io/fluid_table_tennis/
|
||||
- Platform: Web
|
||||
- Keywords: arcade, remake, multiplayer competitive + local, open content
|
||||
- Code repository: https://github.com/anirudhjoshi/fluid_table_tennis.git
|
||||
- Code language: JavaScript
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://freeablo.org/
|
||||
- Inspirations: Diablo
|
||||
- State: beta
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: action, remake, role playing, commercial content, requires original content
|
||||
- Code repository: https://github.com/wheybags/freeablo.git
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://sheep.art.pl/Fujo
|
||||
- State: mature, inactive since 2014
|
||||
- Download: @see-home
|
||||
- Keywords: role playing
|
||||
- Code repository: https://gitlab.com/osgames/fujo.git
|
||||
- Code language: Python
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://geshl2.com/
|
||||
- Inspirations: GoldenEye 007
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: action, remake, requires original engine (?), shooter
|
||||
- Code repository: https://github.com/goldeneye-source/ges-code.git
|
||||
- Code language: C, C++
|
||||
|
@ -4,6 +4,7 @@
|
||||
- Inspirations: Flag Catcher
|
||||
- State: mature
|
||||
- Play: https://ceva24.github.io/
|
||||
- Platform: Web
|
||||
- Keywords: puzzle, remake
|
||||
- Code repository: https://github.com/Ceva24/ceva24.github.io.git
|
||||
- Code language: JavaScript
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://www.goblincamp.com/, https://web.archive.org/web/20151106001905/https://bitbucket.org/genericcontainer/goblin-camp
|
||||
- Inspirations: Anno 1404, Dungeon Keeper, Dwarf Fortress
|
||||
- State: beta, inactive since 2012
|
||||
- Download: @see-home
|
||||
- Keywords: strategy
|
||||
- Code repository: https://gitlab.com/osgames/goblin-camp.git, https://github.com/y2s82/goblin_camp.git @add
|
||||
- Code language: C++
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://grobots.sourceforge.net/, https://sourceforge.net/projects/grobots/
|
||||
- State: mature, inactive since 2014
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: simulation, programming
|
||||
- Code repository: http://hg.code.sf.net/p/grobots/trunk (hg), https://gitlab.com/osgames/grobots.git @add
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://harfbuzz.github.io/, https://web.archive.org/web/20200616182117/https://www.freedesktop.org/wiki/Software/HarfBuzz/
|
||||
- Media: https://en.wikipedia.org/wiki/HarfBuzz
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: library
|
||||
- Code repository: https://github.com/harfbuzz/harfbuzz.git
|
||||
- Code language: C++
|
||||
|
@ -3,7 +3,7 @@
|
||||
- Home: https://inexor.org/
|
||||
- Inspirations: Cube 2: Sauerbraten
|
||||
- State: beta, inactive since 2018
|
||||
- Keywords: remake, first person, shooter
|
||||
- Keywords: remake, first-person, shooter
|
||||
- Code repository: https://github.com/inexorgame/vulkan-renderer.git, https://github.com/inexorgame/inexor-core.git @add (@archived)
|
||||
- Code language: C++, JavaScript
|
||||
- Code license: zlib
|
||||
|
@ -4,6 +4,7 @@
|
||||
- Inspirations: Fallout 2
|
||||
- State: beta, inactive since 2017
|
||||
- Play: http://ajxs.github.io/jsFO/ (demo)
|
||||
- Platform: Web
|
||||
- Keywords: remake, role playing, commercial content, requires original content
|
||||
- Code repository: https://github.com/ajxs/jsFO.git
|
||||
- Code language: JavaScript, Python
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://anttisalonen.github.io/kingdoms/
|
||||
- State: beta, inactive since 2014
|
||||
- Download: @see-home
|
||||
- Platform: Linux
|
||||
- Keywords: strategy
|
||||
- Code repository: https://github.com/anttisalonen/kingdoms.git
|
||||
|
@ -4,7 +4,6 @@
|
||||
- Media: https://en.wikipedia.org/wiki/Panzer_General#LGeneral
|
||||
- Inspirations: Panzer General
|
||||
- State: mature, inactive since 2017
|
||||
- Download: @see-home
|
||||
- Platform: Android
|
||||
- Keywords: remake, strategy, turn-based
|
||||
- Code repository: https://github.com/AndO3131/lgeneral.git (mirror), https://svn.code.sf.net/p/lgeneral/code (svn), http://lgeneral.cvs.sourceforge.net (cvs)
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://libpng.org/pub/png/libpng.html, https://libpng.sourceforge.io/
|
||||
- Media: https://en.wikipedia.org/wiki/Libpng
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: library
|
||||
- Code repository: https://github.com/glennrp/libpng.git, https://sourceforge.net/p/libpng/code/ci/master/tree/
|
||||
- Code language: C
|
||||
|
@ -4,7 +4,6 @@
|
||||
- Media: https://en.wikipedia.org/wiki/Lincity
|
||||
- Inspirations: SimCity
|
||||
- State: mature, inactive since 2005
|
||||
- Download: @see-home
|
||||
- Keywords: simulation, clone
|
||||
- Code repository: https://gitlab.com/osgames/lincity.git (backup of cvs), http://lincity.cvs.sourceforge.net/ (cvs)
|
||||
- Code language: C
|
||||
|
@ -4,7 +4,6 @@
|
||||
- Media: https://en.wikipedia.org/wiki/Warlords_(game_series)#LordsAWar!
|
||||
- Inspirations: Warlords II
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: strategy, turn-based
|
||||
- Code repository: https://git.savannah.nongnu.org/git/lordsawar.git
|
||||
- Code language: C++
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: https://love2d.org/
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS, Android, iOS
|
||||
- Keywords: framework
|
||||
- Code repository: https://github.com/love2d/love.git
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://www.asceai.net/meritous/
|
||||
- Media: https://libregamewiki.org/Meritous
|
||||
- State: mature, inactive since 2008
|
||||
- Download: @see-home
|
||||
- Keywords: role playing
|
||||
- Code repository: https://github.com/Nop90-Switch/Meritous-Switch.git (import of version 1.2)
|
||||
- Code language: C
|
||||
|
@ -4,6 +4,7 @@
|
||||
- Inspirations: Minesweeper
|
||||
- State: mature
|
||||
- Play: https://minesweeper.zone/
|
||||
- Platform: Web
|
||||
- Keywords: puzzle, remake, open content
|
||||
- Code repository: https://github.com/reed-jones/minesweeper_js.git
|
||||
- Code language: JavaScript, PHP
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://oitofelix.github.io/mininim/
|
||||
- Inspirations: Prince of Persia
|
||||
- State: beta, inactive since 2017
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux
|
||||
- Keywords: action, remake, open content
|
||||
- Code repository: https://github.com/oitofelix/mininim.git
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://github.com/Ancurio/mkxp
|
||||
- Inspirations: RPG Maker
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: framework, clone
|
||||
- Code repository: https://github.com/Ancurio/mkxp.git
|
||||
- Code language: C++, C
|
||||
|
@ -3,8 +3,7 @@
|
||||
- Home: https://www.netrek.org/, https://sourceforge.net/projects/netrek/, http://mactrek.sourceforge.net/Welcome.html
|
||||
- Media: https://en.wikipedia.org/wiki/Netrek
|
||||
- State: mature, inactive since 2009
|
||||
- Play: https://www.playnetrek.org/
|
||||
- Download: https://www.netrek.org/downloads/
|
||||
- Download: https://www.netrek.org/downloads/, https://www.playnetrek.org/
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: action, multiplayer, online
|
||||
- Code repository: http://netrek.cvs.sourceforge.net (cvs)
|
||||
|
@ -9,8 +9,8 @@
|
||||
- Code repository: https://gitlab.com/osgames/night-hawk.git (conversion of cvs), http://night-hawk.cvs.sourceforge.net (cvs)
|
||||
- Code language: C++
|
||||
- Code license: GPL-2.0
|
||||
- Developer: Jason Nunn, Eric Gillespie
|
||||
- Developer: Jason Nunn, Eric Gillespie (brickviking@GH)
|
||||
|
||||
Remake of Paradroid.
|
||||
Remake of Paradroid. May be uploaded in the future under https://github.com/brickviking
|
||||
|
||||
## Building
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://davidgow.net/keen/omnispeak.html
|
||||
- Inspirations: Commander Keen Series
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: remake, commercial content, requires original content
|
||||
- Code repository: https://github.com/sulix/omnispeak.git
|
||||
- Code language: C
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://runescapeclassic.dev/, https://web.archive.org/web/20200510133848/https://openrsc.com/
|
||||
- Inspirations: Runescape Classic
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS, Android
|
||||
- Keywords: remake, role playing, multiplayer online + massive
|
||||
- Code repository: https://gitlab.com/open-runescape-classic/core.git, https://gitlab.com/open-runescape-classic/single-player.git @add, https://github.com/Open-RSC/Core-Framework.git (mirror)
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://metasepia.icecavern.net/OurPersonalSpace/index.html
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: simulation, visual novel
|
||||
- Code repository: https://github.com/qirien/personal-space.git
|
||||
- Code language: Ren'Py
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://quakeone.com/proquake/
|
||||
- Inspirations: Quake
|
||||
- State: mature, inactive since 2018
|
||||
- Download: @see-home
|
||||
- Keywords: remake
|
||||
- Code repository: @see-home (and https://web.archive.org/web/20200211052147/http://quakeone.com/proquake/older_sources/)
|
||||
- Code language: C
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://sourceware.org/pthreads-win32/
|
||||
- Media: https://en.wikipedia.org/wiki/POSIX_Threads#POSIX_Threads_for_Windows
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: library
|
||||
- Code repository: https://github.com/GerHobbelt/pthread-win32.git (for cvs see home)
|
||||
- Code language: C
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://www.colm.net/open-source/ragel/
|
||||
- Media: https://en.wikipedia.org/wiki/Ragel
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: library
|
||||
- Code repository: git://git.colm.net/ragel.git
|
||||
- Code language: C++
|
||||
|
@ -4,7 +4,6 @@
|
||||
- Media: https://en.wikipedia.org/wiki/Rigs_of_Rods
|
||||
- Inspirations: BeamNG.drive
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Platform: Windows
|
||||
- Keywords: simulation, cars, multiplayer online, open content
|
||||
- Code repository: https://github.com/RigsOfRods/rigs-of-rods.git
|
||||
|
@ -4,7 +4,6 @@
|
||||
- Media: https://en.wikipedia.org/wiki/RuneScape
|
||||
- Inspirations: Old School RuneScape
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: remake, role playing, client, commercial content, multiplayer competitive + online + co-op
|
||||
- Code repository: https://github.com/runelite/runelite.git
|
||||
- Code language: Java
|
||||
|
@ -4,14 +4,13 @@
|
||||
- Media: https://en.wikipedia.org/wiki/Ryzom
|
||||
- Inspirations: Ryzom
|
||||
- State: mature
|
||||
- Play: https://www.ryzom.com/ (commercial)
|
||||
- Keywords: remake, role playing, multiplayer massive + online, requires server (?)
|
||||
- Code repository: https://github.com/ryzom/ryzomcore.git, https://gitlab.com/ryzom/ryzom-core.git (mirror)
|
||||
- Code language: C++
|
||||
- Code license: AGPL-3.0
|
||||
- Assets license: CC
|
||||
|
||||
MMORPG with open world play.
|
||||
MMORPG with open world play. Play at https://www.ryzom.com/ (commercial)
|
||||
|
||||
## Building
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://scrabble.sourceforge.net/wiki/, https://sourceforge.net/projects/scrabble/
|
||||
- State: mature, inactive since 2015
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: board, strategy
|
||||
- Code repository: https://gitlab.com/osgames/scrabble3d.git (conversion of svn), https://github.com/HeikoTietze/scrabble3d.git @add, https://svn.code.sf.net/p/scrabble/code (svn)
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://web.archive.org/web/20200114185344/http://www.linuxmotors.com/SDL_bomber/
|
||||
- Inspirations: Bomberman
|
||||
- State: mature, inactive since 2012
|
||||
- Download: @see-home
|
||||
- Platform: Linux
|
||||
- Keywords: action, remake
|
||||
- Code repository: @see-download
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: https://pyweek.org/e/np8g/
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: adventure
|
||||
- Code repository: https://github.com/blakeohare/pyweek-sentientstorage.git (JavaScript version)
|
||||
- Code language: Python
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: https://stendhalgame.org/, https://sourceforge.net/projects/arianne/
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: role playing, multiplayer, online
|
||||
- Code repository: https://github.com/arianne/stendhal.git, https://git.code.sf.net/p/arianne/stendhal @add
|
||||
- Code language: Java
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://tof.p1x.in/, https://w84death.itch.io/tanks-of-freedom
|
||||
- Inspirations: Advance Wars
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: strategy, clone, multiplayer hotseat + online, open content
|
||||
- Code repository: https://github.com/w84death/Tanks-of-Freedom.git
|
||||
- Code language: GDScript
|
||||
|
@ -4,7 +4,7 @@
|
||||
- Media: https://en.wikipedia.org/wiki/William_Shatner%27s_TekWar
|
||||
- Inspirations: TekWar
|
||||
- State: beta
|
||||
- Keywords: action, remake, commercial content, first person, shooter
|
||||
- Keywords: action, remake, commercial content, first-person, shooter
|
||||
- Code repository: https://gitlab.com/m210/TekwarGDX.git
|
||||
- Code language: Java
|
||||
- Code license: Custom (see buildlic.txt + GPL-3.0)
|
||||
|
@ -3,7 +3,7 @@
|
||||
- Home: http://www.terminal-overload.org/
|
||||
- Inspirations: Revenge Of The Cats: Ethernet
|
||||
- State: beta, inactive since 2016
|
||||
- Keywords: framework, first‐person, open content, shooter
|
||||
- Keywords: framework, first-person, open content, shooter
|
||||
- Code repository: https://github.com/fr1tz/terminal-overload.git
|
||||
- Code language: C++, C, C#
|
||||
- Code license: GPL-3.0
|
||||
|
@ -3,12 +3,12 @@
|
||||
- Home: https://sourceforge.net/projects/epicheroes/
|
||||
- State: beta, inactive since 2015
|
||||
- Download: https://sourceforge.net/projects/epicheroes/files
|
||||
- Keywords: strategy
|
||||
- Keywords: strategy, turn-based, role playing
|
||||
- Code repository: https://git.code.sf.net/p/epicheroes/code, https://gitlab.com/osgames/epicheroes.git @add
|
||||
- Code language: C++
|
||||
- Code license: GPL-3.0
|
||||
|
||||
A cooperative turn-based RPG and Strategy Game where the main goal is to defeat the evil empire.
|
||||
A cooperative game where the main goal is to defeat the evil empire.
|
||||
|
||||
## Building
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
- Media: https://en.wikipedia.org/wiki/Star_Wars:_Dark_Forces
|
||||
- Inspirations: Dark Forces, Outlaws
|
||||
- State: beta
|
||||
- Keywords: action, game engine, remake, commercial content, first person, requires original content, shooter
|
||||
- Keywords: action, game engine, remake, commercial content, first-person, requires original content, shooter
|
||||
- Code repository: https://github.com/luciusDXL/TheForceEngine.git
|
||||
- Code language: C++
|
||||
- Code license: GPL-2.0
|
||||
|
@ -9,6 +9,4 @@
|
||||
- Code language: C
|
||||
- Code license: GPL-2.0
|
||||
|
||||
2D platform game.
|
||||
|
||||
## Building
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://powdertoy.co.uk/
|
||||
- Inspirations: Powder Game
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS, Android
|
||||
- Keywords: simulation, clone, open content
|
||||
- Code repository: https://github.com/The-Powder-Toy/The-Powder-Toy.git
|
||||
|
@ -10,8 +10,7 @@
|
||||
- Code language: C++, AngelScript, JavaScript
|
||||
- Code license: GPL-3.0
|
||||
|
||||
Similar of Spore.
|
||||
Only the Microbe stage is playable now. Really open content?
|
||||
Similar of Spore. Only the Microbe stage is playable now. Really open content?
|
||||
|
||||
## Building
|
||||
|
||||
|
@ -4,7 +4,6 @@
|
||||
- Media: https://en.wikipedia.org/wiki/Total_Annihilation
|
||||
- Inspirations: Total Annihilation
|
||||
- State: beta, inactive since 2017
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: remake, strategy, real time
|
||||
- Code repository: https://github.com/zuzuf/TA3D.git
|
||||
|
@ -4,7 +4,6 @@
|
||||
- Media: https://en.wikipedia.org/wiki/Mad_TV_(video_game)#Remakes
|
||||
- Inspirations: Mad TV
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: remake, strategy
|
||||
- Code repository: https://github.com/TVTower/TVTower.git
|
||||
- Code language: BlitzMax, Lua
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: http://ufo2000.sourceforge.net/
|
||||
- Inspirations: UFO: Enemy Unknown, X-COM: Apocalypse, X-COM: Terror from the Deep, X-COM: UFO Defense
|
||||
- State: mature, inactive since 2012
|
||||
- Download: @see-home
|
||||
- Keywords: remake, strategy
|
||||
- Code repository: https://github.com/ufo2000/ufo2000.git (mirror of svn), https://svn.code.sf.net/p/ufo2000/code (svn)
|
||||
- Code language: C, C++, Lua
|
||||
|
@ -4,7 +4,7 @@
|
||||
- Inspirations: Command & Conquer, Command & Conquer: Red Alert
|
||||
- State: mature
|
||||
- Platform: Windows, Linux
|
||||
- Keywords: remake, strategy, commercial content, realtime, requires original content
|
||||
- Keywords: remake, strategy, commercial content, real time, requires original content
|
||||
- Code repository: https://github.com/Vanilla-Conquer/Vanilla-Conquer.git, https://github.com/electronicarts/CnC_Remastered_Collection.git @add
|
||||
- Code language: C, C++, Assembly
|
||||
- Code license: GPL-3.0
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://vcmi.eu/, https://sourceforge.net/projects/vcmi/
|
||||
- Inspirations: Heroes of Might and Magic III
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: remake, strategy, commercial content, requires original content
|
||||
- Code repository: https://github.com/vcmi/vcmi.git, https://svn.code.sf.net/p/vcmi/code (svn)
|
||||
- Code language: C++
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://vdrift.net/, https://sourceforge.net/projects/vdrift/
|
||||
- State: mature, inactive since 2014
|
||||
- Download: @see-home
|
||||
- Platform: Windows, Linux, macOS
|
||||
- Keywords: simulation, cars, racing
|
||||
- Code repository: https://github.com/VDrift/vdrift.git, https://svn.code.sf.net/p/vdrift/code (svn)
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
- Home: http://adonthell.nongnu.org/download/index.html
|
||||
- State: beta
|
||||
- Download: @see-home
|
||||
- Keywords: role playing
|
||||
- Code repository: https://git.savannah.gnu.org/git/adonthell/adonthell-wastesedge.git
|
||||
- Code language: Python
|
||||
|
@ -3,7 +3,6 @@
|
||||
- Home: https://tukaani.org/xz/
|
||||
- Media: https://en.wikipedia.org/wiki/XZ_Utils
|
||||
- State: mature
|
||||
- Download: @see-home
|
||||
- Keywords: library
|
||||
- Code repository: https://git.tukaani.org/xz.git (https://git.tukaani.org/?p=xz.git)
|
||||
- Code language: C
|
||||
|
178
statistics.md
178
statistics.md
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user