synchronization inspirations between entries and inspirations list

This commit is contained in:
Trilarion 2020-09-06 10:05:36 +02:00
parent 469f9fa690
commit cd67ffe536
12 changed files with 384 additions and 176 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,7 +9,6 @@
- Code language: C, C++
- Code license: LGPL-2.1
Remake of Creatures.
Restarted in 2020.
## Building

View File

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

View File

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

View File

@ -1,7 +1,6 @@
# Seven Kingdoms: Ancient Adversaries
- Home: https://7kfans.com/
- Media: <https://en.wikipedia.org/wiki/Seven_Kingdoms_(video_game)>
- 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

View File

@ -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: <https://en.wikipedia.org/wiki/Ace_of_Spades_(video_game)>
## 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: <https://en.wikipedia.org/wiki/Freelancer_(video_game)>
## 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: <https://en.wikipedia.org/wiki/Seven_Kingdoms_(video_game)>
## sfxr [1]
@ -1429,14 +1528,17 @@
## Ship Simulator 2006 [1]
- Inspired entries: Bridge Command
- Media: <https://en.wikipedia.org/wiki/Ship_Simulator_(video_game)>
## Ship Simulator 2008 [1]
- Inspired entries: Bridge Command
- Media: <https://en.wikipedia.org/wiki/Ship_Simulator_(video_game)>
## Ship Simulator Extremes [1]
- Inspired entries: Bridge Command
- Media: <https://en.wikipedia.org/wiki/Ship_Simulator_(video_game)>
## 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: <https://en.wikipedia.org/wiki/SimCity_(1989_video_game)>
## 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: <https://en.wikipedia.org/wiki/Super_Monkey_Ball_(video_game)>
## 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: <https://en.wikipedia.org/wiki/Warlords_(game_series)>
## 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