updates (names, licenses, ...) and started script on synchronization with osgameclones
This commit is contained in:
@ -270,7 +270,7 @@
|
||||
"",
|
||||
"mature / inactive since 1987",
|
||||
"action, artillery",
|
||||
"<a href=\"https://gitlab.com/osgames/ballerburg.git\">Source</a> - C - Public Domain"
|
||||
"<a href=\"https://gitlab.com/osgames/ballerburg.git\">Source</a> - C - Public domain"
|
||||
],
|
||||
[
|
||||
"Battle for Wesnoth (<a href=\"http://www.wesnoth.org/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/battle_for_wesnoth.md\">entry</a>)",
|
||||
@ -372,7 +372,7 @@
|
||||
"Blobwars: Metal Blob Solid (<a href=\"https://sourceforge.net/projects/blobwars/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/blobwars_metal_solid_blob.md\">entry</a>)",
|
||||
"2D arcade platform game.",
|
||||
"<a href=\"https://sourceforge.net/projects/blobwars/files/\">Link</a>",
|
||||
"mature / inactive since 2015",
|
||||
"mature / active",
|
||||
"action",
|
||||
"<a href=\"https://git.code.sf.net/p/blobwars/code\">Source</a> - C++ - GPL-2.0"
|
||||
],
|
||||
@ -486,7 +486,7 @@
|
||||
"<a href=\"http://www.c-evo.org/files/files.php\">Link</a>",
|
||||
"mature / inactive since 2013",
|
||||
"strategy, turn-based",
|
||||
"<a href=\"https://github.com/vn971/cevo.git\">Source</a> - Pascal - Public Domain"
|
||||
"<a href=\"https://github.com/vn971/cevo.git\">Source</a> - Pascal - Public domain"
|
||||
],
|
||||
[
|
||||
"Cabbages and Kings (<a href=\"https://github.com/Mekire/cabbages-and-kings\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/cabbages_and_kings.md\">entry</a>)",
|
||||
@ -1188,7 +1188,7 @@
|
||||
"Fish Fillets - Next Generation (<a href=\"http://fillets.sourceforge.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/fish_fillets_ng.md\">entry</a>)",
|
||||
"Port of the wonderful puzzle game Fish Fillets from ALTAR..",
|
||||
"<a href=\"http://fillets.sourceforge.net/download.php\">Link</a>",
|
||||
"mature / inactive since 2014",
|
||||
"mature / active",
|
||||
"puzzle, port",
|
||||
"<a href=\"https://git.code.sf.net/p/fillets/code-fillets-ng\">Source</a> - C++ - GPL-2.0"
|
||||
],
|
||||
@ -2245,8 +2245,8 @@
|
||||
"Major League Baseball Simulation.",
|
||||
"<a href=\"https://sourceforge.net/projects/nsbb/files/\">Link</a>",
|
||||
"mature / active",
|
||||
"sports, simulation",
|
||||
"<a href=\"http://nsbb.cvs.sourceforge.net\">Source</a> - C - ?"
|
||||
"sports, non-free-content, simulation",
|
||||
"<a href=\"http://nsbb.cvs.sourceforge.net\">Source</a> - C - Public domain"
|
||||
],
|
||||
[
|
||||
"Neverball (<a href=\"https://neverball.org/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/neverball.md\">entry</a>)",
|
||||
@ -3110,7 +3110,7 @@
|
||||
"",
|
||||
"mature / active",
|
||||
"adventure",
|
||||
"<a href=\"https://github.com/blakeohare/pyweek-sentientstorage.git\">Source</a> - Python - Public Domain"
|
||||
"<a href=\"https://github.com/blakeohare/pyweek-sentientstorage.git\">Source</a> - Python - Public domain"
|
||||
],
|
||||
[
|
||||
"Settlers III remake (<a href=\"https://github.com/jsettlers/settlers-remake\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/settlers_iii_remake.md\">entry</a>)",
|
||||
@ -3505,12 +3505,12 @@
|
||||
"<a href=\"https://github.com/Lisergishnu/TetraVex.git\">Source</a> - Swift - GPL-3.0"
|
||||
],
|
||||
[
|
||||
"The Bub's Brothers (<a href=\"http://bub-n-bros.sourceforge.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/the_bubs_brothers.md\">entry</a>)",
|
||||
"The Bub's Brothers (<a href=\"https://bitbucket.org/arigo/bub-n-bros/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/the_bubs_brothers.md\">entry</a>)",
|
||||
"Networked clone of the classical Bubble Bobble board game.",
|
||||
"<a href=\"http://bub-n-bros.sourceforge.net/download.html\">Link</a>",
|
||||
"mature / inactive since 2013",
|
||||
"board game",
|
||||
"<a href=\"https://gitlab.com/osgames/the-bubs-brothers.git\">Source</a> - Python - MIT"
|
||||
"<a href=\"https://bitbucket.org/arigo/bub-n-bros\">Source</a> - Python - MIT"
|
||||
],
|
||||
[
|
||||
"The Butterfly Effect (<a href=\"http://the-butterfly-effect.org/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/the_butterfly_effect.md\">entry</a>)",
|
||||
@ -4086,7 +4086,7 @@
|
||||
"<a href=\"http://ysoccer.sourceforge.net/dloads.htm\">Link</a>",
|
||||
"mature / active",
|
||||
"sports, simulation, soccer",
|
||||
"<a href=\"https://git.code.sf.net/p/ysoccer/code\">Source</a> - Java - ?"
|
||||
"<a href=\"https://git.code.sf.net/p/ysoccer/code\">Source</a> - Java - GPL-2.0"
|
||||
],
|
||||
[
|
||||
"ZAngband (<a href=\"http://www.zangband.org/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/games/zangband.md\">entry</a>)",
|
||||
|
@ -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)
|
||||
|
@ -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)
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
- **[YSoccer](ysoccer.md)** (Java, GPL-2.0, mature)
|
@ -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)
|
||||
- **[YSoccer](ysoccer.md)** (Java, GPL-2.0, mature)
|
@ -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)
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Astromenace
|
||||
# AstroMenace
|
||||
|
||||
_3D space scroll-shooter with spaceship upgrade possibilities._
|
||||
|
||||
|
@ -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
|
||||
|
@ -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/)
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Caesar IA
|
||||
# CaesarIA
|
||||
|
||||
_Remake of the popular citybuilder/economic strategy - Caesar III, videogame by Empressions Games._
|
||||
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Free Orion
|
||||
# FreeOrion
|
||||
|
||||
_Turn-based space empire and galactic conquest (4X) computer game._
|
||||
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Open Dune
|
||||
# OpenDUNE
|
||||
|
||||
_Re-creation of the popular game "Dune II"._
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Scorched 3D
|
||||
# Scorched3D
|
||||
|
||||
_Lively, fully destructible 3D landscapes in a turn-based artillery game._
|
||||
|
@ -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
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Secret Mario Chronicles
|
||||
# Secret Maryo Chronicles
|
||||
|
||||
_Jump and Run game like Super Mario World with an advanced Editor._
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SimuTrans
|
||||
# Simutrans
|
||||
|
||||
_A cross-platform simulation game in which the player strives to run a successful transport system._
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Slash'EM
|
||||
# SLASH'EM
|
||||
|
||||
_Variant of the roguelike game NetHack that offers extra features, monsters, and items._
|
||||
|
||||
|
@ -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._
|
||||
|
@ -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
|
||||
|
@ -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_
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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/).
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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 = ['{} (<a href="{}">home</a>, <a href="{}">entry</a>)'.format(info['title'], info['home'][0],
|
||||
entry = ['{} (<a href="{}">home</a>, <a href="{}">entry</a>)'.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)
|
||||
|
99
tools/synchronization_osgameclones.py
Normal file
99
tools/synchronization_osgameclones.py
Normal file
@ -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()
|
||||
|
||||
|
||||
|
||||
|
||||
|
191
tools/utils/osg.py
Normal file
191
tools/utils/osg.py
Normal file
@ -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
|
@ -1,5 +1,5 @@
|
||||
"""
|
||||
Utilities for the tools.
|
||||
Utilities for the tools. Only depending on standard Python or third party modules.
|
||||
"""
|
||||
|
||||
import os
|
||||
|
Reference in New Issue
Block a user