Regenerate manifest strictly from caches

This commit is contained in:
mtkennerly 2022-07-01 07:12:07 +08:00
parent 59520891a8
commit 78cd9df811
No known key found for this signature in database
GPG key ID: E764BE00BE6E6408
9 changed files with 457 additions and 2233 deletions

View file

@ -19,19 +19,9 @@ There are some lower-level commands for finer control or full imports:
* Add new games to wiki-game-cache.yaml (required in order to add them to the manifest): * Add new games to wiki-game-cache.yaml (required in order to add them to the manifest):
* `npm run cache` * `npm run cache`
* Update the manifest with games from the cache (`--limit 25` is default at a time): * Update the manifest with games from the cache:
* All games in cache: `npm run manifest -- --all` * All games in cache: `npm run manifest`
* Games already in the manifest: `npm run manifest -- --existing` * Specific games: `npm run manifest -- "Game 1" "Game 2"`
* Games missing from manifest: `npm run manifest -- --missing`
* Games not yet checked on the wiki: `npm run manifest -- --unchecked`
* Games that had an unknown OS: `npm run manifest -- --unsuportedOs`
* Games that had an unusable path: `npm run manifest -- --unsupportedPath`
* Games with paths that are too broad and are tagged as such in the wiki cache: `npm run manifest -- --tooBroad`
* Games with paths that are too broad and aren't already tagged as such in the wiki cache: `npm run manifest -- --tooBroadUntagged`
* Games with paths that look invalid and are tagged as such in the wiki cache: `npm run manifest -- --irregularPath`
* Games with paths that look invalid and aren't already tagged as such in the wiki cache: `npm run manifest -- --irregularPathUntagged`
* A specific game: `npm run manifest -- "Game 1" "Game 2"`
* In any above command, skip games alphabetically prior to a particular one: `--skipUntil 'Game 3'`
## API etiquette ## API etiquette
When running or modifying the importer script, please be mindful not to When running or modifying the importer script, please be mindful not to

File diff suppressed because it is too large Load diff

View file

