diff --git a/docs/data.json b/docs/data.json index 20202de1..fd8206ee 100644 --- a/docs/data.json +++ b/docs/data.json @@ -1 +1 @@ -{"headings": ["Name", "Download"], "data": [["Astromenace", "https://www.viewizard.com/download.html"], ["Cat Mother Dead Justice", "https://sourceforge.net/projects/catmother/files/"], ["CommandoJS", ""], ["Epiar", ""], ["GDash", "https://bitbucket.org/czirkoszoltan/gdash/downloads/"], ["Linwarrior 3D", "http://www.hackcraft.de/games/linwarrior_3d/downloads.htm"], ["MechCommander 2 Omnitech", ""], ["Open Sonic", "http://opensnc.sourceforge.net/home/download.php"], ["Open Zelda", ""], ["Red Eclipse", "https://www.redeclipse.net/download"], ["Rocks'n'Diamonds ", "http://www.artsoft.org/rocksndiamonds/download/"], ["Secret Mario Chronicles", "https://sourceforge.net/projects/smclone/files"], ["Smash", ""], ["Speed Dreams", "http://www.speed-dreams.org/#download"], ["SuperTuxKart", "https://supertuxkart.net/Download"], ["Tux Racer", "https://sourceforge.net/projects/tuxracer/files/"], ["Xonotic", "http://www.xonotic.org/download/"], ["AdaVenture", "https://github.com/fastrgv/AdaVenture/releases"], ["Camelia Girls", "https://web.archive.org/web/20140107152141/http://pigux.com:80/cameliagirls/download.html"], ["Clou!", "https://sourceforge.net/projects/cosp/files/"], ["Colossal Cave Adventure", ""], ["Digital: A Love Story", ""], ["Dragon History", ""], ["Fanwor", ""], ["Free in the Dark (engine)", ""], ["GameLV", ""], ["Murder In The Public Domain", "https://sourceforge.net/projects/murderpd/files/"], ["Sentient Storage", ""], ["Sintel The Game", ""], ["Solaris the Game", "https://sourceforge.net/projects/solaristhegame/files/"], ["Star Maiden Rio", "http://www.mediafire.com/file/jog3fcfxgsyd03f/Astraea_Rio-1.05-all.zip"], ["TwinEngine", ""], ["Visions from the Other Side", ""], ["Allegro", "http://liballeg.org/download.html"], ["Annchienta", "https://sourceforge.net/projects/annchienta/files/annchienta/current/"], ["Arianne / Marauroa", "https://arianne-project.org/engine/marauroa.html"], ["Atlantis", "https://sourceforge.net/projects/atlantis/files/Atlantis%204/Release%204.1.0/"], ["Blender game engine", "https://www.blender.org/download/"], ["COCOS2D-X", "http://cocos2d-x.org/download"], ["Dash Engine", ""], ["Delta Engine", "http://www.deltaengine.net/download"], ["EasyRPG Player", "https://easyrpg.org/player/downloads/"], ["ENIGMA", "https://enigma-dev.org/download.htm"], ["Flare Engine", "http://www.flarerpg.org/ https://github.com/clintbellanger/flare-engine/releases"], ["Flixel", "http://flixel.org/download.html"], ["GemRB", "http://www.gemrb.org/wiki/doku.php?id=download"], ["Godot", "https://godotengine.org/download"], ["HaxeFlixel", "http://haxeflixel.com/download/"], ["H-World", "https://sourceforge.net/projects/h-world/files/"], ["Irrlicht Engine", "http://irrlicht.sourceforge.net/?page_id=10"], ["JiGS Interactive Game System", ""], ["jMonkeyEngine", "https://github.com/jMonkeyEngine/sdk/releases"], ["libGDX", "http://libgdx.badlogicgames.com/download.html"], ["L\u00d6VE", ""], ["Lumix Engine", "https://github.com/nem0/LumixEngine/releases"], ["Lightweight Java Game Library", "https://www.lwjgl.org/download"], ["Mana", "http://www.manasource.org/downloads.html"], ["Maratis", "http://www.maratis3d.org/?page_id=57"], ["mkxp", ""], ["MonoGame", "http://www.monogame.net/downloads/"], ["Octaforge", "https://octaforge.org/page/downloads"], ["OGRE3D", "https://www.ogre3d.org/download/sdk"], ["O.H.R.RPG.C.E", "http://rpg.hamsterrepublic.com/ohrrpgce/Downloads"], ["OpenFL", "http://www.openfl.org/learn/docs/getting-started/"], ["OpenRPG", "http://www.rpgobjects.com/index.php?c=orpg&m=getorpg"], ["Open RPG Maker", "https://sourceforge.net/projects/openrpgmaker/files/"], ["Orx", "https://github.com/orx/orx/releases"], ["Panda 3D", "http://www.panda3d.org/download.php"], ["Polycode", "http://polycode.org/download/"], ["pygame", "http://www.pygame.org/download.shtml"], ["pyORPG", ""], ["Qt", "https://www1.qt.io/download-open-source/"], ["Quad-engine", "http://quad-engine.com/downloads.html"], ["rpge", ""], ["sandbox Game Maker", "http://www.sandboxgamemaker.com/free-game-maker-download/"], ["ScummVM", "http://www.scummvm.org/downloads/"], ["SDL Game Engine 2D", "https://sourceforge.net/projects/sge2d/files/sge2d/"], ["Solarus", "http://www.solarus-games.org/engine/download/"], ["Superpowers", "https://sparklinlabs.itch.io/superpowers"], ["Terasology", ""], ["Urho3D", "https://sourceforge.net/projects/urho3d/files/Urho3D/"], ["Vega Strike", "http://vegastrike.sourceforge.net/getfiles/"], ["WorldForge", "https://www.worldforge.org/index.php/downloads/"], ["xoreos", "https://xoreos.org/downloads/index.html"], ["ZGameEditor", "http://www.zgameeditor.org/index.php/Main/Download"], ["Boost (C++ Libraries)", "http://www.boost.org/users/download/"], ["Crypto++", "https://cryptopp.com/#download"], ["Doxygen", "http://www.stack.nl/~dimitri/doxygen/download.html"], ["FreeType", "https://www.freetype.org/download.html"], ["HarfBuzz", ""], ["libpng", ""], ["Libxml2", "http://www.xmlsoft.org/downloads.html"], ["Lua", "http://www.lua.org/download.html"], ["LZMA SDK", "http://7-zip.org/download.html http://7-zip.org/sdk.html"], ["OpenSSL", "https://www.openssl.org/source/"], ["Open AL", ""], ["Open AL Soft", ""], ["pkg-config", "https://pkg-config.freedesktop.org/releases/"], ["Pthreads-win32", ""], ["Ragel", ""], ["Simple DirectMedia Layer", "https://www.libsdl.org/download-2.0.php"], ["Simple and Fast Multimedia Library", "https://www.sfml-dev.org/download.php"], ["SWIG", "http://www.swig.org/download.html"], ["wxWidgets", "http://wxwidgets.org/downloads/"], ["XZ Utils", ""], ["yaml-cpp", ""], ["zlib", ""], ["AutoREALM", "https://sourceforge.net/projects/autorealm/files"], ["Deity", "https://sourceforge.net/projects/deity/files"], ["Dungeon Mapper", "https://sourceforge.net/projects/dungeonmap/files"], ["GM Tools", "https://sourceforge.net/projects/gm-tools/files"], ["JaNaG - Java Name Generator", "https://sourceforge.net/projects/janag.berlios/files"], ["Open Legend RPG", ""], ["PCGen", "http://pcgen.org/download/"], ["Pymapper", "http://pymapper.com/downloads/"], ["Rolemaster Office", "https://sourceforge.net/projects/rmoffice/files"], ["Rolisteam", "http://www.rolisteam.org/download.html"], ["RPDungeon - computer aided role playing", "https://sourceforge.net/projects/rpdungeon/files"], ["sCoreForge Pathfinder Character Creator", "https://sourceforge.net/projects/scoreforge/files/"], ["Andor's Trail", "https://f-droid.org/packages/com.gpl.rpg.AndorsTrail/"], ["Angband", "http://rephial.org/release/"], ["Ardentryst", "http://www.jordantrudgett.com/ardentryst/ardentryst-downloads/"], ["Argentum Online", "http://www.comunidadargentum.com/descargas/"], ["Arx Libertatis", "http://wiki.arx-libertatis.org/Download"], ["Atrinik", ""], ["Avanor", "https://sourceforge.net/projects/avanor/files"], ["Betrayer's Moon Tactics", "https://sourceforge.net/projects/bm-game/files"], ["Classic Blades of Exile", ""], ["BrowserQuest", ""], ["Castle of the Winds", ""], ["Cataclysm", ""], ["Catch Challenger", "https://catchchallenger.first-world.info/download.html"], ["Choria", ""], ["Crossfire", "http://crossfire.real-time.com/download/index.html"], ["Daimonin", "https://www.daimonin.org/downloads/"], ["Dark City", "https://sourceforge.net/projects/darkcity/files/"], ["Dawn", ""], ["Decker", "https://sourceforge.net/projects/decker/files"], ["Deliantra", "http://www.deliantra.net/play.html"], ["DemiGod", ""], ["diablo-js", ""], ["DNT", "http://dnt.dnteam.org/cgi-bin/downloads.py"], ["Dragon Hunt", ""], ["Dungeon Crawl Stone Soup", "http://crawl.develz.org/download.htm"], ["Dungeon Hero", "https://play.google.com/store/apps/details?id=com.glevel.dungeonhero"], ["Dungeon Monkey Eternal", ""], ["Dungeon Quest", "https://play.google.com/store/apps/details?id=com.giggs.heroquest"], ["Egoboo", "http://egoboo.sourceforge.net/download.html"], ["Endless Sky", "https://github.com/endless-sky/endless-sky/releases"], ["Eos, Dawn of Light: A Space Opera", "https://sourceforge.net/projects/eos-game/files"], ["Erebus", "http://erebusrpg.sourceforge.net/#download"], ["Eternal Lands", "http://www.eternal-lands.com/page/download.php"], ["Evol Online", "http://evolonline.org/manaplus"], ["Exult", "http://exult.sourceforge.net/download.php"], ["Fallen Spire", ""], ["Fall of Imyrin", "https://sourceforge.net/projects/annchienta/files/annchienta/current/"], ["Freedink", "https://www.gnu.org/software/freedink/get"], ["FreedroidRPG", "http://www.freedroid.org/download/"], ["GalaxyMage Redux", ""], ["GearHead", "http://www.gearheadrpg.com/downloads/"], ["Gee Whiz", "http://icculus.org/gwiz/download.php"], ["Goblin Hack", "https://sourceforge.net/projects/goblinhack/files/"], ["Hale", "https://sourceforge.net/projects/hale/files/"], ["Haxima", "https://sourceforge.net/projects/nazghul/files"], ["Hero of Allacrost", "https://bitbucket.org/allacrost/allacrost/downloads/"], ["Holyspirit", "https://sourceforge.net/projects/lechemindeladam/files"], ["Ilarion", "http://illarion.org/illarion/de_java_download.php"], ["Imperium", "https://empiredirectory.net/index.php/new-downloads"], ["Iter Vehemens ad Necem", "https://sourceforge.net/projects/ivan/files/"], ["The hunt for the lost rainbow jewels (Jewelhunt)", "https://sourceforge.net/projects/jewelhunt/files"], ["Kobold's Quest 2", "https://sourceforge.net/projects/koboldsquest2/files/"], ["KQ Lives", "https://sourceforge.net/projects/kqlives/files/"], ["Labyrinth of Worlds", "https://sourceforge.net/projects/low/files"], ["Land of Fire", ""], ["Linley's Dungeon Crawl", "http://www.dungeoncrawl.org/?d"], ["Lips of Suna", ""], ["Magarena", "https://github.com/magarena/magarena/releases/"], ["The Mana World", "https://www.themanaworld.org/index.php/Downloads"], ["Meridian 59", "http://meridian59.com/play-now.php"], ["Meritous", ""], ["Moria", "http://beej.us/moria/files/"], ["Naev", "http://blog.naev.org/downloads/"], ["NetHack", "https://www.nethack.org/common/index.html"], ["NLarn", "https://github.com/nlarn/nlarn/releases"], ["Openglad", "http://snowstorm.sourceforge.net/cgi-bin/site.cgi?page=download"], ["Open Meridian", "http://openmeridian.org/create-account/"], ["OpenMW", "https://openmw.org/downloads/"], ["Open Tibia", "https://sourceforge.net/projects/opentibia/files/"], ["ORIENT", "https://sourceforge.net/projects/orient-ecircus/files"], ["Other-Life", "http://www.other-life.com/downloads.php"], ["PARPG", "http://blog.parpg.net/download/"], ["Phantasy Star Rebirth", "https://sourceforge.net/projects/phantasy/files"], ["PlaneShift", "http://www.planeshift.it/Download"], ["Project Diaspora", "https://sourceforge.net/projects/pdiaspora/files/"], ["Radakan", "https://sourceforge.net/projects/radakan/files/"], ["REGoth", "https://github.com/REGoth-project/REGoth/releases"], ["Rogue Clone IV", "https://sourceforge.net/projects/rogueclone/files/rogue%20clone/"], ["Roguish", ""], ["Room for Change", ""], ["RuneSword II", "https://sourceforge.net/projects/runesword/files/"], ["S.C.O.U.R.G.E.", "https://sourceforge.net/projects/scourge/files"], ["Silvertree", "https://code.google.com/archive/p/silvertree/downloads"], ["Slash'EM", "http://slashem.sourceforge.net/stable.html"], ["Source of Tales", ""], ["Space Station 13", ""], ["Spice Trade", "https://sourceforge.net/projects/spicetrade/files/"], ["Stendhal", ""], ["Story of a Lost Sky", "https://bitbucket.org/featheredmelody/lost-sky-project-public/downloads/"], ["Summoning Wars", ""], ["Tales of Maj'Eyal", "https://te4.org/download"], ["The Clans", "https://sourceforge.net/projects/theclans/files"], ["Trinity Reign", ""], ["Tuxemon", "https://www.tuxemon.org/download.html"], ["UlDunAd", ""], ["Umbra", "http://markdamonhughes.com/Umbra/#download"], ["Underworld Adventures", "http://uwadv.sourceforge.net/index.php?page=download"], ["UnNetHack", "https://sourceforge.net/projects/unnethack/files/unnethack/"], ["Valyria Tear", "https://valyriatear.blogspot.de/p/downloads.html"], ["VegaTrek", "https://sourceforge.net/projects/vegatrek/files/vegatrek%200.6/"], ["Waste's Edge", ""], ["Witch Blast", "https://github.com/Cirrus-Minor/witchblast/releases"], ["World of Phaos", "https://sourceforge.net/projects/phaosrpg/files/"], ["XU4", "http://xu4.sourceforge.net/download.php"], ["ZAngband", "https://sourceforge.net/projects/zangband/files/"], ["Zelda: Mystery of Solarus DX", ""], ["3d.city", ""], ["Danger from the Deep", "http://dangerdeep.sourceforge.net/downloads/"], ["Freeminer", ""], ["FreeTrain", "https://sourceforge.net/projects/freetrain/files/"], ["LinCity", ""], ["LinCity-NG", "https://sourceforge.net/projects/lincity-ng.berlios/files/"], ["Micropolis", "can be played online"], ["micropolisJS", "can be played online"], ["OpenCity", "http://www.opencity.info/en/Download.html"], ["Open Rails", "http://openrails.org/download/program/"], ["OpenSkyscraper", ""], ["Open Transport Tycoon", "http://www.openttd.org/en/download-stable"], ["Our Personal Space", ""], ["Pioneer", "https://pioneerspacesim.net/download"], ["SimuTrans", "http://www.simutrans.de/download"], ["0AD", "https://play0ad.com/download/"], ["8 Kingdoms", "https://sourceforge.net/projects/kralovstvi/files/Legacy/8%20Kingdoms%201.1.0/"], ["Age of Magic", "https://sourceforge.net/projects/ageofmagic/files/"], ["AI Wars", ""], ["Alien Assault Traders", "https://sourceforge.net/projects/aatrade/files/AATraders%200.4x/"], ["Ancient Beast", ""], ["Antares", ""], ["AntiChess", "https://sourceforge.net/projects/antichess/files/antichess/1.0/"], ["Armies", "https://sourceforge.net/projects/armies/files/"], ["Arthur's Knights", "https://sourceforge.net/projects/king-arthur/files/king-arthur/Alpha%200.3/"], ["Advanced Strategic Command", ""], ["Atomiks", "https://sourceforge.net/projects/atomiks/files"], ["Atomix", ""], ["Attal", "https://sourceforge.net/projects/attal/files/Attal/"], ["A Planet's Revenge", "https://sourceforge.net/projects/aplanetsrevenge/files/aplanetsrevenge/apr-1.0-alpha/"], ["Battlefield Java", "https://sourceforge.net/projects/battlefieldjava/files/battlefieldjava/"], ["Battles of Antargis", ""], ["Begin2", "https://sourceforge.net/projects/begin2/files/begin2/0.93/"], ["Birth of the Empires", "http://loadion.com/en/Birth-of-the-Empires_6681499.html"], ["BlackNova Traders", "https://sourceforge.net/projects/blacknova/files"], ["Blitzkrieg", "https://sourceforge.net/projects/blitzkrieg/files/developpement/"], ["Boson", "http://boson.sourceforge.net/download.php"], ["Bos Wars", "https://www.boswars.org/download.shtml"], ["Bygfoot", "https://sourceforge.net/projects/bygfoot/files/"], ["Caesar IA", "https://bitbucket.org/dalerank/caesaria/wiki/Releases"], ["Call to Power 2", ""], ["Civil", "http://civil.sourceforge.net/download.html"], ["Greenius' Civil War", ""], ["CivOne", "https://www.civone.org/Download"], ["Colobot", "https://colobot.info/download-colobot-gold/"], ["Colonization too", "https://sourceforge.net/projects/coltoo/files/"], ["Conquests", "https://launchpad.net/conquests/+download"], ["Crimson Fields", "http://crimson.seul.org/download.php"], ["Crown and Cutless", "https://sourceforge.net/projects/crownandcutlass/files/crownandcutlass/"], ["C-evo", "http://www.c-evo.org/files/files.php"], ["Dark Destiny", ""], ["Dark Oberon", "http://dark-oberon.sourceforge.net/?page=download"], ["Devana", "https://sourceforge.net/projects/devana/files"], ["Drop Shock", ""], ["Duel Commander", "https://sourceforge.net/projects/duelcommander/files"], ["Dune Dynasty", "https://sourceforge.net/projects/dunedynasty"], ["Dune II - The Maker", "http://dune2themaker.fundynamic.com/?page_id=11"], ["Dune Legacy", "http://dunelegacy.sourceforge.net/website/downloads.html"], ["Eleconics", "https://sourceforge.net/projects/eleconics/files"], ["The Epic of Heroes", "https://sourceforge.net/projects/epicheroes/files"], ["EPOH", ""], ["EternalWinterWars", ""], ["Evil Cult", ""], ["FAR Colony", ""], ["First Strike", "https://sourceforge.net/projects/firststrikegame/files/"], ["Freeciv", "http://www.freeciv.org/download.html"], ["Freeciv WebGL", ""], ["FreeCol", "http://www.freecol.org/download.html"], ["FreeLords", "https://sourceforge.net/projects/freelords/files"], ["Free Orion", "http://www.freeorion.org/index.php/Download"], ["FreeRails", "https://sourceforge.net/projects/freerails/files/jfreerails/"], ["FreeRCT", ""], ["Freeserf", "https://github.com/freeserf/freeserf/releases"], ["Free Space Colonization", "https://sourceforge.net/projects/fsc/files"], ["Freestars", ""], ["Free heroes2 engine", "https://sourceforge.net/projects/fheroes2/files/fheroes2/"], ["Free Space Colonization", "https://sourceforge.net/projects/fsc/files"], ["FreeSynd", "https://sourceforge.net/projects/freesynd/files/"], ["GalaxyNG", "https://sourceforge.net/projects/galaxyng/files"], ["Gigalomania", ""], ["Glest", "http://glest.org/en/downloads.php"], ["Globulation2", "https://globulation2.org/wiki/Download_and_Install"], ["Goblin Camp", "see dome"], ["Harris", ""], ["Heroes of Wesnoth", ""], ["Heroes of Wing Commander", "https://sourceforge.net/projects/howc/files"], ["Hexwar", ""], ["Jagged Alliance 2 Stracciatella", ""], ["JQuest", "https://sourceforge.net/projects/jquest/files"], ["JSettlers", "https://sourceforge.net/projects/jsettlers/files/"], ["KAtomic", ""], ["Kingdoms", ""], ["Knights and Merchants Remake", "http://www.kamremake.com/download/"], ["LGeneral", ""], ["LordsAWar!", ""], ["Machinations", "https://sourceforge.net/projects/machinations/"], ["Mars, Land of No Mercy", "https://sourceforge.net/projects/mars/files"], ["Mechanized Assault & eXploration Reloaded ", "https://www.maxr.org/docs.php?id=3"], ["MegaGlest", "https://megaglest.org/download"], ["Megamek", "https://www.megamek.org/downloads"], ["Mercenary Commander", ""], ["Metal Mech", "https://sourceforge.net/projects/metalmech/files"], ["M.E.W.L.", ""], ["Moopy", ""], ["Mpango", "https://sourceforge.net/projects/mpango/files/"], ["NetPanzer", "http://www.netpanzer.info/Download/"], ["Open Apocalypse", "https://ci.appveyor.com/project/openapoc/openapoc"], ["Open Dune", "https://github.com/OpenDUNE/OpenDUNE/releases"], ["Open General", "https://sourceforge.net/projects/opengeneral/files/"], ["OpenHoMM", "https://launchpad.net/openhomm/+download"], ["Open Imperium Galactica", "https://github.com/akarnokd/open-ig/releases"], ["OpenMOO2", "http://openmoo2.org/en/download"], ["Open Panzer", ""], ["OpenPop", "https://sourceforge.net/projects/openpopulous/files"], ["OpenRA", "http://www.openra.net/download/"], ["OpenRCT2", "https://openrct2.org/downloads"], ["OpenSoccer", ""], ["Open Soccer Star", ""], ["OpenWebSoccer-Sim", "https://github.com/ihofmann/open-websoccer/releases"], ["OpenXcom", "https://openxcom.org/downloads-milestones/"], ["Operation Citadel", "https://sourceforge.net/projects/kursk/files"], ["Outer Space", "https://sourceforge.net/projects/ospace/"], ["Pax Britannica", ""], ["Pioneers", "https://sourceforge.net/projects/pio/files"], ["Pizza Business", "https://sourceforge.net/projects/pizza-business/files"], ["Planetary Hoppers", "https://sourceforge.net/projects/planets/files"], ["Polis", ""], ["Project Helena", "https://sourceforge.net/projects/projecthelena/files"], ["Promisance", "https://sourceforge.net/projects/promisance/files"], ["Return to the Roots", "https://www.siedler25.org/index.php?com=dynamic&mod=2"], ["Scorched Moon", ""], ["Scoreos", ""], ["Sengoku: Warring States of Japan", "https://sourceforge.net/projects/sengdokuwsj/files"], ["Settlers III remake", "https://github.com/jsettlers/settlers-remake/releases"], ["Simple-Solitaire", ""], ["Endgame: Singularity", ""], ["Skrupel - Tribute Compilation", "https://sourceforge.net/projects/skrupel/files"], ["Slay", "https://sourceforge.net/projects/slaygame/files"], ["Solar Empire", "https://sourceforge.net/projects/solar-empire/files"], ["Song of Albion", ""], ["Space Faring", "https://sourceforge.net/projects/space-faring/files"], ["Space Opera", "https://sourceforge.net/projects/spaceopera/files"], ["SpaceTrader for Java", "https://sourceforge.net/projects/spacetraderjava/files"], ["Space Trader for Windows", "https://sourceforge.net/projects/spacetraderwin/files"], ["Space War", "https://sourceforge.net/projects/space-war-2/files/"], ["Spring RTS engine", "https://springrts.com/wiki/Download"], ["Stars! Nova", "https://sourceforge.net/projects/stars-nova/files"], ["Star Control II: The Ur-Quan Masters", "http://sc2.sourceforge.net/downloads.php"], ["Supremacy", ""], ["Tanks of Freedom", ""], ["Corsix Theme Hospital", "https://github.com/CorsixTH/CorsixTH/releases"], ["Thousand Parsec", "http://www.thousandparsec.net/tp/download-instructions.php"], ["TripleA", "http://triplea-game.org/download/"], ["Turious", ""], ["Turn of War", ""], ["TVTower", ""], ["T-Bots", "https://sourceforge.net/projects/tbots/files"], ["UFO2000", ""], ["Ufo: Alien Invasion", "https://ufoai.org/wiki/Download"], ["Unknown Horizons", "http://unknown-horizons.org/downloads/"], ["VCMI Project", ""], ["WarGame", ""], ["Wargamer", "https://sourceforge.net/projects/wargamer/files/"], ["Wargus", "http://wargus.stratagus.com/download.shtml"], ["Warzone 2100", "https://sourceforge.net/projects/warzone2100/files/releases/"], ["War Of Kingdom", ""], ["WAtomic", "https://sourceforge.net/projects/watomic/files/"], ["Battle for Wesnoth", "http://www.wesnoth.org/#download"], ["Widelands", "https://wl.widelands.org/wiki/Download/"], ["Wizards Magic", "https://code.google.com/archive/p/wizards-magic/downloads"], ["Wolfpack Empire", "https://sourceforge.net/projects/empserver/files/"], ["World of Heroes", "https://sourceforge.net/projects/worldofheroes/files/WOH%20v0.4.2/"], ["Wyrmsun", "https://store.steampowered.com/app/370070/Wyrmsun/"], ["X-Force: Fight For Destiny", "https://sourceforge.net/projects/xforceffd/files"], ["XArchon", "http://xarchon.seul.org/download.html"], ["Xconq", "https://sourceware.org/xconq/ftp.html"], ["Xenowar", ""], ["XSera", ""], ["Zero-K", "http://zero-k.info/Wiki/Download"], ["Zetawar", ""], ["Zone of Control", "https://github.com/ozkriff/zoc/releases"]]} \ No newline at end of file +{"headings": ["Name", "Download"], "data": [["Astromenace", "https://www.viewizard.com/download.html"], ["Cat Mother Dead Justice", "https://sourceforge.net/projects/catmother/files/"], ["CommandoJS", ""], ["Epiar", ""], ["GDash", "https://bitbucket.org/czirkoszoltan/gdash/downloads/"], ["Linwarrior 3D", "http://www.hackcraft.de/games/linwarrior_3d/downloads.htm"], ["MechCommander 2 Omnitech", ""], ["Open Sonic", "http://opensnc.sourceforge.net/home/download.php"], ["Open Zelda", ""], ["Red Eclipse", "https://www.redeclipse.net/download"], ["Rocks'n'Diamonds ", "http://www.artsoft.org/rocksndiamonds/download/"], ["Secret Mario Chronicles", "https://sourceforge.net/projects/smclone/files"], ["Smash", ""], ["Speed Dreams", "http://www.speed-dreams.org/#download"], ["SuperTuxKart", "https://supertuxkart.net/Download"], ["Tux Racer", "https://sourceforge.net/projects/tuxracer/files/"], ["Xonotic", "http://www.xonotic.org/download/"], ["AdaVenture", "https://github.com/fastrgv/AdaVenture/releases"], ["Camelia Girls", "https://web.archive.org/web/20140107152141/http://pigux.com:80/cameliagirls/download.html"], ["Clou!", "https://sourceforge.net/projects/cosp/files/"], ["Colossal Cave Adventure", ""], ["Digital: A Love Story", ""], ["Dragon History", ""], ["Fanwor", ""], ["Free in the Dark (engine)", ""], ["GameLV", ""], ["Murder In The Public Domain", "https://sourceforge.net/projects/murderpd/files/"], ["Sentient Storage", ""], ["Sintel The Game", ""], ["Solaris the Game", "https://sourceforge.net/projects/solaristhegame/files/"], ["Star Maiden Rio", "http://www.mediafire.com/file/jog3fcfxgsyd03f/Astraea_Rio-1.05-all.zip"], ["TwinEngine", ""], ["Visions from the Other Side", ""], ["Allegro", "http://liballeg.org/download.html"], ["Annchienta", "https://sourceforge.net/projects/annchienta/files/annchienta/current/"], ["Arianne / Marauroa", "https://arianne-project.org/engine/marauroa.html"], ["Atlantis", "https://sourceforge.net/projects/atlantis/files/Atlantis%204/Release%204.1.0/"], ["Blender game engine", "https://www.blender.org/download/"], ["COCOS2D-X", "http://cocos2d-x.org/download"], ["Dash Engine", ""], ["Delta Engine", "http://www.deltaengine.net/download"], ["EasyRPG Player", "https://easyrpg.org/player/downloads/"], ["ENIGMA", "https://enigma-dev.org/download.htm"], ["Flare Engine", "http://www.flarerpg.org/ https://github.com/clintbellanger/flare-engine/releases"], ["Flixel", "http://flixel.org/download.html"], ["GemRB", "http://www.gemrb.org/wiki/doku.php?id=download"], ["Godot", "https://godotengine.org/download"], ["HaxeFlixel", "http://haxeflixel.com/download/"], ["H-World", "https://sourceforge.net/projects/h-world/files/"], ["Irrlicht Engine", "http://irrlicht.sourceforge.net/?page_id=10"], ["JiGS Interactive Game System", ""], ["jMonkeyEngine", "https://github.com/jMonkeyEngine/sdk/releases"], ["libGDX", "http://libgdx.badlogicgames.com/download.html"], ["L\u00d6VE", ""], ["Lumix Engine", "https://github.com/nem0/LumixEngine/releases"], ["Lightweight Java Game Library", "https://www.lwjgl.org/download"], ["Mana", "http://www.manasource.org/downloads.html"], ["Maratis", "http://www.maratis3d.org/?page_id=57"], ["mkxp", ""], ["MonoGame", "http://www.monogame.net/downloads/"], ["Octaforge", "https://octaforge.org/page/downloads"], ["OGRE3D", "https://www.ogre3d.org/download/sdk"], ["O.H.R.RPG.C.E", "http://rpg.hamsterrepublic.com/ohrrpgce/Downloads"], ["OpenFL", "http://www.openfl.org/learn/docs/getting-started/"], ["OpenRPG", "http://www.rpgobjects.com/index.php?c=orpg&m=getorpg"], ["Open RPG Maker", "https://sourceforge.net/projects/openrpgmaker/files/"], ["Orx", "https://github.com/orx/orx/releases"], ["Panda 3D", "http://www.panda3d.org/download.php"], ["Polycode", "http://polycode.org/download/"], ["pygame", "http://www.pygame.org/download.shtml"], ["pyORPG", ""], ["Qt", "https://www1.qt.io/download-open-source/"], ["Quad-engine", "http://quad-engine.com/downloads.html"], ["rpge", ""], ["sandbox Game Maker", "http://www.sandboxgamemaker.com/free-game-maker-download/"], ["ScummVM", "http://www.scummvm.org/downloads/"], ["SDL Game Engine 2D", "https://sourceforge.net/projects/sge2d/files/sge2d/"], ["Solarus", "http://www.solarus-games.org/engine/download/"], ["Superpowers", "https://sparklinlabs.itch.io/superpowers"], ["Terasology", ""], ["Urho3D", "https://sourceforge.net/projects/urho3d/files/Urho3D/"], ["Vega Strike", "http://vegastrike.sourceforge.net/getfiles/"], ["WorldForge", "https://www.worldforge.org/index.php/downloads/"], ["xoreos", "https://xoreos.org/downloads/index.html"], ["ZGameEditor", "http://www.zgameeditor.org/index.php/Main/Download"], ["Boost (C++ Libraries)", "http://www.boost.org/users/download/"], ["Crypto++", "https://cryptopp.com/#download"], ["Doxygen", "http://www.stack.nl/~dimitri/doxygen/download.html"], ["FreeType", "https://www.freetype.org/download.html"], ["HarfBuzz", ""], ["libpng", ""], ["Libxml2", "http://www.xmlsoft.org/downloads.html"], ["Lua", "http://www.lua.org/download.html"], ["LZMA SDK", "http://7-zip.org/download.html http://7-zip.org/sdk.html"], ["OpenSSL", "https://www.openssl.org/source/"], ["Open AL", ""], ["Open AL Soft", ""], ["pkg-config", "https://pkg-config.freedesktop.org/releases/"], ["Pthreads-win32", ""], ["Ragel", ""], ["Simple DirectMedia Layer", "https://www.libsdl.org/download-2.0.php"], ["Simple and Fast Multimedia Library", "https://www.sfml-dev.org/download.php"], ["SWIG", "http://www.swig.org/download.html"], ["wxWidgets", "http://wxwidgets.org/downloads/"], ["XZ Utils", ""], ["yaml-cpp", ""], ["zlib", ""], ["AutoREALM", "https://sourceforge.net/projects/autorealm/files"], ["Deity", "https://sourceforge.net/projects/deity/files"], ["Dungeon Mapper", "https://sourceforge.net/projects/dungeonmap/files"], ["GM Tools", "https://sourceforge.net/projects/gm-tools/files"], ["JaNaG - Java Name Generator", "https://sourceforge.net/projects/janag.berlios/files"], ["Open Legend RPG", ""], ["PCGen", "http://pcgen.org/download/"], ["Pymapper", "http://pymapper.com/downloads/"], ["Rolemaster Office", "https://sourceforge.net/projects/rmoffice/files"], ["Rolisteam", "http://www.rolisteam.org/download.html"], ["RPDungeon - computer aided role playing", "https://sourceforge.net/projects/rpdungeon/files"], ["sCoreForge Pathfinder Character Creator", "https://sourceforge.net/projects/scoreforge/files/"], ["Andor's Trail", "https://f-droid.org/packages/com.gpl.rpg.AndorsTrail/"], ["Angband", "http://rephial.org/release/"], ["Ardentryst", "http://www.jordantrudgett.com/ardentryst/ardentryst-downloads/"], ["Argentum Online", "http://www.comunidadargentum.com/descargas/"], ["Arx Libertatis", "http://wiki.arx-libertatis.org/Download"], ["Atrinik", ""], ["Avanor", "https://sourceforge.net/projects/avanor/files"], ["Betrayer's Moon Tactics", "https://sourceforge.net/projects/bm-game/files"], ["Classic Blades of Exile", ""], ["BrowserQuest", ""], ["Castle of the Winds", ""], ["Cataclysm", ""], ["Catch Challenger", "https://catchchallenger.first-world.info/download.html"], ["Choria", ""], ["Crossfire", "http://crossfire.real-time.com/download/index.html"], ["Daimonin", "https://www.daimonin.org/downloads/"], ["Dark City", "https://sourceforge.net/projects/darkcity/files/"], ["Dawn", ""], ["Decker", "https://sourceforge.net/projects/decker/files"], ["Deliantra", "http://www.deliantra.net/play.html"], ["DemiGod", ""], ["diablo-js", ""], ["DNT", "http://dnt.dnteam.org/cgi-bin/downloads.py"], ["Dragon Hunt", ""], ["Dungeon Crawl Stone Soup", "http://crawl.develz.org/download.htm"], ["Dungeon Hero", "https://play.google.com/store/apps/details?id=com.glevel.dungeonhero"], ["Dungeon Monkey Eternal", ""], ["Dungeon Quest", "https://play.google.com/store/apps/details?id=com.giggs.heroquest"], ["Egoboo", "http://egoboo.sourceforge.net/download.html"], ["Endless Sky", "https://github.com/endless-sky/endless-sky/releases"], ["Eos, Dawn of Light: A Space Opera", "https://sourceforge.net/projects/eos-game/files"], ["Erebus", "http://erebusrpg.sourceforge.net/#download"], ["Eternal Lands", "http://www.eternal-lands.com/page/download.php"], ["Evol Online", "http://evolonline.org/manaplus"], ["Exult", "http://exult.sourceforge.net/download.php"], ["Fallen Spire", ""], ["Fall of Imyrin", "https://sourceforge.net/projects/annchienta/files/annchienta/current/"], ["Freedink", "https://www.gnu.org/software/freedink/get"], ["FreedroidRPG", "http://www.freedroid.org/download/"], ["GalaxyMage Redux", ""], ["GearHead", "http://www.gearheadrpg.com/downloads/"], ["Gee Whiz", "http://icculus.org/gwiz/download.php"], ["Goblin Hack", "https://sourceforge.net/projects/goblinhack/files/"], ["Hale", "https://sourceforge.net/projects/hale/files/"], ["Haxima", "https://sourceforge.net/projects/nazghul/files"], ["Hero of Allacrost", "https://bitbucket.org/allacrost/allacrost/downloads/"], ["Holyspirit", "https://sourceforge.net/projects/lechemindeladam/files"], ["Ilarion", "http://illarion.org/illarion/de_java_download.php"], ["Imperium", "https://empiredirectory.net/index.php/new-downloads"], ["Iter Vehemens ad Necem", "https://sourceforge.net/projects/ivan/files/"], ["The hunt for the lost rainbow jewels (Jewelhunt)", "https://sourceforge.net/projects/jewelhunt/files"], ["Kobold's Quest 2", "https://sourceforge.net/projects/koboldsquest2/files/"], ["KQ Lives", "https://sourceforge.net/projects/kqlives/files/"], ["Labyrinth of Worlds", "https://sourceforge.net/projects/low/files"], ["Land of Fire", ""], ["Linley's Dungeon Crawl", "http://www.dungeoncrawl.org/?d"], ["Lips of Suna", ""], ["Magarena", "https://github.com/magarena/magarena/releases/"], ["The Mana World", "https://www.themanaworld.org/index.php/Downloads"], ["Meridian 59", "http://meridian59.com/play-now.php"], ["Meritous", ""], ["Moria", "http://beej.us/moria/files/"], ["Naev", "http://blog.naev.org/downloads/"], ["NetHack", "https://www.nethack.org/common/index.html"], ["NLarn", "https://github.com/nlarn/nlarn/releases"], ["Openglad", "http://snowstorm.sourceforge.net/cgi-bin/site.cgi?page=download"], ["Open Meridian", "http://openmeridian.org/create-account/"], ["OpenMW", "https://openmw.org/downloads/"], ["Open Tibia", "https://sourceforge.net/projects/opentibia/files/"], ["ORIENT", "https://sourceforge.net/projects/orient-ecircus/files"], ["Other-Life", "http://www.other-life.com/downloads.php"], ["PARPG", "http://blog.parpg.net/download/"], ["Phantasy Star Rebirth", "https://sourceforge.net/projects/phantasy/files"], ["PlaneShift", "http://www.planeshift.it/Download"], ["Project Diaspora", "https://sourceforge.net/projects/pdiaspora/files/"], ["Radakan", "https://sourceforge.net/projects/radakan/files/"], ["REGoth", "https://github.com/REGoth-project/REGoth/releases"], ["Rogue Clone IV", "https://sourceforge.net/projects/rogueclone/files/rogue%20clone/"], ["Roguish", ""], ["Room for Change", ""], ["RuneSword II", "https://sourceforge.net/projects/runesword/files/"], ["S.C.O.U.R.G.E.", "https://sourceforge.net/projects/scourge/files"], ["Silvertree", "https://code.google.com/archive/p/silvertree/downloads"], ["Slash'EM", "http://slashem.sourceforge.net/stable.html"], ["Source of Tales", ""], ["Space Station 13", ""], ["Spice Trade", "https://sourceforge.net/projects/spicetrade/files/"], ["Stendhal", ""], ["Story of a Lost Sky", "https://bitbucket.org/featheredmelody/lost-sky-project-public/downloads/"], ["Summoning Wars", ""], ["Tales of Maj'Eyal", "https://te4.org/download"], ["The Clans", "https://sourceforge.net/projects/theclans/files"], ["Trinity Reign", ""], ["Tuxemon", "https://www.tuxemon.org/download.html"], ["UlDunAd", ""], ["Umbra", "http://markdamonhughes.com/Umbra/#download"], ["Underworld Adventures", "http://uwadv.sourceforge.net/index.php?page=download"], ["UnNetHack", "https://sourceforge.net/projects/unnethack/files/unnethack/"], ["Valyria Tear", "https://valyriatear.blogspot.de/p/downloads.html"], ["VegaTrek", "https://sourceforge.net/projects/vegatrek/files/vegatrek%200.6/"], ["Waste's Edge", ""], ["Witch Blast", "https://github.com/Cirrus-Minor/witchblast/releases"], ["World of Phaos", "https://sourceforge.net/projects/phaosrpg/files/"], ["XU4", "http://xu4.sourceforge.net/download.php"], ["ZAngband", "https://sourceforge.net/projects/zangband/files/"], ["Zelda: Mystery of Solarus DX", ""], ["3d.city", ""], ["Danger from the Deep", "http://dangerdeep.sourceforge.net/downloads/"], ["Freeminer", ""], ["FreeTrain", "https://sourceforge.net/projects/freetrain/files/"], ["LinCity", ""], ["LinCity-NG", "https://sourceforge.net/projects/lincity-ng.berlios/files/"], ["Micropolis", "can be played online"], ["micropolisJS", ""], ["OpenCity", "http://www.opencity.info/en/Download.html"], ["Open Rails", "http://openrails.org/download/program/"], ["OpenSkyscraper", ""], ["Open Transport Tycoon", "http://www.openttd.org/en/download-stable"], ["Our Personal Space", ""], ["Pioneer", "https://pioneerspacesim.net/download"], ["SimuTrans", "http://www.simutrans.de/download"], ["0AD", "https://play0ad.com/download/"], ["8 Kingdoms", "https://sourceforge.net/projects/kralovstvi/files/Legacy/8%20Kingdoms%201.1.0/"], ["Age of Magic", "https://sourceforge.net/projects/ageofmagic/files/"], ["AI Wars", ""], ["Alien Assault Traders", "https://sourceforge.net/projects/aatrade/files/AATraders%200.4x/"], ["Ancient Beast", ""], ["Antares", ""], ["AntiChess", "https://sourceforge.net/projects/antichess/files/antichess/1.0/"], ["Armies", "https://sourceforge.net/projects/armies/files/"], ["Arthur's Knights", "https://sourceforge.net/projects/king-arthur/files/king-arthur/Alpha%200.3/"], ["Advanced Strategic Command", ""], ["Atomiks", "https://sourceforge.net/projects/atomiks/files"], ["Atomix", ""], ["Attal", "https://sourceforge.net/projects/attal/files/Attal/"], ["A Planet's Revenge", "https://sourceforge.net/projects/aplanetsrevenge/files/aplanetsrevenge/apr-1.0-alpha/"], ["Battlefield Java", "https://sourceforge.net/projects/battlefieldjava/files/battlefieldjava/"], ["Battles of Antargis", ""], ["Begin2", "https://sourceforge.net/projects/begin2/files/begin2/0.93/"], ["Birth of the Empires", "http://loadion.com/en/Birth-of-the-Empires_6681499.html"], ["BlackNova Traders", "https://sourceforge.net/projects/blacknova/files"], ["Blitzkrieg", "https://sourceforge.net/projects/blitzkrieg/files/developpement/"], ["Boson", "http://boson.sourceforge.net/download.php"], ["Bos Wars", "https://www.boswars.org/download.shtml"], ["Bygfoot", "https://sourceforge.net/projects/bygfoot/files/"], ["Caesar IA", "https://bitbucket.org/dalerank/caesaria/wiki/Releases"], ["Call to Power 2", ""], ["Civil", "http://civil.sourceforge.net/download.html"], ["Greenius' Civil War", ""], ["CivOne", "https://www.civone.org/Download"], ["Colobot", "https://colobot.info/download-colobot-gold/"], ["Colonization too", "https://sourceforge.net/projects/coltoo/files/"], ["Conquests", "https://launchpad.net/conquests/+download"], ["Crimson Fields", "http://crimson.seul.org/download.php"], ["Crown and Cutless", "https://sourceforge.net/projects/crownandcutlass/files/crownandcutlass/"], ["C-evo", "http://www.c-evo.org/files/files.php"], ["Dark Destiny", ""], ["Dark Oberon", "http://dark-oberon.sourceforge.net/?page=download"], ["Devana", "https://sourceforge.net/projects/devana/files"], ["Drop Shock", ""], ["Duel Commander", "https://sourceforge.net/projects/duelcommander/files"], ["Dune Dynasty", "https://sourceforge.net/projects/dunedynasty"], ["Dune II - The Maker", "http://dune2themaker.fundynamic.com/?page_id=11"], ["Dune Legacy", "http://dunelegacy.sourceforge.net/website/downloads.html"], ["Eleconics", "https://sourceforge.net/projects/eleconics/files"], ["The Epic of Heroes", "https://sourceforge.net/projects/epicheroes/files"], ["EPOH", ""], ["EternalWinterWars", ""], ["Evil Cult", ""], ["FAR Colony", ""], ["First Strike", "https://sourceforge.net/projects/firststrikegame/files/"], ["Freeciv", "http://www.freeciv.org/download.html"], ["Freeciv WebGL", ""], ["FreeCol", "http://www.freecol.org/download.html"], ["FreeLords", "https://sourceforge.net/projects/freelords/files"], ["Free Orion", "http://www.freeorion.org/index.php/Download"], ["FreeRails", "https://sourceforge.net/projects/freerails/files/jfreerails/"], ["FreeRCT", ""], ["Freeserf", "https://github.com/freeserf/freeserf/releases"], ["Free Space Colonization", "https://sourceforge.net/projects/fsc/files"], ["Freestars", ""], ["Free heroes2 engine", "https://sourceforge.net/projects/fheroes2/files/fheroes2/"], ["Free Space Colonization", "https://sourceforge.net/projects/fsc/files"], ["FreeSynd", "https://sourceforge.net/projects/freesynd/files/"], ["GalaxyNG", "https://sourceforge.net/projects/galaxyng/files"], ["Gigalomania", ""], ["Glest", "http://glest.org/en/downloads.php"], ["Globulation2", "https://globulation2.org/wiki/Download_and_Install"], ["Goblin Camp", "see dome"], ["Harris", ""], ["Heroes of Wesnoth", ""], ["Heroes of Wing Commander", "https://sourceforge.net/projects/howc/files"], ["Hexwar", ""], ["Jagged Alliance 2 Stracciatella", ""], ["JQuest", "https://sourceforge.net/projects/jquest/files"], ["JSettlers", "https://sourceforge.net/projects/jsettlers/files/"], ["KAtomic", ""], ["Kingdoms", ""], ["Knights and Merchants Remake", "http://www.kamremake.com/download/"], ["LGeneral", ""], ["LordsAWar!", ""], ["Machinations", "https://sourceforge.net/projects/machinations/"], ["Mars, Land of No Mercy", "https://sourceforge.net/projects/mars/files"], ["Mechanized Assault & eXploration Reloaded ", "https://www.maxr.org/docs.php?id=3"], ["MegaGlest", "https://megaglest.org/download"], ["Megamek", "https://www.megamek.org/downloads"], ["Mercenary Commander", ""], ["Metal Mech", "https://sourceforge.net/projects/metalmech/files"], ["M.E.W.L.", ""], ["Moopy", ""], ["Mpango", "https://sourceforge.net/projects/mpango/files/"], ["NetPanzer", "http://www.netpanzer.info/Download/"], ["Open Apocalypse", "https://ci.appveyor.com/project/openapoc/openapoc"], ["Open Dune", "https://github.com/OpenDUNE/OpenDUNE/releases"], ["Open General", "http://www.open-general.com/installer.php"], ["OpenHoMM", "https://launchpad.net/openhomm/+download"], ["Open Imperium Galactica", "https://github.com/akarnokd/open-ig/releases"], ["OpenMOO2", "http://openmoo2.org/en/download"], ["Open Panzer", ""], ["OpenPop", "https://sourceforge.net/projects/openpopulous/files"], ["OpenRA", "http://www.openra.net/download/"], ["OpenRCT2", "https://openrct2.org/downloads"], ["OpenSoccer", ""], ["Open Soccer Star", ""], ["OpenWebSoccer-Sim", "https://github.com/ihofmann/open-websoccer/releases"], ["OpenXcom", "https://openxcom.org/downloads-milestones/"], ["Operation Citadel", "https://sourceforge.net/projects/kursk/files"], ["Outer Space", "https://sourceforge.net/projects/ospace/"], ["Pax Britannica", ""], ["Pioneers", "https://sourceforge.net/projects/pio/files"], ["Pizza Business", "https://sourceforge.net/projects/pizza-business/files"], ["Planetary Hoppers", "https://sourceforge.net/projects/planets/files"], ["Polis", ""], ["Project Helena", "https://sourceforge.net/projects/projecthelena/files"], ["Promisance", "https://sourceforge.net/projects/promisance/files"], ["Return to the Roots", "https://www.siedler25.org/index.php?com=dynamic&mod=2"], ["Scorched Moon", ""], ["Scoreos", ""], ["Sengoku: Warring States of Japan", "https://sourceforge.net/projects/sengdokuwsj/files"], ["Settlers III remake", "https://github.com/jsettlers/settlers-remake/releases"], ["Simple-Solitaire", ""], ["Endgame: Singularity", ""], ["Skrupel - Tribute Compilation", "https://sourceforge.net/projects/skrupel/files"], ["Slay", "https://sourceforge.net/projects/slaygame/files"], ["Solar Empire", "https://sourceforge.net/projects/solar-empire/files"], ["Song of Albion", ""], ["Space Faring", "https://sourceforge.net/projects/space-faring/files"], ["Space Opera", "https://sourceforge.net/projects/spaceopera/files"], ["SpaceTrader for Java", "https://sourceforge.net/projects/spacetraderjava/files"], ["Space Trader for Windows", "https://sourceforge.net/projects/spacetraderwin/files"], ["Space War", "https://sourceforge.net/projects/space-war-2/files/"], ["Spring RTS engine", "https://springrts.com/wiki/Download"], ["Stars! Nova", "https://sourceforge.net/projects/stars-nova/files"], ["Star Control II: The Ur-Quan Masters", "http://sc2.sourceforge.net/downloads.php"], ["Supremacy", ""], ["Tanks of Freedom", ""], ["Corsix Theme Hospital", "https://github.com/CorsixTH/CorsixTH/releases"], ["Thousand Parsec", "http://www.thousandparsec.net/tp/download-instructions.php"], ["TripleA", "http://triplea-game.org/download/"], ["Turious", ""], ["Turn of War", ""], ["TVTower", ""], ["T-Bots", "https://sourceforge.net/projects/tbots/files"], ["UFO2000", ""], ["Ufo: Alien Invasion", "https://ufoai.org/wiki/Download"], ["Unknown Horizons", "http://unknown-horizons.org/downloads/"], ["VCMI Project", ""], ["WarGame", ""], ["Wargamer", "https://sourceforge.net/projects/wargamer/files/"], ["Wargus", "http://wargus.stratagus.com/download.shtml"], ["Warzone 2100", "https://sourceforge.net/projects/warzone2100/files/releases/"], ["War Of Kingdom", ""], ["WAtomic", "https://sourceforge.net/projects/watomic/files/"], ["Battle for Wesnoth", "http://www.wesnoth.org/#download"], ["Widelands", "https://wl.widelands.org/wiki/Download/"], ["Wizards Magic", "https://code.google.com/archive/p/wizards-magic/downloads"], ["Wolfpack Empire", "https://sourceforge.net/projects/empserver/files/"], ["World of Heroes", "https://sourceforge.net/projects/worldofheroes/files/WOH%20v0.4.2/"], ["Wyrmsun", "https://store.steampowered.com/app/370070/Wyrmsun/"], ["X-Force: Fight For Destiny", "https://sourceforge.net/projects/xforceffd/files"], ["XArchon", "http://xarchon.seul.org/download.html"], ["Xconq", "https://sourceware.org/xconq/ftp.html"], ["Xenowar", ""], ["XSera", ""], ["Zero-K", "http://zero-k.info/Wiki/Download"], ["Zetawar", ""], ["Zone of Control", "https://github.com/ozkriff/zoc/releases"]]} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index e6d102e5..a7b92e7f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,9 +1,10 @@ + - + Open Source Games List - - + +
diff --git a/docs/vanilla-dataTables.css b/docs/vanilla-dataTables.css new file mode 100644 index 00000000..07d11171 --- /dev/null +++ b/docs/vanilla-dataTables.css @@ -0,0 +1,178 @@ +/*! + * + * Vanilla-DataTables + * Copyright (c) 2015-2017 Karl Saunders (http://mobius.ovh) + * Licensed under MIT (http://www.opensource.org/licenses/mit-license.php) + * + * Version: 1.6.13 + * + */ + +.dataTable-wrapper.no-header .dataTable-container { + border-top: 1px solid #d9d9d9; +} + +.dataTable-wrapper.no-footer .dataTable-container { + border-bottom: 1px solid #d9d9d9; +} + +.dataTable-top, +.dataTable-bottom { + padding: 8px 10px; +} + +.dataTable-top > div:first-child, +.dataTable-bottom > div:first-child { + float: left; +} + +.dataTable-top > div:last-child, +.dataTable-bottom > div:last-child { + float: right; +} + +.dataTable-selector { + padding: 6px; +} + +.dataTable-input { + padding: 6px 12px; +} + +.dataTable-info { + margin: 7px 0; +} + +/* PAGER */ +.dataTable-pagination ul { + margin: 0; + padding-left: 0; +} + +.dataTable-pagination li { + list-style: none; + float: left; +} + +.dataTable-pagination a { + border: 1px solid transparent; + float: left; + margin-left: 2px; + padding: 6px 12px; + position: relative; + text-decoration: none; + color: #333; +} + +.dataTable-pagination a:hover { + background-color: #d9d9d9; +} + +.dataTable-pagination .active a, +.dataTable-pagination .active a:focus, +.dataTable-pagination .active a:hover { + background-color: #d9d9d9; + cursor: default; +} + +.dataTable-pagination .ellipsis a, +.dataTable-pagination .disabled a, +.dataTable-pagination .disabled a:focus, +.dataTable-pagination .disabled a:hover { + cursor: not-allowed; +} + +.dataTable-pagination .disabled a, +.dataTable-pagination .disabled a:focus, +.dataTable-pagination .disabled a:hover { + cursor: not-allowed; + opacity: 0.4; +} + +.dataTable-pagination .pager a { + font-weight: bold; +} + +/* TABLE */ +.dataTable-table { + max-width: 100%; + width: 100%; + border-spacing: 0; +} + +.dataTable-table > tbody > tr > td, +.dataTable-table > tbody > tr > th, +.dataTable-table > tfoot > tr > td, +.dataTable-table > tfoot > tr > th, +.dataTable-table > thead > tr > td, +.dataTable-table > thead > tr > th { + vertical-align: top; + padding: 8px 10px; +} + +.dataTable-table > thead > tr > th { + vertical-align: bottom; + text-align: left; + border-bottom: 1px solid #d9d9d9; +} + +.dataTable-table > tfoot > tr > th { + vertical-align: bottom; + text-align: left; + border-top: 1px solid #d9d9d9; +} + +.dataTable-table th { + vertical-align: bottom; + text-align: left; +} + +.dataTable-table th a { + text-decoration: none; + color: inherit; +} + +.dataTable-sorter { + display: inline-block; + height: 100%; + position: relative; + width: 100%; +} + +.dataTable-sorter::before, +.dataTable-sorter::after { + content: ""; + height: 0; + width: 0; + position: absolute; + right: 4px; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + opacity: 0.2; +} + +.dataTable-sorter::before { + border-top: 4px solid #000; + bottom: 10px; +} + +.dataTable-sorter::after { + border-bottom: 4px solid #000; + border-top: 4px solid transparent; + top: 0px; +} + +.asc .dataTable-sorter::after, +.desc .dataTable-sorter::before { + opacity: 0.6; +} + +.dataTables-empty { + text-align: center; +} + +.dataTable-top::after, .dataTable-bottom::after { + clear: both; + content: " "; + display: table; +} \ No newline at end of file diff --git a/docs/vanilla-dataTables.js b/docs/vanilla-dataTables.js new file mode 100644 index 00000000..2453d7a5 --- /dev/null +++ b/docs/vanilla-dataTables.js @@ -0,0 +1,2426 @@ +/*! + * + * Vanilla-DataTables + * Copyright (c) 2015-2017 Karl Saunders (http://mobius.ovh) + * Licensed under MIT (http://www.opensource.org/licenses/mit-license.php) + * + * Version: 1.6.13 + * + */ +(function(root, factory) { + var plugin = "DataTable"; + + if (typeof exports === "object") { + module.exports = factory(plugin); + } else if (typeof define === "function" && define.amd) { + define([], factory(plugin)); + } else { + root[plugin] = factory(plugin); + } +})(typeof global !== 'undefined' ? global : this.window || this.global, function(plugin) { + "use strict"; + var win = window, + doc = document, + body = doc.body; + + /** + * Default configuration + * @typ {Object} + */ + var defaultConfig = { + perPage: 10, + perPageSelect: [5, 10, 15, 20, 25], + + sortable: true, + searchable: true, + + // Pagination + nextPrev: true, + firstLast: false, + prevText: "‹", + nextText: "›", + firstText: "«", + lastText: "»", + ellipsisText: "…", + ascText: "▴", + descText: "▾", + truncatePager: true, + pagerDelta: 2, + + fixedColumns: true, + fixedHeight: false, + + header: true, + footer: false, + + // Customise the display text + labels: { + placeholder: "Search...", // The search input placeholder + perPage: "{select} entries per page", // per-page dropdown label + noRows: "No entries found", // Message shown when there are no search results + info: "Showing {start} to {end} of {rows} entries" // + }, + + // Customise the layout + layout: { + top: "{select}{search}", + bottom: "{info}{pager}" + } + }; + + /** + * Check is item is object + * @return {Boolean} + */ + var isObject = function (val) { + return Object.prototype.toString.call(val) === "[object Object]"; + }; + + /** + * Check is item is array + * @return {Boolean} + */ + var isArray = function (val) { + return Array.isArray(val); + }; + + /** + * Check for valid JSON string + * @param {String} str + * @return {Boolean|Array|Object} + */ + var isJson = function (str) { + var t = !1; + try { + t = JSON.parse(str); + } catch (e) { + return !1; + } + return !(null === t || (!isArray(t) && !isObject(t))) && t; + }; + + /** + * Merge objects (reccursive) + * @param {Object} r + * @param {Object} t + * @return {Object} + */ + var extend = function (src, props) { + for (var prop in props) { + if (props.hasOwnProperty(prop)) { + var val = props[prop]; + if (val && isObject(val)) { + src[prop] = src[prop] || {}; + extend(src[prop], val); + } else { + src[prop] = val; + } + } + } + return src; + }; + + /** + * Iterator helper + * @param {(Array|Object)} arr Any object, array or array-like collection. + * @param {Function} fn Callback + * @param {Object} scope Change the value of this + * @return {Void} + */ + var each = function (arr, fn, scope) { + var n; + if (isObject(arr)) { + for (n in arr) { + if (Object.prototype.hasOwnProperty.call(arr, n)) { + fn.call(scope, arr[n], n); + } + } + } else { + for (n = 0; n < arr.length; n++) { + fn.call(scope, arr[n], n); + } + } + }; + + /** + * Add event listener to target + * @param {Object} el + * @param {String} e + * @param {Function} fn + */ + var on = function (el, e, fn) { + el.addEventListener(e, fn, false); + }; + + /** + * Create DOM element node + * @param {String} a nodeName + * @param {Object} b properties and attributes + * @return {Object} + */ + var createElement = function (a, b) { + var d = doc.createElement(a); + if (b && "object" == typeof b) { + var e; + for (e in b) { + if ("html" === e) { + d.innerHTML = b[e]; + } else { + d.setAttribute(e, b[e]); + } + } + } + return d; + }; + + var flush = function (el, ie) { + if (el instanceof NodeList) { + each(el, function (e) { + flush(e, ie); + }); + } else { + if (ie) { + while (el.hasChildNodes()) { + el.removeChild(el.firstChild); + } + } else { + el.innerHTML = ""; + } + } + }; + + /** + * Create button helper + * @param {String} c + * @param {Number} p + * @param {String} t + * @return {Object} + */ + var button = function (c, p, t) { + return createElement("li", { + class: c, + html: '' + t + "" + }); + }; + + /** + * classList shim + * @type {Object} + */ + var classList = { + add: function (s, a) { + if (s.classList) { + s.classList.add(a); + } else { + if (!classList.contains(s, a)) { + s.className = s.className.trim() + " " + a; + } + } + }, + remove: function (s, a) { + if (s.classList) { + s.classList.remove(a); + } else { + if (classList.contains(s, a)) { + s.className = s.className.replace( + new RegExp("(^|\\s)" + a.split(" ").join("|") + "(\\s|$)", "gi"), + " " + ); + } + } + }, + contains: function (s, a) { + if (s) + return s.classList ? + s.classList.contains(a) : + !!s.className && + !!s.className.match(new RegExp("(\\s|^)" + a + "(\\s|$)")); + } + }; + + /** + * Bubble sort algorithm + */ + var sortItems = function (a, b) { + var c, d; + if (1 === b) { + c = 0; + d = a.length; + } else { + if (b === -1) { + c = a.length - 1; + d = -1; + } + } + for (var e = !0; e;) { + e = !1; + for (var f = c; f != d; f += b) { + if (a[f + b] && a[f].value > a[f + b].value) { + var g = a[f], + h = a[f + b], + i = g; + a[f] = h; + a[f + b] = i; + e = !0; + } + } + } + return a; + }; + + /** + * Pager truncation algorithm + */ + var truncate = function (a, b, c, d, ellipsis) { + d = d || 2; + var j, + e = 2 * d, + f = b - d, + g = b + d, + h = [], + i = []; + if (b < 4 - d + e) { + g = 3 + e; + } else if (b > c - (3 - d + e)) { + f = c - (2 + e); + } + for (var k = 1; k <= c; k++) { + if (1 == k || k == c || (k >= f && k <= g)) { + var l = a[k - 1]; + classList.remove(l, "active"); + h.push(l); + } + } + each(h, function (c) { + var d = c.children[0].getAttribute("data-page"); + if (j) { + var e = j.children[0].getAttribute("data-page"); + if (d - e == 2) i.push(a[e]); + else if (d - e != 1) { + var f = createElement("li", { + class: "ellipsis", + html: '' + ellipsis + "" + }); + i.push(f); + } + } + i.push(c); + j = c; + }); + + return i; + }; + + /** + * Parse data to HTML table + */ + var dataToTable = function (data) { + var thead = false, + tbody = false; + + data = data || this.options.data; + + if (data.headings) { + thead = createElement("thead"); + var tr = createElement("tr"); + each(data.headings, function (col) { + var td = createElement("th", { + html: col + }); + tr.appendChild(td); + }); + + thead.appendChild(tr); + } + + if (data.data && data.data.length) { + tbody = createElement("tbody"); + each(data.data, function (rows) { + if (data.headings) { + if (data.headings.length !== rows.length) { + throw new Error( + "The number of rows do not match the number of headings." + ); + } + } + var tr = createElement("tr"); + each(rows, function (value) { + var td = createElement("td", { + html: value + }); + tr.appendChild(td); + }); + tbody.appendChild(tr); + }); + } + + if (thead) { + if (this.table.tHead !== null) { + this.table.removeChild(this.table.tHead); + } + this.table.appendChild(thead); + } + + if (tbody) { + if (this.table.tBodies.length) { + this.table.removeChild(this.table.tBodies[0]); + } + this.table.appendChild(tbody); + } + }; + + /** + * Use moment.js to parse cell contents for sorting + * @param {String} content The datetime string to parse + * @param {String} format The format for moment to use + * @return {String|Boolean} Datatime string or false + */ + var parseDate = function (content, format) { + var date = false; + + // moment() throws a fit if the string isn't a valid datetime string + // so we need to supply the format to the constructor (https://momentjs.com/docs/#/parsing/string-format/) + + // Converting to YYYYMMDD ensures we can accurately sort the column numerically + + if (format) { + switch (format) { + case "ISO_8601": + date = moment(content, moment.ISO_8601).format("YYYYMMDD"); + break; + case "RFC_2822": + date = moment(content, "ddd, MM MMM YYYY HH:mm:ss ZZ").format("YYYYMMDD"); + break; + case "MYSQL": + date = moment(content, "YYYY-MM-DD hh:mm:ss").format("YYYYMMDD"); + break; + case "UNIX": + date = moment(content).unix(); + break; + // User defined format using the data-format attribute or columns[n].format option + default: + date = moment(content, format).format("YYYYMMDD"); + break; + } + } + + return date; + }; + + /** + * Columns API + * @param {Object} instance DataTable instance + * @param {Mixed} columns Column index or array of column indexes + */ + var Columns = function (dt) { + this.dt = dt; + return this; + }; + + /** + * Swap two columns + * @return {Void} + */ + Columns.prototype.swap = function (columns) { + if (columns.length && columns.length === 2) { + var cols = []; + + // Get the current column indexes + each(this.dt.headings, function (h, i) { + cols.push(i); + }); + + var x = columns[0]; + var y = columns[1]; + var b = cols[y]; + cols[y] = cols[x]; + cols[x] = b; + + this.order(cols); + } + }; + + /** + * Reorder the columns + * @return {Array} columns Array of ordered column indexes + */ + Columns.prototype.order = function (columns) { + + var a, b, c, d, h, s, cell, + temp = [ + [], + [], + [], + [] + ], + dt = this.dt; + + // Order the headings + each(columns, function (column, x) { + h = dt.headings[column]; + s = h.getAttribute("data-sortable") !== "false"; + a = h.cloneNode(true); + a.originalCellIndex = x; + a.sortable = s; + + temp[0].push(a); + + if (dt.hiddenColumns.indexOf(column) < 0) { + b = h.cloneNode(true); + b.originalCellIndex = x; + b.sortable = s; + + temp[1].push(b); + } + }); + + // Order the row cells + each(dt.data, function (row, i) { + c = row.cloneNode(); + d = row.cloneNode(); + + c.dataIndex = d.dataIndex = i; + + if (row.searchIndex !== null && row.searchIndex !== undefined) { + c.searchIndex = d.searchIndex = row.searchIndex; + } + + // Append the cell to the fragment in the correct order + each(columns, function (column, x) { + cell = row.cells[column].cloneNode(true); + cell.data = row.cells[column].data; + c.appendChild(cell); + + if (dt.hiddenColumns.indexOf(column) < 0) { + cell = row.cells[column].cloneNode(true); + cell.data = row.cells[column].data; + d.appendChild(cell); + } + }); + + temp[2].push(c); + temp[3].push(d); + }); + + dt.headings = temp[0]; + dt.activeHeadings = temp[1]; + + dt.data = temp[2]; + dt.activeRows = temp[3]; + + // Update + dt.update(); + }; + + /** + * Hide columns + * @return {Void} + */ + Columns.prototype.hide = function (columns) { + if (columns.length) { + var dt = this.dt; + + each(columns, function (column) { + if (dt.hiddenColumns.indexOf(column) < 0) { + dt.hiddenColumns.push(column); + } + }); + + this.rebuild(); + } + }; + + /** + * Show columns + * @return {Void} + */ + Columns.prototype.show = function (columns) { + if (columns.length) { + var index, dt = this.dt; + + each(columns, function (column) { + index = dt.hiddenColumns.indexOf(column); + if (index > -1) { + dt.hiddenColumns.splice(index, 1); + } + }); + + this.rebuild(); + } + }; + + /** + * Check column(s) visibility + * @return {Boolean} + */ + Columns.prototype.visible = function (columns) { + var cols, dt = this.dt; + + columns = columns || dt.headings.map(function (th) { + return th.originalCellIndex; + }); + + if (!isNaN(columns)) { + cols = dt.hiddenColumns.indexOf(columns) < 0; + } else if (isArray(columns)) { + cols = []; + each(columns, function (column) { + cols.push(dt.hiddenColumns.indexOf(column) < 0); + }); + } + + return cols; + }; + + /** + * Add a new column + * @param {Object} data + */ + Columns.prototype.add = function (data) { + var that = this, + td, th = document.createElement("th"); + + if (!this.dt.headings.length) { + this.dt.insert({ + headings: [data.heading], + data: data.data.map(function (i) { + return [i]; + }) + }); + this.rebuild(); + return; + } + + if (!this.dt.hiddenHeader) { + if (data.heading.nodeName) { + th.appendChild(data.heading); + } else { + th.innerHTML = data.heading; + } + } else { + th.innerHTML = ""; + } + + this.dt.headings.push(th); + + each(this.dt.data, function (row, i) { + if (data.data[i]) { + td = document.createElement("td"); + + if (data.data[i].nodeName) { + td.appendChild(data.data[i]); + } else { + td.innerHTML = data.data[i]; + } + + td.data = td.innerHTML; + + if (data.render) { + td.innerHTML = data.render.call(that, td.data, td, row); + } + + row.appendChild(td); + } + }); + + if (data.type) { + th.setAttribute("data-type", data.type); + } + if (data.format) { + th.setAttribute("data-format", data.format); + } + + if (data.hasOwnProperty("sortable")) { + th.sortable = data.sortable; + th.setAttribute("data-sortable", data.sortable === true ? "true" : "false"); + } + + this.rebuild(); + + this.dt.renderHeader(); + }; + + /** + * Remove column(s) + * @param {Array|Number} select + * @return {Void} + */ + Columns.prototype.remove = function (select) { + if (isArray(select)) { + // Remove in reverse otherwise the indexes will be incorrect + select.sort(function (a, b) { + return b - a; + }); + + each(select, function (column) { + this.remove(column); + }, this); + } else { + this.dt.headings.splice(select, 1); + + each(this.dt.data, function (row) { + row.removeChild(row.cells[select]); + }); + } + + this.rebuild(); + }; + + /** + * Sort by column + * @param {int} column - The column no. + * @param {string} direction - asc or desc + * @return {void} + */ + Columns.prototype.sort = function (column, direction, init) { + + var dt = this.dt; + + // Check column is present + if (dt.hasHeadings && (column < 1 || column > dt.activeHeadings.length)) { + return false; + } + + dt.sorting = true; + + // Convert to zero-indexed + column = column - 1; + + var dir, + rows = dt.data, + alpha = [], + numeric = [], + a = 0, + n = 0, + th = dt.activeHeadings[column]; + + column = th.originalCellIndex; + + each(rows, function (tr) { + var cell = tr.cells[column]; + var content = cell.hasAttribute('data-content') ? cell.getAttribute('data-content') : cell.data; + var num = content.replace(/(\$|\,|\s|%)/g, ""); + + // Check for date format and moment.js + if (th.getAttribute("data-type") === "date" && win.moment) { + var format = false, + formatted = th.hasAttribute("data-format"); + + if (formatted) { + format = th.getAttribute("data-format"); + } + + num = parseDate(content, format); + } + + if (parseFloat(num) == num) { + numeric[n++] = { + value: Number(num), + row: tr + }; + } else { + alpha[a++] = { + value: content, + row: tr + }; + } + }); + + /* Sort according to direction (ascending or descending) */ + var top, btm; + if (classList.contains(th, "asc") || direction == "asc") { + top = sortItems(alpha, -1); + btm = sortItems(numeric, -1); + dir = "descending"; + classList.remove(th, "asc"); + classList.add(th, "desc"); + } else { + top = sortItems(numeric, 1); + btm = sortItems(alpha, 1); + dir = "ascending"; + classList.remove(th, "desc"); + classList.add(th, "asc"); + } + + /* Clear asc/desc class names from the last sorted column's th if it isn't the same as the one that was just clicked */ + if (dt.lastTh && th != dt.lastTh) { + classList.remove(dt.lastTh, "desc"); + classList.remove(dt.lastTh, "asc"); + } + + dt.lastTh = th; + + /* Reorder the table */ + rows = top.concat(btm); + + dt.data = []; + var indexes = []; + + each(rows, function (v, i) { + dt.data.push(v.row); + + if (v.row.searchIndex !== null && v.row.searchIndex !== undefined) { + indexes.push(i); + } + }, dt); + + dt.searchData = indexes; + + this.rebuild(); + + dt.update(); + + if (!init) { + dt.emit("datatable.sort", column, dir); + } + }; + + /** + * Rebuild the columns + * @return {Void} + */ + Columns.prototype.rebuild = function () { + var a, b, c, d, dt = this.dt, + temp = []; + + dt.activeRows = []; + dt.activeHeadings = []; + + each(dt.headings, function (th, i) { + th.originalCellIndex = i; + th.sortable = th.getAttribute("data-sortable") !== "false"; + if (dt.hiddenColumns.indexOf(i) < 0) { + dt.activeHeadings.push(th); + } + }, this); + + // Loop over the rows and reorder the cells + each(dt.data, function (row, i) { + a = row.cloneNode(); + b = row.cloneNode(); + + a.dataIndex = b.dataIndex = i; + + if (row.searchIndex !== null && row.searchIndex !== undefined) { + a.searchIndex = b.searchIndex = row.searchIndex; + } + + // Append the cell to the fragment in the correct order + each(row.cells, function (cell) { + c = cell.cloneNode(true); + c.data = cell.data; + a.appendChild(c); + + if (dt.hiddenColumns.indexOf(cell.cellIndex) < 0) { + d = cell.cloneNode(true); + d.data = cell.data; + b.appendChild(d); + } + }); + + // Append the fragment with the ordered cells + temp.push(a); + dt.activeRows.push(b); + }); + + dt.data = temp; + + dt.update(); + }; + + /** + * Rows API + * @param {Object} instance DataTable instance + * @param {Array} rows + */ + var Rows = function (dt, rows) { + this.dt = dt; + this.rows = rows; + + return this; + }; + + /** + * Build a new row + * @param {Array} row + * @return {HTMLElement} + */ + Rows.prototype.build = function (row) { + var td, tr = createElement("tr"); + + var headings = this.dt.headings; + + if (!headings.length) { + headings = row.map(function () { + return ""; + }); + } + + each(headings, function (h, i) { + td = createElement("td"); + + // Fixes #29 + if (!row[i] && !row[i].length) { + row[i] = ""; + } + + td.innerHTML = row[i]; + + td.data = row[i]; + + tr.appendChild(td); + }); + + return tr; + }; + + Rows.prototype.render = function (row) { + return row; + }; + + /** + * Add new row + * @param {Array} select + */ + Rows.prototype.add = function (data) { + + if (isArray(data)) { + var dt = this.dt; + // Check for multiple rows + if (isArray(data[0])) { + each(data, function (row, i) { + dt.data.push(this.build(row)); + }, this); + } else { + dt.data.push(this.build(data)); + } + + // We may have added data to an empty table + if ( dt.data.length ) { + dt.hasRows = true; + } + + + this.update(); + + dt.columns().rebuild(); + } + }; + + /** + * Remove row(s) + * @param {Array|Number} select + * @return {Void} + */ + Rows.prototype.remove = function (select) { + + var dt = this.dt; + + if (isArray(select)) { + // Remove in reverse otherwise the indexes will be incorrect + select.sort(function (a, b) { + return b - a; + }); + + each(select, function (row, i) { + dt.data.splice(row, 1); + }); + } else { + dt.data.splice(select, 1); + } + + this.update(); + dt.columns().rebuild(); + }; + + /** + * Update row indexes + * @return {Void} + */ + Rows.prototype.update = function () { + each(this.dt.data, function (row, i) { + row.dataIndex = i; + }); + }; + + //////////////////// + // MAIN LIB // + //////////////////// + + var DataTable = function (table, options) { + this.initialized = false; + + // user options + this.options = extend(defaultConfig, options); + + if (typeof table === "string") { + table = document.querySelector(table); + } + + this.initialLayout = table.innerHTML; + this.initialSortable = this.options.sortable; + + // Disable manual sorting if no header is present (#4) + if (!this.options.header) { + this.options.sortable = false; + } + + if (table.tHead === null) { + if (!this.options.data || + (this.options.data && !this.options.data.headings) + ) { + this.options.sortable = false; + } + } + + if (table.tBodies.length && !table.tBodies[0].rows.length) { + if (this.options.data) { + if (!this.options.data.data) { + throw new Error( + "You seem to be using the data option, but you've not defined any rows." + ); + } + } + } + + this.table = table; + + this.init(); + }; + + /** + * Add custom property or method to extend DataTable + * @param {String} prop - Method name or property + * @param {Mixed} val - Function or property value + * @return {Void} + */ + DataTable.extend = function(prop, val) { + if (typeof val === "function") { + DataTable.prototype[prop] = val; + } else { + DataTable[prop] = val; + } + }; + + var proto = DataTable.prototype; + + /** + * Initialize the instance + * @param {Object} options + * @return {Void} + */ + proto.init = function (options) { + if (this.initialized || classList.contains(this.table, "dataTable-table")) { + return false; + } + + var that = this; + + this.options = extend(this.options, options || {}); + + // IE detection + this.isIE = !!/(msie|trident)/i.test(navigator.userAgent); + + this.currentPage = 1; + this.onFirstPage = true; + + this.hiddenColumns = []; + this.columnRenderers = []; + this.selectedColumns = []; + + this.render(); + + setTimeout(function () { + that.emit("datatable.init"); + that.initialized = true; + + if (that.options.plugins) { + each(that.options.plugins, function(options, plugin) { + if (that[plugin] && typeof that[plugin] === "function") { + that[plugin] = that[plugin](options, { + each: each, + extend: extend, + classList: classList, + createElement: createElement + }); + + // Init plugin + if (options.enabled && that[plugin].init && typeof that[plugin].init === "function") { + that[plugin].init(); + } + } + }); + } + }, 10); + }; + + /** + * Render the instance + * @param {String} type + * @return {Void} + */ + proto.render = function (type) { + if (type) { + switch (type) { + case "page": + this.renderPage(); + break; + case "pager": + this.renderPager(); + break; + case "header": + this.renderHeader(); + break; + } + + return false; + } + + var that = this, + o = that.options, + template = ""; + + // Convert data to HTML + if (o.data) { + dataToTable.call(that); + } + + if (o.ajax) { + var ajax = o.ajax; + var xhr = new XMLHttpRequest(); + + var xhrProgress = function (e) { + that.emit("datatable.ajax.progress", e, xhr); + }; + + var xhrLoad = function (e) { + if (xhr.readyState === 4) { + that.emit("datatable.ajax.loaded", e, xhr); + + if (xhr.status === 200) { + var obj = {}; + obj.data = ajax.load ? ajax.load.call(that, xhr) : xhr.responseText; + + obj.type = "json"; + + if (ajax.content && ajax.content.type) { + obj.type = ajax.content.type; + + obj = extend(obj, ajax.content); + } + + that.import(obj); + + that.setColumns(true); + + that.emit("datatable.ajax.success", e, xhr); + } else { + that.emit("datatable.ajax.error", e, xhr); + } + } + }; + + var xhrFailed = function (e) { + that.emit("datatable.ajax.error", e, xhr); + }; + + var xhrCancelled = function (e) { + that.emit("datatable.ajax.abort", e, xhr); + }; + + on(xhr, "progress", xhrProgress); + on(xhr, "load", xhrLoad); + on(xhr, "error", xhrFailed); + on(xhr, "abort", xhrCancelled); + + that.emit("datatable.ajax.loading", xhr); + + xhr.open("GET", typeof ajax === "string" ? o.ajax : o.ajax.url); + xhr.send(); + } + + // Store references + that.body = that.table.tBodies[0]; + that.head = that.table.tHead; + that.foot = that.table.tFoot; + + if (!that.body) { + that.body = createElement("tbody"); + + that.table.appendChild(that.body); + } + + that.hasRows = that.body.rows.length > 0; + + // Make a tHead if there isn't one (fixes #8) + if (!that.head) { + var h = createElement("thead"); + var t = createElement("tr"); + + if (that.hasRows) { + each(that.body.rows[0].cells, function () { + t.appendChild(createElement("th")); + }); + + h.appendChild(t); + } + + that.head = h; + + that.table.insertBefore(that.head, that.body); + + that.hiddenHeader = !o.ajax; + } + + that.headings = []; + that.hasHeadings = that.head.rows.length > 0; + + if (that.hasHeadings) { + that.header = that.head.rows[0]; + that.headings = [].slice.call(that.header.cells); + } + + // Header + if (!o.header) { + if (that.head) { + that.table.removeChild(that.table.tHead); + } + } + + // Footer + if (o.footer) { + if (that.head && !that.foot) { + that.foot = createElement("tfoot", { + html: that.head.innerHTML + }); + that.table.appendChild(that.foot); + } + } else { + if (that.foot) { + that.table.removeChild(that.table.tFoot); + } + } + + // Build + that.wrapper = createElement("div", { + class: "dataTable-wrapper dataTable-loading" + }); + + // Template for custom layouts + template += "
"; + template += o.layout.top; + template += "
"; + template += "
"; + template += "
"; + template += o.layout.bottom; + template += "
"; + + // Info placement + template = template.replace("{info}", "
"); + + // Per Page Select + if (o.perPageSelect) { + var wrap = "
"; + + // Create the select + var select = createElement("select", { + class: "dataTable-selector" + }); + + // Create the options + each(o.perPageSelect, function (val) { + var selected = val === o.perPage; + var option = new Option(val, val, selected, selected); + select.add(option); + }); + + // Custom label + wrap = wrap.replace("{select}", select.outerHTML); + + // Selector placement + template = template.replace("{select}", wrap); + } else { + template = template.replace("{select}", ""); + } + + // Searchable + if (o.searchable) { + var form = + ""; + + // Search input placement + template = template.replace("{search}", form); + } else { + template = template.replace("{search}", ""); + } + + if (that.hasHeadings) { + // Sortable + this.render("header"); + } + + // Add table class + classList.add(that.table, "dataTable-table"); + + // Paginator + var w = createElement("div", { + class: "dataTable-pagination" + }); + var paginator = createElement("ul"); + w.appendChild(paginator); + + // Pager(s) placement + template = template.replace(/\{pager\}/g, w.outerHTML); + + that.wrapper.innerHTML = template; + + that.container = that.wrapper.querySelector(".dataTable-container"); + + that.pagers = that.wrapper.querySelectorAll(".dataTable-pagination"); + + that.label = that.wrapper.querySelector(".dataTable-info"); + + // Insert in to DOM tree + that.table.parentNode.replaceChild(that.wrapper, that.table); + that.container.appendChild(that.table); + + // Store the table dimensions + that.rect = that.table.getBoundingClientRect(); + + // Convert rows to array for processing + that.data = [].slice.call(that.body.rows); + that.activeRows = that.data.slice(); + that.activeHeadings = that.headings.slice(); + + // Update + that.update(); + + if (!o.ajax) { + that.setColumns(); + } + + // Fix height + this.fixHeight(); + + // Fix columns + that.fixColumns(); + + // Class names + if (!o.header) { + classList.add(that.wrapper, "no-header"); + } + + if (!o.footer) { + classList.add(that.wrapper, "no-footer"); + } + + if (o.sortable) { + classList.add(that.wrapper, "sortable"); + } + + if (o.searchable) { + classList.add(that.wrapper, "searchable"); + } + + if (o.fixedHeight) { + classList.add(that.wrapper, "fixed-height"); + } + + if (o.fixedColumns) { + classList.add(that.wrapper, "fixed-columns"); + } + + that.bindEvents(); + }; + + /** + * Render the page + * @return {Void} + */ + proto.renderPage = function () { + if (this.hasRows && this.totalPages) { + if (this.currentPage > this.totalPages) { + this.currentPage = 1; + } + + // Use a fragment to limit touching the DOM + var index = this.currentPage - 1, + frag = doc.createDocumentFragment(); + + if (this.hasHeadings) { + flush(this.header, this.isIE); + + each(this.activeHeadings, function (th) { + this.header.appendChild(th); + }, this); + } + + each(this.pages[index], function (row) { + frag.appendChild(this.rows().render(row)); + }, this); + + this.clear(frag); + + this.onFirstPage = this.currentPage === 1; + this.onLastPage = this.currentPage === this.lastPage; + } else { + this.clear(); + } + + // Update the info + var current = 0, + f = 0, + t = 0, + items; + + if (this.totalPages) { + current = this.currentPage - 1; + f = current * this.options.perPage; + t = f + this.pages[current].length; + f = f + 1; + items = !!this.searching ? this.searchData.length : this.data.length; + } + + if (this.label && this.options.labels.info.length) { + // CUSTOM LABELS + var string = this.options.labels.info + .replace("{start}", f) + .replace("{end}", t) + .replace("{page}", this.currentPage) + .replace("{pages}", this.totalPages) + .replace("{rows}", items); + + this.label.innerHTML = items ? string : ""; + } + + if (this.currentPage == 1) { + this.fixHeight(); + } + }; + + /** + * Render the pager(s) + * @return {Void} + */ + proto.renderPager = function () { + flush(this.pagers, this.isIE); + + if (this.totalPages > 1) { + var c = "pager", + frag = doc.createDocumentFragment(), + prev = this.onFirstPage ? 1 : this.currentPage - 1, + next = this.onlastPage ? this.totalPages : this.currentPage + 1; + + // first button + if (this.options.firstLast) { + frag.appendChild(button(c, 1, this.options.firstText)); + } + + // prev button + if (this.options.nextPrev) { + frag.appendChild(button(c, prev, this.options.prevText)); + } + + var pager = this.links; + + // truncate the links + if (this.options.truncatePager) { + pager = truncate( + this.links, + this.currentPage, + this.pages.length, + this.options.pagerDelta, + this.options.ellipsisText + ); + } + + // active page link + classList.add(this.links[this.currentPage - 1], "active"); + + // append the links + each(pager, function (p) { + classList.remove(p, "active"); + frag.appendChild(p); + }); + + classList.add(this.links[this.currentPage - 1], "active"); + + // next button + if (this.options.nextPrev) { + frag.appendChild(button(c, next, this.options.nextText)); + } + + // first button + if (this.options.firstLast) { + frag.appendChild(button(c, this.totalPages, this.options.lastText)); + } + + // We may have more than one pager + each(this.pagers, function (pager) { + pager.appendChild(frag.cloneNode(true)); + }); + } + }; + + /** + * Render the header + * @return {Void} + */ + proto.renderHeader = function () { + var that = this; + + that.labels = []; + + if (that.headings && that.headings.length) { + each(that.headings, function (th, i) { + + that.labels[i] = th.textContent; + + if (classList.contains(th.firstElementChild, "dataTable-sorter")) { + th.innerHTML = th.firstElementChild.innerHTML; + } + + th.sortable = th.getAttribute("data-sortable") !== "false"; + + th.originalCellIndex = i; + if (that.options.sortable && th.sortable) { + var link = createElement("a", { + href: "#", + class: "dataTable-sorter", + html: th.innerHTML + }); + + th.innerHTML = ""; + th.setAttribute("data-sortable", ""); + th.appendChild(link); + } + }); + } + + that.fixColumns(); + }; + + /** + * Bind event listeners + * @return {[type]} [description] + */ + proto.bindEvents = function () { + var that = this, + o = that.options; + + // Per page selector + if (o.perPageSelect) { + var selector = that.wrapper.querySelector(".dataTable-selector"); + if (selector) { + // Change per page + on(selector, "change", function (e) { + o.perPage = parseInt(this.value, 10); + that.update(); + + that.fixHeight(); + + that.emit("datatable.perpage", o.perPage); + }); + } + } + + // Search input + if (o.searchable) { + that.input = that.wrapper.querySelector(".dataTable-input"); + if (that.input) { + on(that.input, "keyup", function (e) { + that.search(this.value); + }); + } + } + + // Pager(s) / sorting + on(that.wrapper, "click", function (e) { + var t = e.target; + if (t.nodeName.toLowerCase() === "a") { + if (t.hasAttribute("data-page")) { + that.page(t.getAttribute("data-page")); + e.preventDefault(); + } else if ( + o.sortable && + classList.contains(t, "dataTable-sorter") && + t.parentNode.getAttribute("data-sortable") != "false" + ) { + that.columns().sort(that.activeHeadings.indexOf(t.parentNode) + 1); + e.preventDefault(); + } + } + }); + }; + + /** + * Set up columns + * @return {[type]} [description] + */ + proto.setColumns = function (ajax) { + + var that = this; + + if (!ajax) { + each(that.data, function (row) { + each(row.cells, function (cell) { + cell.data = cell.innerHTML; + }); + }); + } + + // Check for the columns option + if (that.options.columns && that.headings.length) { + + each(that.options.columns, function (data) { + + // convert single column selection to array + if (!isArray(data.select)) { + data.select = [data.select]; + } + + if (data.hasOwnProperty("render") && typeof data.render === "function") { + that.selectedColumns = that.selectedColumns.concat(data.select); + + that.columnRenderers.push({ + columns: data.select, + renderer: data.render + }); + } + + // Add the data attributes to the th elements + each(data.select, function (column) { + var th = that.headings[column]; + if (data.type) { + th.setAttribute("data-type", data.type); + } + if (data.format) { + th.setAttribute("data-format", data.format); + } + if (data.hasOwnProperty("sortable")) { + th.setAttribute("data-sortable", data.sortable); + } + + if (data.hasOwnProperty("hidden")) { + if (data.hidden !== false) { + that.columns().hide(column); + } + } + + if (data.hasOwnProperty("sort") && data.select.length === 1) { + that.columns().sort(data.select[0] + 1, data.sort, true); + } + }); + }); + } + + if (that.hasRows) { + each(that.data, function (row, i) { + row.dataIndex = i; + each(row.cells, function (cell) { + cell.data = cell.innerHTML; + }); + }); + + if (that.selectedColumns.length) { + each(that.data, function (row) { + each(row.cells, function (cell, i) { + if (that.selectedColumns.indexOf(i) > -1) { + each(that.columnRenderers, function (o) { + if (o.columns.indexOf(i) > -1) { + cell.innerHTML = o.renderer.call(that, cell.data, cell, row); + } + }); + } + }); + }); + } + + that.columns().rebuild(); + } + + that.render("header"); + }; + + /** + * Destroy the instance + * @return {void} + */ + proto.destroy = function () { + this.table.innerHTML = this.initialLayout; + + // Remove the className + classList.remove(this.table, "dataTable-table"); + + // Remove the containers + this.wrapper.parentNode.replaceChild(this.table, this.wrapper); + + this.initialized = false; + }; + + /** + * Update the instance + * @return {Void} + */ + proto.update = function () { + classList.remove(this.wrapper, "dataTable-empty"); + + this.paginate(this); + this.render("page"); + + this.links = []; + + var i = this.pages.length; + while (i--) { + var num = i + 1; + this.links[i] = button(i === 0 ? "active" : "", num, num); + } + + this.sorting = false; + + this.render("pager"); + + this.rows().update(); + + this.emit("datatable.update"); + }; + + /** + * Sort rows into pages + * @return {Number} + */ + proto.paginate = function () { + var perPage = this.options.perPage, + rows = this.activeRows; + + if (this.searching) { + rows = []; + + each(this.searchData, function (index) { + rows.push(this.activeRows[index]); + }, this); + } + + // Check for hidden columns + this.pages = rows + .map(function (tr, i) { + return i % perPage === 0 ? rows.slice(i, i + perPage) : null; + }) + .filter(function (page) { + return page; + }); + + this.totalPages = this.lastPage = this.pages.length; + + return this.totalPages; + }; + + /** + * Fix column widths + * @return {Void} + */ + proto.fixColumns = function () { + + if (this.options.fixedColumns && this.activeHeadings && this.activeHeadings.length) { + + var cells, + hd = false; + + this.columnWidths = []; + + // If we have headings we need only set the widths on them + // otherwise we need a temp header and the widths need applying to all cells + if (this.table.tHead) { + // Reset widths + each(this.activeHeadings, function (cell) { + cell.style.width = ""; + }, this); + + each(this.activeHeadings, function (cell, i) { + var ow = cell.offsetWidth; + var w = ow / this.rect.width * 100; + cell.style.width = w + "%"; + this.columnWidths[i] = ow; + }, this); + } else { + cells = []; + + // Make temperary headings + hd = createElement("thead"); + var r = createElement("tr"); + var c = this.table.tBodies[0].rows[0].cells; + each(c, function () { + var th = createElement("th"); + r.appendChild(th); + cells.push(th); + }); + + hd.appendChild(r); + this.table.insertBefore(hd, this.body); + + var widths = []; + each(cells, function (cell, i) { + var ow = cell.offsetWidth; + var w = ow / this.rect.width * 100; + widths.push(w); + this.columnWidths[i] = ow; + }, this); + + each(this.data, function (row) { + each(row.cells, function (cell, i) { + if (this.columns(cell.cellIndex).visible()) + cell.style.width = widths[i] + "%"; + }, this); + }, this); + + // Discard the temp header + this.table.removeChild(hd); + } + } + }; + + /** + * Fix the container height; + * @return {Void} + */ + proto.fixHeight = function () { + if (this.options.fixedHeight) { + this.container.style.height = null; + this.rect = this.container.getBoundingClientRect(); + this.container.style.height = this.rect.height + "px"; + } + }; + + /** + * Perform a search of the data set + * @param {string} query + * @return {void} + */ + proto.search = function (query) { + if (!this.hasRows) return false; + + var that = this; + + query = query.toLowerCase(); + + this.currentPage = 1; + this.searching = true; + this.searchData = []; + + if (!query.length) { + this.searching = false; + this.update(); + this.emit("datatable.search", query, this.searchData); + classList.remove(this.wrapper, "search-results"); + return false; + } + + this.clear(); + + each(this.data, function (row, idx) { + var inArray = this.searchData.indexOf(row) > -1; + + // https://github.com/Mobius1/Vanilla-DataTables/issues/12 + var doesQueryMatch = query.split(" ").reduce(function (bool, word) { + var includes = false, + cell = null, + content = null; + + for (var x = 0; x < row.cells.length; x++) { + cell = row.cells[x]; + content = cell.hasAttribute('data-content') ? cell.getAttribute('data-content') : cell.textContent; + + if ( + content.toLowerCase().indexOf(word) > -1 && + that.columns(cell.cellIndex).visible() + ) { + includes = true; + break; + } + } + + return bool && includes; + }, true); + + if (doesQueryMatch && !inArray) { + row.searchIndex = idx; + this.searchData.push(idx); + } else { + row.searchIndex = null; + } + }, this); + + classList.add(this.wrapper, "search-results"); + + if (!that.searchData.length) { + classList.remove(that.wrapper, "search-results"); + + that.setMessage(that.options.labels.noRows); + } else { + that.update(); + } + + this.emit("datatable.search", query, this.searchData); + }; + + /** + * Change page + * @param {int} page + * @return {void} + */ + proto.page = function (page) { + // We don't want to load the current page again. + if (page == this.currentPage) { + return false; + } + + if (!isNaN(page)) { + this.currentPage = parseInt(page, 10); + } + + if (page > this.pages.length || page < 0) { + return false; + } + + this.render("page"); + this.render("pager"); + + this.emit("datatable.page", page); + }; + + /** + * Sort by column + * @param {int} column - The column no. + * @param {string} direction - asc or desc + * @return {void} + */ + proto.sortColumn = function (column, direction) { + // Use columns API until sortColumn method is removed + this.columns().sort(column, direction); + }; + + /** + * Add new row data + * @param {object} data + */ + proto.insert = function (data) { + + var that = this, + rows = []; + if (isObject(data)) { + if (data.headings) { + if (!that.hasHeadings && !that.hasRows) { + var tr = createElement("tr"), + th; + each(data.headings, function (heading) { + th = createElement("th", { + html: heading + }); + + tr.appendChild(th); + }); + that.head.appendChild(tr); + + that.header = tr; + that.headings = [].slice.call(tr.cells); + that.hasHeadings = true; + + // Re-enable sorting if it was disabled due + // to missing header + that.options.sortable = that.initialSortable; + + // Allow sorting on new header + that.render("header"); + } + } + + if (data.data && isArray(data.data)) { + rows = data.data; + } + } else if (isArray(data)) { + each(data, function (row) { + var r = []; + each(row, function (cell, heading) { + + var index = that.labels.indexOf(heading); + + if (index > -1) { + r[index] = cell; + } + }); + rows.push(r); + }); + } + + if (rows.length) { + that.rows().add(rows); + + that.hasRows = true; + } + + that.update(); + + that.fixColumns(); + }; + + /** + * Refresh the instance + * @return {void} + */ + proto.refresh = function () { + if (this.options.searchable) { + this.input.value = ""; + this.searching = false; + } + this.currentPage = 1; + this.onFirstPage = true; + this.update(); + + this.emit("datatable.refresh"); + }; + + /** + * Truncate the table + * @param {mixes} html - HTML string or HTMLElement + * @return {void} + */ + proto.clear = function (html) { + if (this.body) { + flush(this.body, this.isIE); + } + + var parent = this.body; + if (!this.body) { + parent = this.table; + } + + if (html) { + if (typeof html === "string") { + var frag = doc.createDocumentFragment(); + frag.innerHTML = html; + } + + parent.appendChild(html); + } + }; + + /** + * Export table to various formats (csv, txt or sql) + * @param {Object} options User options + * @return {Boolean} + */ + proto.export = function (options) { + if (!this.hasHeadings && !this.hasRows) return false; + + var headers = this.activeHeadings, + rows = [], + arr = [], + i, + x, + str, + link; + + var defaults = { + download: true, + skipColumn: [], + + // csv + lineDelimiter: "\n", + columnDelimiter: ",", + + // sql + tableName: "myTable", + + // json + replacer: null, + space: 4 + }; + + // Check for the options object + if (!isObject(options)) { + return false; + } + + var o = extend(defaults, options); + + if (o.type) { + if (o.type === "txt" || o.type === "csv") { + // Include headings + rows[0] = this.header; + } + + // Selection or whole table + if (o.selection) { + // Page number + if (!isNaN(o.selection)) { + rows = rows.concat(this.pages[o.selection - 1]); + } else if (isArray(o.selection)) { + // Array of page numbers + for (i = 0; i < o.selection.length; i++) { + rows = rows.concat(this.pages[o.selection[i] - 1]); + } + } + } else { + rows = rows.concat(this.activeRows); + } + + // Only proceed if we have data + if (rows.length) { + if (o.type === "txt" || o.type === "csv") { + str = ""; + + for (i = 0; i < rows.length; i++) { + for (x = 0; x < rows[i].cells.length; x++) { + // Check for column skip and visibility + if ( + o.skipColumn.indexOf(headers[x].originalCellIndex) < 0 && + this.columns(headers[x].originalCellIndex).visible() + ) { + var text = rows[i].texts[x].textContent; + text = text.trim(); + text = text.replace(/\s{2,}/g, ' '); + text = text.replace(/\n/g, ' '); + text = text.replace(/"/g, '""'); + if (text.indexOf(",") > -1) + text = '"' + text + '"'; + + + str += text + o.columnDelimiter; + } + } + // Remove trailing column delimiter + str = str.trim().substring(0, str.length - 1); + + // Apply line delimiter + str += o.lineDelimiter; + } + + // Remove trailing line delimiter + str = str.trim().substring(0, str.length - 1); + + if (o.download) { + str = "data:text/csv;charset=utf-8," + str; + } + } else if (o.type === "sql") { + // Begin INSERT statement + str = "INSERT INTO `" + o.tableName + "` ("; + + // Convert table headings to column names + for (i = 0; i < headers.length; i++) { + // Check for column skip and column visibility + if ( + o.skipColumn.indexOf(headers[i].originalCellIndex) < 0 && + this.columns(headers[i].originalCellIndex).visible() + ) { + str += "`" + headers[i].textContent + "`,"; + } + } + + // Remove trailing comma + str = str.trim().substring(0, str.length - 1); + + // Begin VALUES + str += ") VALUES "; + + // Iterate rows and convert cell data to column values + for (i = 0; i < rows.length; i++) { + str += "("; + + for (x = 0; x < rows[i].cells.length; x++) { + // Check for column skip and column visibility + if ( + o.skipColumn.indexOf(headers[x].originalCellIndex) < 0 && + this.columns(headers[x].originalCellIndex).visible() + ) { + str += '"' + rows[i].cells[x].textContent + '",'; + } + } + + // Remove trailing comma + str = str.trim().substring(0, str.length - 1); + + // end VALUES + str += "),"; + } + + // Remove trailing comma + str = str.trim().substring(0, str.length - 1); + + // Add trailing colon + str += ";"; + + if (o.download) { + str = "data:application/sql;charset=utf-8," + str; + } + } else if (o.type === "json") { + // Iterate rows + for (x = 0; x < rows.length; x++) { + arr[x] = arr[x] || {}; + // Iterate columns + for (i = 0; i < headers.length; i++) { + // Check for column skip and column visibility + if ( + o.skipColumn.indexOf(headers[i].originalCellIndex) < 0 && + this.columns(headers[i].originalCellIndex).visible() + ) { + arr[x][headers[i].textContent] = rows[x].cells[i].textContent; + } + } + } + + // Convert the array of objects to JSON string + str = JSON.stringify(arr, o.replacer, o.space); + + if (o.download) { + str = "data:application/json;charset=utf-8," + str; + } + } + + // Download + if (o.download) { + // Filename + o.filename = o.filename || "datatable_export"; + o.filename += "." + o.type; + + str = encodeURI(str); + + // Create a link to trigger the download + link = document.createElement("a"); + link.href = str; + link.download = o.filename; + + // Append the link + body.appendChild(link); + + // Trigger the download + link.click(); + + // Remove the link + body.removeChild(link); + } + + return str; + } + } + + return false; + }; + + /** + * Import data to the table + * @param {Object} options User options + * @return {Boolean} + */ + proto.import = function (options) { + var obj = false; + var defaults = { + // csv + lineDelimiter: "\n", + columnDelimiter: "," + }; + + // Check for the options object + if (!isObject(options)) { + return false; + } + + options = extend(defaults, options); + + if (options.data.length || isObject(options.data)) { + // Import CSV + if (options.type === "csv") { + obj = { + data: [] + }; + + // Split the string into rows + var rows = options.data.split(options.lineDelimiter); + + if (rows.length) { + + if (options.headings) { + obj.headings = rows[0].split(options.columnDelimiter); + + rows.shift(); + } + + each(rows, function (row, i) { + obj.data[i] = []; + + // Split the rows into values + var values = row.split(options.columnDelimiter); + + if (values.length) { + each(values, function (value) { + obj.data[i].push(value); + }); + } + }); + } + } else if (options.type === "json") { + var json = isJson(options.data); + + // Valid JSON string + if (json) { + obj = { + headings: [], + data: [] + }; + + each(json, function (data, i) { + obj.data[i] = []; + each(data, function (value, column) { + if (obj.headings.indexOf(column) < 0) { + obj.headings.push(column); + } + + obj.data[i].push(value); + }); + }); + } else { + console.warn("That's not valid JSON!"); + } + } + + if (isObject(options.data)) { + obj = options.data; + } + + if (obj) { + // Add the rows + this.insert(obj); + } + } + + return false; + }; + /** + * Print the table + * @return {void} + */ + proto.print = function () { + var headings = this.activeHeadings; + var rows = this.activeRows; + var table = createElement("table"); + var thead = createElement("thead"); + var tbody = createElement("tbody"); + + var tr = createElement("tr"); + each(headings, function (th) { + tr.appendChild( + createElement("th", { + html: th.textContent + }) + ); + }); + + thead.appendChild(tr); + + each(rows, function (row) { + var tr = createElement("tr"); + each(row.cells, function (cell) { + tr.appendChild( + createElement("td", { + html: cell.textContent + }) + ); + }); + tbody.appendChild(tr); + }); + + table.appendChild(thead); + table.appendChild(tbody); + + // Open new window + var w = win.open(); + + // Append the table to the body + w.document.body.appendChild(table); + + // Print + w.print(); + }; + + /** + * Show a message in the table + * @param {string} message + */ + proto.setMessage = function (message) { + var colspan = 1; + + if (this.hasRows) { + colspan = this.data[0].cells.length; + } + + classList.add(this.wrapper, "dataTable-empty"); + + this.clear( + createElement("tr", { + html: '' + + message + + "" + }) + ); + }; + + /** + * Columns API access + * @return {Object} new Columns instance + */ + proto.columns = function (columns) { + return new Columns(this, columns); + }; + + /** + * Rows API access + * @return {Object} new Rows instance + */ + proto.rows = function (rows) { + return new Rows(this, rows); + }; + + /** + * Add custom event listener + * @param {String} event + * @param {Function} callback + * @return {Void} + */ + proto.on = function (event, callback) { + this.events = this.events || {}; + this.events[event] = this.events[event] || []; + this.events[event].push(callback); + }; + + /** + * Remove custom event listener + * @param {String} event + * @param {Function} callback + * @return {Void} + */ + proto.off = function (event, callback) { + this.events = this.events || {}; + if (event in this.events === false) return; + this.events[event].splice(this.events[event].indexOf(callback), 1); + }; + + /** + * Fire custom event + * @param {String} event + * @return {Void} + */ + proto.emit = function (event) { + this.events = this.events || {}; + if (event in this.events === false) return; + for (var i = 0; i < this.events[event].length; i++) { + this.events[event][i].apply(this, Array.prototype.slice.call(arguments, 1)); + } + }; + + return DataTable; +}); diff --git a/games/action/_toc.md b/games/action/_toc.md index 966e4540..896237aa 100644 --- a/games/action/_toc.md +++ b/games/action/_toc.md @@ -10,7 +10,7 @@ - **[MechCommander 2 Omnitech](mechcommander2_omnitech.md)** (C++, MPL, beta, inactive since 2013) - **[Open Sonic](open_sonic.md)** (C, GPL-2.0, beta) - **[Open Zelda](open_zelda.md)** (C++, zlib, beta) -- **[Red Eclipse](red_eclipse.md)** (C++, Zlib, mature) +- **[Red Eclipse](red_eclipse.md)** (C++, zlib, mature) - **[Rocks'n'Diamonds ](rocks_and_diamonds.md)** (C, GPL-2.0, mature) - **[Secret Mario Chronicles](secret_mario_chronicles.md)** (C++, GPL-3.0, mature, inactive since 2009) - **[Smash](smash.md)** (Javascript, MIT, mature) diff --git a/games/action/commando_js.md b/games/action/commando_js.md index 268ac0aa..733d4131 100644 --- a/games/action/commando_js.md +++ b/games/action/commando_js.md @@ -4,7 +4,7 @@ _Nostalgic glimpse in the past in a form of Commodore 64 game "Commando"._ - Home: http://commandojs.org/ - State: beta, inactive since 2012 -- Keywords: web +- Keywords: browser - Code repository: https://github.com/commandojs/CommandoJS - Code language: Javascript, Coffeescript - Code license: MIT diff --git a/games/action/red_eclipse.md b/games/action/red_eclipse.md index b402776b..896b28db 100644 --- a/games/action/red_eclipse.md +++ b/games/action/red_eclipse.md @@ -8,7 +8,7 @@ _First person arena shooter, featuring parkour, impulse boosts, and more._ - Keywords: shooter - Code repository: https://github.com/red-eclipse - Code language: C++ -- Code license: Zlib +- Code license: zlib ## Building diff --git a/games/action/secret_mario_chronicles.md b/games/action/secret_mario_chronicles.md index 5d775c6d..f1addaa9 100644 --- a/games/action/secret_mario_chronicles.md +++ b/games/action/secret_mario_chronicles.md @@ -6,7 +6,7 @@ _Jump and Run game like Super Mario World with an advanced Editor._ - Media: https://en.wikipedia.org/wiki/Secret_Maryo_Chronicles - Download: https://sourceforge.net/projects/smclone/files - State: mature, inactive since 2009 -- Keywords: platform +- Keywords: puzzle - Code repository: (see download) - Code language: C++ - Code license: GPL-3.0 diff --git a/games/action/smash.md b/games/action/smash.md index f4865f38..1b83766f 100644 --- a/games/action/smash.md +++ b/games/action/smash.md @@ -4,7 +4,7 @@ _Super Smash Bros-like in HTML5._ - Home: http://smash.gouchon.com/ - State: mature -- Keywords: web +- Keywords: browser - Code repository: https://github.com/guillaume-gouchon/smash.js - Code language: Javascript - Code license: MIT diff --git a/games/adventure/_toc.md b/games/adventure/_toc.md index 29cfc3e3..a2f3fdc6 100644 --- a/games/adventure/_toc.md +++ b/games/adventure/_toc.md @@ -16,6 +16,6 @@ - **[Solaris the Game](solaris.md)** (beta) - **[Star Maiden Rio](star_maiden_rio.md)** (mature) - **[TwinEngine](twin_engine.md)** (C, GPL-2.0, mature, inactive since 2015) -- **[Visions from the Other Side](visions_from_the_other_side.md)** () +- **[Visions from the Other Side](visions_from_the_other_side.md)** (Ren'py, Freeware, mature, inactive since 2006) [comment]: # (end of autogenerated content) \ No newline at end of file diff --git a/games/adventure/colossal_cave.md b/games/adventure/colossal_cave.md index 4efac254..51405827 100644 --- a/games/adventure/colossal_cave.md +++ b/games/adventure/colossal_cave.md @@ -5,7 +5,7 @@ _Original Colossal Caves adventure game, but in Python 3._ - Home: https://github.com/brandon-rhodes/python-adventure - Media: https://en.wikipedia.org/wiki/Colossal_Cave_Adventure - State: mature -- Keywords: text +- Keywords: console - Code repository: https://github.com/brandon-rhodes/python-adventure - Code language: Python - Code license: Apache-2.0 diff --git a/games/adventure/fitd.md b/games/adventure/fitd.md index 0552a288..6c2b9629 100644 --- a/games/adventure/fitd.md +++ b/games/adventure/fitd.md @@ -4,7 +4,7 @@ _Open source version of the engine used in the Alone in the Dark and sequels._ - Home: https://github.com/jmimu/FITD - State: beta -- Keywords: engine, reimplementation +- Keywords: engine, remake - Code repository: https://github.com/jmimu/FITD - Code language: C, C++ - Code license: GPL-2.0 diff --git a/games/adventure/twin_engine.md b/games/adventure/twin_engine.md index 9745cd72..61989cdc 100644 --- a/games/adventure/twin_engine.md +++ b/games/adventure/twin_engine.md @@ -4,7 +4,7 @@ _A Little Big Adventure engine._ - Home: https://github.com/xesf/twin-e - State: mature, inactive since 2015 -- Keywords: reimplementation, requires original content (Little Big Adventure 1) +- Keywords: engine, remake, requires original content (Little Big Adventure 1) - Code repository: https://github.com/xesf/twin-e - Code language: C - Code license: GPL-2.0 diff --git a/games/framework/_toc.md b/games/framework/_toc.md index bc4001af..7ea7843d 100644 --- a/games/framework/_toc.md +++ b/games/framework/_toc.md @@ -7,11 +7,11 @@ - **[Atlantis](atlantis.md)** (C++, GPL-2.0, mature, inactive since 2011) - **[Blender game engine](blender_game_engine.md)** (C++, GPL-2.0, mature) - **[COCOS2D-X](cocos2dx.md)** (C++, MIT, mature) -- **[Dash Engine](dash.md)** () -- **[Delta Engine](deltaengine.md)** () +- **[Dash Engine](dash.md)** (D, MIT, mature, inactive since 2015) +- **[Delta Engine](deltaengine.md)** (C#, Apache-2.0, mature, inactive since 2015) - **[ENIGMA](enigma.md)** (C++, C, GPL-3.0, mature) -- **[EasyRPG Player](easyrpgplayer.md)** () -- **[Flare Engine](flare_engine.md)** () +- **[EasyRPG Player](easyrpgplayer.md)** (C++, GPL-3.0, mature) +- **[Flare Engine](flare_engine.md)** (C++, GPL-3.0, mature) - **[Flixel](flixel.md)** (ActionScript, MIT, mature) - **[GemRB](gemrb.md)** (C++, Python, GPL-2.0, mature) - **[Godot](godot.md)** (C, C++, MIT, mature) @@ -22,12 +22,12 @@ - **[Lightweight Java Game Library](lwjgl.md)** (Kotlin, C, BSD-3, mature) - **[Lumix Engine](lumix.md)** (C++, MIT, beta) - **[LÖVE](loeve.md)** (C++, zlib, mature) -- **[Mana](manasource.md)** (C++, GPL-2.0, beta) +- **[Mana](mana_source.md)** (C++, GPL-2.0, beta) - **[Maratis](maratis.md)** (C++, GPL-2.0, beta) -- **[MonoGame](monogame.md)** (C#, Ms-MPL MIT, mature) +- **[MonoGame](monogame.md)** (C#, MPL, MIT, mature) - **[O.H.R.RPG.C.E](ohrrpgce.md)** (Basic, GPL-2.0, mature) - **[OGRE3D](ogre3d.md)** (C++, MIT, mature) -- **[Octaforge](octaforge.md)** (C++, Special, mature) +- **[Octaforge](octaforge.md)** (C++, Custom, mature) - **[Open RPG Maker](open_rpg_maker.md)** (beta, inactive since 2014) - **[OpenFL](open_fl.md)** (Haxe, MIT, mature) - **[OpenRPG](open_rpg.md)** (Java, Python, mature, inactive since 2013) @@ -35,11 +35,11 @@ - **[Panda 3D](panda3d.md)** (C++, C, BSD-3, mature) - **[Polycode](polycode.md)** (C, C++, MIT, beta) - **[Qt](qt.md)** (C++, LGPL-3.0, mature) -- **[Quad-engine](quad.md)** (Delphi Pascal, MIT, beta) +- **[Quad-engine](quad.md)** (Pascal, MIT, beta) - **[SDL Game Engine 2D](sge2d.md)** (C, MIT, beta) - **[ScummVM](scummvm.md)** (C++, GPL-2.0, mature) - **[Solarus](solarus.md)** (C++, GPL-3.0, mature) -- **[Superpowers](superpowers.md)** () +- **[Superpowers](superpowers.md)** (Typescript, ISC, mature) - **[Terasology](terasology.md)** (Java, Apache-2.0, mature) - **[Urho3D](urho3d.md)** (C++, Angelscript, MIT, mature) - **[Vega Strike](vegastrike.md)** (C++, GPL-2.0, mature) @@ -47,11 +47,11 @@ - **[ZGameEditor](zgameeditor.md)** (Pascal, MIT, mature) - **[jMonkeyEngine](jmonkeyengine.md)** (Java, BSD, mature) - **[libGDX](libgdx.md)** (Java, C++, C, Apache-2.0, mature) -- **[mkxp](mkxp.md)** () +- **[mkxp](mkxp.md)** (C++, C, GPL-2.0, mature) - **[pyORPG](pyorpg.md)** (Python, MIT, beta, inactive since 2015) - **[pygame](pygame.md)** (C, Python, LGPL-2.1, mature) - **[rpge](rpge.md)** (C, GPL-3.0, beta, inactive since 2014) -- **[sandbox Game Maker](sandboxgamemaker.md)** () -- **[xoreos](xoreos.md)** () +- **[sandbox Game Maker](sandboxgamemaker.md)** (C++, C, Custom, mature, inactive since 2014) +- **[xoreos](xoreos.md)** (C++, GPL-3.0, beta) [comment]: # (end of autogenerated content) \ No newline at end of file diff --git a/games/framework/arianne.md b/games/framework/arianne.md index 2d27f101..abe44f84 100644 --- a/games/framework/arianne.md +++ b/games/framework/arianne.md @@ -5,7 +5,7 @@ _An open source multiplayer online framework._ - Home: https://arianne-project.org/ https://arianne-project.org/engine/marauroa.html - Download: https://arianne-project.org/engine/marauroa.html - State: mature -- Keywords: multiplayer, 2D +- Keywords: MP, 2D - Code repository: git://git.code.sf.net/p/arianne/marauroa - Code language: Java - Code license: GPL-2.0 diff --git a/games/framework/mana_source.md b/games/framework/mana_source.md index 8869994e..c9f6ab01 100644 --- a/games/framework/mana_source.md +++ b/games/framework/mana_source.md @@ -5,7 +5,7 @@ _Complete 2D MMORPG platform._ - Home: http://www.manasource.org/ - Download: http://www.manasource.org/downloads.html - State: beta -- Keywords: server, client, web +- Keywords: MMO - Code repository: https://github.com/mana https://github.com/mana/manaserv - Code language: C++ - Code license: GPL-2.0 diff --git a/games/framework/monogame.md b/games/framework/monogame.md index f2bcfdec..05633b9c 100644 --- a/games/framework/monogame.md +++ b/games/framework/monogame.md @@ -8,7 +8,7 @@ _Open Source implementation of the Microsoft XNA 4 Framework._ - State: mature - Code repository: https://github.com/MonoGame/MonoGame - Code language: C# -- Code license: Ms-MPL MIT +- Code license: MPL, MIT ## Building diff --git a/games/framework/octaforge.md b/games/framework/octaforge.md index 9d123d06..7a9ff454 100644 --- a/games/framework/octaforge.md +++ b/games/framework/octaforge.md @@ -7,7 +7,10 @@ _OctaForge is a 3D game engine and a game development platform._ - State: mature - Code repository: https://git.octaforge.org/ https://github.com/OctaForge (mirrors) - Code language: C++ -- Code license: Custom ([University of Illinois/NCSA Open Source License](https://github.com/OctaForge/OF-Engine/blob/master/COPYING.md)) +- Code license: Custom (NCSA open source license) + +See also: +[University of Illinois/NCSA Open Source License](https://github.com/OctaForge/OF-Engine/blob/master/COPYING.md) ## Building diff --git a/games/framework/ogre3d.md b/games/framework/ogre3d.md index 98c36879..4dfccd6c 100644 --- a/games/framework/ogre3d.md +++ b/games/framework/ogre3d.md @@ -6,7 +6,7 @@ _Scene-oriented, flexible 3D engine written in C++._ - Media: https://en.wikipedia.org/wiki/OGRE - Download: https://www.ogre3d.org/download/sdk - State: mature -- Keywords: 3D rendering engine +- Keywords: 3D - Code repository: https://bitbucket.org/sinbad/ogre/src (hg) https://github.com/OGRECave/ogre (mirror) - Code language: C++ - Code license: MIT diff --git a/games/framework/quad.md b/games/framework/quad.md index 716cf515..9301f89d 100644 --- a/games/framework/quad.md +++ b/games/framework/quad.md @@ -6,7 +6,7 @@ _No description available._ - Download: http://quad-engine.com/downloads.html - State: beta - Code repository: https://bitbucket.org/Darthman/quad/src (hg) -- Code language: Delphi Pascal +- Code language: Pascal - Code license: MIT ## Building diff --git a/games/framework/sandboxgamemaker.md b/games/framework/sandboxgamemaker.md index 2ae4d710..865a9474 100644 --- a/games/framework/sandboxgamemaker.md +++ b/games/framework/sandboxgamemaker.md @@ -7,7 +7,7 @@ _Open source easy to use standalone 3D Game Maker and 3D Game Design program cur - State: mature, inactive since 2014 - Code repository: https://github.com/PlatinumArts/Platinum-Arts-Sandbox-Free-Game-Maker - Code language: C++, C -- Code license: Custom (MIT, modifiedZLIB: requires special credits and notifications) +- Code license: Custom (MIT, modified zlib: requires special credits and notifications) ## Building diff --git a/games/framework/scummvm.md b/games/framework/scummvm.md index 28f807ae..f4acf4e4 100644 --- a/games/framework/scummvm.md +++ b/games/framework/scummvm.md @@ -6,7 +6,7 @@ _Allows you to run certain classic graphical point-and-click adventure games, pr - Media: https://en.wikipedia.org/wiki/ScummVM - Download: http://www.scummvm.org/downloads/ - State: mature -- Keywords: reimplementation +- Keywords: engine - Code repository: https://github.com/scummvm/scummvm - Code language: C++ - Code license: GPL-2.0 diff --git a/games/library/_toc.md b/games/library/_toc.md index 8786cc5c..c8192ded 100644 --- a/games/library/_toc.md +++ b/games/library/_toc.md @@ -1,27 +1,27 @@ # Popular required libraries [comment]: # (start of autogenerated content, do not edit) -- **[Boost (C++ Libraries)](boost.md)** (C++, Special, mature) -- **[Crypto++](crypto.md)** () +- **[Boost (C++ Libraries)](boost.md)** (C++, Boost license 1.0, mature) +- **[Crypto++](crypto.md)** (C++, Boost-1.0, mature) - **[Doxygen](doxygen.md)** (C++, GPL-2.0, mature) - **[FreeType](freetype.md)** (C, GPL, mature) - **[HarfBuzz](harfbuzz.md)** (C++, MIT, mature) - **[LZMA SDK](lzma.md)** (C, LGPL-2.0, mature) - **[Libxml2](libxml2.md)** (C, MIT, mature) - **[Lua](lua.md)** (C, MIT, mature) -- **[Open AL](openal.md)** () -- **[Open AL Soft](openalsoft.md)** () -- **[OpenSSL](openssl.md)** (C, Special, mature) +- **[Open AL](open_al.md)** (Proprietary, mature) +- **[Open AL Soft](open_al_soft.md)** (C, LGPL-2.0, mature) +- **[OpenSSL](openssl.md)** (C, Custom, mature) - **[Pthreads-win32](pthreads_win32.md)** (C, LGPL-2.1, mature) - **[Ragel](ragel.md)** (C++, MIT, mature) -- **[SWIG](swig.md)** (C++, Special, mature) +- **[SWIG](swig.md)** (C++, SWIG license, mature) - **[Simple DirectMedia Layer](sdl_2.md)** (C, zlib, mature) - **[Simple and Fast Multimedia Library](sfml.md)** (C++, zlib, mature) -- **[XZ Utils](xz.md)** (C, Different, see file Copying, liblzma is public domain, mature) -- **[libpng](libpng.md)** (C, Special, mature) +- **[XZ Utils](xz.md)** (C, Custom, mature) +- **[libpng](libpng.md)** (C, Custom, mature) - **[pkg-config](pkgconfig.md)** (C, GPL-2.0, mature) -- **[wxWidgets](wxwidgets.md)** (C++, Objective C, Special, mature) -- **[yaml-cpp](yaml_cpp.md)** () +- **[wxWidgets](wxwidgets.md)** (C++, Objective C, Custom, mature) +- **[yaml-cpp](yaml_cpp.md)** (C++, MIT, mature) - **[zlib](zlib.md)** (C, zlib, mature) [comment]: # (end of autogenerated content) \ No newline at end of file diff --git a/games/library/boost.md b/games/library/boost.md index e1cae50c..cd25d145 100644 --- a/games/library/boost.md +++ b/games/library/boost.md @@ -8,8 +8,9 @@ _Boost provides free peer-reviewed portable C++ source libraries._ - State: mature - Code repository: https://github.com/boostorg/boost - Code language: C++ -- Code license: Special -- Code license details: [Boost Software License 1.0](https://github.com/boostorg/boost/blob/master/LICENSE_1_0.txt) +- Code license: Boost license 1.0 + +[Boost Software License 1.0](https://github.com/boostorg/boost/blob/master/LICENSE_1_0.txt) ## Building diff --git a/games/library/libpng.md b/games/library/libpng.md index e7228dee..4132f0c0 100644 --- a/games/library/libpng.md +++ b/games/library/libpng.md @@ -6,11 +6,11 @@ _libpng is the official PNG reference library._ - Media: https://en.wikipedia.org/wiki/Libpng - Download: (see home) - State: mature -- Keywords: official - Code repository: https://sourceforge.net/p/libpng/code/ci/master/tree/ - Code language: C -- Code license: Special -- Code license details: [libpng](https://sourceforge.net/p/libpng/code/ci/master/tree/LICENSE) +- Code license: Custom (see LICENSE) + +[libpng](https://sourceforge.net/p/libpng/code/ci/master/tree/LICENSE) ## Building diff --git a/games/library/openssl.md b/games/library/openssl.md index 9e95e36d..a429799a 100644 --- a/games/library/openssl.md +++ b/games/library/openssl.md @@ -8,8 +8,7 @@ _Toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) p - State: mature - Code repository: https://www.openssl.org/source/gitrepo.html https://github.com/openssl/openssl (mirror) - Code language: C -- Code license: Special -- Code license details: [Dual licensed under special licenses](https://github.com/openssl/openssl/blob/master/LICENSE) +- Code license: Custom (Dual licensed under special licenses, https://github.com/openssl/openssl/blob/master/LICENSE) ## Building diff --git a/games/library/sdl_2.md b/games/library/sdl_2.md index 7a437b96..30f18552 100644 --- a/games/library/sdl_2.md +++ b/games/library/sdl_2.md @@ -6,7 +6,7 @@ _Simple DirectMedia Layer is a cross-platform development library designed to pr - Media: https://en.wikipedia.org/wiki/Simple_DirectMedia_Layer - Download: https://www.libsdl.org/download-2.0.php - State: mature -- Keywords: multimedia hardware abstraction layer, 3D graphics +- Keywords: 3D - Code repository: http://hg.libsdl.org/SDL (mercurial) - Code language: C - Code license: zlib diff --git a/games/library/swig.md b/games/library/swig.md index 18c89b5e..2600d9ee 100644 --- a/games/library/swig.md +++ b/games/library/swig.md @@ -9,8 +9,7 @@ _Software development tool that connects programs written in C and C++ with a va - Keywords: language binding, interface generator - Code repository: https://github.com/swig/swig - Code language: C++ -- Code license: Special -- Code license details: [SWIG license](https://raw.githubusercontent.com/swig/swig/master/LICENSE) +- Code license: SWIG license (https://raw.githubusercontent.com/swig/swig/master/LICENSE) ## Building diff --git a/games/library/wxwidgets.md b/games/library/wxwidgets.md index 5fbae42c..08d0e592 100644 --- a/games/library/wxwidgets.md +++ b/games/library/wxwidgets.md @@ -9,6 +9,6 @@ _C++ library that lets developers create applications for Windows, Mac OS X, Lin - Keywords: gui toolkit - Code repository: https://github.com/wxWidgets/wxWidgets - Code language: C++, Objective C -- Code license: Special +- Code license: Custom ## Building diff --git a/games/library/xz.md b/games/library/xz.md index b7ed6561..791d477e 100644 --- a/games/library/xz.md +++ b/games/library/xz.md @@ -8,7 +8,7 @@ _General-purpose data compression software with a high compression ratio._ - State: mature - Code repository: https://git.tukaani.org/?p=xz.git - Code language: C -- Code license: Different, see file Copying, liblzma is public domain +- Code license: Custom (see file Copying, liblzma is public domain) Python support [lzma](https://docs.python.org/3/library/lzma.html) @@ -16,5 +16,5 @@ Supersedes [LZMA Utils](https://tukaani.org/lzma/) ## Building -See building instructions in source folder windows. +- Build instructions: (see instructions in source folder windows) diff --git a/games/misc/_toc.md b/games/misc/_toc.md index 294a296f..fda818a9 100644 --- a/games/misc/_toc.md +++ b/games/misc/_toc.md @@ -6,7 +6,7 @@ - **[Dungeon Mapper](dungeon_mapper.md)** (C++, GPL-3.0, beta, inactive since 2013) - **[GM Tools](gm_tools.md)** (C++, GPL-2.0, beta, inactive since 2004) - **[JaNaG - Java Name Generator](java_ng.md)** (Java, GPL-2.0, mature, inactive since 2011) -- **[Open Legend RPG](open_legend_rpg.md)** (Text, Special, mature) +- **[Open Legend RPG](open_legend_rpg.md)** (Text, Custom, mature) - **[PCGen](pcgen.md)** (Java, mature) - **[Pymapper](pymapper.md)** (Python, GPL-3.0, mature) - **[RPDungeon - computer aided role playing](rpdungeon.md)** (Pascal, GPL-2.0, beta, inactive since 2006) diff --git a/games/misc/open_legend_rpg.md b/games/misc/open_legend_rpg.md index 54555e71..9844b6b3 100644 --- a/games/misc/open_legend_rpg.md +++ b/games/misc/open_legend_rpg.md @@ -4,10 +4,9 @@ _A tabletop roleplaying game (or RPG) in which the players play the part of migh - Home: http://www.openlegendrpg.com/ - State: mature -- Keywords: RPG system +- Keywords: board game - Code repository: https://github.com/openlegend/core-rules - Code language: Text -- Code license: Special -- Code license details: [Open Legend Community License](https://github.com/openlegend/core-rules/blob/master/LICENSE.md) +- Code license: Custom (Open Legend Community License: https://github.com/openlegend/core-rules/blob/master/LICENSE.md) diff --git a/games/rpg/_toc.md b/games/rpg/_toc.md index e9a7283d..a1107834 100644 --- a/games/rpg/_toc.md +++ b/games/rpg/_toc.md @@ -6,16 +6,16 @@ - **[Ardentryst](ardentryst.md)** (Python, GPL-3.0, mature, inactive since 2009) - **[Argentum Online](argentum_online.md)** (VB, GPL-2.0, beta, inactive since 2014) - **[Arx Libertatis](arx_libertatis.md)** (C++, GPL-3.0, mature) -- **[Atrinik](atrinik.md)** () +- **[Atrinik](atrinik.md)** (C, mature, inactive since 2016) - **[Avanor](avanor.md)** (C++, Lua, GPL-2.0, beta, inactive since 2006) - **[Betrayer's Moon Tactics](betrayer_moon_tactics.md)** (Javascript, GPL-2.0, beta, inactive since 2006) - **[BrowserQuest](browserquest.md)** (Javascript, MPL-2.0, mature) - **[Castle of the Winds](castle_of_the_winds.md)** (Javascript, MIT, beta) - **[Cataclysm](cataclysm.md)** (C++, CC-BY-SA-3, beta, inactive since 2012) -- **[Catch Challenger](catch_challenger.md)** () -- **[Choria](choria.md)** () +- **[Catch Challenger](catch_challenger.md)** (C++, GPL-3.0, mature) +- **[Choria](choria.md)** (C++, C, Lua, GPL-3.0, mature) - **[Classic Blades of Exile](blades_of_exile.md)** (C++, GPL-2.0, mature) -- **[Crossfire](crossfire.md)** () +- **[Crossfire](crossfire.md)** (C, Java, GPL-2.0, mature) - **[DNT](dnt.md)** (C++, GPL-3.0, beta, inactive since 2016) - **[Daimonin](daimonin.md)** (C, GPL-2.0, mature) - **[Dark City](dark_city.md)** (PHP, GPL-2.0, mature, inactive since 2012) @@ -26,18 +26,18 @@ - **[Dragon Hunt](dragon_hunt.md)** (Python, GPL-2.0, mature) - **[Dungeon Crawl Stone Soup](dungeon_crawl_stone_soup.md)** (C++, Lua, GPL-2.0, mature) - **[Dungeon Hero](dungeon_hero.md)** (Java, MIT, mature) -- **[Dungeon Monkey Eternal](dungeon_monkey_eternal.md)** () +- **[Dungeon Monkey Eternal](dungeon_monkey_eternal.md)** (Python, GPL-2.0, mature, inactive since 2016) - **[Dungeon Quest](dungeon_quest.md)** (Java, MIT, mature) - **[Egoboo](egoboo.md)** (C++, C, GPL-3.0, mature, inactive since 2015) - **[Endless Sky](endless_sky.md)** (C++, GPL-3.0, mature) - **[Eos, Dawn of Light: A Space Opera](eos_dawn_of_light.md)** (Python, MIT, beta, inactive since 2007) - **[Erebus](erebus.md)** (C++, GPL-3.0, beta) -- **[Eternal Lands](eternal_lands.md)** (C, C++, Special, mature) -- **[Evol Online](evol_online.md)** () +- **[Eternal Lands](eternal_lands.md)** (C, C++, Custom, mature) +- **[Evol Online](evol_online.md)** (mature) - **[Exult](exult.md)** (C++, GPL-2.0, mature) - **[Fall of Imyrin](fall_of_imiryn.md)** (Python, GPL-3.0, beta, inactive since 2009) - **[Fallen Spire](fallen_spire.md)** (Python, GPL-3.0, beta, inactive since 2009) -- **[Freedink](freedink.md)** () +- **[Freedink](freedink.md)** (C++, GPL-3.0, mature) - **[FreedroidRPG](freedroid.md)** (C, GPL-2.0, mature) - **[GalaxyMage Redux](galaxymage_redux.md)** (Python, GPL-2.0, beta, inactive since 2011) - **[GearHead](gearhead.md)** (Pascal, Python, LGPL-2.1, Apache-2.0, mature) @@ -53,12 +53,12 @@ - **[KQ Lives](kq_lives.md)** (C, GPL-2.0, beta, inactive since 2011) - **[Kobold's Quest 2](kobolds_quest_2.md)** (Python, LGPL-3.0, beta, inactive since 2011) - **[Labyrinth of Worlds](labyrinth_of_worlds.md)** (C++, beta, inactive since 2010) -- **[Land of Fire](land_of_fire.md)** () +- **[Land of Fire](land_of_fire.md)** (beta) - **[Linley's Dungeon Crawl](linleys_dungeon_crawl.md)** (C, Custom, mature, inactive since 2006) - **[Lips of Suna](lips_of_suna.md)** (C, GPL-3.0, beta, inactive since 2014) - **[Magarena](magarena.md)** (Java, Groovy, GPL-3.0, mature) - **[Meridian 59](meridian59.md)** (C++, C, GPL-2.0, mature) -- **[Meritous](meritous.md)** () +- **[Meritous](meritous.md)** (C, GPL-3.0, mature, inactive since 2008) - **[Moria](moria.md)** (C, GPL-3.0, mature, inactive since 2008) - **[NLarn](nlarn.md)** (C, Lua, GPL-3.0, mature) - **[Naev](naev.md)** (C, Lua, GPL-3.0, mature) @@ -68,21 +68,21 @@ - **[Open Tibia](open_tibia.md)** (C++, GPL-2.0, beta, inactive since 2014) - **[OpenMW](open_mw.md)** (C++, GPL-3.0, mature) - **[Openglad](openglad.md)** (C++, GPL-2.0, mature, inactive since 2004) -- **[Other-Life](other_life.md)** () +- **[Other-Life](other_life.md)** (C, C++, beta) - **[PARPG](parpg.md)** (beta, inactive since 2012) - **[Phantasy Star Rebirth](phantasy.md)** (C++, GPL-3.0, beta, inactive since 2013) - **[PlaneShift](planeshift.md)** (C++, GPL-2.0, mature) - **[Project Diaspora](project_diaspora.md)** (C, zlib, beta, inactive since 2011) - **[REGoth](regoth.md)** (C++, GPL-3.0, beta) -- **[Radakan](radakan.md)** (Python, Special, beta, inactive since 2010) +- **[Radakan](radakan.md)** (Python, Custom, beta, inactive since 2010) - **[Rogue Clone IV](rogue_clone_iv.md)** (C, BSD, mature, inactive since 2006) - **[Roguish](roguish.md)** (Javascript, BSD-3, beta, inactive since 2015) -- **[Room for Change](room_for_change.md)** () +- **[Room for Change](room_for_change.md)** (Java, Apache-2.0, mature, inactive since 2013) - **[RuneSword II](runesword_ii.md)** (Visual Basic, mature, inactive since 2011) - **[S.C.O.U.R.G.E.](scourge.md)** (C++, GPL-2.0, beta, inactive since 2008) - **[Silvertree](silvertree.md)** (C++, GPL-3.0, beta, inactive since 2007) - **[Slash'EM](slash_em.md)** (C, Custom, beta, inactive since 2007) -- **[Source of Tales](source_of_tales.md)** () +- **[Source of Tales](source_of_tales.md)** (Lua, GPL-3.0, mature, inactive since 2013) - **[Space Station 13](space_station_13.md)** (mature) - **[Spice Trade](spice_trade.md)** (Java, LGPL-2.0, mature, inactive since 2005) - **[Stendhal](stendhal.md)** (Java, GPL-2.0, mature) @@ -90,22 +90,22 @@ - **[Summoning Wars](summoming_wars.md)** (C++, GPL-3.0, beta, inactive since 2014) - **[Tales of Maj'Eyal](tales_of_maj_eyal.md)** (C, Lua, GPL-3.0, mature) - **[The Clans](the_clans.md)** (C, GPL-2.0, beta, inactive since 2003) -- **[The Mana World](manaworld.md)** () +- **[The Mana World](mana_world.md)** (PHP, GPL-2.0, mature) - **[The hunt for the lost rainbow jewels (Jewelhunt)](jewelhunt.md)** (Java, GPL-2.0, beta) - **[Trinity Reign](trinity_reign.md)** (C++, GPL-3.0, beta, inactive since 2013) - **[Tuxemon](tuxemon.md)** (Python, GPL-3.0, mature) - **[UlDunAd](uidunad.md)** (Python, GPL-3.0, beta, inactive since 2011) -- **[Umbra](umbra.md)** (Python, Special, beta, inactive since 2002) +- **[Umbra](umbra.md)** (Python, Custom, beta, inactive since 2002) - **[UnNetHack](unnethack.md)** (C, Custom, mature) - **[Underworld Adventures](underworld_adventures.md)** (C++, Lua, GPL-2.0, beta, inactive since 2006) -- **[Valyria Tear](valyria_tear.md)** () +- **[Valyria Tear](valyria_tear.md)** (Lua, C++, C, GPL, mature) - **[VegaTrek](vegatrek.md)** (GPL-2.0, beta, inactive since 2013) - **[Waste's Edge](wastes_edge.md)** (Python, GPL-2.0, beta) - **[Witch Blast](witch_blast.md)** (C++, GPL-3.0, beta, inactive since 2015) - **[World of Phaos](world_of_phaos.md)** (PHP, GPL-2.0, mature, inactive since 2011) - **[XU4](xu4.md)** (C++, GPL-2.0, mature) - **[ZAngband](zangband.md)** (C, mature, inactive since 2005) -- **[Zelda: Mystery of Solarus DX](zelda_mystery_of_solarus_dx.md)** () +- **[Zelda: Mystery of Solarus DX](zelda_mystery_of_solarus_dx.md)** (Lua, GPL-3.0, mature) - **[diablo-js](diablo_js.md)** (Java, Javascript, MIT, mature) [comment]: # (end of autogenerated content) \ No newline at end of file diff --git a/games/rpg/argentum_online.md b/games/rpg/argentum_online.md index 3feec92c..fb63ada6 100644 --- a/games/rpg/argentum_online.md +++ b/games/rpg/argentum_online.md @@ -5,7 +5,7 @@ _Open Source FREE 2D MMORPG._ - Home: http://www.comunidadargentum.com/ (Spanish) - Download: http://www.comunidadargentum.com/descargas/ - State: beta, inactive since 2014 -- Keywords: mmo +- Keywords: MMO - Code repository: http://morgoao.cvs.sourceforge.net/ (cvs) https://github.com/Argentum-Online/Argentum-Online - Code language: VB - Code license: GPL-2.0 diff --git a/games/rpg/browserquest.md b/games/rpg/browserquest.md index 4adf392d..ce9c4689 100644 --- a/games/rpg/browserquest.md +++ b/games/rpg/browserquest.md @@ -5,7 +5,7 @@ _A Massively Multiplayer Adventure._ - Home: http://browserquest.mozilla.org/ - Media: https://en.wikipedia.org/wiki/BrowserQuest - State: mature -- Keywords: MMORPG +- Keywords: MMO - Code repository: https://github.com/mozilla/BrowserQuest - Code language: Javascript - Code license: MPL-2.0 diff --git a/games/rpg/eternal_lands.md b/games/rpg/eternal_lands.md index f5d06767..2c15232c 100644 --- a/games/rpg/eternal_lands.md +++ b/games/rpg/eternal_lands.md @@ -9,8 +9,7 @@ _Multiplayer, online role-playing game (MMORPG)._ - Keywords: MMO - Code repository: https://github.com/raduprv/Eternal-Lands - Code language: C, C++ -- Code license: Special -- Code license details: [Modified QTPL](https://raw.githubusercontent.com/raduprv/Eternal-Lands/master/eternal_lands_license.txt) +- Code license: Custom (modified QTPL: https://raw.githubusercontent.com/raduprv/Eternal-Lands/master/eternal_lands_license.txt) ## Building diff --git a/games/rpg/imperium.md b/games/rpg/imperium.md index 392fd512..ead48cba 100644 --- a/games/rpg/imperium.md +++ b/games/rpg/imperium.md @@ -5,7 +5,7 @@ _A game of intergalactic exploration, warfare, and economics._ - Home: https://empiredirectory.net/index.php - Download: https://empiredirectory.net/index.php/new-downloads - State: mature -- Keywords: text based +- Keywords: console - Code repository: (see download) Nedd to register to download sources. diff --git a/games/rpg/open_mw.md b/games/rpg/open_mw.md index 3a13d858..363328e0 100644 --- a/games/rpg/open_mw.md +++ b/games/rpg/open_mw.md @@ -6,7 +6,7 @@ _Unofficial open source engine reimplementation of the game Morrowind._ - Media: https://en.wikipedia.org/wiki/OpenMW - Download: https://openmw.org/downloads/ - State: mature -- Keywords: remake, requires original content (Morrowind) +- Keywords: engine, remake, requires original content (Morrowind) - Code repository: https://github.com/OpenMW/openmw - Code language: C++ - Code license: GPL-3.0 diff --git a/games/rpg/radakan.md b/games/rpg/radakan.md index dbbbbe4f..47079e5f 100644 --- a/games/rpg/radakan.md +++ b/games/rpg/radakan.md @@ -8,6 +8,6 @@ _Single player RPG game, set in a dark fantasy setting where four unique races s - Keywords: SP - Code repository: https://sourceforge.net/p/radakan/code/HEAD/tree/ - Code language: Python -- Code license: Special +- Code license: Custom ## Building diff --git a/games/rpg/room_for_change.md b/games/rpg/room_for_change.md index 030a0b26..81318bdb 100644 --- a/games/rpg/room_for_change.md +++ b/games/rpg/room_for_change.md @@ -3,6 +3,7 @@ _Randomly generated action RPG._ - Home: https://github.com/antionio/game-off-2013 +- State: mature, inactive since 2013 - Code repository: https://github.com/antionio/game-off-2013 - Code language: Java - Code license: Apache-2.0 diff --git a/games/rpg/source_of_tales.md b/games/rpg/source_of_tales.md index f839189d..425ba4ce 100644 --- a/games/rpg/source_of_tales.md +++ b/games/rpg/source_of_tales.md @@ -3,6 +3,7 @@ _A massive multiplayer online roleplaying game._ - Home: http://www.sourceoftales.org/ +- State: mature, inactive since 2013 - Keywords: MMO - Code repository: https://github.com/tales/sourceoftales - Code language: Lua diff --git a/games/rpg/stendhal.md b/games/rpg/stendhal.md index 86c1f64e..7299c1ee 100644 --- a/games/rpg/stendhal.md +++ b/games/rpg/stendhal.md @@ -5,7 +5,7 @@ _Multiplayer online adventure game with an old school feel._ - Home: https://stendhalgame.org/ - Download: (see home) - State: mature -- Keywords: MP, server +- Keywords: MP, online - Code repository: https://sourceforge.net/p/arianne/stendhal/ci/master/tree/ - Code language: Java - Code license: GPL-2.0 diff --git a/games/rpg/uidunad.md b/games/rpg/uidunad.md index 98a6c8bc..ef5ce7f8 100644 --- a/games/rpg/uidunad.md +++ b/games/rpg/uidunad.md @@ -4,7 +4,7 @@ _Ultimate Dungeon Adventure (UlDunAd) - the extremely flexible, fun, text/graphi - Home: https://www.pygame.org/project-UlDunAd-1140-.html - State: beta, inactive since 2011 -- Keywords: text-based +- Keywords: console - Code repository: https://github.com/nhydock/UlDunAd - Code language: Python - Code license: GPL-3.0 diff --git a/games/rpg/umbra.md b/games/rpg/umbra.md index 2652a0e7..35980566 100644 --- a/games/rpg/umbra.md +++ b/games/rpg/umbra.md @@ -7,7 +7,7 @@ _Computer role-playing game written in Python._ - State: beta, inactive since 2002 - Code repository: (see download) - Code language: Python -- Code license: Special +- Code license: Custom ## Building diff --git a/games/rpg/valyria_tear.md b/games/rpg/valyria_tear.md index 67b379ef..10599060 100644 --- a/games/rpg/valyria_tear.md +++ b/games/rpg/valyria_tear.md @@ -4,7 +4,8 @@ _J-RPG (Based on the Hero of Allacrost engine)._ - Home: https://valyriatear.blogspot.de/ - Download: https://valyriatear.blogspot.de/p/downloads.html -- Keywords: JRPG +- State: mature +- Keywords: JRPG, popular - Code repository: https://github.com/ValyriaTear/ValyriaTear - Code language: Lua, C++, C - Code license: GPL diff --git a/games/rpg/zelda_mystery_of_solarus_dx.md b/games/rpg/zelda_mystery_of_solarus_dx.md index 615b3ddc..7c75b7ed 100644 --- a/games/rpg/zelda_mystery_of_solarus_dx.md +++ b/games/rpg/zelda_mystery_of_solarus_dx.md @@ -3,11 +3,14 @@ _This quest is a free, open-source game that works with Solarus, an open-source Zelda-like 2D game engine._ - Home: https://github.com/solarus-games/zsdx -- Code repository: https://github.com/solarus-games/zsdx +- State: mature +- Code repository: https://gitlab.com/solarus-games/zsdx.git, https://github.com/solarus-games/zsdx (old) - Code language: Lua - Code license: GPL-3.0 +- Code dependencies: Solarus engine -Uses the [Solarus engine](../framework/solarus.md). +See also: [Solarus engine](../framework/solarus.md). ## Building +- Build system: CMake \ No newline at end of file diff --git a/games/simulation/3d_city.md b/games/simulation/3d_city.md index fb5ab6e7..1a148be4 100644 --- a/games/simulation/3d_city.md +++ b/games/simulation/3d_city.md @@ -4,6 +4,8 @@ _WebGL version of micropolisJS._ - Home: https://github.com/lo-th/3d.city - Play: http://lo-th.github.io/3d.city/index.html +- State: mature, inactive since 2016 +- Keywords: browser - Code repository: https://github.com/lo-th/3d.city - Code language: Javascript - Code license: GPL-3.0 diff --git a/games/simulation/_toc.md b/games/simulation/_toc.md index 0019cd1f..dd4f83ab 100644 --- a/games/simulation/_toc.md +++ b/games/simulation/_toc.md @@ -1,7 +1,7 @@ # Simulation games [comment]: # (start of autogenerated content, do not edit) -- **[3d.city](3d_city.md)** () +- **[3d.city](3d_city.md)** (Javascript, GPL-3.0, mature, inactive since 2016) - **[Danger from the Deep](danger_from_the_deep.md)** (C++, GPL-2.0, beta, inactive since 2011) - **[FreeTrain](freetrain.md)** (C#, LPGL-2.1, beta, inactive since 2009) - **[Freeminer](freeminer.md)** (C++, Lua, GPL-3.0, beta) @@ -12,9 +12,9 @@ - **[Open Transport Tycoon](open_transport_tycoon.md)** (C++, GPL-2.0, mature) - **[OpenCity](open_city.md)** (C++, GPL-2.0, beta) - **[OpenSkyscraper](open_skyscraper.md)** (C++, GPL-2.0, beta) -- **[Our Personal Space](our_personal_space.md)** () -- **[Pioneer](pioneer.md)** (C++, C, Mixed, mature) +- **[Our Personal Space](our_personal_space.md)** (Ren'py, GPL-3.0, mature) +- **[Pioneer](pioneer.md)** (C++, C, Apache-2.0, GPL-3.0, mature) - **[SimuTrans](simutrans.md)** (C++, Artistic License, mature) -- **[micropolisJS](micropolis_js.md)** () +- **[micropolisJS](micropolis_js.md)** (C++, Java, Python, GPL-3.0, mature) [comment]: # (end of autogenerated content) \ No newline at end of file diff --git a/games/simulation/micropolis_js.md b/games/simulation/micropolis_js.md index eee96642..0204a3b8 100644 --- a/games/simulation/micropolis_js.md +++ b/games/simulation/micropolis_js.md @@ -3,7 +3,8 @@ _A port of Micropolis to JS/HTML5._ - Home: http://www.graememcc.co.uk/micropolisJS/ -- Download: can be played online +- State: mature +- Keywords: browser - Code repository: https://github.com/graememcc/micropolisJS - Code language: C++, Java, Python - Code license: GPL-3.0 diff --git a/games/simulation/our_personal_space.md b/games/simulation/our_personal_space.md index 56e42e5d..60d26ad5 100644 --- a/games/simulation/our_personal_space.md +++ b/games/simulation/our_personal_space.md @@ -4,10 +4,12 @@ _Simulation game where you play as a colonist on a new planet with your new husb - Home: http://metasepia.icecavern.net/OurPersonalSpace/index.html - Download: (see home) +- State: mature - Keywords: visual novel - Code repository: https://github.com/qirien/personal-space - Code language: Ren'py - Code license: GPL-3.0 +- Code dependencies: Ren'Py ## Building diff --git a/games/simulation/pioneer.md b/games/simulation/pioneer.md index 94fa22fb..c1c5a5a6 100644 --- a/games/simulation/pioneer.md +++ b/games/simulation/pioneer.md @@ -8,8 +8,7 @@ _Pioneer is a space adventure game set in our galaxy at the turn of the 31st cen - State: mature - Code repository: https://github.com/pioneerspacesim/pioneer - Code language: C++, C -- Code license: Mixed -- Code license details: Apache-2.0, GPL-3.0 +- Code license: Apache-2.0, GPL-3.0 See also the [sourceforge project](https://sourceforge.net/projects/pioneerspacesim/). diff --git a/games/statistics.md b/games/statistics.md index 936bd3c4..01abbc10 100644 --- a/games/statistics.md +++ b/games/statistics.md @@ -1,43 +1,37 @@ [comment]: # (autogenerated content, do not edit) # Statistics -analyzed 406 entries on 2018-06-07 13:01:36 +analyzed 406 entries on 2018-06-08 14:40:18 ## State -- mature: 194 (47.8%) -- beta: 164 (40.4%) -- inactive: 152 (37.4%) +- mature: 237 (58.4%) +- beta: 169 (41.6%) +- inactive: 166 (40.9%) ##### Inactive State -zoc (2017), dark_destiny (2016), dnt (2016), freerct (2016), polis (2016), wargame (2016), egoboo (2015), epic_of_heroes (2015), free_heroes2_engine (2015), mewl (2015), project_helena (2015), pyorpg (2015), roguish (2015), witch_blast (2015), argentum_online (2014), battles_of_antargis (2014), deity (2014), drop_shock (2014), dune_dynasty (2014), eternalwinterwars (2014), farcolony (2014), hale (2014), heroes_of_wing_commander (2014), kingdoms (2014), lips_of_suna (2014), open_rpg_maker (2014), open_tibia (2014), rpge (2014), sintel (2014), summoming_wars (2014), turious (2014), xenowar (2014), bos_wars (2013), c_evo (2013), decker (2013), demigod (2013), dungeon_mapper (2013), holy_spirit (2013), mechcommander2_omnitech (2013), mpango (2013), open_rpg (2013), phantasy (2013), trinity_reign (2013), vegatrek (2013), blacknova_traders (2012), cataclysm (2012), commando_js (2012), conquests (2012), dark_city (2012), golbin_camp (2012), hexwar (2012), outer_space (2012), parpg (2012), solar_empire (2012), thousand_parsec (2012), wizards_magic (2012), age_of_magic (2011), atlantis (2011), battlefield_java (2011), danger_from_the_deep (2011), dawn (2011), galaxymage_redux (2011), java_ng (2011), kobolds_quest_2 (2011), kq_lives (2011), open_moo2 (2011), project_diaspora (2011), runesword_ii (2011), song_of_albion (2011), star_control_2 (2011), uidunad (2011), world_of_phaos (2011), x-force (2011), ai_wars (2010), labyrinth_of_worlds (2010), linwarrior (2010), mercenary_commander (2010), open_homm (2010), radakan (2010), singularity (2010), skrupel (2010), slay (2010), space_trader_for_java (2010), xsera (2010), 8kingdoms (2009), alien_assault_traders (2009), annchienta (2009), ardentryst (2009), begin2 (2009), blitzkrieg (2009), dark_oberon (2009), duel_commander (2009), fall_of_imiryn (2009), fallen_spire (2009), freetrain (2009), glest (2009), goblin_hack (2009), open_pop (2009), orient (2009), secret_mario_chronicles (2009), world_of_heroes (2009), a_planets_revenge (2008), attal (2008), freestars (2008), mars_land_of_no_mercy (2008), moopy (2008), moria (2008), scoreos (2008), scourge (2008), sengoky_warring_states_of_japan (2008), space_opera (2008), space_trader_for_windows (2008), armies (2007), eos_dawn_of_light (2007), silvertree (2007), slash_em (2007), arthurs_knights (2006), avanor (2006), betrayer_moon_tactics (2006), boson (2006), crown_and_cutless (2006), eleconics (2006), jquest (2006), linleys_dungeon_crawl (2006), metal_mech (2006), rogue_clone_iv (2006), rpdungeon (2006), underworld_adventures (2006), galaxyng (2005), h_world (2005), spice_trade (2005), watomic (2005), zangband (2005), colonization_too (2004), geewhiz (2004), gm_tools (2004), iter_vehemens_ad_necem (2004), openglad (2004), promisance (2004), t_bots (2004), antichess (2003), catmother (2003), civil (2003), machinations (2003), pizza_business (2003), planetary_hoppers (2003), the_clans (2003), wargamer (2003), umbra (2002), civil_war (2001), tuxracer (2001), operation_citadel (2000) +Zone of Control (2017), 3d.city (2016), Atrinik (2016), Birth of the Empires (2016), DNT (2016), Dark Destiny (2016), Dungeon Monkey Eternal (2016), FreeRCT (2016), Mechanized Assault & eXploration Reloaded (2016), Polis (2016), WarGame (2016), Dash Engine (2015), Delta Engine (2015), Egoboo (2015), Free heroes2 engine (2015), M.E.W.L. (2015), Project Helena (2015), Roguish (2015), The Epic of Heroes (2015), TwinEngine (2015), Witch Blast (2015), pyORPG (2015), Argentum Online (2014), Battles of Antargis (2014), Deity (2014), Drop Shock (2014), Dune Dynasty (2014), EternalWinterWars (2014), FAR Colony (2014), Hale (2014), Heroes of Wing Commander (2014), Kingdoms (2014), Lips of Suna (2014), Open RPG Maker (2014), Open Tibia (2014), Sintel The Game (2014), Summoning Wars (2014), Turious (2014), Xenowar (2014), rpge (2014), sandbox Game Maker (2014), Bos Wars (2013), C-evo (2013), Decker (2013), DemiGod (2013), Dungeon Mapper (2013), Holyspirit (2013), MechCommander 2 Omnitech (2013), Mpango (2013), OpenRPG (2013), Phantasy Star Rebirth (2013), Room for Change (2013), Source of Tales (2013), Trinity Reign (2013), VegaTrek (2013), BlackNova Traders (2012), Cataclysm (2012), CommandoJS (2012), Conquests (2012), Dark City (2012), Goblin Camp (2012), Hexwar (2012), Outer Space (2012), PARPG (2012), Solar Empire (2012), Thousand Parsec (2012), UFO2000 (2012), Wizards Magic (2012), Age of Magic (2011), Atlantis (2011), Battlefield Java (2011), Danger from the Deep (2011), Dawn (2011), GalaxyMage Redux (2011), JaNaG - Java Name Generator (2011), KQ Lives (2011), Kobold's Quest 2 (2011), OpenMOO2 (2011), Project Diaspora (2011), RuneSword II (2011), Song of Albion (2011), Star Control II: The Ur-Quan Masters (2011), UlDunAd (2011), World of Phaos (2011), X-Force: Fight For Destiny (2011), AI Wars (2010), Crimson Fields (2010), Endgame: Singularity (2010), Labyrinth of Worlds (2010), Linwarrior 3D (2010), Mercenary Commander (2010), OpenHoMM (2010), Radakan (2010), Skrupel - Tribute Compilation (2010), Slay (2010), SpaceTrader for Java (2010), XSera (2010), 8 Kingdoms (2009), Annchienta (2009), Ardentryst (2009), Begin2 (2009), Blitzkrieg (2009), Dark Oberon (2009), Duel Commander (2009), Fall of Imyrin (2009), Fallen Spire (2009), FreeTrain (2009), Glest (2009), Goblin Hack (2009), ORIENT (2009), OpenPop (2009), Secret Mario Chronicles (2009), World of Heroes (2009), A Planet's Revenge (2008), Attal (2008), Freestars (2008), Mars, Land of No Mercy (2008), Meritous (2008), Moopy (2008), Moria (2008), S.C.O.U.R.G.E. (2008), Scoreos (2008), Sengoku: Warring States of Japan (2008), Space Opera (2008), Space Trader for Windows (2008), Armies (2007), Eos, Dawn of Light: A Space Opera (2007), Silvertree (2007), Slash'EM (2007), Arthur's Knights (2006), Avanor (2006), Betrayer's Moon Tactics (2006), Boson (2006), Crown and Cutless (2006), Eleconics (2006), JQuest (2006), Linley's Dungeon Crawl (2006), Metal Mech (2006), RPDungeon - computer aided role playing (2006), Rogue Clone IV (2006), Underworld Adventures (2006), GalaxyNG (2005), H-World (2005), Spice Trade (2005), WAtomic (2005), ZAngband (2005), Colonization too (2004), GM Tools (2004), Gee Whiz (2004), Iter Vehemens ad Necem (2004), Openglad (2004), Promisance (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), Umbra (2002), Greenius' Civil War (2001), Tux Racer (2001), Operation Citadel (2000) -##### Without state tag (48) +## Code Languages -3d_city, atrinik, birth_of_the_empires, camelia_girls, catch_challenger, choria, crimson_fields, crossfire, crypto, dash, deltaengine, digital, dungeon_monkey_eternal, easyrpgplayer, evol_online, flare_engine, freedink, gigalomania, land_of_fire, manaworld, maxr, meritous, micropolis_js, mkxp, murder_in_the_public_domain, open_general, openal, openalsoft, other_life, our_personal_space, room_for_change, sandboxgamemaker, sentient_storage, source_of_tales, star_maiden_rio, superpowers, tanks_of_freedom, twin_engine, ufo2000, valyria_tear, visions_from_the_other_side, wargus, warzone_2100, xarchon, xoreos, yaml_cpp, zelda_mystery_of_solarus_dx, zero_k +Without language tag: 18 (4.4%) -## Languages - -Without language tag: 19 (4.7%) - -civil_war, crimson_fields, dragon_history, evol_online, imperium, land_of_fire, machinations, meritous, murder_in_the_public_domain, open_general, open_moo2, open_rpg_maker, openal, parpg, solaris, space_station_13, star_maiden_rio, vegatrek, xconq +Crimson Fields, Dragon History, Evol Online, Greenius' Civil War, Imperium, Land of Fire, Machinations, Murder In The Public Domain, Open AL, Open General, Open RPG Maker, OpenMOO2, PARPG, Solaris the Game, Space Station 13, Star Maiden Rio, VegaTrek, Xconq ##### Language frequency -- C++ (36.5%) -- C (20.3%) -- Java (11.7%) +- C++ (36.3%) +- C (20.4%) +- Java (11.6%) - Python (8.6%) -- Lua (5.2%) +- Lua (5.4%) - Javascript (3.9%) -- PHP (3.5%) +- PHP (3.4%) - C# (2.4%) -- Pascal (1.1%) +- Pascal (2.2%) - Ren'py (0.9%) - Haxe (0.6%) -- Delphi (0.4%) -- Delphi Pascal (0.4%) - ActionScript (0.2%) - Ada (0.2%) - Angelscript (0.2%) @@ -50,7 +44,6 @@ civil_war, crimson_fields, dragon_history, evol_online, imperium, land_of_fire, - GDScript (0.2%) - Groovy (0.2%) - Kotlin (0.2%) -- Lazarus (0.2%) - Objective C (0.2%) - Ruby (0.2%) - Rust (0.2%) @@ -62,34 +55,85 @@ civil_war, crimson_fields, dragon_history, evol_online, imperium, land_of_fire, ## Code licenses -Without license tag: 237 (58.4%) +Without license tag: 48 (11.8%) -8kingdoms, a_planets_revenge, age_of_magic, ai_wars, alien_assault_traders, ancient_beast, angband, antares, antichess, ardentryst, armies, arthurs_knights, atlantis, atomiks, atomix, atrinik, atromenace, attal, autorealm, avanor, battlefield_java, battles_of_antargis, begin2, betrayer_moon_tactics, blacknova_traders, blitzkrieg, bos_wars, boson, bygfoot, c_evo, caesar_ia, call_to_power2, camelia_girls, castle_of_the_winds, cataclysm, catch_challenger, catmother, civil_war, civone, clou, colobot, colonization_too, commando_js, conquests, crimson_fields, danger_from_the_deep, dark_destiny, dark_oberon, decker, deity, demigod, devana, digital, dragon_hunt, drop_shock, duel_commander, dune_dynasty, dune_ii_the_maker, dune_legacy, dungeon_crawl_stone_soup, dungeon_hero, dungeon_mapper, dungeon_quest, eleconics, endless_sky, eos_dawn_of_light, epic_of_heroes, epoh, eternalwinterwars, evil_cult, evol_online, fallen_spire, fanwor, farcolony, first_strike, free_heroes2_engine, free_space_colonization, free_synd, freelords, freeminer, freerails, freerct, freeserf, freespace_colonization, freestars, freetrain, galaxymage_redux, galaxyng, gdash, gearhead, geewhiz, gm_tools, golbin_camp, h_world, harris, haxima, heroes_of_wesnoth, heroes_of_wing_commander, hexwar, holy_spirit, imperium, iter_vehemens_ad_necem, jagged_alliance2, java_ng, jewelhunt, jigs_php_rpg, jquest, jsettlers, katomic, kingdoms, knights_and_merchants_remake, kobolds_quest_2, kq_lives, labyrinth_of_worlds, land_of_fire, linleys_dungeon_crawl, linwarrior, machinations, magarena, mars_land_of_no_mercy, mechcommander2_omnitech, mercenary_commander, meritous, metal_mech, mewl, moopy, moria, mpango, naev, nethack, nlarn, open_apocalypse, open_dune, open_general, open_homm, open_moo2, open_mw, open_panzer, open_pop, open_rails, open_rct2, open_rpg, open_rpg_maker, open_skyscraper, open_soccer, open_soccer_star, open_sonic, open_web_soccer, open_zelda, openglad, operation_citadel, orient, other_life, outer_space, parpg, pcgen, phantasy, pioneers, pizza_business, planetary_hoppers, polis, project_helena, promisance, pymapper, pyorpg, red_eclipse, regoth, return_to_the_roots, rocks_and_diamonds, rogue_clone_iv, rolemaster_office, rolisteam, rpdungeon, runesword_ii, scorched_moon, scoreforge_pathfinder_character_creator, scoreos, scourge, secret_mario_chronicles, sengoky_warring_states_of_japan, settlers_iii_remake, simple_solitaire, sintel, skrupel, slash_em, slay, smash, solar_empire, solaris, song_of_albion, space_faring, space_opera, space_station_13, space_trader_for_java, space_trader_for_windows, space_war, speed_dreams, spice_trade, star_maiden_rio, stars_nova, story_of_a_lost_sky, super_tux_kart, supremacy, t_bots, tales_of_maj_eyal, terasology, the_clans, theme_hospital, thousand_parsec, turious, turn_of_war, tuxemon, tuxracer, tvtower, uidunad, underworld_adventures, unnethack, vcmi, war_of_kingdom, wargame, wargamer, wargus, warzone_2100, wastes_edge, watomic, witch_blast, wizards_magic, wolfpack_empire, world_of_heroes, wyrmsun, x-force, xarchon, xenowar, xonotic, xsera, zangband, zoc +8 Kingdoms, A Planet's Revenge, Alien Assault Traders, AntiChess, Armies, Atrinik, Battlefield Java, BlackNova Traders, C-evo, Camelia Girls, Clou!, Crimson Fields, Dark Destiny, Digital: A Love Story, Drop Shock, Eleconics, Evol Online, First Strike, FreeRails, Freestars, Greenius' Civil War, H-World, Heroes of Wesnoth, Hexwar, Imperium, JQuest, Labyrinth of Worlds, Land of Fire, Machinations, Mpango, Open General, Open RPG Maker, OpenMOO2, OpenRPG, Other-Life, PARPG, PCGen, Project Helena, RuneSword II, Solar Empire, Solaris the Game, Space Station 13, SpaceTrader for Java, Star Maiden Rio, War Of Kingdom, Warzone 2100, ZAngband, sCoreForge Pathfinder Character Creator ##### Licenses frequency -- GPL-2.0 (37.3%) -- GPL-3.0 (19.5%) -- MIT (13.0%) -- Special (7.1%) -- zlib (4.1%) -- GPL (3.6%) -- Apache-2.0 (2.4%) -- BSD-3 (1.8%) -- LGPL-2.0 (1.2%) -- LGPL-2.1 (1.2%) -- Mixed (1.2%) -- AGPL-3.0 (0.6%) -- Artistic License (0.6%) -- BSD (0.6%) -- Boost-1.0 (0.6%) -- Different, see file Copying, liblzma is public domain (0.6%) -- Freeware (0.6%) -- ISC (0.6%) -- LGPL-3.0 (0.6%) -- MPL-2.0 (0.6%) -- Ms-MPL MIT (0.6%) -- Proprietary (0.6%) -- Public Domain (0.6%) -- zlib (0.6%) +- GPL-2.0 (38.5%) +- GPL-3.0 (24.9%) +- MIT (11.4%) +- Custom (5.3%) +- Apache-2.0 (3.3%) +- zlib (2.8%) +- BSD (2.2%) +- GPL (2.2%) +- LGPL-3.0 (1.1%) +- AGPL-3.0 (0.8%) +- BSD-3 (0.8%) +- LGPL-2.0 (0.8%) +- LGPL-2.1 (0.8%) +- MPL (0.6%) +- Artistic License (0.3%) +- Boost license 1.0 (0.3%) +- Boost-1.0 (0.3%) +- CC-BY-SA-3 (0.3%) +- CC0 (0.3%) +- CDDL (0.3%) +- Educational (0.3%) +- Freeware (0.3%) +- GPL-20 (0.3%) +- ISC (0.3%) +- LPGL-2.1 (0.3%) +- MPL-2.0 (0.3%) +- Ms-RL (0.3%) +- Proprietary (0.3%) +- Public Domain (0.3%) +- SWIG license (0.3%) + +## Keywords + +##### Keywords frequency + +- TBS (10.5%) +- RTS (8.9%) +- roguelike (8.0%) +- remake (7.6%) +- requires original content (7.6%) +- MMO (7.2%) +- online (6.8%) +- tool (5.5%) +- SP (4.6%) +- MP (3.4%) +- 3D (3.0%) +- visual novel (2.5%) +- browser (2.1%) +- shooter (2.1%) +- sports (2.1%) +- engine (1.7%) +- popular (1.7%) +- board game (1.3%) +- cards (1.3%) +- console (1.3%) +- puzzle (1.3%) +- racing (1.3%) +- 2D (0.8%) +- TB (0.8%) +- JRPG (0.4%) +- Sp (0.4%) +- action-rpg (0.4%) +- action/adventure (0.4%) +- editor (0.4%) +- educational (0.4%) +- gui toolkit (0.4%) +- inspired (0.4%) +- interface generator (0.4%) +- isometric (0.4%) +- isometric 2D (0.4%) +- kid-friendly (0.4%) +- language binding (0.4%) +- point&click (0.4%) +- rating 18 (0.4%) +- source documentation generator (0.4%) diff --git a/games/strategy/_toc.md b/games/strategy/_toc.md index 605e59a9..2e1fcdb6 100644 --- a/games/strategy/_toc.md +++ b/games/strategy/_toc.md @@ -13,20 +13,20 @@ - **[AntiChess](antichess.md)** (Java, mature, inactive since 2003) - **[Armies](armies.md)** (C++, mature, inactive since 2007) - **[Arthur's Knights](arthurs_knights.md)** (C++, Educational, beta, inactive since 2006) -- **[Atomiks](atomiks.md)** (C, GPL, custom, mature) +- **[Atomiks](atomiks.md)** (C, GPL, mature) - **[Atomix](atomix.md)** (C, GPL-2.0, mature) - **[Attal](attal.md)** (C++, GPL-2.0, mature, inactive since 2008) - **[Battle for Wesnoth](wesnoth.md)** (C++, GPL-2.0, mature) - **[Battlefield Java](battlefield_java.md)** (Java, beta, inactive since 2011) - **[Battles of Antargis](battles_of_antargis.md)** (C, C++, GPL-2.0, beta, inactive since 2014) - **[Begin2](begin2.md)** (C++, BSD, beta, inactive since 2009) -- **[Birth of the Empires](birth_of_the_empires.md)** () +- **[Birth of the Empires](birth_of_the_empires.md)** (C++, Custom, mature, inactive since 2016) - **[BlackNova Traders](blacknova_traders.md)** (PHP, Javascript, beta, inactive since 2012) - **[Blitzkrieg](blitzkrieg.md)** (Java, GPL, beta, inactive since 2009) - **[Bos Wars](bos_wars.md)** (C++, GPL-2.0, mature, inactive since 2013) - **[Boson](boson.md)** (C++, GPL-2.0, beta, inactive since 2006) - **[Bygfoot](bygfoot.md)** (Java, GPL-2.0, beta) -- **[C-evo](c_evo.md)** (Delphi Pascal, mature, inactive since 2013) +- **[C-evo](c_evo.md)** (Pascal, 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) - **[CivOne](civone.md)** (C#, CC0, beta) @@ -35,9 +35,9 @@ - **[Colonization too](colonization_too.md)** (C++, GPL-2.0, beta, inactive since 2004) - **[Conquests](conquests.md)** (C++, GPL-2.0, mature, inactive since 2012) - **[Corsix Theme Hospital](theme_hospital.md)** (Lua, C++, MIT, mature) -- **[Crimson Fields](crimson_fields.md)** () -- **[Crown and Cutless](crown_and_cutless.md)** (C++, Special, beta, inactive since 2006) -- **[Dark Destiny](dark_destiny.md)** (Java, unclear, mature, inactive since 2016) +- **[Crimson Fields](crimson_fields.md)** (mature, inactive since 2010) +- **[Crown and Cutless](crown_and_cutless.md)** (C++, Custom, beta, inactive since 2006) +- **[Dark Destiny](dark_destiny.md)** (Java, mature, inactive since 2016) - **[Dark Oberon](dark_oberon.md)** (C++, GPL-2.0, mature, inactive since 2009) - **[Devana](devana.md)** (PHP, BSD, beta) - **[Drop Shock](drop_shock.md)** (PHP, mature, inactive since 2014) @@ -66,7 +66,7 @@ - **[Freeserf](freeserf.md)** (C++, GPL-3.0, beta) - **[Freestars](freestars.md)** (C++, beta, inactive since 2008) - **[GalaxyNG](galaxyng.md)** (C, GPL-2.0, mature, inactive since 2005) -- **[Gigalomania](gigalomania.md)** () +- **[Gigalomania](gigalomania.md)** (C++, GPL-2.0, mature) - **[Glest](glest.md)** (C++, GPL-2.0, mature, inactive since 2009) - **[Globulation2](globulation2.md)** (C++, GPL-3.0, mature) - **[Goblin Camp](golbin_camp.md)** (C++, GPL-3.0, beta, inactive since 2012) @@ -74,19 +74,19 @@ - **[Harris](harris.md)** (C, Python, GPL-3.0, beta) - **[Heroes of Wesnoth](heroes_of_wesnoth.md)** (C++, beta) - **[Heroes of Wing Commander](heroes_of_wing_commander.md)** (Python, GPL-3.0, beta, inactive since 2014) -- **[Hexwar](hexwar.md)** (Ruby, Javascript, unknown, beta, inactive since 2012) +- **[Hexwar](hexwar.md)** (Ruby, Javascript, beta, inactive since 2012) - **[JQuest](jquest.md)** (Java, beta, inactive since 2006) - **[JSettlers](jsettlers.md)** (Java, GPL-3.0, mature) -- **[Jagged Alliance 2 Stracciatella](jagged_alliance2.md)** (C++, Various, mature) +- **[Jagged Alliance 2 Stracciatella](jagged_alliance2.md)** (C++, Custom, mature) - **[KAtomic](katomic.md)** (C++, GPL-2.0, mature) - **[Kingdoms](kingdoms.md)** (C++, GPL-3.0, beta, inactive since 2014) -- **[Knights and Merchants Remake](knights_and_merchants_remake.md)** (Delphi, AGPL-3.0, mature) +- **[Knights and Merchants Remake](knights_and_merchants_remake.md)** (Pascal, AGPL-3.0, mature) - **[LGeneral](lgeneral.md)** (C, GPL-2.0, mature) - **[LordsAWar!](lordsawar.md)** (C++, GPL-3.0, mature) - **[M.E.W.L.](mewl.md)** (C++, GPL-2.0, beta, inactive since 2015) - **[Machinations](machinations.md)** (beta, inactive since 2003) - **[Mars, Land of No Mercy](mars_land_of_no_mercy.md)** (C++, GPL-2.0, beta, inactive since 2008) -- **[Mechanized Assault & eXploration Reloaded ](maxr.md)** () +- **[Mechanized Assault & eXploration Reloaded ](maxr.md)** (C++, C, GPL-2.0, beta, inactive since 2016) - **[MegaGlest](megaglest.md)** (C++, GPL-2.0, mature) - **[Megamek](megamek.md)** (Java, GPL-2.0, mature) - **[Mercenary Commander](mercenary_commander.md)** (Java, BSD, beta, inactive since 2010) @@ -96,7 +96,7 @@ - **[NetPanzer](netpanzer.md)** (C++, GPL-2.0, beta) - **[Open Apocalypse](open_apocalypse.md)** (C++, MIT, mature) - **[Open Dune](open_dune.md)** (C, GPL-2.0, mature) -- **[Open General](open_general.md)** () +- **[Open General](open_general.md)** (mature) - **[Open Imperium Galactica](open_imperium_galactica.md)** (Java, GPL-3.0, beta) - **[Open Panzer](open_panzer.md)** (Javascript, GPL-2.0, mature) - **[Open Soccer Star](open_soccer_star.md)** (PHP, GPL-3.0, beta) @@ -115,7 +115,7 @@ - **[Pizza Business](pizza_business.md)** (C++, GPL-2.0, mature, inactive since 2003) - **[Planetary Hoppers](planetary_hoppers.md)** (Java, GPL-2.0, beta, inactive since 2003) - **[Polis](polis.md)** (Java, GPL-3.0, mature, inactive since 2016) -- **[Project Helena](project_helena.md)** (Lazarus, beta, inactive since 2015) +- **[Project Helena](project_helena.md)** (Pascal, beta, inactive since 2015) - **[Promisance](promisance.md)** (PHP, GPL-2.0, mature, inactive since 2004) - **[Return to the Roots](return_to_the_roots.md)** (C++, GPL-3.0, mature) - **[Scorched Moon](scorched_moon.md)** (Python, GPL-3.0, beta) @@ -138,34 +138,34 @@ - **[Supremacy](supremacy.md)** (C#, Ms-RL, beta, inactive) - **[T-Bots](t_bots.md)** (C, GPL-2.0, beta, inactive since 2004) - **[TVTower](tvtower.md)** (BlitzMax, Lua, Custom, mature) -- **[Tanks of Freedom](tanks_of_freedom.md)** () +- **[Tanks of Freedom](tanks_of_freedom.md)** (GDScript, MIT, mature) - **[The Epic of Heroes](epic_of_heroes.md)** (C++, GPL-3.0, beta, inactive since 2015) - **[Thousand Parsec](thousand_parsec.md)** (C++, Python, GPL-2.0, beta, inactive since 2012) - **[TripleA](triplea.md)** (Java, GPL-2.0, mature) - **[Turious](turious.md)** (C, GPL-3.0, beta, inactive since 2014) - **[Turn of War](turn_of_war.md)** (Java, GPL-3.0, beta) -- **[UFO2000](ufo2000.md)** () +- **[UFO2000](ufo2000.md)** (C++, GPL-2.0, mature, inactive since 2012) - **[Ufo: Alien Invasion](ufo_alien_invasion.md)** (C, C++, GPL-2.0, mature) - **[Unknown Horizons](unknown_horizons.md)** (Python, GPL-2.0, beta) - **[VCMI Project](vcmi.md)** (C++, GPL-2.0, mature) - **[WAtomic](watomic.md)** (Pascal, GPL-2.0, mature, inactive since 2005) -- **[War Of Kingdom](war_of_kingdom.md)** () +- **[War Of Kingdom](war_of_kingdom.md)** (C, C++, beta) - **[WarGame](wargame.md)** (Unity, C#, CDDL, beta, inactive since 2016) - **[Wargamer](wargamer.md)** (C++, GPL-20, mature, inactive since 2003) -- **[Wargus](wargus.md)** () -- **[Warzone 2100](warzone_2100.md)** () +- **[Wargus](wargus.md)** (C++, Lua, GPL-2.0, mature) +- **[Warzone 2100](warzone_2100.md)** (C++, mature) - **[Widelands](widelands.md)** (C++, Lua, GPL-2.0, mature) - **[Wizards Magic](wizards_magic.md)** (Python, GPL-2.0, mature, inactive since 2012) - **[Wolfpack Empire](wolfpack_empire.md)** (C, GPL-3.0, mature) - **[World of Heroes](world_of_heroes.md)** (Python, BSD, beta, inactive since 2009) - **[Wyrmsun](wyrmsun.md)** (Lua, C++, GPL-2.0, mature) -- **[X-Force: Fight For Destiny](x-force.md)** (Delphi, GPL-2.0, beta, inactive since 2011) -- **[XArchon](xarchon.md)** () +- **[X-Force: Fight For Destiny](x-force.md)** (Pascal, GPL-2.0, beta, inactive since 2011) +- **[XArchon](xarchon.md)** (C, C++, GPL-2.0, beta, inactive since 2003) - **[XSera](xsera.md)** (C, Lua, MIT, beta, inactive since 2010) - **[Xconq](xconq.md)** (GPL, mature) - **[Xenowar](xenowar.md)** (C, C++, GPL-3.0, mature, inactive since 2014) -- **[Zero-K](zero_k.md)** () +- **[Zero-K](zero_k.md)** (Lua, GPL-2.0, mature) - **[Zetawar](zetawar.md)** (Clojure, MIT, mature) -- **[Zone of Control](zoc.md)** () +- **[Zone of Control](zone_of_control.md)** (Rust, Apache-2.0, beta, inactive since 2017) [comment]: # (end of autogenerated content) \ No newline at end of file diff --git a/games/strategy/atomiks.md b/games/strategy/atomiks.md index 464f88d0..8adf6057 100644 --- a/games/strategy/atomiks.md +++ b/games/strategy/atomiks.md @@ -8,7 +8,8 @@ _Faithful remake of, and a tribute to, Atomix, a classic puzzle game created by - Keywords: puzzle - Code repository: https://sourceforge.net/p/atomiks/code/HEAD/tree/ (svn) - Code language: C -- Code license: GPL, custom (Leveldesign, see Readme) +- Code license: GPL +- Assets license: Custom (Leveldesign, see Readme) ## Building diff --git a/games/strategy/birth_of_the_empires.md b/games/strategy/birth_of_the_empires.md index 63e4c792..d460e611 100644 --- a/games/strategy/birth_of_the_empires.md +++ b/games/strategy/birth_of_the_empires.md @@ -4,10 +4,10 @@ _Turn-based 4X strategy game set in space in the style of classics such as Micro - Home: http://bote2.square7.ch/en/wiki/Main_Page - Download: http://loadion.com/en/Birth-of-the-Empires_6681499.html +- State: mature, inactive since 2016 - Code repository: https://github.com/bote-team/bote - Code language: C++ -- Code license: Special -- Code license details: Private use allowed +- Code license: Custom (private use allowed) See also [Android/Java version](https://bitbucket.org/sarkanyi/bote-libgdx/). diff --git a/games/strategy/c_evo.md b/games/strategy/c_evo.md index ece3ac9c..39379526 100644 --- a/games/strategy/c_evo.md +++ b/games/strategy/c_evo.md @@ -8,6 +8,6 @@ _C-evo is a freeware empire building game for Windows._ - State: mature, inactive since 2013 - Keywords: TBS - Code repository: http://www.c-evo.org/files/download.php?cevosrc.cevosrc.zip -- Code language: Delphi Pascal +- Code language: Pascal ## Building diff --git a/games/strategy/crimson_fields.md b/games/strategy/crimson_fields.md index 2db162b2..a967bdc4 100644 --- a/games/strategy/crimson_fields.md +++ b/games/strategy/crimson_fields.md @@ -4,6 +4,7 @@ _Turn-based tactical war game._ - Home: http://crimson.seul.org/ - Download: http://crimson.seul.org/download.php +- State: mature, inactive since 2010 - Keywords: TBS - Code repository: http://crimson.seul.org/cvs.php (cvs) diff --git a/games/strategy/crown_and_cutless.md b/games/strategy/crown_and_cutless.md index 1532b279..d9ac9915 100644 --- a/games/strategy/crown_and_cutless.md +++ b/games/strategy/crown_and_cutless.md @@ -7,7 +7,7 @@ _3d pirate action/adventure game in the spirit of the old Pirates! game._ - State: beta, inactive since 2006 - Code repository: https://sourceforge.net/p/crownandcutlass/code/HEAD/tree/ (svn) - Code language: C++ -- Code license: Special +- Code license: Custom ## Building diff --git a/games/strategy/dark_destiny.md b/games/strategy/dark_destiny.md index 7f2d2fb0..831f8a79 100644 --- a/games/strategy/dark_destiny.md +++ b/games/strategy/dark_destiny.md @@ -7,7 +7,6 @@ _Turn-based online space strategy game playable in internet browsers._ - Keywords: MMO - Code repository: https://sourceforge.net/p/darkdestiny/code/HEAD/tree/ (svn) - Code language: Java -- Code license: unclear ## Building diff --git a/games/strategy/devana.md b/games/strategy/devana.md index 6f07dc30..bf4ffe87 100644 --- a/games/strategy/devana.md +++ b/games/strategy/devana.md @@ -5,7 +5,7 @@ _Browser strategy game._ - Home: https://web.archive.org/web/20180419021717/http://devana.eu/, https://sourceforge.net/projects/devana/ - Download: https://sourceforge.net/projects/devana/files - State: beta -- Keywords: web +- Keywords: browser - Code repository: (see download) - Code language: PHP - Code license: BSD diff --git a/games/strategy/dune_legacy.md b/games/strategy/dune_legacy.md index 08d95039..e5680c0a 100644 --- a/games/strategy/dune_legacy.md +++ b/games/strategy/dune_legacy.md @@ -5,7 +5,7 @@ _Updated clone of Westood Studios' Dune2 which uses data files from the original - Home: http://dunelegacy.sourceforge.net/website/, https://sourceforge.net/projects/dunelegacy - Download: http://dunelegacy.sourceforge.net/website/downloads.html, https://sourceforge.net/projects/dunelegacy/files - State: mature -- Keywords: requires original data +- Keywords: requires original content - Code repository: https://sourceforge.net/p/dunelegacy/code/ci/master/tree/ - Code language: C++ - Code license: GPL-2.0 diff --git a/games/strategy/freeciv.md b/games/strategy/freeciv.md index 84197833..0e4d3da1 100644 --- a/games/strategy/freeciv.md +++ b/games/strategy/freeciv.md @@ -6,7 +6,7 @@ _Freeciv is a Free and Open Source empire-building strategy game inspired by the - Media: https://en.wikipedia.org/wiki/Freeciv - Download: http://www.freeciv.org/download.html - State: mature -- Keywords: network, TBS +- Keywords: TBS, MP - Code repository: https://github.com/freeciv/freeciv - Code language: C - Code license: GPL-2.0 diff --git a/games/strategy/freeciv_web.md b/games/strategy/freeciv_web.md index 7c5e61d9..001dca38 100644 --- a/games/strategy/freeciv_web.md +++ b/games/strategy/freeciv_web.md @@ -5,7 +5,7 @@ _Freeciv-web is a version of Freeciv playable online in any modern web browser._ - Home: https://play.freeciv.org/ - Media: https://en.wikipedia.org/wiki/Freeciv#Freeciv_WebGL_3D_and_Freeciv-web - State: mature -- Keywords: web client, TBS +- Keywords: online, TBS - Code repository: https://github.com/freeciv/freeciv-web - Code language: Javascript, Java - Code license: AGPL-3.0 diff --git a/games/strategy/freecol.md b/games/strategy/freecol.md index 39561b57..b2df9076 100644 --- a/games/strategy/freecol.md +++ b/games/strategy/freecol.md @@ -6,7 +6,7 @@ _FreeCol is a turn-based strategy game based on the old game Colonization, and s - Media: https://en.wikipedia.org/wiki/FreeCol - Download: http://www.freecol.org/download.html - State: mature -- Keywords: network, TBS +- Keywords: TBS, MP - Code repository: https://sourceforge.net/p/freecol/git/ci/master/tree/ - Code language: Java - Code license: GPL-2.0 diff --git a/games/strategy/freeserf.md b/games/strategy/freeserf.md index 744947ff..0778fdcd 100644 --- a/games/strategy/freeserf.md +++ b/games/strategy/freeserf.md @@ -5,7 +5,7 @@ _Clone of the brilliant simulation game The Settlers 1 aka Serf City._ - Home: http://jonls.dk/freeserf/ - Download: https://github.com/freeserf/freeserf/releases - State: beta -- Keywords: remake, requires original game content (Settlers 1) +- Keywords: remake, requires original content (Settlers 1) - Code repository: https://github.com/freeserf/freeserf - Code language: C++ - Code license: GPL-3.0 diff --git a/games/strategy/gigalomania.md b/games/strategy/gigalomania.md index d0b01971..09210521 100644 --- a/games/strategy/gigalomania.md +++ b/games/strategy/gigalomania.md @@ -3,6 +3,8 @@ _A 2D real time strategy Mega-Lo-Mania-like god game._ - Home: http://gigalomania.sourceforge.net/ +- State: mature +- Keywords: RTS - Code repository: https://sourceforge.net/p/gigalomania/code/ci/master/tree/ - Code language: C++ - Code license: GPL-2.0 diff --git a/games/strategy/hexwar.md b/games/strategy/hexwar.md index 5b0b66c4..1dea3f6a 100644 --- a/games/strategy/hexwar.md +++ b/games/strategy/hexwar.md @@ -7,7 +7,6 @@ _Simple turn based, hexagon map, strategy game in the tradition of Panzer Genera - Keywords: TBS, online - Code repository: https://github.com/mgfreshour/hexwar - Code language: Ruby, Javascript -- Code license: unknown ## Building diff --git a/games/strategy/jagged_alliance2.md b/games/strategy/jagged_alliance2.md index 54ec889e..4074d4a8 100644 --- a/games/strategy/jagged_alliance2.md +++ b/games/strategy/jagged_alliance2.md @@ -4,11 +4,10 @@ _An improved, cross-platform, stable Jagged Alliance 2 runtime._ - Home: https://ja2-stracciatella.github.io/ - State: mature +- Keywords: requires original content - Code repository: https://github.com/ja2-stracciatella/ja2-stracciatella - Code language: C++ -- Code license: Various - -Requires original content? +- Code license: Custom (various) ## Building diff --git a/games/strategy/knights_and_merchants_remake.md b/games/strategy/knights_and_merchants_remake.md index 07b93b46..946bc615 100644 --- a/games/strategy/knights_and_merchants_remake.md +++ b/games/strategy/knights_and_merchants_remake.md @@ -7,7 +7,7 @@ _An unofficial fan-made mod for the game Knights and Merchants._ - State: mature - Keywords: RTS - Code repository: https://github.com/Kromster80/kam_remake -- Code language: Delphi +- Code language: Pascal - Code license: AGPL-3.0 Requires original game content. diff --git a/games/strategy/lgeneral.md b/games/strategy/lgeneral.md index 80d0c116..57262c37 100644 --- a/games/strategy/lgeneral.md +++ b/games/strategy/lgeneral.md @@ -5,8 +5,9 @@ _A turn-based strategy engine heavily inspired by Panzer General._ - Home: http://lgames.sourceforge.net/LGeneral/ - Media: https://en.wikipedia.org/wiki/Panzer_General#LGeneral - Download: (see home) +- Platform: Android - State: mature -- Keywords: TBS, andoird +- Keywords: TBS - Code repository: various on github - Code language: C - Code license: GPL-2.0 diff --git a/games/strategy/maxr.md b/games/strategy/maxr.md index 606a4f67..d996acf6 100644 --- a/games/strategy/maxr.md +++ b/games/strategy/maxr.md @@ -4,12 +4,12 @@ _A remake of the old M.A.X. by Interplay from 1996._ - Home: https://www.maxr.org/ - Download: https://www.maxr.org/docs.php?id=3 +- State: beta, inactive since 2016 +- Keywords: requires original content (some versions) - Code repository: (see download) - Code language: C++, C - Code license: GPL-2.0 -May require original game content. - ## Building - Build system: CMake diff --git a/games/strategy/netpanzer.md b/games/strategy/netpanzer.md index bb6133c7..b976b349 100644 --- a/games/strategy/netpanzer.md +++ b/games/strategy/netpanzer.md @@ -5,7 +5,7 @@ _An online multiplayer tactical warfare game._ - Home: http://www.netpanzer.info/ - Download: http://www.netpanzer.info/Download/ - State: beta -- Keywords: online, multiplayer, RTS +- Keywords: online, MP, RTS - Code repository: (see download) page and (svn) - Code language: C++ - Code license: GPL-2.0 diff --git a/games/strategy/open_general.md b/games/strategy/open_general.md index bb90fe9d..d03ed4ab 100644 --- a/games/strategy/open_general.md +++ b/games/strategy/open_general.md @@ -2,8 +2,10 @@ _Evolution of SSI Panzer General II._ -- Home: https://sourceforge.net/projects/opengeneral/ -- Download: https://sourceforge.net/projects/opengeneral/files/ +- Home: http://www.open-general.com, https://sourceforge.net/projects/opengeneral/ (old) +- Download: http://www.open-general.com/installer.php +- State: mature (?) +- Keywords: requires original content - Code repository: https://sourceforge.net/p/opengeneral/code/HEAD/tree/ (svn) ## Building diff --git a/games/strategy/project_helena.md b/games/strategy/project_helena.md index bea65426..c9aed372 100644 --- a/games/strategy/project_helena.md +++ b/games/strategy/project_helena.md @@ -6,7 +6,7 @@ _Turn-based strategy/RPG game._ - Download: https://sourceforge.net/projects/projecthelena/files - State: beta, inactive since 2015 - Code repository: (see download) -- Code language: Lazarus +- Code language: Pascal Requires: [Castle Game Engine](https://castle-engine.io/index.php) diff --git a/games/strategy/settlers_iii_remake.md b/games/strategy/settlers_iii_remake.md index 8d86bbe4..f55831c3 100644 --- a/games/strategy/settlers_iii_remake.md +++ b/games/strategy/settlers_iii_remake.md @@ -5,7 +5,7 @@ _Remake of "The Settlers III" for Windows, Linux, Mac and Android._ - Home: https://github.com/jsettlers/settlers-remake - Download: https://github.com/jsettlers/settlers-remake/releases - State: beta -- Keywords: remake, requires original game content +- Keywords: remake, requires original content - Code repository: https://github.com/jsettlers/settlers-remake - Code language: Java - Code license: MIT diff --git a/games/strategy/tanks_of_freedom.md b/games/strategy/tanks_of_freedom.md index 24b92cc6..85758a83 100644 --- a/games/strategy/tanks_of_freedom.md +++ b/games/strategy/tanks_of_freedom.md @@ -4,6 +4,7 @@ _Indie Turn Based Strategy in Isometric Pixel Art._ - Home: https://w84death.itch.io/tanks-of-freedom - Download: (see home) +- State: mature - Code repository: https://github.com/w84death/Tanks-of-Freedom - Code language: GDScript - Code license: MIT diff --git a/games/strategy/war_of_kingdom.md b/games/strategy/war_of_kingdom.md index 97101530..2f11a733 100644 --- a/games/strategy/war_of_kingdom.md +++ b/games/strategy/war_of_kingdom.md @@ -2,9 +2,11 @@ _Turn-based tactical strategy game._ +- Home: http://www.freeors.com/ (chinese) - State: beta - Code repository: https://github.com/freeors/War-Of-Kingdom - Code language: C, C++ +- Code dependencies: Rose (https://github.com/freeors/Rose) ## Building diff --git a/games/strategy/wargus.md b/games/strategy/wargus.md index 962e3dfb..fd053e0e 100644 --- a/games/strategy/wargus.md +++ b/games/strategy/wargus.md @@ -4,13 +4,14 @@ _Warcraft2 Mod that allows you to play Warcraft2 with the Stratagus engine._ - Home: http://wargus.stratagus.com/index.shtml - Download: http://wargus.stratagus.com/download.shtml +- State: mature (?) +- Keywords: requires original content (?) - Code repository: https://code.launchpad.net/wargus (bzr), https://github.com/WARGUS/WARGUS - Code language: C++, Lua - Code license: GPL-2.0 +- Code dependencies: Stratagus Runs on the [stratagus engine](http://forums.stratagus.com/). -Requires original content? - ## Building diff --git a/games/strategy/warzone_2100.md b/games/strategy/warzone_2100.md index d83744b1..8aac3e7f 100644 --- a/games/strategy/warzone_2100.md +++ b/games/strategy/warzone_2100.md @@ -4,7 +4,8 @@ _Full campaign with optional (but strongly recommended!), videos, battle against - Home: http://wz2100.net/ - Download: https://sourceforge.net/projects/warzone2100/files/releases/ -- Keywords: RTS +- State: mature +- Keywords: RTS, popular - Code repository: https://github.com/Warzone2100/warzone2100 - Code language: C++ diff --git a/games/strategy/wesnoth.md b/games/strategy/wesnoth.md index cef13cad..4ade20bf 100644 --- a/games/strategy/wesnoth.md +++ b/games/strategy/wesnoth.md @@ -6,7 +6,7 @@ _The Battle for Wesnoth is an open source, turn-based strategy game with a high - Media: https://en.wikipedia.org/wiki/The_Battle_for_Wesnoth - Download: http://www.wesnoth.org/#download - State: mature -- Keywords: network, TBS +- Keywords: TBS, MP - Code repository: https://github.com/wesnoth/wesnoth - Code language: C++ - Code license: GPL-2.0 diff --git a/games/strategy/wizards_magic.md b/games/strategy/wizards_magic.md index 75b377dd..61a1d1c1 100644 --- a/games/strategy/wizards_magic.md +++ b/games/strategy/wizards_magic.md @@ -6,7 +6,7 @@ _Simple card strategy, based on Magic: The Gathering rules._ - Media: https://lgdb.org/game/wizards_magic - Download: https://code.google.com/archive/p/wizards-magic/downloads - State: mature, inactive since 2012 -- Keywords: card game, remake +- Keywords: cards, remake - Code repository: https://code.google.com/archive/p/wizards-magic/source - Code language: Python - Code license: GPL-2.0 diff --git a/games/strategy/x-force.md b/games/strategy/x-force.md index 8321356a..7c0b5381 100644 --- a/games/strategy/x-force.md +++ b/games/strategy/x-force.md @@ -7,7 +7,7 @@ _Remake of the classic X-Com-Games._ - State: beta, inactive since 2011 - Keywords: TBS - Code repository: https://sourceforge.net/p/xforceffd/code/HEAD/tree/ -- Code language: Delphi +- Code language: Pascal - Code license: GPL-2.0 ## Building diff --git a/games/strategy/xarchon.md b/games/strategy/xarchon.md index 48232a7d..5b8602a9 100644 --- a/games/strategy/xarchon.md +++ b/games/strategy/xarchon.md @@ -4,7 +4,7 @@ _Modelled after the golden oldie Archon game created by Freefall Associates and - Home: http://xarchon.seul.org/ - Download: http://xarchon.seul.org/download.html -- State:beta, inactive since +- State: beta, inactive since 2003 - Code repository: cvs.seul.org:/home/cvspsrv/cvsroot - Code language: C, C++ - Code license: GPL-2.0 diff --git a/games/strategy/zero_k.md b/games/strategy/zero_k.md index aa62474b..fd0c5547 100644 --- a/games/strategy/zero_k.md +++ b/games/strategy/zero_k.md @@ -5,7 +5,8 @@ _A free multi-platform open source real-time strategy video game._ - Home: http://zero-k.info/ - Media: https://en.wikipedia.org/wiki/Zero-K - Download: http://zero-k.info/Wiki/Download -- Keywords: RTS +- State: mature +- Keywords: RTS, popular - Code repository: https://github.com/ZeroK-RTS/Zero-K - Code language: Lua - Code license: GPL-2.0 diff --git a/games/strategy/zoc.md b/games/strategy/zone_of_control.md similarity index 62% rename from games/strategy/zoc.md rename to games/strategy/zone_of_control.md index 51b5db9b..fec77662 100644 --- a/games/strategy/zoc.md +++ b/games/strategy/zone_of_control.md @@ -2,11 +2,15 @@ _Turn-based hexagonal strategy game written in Rust._ +- Home: https://github.com/ozkriff/zoc, https://ozkriff.github.io/2017-08-17--devlog.html - Download: https://github.com/ozkriff/zoc/releases - State: beta, inactive since 2017 +- Keywords: TBS - Code repository: https://github.com/ozkriff/zoc - Code language: Rust - Code license: Apache-2.0 +See also [Zemeroth](https://github.com/ozkriff/zemeroth). + ## Building diff --git a/tools/maintenance.py b/tools/maintenance.py index 4cde12ec..501793d8 100644 --- a/tools/maintenance.py +++ b/tools/maintenance.py @@ -310,23 +310,24 @@ def parse_entry(content): # checks # essential fields - essential_fields = ['home', 'state'] + essential_fields = ['home', 'state', 'code repository'] for field in essential_fields: if field not in info: - print('Essential field "{}" missing in entry {}'.format(field, info['title'])) + print('Essential field "{}" missing in entry "{}"'.format(field, info['title'])) return info # so that the rest can run through # state must contain either beta or mature but not both v = info['state'] if 'beta' in v != 'mature' in v: - printf('State must be one of in entry {}'.format(info['title'])) + printf('State must be one of <"beta", "mature"> in entry "{}"'.format(info['title'])) return info # so that the rest can run through # extract inactive phrase = 'inactive since ' inactive_year = [x[len(phrase):] for x in info['state'] if x.startswith(phrase)] + assert len(inactive_year) <= 1 if inactive_year: - info['inactive'] = inactive_year + info['inactive'] = inactive_year[0] return info @@ -367,6 +368,7 @@ def assemble_infos(): return infos + def generate_statistics(): """ Generates the statistics page. @@ -378,9 +380,6 @@ def generate_statistics(): statistics_path = os.path.join(games_path, 'statistics.md') statistics = '[comment]: # (autogenerated content, do not edit)\n# Statistics\n\n' - # assemble infos - infos = assemble_infos() - # total number number_entries = len(infos) rel = lambda x: x / number_entries * 100 # conversion to percent @@ -395,53 +394,54 @@ def generate_statistics(): 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['file'], x['inactive']) for x in infos if 'inactive' in x] + entries_inactive = [(x['title'], x['inactive']) for x in infos if 'inactive' in x] entries_inactive.sort(key=lambda x: x[0]) # first sort by name - entries_inactive.sort(key=lambda x: -x[1]) # then sort by inactive year (more recently first) + 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] statistics += '##### Inactive State\n\n' + ', '.join(entries_inactive) + '\n\n' - entries_no_state = [x['file'] for x in infos if 'state' not in x] - if entries_no_state: - entries_no_state.sort() - statistics += '##### Without state tag ({})\n\n'.format(len(entries_no_state)) + ', '.join(entries_no_state) + '\n\n' - # Language - statistics += '## Languages\n\n' - number_no_language = sum(1 for x in infos if 'language' not in x) + statistics += '## Code Languages\n\n' + field = 'code language' + + # those without language tag + number_no_language = sum(1 for x in infos 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['file'] for x in infos if 'language' not in x] + entries_no_language = [x['title'] for x in infos if field not in x] entries_no_language.sort() statistics += ', '.join(entries_no_language) + '\n\n' # get all languages together languages = [] for info in infos: - if 'language' in info: - languages.extend(info['language']) + if field in info: + languages.extend(info[field]) unique_languages = set(languages) unique_languages = [(l, languages.count(l) / len(languages)) for l in unique_languages] unique_languages.sort(key=lambda x: x[0]) # first sort by name - unique_languages.sort(key=lambda x: -x[1]) # then sort by occurrence (highest occurrence first) + unique_languages.sort(key=lambda x: x[1], reverse=True) # then sort by occurrence (highest occurrence first) unique_languages = ['- {} ({:.1f}%)\n'.format(x[0], x[1]*100) for x in unique_languages] statistics += '##### Language frequency\n\n' + ''.join(unique_languages) + '\n' # Licenses statistics += '## Code licenses\n\n' - number_no_license = sum(1 for x in infos if 'license' not in x) + field = 'code license' + + # those without license + 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['file'] for x in infos if 'license' not in x] + entries_no_license = [x['title'] for x in infos if field not in x] entries_no_license.sort() statistics += ', '.join(entries_no_license) + '\n\n' # get all licenses together licenses = [] for info in infos: - if 'license' in info: - licenses.append(info['license']) + if field in info: + licenses.extend(info[field]) unique_licenses = set(licenses) unique_licenses = [(l, licenses.count(l) / len(licenses)) for l in unique_licenses] @@ -450,6 +450,23 @@ def generate_statistics(): unique_licenses = ['- {} ({:.1f}%)\n'.format(x[0], x[1]*100) for x in unique_licenses] statistics += '##### Licenses frequency\n\n' + ''.join(unique_licenses) + '\n' + # Keywords + statistics += '## Keywords\n\n' + field = 'keywords' + + # get all keywords together + keywords = [] + for info in infos: + if field in info: + keywords.extend(info[field]) + + unique_keywords = set(keywords) + unique_keywords = [(l, keywords.count(l) / len(keywords)) for l in unique_keywords] + unique_keywords.sort(key=lambda x: x[0]) # first sort by name + unique_keywords.sort(key=lambda x: -x[1]) # then sort by occurrence (highest occurrence first) + unique_keywords = ['- {} ({:.1f}%)\n'.format(x[0], x[1]*100) for x in unique_keywords] + statistics += '##### Keywords frequency\n\n' + ''.join(unique_keywords) + '\n' + with open(statistics_path, mode='w', encoding='utf-8') as f: f.write(statistics) @@ -460,9 +477,6 @@ def export_json(): with a dynamic table in a browser. """ - # assemble info - infos = assemble_infos() - # make database out of it db = {} db['headings'] = ['Name', 'Download'] @@ -489,20 +503,23 @@ if __name__ == "__main__": games_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'games')) readme_file = os.path.realpath(os.path.join(games_path, os.pardir, 'README.md')) + # assemble info + infos = assemble_infos() + # recount and write to readme - #update_readme() + update_readme() # generate list in toc files - #update_category_tocs() + update_category_tocs() # generate report - #generate_statistics() + generate_statistics() # update database for html table export_json() # check for unfilled template lines - # check_template_leftovers() + check_template_leftovers() # check external links (only rarely) # check_validity_external_links()