a few additions from backlog and working on scripts

This commit is contained in:
Trilarion 2019-09-16 12:37:52 +02:00
parent 49424eb857
commit 4fab32b287
32 changed files with 359 additions and 243 deletions

7
.gitignore vendored
View File

@ -1,6 +1,5 @@
/.idea /.idea
/tools/archive/**
/tools/conversion/**
/tools/git_repositories.json
__pycache__ __pycache__
/is_already_included.txt /local.properties
/tools/archive/**
/tools/lgw-import

View File

@ -3,11 +3,11 @@
**[Dynamic HTML table](https://trilarion.github.io/opensourcegames/)** of the entries / Development **[Blog](https://trilarion.blogspot.com/search/label/osgames)** / **[Statistics](statistics.md#statistics)** **[Dynamic HTML table](https://trilarion.github.io/opensourcegames/)** of the entries / Development **[Blog](https://trilarion.blogspot.com/search/label/osgames)** / **[Statistics](statistics.md#statistics)**
[comment]: # (start of autogenerated content, do not edit) [comment]: # (start of autogenerated content, do not edit)
**[All entries](games/tocs/_all.md#All)** (973) **[All entries](games/tocs/_all.md#All)** (976)
By category: **[Action](games/tocs/_action.md#action)** (182), **[Adventure](games/tocs/_adventure.md#adventure)** (27), **[Arcade](games/tocs/_arcade.md#arcade)** (56), **[Board game](games/tocs/_board-game.md#board-game)** (9), **[Card game](games/tocs/_card-game.md#card-game)** (1), **[Educational](games/tocs/_educational.md#educational)** (5), **[Framework](games/tocs/_framework.md#framework)** (61), **[Game engine](games/tocs/_game-engine.md#game-engine)** (43), **[Library](games/tocs/_library.md#library)** (22), **[Music](games/tocs/_music.md#music)** (6), **[Platform](games/tocs/_platform.md#platform)** (32), **[Puzzle](games/tocs/_puzzle.md#puzzle)** (79), **[Remake](games/tocs/_remake.md#remake)** (448), **[Role playing](games/tocs/_role-playing.md#role-playing)** (142), **[Simulation](games/tocs/_simulation.md#simulation)** (72), **[Sports](games/tocs/_sports.md#sports)** (15), **[Strategy](games/tocs/_strategy.md#strategy)** (213), **[Tool](games/tocs/_tool.md#tool)** (17), **[Visual novel](games/tocs/_visual-novel.md#visual-novel)** (4) By category: **[Action](games/tocs/_action.md#action)** (182), **[Adventure](games/tocs/_adventure.md#adventure)** (27), **[Arcade](games/tocs/_arcade.md#arcade)** (56), **[Board game](games/tocs/_board-game.md#board-game)** (9), **[Card game](games/tocs/_card-game.md#card-game)** (1), **[Educational](games/tocs/_educational.md#educational)** (5), **[Framework](games/tocs/_framework.md#framework)** (62), **[Game engine](games/tocs/_game-engine.md#game-engine)** (45), **[Library](games/tocs/_library.md#library)** (22), **[Music](games/tocs/_music.md#music)** (6), **[Platform](games/tocs/_platform.md#platform)** (32), **[Puzzle](games/tocs/_puzzle.md#puzzle)** (79), **[Remake](games/tocs/_remake.md#remake)** (450), **[Role playing](games/tocs/_role-playing.md#role-playing)** (142), **[Simulation](games/tocs/_simulation.md#simulation)** (72), **[Sports](games/tocs/_sports.md#sports)** (15), **[Strategy](games/tocs/_strategy.md#strategy)** (213), **[Tool](games/tocs/_tool.md#tool)** (17), **[Visual novel](games/tocs/_visual-novel.md#visual-novel)** (4)
By platform: **[Windows](games/tocs/_windows.md#windows)** (234), **[Linux](games/tocs/_linux.md#linux)** (217), **[macOS](games/tocs/_macos.md#macos)** (131), **[Android](games/tocs/_android.md#android)** (34), **[iOS](games/tocs/_ios.md#ios)** (4), **[Web](games/tocs/_web.md#web)** (41) By platform: **[Windows](games/tocs/_windows.md#windows)** (236), **[Linux](games/tocs/_linux.md#linux)** (218), **[macOS](games/tocs/_macos.md#macos)** (132), **[Android](games/tocs/_android.md#android)** (34), **[iOS](games/tocs/_ios.md#ios)** (4), **[Web](games/tocs/_web.md#web)** (41)
[comment]: # (end of autogenerated content) [comment]: # (end of autogenerated content)

View File

@ -1696,6 +1696,14 @@
"role playing, singleplayer", "role playing, singleplayer",
"<a href=\"https://git.code.sf.net/p/dnt/code\">Source</a> - C++ - GPL-3.0" "<a href=\"https://git.code.sf.net/p/dnt/code\">Source</a> - C++ - GPL-3.0"
], ],
[
"Do It Yourself Doom With SDL (<a href=\"https://github.com/amroibrahim/DIYDoom\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/do_it_yourself_doom_with_sdl.md\">entry</a>)",
"A DOOM clone engine.",
"",
"beta / active",
"game engine, inspired by DOOM, remake",
"<a href=\"https://github.com/amroibrahim/DIYDoom.git\">Source</a> - C++ - MIT"
],
[ [
"Domination (<a href=\"http://domination.sourceforge.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/domination.md\">entry</a>)", "Domination (<a href=\"http://domination.sourceforge.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/domination.md\">entry</a>)",
"Is a bit like the well known board game of Risk or RisiKo.", "Is a bit like the well known board game of Risk or RisiKo.",
@ -2208,6 +2216,14 @@
"game engine, clone, framework, inspired by Diablo", "game engine, clone, framework, inspired by Diablo",
"<a href=\"https://github.com/clintbellanger/flare-engine.git\">Source</a> - C++, Java - GPL-3.0" "<a href=\"https://github.com/clintbellanger/flare-engine.git\">Source</a> - C++, Java - GPL-3.0"
], ],
[
"Flex Engine (<a href=\"https://ajweeks.com/flex-engine/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/flex_engine.md\">entry</a>)",
"Game engine.",
"",
"beta / active",
"framework",
"<a href=\"https://github.com/ajweeks/FlexEngine.git\">Source</a> - C++ - MIT"
],
[ [
"FlightGear (<a href=\"https://www.flightgear.org/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/flightgear.md\">entry</a>)", "FlightGear (<a href=\"https://www.flightgear.org/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/flightgear.md\">entry</a>)",
"Flight simulator developed since 1997.", "Flight simulator developed since 1997.",
@ -4265,7 +4281,7 @@
"<a href=\"https://git.octaforge.org/OctaForge/OctaCore.git\">Source</a> - C++ - Custom" "<a href=\"https://git.octaforge.org/OctaForge/OctaCore.git\">Source</a> - C++ - Custom"
], ],
[ [
"Odamex (<a href=\"https://web.archive.org/web/20190516124821/http://www.odamex.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/odamex.md\">entry</a>)", "Odamex (<a href=\"https://odamex.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/odamex.md\">entry</a>)",
"Remake of Doom, Doom II, Heretic, Hexen.", "Remake of Doom, Doom II, Heretic, Hexen.",
"", "",
"beta / active", "beta / active",
@ -4896,6 +4912,14 @@
"remake, commercial content, inspired by Star Wars Episode I: Racer, requires original content", "remake, commercial content, inspired by Star Wars Episode I: Racer, requires original content",
"<a href=\"https://github.com/OpenSWE1R/openswe1r.git\">Source</a> - C, C++ - GPL-2.0" "<a href=\"https://github.com/OpenSWE1R/openswe1r.git\">Source</a> - C, C++ - GPL-2.0"
], ],
[
"OpenTESArena (<a href=\"https://github.com/afritz1/OpenTESArena\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/opentesarena.md\">entry</a>)",
"Re-implementation of The Elder Scrolls: Arena.",
"",
"beta / active",
"game engine, commercial content, inspired by The Elder Scrolls: Arena, remake, requires original content",
"<a href=\"https://github.com/afritz1/OpenTESArena.git\">Source</a> - C++ - MIT"
],
[ [
"OpenTitus (<a href=\"http://opentitus.sourceforge.net\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/opentitus.md\">entry</a>)", "OpenTitus (<a href=\"http://opentitus.sourceforge.net\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/opentitus.md\">entry</a>)",
"Remake of Titus the Fox.", "Remake of Titus the Fox.",
@ -6337,7 +6361,7 @@
"<a href=\"https://git.code.sf.net/p/arianne/stendhal\">Source</a> - Java - GPL-2.0" "<a href=\"https://git.code.sf.net/p/arianne/stendhal\">Source</a> - Java - GPL-2.0"
], ],
[ [
"StepMania (<a href=\"https://web.archive.org/web/20190605085429/https://www.stepmania.com/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/stepmania.md\">entry</a>)", "StepMania (<a href=\"https://www.stepmania.com/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/stepmania.md\">entry</a>)",
"Dance and rhythm game.", "Dance and rhythm game.",
"<a href=\"https://sourceforge.net/projects/stepmania/files/\">Link</a>", "<a href=\"https://sourceforge.net/projects/stepmania/files/\">Link</a>",
"mature / active", "mature / active",

View File

@ -2,7 +2,7 @@
_Remake of Outrun._ _Remake of Outrun._
- Home: https://github.com/djyt/cannonball/wiki - Home: https://github.com/djyt/cannonball/wiki, http://reassembler.blogspot.com/
- State: beta - State: beta
- Download: https://github.com/djyt/cannonball/wiki#downloads - Download: https://github.com/djyt/cannonball/wiki#downloads
- Keywords: action, commercial content, inspired by Outrun, remake - Keywords: action, commercial content, inspired by Outrun, remake

View File

@ -0,0 +1,16 @@
# Do It Yourself Doom With SDL
_A DOOM clone engine._
- Home: https://github.com/amroibrahim/DIYDoom
- State: beta
- Platform: Windows
- Keywords: game engine, inspired by DOOM, remake
- Code repository: https://github.com/amroibrahim/DIYDoom.git
- Code language: C++
- Code license: MIT
- Code dependencies: SDL2
## Building
- Build system: VisualStudio

View File

@ -2,7 +2,7 @@
_Remake of Enduro._ _Remake of Enduro._
- Home: https://rafaelcastrocouto.github.io/enduro/ - Home: https://rafaelcastrocouto.github.io/enduro/, https://racascou.itch.io/enduro
- State: mature - State: mature
- Play: https://rafaelcastrocouto.github.io/enduro/ - Play: https://rafaelcastrocouto.github.io/enduro/
- Keywords: remake, inspired by Enduro, open content - Keywords: remake, inspired by Enduro, open content

13
games/flex_engine.md Normal file
View File

@ -0,0 +1,13 @@
# Flex Engine
_Game engine._
- Home: https://ajweeks.com/flex-engine/
- State: beta
- Keywords: framework
- Code repository: https://github.com/ajweeks/FlexEngine.git
- Code language: C++
- Code license: MIT
## Building

View File

@ -10,5 +10,7 @@ _Web-based version of the board game Settlers of Catan written in Java._
- Code language: Java - Code language: Java
- Code license: GPL-3.0 - Code license: GPL-3.0
See also http://www.settlers-android-clone.com/
## Building ## Building

View File

@ -2,7 +2,7 @@
_Remake of Doom, Doom II, Heretic, Hexen._ _Remake of Doom, Doom II, Heretic, Hexen._
- Home: https://web.archive.org/web/20190516124821/http://www.odamex.net/ - Home: https://odamex.net/
- State: beta - State: beta
- Keywords: game engine, inspired by Doom + Doom II + Heretic + Hexen, remake, requires original content, shooter - Keywords: game engine, inspired by Doom + Doom II + Heretic + Hexen, remake, requires original content, shooter
- Code repository: https://github.com/odamex/odamex.git - Code repository: https://github.com/odamex/odamex.git

View File

@ -2,7 +2,7 @@
_Clone of Command & Conquer: Generals._ _Clone of Command & Conquer: Generals._
- Home: https://opensage.github.io/ - Home: https://opensage.github.io/, http://timjones.io/blog/tags/opensage/
- State: beta - State: beta
- Download: https://github.com/OpenSAGE/OpenSAGE/releases - Download: https://github.com/OpenSAGE/OpenSAGE/releases
- Platform: Windows, Linux, macOS - Platform: Windows, Linux, macOS

View File

@ -2,7 +2,7 @@
_Remake of Ace of Spades._ _Remake of Ace of Spades._
- Home: http://openspades.yvt.jp/ - Home: http://openspades.yvt.jp/, https://sites.google.com/a/yvt.jp/openspades/
- Media: https://en.wikipedia.org/wiki/Ace_of_Spades_(video_game) - Media: https://en.wikipedia.org/wiki/Ace_of_Spades_(video_game)
- State: beta - State: beta
- Download: https://github.com/yvt/openspades/releases - Download: https://github.com/yvt/openspades/releases

16
games/opentesarena.md Normal file
View File

@ -0,0 +1,16 @@
# OpenTESArena
_Re-implementation of The Elder Scrolls: Arena._
- Home: https://github.com/afritz1/OpenTESArena
- State: beta
- Platform: Windows, Linux, macOS
- Keywords: game engine, commercial content, inspired by The Elder Scrolls: Arena, remake, requires original content
- Code repository: https://github.com/afritz1/OpenTESArena.git
- Code language: C++
- Code license: MIT
- Code dependencies: OpenAL, SDL2, WildMidi
## Building
- Build system: CMake

View File

@ -2,7 +2,7 @@
_Dance and rhythm game._ _Dance and rhythm game._
- Home: https://web.archive.org/web/20190605085429/https://www.stepmania.com/, https://sourceforge.net/projects/stepmania/ - Home: https://www.stepmania.com/, https://sourceforge.net/projects/stepmania/
- State: mature - State: mature
- Download: https://sourceforge.net/projects/stepmania/files/ - Download: https://sourceforge.net/projects/stepmania/files/
- Platform: Windows - Platform: Windows

View File

@ -212,6 +212,7 @@
- **[Digger Remastered](../digger_remastered.md)** (C, GPL-2.0, mature, inactive since 2004) - **[Digger Remastered](../digger_remastered.md)** (C, GPL-2.0, mature, inactive since 2004)
- **[Digital: A Love Story](../digital_a_love_story.md)** (Ren'py, CC-BY-NC-SA, mature) - **[Digital: A Love Story](../digital_a_love_story.md)** (Ren'py, CC-BY-NC-SA, mature)
- **[DNT](../dnt.md)** (C++, GPL-3.0, beta, inactive since 2016) - **[DNT](../dnt.md)** (C++, GPL-3.0, beta, inactive since 2016)
- **[Do It Yourself Doom With SDL](../do_it_yourself_doom_with_sdl.md)** (C++, MIT, beta)
- **[Domination](../domination.md)** (Java, GPL-3.0, mature) - **[Domination](../domination.md)** (Java, GPL-3.0, mature)
- **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature) - **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature)
- **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature) - **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature)
@ -276,6 +277,7 @@
- **[First Strike](../first_strike.md)** (Java, MIT, mature) - **[First Strike](../first_strike.md)** (Java, MIT, mature)
- **[Fish Fillets - Next Generation](../fish_fillets-next_generation.md)** (C++, GPL-2.0, mature) - **[Fish Fillets - Next Generation](../fish_fillets-next_generation.md)** (C++, GPL-2.0, mature)
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature) - **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
- **[Flex Engine](../flex_engine.md)** (C++, MIT, beta)
- **[FlightGear](../flightgear.md)** (C++, GPL-2.0, mature) - **[FlightGear](../flightgear.md)** (C++, GPL-2.0, mature)
- **[Flixel](../flixel.md)** (ActionScript, MIT, mature) - **[Flixel](../flixel.md)** (ActionScript, MIT, mature)
- **[Fluid Table Tennis](../fluid_table_tennis.md)** (JavaScript, MIT, mature, inactive since 2013) - **[Fluid Table Tennis](../fluid_table_tennis.md)** (JavaScript, MIT, mature, inactive since 2013)
@ -612,6 +614,7 @@
- **[OpenSR](../opensr.md)** (C++, GPL-3.0, beta, inactive since 2017) - **[OpenSR](../opensr.md)** (C++, GPL-3.0, beta, inactive since 2017)
- **[OpenSSL](../openssl.md)** (C, Custom, mature) - **[OpenSSL](../openssl.md)** (C, Custom, mature)
- **[OpenSWE1R](../openswe1r.md)** (C, C++, GPL-2.0, beta) - **[OpenSWE1R](../openswe1r.md)** (C, C++, GPL-2.0, beta)
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
- **[OpenTitus](../opentitus.md)** (C, GPL-3.0, beta, inactive since 2014) - **[OpenTitus](../opentitus.md)** (C, GPL-3.0, beta, inactive since 2014)
- **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta) - **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta)
- **[OpenTriad](../opentriad.md)** (Java, GPL-3.0, beta, inactive since 2017) - **[OpenTriad](../opentriad.md)** (Java, GPL-3.0, beta, inactive since 2017)

View File

@ -15,6 +15,7 @@
- **[ENIGMA (development environment)](../enigma_development_environment.md)** (C++, C, GPL-3.0, mature) - **[ENIGMA (development environment)](../enigma_development_environment.md)** (C++, C, GPL-3.0, mature)
- **[F.LF](../flf.md)** (JavaScript, ?, mature) - **[F.LF](../flf.md)** (JavaScript, ?, mature)
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature) - **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
- **[Flex Engine](../flex_engine.md)** (C++, MIT, beta)
- **[Flixel](../flixel.md)** (ActionScript, MIT, mature) - **[Flixel](../flixel.md)** (ActionScript, MIT, mature)
- **[GemRB](../gemrb.md)** (C++, Python, GPL-2.0, mature) - **[GemRB](../gemrb.md)** (C++, Python, GPL-2.0, mature)
- **[Godot](../godot.md)** (C, C++, MIT, mature) - **[Godot](../godot.md)** (C, C++, MIT, mature)

View File

@ -4,6 +4,7 @@
- **[Castle Game Engine](../castle_game_engine.md)** (Pascal, LGPL-2.0, mature) - **[Castle Game Engine](../castle_game_engine.md)** (Pascal, LGPL-2.0, mature)
- **[DelverEngine](../delverengine.md)** (Java, Custom, beta) - **[DelverEngine](../delverengine.md)** (Java, Custom, beta)
- **[DesktopAdventures](../desktopadventures.md)** (C, LGPL-2.1, beta) - **[DesktopAdventures](../desktopadventures.md)** (C, LGPL-2.1, beta)
- **[Do It Yourself Doom With SDL](../do_it_yourself_doom_with_sdl.md)** (C++, MIT, beta)
- **[erampage](../erampage.md)** (C, GPL-2.0, beta, inactive since 2015) - **[erampage](../erampage.md)** (C, GPL-2.0, beta, inactive since 2015)
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature) - **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
- **[Free in the Dark (engine)](../free_in_the_dark_engine.md)** (C, C++, GPL-2.0, beta) - **[Free in the Dark (engine)](../free_in_the_dark_engine.md)** (C, C++, GPL-2.0, beta)
@ -26,6 +27,7 @@
- **[OpenNFS](../opennfs.md)** (C, C++, MIT, beta) - **[OpenNFS](../opennfs.md)** (C, C++, MIT, beta)
- **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta) - **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta)
- **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta) - **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta)
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
- **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta) - **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta)
- **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature) - **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature)
- **[Pentagram](../pentagram.md)** (C++, GPL-2.0, beta, inactive since 2018) - **[Pentagram](../pentagram.md)** (C++, GPL-2.0, beta, inactive since 2018)

View File

@ -132,6 +132,7 @@
- **[OpenRCT2](../openrct2.md)** (C++, GPL-3.0, mature) - **[OpenRCT2](../openrct2.md)** (C++, GPL-3.0, mature)
- **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta) - **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta)
- **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta) - **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta)
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
- **[OPMon](../opmon.md)** (C++, GPL-3.0, beta) - **[OPMon](../opmon.md)** (C++, GPL-3.0, beta)
- **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature) - **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature)
- **[Pang Zero](../pang_zero.md)** (Perl, GPL-2.0, beta, inactive since 2007) - **[Pang Zero](../pang_zero.md)** (Perl, GPL-2.0, beta, inactive since 2007)

View File

@ -87,6 +87,7 @@
- **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta) - **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta)
- **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta) - **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta)
- **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta) - **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta)
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
- **[OPMon](../opmon.md)** (C++, GPL-3.0, beta) - **[OPMon](../opmon.md)** (C++, GPL-3.0, beta)
- **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature) - **[PainTown](../paintown.md)** (C++, Java, Python, 3-clause BSD, mature)
- **[Pentagram](../pentagram.md)** (C++, GPL-2.0, beta, inactive since 2018) - **[Pentagram](../pentagram.md)** (C++, GPL-2.0, beta, inactive since 2018)

View File

@ -77,6 +77,7 @@
- **[dhewm3](../dhewm3.md)** (C, C++, GPL-3.0, mature) - **[dhewm3](../dhewm3.md)** (C, C++, GPL-3.0, mature)
- **[Digbuild](../digbuild.md)** (C, C++, GPL-2.0, beta, inactive since 2011) - **[Digbuild](../digbuild.md)** (C, C++, GPL-2.0, beta, inactive since 2011)
- **[Digger Remastered](../digger_remastered.md)** (C, GPL-2.0, mature, inactive since 2004) - **[Digger Remastered](../digger_remastered.md)** (C, GPL-2.0, mature, inactive since 2004)
- **[Do It Yourself Doom With SDL](../do_it_yourself_doom_with_sdl.md)** (C++, MIT, beta)
- **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature) - **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature)
- **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature) - **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature)
- **[DOOM-iOS](../doom-ios.md)** (C++, GPL-2.0, mature, inactive since 2012) - **[DOOM-iOS](../doom-ios.md)** (C++, GPL-2.0, mature, inactive since 2012)
@ -279,6 +280,7 @@
- **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta) - **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta)
- **[OpenSR](../opensr.md)** (C++, GPL-3.0, beta, inactive since 2017) - **[OpenSR](../opensr.md)** (C++, GPL-3.0, beta, inactive since 2017)
- **[OpenSWE1R](../openswe1r.md)** (C, C++, GPL-2.0, beta) - **[OpenSWE1R](../openswe1r.md)** (C, C++, GPL-2.0, beta)
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
- **[OpenTitus](../opentitus.md)** (C, GPL-3.0, beta, inactive since 2014) - **[OpenTitus](../opentitus.md)** (C, GPL-3.0, beta, inactive since 2014)
- **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta) - **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta)
- **[OpenTriad](../opentriad.md)** (Java, GPL-3.0, beta, inactive since 2017) - **[OpenTriad](../opentriad.md)** (Java, GPL-3.0, beta, inactive since 2017)

View File

@ -47,6 +47,7 @@
- **[DeSmuME](../desmume.md)** (C, C++, GPL-2.0, mature, inactive since 2015) - **[DeSmuME](../desmume.md)** (C, C++, GPL-2.0, mature, inactive since 2015)
- **[dhewm3](../dhewm3.md)** (C, C++, GPL-3.0, mature) - **[dhewm3](../dhewm3.md)** (C, C++, GPL-3.0, mature)
- **[Digital: A Love Story](../digital_a_love_story.md)** (Ren'py, CC-BY-NC-SA, mature) - **[Digital: A Love Story](../digital_a_love_story.md)** (Ren'py, CC-BY-NC-SA, mature)
- **[Do It Yourself Doom With SDL](../do_it_yourself_doom_with_sdl.md)** (C++, MIT, beta)
- **[Domination](../domination.md)** (Java, GPL-3.0, mature) - **[Domination](../domination.md)** (Java, GPL-3.0, mature)
- **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature) - **[Doom Legacy](../doom_legacy.md)** (C++, GPL-2.0, mature)
- **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature) - **[DOOM Retro](../doom_retro.md)** (C, C++, GPL-3.0, mature)
@ -147,6 +148,7 @@
- **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta) - **[OpenRW](../openrw.md)** (C, C++, GPL-3.0, beta)
- **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta) - **[OpenSAGE](../opensage.md)** (C#, LGPL-3.0, beta)
- **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta) - **[OpenSpades](../openspades.md)** (C, C++, AngelScript, GPL-3.0, beta)
- **[OpenTESArena](../opentesarena.md)** (C++, MIT, beta)
- **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta) - **[OpenTomb](../opentomb.md)** (C, C++, Lua, LGPL-3.0, beta)
- **[OpenTyrian](../opentyrian.md)** (C, GPL-2.0, beta, inactive since 2018) - **[OpenTyrian](../opentyrian.md)** (C, GPL-2.0, beta, inactive since 2018)
- **[OPMon](../opmon.md)** (C++, GPL-3.0, beta) - **[OPMon](../opmon.md)** (C++, GPL-3.0, beta)

View File

@ -1,13 +1,13 @@
[comment]: # (autogenerated content, do not edit) [comment]: # (autogenerated content, do not edit)
# Statistics # Statistics
analyzed 973 entries on 2019-09-13 12:10:23 analyzed 976 entries on 2019-09-16 12:36:29
## State ## State
- mature: 556 (57.1%) - mature: 556 (57.0%)
- beta: 415 (42.7%) - beta: 418 (42.8%)
- inactive: 481 (49.4%) - inactive: 481 (49.3%)
##### Inactive State ##### Inactive State
@ -17,15 +17,15 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
##### Language frequency ##### Language frequency
- C++ (36.0%) - C++ (36.2%)
- C (24.6%) - C (24.5%)
- Java (8.1%) - Java (8.1%)
- Python (7.2%) - Python (7.2%)
- JavaScript (6.1%) - JavaScript (6.1%)
- Lua (4.7%) - Lua (4.7%)
- C# (2.8%) - C# (2.8%)
- Pascal (1.7%) - Pascal (1.7%)
- PHP (1.4%) - PHP (1.3%)
- Assembly (0.6%) - Assembly (0.6%)
- Objective-C (0.6%) - Objective-C (0.6%)
- TypeScript (0.6%) - TypeScript (0.6%)
@ -76,9 +76,9 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
##### Licenses frequency ##### Licenses frequency
- GPL-2.0 (37.3%) - GPL-2.0 (37.2%)
- GPL-3.0 (25.6%) - GPL-3.0 (25.6%)
- MIT (13.7%) - MIT (13.9%)
- Custom (3.5%) - Custom (3.5%)
- Apache-2.0 (2.4%) - Apache-2.0 (2.4%)
- zlib (2.1%) - zlib (2.1%)
@ -133,9 +133,9 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
- remake (18.2%) - remake (18.2%)
- strategy (8.6%) - strategy (8.6%)
- action (7.4%) - action (7.4%)
- role playing (5.8%) - role playing (5.7%)
- clone (5.3%) - clone (5.3%)
- requires original content (4.5%) - requires original content (4.6%)
- commercial content (4.1%) - commercial content (4.1%)
- open content (3.3%) - open content (3.3%)
- puzzle (3.2%) - puzzle (3.2%)
@ -143,7 +143,7 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
- shooter (2.8%) - shooter (2.8%)
- framework (2.5%) - framework (2.5%)
- arcade (2.3%) - arcade (2.3%)
- game engine (1.7%) - game engine (1.8%)
- turn-based (1.4%) - turn-based (1.4%)
- platform (1.3%) - platform (1.3%)
- real time (1.3%) - real time (1.3%)
@ -213,8 +213,8 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
- snake-like (0.1%) - snake-like (0.1%)
- soccer (0.1%) - soccer (0.1%)
- text (0.1%) - text (0.1%)
- 4d (0.0%)
- 4D (0.0%) - 4D (0.0%)
- 4d (0.0%)
- action-rpg (0.0%) - action-rpg (0.0%)
- action/adventure (0.0%) - action/adventure (0.0%)
- ardade (0.0%) - ardade (0.0%)
@ -298,7 +298,7 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
## Entries without download or play fields ## Entries without download or play fields
362: 3D Pong, 3Dc, 4D Maze Game, 4D-TRIS, 54321, ACM, Adanaxis, Advanced Strategic Command, AI Wars, Airstrike, alive, Amphetamine, Anagramarama, Ancient Beast, Angry Birds in Python, Antares, Apricots, aquastax, Armor Alley, ativayeban, Atomix, Atrinik, Ball and Paddle, Ball And Wall, Ballerburg SDL, Barony, Bastet, Battle City, Battleround, Battles of Antargis, Beat Harvester, Berusky II, BitRiot, BlakedAwesomenaughts, Bombic2, Bombman, BOOM: Remake, bratwurst, Breakout-VR, Bridge Command, BrowserQuest, Bt Builder, c64-nuclearreaction, Cabbages and Kings, Castle Game Engine, Castle of the Winds in Elm, Cataclysm, CatacombSDL, CaveExpress, CavePacker, cc94, CCCP, chainreaction, Chocolate Duke3D, Choria, Chronoshift, Civilization: Call To Power 2 Source Project, CivOne, Classic Blades of Exile, coab, Colossal Cave Adventure, CommandoJS, Core War, Craft, CrappyBird, CrystalQuest, Cubosphere, D2X-XL, Dark Destiny, Dash Engine, Data Storm, Dawn, Deathchase 3D, DelverEngine, DemiGod, DesktopAdventures, Devilution, DevilutionX, DGEngine, diablo-js, Digbuild, Digital: A Love Story, Doomsday, Dragon Hunt, Duke3D, Dune 2 - The Maker, Dungeon Monkey Eternal, Dungeon Quest, Ecksdee, Endgame: Singularity, EnTT Pacman, EPOH, erampage, EternalWinterWars, Evil Cult, F.LF, Fallen Spire, Falling Time, Fanwor, FAR Colony, fonline, FQuake3, Free in the Dark (engine), freeablo, freeaoe, FreeBlocks, Freeciv-web, FreeFalcon, freegish, Freekick 3, Freeminer, FreeRCT, FreeSiege, Freestars, Frets on Fire X, Friking Shark, Fujo, GalaxyMage Redux, GameLV, ges-code, Gigalomania, glPortal, Gnomescroll, Goblin Camp, GoldenEye: Source, Gorc, Gorillas, Gorillas-rs, Greenius' Civil War, Griefly, Grobots, H-Craft Championship, Hardwar, HarfBuzz, Harris, Hematite, Heroes of Wesnoth, Hex Game, Hextris, Hexwar, Hocoslamfy, Hovertank3D, HTML5 Pacman, Iceball, Inexor, IO Reboot, Iris2, Jagged Alliance 2 Stracciatella, javascript-E.T., Jazz² Resurrection, JediOutcastLinux, Jet-Story, jewelthief, JiGS Interactive Game System, Julius, Jump'n'Bump, Just another Tetris™ clone, KAtomic, Keen Dreams, KGoldrunner, Kingdoms, KittenMaxit, KnightOfWor, ladder, Land of Fire, LastTry, Lemmings.ts, Lemmini, LGeneral, libpng, Lincity, Lionheart Remake, Lips of Suna, Lix, LordsAWar!, lttp-phaser, LÖVE, M.E.W.L., Marblez, Mario Objects, MechCommander 2 Omnitech, Mercenary Commander, Meritous, Micropolis, micropolisJS, MineCraft-One-Week-Challenge, Minesweeper (in C), Mininim, Mirror Magic, mk.js, mkxp, Monsters and Mushrooms, Morpheus Web Remake, movbizz, Mr.Boom, NBlood, Netacka, NFSIISE, Nuncabola, Nuvie, NXEngine-evo, Octaforge, Odamex, Omnispeak, One Way To Go, Open AL Soft, Open Creatures, Open Cube, Open Fodder, Open Hexagon, Open Jumpgate, Open Legend RPG, Open Panzer, Open RSC, Open Soccer Star, Open Zelda, openage, OpenC1, OpenClaw, OpenCrystalCaves, OpenDominion, openDOW, OpenFire, OpenGL Test Drive Remake, OpenLiero, OpenMC2, OpenMoM, OpenNFS, OpenNotrium, OpenRW, OpenSC2K, OpenSkyscraper, OpenSoccer, OpenSR, OpenSWE1R, OpenTriad, OPMon, Orbit-Hopper, Orbium, orona, Ostrich Riders, Our Personal Space, Outpost HD, Panel Attack, Paper Isaac, Pathological, Pax Britannica, Polis, POSTAL 1 Open Source, Powerslide remake, pq2, Prescription Wars, Pthreads-win32, pyORPG, RacerJS, Ragel, ransack, RBDOOM-3-BFG, Reflection Keen, ReQbert, Return of Dr. Destructo, Rigs of Rods, Riiablo, Rise of the Triad for Linux, rock-raiders-remake, Roguish, Room for Change, rpge, Scorched Moon, Scrabble3D, SDLPoP, sensitive-js, Sentient Storage, shadow-of-the-beast-html5, Shadowgrounds, Siege of Avalon : Open Source, Simple-Solitaire, Sine, Sintel The Game, Skifree-HTML5-clone, Slime Volleyball, Slot-Racers, Smash, snake, Song of Albion, Source of Tales, Sourcehold, Space Harrier Clone, Space Nerds In Space, Space Station 13, splexhd, Spring: 1944, SS13 Remake, Star Ruler 2, star-control2, Star-Wars-III, starshatter-open, Stendhal, Strife: Veteran Edition, sundog, Supaxl, super-methane-brothers-gx, SuperFoulEgg, SWP, Tank: Zone of Death, Tanks of Freedom, Tapir, Tenes Empanadas Graciela, Terasology, terrarium, Tetris (in C and NCURSES), The Powder Toy, thiefcatcher, Thyme, Tile World, Tiny Wings, TOMB5, Torrega Race, Total Annihilation 3D, Train, Trinity Reign, TrueCraft, TTDPatch, Tumbly Towers, Turious, Turn of War, TurokEX, TVTower, twin-e, TwinEngine, Tyrian Remake, TyrQuake, UA_source, UFO2000, UlDunAd, uMario, UnCiv, uninvited, VCMI, VDrift, Veloren, WallBall, War Of Kingdom, warcraft-remake, Wario-Land-3, WarMUX, Waste's Edge, WebFun, Wizznic!, wkbre, WWW, Xenowar, XorCurses, XSera, XZ Utils, Yamagi Quake II, yaml-cpp, Zatacka X, Zelda: Mystery of Solarus DX, Zetawar, zlib, zorkClone 365: 3D Pong, 3Dc, 4D Maze Game, 4D-TRIS, 54321, ACM, Adanaxis, Advanced Strategic Command, AI Wars, Airstrike, alive, Amphetamine, Anagramarama, Ancient Beast, Angry Birds in Python, Antares, Apricots, aquastax, Armor Alley, ativayeban, Atomix, Atrinik, Ball and Paddle, Ball And Wall, Ballerburg SDL, Barony, Bastet, Battle City, Battleround, Battles of Antargis, Beat Harvester, Berusky II, BitRiot, BlakedAwesomenaughts, Bombic2, Bombman, BOOM: Remake, bratwurst, Breakout-VR, Bridge Command, BrowserQuest, Bt Builder, c64-nuclearreaction, Cabbages and Kings, Castle Game Engine, Castle of the Winds in Elm, Cataclysm, CatacombSDL, CaveExpress, CavePacker, cc94, CCCP, chainreaction, Chocolate Duke3D, Choria, Chronoshift, Civilization: Call To Power 2 Source Project, CivOne, Classic Blades of Exile, coab, Colossal Cave Adventure, CommandoJS, Core War, Craft, CrappyBird, CrystalQuest, Cubosphere, D2X-XL, Dark Destiny, Dash Engine, Data Storm, Dawn, Deathchase 3D, DelverEngine, DemiGod, DesktopAdventures, Devilution, DevilutionX, DGEngine, diablo-js, Digbuild, Digital: A Love Story, Do It Yourself Doom With SDL, Doomsday, Dragon Hunt, Duke3D, Dune 2 - The Maker, Dungeon Monkey Eternal, Dungeon Quest, Ecksdee, Endgame: Singularity, EnTT Pacman, EPOH, erampage, EternalWinterWars, Evil Cult, F.LF, Fallen Spire, Falling Time, Fanwor, FAR Colony, Flex Engine, fonline, FQuake3, Free in the Dark (engine), freeablo, freeaoe, FreeBlocks, Freeciv-web, FreeFalcon, freegish, Freekick 3, Freeminer, FreeRCT, FreeSiege, Freestars, Frets on Fire X, Friking Shark, Fujo, GalaxyMage Redux, GameLV, ges-code, Gigalomania, glPortal, Gnomescroll, Goblin Camp, GoldenEye: Source, Gorc, Gorillas, Gorillas-rs, Greenius' Civil War, Griefly, Grobots, H-Craft Championship, Hardwar, HarfBuzz, Harris, Hematite, Heroes of Wesnoth, Hex Game, Hextris, Hexwar, Hocoslamfy, Hovertank3D, HTML5 Pacman, Iceball, Inexor, IO Reboot, Iris2, Jagged Alliance 2 Stracciatella, javascript-E.T., Jazz² Resurrection, JediOutcastLinux, Jet-Story, jewelthief, JiGS Interactive Game System, Julius, Jump'n'Bump, Just another Tetris™ clone, KAtomic, Keen Dreams, KGoldrunner, Kingdoms, KittenMaxit, KnightOfWor, ladder, Land of Fire, LastTry, Lemmings.ts, Lemmini, LGeneral, libpng, Lincity, Lionheart Remake, Lips of Suna, Lix, LordsAWar!, lttp-phaser, LÖVE, M.E.W.L., Marblez, Mario Objects, MechCommander 2 Omnitech, Mercenary Commander, Meritous, Micropolis, micropolisJS, MineCraft-One-Week-Challenge, Minesweeper (in C), Mininim, Mirror Magic, mk.js, mkxp, Monsters and Mushrooms, Morpheus Web Remake, movbizz, Mr.Boom, NBlood, Netacka, NFSIISE, Nuncabola, Nuvie, NXEngine-evo, Octaforge, Odamex, Omnispeak, One Way To Go, Open AL Soft, Open Creatures, Open Cube, Open Fodder, Open Hexagon, Open Jumpgate, Open Legend RPG, Open Panzer, Open RSC, Open Soccer Star, Open Zelda, openage, OpenC1, OpenClaw, OpenCrystalCaves, OpenDominion, openDOW, OpenFire, OpenGL Test Drive Remake, OpenLiero, OpenMC2, OpenMoM, OpenNFS, OpenNotrium, OpenRW, OpenSC2K, OpenSkyscraper, OpenSoccer, OpenSR, OpenSWE1R, OpenTESArena, OpenTriad, OPMon, Orbit-Hopper, Orbium, orona, Ostrich Riders, Our Personal Space, Outpost HD, Panel Attack, Paper Isaac, Pathological, Pax Britannica, Polis, POSTAL 1 Open Source, Powerslide remake, pq2, Prescription Wars, Pthreads-win32, pyORPG, RacerJS, Ragel, ransack, RBDOOM-3-BFG, Reflection Keen, ReQbert, Return of Dr. Destructo, Rigs of Rods, Riiablo, Rise of the Triad for Linux, rock-raiders-remake, Roguish, Room for Change, rpge, Scorched Moon, Scrabble3D, SDLPoP, sensitive-js, Sentient Storage, shadow-of-the-beast-html5, Shadowgrounds, Siege of Avalon : Open Source, Simple-Solitaire, Sine, Sintel The Game, Skifree-HTML5-clone, Slime Volleyball, Slot-Racers, Smash, snake, Song of Albion, Source of Tales, Sourcehold, Space Harrier Clone, Space Nerds In Space, Space Station 13, splexhd, Spring: 1944, SS13 Remake, Star Ruler 2, star-control2, Star-Wars-III, starshatter-open, Stendhal, Strife: Veteran Edition, sundog, Supaxl, super-methane-brothers-gx, SuperFoulEgg, SWP, Tank: Zone of Death, Tanks of Freedom, Tapir, Tenes Empanadas Graciela, Terasology, terrarium, Tetris (in C and NCURSES), The Powder Toy, thiefcatcher, Thyme, Tile World, Tiny Wings, TOMB5, Torrega Race, Total Annihilation 3D, Train, Trinity Reign, TrueCraft, TTDPatch, Tumbly Towers, Turious, Turn of War, TurokEX, TVTower, twin-e, TwinEngine, Tyrian Remake, TyrQuake, UA_source, UFO2000, UlDunAd, uMario, UnCiv, uninvited, VCMI, VDrift, Veloren, WallBall, War Of Kingdom, warcraft-remake, Wario-Land-3, WarMUX, Waste's Edge, WebFun, Wizznic!, wkbre, WWW, Xenowar, XorCurses, XSera, XZ Utils, Yamagi Quake II, yaml-cpp, Zatacka X, Zelda: Mystery of Solarus DX, Zetawar, zlib, zorkClone
## Entries with a code repository not on a popular site ## Entries with a code repository not on a popular site
@ -306,17 +306,17 @@ Spludlow Tetris (XX), WarMUX (XX), Orbit-Hopper (2019), Bastet (2018), GoldenEye
## Code dependencies ## Code dependencies
With code dependency field 317 (32.6%) With code dependency field 319 (32.7%)
##### Code dependencies frequency ##### Code dependencies frequency
- SDL (18.9%) - SDL (18.7%)
- SDL2 (10.2%) - SDL2 (10.5%)
- pygame (8.1%) - pygame (8.0%)
- OpenGL (4.2%) - OpenGL (4.2%)
- SFML (3.0%) - SFML (2.9%)
- Allegro (2.5%) - Allegro (2.5%)
- OpenAL (1.9%) - OpenAL (2.1%)
- libGDX (1.5%) - libGDX (1.5%)
- numpy (1.5%) - numpy (1.5%)
- pillow (1.5%) - pillow (1.5%)
@ -424,8 +424,8 @@ With code dependency field 317 (32.6%)
- py2exe (0.2%) - py2exe (0.2%)
- PyAMF (0.2%) - PyAMF (0.2%)
- pycairo (0.2%) - pycairo (0.2%)
- PyGame (0.2%)
- Pygame (0.2%) - Pygame (0.2%)
- PyGame (0.2%)
- pygobject (0.2%) - pygobject (0.2%)
- PyLab (0.2%) - PyLab (0.2%)
- pymunk (0.2%) - pymunk (0.2%)
@ -458,9 +458,10 @@ With code dependency field 317 (32.6%)
- Tween.js (0.2%) - Tween.js (0.2%)
- utfcpp (0.2%) - utfcpp (0.2%)
- VDrift Engine (0.2%) - VDrift Engine (0.2%)
- vorbis (0.2%)
- Vorbis (0.2%) - Vorbis (0.2%)
- vorbis (0.2%)
- Vulkan (0.2%) - Vulkan (0.2%)
- WildMidi (0.2%)
- Xaw3d (0.2%) - Xaw3d (0.2%)
- Xpm lib (0.2%) - Xpm lib (0.2%)
- yaml (0.2%) - yaml (0.2%)
@ -468,42 +469,43 @@ With code dependency field 317 (32.6%)
## Build systems ## Build systems
Build systems information available for 31.3% of all projects. Build systems information available for 31.5% of all projects.
##### Build systems frequency (305) ##### Build systems frequency (307)
- CMake (56.1%) - CMake (56.0%)
- Make (18.4%) - Make (18.2%)
- Autoconf (10.8%) - Autoconf (10.7%)
- Gradle (3.3%) - Gradle (3.3%)
- Scons (3.0%) - Scons (2.9%)
- Maven (2.3%) - Maven (2.3%)
- setup.py (2.3%) - setup.py (2.3%)
- Custom (1.0%) - Custom (1.0%)
- Ant (0.7%) - Ant (0.7%)
- Lazarus project (0.3%) - Lazarus project (0.3%)
- meson (0.3%)
- Meson (0.3%) - Meson (0.3%)
- meson (0.3%)
- py2exe (0.3%) - py2exe (0.3%)
- QMake (0.3%) - QMake (0.3%)
- Rake (0.3%) - Rake (0.3%)
- VisualStudio (0.3%)
- Xcode project (0.3%) - Xcode project (0.3%)
##### C and C++ projects without build system information (367) ##### C and C++ projects without build system information (368)
2H4U, 3D Pong, 3Dc, 54321, Abuse, ACM, Adanaxis, Afternoon Stalker, Airstrike, Aklabeth, Aleph One, alive, Amphetamine, Anagramarama, Angband, Antares, Armagetron Advanced, Armies, ativayeban, Atlantis, Atomic Tanks, Atomiks, Atomix, Attal: Lords of doom, AutoREALM, Avanor, Ball and Paddle, Barony, Batrachians, Battle City, Battle Tanks, Battles of Antargis, Between, Biniax, Birth of the Empires, Blobby Volley 2, Blobwars: Metal Blob Solid, BlockOut II, Bombermaaan, Bombic, Bombic2, Boost (C++ Libraries), Bos Wars, Boson, Bridge Command, BRIQUOLO, Brutal Chess, Bt Builder, BurgerSpace, c64-nuclearreaction, Cadaver, Cat Mother Dead Justice, Cataclysm, Catch Challenger, cc94, CCCP, Circus Linux!, Civilization: Call To Power 2 Source Project, Classic Blades of Exile, Clonepoint, Colonization too, Conquests, Core War, Cosmosmash, Crossfire, Crown and Cutlass, Crypto++, Cytadela, D2X-XL, Daimonin, Danger from the Deep, Dark Oberon, DarkPlaces, Data Storm, Dave Gnukem, Dawn, Deathchase 3D, Defendguin, Deliantra, DeSmuME, Digger Remastered, Doom Legacy, DOOM-iOS, Duel Commander, Duke3D, Duke3d_w32, Dune Dynasty, Dune Legacy, Dungeon Craft, Dungeon Crawl Stone Soup, Dungeon Mapper, DXX-Rebirth, Ecksdee, EDuke32, Endless Sky, ENIGMA (development environment), EnTT Pacman, Epiar, erampage, Erebus, Eternal Lands, Evol Online, Exult, ezQuake, F-1 Spirit, Fall of Imiryn, Fanwor, Forsaken, Free Heroes 2, Free in the Dark (engine), Free Space Colonization, Freeciv Alpha Centauri project, FreeFalcon, Freekick 3, Freeminer, Freenukum Jump'n Run, FreePrince, FreeRails, Freestars, Galaxy Forces V2, GalaxyNG, GameLV, GDash, Gee Whiz, Gigalomania, Globulation 2, GLtron, GM Tools, Gnomescroll, GNU FreeDink, Goblin Camp, Goblin Hack, Golly, GPL Arcade Volleyball, Greenius' Civil War, Grit Game Engine, Grobots, GUSANOS, Gusty's Serpents, H-Craft Championship, H-World, Hammer of Thyrion, Harris, Haxima, Heart of the Alien, Heroes of Wesnoth, Hex Game, HolySpirit, Hovertank3D, I Have No Tomatoes, ICBM3D, Ice Breaker, Inexor, Irrlicht Engine, Iter Vehemens ad Necem, Jagged Alliance 2 Stracciatella, Jet-Story, JFDuke3D, JonoF's Shadow Warrior Port (JFSW), Jump'n'Bump, KAtomic, Keen Dreams, KGoldrunner, kiki the nano bot, Knights, KQ Lives, Krystal Drop, l-echo, Labyrinth of Worlds, LGames, LGeneral, libGDX, libpng, Libxml2, Lightweight Java Game Library, Lincity, LinCity-NG, Linley's Dungeon Crawl, Linwarrior 3D, Lips of Suna, Lix, Lua, Lumix Engine, LZMA SDK, M.E.W.L., Machinations, Mars, Land of No Mercy, Maxit, MechCommander 2 Omnitech, Mega Mario, Meridian 59, Meritous, Microracers, MineCraft-One-Week-Challenge, Minesweeper (in C), Mirror Magic, Moria, Mr.Boom, Naev, NBlood, NetHack, NetPanzer, Netrek, Neverball, Nexuiz, NFSIISE, Nighthawk, NLarn, Oolite, Open AL, Open Fodder, Open Hexagon, Open Horizon, Open Jumpgate, Open Meridian, Open Rodent's Revenge, Open RPG Maker, Open Syobon Action, Open Yahtzee, Open Zelda, openage, OpenArena, OpenCity, OpenCrystalCaves, OpenDUNE, OpenDungeons, OpenFire, OpenGGS, OpenGL Test Drive Remake, Openglad, OpenHoMM, OpenLara, OpenLiero, OpenMC2, OpenMortal, OpenMW, OpenNFS, OpenNotrium, OpenSSL, OpenTitus, OpenTyrian, Operation Citadel, Orbit-Hopper, Orx, Other-Life, Panda 3D, Pax Britannica, Phantasy Star Rebirth, Pioneers, Pizza Business, pkg-config, PlaneShift, PokerTH, POSTAL 1 Open Source, pq2, PrBoom+, Project Carrot, ProQuake 4, Pthreads-win32, pycraft, pygame, Qt, QuakeSpasm, Ragel, RBDOOM-3-BFG, Red Eclipse, Reflection Keen, REGoth, ResidualVM, Return to the Roots, Rise of the Triad for Linux, Rockbot, Rocks'n'Diamonds, Rogue Clone IV, Rolisteam, S.C.O.U.R.G.E., sandbox Game Maker, Scorched3D, SDL Asylum, SDL Bomber, SDL Game Engine 2D, SDL Sopwith, Secret Maryo Chronicles, Sengoku: Warring States of Japan, Seven Kingdoms: Ancient Adversaries, sfall, Shockolate, Simutrans, Sine, SLADE, SLASH'EM, Slime Volleyball, Smash Battle, Song of Albion, Sopwith 3, Space Harrier Clone, SpaceZero, splexhd, Star Ruler 2, star-control2, StarBlastrix, starshatter-open, Strife: Veteran Edition, Stunt Car Racer Remake, Summoning Wars, sundog, Super Methane Brothers, SuperFoulEgg, SuperTux, SuperTuxKart, SWIG, Syndicate Wars Port, T-Bots, Tales of Maj'Eyal, Tank: Zone of Death, Tapir, Tenes Empanadas Graciela, The Clans, The Endless Dungeons, The Epic of Heroes, The Legend of Edgar, The Powder Toy, The Secret Chronicles of Dr. M., Theme Park Builder 3D CAD, Thousand Parsec, Thrust, Tile World, TinTin++, Tiny Wings, Toppler, TORCS, The Open Racing Car Simulator, Trackballs, Transfusion, Tremulous, TTDPatch, Turious, TurokEX, Tux Racer, twin-e, UFO2000, Underworld Adventures, UnNetHack, VCMI, Vega Strike, War Of Kingdom, Wargamer, Wargus, WarMUX, Witch Blast, Wizznic!, Wolfpack Empire, WorldForge, wxWidgets, X-Moto, XArchon, Xconq, xdigger, xDuke, Xenowar, Xonotic, XPilot, XPilot NG, XScavenger, XSera, XZ Utils, ZAngband, Zod Engine 2H4U, 3D Pong, 3Dc, 54321, Abuse, ACM, Adanaxis, Afternoon Stalker, Airstrike, Aklabeth, Aleph One, alive, Amphetamine, Anagramarama, Angband, Antares, Armagetron Advanced, Armies, ativayeban, Atlantis, Atomic Tanks, Atomiks, Atomix, Attal: Lords of doom, AutoREALM, Avanor, Ball and Paddle, Barony, Batrachians, Battle City, Battle Tanks, Battles of Antargis, Between, Biniax, Birth of the Empires, Blobby Volley 2, Blobwars: Metal Blob Solid, BlockOut II, Bombermaaan, Bombic, Bombic2, Boost (C++ Libraries), Bos Wars, Boson, Bridge Command, BRIQUOLO, Brutal Chess, Bt Builder, BurgerSpace, c64-nuclearreaction, Cadaver, Cat Mother Dead Justice, Cataclysm, Catch Challenger, cc94, CCCP, Circus Linux!, Civilization: Call To Power 2 Source Project, Classic Blades of Exile, Clonepoint, Colonization too, Conquests, Core War, Cosmosmash, Crossfire, Crown and Cutlass, Crypto++, Cytadela, D2X-XL, Daimonin, Danger from the Deep, Dark Oberon, DarkPlaces, Data Storm, Dave Gnukem, Dawn, Deathchase 3D, Defendguin, Deliantra, DeSmuME, Digger Remastered, Doom Legacy, DOOM-iOS, Duel Commander, Duke3D, Duke3d_w32, Dune Dynasty, Dune Legacy, Dungeon Craft, Dungeon Crawl Stone Soup, Dungeon Mapper, DXX-Rebirth, Ecksdee, EDuke32, Endless Sky, ENIGMA (development environment), EnTT Pacman, Epiar, erampage, Erebus, Eternal Lands, Evol Online, Exult, ezQuake, F-1 Spirit, Fall of Imiryn, Fanwor, Flex Engine, Forsaken, Free Heroes 2, Free in the Dark (engine), Free Space Colonization, Freeciv Alpha Centauri project, FreeFalcon, Freekick 3, Freeminer, Freenukum Jump'n Run, FreePrince, FreeRails, Freestars, Galaxy Forces V2, GalaxyNG, GameLV, GDash, Gee Whiz, Gigalomania, Globulation 2, GLtron, GM Tools, Gnomescroll, GNU FreeDink, Goblin Camp, Goblin Hack, Golly, GPL Arcade Volleyball, Greenius' Civil War, Grit Game Engine, Grobots, GUSANOS, Gusty's Serpents, H-Craft Championship, H-World, Hammer of Thyrion, Harris, Haxima, Heart of the Alien, Heroes of Wesnoth, Hex Game, HolySpirit, Hovertank3D, I Have No Tomatoes, ICBM3D, Ice Breaker, Inexor, Irrlicht Engine, Iter Vehemens ad Necem, Jagged Alliance 2 Stracciatella, Jet-Story, JFDuke3D, JonoF's Shadow Warrior Port (JFSW), Jump'n'Bump, KAtomic, Keen Dreams, KGoldrunner, kiki the nano bot, Knights, KQ Lives, Krystal Drop, l-echo, Labyrinth of Worlds, LGames, LGeneral, libGDX, libpng, Libxml2, Lightweight Java Game Library, Lincity, LinCity-NG, Linley's Dungeon Crawl, Linwarrior 3D, Lips of Suna, Lix, Lua, Lumix Engine, LZMA SDK, M.E.W.L., Machinations, Mars, Land of No Mercy, Maxit, MechCommander 2 Omnitech, Mega Mario, Meridian 59, Meritous, Microracers, MineCraft-One-Week-Challenge, Minesweeper (in C), Mirror Magic, Moria, Mr.Boom, Naev, NBlood, NetHack, NetPanzer, Netrek, Neverball, Nexuiz, NFSIISE, Nighthawk, NLarn, Oolite, Open AL, Open Fodder, Open Hexagon, Open Horizon, Open Jumpgate, Open Meridian, Open Rodent's Revenge, Open RPG Maker, Open Syobon Action, Open Yahtzee, Open Zelda, openage, OpenArena, OpenCity, OpenCrystalCaves, OpenDUNE, OpenDungeons, OpenFire, OpenGGS, OpenGL Test Drive Remake, Openglad, OpenHoMM, OpenLara, OpenLiero, OpenMC2, OpenMortal, OpenMW, OpenNFS, OpenNotrium, OpenSSL, OpenTitus, OpenTyrian, Operation Citadel, Orbit-Hopper, Orx, Other-Life, Panda 3D, Pax Britannica, Phantasy Star Rebirth, Pioneers, Pizza Business, pkg-config, PlaneShift, PokerTH, POSTAL 1 Open Source, pq2, PrBoom+, Project Carrot, ProQuake 4, Pthreads-win32, pycraft, pygame, Qt, QuakeSpasm, Ragel, RBDOOM-3-BFG, Red Eclipse, Reflection Keen, REGoth, ResidualVM, Return to the Roots, Rise of the Triad for Linux, Rockbot, Rocks'n'Diamonds, Rogue Clone IV, Rolisteam, S.C.O.U.R.G.E., sandbox Game Maker, Scorched3D, SDL Asylum, SDL Bomber, SDL Game Engine 2D, SDL Sopwith, Secret Maryo Chronicles, Sengoku: Warring States of Japan, Seven Kingdoms: Ancient Adversaries, sfall, Shockolate, Simutrans, Sine, SLADE, SLASH'EM, Slime Volleyball, Smash Battle, Song of Albion, Sopwith 3, Space Harrier Clone, SpaceZero, splexhd, Star Ruler 2, star-control2, StarBlastrix, starshatter-open, Strife: Veteran Edition, Stunt Car Racer Remake, Summoning Wars, sundog, Super Methane Brothers, SuperFoulEgg, SuperTux, SuperTuxKart, SWIG, Syndicate Wars Port, T-Bots, Tales of Maj'Eyal, Tank: Zone of Death, Tapir, Tenes Empanadas Graciela, The Clans, The Endless Dungeons, The Epic of Heroes, The Legend of Edgar, The Powder Toy, The Secret Chronicles of Dr. M., Theme Park Builder 3D CAD, Thousand Parsec, Thrust, Tile World, TinTin++, Tiny Wings, Toppler, TORCS, The Open Racing Car Simulator, Trackballs, Transfusion, Tremulous, TTDPatch, Turious, TurokEX, Tux Racer, twin-e, UFO2000, Underworld Adventures, UnNetHack, VCMI, Vega Strike, War Of Kingdom, Wargamer, Wargus, WarMUX, Witch Blast, Wizznic!, Wolfpack Empire, WorldForge, wxWidgets, X-Moto, XArchon, Xconq, xdigger, xDuke, Xenowar, Xonotic, XPilot, XPilot NG, XScavenger, XSera, XZ Utils, ZAngband, Zod Engine
##### C and C++ projects with a build system different from CMake (170) ##### C and C++ projects with a build system different from CMake (171)
Allegro, Annchienta, Arx Libertatis, AstroMenace, Atrinik, Ballerburg SDL, BitRiot, Blender game engine, Block Attack - Rise of the Blocks, BOOM: Remake, BStone, C-Dogs SDL, CaesarIA, Cannonball, CatacombSDL, CaveExpress, CavePacker, Chocolate Doom, Choria, Chronoshift, COCOS2D-X, Colobot: Gold Edition, Commander Genius, CorsixTH, Craft, Cubosphere, Curse of War, DesktopAdventures, DevilutionX, DGEngine, dhewm3, DNT, DOOM Retro, Doom64EX, Doomsday, Doxygen, DreamChess, Dust Racing 2D, EasyRPG Player, Eat The Whistle, ECWolf, Egoboo, EmptyEpsilon, ET: Legacy, Falling Time, Flare, FlightGear, fonline, freeablo, freeaoe, FreeBlocks, FreeOrion, FreeRCT, Freeserf, FreeSiege, FreeSynd, FreeType, Friking Shark, GemRB, ges-code, glPortal, GoldenEye: Source, Gorc, Griefly, GZDoom, Hardwar, HarfBuzz, Hedgewars, HoverRace, Iceball, irrlamb, JediOutcastLinux, Julius, Librelancer, Lugaru, LÖVE, Mana, Maratis, Me and My Shadow, Mechanized Assault & eXploration Reloaded, MegaGlest, Minetest, mkxp, Nuvie, NXEngine-evo, Odamex, OGRE3D, Open AL Soft, Open Apocalypse, Open Creatures, Open Game Engine, Open Surge, Open Tibia, OpenBlok, OpenClaw, OpenClonk, OpenGothic, OpenJK, OpenLieroX, OpenLoco, OpenMoM, OpenOMF, OpenRaider, OpenRCT2, OpenRW, OpenSkyscraper, OpenSpades, OpenSR, OpenSWE1R, OpenTomb, OpenXcom, OPMon, PainTown, Performous, Pingus, Polycode, Powerslide remake, Privateer - Gemini Gold, Q-Gears, Race Into Space, Return of Dr. Destructo, Rigel Engine, Rigs of Rods, Ryzom Core, SDLPoP, Shadowgrounds, Simple and Fast Multimedia Library, Simple DirectMedia Layer, SoftPixel Engine, Solarus, Sonic Robo Blast 2, Sourcehold, Speed Dreams, Spring, StepMania, Stunt Rally, super-methane-brothers-gx, TES3MP, The Battle for Wesnoth, The Butterfly Effect, The Rush, thiefcatcher, Thrive, Thyme, TOMB5, Total Annihilation 3D, Trinity Reign, Tux Football, Tux of Math Command, UFO: Alien Invasion, uMario, Unvanquished, urde, Urho3D, Valyria Tear, Violetland, Visual Pinball, Voxelands, Warzone 2100, Widelands, Wizardry Legacy, wkbre, Wyrmsun, xoreos, xu4, Yamagi Quake II, yaml-cpp, ZDoom, Zero Ballistics, zlib Allegro, Annchienta, Arx Libertatis, AstroMenace, Atrinik, Ballerburg SDL, BitRiot, Blender game engine, Block Attack - Rise of the Blocks, BOOM: Remake, BStone, C-Dogs SDL, CaesarIA, Cannonball, CatacombSDL, CaveExpress, CavePacker, Chocolate Doom, Choria, Chronoshift, COCOS2D-X, Colobot: Gold Edition, Commander Genius, CorsixTH, Craft, Cubosphere, Curse of War, DesktopAdventures, DevilutionX, DGEngine, dhewm3, DNT, DOOM Retro, Doom64EX, Doomsday, Doxygen, DreamChess, Dust Racing 2D, EasyRPG Player, Eat The Whistle, ECWolf, Egoboo, EmptyEpsilon, ET: Legacy, Falling Time, Flare, FlightGear, fonline, freeablo, freeaoe, FreeBlocks, FreeOrion, FreeRCT, Freeserf, FreeSiege, FreeSynd, FreeType, Friking Shark, GemRB, ges-code, glPortal, GoldenEye: Source, Gorc, Griefly, GZDoom, Hardwar, HarfBuzz, Hedgewars, HoverRace, Iceball, irrlamb, JediOutcastLinux, Julius, Librelancer, Lugaru, LÖVE, Mana, Maratis, Me and My Shadow, Mechanized Assault & eXploration Reloaded, MegaGlest, Minetest, mkxp, Nuvie, NXEngine-evo, Odamex, OGRE3D, Open AL Soft, Open Apocalypse, Open Creatures, Open Game Engine, Open Surge, Open Tibia, OpenBlok, OpenClaw, OpenClonk, OpenGothic, OpenJK, OpenLieroX, OpenLoco, OpenMoM, OpenOMF, OpenRaider, OpenRCT2, OpenRW, OpenSkyscraper, OpenSpades, OpenSR, OpenSWE1R, OpenTESArena, OpenTomb, OpenXcom, OPMon, PainTown, Performous, Pingus, Polycode, Powerslide remake, Privateer - Gemini Gold, Q-Gears, Race Into Space, Return of Dr. Destructo, Rigel Engine, Rigs of Rods, Ryzom Core, SDLPoP, Shadowgrounds, Simple and Fast Multimedia Library, Simple DirectMedia Layer, SoftPixel Engine, Solarus, Sonic Robo Blast 2, Sourcehold, Speed Dreams, Spring, StepMania, Stunt Rally, super-methane-brothers-gx, TES3MP, The Battle for Wesnoth, The Butterfly Effect, The Rush, thiefcatcher, Thrive, Thyme, TOMB5, Total Annihilation 3D, Trinity Reign, Tux Football, Tux of Math Command, UFO: Alien Invasion, uMario, Unvanquished, urde, Urho3D, Valyria Tear, Violetland, Visual Pinball, Voxelands, Warzone 2100, Widelands, Wizardry Legacy, wkbre, Wyrmsun, xoreos, xu4, Yamagi Quake II, yaml-cpp, ZDoom, Zero Ballistics, zlib
## Platform ## Platform
Platform information available for 67.9% of all projects. Platform information available for 68.1% of all projects.
##### Platforms frequency ##### Platforms frequency
- Windows (35.4%) - Windows (35.5%)
- Linux (32.8%) - Linux (32.8%)
- macOS (19.8%) - macOS (19.8%)
- Web (6.2%) - Web (6.2%)

View File

@ -8,7 +8,7 @@ _{Description}_
- Play: {URL} (optional) - Play: {URL} (optional)
- Download: {URL} (optional) - Download: {URL} (optional)
- Platform: {XX} (optional) - Platform: {XX} (optional)
- Keywords: {XX} (optional) - Keywords: {XX}
- Code repository: {URL} - Code repository: {URL}
- Code language: {XX} - Code language: {XX}
- Code license: {XX} - Code license: {XX}

View File

@ -282,7 +282,9 @@
"https://github.com/aburch/simutrans.git", "https://github.com/aburch/simutrans.git",
"https://github.com/acmepjz/meandmyshadow.git", "https://github.com/acmepjz/meandmyshadow.git",
"https://github.com/adamenkov/jet-story.git", "https://github.com/adamenkov/jet-story.git",
"https://github.com/afritz1/OpenTESArena.git",
"https://github.com/ahmetkasif/KittenMaxit.git", "https://github.com/ahmetkasif/KittenMaxit.git",
"https://github.com/ajweeks/FlexEngine.git",
"https://github.com/ajxs/jsFO.git", "https://github.com/ajxs/jsFO.git",
"https://github.com/akarnokd/open-ig.git", "https://github.com/akarnokd/open-ig.git",
"https://github.com/albertz/openlierox.git", "https://github.com/albertz/openlierox.git",
@ -290,6 +292,7 @@
"https://github.com/alexdantas/www.git", "https://github.com/alexdantas/www.git",
"https://github.com/alexknvl/fonline.git", "https://github.com/alexknvl/fonline.git",
"https://github.com/alphaonex86/CatchChallenger.git", "https://github.com/alphaonex86/CatchChallenger.git",
"https://github.com/amroibrahim/DIYDoom.git",
"https://github.com/anael-seghezzi/Maratis-4.git", "https://github.com/anael-seghezzi/Maratis-4.git",
"https://github.com/andrettin/wyrmsun.git", "https://github.com/andrettin/wyrmsun.git",
"https://github.com/andrewfenn/Hardwar.git", "https://github.com/andrewfenn/Hardwar.git",

View File

@ -87,11 +87,8 @@ https://fedoraproject.org/wiki/SIGs/Games#List_of_games_we_will_NOT_package
https://flathub.org/home (use it for Linux packaging) / https://flathub.org/apps/category/Game https://flathub.org/home (use it for Linux packaging) / https://flathub.org/apps/category/Game
https://freegamer.blogspot.com/2015/11/top-3-open-source-pinball-games.html https://freegamer.blogspot.com/2015/11/top-3-open-source-pinball-games.html
https://futurepinball.com/ https://futurepinball.com/
https://github.com/afritz1/OpenTESArena
https://github.com/ajweeks/FlexEngine
https://github.com/amerkoleci/alimer https://github.com/amerkoleci/alimer
https://github.com/amerkoleci/vortice https://github.com/amerkoleci/vortice
https://github.com/amroibrahim/DIYDoom
https://github.com/Anthonymcqueen21/Pygame---Alien-Invasion https://github.com/Anthonymcqueen21/Pygame---Alien-Invasion
https://github.com/ao-libre/ao-cliente https://github.com/ao-libre/ao-cliente
https://github.com/apsillers/lords-of-the-fey https://github.com/apsillers/lords-of-the-fey
@ -123,6 +120,7 @@ https://github.com/cubei/FlappyCow
https://github.com/cyberegoorg/cetech https://github.com/cyberegoorg/cetech
https://github.com/DaemonEngine/Daemon https://github.com/DaemonEngine/Daemon
https://github.com/Dariasteam/TowerJumper https://github.com/Dariasteam/TowerJumper
https://github.com/DeflatedPickle/FAOSDance
https://github.com/demonixis/C3DE https://github.com/demonixis/C3DE
https://github.com/digitall/scummvm-deskadv https://github.com/digitall/scummvm-deskadv
https://github.com/DigitalPulseSoftware/NazaraEngine https://github.com/DigitalPulseSoftware/NazaraEngine
@ -141,6 +139,7 @@ https://github.com/freeboardgame/FreeBoardGame.org
https://github.com/FreeCol/freecol https://github.com/FreeCol/freecol
https://github.com/gamearians https://github.com/gamearians
https://github.com/GentenStudios/quartz-engine https://github.com/GentenStudios/quartz-engine
https://github.com/grantjenks/free-python-games (check all)
https://github.com/GunshipPenguin/open_flood https://github.com/GunshipPenguin/open_flood
https://github.com/hedgewars/hw https://github.com/hedgewars/hw
https://github.com/hparcells/cards-against-humanity https://github.com/hparcells/cards-against-humanity
@ -172,6 +171,7 @@ https://github.com/pelya/commandergenius
https://github.com/pld-linux https://github.com/pld-linux
https://github.com/ptitSeb/gl4es https://github.com/ptitSeb/gl4es
https://github.com/raysan5/rfxgen https://github.com/raysan5/rfxgen
https://github.com/Realm667/WolfenDoom
https://github.com/romlok/godot-gdhexgrid https://github.com/romlok/godot-gdhexgrid
https://github.com/RonenNess/GeonBit.UI https://github.com/RonenNess/GeonBit.UI
https://github.com/RPG-Paper-Maker/RPG-Paper-Maker https://github.com/RPG-Paper-Maker/RPG-Paper-Maker
@ -220,7 +220,6 @@ https://pyweek.org/4/entries/ (Ascent of Justice)
https://revolutionarygamesstudio.com/ Trhive https://revolutionarygamesstudio.com/ Trhive
https://salsa.debian.org/games-team/etw https://salsa.debian.org/games-team/etw
https://scratch.mit.edu/ (https://en.scratch-wiki.info/wiki/Scratch_Source_Code) https://scratch.mit.edu/ (https://en.scratch-wiki.info/wiki/Scratch_Source_Code)
https://secretchronicles.org/en/
https://sourceforge.net/projects/actiongame/ https://sourceforge.net/projects/actiongame/
https://sourceforge.net/projects/deng/ https://sourceforge.net/projects/deng/
https://sourceforge.net/projects/ettu/ https://sourceforge.net/projects/ettu/

View File

@ -7,48 +7,23 @@ Unique left column names in the game info boxes:
['Code license', 'Code licenses', 'Developer', 'Developers', 'Engine', 'Engines', 'Genre', 'Genres', 'Libraries', 'Library', 'Media license', 'Media licenses', 'P. language', 'P. languages', 'Platforms'] ['Code license', 'Code licenses', 'Developer', 'Developers', 'Engine', 'Engines', 'Genre', 'Genres', 'Libraries', 'Library', 'Media license', 'Media licenses', 'P. language', 'P. languages', 'Platforms']
""" """
import os
import requests import requests
import json import json
from bs4 import BeautifulSoup, NavigableString from bs4 import BeautifulSoup
from utils.utils import * from utils import constants, utils, osg
def key_selection_gameinfobox(a, b): def download_lgw_content():
""" """
Checks which of the two elements in a is in b or none but not both
:return:
""" """
if len(a) != 2:
raise RuntimeError()
c = [x in b for x in a]
if all(c):
raise RuntimeError
if not any(c):
return None, None
d = [(k, i) for (i, k) in enumerate(a) if c[i]]
return d[0]
def extract_field_content(key, idx, info):
"""
From a game info field.
"""
content = info[key].get_text()
content = content.split(',')
content = [x.strip() for x in content]
content = [x if not (x.endswith('[1]') or x.endswith('[2]')) else x[:-3] for x in content] # remove trailing [1,2]
content = [x.strip() for x in content]
if not content:
raise RuntimeError
if (len(content) > 1 and idx == 0) or (len(content) == 1 and idx == 1):
print(' warning: {} Sg./Pl. mismatch'.format(key))
return content
if __name__ == "__main__":
# parameters # parameters
base_url = 'https://libregamewiki.org' base_url = 'https://libregamewiki.org'
ignored_gameinfos = ['Contribute', 'Origin', 'Release date', 'Latest release'] destination_path = os.path.join(constants.root_path, 'tools', 'lgw-import')
utils.recreate_directory(destination_path)
# read and process the base url (get all games and categories) # read and process the base url (get all games and categories)
url = base_url + '/Category:Games' url = base_url + '/Category:Games'
@ -69,89 +44,70 @@ if __name__ == "__main__":
break break
url = base_url + next_page['href'] url = base_url + next_page['href']
# remove all those that start with user
games = [game for game in games if not any(game[1].startswith(x) for x in ('User:', 'Template:', 'Bullet'))]
print('current number of games in LGW {}'.format(len(games))) print('current number of games in LGW {}'.format(len(games)))
# parse games
counter = 0
unique_gameinfo_fields = set()
entries = []
for game in games: for game in games:
print(game[1])
url = base_url + game[0] url = base_url + game[0]
destination_file = os.path.join(destination_path, osg.canonical_game_name(game[0][1:]) + '.html')
text = requests.get(url).text text = requests.get(url).text
utils.write_text(destination_file, text)
def parse_lgw_content():
# paths
import_path = os.path.join(constants.root_path, 'tools', 'lgw-import')
entries_file = os.path.join(import_path, '_lgw.json')
# iterate over all imported files
files = os.listdir(import_path)
entries = []
for file in files:
if file == '_lgw.json':
continue
text = utils.read_text(os.path.join(import_path, file))
# parse the html
soup = BeautifulSoup(text, 'html.parser') soup = BeautifulSoup(text, 'html.parser')
title = soup.h1.string title = soup.h1.get_text()
print(title) print(title)
entry = {'name': title} entry = {'name': title}
# get all external links
links = [(x['href'], x.get_text()) for x in soup.find_all('a', href=True)]
links = [x for x in links if x[0].startswith('http') and not x[0].startswith('https://libregamewiki.org/')]
entry['external links'] = links
# get meta description
description = soup.find('meta', attrs={"name":"description"})
entry['description'] = description['content']
# parse gameinfobox # parse gameinfobox
info = soup.find('div', class_='gameinfobox') infos = soup.find('div', class_='gameinfobox')
if not info: if not infos:
print(' no gameinfobox') print(' no gameinfobox')
else: else:
info = info.find_all('tr') infos = infos.find_all('tr')
info = [(x.th.string, x.td) for x in info if x.th and x.th.string] for x in infos:
info = [x for x in info if x[0] not in ignored_gameinfos] if x.th and x.td:
info = dict(info) # row with header
unique_gameinfo_fields.update(info.keys()) key = x.th.get_text()
content = x.td.get_text()
# consume fields of gameinfobox content = content.split(',')
# genre content = [x.strip() for x in content]
key, idx = key_selection_gameinfobox(('Genre', 'Genres'), info.keys()) entry[key] = content
if key: if not x.th and x.td:
genres = extract_field_content(key, idx, info) # row without header: contribute section
entry['genre'] x = x.find_all('li')
del info[key] x = [(x.a.string, x.a['href']) for x in x if x.a]
for key, content in x:
# platforms entry[key] = content
key = 'Platforms'
if key in info:
platforms = extract_field_content(key, 1, info)
# platforms = [x if x != 'Mac' else 'macOS' for x in platforms] # replace Mac with macOS
entry['platform'] = platforms
del info[key]
# developer
key, idx = key_selection_gameinfobox(('Developer', 'Developers'), info.keys())
if key:
entry['developer'] = extract_field_content(key, idx, info)
del info[key]
# code license
key, idx = key_selection_gameinfobox(('Code license', 'Code licenses'), info.keys())
if key:
entry['code license'] = extract_field_content(key, idx, info)
del info[key]
# media license
key, idx = key_selection_gameinfobox(('Media license', 'Media licenses'), info.keys())
if key:
entry['assets license'] = extract_field_content(key, idx, info)
del info[key]
# engine
key, idx = key_selection_gameinfobox(('Engine', 'Engines'), info.keys())
if key:
entry['engine'] = extract_field_content(key, idx, info)
del info[key]
# library
key, idx = key_selection_gameinfobox(('Library', 'Libraries'), info.keys())
if key:
entry['library'] = extract_field_content(key, idx, info)
del info[key]
# programming language
key, idx = key_selection_gameinfobox(('P. language', 'P. languages'), info.keys())
if key:
languages = extract_field_content(key, idx, info)
languages = [x for x in languages if x != 'HTML5'] # ignore HTML5
entry['code language'] = languages
del info[key]
# unconsumed
if info:
print('unconsumed gameinfo keys {}'.format(info.keys()))
raise RuntimeError()
# parse "for available as package in" # parse "for available as package in"
tables = soup.find_all('table', class_='wikitable') tables = soup.find_all('table', class_='wikitable')
@ -187,18 +143,56 @@ if __name__ == "__main__":
entry['categories'] = categories entry['categories'] = categories
entries.append(entry) entries.append(entry)
# print(entry)
counter += 1
if counter > 20:
# break
pass
unique_gameinfo_fields = sorted(list(unique_gameinfo_fields))
print('unique gameinfo fields: {}'.format(unique_gameinfo_fields))
# save entries # save entries
json_path = os.path.join(os.path.dirname(__file__), 'lgw_import.json')
text = json.dumps(entries, indent=1) text = json.dumps(entries, indent=1)
write_text(json_path, text) utils.write_text(entries_file, text)
def clean_lgw_content():
# paths
import_path = os.path.join(constants.root_path, 'tools', 'lgw-import')
entries_file = os.path.join(import_path, '_lgw.json')
cleaned_entries_file = os.path.join(import_path, '_lgw.cleaned.json')
# load entries
text = utils.read_text(entries_file)
entries = json.loads(text)
# rename keys
key_replacements = (('developer', ('Developer', 'Developers')), ('code license', ('Code license', 'Code licenses')), ('engine', ('Engine', 'Engines')), ('genre', ('Genre', 'Genres')))
for index, entry in enumerate(entries):
for new_key, old_keys in key_replacements:
for key in old_keys:
if key in entry:
entry[new_key] = entry[key]
del entry[key]
break
entries[index] = entry
# check for unique field names
unique_fields = set()
for entry in entries:
unique_fields.update(entry.keys())
print('unique lgw fields: {}'.format(sorted(list(unique_fields))))
# which fields are mandatory
for entry in entries:
remove_fields = [field for field in unique_fields if field not in entry]
unique_fields -= set(remove_fields)
print('mandatory lgw fields: {}'.format(sorted(list(unique_fields))))
if __name__ == "__main__":
# stage one
# download_lgw_content()
# stage two
# parse_lgw_content()
# stage three
clean_lgw_content()

View File

@ -243,7 +243,7 @@ if __name__ == "__main__":
# determine file name # determine file name
print('create new entry for {}'.format(lgw_name)) print('create new entry for {}'.format(lgw_name))
file_name = derive_canonical_file_name(lgw_name) file_name = canonical_game_name(lgw_name) + '.md'
target_file = os.path.join(games_path, file_name) target_file = os.path.join(games_path, file_name)
if os.path.isfile(target_file): if os.path.isfile(target_file):
print('warning: file {} already existing, save under slightly different name'.format(file_name)) print('warning: file {} already existing, save under slightly different name'.format(file_name))

View File

@ -13,7 +13,9 @@ import http.client
import datetime import datetime
import json import json
import textwrap import textwrap
from utils.osg import * import os
import re
from utils import constants as c, utils, osg
def update_readme_and_tocs(infos): def update_readme_and_tocs(infos):
@ -29,12 +31,12 @@ def update_readme_and_tocs(infos):
print('update readme and toc files') print('update readme and toc files')
# delete content of toc path # delete content of toc path
for file in os.listdir(tocs_path): for file in os.listdir(c.tocs_path):
os.remove(os.path.join(tocs_path, file)) os.remove(os.path.join(c.tocs_path, file))
# read readme # read readme
readme_file = os.path.join(root_path, 'README.md') readme_file = os.path.join(c.root_path, 'README.md')
readme_text = read_text(readme_file) readme_text = utils.read_text(readme_file)
# compile regex for identifying the building blocks in the readme # compile regex for identifying the building blocks in the readme
regex = re.compile(r"(.*?)(\[comment\]: # \(start.*?end of autogenerated content\))(.*)", re.DOTALL) regex = re.compile(r"(.*?)(\[comment\]: # \(start.*?end of autogenerated content\))(.*)", re.DOTALL)
@ -55,7 +57,7 @@ def update_readme_and_tocs(infos):
# create by category # create by category
categories_text = [] categories_text = []
for keyword in recommended_keywords: for keyword in osg.recommended_keywords:
infos_filtered = [x for x in infos if keyword in x['keywords']] infos_filtered = [x for x in infos if keyword in x['keywords']]
title = keyword.capitalize() title = keyword.capitalize()
name = keyword.replace(' ', '-') name = keyword.replace(' ', '-')
@ -67,7 +69,7 @@ def update_readme_and_tocs(infos):
# create by platform # create by platform
platforms_text = [] platforms_text = []
for platform in valid_platforms: for platform in osg.valid_platforms:
infos_filtered = [x for x in infos if platform in x.get('platform', [])] infos_filtered = [x for x in infos if platform in x.get('platform', [])]
title = platform title = platform
name = platform.lower() name = platform.lower()
@ -80,7 +82,7 @@ def update_readme_and_tocs(infos):
text = start + "[comment]: # (start of autogenerated content, do not edit)\n" + tocs_text + "\n[comment]: # (end of autogenerated content)" + end text = start + "[comment]: # (start of autogenerated content, do not edit)\n" + tocs_text + "\n[comment]: # (end of autogenerated content)" + end
# write to readme # write to readme
write_text(readme_file, text) utils.write_text(readme_file, text)
def create_toc(title, file, entries): def create_toc(title, file, entries):
@ -88,7 +90,7 @@ def create_toc(title, file, entries):
""" """
# file path # file path
toc_file = os.path.join(tocs_path, file) toc_file = os.path.join(c.tocs_path, file)
# header line # header line
text = '[comment]: # (autogenerated content, do not edit)\n# {}\n\n'.format(title) text = '[comment]: # (autogenerated content, do not edit)\n# {}\n\n'.format(title)
@ -105,7 +107,7 @@ def create_toc(title, file, entries):
text += '\n'.join(rows) text += '\n'.join(rows)
# write to toc file # write to toc file
write_text(toc_file, text) utils.write_text(toc_file, text)
def check_validity_external_links(): def check_validity_external_links():
@ -127,7 +129,7 @@ def check_validity_external_links():
ignored_urls = ('https://git.tukaani.org/xz.git') ignored_urls = ('https://git.tukaani.org/xz.git')
# iterate over all entries # iterate over all entries
for _, entry_path, content in entry_iterator(games_path): for _, entry_path, content in osg.entry_iterator():
# apply regex # apply regex
matches = regex.findall(content) matches = regex.findall(content)
@ -169,12 +171,12 @@ def check_template_leftovers():
print('check for template leftovers') print('check for template leftovers')
# load template and get all lines # load template and get all lines
text = read_text(os.path.join(root_path, 'template.md')) text = utils.read_text(os.path.join(c.root_path, 'template.md'))
text = text.split('\n') text = text.split('\n')
check_strings = [x for x in text if x and not x.startswith('##')] check_strings = [x for x in text if x and not x.startswith('##')]
# iterate over all entries # iterate over all entries
for _, entry_path, content in entry_iterator(games_path): for _, entry_path, content in osg.entry_iterator():
for check_string in check_strings: for check_string in check_strings:
if content.find(check_string) >= 0: if content.find(check_string) >= 0:
@ -196,7 +198,7 @@ def fix_entries():
regex = re.compile(r"(.*)- Keywords:([^\n]*)(.*)", re.DOTALL) regex = re.compile(r"(.*)- Keywords:([^\n]*)(.*)", re.DOTALL)
# iterate over all entries # iterate over all entries
for entry, entry_path, content in entry_iterator(games_path): for entry, entry_path, content in osg.entry_iterator():
# match with regex # match with regex
matches = regex.findall(content) matches = regex.findall(content)
@ -211,7 +213,7 @@ def fix_entries():
elements = list(set(elements)) elements = list(set(elements))
# get category out # get category out
for keyword in recommended_keywords: for keyword in osg.recommended_keywords:
if keyword in elements: if keyword in elements:
elements.remove(keyword) elements.remove(keyword)
category = keyword category = keyword
@ -243,13 +245,13 @@ def fix_entries():
if new_content != content: if new_content != content:
# write again # write again
write_text(entry_path, new_content) utils.write_text(entry_path, new_content)
# code dependencies # code dependencies
regex = re.compile(r"(.*)- Code dependencies:([^\n]*)(.*)", re.DOTALL) regex = re.compile(r"(.*)- Code dependencies:([^\n]*)(.*)", re.DOTALL)
# iterate over all entries # iterate over all entries
for entry, entry_path, content in entry_iterator(games_path): for entry, entry_path, content in osg.entry_iterator():
# match with regex # match with regex
matches = regex.findall(content) matches = regex.findall(content)
@ -279,13 +281,13 @@ def fix_entries():
if new_content != content: if new_content != content:
# write again # write again
write_text(entry_path, new_content) utils.write_text(entry_path, new_content)
# build systems # build systems
regex = re.compile(r"(.*)- Build system:([^\n]*)(.*)", re.DOTALL) regex = re.compile(r"(.*)- Build system:([^\n]*)(.*)", re.DOTALL)
# iterate over all entries # iterate over all entries
for entry, entry_path, content in entry_iterator(games_path): for entry, entry_path, content in osg.entry_iterator():
# match with regex # match with regex
matches = regex.findall(content) matches = regex.findall(content)
@ -311,7 +313,7 @@ def fix_entries():
if new_content != content: if new_content != content:
# write again # write again
write_text(entry_path, new_content) utils.write_text(entry_path, new_content)
def update_statistics(infos): def update_statistics(infos):
@ -324,7 +326,7 @@ def update_statistics(infos):
print('update statistics') print('update statistics')
# start the page # start the page
statistics_file = os.path.join(root_path, 'statistics.md') statistics_file = os.path.join(c.root_path, 'statistics.md')
statistics = '[comment]: # (autogenerated content, do not edit)\n# Statistics\n\n' statistics = '[comment]: # (autogenerated content, do not edit)\n# Statistics\n\n'
# total number # total number
@ -524,7 +526,7 @@ def update_statistics(infos):
statistics += '##### Platforms frequency\n\n' + '\n'.join(unique_platforms) + '\n\n' statistics += '##### Platforms frequency\n\n' + '\n'.join(unique_platforms) + '\n\n'
# write to statistics file # write to statistics file
write_text(statistics_file, statistics) utils.write_text(statistics_file, statistics)
def export_json(infos): def export_json(infos):
@ -585,9 +587,9 @@ def export_json(infos):
db['data'] = entries db['data'] = entries
# output # output
json_path = os.path.join(games_path, os.path.pardir, 'docs', 'data.json') json_path = os.path.join(c.games_path, os.path.pardir, 'docs', 'data.json')
text = json.dumps(db, indent=1) text = json.dumps(db, indent=1)
write_text(json_path, text) utils.write_text(json_path, text)
def git_repo(repo): def git_repo(repo):
@ -710,9 +712,9 @@ def export_primary_code_repositories_json():
primary_repos[k] = sorted(set(v)) primary_repos[k] = sorted(set(v))
# write them to tools/git # write them to tools/git
json_path = os.path.join(root_path, 'tools', 'archives.json') json_path = os.path.join(c.root_path, 'tools', 'archives.json')
text = json.dumps(primary_repos, indent=1) text = json.dumps(primary_repos, indent=1)
write_text(json_path, text) utils.write_text(json_path, text)
def export_git_code_repositories_json(): def export_git_code_repositories_json():
@ -739,40 +741,31 @@ def export_git_code_repositories_json():
urls.sort() urls.sort()
# write them to tools/git # write them to tools/git
json_path = os.path.join(root_path, 'tools', 'git_repositories.json') json_path = os.path.join(c.root_path, 'tools', 'git_repositories.json')
text = json.dumps(urls, indent=1) text = json.dumps(urls, indent=1)
write_text(json_path, text) utils.write_text(json_path, text)
def sort_text_file(file, name): def sort_text_file(file, name):
""" """
Reads a text file, splits in lines, removes duplicates, sort, writes back. Reads a text file, splits in lines, removes duplicates, sort, writes back.
""" """
text = read_text(file) text = utils.read_text(file)
text = text.split('\n') text = text.split('\n')
text = sorted(list(set(text)), key=str.casefold) text = sorted(list(set(text)), key=str.casefold)
print('{} contains {} items'.format(name, len(text))) print('{} contains {} items'.format(name, len(text)))
text = '\n'.join(text) text = '\n'.join(text)
write_text(file, text) utils.write_text(file, text)
def strip_url(url):
for prefix in ('http://', 'https://'):
if url.startswith(prefix):
url = url[len(prefix):]
for suffix in ('/', '.git'):
if url.endswith(suffix):
url = url[:-len(suffix)]
return url
def clean_backlog(stripped_game_urls): def clean_backlog(stripped_game_urls):
# read backlog and split # read backlog and split
file = os.path.join(root_path, 'tools', 'backlog.txt') file = os.path.join(c.root_path, 'tools', 'backlog.txt')
text = read_text(file) text = utils.read_text(file)
text = text.split('\n') text = text.split('\n')
# remove those that are in stripped_game_urls # remove those that are in stripped_game_urls
text = [x for x in text if strip_url(x) not in stripped_game_urls] text = [x for x in text if utils.strip_url(x) not in stripped_game_urls]
# remove duplicates and sort # remove duplicates and sort
text = sorted(list(set(text)), key=str.casefold) text = sorted(list(set(text)), key=str.casefold)
@ -780,18 +773,14 @@ def clean_backlog(stripped_game_urls):
# join and save again # join and save again
text = '\n'.join(text) text = '\n'.join(text)
write_text(file, text) utils.write_text(file, text)
if __name__ == "__main__": if __name__ == "__main__":
# paths
root_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir))
games_path = os.path.join(root_path, 'games')
tocs_path = os.path.join(games_path, 'tocs')
# backlog # backlog
game_urls = extract_links(games_path) game_urls = osg.extract_links()
stripped_game_urls = [strip_url(x) for x in game_urls] stripped_game_urls = [utils.strip_url(x) for x in game_urls]
clean_backlog(stripped_game_urls) clean_backlog(stripped_game_urls)
@ -802,7 +791,7 @@ if __name__ == "__main__":
fix_entries() fix_entries()
# assemble info # assemble info
infos = assemble_infos(games_path) infos = osg.assemble_infos()
# recount and write to readme and to tocs # recount and write to readme and to tocs
update_readme_and_tocs(infos) update_readme_and_tocs(infos)
@ -823,5 +812,5 @@ if __name__ == "__main__":
# check_validity_external_links() # check_validity_external_links()
# sort backlog and rejected # sort backlog and rejected
# sort_text_file(os.path.join(root_path, 'tools', 'backlog.txt'), 'backlog') # sort_text_file(os.path.join(c.root_path, 'tools', 'backlog.txt'), 'backlog')
sort_text_file(os.path.join(root_path, 'tools', 'rejected.txt'), 'rejected games list') sort_text_file(os.path.join(c.root_path, 'tools', 'rejected.txt'), 'rejected games list')

View File

@ -229,9 +229,9 @@ if __name__ == "__main__":
urls = osgc_entry['url'] urls = osgc_entry['url']
if type(urls) == str: if type(urls) == str:
urls = [urls] urls = [urls]
urls = [strip_url(url) for url in urls]
our_urls = our_entry['home'] our_urls = our_entry['home']
our_urls = [x.replace('http://', '').replace('https://', '') for x in our_urls] our_urls = [strip_url(url) for url in our_urls]
urls = [x.replace('http://', '').replace('https://', '') for x in urls]
for url in urls: for url in urls:
if url not in our_urls: if url not in our_urls:
p += ' home url {} missing\n'.format(url) p += ' home url {} missing\n'.format(url)
@ -309,7 +309,7 @@ if __name__ == "__main__":
# determine file name # determine file name
print('create new entry for {}'.format(osgc_name)) print('create new entry for {}'.format(osgc_name))
file_name = derive_canonical_file_name(osgc_name) file_name = canonical_game_name(osgc_name) + '.md'
target_file = os.path.join(games_path, file_name) target_file = os.path.join(games_path, file_name)
if os.path.isfile(target_file): if os.path.isfile(target_file):
print('warning: file {} already existing, save under slightly different name'.format(file_name)) print('warning: file {} already existing, save under slightly different name'.format(file_name))

12
tools/utils/constants.py Normal file
View File

@ -0,0 +1,12 @@
"""
Paths, properties.
"""
import os
# paths
root_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir))
games_path = os.path.join(root_path, 'games')
tocs_path = os.path.join(games_path, 'tocs')
local_properties_file = os.path.join(root_path, 'local.properties')

View File

@ -3,8 +3,9 @@ Specific functions working on the games.
""" """
import re import re
import os
from difflib import SequenceMatcher from difflib import SequenceMatcher
from utils.utils import * from utils import utils, constants as c
essential_fields = ('Home', 'State', 'Keywords', 'Code repository', 'Code language', 'Code license') essential_fields = ('Home', 'State', 'Keywords', 'Code repository', 'Code language', 'Code license')
valid_fields = ('Home', 'Media', 'State', 'Play', 'Download', 'Platform', 'Keywords', 'Code repository', 'Code language', valid_fields = ('Home', 'Media', 'State', 'Play', 'Download', 'Platform', 'Keywords', 'Code repository', 'Code language',
@ -19,38 +20,37 @@ def game_name_similarity(a, b):
return SequenceMatcher(None, str.casefold(a), str.casefold(b)).ratio() return SequenceMatcher(None, str.casefold(a), str.casefold(b)).ratio()
def entry_iterator(games_path): def entry_iterator():
""" """
""" """
# get all entries (ignore everything starting with underscore) # get all entries (ignore everything starting with underscore)
entries = os.listdir(games_path) entries = os.listdir(c.games_path)
# iterate over all entries # iterate over all entries
for entry in entries: for entry in entries:
entry_path = os.path.join(games_path, entry) entry_path = os.path.join(c.games_path, entry)
# ignore directories ("tocs" for example) # ignore directories ("tocs" for example)
if os.path.isdir(entry_path): if os.path.isdir(entry_path):
continue continue
# read entry # read entry
content = read_text(entry_path) content = utils.read_text(entry_path)
# yield # yield
yield entry, entry_path, content yield entry, entry_path, content
def derive_canonical_file_name(name): def canonical_game_name(name):
""" """
Derives a canonical file name from a game name Derives a canonical game name from an actual game name (suitable for file names, ...)
""" """
name = regex_sanitize_name.sub('', name) name = regex_sanitize_name.sub('', name)
name = regex_sanitize_name_space_eater.sub('_', name) name = regex_sanitize_name_space_eater.sub('_', name)
name = name.replace('_-_', '-') name = name.replace('_-_', '-')
name = name.casefold() name = name.casefold()
name = name + '.md'
return name return name
@ -193,7 +193,7 @@ def parse_entry(content):
return info return info
def assemble_infos(games_path): def assemble_infos():
""" """
Parses all entries and assembles interesting infos about them. Parses all entries and assembles interesting infos about them.
""" """
@ -204,7 +204,7 @@ def assemble_infos(games_path):
infos = [] infos = []
# iterate over all entries # iterate over all entries
for entry, _, content in entry_iterator(games_path): for entry, _, content in entry_iterator():
# parse entry # parse entry
info = parse_entry(content) info = parse_entry(content)
@ -213,12 +213,12 @@ def assemble_infos(games_path):
info['file'] = entry info['file'] = entry
# check canonical file name # check canonical file name
canonical_file_name = derive_canonical_file_name(info['name']) canonical_file_name = canonical_game_name(info['name']) + '.md'
# we also allow -X with X =2..9 as possible extension (because of duplicate canonical file names) # we also allow -X with X =2..9 as possible extension (because of duplicate canonical file names)
if canonical_file_name != entry and canonical_file_name != entry[:-5] + '.md': if canonical_file_name != entry and canonical_file_name != entry[:-5] + '.md':
print('file {} should be {}'.format(entry, canonical_file_name)) print('file {} should be {}'.format(entry, canonical_file_name))
source_file = os.path.join(games_path, entry) source_file = os.path.join(c.games_path, entry)
target_file = os.path.join(games_path, canonical_file_name) target_file = os.path.join(c.games_path, canonical_file_name)
if not os.path.isfile(target_file): if not os.path.isfile(target_file):
pass pass
# os.rename(source_file, target_file) # os.rename(source_file, target_file)
@ -228,7 +228,8 @@ def assemble_infos(games_path):
return infos return infos
def extract_links(games_path):
def extract_links():
""" """
Parses all entries and extracts http(s) links from them Parses all entries and extracts http(s) links from them
""" """
@ -238,7 +239,7 @@ def extract_links(games_path):
# iterate over all entries # iterate over all entries
urls = set() urls = set()
for _, _, content in entry_iterator(games_path): for _, _, content in entry_iterator():
# apply regex # apply regex
matches = regex.findall(content) matches = regex.findall(content)

View File

@ -0,0 +1,5 @@
"""
Everything specific to the Github API (via PyGithub).
"""
from github import Github

View File

@ -9,7 +9,6 @@ import tarfile
import time import time
import urllib.request import urllib.request
import zipfile import zipfile
import errno
import stat import stat
@ -266,4 +265,34 @@ def unzip(zip_file, destination_directory):
# done creating files, now update dir dt # done creating files, now update dir dt
for name in dirs: for name in dirs:
date_time = dirs[name] date_time = dirs[name]
os.utime(name, (date_time, date_time)) os.utime(name, (date_time, date_time))
def strip_url(url):
for prefix in ('http://', 'https://'):
if url.startswith(prefix):
url = url[len(prefix):]
for prefix in ('www'):
if url.startswith(prefix):
url = url[len(prefix):]
for suffix in ('/', '.git', '/en', '/index.html'):
if url.endswith(suffix):
url = url[:-len(suffix)]
return url
def load_properties(filepath, sep='=', comment_char='#'):
"""
Read the file as a properties file (in Java).
"""
properties = {}
with open(filepath, "rt") as file:
for line in file:
line = line.strip()
if not line.startswith(comment_char):
line = line.split(sep)
assert(len(line)==2)
key = line[0].strip()
value = line[1].strip()
properties[key] = value
return properties