This commit is contained in:
Trilarion 2020-04-16 20:21:14 +02:00
parent 48ade4bc0b
commit 1ca7c6c12d
10 changed files with 346 additions and 183 deletions

View File

@ -7,6 +7,11 @@ http://cyxdown.free.fr/bs/
http://cyxdown.free.fr/f2b/
http://dead-code.org/home/
https://github.com/restorer/gloomy-dungeons-2
https://github.com/WohlSoft/PGE-Project
https://en.wikipedia.org/wiki/List_of_free_and_open-source_Android_applications#Games
https://notabug.org/Calinou/awesome-gamedev#games
https://forum.freegamedev.net/viewtopic.php?f=20&t=11627
https://www.old-games.ru/forum/threads/nekommercheskie-analogi-izvestnyx-igr.40868/page-9
https://github.com/MyreMylar/pygame_gui
http://e-adventure.e-ucm.es/login/index.php (games of eAdventure)
http://ethernet.wasted.ch/

View File

@ -1,4 +1,4 @@
start: title description property+ _E note _E? building
start: title description property+ _E note? _E? building
title: "# " /(?! ).+(?<! )/ "\n" _E // not starting or ending with a space
@ -12,4 +12,4 @@ building: "## Building\n" _E property+ _E? note // the "building" section
note: /(?![\-#]).*\n/* // Unstructured text, not starting with - or #
_E: /^$\n/m // empty new line (filtered from tree)
_E: /^$\n/m // empty new line

View File

@ -1,8 +1,8 @@
start: header entries*
start: header entry*
header: "# " name " (" number ")\n" _E
entries: "## " name " (" number ")\n" _E property+ _E
entry: "## " name " (" number ")\n" _E property+ _E
property: "- " _key ": " _value "\n"
_key: /(?! ).+?(?=:)(?<! )/ // key: everything until next ":", not beginning or ending with a space

View File

@ -22,11 +22,14 @@ if __name__ == "__main__":
# read developer info
developer_info = osg.read_developer_info()
osg.write_developer_info(developer_info)
osg.write_developer_info(developer_info) # write again just to make nice
# assemble info
entries = osg.assemble_infos()
# cross-check
osg.compare_entries_developers(entries, developer_info)
# loop over infos
developers = ''
try:

View File

@ -0,0 +1,9 @@
from utils import constants as c, utils, osg
if __name__ == "__main__":
inspirations = osg.read_inspirations_info()
osg.write_inspirations_info(inspirations) # write again just to check integrity
# assemble info
entries = osg.assemble_infos()

View File

@ -20,7 +20,7 @@ class ListingTransformer(lark.Transformer):
def name(self, x):
return ('name', x[0].value)
def entries(self, x):
def entry(self, x):
d = {}
for key, value in x:
d[key] = value
@ -32,6 +32,34 @@ class ListingTransformer(lark.Transformer):
def start(self, x):
return x
# transformer
class EntryTransformer(lark.Transformer):
def start(self, x):
d = {}
for key, value in x:
d[key] = value
return d
def title(self, x):
return ('title', x[0].value)
def description(self, x):
return ('description', x[0].value)
def property(self, x):
return (str.casefold(x[0].value), x[1].value)
def note(self, x):
return ('note', x[0].value)
def building(self, x):
d = {}
for key, value in x:
d[key] = value
return ('building', d)
essential_fields = ('Home', 'State', 'Keywords', 'Code repository', 'Code language', 'Code license')
valid_fields = (
@ -72,6 +100,7 @@ regex_sanitize_name = re.compile(r"[^A-Za-z 0-9-+]+")
regex_sanitize_name_space_eater = re.compile(r" +")
valid_developer_fields = ('name', 'games', 'contact', 'organization', 'home')
valid_inspiration_fields = ('name', 'inspired entries')
comment_string = '[comment]: # (partly autogenerated content, edit with care, read the manual before)'
@ -383,18 +412,27 @@ def read_developer_info():
developers = read_and_parse(developer_file, grammar_file, transformer)
# now transform a bit more
for index, dev in enumerate(developers):
# check for valid keys
for field in dev.keys():
if field not in valid_developer_fields:
raise RuntimeError('Unknown developer field "{}" for developer: {}.'.format(field, dev['name']))
# strip from name or organization (just in case)
for field in ('name', 'organization'):
if field in dev:
dev[field] = dev[field].strip()
# split games, contact (are lists)
for field in ('games', 'contact'):
if field in dev:
content = dev[field]
content = content.split(',')
content = [x.strip() for x in content]
dev[field] = content
# check for duplicate names entries
names = [dev['name'] for dev in developers]
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 developer names: {}'.format(', '.join(duplicate_names)))
return developers
@ -445,7 +483,27 @@ def read_inspirations_info():
inspirations_file = os.path.join(c.root_path, 'inspirations.md')
grammar_file = os.path.join(c.code_path, 'grammar_listing.lark')
transformer = ListingTransformer()
return read_and_parse(inspirations_file, grammar_file, transformer)
inspirations = read_and_parse(inspirations_file, grammar_file, transformer)
# now transform a bit more
for index, inspiration in enumerate(inspirations):
# check for valid keys
for field in inspiration.keys():
if field not in valid_inspiration_fields:
raise RuntimeError('Unknown field "{}" for inspiration: {}.'.format(field, inspiration['name']))
# split lists
for field in ('inspired entries', ):
if field in inspiration:
content = inspiration[field]
content = content.split(',')
content = [x.strip() for x in content]
inspiration[field] = content
# check for duplicate names entries
names = [inspiration['name'] for inspiration in inspirations]
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)))
return inspirations
def write_inspirations_info(inspirations):
@ -454,4 +512,79 @@ def write_inspirations_info(inspirations):
:param inspirations:
:return:
"""
inspirations_file = os.path.join(c.root_path, 'inspirations.md')
# comment
content = '{}\n'.format(comment_string)
# number of developer
content += '# Inspirations ({})\n\n'.format(len(inspirations))
# sort by name
inspirations.sort(key=lambda x: str.casefold(x['name']))
# iterate over them
for inspiration in inspirations:
# inspiration name
content += '## {} ({})\n\n'.format(inspiration['name'], len(inspiration['inspired entries']))
# games
content += '- Inspired entries: {}\n'.format(', '.join(sorted(inspiration['inspired entries'], key=str.casefold)))
# all the remaining in alphabetical order
for field in sorted(inspiration.keys()):
if field not in ('name', 'inspired entries'):
value = inspiration[field]
field = field.capitalize()
if isinstance(value, str):
content += '- {}: {}\n'.format(field, value)
else:
content += '- {}: {}\n'.format(field, ', '.join(sorted(value, key=str.casefold)))
content += '\n'
# write
inspirations_file = os.path.join(c.root_path, 'inspirations2.md')
utils.write_text(inspirations_file, content)
def compare_entries_developers(entries, developers):
"""
Cross checks the game entries lists and the developers lists.
:param entries: List of game entries
:param developers: List of developers
"""
# from the entries create a dictionary with developer names
devs1 = {}
for entry in entries:
name = entry['name']
for dev in entry.get('developer', []):
if dev in devs1:
devs1[dev].append(name)
else:
devs1[dev] = [name]
devs1_names = set(devs1.keys())
# from the developers create a dictionary with developer names
devs2 = dict(zip((dev['name'] for dev in developers), (dev['games'] for dev in developers)))
devs2_names = set(devs2.keys())
# devs only in entries
for dev in devs1_names - devs2_names:
print('Warning: dev "{}" only in entries ({}), not in developers'.format(dev, ','.join(devs1[dev])))
# devs only in developers
for dev in devs2_names - devs1_names:
print('Warning: dev "{}" only in developers ({}), not in entries'.format(dev, ','.join(devs2[dev])))
# for those in both, check that the games lists are equal
for dev in devs1_names.intersection(devs2_names):
games1 = set(devs1[dev])
games2 = set(devs2[dev])
delta = games1 - games2
if delta:
print('Warning: dev "{}" has games in entries ({}) that are not present in developers'.format(dev, ', '.join(delta)))
delta = games2 - games1
if delta:
print('Warning: dev "{}" has games in developers ({}) that are not present in entries'.format(dev, ', '.join(delta)))

View File

@ -1,10 +1,5 @@
[comment]: # (partly autogenerated content, edit with care, read the manual before)
# Developer (336)
## Andy Southgate (1)
- Games: Adanaxis
- Organization: Mushware Limited
# Developer (369)
## Akira Higuchi (1)
@ -22,6 +17,11 @@
- Games: Blinken
## Alex Clark (1)
- Games: Abe's Amazing Adventure
- Contact: jazkat@SF
## Alex Gleason (1)
- Games: Vegan on a Desert Island
@ -59,9 +59,10 @@
- Games: OpenRTS
- Contact: rtsfan@SF
## Andy Southgate (1)
## Andy Southgate (2)
- Games: SDL Asylum
- Games: Adanaxis, SDL Asylum
- Organization: Mushware Limited
## Anthony Mariette Louis Liekens (1)
@ -81,6 +82,11 @@
- Games: Hex-a-hop
- Contact: amuzen@SF
## Armin Bajramovic (1)
- Games: Advanced Strategic Command
- Contact: armin906@SF
## Arne Reiners (1)
- Games: GL-117
@ -93,6 +99,12 @@
- Games: Slingshot
## Ben Brian (1)
- Games: 0 A.D.
- Contact: historic_bruno@SF, historicbruno@GH
- Home: https://benbrian.net/
## Ben Kibbey (1)
- Games: CBoard
@ -138,12 +150,6 @@
- Games: XBill
## Ben Brian (1)
- Games: 0 A.D.
- Home: https://benbrian.net/
- Contact: historic_bruno@SF, historicbruno@GH
## Bruno Ethvignot (2)
- Games: Powermanga, TecnoballZ
@ -173,6 +179,11 @@
- Games: RedShift
## Christian Schramm (1)
- Games: Advanced Strategic Command
- Contact: Ed-von-Schleck@GH
## Chuck Simmons (1)
- Games: VMS Empire
@ -197,6 +208,12 @@
- Games: Gilbert and the doors
## Daniel Ginovker (1)
- Games: 2006-rebotted
- Contact: dginovker@GH
- Home: https://dginovker.github.io/
## Daniel Loreck (1)
- Games: JSkat
@ -206,21 +223,6 @@
- Games: Colobot: Gold Edition
- Organization: Epsitec
## Nicolas Auvray (1)
- Games: 0 A.D.
- Contact: itms@SF, na-Itms@GH
## Philip Taylor (1)
- Games: 0 A.D.
- Contact: philiptaylor@SF, philiptaylor@GH
## Lancelot de Ferrière (1)
- Games: 0 A.D.
- Contact: wraitii@SF, wraitii@GH
## Daniele Napolitano (1)
- Games: Gweled
@ -234,11 +236,6 @@
- Games: Turious
- Contact: darkrose@GL
## Jan-Otto Kröpke (1)
- Games: 2Moons Browsergame Engine
- Contact: jkroepke@GH
## David Gibbs (1)
- Games: Omega-rpg
@ -288,16 +285,6 @@
- Games: Ri-li
## Piwai (1)
- Games: 2H4U
- Contact: insa_piwai@SF
## Kilgore Trout Mask Replicant (1)
- Games: 1oom
- Contact: KilgoreTroutMaskReplicant@GL
## Don Llopis (1)
- Games: XInvaders 3D
@ -311,6 +298,11 @@
- Games: iortcw
## Dorfdrull (1)
- Games: Advanced Strategic Command
- Contact: dorfdrull@SF
## Drummyfish (1)
- Games: Steamer Duck
@ -361,6 +353,11 @@
- Games: Kobo Deluxe
## Erik Johansson (1)
- Games: 0 A.D.
- Contact: feneur@SF
## Etienne Sobole (1)
- Games: Powermanga
@ -409,6 +406,11 @@
- Games: Ksudoku
## Frederik Kesting (1)
- Games: Advanced Strategic Command
- Contact: ocl4nis@SF
## Fredrik Portstrom (1)
- Games: Sinatra
@ -426,6 +428,12 @@
- Games: Abe's Amazing Adventure
- Contact: gabortorok@SF
## Gabriele Cirulli (1)
- Games: 2048
- Contact: gabrielecirulli@GH
- Home: https://www.gabrielecirulli.com/
## Ghoulsblade (1)
- Games: Iris2
@ -472,31 +480,6 @@
- Games: Fairy-Max
## Dorfdrull (1)
- Games: Advanced Strategic Command
- Contact: dorfdrull@SF
## Michael Moerz (1)
- Games: Advanced Strategic Command
- Contact: natoka@SF
## Armin Bajramovic (1)
- Games: Advanced Strategic Command
- Contact: armin906@SF
## Frederik Kesting (1)
- Games: Advanced Strategic Command
- Contact: ocl4nis@SF
## Torsten Maekler (1)
- Games: Advanced Strategic Command
- Contact: tmaekler@SF
## Harmen van der Wal (1)
- Games: Hypercube
@ -513,6 +496,11 @@
- Games: Xjig
## Hilarious001 (1)
- Games: 2Moons Browsergame Engine
- Contact: Hilarious001@GH
## HoleInTheHeadStudios (2)
- Games: Magic Gardeners Tournament, Search for the Red Herring
@ -525,7 +513,7 @@
## Horst Kevin (1)
- Games: Fictional Air Combat
- Contact: horstkevin@SF
- Contact: horstkevin@SF
## Hubert Lamontagne (1)
@ -576,6 +564,11 @@
- Games: JSkat
## Jan-Otto Kröpke (1)
- Games: 2Moons Browsergame Engine
- Contact: jkroepke@GH
## Jani Kajala (1)
- Games: Cat Mother Dead Justice
@ -591,7 +584,7 @@
## Jason Rohrer (8)
- Games: Between, Cultivation, Gravitation, One Hour One Life, Passage, Primrose, Sleep Is Death, Transcend
- Contact: jcr13@SF, jasonrohrer@GH
- Contact: jasonrohrer@GH, jcr13@SF
## Jay Fenlason (1)
@ -622,6 +615,12 @@
- Games: Kobo Deluxe
## Jerry Jiang (1)
- Games: 2048
- Contact: tpcstld@GH
- Home: https://tpcstld.me/
## Jesse Smith (1)
- Games: Atomic Tanks
@ -638,7 +637,7 @@
## Jimmy Christensen (2)
- Games: OldSkool Gravity Game, SDL-Ball
- Contact: dusteddk@SF, DusteDdk@GH
- Contact: DusteDdk@GH, dusteddk@SF
## Joan Queralt Molina (1)
@ -661,11 +660,6 @@
- Games: Alex the Allegator 4
- Contact: peitz@SF
## Erik Johansson (1)
- Games: 0 A.D.
- Contact: feneur@SF
## Johannes Bergmeier (1)
- Games: Ksudoku
@ -699,9 +693,9 @@
- Games: Trip on the Funny Boat
## Joseph Hewitt (3)
## Joseph Hewitt (4)
- Games: Dungeon Monkey Eternal, GearHead, GearHead 2
- Games: Dungeon Monkey Eternal, GearHead, GearHead 2, Dungeon Monkey Unlimited
- Contact: jwvhewitt@GH, jwvhewitt@SF
## Jujucece (1)
@ -728,30 +722,6 @@
- Games: Blasphemer
## Jerry Jiang (1)
- Games: 2048
- Home: https://tpcstld.me/
- Contact: tpcstld@GH
## Gabriele Cirulli (1)
- Games: 2048
- Home: https://www.gabrielecirulli.com/
- Contact: gabrielecirulli@GH
## Daniel Ginovker (1)
- Games: 2006-rebotted
- Home: https://dginovker.github.io/
- Contact: dginovker@GH
## lo-th (1)
- Games: 3d.city
- Home: http://lo-th.github.io/labs/index.html
- Contact: lo-th@GH
## Jérôme Bolot (1)
- Games: TecnoballZ
@ -764,6 +734,11 @@
- Games: Cannon Smash
## kantharos (1)
- Games: Aklabeth
- Contact: kantharos@SF
## Karel Fiser (1)
- Games: Bombic2
@ -776,10 +751,26 @@
- Games: Deer Portal
## Kayl (1)
- Games: 2H4U
- Contact: kaylnet@SF
## Kenta Cho (2)
- Games: A7Xpg, Consomaton
## Kieran Pilkington (1)
- Games: 0 A.D.
- Contact: KieranP@GH
- Home: https://k776.tumblr.com/
## Kilgore Trout Mask Replicant (1)
- Games: 1oom
- Contact: KilgoreTroutMaskReplicant@GL
## Klivo (1)
- Games: Pendumito
@ -793,28 +784,44 @@
- Games: Krystal Drop
- Contact: krys@SF
## Lancelot de Ferrière (1)
- Games: 0 A.D.
- Contact: wraitii@GH, wraitii@SF
## Laurence R. Brothers (1)
- Games: Omega-rpg
## Laurent (1)
- Games: 2048
- Contact: marg51@GH
- Home: https://uto.io/
## Laurent Guyon (1)
- Games: TecnoballZ
## Laurent (1)
- Games: 2048
- Home: https://uto.io/
- Contact: marg51@GH
## legoluft (1)
- Games: Krank
## leper (1)
- Games: 0 A.D.
- Contact: leper@GH
## Linley Henzell (2)
- Games: Liberation Circuit, Overgod
## lo-th (1)
- Games: 3d.city
- Contact: lo-th@GH
- Home: http://lo-th.github.io/labs/index.html
## Locomalito (1)
- Games: L'Abbaye des Morts
@ -866,6 +873,11 @@
- Games: MUSoSu
- Contact: marios_v@SF
## Mark Dickenson (1)
- Games: Alien Assault Traders
- Contact: akapanamajack@SF
## Mark Harman (1)
- Games: Apricots
@ -882,24 +894,14 @@
- Games: JSkat
## Martin Trautmann (1)
- Games: Holtz
## Martin Bickel (1)
- Games: Advanced Strategic Command
- Contact: valharis@SF, ValHaris@GH
- Contact: ValHaris@GH, valharis@SF
## Christian Schramm (1)
## Martin Trautmann (1)
- Games: Advanced Strategic Command
- Contact: Ed-von-Schleck@GH
## valuial (1)
- Games: Advanced Strategic Command
- Contact: valuial@GH
- Games: Holtz
## Masanao Izumo (1)
@ -966,6 +968,11 @@
- Games: Terminal Overload
## Michael Moerz (1)
- Games: Advanced Strategic Command
- Contact: natoka@SF
## Michael Speck (4)
- Games: LBreakout2, LBreakoutHD, LTris, Online Chess Club
@ -1016,15 +1023,16 @@
- Games: OpenAlchemist
## Mushware Limited (1)
- Games: Adanaxis
## New Breed Software (2)
- Games: 3D Pong, Tux Paint
- Home: http://newbreedsoftware.com/
## Nicolas Auvray (1)
- Games: 0 A.D.
- Contact: itms@SF, na-Itms@GH
## Nicolas Hadacek (1)
- Games: KMines
@ -1070,6 +1078,11 @@
- Games: OGS Mahjong
## Ozan Kurt (1)
- Games: 2Moons Browsergame Engine
- Contact: OzanKurt@GH
## Pascal von der Heiden (1)
- Games: Bloodmasters
@ -1100,15 +1113,24 @@
- Games: Free Space Colonization
- Contact: bitnapper@SF
## Paul Robson (1)
- Games: Aklabeth
## Paul Rouget (1)
- Games: Runfield
## Paul Wise (1)
## Paul Wise (2)
- Games: Hex-a-hop
- Games: Hex-a-hop, Alex the Allegator 4
- Contact: pabs3@SF
## Pedro Izecksohn (1)
- Games: Abe's Amazing Adventure
- Contact: izecksohn@SF
## Pete Shinners (1)
- Games: SolarWolf
@ -1131,6 +1153,11 @@
- Games: KMines
## Philip Taylor (1)
- Games: 0 A.D.
- Contact: philiptaylor@GH, philiptaylor@SF
## Philippe Bousquet (1)
- Games: DarkCity
@ -1140,19 +1167,24 @@
- Games: GL-117
## Piwai (1)
- Games: 2H4U
- Contact: insa_piwai@SF
## plaimi (2)
- Games: Limbs Off, Q
## Puskutraktori (1)
- Games: Trip on the Funny Boat
## Pureon (1)
- Games: 0 A.D.
- Contact: ipureon@SF
## Puskutraktori (1)
- Games: Trip on the Funny Boat
## PyMike (1)
- Games: Mrfuze
@ -1201,6 +1233,11 @@
- Games: Bouncy the Hungry Rabbit
## Rick Thomson (1)
- Games: Alien Assault Traders
- Contact: tarnus@SF
## Riley Rainey (1)
- Games: ACM
@ -1248,6 +1285,11 @@
- Games: TecnoballZ
## s0600204 (1)
- Games: 0 A.D.
- Contact: s0600204@GH
## Sam Hocevar (2)
- Games: Not Pacman, Powermanga
@ -1273,11 +1315,6 @@
- Games: Freya Game Engine
- Contact: pond@SF
## Kayl (1)
- Games: 2H4U
- Contact: kaylnet@SF
## Shard (1)
- Games: Anagramarama
@ -1304,32 +1341,6 @@
- Games: 4D-TRIS
- Contact: simzer@SF
## s0600204 (1)
- Games: 0 A.D.
- Contact: s0600204@GH
## Hilarious001 (1)
- Games: 2Moons Browsergame Engine
- Contact: Hilarious001@GH
## Ozan Kurt (1)
- Games: 2Moons Browsergame Engine
- Contact: OzanKurt@GH
## leper (1)
- Games: 0 A.D.
- Contact: leper@GH
## Kieran Pilkington (1)
- Games: 0 A.D.
- Home: https://k776.tumblr.com/
- Contact: KieranP@GH
## Simon Peter (1)
- Games: Kobo Deluxe
@ -1492,20 +1503,15 @@
- Games: Go Ollie!
- Organization: Charlie Dog Games
## Torsten Maekler (1)
- Games: Advanced Strategic Command
- Contact: tmaekler@SF
## Troels Kofoed Jacobsen (1)
- Games: Qonk
## Alex Clark (1)
- Games: Abe's Amazing Adventure
- Contact: jazkat@SF
## Pedro Izecksohn (1)
- Games: Abe's Amazing Adventure
- Contact: izecksohn@SF
## Tuscan Knox (1)
- Games: Shotgun Debugger
@ -1515,6 +1521,11 @@
- Games: OpenMortal
- Contact: upi@SF
## valuial (1)
- Games: Advanced Strategic Command
- Contact: valuial@GH
## Vianney Lecroart (1)
- Games: Mtp Target
@ -1556,8 +1567,8 @@
## Yuri D'Elia (2)
- Games: FLTK Recycling Game!, Garith
- Home: http://www.thregr.org/~wavexx/
- Contact: wavexx@GL
- Home: http://www.thregr.org/~wavexx/
## Zack Middleton (1)

View File

@ -10,7 +10,7 @@ _Space browsergame framework._
- Code repository: https://github.com/jkroepke/2Moons.git (archived), https://github.com/steemnova/steemnova.git (+)
- Code language: PHP, JavaScript
- Code license: MIT
- Developer: Jan-Otto Kröpke, Ozan Kurt
- Developer: Jan-Otto Kröpke, Ozan Kurt, Hilarious001
## Building

View File

@ -9,6 +9,7 @@ _Remake of Akalabeth: World of Doom aka Ultima 0._
- Code repository: (see download)
- Code language: C
- Code license: GPL-2.0
- Developer: kantharos, Paul Robson
Aklabeth is a remake of Akalabeth, or 'Ultima 0' as it is often called, that was programmed by Richard Garriott for the Apple II computer in 1980.
Aklabeth 1.0 has been written by Paul Robson and was originally released in 2004 under the GPL 2. His homepage has disappeared a long time ago.

View File

@ -9,6 +9,7 @@ _Alien Assault Traders is an online, web-based, turn-based strategy space tradin
- Code repository: https://github.com/tarnus/aatraders.git, https://gitlab.com/osgames/aatraders.git (+)
- Code language: PHP
- Code license: GPL-2.0
- Developer: Mark Dickenson, Rick Thomson
## Building