Merge pull request #23 from httpspedroh/master
Update - Gabaritos & organização geral
This commit is contained in:
commit
8c115d5f4c
20
README.md
20
README.md
|
|
@ -1,16 +1,18 @@
|
|||
# AEDII
|
||||
# 💻 AEDS II
|
||||
Repositório de códigos da disciplina de Algoritmos e Estrutura de Dados II
|
||||
|
||||
## Ajuda
|
||||
## ❓ Ajuda
|
||||
[Guia com os principais comandos](fonte/ajuda/README.md)
|
||||
|
||||
[Readme.md com os principais comandos.](fonte/ajuda/README.md)
|
||||
|
||||
## fonte
|
||||
|
||||
## labs
|
||||
Ativdades dos laboratórios.
|
||||
## 📁 Fonte
|
||||
[Pasta com as bibliotecas usadas na disciplina](fonte/ajuda/java)
|
||||
|
||||
|
||||
## tps
|
||||
## ⚙️ Labs
|
||||
[Pasta com os exercícios de treinamento do laboratório](labs)
|
||||
|
||||
|
||||
## 🔥 TPS
|
||||
[Pasta com os trabalhos práticos do laboratório](tps)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
* @file Game.java
|
||||
* @author Pedro Lopes
|
||||
* @version 0.2
|
||||
* @date 2022-10-02
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
|
||||
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
|
||||
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
|
||||
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
|
||||
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
|
||||
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
|
||||
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
|
||||
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
|
||||
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
|
||||
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
|
||||
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
|
||||
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
|
||||
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
|
||||
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
|
||||
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
|
||||
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
|
||||
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
|
||||
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
|
||||
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
|
||||
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
|
||||
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
|
||||
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
|
||||
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
|
||||
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
|
||||
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
|
||||
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
|
||||
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
|
||||
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
|
||||
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
|
||||
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
|
||||
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
|
||||
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
|
||||
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
|
||||
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
|
||||
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
|
||||
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
|
||||
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
|
||||
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
|
||||
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
|
||||
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
|
||||
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
|
||||
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
|
||||
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
|
||||
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
|
||||
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
|
||||
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
|
||||
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
|
||||
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
|
||||
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
|
||||
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
840010
|
||||
866510
|
||||
1970560
|
||||
411740
|
||||
1509590
|
||||
458520
|
||||
920210
|
||||
1444020
|
||||
1232460
|
||||
2026070
|
||||
258880
|
||||
295250
|
||||
299500
|
||||
574080
|
||||
598780
|
||||
1217190
|
||||
257730
|
||||
1807730
|
||||
773670
|
||||
1803150
|
||||
1573070
|
||||
513930
|
||||
385250
|
||||
261880
|
||||
533300
|
||||
542340
|
||||
1209040
|
||||
8790
|
||||
8000
|
||||
415150
|
||||
2012500
|
||||
691150
|
||||
283370
|
||||
249650
|
||||
268870
|
||||
1172510
|
||||
927890
|
||||
25700
|
||||
281610
|
||||
485610
|
||||
1276850
|
||||
722340
|
||||
1499640
|
||||
1848450
|
||||
615700
|
||||
744980
|
||||
10180
|
||||
234390
|
||||
1641670
|
||||
427520
|
||||
FIM
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
|
||||
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
|
||||
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
|
||||
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
|
||||
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
|
||||
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
|
||||
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
|
||||
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
|
||||
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
|
||||
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
|
||||
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
|
||||
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
|
||||
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
|
||||
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
|
||||
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
|
||||
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
|
||||
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
|
||||
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
|
||||
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
|
||||
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
|
||||
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
|
||||
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
|
||||
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
|
||||
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
|
||||
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
|
||||
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
|
||||
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
|
||||
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
|
||||
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
|
||||
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
|
||||
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
|
||||
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
|
||||
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
|
||||
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
|
||||
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
|
||||
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
|
||||
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
|
||||
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
|
||||
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
|
||||
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
|
||||
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
|
||||
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
|
||||
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
|
||||
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
|
||||
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
|
||||
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
|
||||
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
|
||||
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
|
||||
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
|
||||
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
|
@ -1,9 +1,9 @@
|
|||
/**
|
||||
|
||||
* @file Game.c
|
||||
* @file Linux_Game.c
|
||||
* @author Pedro Lopes
|
||||
* @version 0.2
|
||||
* @date 2022-10-02
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
Binary file not shown.
|
|
@ -0,0 +1,728 @@
|
|||
/**
|
||||
|
||||
* @file WSL_Game.c
|
||||
* @author Pedro Lopes
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Includes
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <math.h>
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Definitions
|
||||
#define MAX_GAMES 9000
|
||||
#define MAX_FIELD_SIZE 250
|
||||
#define MAX_STRING_ARRAY_SIZE 100
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Structs
|
||||
typedef struct {
|
||||
|
||||
int year,
|
||||
month;
|
||||
} Date;
|
||||
|
||||
typedef struct {
|
||||
|
||||
char name[MAX_FIELD_SIZE],
|
||||
owners[MAX_FIELD_SIZE],
|
||||
website[MAX_FIELD_SIZE],
|
||||
developers[MAX_FIELD_SIZE],
|
||||
languages[MAX_STRING_ARRAY_SIZE][30],
|
||||
genres[MAX_STRING_ARRAY_SIZE][30];
|
||||
|
||||
Date release_date;
|
||||
int app_id, age, dlcs, avg_playtime, count_languages, count_genres;
|
||||
float price, upvotes;
|
||||
bool windows_os, mac_os, linux_os;
|
||||
|
||||
} Game;
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Global variables
|
||||
Game games[MAX_GAMES];
|
||||
int n = 0;
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Functions
|
||||
bool isFim(char* line) { return line[0] == 'F' && line[1] == 'I' && line[2] == 'M'; }
|
||||
|
||||
void substring(char *string, char *string_start, int length) {
|
||||
|
||||
strncpy(string, string_start, length);
|
||||
string[length] = '\0';
|
||||
}
|
||||
|
||||
char *getMonthName(int month) {
|
||||
|
||||
switch(month) {
|
||||
|
||||
case 1: return "Jan"; break;
|
||||
case 2: return "Feb"; break;
|
||||
case 3: return "Mar"; break;
|
||||
case 4: return "Apr"; break;
|
||||
case 5: return "May"; break;
|
||||
case 6: return "Jun"; break;
|
||||
case 7: return "Jul"; break;
|
||||
case 8: return "Aug"; break;
|
||||
case 9: return "Sep"; break;
|
||||
case 10: return "Oct"; break;
|
||||
case 11: return "Nov"; break;
|
||||
case 12: return "Dec"; break;
|
||||
|
||||
default: return "N/A"; break;
|
||||
}
|
||||
}
|
||||
|
||||
int getMonthNumber(char* month) {
|
||||
|
||||
if(!strcmp(month, "Jan")) return 1;
|
||||
else if(!strcmp(month, "Feb")) return 2;
|
||||
else if(!strcmp(month, "Mar")) return 3;
|
||||
else if(!strcmp(month, "Apr")) return 4;
|
||||
else if(!strcmp(month, "May")) return 5;
|
||||
else if(!strcmp(month, "Jun")) return 6;
|
||||
else if(!strcmp(month, "Jul")) return 7;
|
||||
else if(!strcmp(month, "Aug")) return 8;
|
||||
else if(!strcmp(month, "Sep")) return 9;
|
||||
else if(!strcmp(month, "Oct")) return 10;
|
||||
else if(!strcmp(month, "Nov")) return 11;
|
||||
else if(!strcmp(month, "Dec")) return 12;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Class game functions
|
||||
void game_start(Game *game) {
|
||||
|
||||
strcpy(game -> name, "");
|
||||
strcpy(game -> owners, "");
|
||||
strcpy(game -> website, "");
|
||||
strcpy(game -> developers, "");
|
||||
|
||||
for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) {
|
||||
|
||||
strcpy(game -> languages[i], "");
|
||||
strcpy(game -> genres[i], "");
|
||||
}
|
||||
|
||||
game -> release_date.month = -1;
|
||||
game -> release_date.year = -1;
|
||||
game -> app_id = -1;
|
||||
game -> age = -1;
|
||||
game -> dlcs = -1;
|
||||
game -> avg_playtime = -1;
|
||||
game -> price = -1;
|
||||
game -> upvotes = -1;
|
||||
game -> windows_os = false;
|
||||
game -> mac_os = false;
|
||||
game -> linux_os = false;
|
||||
|
||||
game -> count_languages = 0;
|
||||
game -> count_genres = 0;
|
||||
}
|
||||
|
||||
void game_print(Game *game) {
|
||||
|
||||
int hours = game -> avg_playtime / 60,
|
||||
minutes = game -> avg_playtime % 60;
|
||||
|
||||
printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs);
|
||||
|
||||
for(int i = 0; i < game -> count_languages; i++) {
|
||||
|
||||
printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : "");
|
||||
}
|
||||
|
||||
printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false");
|
||||
|
||||
if(isnan(game -> upvotes)) printf("0.0%% ");
|
||||
else printf("%.0f%% ", game -> upvotes);
|
||||
|
||||
if(hours > 0)
|
||||
{
|
||||
printf("%ih ", hours);
|
||||
|
||||
if(minutes > 0) printf("%im ", minutes);
|
||||
}
|
||||
else {
|
||||
|
||||
if(minutes > 0) printf("%im ", minutes);
|
||||
else printf("null ");
|
||||
}
|
||||
|
||||
printf("%s [", game -> developers);
|
||||
|
||||
for(int i = 0; i < game -> count_genres; i++) {
|
||||
|
||||
printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : "");
|
||||
}
|
||||
|
||||
printf("]\n");
|
||||
}
|
||||
|
||||
Game game_clone(Game *game) {
|
||||
|
||||
Game cloned;
|
||||
|
||||
strcpy(cloned.name, game -> name);
|
||||
strcpy(cloned.owners, game -> owners);
|
||||
strcpy(cloned.website, game -> website);
|
||||
strcpy(cloned.developers, game -> developers);
|
||||
|
||||
for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]);
|
||||
for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]);
|
||||
|
||||
cloned.release_date.month = game -> release_date.month;
|
||||
cloned.release_date.year = game -> release_date.year;
|
||||
cloned.app_id = game -> app_id;
|
||||
cloned.age = game -> age;
|
||||
cloned.dlcs = game -> dlcs;
|
||||
cloned.avg_playtime = game -> avg_playtime;
|
||||
cloned.price = game -> price;
|
||||
cloned.upvotes = game -> upvotes;
|
||||
cloned.windows_os = game -> windows_os;
|
||||
cloned.mac_os = game -> mac_os;
|
||||
cloned.linux_os = game -> linux_os;
|
||||
return cloned;
|
||||
}
|
||||
|
||||
void game_read(Game *game, char *line) {
|
||||
|
||||
char c_search, sub[MAX_FIELD_SIZE];
|
||||
int index = 0, atr_index = 0;
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "AppID"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> app_id = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Name"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> name, sub);
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> name, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find release date
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
char subDate[10];
|
||||
|
||||
substring(subDate, &sub[0], 3);
|
||||
|
||||
game -> release_date.month = getMonthNumber(subDate);
|
||||
|
||||
if(c_search == ',') {
|
||||
|
||||
substring(subDate, &sub[4], 4);
|
||||
|
||||
game -> release_date.year = atoi(subDate);
|
||||
|
||||
index++;
|
||||
}
|
||||
else if(c_search == '\"') {
|
||||
|
||||
int nmbSpace = 0;
|
||||
|
||||
for(int i = 0; ; i++) {
|
||||
|
||||
if(sub[i] == ' ') nmbSpace++;
|
||||
|
||||
if(nmbSpace == 2) {
|
||||
|
||||
i++;
|
||||
|
||||
substring(subDate, &sub[i], 4);
|
||||
|
||||
game -> release_date.year = atoi(subDate);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
index += 2;
|
||||
}
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
game -> release_date.month = 0;
|
||||
game -> release_date.year = 0;
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Owners"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> owners, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Age"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> age = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Price"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> price = atof(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "DLCs"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> dlcs = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Languages"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ']') {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') index++;
|
||||
else if(line[index] == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
else if(line[index] == '\'') {
|
||||
|
||||
int wordStart = index + 1;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == '\'') {
|
||||
|
||||
substring(sub, &line[wordStart], index - wordStart);
|
||||
strcpy(game -> languages[game -> count_languages++], sub);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Website"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> website, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> website, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Windows"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> windows_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Mac"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> mac_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Linux"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> linux_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Upvotes"
|
||||
int positives, negatives;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
positives = atoi(sub);
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
negatives = atoi(sub);
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
game -> upvotes = (float)(positives * 100) / (float)(positives + negatives);
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "AVG Playtime"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> avg_playtime = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Developers"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> developers, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> developers, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Genres"
|
||||
if(index < strlen(line) - 1) {
|
||||
|
||||
if(line[index] == ',') atr_index = ++index;
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
else if(line[index] == '\"') {
|
||||
|
||||
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
|
||||
|
||||
if(sub[strlen(sub) - 1] == '\"') sub[strlen(sub) - 1] = '\0';
|
||||
else if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0';
|
||||
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
|
||||
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Functions - List
|
||||
void list_insert(Game x) {
|
||||
|
||||
if(n >= MAX_GAMES) {
|
||||
|
||||
printf("Insert error: MAX_GAMES reached");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
games[n++] = x;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
int main() {
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// First part - Read all games
|
||||
|
||||
// Open CSV file
|
||||
FILE *fp;
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
size_t read;
|
||||
|
||||
fp = fopen("/tmp/games.csv", "r");
|
||||
|
||||
if(fp == NULL) exit(EXIT_FAILURE);
|
||||
|
||||
// ------------------------- //
|
||||
|
||||
// Fill games list
|
||||
while((read = getline(&line, &len, fp)) != -1) {
|
||||
|
||||
Game game;
|
||||
|
||||
game_start(&game);
|
||||
game_read(&game, line);
|
||||
list_insert(game);
|
||||
}
|
||||
|
||||
// ------------------------- //
|
||||
|
||||
fclose(fp);
|
||||
|
||||
if(line) free(line);
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Second part - Print .in games
|
||||
|
||||
char in[15];
|
||||
scanf(" %[^\n]s", in);
|
||||
|
||||
while(true) {
|
||||
|
||||
if(isFim(in)) break;
|
||||
else {
|
||||
|
||||
int app_id = atoi(in);
|
||||
|
||||
for(int i = 0; i < n; i++) {
|
||||
|
||||
if(games[i].app_id == app_id) {
|
||||
|
||||
game_print(&games[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------- //
|
||||
|
||||
scanf(" %[^\n]s", in);
|
||||
}
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
|
||||
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
|
||||
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
|
||||
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
|
||||
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
|
||||
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
|
||||
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
|
||||
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
|
||||
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
|
||||
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
|
||||
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
|
||||
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
|
||||
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
|
||||
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
|
||||
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
|
||||
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
|
||||
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
|
||||
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
|
||||
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
|
||||
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
|
||||
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
|
||||
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
|
||||
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
|
||||
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
|
||||
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
|
||||
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
|
||||
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
|
||||
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
|
||||
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
|
||||
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
|
||||
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
|
||||
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
|
||||
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
|
||||
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
|
||||
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
|
||||
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
|
||||
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
|
||||
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
|
||||
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
|
||||
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
|
||||
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
|
||||
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
|
||||
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
|
||||
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
|
||||
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
|
||||
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
|
||||
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
|
||||
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
|
||||
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
|
||||
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
840010
|
||||
866510
|
||||
1970560
|
||||
411740
|
||||
1509590
|
||||
458520
|
||||
920210
|
||||
1444020
|
||||
1232460
|
||||
2026070
|
||||
258880
|
||||
295250
|
||||
299500
|
||||
574080
|
||||
598780
|
||||
1217190
|
||||
257730
|
||||
1807730
|
||||
773670
|
||||
1803150
|
||||
1573070
|
||||
513930
|
||||
385250
|
||||
261880
|
||||
533300
|
||||
542340
|
||||
1209040
|
||||
8790
|
||||
8000
|
||||
415150
|
||||
2012500
|
||||
691150
|
||||
283370
|
||||
249650
|
||||
268870
|
||||
1172510
|
||||
927890
|
||||
25700
|
||||
281610
|
||||
485610
|
||||
1276850
|
||||
722340
|
||||
1499640
|
||||
1848450
|
||||
615700
|
||||
744980
|
||||
10180
|
||||
234390
|
||||
1641670
|
||||
427520
|
||||
FIM
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
|
||||
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
|
||||
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
|
||||
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
|
||||
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
|
||||
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
|
||||
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
|
||||
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
|
||||
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
|
||||
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
|
||||
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
|
||||
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
|
||||
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
|
||||
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
|
||||
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
|
||||
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
|
||||
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
|
||||
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
|
||||
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
|
||||
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
|
||||
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
|
||||
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
|
||||
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
|
||||
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
|
||||
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
|
||||
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
|
||||
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
|
||||
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
|
||||
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
|
||||
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
|
||||
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
|
||||
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
|
||||
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
|
||||
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
|
||||
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
|
||||
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
|
||||
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
|
||||
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
|
||||
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
|
||||
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
|
||||
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
|
||||
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
|
||||
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
|
||||
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
|
||||
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
|
||||
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
|
||||
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
|
||||
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
|
||||
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
|
||||
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]
|
||||
|
|
@ -0,0 +1,204 @@
|
|||
import java.util.Formatter;
|
||||
import java.util.Scanner;
|
||||
import java.io.File;
|
||||
|
||||
public class Arq
|
||||
{
|
||||
private static String nomeArquivo = "";
|
||||
private static String charsetArquivo = "ISO-8859-1";
|
||||
private static boolean write = false, read = false;
|
||||
private static Formatter saida = null;
|
||||
private static Scanner entrada = null;
|
||||
|
||||
public static boolean openWrite(String nomeArq, String charset) {
|
||||
boolean resp = false;
|
||||
close();
|
||||
try{
|
||||
saida = new Formatter(nomeArq, charset);
|
||||
nomeArquivo = nomeArq;
|
||||
resp = write = true;
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static boolean openWrite(String nomeArq) {
|
||||
return openWrite(nomeArq, charsetArquivo);
|
||||
}
|
||||
|
||||
public static boolean openWriteClose(String nomeArq, String charset, String conteudo) {
|
||||
boolean resp = openWrite(nomeArq, charset);
|
||||
if(resp == true){
|
||||
println(conteudo);
|
||||
close();
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static boolean openWriteClose(String nomeArq, String conteudo) {
|
||||
return openWriteClose(nomeArq, charsetArquivo, conteudo);
|
||||
}
|
||||
|
||||
public static boolean openRead(String nomeArq) {
|
||||
return openRead(nomeArq, charsetArquivo);
|
||||
}
|
||||
|
||||
public static boolean openRead(String nomeArq, String charset) {
|
||||
boolean resp = false;
|
||||
close();
|
||||
try{
|
||||
entrada = new Scanner(new File(nomeArq), charset);
|
||||
nomeArquivo = nomeArq;
|
||||
resp = read = true;
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static String openReadClose(String nomeArq){
|
||||
openRead(nomeArq);
|
||||
String resp = readAll();
|
||||
close();
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static void close() {
|
||||
if(write == true){
|
||||
saida.close();
|
||||
}
|
||||
if(read == true){
|
||||
entrada.close();
|
||||
}
|
||||
write = read = false;
|
||||
nomeArquivo = "";
|
||||
charsetArquivo = "ISO-8859-1";
|
||||
}
|
||||
|
||||
public static long length(){
|
||||
long resp = -1;
|
||||
if(read != write){
|
||||
File file = new File(nomeArquivo);
|
||||
resp = file.length();
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static void print(int x){
|
||||
if(write == true){
|
||||
saida.format( "%d", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(double x){
|
||||
if(write == true){
|
||||
saida.format( "%f", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(String x){
|
||||
if(write == true){
|
||||
saida.format( "%s", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(boolean x){
|
||||
if(write == true){
|
||||
saida.format( "%s", ((x) ? "true" : "false"));
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(char x){
|
||||
if(write == true){
|
||||
saida.format( "%c", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(int x){
|
||||
if(write == true){
|
||||
saida.format( "%d\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(double x){
|
||||
if(write == true){
|
||||
saida.format( "%f\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(String x){
|
||||
if(write == true){
|
||||
saida.format( "%s\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(boolean x){
|
||||
if(write == true){
|
||||
saida.format( "%s\n", ((x) ? "true" : "false"));
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(char x){
|
||||
if(write == true){
|
||||
saida.format( "%c\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static int readInt(){
|
||||
int resp = -1;
|
||||
try{
|
||||
resp = entrada.nextInt();
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static char readChar(){
|
||||
char resp = ' ';
|
||||
try{
|
||||
resp = (char)entrada.nextByte();
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static double readDouble(){
|
||||
double resp = -1;
|
||||
try{
|
||||
resp = Double.parseDouble(readString().replace(",","."));
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static String readString(){
|
||||
String resp = "";
|
||||
try{
|
||||
resp = entrada.next();
|
||||
} catch (Exception e) { System.out.println(e.getMessage()); }
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static boolean readBoolean(){
|
||||
boolean resp = false;
|
||||
try{
|
||||
resp = (entrada.next().equals("true")) ? true : false;
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static String readLine(){
|
||||
String resp = "";
|
||||
try{
|
||||
resp = entrada.nextLine();
|
||||
} catch (Exception e) { System.out.println(e.getMessage()); }
|
||||
return resp;
|
||||
}
|
||||
|
||||
|
||||
public static boolean hasNext(){
|
||||
return entrada.hasNext();
|
||||
}
|
||||
|
||||
public static String readAll(){
|
||||
String resp = "";
|
||||
while(hasNext()){
|
||||
resp += (readLine() + "\n");
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,607 @@
|
|||
/**
|
||||
|
||||
* @file Game.java
|
||||
* @author Pedro Lopes
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Scanner;
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
class Game {
|
||||
|
||||
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
|
||||
|
||||
private String name, owners, website, developers;
|
||||
private ArrayList<String> languages, genres;
|
||||
private Date release_date;
|
||||
private int app_id, age, dlcs, avg_playtime;
|
||||
private float price, upvotes;
|
||||
private boolean windows, mac, linux;
|
||||
|
||||
public Game() {
|
||||
|
||||
this.name = this.owners = this.website = this.developers = null;
|
||||
this.languages = new ArrayList<String>();
|
||||
this.genres = new ArrayList<String>();
|
||||
this.release_date = null;
|
||||
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
|
||||
this.price = this.upvotes = -1;
|
||||
this.windows = this.mac = this.linux = false;
|
||||
}
|
||||
|
||||
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
|
||||
|
||||
this.name = name;
|
||||
this.owners = owners;
|
||||
this.website = website;
|
||||
this.developers = developers;
|
||||
this.languages = languages;
|
||||
this.genres = genres;
|
||||
this.release_date = release_date;
|
||||
this.app_id = app_id;
|
||||
this.age = age;
|
||||
this.dlcs = dlcs;
|
||||
this.upvotes = upvotes;
|
||||
this.avg_playtime = avg_playtime;
|
||||
this.price = price;
|
||||
this.windows = windows;
|
||||
this.mac = mac;
|
||||
this.linux = linux;
|
||||
}
|
||||
|
||||
public void setName(String name) { this.name = name; }
|
||||
public void setOwners(String owners) { this.owners = owners; }
|
||||
public void setWebsite(String website) { this.website = website; }
|
||||
public void setDevelopers(String developers) { this.developers = developers; }
|
||||
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
|
||||
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
|
||||
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
|
||||
public void setAppId(int app_id) { this.app_id = app_id; }
|
||||
public void setAge(int age) { this.age = age; }
|
||||
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
|
||||
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
|
||||
public void setPrice(float price) { this.price = price; }
|
||||
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
|
||||
public void setWindows(boolean windows) { this.windows = windows; }
|
||||
public void setMac(boolean mac) { this.mac = mac; }
|
||||
public void setLinux(boolean linux) { this.linux = linux; }
|
||||
|
||||
public String getName() { return this.name; }
|
||||
public String getOwners() { return this.owners; }
|
||||
public String getWebsite() { return this.website; }
|
||||
public String getDevelopers() { return this.developers; }
|
||||
public ArrayList<String> getLanguages() { return this.languages; }
|
||||
public ArrayList<String> getGenres() { return this.genres; }
|
||||
public Date getReleaseDate() { return this.release_date; }
|
||||
public int getAppId() { return this.app_id; }
|
||||
public int getAge() { return this.age; }
|
||||
public int getDlcs() { return this.dlcs; }
|
||||
public int getAvgPlaytime() { return this.avg_playtime; }
|
||||
public float getPrice() { return this.price; }
|
||||
public float getUpvotes() { return this.upvotes; }
|
||||
public boolean getWindows() { return this.windows; }
|
||||
public boolean getMac() { return this.mac; }
|
||||
public boolean getLinux() { return this.linux; }
|
||||
|
||||
public Game clone() {
|
||||
|
||||
Game cloned = new Game();
|
||||
|
||||
cloned.name = this.name;
|
||||
cloned.owners = this.owners;
|
||||
cloned.website = this.website;
|
||||
cloned.developers = this.developers;
|
||||
cloned.languages = this.languages;
|
||||
cloned.genres = this.genres;
|
||||
cloned.release_date = this.release_date;
|
||||
cloned.app_id = this.app_id;
|
||||
cloned.age = this.age;
|
||||
cloned.dlcs = this.dlcs;
|
||||
cloned.avg_playtime = this.avg_playtime;
|
||||
cloned.price = this.price;
|
||||
cloned.upvotes = this.upvotes;
|
||||
cloned.windows = this.windows;
|
||||
cloned.mac = this.mac;
|
||||
cloned.linux = this.linux;
|
||||
|
||||
return cloned;
|
||||
}
|
||||
|
||||
public void read(String line) {
|
||||
|
||||
char c_search;
|
||||
int index = 0, atr_index = 0;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AppID"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.app_id = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Name"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.name = line.substring(atr_index, index);
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find release date
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
SimpleDateFormat df;
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else {
|
||||
|
||||
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
|
||||
|
||||
c_search = ',';
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
try { this.release_date = df.parse(line.substring(atr_index, index)); }
|
||||
catch (java.text.ParseException e) { e.printStackTrace(); }
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Owners"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.owners = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Age"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.age = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Price"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.price = Float.parseFloat(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "DLCs"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Languages"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ']') {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') index++;
|
||||
else if(line.charAt(index) == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
else if(line.charAt(index) == '\'') {
|
||||
|
||||
int wordStart = index + 1;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == '\'') {
|
||||
|
||||
this.languages.add(line.substring(wordStart, index));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Website"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.website = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Windows"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Mac"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Linux"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Upvotes"
|
||||
int positives, negatives;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
positives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
negatives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AVG Playtime"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Developers"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.developers = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Genres"
|
||||
if(index < line.length() - 1) {
|
||||
|
||||
if(line.charAt(index) == ',') atr_index = ++index;
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
else if(line.charAt(index) == '\"') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, line.length() - 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else this.genres.add(line.substring(atr_index, line.length()));
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
||||
public void print() {
|
||||
|
||||
String avg_pt = null;
|
||||
|
||||
if(this.avg_playtime == 0) avg_pt = "null ";
|
||||
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
|
||||
else {
|
||||
|
||||
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
|
||||
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
|
||||
}
|
||||
|
||||
DecimalFormat df = new DecimalFormat("##");
|
||||
|
||||
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- //
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Scanner scr = new Scanner(System.in);
|
||||
ArrayList<Integer> gamesToAdd = new ArrayList<Integer>();
|
||||
ArrayList<Game> games = new ArrayList<Game>();
|
||||
String line = scr.nextLine();
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
// Fill list with requested ids
|
||||
while(true) {
|
||||
|
||||
if(line.equals("FIM")) break;
|
||||
|
||||
gamesToAdd.add(Integer.parseInt(line));
|
||||
|
||||
line = scr.nextLine();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
// Add requested ids to games list
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Start to explode CSV file
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
if(gamesToAdd.contains(Integer.parseInt(line.substring(0, line.indexOf(','))))) {
|
||||
|
||||
Game game = new Game();
|
||||
|
||||
game.read(line);
|
||||
games.add(game);
|
||||
}
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Initialize bench log
|
||||
int c_compares = 0;
|
||||
long t_begin = System.currentTimeMillis();
|
||||
|
||||
// Search in games list by name
|
||||
line = scr.nextLine();
|
||||
|
||||
while(true) {
|
||||
|
||||
if(line.equals("FIM")) break;
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
boolean found = false;
|
||||
|
||||
for(int i = 0; i < games.size(); i++) {
|
||||
|
||||
c_compares++;
|
||||
|
||||
if(games.get(i).name.compareTo(line) == 0) {
|
||||
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
System.out.println(found ? "SIM" : "NAO");
|
||||
|
||||
line = scr.nextLine();
|
||||
}
|
||||
|
||||
Arq.openWrite("753045_sequencial.txt");
|
||||
Arq.print("753045\t" + (System.currentTimeMillis() - t_begin) + "ms\t" + c_compares);
|
||||
Arq.close();
|
||||
|
||||
scr.close();
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
840010
|
||||
866510
|
||||
1970560
|
||||
411740
|
||||
1509590
|
||||
458520
|
||||
920210
|
||||
1444020
|
||||
1232460
|
||||
2026070
|
||||
258880
|
||||
295250
|
||||
299500
|
||||
574080
|
||||
598780
|
||||
1217190
|
||||
257730
|
||||
1807730
|
||||
773670
|
||||
1803150
|
||||
1573070
|
||||
513930
|
||||
385250
|
||||
261880
|
||||
533300
|
||||
542340
|
||||
1209040
|
||||
8790
|
||||
8000
|
||||
415150
|
||||
2012500
|
||||
691150
|
||||
283370
|
||||
249650
|
||||
268870
|
||||
1172510
|
||||
927890
|
||||
25700
|
||||
281610
|
||||
485610
|
||||
1276850
|
||||
722340
|
||||
1499640
|
||||
1848450
|
||||
615700
|
||||
744980
|
||||
10180
|
||||
234390
|
||||
1641670
|
||||
427520
|
||||
FIM
|
||||
Bobbi Adventure
|
||||
The Test: Hypothesis Rising
|
||||
Epic Cards Battle 2 (TCG)
|
||||
Omensight: Definitive Edition
|
||||
Gray Matter
|
||||
The Legend of Bean
|
||||
Armored Warfare
|
||||
Void Slayer
|
||||
RacetronicVR
|
||||
The Amazing American Circus
|
||||
Your Quest
|
||||
HistoryMaker VR
|
||||
WE ARE FOOTBALL
|
||||
Rise of Insanity
|
||||
Aragami
|
||||
BONEWORKS
|
||||
CAGE
|
||||
Saku Saku: Love Blooms with the Cherry Blossoms
|
||||
Kill The Bad Guy
|
||||
Deisim
|
||||
Redactem
|
||||
Xuan-Yuan Sword: The Gate of Firmament
|
||||
Subspace Continuum
|
||||
DRAGON BALL XENOVERSE
|
||||
RiotZ
|
||||
Stephen's Sausage Roll
|
||||
Tavern Tycoon - Dragon's Hangover
|
||||
Child of Light
|
||||
Heart and Seoul
|
||||
Tank Destroyer
|
||||
Claire
|
||||
MONOLISK
|
||||
Cinderella Escape 2 Revenge
|
||||
Flat Heroes
|
||||
The Political Machine 2016
|
||||
AFFECTED: The Manor - The Complete Edition
|
||||
QUAKE III: Team Arena
|
||||
Woodcutter Simulator 2013
|
||||
Dawn of Man
|
||||
FIM
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
|
|
@ -0,0 +1,204 @@
|
|||
import java.util.Formatter;
|
||||
import java.util.Scanner;
|
||||
import java.io.File;
|
||||
|
||||
public class Arq
|
||||
{
|
||||
private static String nomeArquivo = "";
|
||||
private static String charsetArquivo = "ISO-8859-1";
|
||||
private static boolean write = false, read = false;
|
||||
private static Formatter saida = null;
|
||||
private static Scanner entrada = null;
|
||||
|
||||
public static boolean openWrite(String nomeArq, String charset) {
|
||||
boolean resp = false;
|
||||
close();
|
||||
try{
|
||||
saida = new Formatter(nomeArq, charset);
|
||||
nomeArquivo = nomeArq;
|
||||
resp = write = true;
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static boolean openWrite(String nomeArq) {
|
||||
return openWrite(nomeArq, charsetArquivo);
|
||||
}
|
||||
|
||||
public static boolean openWriteClose(String nomeArq, String charset, String conteudo) {
|
||||
boolean resp = openWrite(nomeArq, charset);
|
||||
if(resp == true){
|
||||
println(conteudo);
|
||||
close();
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static boolean openWriteClose(String nomeArq, String conteudo) {
|
||||
return openWriteClose(nomeArq, charsetArquivo, conteudo);
|
||||
}
|
||||
|
||||
public static boolean openRead(String nomeArq) {
|
||||
return openRead(nomeArq, charsetArquivo);
|
||||
}
|
||||
|
||||
public static boolean openRead(String nomeArq, String charset) {
|
||||
boolean resp = false;
|
||||
close();
|
||||
try{
|
||||
entrada = new Scanner(new File(nomeArq), charset);
|
||||
nomeArquivo = nomeArq;
|
||||
resp = read = true;
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static String openReadClose(String nomeArq){
|
||||
openRead(nomeArq);
|
||||
String resp = readAll();
|
||||
close();
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static void close() {
|
||||
if(write == true){
|
||||
saida.close();
|
||||
}
|
||||
if(read == true){
|
||||
entrada.close();
|
||||
}
|
||||
write = read = false;
|
||||
nomeArquivo = "";
|
||||
charsetArquivo = "ISO-8859-1";
|
||||
}
|
||||
|
||||
public static long length(){
|
||||
long resp = -1;
|
||||
if(read != write){
|
||||
File file = new File(nomeArquivo);
|
||||
resp = file.length();
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static void print(int x){
|
||||
if(write == true){
|
||||
saida.format( "%d", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(double x){
|
||||
if(write == true){
|
||||
saida.format( "%f", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(String x){
|
||||
if(write == true){
|
||||
saida.format( "%s", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(boolean x){
|
||||
if(write == true){
|
||||
saida.format( "%s", ((x) ? "true" : "false"));
|
||||
}
|
||||
}
|
||||
|
||||
public static void print(char x){
|
||||
if(write == true){
|
||||
saida.format( "%c", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(int x){
|
||||
if(write == true){
|
||||
saida.format( "%d\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(double x){
|
||||
if(write == true){
|
||||
saida.format( "%f\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(String x){
|
||||
if(write == true){
|
||||
saida.format( "%s\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(boolean x){
|
||||
if(write == true){
|
||||
saida.format( "%s\n", ((x) ? "true" : "false"));
|
||||
}
|
||||
}
|
||||
|
||||
public static void println(char x){
|
||||
if(write == true){
|
||||
saida.format( "%c\n", x);
|
||||
}
|
||||
}
|
||||
|
||||
public static int readInt(){
|
||||
int resp = -1;
|
||||
try{
|
||||
resp = entrada.nextInt();
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static char readChar(){
|
||||
char resp = ' ';
|
||||
try{
|
||||
resp = (char)entrada.nextByte();
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static double readDouble(){
|
||||
double resp = -1;
|
||||
try{
|
||||
resp = Double.parseDouble(readString().replace(",","."));
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static String readString(){
|
||||
String resp = "";
|
||||
try{
|
||||
resp = entrada.next();
|
||||
} catch (Exception e) { System.out.println(e.getMessage()); }
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static boolean readBoolean(){
|
||||
boolean resp = false;
|
||||
try{
|
||||
resp = (entrada.next().equals("true")) ? true : false;
|
||||
} catch (Exception e) {}
|
||||
return resp;
|
||||
}
|
||||
|
||||
public static String readLine(){
|
||||
String resp = "";
|
||||
try{
|
||||
resp = entrada.nextLine();
|
||||
} catch (Exception e) { System.out.println(e.getMessage()); }
|
||||
return resp;
|
||||
}
|
||||
|
||||
|
||||
public static boolean hasNext(){
|
||||
return entrada.hasNext();
|
||||
}
|
||||
|
||||
public static String readAll(){
|
||||
String resp = "";
|
||||
while(hasNext()){
|
||||
resp += (readLine() + "\n");
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,627 @@
|
|||
/**
|
||||
|
||||
* @file Game.java
|
||||
* @author Pedro Lopes
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Scanner;
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
class Game implements Comparable<Game> {
|
||||
|
||||
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
|
||||
|
||||
private String name, owners, website, developers;
|
||||
private ArrayList<String> languages, genres;
|
||||
private Date release_date;
|
||||
private int app_id, age, dlcs, avg_playtime;
|
||||
private float price, upvotes;
|
||||
private boolean windows, mac, linux;
|
||||
|
||||
public Game() {
|
||||
|
||||
this.name = this.owners = this.website = this.developers = null;
|
||||
this.languages = new ArrayList<String>();
|
||||
this.genres = new ArrayList<String>();
|
||||
this.release_date = null;
|
||||
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
|
||||
this.price = this.upvotes = -1;
|
||||
this.windows = this.mac = this.linux = false;
|
||||
}
|
||||
|
||||
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
|
||||
|
||||
this.name = name;
|
||||
this.owners = owners;
|
||||
this.website = website;
|
||||
this.developers = developers;
|
||||
this.languages = languages;
|
||||
this.genres = genres;
|
||||
this.release_date = release_date;
|
||||
this.app_id = app_id;
|
||||
this.age = age;
|
||||
this.dlcs = dlcs;
|
||||
this.upvotes = upvotes;
|
||||
this.avg_playtime = avg_playtime;
|
||||
this.price = price;
|
||||
this.windows = windows;
|
||||
this.mac = mac;
|
||||
this.linux = linux;
|
||||
}
|
||||
|
||||
public int compareTo(Game other) { return this.name.compareTo(other.name); }
|
||||
|
||||
public void setName(String name) { this.name = name; }
|
||||
public void setOwners(String owners) { this.owners = owners; }
|
||||
public void setWebsite(String website) { this.website = website; }
|
||||
public void setDevelopers(String developers) { this.developers = developers; }
|
||||
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
|
||||
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
|
||||
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
|
||||
public void setAppId(int app_id) { this.app_id = app_id; }
|
||||
public void setAge(int age) { this.age = age; }
|
||||
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
|
||||
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
|
||||
public void setPrice(float price) { this.price = price; }
|
||||
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
|
||||
public void setWindows(boolean windows) { this.windows = windows; }
|
||||
public void setMac(boolean mac) { this.mac = mac; }
|
||||
public void setLinux(boolean linux) { this.linux = linux; }
|
||||
|
||||
public String getName() { return this.name; }
|
||||
public String getOwners() { return this.owners; }
|
||||
public String getWebsite() { return this.website; }
|
||||
public String getDevelopers() { return this.developers; }
|
||||
public ArrayList<String> getLanguages() { return this.languages; }
|
||||
public ArrayList<String> getGenres() { return this.genres; }
|
||||
public Date getReleaseDate() { return this.release_date; }
|
||||
public int getAppId() { return this.app_id; }
|
||||
public int getAge() { return this.age; }
|
||||
public int getDlcs() { return this.dlcs; }
|
||||
public int getAvgPlaytime() { return this.avg_playtime; }
|
||||
public float getPrice() { return this.price; }
|
||||
public float getUpvotes() { return this.upvotes; }
|
||||
public boolean getWindows() { return this.windows; }
|
||||
public boolean getMac() { return this.mac; }
|
||||
public boolean getLinux() { return this.linux; }
|
||||
|
||||
public Game clone() {
|
||||
|
||||
Game cloned = new Game();
|
||||
|
||||
cloned.name = this.name;
|
||||
cloned.owners = this.owners;
|
||||
cloned.website = this.website;
|
||||
cloned.developers = this.developers;
|
||||
cloned.languages = this.languages;
|
||||
cloned.genres = this.genres;
|
||||
cloned.release_date = this.release_date;
|
||||
cloned.app_id = this.app_id;
|
||||
cloned.age = this.age;
|
||||
cloned.dlcs = this.dlcs;
|
||||
cloned.avg_playtime = this.avg_playtime;
|
||||
cloned.price = this.price;
|
||||
cloned.upvotes = this.upvotes;
|
||||
cloned.windows = this.windows;
|
||||
cloned.mac = this.mac;
|
||||
cloned.linux = this.linux;
|
||||
|
||||
return cloned;
|
||||
}
|
||||
|
||||
public void read(String line) {
|
||||
|
||||
char c_search;
|
||||
int index = 0, atr_index = 0;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AppID"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.app_id = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Name"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.name = line.substring(atr_index, index);
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find release date
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
SimpleDateFormat df;
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else {
|
||||
|
||||
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
|
||||
|
||||
c_search = ',';
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
try { this.release_date = df.parse(line.substring(atr_index, index)); }
|
||||
catch (java.text.ParseException e) { e.printStackTrace(); }
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Owners"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.owners = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Age"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.age = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Price"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.price = Float.parseFloat(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "DLCs"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Languages"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ']') {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') index++;
|
||||
else if(line.charAt(index) == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
else if(line.charAt(index) == '\'') {
|
||||
|
||||
int wordStart = index + 1;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == '\'') {
|
||||
|
||||
this.languages.add(line.substring(wordStart, index));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Website"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.website = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Windows"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Mac"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Linux"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Upvotes"
|
||||
int positives, negatives;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
positives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
negatives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AVG Playtime"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Developers"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.developers = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Genres"
|
||||
if(index < line.length() - 1) {
|
||||
|
||||
if(line.charAt(index) == ',') atr_index = ++index;
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
else if(line.charAt(index) == '\"') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, line.length() - 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else this.genres.add(line.substring(atr_index, line.length()));
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
||||
public void print() {
|
||||
|
||||
String avg_pt = null;
|
||||
|
||||
if(this.avg_playtime == 0) avg_pt = "null ";
|
||||
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
|
||||
else {
|
||||
|
||||
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
|
||||
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
|
||||
}
|
||||
|
||||
DecimalFormat df = new DecimalFormat("##");
|
||||
|
||||
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- //
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Scanner scr = new Scanner(System.in);
|
||||
ArrayList<Integer> gamesToAdd = new ArrayList<Integer>();
|
||||
ArrayList<Game> games = new ArrayList<Game>();
|
||||
String line = scr.nextLine();
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
// Fill list with requested ids
|
||||
while(true) {
|
||||
|
||||
if(line.equals("FIM")) break;
|
||||
|
||||
gamesToAdd.add(Integer.parseInt(line));
|
||||
|
||||
line = scr.nextLine();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
// Add requested ids to games list
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Start to explode CSV file
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
if(gamesToAdd.contains(Integer.parseInt(line.substring(0, line.indexOf(','))))) {
|
||||
|
||||
Game game = new Game();
|
||||
|
||||
game.read(line);
|
||||
games.add(game);
|
||||
}
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Initialize bench log
|
||||
int c_compares = 0;
|
||||
long t_begin = System.currentTimeMillis();
|
||||
|
||||
Collections.sort(games);
|
||||
|
||||
// Search in games list by name
|
||||
line = scr.nextLine();
|
||||
|
||||
while(true) {
|
||||
|
||||
if(line.equals("FIM")) break;
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
boolean found = false;
|
||||
|
||||
int low = 0;
|
||||
int high = games.size() - 1;
|
||||
|
||||
while(low <= high) {
|
||||
|
||||
int mid = low + (high - low) / 2;
|
||||
|
||||
c_compares++;
|
||||
|
||||
if(games.get(mid).name.compareTo(line) == 0) {
|
||||
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
else if(games.get(mid).name.compareTo(line) < 0) {
|
||||
|
||||
c_compares++;
|
||||
low = mid + 1;
|
||||
}
|
||||
else {
|
||||
|
||||
c_compares++;
|
||||
high = mid - 1;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
System.out.println(found ? "SIM" : "NAO");
|
||||
|
||||
line = scr.nextLine();
|
||||
}
|
||||
|
||||
Arq.openWrite("753045_sequencial.txt");
|
||||
Arq.print("753045\t" + (System.currentTimeMillis() - t_begin) + "ms\t" + c_compares);
|
||||
Arq.close();
|
||||
|
||||
scr.close();
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
840010
|
||||
866510
|
||||
1970560
|
||||
411740
|
||||
1509590
|
||||
458520
|
||||
920210
|
||||
1444020
|
||||
1232460
|
||||
2026070
|
||||
258880
|
||||
295250
|
||||
299500
|
||||
574080
|
||||
598780
|
||||
1217190
|
||||
257730
|
||||
1807730
|
||||
773670
|
||||
1803150
|
||||
1573070
|
||||
513930
|
||||
385250
|
||||
261880
|
||||
533300
|
||||
542340
|
||||
1209040
|
||||
8790
|
||||
8000
|
||||
415150
|
||||
2012500
|
||||
691150
|
||||
283370
|
||||
249650
|
||||
268870
|
||||
1172510
|
||||
927890
|
||||
25700
|
||||
281610
|
||||
485610
|
||||
1276850
|
||||
722340
|
||||
1499640
|
||||
1848450
|
||||
615700
|
||||
744980
|
||||
10180
|
||||
234390
|
||||
1641670
|
||||
427520
|
||||
FIM
|
||||
Bobbi Adventure
|
||||
The Test: Hypothesis Rising
|
||||
Epic Cards Battle 2 (TCG)
|
||||
Omensight: Definitive Edition
|
||||
Gray Matter
|
||||
The Legend of Bean
|
||||
Armored Warfare
|
||||
Void Slayer
|
||||
RacetronicVR
|
||||
The Amazing American Circus
|
||||
Your Quest
|
||||
HistoryMaker VR
|
||||
WE ARE FOOTBALL
|
||||
Rise of Insanity
|
||||
Aragami
|
||||
BONEWORKS
|
||||
CAGE
|
||||
Saku Saku: Love Blooms with the Cherry Blossoms
|
||||
Kill The Bad Guy
|
||||
Deisim
|
||||
Redactem
|
||||
Xuan-Yuan Sword: The Gate of Firmament
|
||||
Subspace Continuum
|
||||
DRAGON BALL XENOVERSE
|
||||
RiotZ
|
||||
Stephen's Sausage Roll
|
||||
Tavern Tycoon - Dragon's Hangover
|
||||
Child of Light
|
||||
Heart and Seoul
|
||||
Tank Destroyer
|
||||
Claire
|
||||
MONOLISK
|
||||
Cinderella Escape 2 Revenge
|
||||
Flat Heroes
|
||||
The Political Machine 2016
|
||||
AFFECTED: The Manor - The Complete Edition
|
||||
QUAKE III: Team Arena
|
||||
Woodcutter Simulator 2013
|
||||
Dawn of Man
|
||||
FIM
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
SIM
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
NAO
|
||||
|
|
@ -0,0 +1,739 @@
|
|||
/**
|
||||
|
||||
* @file Game.java
|
||||
* @author Pedro Lopes
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Scanner;
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
class GameList {
|
||||
|
||||
private Game[] array;
|
||||
private int n;
|
||||
|
||||
public GameList() {}
|
||||
|
||||
public GameList(int size) {
|
||||
|
||||
array = new Game[size];
|
||||
n = 0;
|
||||
}
|
||||
|
||||
public void print() {
|
||||
|
||||
for(int i = 0; i < n; i++) {
|
||||
|
||||
System.out.print("[" + i + "] ");
|
||||
|
||||
array[i].print();
|
||||
}
|
||||
}
|
||||
|
||||
public void insertBegin(Game game) throws Exception {
|
||||
|
||||
if(n >= array.length) throw new Exception("x Insert error: Full list!");
|
||||
|
||||
for(int i = n; i > 0; i--) array[i] = array[i - 1];
|
||||
|
||||
array[0] = game;
|
||||
n++;
|
||||
}
|
||||
|
||||
public void insertEnd(Game game) throws Exception {
|
||||
|
||||
if(n >= array.length) throw new Exception("x Insert error: Full list");
|
||||
|
||||
array[n] = game;
|
||||
n++;
|
||||
}
|
||||
|
||||
public void insert(Game game, int pos) throws Exception {
|
||||
|
||||
if(n >= array.length || pos < 0 || pos > n) throw new Exception("x Insert error: Full list / Invalid pos");
|
||||
|
||||
for(int i = n; i > pos; i--) array[i] = array[i - 1];
|
||||
|
||||
array[pos] = game;
|
||||
n++;
|
||||
}
|
||||
|
||||
public Game removeBegin() throws Exception {
|
||||
|
||||
if(n == 0) throw new Exception("x Remove error: Empty list");
|
||||
|
||||
Game resp = array[0];
|
||||
n--;
|
||||
|
||||
for(int i = 0; i < n; i++) array[i] = array[i + 1];
|
||||
return resp;
|
||||
}
|
||||
|
||||
public Game removeEnd() throws Exception {
|
||||
|
||||
if(n == 0) throw new Exception("x Remove error: Empty list");
|
||||
return array[--n];
|
||||
}
|
||||
|
||||
public Game remove(int pos) throws Exception {
|
||||
|
||||
if(n == 0 || pos < 0 || pos >= n) throw new Exception("x Remove error: Empty list / Invalid pos");
|
||||
|
||||
Game resp = array[pos];
|
||||
n--;
|
||||
|
||||
for(int i = pos; i < n; i++) array[i] = array[i + 1];
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
class Game {
|
||||
|
||||
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
|
||||
|
||||
private String name, owners, website, developers;
|
||||
private ArrayList<String> languages, genres;
|
||||
private Date release_date;
|
||||
private int app_id, age, dlcs, avg_playtime;
|
||||
private float price, upvotes;
|
||||
private boolean windows, mac, linux;
|
||||
|
||||
public Game() {
|
||||
|
||||
this.name = this.owners = this.website = this.developers = null;
|
||||
this.languages = new ArrayList<String>();
|
||||
this.genres = new ArrayList<String>();
|
||||
this.release_date = null;
|
||||
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
|
||||
this.price = this.upvotes = -1;
|
||||
this.windows = this.mac = this.linux = false;
|
||||
}
|
||||
|
||||
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
|
||||
|
||||
this.name = name;
|
||||
this.owners = owners;
|
||||
this.website = website;
|
||||
this.developers = developers;
|
||||
this.languages = languages;
|
||||
this.genres = genres;
|
||||
this.release_date = release_date;
|
||||
this.app_id = app_id;
|
||||
this.age = age;
|
||||
this.dlcs = dlcs;
|
||||
this.upvotes = upvotes;
|
||||
this.avg_playtime = avg_playtime;
|
||||
this.price = price;
|
||||
this.windows = windows;
|
||||
this.mac = mac;
|
||||
this.linux = linux;
|
||||
}
|
||||
|
||||
public void setName(String name) { this.name = name; }
|
||||
public void setOwners(String owners) { this.owners = owners; }
|
||||
public void setWebsite(String website) { this.website = website; }
|
||||
public void setDevelopers(String developers) { this.developers = developers; }
|
||||
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
|
||||
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
|
||||
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
|
||||
public void setAppId(int app_id) { this.app_id = app_id; }
|
||||
public void setAge(int age) { this.age = age; }
|
||||
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
|
||||
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
|
||||
public void setPrice(float price) { this.price = price; }
|
||||
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
|
||||
public void setWindows(boolean windows) { this.windows = windows; }
|
||||
public void setMac(boolean mac) { this.mac = mac; }
|
||||
public void setLinux(boolean linux) { this.linux = linux; }
|
||||
|
||||
public String getName() { return this.name; }
|
||||
public String getOwners() { return this.owners; }
|
||||
public String getWebsite() { return this.website; }
|
||||
public String getDevelopers() { return this.developers; }
|
||||
public ArrayList<String> getLanguages() { return this.languages; }
|
||||
public ArrayList<String> getGenres() { return this.genres; }
|
||||
public Date getReleaseDate() { return this.release_date; }
|
||||
public int getAppId() { return this.app_id; }
|
||||
public int getAge() { return this.age; }
|
||||
public int getDlcs() { return this.dlcs; }
|
||||
public int getAvgPlaytime() { return this.avg_playtime; }
|
||||
public float getPrice() { return this.price; }
|
||||
public float getUpvotes() { return this.upvotes; }
|
||||
public boolean getWindows() { return this.windows; }
|
||||
public boolean getMac() { return this.mac; }
|
||||
public boolean getLinux() { return this.linux; }
|
||||
|
||||
public Game clone() {
|
||||
|
||||
Game cloned = new Game();
|
||||
|
||||
cloned.name = this.name;
|
||||
cloned.owners = this.owners;
|
||||
cloned.website = this.website;
|
||||
cloned.developers = this.developers;
|
||||
cloned.languages = this.languages;
|
||||
cloned.genres = this.genres;
|
||||
cloned.release_date = this.release_date;
|
||||
cloned.app_id = this.app_id;
|
||||
cloned.age = this.age;
|
||||
cloned.dlcs = this.dlcs;
|
||||
cloned.avg_playtime = this.avg_playtime;
|
||||
cloned.price = this.price;
|
||||
cloned.upvotes = this.upvotes;
|
||||
cloned.windows = this.windows;
|
||||
cloned.mac = this.mac;
|
||||
cloned.linux = this.linux;
|
||||
|
||||
return cloned;
|
||||
}
|
||||
|
||||
public static Game gameSearch(ArrayList<Game> games, int app_id) {
|
||||
|
||||
for(Game game : games) if(game.getAppId() == app_id) return game;
|
||||
return null;
|
||||
}
|
||||
|
||||
public void read(String line) {
|
||||
|
||||
char c_search;
|
||||
int index = 0, atr_index = 0;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AppID"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.app_id = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Name"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.name = line.substring(atr_index, index);
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find release date
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
SimpleDateFormat df;
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else {
|
||||
|
||||
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
|
||||
|
||||
c_search = ',';
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
try { this.release_date = df.parse(line.substring(atr_index, index)); }
|
||||
catch (java.text.ParseException e) { e.printStackTrace(); }
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Owners"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.owners = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Age"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.age = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Price"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.price = Float.parseFloat(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "DLCs"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Languages"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ']') {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') index++;
|
||||
else if(line.charAt(index) == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
else if(line.charAt(index) == '\'') {
|
||||
|
||||
int wordStart = index + 1;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == '\'') {
|
||||
|
||||
this.languages.add(line.substring(wordStart, index));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Website"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.website = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Windows"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Mac"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Linux"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Upvotes"
|
||||
int positives, negatives;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
positives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
negatives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AVG Playtime"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Developers"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.developers = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Genres"
|
||||
if(index < line.length() - 1) {
|
||||
|
||||
if(line.charAt(index) == ',') atr_index = ++index;
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
else if(line.charAt(index) == '\"') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, line.length() - 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else this.genres.add(line.substring(atr_index, line.length()));
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
||||
public void print() {
|
||||
|
||||
String avg_pt = null;
|
||||
|
||||
if(this.avg_playtime == 0) avg_pt = "null ";
|
||||
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
|
||||
else {
|
||||
|
||||
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
|
||||
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
|
||||
}
|
||||
|
||||
DecimalFormat df = new DecimalFormat("##");
|
||||
|
||||
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
|
||||
}
|
||||
|
||||
public static String getGameData(String csvFile, int app_id) throws Exception {
|
||||
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
FileInputStream fstream = new FileInputStream(csvFile);
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Start to explode CSV file
|
||||
String line;
|
||||
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
String id_s = Integer.toString(app_id);
|
||||
|
||||
if(line.substring(0, line.indexOf(',')).equals(id_s)) {
|
||||
|
||||
fstream.close();
|
||||
br.close();
|
||||
return line;
|
||||
}
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
return null;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- //
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Scanner scr = new Scanner(System.in);
|
||||
ArrayList<Game> gamesFull = new ArrayList<Game>();
|
||||
String line;
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
// Fill full games list
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Start to explode CSV file
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
Game game = new Game();
|
||||
|
||||
game.read(line);
|
||||
gamesFull.add(game);
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Fill production games list
|
||||
GameList games = new GameList(500);
|
||||
|
||||
line = scr.nextLine();
|
||||
|
||||
while(true) {
|
||||
|
||||
if(line.compareTo("FIM") == 0) break;
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
Game found = gameSearch(gamesFull, Integer.parseInt(line));
|
||||
|
||||
if(found != null) games.insertEnd(found);
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
line = scr.nextLine();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Execute operations
|
||||
int n_ops = Integer.parseInt(scr.nextLine());
|
||||
|
||||
for(int x = 0; x < n_ops; x++) {
|
||||
|
||||
line = scr.nextLine();
|
||||
|
||||
String op = line.substring(0, 2);
|
||||
int app_id;
|
||||
|
||||
// -------------------------------- //
|
||||
|
||||
// Identify operation
|
||||
if(op.equals("II")) {
|
||||
|
||||
app_id = Integer.parseInt(line.substring(3, line.length()));
|
||||
|
||||
games.insertBegin(gameSearch(gamesFull, app_id));
|
||||
}
|
||||
else if(op.equals("IF")) {
|
||||
|
||||
app_id = Integer.parseInt(line.substring(3, line.length()));
|
||||
|
||||
games.insertEnd(gameSearch(gamesFull, app_id));
|
||||
}
|
||||
else if(op.equals("I*")) {
|
||||
|
||||
int pos = Integer.parseInt(line.substring(3, line.indexOf(" ", 3)));
|
||||
app_id = Integer.parseInt(line.substring(line.indexOf(" ", 3) + 1, line.length()));
|
||||
|
||||
games.insert(gameSearch(gamesFull, app_id), pos);
|
||||
}
|
||||
else if(op.equals("RI")) System.out.println("(R) " + games.removeBegin().getName());
|
||||
else if(op.equals("RF")) System.out.println("(R) " + games.removeEnd().getName());
|
||||
else if(op.equals("R*")) {
|
||||
|
||||
int pos = Integer.parseInt(line.substring(3, line.length()));
|
||||
|
||||
System.out.println("(R) " + games.remove(pos).getName());
|
||||
}
|
||||
}
|
||||
|
||||
games.print();
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
scr.close();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
1189490
|
||||
300550
|
||||
49800
|
||||
1851280
|
||||
1112930
|
||||
275570
|
||||
1276550
|
||||
1096530
|
||||
690510
|
||||
1504570
|
||||
1369470
|
||||
270130
|
||||
336150
|
||||
573210
|
||||
886470
|
||||
1368820
|
||||
951530
|
||||
247370
|
||||
1879330
|
||||
1634290
|
||||
259570
|
||||
941650
|
||||
768450
|
||||
1347140
|
||||
722670
|
||||
711540
|
||||
450170
|
||||
730
|
||||
598550
|
||||
614090
|
||||
809440
|
||||
1923860
|
||||
559010
|
||||
1547380
|
||||
554310
|
||||
1124090
|
||||
292120
|
||||
691930
|
||||
325420
|
||||
663670
|
||||
503820
|
||||
49600
|
||||
49300
|
||||
1631930
|
||||
1038740
|
||||
336760
|
||||
64000
|
||||
487580
|
||||
410890
|
||||
363110
|
||||
FIM
|
||||
20
|
||||
II 1487390
|
||||
II 258520
|
||||
II 1165270
|
||||
II 298140
|
||||
II 213610
|
||||
IF 50510
|
||||
IF 998660
|
||||
IF 1740720
|
||||
I* 10 24720
|
||||
I* 15 439550
|
||||
I* 20 1507410
|
||||
RF
|
||||
RF
|
||||
RF
|
||||
RI
|
||||
RI
|
||||
R* 10
|
||||
RF
|
||||
RF
|
||||
RI
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
(R) Have a Nice Death
|
||||
(R) Sopwith VR
|
||||
(R) Burn Zombie Burn!
|
||||
(R) Sonic Adventure 2
|
||||
(R) Rhiannon: Curse of the Four Branches
|
||||
(R) Faefever
|
||||
(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit
|
||||
(R) Higurashi When They Cry Hou - Ch.2 Watanagashi
|
||||
(R) Synthesis Universe -Episode 00-
|
||||
[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
|
||||
[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
|
||||
[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
|
||||
[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
|
||||
[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
|
||||
[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
|
||||
[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
|
||||
[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation]
|
||||
[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
|
||||
[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
|
||||
[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
|
||||
[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie]
|
||||
[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
|
||||
[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
|
||||
[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
|
||||
[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
|
||||
[16] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
|
||||
[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
|
||||
[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
|
||||
[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
|
||||
[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
|
||||
[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
|
||||
[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
|
||||
[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
|
||||
[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
|
||||
[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
|
||||
[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
|
||||
[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
|
||||
[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
|
||||
[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
|
||||
[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
|
||||
[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
|
||||
[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
|
||||
[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
|
||||
[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
|
||||
[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
|
||||
[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
|
||||
[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
|
||||
[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
|
||||
[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
|
||||
[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
|
||||
[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
|
||||
[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
|
||||
[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
|
||||
[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
|
||||
[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
|
||||
[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
|
||||
[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
|
||||
[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
|
||||
[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
|
||||
[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
|
||||
[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
(R) Have a Nice Death
|
||||
(R) Sopwith VR
|
||||
(R) Burn Zombie Burn!
|
||||
(R) Sonic Adventure 2
|
||||
(R) Rhiannon: Curse of the Four Branches
|
||||
(R) Faefever
|
||||
(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit
|
||||
(R) Higurashi When They Cry Hou - Ch.2 Watanagashi
|
||||
(R) Synthesis Universe -Episode 00-
|
||||
[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
|
||||
[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
|
||||
[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
|
||||
[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
|
||||
[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
|
||||
[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
|
||||
[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
|
||||
[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation]
|
||||
[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
|
||||
[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
|
||||
[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
|
||||
[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie]
|
||||
[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
|
||||
[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
|
||||
[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
|
||||
[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
|
||||
[16] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
|
||||
[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
|
||||
[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
|
||||
[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
|
||||
[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
|
||||
[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
|
||||
[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
|
||||
[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
|
||||
[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
|
||||
[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
|
||||
[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
|
||||
[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
|
||||
[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
|
||||
[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
|
||||
[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
|
||||
[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
|
||||
[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
|
||||
[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
|
||||
[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
|
||||
[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
|
||||
[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
|
||||
[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
|
||||
[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
|
||||
[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
|
||||
[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
|
||||
[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
|
||||
[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
|
||||
[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
|
||||
[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
|
||||
[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
|
||||
[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
|
||||
[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
|
||||
[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
|
||||
[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
|
||||
[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
|
||||
[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]
|
||||
|
|
@ -0,0 +1,669 @@
|
|||
/**
|
||||
|
||||
* @file Game.java
|
||||
* @author Pedro Lopes
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Scanner;
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
class GameStack {
|
||||
|
||||
private Game[] array;
|
||||
private int last;
|
||||
|
||||
public GameStack() {}
|
||||
|
||||
public GameStack(int size) {
|
||||
|
||||
array = new Game[size];
|
||||
last = 0;
|
||||
}
|
||||
|
||||
public void insert(Game x) throws Exception {
|
||||
|
||||
if(last + 1 == array.length) throw new Exception("x Insert error: Full stack");
|
||||
|
||||
array[last++] = x;
|
||||
}
|
||||
|
||||
public Game remove() throws Exception {
|
||||
|
||||
if(last == 0) throw new Exception("x Remove error: Empty stack");
|
||||
return array[--last];
|
||||
}
|
||||
|
||||
public void print() {
|
||||
|
||||
for(int i = 0; i < last; i++) {
|
||||
|
||||
System.out.print("[" + i + "] ");
|
||||
array[i].print();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
class Game {
|
||||
|
||||
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
|
||||
|
||||
private String name, owners, website, developers;
|
||||
private ArrayList<String> languages, genres;
|
||||
private Date release_date;
|
||||
private int app_id, age, dlcs, avg_playtime;
|
||||
private float price, upvotes;
|
||||
private boolean windows, mac, linux;
|
||||
|
||||
public Game() {
|
||||
|
||||
this.name = this.owners = this.website = this.developers = null;
|
||||
this.languages = new ArrayList<String>();
|
||||
this.genres = new ArrayList<String>();
|
||||
this.release_date = null;
|
||||
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
|
||||
this.price = this.upvotes = -1;
|
||||
this.windows = this.mac = this.linux = false;
|
||||
}
|
||||
|
||||
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
|
||||
|
||||
this.name = name;
|
||||
this.owners = owners;
|
||||
this.website = website;
|
||||
this.developers = developers;
|
||||
this.languages = languages;
|
||||
this.genres = genres;
|
||||
this.release_date = release_date;
|
||||
this.app_id = app_id;
|
||||
this.age = age;
|
||||
this.dlcs = dlcs;
|
||||
this.upvotes = upvotes;
|
||||
this.avg_playtime = avg_playtime;
|
||||
this.price = price;
|
||||
this.windows = windows;
|
||||
this.mac = mac;
|
||||
this.linux = linux;
|
||||
}
|
||||
|
||||
public void setName(String name) { this.name = name; }
|
||||
public void setOwners(String owners) { this.owners = owners; }
|
||||
public void setWebsite(String website) { this.website = website; }
|
||||
public void setDevelopers(String developers) { this.developers = developers; }
|
||||
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
|
||||
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
|
||||
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
|
||||
public void setAppId(int app_id) { this.app_id = app_id; }
|
||||
public void setAge(int age) { this.age = age; }
|
||||
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
|
||||
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
|
||||
public void setPrice(float price) { this.price = price; }
|
||||
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
|
||||
public void setWindows(boolean windows) { this.windows = windows; }
|
||||
public void setMac(boolean mac) { this.mac = mac; }
|
||||
public void setLinux(boolean linux) { this.linux = linux; }
|
||||
|
||||
public String getName() { return this.name; }
|
||||
public String getOwners() { return this.owners; }
|
||||
public String getWebsite() { return this.website; }
|
||||
public String getDevelopers() { return this.developers; }
|
||||
public ArrayList<String> getLanguages() { return this.languages; }
|
||||
public ArrayList<String> getGenres() { return this.genres; }
|
||||
public Date getReleaseDate() { return this.release_date; }
|
||||
public int getAppId() { return this.app_id; }
|
||||
public int getAge() { return this.age; }
|
||||
public int getDlcs() { return this.dlcs; }
|
||||
public int getAvgPlaytime() { return this.avg_playtime; }
|
||||
public float getPrice() { return this.price; }
|
||||
public float getUpvotes() { return this.upvotes; }
|
||||
public boolean getWindows() { return this.windows; }
|
||||
public boolean getMac() { return this.mac; }
|
||||
public boolean getLinux() { return this.linux; }
|
||||
|
||||
public Game clone() {
|
||||
|
||||
Game cloned = new Game();
|
||||
|
||||
cloned.name = this.name;
|
||||
cloned.owners = this.owners;
|
||||
cloned.website = this.website;
|
||||
cloned.developers = this.developers;
|
||||
cloned.languages = this.languages;
|
||||
cloned.genres = this.genres;
|
||||
cloned.release_date = this.release_date;
|
||||
cloned.app_id = this.app_id;
|
||||
cloned.age = this.age;
|
||||
cloned.dlcs = this.dlcs;
|
||||
cloned.avg_playtime = this.avg_playtime;
|
||||
cloned.price = this.price;
|
||||
cloned.upvotes = this.upvotes;
|
||||
cloned.windows = this.windows;
|
||||
cloned.mac = this.mac;
|
||||
cloned.linux = this.linux;
|
||||
|
||||
return cloned;
|
||||
}
|
||||
|
||||
public static Game gameSearch(ArrayList<Game> games, int app_id) {
|
||||
|
||||
for(Game game : games) if(game.getAppId() == app_id) return game;
|
||||
return null;
|
||||
}
|
||||
|
||||
public void read(String line) {
|
||||
|
||||
char c_search;
|
||||
int index = 0, atr_index = 0;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AppID"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.app_id = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Name"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.name = line.substring(atr_index, index);
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find release date
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
SimpleDateFormat df;
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else {
|
||||
|
||||
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
|
||||
|
||||
c_search = ',';
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
try { this.release_date = df.parse(line.substring(atr_index, index)); }
|
||||
catch (java.text.ParseException e) { e.printStackTrace(); }
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Owners"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.owners = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Age"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.age = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Price"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.price = Float.parseFloat(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "DLCs"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Languages"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ']') {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') index++;
|
||||
else if(line.charAt(index) == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
else if(line.charAt(index) == '\'') {
|
||||
|
||||
int wordStart = index + 1;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == '\'') {
|
||||
|
||||
this.languages.add(line.substring(wordStart, index));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Website"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.website = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Windows"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Mac"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Linux"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Upvotes"
|
||||
int positives, negatives;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
positives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
negatives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AVG Playtime"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Developers"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.developers = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Genres"
|
||||
if(index < line.length() - 1) {
|
||||
|
||||
if(line.charAt(index) == ',') atr_index = ++index;
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
else if(line.charAt(index) == '\"') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, line.length() - 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else this.genres.add(line.substring(atr_index, line.length()));
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
||||
public void print() {
|
||||
|
||||
String avg_pt = null;
|
||||
|
||||
if(this.avg_playtime == 0) avg_pt = "null ";
|
||||
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
|
||||
else {
|
||||
|
||||
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
|
||||
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
|
||||
}
|
||||
|
||||
DecimalFormat df = new DecimalFormat("##");
|
||||
|
||||
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
public static String getGameData(String csvFile, int app_id) throws Exception {
|
||||
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
FileInputStream fstream = new FileInputStream(csvFile);
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Start to explode CSV file
|
||||
String line;
|
||||
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
String id_s = Integer.toString(app_id);
|
||||
|
||||
if(line.substring(0, line.indexOf(',')).equals(id_s)) {
|
||||
|
||||
fstream.close();
|
||||
br.close();
|
||||
return line;
|
||||
}
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
return null;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- //
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Scanner scr = new Scanner(System.in);
|
||||
ArrayList<Game> gamesFull = new ArrayList<Game>();
|
||||
String line;
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
// Fill full games list
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Start to explode CSV file
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
Game game = new Game();
|
||||
|
||||
game.read(line);
|
||||
gamesFull.add(game);
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Fill production games list
|
||||
GameStack games = new GameStack(500);
|
||||
|
||||
line = scr.nextLine();
|
||||
|
||||
while(true) {
|
||||
|
||||
if(line.compareTo("FIM") == 0) break;
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
Game found = gameSearch(gamesFull, Integer.parseInt(line));
|
||||
|
||||
if(found != null) games.insert(found);
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
line = scr.nextLine();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Execute operations
|
||||
int n_ops = Integer.parseInt(scr.nextLine());
|
||||
|
||||
for(int x = 0; x < n_ops; x++) {
|
||||
|
||||
line = scr.nextLine();
|
||||
|
||||
// -------------------------------- //
|
||||
|
||||
// Identify operation
|
||||
if(line.charAt(0) == 'I') games.insert(gameSearch(gamesFull, Integer.parseInt(line.substring(2, line.length()))));
|
||||
else if(line.charAt(0) == 'R') System.out.println("(R) " + games.remove().getName());
|
||||
}
|
||||
|
||||
games.print();
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
scr.close();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
1189490
|
||||
300550
|
||||
49800
|
||||
1851280
|
||||
1112930
|
||||
275570
|
||||
1276550
|
||||
1096530
|
||||
690510
|
||||
1504570
|
||||
1369470
|
||||
270130
|
||||
336150
|
||||
573210
|
||||
886470
|
||||
1368820
|
||||
951530
|
||||
247370
|
||||
1879330
|
||||
1634290
|
||||
259570
|
||||
941650
|
||||
768450
|
||||
1347140
|
||||
722670
|
||||
711540
|
||||
450170
|
||||
730
|
||||
598550
|
||||
614090
|
||||
809440
|
||||
1923860
|
||||
559010
|
||||
1547380
|
||||
554310
|
||||
1124090
|
||||
292120
|
||||
691930
|
||||
325420
|
||||
663670
|
||||
503820
|
||||
49600
|
||||
49300
|
||||
1631930
|
||||
1038740
|
||||
336760
|
||||
64000
|
||||
487580
|
||||
410890
|
||||
363110
|
||||
FIM
|
||||
20
|
||||
I 1487390
|
||||
I 258520
|
||||
I 1165270
|
||||
I 298140
|
||||
I 213610
|
||||
I 50510
|
||||
I 998660
|
||||
I 1740720
|
||||
I 24720
|
||||
I 439550
|
||||
I 1507410
|
||||
R
|
||||
R
|
||||
R
|
||||
R
|
||||
R
|
||||
R
|
||||
R
|
||||
R
|
||||
R
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
(R) Coloring Book for Kids
|
||||
(R) 'n Verlore Verstand
|
||||
(R) SPORE™ Galactic Adventures
|
||||
(R) Have a Nice Death
|
||||
(R) Sopwith VR
|
||||
(R) Burn Zombie Burn!
|
||||
(R) Sonic Adventure 2
|
||||
(R) Rhiannon: Curse of the Four Branches
|
||||
(R) Synthesis Universe -Episode 00-
|
||||
[0] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
|
||||
[1] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
|
||||
[2] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
|
||||
[3] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
|
||||
[4] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
|
||||
[5] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
|
||||
[6] 1276550 Faefever Jul/2020 50000 - 100000 0 0.00 0 [English] null true false false 88% null Monkey Wizard Entertainment [Adventure, Casual, Free to Play, Indie]
|
||||
[7] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
|
||||
[8] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
|
||||
[9] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
|
||||
[10] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
|
||||
[11] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
|
||||
[12] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
|
||||
[13] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
|
||||
[14] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
|
||||
[15] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
|
||||
[16] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
|
||||
[17] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
|
||||
[18] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
|
||||
[19] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
|
||||
[20] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
|
||||
[21] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
|
||||
[22] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
|
||||
[23] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
|
||||
[24] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
|
||||
[25] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
|
||||
[26] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
|
||||
[27] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
|
||||
[28] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
|
||||
[29] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
|
||||
[30] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
|
||||
[31] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
|
||||
[32] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
|
||||
[33] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
|
||||
[34] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
|
||||
[35] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
|
||||
[36] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
|
||||
[37] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
|
||||
[38] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
|
||||
[39] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
|
||||
[40] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
|
||||
[41] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
|
||||
[42] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
|
||||
[43] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
|
||||
[44] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
|
||||
[45] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
|
||||
[46] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
|
||||
[47] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]
|
||||
[48] 410890 Higurashi When They Cry Hou - Ch.2 Watanagashi Nov/2015 50000 - 100000 0 3.99 0 [English, Japanese] http://www.mangagamer.org/07thExpansion/ true true true 97% 5h 11m 07th Expansion [Adventure]
|
||||
[49] 363110 NOBUNAGA'S AMBITION: Tendou with Power Up Kit Jun/2015 50000 - 100000 0 54.99 0 [Japanese] http://www.gamecity.ne.jp/steam/tendo.html true false false 77% null KOEI TECMO GAMES CO., LTD. [Strategy]
|
||||
[50] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified ChiWnese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
|
||||
[51] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
(R) Coloring Book for Kids
|
||||
(R) 'n Verlore Verstand
|
||||
(R) SPORE™ Galactic Adventures
|
||||
(R) Have a Nice Death
|
||||
(R) Sopwith VR
|
||||
(R) Burn Zombie Burn!
|
||||
(R) Sonic Adventure 2
|
||||
(R) Rhiannon: Curse of the Four Branches
|
||||
(R) Synthesis Universe -Episode 00-
|
||||
[0] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
|
||||
[1] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
|
||||
[2] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
|
||||
[3] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
|
||||
[4] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
|
||||
[5] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
|
||||
[6] 1276550 Faefever Jul/2020 50000 - 100000 0 0.00 0 [English] null true false false 88% null Monkey Wizard Entertainment [Adventure, Casual, Free to Play, Indie]
|
||||
[7] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
|
||||
[8] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
|
||||
[9] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
|
||||
[10] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
|
||||
[11] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
|
||||
[12] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
|
||||
[13] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
|
||||
[14] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
|
||||
[15] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
|
||||
[16] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
|
||||
[17] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
|
||||
[18] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
|
||||
[19] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
|
||||
[20] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
|
||||
[21] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
|
||||
[22] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
|
||||
[23] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
|
||||
[24] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
|
||||
[25] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
|
||||
[26] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
|
||||
[27] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
|
||||
[28] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
|
||||
[29] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
|
||||
[30] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
|
||||
[31] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
|
||||
[32] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
|
||||
[33] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
|
||||
[34] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
|
||||
[35] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
|
||||
[36] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
|
||||
[37] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
|
||||
[38] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
|
||||
[39] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
|
||||
[40] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
|
||||
[41] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
|
||||
[42] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
|
||||
[43] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
|
||||
[44] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
|
||||
[45] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
|
||||
[46] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
|
||||
[47] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]
|
||||
[48] 410890 Higurashi When They Cry Hou - Ch.2 Watanagashi Nov/2015 50000 - 100000 0 3.99 0 [English, Japanese] http://www.mangagamer.org/07thExpansion/ true true true 97% 5h 11m 07th Expansion [Adventure]
|
||||
[49] 363110 NOBUNAGA'S AMBITION: Tendou with Power Up Kit Jun/2015 50000 - 100000 0 54.99 0 [Japanese] http://www.gamecity.ne.jp/steam/tendo.html true false false 77% null KOEI TECMO GAMES CO., LTD. [Strategy]
|
||||
[50] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
|
||||
[51] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
|
||||
|
|
@ -0,0 +1,714 @@
|
|||
/**
|
||||
|
||||
* @file Game.java
|
||||
* @author Pedro Lopes
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Scanner;
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
class GameQueue {
|
||||
|
||||
private Game[] array;
|
||||
private int first;
|
||||
private int last;
|
||||
|
||||
public GameQueue() {}
|
||||
|
||||
public GameQueue(int size) {
|
||||
|
||||
array = new Game[size + 1];
|
||||
first = last = 0;
|
||||
}
|
||||
|
||||
public void insert(Game movie) throws Exception {
|
||||
|
||||
if(((last + 1) % array.length) == first) throw new Exception("x Insert error: Full queue");
|
||||
|
||||
array[last] = movie;
|
||||
last = (last + 1) % array.length;
|
||||
}
|
||||
|
||||
public Game remove() throws Exception {
|
||||
|
||||
if(first == last) throw new Exception("x Remove error: Empty queue");
|
||||
|
||||
Game resp = array[first];
|
||||
first = (first + 1) % array.length;
|
||||
return resp;
|
||||
}
|
||||
|
||||
public void print() {
|
||||
|
||||
int c = 0;
|
||||
|
||||
for(int i = first; i != last; i = ((i + 1) % array.length), c++) {
|
||||
|
||||
System.out.print("[" + ((last - first) == 1 ? "0" : c) + "] ");
|
||||
|
||||
array[i].print();
|
||||
}
|
||||
}
|
||||
|
||||
public int length() { return last - first; }
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
class Game {
|
||||
|
||||
static SimpleDateFormat default_dateFormat = new SimpleDateFormat("MMM/yyyy", Locale.ENGLISH);
|
||||
|
||||
private String name, owners, website, developers;
|
||||
private ArrayList<String> languages, genres;
|
||||
private Date release_date;
|
||||
private int app_id, age, dlcs, avg_playtime;
|
||||
private float price, upvotes;
|
||||
private boolean windows, mac, linux;
|
||||
|
||||
public Game() {
|
||||
|
||||
this.name = this.owners = this.website = this.developers = null;
|
||||
this.languages = new ArrayList<String>();
|
||||
this.genres = new ArrayList<String>();
|
||||
this.release_date = null;
|
||||
this.app_id = this.age = this.dlcs = this.avg_playtime = -1;
|
||||
this.price = this.upvotes = -1;
|
||||
this.windows = this.mac = this.linux = false;
|
||||
}
|
||||
|
||||
public Game(String name, String owners, String website, String developers, ArrayList<String> languages, ArrayList<String> genres, Date release_date, int app_id, int age, int dlcs, int upvotes, int avg_playtime, float price, boolean windows, boolean mac, boolean linux) {
|
||||
|
||||
this.name = name;
|
||||
this.owners = owners;
|
||||
this.website = website;
|
||||
this.developers = developers;
|
||||
this.languages = languages;
|
||||
this.genres = genres;
|
||||
this.release_date = release_date;
|
||||
this.app_id = app_id;
|
||||
this.age = age;
|
||||
this.dlcs = dlcs;
|
||||
this.upvotes = upvotes;
|
||||
this.avg_playtime = avg_playtime;
|
||||
this.price = price;
|
||||
this.windows = windows;
|
||||
this.mac = mac;
|
||||
this.linux = linux;
|
||||
}
|
||||
|
||||
public void setName(String name) { this.name = name; }
|
||||
public void setOwners(String owners) { this.owners = owners; }
|
||||
public void setWebsite(String website) { this.website = website; }
|
||||
public void setDevelopers(String developers) { this.developers = developers; }
|
||||
public void setLanguages(ArrayList<String> languages) { this.languages = languages; }
|
||||
public void setGenres(ArrayList<String> genres) { this.genres = genres; }
|
||||
public void setReleaseDate(Date release_date) { this.release_date = release_date; }
|
||||
public void setAppId(int app_id) { this.app_id = app_id; }
|
||||
public void setAge(int age) { this.age = age; }
|
||||
public void setDlcs(int dlcs) { this.dlcs = dlcs; }
|
||||
public void setAvgPlaytime(int avg_playtime) { this.avg_playtime = avg_playtime; }
|
||||
public void setPrice(float price) { this.price = price; }
|
||||
public void setUpvotes(float upvotes) { this.upvotes = upvotes; }
|
||||
public void setWindows(boolean windows) { this.windows = windows; }
|
||||
public void setMac(boolean mac) { this.mac = mac; }
|
||||
public void setLinux(boolean linux) { this.linux = linux; }
|
||||
|
||||
public String getName() { return this.name; }
|
||||
public String getOwners() { return this.owners; }
|
||||
public String getWebsite() { return this.website; }
|
||||
public String getDevelopers() { return this.developers; }
|
||||
public ArrayList<String> getLanguages() { return this.languages; }
|
||||
public ArrayList<String> getGenres() { return this.genres; }
|
||||
public Date getReleaseDate() { return this.release_date; }
|
||||
public int getAppId() { return this.app_id; }
|
||||
public int getAge() { return this.age; }
|
||||
public int getDlcs() { return this.dlcs; }
|
||||
public int getAvgPlaytime() { return this.avg_playtime; }
|
||||
public float getPrice() { return this.price; }
|
||||
public float getUpvotes() { return this.upvotes; }
|
||||
public boolean getWindows() { return this.windows; }
|
||||
public boolean getMac() { return this.mac; }
|
||||
public boolean getLinux() { return this.linux; }
|
||||
|
||||
public Game clone() {
|
||||
|
||||
Game cloned = new Game();
|
||||
|
||||
cloned.name = this.name;
|
||||
cloned.owners = this.owners;
|
||||
cloned.website = this.website;
|
||||
cloned.developers = this.developers;
|
||||
cloned.languages = this.languages;
|
||||
cloned.genres = this.genres;
|
||||
cloned.release_date = this.release_date;
|
||||
cloned.app_id = this.app_id;
|
||||
cloned.age = this.age;
|
||||
cloned.dlcs = this.dlcs;
|
||||
cloned.avg_playtime = this.avg_playtime;
|
||||
cloned.price = this.price;
|
||||
cloned.upvotes = this.upvotes;
|
||||
cloned.windows = this.windows;
|
||||
cloned.mac = this.mac;
|
||||
cloned.linux = this.linux;
|
||||
|
||||
return cloned;
|
||||
}
|
||||
|
||||
public static Game gameSearch(ArrayList<Game> games, int app_id) {
|
||||
|
||||
for(Game game : games) if(game.getAppId() == app_id) return game;
|
||||
return null;
|
||||
}
|
||||
|
||||
public void read(String line) {
|
||||
|
||||
char c_search;
|
||||
int index = 0, atr_index = 0;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AppID"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.app_id = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Name"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.name = line.substring(atr_index, index);
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find release date
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
SimpleDateFormat df;
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
df = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else {
|
||||
|
||||
df = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
|
||||
|
||||
c_search = ',';
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
try { this.release_date = df.parse(line.substring(atr_index, index)); }
|
||||
catch (java.text.ParseException e) { e.printStackTrace(); }
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Owners"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.owners = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Age"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.age = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Price"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.price = Float.parseFloat(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "DLCs"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.dlcs = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Languages"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ']') {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') index++;
|
||||
else if(line.charAt(index) == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
else if(line.charAt(index) == '\'') {
|
||||
|
||||
int wordStart = index + 1;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == '\'') {
|
||||
|
||||
this.languages.add(line.substring(wordStart, index));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Website"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.website = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Windows"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.windows = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Mac"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.mac = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Linux"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.linux = Boolean.parseBoolean(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Upvotes"
|
||||
int positives, negatives;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
positives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
negatives = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this.upvotes = (float)(positives * 100) / (float)(positives + negatives);
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "AVG Playtime"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.avg_playtime = Integer.parseInt(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Developers"
|
||||
if(line.charAt(atr_index) != ',') {
|
||||
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == c_search) {
|
||||
|
||||
this.developers = line.substring(atr_index, index);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else atr_index = ++index;
|
||||
|
||||
// ---------------------------------- //
|
||||
|
||||
// Find "Genres"
|
||||
if(index < line.length() - 1) {
|
||||
|
||||
if(line.charAt(index) == ',') atr_index = ++index;
|
||||
if(line.charAt(atr_index) == '\"') {
|
||||
|
||||
atr_index++;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line.charAt(index) == ',') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, index));
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
else if(line.charAt(index) == '\"') {
|
||||
|
||||
this.genres.add(line.substring(atr_index, line.length() - 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else this.genres.add(line.substring(atr_index, line.length()));
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
||||
public void print() {
|
||||
|
||||
String avg_pt = null;
|
||||
|
||||
if(this.avg_playtime == 0) avg_pt = "null ";
|
||||
else if(this.avg_playtime < 60) avg_pt = this.avg_playtime + "m ";
|
||||
else {
|
||||
|
||||
if(this.avg_playtime % 60 == 0) avg_pt = this.avg_playtime / 60 + "h ";
|
||||
else avg_pt = (this.avg_playtime / 60) + "h " + (this.avg_playtime % 60) + "m ";
|
||||
}
|
||||
|
||||
DecimalFormat df = new DecimalFormat("##");
|
||||
|
||||
System.out.println(this.app_id + " " + this.name + " " + default_dateFormat.format(this.release_date) + " " + this.owners + " " + this.age + " " + String.format(Locale.ENGLISH, "%.2f", this.price) + " " + this.dlcs + " " + this.languages + " " + this.website + " " + this.windows + " " + this.mac + " " + this.linux + " " + (Float.isNaN(this.upvotes) ? "0% " : df.format(this.upvotes) + "% ") + avg_pt + this.developers + " " + this.genres);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
public static String getGameData(String csvFile, int app_id) throws Exception {
|
||||
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
FileInputStream fstream = new FileInputStream(csvFile);
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Start to explode CSV file
|
||||
String line;
|
||||
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
String id_s = Integer.toString(app_id);
|
||||
|
||||
if(line.substring(0, line.indexOf(',')).equals(id_s)) {
|
||||
|
||||
fstream.close();
|
||||
br.close();
|
||||
return line;
|
||||
}
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
return null;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- //
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
Scanner scr = new Scanner(System.in);
|
||||
ArrayList<Game> gamesFull = new ArrayList<Game>();
|
||||
String line;
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
// Fill full games list
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
FileInputStream fstream = new FileInputStream("/tmp/games.csv");
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Start to explode CSV file
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
Game game = new Game();
|
||||
|
||||
game.read(line);
|
||||
gamesFull.add(game);
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Fill production games list
|
||||
GameQueue games = new GameQueue(5);
|
||||
float total_avgPt = 0, c = 0;
|
||||
|
||||
line = scr.nextLine();
|
||||
|
||||
while(true) {
|
||||
|
||||
if(line.compareTo("FIM") == 0) break;
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
Game found = gameSearch(gamesFull, Integer.parseInt(line));
|
||||
|
||||
if(found != null) {
|
||||
|
||||
try { games.insert(found); }
|
||||
catch(java.lang.Exception e) {
|
||||
|
||||
total_avgPt -= games.remove().getAvgPlaytime();
|
||||
c--;
|
||||
|
||||
games.insert(found);
|
||||
}
|
||||
|
||||
// Print playtime avg
|
||||
total_avgPt += found.getAvgPlaytime();
|
||||
|
||||
System.out.println(Math.round(total_avgPt / ++c));
|
||||
}
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
line = scr.nextLine();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Execute operations
|
||||
int n_ops = Integer.parseInt(scr.nextLine());
|
||||
|
||||
for(int x = 0; x < n_ops; x++) {
|
||||
|
||||
line = scr.nextLine();
|
||||
|
||||
// -------------------------------- //
|
||||
|
||||
System.out.println(line);
|
||||
|
||||
// Identify operation
|
||||
if(line.charAt(0) == 'I') {
|
||||
|
||||
Game found = gameSearch(gamesFull, Integer.parseInt(line.substring(2, line.length())));
|
||||
|
||||
try { games.insert(found); }
|
||||
catch(java.lang.Exception e) {
|
||||
|
||||
total_avgPt -= games.remove().getAvgPlaytime();
|
||||
c--;
|
||||
|
||||
games.insert(found);
|
||||
}
|
||||
|
||||
// Print playtime avg
|
||||
total_avgPt += found.getAvgPlaytime();
|
||||
|
||||
System.out.println(Math.round(total_avgPt / ++c));
|
||||
}
|
||||
else if(line.charAt(0) == 'R') System.out.println("(R) " + games.remove().getName());
|
||||
}
|
||||
|
||||
games.print();
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
scr.close();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
}
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
1189490
|
||||
300550
|
||||
49800
|
||||
1851280
|
||||
1112930
|
||||
275570
|
||||
1276550
|
||||
1096530
|
||||
690510
|
||||
1504570
|
||||
1369470
|
||||
270130
|
||||
336150
|
||||
573210
|
||||
886470
|
||||
1368820
|
||||
951530
|
||||
247370
|
||||
1879330
|
||||
1634290
|
||||
259570
|
||||
941650
|
||||
768450
|
||||
1347140
|
||||
722670
|
||||
711540
|
||||
450170
|
||||
730
|
||||
598550
|
||||
614090
|
||||
809440
|
||||
1923860
|
||||
559010
|
||||
1547380
|
||||
554310
|
||||
1124090
|
||||
292120
|
||||
691930
|
||||
325420
|
||||
663670
|
||||
503820
|
||||
49600
|
||||
49300
|
||||
1631930
|
||||
1038740
|
||||
336760
|
||||
64000
|
||||
487580
|
||||
410890
|
||||
363110
|
||||
FIM
|
||||
15
|
||||
I 1487390
|
||||
I 258520
|
||||
I 1165270
|
||||
I 298140
|
||||
I 213610
|
||||
I 50510
|
||||
I 998660
|
||||
I 1740720
|
||||
I 24720
|
||||
I 439550
|
||||
I 1507410
|
||||
R
|
||||
R
|
||||
R
|
||||
R
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
2019
|
||||
1460
|
||||
978
|
||||
809
|
||||
647
|
||||
284
|
||||
104
|
||||
556
|
||||
833
|
||||
1165
|
||||
1125
|
||||
1132
|
||||
677
|
||||
388
|
||||
55
|
||||
70
|
||||
63
|
||||
103
|
||||
55
|
||||
55
|
||||
94
|
||||
133
|
||||
93
|
||||
93
|
||||
114
|
||||
75
|
||||
90
|
||||
6187
|
||||
6324
|
||||
6358
|
||||
6346
|
||||
6292
|
||||
196
|
||||
59
|
||||
57
|
||||
54
|
||||
401
|
||||
407
|
||||
476
|
||||
450
|
||||
503
|
||||
246
|
||||
381
|
||||
312
|
||||
323
|
||||
271
|
||||
300
|
||||
199
|
||||
261
|
||||
223
|
||||
I 1487390
|
||||
341
|
||||
I 258520
|
||||
259
|
||||
I 1165270
|
||||
219
|
||||
I 298140
|
||||
160
|
||||
I 213610
|
||||
272
|
||||
I 50510
|
||||
158
|
||||
I 998660
|
||||
120
|
||||
I 1740720
|
||||
188
|
||||
I 24720
|
||||
371
|
||||
I 439550
|
||||
287
|
||||
I 1507410
|
||||
282
|
||||
R
|
||||
(R) Sopwith VR
|
||||
R
|
||||
(R) Have a Nice Death
|
||||
R
|
||||
(R) SPORE™ Galactic Adventures
|
||||
R
|
||||
(R) 'n Verlore Verstand
|
||||
[0] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
2019
|
||||
1460
|
||||
978
|
||||
809
|
||||
647
|
||||
284
|
||||
104
|
||||
556
|
||||
833
|
||||
1165
|
||||
1125
|
||||
1132
|
||||
677
|
||||
388
|
||||
55
|
||||
70
|
||||
63
|
||||
103
|
||||
55
|
||||
55
|
||||
94
|
||||
133
|
||||
93
|
||||
93
|
||||
114
|
||||
75
|
||||
90
|
||||
6187
|
||||
6324
|
||||
6358
|
||||
6346
|
||||
6292
|
||||
196
|
||||
59
|
||||
57
|
||||
54
|
||||
401
|
||||
407
|
||||
476
|
||||
450
|
||||
503
|
||||
246
|
||||
381
|
||||
312
|
||||
323
|
||||
271
|
||||
300
|
||||
199
|
||||
261
|
||||
223
|
||||
I 1487390
|
||||
341
|
||||
I 258520
|
||||
259
|
||||
I 1165270
|
||||
219
|
||||
I 298140
|
||||
160
|
||||
I 213610
|
||||
272
|
||||
I 50510
|
||||
158
|
||||
I 998660
|
||||
120
|
||||
I 1740720
|
||||
188
|
||||
I 24720
|
||||
371
|
||||
I 439550
|
||||
287
|
||||
I 1507410
|
||||
282
|
||||
R
|
||||
(R) Sopwith VR
|
||||
R
|
||||
(R) Have a Nice Death
|
||||
R
|
||||
(R) SPORE™ Galactic Adventures
|
||||
R
|
||||
(R) 'n Verlore Verstand
|
||||
[0] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
|
||||
|
|
@ -0,0 +1,869 @@
|
|||
/**
|
||||
|
||||
* @file Linux_Game.c
|
||||
* @author Pedro Lopes
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Includes
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <math.h>
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Definitions
|
||||
#define MAX_GAMES 500
|
||||
#define MAX_FIELD_SIZE 250
|
||||
#define MAX_STRING_ARRAY_SIZE 100
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Structs
|
||||
typedef struct {
|
||||
|
||||
int year,
|
||||
month;
|
||||
} Date;
|
||||
|
||||
typedef struct {
|
||||
|
||||
char name[MAX_FIELD_SIZE],
|
||||
owners[MAX_FIELD_SIZE],
|
||||
website[MAX_FIELD_SIZE],
|
||||
developers[MAX_FIELD_SIZE],
|
||||
languages[MAX_STRING_ARRAY_SIZE][30],
|
||||
genres[MAX_STRING_ARRAY_SIZE][30];
|
||||
|
||||
Date release_date;
|
||||
int app_id, age, dlcs, avg_playtime, count_languages, count_genres;
|
||||
float price, upvotes;
|
||||
bool windows_os, mac_os, linux_os;
|
||||
|
||||
} Game;
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Global variables
|
||||
Game games[MAX_GAMES];
|
||||
int n = 0;
|
||||
|
||||
Game gamesFull[5000];
|
||||
int x = 0;
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Functions
|
||||
bool isFim(char* s) { return s[0] == 'F' && s[1] == 'I' && s[2] == 'M'; }
|
||||
|
||||
void substring(char *string, char *string_start, int length) {
|
||||
|
||||
strncpy(string, string_start, length);
|
||||
string[length] = '\0';
|
||||
}
|
||||
|
||||
char *getMonthName(int month) {
|
||||
|
||||
switch(month) {
|
||||
|
||||
case 1: return "Jan"; break;
|
||||
case 2: return "Feb"; break;
|
||||
case 3: return "Mar"; break;
|
||||
case 4: return "Apr"; break;
|
||||
case 5: return "May"; break;
|
||||
case 6: return "Jun"; break;
|
||||
case 7: return "Jul"; break;
|
||||
case 8: return "Aug"; break;
|
||||
case 9: return "Sep"; break;
|
||||
case 10: return "Oct"; break;
|
||||
case 11: return "Nov"; break;
|
||||
case 12: return "Dec"; break;
|
||||
|
||||
default: return "N/A"; break;
|
||||
}
|
||||
}
|
||||
|
||||
int getMonthNumber(char* month) {
|
||||
|
||||
if(!strcmp(month, "Jan")) return 1;
|
||||
else if(!strcmp(month, "Feb")) return 2;
|
||||
else if(!strcmp(month, "Mar")) return 3;
|
||||
else if(!strcmp(month, "Apr")) return 4;
|
||||
else if(!strcmp(month, "May")) return 5;
|
||||
else if(!strcmp(month, "Jun")) return 6;
|
||||
else if(!strcmp(month, "Jul")) return 7;
|
||||
else if(!strcmp(month, "Aug")) return 8;
|
||||
else if(!strcmp(month, "Sep")) return 9;
|
||||
else if(!strcmp(month, "Oct")) return 10;
|
||||
else if(!strcmp(month, "Nov")) return 11;
|
||||
else if(!strcmp(month, "Dec")) return 12;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Class game functions
|
||||
void game_start(Game *game) {
|
||||
|
||||
strcpy(game -> name, "");
|
||||
strcpy(game -> owners, "");
|
||||
strcpy(game -> website, "");
|
||||
strcpy(game -> developers, "");
|
||||
|
||||
for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) {
|
||||
|
||||
strcpy(game -> languages[i], "");
|
||||
strcpy(game -> genres[i], "");
|
||||
}
|
||||
|
||||
game -> release_date.month = -1;
|
||||
game -> release_date.year = -1;
|
||||
game -> app_id = -1;
|
||||
game -> age = -1;
|
||||
game -> dlcs = -1;
|
||||
game -> avg_playtime = -1;
|
||||
game -> price = -1;
|
||||
game -> upvotes = -1;
|
||||
game -> windows_os = false;
|
||||
game -> mac_os = false;
|
||||
game -> linux_os = false;
|
||||
|
||||
game -> count_languages = 0;
|
||||
game -> count_genres = 0;
|
||||
}
|
||||
|
||||
void game_print(Game *game) {
|
||||
|
||||
int hours = game -> avg_playtime / 60,
|
||||
minutes = game -> avg_playtime % 60;
|
||||
|
||||
printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs);
|
||||
|
||||
for(int i = 0; i < game -> count_languages; i++) {
|
||||
|
||||
printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : "");
|
||||
}
|
||||
|
||||
printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false");
|
||||
|
||||
if(isnan(game -> upvotes)) printf("0.0%% ");
|
||||
else printf("%.0f%% ", game -> upvotes);
|
||||
|
||||
if(hours > 0)
|
||||
{
|
||||
printf("%ih ", hours);
|
||||
|
||||
if(minutes > 0) printf("%im ", minutes);
|
||||
}
|
||||
else {
|
||||
|
||||
if(minutes > 0) printf("%im ", minutes);
|
||||
else printf("null ");
|
||||
}
|
||||
|
||||
printf("%s [", game -> developers);
|
||||
|
||||
for(int i = 0; i < game -> count_genres; i++) {
|
||||
|
||||
printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : "");
|
||||
}
|
||||
|
||||
printf("]\n");
|
||||
}
|
||||
|
||||
Game game_clone(Game *game) {
|
||||
|
||||
Game cloned;
|
||||
|
||||
strcpy(cloned.name, game -> name);
|
||||
strcpy(cloned.owners, game -> owners);
|
||||
strcpy(cloned.website, game -> website);
|
||||
strcpy(cloned.developers, game -> developers);
|
||||
|
||||
for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]);
|
||||
for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]);
|
||||
|
||||
cloned.release_date.month = game -> release_date.month;
|
||||
cloned.release_date.year = game -> release_date.year;
|
||||
cloned.app_id = game -> app_id;
|
||||
cloned.age = game -> age;
|
||||
cloned.dlcs = game -> dlcs;
|
||||
cloned.avg_playtime = game -> avg_playtime;
|
||||
cloned.price = game -> price;
|
||||
cloned.upvotes = game -> upvotes;
|
||||
cloned.windows_os = game -> windows_os;
|
||||
cloned.mac_os = game -> mac_os;
|
||||
cloned.linux_os = game -> linux_os;
|
||||
return cloned;
|
||||
}
|
||||
|
||||
void game_read(Game *game, char *line) {
|
||||
|
||||
char c_search, sub[MAX_FIELD_SIZE];
|
||||
int index = 0, atr_index = 0;
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "AppID"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> app_id = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Name"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> name, sub);
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> name, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find release date
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
char subDate[10];
|
||||
|
||||
substring(subDate, &sub[0], 3);
|
||||
|
||||
game -> release_date.month = getMonthNumber(subDate);
|
||||
|
||||
if(c_search == ',') {
|
||||
|
||||
substring(subDate, &sub[4], 4);
|
||||
|
||||
game -> release_date.year = atoi(subDate);
|
||||
|
||||
index++;
|
||||
}
|
||||
else if(c_search == '\"') {
|
||||
|
||||
int nmbSpace = 0;
|
||||
|
||||
for(int i = 0; ; i++) {
|
||||
|
||||
if(sub[i] == ' ') nmbSpace++;
|
||||
|
||||
if(nmbSpace == 2) {
|
||||
|
||||
i++;
|
||||
|
||||
substring(subDate, &sub[i], 4);
|
||||
|
||||
game -> release_date.year = atoi(subDate);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
index += 2;
|
||||
}
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
game -> release_date.month = 0;
|
||||
game -> release_date.year = 0;
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Owners"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> owners, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Age"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> age = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Price"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> price = atof(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "DLCs"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> dlcs = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Languages"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ']') {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') index++;
|
||||
else if(line[index] == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
else if(line[index] == '\'') {
|
||||
|
||||
int wordStart = index + 1;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == '\'') {
|
||||
|
||||
substring(sub, &line[wordStart], index - wordStart);
|
||||
strcpy(game -> languages[game -> count_languages++], sub);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Website"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> website, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> website, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Windows"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> windows_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Mac"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> mac_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Linux"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> linux_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Upvotes"
|
||||
int positives, negatives;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
positives = atoi(sub);
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
negatives = atoi(sub);
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
game -> upvotes = (float)(positives * 100) / (float)(positives + negatives);
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "AVG Playtime"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> avg_playtime = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Developers"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> developers, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> developers, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Genres"
|
||||
if(index < strlen(line) - 1) {
|
||||
|
||||
if(line[index] == ',') atr_index = ++index;
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
else if(line[index] == '\"') {
|
||||
|
||||
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
|
||||
|
||||
if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0';
|
||||
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
|
||||
|
||||
sub[strlen(line) - 2 - atr_index] = '\0';
|
||||
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Functions - List
|
||||
void list_insertBegin(Game x) {
|
||||
|
||||
if(n >= MAX_GAMES) {
|
||||
|
||||
printf("Insert error: MAX_GAMES reached");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for(int i = n; i > 0; i--) games[i] = games[i - 1];
|
||||
|
||||
games[0] = x;
|
||||
n++;
|
||||
}
|
||||
|
||||
void list_insertEnd(Game x) {
|
||||
|
||||
if(n >= MAX_GAMES) {
|
||||
|
||||
printf("Insert error: MAX_GAMES reached");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
games[n++] = x;
|
||||
}
|
||||
|
||||
void list_insert(Game x, int pos) {
|
||||
|
||||
if(n >= MAX_GAMES || (pos < 0 || pos > n)) {
|
||||
|
||||
printf("Insert error: %s", n >= MAX_GAMES ? "MAX_GAMES reached" : "Invalid position");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for(int i = n; i > pos; i--) games[i] = games[i-1];
|
||||
|
||||
games[pos] = x;
|
||||
n++;
|
||||
}
|
||||
|
||||
Game list_removeBegin() {
|
||||
|
||||
Game resp;
|
||||
|
||||
if(n == 0) {
|
||||
|
||||
printf("Remove error: Empty list");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
resp = games[0];
|
||||
n--;
|
||||
|
||||
for(int i = 0; i < n; i++) games[i] = games[i + 1];
|
||||
return resp;
|
||||
}
|
||||
|
||||
Game list_removeEnd() {
|
||||
|
||||
if(n == 0) {
|
||||
|
||||
printf("Remove error: Empty list");
|
||||
exit(1);
|
||||
}
|
||||
return games[--n];
|
||||
}
|
||||
|
||||
Game list_remove(int pos) {
|
||||
|
||||
Game resp;
|
||||
|
||||
if(n >= MAX_GAMES || (pos < 0 || pos > n)) {
|
||||
|
||||
printf("Insert error: %s!", n == 0 ? "Empty list" : "Invalid position");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
resp = games[pos];
|
||||
n--;
|
||||
|
||||
for(int i = pos; i < n; i++) games[i] = games[i+1];
|
||||
return resp;
|
||||
}
|
||||
|
||||
void list_print() {
|
||||
|
||||
for(int i = 0; i < n; i++) {
|
||||
|
||||
printf("[%i] ", i);
|
||||
game_print(&games[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Game game_search(int app_id) {
|
||||
|
||||
for(int i = 0; i < x; i++) {
|
||||
|
||||
if(gamesFull[i].app_id == app_id) return gamesFull[i];
|
||||
}
|
||||
|
||||
Game game;
|
||||
game.app_id = -1;
|
||||
return game;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
int main() {
|
||||
|
||||
// ---------------------------------------------------------------------------------------- //
|
||||
|
||||
// Fill full games list
|
||||
FILE *fp;
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
size_t read;
|
||||
|
||||
fp = fopen("/tmp/games.csv", "r");
|
||||
|
||||
if(fp == NULL) exit(EXIT_FAILURE);
|
||||
|
||||
// -------------------------------------- //
|
||||
|
||||
while((read = getline(&line, &len, fp)) != -1) {
|
||||
|
||||
Game game;
|
||||
|
||||
game_start(&game);
|
||||
game_read(&game, line);
|
||||
|
||||
gamesFull[x++] = game;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
if(line) free(line);
|
||||
|
||||
// ---------------------------------------------------------------------------------------- //
|
||||
|
||||
char line_in[100];
|
||||
|
||||
// Fill production games list
|
||||
scanf(" %[^\n]", line_in);
|
||||
|
||||
while(true) {
|
||||
|
||||
if(isFim(line_in)) break;
|
||||
|
||||
// -------------------------- //
|
||||
|
||||
int app_id = atoi(line_in);
|
||||
|
||||
Game found = game_search(app_id);
|
||||
|
||||
if(found.app_id != -1) list_insertEnd(found);
|
||||
|
||||
// -------------------------- //
|
||||
|
||||
scanf(" %[^\n]", line_in);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------- //
|
||||
|
||||
// Execute operations
|
||||
int n_ops;
|
||||
scanf("%i", &n_ops);
|
||||
|
||||
for(int i = 0; i < n_ops; i++) {
|
||||
|
||||
scanf(" %[^\n]", line_in);
|
||||
|
||||
Game game;
|
||||
char params[10];
|
||||
|
||||
if(line_in[0] == 'I') {
|
||||
|
||||
substring(params, &line_in[3], strlen(line_in) - 3);
|
||||
|
||||
if(line_in[1] == 'I') list_insertBegin(game_search(atoi(params)));
|
||||
else if(line_in[1] == 'F') list_insertEnd(game_search(atoi(params)));
|
||||
else if(line_in[1] == '*') {
|
||||
|
||||
char appId[10], pos[10];
|
||||
int i = 0;
|
||||
|
||||
while(true) {
|
||||
|
||||
if(params[i] == ' ') {
|
||||
|
||||
substring(pos, ¶ms[0], i);
|
||||
substring(appId, ¶ms[i + 1], strlen(params) - i - 1);
|
||||
break;
|
||||
}
|
||||
else i++;
|
||||
}
|
||||
|
||||
list_insert(game_search(atoi(appId)), atoi(pos));
|
||||
}
|
||||
}
|
||||
else if(line_in[0] == 'R') {
|
||||
|
||||
if(line_in[1] == 'I') printf("(R) %s\n", list_removeBegin().name);
|
||||
else if(line_in[1] == 'F') printf("(R) %s\n", list_removeEnd().name);
|
||||
else if(line_in[1] == '*') {
|
||||
|
||||
substring(params, &line_in[3], strlen(line_in) - 3);
|
||||
|
||||
printf("(R) %s\n", list_remove(atoi(params)).name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
list_print();
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
Binary file not shown.
|
|
@ -0,0 +1,868 @@
|
|||
/**
|
||||
|
||||
* @file WSL_Game.c
|
||||
* @author Pedro Lopes
|
||||
* @version 1.0
|
||||
* @date 2022-10-17
|
||||
* @copyright Copyright (c) 2022
|
||||
|
||||
**/
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Includes
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <math.h>
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Definitions
|
||||
#define MAX_GAMES 500
|
||||
#define MAX_FIELD_SIZE 250
|
||||
#define MAX_STRING_ARRAY_SIZE 100
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Structs
|
||||
typedef struct {
|
||||
|
||||
int year,
|
||||
month;
|
||||
} Date;
|
||||
|
||||
typedef struct {
|
||||
|
||||
char name[MAX_FIELD_SIZE],
|
||||
owners[MAX_FIELD_SIZE],
|
||||
website[MAX_FIELD_SIZE],
|
||||
developers[MAX_FIELD_SIZE],
|
||||
languages[MAX_STRING_ARRAY_SIZE][30],
|
||||
genres[MAX_STRING_ARRAY_SIZE][30];
|
||||
|
||||
Date release_date;
|
||||
int app_id, age, dlcs, avg_playtime, count_languages, count_genres;
|
||||
float price, upvotes;
|
||||
bool windows_os, mac_os, linux_os;
|
||||
|
||||
} Game;
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Global variables
|
||||
Game games[MAX_GAMES];
|
||||
int n = 0;
|
||||
|
||||
Game gamesFull[5000];
|
||||
int x = 0;
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Functions
|
||||
bool isFim(char* s) { return s[0] == 'F' && s[1] == 'I' && s[2] == 'M'; }
|
||||
|
||||
void substring(char *string, char *string_start, int length) {
|
||||
|
||||
strncpy(string, string_start, length);
|
||||
string[length] = '\0';
|
||||
}
|
||||
|
||||
char *getMonthName(int month) {
|
||||
|
||||
switch(month) {
|
||||
|
||||
case 1: return "Jan"; break;
|
||||
case 2: return "Feb"; break;
|
||||
case 3: return "Mar"; break;
|
||||
case 4: return "Apr"; break;
|
||||
case 5: return "May"; break;
|
||||
case 6: return "Jun"; break;
|
||||
case 7: return "Jul"; break;
|
||||
case 8: return "Aug"; break;
|
||||
case 9: return "Sep"; break;
|
||||
case 10: return "Oct"; break;
|
||||
case 11: return "Nov"; break;
|
||||
case 12: return "Dec"; break;
|
||||
|
||||
default: return "N/A"; break;
|
||||
}
|
||||
}
|
||||
|
||||
int getMonthNumber(char* month) {
|
||||
|
||||
if(!strcmp(month, "Jan")) return 1;
|
||||
else if(!strcmp(month, "Feb")) return 2;
|
||||
else if(!strcmp(month, "Mar")) return 3;
|
||||
else if(!strcmp(month, "Apr")) return 4;
|
||||
else if(!strcmp(month, "May")) return 5;
|
||||
else if(!strcmp(month, "Jun")) return 6;
|
||||
else if(!strcmp(month, "Jul")) return 7;
|
||||
else if(!strcmp(month, "Aug")) return 8;
|
||||
else if(!strcmp(month, "Sep")) return 9;
|
||||
else if(!strcmp(month, "Oct")) return 10;
|
||||
else if(!strcmp(month, "Nov")) return 11;
|
||||
else if(!strcmp(month, "Dec")) return 12;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Class game functions
|
||||
void game_start(Game *game) {
|
||||
|
||||
strcpy(game -> name, "");
|
||||
strcpy(game -> owners, "");
|
||||
strcpy(game -> website, "");
|
||||
strcpy(game -> developers, "");
|
||||
|
||||
for(int i = 0; i < MAX_STRING_ARRAY_SIZE; i++) {
|
||||
|
||||
strcpy(game -> languages[i], "");
|
||||
strcpy(game -> genres[i], "");
|
||||
}
|
||||
|
||||
game -> release_date.month = -1;
|
||||
game -> release_date.year = -1;
|
||||
game -> app_id = -1;
|
||||
game -> age = -1;
|
||||
game -> dlcs = -1;
|
||||
game -> avg_playtime = -1;
|
||||
game -> price = -1;
|
||||
game -> upvotes = -1;
|
||||
game -> windows_os = false;
|
||||
game -> mac_os = false;
|
||||
game -> linux_os = false;
|
||||
|
||||
game -> count_languages = 0;
|
||||
game -> count_genres = 0;
|
||||
}
|
||||
|
||||
void game_print(Game *game) {
|
||||
|
||||
int hours = game -> avg_playtime / 60,
|
||||
minutes = game -> avg_playtime % 60;
|
||||
|
||||
printf("%i %s %s/%04i %s %i %.2f %i [", game -> app_id, game -> name, getMonthName(game -> release_date.month), game -> release_date.year, game -> owners, game -> age, game -> price, game -> dlcs);
|
||||
|
||||
for(int i = 0; i < game -> count_languages; i++) {
|
||||
|
||||
printf("%s%s", game -> languages[i], i < game -> count_languages - 1 ? ", " : "");
|
||||
}
|
||||
|
||||
printf("] %s %s %s %s ", game -> website, game -> windows_os ? "true" : "false", game -> mac_os ? "true" : "false", game -> linux_os ? "true" : "false");
|
||||
|
||||
if(isnan(game -> upvotes)) printf("0.0%% ");
|
||||
else printf("%.0f%% ", game -> upvotes);
|
||||
|
||||
if(hours > 0)
|
||||
{
|
||||
printf("%ih ", hours);
|
||||
|
||||
if(minutes > 0) printf("%im ", minutes);
|
||||
}
|
||||
else {
|
||||
|
||||
if(minutes > 0) printf("%im ", minutes);
|
||||
else printf("null ");
|
||||
}
|
||||
|
||||
printf("%s [", game -> developers);
|
||||
|
||||
for(int i = 0; i < game -> count_genres; i++) {
|
||||
|
||||
printf("%s%s", game -> genres[i], i < game -> count_genres - 1 ? ", " : "");
|
||||
}
|
||||
|
||||
printf("]\n");
|
||||
}
|
||||
|
||||
Game game_clone(Game *game) {
|
||||
|
||||
Game cloned;
|
||||
|
||||
strcpy(cloned.name, game -> name);
|
||||
strcpy(cloned.owners, game -> owners);
|
||||
strcpy(cloned.website, game -> website);
|
||||
strcpy(cloned.developers, game -> developers);
|
||||
|
||||
for(int i = 0; i < game -> count_languages; i++) strcpy(cloned.languages[i], game -> languages[i]);
|
||||
for(int i = 0; i < game -> count_genres; i++) strcpy(cloned.genres[i], game -> genres[i]);
|
||||
|
||||
cloned.release_date.month = game -> release_date.month;
|
||||
cloned.release_date.year = game -> release_date.year;
|
||||
cloned.app_id = game -> app_id;
|
||||
cloned.age = game -> age;
|
||||
cloned.dlcs = game -> dlcs;
|
||||
cloned.avg_playtime = game -> avg_playtime;
|
||||
cloned.price = game -> price;
|
||||
cloned.upvotes = game -> upvotes;
|
||||
cloned.windows_os = game -> windows_os;
|
||||
cloned.mac_os = game -> mac_os;
|
||||
cloned.linux_os = game -> linux_os;
|
||||
return cloned;
|
||||
}
|
||||
|
||||
void game_read(Game *game, char *line) {
|
||||
|
||||
char c_search, sub[MAX_FIELD_SIZE];
|
||||
int index = 0, atr_index = 0;
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "AppID"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> app_id = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Name"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> name, sub);
|
||||
|
||||
if(c_search == ',') index++;
|
||||
else if(c_search == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> name, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find release date
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
char subDate[10];
|
||||
|
||||
substring(subDate, &sub[0], 3);
|
||||
|
||||
game -> release_date.month = getMonthNumber(subDate);
|
||||
|
||||
if(c_search == ',') {
|
||||
|
||||
substring(subDate, &sub[4], 4);
|
||||
|
||||
game -> release_date.year = atoi(subDate);
|
||||
|
||||
index++;
|
||||
}
|
||||
else if(c_search == '\"') {
|
||||
|
||||
int nmbSpace = 0;
|
||||
|
||||
for(int i = 0; ; i++) {
|
||||
|
||||
if(sub[i] == ' ') nmbSpace++;
|
||||
|
||||
if(nmbSpace == 2) {
|
||||
|
||||
i++;
|
||||
|
||||
substring(subDate, &sub[i], 4);
|
||||
|
||||
game -> release_date.year = atoi(subDate);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
index += 2;
|
||||
}
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
game -> release_date.month = 0;
|
||||
game -> release_date.year = 0;
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Owners"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> owners, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Age"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> age = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Price"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> price = atof(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "DLCs"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> dlcs = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Languages"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ']') {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') index++;
|
||||
else if(line[index] == '\"') index += 2;
|
||||
|
||||
atr_index = index;
|
||||
break;
|
||||
}
|
||||
else if(line[index] == '\'') {
|
||||
|
||||
int wordStart = index + 1;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == '\'') {
|
||||
|
||||
substring(sub, &line[wordStart], index - wordStart);
|
||||
strcpy(game -> languages[game -> count_languages++], sub);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Website"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> website, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> website, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Windows"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> windows_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Mac"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> mac_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Find "Linux"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
if(!strcmp(sub, "True")) game -> linux_os = true;
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Upvotes"
|
||||
int positives, negatives;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
positives = atoi(sub);
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
negatives = atoi(sub);
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
game -> upvotes = (float)(positives * 100) / (float)(positives + negatives);
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "AVG Playtime"
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
|
||||
game -> avg_playtime = atoi(sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Developers"
|
||||
if(line[atr_index] != ',') {
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
c_search = '\"';
|
||||
}
|
||||
else c_search = ',';
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == c_search) {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> developers, sub);
|
||||
|
||||
atr_index = ++index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
strcpy(game -> developers, "null");
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Find "Genres"
|
||||
if(index < strlen(line) - 1) {
|
||||
|
||||
if(line[index] == ',') atr_index = ++index;
|
||||
|
||||
if(line[atr_index] == '\"') {
|
||||
|
||||
atr_index++;
|
||||
|
||||
while(true) {
|
||||
|
||||
index++;
|
||||
|
||||
if(line[index] == ',') {
|
||||
|
||||
substring(sub, &line[atr_index], index - atr_index);
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
|
||||
atr_index = ++index;
|
||||
}
|
||||
else if(line[index] == '\"') {
|
||||
|
||||
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
|
||||
|
||||
if(sub[strlen(sub) - 1] == '\"') sub[strlen(sub) - 1] = '\0';
|
||||
else if(sub[strlen(sub) - 2] == '\"') sub[strlen(sub) - 2] = '\0';
|
||||
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
substring(sub, &line[atr_index], strlen(line) - 1 - atr_index);
|
||||
|
||||
strcpy(game -> genres[game -> count_genres++], sub);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// Functions - List
|
||||
void list_insertBegin(Game x) {
|
||||
|
||||
if(n >= MAX_GAMES) {
|
||||
|
||||
printf("Insert error: MAX_GAMES reached");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for(int i = n; i > 0; i--) games[i] = games[i - 1];
|
||||
|
||||
games[0] = x;
|
||||
n++;
|
||||
}
|
||||
|
||||
void list_insertEnd(Game x) {
|
||||
|
||||
if(n >= MAX_GAMES) {
|
||||
|
||||
printf("Insert error: MAX_GAMES reached");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
games[n++] = x;
|
||||
}
|
||||
|
||||
void list_insert(Game x, int pos) {
|
||||
|
||||
if(n >= MAX_GAMES || (pos < 0 || pos > n)) {
|
||||
|
||||
printf("Insert error: %s", n >= MAX_GAMES ? "MAX_GAMES reached" : "Invalid position");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for(int i = n; i > pos; i--) games[i] = games[i-1];
|
||||
|
||||
games[pos] = x;
|
||||
n++;
|
||||
}
|
||||
|
||||
Game list_removeBegin() {
|
||||
|
||||
Game resp;
|
||||
|
||||
if(n == 0) {
|
||||
|
||||
printf("Remove error: Empty list");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
resp = games[0];
|
||||
n--;
|
||||
|
||||
for(int i = 0; i < n; i++) games[i] = games[i + 1];
|
||||
return resp;
|
||||
}
|
||||
|
||||
Game list_removeEnd() {
|
||||
|
||||
if(n == 0) {
|
||||
|
||||
printf("Remove error: Empty list");
|
||||
exit(1);
|
||||
}
|
||||
return games[--n];
|
||||
}
|
||||
|
||||
Game list_remove(int pos) {
|
||||
|
||||
Game resp;
|
||||
|
||||
if(n >= MAX_GAMES || (pos < 0 || pos > n)) {
|
||||
|
||||
printf("Insert error: %s!", n == 0 ? "Empty list" : "Invalid position");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
resp = games[pos];
|
||||
n--;
|
||||
|
||||
for(int i = pos; i < n; i++) games[i] = games[i+1];
|
||||
return resp;
|
||||
}
|
||||
|
||||
void list_print() {
|
||||
|
||||
for(int i = 0; i < n; i++) {
|
||||
|
||||
printf("[%i] ", i);
|
||||
game_print(&games[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Game game_search(int app_id) {
|
||||
|
||||
for(int i = 0; i < x; i++) {
|
||||
|
||||
if(gamesFull[i].app_id == app_id) return gamesFull[i];
|
||||
}
|
||||
|
||||
Game game;
|
||||
game.app_id = -1;
|
||||
return game;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------- //
|
||||
|
||||
int main() {
|
||||
|
||||
// ---------------------------------------------------------------------------------------- //
|
||||
|
||||
// Fill full games list
|
||||
FILE *fp;
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
size_t read;
|
||||
|
||||
fp = fopen("/tmp/games.csv", "r");
|
||||
|
||||
if(fp == NULL) exit(EXIT_FAILURE);
|
||||
|
||||
// -------------------------------------- //
|
||||
|
||||
while((read = getline(&line, &len, fp)) != -1) {
|
||||
|
||||
Game game;
|
||||
|
||||
game_start(&game);
|
||||
game_read(&game, line);
|
||||
|
||||
gamesFull[x++] = game;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
if(line) free(line);
|
||||
|
||||
// ---------------------------------------------------------------------------------------- //
|
||||
|
||||
char line_in[100];
|
||||
|
||||
// Fill production games list
|
||||
scanf(" %[^\n]", line_in);
|
||||
|
||||
while(true) {
|
||||
|
||||
if(isFim(line_in)) break;
|
||||
|
||||
// -------------------------- //
|
||||
|
||||
int app_id = atoi(line_in);
|
||||
|
||||
Game found = game_search(app_id);
|
||||
|
||||
if(found.app_id != -1) list_insertEnd(found);
|
||||
|
||||
// -------------------------- //
|
||||
|
||||
scanf(" %[^\n]", line_in);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------- //
|
||||
|
||||
// Execute operations
|
||||
int n_ops;
|
||||
scanf("%i", &n_ops);
|
||||
|
||||
for(int i = 0; i < n_ops; i++) {
|
||||
|
||||
scanf(" %[^\n]", line_in);
|
||||
|
||||
Game game;
|
||||
char params[10];
|
||||
|
||||
if(line_in[0] == 'I') {
|
||||
|
||||
substring(params, &line_in[3], strlen(line_in) - 3);
|
||||
|
||||
if(line_in[1] == 'I') list_insertBegin(game_search(atoi(params)));
|
||||
else if(line_in[1] == 'F') list_insertEnd(game_search(atoi(params)));
|
||||
else if(line_in[1] == '*') {
|
||||
|
||||
char appId[10], pos[10];
|
||||
int i = 0;
|
||||
|
||||
while(true) {
|
||||
|
||||
if(params[i] == ' ') {
|
||||
|
||||
substring(pos, ¶ms[0], i);
|
||||
substring(appId, ¶ms[i + 1], strlen(params) - i - 1);
|
||||
break;
|
||||
}
|
||||
else i++;
|
||||
}
|
||||
|
||||
list_insert(game_search(atoi(appId)), atoi(pos));
|
||||
}
|
||||
}
|
||||
else if(line_in[0] == 'R') {
|
||||
|
||||
if(line_in[1] == 'I') printf("(R) %s\n", list_removeBegin().name);
|
||||
else if(line_in[1] == 'F') printf("(R) %s\n", list_removeEnd().name);
|
||||
else if(line_in[1] == '*') {
|
||||
|
||||
substring(params, &line_in[3], strlen(line_in) - 3);
|
||||
|
||||
printf("(R) %s\n", list_remove(atoi(params)).name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
list_print();
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
1189490
|
||||
300550
|
||||
49800
|
||||
1851280
|
||||
1112930
|
||||
275570
|
||||
1276550
|
||||
1096530
|
||||
690510
|
||||
1504570
|
||||
1369470
|
||||
270130
|
||||
336150
|
||||
573210
|
||||
886470
|
||||
1368820
|
||||
951530
|
||||
247370
|
||||
1879330
|
||||
1634290
|
||||
259570
|
||||
941650
|
||||
768450
|
||||
1347140
|
||||
722670
|
||||
711540
|
||||
450170
|
||||
730
|
||||
598550
|
||||
614090
|
||||
809440
|
||||
1923860
|
||||
559010
|
||||
1547380
|
||||
554310
|
||||
1124090
|
||||
292120
|
||||
691930
|
||||
325420
|
||||
663670
|
||||
503820
|
||||
49600
|
||||
49300
|
||||
1631930
|
||||
1038740
|
||||
336760
|
||||
64000
|
||||
487580
|
||||
410890
|
||||
363110
|
||||
FIM
|
||||
20
|
||||
II 1487390
|
||||
II 258520
|
||||
II 1165270
|
||||
II 298140
|
||||
II 213610
|
||||
IF 50510
|
||||
IF 998660
|
||||
IF 1740720
|
||||
I* 10 24720
|
||||
I* 15 439550
|
||||
I* 20 1507410
|
||||
RF
|
||||
RF
|
||||
RF
|
||||
RI
|
||||
RI
|
||||
R* 10
|
||||
RF
|
||||
RF
|
||||
RI
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
(R) Have a Nice Death
|
||||
(R) Sopwith VR
|
||||
(R) Burn Zombie Burn!
|
||||
(R) Sonic Adventure 2
|
||||
(R) Rhiannon: Curse of the Four Branches
|
||||
(R) Faefever
|
||||
(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit
|
||||
(R) Higurashi When They Cry Hou - Ch.2 Watanagashi
|
||||
(R) Synthesis Universe -Episode 00-
|
||||
[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
|
||||
[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
|
||||
[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
|
||||
[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
|
||||
[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
|
||||
[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
|
||||
[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
|
||||
[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation]
|
||||
[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
|
||||
[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
|
||||
[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
|
||||
[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie]
|
||||
[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
|
||||
[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
|
||||
[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
|
||||
[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
|
||||
[16] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
|
||||
[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
|
||||
[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
|
||||
[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
|
||||
[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
|
||||
[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
|
||||
[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
|
||||
[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
|
||||
[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
|
||||
[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
|
||||
[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
|
||||
[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
|
||||
[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
|
||||
[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
|
||||
[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
|
||||
[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
|
||||
[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
|
||||
[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
|
||||
[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
|
||||
[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
|
||||
[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
|
||||
[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
|
||||
[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
|
||||
[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
|
||||
[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
|
||||
[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
|
||||
[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
|
||||
[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
|
||||
[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
|
||||
[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
|
||||
[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
|
||||
[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
|
||||
[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
|
||||
[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
|
||||
[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
|
||||
[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
(R) Have a Nice Death
|
||||
(R) Sopwith VR
|
||||
(R) Burn Zombie Burn!
|
||||
(R) Sonic Adventure 2
|
||||
(R) Rhiannon: Curse of the Four Branches
|
||||
(R) Faefever
|
||||
(R) NOBUNAGA'S AMBITION: Tendou with Power Up Kit
|
||||
(R) Higurashi When They Cry Hou - Ch.2 Watanagashi
|
||||
(R) Synthesis Universe -Episode 00-
|
||||
[0] 258520 The Vanishing of Ethan Carter Sep/2014 500000 - 1000000 0 19.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Czech] http://EthanCarterGame.com true false false 89% 3h 13m The Astronauts [Adventure, Indie]
|
||||
[1] 1487390 ANVIL Dec/2021 50000 - 100000 0 24.99 0 [English, Korean, German, Russian, Japanese, Simplified Chinese, Traditional Chinese, French, Polish, Portuguese - Brazil, Spanish - Latin America, Italian, Thai, Vietnamese] https://www.anvil.world/ true false false 63% 9h 51m Action Square [Action, Early Access]
|
||||
[2] 1189490 觅长生 Nov/2019 500000 - 1000000 0 11.99 0 [Simplified Chinese] null true false false 91% 33h 39m Chalcedony Network [Indie, RPG, Strategy, Early Access]
|
||||
[3] 300550 Shadowrun: Dragonfall - Director's Cut Sep/2014 500000 - 1000000 0 14.99 0 [English] http://harebrained-schemes.com/shadowrun/dragonfall/ true true true 89% 15h 1m Harebrained Schemes [Adventure, Indie, RPG, Strategy]
|
||||
[4] 49800 Flight of the Icarus May/2010 50000 - 100000 0 4.99 0 [English] http://musegames.com/games/flight-of-the-icarus/ true true false 39% 15m Muse Games [Action, Indie]
|
||||
[5] 1851280 Samurai Bringer Apr/2022 50000 - 100000 0 9.99 0 [English, Japanese, Simplified Chinese, Traditional Chinese] https://playism.com/game/samurai-bringer/ true false false 88% 5h 2m ALPHAWING Inc. [Action, Indie]
|
||||
[6] 1112930 Dredgers Oct/2019 50000 - 100000 0 11.99 0 [English, Simplified Chinese] null true false false 92% null Pirate-Rob [Indie, RPG]
|
||||
[7] 24720 SPORE™ Galactic Adventures Jun/2009 500000 - 1000000 0 19.99 0 [English, French, German, Italian, Spanish - Spain, Dutch, Russian, Polish, Czech, Hungarian, Finnish, Norwegian, Swedish, Danish] http://www.spore.com/what/ga true false false 88% 15h 32m EA - Maxis [Action, Simulation]
|
||||
[8] 275570 Summoner Mar/2014 50000 - 100000 0 4.99 0 [English, German] null true false false 83% 3h 24m Volition [Action, RPG]
|
||||
[9] 1096530 Solasta: Crown of the Magister May/2021 500000 - 1000000 0 15.99 4 [English, French, German, Simplified Chinese, Portuguese - Brazil, Russian] https://www.solasta-game.com/ true true false 89% 37h 56m Tactical Adventures [Adventure, RPG, Strategy]
|
||||
[10] 690510 Immortal Soul: Black Survival Mar/2019 500000 - 1000000 0 0.00 0 [English, Japanese, Korean, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Traditional Chinese, Thai, Portuguese, Portuguese - Brazil] null true false false 79% 28h 5m Nimble Neuron [Free to Play, Indie, Strategy]
|
||||
[11] 439550 'n Verlore Verstand Apr/2016 50000 - 100000 0 14.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Czech, Danish, Dutch, Finnish, Greek, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Ukrainian] http://www.skobbejakgames.com true true true 39% 2h 20m Skobbejak Games,Skermunkel [Adventure, Casual, Indie]
|
||||
[12] 1504570 Cultivation Tales Apr/2022 500000 - 1000000 0 19.99 0 [English, Simplified Chinese] null true false false 38% 27h 42m Ac Games [Action, Adventure, Indie, RPG, Strategy, Early Access]
|
||||
[13] 1369470 Pincremental Aug/2020 50000 - 100000 0 0.00 0 [English] null true true false 80% null Makopaz [Casual, Free to Play, Indie, Simulation, Strategy]
|
||||
[14] 270130 The Gallery - Episode 1: Call of the Starseed Apr/2016 50000 - 100000 0 14.99 1 [English] http://www.cloudheadgames.com true false false 84% 36m Cloudhead Games ltd. [Adventure, Casual, Indie]
|
||||
[15] 336150 Virtual Pool 4 May/2015 50000 - 100000 0 24.99 0 [English] http://vponline.celeris.com true false false 83% null Celeris [Sports]
|
||||
[16] 1507410 Coloring Book for Kids Mar/2021 50000 - 100000 0 0.00 1 [English, French, Italian, German, Arabic, Czech, Danish, Dutch, Hungarian, Japanese, Korean, Norwegian, Polish, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Latin America, Swedish, Thai, Turkish, Vietnamese] null true true false 89% null Peaksel [Casual, Free to Play, Indie]
|
||||
[17] 573210 Mistwood Heroes Dec/2016 50000 - 100000 0 3.99 0 [English] null true false false 56% 4h Meepower [Action, Adventure, Casual, Indie, RPG]
|
||||
[18] 886470 Another Otter Jul/2018 50000 - 100000 0 0.99 0 [English] null true false false 63% null PepoLab [Casual, Indie]
|
||||
[19] 1368820 RollerCoaster Tycoon® 3: Complete Edition Sep/2020 50000 - 100000 0 7.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Dutch, Finnish, Norwegian, Swedish] null true true false 83% 1h 15m Frontier Developments,Aspyr (Mac) [Simulation, Strategy]
|
||||
[20] 951530 Alien Shooter - Last Hope Nov/2020 50000 - 100000 0 4.99 0 [English, Russian] http://www.sigma-team.net true false false 81% null Sigma Team Inc. [Action, Indie, RPG]
|
||||
[21] 247370 Mutant Mudds Deluxe Nov/2013 50000 - 100000 0 9.99 0 [English] http://www.mutantmuddsdeluxe.com true false false 74% 3h 21m Renegade Kid [Action, Indie]
|
||||
[22] 1879330 WARRIORS OROCHI 3 Ultimate Definitive Edition Jul/2022 50000 - 100000 0 39.99 0 [English, Simplified Chinese, Traditional Chinese, Japanese] https://www.gamecity.ne.jp/orochi2/ultimate/index.html true false false 88% null KOEI TECMO GAMES CO., LTD. [Action, Strategy]
|
||||
[23] 1634290 Chuhou Joutai 2: Paraided! Jul/2021 50000 - 100000 0 4.99 0 [English, Japanese] https://drillimation.com/chuhou-joutai-2-paraided/ true false false 100% null Drillimation Systems [Action, Indie]
|
||||
[24] 259570 EDEN STAR Jan/2015 50000 - 100000 0 19.99 0 [English] http://www.edenstargame.com true false false 61% 4h 31m Flix Interactive [Action, Adventure, Indie, Strategy, Early Access]
|
||||
[25] 941650 The Island: Into The Mist Jan/2019 50000 - 100000 0 9.99 0 [Korean, English] https://imbada.itch.io/the-island true false false 69% 3h 14m SUPER WAVE Studio [Adventure, Indie]
|
||||
[26] 768450 NUTS Feb/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Dutch, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese, Traditional Chinese] http://nuts.game true true false 88% null Joon, Pol, Muutsch, Char & Torfi [Adventure, Simulation]
|
||||
[27] 1347140 NEAR DEADline Aug/2020 50000 - 100000 0 0.00 1 [English] https://www.newgrounds.com/portal/view/736443 true true true 90% null Dumb ****ing Horse [Action, Casual, Free to Play, Indie]
|
||||
[28] 722670 Chinese Chess/ Elephant Game: 象棋/ 中国象棋/ 中國象棋 Oct/2017 50000 - 100000 0 9.99 0 [Simplified Chinese, Traditional Chinese, English, Russian] null true false false 78% 1h 45m Wang Wenxi [Indie, Simulation, Strategy, Early Access]
|
||||
[29] 711540 Lonely Mountains: Downhill Oct/2019 50000 - 100000 0 9.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Simplified Chinese, Japanese, Korean, Portuguese - Brazil, Polish, Turkish] http://lonelymountains.com true true false 92% 1h 15m Megagon Industries [Action, Indie, Racing, Simulation, Sports]
|
||||
[30] 450170 BOOR Feb/2017 50000 - 100000 0 0.99 0 [English, Spanish - Spain, French, German] http://www.dazlog.com/boor true true true 83% 4h 30m DazlogStudio [Adventure, Casual, Indie]
|
||||
[31] 730 Counter-Strike: Global Offensive Aug/2012 50000000 - 100000000 0 0.00 1 [Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Russian, Simplified Chinese, Spanish - Spain, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Ukrainian, Greek, Spanish - Latin America, Vietnamese] http://blog.counter-strike.net/ true true true 88% 508h 4m Valve,Hidden Path Entertainment [Action, Free to Play]
|
||||
[32] 598550 HUNTDOWN May/2021 50000 - 100000 0 19.99 1 [English, French, Italian, German, Spanish - Spain, Japanese, Simplified Chinese] http://huntdown.com/ true true true 95% 11h 26m Easy Trigger Games [Action, Indie]
|
||||
[33] 614090 Deadbeat Heroes Oct/2017 50000 - 100000 0 14.99 0 [English] https://www.upstreamarcade.com/deadbeat-heroes/ true false false 66% 4h 36m Deadbeat Productions [Action]
|
||||
[34] 809440 Protolife Jun/2018 50000 - 100000 0 11.99 0 [English, Russian] null true true false 87% 15m Volcanic Giraffe [Indie, Strategy]
|
||||
[35] 1923860 Neon Outlast Mar/2022 50000 - 100000 0 4.99 0 [English] null true false false 0% null Keep Spinning [Action, Indie]
|
||||
[36] 559010 Cosmic Sugar VR Nov/2016 50000 - 100000 0 0.00 1 [English] http://cosmicsugarvr.com true false false 95% 5m David Lobser [Free to Play, Simulation]
|
||||
[37] 1547380 KINGDOM of the DEAD Feb/2022 50000 - 100000 0 14.99 0 [English, French, Italian, German, Spanish - Spain, Simplified Chinese, Traditional Chinese, Korean, Japanese, Polish, Portuguese - Brazil, Russian] null true false false 83% null DIRIGO GAMES [Action, Adventure, Indie]
|
||||
[38] 554310 Rage Wars Nov/2016 50000 - 100000 0 0.99 0 [English] http://www.lemondo.com/ true true true 89% 4h 24m Lemondo Games [Violent, Gore, Adventure, Casual, Indie]
|
||||
[39] 1124090 告死天使之言-Death angel Aug/2019 50000 - 100000 0 0.99 1 [Simplified Chinese] https://space.bilibili.com/11591868/article true false false 81% null 我妻寒十 [Adventure, Indie]
|
||||
[40] 292120 FINAL FANTASY® XIII Oct/2014 500000 - 1000000 13 15.99 0 [English, French, Italian, German, Spanish - Spain] http://www.square-enix.com/ true false false 74% 28h 58m Square Enix [RPG]
|
||||
[41] 691930 MSI Electric City: Core Assault Sep/2017 50000 - 100000 0 0.00 0 [English] http://msi.com/to/e-city true false false 90% 32m HyperBot Studio [Action, Adventure, Casual, Free to Play, Indie]
|
||||
[42] 325420 Homebrew - Patent Unknown Nov/2014 50000 - 100000 0 14.99 0 [English] http://www.homebrewgame.com true false false 76% 5h 48m Copybugpaste [Action, Indie, Racing, Simulation, Early Access]
|
||||
[43] 663670 Killer Queen Black Oct/2019 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean] http://www.killerqueenblack.com true true false 93% 2h 11m Liquid Bit, LLC,BumbleBear Games, LLC [Action, Casual, Sports, Strategy]
|
||||
[44] 503820 A Detective's Novel Jul/2016 500000 - 1000000 0 0.99 0 [English] http://amaterasusoftware.blogspot.hr/ true false false 68% 4h 24m Amaterasu Software [Adventure, Indie]
|
||||
[45] 49600 Beat Hazard Apr/2010 500000 - 1000000 0 9.99 2 [English, French, German, Italian, Spanish - Spain, Dutch] http://www.coldbeamgames.com true true true 95% 7h 36m Cold Beam Games [Action, Casual, Indie]
|
||||
[46] 49300 Commander: Conquest of the Americas Jul/2010 50000 - 100000 0 9.99 2 [English, French, German, Spanish - Spain] http://www.cota-game.com/ true false false 48% 11h 48m Nitro Games [Strategy]
|
||||
[47] 1631930 The Insignia Project Jul/2021 50000 - 100000 0 1.99 0 [English] https://darkendstu.com/ true false false 75% null Dark End Studios [Indie, Early Access]
|
||||
[48] 1038740 Fluffy Store Aug/2019 50000 - 100000 0 1.99 1 [English, Simplified Chinese, Traditional Chinese, Japanese] null true true false 97% 3h 9m AsicxArt [Adventure, Casual, Indie, RPG]
|
||||
[49] 336760 Pilot Brothers Dec/2014 50000 - 100000 0 4.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Traditional Chinese, Portuguese] null true false false 87% null 1C Wireless [Adventure, Casual]
|
||||
[50] 64000 Men of War: Assault Squad Feb/2011 500000 - 1000000 0 9.99 5 [English, Russian, Italian, Spanish - Spain, French, German, Polish] http://www.menofwargame.com/assault/ true false false 88% 10h 5m Digitalmindsoft [Strategy]
|
||||
[51] 487580 Ludo Supremo Jun/2016 50000 - 100000 0 1.99 0 [English] http://www.ensenasoft.com true false false 57% 3h 19m EnsenaSoft [Casual]
|
||||
Loading…
Reference in New Issue