@ -311,6 +311,7 @@
* [8bit Arena](https://www.pcgamingwiki.com/wiki/?curid=135504) * [8bit Arena](https://www.pcgamingwiki.com/wiki/?curid=135504)
* [8Bit Fiesta](https://www.pcgamingwiki.com/wiki/?curid=37513) * [8Bit Fiesta](https://www.pcgamingwiki.com/wiki/?curid=37513)
* [8bit Invasion](https://www.pcgamingwiki.com/wiki/?curid=89318) * [8bit Invasion](https://www.pcgamingwiki.com/wiki/?curid=89318)
* [8Bit Killer](https://www.pcgamingwiki.com/wiki/?curid=131280)
* [8bit Pigeon Hunter](https://www.pcgamingwiki.com/wiki/?curid=140898) * [8bit Pigeon Hunter](https://www.pcgamingwiki.com/wiki/?curid=140898)
* [8BitMMO](https://www.pcgamingwiki.com/wiki/?curid=48885) * [8BitMMO](https://www.pcgamingwiki.com/wiki/?curid=48885)
* [8i - Make VR Human](https://www.pcgamingwiki.com/wiki/?curid=43388) * [8i - Make VR Human](https://www.pcgamingwiki.com/wiki/?curid=43388)
@ -1886,6 +1887,7 @@
* [AQUARYOUNS World](https://www.pcgamingwiki.com/wiki/?curid=144329) * [AQUARYOUNS World](https://www.pcgamingwiki.com/wiki/?curid=144329)
* [Aquatica](https://www.pcgamingwiki.com/wiki/?curid=128491) * [Aquatica](https://www.pcgamingwiki.com/wiki/?curid=128491)
* [Aquila Bird Flight Simulator](https://www.pcgamingwiki.com/wiki/?curid=56768) * [Aquila Bird Flight Simulator](https://www.pcgamingwiki.com/wiki/?curid=56768)
* [Ar nosurge: Ode to an Unborn Star Deluxe](https://www.pcgamingwiki.com/wiki/?curid=167379)
* [AR-K: End Game](https://www.pcgamingwiki.com/wiki/?curid=122654) * [AR-K: End Game](https://www.pcgamingwiki.com/wiki/?curid=122654)
* [AR-K: The Great Escape](https://www.pcgamingwiki.com/wiki/?curid=37219) * [AR-K: The Great Escape](https://www.pcgamingwiki.com/wiki/?curid=37219)
* [Ar:piel](https://www.pcgamingwiki.com/wiki/?curid=152240) * [Ar:piel](https://www.pcgamingwiki.com/wiki/?curid=152240)
@ -2065,6 +2067,7 @@
* [Armed and Gelatinous](https://www.pcgamingwiki.com/wiki/?curid=51022) * [Armed and Gelatinous](https://www.pcgamingwiki.com/wiki/?curid=51022)
* [Armed Seven](https://www.pcgamingwiki.com/wiki/?curid=15695) * [Armed Seven](https://www.pcgamingwiki.com/wiki/?curid=15695)
* [Armed Warrior VR](https://www.pcgamingwiki.com/wiki/?curid=73875) * [Armed Warrior VR](https://www.pcgamingwiki.com/wiki/?curid=73875)
* [Armed with Wings: Rearmed](https://www.pcgamingwiki.com/wiki/?curid=37309)
* [Armies of Riddle CCG Fantasy Battle Card Game](https://www.pcgamingwiki.com/wiki/?curid=50745) * [Armies of Riddle CCG Fantasy Battle Card Game](https://www.pcgamingwiki.com/wiki/?curid=50745)
* [Armies of Riddle E.X. (Extreme)](https://www.pcgamingwiki.com/wiki/?curid=157369) * [Armies of Riddle E.X. (Extreme)](https://www.pcgamingwiki.com/wiki/?curid=157369)
* [Armor Clash](https://www.pcgamingwiki.com/wiki/?curid=51033) * [Armor Clash](https://www.pcgamingwiki.com/wiki/?curid=51033)
@ -2266,6 +2269,7 @@
* [Asterion](https://www.pcgamingwiki.com/wiki/?curid=122896) * [Asterion](https://www.pcgamingwiki.com/wiki/?curid=122896)
* [Asterism](https://www.pcgamingwiki.com/wiki/?curid=142259) * [Asterism](https://www.pcgamingwiki.com/wiki/?curid=142259)
* [Asterix & Obelix XXL 2: Mission: Las Vegum](https://www.pcgamingwiki.com/wiki/?curid=175914) * [Asterix & Obelix XXL 2: Mission: Las Vegum](https://www.pcgamingwiki.com/wiki/?curid=175914)
* [Asterix & Obelix XXL: Romastered](https://www.pcgamingwiki.com/wiki/?curid=162927)
* [Astérix & Obélix: Take on Caesar](https://www.pcgamingwiki.com/wiki/?curid=178386) * [Astérix & Obélix: Take on Caesar](https://www.pcgamingwiki.com/wiki/?curid=178386)
* [Astérix: Caesar's Challenge](https://www.pcgamingwiki.com/wiki/?curid=173305) * [Astérix: Caesar's Challenge](https://www.pcgamingwiki.com/wiki/?curid=173305)
* [Asterix: Mega Madness](https://www.pcgamingwiki.com/wiki/?curid=174308) * [Asterix: Mega Madness](https://www.pcgamingwiki.com/wiki/?curid=174308)
@ -2683,6 +2687,7 @@
* [Back to Life 2](https://www.pcgamingwiki.com/wiki/?curid=50312) * [Back to Life 2](https://www.pcgamingwiki.com/wiki/?curid=50312)
* [Back to Life 3](https://www.pcgamingwiki.com/wiki/?curid=49109) * [Back to Life 3](https://www.pcgamingwiki.com/wiki/?curid=49109)
* [Back to the Egg!](https://www.pcgamingwiki.com/wiki/?curid=69591) * [Back to the Egg!](https://www.pcgamingwiki.com/wiki/?curid=69591)
* [Back to the Future: The Game](https://www.pcgamingwiki.com/wiki/?curid=7384)
* [Backfire](https://www.pcgamingwiki.com/wiki/?curid=62483) * [Backfire](https://www.pcgamingwiki.com/wiki/?curid=62483)
* [Backgammon](https://www.pcgamingwiki.com/wiki/?curid=68382) * [Backgammon](https://www.pcgamingwiki.com/wiki/?curid=68382)
* [Backgammon Blitz](https://www.pcgamingwiki.com/wiki/?curid=45659) * [Backgammon Blitz](https://www.pcgamingwiki.com/wiki/?curid=45659)
@ -2904,6 +2909,7 @@
* [Bare Metal](https://www.pcgamingwiki.com/wiki/?curid=77616) * [Bare Metal](https://www.pcgamingwiki.com/wiki/?curid=77616)
* [Bargain Hunter](https://www.pcgamingwiki.com/wiki/?curid=114536) * [Bargain Hunter](https://www.pcgamingwiki.com/wiki/?curid=114536)
* [Bargon Attack](https://www.pcgamingwiki.com/wiki/?curid=146991) * [Bargon Attack](https://www.pcgamingwiki.com/wiki/?curid=146991)
* [Barkley, Shut Up and Jam: Gaiden](https://www.pcgamingwiki.com/wiki/?curid=163670)
* [Barney's Dream Cruise](https://www.pcgamingwiki.com/wiki/?curid=141332) * [Barney's Dream Cruise](https://www.pcgamingwiki.com/wiki/?curid=141332)
* [Barnyard Mahjong 3](https://www.pcgamingwiki.com/wiki/?curid=41988) * [Barnyard Mahjong 3](https://www.pcgamingwiki.com/wiki/?curid=41988)
* [Baron Wittard: Nemesis of Ragnarok](https://www.pcgamingwiki.com/wiki/?curid=50377) * [Baron Wittard: Nemesis of Ragnarok](https://www.pcgamingwiki.com/wiki/?curid=50377)
@ -3176,6 +3182,7 @@
* [Bead](https://www.pcgamingwiki.com/wiki/?curid=65023) * [Bead](https://www.pcgamingwiki.com/wiki/?curid=65023)
* [Beak Squadron](https://www.pcgamingwiki.com/wiki/?curid=124044) * [Beak Squadron](https://www.pcgamingwiki.com/wiki/?curid=124044)
* [Beam](https://www.pcgamingwiki.com/wiki/?curid=135145) * [Beam](https://www.pcgamingwiki.com/wiki/?curid=135145)
* [BeamNG.drive](https://www.pcgamingwiki.com/wiki/?curid=9256)
* [Bean Battles](https://www.pcgamingwiki.com/wiki/?curid=104837) * [Bean Battles](https://www.pcgamingwiki.com/wiki/?curid=104837)
* [Beans: The Coffee Shop Simulator](https://www.pcgamingwiki.com/wiki/?curid=62485) * [Beans: The Coffee Shop Simulator](https://www.pcgamingwiki.com/wiki/?curid=62485)
* [BeanVR](https://www.pcgamingwiki.com/wiki/?curid=62937) * [BeanVR](https://www.pcgamingwiki.com/wiki/?curid=62937)
@ -3723,6 +3730,7 @@
* [Blake and Mortimer: The Tables of Babylon](https://www.pcgamingwiki.com/wiki/?curid=131505) * [Blake and Mortimer: The Tables of Babylon](https://www.pcgamingwiki.com/wiki/?curid=131505)
* [BlamBox](https://www.pcgamingwiki.com/wiki/?curid=113562) * [BlamBox](https://www.pcgamingwiki.com/wiki/?curid=113562)
* [Blamdown: Udder Fury](https://www.pcgamingwiki.com/wiki/?curid=36628) * [Blamdown: Udder Fury](https://www.pcgamingwiki.com/wiki/?curid=36628)
* [Blame Him](https://www.pcgamingwiki.com/wiki/?curid=122556)
* [Blanco](https://www.pcgamingwiki.com/wiki/?curid=40185) * [Blanco](https://www.pcgamingwiki.com/wiki/?curid=40185)
* [Blanket Heavy With Nightmares](https://www.pcgamingwiki.com/wiki/?curid=130197) * [Blanket Heavy With Nightmares](https://www.pcgamingwiki.com/wiki/?curid=130197)
* [BLARP!](https://www.pcgamingwiki.com/wiki/?curid=37405) * [BLARP!](https://www.pcgamingwiki.com/wiki/?curid=37405)
@ -5845,6 +5853,7 @@
* [CivilContract](https://www.pcgamingwiki.com/wiki/?curid=126016) * [CivilContract](https://www.pcgamingwiki.com/wiki/?curid=126016)
* [Civilization](https://www.pcgamingwiki.com/wiki/?curid=4915) * [Civilization](https://www.pcgamingwiki.com/wiki/?curid=4915)
* [Civilization II](https://www.pcgamingwiki.com/wiki/?curid=422) * [Civilization II](https://www.pcgamingwiki.com/wiki/?curid=422)
* [Civilization III](https://www.pcgamingwiki.com/wiki/?curid=3168)
* [Civilization: Call to Power](https://www.pcgamingwiki.com/wiki/?curid=148114) * [Civilization: Call to Power](https://www.pcgamingwiki.com/wiki/?curid=148114)
* [Civitas Nova](https://www.pcgamingwiki.com/wiki/?curid=144250) * [Civitas Nova](https://www.pcgamingwiki.com/wiki/?curid=144250)
* [Civitatem](https://www.pcgamingwiki.com/wiki/?curid=78782) * [Civitatem](https://www.pcgamingwiki.com/wiki/?curid=78782)
@ -7046,6 +7055,7 @@
* [Cubotrox](https://www.pcgamingwiki.com/wiki/?curid=52930) * [Cubotrox](https://www.pcgamingwiki.com/wiki/?curid=52930)
* [Cubrick](https://www.pcgamingwiki.com/wiki/?curid=61108) * [Cubrick](https://www.pcgamingwiki.com/wiki/?curid=61108)
* [Cubway](https://www.pcgamingwiki.com/wiki/?curid=41655) * [Cubway](https://www.pcgamingwiki.com/wiki/?curid=41655)
* [Cuckold Simulator](https://www.pcgamingwiki.com/wiki/?curid=156077)
* [Cuco](https://www.pcgamingwiki.com/wiki/?curid=88410) * [Cuco](https://www.pcgamingwiki.com/wiki/?curid=88410)
* [Cucumber Blues](https://www.pcgamingwiki.com/wiki/?curid=60910) * [Cucumber Blues](https://www.pcgamingwiki.com/wiki/?curid=60910)
* [Cucumber Defense VR](https://www.pcgamingwiki.com/wiki/?curid=148435) * [Cucumber Defense VR](https://www.pcgamingwiki.com/wiki/?curid=148435)
@ -8100,7 +8110,6 @@
* [Demon Pit](https://www.pcgamingwiki.com/wiki/?curid=145079) * [Demon Pit](https://www.pcgamingwiki.com/wiki/?curid=145079)
* [Demon Queen Melissa](https://www.pcgamingwiki.com/wiki/?curid=130672) * [Demon Queen Melissa](https://www.pcgamingwiki.com/wiki/?curid=130672)
* [Demon Robot Runner](https://www.pcgamingwiki.com/wiki/?curid=88150) * [Demon Robot Runner](https://www.pcgamingwiki.com/wiki/?curid=88150)
* [Demon Slayer -Kimetsu no Yaiba- The Hinokami Chronicles](https://www.pcgamingwiki.com/wiki/?curid=166446)
* [Demon Truck](https://www.pcgamingwiki.com/wiki/?curid=41495) * [Demon Truck](https://www.pcgamingwiki.com/wiki/?curid=41495)
* [Demon Turf](https://www.pcgamingwiki.com/wiki/?curid=161608) * [Demon Turf](https://www.pcgamingwiki.com/wiki/?curid=161608)
* [Demon Turf: Neon Splash](https://www.pcgamingwiki.com/wiki/?curid=177760) * [Demon Turf: Neon Splash](https://www.pcgamingwiki.com/wiki/?curid=177760)
@ -8536,7 +8545,6 @@
* [Discovering Colors - Animals](https://www.pcgamingwiki.com/wiki/?curid=43624) * [Discovering Colors - Animals](https://www.pcgamingwiki.com/wiki/?curid=43624)
* [Discovering Space 2](https://www.pcgamingwiki.com/wiki/?curid=58906) * [Discovering Space 2](https://www.pcgamingwiki.com/wiki/?curid=58906)
* [Discovery Tour: Ancient Egypt](https://www.pcgamingwiki.com/wiki/?curid=87656) * [Discovery Tour: Ancient Egypt](https://www.pcgamingwiki.com/wiki/?curid=87656)
* [Discovery Tour: Ancient Greece](https://www.pcgamingwiki.com/wiki/?curid=146671)
* [Discovery Tour: Viking Age](https://www.pcgamingwiki.com/wiki/?curid=172338) * [Discovery Tour: Viking Age](https://www.pcgamingwiki.com/wiki/?curid=172338)
* [Discovery! A Seek and Find Adventure](https://www.pcgamingwiki.com/wiki/?curid=41352) * [Discovery! A Seek and Find Adventure](https://www.pcgamingwiki.com/wiki/?curid=41352)
* [Discovr Egypt: King Tut's Tomb](https://www.pcgamingwiki.com/wiki/?curid=43642) * [Discovr Egypt: King Tut's Tomb](https://www.pcgamingwiki.com/wiki/?curid=43642)
@ -9043,7 +9051,6 @@
* [Dragon Sinker](https://www.pcgamingwiki.com/wiki/?curid=77255) * [Dragon Sinker](https://www.pcgamingwiki.com/wiki/?curid=77255)
* [Dragon Skies VR](https://www.pcgamingwiki.com/wiki/?curid=52622) * [Dragon Skies VR](https://www.pcgamingwiki.com/wiki/?curid=52622)
* [Dragon Slayer](https://www.pcgamingwiki.com/wiki/?curid=149592) * [Dragon Slayer](https://www.pcgamingwiki.com/wiki/?curid=149592)
* [Dragon Slayer: The Legend of Heroes II](https://www.pcgamingwiki.com/wiki/?curid=174909)
* [Dragon Souls](https://www.pcgamingwiki.com/wiki/?curid=53491) * [Dragon Souls](https://www.pcgamingwiki.com/wiki/?curid=53491)
* [Dragon Spear](https://www.pcgamingwiki.com/wiki/?curid=108568) * [Dragon Spear](https://www.pcgamingwiki.com/wiki/?curid=108568)
* [Dragon Spirits](https://www.pcgamingwiki.com/wiki/?curid=154322) * [Dragon Spirits](https://www.pcgamingwiki.com/wiki/?curid=154322)
@ -9336,6 +9343,7 @@
* [DUCK CASINO: BULLET](https://www.pcgamingwiki.com/wiki/?curid=113694) * [DUCK CASINO: BULLET](https://www.pcgamingwiki.com/wiki/?curid=113694)
* [Duck Dynasty](https://www.pcgamingwiki.com/wiki/?curid=49514) * [Duck Dynasty](https://www.pcgamingwiki.com/wiki/?curid=49514)
* [Duck Force](https://www.pcgamingwiki.com/wiki/?curid=41549) * [Duck Force](https://www.pcgamingwiki.com/wiki/?curid=41549)
* [Duck Game](https://www.pcgamingwiki.com/wiki/?curid=27815)
* [Duck Hunt Challenge](https://www.pcgamingwiki.com/wiki/?curid=122340) * [Duck Hunt Challenge](https://www.pcgamingwiki.com/wiki/?curid=122340)
* [Duck Hunting](https://www.pcgamingwiki.com/wiki/?curid=60738) * [Duck Hunting](https://www.pcgamingwiki.com/wiki/?curid=60738)
* [Duck in Town - A Rising Knight](https://www.pcgamingwiki.com/wiki/?curid=144985) * [Duck in Town - A Rising Knight](https://www.pcgamingwiki.com/wiki/?curid=144985)
@ -10699,6 +10707,7 @@
* [Face It - A game to fight inner demons](https://www.pcgamingwiki.com/wiki/?curid=47335) * [Face It - A game to fight inner demons](https://www.pcgamingwiki.com/wiki/?curid=47335)
* [Face Your Demons](https://www.pcgamingwiki.com/wiki/?curid=144232) * [Face Your Demons](https://www.pcgamingwiki.com/wiki/?curid=144232)
* [Faceless](https://www.pcgamingwiki.com/wiki/?curid=70852) * [Faceless](https://www.pcgamingwiki.com/wiki/?curid=70852)
* [Faces of War](https://www.pcgamingwiki.com/wiki/?curid=34370)
* [Faceted Flight](https://www.pcgamingwiki.com/wiki/?curid=51147) * [Faceted Flight](https://www.pcgamingwiki.com/wiki/?curid=51147)
* [Factions: Origins of Malu](https://www.pcgamingwiki.com/wiki/?curid=48413) * [Factions: Origins of Malu](https://www.pcgamingwiki.com/wiki/?curid=48413)
* [Factory Balls](https://www.pcgamingwiki.com/wiki/?curid=132694) * [Factory Balls](https://www.pcgamingwiki.com/wiki/?curid=132694)
@ -10795,6 +10804,7 @@
* [Fallen Haven](https://www.pcgamingwiki.com/wiki/?curid=131805) * [Fallen Haven](https://www.pcgamingwiki.com/wiki/?curid=131805)
* [Fallen Haven: Liberation Day](https://www.pcgamingwiki.com/wiki/?curid=131807) * [Fallen Haven: Liberation Day](https://www.pcgamingwiki.com/wiki/?curid=131807)
* [Fallen Hearts](https://www.pcgamingwiki.com/wiki/?curid=156400) * [Fallen Hearts](https://www.pcgamingwiki.com/wiki/?curid=156400)
* [Fallen Hero: Rebirth](https://www.pcgamingwiki.com/wiki/?curid=87173)
* [Fallen Kingdom](https://www.pcgamingwiki.com/wiki/?curid=74932) * [Fallen Kingdom](https://www.pcgamingwiki.com/wiki/?curid=74932)
* [Fallen Knight](https://www.pcgamingwiki.com/wiki/?curid=152330) * [Fallen Knight](https://www.pcgamingwiki.com/wiki/?curid=152330)
* [Fallen Legion: Rise to Glory](https://www.pcgamingwiki.com/wiki/?curid=77321) * [Fallen Legion: Rise to Glory](https://www.pcgamingwiki.com/wiki/?curid=77321)
@ -11256,7 +11266,6 @@
* [Final Directive](https://www.pcgamingwiki.com/wiki/?curid=80966) * [Final Directive](https://www.pcgamingwiki.com/wiki/?curid=80966)
* [Final Dusk](https://www.pcgamingwiki.com/wiki/?curid=49125) * [Final Dusk](https://www.pcgamingwiki.com/wiki/?curid=49125)
* [Final Fantasy Awakening](https://www.pcgamingwiki.com/wiki/?curid=26745) * [Final Fantasy Awakening](https://www.pcgamingwiki.com/wiki/?curid=26745)
* [Final Fantasy III](https://www.pcgamingwiki.com/wiki/?curid=169624)
* [Final Fantasy XI](https://www.pcgamingwiki.com/wiki/?curid=788) * [Final Fantasy XI](https://www.pcgamingwiki.com/wiki/?curid=788)
* [Final Fleet](https://www.pcgamingwiki.com/wiki/?curid=38791) * [Final Fleet](https://www.pcgamingwiki.com/wiki/?curid=38791)
* [Final Hope](https://www.pcgamingwiki.com/wiki/?curid=110158) * [Final Hope](https://www.pcgamingwiki.com/wiki/?curid=110158)
@ -11391,6 +11400,7 @@
* [Fishy Dungeon Delving](https://www.pcgamingwiki.com/wiki/?curid=134411) * [Fishy Dungeon Delving](https://www.pcgamingwiki.com/wiki/?curid=134411)
* [Fishy2](https://www.pcgamingwiki.com/wiki/?curid=156292) * [Fishy2](https://www.pcgamingwiki.com/wiki/?curid=156292)
* [Fisk](https://www.pcgamingwiki.com/wiki/?curid=79058) * [Fisk](https://www.pcgamingwiki.com/wiki/?curid=79058)
* [Fission Superstar X](https://www.pcgamingwiki.com/wiki/?curid=89702)
* [Fist of Brave](https://www.pcgamingwiki.com/wiki/?curid=82117) * [Fist of Brave](https://www.pcgamingwiki.com/wiki/?curid=82117)
* [Fist Of Heaven & Hell](https://www.pcgamingwiki.com/wiki/?curid=141182) * [Fist Of Heaven & Hell](https://www.pcgamingwiki.com/wiki/?curid=141182)
* [Fist of love](https://www.pcgamingwiki.com/wiki/?curid=114336) * [Fist of love](https://www.pcgamingwiki.com/wiki/?curid=114336)
@ -11954,6 +11964,7 @@
* [Freedom Defender](https://www.pcgamingwiki.com/wiki/?curid=68156) * [Freedom Defender](https://www.pcgamingwiki.com/wiki/?curid=68156)
* [Freedom Fall](https://www.pcgamingwiki.com/wiki/?curid=37576) * [Freedom Fall](https://www.pcgamingwiki.com/wiki/?curid=37576)
* [Freedom Fighter](https://www.pcgamingwiki.com/wiki/?curid=62906) * [Freedom Fighter](https://www.pcgamingwiki.com/wiki/?curid=62906)
* [Freedom Fighters (2020)](https://www.pcgamingwiki.com/wiki/?curid=163712)
* [Freedom Finger](https://www.pcgamingwiki.com/wiki/?curid=130650) * [Freedom Finger](https://www.pcgamingwiki.com/wiki/?curid=130650)
* [Freedom Locomotion VR](https://www.pcgamingwiki.com/wiki/?curid=59035) * [Freedom Locomotion VR](https://www.pcgamingwiki.com/wiki/?curid=59035)
* [Freedom March: Rebel Leader](https://www.pcgamingwiki.com/wiki/?curid=92205) * [Freedom March: Rebel Leader](https://www.pcgamingwiki.com/wiki/?curid=92205)
@ -12538,7 +12549,6 @@
* [Gene](https://www.pcgamingwiki.com/wiki/?curid=48845) * [Gene](https://www.pcgamingwiki.com/wiki/?curid=48845)
* [Gene Rain](https://www.pcgamingwiki.com/wiki/?curid=100434) * [Gene Rain](https://www.pcgamingwiki.com/wiki/?curid=100434)
* [Gene Rain: Wind Tower](https://www.pcgamingwiki.com/wiki/?curid=149099) * [Gene Rain: Wind Tower](https://www.pcgamingwiki.com/wiki/?curid=149099)
* [Geneforge](https://www.pcgamingwiki.com/wiki/?curid=10284)
* [General Coco](https://www.pcgamingwiki.com/wiki/?curid=149368) * [General Coco](https://www.pcgamingwiki.com/wiki/?curid=149368)
* [General Horse and the Package of Doom](https://www.pcgamingwiki.com/wiki/?curid=113264) * [General Horse and the Package of Doom](https://www.pcgamingwiki.com/wiki/?curid=113264)
* [General Practitioner](https://www.pcgamingwiki.com/wiki/?curid=114154) * [General Practitioner](https://www.pcgamingwiki.com/wiki/?curid=114154)
@ -12605,7 +12615,6 @@
* [Get the Gems](https://www.pcgamingwiki.com/wiki/?curid=52838) * [Get the Gems](https://www.pcgamingwiki.com/wiki/?curid=52838)
* [Get to a Gun](https://www.pcgamingwiki.com/wiki/?curid=112536) * [Get to a Gun](https://www.pcgamingwiki.com/wiki/?curid=112536)
* [Get to Amkonius](https://www.pcgamingwiki.com/wiki/?curid=73523) * [Get to Amkonius](https://www.pcgamingwiki.com/wiki/?curid=73523)
* [Get to Work, Succubus-Chan!](https://www.pcgamingwiki.com/wiki/?curid=173507)
* [Get Wrecked](https://www.pcgamingwiki.com/wiki/?curid=88896) * [Get Wrecked](https://www.pcgamingwiki.com/wiki/?curid=88896)
* [Get'em Gary](https://www.pcgamingwiki.com/wiki/?curid=59181) * [Get'em Gary](https://www.pcgamingwiki.com/wiki/?curid=59181)
* [Getaway Island](https://www.pcgamingwiki.com/wiki/?curid=60458) * [Getaway Island](https://www.pcgamingwiki.com/wiki/?curid=60458)
@ -12773,6 +12782,7 @@
* [Gleamlight](https://www.pcgamingwiki.com/wiki/?curid=156905) * [Gleamlight](https://www.pcgamingwiki.com/wiki/?curid=156905)
* [Glick's Cat Simulator](https://www.pcgamingwiki.com/wiki/?curid=77391) * [Glick's Cat Simulator](https://www.pcgamingwiki.com/wiki/?curid=77391)
* [Glider](https://www.pcgamingwiki.com/wiki/?curid=163191) * [Glider](https://www.pcgamingwiki.com/wiki/?curid=163191)
* [Glider 4.0](https://www.pcgamingwiki.com/wiki/?curid=162586)
* [Glider Classic](https://www.pcgamingwiki.com/wiki/?curid=162532) * [Glider Classic](https://www.pcgamingwiki.com/wiki/?curid=162532)
* [Glider Island](https://www.pcgamingwiki.com/wiki/?curid=38635) * [Glider Island](https://www.pcgamingwiki.com/wiki/?curid=38635)
* [Glider Pro](https://www.pcgamingwiki.com/wiki/?curid=162748) * [Glider Pro](https://www.pcgamingwiki.com/wiki/?curid=162748)
@ -13038,6 +13048,7 @@
* [Good Mourning](https://www.pcgamingwiki.com/wiki/?curid=164717) * [Good Mourning](https://www.pcgamingwiki.com/wiki/?curid=164717)
* [Good Night, Knight](https://www.pcgamingwiki.com/wiki/?curid=145600) * [Good Night, Knight](https://www.pcgamingwiki.com/wiki/?curid=145600)
* [Good Pizza, Great Pizza](https://www.pcgamingwiki.com/wiki/?curid=94340) * [Good Pizza, Great Pizza](https://www.pcgamingwiki.com/wiki/?curid=94340)
* [Good Robot](https://www.pcgamingwiki.com/wiki/?curid=37401)
* [Goodbye 2019 (Interactive Movie)](https://www.pcgamingwiki.com/wiki/?curid=155312) * [Goodbye 2019 (Interactive Movie)](https://www.pcgamingwiki.com/wiki/?curid=155312)
* [Goodbye My King](https://www.pcgamingwiki.com/wiki/?curid=63448) * [Goodbye My King](https://www.pcgamingwiki.com/wiki/?curid=63448)
* [Goodnight](https://www.pcgamingwiki.com/wiki/?curid=69104) * [Goodnight](https://www.pcgamingwiki.com/wiki/?curid=69104)
@ -13122,6 +13133,7 @@
* [Grand Tactician: The Civil War (1861-1865)](https://www.pcgamingwiki.com/wiki/?curid=105701) * [Grand Tactician: The Civil War (1861-1865)](https://www.pcgamingwiki.com/wiki/?curid=105701)
* [Grand Theft Auto: Chinatown Wars](https://www.pcgamingwiki.com/wiki/?curid=168124) * [Grand Theft Auto: Chinatown Wars](https://www.pcgamingwiki.com/wiki/?curid=168124)
* [Grand Theft Auto: iFruit](https://www.pcgamingwiki.com/wiki/?curid=169308) * [Grand Theft Auto: iFruit](https://www.pcgamingwiki.com/wiki/?curid=169308)
* [Grand Theft Auto: The Trilogy The Definitive Edition](https://www.pcgamingwiki.com/wiki/?curid=172128)
* [Grandmaster Chess](https://www.pcgamingwiki.com/wiki/?curid=171214) * [Grandmaster Chess](https://www.pcgamingwiki.com/wiki/?curid=171214)
* [GrandNarr!](https://www.pcgamingwiki.com/wiki/?curid=145457) * [GrandNarr!](https://www.pcgamingwiki.com/wiki/?curid=145457)
* [Grandpa](https://www.pcgamingwiki.com/wiki/?curid=91815) * [Grandpa](https://www.pcgamingwiki.com/wiki/?curid=91815)
@ -13605,6 +13617,7 @@
* [Half Dead](https://www.pcgamingwiki.com/wiki/?curid=34024) * [Half Dead](https://www.pcgamingwiki.com/wiki/?curid=34024)
* [Half Past Disaster](https://www.pcgamingwiki.com/wiki/?curid=72869) * [Half Past Disaster](https://www.pcgamingwiki.com/wiki/?curid=72869)
* [Half Past Impossible](https://www.pcgamingwiki.com/wiki/?curid=77269) * [Half Past Impossible](https://www.pcgamingwiki.com/wiki/?curid=77269)
* [Half-Life (SteamPipe)](https://www.pcgamingwiki.com/wiki/?curid=176027)
* [Half-Life 2: Genry's Great Escape from City 13](https://www.pcgamingwiki.com/wiki/?curid=175041) * [Half-Life 2: Genry's Great Escape from City 13](https://www.pcgamingwiki.com/wiki/?curid=175041)
* [Half-Life: Absolute Zero](https://www.pcgamingwiki.com/wiki/?curid=160590) * [Half-Life: Absolute Zero](https://www.pcgamingwiki.com/wiki/?curid=160590)
* [Half-Life: Before](https://www.pcgamingwiki.com/wiki/?curid=176536) * [Half-Life: Before](https://www.pcgamingwiki.com/wiki/?curid=176536)
@ -13996,6 +14009,7 @@
* [Hell Dimension VR](https://www.pcgamingwiki.com/wiki/?curid=70080) * [Hell Dimension VR](https://www.pcgamingwiki.com/wiki/?curid=70080)
* [Hell Empire: Sinners Flow](https://www.pcgamingwiki.com/wiki/?curid=130599) * [Hell Empire: Sinners Flow](https://www.pcgamingwiki.com/wiki/?curid=130599)
* [Hell Hole](https://www.pcgamingwiki.com/wiki/?curid=130074) * [Hell Hole](https://www.pcgamingwiki.com/wiki/?curid=130074)
* [Hell Hunt](https://www.pcgamingwiki.com/wiki/?curid=161472)
* [Hell in Paradise](https://www.pcgamingwiki.com/wiki/?curid=93204) * [Hell in Paradise](https://www.pcgamingwiki.com/wiki/?curid=93204)
* [Hell Knights](https://www.pcgamingwiki.com/wiki/?curid=103015) * [Hell Knights](https://www.pcgamingwiki.com/wiki/?curid=103015)
* [Hell of Men : Blood Brothers](https://www.pcgamingwiki.com/wiki/?curid=144949) * [Hell of Men : Blood Brothers](https://www.pcgamingwiki.com/wiki/?curid=144949)
@ -14952,6 +14966,7 @@
* [Hungry Planet](https://www.pcgamingwiki.com/wiki/?curid=108044) * [Hungry Planet](https://www.pcgamingwiki.com/wiki/?curid=108044)
* [Hungry Shadows](https://www.pcgamingwiki.com/wiki/?curid=104379) * [Hungry Shadows](https://www.pcgamingwiki.com/wiki/?curid=104379)
* [Hunt 'n Sneak](https://www.pcgamingwiki.com/wiki/?curid=122692) * [Hunt 'n Sneak](https://www.pcgamingwiki.com/wiki/?curid=122692)
* [Hunt Down The Freeman](https://www.pcgamingwiki.com/wiki/?curid=79920)
* [Hunt For Gods](https://www.pcgamingwiki.com/wiki/?curid=69417) * [Hunt For Gods](https://www.pcgamingwiki.com/wiki/?curid=69417)
* [Hunt the Thailand Hidden](https://www.pcgamingwiki.com/wiki/?curid=138764) * [Hunt the Thailand Hidden](https://www.pcgamingwiki.com/wiki/?curid=138764)
* [Hunt With Friends](https://www.pcgamingwiki.com/wiki/?curid=93824) * [Hunt With Friends](https://www.pcgamingwiki.com/wiki/?curid=93824)
@ -15648,6 +15663,7 @@
* [Instinct: Survival](https://www.pcgamingwiki.com/wiki/?curid=135271) * [Instinct: Survival](https://www.pcgamingwiki.com/wiki/?curid=135271)
* [Insurgence - Chains of Renegade](https://www.pcgamingwiki.com/wiki/?curid=109684) * [Insurgence - Chains of Renegade](https://www.pcgamingwiki.com/wiki/?curid=109684)
* [Insurgence - Second Assault](https://www.pcgamingwiki.com/wiki/?curid=137014) * [Insurgence - Second Assault](https://www.pcgamingwiki.com/wiki/?curid=137014)
* [Insurmountable](https://www.pcgamingwiki.com/wiki/?curid=175695)
* [Integrity](https://www.pcgamingwiki.com/wiki/?curid=75616) * [Integrity](https://www.pcgamingwiki.com/wiki/?curid=75616)
* [Intelligence](https://www.pcgamingwiki.com/wiki/?curid=91959) * [Intelligence](https://www.pcgamingwiki.com/wiki/?curid=91959)
* [Intelligence Trader](https://www.pcgamingwiki.com/wiki/?curid=100370) * [Intelligence Trader](https://www.pcgamingwiki.com/wiki/?curid=100370)
@ -15703,6 +15719,7 @@
* [Into the Ice: Nazis of Neuschwabenland](https://www.pcgamingwiki.com/wiki/?curid=62841) * [Into the Ice: Nazis of Neuschwabenland](https://www.pcgamingwiki.com/wiki/?curid=62841)
* [Into The Maze](https://www.pcgamingwiki.com/wiki/?curid=157189) * [Into The Maze](https://www.pcgamingwiki.com/wiki/?curid=157189)
* [Into the Pit](https://www.pcgamingwiki.com/wiki/?curid=170942) * [Into the Pit](https://www.pcgamingwiki.com/wiki/?curid=170942)
* [Into the Radius VR](https://www.pcgamingwiki.com/wiki/?curid=128621)
* [Into the Rhythm VR](https://www.pcgamingwiki.com/wiki/?curid=69695) * [Into the Rhythm VR](https://www.pcgamingwiki.com/wiki/?curid=69695)
* [Into The Soup](https://www.pcgamingwiki.com/wiki/?curid=151635) * [Into The Soup](https://www.pcgamingwiki.com/wiki/?curid=151635)
* [Into the Stars](https://www.pcgamingwiki.com/wiki/?curid=26277) * [Into the Stars](https://www.pcgamingwiki.com/wiki/?curid=26277)
@ -15886,7 +15903,6 @@
* [IStorm](https://www.pcgamingwiki.com/wiki/?curid=60281) * [IStorm](https://www.pcgamingwiki.com/wiki/?curid=60281)
* [Istrolid](https://www.pcgamingwiki.com/wiki/?curid=38179) * [Istrolid](https://www.pcgamingwiki.com/wiki/?curid=38179)
* [Isyium](https://www.pcgamingwiki.com/wiki/?curid=54806) * [Isyium](https://www.pcgamingwiki.com/wiki/?curid=54806)
* [It Came from Space and Ate Our Brains](https://www.pcgamingwiki.com/wiki/?curid=38329)
* [It Comes Around - A Kinetic Novel](https://www.pcgamingwiki.com/wiki/?curid=50737) * [It Comes Around - A Kinetic Novel](https://www.pcgamingwiki.com/wiki/?curid=50737)
* [It comes from hell](https://www.pcgamingwiki.com/wiki/?curid=132678) * [It comes from hell](https://www.pcgamingwiki.com/wiki/?curid=132678)
* [It Could Have Been Me](https://www.pcgamingwiki.com/wiki/?curid=135399) * [It Could Have Been Me](https://www.pcgamingwiki.com/wiki/?curid=135399)
@ -18232,6 +18248,7 @@
* [Lurk](https://www.pcgamingwiki.com/wiki/?curid=87934) * [Lurk](https://www.pcgamingwiki.com/wiki/?curid=87934)
* [Lurk in the Dark : Prologue](https://www.pcgamingwiki.com/wiki/?curid=150452) * [Lurk in the Dark : Prologue](https://www.pcgamingwiki.com/wiki/?curid=150452)
* [Lust Academy - Season 1](https://www.pcgamingwiki.com/wiki/?curid=174788) * [Lust Academy - Season 1](https://www.pcgamingwiki.com/wiki/?curid=174788)
* [Lust from Beyond: Prologue](https://www.pcgamingwiki.com/wiki/?curid=153344)
* [Lust Theory - Season 1](https://www.pcgamingwiki.com/wiki/?curid=172942) * [Lust Theory - Season 1](https://www.pcgamingwiki.com/wiki/?curid=172942)
* [Lustful Survival](https://www.pcgamingwiki.com/wiki/?curid=149961) * [Lustful Survival](https://www.pcgamingwiki.com/wiki/?curid=149961)
* [Luvocious](https://www.pcgamingwiki.com/wiki/?curid=75693) * [Luvocious](https://www.pcgamingwiki.com/wiki/?curid=75693)
@ -18951,6 +18968,7 @@
* [Mecha Knights: Nightmare](https://www.pcgamingwiki.com/wiki/?curid=151448) * [Mecha Knights: Nightmare](https://www.pcgamingwiki.com/wiki/?curid=151448)
* [Mecha-Tokyo Rush](https://www.pcgamingwiki.com/wiki/?curid=97331) * [Mecha-Tokyo Rush](https://www.pcgamingwiki.com/wiki/?curid=97331)
* [MechaGore](https://www.pcgamingwiki.com/wiki/?curid=33785) * [MechaGore](https://www.pcgamingwiki.com/wiki/?curid=33785)
* [Mechajammer](https://www.pcgamingwiki.com/wiki/?curid=173149)
* [Mechanic Miner](https://www.pcgamingwiki.com/wiki/?curid=78824) * [Mechanic Miner](https://www.pcgamingwiki.com/wiki/?curid=78824)
* [MechanicalFuture](https://www.pcgamingwiki.com/wiki/?curid=155897) * [MechanicalFuture](https://www.pcgamingwiki.com/wiki/?curid=155897)
* [Mechanik EN57](https://www.pcgamingwiki.com/wiki/?curid=86900) * [Mechanik EN57](https://www.pcgamingwiki.com/wiki/?curid=86900)
@ -21039,6 +21057,7 @@
* [Ninja Stealth 3](https://www.pcgamingwiki.com/wiki/?curid=77216) * [Ninja Stealth 3](https://www.pcgamingwiki.com/wiki/?curid=77216)
* [Ninja Striker!](https://www.pcgamingwiki.com/wiki/?curid=91937) * [Ninja Striker!](https://www.pcgamingwiki.com/wiki/?curid=91937)
* [Ninja Turdle](https://www.pcgamingwiki.com/wiki/?curid=156863) * [Ninja Turdle](https://www.pcgamingwiki.com/wiki/?curid=156863)
* [Ninja Tycoon](https://www.pcgamingwiki.com/wiki/?curid=81633)
* [Ninja Village War 2](https://www.pcgamingwiki.com/wiki/?curid=78260) * [Ninja Village War 2](https://www.pcgamingwiki.com/wiki/?curid=78260)
* [Ninja Way](https://www.pcgamingwiki.com/wiki/?curid=74229) * [Ninja Way](https://www.pcgamingwiki.com/wiki/?curid=74229)
* [Ninja?](https://www.pcgamingwiki.com/wiki/?curid=125835) * [Ninja?](https://www.pcgamingwiki.com/wiki/?curid=125835)
@ -21203,7 +21222,7 @@
* [Nostradamus - The Four Horsemen of the Apocalypse](https://www.pcgamingwiki.com/wiki/?curid=80418) * [Nostradamus - The Four Horsemen of the Apocalypse](https://www.pcgamingwiki.com/wiki/?curid=80418)
* [Not a Prank](https://www.pcgamingwiki.com/wiki/?curid=139203) * [Not a Prank](https://www.pcgamingwiki.com/wiki/?curid=139203)
* [Not Dying Today](https://www.pcgamingwiki.com/wiki/?curid=55764) * [Not Dying Today](https://www.pcgamingwiki.com/wiki/?curid=55764)
* [Not for Broadcast](https://www.pcgamingwiki.com/wiki/?curid=150852) * [Not For Broadcast: Prologue](https://www.pcgamingwiki.com/wiki/?curid=153489)
* [Not Heaven](https://www.pcgamingwiki.com/wiki/?curid=121145) * [Not Heaven](https://www.pcgamingwiki.com/wiki/?curid=121145)
* [Not in Heaven](https://www.pcgamingwiki.com/wiki/?curid=121041) * [Not in Heaven](https://www.pcgamingwiki.com/wiki/?curid=121041)
* [Not My Day!](https://www.pcgamingwiki.com/wiki/?curid=120965) * [Not My Day!](https://www.pcgamingwiki.com/wiki/?curid=120965)
@ -21398,6 +21417,7 @@
* [Oddmar](https://www.pcgamingwiki.com/wiki/?curid=172740) * [Oddmar](https://www.pcgamingwiki.com/wiki/?curid=172740)
* [OddPlanet](https://www.pcgamingwiki.com/wiki/?curid=34448) * [OddPlanet](https://www.pcgamingwiki.com/wiki/?curid=34448)
* [Oddventure](https://www.pcgamingwiki.com/wiki/?curid=168818) * [Oddventure](https://www.pcgamingwiki.com/wiki/?curid=168818)
* [Oddworld: Soulstorm](https://www.pcgamingwiki.com/wiki/?curid=131251)
* [Ode to a Moon](https://www.pcgamingwiki.com/wiki/?curid=142093) * [Ode to a Moon](https://www.pcgamingwiki.com/wiki/?curid=142093)
* [Odium to the Core](https://www.pcgamingwiki.com/wiki/?curid=93108) * [Odium to the Core](https://www.pcgamingwiki.com/wiki/?curid=93108)
* [Odyssee](https://www.pcgamingwiki.com/wiki/?curid=93353) * [Odyssee](https://www.pcgamingwiki.com/wiki/?curid=93353)
@ -22210,7 +22230,6 @@
* [Paparazzi Simulator](https://www.pcgamingwiki.com/wiki/?curid=154404) * [Paparazzi Simulator](https://www.pcgamingwiki.com/wiki/?curid=154404)
* [Paparazzi!: Tales of Tinseltown](https://www.pcgamingwiki.com/wiki/?curid=177406) * [Paparazzi!: Tales of Tinseltown](https://www.pcgamingwiki.com/wiki/?curid=177406)
* [Paper - A Game of Folding](https://www.pcgamingwiki.com/wiki/?curid=149093) * [Paper - A Game of Folding](https://www.pcgamingwiki.com/wiki/?curid=149093)
* [Paper Beast](https://www.pcgamingwiki.com/wiki/?curid=165279)
* [Paper Dungeons](https://www.pcgamingwiki.com/wiki/?curid=48170) * [Paper Dungeons](https://www.pcgamingwiki.com/wiki/?curid=48170)
* [Paper Dungeons Crawler](https://www.pcgamingwiki.com/wiki/?curid=91188) * [Paper Dungeons Crawler](https://www.pcgamingwiki.com/wiki/?curid=91188)
* [Paper Fire Rookie](https://www.pcgamingwiki.com/wiki/?curid=73302) * [Paper Fire Rookie](https://www.pcgamingwiki.com/wiki/?curid=73302)
@ -22249,7 +22268,6 @@
* [Paradise City VR](https://www.pcgamingwiki.com/wiki/?curid=124016) * [Paradise City VR](https://www.pcgamingwiki.com/wiki/?curid=124016)
* [Paradise Cleaning!](https://www.pcgamingwiki.com/wiki/?curid=146078) * [Paradise Cleaning!](https://www.pcgamingwiki.com/wiki/?curid=146078)
* [Paradise Cracked](https://www.pcgamingwiki.com/wiki/?curid=57943) * [Paradise Cracked](https://www.pcgamingwiki.com/wiki/?curid=57943)
* [Paradise Lost](https://www.pcgamingwiki.com/wiki/?curid=161803)
* [Paradise Lost (PolyAmorous)](https://www.pcgamingwiki.com/wiki/?curid=137402) * [Paradise Lost (PolyAmorous)](https://www.pcgamingwiki.com/wiki/?curid=137402)
* [Paradise Lost: FPS Cosmic Horror Game](https://www.pcgamingwiki.com/wiki/?curid=76601) * [Paradise Lost: FPS Cosmic Horror Game](https://www.pcgamingwiki.com/wiki/?curid=76601)
* [Paradox Escape Route](https://www.pcgamingwiki.com/wiki/?curid=148613) * [Paradox Escape Route](https://www.pcgamingwiki.com/wiki/?curid=148613)
@ -22273,7 +22291,6 @@
* [PARANOIHELL](https://www.pcgamingwiki.com/wiki/?curid=150723) * [PARANOIHELL](https://www.pcgamingwiki.com/wiki/?curid=150723)
* [Paranormal Detective: Escape from the 80's](https://www.pcgamingwiki.com/wiki/?curid=142066) * [Paranormal Detective: Escape from the 80's](https://www.pcgamingwiki.com/wiki/?curid=142066)
* [Paranormal Files: Hook Man's Legend](https://www.pcgamingwiki.com/wiki/?curid=149382) * [Paranormal Files: Hook Man's Legend](https://www.pcgamingwiki.com/wiki/?curid=149382)
* [Paranormal HK](https://www.pcgamingwiki.com/wiki/?curid=153800)
* [Paranormal Psychosis](https://www.pcgamingwiki.com/wiki/?curid=34527) * [Paranormal Psychosis](https://www.pcgamingwiki.com/wiki/?curid=34527)
* [Paranormal Pursuit: The Gifted One](https://www.pcgamingwiki.com/wiki/?curid=55289) * [Paranormal Pursuit: The Gifted One](https://www.pcgamingwiki.com/wiki/?curid=55289)
* [Paranormal Teens](https://www.pcgamingwiki.com/wiki/?curid=55690) * [Paranormal Teens](https://www.pcgamingwiki.com/wiki/?curid=55690)
@ -22769,6 +22786,7 @@
* [Pirates vs Corsairs: Davy Jones's Gold](https://www.pcgamingwiki.com/wiki/?curid=48455) * [Pirates vs Corsairs: Davy Jones's Gold](https://www.pcgamingwiki.com/wiki/?curid=48455)
* [Pirates, Vikings, and Knights II](https://www.pcgamingwiki.com/wiki/?curid=38173) * [Pirates, Vikings, and Knights II](https://www.pcgamingwiki.com/wiki/?curid=38173)
* [Pirouette](https://www.pcgamingwiki.com/wiki/?curid=141544) * [Pirouette](https://www.pcgamingwiki.com/wiki/?curid=141544)
* [Pistol Whip](https://www.pcgamingwiki.com/wiki/?curid=150391)
* [Pit Blocks 3D](https://www.pcgamingwiki.com/wiki/?curid=108856) * [Pit Blocks 3D](https://www.pcgamingwiki.com/wiki/?curid=108856)
* [Pit of Evil](https://www.pcgamingwiki.com/wiki/?curid=93847) * [Pit of Evil](https://www.pcgamingwiki.com/wiki/?curid=93847)
* [Pitch Perfect Ear Training](https://www.pcgamingwiki.com/wiki/?curid=99660) * [Pitch Perfect Ear Training](https://www.pcgamingwiki.com/wiki/?curid=99660)
@ -23433,7 +23451,6 @@
* [Princess Lili](https://www.pcgamingwiki.com/wiki/?curid=104765) * [Princess Lili](https://www.pcgamingwiki.com/wiki/?curid=104765)
* [Princess Maker](https://www.pcgamingwiki.com/wiki/?curid=175227) * [Princess Maker](https://www.pcgamingwiki.com/wiki/?curid=175227)
* [Princess Maker ~Faery Tales Come True~ (HD Remake)](https://www.pcgamingwiki.com/wiki/?curid=156108) * [Princess Maker ~Faery Tales Come True~ (HD Remake)](https://www.pcgamingwiki.com/wiki/?curid=156108)
* [Princess Maker 2](https://www.pcgamingwiki.com/wiki/?curid=175171)
* [Princess Maker 2 Refine](https://www.pcgamingwiki.com/wiki/?curid=50781) * [Princess Maker 2 Refine](https://www.pcgamingwiki.com/wiki/?curid=50781)
* [Princess Maker 3: Fairy Tales Come True](https://www.pcgamingwiki.com/wiki/?curid=64464) * [Princess Maker 3: Fairy Tales Come True](https://www.pcgamingwiki.com/wiki/?curid=64464)
* [Princess Maker 5](https://www.pcgamingwiki.com/wiki/?curid=92971) * [Princess Maker 5](https://www.pcgamingwiki.com/wiki/?curid=92971)
@ -25813,6 +25830,7 @@
* [Runes: The Forgotten Path](https://www.pcgamingwiki.com/wiki/?curid=62096) * [Runes: The Forgotten Path](https://www.pcgamingwiki.com/wiki/?curid=62096)
* [RuneSage](https://www.pcgamingwiki.com/wiki/?curid=52173) * [RuneSage](https://www.pcgamingwiki.com/wiki/?curid=52173)
* [RuneScape: Idle Adventures](https://www.pcgamingwiki.com/wiki/?curid=37050) * [RuneScape: Idle Adventures](https://www.pcgamingwiki.com/wiki/?curid=37050)
* [Runespell: Overture](https://www.pcgamingwiki.com/wiki/?curid=40946)
* [RuneTech](https://www.pcgamingwiki.com/wiki/?curid=94601) * [RuneTech](https://www.pcgamingwiki.com/wiki/?curid=94601)
* [Runewards: Strategy Card Game](https://www.pcgamingwiki.com/wiki/?curid=82316) * [Runewards: Strategy Card Game](https://www.pcgamingwiki.com/wiki/?curid=82316)
* [Runeyana](https://www.pcgamingwiki.com/wiki/?curid=51619) * [Runeyana](https://www.pcgamingwiki.com/wiki/?curid=51619)
@ -26024,6 +26042,8 @@
* [Salvation in Corruption](https://www.pcgamingwiki.com/wiki/?curid=75469) * [Salvation in Corruption](https://www.pcgamingwiki.com/wiki/?curid=75469)
* [Salvator](https://www.pcgamingwiki.com/wiki/?curid=82292) * [Salvator](https://www.pcgamingwiki.com/wiki/?curid=82292)
* [Sam & Dan: Floaty Flatmates](https://www.pcgamingwiki.com/wiki/?curid=123878) * [Sam & Dan: Floaty Flatmates](https://www.pcgamingwiki.com/wiki/?curid=123878)
* [Sam & Max Save the World](https://www.pcgamingwiki.com/wiki/?curid=10590)
* [Sam & Max: Beyond Time and Space](https://www.pcgamingwiki.com/wiki/?curid=10632)
* [Sam & Max: Beyond Time and Space (2021)](https://www.pcgamingwiki.com/wiki/?curid=173114) * [Sam & Max: Beyond Time and Space (2021)](https://www.pcgamingwiki.com/wiki/?curid=173114)
* [Sam & Max: This Time It's Virtual!](https://www.pcgamingwiki.com/wiki/?curid=165186) * [Sam & Max: This Time It's Virtual!](https://www.pcgamingwiki.com/wiki/?curid=165186)
* [Sam Glyph: Private Eye!](https://www.pcgamingwiki.com/wiki/?curid=49534) * [Sam Glyph: Private Eye!](https://www.pcgamingwiki.com/wiki/?curid=49534)
@ -27025,6 +27045,7 @@
* [SILENT DOOM](https://www.pcgamingwiki.com/wiki/?curid=128419) * [SILENT DOOM](https://www.pcgamingwiki.com/wiki/?curid=128419)
* [Silent Footsteps](https://www.pcgamingwiki.com/wiki/?curid=103003) * [Silent Footsteps](https://www.pcgamingwiki.com/wiki/?curid=103003)
* [Silent Gentleman](https://www.pcgamingwiki.com/wiki/?curid=89332) * [Silent Gentleman](https://www.pcgamingwiki.com/wiki/?curid=89332)
* [Silent Heroes: Elite Troops of WWII](https://www.pcgamingwiki.com/wiki/?curid=126542)
* [Silent Hunter 4: Wolves of the Pacific](https://www.pcgamingwiki.com/wiki/?curid=41362) * [Silent Hunter 4: Wolves of the Pacific](https://www.pcgamingwiki.com/wiki/?curid=41362)
* [Silent Hunter 5: Battle of the Atlantic](https://www.pcgamingwiki.com/wiki/?curid=41163) * [Silent Hunter 5: Battle of the Atlantic](https://www.pcgamingwiki.com/wiki/?curid=41163)
* [Silent Night](https://www.pcgamingwiki.com/wiki/?curid=113526) * [Silent Night](https://www.pcgamingwiki.com/wiki/?curid=113526)
@ -27254,6 +27275,8 @@
* [Sky Dodge](https://www.pcgamingwiki.com/wiki/?curid=93196) * [Sky Dodge](https://www.pcgamingwiki.com/wiki/?curid=93196)
* [Sky Fleet](https://www.pcgamingwiki.com/wiki/?curid=173698) * [Sky Fleet](https://www.pcgamingwiki.com/wiki/?curid=173698)
* [Sky Flight](https://www.pcgamingwiki.com/wiki/?curid=121323) * [Sky Flight](https://www.pcgamingwiki.com/wiki/?curid=121323)
* [Sky Force Anniversary](https://www.pcgamingwiki.com/wiki/?curid=37680)
* [Sky Gamblers: Storm Raiders](https://www.pcgamingwiki.com/wiki/?curid=49015)
* [Sky Haven](https://www.pcgamingwiki.com/wiki/?curid=81167) * [Sky Haven](https://www.pcgamingwiki.com/wiki/?curid=81167)
* [Sky Hawk](https://www.pcgamingwiki.com/wiki/?curid=90074) * [Sky Hawk](https://www.pcgamingwiki.com/wiki/?curid=90074)
* [Sky Hunter](https://www.pcgamingwiki.com/wiki/?curid=75095) * [Sky Hunter](https://www.pcgamingwiki.com/wiki/?curid=75095)
@ -27729,6 +27752,7 @@
* [Soldiers of Freedom](https://www.pcgamingwiki.com/wiki/?curid=68128) * [Soldiers of Freedom](https://www.pcgamingwiki.com/wiki/?curid=68128)
* [Soldiers of Heaven VR](https://www.pcgamingwiki.com/wiki/?curid=40124) * [Soldiers of Heaven VR](https://www.pcgamingwiki.com/wiki/?curid=40124)
* [Soldiers of the Universe](https://www.pcgamingwiki.com/wiki/?curid=63610) * [Soldiers of the Universe](https://www.pcgamingwiki.com/wiki/?curid=63610)
* [Soldiers: Heroes of World War II](https://www.pcgamingwiki.com/wiki/?curid=3707)
* [Sole](https://www.pcgamingwiki.com/wiki/?curid=69082) * [Sole](https://www.pcgamingwiki.com/wiki/?curid=69082)
* [Solenars Edge Heroes](https://www.pcgamingwiki.com/wiki/?curid=92931) * [Solenars Edge Heroes](https://www.pcgamingwiki.com/wiki/?curid=92931)
* [Solenars Edge Rebirth](https://www.pcgamingwiki.com/wiki/?curid=65730) * [Solenars Edge Rebirth](https://www.pcgamingwiki.com/wiki/?curid=65730)
@ -28431,7 +28455,6 @@
* [Split Bullet](https://www.pcgamingwiki.com/wiki/?curid=51863) * [Split Bullet](https://www.pcgamingwiki.com/wiki/?curid=51863)
* [Split or Steal](https://www.pcgamingwiki.com/wiki/?curid=150576) * [Split or Steal](https://www.pcgamingwiki.com/wiki/?curid=150576)
* [Split Signal](https://www.pcgamingwiki.com/wiki/?curid=157323) * [Split Signal](https://www.pcgamingwiki.com/wiki/?curid=157323)
* [Splitgate](https://www.pcgamingwiki.com/wiki/?curid=130533)
* [Splitmind](https://www.pcgamingwiki.com/wiki/?curid=55610) * [Splitmind](https://www.pcgamingwiki.com/wiki/?curid=55610)
* [Splitter Critters](https://www.pcgamingwiki.com/wiki/?curid=81749) * [Splitter Critters](https://www.pcgamingwiki.com/wiki/?curid=81749)
* [Splody](https://www.pcgamingwiki.com/wiki/?curid=40169) * [Splody](https://www.pcgamingwiki.com/wiki/?curid=40169)
@ -29931,7 +29954,6 @@
* [Synthesis Universe -Episode 00-](https://www.pcgamingwiki.com/wiki/?curid=150505) * [Synthesis Universe -Episode 00-](https://www.pcgamingwiki.com/wiki/?curid=150505)
* [Synthetic Dreams](https://www.pcgamingwiki.com/wiki/?curid=66444) * [Synthetic Dreams](https://www.pcgamingwiki.com/wiki/?curid=66444)
* [Synthetic Love](https://www.pcgamingwiki.com/wiki/?curid=146136) * [Synthetic Love](https://www.pcgamingwiki.com/wiki/?curid=146136)
* [Synthetik: Legion Rising](https://www.pcgamingwiki.com/wiki/?curid=81934)
* [Synthrally](https://www.pcgamingwiki.com/wiki/?curid=91224) * [Synthrally](https://www.pcgamingwiki.com/wiki/?curid=91224)
* [Synthrun](https://www.pcgamingwiki.com/wiki/?curid=127359) * [Synthrun](https://www.pcgamingwiki.com/wiki/?curid=127359)
* [Synthwave Dream '85](https://www.pcgamingwiki.com/wiki/?curid=107712) * [Synthwave Dream '85](https://www.pcgamingwiki.com/wiki/?curid=107712)
@ -30654,6 +30676,7 @@
* [The Basilisk](https://www.pcgamingwiki.com/wiki/?curid=100294) * [The Basilisk](https://www.pcgamingwiki.com/wiki/?curid=100294)
* [The Battle for Sector 219](https://www.pcgamingwiki.com/wiki/?curid=42740) * [The Battle for Sector 219](https://www.pcgamingwiki.com/wiki/?curid=42740)
* [The Battle for the Hut](https://www.pcgamingwiki.com/wiki/?curid=92726) * [The Battle for the Hut](https://www.pcgamingwiki.com/wiki/?curid=92726)
* [The Battle for Wesnoth](https://www.pcgamingwiki.com/wiki/?curid=17699)
* [The Battle Of Ages](https://www.pcgamingwiki.com/wiki/?curid=109208) * [The Battle Of Ages](https://www.pcgamingwiki.com/wiki/?curid=109208)
* [The Battle Of Bellum](https://www.pcgamingwiki.com/wiki/?curid=112348) * [The Battle Of Bellum](https://www.pcgamingwiki.com/wiki/?curid=112348)
* [The Battle of Mahjong](https://www.pcgamingwiki.com/wiki/?curid=71851) * [The Battle of Mahjong](https://www.pcgamingwiki.com/wiki/?curid=71851)
@ -31365,6 +31388,7 @@
* [The Journey to Fairytales](https://www.pcgamingwiki.com/wiki/?curid=98652) * [The Journey to Fairytales](https://www.pcgamingwiki.com/wiki/?curid=98652)
* [The Journey: Bob's Story](https://www.pcgamingwiki.com/wiki/?curid=39370) * [The Journey: Bob's Story](https://www.pcgamingwiki.com/wiki/?curid=39370)
* [The Journeyman Project](https://www.pcgamingwiki.com/wiki/?curid=19860) * [The Journeyman Project](https://www.pcgamingwiki.com/wiki/?curid=19860)
* [The Journeyman Project 2: Buried in Time](https://www.pcgamingwiki.com/wiki/?curid=131674)
* [The jungle](https://www.pcgamingwiki.com/wiki/?curid=70601) * [The jungle](https://www.pcgamingwiki.com/wiki/?curid=70601)
* [The Jungle Book](https://www.pcgamingwiki.com/wiki/?curid=79093) * [The Jungle Book](https://www.pcgamingwiki.com/wiki/?curid=79093)
* [The Jungle Book: Groove Party](https://www.pcgamingwiki.com/wiki/?curid=172557) * [The Jungle Book: Groove Party](https://www.pcgamingwiki.com/wiki/?curid=172557)
@ -32357,6 +32381,7 @@
* [Theme Park Simulator](https://www.pcgamingwiki.com/wiki/?curid=157013) * [Theme Park Simulator](https://www.pcgamingwiki.com/wiki/?curid=157013)
* [Theme Park Studio](https://www.pcgamingwiki.com/wiki/?curid=50614) * [Theme Park Studio](https://www.pcgamingwiki.com/wiki/?curid=50614)
* [Theme Park Worker](https://www.pcgamingwiki.com/wiki/?curid=127775) * [Theme Park Worker](https://www.pcgamingwiki.com/wiki/?curid=127775)
* [Theme Park World](https://www.pcgamingwiki.com/wiki/?curid=322)
* [TheMemory](https://www.pcgamingwiki.com/wiki/?curid=114682) * [TheMemory](https://www.pcgamingwiki.com/wiki/?curid=114682)
* [TheMovingMaze](https://www.pcgamingwiki.com/wiki/?curid=143811) * [TheMovingMaze](https://www.pcgamingwiki.com/wiki/?curid=143811)
* [TheNightfall](https://www.pcgamingwiki.com/wiki/?curid=78631) * [TheNightfall](https://www.pcgamingwiki.com/wiki/?curid=78631)
@ -33449,6 +33474,7 @@
* [Tropical Fish Shop 2](https://www.pcgamingwiki.com/wiki/?curid=44215) * [Tropical Fish Shop 2](https://www.pcgamingwiki.com/wiki/?curid=44215)
* [Tropical Fish Shop: Annabel's Adventure](https://www.pcgamingwiki.com/wiki/?curid=174090) * [Tropical Fish Shop: Annabel's Adventure](https://www.pcgamingwiki.com/wiki/?curid=174090)
* [Tropical Girls VR](https://www.pcgamingwiki.com/wiki/?curid=51135) * [Tropical Girls VR](https://www.pcgamingwiki.com/wiki/?curid=51135)
* [Tropical Liquor](https://www.pcgamingwiki.com/wiki/?curid=87369)
* [Tross](https://www.pcgamingwiki.com/wiki/?curid=44447) * [Tross](https://www.pcgamingwiki.com/wiki/?curid=44447)
* [Trouble In The Manor](https://www.pcgamingwiki.com/wiki/?curid=45607) * [Trouble In The Manor](https://www.pcgamingwiki.com/wiki/?curid=45607)
* [Trouble Travel TT](https://www.pcgamingwiki.com/wiki/?curid=127673) * [Trouble Travel TT](https://www.pcgamingwiki.com/wiki/?curid=127673)
@ -33784,6 +33810,7 @@
* [Ultreïa](https://www.pcgamingwiki.com/wiki/?curid=174102) * [Ultreïa](https://www.pcgamingwiki.com/wiki/?curid=174102)
* [Ulxrd](https://www.pcgamingwiki.com/wiki/?curid=102287) * [Ulxrd](https://www.pcgamingwiki.com/wiki/?curid=102287)
* [Ulysses and the Golden Fleece](https://www.pcgamingwiki.com/wiki/?curid=147157) * [Ulysses and the Golden Fleece](https://www.pcgamingwiki.com/wiki/?curid=147157)
* [Uma Musume Pretty Derby](https://www.pcgamingwiki.com/wiki/?curid=167870)
* [UMA-War VR](https://www.pcgamingwiki.com/wiki/?curid=56050) * [UMA-War VR](https://www.pcgamingwiki.com/wiki/?curid=56050)
* [Umbra: Shadow of Death](https://www.pcgamingwiki.com/wiki/?curid=45204) * [Umbra: Shadow of Death](https://www.pcgamingwiki.com/wiki/?curid=45204)
* [Umbraseal](https://www.pcgamingwiki.com/wiki/?curid=140771) * [Umbraseal](https://www.pcgamingwiki.com/wiki/?curid=140771)
@ -35250,6 +35277,7 @@
* [WEJAM](https://www.pcgamingwiki.com/wiki/?curid=138977) * [WEJAM](https://www.pcgamingwiki.com/wiki/?curid=138977)
* [WELCOME](https://www.pcgamingwiki.com/wiki/?curid=145254) * [WELCOME](https://www.pcgamingwiki.com/wiki/?curid=145254)
* [Welcome Above](https://www.pcgamingwiki.com/wiki/?curid=122458) * [Welcome Above](https://www.pcgamingwiki.com/wiki/?curid=122458)
* [Welcome Back Daddy](https://www.pcgamingwiki.com/wiki/?curid=93156)
* [Welcome Back to 2007](https://www.pcgamingwiki.com/wiki/?curid=78798) * [Welcome Back to 2007](https://www.pcgamingwiki.com/wiki/?curid=78798)
* [Welcome Back to 2007 2](https://www.pcgamingwiki.com/wiki/?curid=109024) * [Welcome Back to 2007 2](https://www.pcgamingwiki.com/wiki/?curid=109024)
* [Welcome Home, Love](https://www.pcgamingwiki.com/wiki/?curid=59464) * [Welcome Home, Love](https://www.pcgamingwiki.com/wiki/?curid=59464)
@ -36611,6 +36639,8 @@
* [Zzzzz](https://www.pcgamingwiki.com/wiki/?curid=149069) * [Zzzzz](https://www.pcgamingwiki.com/wiki/?curid=149069)
* [Бухой Батя / Drunk Dad](https://www.pcgamingwiki.com/wiki/?curid=121753) * [Бухой Батя / Drunk Dad](https://www.pcgamingwiki.com/wiki/?curid=121753)
* [В поисках Атлантиды](https://www.pcgamingwiki.com/wiki/?curid=121077) * [В поисках Атлантиды](https://www.pcgamingwiki.com/wiki/?curid=121077)
* [В тылу врага: Диверсанты 2](https://www.pcgamingwiki.com/wiki/?curid=147346)
* [В тылу врага: Диверсанты 3](https://www.pcgamingwiki.com/wiki/?curid=147347)
* [ВЗЛОМ ЖОПЫ](https://www.pcgamingwiki.com/wiki/?curid=156519) * [ВЗЛОМ ЖОПЫ](https://www.pcgamingwiki.com/wiki/?curid=156519)
* [Воин Хинора](https://www.pcgamingwiki.com/wiki/?curid=129623) * [Воин Хинора](https://www.pcgamingwiki.com/wiki/?curid=129623)
* [ДОКА 2! - КРОВЬ, КИШКИ, ГОЛЫЕ СИСЬКИ](https://www.pcgamingwiki.com/wiki/?curid=125181) * [ДОКА 2! - КРОВЬ, КИШКИ, ГОЛЫЕ СИСЬКИ](https://www.pcgamingwiki.com/wiki/?curid=125181)

File diff suppressed because it is too large Load diff

View file

@ -5,9 +5,9 @@
"author": "Matthew T. Kennerly <mtkennerly@gmail.com>", "author": "Matthew T. Kennerly <mtkennerly@gmail.com>",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"cache": "ts-node ./src/bin.ts --cache", "wiki": "ts-node ./src/bin.ts --wiki",
"manifest": "ts-node ./src/bin.ts --manifest", "manifest": "ts-node ./src/bin.ts --manifest",
"recent": "ts-node ./src/bin.ts --limit 0 --cache --manifest --recent", "recent": "ts-node ./src/bin.ts --limit 0 --wiki --manifest --recent",
"schema": "npm run schema:normal && npm run schema:strict", "schema": "npm run schema:normal && npm run schema:strict",
"schema:normal": "ajv validate -s ./data/schema.yaml -d ./data/manifest.yaml", "schema:normal": "ajv validate -s ./data/schema.yaml -d ./data/manifest.yaml",
"schema:strict": "ajv validate -s ./data/schema.strict.yaml -d ./data/manifest.yaml", "schema:strict": "ajv validate -s ./data/schema.strict.yaml -d ./data/manifest.yaml",

View file

@ -1,4 +1,4 @@
import * as minimist from "minimist"; import minimist from "minimist";
import { DEFAULT_GAME_LIMIT } from "."; import { DEFAULT_GAME_LIMIT } from ".";
import { ManifestFile } from "./manifest"; import { ManifestFile } from "./manifest";
@ -7,20 +7,11 @@ import { WikiGameCacheFile, WikiMetaCacheFile } from "./wiki";
import { saveMissingGames } from "./missing"; import { saveMissingGames } from "./missing";
interface Cli { interface Cli {
cache?: boolean, wiki?: boolean,
manifest?: boolean, manifest?: boolean,
stats?: boolean, stats?: boolean,
all?: boolean, all?: boolean,
existing?: boolean,
missing?: boolean,
unchecked?: boolean,
unsupportedOs?: boolean,
unsupportedPath?: boolean,
irregularPath?: boolean,
irregularPathUntagged?: boolean, irregularPathUntagged?: boolean,
tooBroad?: boolean,
tooBroadUntagged?: boolean,
pathContains?: string,
skipUntil?: string, skipUntil?: string,
recent?: boolean, recent?: boolean,
limit?: number, limit?: number,
@ -30,21 +21,12 @@ interface Cli {
async function main() { async function main() {
const args = minimist<Cli>(process.argv.slice(2), { const args = minimist<Cli>(process.argv.slice(2), {
boolean: [ boolean: [
"cache", "wiki",
"manifest", "manifest",
"stats", "stats",
"all", "all",
"existing",
"missing",
"unchecked",
"unsupportedOs",
"unsupportedPath",
"irregularPath",
"irregularPathUntagged", "irregularPathUntagged",
"tooBroad",
"tooBroadUntagged",
"steam", "steam",
"local",
], ],
string: [ string: [
"skipUntil", "skipUntil",
@ -69,16 +51,18 @@ async function main() {
} }
try { try {
if (args.cache) { if (args.wiki) {
if (args.recent) { if (args.recent) {
await wikiCache.flagRecentChanges(wikiMetaCache); await wikiCache.flagRecentChanges(wikiMetaCache);
} else { } else {
await wikiCache.addNewGames(); await wikiCache.addNewGames();
await wikiCache.refresh(
args.skipUntil,
args.limit ?? DEFAULT_GAME_LIMIT,
);
} }
await wikiCache.refresh(
args.skipUntil,
args.limit ?? DEFAULT_GAME_LIMIT,
args.all ?? false,
);
} }
if (args.steam) { if (args.steam) {
@ -92,25 +76,8 @@ async function main() {
if (args.manifest) { if (args.manifest) {
await manifest.updateGames( await manifest.updateGames(
wikiCache.data, wikiCache.data,
{ args._,
all: args.all ?? false,
existing: args.existing ?? false,
missing: args.missing ?? false,
unchecked: args.unchecked ?? false,
unsupportedOs: args.unsupportedOs ?? false,
unsupportedPath: args.unsupportedPath ?? false,
tooBroad: args.tooBroad ?? false,
tooBroadUntagged: args.tooBroadUntagged ?? false,
irregularPath: args.irregularPath ?? false,
irregularPathUntagged: args.irregularPathUntagged ?? false,
pathContains: args.pathContains,
skipUntil: args.skipUntil,
games: args._,
recent: args.recent,
},
args.limit ?? DEFAULT_GAME_LIMIT,
steamCache, steamCache,
args.local,
); );
} }

View file

@ -1,6 +1,6 @@
import { DELAY_BETWEEN_GAMES_MS, REPO, YamlFile } from "."; import { REPO, YamlFile } from ".";
import { SteamGameCache, SteamGameCacheFile } from "./steam"; import { SteamGameCache, SteamGameCacheFile } from "./steam";
import { WikiGameCache, getGame, pathIsTooBroad } from "./wiki"; import { WikiGameCache, parseTemplates } from "./wiki";
export type Os = "dos" | "linux" | "mac" | "windows"; export type Os = "dos" | "linux" | "mac" | "windows";
@ -73,7 +73,16 @@ function doLaunchPathsMatch(fromSteam: string | undefined, fromManifest: string
} }
} }
function integrateSteamData(game: Game, appInfo: SteamGameCache[""]) { function integrateWikiData(game: Game, cache: WikiGameCache[""]): void {
if (cache.steam !== undefined) {
game.steam = { id: cache.steam };
}
const info = parseTemplates(cache.templates ?? []);
game.files = info.files;
game.registry = info.registry;
}
function integrateSteamData(game: Game, appInfo: SteamGameCache[""]): void {
if (appInfo.installDir !== undefined) { if (appInfo.installDir !== undefined) {
game.installDir = { [appInfo.installDir]: {} }; game.installDir = { [appInfo.installDir]: {} };
} }
@ -158,137 +167,33 @@ function integrateSteamData(game: Game, appInfo: SteamGameCache[""]) {
} }
} }
function isPathRegular(path: string): boolean {
const irregular = ["{{", "</", "/>", "<br>", "//"];
return !irregular.some(x => path.includes(x))
}
export class ManifestFile extends YamlFile<Manifest> { export class ManifestFile extends YamlFile<Manifest> {
path = `${REPO}/data/manifest.yaml`; path = `${REPO}/data/manifest.yaml`;
defaultData = {}; defaultData = {};
async updateGames( async updateGames(
wikiCache: WikiGameCache, wikiCache: WikiGameCache,
filter: { games: Array<string> | undefined,
all: boolean,
existing: boolean,
missing: boolean,
unchecked: boolean,
unsupportedOs: boolean,
unsupportedPath: boolean,
irregularPath: boolean,
irregularPathUntagged: boolean,
tooBroad: boolean,
tooBroadUntagged: boolean,
pathContains: string | undefined,
skipUntil: string | undefined,
games: Array<string> | undefined,
recent: boolean | undefined,
},
limit: number | undefined,
steamCache: SteamGameCacheFile, steamCache: SteamGameCacheFile,
local: boolean,
): Promise<void> { ): Promise<void> {
let i = 0; this.data = {};
let foundSkipUntil = false;
for (const [title, info] of Object.entries(wikiCache).sort()) {
if (filter.skipUntil && !foundSkipUntil) {
if (title === filter.skipUntil) {
foundSkipUntil = true;
} else {
continue;
}
}
let check = false; for (const [title, info] of Object.entries(wikiCache).sort()) {
if (filter.pathContains && Object.keys(this.data[title]?.files ?? {}).some(x => x.includes(filter.pathContains))) { if (games !== undefined && games?.length > 0 && !games.includes(title)) {
check = true;
}
if (filter.all) {
check = true;
}
if (filter.existing && this.data.hasOwnProperty(title)) {
check = true;
}
if (filter.missing && !this.data.hasOwnProperty(title)) {
check = true;
}
if (filter.unchecked && wikiCache[title].revId === null) {
check = true;
}
if (filter.unsupportedOs && info.unsupportedOs) {
check = true;
}
if (filter.unsupportedPath && info.unsupportedPath) {
check = true;
}
if (filter.irregularPath && wikiCache[title].irregularPath) {
check = true;
}
if (
filter.irregularPathUntagged &&
!wikiCache[title].irregularPath &&
(
Object.keys(this.data[title]?.files ?? []).some(x => !isPathRegular(x)) ||
Object.keys(this.data[title]?.registry ?? []).some(x => !isPathRegular(x))
)
) {
check = true;
}
if (filter.games && filter.games.includes(title)) {
check = true;
}
if (filter.tooBroad && info.tooBroad) {
check = true;
}
if (filter.tooBroadUntagged && !info.tooBroad && Object.keys(this.data[title]?.files ?? []).some(x => pathIsTooBroad(x))) {
check = true;
}
if (filter.recent && wikiCache[title].recentlyChanged) {
check = true;
}
if (!check) {
continue; continue;
} }
if (info.renamedFrom) { const game: Game = {};
for (const oldName of info.renamedFrom) { integrateWikiData(game, info);
delete this.data[oldName];
}
}
let verifiedTitle: string;
let game: Game;
if (local) {
[verifiedTitle, game] = [title, this.data[title] ?? {}];
} else {
[verifiedTitle, game] = await getGame(title, wikiCache);
}
delete wikiCache[verifiedTitle].recentlyChanged;
if (verifiedTitle !== title) {
delete this.data[title];
}
if (game.files === undefined && game.registry === undefined && game.steam?.id === undefined) { if (game.files === undefined && game.registry === undefined && game.steam?.id === undefined) {
delete this.data[verifiedTitle];
continue; continue;
} }
if (game.steam?.id !== undefined) { if (game.steam?.id !== undefined) {
const appInfo = await steamCache.getAppInfo(game.steam.id); const appInfo = await steamCache.getAppInfo(game.steam.id);
integrateSteamData(game, appInfo); integrateSteamData(game, appInfo);
} }
this.data[verifiedTitle] = game; this.data[title] = game;
if (!local) {
await new Promise(resolve => setTimeout(resolve, DELAY_BETWEEN_GAMES_MS));
}
i++;
if (limit > 0 && i > limit) {
break;
}
} }
} }
} }

View file

@ -1,30 +1,41 @@
import { DELAY_BETWEEN_GAMES_MS, REPO, PathType, UnsupportedOsError, UnsupportedPathError, YamlFile } from "."; import { DELAY_BETWEEN_GAMES_MS, REPO, PathType, UnsupportedOsError, UnsupportedPathError, YamlFile } from ".";
import { Constraint, Game, Store, Tag, Os } from "./manifest"; import { Constraint, Game, Store, Tag, Os } from "./manifest";
import * as moment from "moment"; import moment from "moment";
import * as NodeMw from "nodemw"; import * as NodeMw from "nodemw";
import * as Wikiapi from "wikiapi"; import * as Wikiapi from "wikiapi";
import { parse as parseWiki } from 'wikiparse'; import { parse as parseWiki } from 'wikiparse';
type Template = { interface Template {
type: "template", type: "template",
name: string, name: string,
parameters: {}, parameters: {},
positionalParameters: Array<Template | string>, positionalParameters: Array<Array<WikiNode>>,
};
type WikiNode = string | Template | {
type: "code" | "pre",
content: Array<WikiNode>,
attributes: { [key: string]: string },
} | {
type: "comment",
content: Array<WikiNode>,
} | {
type: "link",
to: string,
content: Array<WikiNode>,
} | {
type: "tag",
content: Array<WikiNode>,
attributes: { [key: string]: string },
name: string,
}; };
export type WikiGameCache = { export type WikiGameCache = {
[title: string]: { [title: string]: {
pageId: number, pageId: number,
revId: number | null, revId: number | null,
/** Whether an entry on the page failed because of an unsupported OS. */
unsupportedOs?: boolean,
/** Whether an entry on the page failed because of an unsupported Path template argument. */
unsupportedPath?: boolean,
/** Whether an entry has a path that is too broad (e.g., the entirety of %WINDIR%). */
tooBroad?: boolean,
recentlyChanged?: boolean, recentlyChanged?: boolean,
renamedFrom?: Array<string>, renamedFrom?: Array<string>,
irregularPath?: boolean,
templates?: Array<string>, templates?: Array<string>,
steam?: number, steam?: number,
}; };
@ -67,7 +78,7 @@ export class WikiGameCacheFile extends YamlFile<WikiGameCache> {
}; };
} }
async refresh(skipUntil: string | undefined, limit: number): Promise<void> { async refresh(skipUntil: string | undefined, limit: number, all: boolean | undefined): Promise<void> {
let i = 0; let i = 0;
let foundSkipUntil = false; let foundSkipUntil = false;
const client = makeApiClient(); const client = makeApiClient();
@ -79,6 +90,9 @@ export class WikiGameCacheFile extends YamlFile<WikiGameCache> {
continue; continue;
} }
} }
if (!all && (this.data[pageTitle].revId !== null || !this.data[pageTitle].recentlyChanged)) {
continue;
}
// console.log(`Refreshing wiki page ${pageTitle}`); // console.log(`Refreshing wiki page ${pageTitle}`);
await getGame(pageTitle, this.data, client); await getGame(pageTitle, this.data, client);
@ -274,82 +288,6 @@ function makePathArgRegex(arg: string): RegExp {
return new RegExp(escaped, "gi"); return new RegExp(escaped, "gi");
} }
interface PathCell {
[index: number]: string | PathCell;
type: "comment" | "transclusion" | "page_title" | "plain" | "tag";
parameters: { [key: string]: any }; // keys are numbers as strings
tag?: string, // when type=tag
toString(): string;
}
function stringifyTransclusionCell(cell: PathCell): [string, boolean] {
const templateName = cell[0] as string;
switch (templateName.toLowerCase()) {
case "p":
case "path":
return [`{{${templateName}|${cell[1]}}}`, true];
case "code":
case "file":
return ["*", false];
case "localizedpath":
return [cell[1] as string, false];
default:
return ["", false];
}
}
function stringifyTagCell(cell: PathCell): [string, boolean] {
if (cell.tag === undefined) {
return ["", false];
}
switch (cell.tag.toLowerCase()) {
case "code":
return ["*", false];
default:
return ["", false];
}
}
function getRawPathFromCell(cell: string | PathCell): [string, boolean] {
let composite = "";
let regular = true;
if (typeof cell === "string") {
if (/<br\s*\/?>/.test(cell)) {
regular = false;
}
composite += cell;
} else if (cell.type === "transclusion") {
const [stringified, segmentRegular] = stringifyTransclusionCell(cell);
if (!segmentRegular) {
regular = false;
}
composite += stringified;
} else if (cell.type === "tag") {
const [stringified, segmentRegular] = stringifyTagCell(cell);
if (!segmentRegular) {
regular = false;
}
composite += stringified;
} else if (cell.type === "plain") {
for (let i = 0; i < 50; i++) {
const segment = cell[i];
if (segment === undefined) {
break;
}
const [stringified, segmentRegular] = getRawPathFromCell(segment);
if (!segmentRegular) {
regular = false;
}
composite += stringified;
}
} else if (cell.type !== "comment" && cell.type !== "page_title") {
regular = false;
}
return [composite.trim(), regular];
}
/** /**
* https://www.pcgamingwiki.com/wiki/Template:Path * https://www.pcgamingwiki.com/wiki/Template:Path
*/ */
@ -468,7 +406,9 @@ function getConstraintFromSystem(system: string, path: string): Constraint {
} else if (system.match(/origin/i)) { } else if (system.match(/origin/i)) {
constraint.store = "origin"; constraint.store = "origin";
} else { } else {
constraint.os = parseOs(system); try {
constraint.os = parseOs(system);
} catch {}
} }
const storeFromPath = getStoreConstraintFromPath(path); const storeFromPath = getStoreConstraintFromPath(path);
@ -480,10 +420,10 @@ function getConstraintFromSystem(system: string, path: string): Constraint {
} }
function getTagFromTemplate(template: string): Tag | undefined { function getTagFromTemplate(template: string): Tag | undefined {
switch (template) { switch (template.toLowerCase()) {
case "Game data/saves": case "game data/saves":
return "save"; return "save";
case "Game data/config": case "game data/config":
return "config"; return "config";
default: default:
return undefined; return undefined;
@ -491,6 +431,7 @@ function getTagFromTemplate(template: string): Tag | undefined {
} }
function parseOs(os: string): Os { function parseOs(os: string): Os {
// Others seen: "Mac OS", "PC booter", "Amazon Games", "Ubisoft Connect"
switch (os) { switch (os) {
case "Windows": case "Windows":
return "windows"; return "windows";
@ -626,19 +567,16 @@ export async function getGame(pageTitle: string, cache: WikiGameCache, client: W
files: {}, files: {},
registry: {}, registry: {},
}; };
let unsupportedOs = 0;
let unsupportedPath = 0;
let tooBroad = 0;
let irregularPath = 0;
delete cache[pageTitle].templates; delete cache[pageTitle].templates;
page.parse().each("template", template => { page.parse().each("template", template => {
if (template.name === "Infobox game") { const templateName = template.name.toLowerCase();
if (templateName === "Infobox game") {
const steamId = Number(template.parameters["steam appid"]); const steamId = Number(template.parameters["steam appid"]);
if (!isNaN(steamId) && steamId > 0) { if (!isNaN(steamId) && steamId > 0) {
game.steam = { id: steamId }; game.steam = { id: steamId };
cache[pageTitle].steam = steamId; cache[pageTitle].steam = steamId;
} }
} else if (template.name === "Game data/saves" || template.name === "Game data/config") { } else if (templateName === "game data/saves" || templateName === "game data/config") {
const reparsed = parseWiki(template.toString()); const reparsed = parseWiki(template.toString());
if (reparsed[0].positionalParameters[1]?.length > 0 ?? false) { if (reparsed[0].positionalParameters[1]?.length > 0 ?? false) {
if (cache[pageTitle].templates === undefined) { if (cache[pageTitle].templates === undefined) {
@ -646,93 +584,131 @@ export async function getGame(pageTitle: string, cache: WikiGameCache, client: W
} }
cache[pageTitle].templates.push(template.toString()); cache[pageTitle].templates.push(template.toString());
} }
}
});
// console.log("\n\n\n\n\n\n--------------------------------------------------------------------------") cache[pageTitle].revId = page.revisions?.[0]?.revid ?? 0;
// console.log(template); delete cache[pageTitle].recentlyChanged;
for (const cellKey of Object.getOwnPropertyNames(template.parameters)) { return [pageTitle, game];
if (cellKey === "0" || cellKey === "1") { }
continue;
function flattenParameter(nodes: Array<WikiNode>): [string, boolean] {
let composite = "";
let regular = true;
for (const node of nodes) {
if (typeof node === "string") {
composite += node;
} else switch (node.type) {
case "code":
case "pre":
composite += "*";
break;
case "template":
switch (node.name.toLowerCase()) {
case "p":
case "path":
const [flatP, regularP] = flattenParameter(node.positionalParameters[0]);
if (!regularP) {
regular = false;
}
composite += `{{${node.name}|${flatP}}}`;
break;
case "code":
case "file":
composite += "*";
break;
case "localizedpath":
const [flatC, regularC] = flattenParameter(node.positionalParameters[0]);
if (!regularC) {
regular = false;
}
composite += flatC;
break;
default:
break;
} }
const cell = template.parameters[cellKey]; break;
// console.log("======================================") case "comment":
// console.log(cell) break;
const [rawPath, regular] = getRawPathFromCell(cell); default:
// console.log("-----------------"); regular = false;
// console.log(`${regular} : ${rawPath}`); break;
}
}
if (!regular) { return [composite.trim(), regular];
irregularPath += 1; }
export function parseTemplates(templates: Array<string>): Pick<Game, "files" | "registry"> {
const game: Pick<Game, "files" | "registry"> = { files: {}, registry: {} };
for (const template of templates.flatMap(parseWiki) as Array<Template>) {
if (template.type !== "template") {
console.log(`WARNING: unknown template type '${template.type}' from: '${JSON.stringify(template)}'`);
continue;
}
if (template.positionalParameters.length < 2) {
continue;
}
const [system, _] = flattenParameter(template.positionalParameters[0]);
for (const [rawPath, regular] of template.positionalParameters.slice(1).map(flattenParameter)) {
if (rawPath.length === 0 || !regular) {
// console.log(`IRREGULAR: ${rawPath}`);
continue;
}
const [path, pathType] = parsePath(rawPath);
if (pathIsTooBroad(path)) {
continue;
}
if (pathType === PathType.FileSystem) {
const constraint = getConstraintFromSystem(system, rawPath);
if (!game.files.hasOwnProperty(path)) {
game.files[path] = {
when: [],
tags: [],
};
} }
if (rawPath.length === 0) { if (!game.files[path].when.some(x => x.os === constraint.os && x.store === constraint.store)) {
continue; if (constraint.os !== undefined && constraint.store !== undefined) {
game.files[path].when.push(constraint);
} else if (constraint.os !== undefined) {
game.files[path].when.push({ os: constraint.os });
} else if (constraint.store !== undefined) {
game.files[path].when.push({ store: constraint.store });
}
} }
try { const tag = getTagFromTemplate(template.name);
const [path, pathType] = parsePath(rawPath); if (tag !== undefined && !game.files[path].tags.includes(tag)) {
if (pathIsTooBroad(path)) { game.files[path].tags.push(tag);
tooBroad += 1; }
continue; } else if (pathType === PathType.Registry) {
} if (!game.registry.hasOwnProperty(path)) {
if (pathType === PathType.FileSystem) { game.registry[path] = {
const constraint = getConstraintFromSystem(template.parameters[1], rawPath); when: [],
tags: [],
};
}
if (!game.files.hasOwnProperty(path)) { const store = getStoreConstraintFromPath(rawPath);
game.files[path] = { if (store !== undefined && !game.registry[path].when.some(x => x.store === store)) {
when: [], game.registry[path].when.push({ store });
tags: [], }
};
}
if (!game.files[path].when.some(x => x.os === constraint.os && x.store === constraint.store)) { const tag = getTagFromTemplate(template.name);
if (constraint.os !== undefined && constraint.store !== undefined) { if (tag !== undefined && !game.registry[path].tags.includes(tag)) {
game.files[path].when.push(constraint); game.registry[path].tags.push(tag);
} else if (constraint.os !== undefined) {
game.files[path].when.push({ os: constraint.os });
} else if (constraint.store !== undefined) {
game.files[path].when.push({ store: constraint.store });
}
}
const tag = getTagFromTemplate(template.name);
if (tag !== undefined && !game.files[path].tags.includes(tag)) {
game.files[path].tags.push(tag);
}
} else if (pathType === PathType.Registry) {
if (!game.registry.hasOwnProperty(path)) {
game.registry[path] = {
when: [],
tags: [],
};
}
const store = getStoreConstraintFromPath(rawPath);
if (store !== undefined && !game.registry[path].when.some(x => x.store === store)) {
game.registry[path].when.push({ store });
}
const tag = getTagFromTemplate(template.name);
if (tag !== undefined && !game.registry[path].tags.includes(tag)) {
game.registry[path].tags.push(tag);
}
}
} catch (e) {
console.log(` ${template.toString()}`);
console.log(` ${e}`);
if (e instanceof UnsupportedOsError) {
unsupportedOs += 1;
continue;
} else if (e instanceof UnsupportedPathError) {
unsupportedPath += 1;
continue;
} else {
continue;
}
} }
} }
} }
}); }
if (Object.keys(game.files).length === 0) { if (Object.keys(game.files).length === 0) {
delete game.files; delete game.files;
@ -760,30 +736,5 @@ export async function getGame(pageTitle: string, cache: WikiGameCache, client: W
} }
} }
if (unsupportedOs > 0) { return game;
cache[pageTitle].unsupportedOs = true;
} else {
delete cache[pageTitle].unsupportedOs;
}
if (unsupportedPath > 0) {
cache[pageTitle].unsupportedPath = true;
} else {
delete cache[pageTitle].unsupportedPath;
}
if (tooBroad > 0) {
cache[pageTitle].tooBroad = true;
} else {
delete cache[pageTitle].tooBroad;
}
if (irregularPath > 0) {
cache[pageTitle].irregularPath = true;
} else {
delete cache[pageTitle].irregularPath;
}
cache[pageTitle].revId = page.revisions?.[0]?.revid ?? 0;
return [pageTitle, game];
} }

16
tsconfig.json Normal file
View file

@ -0,0 +1,16 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"lib": [
"es2019"
],
"esModuleInterop": true
},
"include": [
"src/*.ts"
],
"exclude": [
"node_modules"
]
}