From cd67ffe536978419eec59763bc74a62f4c9df1bf Mon Sep 17 00:00:00 2001 From: Trilarion Date: Sun, 6 Sep 2020 10:05:36 +0200 Subject: [PATCH] synchronization inspirations between entries and inspirations list --- code/maintenance_collect_inspiration_infos.py | 156 ++++---- code/utils/osg.py | 16 +- code/utils/osg_ui.py | 11 + entries/flf.md | 2 +- entries/freerct.md | 2 +- entries/minipacman.md | 2 +- entries/not_pacman.md | 2 +- entries/openc2e.md | 1 - entries/openttd.md | 2 +- entries/pacman.md | 2 +- entries/seven_kingdoms_ancient_adversaries.md | 1 - inspirations.md | 363 +++++++++++++----- 12 files changed, 384 insertions(+), 176 deletions(-) diff --git a/code/maintenance_collect_inspiration_infos.py b/code/maintenance_collect_inspiration_infos.py index 3de81204..fbfae198 100644 --- a/code/maintenance_collect_inspiration_infos.py +++ b/code/maintenance_collect_inspiration_infos.py @@ -2,92 +2,110 @@ Maintenance of inspirations.md and synchronization with the inspirations in the entries. """ -import time -from utils import constants as c, utils, osg, osg_ui -from utils import osg_wikipedia +from utils import osg, osg_ui +valid_duplicates = ('Age of Empires', 'ARMA', 'Catacomb', 'Civilization', 'Company of Heroes', 'Descent', 'Duke Nukem', 'Dungeon Keeper', + 'Final Fantasy', 'Heroes of Might and Magic', 'Jazz Jackrabbit', 'Marathon', 'Master of Orion', 'Quake', + 'RollerCoaster Tycoon', 'Star Wars Jedi Knight', 'The Settlers', 'Ultima', 'Ship Simulator') -def check_for_duplicates(): - """ +class InspirationMaintainer: - :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) > 0.8: - print(' {} - {} is similar'.format(name, other_name)) + def __init__(self): + self.inspirations = None + self.entries = None -def test(): - # assemble info - t0 = time.process_time() - entries = osg.read_entries() - print('took {}s'.format(time.process_time()-t0)) - t0 = time.process_time() - # entries = osg.assemble_infos() - # osg.write_entries(entries) - print('took {}s'.format(time.process_time()-t0)) + def read_inspirations(self): + self.inspirations = osg.read_inspirations() + print('{} inspirations read'.format(len(self.inspirations))) + def write_inspirations(self): + if not self.inspirations: + print('inspirations not yet loaded') + return + osg.write_inspirations(self.inspirations) + print('inspirations written') - # 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) + def check_for_duplicates(self): + if not self.inspirations: + print('inspirations not yet loaded') + return + inspiration_names = list(self.inspirations.keys()) + for index, name in enumerate(inspiration_names): + for other_name in inspiration_names[index + 1:]: + if any((name.startswith(x) and other_name.startswith(x) for x in valid_duplicates)): + continue + if osg.name_similarity(name, other_name) > 0.8: + print(' {} - {} is similar'.format(name, other_name)) + print('duplicates checked') + + def check_for_orphans(self): + if not self.inspirations: + print('inspirations not yet loaded') + return + for inspiration in self.inspirations.values(): + if not inspiration['inspired entries']: + print(' {} has no inspired entries'.format(inspiration['name'])) + print('orphanes checked') + + def check_for_missing_inspirations_in_entries(self): + if not self.inspirations: + print('inspirations not yet loaded') + return + if not self.entries: + print('entries not yet loaded') + return + for inspiration in self.inspirations.values(): + inspiration_name = inspiration['name'] + for entry_name in inspiration['inspired entries']: + x = [x for x in self.entries if x['title'] == entry_name] + assert len(x) <= 1 + if not x: + print('Entry "{}" listed in inspiration "{}" but this entry does not exist'.format(entry_name, inspiration_name)) else: - entries_inspirations[entry_inspiration] = [ entry_name ] - print('{} inspirations in the entries'.format(len(entries_inspirations))) + entry = x[0] + if 'inspirations' not in entry or inspiration_name not in entry['inspirations']: + print('Entry "{}" listed in inspiration "{}" but not listed in this entry'.format(entry_name, inspiration_name)) + print('missed inspirations checked') - # 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))) + def update_inspired_entries(self): + if not self.inspirations: + print('inspirations not yet loaded') + return + if not self.entries: + print('entries not yet loaded') + return + # loop over all inspirations and delete inspired entries + for inspiration in self.inspirations.values(): + inspiration['inspired entries'] = [] + # loop over all entries and add to inspirations of entry + for entry in self.entries: + entry_name = entry['title'] + for inspiration in entry.get('inspirations', []): + if inspiration in self.inspirations: + self.inspirations[inspiration]['inspired entries'].append(entry_name) + else: + self.inspirations[inspiration] = {'name': inspiration, 'inspired entries': [entry_name]} + print('inspired entries updated') - # 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))) + def read_entries(self): + self.entries = osg.read_entries() + print('{} entries read'.format(len(self.entries))) -def read_inspirations(): - inspirations = osg.read_inspirations_info() - print('{} inspirations in the inspirations database'.format(len(inspirations))) - -def write_inspirations(): - osg.write_inspirations_info(inspirations) - print('inspirations written') - if __name__ == "__main__": - inspirations = osg.read_inspirations_info() - osg.write_inspirations_info(inspirations) - inspirations = None - entries = None + m = InspirationMaintainer() actions = { - 'Read inspirations': read_inspirations, - 'Write inspirations': write_inspirations, - 'Check for duplicates': check_for_duplicates, + 'Read inspirations': m.read_inspirations, + 'Write inspirations': m.write_inspirations, + 'Check for duplicates': m.check_for_duplicates, + 'Check for orphans': m.check_for_orphans, + 'Check for inspirations not listed': m.check_for_missing_inspirations_in_entries, + 'Update inspirations from entries': m.update_inspired_entries, + 'Read entries': m.read_entries } - osg_ui.run_simple_button_app('Maintenance inspirations', actions) diff --git a/code/utils/osg.py b/code/utils/osg.py index 2942facd..0124f50c 100644 --- a/code/utils/osg.py +++ b/code/utils/osg.py @@ -476,7 +476,7 @@ def write_developer_info(developers): utils.write_text(developer_file, content) -def read_inspirations_info(): +def read_inspirations(): """ Reads the info list about the games originals/inspirations from inspirations.md using the Lark parser grammar in grammar_listing.lark @@ -508,17 +508,23 @@ def read_inspirations_info(): duplicate_names = (name for name in names if names.count(name) > 1) duplicate_names = set(duplicate_names) # to avoid duplicates in duplicate_names if duplicate_names: - print('Warning: duplicate inspiration names: {}'.format(', '.join(duplicate_names))) + raise RuntimeError('Duplicate inspiration names: {}'.format(', '.join(duplicate_names))) + + # convert to dictionary + inspirations = {x['name']: x for x in inspirations} return inspirations -def write_inspirations_info(inspirations): +def write_inspirations(inspirations): """ - Given an internal list of inspirations, write it into the inspirations file + Given an internal dictionary of inspirations, write it into the inspirations file :param inspirations: :return: """ + # convert dictionary to list + inspirations = list(inspirations.values()) + # comment content = '{}\n'.format(generic_comment_string) @@ -544,7 +550,7 @@ def write_inspirations_info(inspirations): field = field.capitalize() # lists get special treatment if isinstance(value, list): - value.sort(key=str.casefold) + value.sort(key=str.casefold) # sorted alphabetically 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) diff --git a/code/utils/osg_ui.py b/code/utils/osg_ui.py index 7c5ad2af..fd680e8e 100644 --- a/code/utils/osg_ui.py +++ b/code/utils/osg_ui.py @@ -2,9 +2,17 @@ Simple UI helpers with PyQt """ +import sys from PyQt5 import QtCore, QtGui, QtWidgets +def exception_hook(type, value, traceback): + """ + Use sys.__excepthook__, the standard hook. + """ + sys.__excepthook__(type, value, traceback) + + def run_simple_button_app(title, actions): """ @@ -12,6 +20,9 @@ def run_simple_button_app(title, actions): :param actions: :return: """ + # fix PyQt5 eating exceptions (see http://stackoverflow.com/q/14493081/1536976) + sys.excepthook = exception_hook + # create app app = QtWidgets.QApplication([]) diff --git a/entries/flf.md b/entries/flf.md index b108c4c0..6dc15912 100644 --- a/entries/flf.md +++ b/entries/flf.md @@ -1,7 +1,7 @@ # F.LF - Home: http://project-f.github.io/, https://web.archive.org/web/20190629133825/https://www.projectf.hk/F.LF/ -- Inspirations: Little Fighter 2 (http://lf2.net/) +- Inspirations: Little Fighter 2 - State: mature - Platform: Web - Keywords: framework, clone, content commercial, requires original content diff --git a/entries/freerct.md b/entries/freerct.md index 78ac7581..523044f7 100644 --- a/entries/freerct.md +++ b/entries/freerct.md @@ -1,7 +1,7 @@ # FreeRCT - Home: https://web.archive.org/web/*/http://www.freerct.org/, http://freerct.blogspot.com/ -- Inspirations: RollerCoaster Tycoon (1 and 2) +- Inspirations: RollerCoaster Tycoon, RollerCoaster Tycoon 2 - State: beta, inactive since 2016 - Keywords: strategy, remake - Code repository: https://github.com/FreeRCT/FreeRCT.git diff --git a/entries/minipacman.md b/entries/minipacman.md index 70485794..fa9a080f 100644 --- a/entries/minipacman.md +++ b/entries/minipacman.md @@ -1,7 +1,7 @@ # MiniPacman - Home: https://github.com/fastrgv/MiniPacman -- Inspirations: Pacman +- Inspirations: Pac-Man - State: mature - Download: https://github.com/fastrgv/MiniPacman/releases - Platform: Windows, Linux, macOS diff --git a/entries/not_pacman.md b/entries/not_pacman.md index 9bac49da..02bbf5e3 100644 --- a/entries/not_pacman.md +++ b/entries/not_pacman.md @@ -1,7 +1,7 @@ # Not Pacman - Home: https://stabyourself.net/notpacman/ -- Inspirations: Pacman +- Inspirations: Pac-Man - State: mature, inactive since 2013 - Platform: Windows, Linux, macOS - Keywords: action, open content diff --git a/entries/openc2e.md b/entries/openc2e.md index d3096dd4..6d22aad1 100644 --- a/entries/openc2e.md +++ b/entries/openc2e.md @@ -9,7 +9,6 @@ - Code language: C, C++ - Code license: LGPL-2.1 -Remake of Creatures. Restarted in 2020. ## Building diff --git a/entries/openttd.md b/entries/openttd.md index 2d7a037c..75c392aa 100644 --- a/entries/openttd.md +++ b/entries/openttd.md @@ -2,7 +2,7 @@ - Home: https://www.openttd.org/ - Media: https://en.wikipedia.org/wiki/OpenTTD -- Inspirations: Transport Tycoon Deluxe +- Inspirations: Transport Tycoon - State: mature - Download: https://www.openttd.org/downloads/openttd-releases/latest.html - Keywords: simulation, can use original content, open content (swappable), remake diff --git a/entries/pacman.md b/entries/pacman.md index a8fcdfcf..8e7ff9b3 100644 --- a/entries/pacman.md +++ b/entries/pacman.md @@ -1,7 +1,7 @@ # Pacman - Home: https://github.com/ebuc99/pacman -- Inspirations: Pacman +- Inspirations: Pac-Man - State: beta - Download: https://github.com/ebuc99/pacman/releases, https://github.com/ebuc99/pacman_win/releases - Keywords: arcade diff --git a/entries/seven_kingdoms_ancient_adversaries.md b/entries/seven_kingdoms_ancient_adversaries.md index 9c20c77c..f19308ce 100644 --- a/entries/seven_kingdoms_ancient_adversaries.md +++ b/entries/seven_kingdoms_ancient_adversaries.md @@ -1,7 +1,6 @@ # Seven Kingdoms: Ancient Adversaries - Home: https://7kfans.com/ -- Media: - Inspirations: Seven Kingdoms: Ancient Adversaries - State: mature - Download: https://www.7kfans.com/wiki/index.php/Download, https://sourceforge.net/projects/skfans/files/, https://github.com/the3dfxdude/7kaa/releases diff --git a/inspirations.md b/inspirations.md index 19b746dc..5a74db5c 100644 --- a/inspirations.md +++ b/inspirations.md @@ -1,5 +1,5 @@ [comment]: # (partly autogenerated content, edit with care, read the manual before) -# Inspirations [510] +# Inspirations [552] ## 1010! [1] @@ -19,9 +19,9 @@ - Inspired entries: Open Horizon - Media: https://en.wikipedia.org/wiki/Ace_Combat:_Assault_Horizon -## Ace of Spades [2] +## Ace of Spades [3] -- Inspired entries: Iceball, OpenSpades +- Inspired entries: BetterSpades, Iceball, OpenSpades - Media: ## Achtung, die Kurve! [4] @@ -49,6 +49,10 @@ - Inspired entries: Aklabeth - Media: https://en.wikipedia.org/wiki/Akalabeth:_World_of_Doom +## Albion [1] + +- Inspired entries: SR + ## Allegiance [1] - Inspired entries: Free Allegiance @@ -59,6 +63,10 @@ - Inspired entries: Unknown Horizons - Media: https://en.wikipedia.org/wiki/Anno_(series) +## Anno 1404 [1] + +- Inspired entries: Goblin Camp + ## Another World 2: Heart of the Alien [1] - Inspired entries: Heart of the Alien @@ -131,13 +139,13 @@ - Inspired entries: SDL Asylum -## Atomic Bomberman [1] +## Atomic Bomberman [2] -- Inspired entries: Bombman +- Inspired entries: BomberClone, Bombman -## Atomix [4] +## Atomix [5] -- Inspired entries: Atomiks, Atomix, KAtomic, WAtomic +- Inspired entries: Atomiks, Atomix, KAtomic, LMarbles, WAtomic ## Awesomenauts [1] @@ -163,9 +171,9 @@ - Inspired entries: Brutal Chess -## Battle City [2] +## Battle City [3] -- Inspired entries: Battle City, Tank: Zone of Death +- Inspired entries: Battle City, Cattle Bity, Tank: Zone of Death - Media: https://en.wikipedia.org/wiki/Battle_City ## Battle Isle series [2] @@ -254,9 +262,9 @@ - Inspired entries: bratwurst -## Breakout [2] +## Breakout [4] -- Inspired entries: Breakout-VR, BRIQUOLO +- Inspired entries: Breakout-VR, BRIQUOLO, LBreakoutHD, SDL-Ball ## Bubble Bobble [1] @@ -311,9 +319,9 @@ - Inspired entries: Thunder&Lightning -## Castle of the Winds [1] +## Castle of the Winds [2] -- Inspired entries: Castle of the Winds in Elm +- Inspired entries: Castle of the Winds, Castle of the Winds in Elm ## Cataclysm [1] @@ -379,17 +387,17 @@ - Inspired entries: Colobot: Gold Edition -## Command & Conquer [1] +## Command & Conquer [2] -- Inspired entries: OpenRA +- Inspired entries: OpenRA, Vanilla-Conquer ## Command & Conquer: Generals [2] - Inspired entries: OpenSAGE, Thyme -## Command & Conquer: Red Alert [2] +## Command & Conquer: Red Alert [3] -- Inspired entries: Chronoshift, OpenRA +- Inspired entries: Chronoshift, OpenRA, Vanilla-Conquer ## Commander Keen Series [4] @@ -437,7 +445,7 @@ ## Creatures [1] -- Inspired entries: Open Creatures +- Inspired entries: openc2e ## Crimsonland [2] @@ -475,9 +483,13 @@ - Inspired entries: Performous, StepMania -## Death Rally [1] +## Dark Forces [1] -- Inspired entries: Dreerally +- Inspired entries: The Force Engine + +## Death Rally [2] + +- Inspired entries: dRally, Dreerally - Media: https://en.wikipedia.org/wiki/Death_Rally ## Deathchase [1] @@ -534,9 +546,9 @@ - Inspired entries: OpenDominion -## Doom [15] +## Doom [16] -- Inspired entries: Chocolate Doom, Classic RBDoom 3 BFG, Do It Yourself Doom With SDL, Doom Legacy, DOOM Retro, DOOM-iOS, Doomsday Engine, Freedoom, GZDoom, Mocha Doom, Odamex, PrBoom+, SLADE, The Eternity Engine, ZDoom +- Inspired entries: Chocolate Doom, Classic RBDoom 3 BFG, Do It Yourself Doom With SDL, DOOM, Doom Legacy, DOOM Retro, DOOM-iOS, Doomsday Engine, Freedoom, GZDoom, Mocha Doom, Odamex, PrBoom+, SLADE, The Eternity Engine, ZDoom ## Doom 3 [3] @@ -554,6 +566,14 @@ - Inspired entries: OpenBOR +## Dragon Wars [1] + +- Inspired entries: Turn of War + +## Driver 2 [1] + +- Inspired entries: REDriver2 + ## Drugwars [2] - Inspired entries: Dope Wars, Prescription Wars @@ -562,9 +582,9 @@ - Inspired entries: Dave Gnukem, Freenukum -## Duke Nukem 3D [6] +## Duke Nukem 3D [8] -- Inspired entries: Chocolate Duke3D, Duke3D, Duke3d_w32, EDuke32, JFDuke3D, xDuke +- Inspired entries: Chocolate Duke3D, Duke3D, Duke3d_w32, DukeGDX, EDuke32, JFDuke3D, Rednukem, xDuke ## Duke Nukem II [1] @@ -578,18 +598,18 @@ - Inspired entries: OpenRA -## Dungeon Keeper [1] +## Dungeon Keeper [2] -- Inspired entries: OpenDungeons +- Inspired entries: Goblin Camp, OpenDungeons ## Dungeon Keeper 2 [2] - Inspired entries: KeeperRL, OpenKeeper - Media: https://en.wikipedia.org/wiki/Dungeon_Keeper_2 -## Dwarf Fortress [1] +## Dwarf Fortress [3] -- Inspired entries: Veloren +- Inspired entries: DwarfCorp, Goblin Camp, Veloren ## E.T. the Extra-Terrestrial [1] @@ -620,6 +640,14 @@ - Inspired entries: Pioneer +## Elona [1] + +- Inspired entries: ElonaFoobar + +## Empire [1] + +- Inspired entries: Xconq + ## Enduro [1] - Inspired entries: Enduro tribute @@ -632,9 +660,9 @@ - Inspired entries: ResidualVM -## Escape Velocity [2] +## Escape Velocity [3] -- Inspired entries: Endless Sky, Naev +- Inspired entries: Endless Sky, Naev, Nox Imperii ## F-1 Spirit [1] @@ -674,13 +702,17 @@ - Inspired entries: OpenFire +## Five Nights at Freddy's [1] + +- Inspired entries: OpenFNaF + ## Flag Catcher [1] - Inspired entries: Gift Grabber -## Flappy Bird [4] +## Flappy Bird [5] -- Inspired entries: Clumsy Bird, CrappyBird, Flappy Cow, Hocoslamfy +- Inspired entries: Clumsy Bird, CrappyBird, Flappy Cow, Floppy Birb, Hocoslamfy ## Flying Shark [1] @@ -698,11 +730,19 @@ - Inspired entries: Forsaken +## Freeciv [1] + +- Inspired entries: Freeciv-web + ## Freelancer [1] - Inspired entries: Librelancer - Media: +## Freeserf [1] + +- Inspired entries: Freeserf.net + ## Frets on Fire [1] - Inspired entries: Frets on Fire X @@ -910,6 +950,10 @@ - Inspired entries: Cubosphere +## Kye [2] + +- Inspired entries: Python Kye, Xye + ## Ladder [2] - Inspired entries: ladder, Ladder @@ -954,6 +998,7 @@ ## Little Fighter 2 [1] - Inspired entries: F.LF +- Media: http://lf2.net/ ## Lode Runner [2] @@ -1000,6 +1045,14 @@ - Inspired entries: Krystal Drop +## Magus [1] + +- Inspired entries: Rot Magus + +## Mah-Jong [1] + +- Inspired entries: Mah-Jong + ## Marathon [1] - Inspired entries: Aleph One @@ -1082,6 +1135,10 @@ - Inspired entries: Dust Racing 2D, Microracers, Yorg +## micropolis [1] + +- Inspired entries: Divercity + ## Microprose Falcon 4.0 Combat Simulator [1] - Inspired entries: FreeFalcon @@ -1098,22 +1155,38 @@ - Inspired entries: OpenMC2 +## Might and Magic VI: The Mandate of Heaven [1] + +- Inspired entries: World of Might and Magic + +## Might and Magic VII: For Blood and Honor [1] + +- Inspired entries: World of Might and Magic + +## Might and Magic VIII: Day of the Destroyer [1] + +- Inspired entries: World of Might and Magic + ## Millipede [1] - Inspired entries: Monsters and Mushrooms -## Minecraft [13] +## Minecraft [15] -- Inspired entries: Chunk Stories, Craft, Digbuild, Gnomescroll, Hematite, Manic Digger, MineCraft-One-Week-Challenge, Minetest, pycraft, Terasology, TrueCraft, Veloren, Voxelands +- Inspired entries: Chunk Stories, Craft, Digbuild, DwarfCorp, Gnomescroll, Hematite, Manic Digger, MineCraft-One-Week-Challenge, minecraft-weekend, Minetest, pycraft, Terasology, TrueCraft, Veloren, Voxelands -## Minesweeper [4] +## Minesweeper [5] -- Inspired entries: Mines, Minesweeper (in C), Minesweeper.Zone, proxx +- Inspired entries: Isometric-Minesweeper, Mines, Minesweeper (in C), Minesweeper.Zone, proxx ## Missile Command [2] - Inspired entries: ICBM3D, Penguin Command +## Moai [1] + +- Inspired entries: adventure engine + ## moon-patrol [1] - Inspired entries: Moon-buggy @@ -1210,14 +1283,18 @@ - Inspired entries: OpenOMF -## Osu! Tatakae! Ouendan [1] +## Osu! Tatakae! Ouendan [2] -- Inspired entries: osu! +- Inspired entries: opsu!, osu! ## Oubliette [1] - Inspired entries: Liberal Crime Squad +## Outlaws [1] + +- Inspired entries: The Force Engine + ## Outpost [1] - Inspired entries: Outpost HD @@ -1230,13 +1307,10 @@ - Inspired entries: Enigma -## Pac-Man [5] +## Pac-Man [8] -- Inspired entries: EnTT Pacman, Ghostly, HTML5 Pacman, Pac Go, pacman-canvas - -## Pacman [1] - -- Inspired entries: MiniPacman +- Inspired entries: EnTT Pacman, Ghostly, HTML5 Pacman, MiniPacman, Not Pacman, Pac Go, Pacman, pacman-canvas +- Media: https://en.wikipedia.org/wiki/Pac-Man ## Panzer General [2] @@ -1268,6 +1342,10 @@ - Inspired entries: OPMon, Tuxemon +## Pong [1] + +- Inspired entries: PSY PONG 3D + ## Portal [1] - Inspired entries: glPortal @@ -1280,9 +1358,13 @@ - Inspired entries: sandspiel, The Powder Toy -## Powerslave [1] +## Powermonger [1] -- Inspired entries: Powerslave EX +- Inspired entries: Battles of Antargis + +## Powerslave [3] + +- Inspired entries: PCExhumed, Powerslave EX, PowerslaveGDX ## Powerslide [1] @@ -1292,6 +1374,10 @@ - Inspired entries: FreePrince, Mininim, SDLPoP +## Prince of Persia 2 [1] + +- Inspired entries: Prince-Monogame + ## Progress Quest [2] - Inspired entries: pq2, progress-quest @@ -1320,9 +1406,9 @@ - Inspired entries: Jake2, Yamagi Quake II -## Quake 3 [4] +## Quake 3 [5] -- Inspired entries: FQuake3, ioquake3, OpenArena, QuakeJS +- Inspired entries: FQuake3, ioquake3, OpenArena, Quake3e, QuakeJS ## Railroad Tycoon [1] @@ -1334,11 +1420,11 @@ ## RARS [1] -- Inspired entries: "The Open Racing Car Simulator, TORCS" +- Inspired entries: "TORCS, The Open Racing Car Simulator" -## Redneck Rampage [1] +## Redneck Rampage [3] -- Inspired entries: erampage +- Inspired entries: erampage, RedneckGDX, Rednukem ## Rescue! [1] @@ -1365,6 +1451,10 @@ - Inspired entries: Rise of the Triad for Linux +## Risk [2] + +- Inspired entries: Domination, Tenes Empanadas Graciela + ## Rodent's Revenge [1] - Inspired entries: Open Rodent's Revenge @@ -1373,9 +1463,9 @@ - Inspired entries: FreeRCT, OpenRCT2 -## RollerCoaster Tycoon 2 [1] +## RollerCoaster Tycoon 2 [2] -- Inspired entries: OpenRCT2 +- Inspired entries: FreeRCT, OpenRCT2 ## RPG Maker [3] @@ -1406,9 +1496,18 @@ - Inspired entries: One Way To Go, sensitive-js -## Seven Kingdoms [1] +## Septerra Core: Legacy of the Creator [1] + +- Inspired entries: SR + +## Settlers [1] + +- Inspired entries: Battles of Antargis + +## Seven Kingdoms: Ancient Adversaries [1] - Inspired entries: Seven Kingdoms: Ancient Adversaries +- Media: ## sfxr [1] @@ -1429,14 +1528,17 @@ ## Ship Simulator 2006 [1] - Inspired entries: Bridge Command +- Media: ## Ship Simulator 2008 [1] - Inspired entries: Bridge Command +- Media: ## Ship Simulator Extremes [1] - Inspired entries: Bridge Command +- Media: ## Shobon Action [1] @@ -1466,9 +1568,9 @@ - Inspired entries: Danger from the Deep -## SimCity [8] +## SimCity [9] -- Inspired entries: 3d.city, Citybound, Cytopia, Lincity, LinCity-NG, Micropolis, micropolisJS, OpenCity +- Inspired entries: 3d.city, Citybound, Cytopia, Divercity, Lincity, LinCity-NG, Micropolis, micropolisJS, OpenCity - Media: ## SimCity 2000 [1] @@ -1512,18 +1614,22 @@ - Inspired entries: Slot-Racers -## Snake [2] +## Snake [5] -- Inspired entries: Gusty's Serpents, snake +- Inspired entries: Armagetron Advanced, GLtron, Gusty's Serpents, KSnakeDuel, snake -## Sokoban [1] +## Sokoban [7] -- Inspired entries: CavePacker +- Inspired entries: AdaGate, CavePacker, GJID, JSoko, Simple Sokoban, SokoSolve, Xye ## Solar Fox [1] - Inspired entries: SolarWolf +## Solomon's Key [1] + +- Inspired entries: OpenSolomonsKey + ## Sonic the Hedgehog [2] - Inspired entries: Open Surge, Sonic Robo Blast 2 @@ -1580,18 +1686,18 @@ - Inspired entries: OpenSWE1R -## Star Wars Jedi Knight II: Jedi Outcast [1] +## Star Wars Jedi Knight II: Jedi Outcast [2] -- Inspired entries: JediOutcastLinux +- Inspired entries: JediOutcastLinux, OpenJK ## Star Wars Jedi Knight: Dark Forces II [1] - Inspired entries: Gorc - Media: https://en.wikipedia.org/wiki/Star_Wars_Jedi_Knight:_Dark_Forces_II -## Star Wars Jedi Knight: Jedi Academy [1] +## Star Wars Jedi Knight: Jedi Academy [2] -- Inspired entries: OpenJK +- Inspired entries: JediAcademyLinux, OpenJK - Media: https://en.wikipedia.org/wiki/Star_Wars_Jedi_Knight:_Jedi_Academy ## Star Wars: Galactic Battlegrounds [1] @@ -1646,9 +1752,9 @@ - Inspired entries: sundog, SunDog Resurrection -## Supaplex [3] +## Supaplex [4] -- Inspired entries: Rocks'n'Diamonds, splexhd, Supaxl +- Inspired entries: OpenSupaplex, Rocks'n'Diamonds, splexhd, Supaxl ## Super Cars [1] @@ -1662,13 +1768,13 @@ - Inspired entries: Open Hexagon -## Super Mario [4] +## Super Mario [5] -- Inspired entries: Mario Objects, Mega Mario, SuperTux, uMario +- Inspired entries: Mario Objects, Mega Mario, ReTux, SuperTux, uMario ## Super Methane Brothers [2] -- Inspired entries: Super Methane Brothers, super-methane-brothers-gx +- Inspired entries: Super Methane Brothers, Super Methane Brothers for Wii and GameCube ## Super Metroid [1] @@ -1679,11 +1785,15 @@ - Inspired entries: irrlamb, Neverball, Nuncabola, Veraball - Media: -## Super Smash Bros. [2] +## Super Smash Bros. [3] -- Inspired entries: Super Tilt Bro, TUSSLE +- Inspired entries: Smash, Super Tilt Bro, TUSSLE - Media: https://en.wikipedia.org/wiki/Super_Smash_Bros. +## Super ZZT [3] + +- Inspired entries: Reconstruction of Super ZZT, Roton, Zeta + ## Supreme Commander [1] - Inspired entries: Zero-K @@ -1720,6 +1830,10 @@ - Inspired entries: Gang Garrison 2, Open Fortress +## TekWar [1] + +- Inspired entries: TekwarGDX + ## Tempest [1] - Inspired entries: Arashi-JS @@ -1733,9 +1847,13 @@ - Inspired entries: OpenGL Test Drive Remake -## Tetris [9] +## TetraVex [1] -- Inspired entries: 4D-TRIS, Hextris, Just another Tetris™ clone, NullpoMino, OpenBlok, Quadrapassel, Spludlow Tetris, Tetris (in C and NCURSES), vitetris +- Inspired entries: TetraVex + +## Tetris [16] + +- Inspired entries: 2H4U, 4D-TRIS, Bastet, Cuyo, Gottet, Hextris, Just another Tetris™ clone, LTris, NullpoMino, OpenBlok, Quadrapassel, Spludlow Tetris, T^3, Tetris (in C and NCURSES), vitetris, Xultris - Media: https://en.wikipedia.org/wiki/Tetris ## Tetris Attack [4] @@ -1754,6 +1872,10 @@ - Inspired entries: The Castles of Dr. Creep +## The Clans [1] + +- Inspired entries: The Clans + ## The Clue! [1] - Inspired entries: Der Clou! @@ -1792,9 +1914,9 @@ - Inspired entries: The-Trail -## The Settlers [1] +## The Settlers [2] -- Inspired entries: Freeserf +- Inspired entries: Freeserf, Freeserf.net ## The Settlers II [2] @@ -1867,6 +1989,7 @@ ## Transport Tycoon [3] - Inspired entries: OpenTTD, Simutrans, TTDPatch +- Media: https://en.wikipedia.org/wiki/Transport_Tycoon ## Tremulous [1] @@ -1914,7 +2037,7 @@ - Inspired entries: Anteform, Minima -## Ultima IV [1] +## Ultima IV: Quest of the Avatar [1] - Inspired entries: xu4 @@ -1927,19 +2050,31 @@ - Inspired entries: Haxima -## Ultima VI [1] +## Ultima Underworld [1] + +- Inspired entries: UnderworldExporter + +## Ultima Underworld 2: Labyrinth of Worlds [1] + +- Inspired entries: Labyrinth of Worlds + +## Ultima Underworld II: Labyrinth of Worlds [1] + +- Inspired entries: UnderworldExporter + +## Ultima V: Warriors of Destiny [1] + +- Inspired entries: Ultima 5 Redux + +## Ultima VI: The False Prophet [1] - Inspired entries: Nuvie -## Ultima VII [1] - -- Inspired entries: Exult - ## Ultima VII: The Black Gate [1] - Inspired entries: Exult -## Ultima VIII [1] +## Ultima VIII: Pagan [1] - Inspired entries: Pentagram @@ -1951,6 +2086,10 @@ - Inspired entries: Vocaluxe +## Undertale [1] + +- Inspired entries: UndertaleModTool + ## Uninvited [1] - Inspired entries: uninvited @@ -1963,6 +2102,10 @@ - Inspired entries: Alimer +## V-Wing [1] + +- Inspired entries: Luola + ## Visual Pinball [1] - Inspired entries: Visual Pinball @@ -1971,26 +2114,38 @@ - Inspired entries: Train -## VVVVVV [1] +## VVVVVV [2] -- Inspired entries: WWW +- Inspired entries: VVVVVV, WWW - Media: https://en.wikipedia.org/wiki/VVVVVV +## Warcraft [1] + +- Inspired entries: Battles of Antargis + ## Warcraft II [2] - Inspired entries: Dark Oberon, Wargus -## Warcraft: Orcs & Humans [1] +## Warcraft: Orcs & Humans [3] -- Inspired entries: warcraft-remake +- Inspired entries: SR, War1, warcraft-remake + +## Wargamer:Napoleon 1813 [1] + +- Inspired entries: Wargamer ## Wario Land 3 [1] - Inspired entries: Wario-Land-3 -## Warlords II [1] +## WarioWare [1] -- Inspired entries: FreeLords +- Inspired entries: Librerama + +## Warlords II [2] + +- Inspired entries: FreeLords, LordsAWar! - Media: ## Warrior Kings [1] @@ -2025,6 +2180,10 @@ - Inspired entries: Ecksdee, H-Craft Championship, HexGL, The Rush +## Witchaven [1] + +- Inspired entries: WitchavenGDX + ## Wizard of Wor [1] - Inspired entries: KnightOfWor @@ -2034,9 +2193,9 @@ - Inspired entries: Wizardry Legacy -## Wolfenstein 3D [1] +## Wolfenstein 3D [2] -- Inspired entries: ECWolf +- Inspired entries: ECWolf, Wolf3dX ## Wolfenstein: Enemy Territory [1] @@ -2046,6 +2205,10 @@ - Inspired entries: Nuvie +## Worms [3] + +- Inspired entries: Atomic Tanks, GUSANOS, OpenLieroX + ## Worms Series [2] - Inspired entries: Hedgewars, WarMUX @@ -2054,13 +2217,17 @@ - Inspired entries: Open Apocalypse, OpenXcom, UFO2000, UFO: Alien Invasion, X-Force: Fight For Destiny, Xenowar -## X-COM: Terror from the Deep [6] +## X-COM: Terror from the Deep [7] -- Inspired entries: Open Apocalypse, OpenXcom, UFO2000, UFO: Alien Invasion, X-Force: Fight For Destiny, Xenowar +- Inspired entries: Open Apocalypse, OpenXcom, SR, UFO2000, UFO: Alien Invasion, X-Force: Fight For Destiny, Xenowar -## X-COM: UFO Defense [6] +## X-COM: UFO Defense [7] -- Inspired entries: Open Apocalypse, OpenXcom, UFO2000, UFO: Alien Invasion, X-Force: Fight For Destiny, Xenowar +- Inspired entries: Open Apocalypse, OpenXcom, SR, UFO2000, UFO: Alien Invasion, X-Force: Fight For Destiny, Xenowar + +## X-Moto [1] + +- Inspired entries: Bloboats ## XKobo [1] @@ -2078,6 +2245,14 @@ - Inspired entries: XPilot NG +## Yandere Simulator [1] + +- Inspired entries: OpenYandere + +## Yu-Gi-Oh! [1] + +- Inspired entries: Heroes of Civilizations + ## Z [2] - Inspired entries: Zed Online, Zod Engine