diff --git a/.gitignore b/.gitignore index b267664e..7a435476 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ /.idea -/tools/archive/* +/tools/archive/** diff --git a/docs/data.json b/docs/data.json index 52c18b9f..49256f0c 100644 --- a/docs/data.json +++ b/docs/data.json @@ -196,7 +196,7 @@ "Strategy", "beta / inactive since 2006", "", - "C++ - Educational" + "C++, C# - Educational" ], [ "Arx Libertatis (home, entry)", @@ -736,7 +736,7 @@ "Strategy", "beta / active", "browser", - "PHP - BSD" + "Source - PHP - BSD" ], [ "Digital: A Love Story (home, entry)", @@ -757,13 +757,13 @@ "Source - C++ - GPL-2.0" ], [ - "Dragon History (home, entry)", + "Dragon History - Dra\u010d\u00ed Historie (home, entry)", "Czech adventure game.", "Link", "Adventure & Visual novels", "mature / inactive since 2010", "", - "Pascal, Script - GPL-2.0" + "Source - Pascal, Script - GPL-2.0" ], [ "Dragon Hunt (home, entry)", @@ -789,8 +789,8 @@ "Link", "Strategy", "beta / inactive since 2009", - "", - "C - GPL-3.0" + "text-based", + "Source - C - GPL-3.0" ], [ "Dune Dynasty (home, entry)", @@ -1663,7 +1663,7 @@ "Role Playing", "mature / inactive since 2006", "roguelike", - "C - Custom" + "Source - C - Custom" ], [ "Linwarrior 3D (home, entry)", @@ -2046,11 +2046,11 @@ [ "Open RPG Maker (home, entry)", "Open RPG Maker is a free and open source 2D RPG creation..", - "Link", + "Link", "Engines & Frameworks", "beta / inactive since 2014", "", - "C++ - GPL-3.0" + "Source - C++ - GPL-3.0" ], [ "Open Rails (home, entry)", @@ -2242,13 +2242,13 @@ "Source - C++ - GPL-2.0" ], [ - "Operation Citadel (home, entry)", + "Operation Citadel (home, entry)", "A WWII, turn based platoon, company level war game on the..", "Link", "Strategy", "beta / inactive since 2000", "", - "C++ - GPL-2.0" + "Source - C++ - GPL-2.0" ], [ "Orx (home, entry)", @@ -2743,7 +2743,7 @@ "Strategy", "beta / inactive since 2010", "", - "Java - GPL-3.0" + "Source - Java - GPL-3.0" ], [ "Smash (home, entry)", @@ -2955,11 +2955,11 @@ [ "Supremacy (home, entry)", "\"4X\" (eXplore, eXpand, eXploit, eXterminate) turn-based,..", - "", + "Link", "Strategy", - "beta / active", + "beta / inactive since 2014", "", - "C# - Ms-RL" + "Source - C# - Ms-RL" ], [ "T-Bots (home, entry)", @@ -2986,7 +2986,7 @@ "Role Playing", "mature / active", "roguelike", - "Source - C, Lua - GPL-3.0" + "Source - C, Lua - GPL-3.0" ], [ "Tanks of Freedom (home, entry)", @@ -3031,7 +3031,7 @@ "Role Playing", "mature / active", "MMO", - "PHP - GPL-2.0" + "Source - PHP - GPL-2.0" ], [ "The hunt for the lost rainbow jewels (Jewelhunt) (home, entry)", @@ -3238,7 +3238,7 @@ "Strategy", "mature / inactive since 2005", "remake", - "Pascal - GPL-2.0" + "Source - Pascal - GPL-2.0" ], [ "War Of Kingdom (home, entry)", @@ -3337,7 +3337,7 @@ "Strategy", "beta / inactive since 2009", "", - "Python - BSD" + "Source - Python - BSD" ], [ "World of Phaos (home, entry)", @@ -3346,7 +3346,7 @@ "Role Playing", "mature / inactive since 2011", "online", - "PHP - GPL-2.0" + "Source - PHP - GPL-2.0" ], [ "WorldForge (home, entry)", diff --git a/games/adventure/_toc.md b/games/adventure/_toc.md index 5260be32..d6039251 100644 --- a/games/adventure/_toc.md +++ b/games/adventure/_toc.md @@ -5,7 +5,7 @@ - **[Clou!](clou.md)** (C, Custom, beta) - **[Colossal Cave Adventure](colossal_cave.md)** (Python, Apache-2.0, mature) - **[Digital: A Love Story](digital_a_love_story.md)** (Ren'py, CC-BY-NC-SA, mature) -- **[Dragon History](dragon_history.md)** (Pascal, Script, GPL-2.0, mature, inactive since 2010) +- **[Dragon History - Dračí Historie](dragon_history.md)** (Pascal, Script, GPL-2.0, mature, inactive since 2010) - **[Fanwor](fanwor.md)** (C, GPL-2.0, mature) - **[Free in the Dark (engine)](fitd.md)** (C, C++, GPL-2.0, beta) - **[GameLV](gamelv.md)** (C++, GPL, beta) diff --git a/games/adventure/dragon_history.md b/games/adventure/dragon_history.md index 23e68824..327f8ea0 100644 --- a/games/adventure/dragon_history.md +++ b/games/adventure/dragon_history.md @@ -1,11 +1,11 @@ -# Dragon History +# Dragon History - Dračí Historie _Czech adventure game._ - Home: http://www.ucw.cz/draci-historie/index-en.html - Download: http://www.ucw.cz/draci-historie/index-en.html#download - State: mature, inactive since 2010 -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/dragon-history.git (snapshot of source releases) - Code language: Pascal (old engine), Script (runs on ScummVM) - Code license: GPL-2.0 diff --git a/games/framework/blender_game_engine.md b/games/framework/blender_game_engine.md index ec5ba2a5..e5c708ef 100644 --- a/games/framework/blender_game_engine.md +++ b/games/framework/blender_game_engine.md @@ -2,7 +2,7 @@ _Included in Blender is a complete game engine, allowing you to create a fully featured 3d game right inside Blender._ -- Home: https://www.blender.org/features/game-creation/ +- Home: https://www.blender.org/features/game-creation/, https://docs.blender.org/manual/en/dev/game_engine/index.html - Download: https://www.blender.org/download/ - State: mature - Code repository: (https://developer.blender.org/diffusion/) diff --git a/games/framework/open_rpg_maker.md b/games/framework/open_rpg_maker.md index 46de92ff..78925c9b 100644 --- a/games/framework/open_rpg_maker.md +++ b/games/framework/open_rpg_maker.md @@ -2,10 +2,10 @@ _Open RPG Maker is a free and open source 2D RPG creation utility, similar to the popular RPG Maker series._ -- Home: http://openrpgmaker.sourceforge.net/ -- Download: https://sourceforge.net/projects/openrpgmaker/files/ +- Home: http://openrpgmaker.sourceforge.net/, https://sourceforge.net/projects/openrpgmaker/ +- Download: http://openrpgmaker.sourceforge.net/wiki/index.php/Download, https://sourceforge.net/projects/openrpgmaker/files/ - State: beta, inactive since 2014 -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/openrpgmaker.git (snapshot of source releases) - Code language: C++ - Code license: GPL-3.0 diff --git a/games/rpg/linleys_dungeon_crawl.md b/games/rpg/linleys_dungeon_crawl.md index bcc74c70..a5fd23f4 100644 --- a/games/rpg/linleys_dungeon_crawl.md +++ b/games/rpg/linleys_dungeon_crawl.md @@ -4,10 +4,10 @@ _Roguelike molded in the tradition of the early greats of the genre: Rogue, Hack - Home: http://www.dungeoncrawl.org/ - Media: https://en.wikipedia.org/wiki/Linley%27s_Dungeon_Crawl, http://nethack.wikia.com/wiki/Linley%27s_Dungeon_Crawl -- Download: http://www.dungeoncrawl.org/?d +- Download: http://www.dungeoncrawl.org/?d, ftp://ftp.dungeoncrawl.org/ - State: mature, inactive since 2006 - Keywords: roguelike -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/dungeoncrawl.git (snapshot of source releases) - Code language: C - Code license: Custom (Crawl General Public License) diff --git a/games/rpg/mana_world.md b/games/rpg/mana_world.md index 1c752175..261e382c 100644 --- a/games/rpg/mana_world.md +++ b/games/rpg/mana_world.md @@ -6,7 +6,7 @@ _2D open source MMORPG._ - Download: https://www.themanaworld.org/index.php/Downloads - State: mature - Keywords: MMO -- Code repository: (https://github.com/themanaworld which of the repos contains relevant code) +- Code repository: https://github.com/themanaworld/tmwa (https://github.com/themanaworld), https://gitlab.com/manaplus/manaplus.git (+) - Code language: PHP - Code license: GPL-2.0 diff --git a/games/rpg/world_of_phaos.md b/games/rpg/world_of_phaos.md index 9af42f8a..b82d182b 100644 --- a/games/rpg/world_of_phaos.md +++ b/games/rpg/world_of_phaos.md @@ -6,7 +6,7 @@ _Online Roleplaying Game browser based, which takes place in the high fantasy wo - Download: https://sourceforge.net/projects/phaosrpg/files/ - State: mature, inactive since 2011 - Keywords: online -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/phaosrpg.git (snapshot of source releases) - Code language: PHP - Code license: GPL-2.0 - Assets license: Restricted (see license) diff --git a/games/statistics.md b/games/statistics.md index 8ca4e451..080e5635 100644 --- a/games/statistics.md +++ b/games/statistics.md @@ -1,17 +1,17 @@ [comment]: # (autogenerated content, do not edit) # Statistics -analyzed 403 entries on 2018-06-24 11:00:32 +analyzed 403 entries on 2018-06-28 10:38:05 ## State - mature: 238 (59.1%) - beta: 165 (40.9%) -- inactive: 171 (42.4%) +- inactive: 172 (42.7%) ##### Inactive State -Zone of Control (2017), 3d.city (2016), Atlantis (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), Radakan (2014), SDL Game Engine 2D (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), Murder In The Public Domain (2013), OpenRPG (2013), Phantasy Star Rebirth (2013), Room for Change (2013), Source of Tales (2013), Trinity Reign (2013), VegaTrek (2013), BlackNova Traders (2012), Blitzkrieg (2012), Cataclysm (2012), CommandoJS (2012), Conquests (2012), Dark City (2012), Goblin Camp (2012), Hexwar (2012), PARPG (2012), Solar Empire (2012), Thousand Parsec (2012), UFO2000 (2012), Wizards Magic (2012), Age of Magic (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), RuneSword II (2011), Skrupel - Tribute Compilation (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), Dragon History (2010), Endgame: Singularity (2010), Heroes of Wesnoth (2010), Labyrinth of Worlds (2010), Linwarrior 3D (2010), Mercenary Commander (2010), OpenHoMM (2010), Slay (2010), Solaris the Game (2010), SpaceTrader for Java (2010), XSera (2010), 8 Kingdoms (2009), Alien Assault Traders (2009), Annchienta (2009), Ardentryst (2009), Begin2 (2009), Crown and Cutlass (2009), Dark Oberon (2009), Duel Commander (2009), Fall of Imyrin (2009), Fallen Spire (2009), FreeTrain (2009), Glest (2009), Goblin Hack (2009), ORIENT (2009), OpenPop (2009), Secret Mario Chronicles (2009), Space Trader for Windows (2009), World of Heroes (2009), A Planet's Revenge (2008), Attal: Lords of doom (2008), Avanor (2008), Freestars (2008), Mars, Land of No Mercy (2008), Meritous (2008), Moria (2008), S.C.O.U.R.G.E. (2008), Scoreos (2008), Sengoku: Warring States of Japan (2008), Space Opera (2008), Armies (2007), Eos, Dawn of Light: A Space Opera (2007), Silvertree (2007), Slash'EM (2007), Underworld Adventures (2007), Arthur's Knights (2006), Betrayer's Moon Tactics (2006), Boson (2006), Eleconics (2006), JQuest (2006), Linley's Dungeon Crawl (2006), Metal Mech (2006), RPDungeon - computer aided role playing (2006), Rogue Clone IV (2006), Visions from the Other Side (2006), GalaxyNG (2005), H-World (2005), LinCity (2005), Spice Trade (2005), WAtomic (2005), Xconq (2005), ZAngband (2005), Colonization too (2004), GM Tools (2004), Gee Whiz (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) +Zone of Control (2017), 3d.city (2016), Atlantis (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), Radakan (2014), SDL Game Engine 2D (2014), Sintel The Game (2014), Summoning Wars (2014), Supremacy (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), Murder In The Public Domain (2013), OpenRPG (2013), Phantasy Star Rebirth (2013), Room for Change (2013), Source of Tales (2013), Trinity Reign (2013), VegaTrek (2013), BlackNova Traders (2012), Blitzkrieg (2012), Cataclysm (2012), CommandoJS (2012), Conquests (2012), Dark City (2012), Goblin Camp (2012), Hexwar (2012), PARPG (2012), Solar Empire (2012), Thousand Parsec (2012), UFO2000 (2012), Wizards Magic (2012), Age of Magic (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), RuneSword II (2011), Skrupel - Tribute Compilation (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), Dragon History - Dračí Historie (2010), Endgame: Singularity (2010), Heroes of Wesnoth (2010), Labyrinth of Worlds (2010), Linwarrior 3D (2010), Mercenary Commander (2010), OpenHoMM (2010), Slay (2010), Solaris the Game (2010), SpaceTrader for Java (2010), XSera (2010), 8 Kingdoms (2009), Alien Assault Traders (2009), Annchienta (2009), Ardentryst (2009), Begin2 (2009), Crown and Cutlass (2009), Dark Oberon (2009), Duel Commander (2009), Fall of Imyrin (2009), Fallen Spire (2009), FreeTrain (2009), Glest (2009), Goblin Hack (2009), ORIENT (2009), OpenPop (2009), Secret Mario Chronicles (2009), Space Trader for Windows (2009), World of Heroes (2009), A Planet's Revenge (2008), Attal: Lords of doom (2008), Avanor (2008), Freestars (2008), Mars, Land of No Mercy (2008), Meritous (2008), Moria (2008), S.C.O.U.R.G.E. (2008), Scoreos (2008), Sengoku: Warring States of Japan (2008), Space Opera (2008), Armies (2007), Eos, Dawn of Light: A Space Opera (2007), Silvertree (2007), Slash'EM (2007), Underworld Adventures (2007), Arthur's Knights (2006), Betrayer's Moon Tactics (2006), Boson (2006), Eleconics (2006), JQuest (2006), Linley's Dungeon Crawl (2006), Metal Mech (2006), RPDungeon - computer aided role playing (2006), Rogue Clone IV (2006), Visions from the Other Side (2006), GalaxyNG (2005), H-World (2005), LinCity (2005), Spice Trade (2005), WAtomic (2005), Xconq (2005), ZAngband (2005), Colonization too (2004), GM Tools (2004), Gee Whiz (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) ## Code Languages @@ -21,14 +21,14 @@ Imperium, Land of Fire, Open AL, Open General, Solaris the Game, VegaTrek, Xconq ##### Language frequency -- C++ (36.9%) +- C++ (36.8%) - C (19.7%) - Java (11.5%) - Python (8.8%) - Lua (5.2%) - JavaScript (3.8%) -- PHP (3.4%) -- C# (2.3%) +- PHP (3.3%) +- C# (2.5%) - Pascal (2.3%) - Ren'py (0.8%) - Haxe (0.6%) @@ -99,7 +99,7 @@ Without license tag: 23 (5.7%) ##### Keywords frequency - TBS (10.8%) -- RTS (8.8%) +- RTS (8.7%) - requires original content (7.9%) - roguelike (7.9%) - remake (7.5%) @@ -138,4 +138,5 @@ Without license tag: 23 (5.7%) - language binding (0.4%) - point&click (0.4%) - source documentation generator (0.4%) +- text-based (0.4%) diff --git a/games/strategy/_toc.md b/games/strategy/_toc.md index 73dfa3fa..12fa273b 100644 --- a/games/strategy/_toc.md +++ b/games/strategy/_toc.md @@ -12,7 +12,7 @@ - **[Antares](antares.md)** (C++, LGPL-3.0, beta) - **[AntiChess](antichess.md)** (Java, MIT, mature, inactive since 2003) - **[Armies](armies.md)** (C++, mature, inactive since 2007) -- **[Arthur's Knights](arthurs_knights.md)** (C++, Educational, beta, inactive since 2006) +- **[Arthur's Knights](arthurs_knights.md)** (C++, C#, Educational, beta, inactive since 2006) - **[Atomiks](atomiks.md)** (C, GPL, mature) - **[Atomix](atomix.md)** (C, GPL-2.0, mature) - **[Attal: Lords of doom](attal.md)** (C++, GPL-2.0, mature, inactive since 2008) @@ -133,7 +133,7 @@ - **[Spring RTS engine](spring.md)** (C++, C, Lua, GPL-2.0, mature) - **[Star Control II: The Ur-Quan Masters](star_control_2.md)** (C, GPL-2.0, mature, inactive since 2011) - **[Stars! Nova](stars_nova.md)** (C#, GPL-2.0, beta) -- **[Supremacy](supremacy.md)** (C#, Ms-RL, beta, inactive) +- **[Supremacy](supremacy.md)** (C#, Ms-RL, beta, inactive since 2014) - **[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)** (GDScript, MIT, mature) diff --git a/games/strategy/arthurs_knights.md b/games/strategy/arthurs_knights.md index 0d298657..92569593 100644 --- a/games/strategy/arthurs_knights.md +++ b/games/strategy/arthurs_knights.md @@ -6,7 +6,7 @@ _A small turned based game._ - Download: https://sourceforge.net/projects/king-arthur/files/king-arthur/Alpha%200.3/ - State: beta, inactive since 2006 - Code repository: (see download) -- Code language: C++ +- Code language: C++, C# - Code license: Educational ## Building diff --git a/games/strategy/devana.md b/games/strategy/devana.md index bf4ffe87..f6ffcdfc 100644 --- a/games/strategy/devana.md +++ b/games/strategy/devana.md @@ -6,11 +6,11 @@ _Browser strategy game._ - Download: https://sourceforge.net/projects/devana/files - State: beta - Keywords: browser -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/devana.git (snapshot of source releases) - Code language: PHP - Code license: BSD -Main web site is unavailable. +Main web site is unavailable. License change from GPL-3.0 to BSD between version 1.5.3 and 1.6.6. ## Building diff --git a/games/strategy/duel_commander.md b/games/strategy/duel_commander.md index 260604b3..53ad318e 100644 --- a/games/strategy/duel_commander.md +++ b/games/strategy/duel_commander.md @@ -5,7 +5,8 @@ _Turn based command line fighting game for Windows and Unix-like systems._ - Home: https://sourceforge.net/projects/duelcommander/ - Download: https://sourceforge.net/projects/duelcommander/files - State: beta, inactive since 2009 -- Code repository: (see download) +- Keywords: text-based +- Code repository: https://gitlab.com/Trilarion/duelcommander.git (snapshot of source releases) - Code language: C - Code license: GPL-3.0 diff --git a/games/strategy/operation_citadel.md b/games/strategy/operation_citadel.md index c4ecc93c..2201540a 100644 --- a/games/strategy/operation_citadel.md +++ b/games/strategy/operation_citadel.md @@ -2,10 +2,10 @@ _A WWII, turn based platoon, company level war game on the Eastern Front._ -- Home: http://kursk.sourceforge.net/newfiles/Projects.htm, https://sourceforge.net/projects/kursk +- Home: http://kursk.sourceforge.net/, https://sourceforge.net/projects/kursk - Download: https://sourceforge.net/projects/kursk/files - State: beta, inactive since 2000 -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/kursk.git (snapshot of source releases) - Code language: C++ - Code license: GPL-2.0 diff --git a/games/strategy/slay.md b/games/strategy/slay.md index 83affe9a..e18c102c 100644 --- a/games/strategy/slay.md +++ b/games/strategy/slay.md @@ -5,7 +5,7 @@ _Simple but addictive turn based strategy game._ - Home: https://sourceforge.net/projects/slaygame/, http://slaygame.sourceforge.net/ - Download: https://sourceforge.net/projects/slaygame/files - State: beta, inactive since 2010 -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/slaygame.git (snapshot of source releases) - Code language: Java - Code license: GPL-3.0 diff --git a/games/strategy/supremacy.md b/games/strategy/supremacy.md index 86e78bbc..4b28c24b 100644 --- a/games/strategy/supremacy.md +++ b/games/strategy/supremacy.md @@ -2,11 +2,13 @@ _"4X" (eXplore, eXpand, eXploit, eXterminate) turn-based, empire-building strategy game on the galactic level._ -- Home: https://archive.codeplex.com/?p=supremacy -- State: beta, inactive -- Code repository: (see download) +- Home: https://archive.codeplex.com/?p=supremacy, http://supremacy.square7.ch/wiki/index.php?title=Main_Page, http://www.startreksupremacy.com/, https://bitbucket.org/mstrobel/supremacy/overview +- Download: http://www.startreksupremacy.com/download.html +- State: beta, inactive since 2014 +- Code repository: https://bitbucket.org/mstrobel/supremacy (hg) - Code language: C# - Code license: Ms-RL +- Assets license: CC-BY-SA-2.0 Ms-RL = Microsoft Reciprocal License diff --git a/games/strategy/watomic.md b/games/strategy/watomic.md index e46b31bf..39a8b78c 100644 --- a/games/strategy/watomic.md +++ b/games/strategy/watomic.md @@ -6,7 +6,7 @@ _Windows clone of Linux KAtomic logic game._ - Download: https://sourceforge.net/projects/watomic/files/ - State: mature, inactive since 2005 - Keywords: remake -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/watomic.git (snapshot of source releases) - Code language: Pascal - Code license: GPL-2.0 diff --git a/games/strategy/world_of_heroes.md b/games/strategy/world_of_heroes.md index 6dec3073..a4c94a6d 100644 --- a/games/strategy/world_of_heroes.md +++ b/games/strategy/world_of_heroes.md @@ -5,7 +5,7 @@ _2D turn based strategy game, where the player commands an army in the explorati - Home: https://sourceforge.net/projects/worldofheroes - Download: https://sourceforge.net/projects/worldofheroes/files/WOH%20v0.4.2/ - State: beta, inactive since 2009 -- Code repository: (see download) +- Code repository: https://gitlab.com/Trilarion/worldofheroes.git (snapshot of source releases) - Code language: Python - Code license: BSD diff --git a/tools/archive/archives.json b/tools/archive/archives.json index 1f2bed8e..37acbb4b 100644 --- a/tools/archive/archives.json +++ b/tools/archive/archives.json @@ -1,7 +1,6 @@ { "git": [ "http://git.artsoft.org/rocksndiamonds.git", - "http://git.net-core.org/tome/t-engine4.git", "http://git.pond.sub.org/empserver", "http://repo.or.cz/openal-soft.git", "https://anongit.freedesktop.org/git/pkg-config.git", @@ -35,6 +34,7 @@ "https://git.code.sf.net/p/solar-empire/code", "https://git.code.sf.net/p/space-war-2/git", "https://git.code.sf.net/p/stars-nova/code", + "https://git.net-core.org/tome/t-engine4.git", "https://git.octaforge.org/engine/octaforge.git", "https://git.savannah.gnu.org/git/adonthell/adonthell-wastesedge.git", "https://git.savannah.gnu.org/git/freedink.git", @@ -274,6 +274,7 @@ "https://github.com/tales/tales-client.git", "https://github.com/tarnus/aatraders.git", "https://github.com/tautvilas/epoh.git", + "https://github.com/themanaworld/tmwa.git", "https://github.com/thousandparsec/tpclient-pywx.git", "https://github.com/thousandparsec/tpserver-cpp.git", "https://github.com/topherredden/freestars.git", @@ -306,19 +307,26 @@ "https://gitlab.com/Trilarion/civilwar.git", "https://gitlab.com/Trilarion/coltoo.git", "https://gitlab.com/Trilarion/conquests.git", + "https://gitlab.com/Trilarion/devana.git", "https://gitlab.com/Trilarion/digitalalovestory.git", + "https://gitlab.com/Trilarion/dragon-history.git", "https://gitlab.com/Trilarion/dragon-hunt.git", + "https://gitlab.com/Trilarion/duelcommander.git", + "https://gitlab.com/Trilarion/dungeoncrawl.git", "https://gitlab.com/Trilarion/galaxyng.git", "https://gitlab.com/Trilarion/gm-tools.git", "https://gitlab.com/Trilarion/gwiz.git", "https://gitlab.com/Trilarion/janag.git", "https://gitlab.com/Trilarion/koboldsquest2.git", + "https://gitlab.com/Trilarion/kursk.git", "https://gitlab.com/Trilarion/lincity.git", "https://gitlab.com/Trilarion/machinations.git", "https://gitlab.com/Trilarion/mercenarycommander.git", "https://gitlab.com/Trilarion/metalmech.git", "https://gitlab.com/Trilarion/murderpd.git", + "https://gitlab.com/Trilarion/openrpgmaker.git", "https://gitlab.com/Trilarion/orient.git", + "https://gitlab.com/Trilarion/phaosrpg.git", "https://gitlab.com/Trilarion/pizza-business.git", "https://gitlab.com/Trilarion/planets.git", "https://gitlab.com/Trilarion/promisance.git", @@ -326,16 +334,20 @@ "https://gitlab.com/Trilarion/rogueclone.git", "https://gitlab.com/Trilarion/sentient-storage.git", "https://gitlab.com/Trilarion/skrupel.git", + "https://gitlab.com/Trilarion/slaygame.git", "https://gitlab.com/Trilarion/spicetrade.git", "https://gitlab.com/Trilarion/tbots.git", "https://gitlab.com/Trilarion/theclans.git", "https://gitlab.com/Trilarion/tuxracer.git", "https://gitlab.com/Trilarion/uwadv.git", "https://gitlab.com/Trilarion/wargamer.git", + "https://gitlab.com/Trilarion/watomic.git", + "https://gitlab.com/Trilarion/worldofheroes.git", "https://gitlab.com/Trilarion/xconq.git", "https://gitlab.com/Trilarion/zangband.git", "https://gitlab.com/evol/evol-all.git", "https://gitlab.com/freedroid/freedroid-src.git", + "https://gitlab.com/manaplus/manaplus.git", "https://gitlab.com/pingus/pingus.git", "https://gitlab.com/solarus-games/zsdx.git", "https://gitlab.com/xonotic/xonotic.git", @@ -380,6 +392,7 @@ "https://bitbucket.org/featheredmelody/lost-sky-project-public/src", "https://bitbucket.org/genericcontainer/goblin-camp/src", "https://bitbucket.org/giszmo/glob2", + "https://bitbucket.org/mstrobel/supremacy", "https://bitbucket.org/rude/love", "https://bitbucket.org/sumwars/sumwars-code/src" ], diff --git a/tools/archive/update.py b/tools/archive/update.py index 709678fb..61cf7fac 100644 --- a/tools/archive/update.py +++ b/tools/archive/update.py @@ -167,6 +167,8 @@ def run(type, urls): if __name__ == '__main__': + supported_types = ['git', 'hg', 'svn'] # currently no bzr client installed + folder_name = { 'git': git_folder_name, 'svn': svn_folder_name, @@ -196,8 +198,7 @@ if __name__ == '__main__': archives = json.loads(text) for type in archives: - # currently no bzr checkout (problems with the repos) - if type == 'bzr': + if type not in supported_types: continue urls = archives[type] run(type, urls) diff --git a/tools/dungeon_crawl_source_releases_to_git.py b/tools/dungeon_crawl_source_releases_to_git.py new file mode 100644 index 00000000..858b2ecc --- /dev/null +++ b/tools/dungeon_crawl_source_releases_to_git.py @@ -0,0 +1,502 @@ +""" + Helps me with importing source revisions into Git +""" + +import shutil +import os +import subprocess +import tarfile +import zipfile +import distutils.dir_util +import sys +import urllib.request +import tempfile +import datetime + + +def extract_sources(source_path, type, destination_path): + """ + Extracts a zip, tar, ... to a destination path. + """ + if type == '.tbz2': + tar = tarfile.open(source_path, 'r') + os.chdir(destination_path) + tar.extractall() + elif type == '.zip': + with zipfile.ZipFile(source_path, 'r') as zip: + zip.extractall(destination_path) + +def subprocess_run(cmd): + """ + + """ + result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if result.returncode: + print("error {} in call {}".format(result.returncode, cmd)) + print(result.stderr.decode('ascii')) + sys.exit(-1) + else: + print(' output: {}'.format(result.stdout.decode('ascii'))) + +def single_revision(): + """ + + """ + # remove temp path completely and create again + print('clear temp') + if os.path.isdir(temp_path): + shutil.rmtree(temp_path) + os.mkdir(temp_path) + + # download archive + print('download archive from ftp') + with urllib.request.urlopen(ftp_link) as response: + with tempfile.NamedTemporaryFile(delete=False) as tmp_file: + shutil.copyfileobj(response, tmp_file) + + # unpack source files and delete archive + print('extract {} to temp'.format(os.path.basename(ftp_link))) + extract_sources(tmp_file.name, os.path.splitext(ftp_link)[1], temp_path) + os.remove(tmp_file.name) + + # we need to go up in temp_path until we find the first non-empty directory + nonempty_temp_path = temp_path + names = os.listdir(nonempty_temp_path) + while len(names) == 1: + nonempty_temp_path = os.path.join(nonempty_temp_path, names[0]) + names = os.listdir(nonempty_temp_path) + print(' working in "{}" relative to temp'.format(os.path.relpath(nonempty_temp_path, temp_path))) + + # if no original date is indicated, get it from the files (latest of last modified) + global original_date + if original_date is None: + latest_last_modified = 0 + for dirpath, dirnames, filenames in os.walk(nonempty_temp_path): + for filename in filenames: + filepath = os.path.join(dirpath, filename) + lastmodified = os.path.getmtime(filepath) + if lastmodified > latest_last_modified: + latest_last_modified = lastmodified + original_date = datetime.datetime.fromtimestamp(latest_last_modified).strftime('%Y-%m-%d') + print(' extracted original date from files: {}'.format(original_date)) + + # clear git path without deleting '.git' + print('clear git') + for item in os.listdir(git_path): + # ignore '.git + if item == '.git': + continue + item = os.path.join(git_path, item) + if os.path.isdir(item): + shutil.rmtree(item) + else: + os.remove(item) + + # copy unpacked source files to git path + print('copy to git') + distutils.dir_util.copy_tree(nonempty_temp_path, git_path) + + # update the git index (add unstaged, remove deleted, ...) + print('git add') + os.chdir(git_path) + subprocess_run(['git', 'add', '--all']) + + # perform the commit + print('git commit') + os.chdir(git_path) + message = 'version {} ({}) on {}'.format(version, ftp_link, original_date) + print(' message "{}"'.format(message)) + # subprocess_run(['git', 'commit', '--message={}'.format(message), '--author={}'.format(author), '--date={}'.format(original_date), '--dry-run']) + subprocess_run(['git', 'commit', '--message={}'.format(message), '--author={}'.format(author), '--date={}'.format(original_date)]) + + +if __name__ == "__main__": + + git_path = r'..\crawl' # must be initialized with 'git init' before + temp_path = r'..\temp' + author = 'Linley Henzell et al 1997-2005 ' # is used for all commits + + + # 1. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/1.1.x/src/dc110f-src.tbz2' + # version = '110f' + # original_date = '1997-10-04' # format yyyy-mm-dd, according to versions.txt in version 400b26 + # single_revision() + + # 2. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/2.7.x/src/dc270f-src.tbz2' + # version = '270f' + # original_date = '1998-09-22' + # single_revision() + + # 3. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/2.7.x/src/dc272f-src.tbz2' + # version = '272f' + # original_date = '1998-10-02' + # single_revision() + + # 4. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/2.8.x/src/dc280f-src.tbz2' + # version = '280f' + # original_date = '1998-10-18' + # single_revision() + + # 5. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/2.8.x/src/dc281f-src.tbz2' + # version = '281f' + # original_date = '1998-10-20' + # single_revision() + + # 6. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/2.8.x/src/dc282f-src.tbz2' + # version = '282f' + # original_date = '1998-10-24' + # single_revision() + + # 7. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/3.0.x/src/dc301f-src.tbz2' + # version = '301f' + # original_date = '1999-01-01' + # single_revision() + + # 8. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/3.0.x/src/dc302f-src.tbz2' + # version = '302f' + # original_date = '1999-01-04' + # single_revision() + + # 9. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/3.2.x/src/dc320f-src.tbz2' + # version = '320f' + # original_date = '1999-02-09' + # single_revision() + + # 10. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/final/3.3.x/src/dc330f-src.tbz2' + # version = '330f' + # original_date = '1999-03-30' + # single_revision() + + # 11. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta01-src.zip' + # version = '331beta01' + # original_date = '1999-04-09' # "Date last modified" of every file inside and of that the latest + # single_revision() + + # 12. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta02-src.zip' + # version = '331beta02' + # original_date = '1999-06-18' + # single_revision() + + # 13. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta03-src.zip' + # version = '331beta03' + # original_date = '1999-06-22' + # single_revision() + + # 14. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta04-src.zip' + # version = '331beta04' + # original_date = '1999-08-08' + # single_revision() + + # 15. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta05-src.zip' + # version = '331beta05' + # original_date = '1999-08-27' + # single_revision() + + # 16. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta06-src.zip' + # version = '331beta06' + # original_date = '1999-09-12' + # single_revision() + + # 17. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta07-src.zip' + # version = '331beta07' + # original_date = '1999-09-24' + # single_revision() + + # 18. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta08-src.zip' + # version = '331beta08' + # original_date = '1999-09-28' + # single_revision() + + # 19. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/3.3.x/src/cr331beta09-src.zip' + # version = '331beta09' + # original_date = '1999-10-02' + # single_revision() + + # 20. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr1999oct12src.zip' + # version = 'cr1999oct12' + # original_date = '1999-10-12' + # single_revision() + + # 21. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr1999oct15src.zip' + # version = 'cr1999oct15' + # original_date = '1999-10-15' + # single_revision() + + # 22. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr1999nov18src.zip' + # version = 'cr1999nov18' + # original_date = '1999-11-18' + # single_revision() + + # 23. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr1999nov23src.zip' + # version = 'cr1999nov23' + # original_date = '1999-11-23' + # single_revision() + + # 24. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr1999dec27src.zip' + # version = 'cr1999dec27' + # original_date = '1999-12-27' + # single_revision() + + # 25. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr1999dec30src.zip' + # version = 'cr1999dec30' + # original_date = '1999-12-30' + # single_revision() + + # 26. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr1999dec31src.zip' + # version = 'cr1999dec31' + # original_date = '1999-12-31' + # single_revision() + + # 27. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000jan10src.zip' + # version = 'cr2000jan10' + # original_date = '2000-01-10' + # single_revision() + + # 28. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000feb23src.zip' + # version = 'cr2000feb23' + # original_date = '2000-02-23' + # single_revision() + + # 29. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000mar06src.zip' + # version = 'cr2000mar06' + # original_date = '2000-03-06' + # single_revision() + + # 30. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000jun19src.zip' + # version = 'cr2000jun19src' + # original_date = '2000-06-19' + # single_revision() + + # 31. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000jun20src.zip' + # version = 'cr2000jun20' + # original_date = '2000-06-20' + # single_revision() + + # 32. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000jun22src.zip' + # version = 'cr2000jun22' + # original_date = '2000-06-22' + # single_revision() + + # 33. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000jul22src.zip' + # version = 'cr2000jul22' + # original_date = '2000-07-22' + # single_revision() + + # 34. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000aug01src.zip' + # version = 'cr2000aug01' + # original_date = '2000-08-01' + # single_revision() + + # 35. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000aug13src.zip' + # version = 'cr2000aug13' + # original_date = '2000-08-13' + # single_revision() + + # 36. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/orphan/src/cr2000oct30src.zip' + # version = 'cr2000oct30' + # original_date = '2000-10-30' + # single_revision() + + # 37. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta01-src.tbz2' + # version = '400beta01' + # original_date = None # 2000-12-20 + # single_revision() + + # 38. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta02-src.tbz2' + # version = '400beta02' + # original_date = None # 2000-12-22 + # single_revision() + + # 39. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta03-src.tbz2' + # version = '400beta03' + # original_date = None # 2000-12-29 + # single_revision() + + # 40. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta04-src.tbz2' + # version = '400beta04' + # original_date = None # 2001-01-11 + # single_revision() + + # 41. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta06-src.tbz2' + # version = '400beta06' + # original_date = None # 2001-01-23 + # single_revision() + + # 42. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta07-src.tbz2' + # version = '400beta07' + # original_date = None # 2001-01-29 + # single_revision() + + # 43. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta08-src.tbz2' + # version = 'cr400beta08' + # original_date = None # 2001-02-20 + # single_revision() + + # 44. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta09-src.tbz2' + # version = 'cr400beta09' + # original_date = None # 2001-03-06 + # single_revision() + + # 45. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta10-src.tbz2' + # version = 'cr400beta10' + # original_date = None # 2001-03-13 + # single_revision() + + # 46. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta10b-src.tbz2' + # version = 'cr400beta10b' + # original_date = None # 2001-03-14 + # single_revision() + + # 47. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta10c-src.tbz2' + # version = 'cr400beta10c' + # original_date = None # 2001-03-15 + # single_revision() + + # 48. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta10d-src.tbz2' + # version = '400beta10d' + # original_date = None # 2001-03-18 + # single_revision() + + # 49. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta11-src.tbz2' + # version = '400beta11' + # original_date = None # 2001-03-21 + # single_revision() + + # 50. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta12-src.tbz2' + # version = '400beta12' + # original_date = None # 2001-04-02 + # single_revision() + + # 51. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta13-src.tbz2' + # version = '400beta13' + # original_date = None # 2001-04-09 + # single_revision() + + # 52. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta14-src.tbz2' + # version = '400beta14' + # original_date = None # 2001-04-20 + # single_revision() + + # 53. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta15-src.tbz2' + # version = '400beta15' + # original_date = None # 2001-04-25 + # single_revision() + + # 54. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta16-src.tbz2' + # version = '400beta16' + # original_date = None # 2001-05-11 + # single_revision() + + # 55. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta17-src.tbz2' + # version = '400beta17' + # original_date = None # 2001-06-01 + # single_revision() + + # 56. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta18-src.tbz2' + # version = '400beta18' + # original_date = None # 2001-08-04 + # single_revision() + + # 57. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta19-src.tbz2' + # version = '400beta19' + # original_date = None # 2001-08-10 + # single_revision() + + # 58. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta20-src.tbz2' + # version = '400beta20' + # original_date = None # 2001-11-05 + # single_revision() + + # 59. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/cr400beta22-src.tbz2' + # version = '400beta22' + # original_date = None # 2001-12-21 + # single_revision() + + # 60. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/dc400b23-src.tbz2' + # version = '400b23' + # original_date = None # 2002-03-16 + # single_revision() + + # 61. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/dc400b24-src.tbz2' + # version = '400b24' + # original_date = '2002-06-03' # taken again from ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/ + # single_revision() + + # 62. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/dc400b25-src.tbz2' + # version = '400b25' + # original_date = '2003-03-06' + # single_revision() + + # 63. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/dc400a26-src.tbz2' + # version = '400a26' + # original_date = '2003-03-17' + # single_revision() + + # 64. + # ftp_link = 'ftp://ftp.dungeoncrawl.org/dev/4.0.x/src/dc400b26-src.tbz2' + # version = '400b26' + # original_date = '2003-03-24' + # single_revision() \ No newline at end of file diff --git a/tools/phaos.json b/tools/phaos.json new file mode 100644 index 00000000..40049802 --- /dev/null +++ b/tools/phaos.json @@ -0,0 +1,49 @@ +["https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.82/phaos-0.9.82-UPDATED-6.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.82/phaos-0.9.82-UPDATED-5.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.82/phaos-0.9.82-UPDATED-4.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.82/phaos-0.9.82-UPDATED-3.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.82/phaos-0.9.82-UPDATED-2.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.82/phaos-0.9.82-UPDATED.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.82/phaos-0.9.82.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.81/phaos-0.9.81.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.8/phaos-0.9.8.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.7/phaos-0.9.7.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9.6/phaos-0.9.6.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9/phaos-0.9.4.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9/phaos-0.9.3.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.9/phaos-0.9.2.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/Phaos%20Online%20RPG%20%28Source%20Code%29/Version%200.89/phaos-0.89.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.9.5.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.9.1.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.9.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.88.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.88-rc3.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.88-rc2.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.88-rc1.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.87-1.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.87.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.86.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.86-TEST-3.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.86-TEST-2.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.86-TEST-1.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.85.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.85-TEST-3.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.85-TEST-2.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.85-TEST-1.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.84.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.84-TEST2.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.84-TEST1.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.82.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.82-TEST3.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.82-TEST2.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.82-TEST1.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.8.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.77.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.76.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos-0.74.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/phaos0.72.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/Pv0.72.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/Pv0.7develnew.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/Pv0.7.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/Pv0.61.zip/download", +"https://sourceforge.net/projects/phaosrpg/files/OldFiles/Pv0.6.zip/download"] \ No newline at end of file diff --git a/tools/phaos_source_release_to_git.py b/tools/phaos_source_release_to_git.py new file mode 100644 index 00000000..4ab86557 --- /dev/null +++ b/tools/phaos_source_release_to_git.py @@ -0,0 +1,204 @@ +""" + Downloads source releases from Sourceforge and puts them into a git repository +""" + +import os +import shutil +import urllib.request +import json +import time +import zipfile +import subprocess +import datetime +import distutils.dir_util +import sys + + +def determine_version(name): + # to lower case + name = name.lower() + # cut leading terms + terms = ['phaos-', 'phaos', 'pv'] + for t in terms: + if name.startswith(t): + name = name[len(t):] + # cut trailing '.zip' + t = '.zip' + if name.endswith(t): + name = name[:-len(t)] + return name + + +def determine_last_modified_date(folder): + latest_last_modified = 0 + for dirpath, dirnames, filenames in os.walk(folder): + for filename in filenames: + filepath = os.path.join(dirpath, filename) + lastmodified = os.path.getmtime(filepath) + if lastmodified > latest_last_modified: + latest_last_modified = lastmodified + return latest_last_modified + + +def unzip_keep_last_modified(archive, destination): + """ + Assuming that destination is a directory and already existing. + """ + with zipfile.ZipFile(archive, 'r') as zip: + # zip.extractall(destination) + for zip_entry in zip.infolist(): + name, date_time = zip_entry.filename, zip_entry.date_time + date_time = time.mktime(date_time + (0, 0, -1)) + zip.extract(zip_entry, destination) + os.utime(os.path.join(destination, name), (date_time, date_time)) + +def strip_wrapping(folder): + names = os.listdir(folder) + while len(names) == 1: + folder = os.path.join(folder, names[0]) + names = os.listdir(folder) + return folder + +def copy_tree(source, destination): + # this gave an FileNotFoundError: [Errno 2] No such file or directory: '' on Windows + # distutils.dir_util.copy_tree(archive_path, git_path) + for dirpath, dirnames, filenames in os.walk(source): + # first create all the directory on destination + directories_to_be_created = [os.path.join(destination, os.path.relpath(os.path.join(dirpath, x), source)) for x in dirnames] + for directory in directories_to_be_created: + os.makedirs(directory, exist_ok=True) + # second copy all the files + filepaths_source = [os.path.join(dirpath, x) for x in filenames] + filepaths_destination = [os.path.join(destination, os.path.relpath(x, source)) for x in filepaths_source] + for src, dst in zip(filepaths_source, filepaths_destination): + shutil.copyfile(src, dst) + + +def subprocess_run(cmd): + """ + + """ + result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if result.returncode: + print("error {} in call {}".format(result.returncode, cmd)) + print(result.stderr.decode('ascii')) + sys.exit(-1) + else: + print(' output: {}'.format(result.stdout.decode('ascii'))) + + +if __name__ == '__main__': + + # https://sourceforge.net/projects/phaosrpg/files/OldFiles/Pv0.7devel.zip/download is a corrupt zip + + # base path is the directory containing this file + base_path = os.path.abspath(os.path.dirname(__file__)) + print('base path={}'.format(base_path)) + + # recreate archive path + archive_path = os.path.join(base_path, 'downloads') + if not os.path.exists(archive_path): + os.mkdir(archive_path) + + # load source releases urls + with open(os.path.join(base_path, 'phaos.json'), 'r') as f: + urls = json.load(f) + print('will process {} urls'.format(len(urls))) + if len(urls) != len(set(urls)): + raise RuntimeError("urls list contains duplicates") + + # determine file archives from urls + archives = [x.split('/')[-2] for x in urls] + if len(archives) != len(set(archives)): + raise RuntimeError("files with duplicate archives, cannot deal with that") + + # determine version from file name + versions = [determine_version(x) for x in archives] + # for version in versions: + # print(version) + + # extend archives to full paths + archives = [os.path.join(archive_path, x) for x in archives] + + # download them + print('download source releases') + for url, destination in zip(urls, archives): + # only if not yet existing + if os.path.exists(destination): + continue + # download + print(' download {}'.format(os.path.basename(destination))) + with urllib.request.urlopen(url) as response: + with open(destination, 'wb') as f: + shutil.copyfileobj(response, f) + time.sleep(1) # we are nice + + # unzip them + print('unzip downloaded archives') + unzipped_archives = [x[:-4] for x in archives] # folder is archive name without .zip + for archive, unzipped_archive in zip(archives, unzipped_archives): + print(' unzip {}'.format(os.path.basename(archive))) + # only if not yet existing + if os.path.exists(unzipped_archive): + continue + os.mkdir(unzipped_archive) + # unzip + unzip_keep_last_modified(archive, unzipped_archive) + + # go up in unzipped archives until the very first non-empty folder + unzipped_archives = [strip_wrapping(x) for x in unzipped_archives] + + # determine date + dates = [determine_last_modified_date(x) for x in unzipped_archives] + dates_strings = [datetime.datetime.fromtimestamp(x).strftime('%Y-%m-%d') for x in dates] + # if len(dates_strings) != len(set(dates_strings)): + # raise RuntimeError("Some on the same day, cannot cope with that") + + # gather all important stuff in one list and sort by dates + db = list(zip(urls, unzipped_archives, versions, dates, dates_strings)) + db.sort(key=lambda x:x[3]) + print('proposed order') + for url, _, version, _, date in db: + print(' date={} version={}'.format(date, version)) + + # git init + git_path = os.path.join(base_path, 'phaosrpg') + if os.path.exists(git_path): + shutil.rmtree(git_path) + os.mkdir(git_path) + os.chdir(git_path) + subprocess_run(['git', 'init']) + + # now process revision by revision + print('process revisions') + git_author = 'eproductions3 ' + for url, archive_path, version, _, date in db: + print(' process version={}'.format(version)) + + # clear git path without deleting .git + print(' clear git') + for item in os.listdir(git_path): + # ignore '.git + if item == '.git': + continue + item = os.path.join(git_path, item) + if os.path.isdir(item): + shutil.rmtree(item) + else: + os.remove(item) + + # copy unpacked source files to git path + print('copy to git') + copy_tree(archive_path, git_path) + + # update the git index (add unstaged, remove deleted, ...) + print('git add') + os.chdir(git_path) + subprocess_run(['git', 'add', '--all']) + + # perform the commit + print('git commit') + os.chdir(git_path) + message = 'version {} ({}) on {}'.format(version, url, date) + print(' message "{}"'.format(message)) + subprocess_run(['git', 'commit', '--message={}'.format(message), '--author={}'.format(git_author), '--date={}'.format(date)]) \ No newline at end of file