new entries and reorganization of python scripts (added git archive)
This commit is contained in:
@ -1,468 +0,0 @@
|
||||
"""
|
||||
Counts the number of records each subfolder and updates the overview. Sorts the entries in the contents files of
|
||||
each sub folder alphabetically.
|
||||
|
||||
This script runs with Python 3, it could also with Python 2 with some minor tweaks probably, but that's not important.
|
||||
|
||||
TODO get number of games with github or bitbucket repository and list those who have neither
|
||||
TODO Which C, C++ projects do not use CMake
|
||||
TODO for those games with github repositories get activity, number of open issues, number of merge requests and display in a health monitor file
|
||||
TODO search for ?? and replace with either nothing or missing information
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import urllib.request
|
||||
import http.client
|
||||
import datetime
|
||||
|
||||
def get_category_paths():
|
||||
"""
|
||||
Returns all sub folders of the games path.
|
||||
"""
|
||||
return [os.path.join(games_path, x) for x in os.listdir(games_path) if os.path.isdir(os.path.join(games_path, x))]
|
||||
|
||||
def get_entry_paths(category_path):
|
||||
"""
|
||||
Returns all files of a category path, except for '_toc.md'.
|
||||
"""
|
||||
return [os.path.join(category_path, x) for x in os.listdir(category_path) if x != '_toc.md' and os.path.isfile(os.path.join(category_path, x))]
|
||||
|
||||
def read_first_line_from_file(file):
|
||||
"""
|
||||
Convenience function because we only need the first line of a category overview really.
|
||||
"""
|
||||
with open(file, 'r') as f:
|
||||
line = f.readline()
|
||||
return line
|
||||
|
||||
def read_interesting_info_from_file(file):
|
||||
"""
|
||||
Parses a file for some interesting fields and concatenates the content. To be displayed after the game name in the
|
||||
category overview.
|
||||
"""
|
||||
with open(file, 'r') as f:
|
||||
text = f.read()
|
||||
|
||||
output = [None, None, None]
|
||||
|
||||
# language
|
||||
regex = re.compile(r"- Language\(s\): (.*)")
|
||||
matches = regex.findall(text)
|
||||
if matches:
|
||||
output[0] = matches[0]
|
||||
|
||||
# license
|
||||
regex = re.compile(r"- License: (.*)")
|
||||
matches = regex.findall(text)
|
||||
if matches:
|
||||
output[1] = matches[0]
|
||||
|
||||
# state
|
||||
regex = re.compile(r"- State: (.*)")
|
||||
matches = regex.findall(text)
|
||||
if matches:
|
||||
output[2] = matches[0]
|
||||
|
||||
output = [x for x in output if x] # eliminate empty entries
|
||||
|
||||
output = ", ".join(output)
|
||||
|
||||
return output
|
||||
|
||||
|
||||
def update_readme():
|
||||
"""
|
||||
Recounts entries in sub categories and writes them to the readme. Needs to be performed regularly.
|
||||
"""
|
||||
print('update readme file')
|
||||
|
||||
# read readme
|
||||
with open(readme_path) as f:
|
||||
readme_text = f.read()
|
||||
|
||||
# compile regex for identifying the building blocks
|
||||
regex = re.compile(r"(# Open Source Games\n\n)(.*)(\nA collection.*)", re.DOTALL)
|
||||
|
||||
# apply regex
|
||||
matches = regex.findall(readme_text)
|
||||
matches = matches[0]
|
||||
start = matches[0]
|
||||
end = matches[2]
|
||||
|
||||
# get sub folders
|
||||
category_paths = get_category_paths()
|
||||
|
||||
# get number of files (minus 1) in each sub folder
|
||||
n = [len(os.listdir(path)) - 1 for path in category_paths]
|
||||
|
||||
# assemble paths
|
||||
paths = [os.path.join(path, '_toc.md') for path in category_paths]
|
||||
|
||||
# get titles (discarding first two ("# ") and last ("\n") characters)
|
||||
titles = [read_first_line_from_file(path)[2:-1] for path in paths]
|
||||
|
||||
# combine titles, category names, numbers in one list
|
||||
info = zip(titles, [os.path.basename(path) for path in category_paths], n)
|
||||
|
||||
# sort according to sub category title (should be unique)
|
||||
info = sorted(info, key=lambda x:x[0])
|
||||
|
||||
# assemble output
|
||||
update = ['- **[{}](games/{}/_toc.md)** ({})\n'.format(*entry) for entry in info]
|
||||
update = "{} entries\n".format(sum(n)) + "".join(update)
|
||||
|
||||
# insert new text in the middle
|
||||
text = start + "[comment]: # (start of autogenerated content, do not edit)\n" + update + "\n[comment]: # (end of autogenerated content)" + end
|
||||
|
||||
# write to readme
|
||||
with open(readme_path, 'w') as f:
|
||||
f.write(text)
|
||||
|
||||
def update_category_tocs():
|
||||
"""
|
||||
Lists all entries in all sub folders and generates the list in the toc file. Needs to be performed regularly.
|
||||
"""
|
||||
# get category paths
|
||||
category_paths = get_category_paths()
|
||||
|
||||
# for each category
|
||||
for category_path in category_paths:
|
||||
print('generate toc for {}'.format(os.path.basename(category_path)))
|
||||
|
||||
# read toc header line
|
||||
toc_file = os.path.join(category_path, '_toc.md')
|
||||
toc_header = read_first_line_from_file(toc_file)
|
||||
|
||||
# get paths of all entries in this category
|
||||
entry_paths = get_entry_paths(category_path)
|
||||
|
||||
# get titles (discarding first two ("# ") and last ("\n") characters)
|
||||
titles = [read_first_line_from_file(path)[2:-1] for path in entry_paths]
|
||||
|
||||
# get more interesting info
|
||||
more = [read_interesting_info_from_file(path) for path in entry_paths]
|
||||
|
||||
# combine name and file name
|
||||
info = zip(titles, [os.path.basename(path) for path in entry_paths], more)
|
||||
|
||||
# sort according to entry title (should be unique)
|
||||
info = sorted(info, key=lambda x:x[0])
|
||||
|
||||
# assemble output
|
||||
update = ['- **[{}]({})** ({})\n'.format(*entry) for entry in info]
|
||||
update = "".join(update)
|
||||
|
||||
# combine toc header
|
||||
text = toc_header + '\n' + "[comment]: # (start of autogenerated content, do not edit)\n" + update + "\n[comment]: # (end of autogenerated content)"
|
||||
|
||||
# write to toc file
|
||||
with open(toc_file, 'w') as f:
|
||||
f.write(text)
|
||||
|
||||
def check_validity_external_links():
|
||||
"""
|
||||
Checks all external links it can find for validity. Prints those with non OK HTTP responses. Does only need to be run
|
||||
from time to time.
|
||||
"""
|
||||
# regex for finding urls (can be in <> or in () or a whitespace
|
||||
regex = re.compile(r"[\s\n]<(http.+?)>|\]\((http.+?)\)|[\s\n](http[^\s\n]+)")
|
||||
|
||||
# count
|
||||
number_checked_links = 0
|
||||
|
||||
# get category paths
|
||||
category_paths = get_category_paths()
|
||||
|
||||
# for each category
|
||||
for category_path in category_paths:
|
||||
print('check links for {}'.format(os.path.basename(category_path)))
|
||||
|
||||
# get entry paths
|
||||
entry_paths = get_entry_paths(category_path)
|
||||
|
||||
# for each entry
|
||||
for entry_path in entry_paths:
|
||||
# read entry
|
||||
with open(entry_path, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# apply regex
|
||||
matches = regex.findall(content)
|
||||
|
||||
# for each match
|
||||
for match in matches:
|
||||
|
||||
# for each possible clause
|
||||
for url in match:
|
||||
|
||||
# if there was something
|
||||
if url:
|
||||
try:
|
||||
# without a special headers, frequent 403 responses occur
|
||||
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'})
|
||||
urllib.request.urlopen(req)
|
||||
except urllib.error.HTTPError as e:
|
||||
print("{}: {} - {}".format(os.path.basename(entry_path), url, e.code))
|
||||
except http.client.RemoteDisconnected:
|
||||
print("{}: {} - disconnected without response".format(os.path.basename(entry_path), url))
|
||||
|
||||
number_checked_links += 1
|
||||
|
||||
if number_checked_links % 50 == 0:
|
||||
print("{} links checked".format(number_checked_links))
|
||||
|
||||
print("{} links checked".format(number_checked_links))
|
||||
|
||||
def fix_notation():
|
||||
"""
|
||||
Changes notation, quite special. Only run when needed.
|
||||
"""
|
||||
regex = re.compile(r"- License details:(.*)")
|
||||
|
||||
# get category paths
|
||||
category_paths = get_category_paths()
|
||||
|
||||
# for each category
|
||||
for category_path in category_paths:
|
||||
# get paths of all entries in this category
|
||||
entry_paths = get_entry_paths(category_path)
|
||||
|
||||
for entry_path in entry_paths:
|
||||
# read it line by line
|
||||
with open(entry_path) as f:
|
||||
content = f.readlines()
|
||||
|
||||
# apply regex on every line
|
||||
matched_lines = [regex.findall(line) for line in content]
|
||||
|
||||
# loop over all the lines
|
||||
for line, match in enumerate(matched_lines):
|
||||
if match:
|
||||
match = match[0]
|
||||
|
||||
# patch content
|
||||
content[line] = "- Code license details:{}\n".format(match)
|
||||
|
||||
# write it line by line
|
||||
with open(entry_path, "w") as f:
|
||||
f.writelines(content)
|
||||
|
||||
def regular_replacements():
|
||||
"""
|
||||
Replacing some stuff by shortcuts. Can be run regularly
|
||||
"""
|
||||
# get category paths
|
||||
category_paths = get_category_paths()
|
||||
|
||||
# for each category
|
||||
for category_path in category_paths:
|
||||
# get paths of all entries in this category
|
||||
entry_paths = get_entry_paths(category_path)
|
||||
|
||||
for entry_path in entry_paths:
|
||||
# read it line by line
|
||||
with open(entry_path) as f:
|
||||
content = f.read()
|
||||
|
||||
# now the replacements
|
||||
content = content.replace('?source=navbar', '') # sourceforge specific
|
||||
content = content.replace('single player', 'SP')
|
||||
content = content.replace('multi player', 'MP')
|
||||
|
||||
# write it line by line
|
||||
with open(entry_path, "w") as f:
|
||||
f.write(content)
|
||||
|
||||
def check_template_leftovers():
|
||||
"""
|
||||
Checks for template leftovers.
|
||||
"""
|
||||
check_strings = ['# {NAME}', '_{One line description}_', '- Home: {URL}', '- Media: {URL}', '- Download: {URL}', '- State: beta, mature, inactive since', '- Keywords: SP, MP, RTS, TBS (if none, remove the line)', '- Code: primary repository (type if not git), other repositories (type if not git)', '- Language(s): {XX}', '- License: {XX} (if special, include link)', '{XXX}']
|
||||
|
||||
# get category paths
|
||||
category_paths = get_category_paths()
|
||||
|
||||
# for each category
|
||||
for category_path in category_paths:
|
||||
# get paths of all entries in this category
|
||||
entry_paths = get_entry_paths(category_path)
|
||||
|
||||
for entry_path in entry_paths:
|
||||
# read it line by line
|
||||
with open(entry_path) as f:
|
||||
content = f.read()
|
||||
|
||||
for check_string in check_strings:
|
||||
if content.find(check_string) >= 0:
|
||||
print('{}: found {}'.format(os.path.basename(entry_path), check_string))
|
||||
|
||||
def parse_entry(content):
|
||||
"""
|
||||
Returns a dictionary of the features of the content
|
||||
"""
|
||||
|
||||
info = {}
|
||||
|
||||
# state
|
||||
regex = re.compile(r"- State: (.*)")
|
||||
matches = regex.findall(content)
|
||||
if matches:
|
||||
# first remove everything in parenthesis
|
||||
states = re.sub(r'\([^)]*\)', '', matches[0])
|
||||
states = states.split(',')
|
||||
states = [x.strip() for x in states]
|
||||
if 'beta' in states:
|
||||
info['state'] = 'beta'
|
||||
elif 'mature' in states:
|
||||
info['state'] = 'mature'
|
||||
else:
|
||||
print('Neither beta nor mature in state tag: {}'.format(content))
|
||||
inactive = next((int(x[14:]) for x in states if x.startswith('inactive since')), None) # only the year
|
||||
if inactive:
|
||||
info['inactive'] = inactive
|
||||
|
||||
# language
|
||||
regex = re.compile(r"- Language\(s\): (.*)")
|
||||
matches = regex.findall(content)
|
||||
if matches:
|
||||
languages = matches[0].split(',')
|
||||
languages = [x.strip() for x in languages]
|
||||
info['language'] = languages
|
||||
|
||||
# license
|
||||
regex = re.compile(r"- Code license: (.*)")
|
||||
matches = regex.findall(content)
|
||||
if matches:
|
||||
# first remove everything in parenthesis
|
||||
license = re.sub(r'\([^)]*\)', '', matches[0])
|
||||
info['license'] = license
|
||||
|
||||
return info
|
||||
|
||||
|
||||
def generate_statistics():
|
||||
"""
|
||||
|
||||
"""
|
||||
statistics_path = os.path.join(games_path, 'statistics.md')
|
||||
statistics = '[comment]: # (autogenerated content, do not edit)\n# Statistics\n\n'
|
||||
|
||||
# get category paths
|
||||
category_paths = get_category_paths()
|
||||
|
||||
# for each category
|
||||
infos = []
|
||||
for category_path in category_paths:
|
||||
# get paths of all entries in this category
|
||||
entry_paths = get_entry_paths(category_path)
|
||||
|
||||
for entry_path in entry_paths:
|
||||
# read it line by line
|
||||
with open(entry_path) as f:
|
||||
content = f.read()
|
||||
|
||||
info = parse_entry(content)
|
||||
info['file'] = os.path.basename(entry_path)[:-3] # [:-3] to cut off the .md
|
||||
infos.append(info)
|
||||
|
||||
# total number
|
||||
number_entries = len(infos)
|
||||
rel = lambda x: x / number_entries * 100 # converion to percent
|
||||
statistics += 'analyzed {} entries on {}\n\n'.format(number_entries, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
|
||||
|
||||
# State (beta, mature, inactive)
|
||||
statistics += '## State\n\n'
|
||||
|
||||
number_state_beta = sum(1 for x in infos if 'state' in x and x['state'] == 'beta')
|
||||
number_state_mature = sum(1 for x in infos if 'state' in x and x['state'] == 'mature')
|
||||
number_inactive = sum(1 for x in infos if 'inactive' in x)
|
||||
statistics += '- mature: {} ({:.1f}%)\n- beta: {} ({:.1f}%)\n- inactive: {} ({:.1f}%)\n\n'.format(number_state_mature, rel(number_state_mature), number_state_beta, rel(number_state_beta), number_inactive, rel(number_inactive))
|
||||
|
||||
if number_inactive > 0:
|
||||
entries_inactive = [(x['file'], x['inactive']) for x in infos if 'inactive' in x]
|
||||
entries_inactive.sort(key=lambda x: x[0]) # first sort by name
|
||||
entries_inactive.sort(key=lambda x: -x[1]) # then sort by inactive year (more recently first)
|
||||
entries_inactive = ['{} ({})'.format(*x) for x in entries_inactive]
|
||||
statistics += '##### Inactive State\n\n' + ', '.join(entries_inactive) + '\n\n'
|
||||
|
||||
entries_no_state = [x['file'] for x in infos if 'state' not in x]
|
||||
if entries_no_state:
|
||||
entries_no_state.sort()
|
||||
statistics += '##### Without state tag ({})\n\n'.format(len(entries_no_state)) + ', '.join(entries_no_state) + '\n\n'
|
||||
|
||||
# Language
|
||||
statistics += '## Languages\n\n'
|
||||
number_no_language = sum(1 for x in infos if 'language' not in x)
|
||||
if number_no_language > 0:
|
||||
statistics += 'Without language tag: {} ({:.1f}%)\n\n'.format(number_no_language, rel(number_no_language))
|
||||
entries_no_language = [x['file'] for x in infos if 'language' not in x]
|
||||
entries_no_language.sort()
|
||||
statistics += ', '.join(entries_no_language) + '\n\n'
|
||||
|
||||
# get all languages together
|
||||
languages = []
|
||||
for info in infos:
|
||||
if 'language' in info:
|
||||
languages.extend(info['language'])
|
||||
|
||||
unique_languages = set(languages)
|
||||
unique_languages = [(l, languages.count(l) / len(languages)) for l in unique_languages]
|
||||
unique_languages.sort(key=lambda x: x[0]) # first sort by name
|
||||
unique_languages.sort(key=lambda x: -x[1]) # then sort by occurrence (highest occurrence first)
|
||||
unique_languages = ['- {} ({:.1f}%)\n'.format(x[0], x[1]*100) for x in unique_languages]
|
||||
statistics += '##### Language frequency\n\n' + ''.join(unique_languages) + '\n'
|
||||
|
||||
# Licenses
|
||||
statistics += '## Code licenses\n\n'
|
||||
number_no_license = sum(1 for x in infos if 'license' not in x)
|
||||
if number_no_license > 0:
|
||||
statistics += 'Without license tag: {} ({:.1f}%)\n\n'.format(number_no_license, rel(number_no_license))
|
||||
entries_no_license = [x['file'] for x in infos if 'license' not in x]
|
||||
entries_no_license.sort()
|
||||
statistics += ', '.join(entries_no_license) + '\n\n'
|
||||
|
||||
# get all licenses together
|
||||
licenses = []
|
||||
for info in infos:
|
||||
if 'license' in info:
|
||||
licenses.append(info['license'])
|
||||
|
||||
unique_licenses = set(licenses)
|
||||
unique_licenses = [(l, licenses.count(l) / len(licenses)) for l in unique_licenses]
|
||||
unique_licenses.sort(key=lambda x: x[0]) # first sort by name
|
||||
unique_licenses.sort(key=lambda x: -x[1]) # then sort by occurrence (highest occurrence first)
|
||||
unique_licenses = ['- {} ({:.1f}%)\n'.format(x[0], x[1]*100) for x in unique_licenses]
|
||||
statistics += '##### Licenses frequency\n\n' + ''.join(unique_licenses) + '\n'
|
||||
|
||||
with open(statistics_path, 'w') as f:
|
||||
f.write(statistics)
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# paths
|
||||
games_path = os.path.abspath(os.path.dirname(__file__))
|
||||
readme_path = os.path.join(games_path, os.pardir, 'README.md')
|
||||
|
||||
# recount and write to readme
|
||||
update_readme()
|
||||
|
||||
# generate list in toc files
|
||||
update_category_tocs()
|
||||
|
||||
# generate report
|
||||
generate_statistics()
|
||||
|
||||
# check for unfilled template lines
|
||||
# check_template_leftovers()
|
||||
|
||||
# check external links (only rarely)
|
||||
#check_validity_external_links()
|
||||
|
||||
# special, only run when needed
|
||||
# fix_notation()
|
||||
|
||||
# regular replacements
|
||||
#regular_replacements()
|
@ -9,6 +9,7 @@
|
||||
- **[Open Rails](open_rails.md)** (C#, GPL-3.0, mature)
|
||||
- **[Open Transport Tycoon](open_transport_tycoon.md)** (C++, mature)
|
||||
- **[OpenCity](open_city.md)** (C++, beta)
|
||||
- **[OpenSkyscraper](open_skyscraper.md)** (C++, GPL-2.0, beta)
|
||||
- **[Our Personal Space](our_personal_space.md)** (Ren'py)
|
||||
- **[Pioneer](pioneer.md)** (C++, C, mature)
|
||||
- **[SimuTrans](simutrans.md)** (C++, mature)
|
||||
|
13
games/simulation/open_skyscraper.md
Normal file
13
games/simulation/open_skyscraper.md
Normal file
@ -0,0 +1,13 @@
|
||||
# OpenSkyscraper
|
||||
|
||||
_Tower simulation game inspired by SimTower._
|
||||
|
||||
- Home: https://github.com/fabianschuiki/OpenSkyscraper
|
||||
- State: beta
|
||||
- Keywords: remake
|
||||
- Code: https://github.com/fabianschuiki/OpenSkyscraper
|
||||
- Language(s): C++
|
||||
- License: GPL-2.0
|
||||
|
||||
## Building
|
||||
|
@ -1,17 +1,17 @@
|
||||
[comment]: # (autogenerated content, do not edit)
|
||||
# Statistics
|
||||
|
||||
analyzed 301 entries on 2018-05-31 08:51:17
|
||||
analyzed 310 entries on 2018-06-01 09:22:11
|
||||
|
||||
## State
|
||||
|
||||
- mature: 139 (46.2%)
|
||||
- beta: 115 (38.2%)
|
||||
- inactive: 107 (35.5%)
|
||||
- mature: 141 (45.5%)
|
||||
- beta: 122 (39.4%)
|
||||
- inactive: 111 (35.8%)
|
||||
|
||||
##### Inactive State
|
||||
|
||||
zoc (2017), dark_destiny (2016), dnt (2016), polis (2016), wargame (2016), egoboo (2015), epic_of_heroes (2015), free_heroes2_engine (2015), mewl (2015), project_helena (2015), roguish (2015), argentum_online (2014), battles_of_antargis (2014), drop_shock (2014), hale (2014), heroes_of_wing_commander (2014), kingdoms (2014), lips_of_suna (2014), open_tibia (2014), openrpgmaker (2014), rpge (2014), sintel (2014), summoming_wars (2014), turious (2014), xenowar (2014), c_evo (2013), mpango (2013), openrpg (2013), trinity_reign (2013), vegatrek (2013), blacknova_traders (2012), conquests (2012), dark_city (2012), hexwar (2012), outer_space (2012), parpg (2012), solar_empire (2012), thousand_parsec (2012), age_of_magic (2011), atlantis (2011), battlefield_java (2011), dawn (2011), galaxymage_redux (2011), kobolds_quest_2 (2011), kq_lives (2011), open_moo2 (2011), project_diaspora (2011), runesword_ii (2011), song_of_albion (2011), star_control_2 (2011), world_of_phaos (2011), x-force (2011), ai_wars (2010), labyrinth_of_worlds (2010), mercenary_commander (2010), open_homm (2010), radakan (2010), singularity (2010), skrupel (2010), slay (2010), space_trader_for_java (2010), 8kingdoms (2009), alien_assault_traders (2009), annchienta (2009), begin2 (2009), blitzkrieg (2009), dark_oberon (2009), duel_commander (2009), fall_of_imiryn (2009), freetrain (2009), glest (2009), goblin_hack (2009), open_pop (2009), world_of_heroes (2009), a_planets_revenge (2008), attal (2008), freestars (2008), mars_land_of_no_mercy (2008), moopy (2008), sengoky_warring_states_of_japan (2008), space_opera (2008), space_trader_for_windows (2008), armies (2007), silvertree (2007), arthurs_knights (2006), boson (2006), crown_and_cutless (2006), eleconics (2006), jquest (2006), metal_mech (2006), underworld_adventures (2006), galaxyng (2005), h_world (2005), spice_trade (2005), colonization_too (2004), geewhiz (2004), openglad (2004), promisance (2004), t_bots (2004), antichess (2003), civil (2003), machinations (2003), planetary_hoppers (2003), wargamer (2003), umbra (2002), civil_war (2001), operation_citadel (2000)
|
||||
zoc (2017), dark_destiny (2016), dnt (2016), freerct (2016), polis (2016), wargame (2016), egoboo (2015), epic_of_heroes (2015), free_heroes2_engine (2015), mewl (2015), project_helena (2015), roguish (2015), argentum_online (2014), battles_of_antargis (2014), drop_shock (2014), eternalwinterwars (2014), farcolony (2014), hale (2014), heroes_of_wing_commander (2014), kingdoms (2014), lips_of_suna (2014), open_tibia (2014), openrpgmaker (2014), rpge (2014), sintel (2014), summoming_wars (2014), turious (2014), xenowar (2014), c_evo (2013), mpango (2013), openrpg (2013), trinity_reign (2013), vegatrek (2013), blacknova_traders (2012), conquests (2012), dark_city (2012), golbin_camp (2012), hexwar (2012), outer_space (2012), parpg (2012), solar_empire (2012), thousand_parsec (2012), age_of_magic (2011), atlantis (2011), battlefield_java (2011), dawn (2011), galaxymage_redux (2011), kobolds_quest_2 (2011), kq_lives (2011), open_moo2 (2011), project_diaspora (2011), runesword_ii (2011), song_of_albion (2011), star_control_2 (2011), world_of_phaos (2011), x-force (2011), ai_wars (2010), labyrinth_of_worlds (2010), mercenary_commander (2010), open_homm (2010), radakan (2010), singularity (2010), skrupel (2010), slay (2010), space_trader_for_java (2010), 8kingdoms (2009), alien_assault_traders (2009), annchienta (2009), begin2 (2009), blitzkrieg (2009), dark_oberon (2009), duel_commander (2009), fall_of_imiryn (2009), freetrain (2009), glest (2009), goblin_hack (2009), open_pop (2009), world_of_heroes (2009), a_planets_revenge (2008), attal (2008), freestars (2008), mars_land_of_no_mercy (2008), moopy (2008), sengoky_warring_states_of_japan (2008), space_opera (2008), space_trader_for_windows (2008), armies (2007), silvertree (2007), arthurs_knights (2006), boson (2006), crown_and_cutless (2006), eleconics (2006), jquest (2006), metal_mech (2006), underworld_adventures (2006), galaxyng (2005), h_world (2005), spice_trade (2005), colonization_too (2004), geewhiz (2004), openglad (2004), promisance (2004), t_bots (2004), antichess (2003), civil (2003), machinations (2003), planetary_hoppers (2003), wargamer (2003), umbra (2002), civil_war (2001), operation_citadel (2000)
|
||||
|
||||
##### Without state tag (47)
|
||||
|
||||
@ -19,24 +19,25 @@ zoc (2017), dark_destiny (2016), dnt (2016), polis (2016), wargame (2016), egobo
|
||||
|
||||
## Languages
|
||||
|
||||
Without language tag: 19 (6.3%)
|
||||
Without language tag: 19 (6.1%)
|
||||
|
||||
civil_war, crimson_fields, dragon_history, evol_online, imperium, land_of_fire, machinations, meritous, murder_in_the_public_domain, open_general, open_moo2, openal, openrpgmaker, parpg, solaris, space_station_13, star_maiden_rio, vegatrek, xconq
|
||||
|
||||
##### Language frequency
|
||||
|
||||
- C++ (36.8%)
|
||||
- C (20.2%)
|
||||
- Java (11.7%)
|
||||
- Python (8.5%)
|
||||
- Lua (4.7%)
|
||||
- Javascript (3.5%)
|
||||
- C# (2.9%)
|
||||
- PHP (2.9%)
|
||||
- Ren'py (1.2%)
|
||||
- C++ (37.5%)
|
||||
- C (19.6%)
|
||||
- Java (11.6%)
|
||||
- Python (8.2%)
|
||||
- Lua (4.8%)
|
||||
- Javascript (3.4%)
|
||||
- PHP (3.1%)
|
||||
- C# (2.8%)
|
||||
- Ren'py (1.1%)
|
||||
- Haxe (0.9%)
|
||||
- Delphi (0.6%)
|
||||
- Delphi Pascal (0.6%)
|
||||
- Pascal (0.6%)
|
||||
- ActionScript (0.3%)
|
||||
- Ada (0.3%)
|
||||
- Angelscript (0.3%)
|
||||
@ -48,7 +49,6 @@ civil_war, crimson_fields, dragon_history, evol_online, imperium, land_of_fire,
|
||||
- Kotlin (0.3%)
|
||||
- Lazarus (0.3%)
|
||||
- Objective C (0.3%)
|
||||
- Pascal (0.3%)
|
||||
- Ruby (0.3%)
|
||||
- Rust (0.3%)
|
||||
- Text (0.3%)
|
||||
@ -59,9 +59,9 @@ civil_war, crimson_fields, dragon_history, evol_online, imperium, land_of_fire,
|
||||
|
||||
## Code licenses
|
||||
|
||||
Without license tag: 132 (43.9%)
|
||||
Without license tag: 141 (45.5%)
|
||||
|
||||
8kingdoms, a_planets_revenge, age_of_magic, ai_wars, alien_assault_traders, ancient_beast, antichess, armies, arthurs_knights, atlantis, atrinik, attal, battlefield_java, battles_of_antargis, begin2, blacknova_traders, blitzkrieg, boson, c_evo, caesar_ia, call_to_power2, camelia_girls, catch_challenger, civil_war, civone, clou, colonization_too, conquests, crimson_fields, dark_destiny, dark_oberon, digital, dragon_hunt, drop_shock, duel_commander, eleconics, epic_of_heroes, epoh, evil_cult, evol_online, first_strike, free_heroes2_engine, free_space_colonization, freelords, freerails, freeserf, freespace_colonization, freestars, freetrain, galaxymage_redux, galaxyng, geewhiz, h_world, harris, heroes_of_wesnoth, heroes_of_wing_commander, hexwar, imperium, jagged_alliance2, jquest, jsettlers, kingdoms, knights_and_merchants_remake, kobolds_quest_2, kq_lives, labyrinth_of_worlds, land_of_fire, machinations, mars_land_of_no_mercy, mercenary_commander, meritous, metal_mech, mewl, moopy, mpango, open_general, open_homm, open_moo2, open_panzer, open_pop, open_rails, openglad, openrpg, openrpgmaker, operation_citadel, other_life, outer_space, parpg, pioneers, planetary_hoppers, polis, project_helena, promisance, runesword_ii, scorched_moon, sengoky_warring_states_of_japan, settlers_iii_remake, simple_solitaire, sintel, skrupel, slay, solar_empire, solaris, song_of_albion, space_faring, space_opera, space_station_13, space_trader_for_java, space_trader_for_windows, space_war, spice_trade, star_maiden_rio, stars_nova, supremacy, t_bots, theme_hospital, thousand_parsec, turious, tvtower, underworld_adventures, vcmi, war_of_kingdom, wargame, wargamer, wargus, warzone_2100, wastes_edge, wolfpack_empire, world_of_heroes, x-force, xenowar, zoc
|
||||
8kingdoms, a_planets_revenge, age_of_magic, ai_wars, alien_assault_traders, ancient_beast, antichess, armies, arthurs_knights, atlantis, atrinik, attal, battlefield_java, battles_of_antargis, begin2, blacknova_traders, blitzkrieg, boson, c_evo, caesar_ia, call_to_power2, camelia_girls, catch_challenger, civil_war, civone, clou, colobot, colonization_too, conquests, crimson_fields, dark_destiny, dark_oberon, devana, digital, dragon_hunt, drop_shock, duel_commander, eleconics, epic_of_heroes, epoh, eternalwinterwars, evil_cult, evol_online, farcolony, first_strike, free_heroes2_engine, free_space_colonization, freelords, freerails, freerct, freeserf, freespace_colonization, freestars, freetrain, galaxymage_redux, galaxyng, geewhiz, golbin_camp, h_world, harris, heroes_of_wesnoth, heroes_of_wing_commander, hexwar, imperium, jagged_alliance2, jquest, jsettlers, kingdoms, knights_and_merchants_remake, kobolds_quest_2, kq_lives, labyrinth_of_worlds, land_of_fire, machinations, mars_land_of_no_mercy, mercenary_commander, meritous, metal_mech, mewl, moopy, mpango, open_general, open_homm, open_moo2, open_panzer, open_pop, open_rails, open_rct2, open_skyscraper, openglad, openrpg, openrpgmaker, operation_citadel, other_life, outer_space, parpg, pioneers, planetary_hoppers, polis, project_helena, promisance, runesword_ii, scorched_moon, sengoky_warring_states_of_japan, settlers_iii_remake, simple_solitaire, sintel, skrupel, slay, solar_empire, solaris, song_of_albion, space_faring, space_opera, space_station_13, space_trader_for_java, space_trader_for_windows, space_war, spice_trade, star_maiden_rio, stars_nova, supremacy, t_bots, theme_hospital, thousand_parsec, turious, tvtower, underworld_adventures, vcmi, war_of_kingdom, wargame, wargamer, wargus, warzone_2100, wastes_edge, wolfpack_empire, world_of_heroes, wyrmsun, x-force, xenowar, zoc
|
||||
|
||||
##### Licenses frequency
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
- **[Call to Power 2](call_to_power2.md)** (C++, Custom (Activision CTP2 source EULA), mature)
|
||||
- **[CivOne](civone.md)** (C#, CC0, beta)
|
||||
- **[Civil](civil.md)** (Python, beta, inactive since 2003)
|
||||
- **[Colobot](colobot.md)** (C++, GPL-3.0, mature)
|
||||
- **[Colonization too](colonization_too.md)** (C++, GPL-2.0, beta, inactive since 2004)
|
||||
- **[Conquests](conquests.md)** (C++, GPL-2.0, mature, inactive since 2012)
|
||||
- **[Corsix Theme Hospital](theme_hospital.md)** (Lua, C++, MIT, mature)
|
||||
@ -33,12 +34,15 @@
|
||||
- **[Crown and Cutless](crown_and_cutless.md)** (C++, beta, inactive since 2006)
|
||||
- **[Dark Destiny](dark_destiny.md)** (Java, unclear, mature, inactive since 2016)
|
||||
- **[Dark Oberon](dark_oberon.md)** (C++, GPL-2.0, mature, inactive since 2009)
|
||||
- **[Devana](devana.md)** (PHP, BSD, beta)
|
||||
- **[Drop Shock](drop_shock.md)** (PHP, mature, inactive since 2014)
|
||||
- **[Duel Commander](duel_commander.md)** (C, GPL-3.0, beta, inactive since 2009)
|
||||
- **[EPOH](epoh.md)** (Javascript, MIT, beta)
|
||||
- **[Eleconics](eleconics.md)** (Java, beta, inactive since 2006)
|
||||
- **[Endgame: Singularity](singularity.md)** (Python, beta, inactive since 2010)
|
||||
- **[EternalWinterWars](eternalwinterwars.md)** (Java, MIT, beta, inactive since 2014)
|
||||
- **[Evil Cult](evil_cult.md)** (Haxe, Javascript, GPL-3.0, mature)
|
||||
- **[FAR Colony](farcolony.md)** (Pascal, GPL-3.0, beta, inactive since 2014)
|
||||
- **[First Strike](first_strike.md)** (Java, mature)
|
||||
- **[Free Orion](freeorion.md)** (C++, Python, beta)
|
||||
- **[Free Space Colonization](freespace_colonization.md)** (C, GPL-2.0, beta)
|
||||
@ -46,6 +50,7 @@
|
||||
- **[Free heroes2 engine](free_heroes2_engine.md)** (C++, GPL-2.0, beta, inactive since 2015)
|
||||
- **[FreeCol](freecol.md)** (Java, mature)
|
||||
- **[FreeLords](freelords.md)** (Java, GPL-2.0, beta)
|
||||
- **[FreeRCT](freerct.md)** (C++, GPL-2.0, beta, inactive since 2016)
|
||||
- **[FreeRails](freerails.md)** (Java, beta)
|
||||
- **[Freeciv](freeciv.md)** (C, mature)
|
||||
- **[Freeciv WebGL](freeciv_web.md)** (Javascript, Java, mature)
|
||||
@ -55,6 +60,7 @@
|
||||
- **[Gigalomania](gigalomania.md)** (C++)
|
||||
- **[Glest](glest.md)** (C++, mature, inactive since 2009)
|
||||
- **[Globulation2](globulation2.md)** (C++, mature)
|
||||
- **[Goblin Camp](golbin_camp.md)** (C++, GPL-3.0, beta, inactive since 2012)
|
||||
- **[Greenius' Civil War](civil_war.md)** (beta, inactive since 2001)
|
||||
- **[Harris](harris.md)** (C, Python, GPL-3.0, beta)
|
||||
- **[Heroes of Wesnoth](heroes_of_wesnoth.md)** (C++, beta)
|
||||
@ -85,6 +91,7 @@
|
||||
- **[OpenMOO2](open_moo2.md)** (beta, inactive since 2011)
|
||||
- **[OpenPop](open_pop.md)** (C++, GPL-3.0, beta, inactive since 2009)
|
||||
- **[OpenRA](open_ra.md)** (C#, mature)
|
||||
- **[OpenRCT2](open_rct2.md)** (C++, GPL-3.0, beta)
|
||||
- **[OpenXcom](open_xcom.md)** (C++, mature)
|
||||
- **[Operation Citadel](operation_citadel.md)** (C++, GPL-2.0, beta, inactive since 2000)
|
||||
- **[Outer Space](outer_space.md)** (Python, GPL-2.0, beta, inactive since 2012)
|
||||
@ -130,6 +137,7 @@
|
||||
- **[Widelands](widelands.md)** (C++, Lua, mature)
|
||||
- **[Wolfpack Empire](wolfpack_empire.md)** (C, GPL-3.0, mature)
|
||||
- **[World of Heroes](world_of_heroes.md)** (Python, BSD, beta, inactive since 2009)
|
||||
- **[Wyrmsun](wyrmsun.md)** (Lua, C++, GPL-2.0, mature)
|
||||
- **[X-Force: Fight For Destiny](x-force.md)** (Delphi, GPL-2.0, beta, inactive since 2011)
|
||||
- **[Xconq](xconq.md)** (mature)
|
||||
- **[Xenowar](xenowar.md)** (C, C++, GPL-3.0, mature, inactive since 2014)
|
||||
|
15
games/strategy/colobot.md
Normal file
15
games/strategy/colobot.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Colobot
|
||||
|
||||
_Real-time strategy game, where you can program your units (bots) in a language called CBOT, which is similar to C++ and Java._
|
||||
|
||||
- Home: https://colobot.info/
|
||||
- Download: https://colobot.info/download-colobot-gold/
|
||||
- State: mature
|
||||
- Keywords: RTS
|
||||
- Code: https://github.com/colobot/colobot
|
||||
- Language(s): C++
|
||||
- License: GPL-3.0
|
||||
|
||||
## Building
|
||||
|
||||
Uses CMake
|
16
games/strategy/devana.md
Normal file
16
games/strategy/devana.md
Normal file
@ -0,0 +1,16 @@
|
||||
# Devana
|
||||
|
||||
_Browser strategy game._
|
||||
|
||||
- Home: https://web.archive.org/web/20180419021717/http://devana.eu/, https://sourceforge.net/projects/devana/
|
||||
- Download: https://sourceforge.net/projects/devana/files
|
||||
- State: beta
|
||||
- Keywords: web
|
||||
- Code: see download
|
||||
- Language(s): PHP
|
||||
- License: BSD
|
||||
|
||||
Main web site is unavailable.
|
||||
|
||||
## Building
|
||||
|
13
games/strategy/eternalwinterwars.md
Normal file
13
games/strategy/eternalwinterwars.md
Normal file
@ -0,0 +1,13 @@
|
||||
# EternalWinterWars
|
||||
|
||||
_Turn based strategy game with a medieval winter setting._
|
||||
|
||||
- Home: https://github.com/hinogi/eternalwinterwars
|
||||
- State: beta, inactive since 2014
|
||||
- Code: https://github.com/hinogi/eternalwinterwars
|
||||
- Language(s): Java
|
||||
- License: MIT
|
||||
- Platforms: Android
|
||||
|
||||
## Building
|
||||
|
12
games/strategy/farcolony.md
Normal file
12
games/strategy/farcolony.md
Normal file
@ -0,0 +1,12 @@
|
||||
# FAR Colony
|
||||
|
||||
_FAR Colony (First Autonomous Remote Colony) is a game of exploration and space colonization being held in the 23th century._
|
||||
|
||||
- Home: https://code.google.com/archive/p/farcolony/
|
||||
- State: beta, inactive since 2014
|
||||
- Code: https://github.com/Vakarias/farcolony
|
||||
- Language(s): Pascal
|
||||
- License: GPL-3.0
|
||||
|
||||
## Building
|
||||
|
@ -11,6 +11,9 @@ _Freeciv is a Free and Open Source empire-building strategy game inspired by the
|
||||
- Language(s): C
|
||||
- Code license: GPL-2.0
|
||||
|
||||
See also [FreeCivAC](http://freecivac.sourceforge.net/) which is a patch to FreeCiv to incoporate Alpha Centauri behavior
|
||||
however inactive since 2002.
|
||||
|
||||
## Building
|
||||
|
||||
Uses Autoconf
|
||||
|
16
games/strategy/freerct.md
Normal file
16
games/strategy/freerct.md
Normal file
@ -0,0 +1,16 @@
|
||||
# FreeRCT
|
||||
|
||||
_Game which captures the look, feel and gameplay of the popular games RollerCoaster Tycoon 1 and 2._
|
||||
|
||||
- Home: https://web.archive.org/web/*/http://www.freerct.org/, http://freerct.blogspot.com/
|
||||
- State: beta, inactive since 2016
|
||||
- Keywords: inspired (by RCT 1 and 2)
|
||||
- Code: https://github.com/FreeRCT/FreeRCT
|
||||
- Language(s): C++
|
||||
- License: GPL-2.0
|
||||
|
||||
Main web site is unavailable.
|
||||
|
||||
## Building
|
||||
|
||||
Uses CMake
|
13
games/strategy/golbin_camp.md
Normal file
13
games/strategy/golbin_camp.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Goblin Camp
|
||||
|
||||
_Roguelike citybuilder, inspired by Anno 1404, Dwarf Fortress and Dungeon Keeper._
|
||||
|
||||
- Home: http://www.goblincamp.com/, https://bitbucket.org/genericcontainer/goblin-camp
|
||||
- Download: see dome
|
||||
- State: beta, inactive since 2012
|
||||
- Code: https://bitbucket.org/genericcontainer/goblin-camp/src
|
||||
- Language(s): C++
|
||||
- License: GPL-3.0
|
||||
|
||||
## Building
|
||||
|
16
games/strategy/open_rct2.md
Normal file
16
games/strategy/open_rct2.md
Normal file
@ -0,0 +1,16 @@
|
||||
# OpenRCT2
|
||||
|
||||
_Re-implementation of RollerCoaster Tycoon 2 (RCT2), expanding the game with new features, fixing original bugs and raising game limits._
|
||||
|
||||
- Home: https://openrct2.org/
|
||||
- Media: {URL}
|
||||
- Download: https://openrct2.org/downloads
|
||||
- State: beta
|
||||
- Keywords: remake, requires original content (from RCT2)
|
||||
- Code: https://github.com/OpenRCT2/OpenRCT2
|
||||
- Language(s): C++
|
||||
- License: GPL-3.0
|
||||
|
||||
## Building
|
||||
|
||||
Uses CMake
|
18
games/strategy/wyrmsun.md
Normal file
18
games/strategy/wyrmsun.md
Normal file
@ -0,0 +1,18 @@
|
||||
# Wyrmsun
|
||||
|
||||
_Strategy game which features elements of mythology, history and fiction._
|
||||
|
||||
- Home: http://andrettin.github.io/
|
||||
- Download: https://store.steampowered.com/app/370070/Wyrmsun/
|
||||
- State: mature
|
||||
- Keywords: RTS
|
||||
- Code: https://github.com/andrettin/wyrmsun, https://github.com/Andrettin/Wyrmgus
|
||||
- Language(s): Lua, C++
|
||||
- License: GPL-2.0
|
||||
- Artwork license: GPL-2.0 (many from Battle for Wesnoth)
|
||||
- Dependencies: Modified Stratagus-Engine
|
||||
|
||||
## Building
|
||||
|
||||
Engine uses CMake
|
||||
|
Reference in New Issue
Block a user