new entries and reorganization of python scripts (added git archive)

This commit is contained in:
Trilarion
2018-06-01 09:23:02 +02:00
parent ce9c189ce1
commit 22d7ec4537
18 changed files with 246 additions and 23 deletions

View File

@ -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()

View File

@ -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)

View 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

View File

@ -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

View File

@ -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
View 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
View 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

View 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

View 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

View File

@ -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
View 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

View 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

View 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
View 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