maintenance of inspirations
This commit is contained in:
		| @@ -1,5 +1,5 @@ | |||||||
| start: entry* | start: entry* | ||||||
| entry: "##" name "(" _NUMBER ")\n" property+  | entry: "##" name "[" _NUMBER "]\n" property+ | ||||||
| property: "-" _key ":" _values "\n" | property: "-" _key ":" _values "\n" | ||||||
| _key: /(?! ).+?(?=:)(?<! )/    // key: everything until next ":", not beginning or ending with a space | _key: /(?! ).+?(?=:)(?<! )/    // key: everything until next ":", not beginning or ending with a space | ||||||
| _values: [_value ("," _value)*] | _values: [_value ("," _value)*] | ||||||
| @@ -7,7 +7,7 @@ _value: quoted_value | unquoted_value | |||||||
| quoted_value: /\".+?\"/   // with quotation marks, can contain commas | quoted_value: /\".+?\"/   // with quotation marks, can contain commas | ||||||
| unquoted_value: /(?![ \"])[^,\n]+(?<![ \"])/ // cannot contain commas, cannot start or end with quotation mark | unquoted_value: /(?![ \"])[^,\n]+(?<![ \"])/ // cannot contain commas, cannot start or end with quotation mark | ||||||
|  |  | ||||||
| name: /(?! ).+?(?= \()/    // developer name: everything until " (" | name: /(?! ).+?(?= \[)/    // developer name: everything until " [" | ||||||
|  |  | ||||||
| _NUMBER: /[0-9]+/ | _NUMBER: /[0-9]+/ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ stored Git repositories. | |||||||
| """ | """ | ||||||
|  |  | ||||||
| import os | import os | ||||||
|  | import sys | ||||||
| import requests | import requests | ||||||
| from bs4 import BeautifulSoup | from bs4 import BeautifulSoup | ||||||
| from utils import constants as c, utils, osg, osg_github | from utils import constants as c, utils, osg, osg_github | ||||||
| @@ -24,7 +25,11 @@ if __name__ == "__main__": | |||||||
|  |  | ||||||
|     # read developer info |     # read developer info | ||||||
|     developer_info = osg.read_developer_info() |     developer_info = osg.read_developer_info() | ||||||
|     osg.write_developer_info(developer_info)  # write again just to make nice |     osg.write_developer_info(developer_info)  # write again just to make it nice and as sanity check | ||||||
|  |  | ||||||
|  |     sys.exit(0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     # assemble info |     # assemble info | ||||||
|     entries = osg.assemble_infos() |     entries = osg.assemble_infos() | ||||||
|   | |||||||
| @@ -1,9 +1,70 @@ | |||||||
| from utils import constants as c, utils, osg | """ | ||||||
|  | Maintenance of inspirations.md and synchronization with the inspirations in the entries. | ||||||
|  | """ | ||||||
|  |  | ||||||
|  | from utils import constants as c, utils, osg, osg_ui | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def duplicate_check(): | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     :param inspirations: | ||||||
|  |     :return: | ||||||
|  |     """ | ||||||
|  |     print('\nduplicate check') | ||||||
|  |     inspiration_names = [x['name'] for x in inspirations] | ||||||
|  |     for index, name in enumerate(inspiration_names): | ||||||
|  |         for other_name in inspiration_names[index+1:]: | ||||||
|  |             if osg.name_similarity(name, other_name) > similarity_threshold: | ||||||
|  |                 print(' {} - {} is similar'.format(name, other_name)) | ||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|  |  | ||||||
|  |     similarity_threshold = 0.8 | ||||||
|  |  | ||||||
|  |     # load inspirations | ||||||
|     inspirations = osg.read_inspirations_info() |     inspirations = osg.read_inspirations_info() | ||||||
|  |     print('{} inspirations in the inspirations database'.format(len(inspirations))) | ||||||
|     osg.write_inspirations_info(inspirations)  # write again just to check integrity |     osg.write_inspirations_info(inspirations)  # write again just to check integrity | ||||||
|  |  | ||||||
|  |     osg_ui.run_simple_button_app('Maintenance inspirations', (('Duplicate check', duplicate_check),)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     # assemble info |     # assemble info | ||||||
|     # entries = osg.assemble_infos() |     entries = osg.assemble_infos() | ||||||
|  |  | ||||||
|  |     # assemble inspirations info from entries | ||||||
|  |     entries_inspirations = {} | ||||||
|  |     for entry in entries: | ||||||
|  |         entry_name = entry['name'] | ||||||
|  |         keywords = entry['keywords'] | ||||||
|  |         entry_inspirations = [x for x in keywords if x.startswith('inspired by')] | ||||||
|  |         if entry_inspirations: | ||||||
|  |             entry_inspirations = entry_inspirations[0][len('inspired by'):] | ||||||
|  |             entry_inspirations = entry_inspirations.split('+') | ||||||
|  |             entry_inspirations = [x.strip() for x in entry_inspirations] | ||||||
|  |             for entry_inspiration in entry_inspirations: | ||||||
|  |                 if entry_inspiration in entries_inspirations: | ||||||
|  |                     entries_inspirations[entry_inspiration].append(entry_name) | ||||||
|  |                 else: | ||||||
|  |                     entries_inspirations[entry_inspiration] = [ entry_name ] | ||||||
|  |     print('{} inspirations in the entries'.format(len(entries_inspirations))) | ||||||
|  |  | ||||||
|  |     # first check if all inspiration in entries are also in inspirations | ||||||
|  |     inspiration_names = [x['name'] for x in inspirations] | ||||||
|  |     for inspiration, entries in entries_inspirations.items(): | ||||||
|  |         if inspiration not in inspiration_names: | ||||||
|  |             print('new inspiration {} for games {}'.format(inspiration, ', '.join(entries))) | ||||||
|  |             similar_names = [x for x in inspiration_names if osg.name_similarity(inspiration, x) > 0.8] | ||||||
|  |             if similar_names: | ||||||
|  |                 print(' similar names {}'.format(', '.join(similar_names))) | ||||||
|  |  | ||||||
|  |     # now the other way around | ||||||
|  |     for index, name in enumerate(inspiration_names): | ||||||
|  |         if name not in entries_inspirations: | ||||||
|  |             print('potential removed inspiration {} from games {}'.format(name, inspirations[index]['inspired entries'])) | ||||||
|  |             similar_names = [x for x in entries_inspirations.keys() if osg.name_similarity(name, x) > 0.8] | ||||||
|  |             if similar_names: | ||||||
|  |                 print(' similar names {}'.format(', '.join(similar_names))) | ||||||
| @@ -92,4 +92,4 @@ general_code_dependencies_without_entry = {'OpenGL': 'https://www.opengl.org/', | |||||||
| valid_developer_fields = ('name', 'games', 'contact', 'organization', 'home') | valid_developer_fields = ('name', 'games', 'contact', 'organization', 'home') | ||||||
|  |  | ||||||
| # inspiration/original game information (in the file all fields will be capitalized) | # inspiration/original game information (in the file all fields will be capitalized) | ||||||
| valid_inspiration_fields = ('name', 'inspired entries') | valid_inspiration_fields = ('name', 'inspired entries', 'media') | ||||||
| @@ -399,14 +399,13 @@ def read_developer_info(): | |||||||
|             if field not in valid_developer_fields: |             if field not in valid_developer_fields: | ||||||
|                 raise RuntimeError('Unknown developer field "{}" for developer: {}.'.format(field, dev['name'])) |                 raise RuntimeError('Unknown developer field "{}" for developer: {}.'.format(field, dev['name'])) | ||||||
|         # strip from name or organization (just in case) |         # strip from name or organization (just in case) | ||||||
|         for field in ('name', 'organization'): |         for field in ('name', ): | ||||||
|             if field in dev: |             if field in dev: | ||||||
|                 dev[field] = dev[field].strip() |                 dev[field] = dev[field].strip() | ||||||
|         # split games, contact (are lists) |         # split games, contact (are lists) | ||||||
|         for field in ('games', 'contact'): |         for field in ('games', 'contact'): | ||||||
|             if field in dev: |             if field in dev: | ||||||
|                 content = dev[field] |                 content = dev[field] | ||||||
|                 content = content.split(',') |  | ||||||
|                 content = [x.strip() for x in content] |                 content = [x.strip() for x in content] | ||||||
|                 dev[field] = content |                 dev[field] = content | ||||||
|     # check for duplicate names entries |     # check for duplicate names entries | ||||||
| @@ -427,28 +426,31 @@ def write_developer_info(developers): | |||||||
|     content = '{}\n'.format(generic_comment_string) |     content = '{}\n'.format(generic_comment_string) | ||||||
|  |  | ||||||
|     # number of developer |     # number of developer | ||||||
|     content += '# Developer ({})\n\n'.format(len(developers)) |     content += '# Developer [{}]\n\n'.format(len(developers)) | ||||||
|  |  | ||||||
|     # sort by name |     # sort by name | ||||||
|     developers.sort(key=lambda x: str.casefold(x['name'])) |     developers.sort(key=lambda x: str.casefold(x['name'])) | ||||||
|  |  | ||||||
|     # iterate over them |     # iterate over them | ||||||
|     for dev in developers: |     for dev in developers: | ||||||
|  |         keys = list(dev.keys()) | ||||||
|         # developer name |         # developer name | ||||||
|         content += '## {} ({})\n\n'.format(dev['name'], len(dev['games'])) |         content += '## {} [{}]\n\n'.format(dev['name'], len(dev['games'])) | ||||||
|  |         keys.remove('name') | ||||||
|  |  | ||||||
|         # games |         # all the remaining in alphabetical order, but 'games' first | ||||||
|         content += '- Games: {}\n'.format(', '.join(sorted(dev['games'], key=str.casefold))) |         keys.remove('games') | ||||||
|  |         keys.sort() | ||||||
|         # all the remaining in alphabetical order |         keys = ['games'] + keys | ||||||
|         for field in sorted(dev.keys()): |         for field in keys: | ||||||
|             if field not in ('name', 'games'): |  | ||||||
|             value = dev[field] |             value = dev[field] | ||||||
|             field = field.capitalize() |             field = field.capitalize() | ||||||
|                 if isinstance(value, str): |             # lists get special treatment | ||||||
|  |             if isinstance(value, list): | ||||||
|  |                 value.sort(key=str.casefold) | ||||||
|  |                 value = [x if not ',' in x else '"{}"'.format(x) for x in value]  # surround those with a comma with quotation marks | ||||||
|  |                 value = ', '.join(value) | ||||||
|             content += '- {}: {}\n'.format(field, value) |             content += '- {}: {}\n'.format(field, value) | ||||||
|                 else: |  | ||||||
|                     content += '- {}: {}\n'.format(field, ', '.join(sorted(value, key=str.casefold))) |  | ||||||
|         content += '\n' |         content += '\n' | ||||||
|  |  | ||||||
|     # write |     # write | ||||||
| @@ -502,29 +504,31 @@ def write_inspirations_info(inspirations): | |||||||
|     content = '{}\n'.format(generic_comment_string) |     content = '{}\n'.format(generic_comment_string) | ||||||
|  |  | ||||||
|     # number of developer |     # number of developer | ||||||
|     content += '# Inspirations ({})\n\n'.format(len(inspirations)) |     content += '# Inspirations [{}]\n\n'.format(len(inspirations)) | ||||||
|  |  | ||||||
|     # sort by name |     # sort by name | ||||||
|     inspirations.sort(key=lambda x: str.casefold(x['name'])) |     inspirations.sort(key=lambda x: str.casefold(x['name'])) | ||||||
|  |  | ||||||
|     # iterate over them |     # iterate over them | ||||||
|     for inspiration in inspirations: |     for inspiration in inspirations: | ||||||
|  |         keys = list(inspiration.keys()) | ||||||
|         # inspiration name |         # inspiration name | ||||||
|         content += '## {} ({})\n\n'.format(inspiration['name'], len(inspiration['inspired entries'])) |         content += '## {} [{}]\n\n'.format(inspiration['name'], len(inspiration['inspired entries'])) | ||||||
|  |         keys.remove('name') | ||||||
|  |  | ||||||
|         # games |         # all the remaining in alphabetical order, but "inspired entries" first | ||||||
|         content += '- Inspired entries: {}\n'.format( |         keys.remove('inspired entries') | ||||||
|             ', '.join(sorted(inspiration['inspired entries'], key=str.casefold))) |         keys.sort() | ||||||
|  |         keys = ['inspired entries'] + keys | ||||||
|         # all the remaining in alphabetical order |         for field in keys: | ||||||
|         for field in sorted(inspiration.keys()): |  | ||||||
|             if field not in ('name', 'inspired entries'): |  | ||||||
|             value = inspiration[field] |             value = inspiration[field] | ||||||
|             field = field.capitalize() |             field = field.capitalize() | ||||||
|                 if isinstance(value, str): |             # lists get special treatment | ||||||
|  |             if isinstance(value, list): | ||||||
|  |                 value.sort(key=str.casefold) | ||||||
|  |                 value = [x if not ',' in x else '"{}"'.format(x) for x in value]  # surround those with a comma with quotation marks | ||||||
|  |                 value = ', '.join(value) | ||||||
|             content += '- {}: {}\n'.format(field, value) |             content += '- {}: {}\n'.format(field, value) | ||||||
|                 else: |  | ||||||
|                     content += '- {}: {}\n'.format(field, ', '.join(sorted(value, key=str.casefold))) |  | ||||||
|         content += '\n' |         content += '\n' | ||||||
|  |  | ||||||
|     # write |     # write | ||||||
|   | |||||||
							
								
								
									
										32
									
								
								code/utils/osg_ui.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								code/utils/osg_ui.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | """ | ||||||
|  | Simple UI helpers with PyQt | ||||||
|  | """ | ||||||
|  |  | ||||||
|  | from PyQt5 import QtCore, QtGui, QtWidgets | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def run_simple_button_app(title, actions): | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     :param title: | ||||||
|  |     :param actions: | ||||||
|  |     :return: | ||||||
|  |     """ | ||||||
|  |     # create app | ||||||
|  |     app = QtWidgets.QApplication([]) | ||||||
|  |  | ||||||
|  |     # create single widget | ||||||
|  |     widget = QtWidgets.QWidget() | ||||||
|  |     widget.setWindowTitle(title) | ||||||
|  |     widget.setMinimumSize(200, 400) | ||||||
|  |  | ||||||
|  |     # add actions | ||||||
|  |     layout = QtWidgets.QVBoxLayout(widget) | ||||||
|  |     for name, action in actions: | ||||||
|  |         button = QtWidgets.QPushButton(name) | ||||||
|  |         button.clicked.connect(action) | ||||||
|  |         layout.addWidget(button) | ||||||
|  |  | ||||||
|  |     # execute app | ||||||
|  |     widget.show() | ||||||
|  |     return app.exec_() | ||||||
							
								
								
									
										746
									
								
								developer.md
									
									
									
									
									
								
							
							
						
						
									
										746
									
								
								developer.md
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -6,7 +6,7 @@ _Clone of Achtung, die Kurve!, a simple skill game._ | |||||||
| - State: mature | - State: mature | ||||||
| - Play: https://kurve.se/ | - Play: https://kurve.se/ | ||||||
| - Platform: Web | - Platform: Web | ||||||
| - Keywords: action, clone, inspired by Achtung die Kurve!, multiplayer local, open content | - Keywords: action, clone, inspired by "Achtung, die Kurve!", multiplayer local, open content | ||||||
| - Code repository: https://github.com/SimonAlling/kurve.git | - Code repository: https://github.com/SimonAlling/kurve.git | ||||||
| - Code language: JavaScript | - Code language: JavaScript | ||||||
| - Code license: AGPL-3.0 | - Code license: AGPL-3.0 | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ _Remake of Battlecity._ | |||||||
|  |  | ||||||
| - Home: https://battlecity.org/ | - Home: https://battlecity.org/ | ||||||
| - State: mature, inactive since 2013 | - State: mature, inactive since 2013 | ||||||
| - Keywords: action, inspired by Battlecity, remake, strategy | - Keywords: action, inspired by Battle City, remake, strategy | ||||||
| - Code repository: https://github.com/Deceth/Battle-City.git | - Code repository: https://github.com/Deceth/Battle-City.git | ||||||
| - Code language: C, C++, Pascal | - Code language: C, C++, Pascal | ||||||
| - Code license: GPL-3.0 | - Code license: GPL-3.0 | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ _A DOOM clone engine._ | |||||||
| - Home: https://github.com/amroibrahim/DIYDoom | - Home: https://github.com/amroibrahim/DIYDoom | ||||||
| - State: beta | - State: beta | ||||||
| - Platform: Windows | - Platform: Windows | ||||||
| - Keywords: game engine, inspired by DOOM, remake | - Keywords: game engine, inspired by Doom, remake | ||||||
| - Code repository: https://github.com/amroibrahim/DIYDoom.git | - Code repository: https://github.com/amroibrahim/DIYDoom.git | ||||||
| - Code language: C++ | - Code language: C++ | ||||||
| - Code license: MIT | - Code license: MIT | ||||||
|   | |||||||
| @@ -1,12 +1,12 @@ | |||||||
| # FreeOrion | # FreeOrion | ||||||
|  |  | ||||||
| _Turn-based space empire and galactic conquest (4X) computer game._ | _Turn-based space empire and galactic conquest game._ | ||||||
|  |  | ||||||
| - Home: https://www.freeorion.org/index.php/Main_Page, https://sourceforge.net/projects/freeorion/ | - Home: https://www.freeorion.org/index.php/Main_Page, https://sourceforge.net/projects/freeorion/ | ||||||
| - Media: https://en.wikipedia.org/wiki/Master_of_Orion#External_links | - Media: https://en.wikipedia.org/wiki/Master_of_Orion#External_links | ||||||
| - State: beta | - State: beta | ||||||
| - Download: https://www.freeorion.org/index.php/Download | - Download: https://www.freeorion.org/index.php/Download | ||||||
| - Keywords: strategy, inspired by Master of Orion 1 + Master of Orion 2, open content, remake, turn-based | - Keywords: strategy, inspired by Master of Orion + Master of Orion 2, open content, remake, turn-based | ||||||
| - Code repository: https://github.com/freeorion/freeorion.git, https://svn.code.sf.net/p/freeorion/code (svn) | - Code repository: https://github.com/freeorion/freeorion.git, https://svn.code.sf.net/p/freeorion/code (svn) | ||||||
| - Code language: C++, Python | - Code language: C++, Python | ||||||
| - Code license: GPL-2.0 | - Code license: GPL-2.0 | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ _Remake of Cube 2: Sauerbraten._ | |||||||
| - Media: <https://en.wikipedia.org/wiki/Ace_of_Spades_(video_game)> | - Media: <https://en.wikipedia.org/wiki/Ace_of_Spades_(video_game)> | ||||||
| - State: beta, inactive since 2018 | - State: beta, inactive since 2018 | ||||||
| - Keywords: remake, inspired by Cube 2: Sauerbraten | - Keywords: remake, inspired by Cube 2: Sauerbraten | ||||||
| - Code repository: https://github.com/inexorgame/inexor-core.git (archived) | - Code repository: https://github.com/inexorgame/vulkan-renderer.git, https://github.com/inexorgame/inexor-core.git (+) (archived) | ||||||
| - Code language: C++, JavaScript | - Code language: C++, JavaScript | ||||||
| - Code license: zlib | - Code license: zlib | ||||||
| - Code dependencies: Cube 2 | - Code dependencies: Cube 2 | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ _Bungeon builder._ | |||||||
| - Home: https://keeperrl.com/, https://miki151.itch.io/keeperrl | - Home: https://keeperrl.com/, https://miki151.itch.io/keeperrl | ||||||
| - State: beta | - State: beta | ||||||
| - Platform: Windows | - Platform: Windows | ||||||
| - Keywords: simulation, game engine, inspired by Dungeon Keeper II, requires original content | - Keywords: simulation, game engine, inspired by Dungeon Keeper 2, requires original content | ||||||
| - Code repository: https://github.com/miki151/keeperrl.git | - Code repository: https://github.com/miki151/keeperrl.git | ||||||
| - Code language: C, C++ | - Code language: C, C++ | ||||||
| - Code license: GPL-2.0 | - Code license: GPL-2.0 | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| # Moria | # Moria | ||||||
|  |  | ||||||
| _Roguelike computer game inspired by J. R. R. Tolkien's novel The Lord of the Rings._ | _Roguelike inspired by Tolkien's novel The Lord of the Rings._ | ||||||
|  |  | ||||||
| - Home: https://umoria.org/, http://beej.us/moria/ | - Home: https://umoria.org/, http://beej.us/moria/ | ||||||
| - Media: <https://en.wikipedia.org/wiki/Moria_(video_game)> | - Media: <https://en.wikipedia.org/wiki/Moria_(video_game)> | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ _Remake of Achtung, die Kurve!._ | |||||||
|  |  | ||||||
| - Home: https://pwmarcz.pl/netacka/ | - Home: https://pwmarcz.pl/netacka/ | ||||||
| - State: mature | - State: mature | ||||||
| - Keywords: remake, inspired by Achtung die Kurve!, skill | - Keywords: remake, inspired by "Achtung, die Kurve!", skill | ||||||
| - Code repository: https://github.com/pwmarcz/netacka.git | - Code repository: https://github.com/pwmarcz/netacka.git | ||||||
| - Code language: C | - Code language: C | ||||||
| - Code license: MIT | - Code license: MIT | ||||||
|   | |||||||
| @@ -1,12 +1,12 @@ | |||||||
| # OpenGothic | # OpenGothic | ||||||
|  |  | ||||||
| _Engine remake of Gothic 2: Night of the raven._ | _Engine remake of Gothic II._ | ||||||
|  |  | ||||||
| - Home: https://github.com/Try/OpenGothic | - Home: https://github.com/Try/OpenGothic | ||||||
| - State: beta | - State: beta | ||||||
| - Download: https://github.com/Try/OpenGothic/releases | - Download: https://github.com/Try/OpenGothic/releases | ||||||
| - Platform: Windows | - Platform: Windows | ||||||
| - Keywords: role playing, commercial content, game engine, inspired by Gothic + Gothic 2, remake, requires original content | - Keywords: role playing, commercial content, game engine, inspired by Gothic + Gothic II, remake, requires original content | ||||||
| - Code repository: https://github.com/Try/OpenGothic.git | - Code repository: https://github.com/Try/OpenGothic.git | ||||||
| - Code language: C++ | - Code language: C++ | ||||||
| - Code license: MIT | - Code license: MIT | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ | |||||||
| _Remake of Hogs of War._ | _Remake of Hogs of War._ | ||||||
|  |  | ||||||
| - Home: https://github.com/TalonBraveInfo/OpenHoW | - Home: https://github.com/TalonBraveInfo/OpenHoW | ||||||
| - Media: https://en.wikipedia.org/wiki/Hogs_of_War |  | ||||||
| - State: beta | - State: beta | ||||||
| - Platform: Windows, Linux | - Platform: Windows, Linux | ||||||
| - Keywords: strategy, commercial content, inspired by Hogs of War, remake, requires original content, turn-based | - Keywords: strategy, commercial content, inspired by Hogs of War, remake, requires original content, turn-based | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| # OpenKeeper | # OpenKeeper | ||||||
|  |  | ||||||
| _Remake of the Dungeon Keeper II engine._ | _Remake of the Dungeon Keeper 2 engine._ | ||||||
|  |  | ||||||
| - Home: https://github.com/tonihele/OpenKeeper | - Home: https://github.com/tonihele/OpenKeeper | ||||||
| - State: beta | - State: beta | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| # REGoth | # REGoth | ||||||
|  |  | ||||||
| _Reimplementation of the zEngine, used by the game "Gothic" and "Gothic II"._ | _Reimplementation of the zEngine, used by the games Gothic and Gothic II._ | ||||||
|  |  | ||||||
| - Home: https://regoth-project.github.io/REGoth-bs/index.html, https://github.com/REGoth-project/REGoth/wiki | - Home: https://regoth-project.github.io/REGoth-bs/index.html, https://github.com/REGoth-project/REGoth/wiki | ||||||
| - State: mature | - State: mature | ||||||
| - Download: https://github.com/REGoth-project/REGoth/releases | - Download: https://github.com/REGoth-project/REGoth/releases | ||||||
| - Keywords: role playing, commercial content, inspired by Gothic + Gothic II, remake, requires original content (Gothic 1 and Gothic 2) | - Keywords: role playing, commercial content, inspired by Gothic + Gothic II, remake, requires original content | ||||||
| - Code repository: https://github.com/REGoth-project/REGoth-bs.git, https://github.com/REGoth-project/REGoth.git (+) | - Code repository: https://github.com/REGoth-project/REGoth-bs.git, https://github.com/REGoth-project/REGoth.git (+) | ||||||
| - Code language: C++ | - Code language: C++ | ||||||
| - Code license: GPL-3.0, MIT (https://github.com/REGoth-project/REGoth-bs/blob/master/LICENSE) | - Code license: GPL-3.0, MIT (https://github.com/REGoth-project/REGoth-bs/blob/master/LICENSE) | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| # SDL Asylum | # SDL Asylum | ||||||
|  |  | ||||||
| _C port of the computer game Asylum, which was written by Andy Southgate in 1994 for the Acorn Archimedes and is now public domain._ | _C port of Asylum._ | ||||||
|  |  | ||||||
| - Home: http://sdl-asylum.sourceforge.net/, https://sourceforge.net/projects/sdl-asylum/ | - Home: http://sdl-asylum.sourceforge.net/, https://sourceforge.net/projects/sdl-asylum/ | ||||||
| - Media: http://asylum.acornarcade.com/ | - Media: http://asylum.acornarcade.com/ | ||||||
| @@ -16,6 +16,7 @@ _C port of the computer game Asylum, which was written by Andy Southgate in 1994 | |||||||
| - Developer: Andy Southgate, Hugh Robinson | - Developer: Andy Southgate, Hugh Robinson | ||||||
|  |  | ||||||
| [Successor of Asylum](http://asylum.acornarcade.com/) from 1994. | [Successor of Asylum](http://asylum.acornarcade.com/) from 1994. | ||||||
|  | Asylum was written by Andy Southgate in 1994 for the Acorn Archimedes and is now public domain. | ||||||
|  |  | ||||||
| ## Building | ## Building | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| # xu4 | # xu4 | ||||||
|  |  | ||||||
| _A remake of the computer game Ultima IV._ | _A remake of Ultima IV._ | ||||||
|  |  | ||||||
| - Home: http://xu4.sourceforge.net/, https://sourceforge.net/projects/xu4/ | - Home: http://xu4.sourceforge.net/, https://sourceforge.net/projects/xu4/ | ||||||
| - Media: <https://en.wikipedia.org/wiki/Ultima_IV:_Quest_of_the_Avatar#Ultima_IV_on_modern_operating_systems> | - Media: <https://en.wikipedia.org/wiki/Ultima_IV:_Quest_of_the_Avatar#Ultima_IV_on_modern_operating_systems> | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ _Remake of a 2D multiplayer game similar to the Tron movie-themed light cycle ga | |||||||
| - State: beta, inactive since 2007 | - State: beta, inactive since 2007 | ||||||
| - Download: http://zatacka.sourceforge.net/index.php?id=download, https://sourceforge.net/projects/zatacka/files/ | - Download: http://zatacka.sourceforge.net/index.php?id=download, https://sourceforge.net/projects/zatacka/files/ | ||||||
| - Platform: Windows, Linux | - Platform: Windows, Linux | ||||||
| - Keywords: arcade, 2D, inspired by Achtung die Kurve, multiplayer | - Keywords: arcade, 2D, inspired by "Achtung, die Kurve!", multiplayer | ||||||
| - Code repository: http://zatacka.cvs.sourceforge.net (cvs) | - Code repository: http://zatacka.cvs.sourceforge.net (cvs) | ||||||
| - Code language: C, C++ | - Code language: C, C++ | ||||||
| - Code license: GPL-2.0 | - Code license: GPL-2.0 | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ _Remake of Achtung, die Kurve!._ | |||||||
|  |  | ||||||
| - Home: https://github.com/simenheg/zatackax | - Home: https://github.com/simenheg/zatackax | ||||||
| - State: beta | - State: beta | ||||||
| - Keywords: action, inspired by Achtung die Kurve!, remake | - Keywords: action, inspired by "Achtung, die Kurve!", remake | ||||||
| - Code repository: https://github.com/simenheg/zatackax.git | - Code repository: https://github.com/simenheg/zatackax.git | ||||||
| - Code language: C | - Code language: C | ||||||
| - Code license: GPL-3.0 | - Code license: GPL-3.0 | ||||||
|   | |||||||
							
								
								
									
										1093
									
								
								inspirations.md
									
									
									
									
									
								
							
							
						
						
									
										1093
									
								
								inspirations.md
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user