diff --git a/docs/data.json b/docs/data.json
index f58c09ea..a7110ee5 100644
--- a/docs/data.json
+++ b/docs/data.json
@@ -270,7 +270,7 @@
"",
"mature / inactive since 1987",
"action, artillery",
- "Source - C - Public Domain"
+ "Source - C - Public domain"
],
[
"Battle for Wesnoth (home, entry)",
@@ -372,7 +372,7 @@
"Blobwars: Metal Blob Solid (home, entry)",
"2D arcade platform game.",
"Link",
- "mature / inactive since 2015",
+ "mature / active",
"action",
"Source - C++ - GPL-2.0"
],
@@ -486,7 +486,7 @@
"Link",
"mature / inactive since 2013",
"strategy, turn-based",
- "Source - Pascal - Public Domain"
+ "Source - Pascal - Public domain"
],
[
"Cabbages and Kings (home, entry)",
@@ -1188,7 +1188,7 @@
"Fish Fillets - Next Generation (home, entry)",
"Port of the wonderful puzzle game Fish Fillets from ALTAR..",
"Link",
- "mature / inactive since 2014",
+ "mature / active",
"puzzle, port",
"Source - C++ - GPL-2.0"
],
@@ -2245,8 +2245,8 @@
"Major League Baseball Simulation.",
"Link",
"mature / active",
- "sports, simulation",
- "Source - C - ?"
+ "sports, non-free-content, simulation",
+ "Source - C - Public domain"
],
[
"Neverball (home, entry)",
@@ -3110,7 +3110,7 @@
"",
"mature / active",
"adventure",
- "Source - Python - Public Domain"
+ "Source - Python - Public domain"
],
[
"Settlers III remake (home, entry)",
@@ -3505,12 +3505,12 @@
"Source - Swift - GPL-3.0"
],
[
- "The Bub's Brothers (home, entry)",
+ "The Bub's Brothers (home, entry)",
"Networked clone of the classical Bubble Bobble board game.",
"Link",
"mature / inactive since 2013",
"board game",
- "Source - Python - MIT"
+ "Source - Python - MIT"
],
[
"The Butterfly Effect (home, entry)",
@@ -4086,7 +4086,7 @@
"Link",
"mature / active",
"sports, simulation, soccer",
- "Source - Java - ?"
+ "Source - Java - GPL-2.0"
],
[
"ZAngband (home, entry)",
diff --git a/games/_action.md b/games/_action.md
index c01ed687..ccf76387 100644
--- a/games/_action.md
+++ b/games/_action.md
@@ -6,11 +6,11 @@
- **[Armagetron Advanced](armagetron_advanced.md)** (C++, GPL-2.0, mature)
- **[Astromenace](astromenace.md)** (C++, C, GPL-3.0, mature)
- **[Atomic Tanks](atomic_tanks.md)** (C++, GPL-2.0, mature, inactive since 2016)
-- **[Ballerburg](ballerburg.md)** (C, Public Domain, mature, inactive since 1987)
+- **[Ballerburg](ballerburg.md)** (C, Public domain, mature, inactive since 1987)
- **[Battle Tanks](battle_tanks.md)** (C++, GPL-2.0, mature, inactive since 2009)
- **[Biniax](biniax.md)** (C, zlib, mature, inactive since 2012)
- **[Blobby Volley 2](blobby_volley2.md)** (C++, GPL-2.0, mature, inactive since 2017)
-- **[Blobwars: Metal Blob Solid](blobwars_metal_solid_blob.md)** (C++, GPL-2.0, mature, inactive since 2015)
+- **[Blobwars: Metal Blob Solid](blobwars_metal_solid_blob.md)** (C++, GPL-2.0, mature)
- **[Bombermaaan](bombermaaan.md)** (C++, GPL-3.0, mature, inactive since 2010)
- **[Boulder Dash](boulder_dash.md)** (Java, MIT, mature, inactive since 2015)
- **[BZFlag](bzflag.md)** (C++, LGPL-2.1, MPL-2.0, mature)
diff --git a/games/_adventure.md b/games/_adventure.md
index cfa112e5..a73744d3 100644
--- a/games/_adventure.md
+++ b/games/_adventure.md
@@ -11,7 +11,7 @@
- **[Free in the Dark (engine)](fitd.md)** (C, C++, GPL-2.0, beta)
- **[GameLV](gamelv.md)** (C++, GPL-2.0, beta)
- **[Murder In The Public Domain](murder_in_the_public_domain.md)** (C++, GPL-3.0, mature, inactive since 2013)
-- **[Sentient Storage](sentient_storage.md)** (Python, Public Domain, mature)
+- **[Sentient Storage](sentient_storage.md)** (Python, Public domain, mature)
- **[Sintel The Game](sintel_the_game.md)** (Python, MIT, beta, inactive since 2014)
- **[Star Maiden Astraea Rio](star_maiden_rio.md)** (Ren'py, CC-BY-NC, mature)
- **[TwinEngine](twin_engine.md)** (C, GPL-2.0, mature, inactive since 2015)
\ No newline at end of file
diff --git a/games/_all.md b/games/_all.md
index facaa813..588e0a38 100644
--- a/games/_all.md
+++ b/games/_all.md
@@ -33,7 +33,7 @@
- **[Attal: Lords of doom](attal.md)** (C++, GPL-2.0, mature, inactive since 2008)
- **[AutoREALM](autorealm.md)** (C++, GPL-3.0, mature)
- **[Avanor](avanor.md)** (C++, Lua, GPL-2.0, beta, inactive since 2008)
-- **[Ballerburg](ballerburg.md)** (C, Public Domain, mature, inactive since 1987)
+- **[Ballerburg](ballerburg.md)** (C, Public domain, mature, inactive since 1987)
- **[Battle for Wesnoth](battle_for_wesnoth.md)** (C++, GPL-2.0, mature)
- **[Battle Tanks](battle_tanks.md)** (C++, GPL-2.0, mature, inactive since 2009)
- **[Battlefield Java](battlefield_java.md)** (Java, GPL-3.0, beta, inactive since 2011)
@@ -46,7 +46,7 @@
- **[Blender game engine](blender_game_engine.md)** (C++, GPL-2.0, mature)
- **[Blitzkrieg](blitzkrieg.md)** (Java, GPL-3.0, beta, inactive since 2012)
- **[Blobby Volley 2](blobby_volley2.md)** (C++, GPL-2.0, mature, inactive since 2017)
-- **[Blobwars: Metal Blob Solid](blobwars_metal_solid_blob.md)** (C++, GPL-2.0, mature, inactive since 2015)
+- **[Blobwars: Metal Blob Solid](blobwars_metal_solid_blob.md)** (C++, GPL-2.0, mature)
- **[Block Attack - Rise of the Blocks](blockattack.md)** (C++, GPL-2.0, mature)
- **[BlockOut II](blockout_ii.md)** (C++, GPL-2.0, mature, inactive since 2014)
- **[Bombermaaan](bombermaaan.md)** (C++, GPL-3.0, mature, inactive since 2010)
@@ -60,7 +60,7 @@
- **[Bygfoot](bygfoot.md)** (Java, GPL-2.0, beta)
- **[BZFlag](bzflag.md)** (C++, LGPL-2.1, MPL-2.0, mature)
- **[C-Dogs](cdogs.md)** (C, GPL-2.0, mature)
-- **[C-evo](c_evo.md)** (Pascal, Public Domain, GPL-3.0, mature, inactive since 2013)
+- **[C-evo](c_evo.md)** (Pascal, Public domain, GPL-3.0, mature, inactive since 2013)
- **[Cabbages and Kings](cabbages_and_kings.md)** (Python, MIT, mature)
- **[Caesar IA](caesar_ia.md)** (C++, GPL-3.0, beta)
- **[Call to Power 2](call_to_power2.md)** (C++, Custom, mature)
@@ -148,7 +148,7 @@
- **[Fanwor](fanwor.md)** (C, GPL-2.0, mature)
- **[FAR Colony](farcolony.md)** (Pascal, GPL-3.0, beta, inactive since 2014)
- **[First Strike](first_strike.md)** (Java, MIT, mature)
-- **[Fish Fillets - Next Generation](fish_fillets_ng.md)** (C++, GPL-2.0, mature, inactive since 2014)
+- **[Fish Fillets - Next Generation](fish_fillets_ng.md)** (C++, GPL-2.0, mature)
- **[Flare Engine](flare_engine.md)** (C++, GPL-3.0, mature)
- **[FlightGear](flightgear.md)** (C++, GPL-2.0, mature)
- **[Flixel](flixel.md)** (ActionScript, MIT, mature)
@@ -280,7 +280,7 @@
- **[NetHack](nethack.md)** (C, Custom, mature)
- **[NetPanzer](netpanzer.md)** (C++, GPL-2.0, beta)
- **[Netrek](netrek.md)** (C, Custom, mature, inactive since 2009)
-- **[NetStatsBaseball](netstatsbaseball.md)** (C, ?, mature)
+- **[NetStatsBaseball](netstatsbaseball.md)** (C, Public domain, mature)
- **[Neverball](neverball.md)** (C, GPL-2.0, mature)
- **[Nexiuz](nexiuz.md)** (C++, GPL-2.0, mature)
- **[NLarn](nlarn.md)** (C, Lua, GPL-3.0, mature)
@@ -388,7 +388,7 @@
- **[SDL Sopwith](sdl_sopwith.md)** (C, GPL-2.0, mature, inactive since 2014)
- **[Secret Mario Chronicles](secret_mario_chronicles.md)** (C++, GPL-3.0, mature, inactive since 2009)
- **[Sengoku: Warring States of Japan](sengoku_warring_states_of_japan.md)** (C++, Lua, MIT, beta, inactive since 2008)
-- **[Sentient Storage](sentient_storage.md)** (Python, Public Domain, mature)
+- **[Sentient Storage](sentient_storage.md)** (Python, Public domain, mature)
- **[Settlers III remake](settlers_iii_remake.md)** (Java, MIT, beta)
- **[Seven Kingdoms: Ancient Adversaries](seven_kingdoms_ancient_adversaries.md)** (C++, GPL-2.0, mature)
- **[SharpKonquest](sharpkonquest.md)** (C#, GPL-2.0, mature, inactive since 2007)
@@ -510,7 +510,7 @@
- **[XZ Utils](xz.md)** (C, Custom, mature)
- **[yaml-cpp](yaml_cpp.md)** (C++, MIT, mature)
- **[Yo Frankie!](yo_frankie.md)** (Blender script, ?, mature, inactive since 2009)
-- **[YSoccer](ysoccer.md)** (Java, ?, mature)
+- **[YSoccer](ysoccer.md)** (Java, GPL-2.0, mature)
- **[ZAngband](zangband.md)** (C, Custom, mature, inactive since 2005)
- **[Zelda: Mystery of Solarus DX](zelda_mystery_of_solarus_dx.md)** (Lua, GPL-3.0, mature)
- **[Zero Ballistics](zeroballistics.md)** (C++, MIT, mature, inactive since 2013)
diff --git a/games/_puzzle.md b/games/_puzzle.md
index f83cf67b..cda0c882 100644
--- a/games/_puzzle.md
+++ b/games/_puzzle.md
@@ -9,7 +9,7 @@
- **[BlockOut II](blockout_ii.md)** (C++, GPL-2.0, mature, inactive since 2014)
- **[Brain Workshop](brain_workshop.md)** (Python, GPL, mature, inactive since 2011)
- **[Enigma](enigma.md)** (C, C++, GPL-2.0, mature)
-- **[Fish Fillets - Next Generation](fish_fillets_ng.md)** (C++, GPL-2.0, mature, inactive since 2014)
+- **[Fish Fillets - Next Generation](fish_fillets_ng.md)** (C++, GPL-2.0, mature)
- **[Frozen Bubble](frozen_bubble.md)** (Perl, GPL-2.0, mature, inactive since 2012)
- **[Grabble](grabble.md)** (Java, ?, mature, inactive since 2006)
- **[HoDoKu](hodoku.md)** (Java, GPL-3.0, mature, inactive since 2013)
diff --git a/games/_simulation.md b/games/_simulation.md
index 122fd9b6..5a1218f1 100644
--- a/games/_simulation.md
+++ b/games/_simulation.md
@@ -16,7 +16,7 @@
- **[Lincity](lincity.md)** (C, GPL-2.0, mature, inactive since 2005)
- **[Micropolis](micropolis.md)** (C++, Java, Python, GPL-3.0, mature)
- **[micropolisJS](micropolis_js.md)** (Javascript, GPL-3.0, mature)
-- **[NetStatsBaseball](netstatsbaseball.md)** (C, ?, mature)
+- **[NetStatsBaseball](netstatsbaseball.md)** (C, Public domain, mature)
- **[Oolite](oolite.md)** (Objective-C, C, Javascript, GPL-2.0, mature)
- **[Open Rails](open_rails.md)** (C#, GPL-3.0, mature)
- **[OpenBlox](openblox.md)** (Python, Lua, GPL-3.0, beta, inactive since 2011)
@@ -33,4 +33,4 @@
- **[TROPHY](trophy.md)** (C++, GPL-2.0, mature, inactive since 2012)
- **[Tux Football](tux_football.md)** (C++, GPL-2.0, beta, inactive since 2012)
- **[VDrift](vdrift.md)** (C++, GPL-3.0, mature, inactive since 2014)
-- **[YSoccer](ysoccer.md)** (Java, ?, mature)
\ No newline at end of file
+- **[YSoccer](ysoccer.md)** (Java, GPL-2.0, mature)
\ No newline at end of file
diff --git a/games/_sports.md b/games/_sports.md
index 2523e666..093009dd 100644
--- a/games/_sports.md
+++ b/games/_sports.md
@@ -3,9 +3,9 @@
- **[Bygfoot](bygfoot.md)** (Java, GPL-2.0, beta)
- **[GPL Arcade Volleyball](gpl_arcade_volleyball.md)** (C++, GPL-2.0, beta, inactive since 2006)
-- **[NetStatsBaseball](netstatsbaseball.md)** (C, ?, mature)
+- **[NetStatsBaseball](netstatsbaseball.md)** (C, Public domain, mature)
- **[Open Soccer Star](open_soccer_star.md)** (PHP, GPL-3.0, beta)
- **[OpenSoccer](open_soccer.md)** (PHP, GPL-3.0, beta)
- **[OpenWebSoccer-Sim](open_web_soccer.md)** (PHP, LGPL-3.0, mature)
- **[Tux Football](tux_football.md)** (C++, GPL-2.0, beta, inactive since 2012)
-- **[YSoccer](ysoccer.md)** (Java, ?, mature)
\ No newline at end of file
+- **[YSoccer](ysoccer.md)** (Java, GPL-2.0, mature)
\ No newline at end of file
diff --git a/games/_strategy.md b/games/_strategy.md
index 14b87428..9b465340 100644
--- a/games/_strategy.md
+++ b/games/_strategy.md
@@ -21,7 +21,7 @@
- **[Boson](boson.md)** (C++, GPL-2.0, beta, inactive since 2006)
- **[Brutal Chess](brutal_chess.md)** (C++, GPL-2.0, beta, inactive since 2007)
- **[Bygfoot](bygfoot.md)** (Java, GPL-2.0, beta)
-- **[C-evo](c_evo.md)** (Pascal, Public Domain, GPL-3.0, mature, inactive since 2013)
+- **[C-evo](c_evo.md)** (Pascal, Public domain, GPL-3.0, mature, inactive since 2013)
- **[Caesar IA](caesar_ia.md)** (C++, GPL-3.0, beta)
- **[Call to Power 2](call_to_power2.md)** (C++, Custom, mature)
- **[Civil](civil.md)** (Python, GPL-2.0, beta, inactive since 2003)
diff --git a/games/astromenace.md b/games/astromenace.md
index 9d923f08..820c95ea 100644
--- a/games/astromenace.md
+++ b/games/astromenace.md
@@ -1,4 +1,4 @@
-# Astromenace
+# AstroMenace
_3D space scroll-shooter with spaceship upgrade possibilities._
diff --git a/games/atomic_tanks.md b/games/atomic_tanks.md
index 3cf62a70..f747e29b 100644
--- a/games/atomic_tanks.md
+++ b/games/atomic_tanks.md
@@ -2,7 +2,7 @@
_Scorched Earth clone similar to the Worms series._
-- Home: http://atanks.sourceforge.net/
+- Home: http://atanks.sourceforge.net/, https://sourceforge.net/projects/atanks
- State: mature, inactive since 2016
- Download: https://sourceforge.net/projects/atanks/files/
- Platform: Windows, Linux
diff --git a/games/ballerburg.md b/games/ballerburg.md
index c22f62b5..67f3dc50 100644
--- a/games/ballerburg.md
+++ b/games/ballerburg.md
@@ -8,7 +8,7 @@ _Turnbased Artillery game from 1987._
- Keywords: action, artillery
- Code repository: https://gitlab.com/osgames/ballerburg.git (import of source downloads)
- Code language: C
-- Code license: Public Domain
+- Code license: Public domain
See also [Ballerburg SDL](http://baller.tuxfamily.org/)
diff --git a/games/blobwars_metal_solid_blob.md b/games/blobwars_metal_solid_blob.md
index 57397171..f2fdb6b7 100644
--- a/games/blobwars_metal_solid_blob.md
+++ b/games/blobwars_metal_solid_blob.md
@@ -4,11 +4,11 @@ _2D arcade platform game._
- Home: https://sourceforge.net/projects/blobwars/
- Media: https://en.wikipedia.org/wiki/Blob_Wars#Blob_Wars:_Metal_Blob_Solid
-- State: mature, inactive since 2015
+- State: mature
- Download: https://sourceforge.net/projects/blobwars/files/
- Platform: Windows
- Keywords: action
-- Code repository: https://git.code.sf.net/p/blobwars/code, https://gitlab.com/osgames/blobwars.git (+)
+- Code repository: https://git.code.sf.net/p/blobwars/code, https://gitlab.com/osgames/blobwars.git (+), https://src.fedoraproject.org/rpms/blobwars.git (+)
- Code language: C++
- Code license: GPL-2.0
diff --git a/games/blockattack.md b/games/blockattack.md
index e7c1bf2f..69f8535e 100644
--- a/games/blockattack.md
+++ b/games/blockattack.md
@@ -11,7 +11,7 @@ _A match-3 game inspired by "Tetris Attack" but more PC friendly._
- Code language: C++
- Code license: GPL-2.0
- Code dependencies: boost, boost-program-options, C++11 compiler, gettext, physfs, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, utfcpp
-- Assets license: GPLv2, GPLv2 or later, CC-BY-SA, Public Domain
+- Assets license: GPLv2, GPLv2 or later, CC-BY-SA, Public domain
First version released to the public was version 1.0.5 released May 6th, 2005.
Game play have been relatively stable since version 1.1.0 released June 13th, 2005.
diff --git a/games/c_evo.md b/games/c_evo.md
index 7ce92a7e..894a81a4 100644
--- a/games/c_evo.md
+++ b/games/c_evo.md
@@ -9,6 +9,6 @@ _C-evo is a freeware empire building game for Windows._
- Keywords: strategy, turn-based
- Code repository: https://github.com/vn971/cevo.git (and also download http://www.c-evo.org/files/download.php?cevosrc.cevosrc.zip)
- Code language: Pascal
-- Code license: Public Domain (original project), GPL-3.0 (Github project)
+- Code license: Public domain (original project), GPL-3.0 (Github project)
## Building
diff --git a/games/caesar_ia.md b/games/caesar_ia.md
index 739d2586..4048f7a4 100644
--- a/games/caesar_ia.md
+++ b/games/caesar_ia.md
@@ -1,4 +1,4 @@
-# Caesar IA
+# CaesarIA
_Remake of the popular citybuilder/economic strategy - Caesar III, videogame by Empressions Games._
diff --git a/games/catmother.md b/games/cat_mother_dead_justice.md
similarity index 100%
rename from games/catmother.md
rename to games/cat_mother_dead_justice.md
diff --git a/games/fish_fillets_ng.md b/games/fish_fillets_ng.md
index 9a6a6dfb..031b9f79 100644
--- a/games/fish_fillets_ng.md
+++ b/games/fish_fillets_ng.md
@@ -4,7 +4,7 @@ _Port of the wonderful puzzle game Fish Fillets from ALTAR interactive._
- Home: http://fillets.sourceforge.net/, https://sourceforge.net/projects/fillets/
- Media: https://en.wikipedia.org/wiki/Fish_Fillets_NG
-- State: mature, inactive since 2014
+- State: mature
- Download: http://fillets.sourceforge.net/download.php
- Platform: Windows, Linux, macOS
- Keywords: puzzle, port
diff --git a/games/free_orion.md b/games/free_orion.md
index a932acc3..17533ed4 100644
--- a/games/free_orion.md
+++ b/games/free_orion.md
@@ -1,4 +1,4 @@
-# Free Orion
+# FreeOrion
_Turn-based space empire and galactic conquest (4X) computer game._
diff --git a/games/golly.md b/games/golly.md
index 8abf4289..795b2556 100644
--- a/games/golly.md
+++ b/games/golly.md
@@ -1,4 +1,4 @@
-# Golly
+# Golly
_Conway's Game of Life and many other types of cellular automata._
diff --git a/games/jagged_alliance2.md b/games/jagged_alliance2_stracciatella.md
similarity index 100%
rename from games/jagged_alliance2.md
rename to games/jagged_alliance2_stracciatella.md
diff --git a/games/maxr.md b/games/mechanized_assault_and_exploration_reloaded.md
similarity index 89%
rename from games/maxr.md
rename to games/mechanized_assault_and_exploration_reloaded.md
index d29fe90e..8a4fc46b 100644
--- a/games/maxr.md
+++ b/games/mechanized_assault_and_exploration_reloaded.md
@@ -1,4 +1,4 @@
-# Mechanized Assault & eXploration Reloaded
+# Mechanized Assault & eXploration Reloaded
_A remake of the old M.A.X. by Interplay from 1996._
diff --git a/games/netstatsbaseball.md b/games/netstatsbaseball.md
index 64b15e3b..d5b98040 100644
--- a/games/netstatsbaseball.md
+++ b/games/netstatsbaseball.md
@@ -5,10 +5,14 @@ _Major League Baseball Simulation._
- Home: https://sourceforge.net/projects/nsbb/
- State: mature
- Download: https://sourceforge.net/projects/nsbb/files/
-- Keywords: sports, simulation
-- Code repository: http://nsbb.cvs.sourceforge.net (cvs)
+- Keywords: sports, non-free-content, simulation
+- Code repository: http://nsbb.cvs.sourceforge.net (cvs, outdated, see download)
- Code language: C
-- Code license: ?
-- Assets license: (player pics really legal to include)
+- Code license: Public domain
+- Assets license: (player pictures are from baseball-reference.com)
+
+Communication with Marshal Lake in August, 2019: "... the code is in the public domain. ... Anyone can use the code for anything they like."
## Building
+
+- Build system: Make
diff --git a/games/open_dune.md b/games/opendune.md
similarity index 96%
rename from games/open_dune.md
rename to games/opendune.md
index 4a82d6bf..442a86f2 100644
--- a/games/open_dune.md
+++ b/games/opendune.md
@@ -1,4 +1,4 @@
-# Open Dune
+# OpenDUNE
_Re-creation of the popular game "Dune II"._
diff --git a/games/rocks_and_diamonds.md b/games/rocks_and_diamonds.md
index 78e8ac4e..a8eabae8 100644
--- a/games/rocks_and_diamonds.md
+++ b/games/rocks_and_diamonds.md
@@ -1,4 +1,4 @@
-# Rocks'n'Diamonds
+# Rocks'n'Diamonds
_Arcade style game for “Boulder Dash” (C 64), “Emerald Mine” (Amiga), “Supaplex” (Amiga/PC), “Sokoban” (PC)_
diff --git a/games/scorched_3d.md b/games/scorched3d.md
similarity index 97%
rename from games/scorched_3d.md
rename to games/scorched3d.md
index 19dc3809..ca99c9f7 100644
--- a/games/scorched_3d.md
+++ b/games/scorched3d.md
@@ -1,4 +1,4 @@
-# Scorched 3D
+# Scorched3D
_Lively, fully destructible 3D landscapes in a turn-based artillery game._
diff --git a/games/scrolling_game_development_kit_2.md b/games/scrolling_game_development_kit_2.md
index 53cdeb82..2521f109 100644
--- a/games/scrolling_game_development_kit_2.md
+++ b/games/scrolling_game_development_kit_2.md
@@ -7,7 +7,7 @@ _Program for creating 2D scrolling games._
- Download: http://sgdk2.sourceforge.net/download.php, https://sourceforge.net/projects/sgdk2/files/
- Platform: Windows
- Keywords: framework, side-scrolling
-- Code repository: https://git.code.sf.net/p/sgdk2/git, https://svn.code.sf.net/p/sgdk2/code/trunk (svn)
+- Code repository: https://git.code.sf.net/p/sgdk2/git, https://svn.code.sf.net/p/sgdk2/code (svn)
- Code language: C#
- Code license: GPL-2.0
diff --git a/games/secret_mario_chronicles.md b/games/secret_maryo_chronicles.md
similarity index 95%
rename from games/secret_mario_chronicles.md
rename to games/secret_maryo_chronicles.md
index c0d16c5f..0b014266 100644
--- a/games/secret_mario_chronicles.md
+++ b/games/secret_maryo_chronicles.md
@@ -1,4 +1,4 @@
-# Secret Mario Chronicles
+# Secret Maryo Chronicles
_Jump and Run game like Super Mario World with an advanced Editor._
diff --git a/games/sentient_storage.md b/games/sentient_storage.md
index 4d708f6e..31a6249e 100644
--- a/games/sentient_storage.md
+++ b/games/sentient_storage.md
@@ -8,7 +8,7 @@ _Point & Click adventure!_
- Keywords: adventure
- Code repository: https://github.com/blakeohare/pyweek-sentientstorage.git (Javascript version)
- Code language: Python
-- Code license: Public Domain
+- Code license: Public domain
- Code dependencies: pygame
## Building
diff --git a/games/simutrans.md b/games/simutrans.md
index ef730f49..955564d1 100644
--- a/games/simutrans.md
+++ b/games/simutrans.md
@@ -1,4 +1,4 @@
-# SimuTrans
+# Simutrans
_A cross-platform simulation game in which the player strives to run a successful transport system._
diff --git a/games/slash_em.md b/games/slash_em.md
index d1a629bc..2bf4888f 100644
--- a/games/slash_em.md
+++ b/games/slash_em.md
@@ -1,4 +1,4 @@
-# Slash'EM
+# SLASH'EM
_Variant of the roguelike game NetHack that offers extra features, monsters, and items._
diff --git a/games/starblastrix.md b/games/starblastrix.md
index 4c22ea4c..cbd92c56 100644
--- a/games/starblastrix.md
+++ b/games/starblastrix.md
@@ -1,4 +1,4 @@
-# StarBlastrix
+# StarBlastrix
_Side scrolling shoot'em up game._
diff --git a/games/battle_for_wesnoth.md b/games/the_battle_for_wesnoth.md
similarity index 95%
rename from games/battle_for_wesnoth.md
rename to games/the_battle_for_wesnoth.md
index 6c1e2e46..7ac6897e 100644
--- a/games/battle_for_wesnoth.md
+++ b/games/the_battle_for_wesnoth.md
@@ -1,4 +1,4 @@
-# Battle for Wesnoth
+# The Battle for Wesnoth
_The Battle for Wesnoth is an open source, turn-based strategy game with a high fantasy theme._
diff --git a/games/the_bubs_brothers.md b/games/the_bubs_brothers.md
index ca8f265b..558b152a 100644
--- a/games/the_bubs_brothers.md
+++ b/games/the_bubs_brothers.md
@@ -2,12 +2,12 @@
_Networked clone of the classical Bubble Bobble board game._
-- Home: http://bub-n-bros.sourceforge.net/, https://sourceforge.net/projects/bub-n-bros/
+- Home: https://bitbucket.org/arigo/bub-n-bros/ (Modernized version running the clients in browsers.), http://bub-n-bros.sourceforge.net/ (original), https://sourceforge.net/projects/bub-n-bros/
- State: mature, inactive since 2013
- Download: http://bub-n-bros.sourceforge.net/download.html
- Platform: Windows, Linux, macOS
- Keywords: board game
-- Code repository: https://gitlab.com/osgames/the-bubs-brothers.git (conversion of cvs), http://bub-n-bros.cvs.sourceforge.net (cvs)
+- Code repository: https://bitbucket.org/arigo/bub-n-bros (hg), https://gitlab.com/osgames/the-bubs-brothers.git (+), http://bub-n-bros.cvs.sourceforge.net (cvs)
- Code language: Python
- Code license: MIT
- Code dependencies: pygame
diff --git a/games/ufo_alien_invasion.md b/games/ufo_alien_invasion.md
index b19bfc1f..69ffcc1b 100644
--- a/games/ufo_alien_invasion.md
+++ b/games/ufo_alien_invasion.md
@@ -1,4 +1,4 @@
-# Ufo: Alien Invasion
+# UFO: Alien Invasion
_UFO: Alien Invasion is a squad-based tactical strategy game in the tradition of the old X-COM PC games_
diff --git a/games/wyrmsun.md b/games/wyrmsun.md
index 8d6b4eba..ba6cdf82 100644
--- a/games/wyrmsun.md
+++ b/games/wyrmsun.md
@@ -10,9 +10,10 @@ _Strategy game which features elements of mythology, history and fiction._
- Code language: Lua, C++
- Code license: GPL-2.0
- Code dependencies: Modified Stratagus-Engine
-- Assets license: GPL-2.0 (many from Battle for Wesnoth)
+- Assets license: CC0, GPL-2.0 (some music and sound from Battle for Wesnoth)
## Building
-Engine uses CMake
+- Build system: CMake
+- Build instructions: https://github.com/Andrettin/Wyrmgus/blob/master/doc/building_on_ubuntu_16.txt, https://github.com/Andrettin/Wyrmgus/blob/master/doc/building_wyrmsun_on_debian_8.txt
diff --git a/games/ysoccer.md b/games/ysoccer.md
index a08b0468..164cfd6c 100644
--- a/games/ysoccer.md
+++ b/games/ysoccer.md
@@ -9,7 +9,7 @@ _Soccer game; continuation to Sensible World of Soccer._
- Keywords: sports, simulation, soccer
- Code repository: https://git.code.sf.net/p/ysoccer/code
- Code language: Java
-- Code license: ?
+- Code license: GPL-2.0 (see java/android/assets/docs/readme.htm)
Successor of [Yoda Soccer](https://sourceforge.net/projects/yodasoccer/).
diff --git a/statistics.md b/statistics.md
index bae73a2d..f8b29e5a 100644
--- a/statistics.md
+++ b/statistics.md
@@ -1,17 +1,17 @@
[comment]: # (autogenerated content, do not edit)
# Statistics
-analyzed 518 entries on 2019-08-13 13:34:45
+analyzed 518 entries on 2019-08-13 17:59:37
## State
- mature: 338 (65.3%)
- beta: 180 (34.7%)
-- inactive: 228 (44.0%)
+- inactive: 226 (43.6%)
##### Inactive State
-Blobby Volley 2 (2017), Eat The Whistle (2017), GLtron (2017), PokerTH (2017), Scrolling Game Development Kit 2 (2017), Tressette (2017), Zone of Control (2017), 3d.city (2016), Atlantis (2016), Atomic Tanks (2016), Atrinik (2016), Birth of the Empires (2016), Dark Destiny (2016), DNT (2016), Dungeon Monkey Eternal (2016), FreeRCT (2016), Infiniminer (2016), JaNaG - Java Name Generator (2016), Mechanized Assault & eXploration Reloaded (2016), Open Yahtzee (2016), Polis (2016), ransack (2016), TORCS, The Open Racing Car Simulator (2016), Tremulous (2016), Aleph One: Marathon (2015), Atomiks (2015), Battleround (2015), Blobwars: Metal Blob Solid (2015), Boulder Dash (2015), D-Fend Reloaded (2015), Dash Engine (2015), Delta Engine (2015), DeSmuME (2015), Egoboo (2015), Free heroes2 engine (2015), Liquid War (2015), M.E.W.L. (2015), pyORPG (2015), Roguish (2015), Scrabble3D (2015), Tenes Empanadas Graciela (2015), The Endless Dungeons (2015), The Epic of Heroes (2015), TwinEngine (2015), Witch Blast (2015), Argentum Online (2014), Battles of Antargis (2014), BlockOut II (2014), Cart Life (2014), Deity (2014), Dune Dynasty (2014), EternalWinterWars (2014), FAR Colony (2014), Fish Fillets - Next Generation (2014), Fujo (2014), Grobots (2014), Hale (2014), Heroes of Wing Commander (2014), Kingdoms (2014), Lips of Suna (2014), Open RPG Maker (2014), Open Tibia (2014), Radakan (2014), rpge (2014), sandbox Game Maker (2014), Scorched 3D (2014), SDL Game Engine 2D (2014), SDL Sopwith (2014), Sintel The Game (2014), Summoning Wars (2014), Supremacy (2014), Turious (2014), VDrift (2014), X-Moto (2014), Xenowar (2014), Bos Wars (2013), C-evo (2013), Candy Box 2 (2013), Decker (2013), DemiGod (2013), Dungeon Mapper (2013), HoDoKu (2013), HolySpirit (2013), MechCommander 2 Omnitech (2013), Mpango (2013), Murder In The Public Domain (2013), OpenRPG (2013), Phantasy Star Rebirth (2013), Room for Change (2013), SoftPixel Engine (2013), Source of Tales (2013), The Bub's Brothers (2013), Trinity Reign (2013), Zero Ballistics (2013), Biniax (2012), BlackNova Traders (2012), Blitzkrieg (2012), Cataclysm (2012), Celestron (2012), CommandoJS (2012), Conquests (2012), DarkCity (2012), Frozen Bubble (2012), Goblin Camp (2012), Hexwar (2012), Mega Mario (2012), OpenArena (2012), PARPG (2012), Thousand Parsec (2012), TROPHY (2012), Tux Football (2012), UFO2000 (2012), Wizards Magic (2012), Aeron (2011), Battlefield Java (2011), Brain Workshop (2011), Danger from the Deep (2011), Dawn (2011), GalaxyMage Redux (2011), Kobold's Quest 2 (2011), KQ Lives (2011), OpenBlox (2011), OpenMOO2 (2011), PyKaraoke (2011), Skrupel - Tribute Compilation (2011), Smash Battle (2011), Song of Albion (2011), Star Control II: The Ur-Quan Masters (2011), Tux of Math Command (2011), UlDunAd (2011), World of Phaos (2011), X-Force: Fight For Destiny (2011), AI Wars (2010), Bombermaaan (2010), Crimson Fields (2010), Dragon History - Dračí Historie (2010), Heroes of Wesnoth (2010), Labyrinth of Worlds (2010), Linwarrior 3D (2010), Mercenary Commander (2010), nXtank (2010), OpenHoMM (2010), Slay (2010), SpaceTrader for Java (2010), UltraStar (2010), XPilot (2010), XSera (2010), Alien Assault Traders (2009), Annchienta (2009), Ardentryst (2009), Battle Tanks (2009), Crown and Cutlass (2009), Dark Oberon (2009), Duel Commander (2009), Fall of Imyrin (2009), Fallen Spire (2009), FreeTrain (2009), Glest (2009), Goblin Hack (2009), MicroWar 2.0 (2009), Netrek (2009), ORIENT (2009), SDL Asylum (2009), Secret Mario Chronicles (2009), Space Trader for Windows (2009), World of Heroes (2009), Yo Frankie! (2009), A Planet's Revenge (2008), Attal: Lords of doom (2008), Avanor (2008), Freestars (2008), Mars, Land of No Mercy (2008), Meritous (2008), Open Game Engine (2008), S.C.O.U.R.G.E. (2008), Sengoku: Warring States of Japan (2008), Space Opera (2008), Armies (2007), Brutal Chess (2007), Eos, Dawn of Light: A Space Opera (2007), kiki the nano bot (2007), Pang Zero (2007), SharpKonquest (2007), Silvertree (2007), Slash'EM (2007), Underworld Adventures (2007), World Builder (2007), Betrayer's Moon Tactics (2006), Boson (2006), GPL Arcade Volleyball (2006), Grabble (2006), GUSANOS (2006), JQuest (2006), Linley's Dungeon Crawl (2006), Metal Mech (2006), Rogue Clone IV (2006), RPDungeon - computer aided role playing (2006), StarBlastrix (2006), GalaxyNG (2005), H-World (2005), Lincity (2005), Spice Trade (2005), Tumiki Fighters (2005), WAtomic (2005), Xconq (2005), ZAngband (2005), Colonization too (2004), Gee Whiz (2004), GM Tools (2004), Openglad (2004), PySol (2004), T-Bots (2004), AntiChess (2003), Cat Mother Dead Justice (2003), Civil (2003), Machinations (2003), Pizza Business (2003), Planetary Hoppers (2003), The Clans (2003), Wargamer (2003), XArchon (2003), Maelstrom (2002), Umbra (2002), Greenius' Civil War (2001), Tux Racer (2001), Operation Citadel (2000), xdigger (1999), Ballerburg (1987)
+Blobby Volley 2 (2017), Eat The Whistle (2017), GLtron (2017), PokerTH (2017), Scrolling Game Development Kit 2 (2017), Tressette (2017), Zone of Control (2017), 3d.city (2016), Atlantis (2016), Atomic Tanks (2016), Atrinik (2016), Birth of the Empires (2016), Dark Destiny (2016), DNT (2016), Dungeon Monkey Eternal (2016), FreeRCT (2016), Infiniminer (2016), JaNaG - Java Name Generator (2016), Mechanized Assault & eXploration Reloaded (2016), Open Yahtzee (2016), Polis (2016), ransack (2016), TORCS, The Open Racing Car Simulator (2016), Tremulous (2016), Aleph One: Marathon (2015), Atomiks (2015), Battleround (2015), Boulder Dash (2015), D-Fend Reloaded (2015), Dash Engine (2015), Delta Engine (2015), DeSmuME (2015), Egoboo (2015), Free heroes2 engine (2015), Liquid War (2015), M.E.W.L. (2015), pyORPG (2015), Roguish (2015), Scrabble3D (2015), Tenes Empanadas Graciela (2015), The Endless Dungeons (2015), The Epic of Heroes (2015), TwinEngine (2015), Witch Blast (2015), Argentum Online (2014), Battles of Antargis (2014), BlockOut II (2014), Cart Life (2014), Deity (2014), Dune Dynasty (2014), EternalWinterWars (2014), FAR Colony (2014), Fujo (2014), Grobots (2014), Hale (2014), Heroes of Wing Commander (2014), Kingdoms (2014), Lips of Suna (2014), Open RPG Maker (2014), Open Tibia (2014), Radakan (2014), rpge (2014), sandbox Game Maker (2014), Scorched 3D (2014), SDL Game Engine 2D (2014), SDL Sopwith (2014), Sintel The Game (2014), Summoning Wars (2014), Supremacy (2014), Turious (2014), VDrift (2014), X-Moto (2014), Xenowar (2014), Bos Wars (2013), C-evo (2013), Candy Box 2 (2013), Decker (2013), DemiGod (2013), Dungeon Mapper (2013), HoDoKu (2013), HolySpirit (2013), MechCommander 2 Omnitech (2013), Mpango (2013), Murder In The Public Domain (2013), OpenRPG (2013), Phantasy Star Rebirth (2013), Room for Change (2013), SoftPixel Engine (2013), Source of Tales (2013), The Bub's Brothers (2013), Trinity Reign (2013), Zero Ballistics (2013), Biniax (2012), BlackNova Traders (2012), Blitzkrieg (2012), Cataclysm (2012), Celestron (2012), CommandoJS (2012), Conquests (2012), DarkCity (2012), Frozen Bubble (2012), Goblin Camp (2012), Hexwar (2012), Mega Mario (2012), OpenArena (2012), PARPG (2012), Thousand Parsec (2012), TROPHY (2012), Tux Football (2012), UFO2000 (2012), Wizards Magic (2012), Aeron (2011), Battlefield Java (2011), Brain Workshop (2011), Danger from the Deep (2011), Dawn (2011), GalaxyMage Redux (2011), Kobold's Quest 2 (2011), KQ Lives (2011), OpenBlox (2011), OpenMOO2 (2011), PyKaraoke (2011), Skrupel - Tribute Compilation (2011), Smash Battle (2011), Song of Albion (2011), Star Control II: The Ur-Quan Masters (2011), Tux of Math Command (2011), UlDunAd (2011), World of Phaos (2011), X-Force: Fight For Destiny (2011), AI Wars (2010), Bombermaaan (2010), Crimson Fields (2010), Dragon History - Dračí Historie (2010), Heroes of Wesnoth (2010), Labyrinth of Worlds (2010), Linwarrior 3D (2010), Mercenary Commander (2010), nXtank (2010), OpenHoMM (2010), Slay (2010), SpaceTrader for Java (2010), UltraStar (2010), XPilot (2010), XSera (2010), Alien Assault Traders (2009), Annchienta (2009), Ardentryst (2009), Battle Tanks (2009), Crown and Cutlass (2009), Dark Oberon (2009), Duel Commander (2009), Fall of Imyrin (2009), Fallen Spire (2009), FreeTrain (2009), Glest (2009), Goblin Hack (2009), MicroWar 2.0 (2009), Netrek (2009), ORIENT (2009), SDL Asylum (2009), Secret Mario Chronicles (2009), Space Trader for Windows (2009), World of Heroes (2009), Yo Frankie! (2009), A Planet's Revenge (2008), Attal: Lords of doom (2008), Avanor (2008), Freestars (2008), Mars, Land of No Mercy (2008), Meritous (2008), Open Game Engine (2008), S.C.O.U.R.G.E. (2008), Sengoku: Warring States of Japan (2008), Space Opera (2008), Armies (2007), Brutal Chess (2007), Eos, Dawn of Light: A Space Opera (2007), kiki the nano bot (2007), Pang Zero (2007), SharpKonquest (2007), Silvertree (2007), Slash'EM (2007), Underworld Adventures (2007), World Builder (2007), Betrayer's Moon Tactics (2006), Boson (2006), GPL Arcade Volleyball (2006), Grabble (2006), GUSANOS (2006), JQuest (2006), Linley's Dungeon Crawl (2006), Metal Mech (2006), Rogue Clone IV (2006), RPDungeon - computer aided role playing (2006), StarBlastrix (2006), GalaxyNG (2005), H-World (2005), Lincity (2005), Spice Trade (2005), Tumiki Fighters (2005), WAtomic (2005), Xconq (2005), ZAngband (2005), Colonization too (2004), Gee Whiz (2004), GM Tools (2004), Openglad (2004), PySol (2004), T-Bots (2004), AntiChess (2003), Cat Mother Dead Justice (2003), Civil (2003), Machinations (2003), Pizza Business (2003), Planetary Hoppers (2003), The Clans (2003), Wargamer (2003), XArchon (2003), Maelstrom (2002), Umbra (2002), Greenius' Civil War (2001), Tux Racer (2001), Operation Citadel (2000), xdigger (1999), Ballerburg (1987)
## Code Languages
@@ -62,7 +62,7 @@ Blobby Volley 2 (2017), Eat The Whistle (2017), GLtron (2017), PokerTH (2017), S
##### Licenses frequency
-- GPL-2.0 (39.5%)
+- GPL-2.0 (39.7%)
- GPL-3.0 (25.3%)
- MIT (10.8%)
- Custom (4.8%)
@@ -70,13 +70,13 @@ Blobby Volley 2 (2017), Eat The Whistle (2017), GLtron (2017), PokerTH (2017), S
- zlib (2.3%)
- 3-clause BSD (2.1%)
- LGPL-2.1 (2.1%)
-- ? (1.9%)
+- ? (1.5%)
- AGPL-3.0 (1.1%)
- LGPL-2.0 (1.0%)
- LGPL-3.0 (1.0%)
+- Public domain (0.8%)
- GPL (0.6%)
- MPL (0.6%)
-- Public Domain (0.6%)
- 2-clause BSD (0.4%)
- Artistic License (0.4%)
- Boost-1.0 (0.4%)
@@ -98,7 +98,7 @@ Blobby Volley 2 (2017), Eat The Whistle (2017), GLtron (2017), PokerTH (2017), S
##### Keywords frequency
-- strategy (19.0%)
+- strategy (18.9%)
- role playing (13.4%)
- action (7.9%)
- framework (6.7%)
@@ -179,6 +179,7 @@ Blobby Volley 2 (2017), Eat The Whistle (2017), GLtron (2017), PokerTH (2017), S
- match 3 (0.1%)
- mmorpg (0.1%)
- MUD (0.1%)
+- non-free-content (0.1%)
- physics (0.1%)
- plattformer (0.1%)
- point&click (0.1%)
@@ -296,31 +297,31 @@ With code dependency field 105 (20.3%)
## Build systems
-Build systems information available for 24.9% of all projects.
+Build systems information available for 25.3% of all projects.
-##### Build systems frequency (129)
+##### Build systems frequency (131)
-- CMake (60.5%)
-- Autoconf (16.3%)
-- Make (5.4%)
-- Scons (3.9%)
+- CMake (60.3%)
+- Autoconf (16.0%)
+- Make (6.1%)
+- Scons (3.8%)
- setup.py (3.1%)
- Custom (2.3%)
- Gradle (2.3%)
-- Ant (1.6%)
-- Maven (1.6%)
+- Ant (1.5%)
+- Maven (1.5%)
- Lazarus project (0.8%)
- py2exe (0.8%)
- Rake (0.8%)
- Xcode project (0.8%)
-##### C and C++ projects without build system information (212)
+##### C and C++ projects without build system information (210)
-Aeron, Aleph One: Marathon, Angband, Antares, Armagetron Advanced, Armies, Atlantis, Atomic Tanks, Atomiks, Atomix, Attal: Lords of doom, AutoREALM, Avanor, Ballerburg, Battle Tanks, Battles of Antargis, Biniax, Birth of the Empires, Blobby Volley 2, Blobwars: Metal Blob Solid, BlockOut II, Bombermaaan, Boost (C++ Libraries), Bos Wars, Boson, Brutal Chess, Call to Power 2, Cat Mother Dead Justice, Cataclysm, Catch Challenger, Classic Blades of Exile, Clou!, Colonization too, Conquests, Core War, Crossfire, Crown and Cutlass, Crypto++, Daimonin, Danger from the Deep, Dark Oberon, Dawn, Deliantra, DeSmuME, Duel Commander, Dune Dynasty, Dune Legacy, Dungeon Craft, Dungeon Crawl Stone Soup, Dungeon Mapper, Endless Sky, ENIGMA, Epiar, Erebus, Eternal Lands, Evol Online, Exult, Fall of Imyrin, Fanwor, Free heroes2 engine, Free in the Dark (engine), Free Space Colonization, Freedink, Freeminer, Freestars, GalaxyNG, GameLV, GDash, Gee Whiz, Gigalomania, Globulation2, GLtron, GM Tools, Goblin Camp, Goblin Hack, Golly , GPL Arcade Volleyball, Greenius' Civil War, Grobots, H-World, Harris, Haxima, Heroes of Wesnoth, Hex Game, HolySpirit, Irrlicht Engine, Iter Vehemens ad Necem, Jagged Alliance 2 Stracciatella, KAtomic, KQ Lives, Labyrinth of Worlds, LGames, LGeneral, libGDX, libpng, Libxml2, Lightweight Java Game Library, Lincity, LinCity-NG, Linley's Dungeon Crawl, Linwarrior 3D, Lips of Suna, Lua, Lumix Engine, LZMA SDK, M.E.W.L., Machinations, Mars, Land of No Mercy, MechCommander 2 Omnitech, Mega Mario, Meridian 59, Meritous, Moria, Naev, NetHack, NetPanzer, Netrek, NetStatsBaseball, Neverball, Nexiuz, NLarn, Oolite, Open AL, Open Apocalypse, Open Dune, Open Meridian, Open RPG Maker, Open Yahtzee, Open Zelda, OpenArena, OpenCity, Openglad, OpenHoMM, OpenMW, OpenSSL, Operation Citadel, Orx, Other-Life, Panda 3D, Pax Britannica, Phantasy Star Rebirth, Pioneers, Pizza Business, pkg-config, PlaneShift, PokerTH, Pthreads-win32, pygame, Qt, Ragel, Red Eclipse, REGoth, Return to the Roots, Rocks'n'Diamonds , Rogue Clone IV, Rolisteam, S.C.O.U.R.G.E., sandbox Game Maker, Scorched 3D, SDL Asylum, SDL Game Engine 2D, SDL Sopwith, Secret Mario Chronicles, Sengoku: Warring States of Japan, Seven Kingdoms: Ancient Adversaries, SimuTrans, Slash'EM, Smash Battle, Song of Albion, SpaceZero, Star Ruler 2, StarBlastrix , Summoning Wars, SuperTuxKart, SWIG, T-Bots, Tales of Maj'Eyal, Tenes Empanadas Graciela, The Clans, The Endless Dungeons, The Epic of Heroes, The Legend of Edgar, Thousand Parsec, TinTin++, TORCS, The Open Racing Car Simulator, Tremulous, Turious, Tux Racer, TwinEngine, UFO2000, Underworld Adventures, UnNetHack, VCMI Project, Vega Strike, War Of Kingdom, Wargamer, Wargus, Witch Blast, Wolfpack Empire, WorldForge, wxWidgets, Wyrmsun, X-Moto, XArchon, Xconq, xdigger, Xenowar, Xonotic, XPilot, XSera, XZ Utils, ZAngband
+Aeron, Aleph One: Marathon, Angband, Antares, Armagetron Advanced, Armies, Atlantis, Atomic Tanks, Atomiks, Atomix, Attal: Lords of doom, AutoREALM, Avanor, Ballerburg, Battle Tanks, Battles of Antargis, Biniax, Birth of the Empires, Blobby Volley 2, Blobwars: Metal Blob Solid, BlockOut II, Bombermaaan, Boost (C++ Libraries), Bos Wars, Boson, Brutal Chess, Call to Power 2, Cat Mother Dead Justice, Cataclysm, Catch Challenger, Classic Blades of Exile, Clou!, Colonization too, Conquests, Core War, Crossfire, Crown and Cutlass, Crypto++, Daimonin, Danger from the Deep, Dark Oberon, Dawn, Deliantra, DeSmuME, Duel Commander, Dune Dynasty, Dune Legacy, Dungeon Craft, Dungeon Crawl Stone Soup, Dungeon Mapper, Endless Sky, ENIGMA, Epiar, Erebus, Eternal Lands, Evol Online, Exult, Fall of Imyrin, Fanwor, Free heroes2 engine, Free in the Dark (engine), Free Space Colonization, Freedink, Freeminer, Freestars, GalaxyNG, GameLV, GDash, Gee Whiz, Gigalomania, Globulation2, GLtron, GM Tools, Goblin Camp, Goblin Hack, Golly , GPL Arcade Volleyball, Greenius' Civil War, Grobots, H-World, Harris, Haxima, Heroes of Wesnoth, Hex Game, HolySpirit, Irrlicht Engine, Iter Vehemens ad Necem, Jagged Alliance 2 Stracciatella, KAtomic, KQ Lives, Labyrinth of Worlds, LGames, LGeneral, libGDX, libpng, Libxml2, Lightweight Java Game Library, Lincity, LinCity-NG, Linley's Dungeon Crawl, Linwarrior 3D, Lips of Suna, Lua, Lumix Engine, LZMA SDK, M.E.W.L., Machinations, Mars, Land of No Mercy, MechCommander 2 Omnitech, Mega Mario, Meridian 59, Meritous, Moria, Naev, NetHack, NetPanzer, Netrek, Neverball, Nexiuz, NLarn, Oolite, Open AL, Open Apocalypse, Open Dune, Open Meridian, Open RPG Maker, Open Yahtzee, Open Zelda, OpenArena, OpenCity, Openglad, OpenHoMM, OpenMW, OpenSSL, Operation Citadel, Orx, Other-Life, Panda 3D, Pax Britannica, Phantasy Star Rebirth, Pioneers, Pizza Business, pkg-config, PlaneShift, PokerTH, Pthreads-win32, pygame, Qt, Ragel, Red Eclipse, REGoth, Return to the Roots, Rocks'n'Diamonds , Rogue Clone IV, Rolisteam, S.C.O.U.R.G.E., sandbox Game Maker, Scorched 3D, SDL Asylum, SDL Game Engine 2D, SDL Sopwith, Secret Mario Chronicles, Sengoku: Warring States of Japan, Seven Kingdoms: Ancient Adversaries, SimuTrans, Slash'EM, Smash Battle, Song of Albion, SpaceZero, Star Ruler 2, StarBlastrix , Summoning Wars, SuperTuxKart, SWIG, T-Bots, Tales of Maj'Eyal, Tenes Empanadas Graciela, The Clans, The Endless Dungeons, The Epic of Heroes, The Legend of Edgar, Thousand Parsec, TinTin++, TORCS, The Open Racing Car Simulator, Tremulous, Turious, Tux Racer, TwinEngine, UFO2000, Underworld Adventures, UnNetHack, VCMI Project, Vega Strike, War Of Kingdom, Wargamer, Wargus, Witch Blast, Wolfpack Empire, WorldForge, wxWidgets, X-Moto, XArchon, Xconq, xdigger, Xenowar, Xonotic, XPilot, XSera, XZ Utils, ZAngband
-##### C and C++ projects with a build system different from CMake (77)
+##### C and C++ projects with a build system different from CMake (78)
-Allegro, Annchienta, Arx Libertatis, Astromenace, Atrinik, Battle for Wesnoth, Blender game engine, Block Attack - Rise of the Blocks, C-Dogs, Caesar IA, Chocolate Doom, Choria, COCOS2D-X, Colobot, Corsix Theme Hospital, DNT, Doxygen, DreamChess, EasyRPG Player, Eat The Whistle, Egoboo, Flare Engine, FlightGear, Free Orion, FreeRCT, Freeserf, FreeSynd, FreeType, GemRB, HarfBuzz, Lugaru, LÖVE, Mana, Maratis, Me and My Shadow, Mechanized Assault & eXploration Reloaded , MegaGlest, Minetest, mkxp, OGRE3D, Open AL Soft, Open Game Engine, Open Surge, Open Tibia, OpenClonk, OpenLieroX, OpenRCT2, OpenSkyscraper, OpenXcom, PainTown, Pingus, Polycode, Rigs of Rods, Ryzom Core, Simple and Fast Multimedia Library, Simple DirectMedia Layer, SoftPixel Engine, Solarus, Speed Dreams, Spring RTS engine, StepMania, Stunt Rally, The Butterfly Effect, Trinity Reign, Tux Football, Tux of Math Command, Ufo: Alien Invasion, Unvanquished, Urho3D, Valyria Tear, Warzone 2100, Widelands, xoreos, XU4, yaml-cpp, Zero Ballistics, zlib
+Allegro, Annchienta, Arx Libertatis, Astromenace, Atrinik, Battle for Wesnoth, Blender game engine, Block Attack - Rise of the Blocks, C-Dogs, Caesar IA, Chocolate Doom, Choria, COCOS2D-X, Colobot, Corsix Theme Hospital, DNT, Doxygen, DreamChess, EasyRPG Player, Eat The Whistle, Egoboo, Flare Engine, FlightGear, Free Orion, FreeRCT, Freeserf, FreeSynd, FreeType, GemRB, HarfBuzz, Lugaru, LÖVE, Mana, Maratis, Me and My Shadow, Mechanized Assault & eXploration Reloaded , MegaGlest, Minetest, mkxp, OGRE3D, Open AL Soft, Open Game Engine, Open Surge, Open Tibia, OpenClonk, OpenLieroX, OpenRCT2, OpenSkyscraper, OpenXcom, PainTown, Pingus, Polycode, Rigs of Rods, Ryzom Core, Simple and Fast Multimedia Library, Simple DirectMedia Layer, SoftPixel Engine, Solarus, Speed Dreams, Spring RTS engine, StepMania, Stunt Rally, The Butterfly Effect, Trinity Reign, Tux Football, Tux of Math Command, Ufo: Alien Invasion, Unvanquished, Urho3D, Valyria Tear, Warzone 2100, Widelands, Wyrmsun, xoreos, XU4, yaml-cpp, Zero Ballistics, zlib
## Platform
diff --git a/tools/archives.json b/tools/archives.json
index 7bee6636..0620a680 100644
--- a/tools/archives.json
+++ b/tools/archives.json
@@ -506,7 +506,8 @@
"https://gitlab.com/xonotic/xonotic.git",
"https://gitlab.gnome.org/GNOME/libxml2.git",
"https://gitlab.openrsc.com/open-rsc/Game.git",
- "https://gitorious.org/turious/turious.git"
+ "https://gitorious.org/turious/turious.git",
+ "https://src.fedoraproject.org/rpms/blobwars.git"
],
"svn": [
"http://svn.uktrainsim.com/svn/openrails/trunk",
@@ -537,6 +538,7 @@
"http://hg.libsdl.org/SDL",
"https://bitbucket.org/Darthman/quad/src",
"https://bitbucket.org/allacrost/allacrost/src",
+ "https://bitbucket.org/arigo/bub-n-bros",
"https://bitbucket.org/featheredmelody/lost-sky-project-public/src",
"https://bitbucket.org/genericcontainer/goblin-camp/src",
"https://bitbucket.org/giszmo/glob2",
diff --git a/tools/maintenance.py b/tools/maintenance.py
index 071a4e2b..57900209 100644
--- a/tools/maintenance.py
+++ b/tools/maintenance.py
@@ -8,39 +8,12 @@
This script runs with Python 3, it could also with Python 2 with some minor tweaks probably.
"""
-import re
import urllib.request
import http.client
import datetime
import json
import textwrap
-from utils.utils import *
-
-essential_fields = ('Home', 'State', 'Keywords', 'Code repository', 'Code language', 'Code license')
-valid_fields = ('Home', 'Media', 'State', 'Play', 'Download', 'Platform', 'Keywords', 'Code repository', 'Code language',
-'Code license', 'Code dependencies', 'Assets license', 'Build system', 'Build instructions')
-valid_platforms = ('Windows', 'Linux', 'macOS', 'Android', 'Browser')
-recommended_keywords = ('action', 'arcade', 'adventure', 'visual novel', 'sports', 'platform', 'puzzle', 'role playing', 'simulation', 'strategy', 'card game', 'board game', 'music', 'educational', 'tool', 'game engine', 'framework', 'library')
-
-
-def entry_iterator():
- """
-
- """
-
- # get all entries (ignore everything starting with underscore)
- entries = os.listdir(games_path)
- entries = (x for x in entries if not x.startswith('_'))
-
- # iterate over all entries
- for entry in entries:
- entry_path = os.path.join(games_path, entry)
-
- # read entry
- content = read_text(entry_path)
-
- # yield
- yield entry, entry_path, content
+from utils.osg import *
def update_readme_and_tocs(infos):
@@ -111,7 +84,7 @@ def create_toc(title, file, entries):
# assemble rows
rows = []
for entry in entries:
- rows.append('- **[{}]({})** ({})'.format(entry['title'], entry['file'], ', '.join(entry['code language'] + entry['code license'] + entry['state'])))
+ rows.append('- **[{}]({})** ({})'.format(entry['name'], entry['file'], ', '.join(entry['code language'] + entry['code license'] + entry['state'])))
# sort rows (by title)
rows.sort(key=str.casefold)
@@ -142,7 +115,7 @@ def check_validity_external_links():
ignored_urls = ('https://git.tukaani.org/xz.git')
# iterate over all entries
- for _, entry_path, content in entry_iterator():
+ for _, entry_path, content in entry_iterator(games_path):
# apply regex
matches = regex.findall(content)
@@ -189,7 +162,7 @@ def check_template_leftovers():
check_strings = [x for x in text if x and not x.startswith('##')]
# iterate over all entries
- for _, entry_path, content in entry_iterator():
+ for _, entry_path, content in entry_iterator(games_path):
for check_string in check_strings:
if content.find(check_string) >= 0:
@@ -207,7 +180,7 @@ def fix_entries():
regex = re.compile(r"(.*)- Keywords:([^\n]*)(.*)", re.DOTALL)
# iterate over all entries
- for entry, entry_path, content in entry_iterator():
+ for entry, entry_path, content in entry_iterator(games_path):
# match with regex
matches = regex.findall(content)
@@ -260,7 +233,7 @@ def fix_entries():
regex = re.compile(r"(.*)- Code dependencies:([^\n]*)(.*)", re.DOTALL)
# iterate over all entries
- for entry, entry_path, content in entry_iterator():
+ for entry, entry_path, content in entry_iterator(games_path):
# match with regex
matches = regex.findall(content)
@@ -296,7 +269,7 @@ def fix_entries():
regex = re.compile(r"(.*)- Build system:([^\n]*)(.*)", re.DOTALL)
# iterate over all entries
- for entry, entry_path, content in entry_iterator():
+ for entry, entry_path, content in entry_iterator(games_path):
# match with regex
matches = regex.findall(content)
@@ -325,160 +298,6 @@ def fix_entries():
write_text(entry_path, new_content)
-def parse_entry(content):
- """
- Returns a dictionary of the features of the content
- """
-
- info = {}
-
- # read title
- regex = re.compile(r"^# (.*)") # start of content, starting with "# " and then everything until the end of line
- matches = regex.findall(content)
- if len(matches) != 1 or not matches[0]:
- raise RuntimeError('Title not found in entry "{}"'.format(content))
- info['title'] = matches[0]
-
- # read description
- regex = re.compile(r"^.*\n\n_(.*)_\n") # third line from top, everything between underscores
- matches = regex.findall(content)
- if len(matches) != 1 or not matches[0]:
- raise RuntimeError('Description not found in entry "{}"'.format(content))
- info['description'] = matches[0]
-
- # first read all field names
- regex = re.compile(r"^- (.*?): ", re.MULTILINE) # start of each line having "- ", then everything until a colon, then ": "
- fields = regex.findall(content)
-
- # check that essential fields are there
- for field in essential_fields:
- if field not in fields:
- raise RuntimeError('Essential field "{}" missing in entry "{}"'.format(field, info['title']))
-
- # check that all fields are valid fields and are existing in that order
- index = 0
- for field in fields:
- while index < len(valid_fields) and field != valid_fields[index]:
- index += 1
- if index == len(valid_fields):
- raise RuntimeError('Field "{}" in entry "{}" either misspelled or in wrong order'.format(field, info['title']))
-
- # iterate over found fields
- for field in fields:
- regex = re.compile(r"- {}: (.*)".format(field))
- matches = regex.findall(content)
- if len(matches) != 1:
- # every field should only be present once
- raise RuntimeError('Field "{}" in entry "{}" exist multiple times.'.format(field, info['title']))
- v = matches[0]
-
- # first store as is
- info[field.lower()+'-raw'] = v
-
- # remove parenthesis with content
- v = re.sub(r'\([^)]*\)', '', v)
-
- # split on ','
- v = v.split(',')
-
- # strip
- v = [x.strip() for x in v]
-
- # remove all being false (empty) that were for example just comments
- v = [x for x in v if x]
-
- # if entry is of structure <..> remove <>
- v = [x[1:-1] if x[0] is '<' and x[-1] is '>' else x for x in v]
-
- # empty fields will not be stored
- if not v:
- continue
-
- # store in info
- info[field.lower()] = v
-
- # now checks on the content of fields
-
- # state (essential field) must contain either beta or mature but not both, but at least one
- v = info['state']
- for t in v:
- if t != 'beta' and t != 'mature' and not t.startswith('inactive since '):
- raise RuntimeError('Unknown state tage "{}" in entry "{}"'.format(t, info['title']))
- if 'beta' in v != 'mature' in v:
- raise RuntimeError('State must be one of <"beta", "mature"> in entry "{}"'.format(info['title']))
-
- # extract inactive year
- phrase = 'inactive since '
- inactive_year = [x[len(phrase):] for x in v if x.startswith(phrase)]
- assert len(inactive_year) <= 1
- if inactive_year:
- info['inactive'] = inactive_year[0]
-
- # urls in home, download, play and code repositories must start with http or https (or git) and should not contain spaces
- for field in ['home', 'download', 'play', 'code repository']:
- if field in info:
- for url in info[field]:
- if not (url.startswith('http://') or url.startswith('https://') or url.startswith('git://')):
- raise RuntimeError('URL "{}" in entry "{}" does not start with http'.format(url, info['title']))
- if ' ' in url:
- raise RuntimeError('URL "{}" in entry "{}" contains a space'.format(url, info['title']))
-
- # github repositories should end on .git
- if 'code repository' in info:
- for repo in info['code repository']:
- if repo.startswith('https://github.com/') and not repo.endswith('.git'):
- raise RuntimeError('Github repo {} in entry "{}" should end on .git.'.format(repo, info['title']))
-
- # check that all platform tags are valid tags and are existing in that order
- if 'platform' in info:
- index = 0
- for platform in info['platform']:
- while index < len(valid_platforms) and platform != valid_platforms[index]:
- index += 1
- if index == len(valid_platforms):
- raise RuntimeError('Platform tag "{}" in entry "{}" either misspelled or in wrong order'.format(platform, info['title']))
-
- # there must be at least one keyword
- if 'keywords' not in info:
- raise RuntimeError('Need at least one keyword in entry "{}"'.format(info['title']))
-
- # check for existence of at least one recommended keywords
- fail = True
- for recommended_keyword in recommended_keywords:
- if recommended_keyword in info['keywords']:
- fail = False
- break
- if fail:
- raise RuntimeError('Entry "{}" contains no recommended keyword'.format(info['title']))
-
- return info
-
-
-def assemble_infos():
- """
- Parses all entries and assembles interesting infos about them.
- """
-
- print('assemble game infos')
-
- # a database of all important infos about the entries
- infos = []
-
- # iterate over all entries
- for entry, _, content in entry_iterator():
-
- # parse entry
- info = parse_entry(content)
-
- # add file information
- info['file'] = entry
-
- # add to list
- infos.append(info)
-
- return infos
-
-
def update_statistics(infos):
"""
Generates the statistics page.
@@ -507,7 +326,7 @@ def update_statistics(infos):
statistics += '- mature: {} ({:.1f}%)\n- beta: {} ({:.1f}%)\n- inactive: {} ({:.1f}%)\n\n'.format(number_state_mature, rel(number_state_mature), number_state_beta, rel(number_state_beta), number_inactive, rel(number_inactive))
if number_inactive > 0:
- entries_inactive = [(x['title'], x['inactive']) for x in infos if 'inactive' in x]
+ entries_inactive = [(x['name'], x['inactive']) for x in infos if 'inactive' in x]
entries_inactive.sort(key=lambda x: str.casefold(x[0])) # first sort by name
entries_inactive.sort(key=lambda x: x[1], reverse=True) # then sort by inactive year (more recently first)
entries_inactive = ['{} ({})'.format(*x) for x in entries_inactive]
@@ -522,7 +341,7 @@ def update_statistics(infos):
# number_no_language = sum(1 for x in infois if field not in x)
# if number_no_language > 0:
# statistics += 'Without language tag: {} ({:.1f}%)\n\n'.format(number_no_language, rel(number_no_language))
- # entries_no_language = [x['title'] for x in infois if field not in x]
+ # entries_no_language = [x['name'] for x in infois if field not in x]
# entries_no_language.sort()
# statistics += ', '.join(entries_no_language) + '\n\n'
@@ -547,7 +366,7 @@ def update_statistics(infos):
number_no_license = sum(1 for x in infos if field not in x)
if number_no_license > 0:
statistics += 'Without license tag: {} ({:.1f}%)\n\n'.format(number_no_license, rel(number_no_license))
- entries_no_license = [x['title'] for x in infos if field not in x]
+ entries_no_license = [x['name'] for x in infos if field not in x]
entries_no_license.sort()
statistics += ', '.join(entries_no_license) + '\n\n'
@@ -587,7 +406,7 @@ def update_statistics(infos):
entries = []
for info in infos:
if 'download' not in info and 'play' not in info:
- entries.append(info['title'])
+ entries.append(info['name'])
entries.sort(key=str.casefold)
statistics += '{}: '.format(len(entries)) + ', '.join(entries) + '\n\n'
@@ -607,7 +426,7 @@ def update_statistics(infos):
break
# if there were repositories, but none popular, add them to the list
if not popular:
- entries.append(info['title'])
+ entries.append(info['name'])
# print(info[field])
entries.sort(key=str.casefold)
statistics += '{}: '.format(len(entries)) + ', '.join(entries) + '\n\n'
@@ -655,7 +474,7 @@ def update_statistics(infos):
c_cpp_project_without_build_system = []
for info in infos:
if field not in info and ('C' in info['code language'] or 'C++' in info['code language']):
- c_cpp_project_without_build_system.append(info['title'])
+ c_cpp_project_without_build_system.append(info['name'])
c_cpp_project_without_build_system.sort(key=str.casefold)
statistics += '##### C and C++ projects without build system information ({})\n\n'.format(len(c_cpp_project_without_build_system)) + ', '.join(c_cpp_project_without_build_system) + '\n\n'
@@ -663,7 +482,7 @@ def update_statistics(infos):
c_cpp_project_not_cmake = []
for info in infos:
if field in info and 'CMake' in info[field] and ('C' in info['code language'] or 'C++' in info['code language']):
- c_cpp_project_not_cmake.append(info['title'])
+ c_cpp_project_not_cmake.append(info['name'])
c_cpp_project_not_cmake.sort(key=str.casefold)
statistics += '##### C and C++ projects with a build system different from CMake ({})\n\n'.format(len(c_cpp_project_not_cmake)) + ', '.join(c_cpp_project_not_cmake) + '\n\n'
@@ -705,7 +524,7 @@ def export_json(infos):
for info in infos:
# game & description
- entry = ['{} (home, entry)'.format(info['title'], info['home'][0],
+ entry = ['{} (home, entry)'.format(info['name'], info['home'][0],
r'https://github.com/Trilarion/opensourcegames/blob/master/games/' + info['file']),
textwrap.shorten(info['description'], width=60, placeholder='..')]
@@ -861,12 +680,12 @@ def export_primary_code_repositories_json():
continue
if not consumed:
- unconsumed_entries.append([info['title'], info[field]])
+ unconsumed_entries.append([info['name'], info[field]])
# print output
#if info['code repository']:
- # print('Entry "{}" unconsumed repo: {}'.format(info['title'], info[field]))
+ # print('Entry "{}" unconsumed repo: {}'.format(info['name'], info[field]))
#if not info['code repository']:
- # print('Entry "{}" unconsumed repo: {}'.format(info['title'], info[field]))
+ # print('Entry "{}" unconsumed repo: {}'.format(info['name'], info[field]))
# sort them alphabetically (and remove duplicates)
for k, v in primary_repos.items():
@@ -919,7 +738,7 @@ if __name__ == "__main__":
fix_entries()
# assemble info
- infos = assemble_infos()
+ infos = assemble_infos(games_path)
# recount and write to readme and to tocs
update_readme_and_tocs(infos)
diff --git a/tools/synchronization_osgameclones.py b/tools/synchronization_osgameclones.py
new file mode 100644
index 00000000..8dd6ffab
--- /dev/null
+++ b/tools/synchronization_osgameclones.py
@@ -0,0 +1,99 @@
+"""
+
+
+Mapping osgameclones, ours
+
+name - name
+lang - code language
+license - code license
+development - state
+status - state
+type - keywords
+url - home
+multiplayer - keywords
+content - asset license, keywords
+"""
+
+import ruamel_yaml as yaml
+from difflib import SequenceMatcher
+from utils.osg import *
+
+# should change on osgameclones
+osgc_name_aliases = {'parpg': 'PARPG', 'OpenRails': 'Open Rails', 'c-evo': 'C-evo', 'Stepmania': 'StepMania', 'Mechanized Assault and eXploration Reloaded': 'Mechanized Assault & eXploration Reloaded',
+ 'Jagged Alliance 2 - Stracciatella': 'Jagged Alliance 2 Stracciatella', 'xu4': 'XU4', "Rocks'n'diamonds": "Rocks'n'Diamonds",
+ 'Gusanos': 'GUSANOS', 'MicropolisJS': 'micropolisJS'}
+
+def similarity(a, b):
+ return SequenceMatcher(None, str.casefold(a), str.casefold(b)).ratio()
+
+if __name__ == "__main__":
+
+ # paths
+ similarity_threshold = 0.8
+ root_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir))
+
+ # import the osgameclones data
+ osgc_path = os.path.realpath(os.path.join(root_path, os.path.pardir, 'osgameclones', 'games'))
+ files = os.listdir(osgc_path)
+
+ # iterate over all yaml files in osgameclones/data folder
+ osgc_entries = []
+ for file in files:
+ # read yaml
+ with open(os.path.join(osgc_path, file), 'r') as stream:
+ try:
+ _ = yaml.safe_load(stream)
+ except yaml.YAMLError as exc:
+ raise exc
+
+ # add to entries
+ osgc_entries.extend(_)
+ print('{} entries in osgameclones'.format(len(osgc_entries)))
+
+ # fix names
+ for index, entry in enumerate(osgc_entries):
+ name = entry['name']
+ if name in osgc_name_aliases:
+ entry['name'] = osgc_name_aliases[name]
+ osgc_entries[index] = entry
+
+ # get all osgc 'lang' fields
+ osgc_langs = set([x['lang'] for x in osgc_entries if 'lang' in x])
+ print('osgc-languages: {}'.format(osgc_langs))
+
+
+ # read our database
+ games_path = os.path.join(root_path, 'games')
+ our_entries = assemble_infos(games_path)
+ print('{} entries with us'.format(len(our_entries)))
+
+ # just the names
+ osgc_names = set([x['name'] for x in osgc_entries])
+ our_names = set([x['name'] for x in our_entries])
+ common_names = osgc_names & our_names
+ osgc_names -= common_names
+ our_names -= common_names
+ print('{} in both, {} only in osgameclones, {} only with us'.format(len(common_names), len(osgc_names), len(our_names)))
+
+ # find similar names among the rest
+ for osgc_name in osgc_names:
+ for our_name in our_names:
+ if similarity(osgc_name, our_name) > similarity_threshold:
+ print('{} - {}'.format(osgc_name, our_name))
+
+ # find those that entries in osgameclones that are also in our database
+ for osgc_entry in osgc_entries:
+ osgc_name = osgc_entry['name']
+
+ for our_entry in our_entries:
+ our_name = our_entry['name']
+
+ if osgc_name == our_name:
+ # a match, check the fields
+ if osgc_entry['lang'] not in our_name['code language']:
+ print()
+
+
+
+
+
diff --git a/tools/utils/osg.py b/tools/utils/osg.py
new file mode 100644
index 00000000..b2f62de3
--- /dev/null
+++ b/tools/utils/osg.py
@@ -0,0 +1,191 @@
+"""
+Specific functions working on the games.
+"""
+
+import re
+from utils.utils import *
+
+essential_fields = ('Home', 'State', 'Keywords', 'Code repository', 'Code language', 'Code license')
+valid_fields = ('Home', 'Media', 'State', 'Play', 'Download', 'Platform', 'Keywords', 'Code repository', 'Code language',
+'Code license', 'Code dependencies', 'Assets license', 'Build system', 'Build instructions')
+valid_platforms = ('Windows', 'Linux', 'macOS', 'Android', 'Browser')
+recommended_keywords = ('action', 'arcade', 'adventure', 'visual novel', 'sports', 'platform', 'puzzle', 'role playing', 'simulation', 'strategy', 'card game', 'board game', 'music', 'educational', 'tool', 'game engine', 'framework', 'library')
+
+
+def entry_iterator(games_path):
+ """
+
+ """
+
+ # get all entries (ignore everything starting with underscore)
+ entries = os.listdir(games_path)
+ entries = (x for x in entries if not x.startswith('_'))
+
+ # iterate over all entries
+ for entry in entries:
+ entry_path = os.path.join(games_path, entry)
+
+ # read entry
+ content = read_text(entry_path)
+
+ # yield
+ yield entry, entry_path, content
+
+
+def parse_entry(content):
+ """
+ Returns a dictionary of the features of the content
+ """
+
+ info = {}
+
+ # read name
+ regex = re.compile(r"^# (.*)") # start of content, starting with "# " and then everything until the end of line
+ matches = regex.findall(content)
+ if len(matches) != 1 or not matches[0]:
+ raise RuntimeError('Name not found in entry "{}"'.format(content))
+ info['name'] = matches[0]
+
+ # read description
+ regex = re.compile(r"^.*\n\n_(.*)_\n") # third line from top, everything between underscores
+ matches = regex.findall(content)
+ if len(matches) != 1 or not matches[0]:
+ raise RuntimeError('Description not found in entry "{}"'.format(content))
+ info['description'] = matches[0]
+
+ # first read all field names
+ regex = re.compile(r"^- (.*?): ", re.MULTILINE) # start of each line having "- ", then everything until a colon, then ": "
+ fields = regex.findall(content)
+
+ # check that essential fields are there
+ for field in essential_fields:
+ if field not in fields:
+ raise RuntimeError('Essential field "{}" missing in entry "{}"'.format(field, info['name']))
+
+ # check that all fields are valid fields and are existing in that order
+ index = 0
+ for field in fields:
+ while index < len(valid_fields) and field != valid_fields[index]:
+ index += 1
+ if index == len(valid_fields):
+ raise RuntimeError('Field "{}" in entry "{}" either misspelled or in wrong order'.format(field, info['name']))
+
+ # iterate over found fields
+ for field in fields:
+ regex = re.compile(r"- {}: (.*)".format(field))
+ matches = regex.findall(content)
+ if len(matches) != 1:
+ # every field should only be present once
+ raise RuntimeError('Field "{}" in entry "{}" exist multiple times.'.format(field, info['name']))
+ v = matches[0]
+
+ # first store as is
+ info[field.lower()+'-raw'] = v
+
+ # remove parenthesis with content
+ v = re.sub(r'\([^)]*\)', '', v)
+
+ # split on ','
+ v = v.split(',')
+
+ # strip
+ v = [x.strip() for x in v]
+
+ # remove all being false (empty) that were for example just comments
+ v = [x for x in v if x]
+
+ # if entry is of structure <..> remove <>
+ v = [x[1:-1] if x[0] is '<' and x[-1] is '>' else x for x in v]
+
+ # empty fields will not be stored
+ if not v:
+ continue
+
+ # store in info
+ info[field.lower()] = v
+
+ # now checks on the content of fields
+
+ # name should not have spaces at the begin or end
+ v = info['name']
+ if len(v) != len(v.strip()):
+ raise RuntimeError('No leading or trailing spaces in the entry name, "{}"'.format(info['name']))
+
+ # state (essential field) must contain either beta or mature but not both, but at least one
+ v = info['state']
+ for t in v:
+ if t != 'beta' and t != 'mature' and not t.startswith('inactive since '):
+ raise RuntimeError('Unknown state tage "{}" in entry "{}"'.format(t, info['name']))
+ if 'beta' in v != 'mature' in v:
+ raise RuntimeError('State must be one of <"beta", "mature"> in entry "{}"'.format(info['name']))
+
+ # extract inactive year
+ phrase = 'inactive since '
+ inactive_year = [x[len(phrase):] for x in v if x.startswith(phrase)]
+ assert len(inactive_year) <= 1
+ if inactive_year:
+ info['inactive'] = inactive_year[0]
+
+ # urls in home, download, play and code repositories must start with http or https (or git) and should not contain spaces
+ for field in ['home', 'download', 'play', 'code repository']:
+ if field in info:
+ for url in info[field]:
+ if not (url.startswith('http://') or url.startswith('https://') or url.startswith('git://')):
+ raise RuntimeError('URL "{}" in entry "{}" does not start with http'.format(url, info['name']))
+ if ' ' in url:
+ raise RuntimeError('URL "{}" in entry "{}" contains a space'.format(url, info['name']))
+
+ # github repositories should end on .git
+ if 'code repository' in info:
+ for repo in info['code repository']:
+ if repo.startswith('https://github.com/') and not repo.endswith('.git'):
+ raise RuntimeError('Github repo {} in entry "{}" should end on .git.'.format(repo, info['name']))
+
+ # check that all platform tags are valid tags and are existing in that order
+ if 'platform' in info:
+ index = 0
+ for platform in info['platform']:
+ while index < len(valid_platforms) and platform != valid_platforms[index]:
+ index += 1
+ if index == len(valid_platforms):
+ raise RuntimeError('Platform tag "{}" in entry "{}" either misspelled or in wrong order'.format(platform, info['name']))
+
+ # there must be at least one keyword
+ if 'keywords' not in info:
+ raise RuntimeError('Need at least one keyword in entry "{}"'.format(info['name']))
+
+ # check for existence of at least one recommended keywords
+ fail = True
+ for recommended_keyword in recommended_keywords:
+ if recommended_keyword in info['keywords']:
+ fail = False
+ break
+ if fail:
+ raise RuntimeError('Entry "{}" contains no recommended keyword'.format(info['name']))
+
+ return info
+
+
+def assemble_infos(games_path):
+ """
+ Parses all entries and assembles interesting infos about them.
+ """
+
+ print('assemble game infos')
+
+ # a database of all important infos about the entries
+ infos = []
+
+ # iterate over all entries
+ for entry, _, content in entry_iterator(games_path):
+
+ # parse entry
+ info = parse_entry(content)
+
+ # add file information
+ info['file'] = entry
+
+ # add to list
+ infos.append(info)
+
+ return infos
\ No newline at end of file
diff --git a/tools/utils/utils.py b/tools/utils/utils.py
index ffd5ed5a..9d08c0ed 100644
--- a/tools/utils/utils.py
+++ b/tools/utils/utils.py
@@ -1,5 +1,5 @@
"""
-Utilities for the tools.
+Utilities for the tools. Only depending on standard Python or third party modules.
"""
import os