additions from backlog

This commit is contained in:
Trilarion 2019-10-04 15:18:09 +02:00
parent a4529af611
commit 99b3eb5e74
38 changed files with 459 additions and 194 deletions

View File

@ -3,11 +3,11 @@
**[Dynamic HTML table](https://trilarion.github.io/opensourcegames/)** of the entries / Development **[Blog](https://trilarion.blogspot.com/search/label/osgames)** / **[Statistics](statistics.md#statistics)**
[comment]: # (start of autogenerated content, do not edit)
**[All entries](entries/tocs/_all.md#All)** (1079)
**[All entries](entries/tocs/_all.md#All)** (1088)
By category: **[Action](entries/tocs/_action.md#action)** (187), **[Adventure](entries/tocs/_adventure.md#adventure)** (34), **[Arcade](entries/tocs/_arcade.md#arcade)** (61), **[Board game](entries/tocs/_board-game.md#board-game)** (9), **[Card game](entries/tocs/_card-game.md#card-game)** (2), **[Educational](entries/tocs/_educational.md#educational)** (5), **[Framework](entries/tocs/_framework.md#framework)** (69), **[Game engine](entries/tocs/_game-engine.md#game-engine)** (91), **[Library](entries/tocs/_library.md#library)** (29), **[Music](entries/tocs/_music.md#music)** (10), **[Platform](entries/tocs/_platform.md#platform)** (33), **[Puzzle](entries/tocs/_puzzle.md#puzzle)** (84), **[Remake](entries/tocs/_remake.md#remake)** (462), **[Role playing](entries/tocs/_role-playing.md#role-playing)** (151), **[Simulation](entries/tocs/_simulation.md#simulation)** (78), **[Sports](entries/tocs/_sports.md#sports)** (19), **[Strategy](entries/tocs/_strategy.md#strategy)** (222), **[Tool](entries/tocs/_tool.md#tool)** (26), **[Visual novel](entries/tocs/_visual-novel.md#visual-novel)** (4)
By category: **[Action](entries/tocs/_action.md#action)** (188), **[Adventure](entries/tocs/_adventure.md#adventure)** (34), **[Arcade](entries/tocs/_arcade.md#arcade)** (62), **[Board game](entries/tocs/_board-game.md#board-game)** (9), **[Card game](entries/tocs/_card-game.md#card-game)** (2), **[Educational](entries/tocs/_educational.md#educational)** (5), **[Framework](entries/tocs/_framework.md#framework)** (71), **[Game engine](entries/tocs/_game-engine.md#game-engine)** (92), **[Library](entries/tocs/_library.md#library)** (32), **[Music](entries/tocs/_music.md#music)** (10), **[Platform](entries/tocs/_platform.md#platform)** (33), **[Puzzle](entries/tocs/_puzzle.md#puzzle)** (84), **[Remake](entries/tocs/_remake.md#remake)** (462), **[Role playing](entries/tocs/_role-playing.md#role-playing)** (152), **[Simulation](entries/tocs/_simulation.md#simulation)** (78), **[Sports](entries/tocs/_sports.md#sports)** (19), **[Strategy](entries/tocs/_strategy.md#strategy)** (222), **[Tool](entries/tocs/_tool.md#tool)** (29), **[Visual novel](entries/tocs/_visual-novel.md#visual-novel)** (4)
By platform: **[Windows](entries/tocs/_windows.md#windows)** (290), **[Linux](entries/tocs/_linux.md#linux)** (267), **[macOS](entries/tocs/_macos.md#macos)** (159), **[Android](entries/tocs/_android.md#android)** (54), **[iOS](entries/tocs/_ios.md#ios)** (9), **[Web](entries/tocs/_web.md#web)** (56)
By platform: **[Windows](entries/tocs/_windows.md#windows)** (299), **[Linux](entries/tocs/_linux.md#linux)** (274), **[macOS](entries/tocs/_macos.md#macos)** (164), **[Android](entries/tocs/_android.md#android)** (56), **[iOS](entries/tocs/_ios.md#ios)** (10), **[Web](entries/tocs/_web.md#web)** (57)
[comment]: # (end of autogenerated content)

View File

@ -384,6 +384,14 @@
"arcade",
"<a href=\"https://github.com/yiotro/Antiyoy.git\">Source</a> - Java - GPL-3.0"
],
[
"Anura (<a href=\"https://github.com/anura-engine/anura\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/anura.md\">entry</a>)",
"Engine for Frogatto and Friends.",
"",
"mature / active",
"arcade, game engine",
"<a href=\"https://github.com/anura-engine/anura.git\">Source</a> - C, C++ - zlib"
],
[
"Apricots (<a href=\"https://web.archive.org/web/20110819212117/http://www.fishies.org.uk/apricots.html\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/apricots.md\">entry</a>)",
"Fly an airplane, fire missiles, drop bombs, destroy enemy..",
@ -1544,6 +1552,14 @@
"role playing, massive multiplayer online",
"<a href=\"https://svn.code.sf.net/p/crossfire/code/\">Source</a> - C, Java - GPL-2.0"
],
[
"CrossUO (<a href=\"https://crossuo.com/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/crossuo.md\">entry</a>)",
"Ultima Online client.",
"",
"mature / active",
"role playing, requires online access",
"<a href=\"https://github.com/crossuo/crossuo.git\">Source</a> - C, C++ - GPL-3.0"
],
[
"Crown (<a href=\"https://github.com/dbartolini/crown\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/crown.md\">entry</a>)",
"Data-driven game engine.",
@ -1718,7 +1734,7 @@
"",
"mature / inactive since 2002",
"remake, inspired by 3D Deathchase, shooter",
"<a href=\"https://web.archive.org/web/20070711231311/http://www.robsons.org.uk/archive/www.autismuk.freeserve.co.uk/deathchase3d-0.9.tar.gz\">Source</a> - C - GPL-2.0"
"<a href=\"https://gitlab.com/osgames/deathchase3d.git\">Source</a> - C, Perl - GPL-2.0"
],
[
"Decker (<a href=\"https://web.archive.org/web/20110926115405/http://www10.caro.net:80/dsi/decker/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/decker.md\">entry</a>)",
@ -2544,6 +2560,14 @@
"framework",
"<a href=\"https://github.com/AdamAtomic/flixel.git\">Source</a> - ActionScript - MIT"
],
[
"flixel-gdx (<a href=\"https://web.archive.org/web/20190623151758/http://flixel-gdx.com/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/flixel-gdx.md\">entry</a>)",
"2D game engine in Java based on Flixel.",
"",
"beta / inactive since 2017",
"framework, 2D",
"<a href=\"https://github.com/flixel-gdx/flixel-gdx.git\">Source</a> - Java - 3-clause BSD"
],
[
"Fluid Table Tennis (<a href=\"https://github.com/anirudhjoshi/fluid_table_tennis\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/fluid_table_tennis.md\">entry</a>)",
"Remake of Plasma Pong.",
@ -4448,6 +4472,14 @@
"action, shooter",
"<a href=\"https://gitlab.com/osgames/microwar.git\">Source</a> - Python - 3-clause BSD"
],
[
"Mindustry (<a href=\"https://mindustrygame.github.io/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/mindustry.md\">entry</a>)",
"Sandbox tower defense game.",
"<a href=\"https://play.google.com/store/apps/details?id=io.anuke.mindustry\">Link</a>",
"mature / active",
"action, sandbox, tower defense",
"<a href=\"https://github.com/Anuken/Mindustry.git\">Source</a> - Java - GPL-3.0"
],
[
"MineCraft-One-Week-Challenge (<a href=\"https://github.com/Hopson97/MineCraft-One-Week-Challenge\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/minecraft-one-week-challenge.md\">entry</a>)",
"Clone of Minecraft.",
@ -5848,6 +5880,14 @@
"strategy",
"<a href=\"https://gitlab.com/osgames/planets.git\">Source</a> - Java - GPL-2.0"
],
[
"PLIB (<a href=\"http://plib.sourceforge.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/plib.md\">entry</a>)",
"Game framework.",
"<a href=\"http://plib.sourceforge.net/download.html\">Link</a>",
"mature / inactive since 2012",
"framework, library",
"<a href=\"https://svn.code.sf.net/p/plib/code/\">Source</a> - C++ - LGPL-2.0"
],
[
"PokerTH (<a href=\"https://www.pokerth.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/pokerth.md\">entry</a>)",
"Texas Hold'em poker game playable against up to nine..",
@ -5968,6 +6008,14 @@
"puzzle, clone, inspired by Minesweeper",
"<a href=\"https://github.com/GoogleChromeLabs/proxx.git\">Source</a> - TypeScript, JavaScript - Apache-2.0"
],
[
"Psyco (<a href=\"http://psyco.sourceforge.net/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/psyco.md\">entry</a>)",
"Python specializing compiler.",
"<a href=\"http://psyco.sourceforge.net/download.html\">Link</a>",
"mature / inactive since 2008",
"tool",
"C - MIT"
],
[
"Pthreads-win32 (<a href=\"https://sourceware.org/pthreads-win32/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/pthreads-win32.md\">entry</a>)",
"Implements a large subset of the POSIX standard threads..",
@ -6040,6 +6088,14 @@
"framework",
"<a href=\"https://github.com/marcusmoller/pyorpg-client.git\">Source</a> - Python - MIT"
],
[
"pyscroll (<a href=\"https://pypi.org/project/pyscroll/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/pyscroll.md\">entry</a>)",
"Animated scrolling maps in pygame library.",
"",
"mature / inactive since 2018",
"library",
"<a href=\"https://github.com/bitcraft/pyscroll.git\">Source</a> - Python - LGPL-3.0"
],
[
"pyskool (<a href=\"http://pyskool.ca/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/pyskool.md\">entry</a>)",
"Remake of Skool Daze.",
@ -6056,6 +6112,14 @@
"strategy, cards",
"Python - GPL-2.0"
],
[
"PyTMX (<a href=\"https://pypi.org/project/PyTMX/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/pytmx.md\">entry</a>)",
"Read Tiled Map Editor's TMX maps.",
"",
"mature / active",
"tool, library",
"<a href=\"https://github.com/bitcraft/PyTMX.git\">Source</a> - Python - LGPL-3.0"
],
[
"Q-Gears (<a href=\"https://github.com/q-gears/q-gears\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/q-gears.md\">entry</a>)",
"Remake of Final Fantasy VII.",
@ -6224,6 +6288,14 @@
"action, inspired by Rescue!, real time, remake, space, strategy",
"<a href=\"https://gitlab.com/osgames/rescue.git\">Source</a> - Java - GPL-3.0"
],
[
"ReShade (<a href=\"https://reshade.me/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/reshade.md\">entry</a>)",
"Post-processing graphics injector.",
"<a href=\"https://reshade.me/releases\">Link</a>",
"mature / active",
"tool",
"<a href=\"https://github.com/crosire/reshade.git\">Source</a> - C++ - 3-clause BSD"
],
[
"ResidualVM (<a href=\"http://residualvm.org/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/residualvm.md\">entry</a>)",
"Remake of Grim Fandango, Escape from Monkey Island, Myst..",
@ -6789,8 +6861,8 @@
"Remake of Solar Fox.",
"<a href=\"https://www.pygame.org/shredwheat/solarwolf/index.shtml#download\">Link</a>",
"mature / inactive since 2004",
"action, arcade, inspired by Solar Fox, remake",
"<a href=\"http://pygame.org/shredwheat/solarwolf/solarwolf-1.5.tar.gz\">Source</a> - Python - LGPL-2.1"
"action, arcade, inspired by Solar Fox, open content, remake",
"<a href=\"https://gitlab.com/osgames/solarwolf.git\">Source</a> - Python - LGPL-2.1"
],
[
"Song of Albion (<a href=\"https://code.google.com/archive/p/songofalbion/\">home</a>, <a href=\"https://github.com/Trilarion/opensourcegames/blob/master/entries/song_of_albion.md\">entry</a>)",

14
entries/anura.md Normal file
View File

@ -0,0 +1,14 @@
# Anura
_Engine for Frogatto and Friends._
- Home: https://github.com/anura-engine/anura
- State: mature
- Platform: Windows
- Keywords: arcade, game engine
- Code repository: https://github.com/anura-engine/anura.git
- Code language: C, C++
- Code license: zlib (src folder)
## Building

18
entries/crossuo.md Normal file
View File

@ -0,0 +1,18 @@
# CrossUO
_ Ultima Online client._
- Home: https://crossuo.com/
- Media: https://en.wikipedia.org/wiki/Ultima_Online
- State: mature
- Platform: Windows, Linux, macOS
- Keywords: role playing, requires online access
- Code repository: https://github.com/crossuo/crossuo.git
- Code language: C, C++
- Code license: GPL-3.0
Fork of OrionUO
## Building
- Build system: CMake

View File

@ -5,8 +5,9 @@ _Remake of 3D Deathchase._
- Home: https://web.archive.org/web/20070711231311/http://www.robsons.org.uk/archive/www.autismuk.freeserve.co.uk/index.htm
- State: mature, inactive since 2002
- Keywords: remake, inspired by 3D Deathchase, shooter
- Code repository: https://web.archive.org/web/20070711231311/http://www.robsons.org.uk/archive/www.autismuk.freeserve.co.uk/deathchase3d-0.9.tar.gz
- Code language: C
- Code repository: https://gitlab.com/osgames/deathchase3d.git (import of source release at https://web.archive.org/web/20070711231311/http://www.robsons.org.uk/archive/www.autismuk.freeserve.co.uk/deathchase3d-0.9.tar.gz)
- Code language: C, Perl
- Code license: GPL-2.0
- Code dependencies: SDL
## Building

14
entries/flixel-gdx.md Normal file
View File

@ -0,0 +1,14 @@
# flixel-gdx
_2D game engine in Java based on Flixel._
- Home: https://web.archive.org/web/20190623151758/http://flixel-gdx.com/
- State: beta, inactive since 2017
- Platform: Windows, Linux, macOS, Android, iOS, Web
- Keywords: framework, 2D
- Code repository: https://github.com/flixel-gdx/flixel-gdx.git
- Code language: Java
- Code license: 3-clause BSD
- Code dependencies: libGDX
## Building

View File

@ -11,4 +11,6 @@ _Remake of Jump 'n Bump._
- Code license: GPL-2.0
- Code dependencies: SDL
See also https://gitlab.com/LibreGames/jumpnbump (same game?)
## Building

17
entries/mindustry.md Normal file
View File

@ -0,0 +1,17 @@
# Mindustry
_Sandbox tower defense game._
- Home: https://mindustrygame.github.io/
- State: mature
- Download: https://play.google.com/store/apps/details?id=io.anuke.mindustry, https://f-droid.org/packages/io.anuke.mindustry/, https://anuke.itch.io/mindustry
- Platform: Windows, Linux, Android
- Keywords: action, sandbox, tower defense
- Code repository: https://github.com/Anuken/Mindustry.git
- Code language: Java
- Code license: GPL-3.0
- Code dependencies: libGDX
## Building
- Build system: Gradle

16
entries/plib.md Normal file
View File

@ -0,0 +1,16 @@
# PLIB
_Game framework._
- Home: http://plib.sourceforge.net/, https://sourceforge.net/projects/plib/
- State: mature, inactive since 2012
- Download: http://plib.sourceforge.net/download.html
- Platform: Windows, Linux, macOS
- Keywords: framework, library
- Code repository: https://svn.code.sf.net/p/plib/code/ (svn)
- Code language: C++
- Code license: LGPL-2.0
## Building
- Build system: Autoconf

View File

@ -10,4 +10,6 @@ _Remake of Quake._
- Code language: C
- Code license: GPL-2.0
See also: http://quakeone.com/markv/
## Building

16
entries/psyco.md Normal file
View File

@ -0,0 +1,16 @@
# Psyco
_Python specializing compiler._
- Home: http://psyco.sourceforge.net/, https://sourceforge.net/projects/psyco/
- State: mature, inactive since 2008
- Download: http://psyco.sourceforge.net/download.html
- Platform: Windows, Linux
- Keywords: tool
- Code repository: (see download)
- Code language: C
- Code license: MIT
Unmaintained, refers to pypy.org
## Building

15
entries/pyscroll.md Normal file
View File

@ -0,0 +1,15 @@
# pyscroll
_Animated scrolling maps in pygame library._
- Home: https://pypi.org/project/pyscroll/
- State: mature, inactive since 2018
- Platform: Windows, Linux, macOS (all that pygame supports)
- Keywords: library
- Code repository: https://github.com/bitcraft/pyscroll.git
- Code language: Python
- Code license: LGPL-3.0
- Code dependencies: pygame
## Building

13
entries/pytmx.md Normal file
View File

@ -0,0 +1,13 @@
# PyTMX
_Read Tiled Map Editor's TMX maps._
- Home: https://pypi.org/project/PyTMX/
- State: mature
- Platform: Windows, Linux, macOS (all supported by pygame)
- Keywords: tool, library
- Code repository: https://github.com/bitcraft/PyTMX.git
- Code language: Python
- Code license: LGPL-3.0
## Building

17
entries/reshade.md Normal file
View File

@ -0,0 +1,17 @@
# ReShade
_Post-processing graphics injector._
- Home: https://reshade.me/
- State: mature
- Download: https://reshade.me/releases
- Platform: Windows
- Keywords: tool
- Code repository: https://github.com/crosire/reshade.git
- Code language: C++
- Code license: 3-clause BSD
## Building
- Build system: VisualStudio

View File

@ -6,10 +6,14 @@ _Remake of Solar Fox._
- State: mature, inactive since 2004
- Download: https://www.pygame.org/shredwheat/solarwolf/index.shtml#download
- Platform: Windows, Linux, macOS
- Keywords: action, arcade, inspired by Solar Fox, remake
- Code repository: http://pygame.org/shredwheat/solarwolf/solarwolf-1.5.tar.gz
- Keywords: action, arcade, inspired by Solar Fox, open content, remake
- Code repository: https://gitlab.com/osgames/solarwolf.git (import of source releases)
- Code language: Python
- Code license: LGPL-2.1
- Code dependencies: pygame
Developer: Pete Shinners, Eero Tamminen
## Building
- Build system: Make

View File

@ -111,6 +111,7 @@
- **[Mega Mario](../mega_mario.md)** (C++, LGPL-2.1, mature, inactive since 2012)
- **[Memory Game](../memory_game.md)** (Java, Apache-2.0, mature)
- **[MicroWar 2.0](../microwar_20.md)** (Python, 3-clause BSD, mature, inactive since 2009)
- **[Mindustry](../mindustry.md)** (Java, GPL-3.0, mature)
- **[Mininim](../mininim.md)** (C, GPL-3.0, beta, inactive since 2017)
- **[mk.js](../mkjs.md)** (JavaScript, MIT, beta)
- **[Mr.Boom](../mrboom.md)** (C++, MIT, mature)

View File

@ -48,6 +48,7 @@
- **[Antares](../antares.md)** (C++, LGPL-3.0, beta)
- **[AntiChess](../antichess.md)** (Java, MIT, mature, inactive since 2003)
- **[antiyoy](../antiyoy.md)** (Java, GPL-3.0, beta)
- **[Anura](../anura.md)** (C, C++, zlib, mature)
- **[Apricots](../apricots.md)** (C++, GPL-2.0, beta, inactive since 2003)
- **[aquastax](../aquastax.md)** (JavaScript, MIT, beta)
- **[Arashi-JS](../arashi-js.md)** (JavaScript, GPL-2.0, beta, inactive since 2010)
@ -193,6 +194,7 @@
- **[CrappyBird](../crappybird.md)** (JavaScript, MIT, mature, inactive since 2017)
- **[Crimson Fields](../crimson_fields.md)** (C++, GPL-2.0, mature, inactive since 2010)
- **[Crossfire](../crossfire.md)** (C, Java, GPL-2.0, mature)
- **[CrossUO](../crossuo.md)** (C, C++, GPL-3.0, mature)
- **[Crown and Cutlass](../crown_and_cutlass.md)** (C++, Custom, beta, inactive since 2009)
- **[Crown](../crown.md)** (C, C++, Vala, MIT, beta)
- **[Crypto++](../crypto.md)** (C++, Boost-1.0, mature)
@ -214,7 +216,7 @@
- **[Dave Gnukem](../dave_gnukem.md)** (C++, GPL-2.0, mature)
- **[Dawn](../dawn.md)** (C++, GPL-3.0, beta, inactive since 2011)
- **[Dear ImGui](../dear_imgui.md)** (C, C++, MIT, mature)
- **[Deathchase 3D](../deathchase_3d.md)** (C, GPL-2.0, mature, inactive since 2002)
- **[Deathchase 3D](../deathchase_3d.md)** (C, Perl, GPL-2.0, mature, inactive since 2002)
- **[Decker](../decker.md)** (Java, GPL-2.0, beta, inactive since 2013)
- **[Dedalus](../dedalus.md)** (JavaScript, GPL-2.0, beta, inactive since 2018)
- **[Defendguin](../defendguin.md)** (C, GPL-2.0, mature, inactive since 2009)
@ -317,6 +319,7 @@
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
- **[Flex Engine](../flex_engine.md)** (C++, MIT, beta)
- **[FlightGear](../flightgear.md)** (C++, GPL-2.0, mature)
- **[flixel-gdx](../flixel-gdx.md)** (Java, 3-clause BSD, beta, inactive since 2017)
- **[Flixel](../flixel.md)** (ActionScript, MIT, mature)
- **[Fluid Table Tennis](../fluid_table_tennis.md)** (JavaScript, MIT, mature, inactive since 2013)
- **[fonline](../fonline.md)** (C, C++, GPL-3.0, beta)
@ -556,6 +559,7 @@
- **[micropolisJS](../micropolisjs.md)** (JavaScript, GPL-3.0, mature)
- **[Microracers](../microracers.md)** (C, C++, GPL-2.0, beta, inactive since 2005)
- **[MicroWar 2.0](../microwar_20.md)** (Python, 3-clause BSD, mature, inactive since 2009)
- **[Mindustry](../mindustry.md)** (Java, GPL-3.0, mature)
- **[MineCraft-One-Week-Challenge](../minecraft-one-week-challenge.md)** (C++, MIT, beta)
- **[Minesweeper (in C)](../minesweeper_in_c.md)** (C, 3-clause BSD, beta, inactive since 2015)
- **[Minesweeper.Zone](../minesweeperzone.md)** (JavaScript, PHP, MIT, mature)
@ -731,6 +735,7 @@
- **[pkg-config](../pkg-config.md)** (C, GPL-2.0, mature)
- **[PlaneShift](../planeshift.md)** (C++, GPL-2.0, mature)
- **[Planetary Hoppers](../planetary_hoppers.md)** (Java, GPL-2.0, beta, inactive since 2003)
- **[PLIB](../plib.md)** (C++, LGPL-2.0, mature, inactive since 2012)
- **[PokerTH](../pokerth.md)** (C++, AGPL-3.0, mature, inactive since 2017)
- **[Polis](../polis.md)** (Java, GPL-3.0, mature, inactive since 2016)
- **[Polycode](../polycode.md)** (C, C++, MIT, beta)
@ -746,6 +751,7 @@
- **[Project Helena](../project_helena.md)** (Pascal, GPL-3.0, beta)
- **[ProQuake 4](../proquake_4.md)** (C, GPL-2.0, mature, inactive since 2018)
- **[proxx](../proxx.md)** (TypeScript, JavaScript, Apache-2.0, mature)
- **[Psyco](../psyco.md)** (C, MIT, mature, inactive since 2008)
- **[Pthreads-win32](../pthreads-win32.md)** (C, LGPL-2.1, mature)
- **[Pushover](../pushover.md)** (C++, C, Lua, GPL-3.0, beta, inactive since 2018)
- **[PyBreak360](../pybreak360.md)** (Python, GPL-3.0, mature, inactive since 2015)
@ -755,8 +761,10 @@
- **[PyKaraoke](../pykaraoke.md)** (Python, LGPL-2.1, beta, inactive since 2011)
- **[Pymapper](../pymapper.md)** (Python, GPL-3.0, mature)
- **[pyORPG](../pyorpg.md)** (Python, MIT, beta, inactive since 2015)
- **[pyscroll](../pyscroll.md)** (Python, LGPL-3.0, mature, inactive since 2018)
- **[pyskool](../pyskool.md)** (Python, GPL-3.0, mature)
- **[PySol](../pysol.md)** (Python, GPL-2.0, mature, inactive since 2004)
- **[PyTMX](../pytmx.md)** (Python, LGPL-3.0, mature)
- **[Q-Gears](../q-gears.md)** (C, C++, GPL-2.0, beta, inactive since 2015)
- **[Qt](../qt.md)** (C++, LGPL-3.0, mature)
- **[Quad-engine](../quad-engine.md)** (Pascal, MIT, beta)
@ -778,6 +786,7 @@
- **[Remixed Dungeon](../remixed_dungeon.md)** (Java, GPL-3.0, mature)
- **[ReQbert](../reqbert.md)** (JavaScript, GPL-3.0, beta)
- **[Rescue! Max](../rescue_max.md)** (Java, GPL-3.0, beta, inactive since 2013)
- **[ReShade](../reshade.md)** (C++, 3-clause BSD, mature)
- **[ResidualVM](../residualvm.md)** (C++, GPL-2.0, beta)
- **[Return of Dr. Destructo](../return_of_dr_destructo.md)** (C++, MIT, mature, inactive since 2015)
- **[Return to the Roots](../return_to_the_roots.md)** (C++, GPL-3.0, mature)

View File

@ -17,6 +17,7 @@
- **[Esenthel Engine](../esenthel_engine.md)** (C, C++, Custom, beta)
- **[EternalWinterWars](../eternalwinterwars.md)** (Java, MIT, beta, inactive since 2014)
- **[Flappy Cow](../flappy_cow.md)** (Java, MIT, mature)
- **[flixel-gdx](../flixel-gdx.md)** (Java, 3-clause BSD, beta, inactive since 2017)
- **[FreeBlocks](../freeblocks.md)** (C, Java, GPL-3.0, beta, inactive since 2015)
- **[GL4ES](../gl4es.md)** (C, MIT, mature)
- **[Golly](../golly.md)** (C++, Java, GPL-2.0, mature)
@ -32,6 +33,7 @@
- **[LÖVE](../love.md)** (C++, zlib, mature)
- **[Memory Game](../memory_game.md)** (Java, Apache-2.0, mature)
- **[Mercenary Commander](../mercenary_commander.md)** (Java, 3-clause BSD, beta, inactive since 2010)
- **[Mindustry](../mindustry.md)** (Java, GPL-3.0, mature)
- **[Minetest](../minetest.md)** (C, C++, Lua, LGPL-2.1, mature)
- **[Morpheus Web Remake](../morpheus_web_remake.md)** (Javascript, MIT, beta)
- **[NOVA PINBALL](../nova_pinball.md)** (Lua, GPL-3.0, beta, inactive since 2017)

View File

@ -6,6 +6,7 @@
- **[Airstrike](../airstrike.md)** (C, GPL-2.0, beta, inactive since 2014)
- **[Aisleriot](../aisleriot.md)** (C, Scheme, GPL-3.0, mature)
- **[antiyoy](../antiyoy.md)** (Java, GPL-3.0, beta)
- **[Anura](../anura.md)** (C, C++, zlib, mature)
- **[Apricots](../apricots.md)** (C++, GPL-2.0, beta, inactive since 2003)
- **[Batalla Naval](../batalla_naval.md)** (C, GPL-2.0, mature, inactive since 2002)
- **[Battery](../battery.md)** (Java, EPL-2.0, Custom, mature, inactive since 2009)

View File

@ -17,6 +17,7 @@
- **[F.LF](../flf.md)** (JavaScript, ?, mature)
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
- **[Flex Engine](../flex_engine.md)** (C++, MIT, beta)
- **[flixel-gdx](../flixel-gdx.md)** (Java, 3-clause BSD, beta, inactive since 2017)
- **[Flixel](../flixel.md)** (ActionScript, MIT, mature)
- **[GemRB](../gemrb.md)** (C++, Python, GPL-2.0, mature)
- **[Godot](../godot.md)** (C, C++, MIT, mature)
@ -46,6 +47,7 @@
- **[OpenRPG](../openrpg.md)** (Python, GPL-2.0, mature, inactive since 2013)
- **[Orx](../orx.md)** (C, zlib, mature)
- **[Panda 3D](../panda_3d.md)** (C++, C, 3-clause BSD, mature)
- **[PLIB](../plib.md)** (C++, LGPL-2.0, mature, inactive since 2012)
- **[Polycode](../polycode.md)** (C, C++, MIT, beta)
- **[pygame](../pygame.md)** (C, Python, LGPL-2.1, mature)
- **[pyORPG](../pyorpg.md)** (Python, MIT, beta, inactive since 2015)

View File

@ -3,6 +3,7 @@
- **[adventure engine](../adventure_engine.md)** (Lua, MIT, mature, inactive since 2013)
- **[Alimer](../alimer.md)** (C++, MIT, beta)
- **[Anura](../anura.md)** (C, C++, zlib, mature)
- **[Bacon2D](../bacon2d.md)** (C++, MIT, beta, inactive since 2018)
- **[Bladecoder Adventure Engine](../bladecoder_adventure_engine.md)** (Java, Apache-2.0, mature)
- **[Blitwizard](../blitwizard.md)** (C, C++, Lua, zlib, beta, inactive since 2015)

View File

@ -3,6 +3,7 @@
- **[DOOM-iOS](../doom-ios.md)** (C++, GPL-2.0, mature, inactive since 2012)
- **[Esenthel Engine](../esenthel_engine.md)** (C, C++, Custom, beta)
- **[flixel-gdx](../flixel-gdx.md)** (Java, 3-clause BSD, beta, inactive since 2017)
- **[Gorillas](../gorillas.md)** (Objective-C, JavaScript, Java Research License, mature, inactive since 2014)
- **[Hedgewars](../hedgewars.md)** (Lua, C, C++, Pascal, Haskell, GPL-2.0, mature)
- **[LÖVE](../love.md)** (C++, zlib, mature)

View File

@ -21,7 +21,10 @@
- **[OpenSSL](../openssl.md)** (C, Custom, mature)
- **[Penumbra](../penumbra.md)** (C#, MIT, mature)
- **[pkg-config](../pkg-config.md)** (C, GPL-2.0, mature)
- **[PLIB](../plib.md)** (C++, LGPL-2.0, mature, inactive since 2012)
- **[Pthreads-win32](../pthreads-win32.md)** (C, LGPL-2.1, mature)
- **[pyscroll](../pyscroll.md)** (Python, LGPL-3.0, mature, inactive since 2018)
- **[PyTMX](../pytmx.md)** (Python, LGPL-3.0, mature)
- **[Ragel](../ragel.md)** (C++, MIT, mature)
- **[Simple and Fast Multimedia Library](../simple_and_fast_multimedia_library.md)** (C++, zlib, mature)
- **[Simple DirectMedia Layer](../simple_directmedia_layer.md)** (C, zlib, mature)

View File

@ -54,6 +54,7 @@
- **[Cosmosmash](../cosmosmash.md)** (C++, GPL-2.0, mature, inactive since 2013)
- **[Crack Attack!](../crack_attack.md)** (C++, GPL-2.0, mature, inactive since 2005)
- **[Craft](../craft.md)** (C, Python, MIT, mature, inactive since 2017)
- **[CrossUO](../crossuo.md)** (C, C++, GPL-3.0, mature)
- **[Crown](../crown.md)** (C, C++, Vala, MIT, beta)
- **[Curse of War](../curse_of_war.md)** (C, C++, GPL-3.0, mature, inactive since 2014)
- **[Cytadela](../cytadela.md)** (C++, GPL-3.0, beta, inactive since 2013)
@ -87,6 +88,7 @@
- **[Falltergeist](../falltergeist.md)** (C++, GPL-3.0, beta)
- **[Fish Fillets - Next Generation](../fish_fillets-next_generation.md)** (C++, GPL-2.0, mature)
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
- **[flixel-gdx](../flixel-gdx.md)** (Java, 3-clause BSD, beta, inactive since 2017)
- **[Free Mars](../free_mars.md)** (Java, GPL-3.0, mature)
- **[freeablo](../freeablo.md)** (C++, GPL-3.0, beta)
- **[FreeBlocks](../freeblocks.md)** (C, Java, GPL-3.0, beta, inactive since 2015)
@ -134,6 +136,7 @@
- **[Mari0](../mari0.md)** (Lua, MIT, mature, inactive since 2012)
- **[Maxit](../maxit.md)** (C++, ?, mature, inactive since 2014)
- **[Me and My Shadow](../me_and_my_shadow.md)** (C++, GPL-3.0, beta)
- **[Mindustry](../mindustry.md)** (Java, GPL-3.0, mature)
- **[Minetest](../minetest.md)** (C, C++, Lua, LGPL-2.1, mature)
- **[mini2Dx](../mini2dx.md)** (Java, C#, Apache-2.0, mature)
- **[Mininim](../mininim.md)** (C, GPL-3.0, beta, inactive since 2017)
@ -178,13 +181,17 @@
- **[Pingus](../pingus.md)** (C++, GPL-3.0, mature)
- **[Pink Pony](../pink_pony.md)** (C++, GPL-3.0, mature, inactive since 2017)
- **[PixelLight](../pixellight.md)** (C, C++, MIT, mature, inactive since 2012)
- **[PLIB](../plib.md)** (C++, LGPL-2.0, mature, inactive since 2012)
- **[PokerTH](../pokerth.md)** (C++, AGPL-3.0, mature, inactive since 2017)
- **[Powerslide remake](../powerslide_remake.md)** (C++, MIT, beta)
- **[Privateer - Gemini Gold](../privateer-gemini_gold.md)** (C++, GPL-2.0, mature, inactive since 2012)
- **[Psyco](../psyco.md)** (C, MIT, mature, inactive since 2008)
- **[Pygame---Alien-Invasion](../pygame-alien-invasion.md)** (Python, GPL-3.0, beta, inactive since 2018)
- **[PyKaraoke](../pykaraoke.md)** (Python, LGPL-2.1, beta, inactive since 2011)
- **[pyscroll](../pyscroll.md)** (Python, LGPL-3.0, mature, inactive since 2018)
- **[pyskool](../pyskool.md)** (Python, GPL-3.0, mature)
- **[PySol](../pysol.md)** (Python, GPL-2.0, mature, inactive since 2004)
- **[PyTMX](../pytmx.md)** (Python, LGPL-3.0, mature)
- **[QuakeSpasm](../quakespasm.md)** (C, GPL-2.0, mature)
- **[Rabbit Escape](../rabbit_escape.md)** (Java, GPL-2.0, mature)
- **[Race Into Space](../race_into_space.md)** (C, C++, GPL-2.0, mature)

View File

@ -25,6 +25,7 @@
- **[Circus Linux!](../circus_linux.md)** (C, GPL-2.0, mature, inactive since 2000)
- **[Colditz Escape](../colditz_escape.md)** (C, GPL-3.0, mature)
- **[Craft](../craft.md)** (C, Python, MIT, mature, inactive since 2017)
- **[CrossUO](../crossuo.md)** (C, C++, GPL-3.0, mature)
- **[Cytadela](../cytadela.md)** (C++, GPL-3.0, beta, inactive since 2013)
- **[D2X-XL](../d2x-xl.md)** (C++, Custom, GPL-2.0, mature, inactive since 2015)
- **[Daggerfall Unity](../daggerfall_unity.md)** (C#, MIT, mature)
@ -55,6 +56,7 @@
- **[Fish Fillets - Next Generation](../fish_fillets-next_generation.md)** (C++, GPL-2.0, mature)
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
- **[FlightGear](../flightgear.md)** (C++, GPL-2.0, mature)
- **[flixel-gdx](../flixel-gdx.md)** (Java, 3-clause BSD, beta, inactive since 2017)
- **[Free Mars](../free_mars.md)** (Java, GPL-3.0, mature)
- **[freeablo](../freeablo.md)** (C++, GPL-3.0, beta)
- **[Freedoom](../freedoom.md)** (Not applicable, Not applicable, beta)
@ -112,11 +114,14 @@
- **[Pentagram](../pentagram.md)** (C++, GPL-2.0, beta, inactive since 2018)
- **[Performous](../performous.md)** (C, C++, GPL-2.0, mature)
- **[Pingus](../pingus.md)** (C++, GPL-3.0, mature)
- **[PLIB](../plib.md)** (C++, LGPL-2.0, mature, inactive since 2012)
- **[PokerTH](../pokerth.md)** (C++, AGPL-3.0, mature, inactive since 2017)
- **[Privateer - Gemini Gold](../privateer-gemini_gold.md)** (C++, GPL-2.0, mature, inactive since 2012)
- **[Pygame---Alien-Invasion](../pygame-alien-invasion.md)** (Python, GPL-3.0, beta, inactive since 2018)
- **[PyKaraoke](../pykaraoke.md)** (Python, LGPL-2.1, beta, inactive since 2011)
- **[pyscroll](../pyscroll.md)** (Python, LGPL-3.0, mature, inactive since 2018)
- **[PySol](../pysol.md)** (Python, GPL-2.0, mature, inactive since 2004)
- **[PyTMX](../pytmx.md)** (Python, LGPL-3.0, mature)
- **[QuakeSpasm](../quakespasm.md)** (C, GPL-2.0, mature)
- **[Rabbit Escape](../rabbit_escape.md)** (Java, GPL-2.0, mature)
- **[Race Into Space](../race_into_space.md)** (C, C++, GPL-2.0, mature)

View File

@ -68,7 +68,7 @@
- **[Danger from the Deep](../danger_from_the_deep.md)** (C++, GPL-2.0, beta, inactive since 2011)
- **[DarkPlaces](../darkplaces.md)** (C, GPL-2.0, mature, inactive since 2014)
- **[Data Storm](../data_storm.md)** (C, Apache-2.0, mature, inactive since 2017)
- **[Deathchase 3D](../deathchase_3d.md)** (C, GPL-2.0, mature, inactive since 2002)
- **[Deathchase 3D](../deathchase_3d.md)** (C, Perl, GPL-2.0, mature, inactive since 2002)
- **[Defendguin](../defendguin.md)** (C, GPL-2.0, mature, inactive since 2009)
- **[DelverEngine](../delverengine.md)** (Java, Custom, beta)
- **[DesktopAdventures](../desktopadventures.md)** (C, LGPL-2.1, beta)

View File

@ -25,6 +25,7 @@
- **[Classic Blades of Exile](../classic_blades_of_exile.md)** (C++, GPL-2.0, mature)
- **[coab](../coab.md)** (C#, ???, mature)
- **[Crossfire](../crossfire.md)** (C, Java, GPL-2.0, mature)
- **[CrossUO](../crossuo.md)** (C, C++, GPL-3.0, mature)
- **[Daggerfall Unity](../daggerfall_unity.md)** (C#, MIT, mature)
- **[Daimonin](../daimonin.md)** (C, GPL-2.0, mature)
- **[DarkCity](../darkcity.md)** (PHP, GPL-3.0, mature, inactive since 2012)

View File

@ -17,7 +17,10 @@
- **[PCGen](../pcgen.md)** (Java, LGPL-2.1, mature)
- **[pkg-config](../pkg-config.md)** (C, GPL-2.0, mature)
- **[Procedural Map Generator](../procedural_map_generator.md)** (C++, MIT, mature, inactive since 2018)
- **[Psyco](../psyco.md)** (C, MIT, mature, inactive since 2008)
- **[Pymapper](../pymapper.md)** (Python, GPL-3.0, mature)
- **[PyTMX](../pytmx.md)** (Python, LGPL-3.0, mature)
- **[ReShade](../reshade.md)** (C++, 3-clause BSD, mature)
- **[rFXGen](../rfxgen.md)** (C, zlib, mature)
- **[Rolemaster Office](../rolemaster_office.md)** (Java, Apache-2.0, mature)
- **[Rolisteam](../rolisteam.md)** (C++, JavaScript, GPL-2.0, mature)

View File

@ -19,6 +19,7 @@
- **[Executive Man](../executive_man.md)** (JavaScript, Custom, mature, inactive since 2017)
- **[F.LF](../flf.md)** (JavaScript, ?, mature)
- **[Fantasy Map Generator](../fantasy_map_generator.md)** (JavaScript, MIT, mature)
- **[flixel-gdx](../flixel-gdx.md)** (Java, 3-clause BSD, beta, inactive since 2017)
- **[gist-txt](../gist-txt.md)** (JavaScript, MIT, mature, inactive since 2018)
- **[Grimsonland](../grimsonland.md)** (JavaScript, ?, mature, inactive since 2017)
- **[HexGL](../hexgl.md)** (JavaScript, CoffeeScript, MIT, mature, inactive since 2016)

View File

@ -10,6 +10,7 @@
- **[Alex the Allegator 4](../alex_the_allegator_4.md)** (C, GPL-2.0, mature, inactive since 2003)
- **[alive](../alive.md)** (C++, MIT, beta, inactive since 2017)
- **[Annex: Conquer the World](../annex_conquer_the_world.md)** (MegaGlest Script, GPL-3.0, mature, inactive since 2014)
- **[Anura](../anura.md)** (C, C++, zlib, mature)
- **[Arcane-Engine](../arcane-engine.md)** (C++, MIT, beta)
- **[AssaultCube](../assaultcube.md)** (C, C++, Custom, mature, inactive since 2018)
- **[Atomic Tanks](../atomic_tanks.md)** (C++, GPL-2.0, mature, inactive since 2016)
@ -45,6 +46,7 @@
- **[Colditz Escape](../colditz_escape.md)** (C, GPL-3.0, mature)
- **[Crack Attack!](../crack_attack.md)** (C++, GPL-2.0, mature, inactive since 2005)
- **[Craft](../craft.md)** (C, Python, MIT, mature, inactive since 2017)
- **[CrossUO](../crossuo.md)** (C, C++, GPL-3.0, mature)
- **[Curse of War](../curse_of_war.md)** (C, C++, GPL-3.0, mature, inactive since 2014)
- **[Cytadela](../cytadela.md)** (C++, GPL-3.0, beta, inactive since 2013)
- **[D-Fend Reloaded](../d-fend_reloaded.md)** (Pascal, GPL-3.0, mature, inactive since 2015)
@ -86,6 +88,7 @@
- **[Fish Fillets - Next Generation](../fish_fillets-next_generation.md)** (C++, GPL-2.0, mature)
- **[Flare](../flare.md)** (C++, Java, GPL-3.0, mature)
- **[FlightGear](../flightgear.md)** (C++, GPL-2.0, mature)
- **[flixel-gdx](../flixel-gdx.md)** (Java, 3-clause BSD, beta, inactive since 2017)
- **[Free Mars](../free_mars.md)** (Java, GPL-3.0, mature)
- **[freeablo](../freeablo.md)** (C++, GPL-3.0, beta)
- **[Freedoom](../freedoom.md)** (Not applicable, Not applicable, beta)
@ -140,6 +143,7 @@
- **[Me and My Shadow](../me_and_my_shadow.md)** (C++, GPL-3.0, beta)
- **[Mega Mario](../mega_mario.md)** (C++, LGPL-2.1, mature, inactive since 2012)
- **[MicroWar 2.0](../microwar_20.md)** (Python, 3-clause BSD, mature, inactive since 2009)
- **[Mindustry](../mindustry.md)** (Java, GPL-3.0, mature)
- **[Minetest](../minetest.md)** (C, C++, Lua, LGPL-2.1, mature)
- **[mini2Dx](../mini2dx.md)** (Java, C#, Apache-2.0, mature)
- **[Mininim](../mininim.md)** (C, GPL-3.0, beta, inactive since 2017)
@ -195,17 +199,22 @@
- **[Pingus](../pingus.md)** (C++, GPL-3.0, mature)
- **[Pink Pony](../pink_pony.md)** (C++, GPL-3.0, mature, inactive since 2017)
- **[PixelLight](../pixellight.md)** (C, C++, MIT, mature, inactive since 2012)
- **[PLIB](../plib.md)** (C++, LGPL-2.0, mature, inactive since 2012)
- **[PokerTH](../pokerth.md)** (C++, AGPL-3.0, mature, inactive since 2017)
- **[Powerslide remake](../powerslide_remake.md)** (C++, MIT, beta)
- **[Privateer - Gemini Gold](../privateer-gemini_gold.md)** (C++, GPL-2.0, mature, inactive since 2012)
- **[Procedural Map Generator](../procedural_map_generator.md)** (C++, MIT, mature, inactive since 2018)
- **[Psyco](../psyco.md)** (C, MIT, mature, inactive since 2008)
- **[Pygame---Alien-Invasion](../pygame-alien-invasion.md)** (Python, GPL-3.0, beta, inactive since 2018)
- **[PyKaraoke](../pykaraoke.md)** (Python, LGPL-2.1, beta, inactive since 2011)
- **[pyscroll](../pyscroll.md)** (Python, LGPL-3.0, mature, inactive since 2018)
- **[PySol](../pysol.md)** (Python, GPL-2.0, mature, inactive since 2004)
- **[PyTMX](../pytmx.md)** (Python, LGPL-3.0, mature)
- **[QuakeSpasm](../quakespasm.md)** (C, GPL-2.0, mature)
- **[Rabbit Escape](../rabbit_escape.md)** (Java, GPL-2.0, mature)
- **[Race Into Space](../race_into_space.md)** (C, C++, GPL-2.0, mature)
- **[raylib](../raylib.md)** (C, C++, zlib, mature)
- **[ReShade](../reshade.md)** (C++, 3-clause BSD, mature)
- **[ResidualVM](../residualvm.md)** (C++, GPL-2.0, beta)
- **[rFXGen](../rfxgen.md)** (C, zlib, mature)
- **[Rigs of Rods](../rigs_of_rods.md)** (C, C++, AngelScript, GPL-3.0, mature)

File diff suppressed because one or more lines are too long

View File

@ -99,6 +99,7 @@
"https://github.com/AndO3131/lgeneral.git",
"https://github.com/Andrettin/Wyrmgus.git",
"https://github.com/Anthonymcqueen21/Pygame---Alien-Invasion.git",
"https://github.com/Anuken/Mindustry.git",
"https://github.com/Arantis/Meridian59_112.git",
"https://github.com/Argentum-Online/Argentum-Online.git",
"https://github.com/ArmageddonGames/ZeldaClassic.git",
@ -352,6 +353,7 @@
"https://github.com/antionio/game-off-2013.git",
"https://github.com/anttisalonen/freekick3.git",
"https://github.com/anttisalonen/kingdoms.git",
"https://github.com/anura-engine/anura.git",
"https://github.com/aperture-software/colditz-escape.git",
"https://github.com/apsillers/Taggem.git",
"https://github.com/apsillers/lords-of-the-fey.git",
@ -366,6 +368,8 @@
"https://github.com/basicallydan/skifree.js.git",
"https://github.com/benjaminfoo/OpenTriad.git",
"https://github.com/bibendovsky/bstone.git",
"https://github.com/bitcraft/PyTMX.git",
"https://github.com/bitcraft/pyscroll.git",
"https://github.com/bladecoder/bladecoder-adventure-engine.git",
"https://github.com/blakeohare/pyweek-sentientstorage.git",
"https://github.com/blockattack/blockattack-game.git",
@ -401,6 +405,8 @@
"https://github.com/cortex-command-community/Cortex-Command-Community-Project-Source.git",
"https://github.com/craftworkgames/infiniminer.git",
"https://github.com/crawl/crawl.git",
"https://github.com/crosire/reshade.git",
"https://github.com/crossuo/crossuo.git",
"https://github.com/cthielen/Epiar.git",
"https://github.com/cubei/FlappyCow.git",
"https://github.com/cubosphere/cubosphere-code.git",
@ -461,6 +467,7 @@
"https://github.com/fasterthanlime/isaac-paper.git",
"https://github.com/fastrgv/AdaVenture.git",
"https://github.com/fifengine/fifengine.git",
"https://github.com/flixel-gdx/flixel-gdx.git",
"https://github.com/fofix/fofix.git",
"https://github.com/fogleman/Craft.git",
"https://github.com/fph/bastet.git",
@ -862,6 +869,7 @@
"https://gitlab.com/osgames/dark-oberon.git",
"https://gitlab.com/osgames/darkcity.git",
"https://gitlab.com/osgames/darkdestiny.git",
"https://gitlab.com/osgames/deathchase3d.git",
"https://gitlab.com/osgames/deity.git",
"https://gitlab.com/osgames/deliantra.git",
"https://gitlab.com/osgames/devana.git",
@ -948,6 +956,7 @@
"https://gitlab.com/osgames/slaygame.git",
"https://gitlab.com/osgames/snowstorm.git",
"https://gitlab.com/osgames/softpixelengine.git",
"https://gitlab.com/osgames/solarwolf.git",
"https://gitlab.com/osgames/sopwith3.git",
"https://gitlab.com/osgames/spaceopera.git",
"https://gitlab.com/osgames/spicetrade.git",
@ -1008,6 +1017,7 @@
"https://svn.code.sf.net/p/lgames/code/",
"https://svn.code.sf.net/p/pio/code/",
"https://svn.code.sf.net/p/planeshift/code/",
"https://svn.code.sf.net/p/plib/code/",
"https://svn.code.sf.net/p/privateer/code/",
"https://svn.code.sf.net/p/quakespasm/code/",
"https://svn.code.sf.net/p/spacezero/code/",

View File

@ -36,10 +36,12 @@ http://openapoc.pmprog.co.uk/
http://pathfinder.wikia.com/wiki/Pathfinder_Roleplaying_Game
http://phaser.io/
http://playir.com/
http://plib.sourceforge.net/
http://psyco.sourceforge.net/
http://pyglet.org/
http://pyopengl.sourceforge.net/
https://appimage.github.io/categories/Game
https://github.com/gnFur/Monofoxe
https://github.com/moonwards1/Moonwards-Virtual-Moon
http://pypy.org/
http://rcbasic.com/
http://retrospec.sgn.net
http://sam.zoy.org/monsterz/
@ -157,13 +159,10 @@ https://freegamer.blogspot.com (maybe there is something interesting)
https://futurepinball.com/
https://gamejolt.com/ (search there)
https://gdevelop-app.com/
https://github.com/anura-engine/anura
https://github.com/amerkoleci/Vortice.Windows
https://github.com/ao-libre/ao-cliente
https://github.com/atphalix/nexuiz
https://github.com/azhirnov/FrameGraph
https://github.com/bitcraft/pyscroll
https://github.com/bitcraft/PyTMX
https://github.com/born2snipe/flixel-gdx
https://github.com/bsmr-games (also contains copies)
https://github.com/CatacombGames/
https://github.com/Chluverman/android-gltron
@ -176,8 +175,6 @@ https://github.com/collections/tools-for-open-source (maybe we can apply some)
https://github.com/collections/web-games (only OS)
https://github.com/Cortrah/SpaceOperaDesign, https://github.com/Cortrah/SpaceOperaRuby/blob/master/design/turnstyles.md
https://github.com/cping/LGame
https://github.com/crosire/reshade
https://github.com/crossuo/crossuo
https://github.com/DaanVanYperen/artemis-odb-contrib
https://github.com/DeflatedPickle/FAOSDance
https://github.com/Donerkebap13/DonerComponents
@ -190,9 +187,11 @@ https://github.com/fallahn/xygine
https://github.com/fegennari/3DWorld
https://github.com/flathub (all repositories which are games there)
https://github.com/FUSEEProjectTeam/Fusee
https://github.com/fynnfluegge/oreon-engine
https://github.com/gamearians
https://github.com/GamedevFramework/gf
https://github.com/grantjenks/free-python-games (check all)
https://github.com/Hotride/OrionUO
https://github.com/hparcells/cards-against-humanity
https://github.com/i42output/neoGFX
https://github.com/id-Software
@ -200,6 +199,7 @@ https://github.com/JohanLi/uncharted-waters-2
https://github.com/junkdog/artemis-odb
https://github.com/LgLinus/StrategyGame
https://github.com/libretro/libretro-prboom
https://github.com/ligurio/awesome-ttygames
https://github.com/MarcoLizza/tofu-engine
https://github.com/mewo2/terrain
https://github.com/morganbengtsson/mos
@ -216,6 +216,7 @@ https://github.com/pld-linux
https://github.com/pld-linux/nexuiz/blob/master/nexuiz.spec
https://github.com/psuong/ig-developer-console
https://github.com/qiciengine/qiciengine
https://github.com/Renanse/Ardor3D
https://github.com/rizwan3d/MotoGameEngine
https://github.com/rlguy/FantasyMapGenerator
https://github.com/RoxasShadow/Sottaceto
@ -234,6 +235,7 @@ https://github.com/Tinob/Ishiiruka (https://github.com/shiiion/Ishiiruka, https:
https://github.com/TomBebb/awe
https://github.com/Wargus/stratagus
https://github.com/wesnoth/haldric
https://github.com/Zal0/ZGB
https://gitlab.com/LibreGames
https://gitlab.com/nyov/nyovs-nexuiz
https://gitlab.com/vgstation/vgstation-old (and vgstation in general)
@ -381,6 +383,7 @@ https://www.reddit.com/r/opensourcegames/comments/celw6c/top_3_open_source_pinba
https://www.renpy.org/ (also all projects linked there)
https://www.scirra.com/construct2
https://www.tapatalk.com/groups/imperilist/
https://www.tuxfamily.org/ (if there are games)
https://www.wurfelengine.net/
https://wxpython.org/
https://zope.readthedocs.io/en/latest/

View File

@ -5,11 +5,14 @@ Also parse rejected games (https://libregamewiki.org/Libregamewiki:Rejected_game
Unique left column names in the game info boxes:
['Code license', 'Code licenses', 'Developer', 'Developers', 'Engine', 'Engines', 'Genre', 'Genres', 'Libraries', 'Library', 'Media license', 'Media licenses', 'P. language', 'P. languages', 'Platforms']
TODO there are games on LGW which are not part of the Games category but part of XXX-Games sub-categories
"""
import os
import requests
import json
import re
from bs4 import BeautifulSoup
from utils import constants, utils, osg
@ -210,6 +213,39 @@ def lower_case_content(entries, field):
entries[index] = entry
return entries
def remove_parenthized_content(entries, fields):
if not isinstance(fields, tuple):
fields = (fields, )
for index, entry in enumerate(entries):
for field in fields:
if field in entry:
content = entry[field]
if not isinstance(content, list):
content = [content]
content = [re.sub(r'\([^)]*\)', '', c) for c in content] # remove parentheses content
content = [x.strip() for x in content]
content = list(set(content))
entry[field] = content
entries[index] = entry
return entries
def ignore_nonnumbers(entries, fields):
if not isinstance(fields, tuple):
fields = (fields, )
for index, entry in enumerate(entries):
for field in fields:
if field in entry:
content = entry[field]
if not isinstance(content, list):
content = [content]
content = [x for x in content if x.isdigit()]
entry[field] = content
entries[index] = entry
return entries
def clean_lgw_content():
# paths
@ -257,6 +293,7 @@ def clean_lgw_content():
print('mandatory lgw fields: {}'.format(sorted(list(mandatory_fields))))
# content replacements
entries = remove_parenthized_content(entries, ('assets license', 'code language', 'code license', 'engine', 'genre', 'last active', 'library'))
entries = remove_prefix_suffix(entries, ('code license', 'assets license'), ('"', 'GNU', ), ('"', '[3]', '[2]', '[1]', 'only'))
entries = replace_content(entries, ('code license', 'assets license'), 'GPL', ('General Public License', ))
entries = replace_content(entries, ('code license', 'assets license'), 'GPLv2', ('GPL v2', 'GPL version 2.0', 'GPL 2.0'))
@ -267,6 +304,8 @@ def clean_lgw_content():
entries = replace_content(entries, ('code license', 'assets license'), 'zlib', ('zlib/libpng license', ))
entries = replace_content(entries, ('code license', 'assets license'), 'BSD', ('Original BSD License', ))
entries = replace_content(entries, ('code license', 'assets license'), 'CC-BY-SA-3.0', ('Creative Commons Attribution-ShareAlike 3.0 Unported License', 'CC-BY-SA 3.0', 'CC BY-SA 3.0'))
entries = replace_content(entries, ('code license', 'assets license'), 'CC-BY-SA', ('CC BY-SA',))
entries = replace_content(entries, ('code license', 'assets license'), 'MIT', ('MIT License',))
entries = replace_content(entries, 'platform', 'macOS', ('Mac', ))
entries = remove_prefix_suffix(entries, 'code language', (), ('[3]', '[2]', '[1]'))
entries = ignore_content(entries, 'code language', ('HTML5', 'HTML', 'English', 'XML', 'WML'))
@ -282,6 +321,9 @@ def clean_lgw_content():
entries = replace_content(entries, 'library', 'pygame', ('Pygame', ))
entries = replace_content(entries, 'library', 'Qt', ('QT', ))
entries = ignore_content(entries, 'library', ('C++', 'Lua', 'Mozilla Firefox'))
entries = ignore_nonnumbers(entries, 'last active')
entries = ignore_content(entries, 'last active', ('2019', ))
entries = ignore_content(entries, 'platform', ('DOS', ))
# list for every unique field
# fields = sorted(list(unique_fields))

View File

@ -19,34 +19,20 @@ linux-packages - > free text (info)
name -> name
platform -> platform
TODO also ignore our rejected entries
"""
import json
from utils.osg import *
def get_unique_field_content(field, entries):
"""
"""
unique_content = {}
for entry in entries:
for element in entry.get(field, []):
unique_content[element] = unique_content.get(element, 0) + 1
unique_content = list(unique_content.items())
unique_content.sort(key=lambda x: -x[1])
unique_content = ['{}({})'.format(k, v) for k, v in unique_content]
return unique_content
import os
from utils import constants, utils, osg
name_replacements = {'Eat the Whistle': 'Eat The Whistle', 'Scorched 3D': 'Scorched3D', 'Silver Tree': 'SilverTree', 'Blob Wars Episode 1 : Metal Blob Solid': 'Blobwars: Metal Blob Solid', 'Adventure': 'Colossal Cave Adventure',
'Fall Of Imiryn': 'Fall of Imiryn', 'Liquid War 6': 'Liquid War', 'Gusanos': 'GUSANOS', 'Corewars': 'Core War', 'FLARE': 'Flare', 'Vitetris': 'vitetris', 'Powder Toy': 'The Powder Toy', 'Asylum': 'SDL Asylum',
'Atanks': 'Atomic Tanks'}
'Atanks': 'Atomic Tanks', 'HeXon': 'heXon', 'Unnethack': 'UnNetHack', 'Nova Pinball': 'NOVA PINBALL', 'Jump n Bump': "Jump'n'Bump"}
ignored_names = ['Hetris', '8 Kingdoms', 'Antigravitaattori', 'Arena of Honour', 'Arkhart', 'Ascent of Justice', 'Balazar III', 'Balder3D', 'Barbie Seahorse Adventures', 'Barrage', 'Gnome Batalla Naval', 'User:AVRS/sandbox']
def list_compare(a, b, k):
"""
@ -64,24 +50,20 @@ if __name__ == "__main__":
maximal_newly_created_entries = 40
# paths
root_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir))
import_path = os.path.join(constants.root_path, 'tools', 'lgw-import')
lgw_entries_file = os.path.join(import_path, '_lgw.cleaned.json')
# import lgw import
json_path = os.path.join(root_path, os.pardir, 'lgw_import.json')
text = read_text(json_path)
text = utils.read_text(lgw_entries_file)
lgw_entries = json.loads(text)
# perform replacements and disregarding
# perform name replacements
lgw_entries = [x for x in lgw_entries if x['name'] not in ignored_names]
for index, lgw_entry in enumerate(lgw_entries):
if lgw_entry['name'] in name_replacements:
lgw_entry['name'] = name_replacements[lgw_entry['name']]
if 'code language' in lgw_entry:
languages = lgw_entry['code language']
languages = ['Python' if x.startswith('Python') else x for x in languages]
languages = ['PHP' if x.startswith('PHP') else x for x in languages]
languages = ['Lua' if x.lower().startswith('lua') else x for x in languages]
languages = ['JavaScript' if x.lower().startswith('javascript') else x for x in languages]
h = []
for l in languages:
for g in ('/', 'and'):
@ -91,71 +73,13 @@ if __name__ == "__main__":
if type(l) == str:
l = [l]
h.extend(l)
languages = ['C++' if x.startswith('C++') else x for x in h]
languages = ['C' if x.startswith('C ') or x.startswith('C[') else x for x in languages]
languages = [x for x in languages if x not in ignored_languages]
languages = h
if languages:
lgw_entry['code language'] = languages
else:
del lgw_entry['code language']
if 'categories' in lgw_entry:
categories = lgw_entry['categories']
categories = [x for x in categories if not x.startswith('Game')]
categories = [x for x in categories if not x.startswith('Article')]
categories = [x for x in categories if not x.startswith('Page')]
categories = [x for x in categories if x not in ignored_categories]
categories = [x.lower() if len(x) > 2 else x for x in categories]
if categories:
lgw_entry['categories'] = categories
else:
del lgw_entry['categories']
if 'genre' in lgw_entry:
genres = lgw_entry['genre']
genres = [x for x in genres if len(x) > 0]
genres = [x.lower() for x in genres]
genres = [x[:-5] if x.endswith(' game') else x for x in genres]
genres = [x[:-5] if x.endswith(' games') else x for x in genres]
genres = [genre_replacements[x] if x in genre_replacements else x for x in genres]
for h in ('platform',):
genres = [h if x.startswith(h) else x for x in genres]
if genres:
lgw_entry['genre'] = genres
else:
del lgw_entry['genre']
if 'library' in lgw_entry:
libraries = lgw_entry['library']
libraries = [library_replacements[x] if x in library_replacements else x for x in libraries]
lgw_entry['library'] = libraries
if 'code license' in lgw_entry:
licenses = lgw_entry['code license']
licenses = [x.strip() for x in licenses] # strip
licenses = [x[1:] if x.startswith('"') else x for x in licenses] # cut " at the beginning
licenses = [x[:-1] if x.endswith('"') else x for x in licenses] # cut " at the end
licenses = [x[4:] if x.startswith('GNU ') else x for x in licenses]
licenses = [x[:-3] if x.endswith('[1]') or x.endswith('[2]') else x for x in licenses]
licenses = [x[:-8] if x.lower().endswith(' license') else x for x in licenses]
licenses = [x.strip() for x in licenses] # strip
#licenses = ['GPL-2.0' if x.startswith('GPLv2') or x.startswith('GPL v2') or x.startswith('GPL 2') else x for x in licenses]
#licenses = ['GPL-3.0' if x.startswith('GPLv3') or x.startswith('GPL v3') or x.startswith('GPL 3') or x.startswith('GPL v.3') else x for x in licenses]
licenses = ['Public domain' if x.lower().startswith('public domain') else x for x in licenses]
lgw_entry['code license'] = licenses
if 'assets license' in lgw_entry:
licenses = lgw_entry['assets license']
licenses = [x.strip() for x in licenses] # strip
licenses = [x[1:] if x.startswith('"') else x for x in licenses] # cut " at the beginning
licenses = [x[:-1] if x.endswith('"') else x for x in licenses] # cut " at the end
licenses = [x[4:] if x.startswith('GNU ') else x for x in licenses]
licenses = [x[:-3] if x.endswith('[1]') or x.endswith('[2]') else x for x in licenses]
licenses = [x[:-8] if x.lower().endswith(' license') else x for x in licenses]
licenses = [x.strip() for x in licenses] # strip
licenses = ['GPL-2.0' if x.startswith('GPLv2') or x.startswith('GPL v2') or x.startswith('GPL 2') else x for x in licenses]
licenses = ['GPL-3.0' if x.startswith('GPLv3') or x.startswith('GPL v3') or x.startswith('GPL 3') or x.startswith('GPL v.3') else x for x in licenses]
licenses = ['Public domain' if x.lower().startswith('public domain') else x for x in licenses]
lgw_entry['assets license'] = licenses
lgw_entries[index] = lgw_entry
# check for unique field names
unique_fields = set()
for lgw_entry in lgw_entries:
@ -163,23 +87,14 @@ if __name__ == "__main__":
print('unique lgw fields: {}'.format(sorted(list(unique_fields))))
# which fields are mandatory
mandatory_fields = unique_fields.copy()
for lgw_entry in lgw_entries:
remove_fields = [field for field in unique_fields if field not in lgw_entry]
unique_fields -= set(remove_fields)
print('mandatory lgw fields: {}'.format(sorted(list(unique_fields))))
# unique contents
print('{}: {}'.format('platform', get_unique_field_content('platform', lgw_entries)))
print('{}: {}'.format('code language', get_unique_field_content('code language', lgw_entries)))
print('{}: {}'.format('categories', get_unique_field_content('categories', lgw_entries)))
print('{}: {}'.format('genre', get_unique_field_content('genre', lgw_entries)))
print('{}: {}'.format('library', get_unique_field_content('library', lgw_entries)))
print('{}: {}'.format('code license', get_unique_field_content('code license', lgw_entries)))
print('{}: {}'.format('assets license', get_unique_field_content('assets license', lgw_entries)))
print('{}: {}'.format('engine', get_unique_field_content('engine', lgw_entries)))
remove_fields = [field for field in mandatory_fields if field not in lgw_entry]
mandatory_fields -= set(remove_fields)
print('mandatory lgw fields: {}'.format(sorted(list(mandatory_fields ))))
# read our database
our_entries = assemble_infos(c.entries_path)
our_entries = osg.assemble_infos()
print('{} entries with us'.format(len(our_entries)))
# just the names
@ -194,7 +109,7 @@ if __name__ == "__main__":
#print('similar names')
#for lgw_name in lgw_names:
# for our_name in our_names:
# if game_name_similarity(lgw_name, our_name) > similarity_threshold:
# if osg.game_name_similarity(lgw_name, our_name) > similarity_threshold:
# print('{} - {}'.format(lgw_name, our_name))
newly_created_entries = 0
@ -234,11 +149,11 @@ if __name__ == "__main__":
# determine file name
print('create new entry for {}'.format(lgw_name))
file_name = canonical_game_name(lgw_name) + '.md'
target_file = os.path.join(entries_path, file_name)
file_name = osg.canonical_game_name(lgw_name) + '.md'
target_file = os.path.join(constants.entries_path, file_name)
if os.path.isfile(target_file):
print('warning: file {} already existing, save under slightly different name'.format(file_name))
target_file = os.path.join(entries_path, file_name[:-3] + '-duplicate.md')
target_file = os.path.join(constants.entries_path, file_name[:-3] + '-duplicate.md')
if os.path.isfile(target_file):
continue # just for safety reasons
@ -300,5 +215,5 @@ if __name__ == "__main__":
entry += '\n## Building\n'
# finally write to file
write_text(target_file, entry)
# utils.write_text(target_file, entry)
newly_created_entries += 1

View File

@ -32,10 +32,13 @@ info -> after fields
updated not used
images not used
video: not used
TODO also ignore our rejected entries
"""
import ruamel_yaml as yaml
from utils.osg import *
import os
from utils import constants, utils, osg
# should change on osgameclones
osgc_name_aliases = {'4DTris': '4D-TRIS', 'fheroes2': 'Free Heroes 2', 'DrCreep': 'The Castles of Dr. Creep', 'Duke3d_win32': 'Duke3d_w32', 'erampage (EDuke32 fork)': 'erampage', 'GNOME Atomix': 'Atomix', 'Head over Heels 2': 'Head over Heels',
@ -64,10 +67,10 @@ def unique_field_contents(entries, field):
for entry in entries:
if field in entry:
field_content = entry[field]
if type(field_content) is str:
unique_content.add(field_content)
else:
if type(field_content) is list:
unique_content.update(field_content)
else:
unique_content.add(field_content)
unique_content = sorted(list(unique_content), key=str.casefold)
return unique_content
@ -98,7 +101,26 @@ if __name__ == "__main__":
osgc_entries.extend(_)
print('{} entries in osgameclones'.format(len(osgc_entries)))
print('osgc-languages: {}'.format(unique_field_contents(osgc_entries, 'lang')))
# which fields do they have
osgc_fields = set()
for osgc_entry in osgc_entries:
osgc_fields.update(osgc_entry.keys())
print('unique osgc-fields: {}'.format(osgc_fields))
for field in osgc_fields:
if field in ('video', 'feed', 'url', 'repo', 'info', 'updated', 'images', 'name', 'originals'):
continue
content = [entry[field] for entry in osgc_entries if field in entry]
# flatten
flat_content = []
for c in content:
if isinstance(c, list):
flat_content.extend(c)
else:
flat_content.append(c)
statistics = utils.unique_elements_and_occurrences(flat_content)
statistics.sort(key=str.casefold)
print('\n{}: {}'.format(field, ', '.join(statistics)))
# eliminate the ignored entries
osgc_entries = [x for x in osgc_entries if x['name'] not in osgc_ignored_entries]
@ -146,7 +168,7 @@ if __name__ == "__main__":
print('osgc-content: {}'.format(unique_field_contents(osgc_entries, 'content')))
# read our database
our_entries = assemble_infos(c.entries_path)
our_entries = osg.assemble_infos()
print('{} entries with us'.format(len(our_entries)))
# just the names
@ -160,7 +182,7 @@ if __name__ == "__main__":
# find similar names among the rest
for osgc_name in osgc_names:
for our_name in our_names:
if game_name_similarity(osgc_name, our_name) > similarity_threshold:
if osg.game_name_similarity(osgc_name, our_name) > similarity_threshold:
print('{} - {}'.format(osgc_name, our_name))
newly_created_entries = 0
@ -231,9 +253,9 @@ if __name__ == "__main__":
urls = osgc_entry['url']
if type(urls) == str:
urls = [urls]
urls = [strip_url(url) for url in urls]
urls = [utils.strip_url(url) for url in urls]
our_urls = our_entry['home']
our_urls = [strip_url(url) for url in our_urls]
our_urls = [utils.strip_url(url) for url in our_urls]
for url in urls:
if url not in our_urls:
p += ' home url {} missing\n'.format(url)
@ -311,11 +333,11 @@ if __name__ == "__main__":
# determine file name
print('create new entry for {}'.format(osgc_name))
file_name = canonical_game_name(osgc_name) + '.md'
target_file = os.path.join(entries_path, file_name)
file_name = osg.canonical_game_name(osgc_name) + '.md'
target_file = os.path.join(constants.entries_path, file_name)
if os.path.isfile(target_file):
print('warning: file {} already existing, save under slightly different name'.format(file_name))
target_file = os.path.join(entries_path, file_name[:-3] + '-duplicate.md')
target_file = os.path.join(constants.entries_path, file_name[:-3] + '-duplicate.md')
if os.path.isfile(target_file):
continue # just for safety reasons
@ -393,7 +415,7 @@ if __name__ == "__main__":
entry += '\n## Building\n'
# finally write to file
# write_text(target_file, entry)
# utils.write_text(target_file, entry)
newly_created_entries += 1

View File

@ -57,6 +57,7 @@ MultiGame (https://github.com/whendricso/MultiGame): Commercial
New RAW (http://sourceforge.net/projects/newraw/, http://svn.code.sf.net/p/newraw/code/): Early development, requires original content, abandoned
Open General (http://www.open-general.com/, https://sourceforge.net/projects/opengeneral/, https://svn.code.sf.net/p/opengeneral/code/): Proprietary license (see credits.txt)
OpenDeathValley (https://github.com/OpenDeathValley/OpenDeathValley.git): No instructions, no releases, no website, not much code
OpenMB (https://github.com/cookgreen/OpenMB): Very early development stage, maybe later
OpenOutcast (https://sourceforge.net/projects/ocmod/): Very early development, no release, short svn history, abandoned
OpenPop (http://openpopulous.sourceforge.net/, https://sourceforge.net/projects/openpopulous/, https://svn.code.sf.net/p/openpopulous/code/): Very early development
openStrato (https://github.com/gerdl/openStrato.git): Not much code, no release or demo site, short code history, abandoned

View File

@ -301,7 +301,10 @@ def unique_elements_and_occurrences(elements):
"""
unique_elements = {}
for element in elements:
unique_elements[element] = unique_elements.get(element, 0) + 1
try:
unique_elements[element] = unique_elements.get(element, 0) + 1
except Exception as e:
print(e)
unique_elements = list(unique_elements.items())
unique_elements.sort(key=lambda x: -x[1])
unique_elements = ['{}({})'.format(k, v) for k, v in unique_elements]