Novo Semestre
This commit is contained in:
parent
b7ab19b812
commit
7b1cdb2352
|
|
@ -1,87 +0,0 @@
|
|||
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 Burn Zombie Burn!
|
||||
R Dredgers
|
||||
R Immortal Soul: Black Survival
|
||||
R NUTS
|
||||
R Pilot Brothers
|
||||
R Rage Wars
|
||||
R Samurai Bringer
|
||||
R Summoner
|
||||
R Virtual Pool 4
|
||||
Coloring Book for Kids
|
||||
After The War
|
||||
EDEN STAR
|
||||
Battle Brothers
|
||||
Fugl
|
||||
Crypto Is Dead
|
||||
BAD END THEATER
|
||||
HUNTDOWN
|
||||
Alien Prop Hunt
|
||||
Motorama
|
||||
BAD END THEATER
|
||||
Homebrew - Patent Unknown
|
||||
Football Manager 2019 Touch
|
||||
Everreach: Project Eden
|
||||
FIM
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
Coloring Book for Kids
|
||||
=>raiz esq esq esq esq esq dir dir esq esq esq SIM
|
||||
After The War
|
||||
=>raiz esq esq esq esq esq esq esq dir dir NAO
|
||||
EDEN STAR
|
||||
=>raiz esq esq esq dir esq SIM
|
||||
Battle Brothers
|
||||
=>raiz esq esq esq esq esq dir esq esq dir esq NAO
|
||||
Fugl
|
||||
=>raiz esq esq dir esq esq dir NAO
|
||||
Crypto Is Dead
|
||||
=>raiz esq esq esq esq esq dir dir dir NAO
|
||||
BAD END THEATER
|
||||
=>raiz esq esq esq esq esq dir esq esq esq NAO
|
||||
HUNTDOWN
|
||||
=>raiz esq esq dir esq SIM
|
||||
Alien Prop Hunt
|
||||
=>raiz esq esq esq esq esq esq esq dir dir NAO
|
||||
Motorama
|
||||
=>raiz esq esq dir dir esq dir esq NAO
|
||||
BAD END THEATER
|
||||
=>raiz esq esq esq esq esq dir esq esq esq NAO
|
||||
Homebrew - Patent Unknown
|
||||
=>raiz esq esq dir SIM
|
||||
Football Manager 2019 Touch
|
||||
=>raiz esq esq dir esq esq dir NAO
|
||||
Everreach: Project Eden
|
||||
=>raiz esq esq esq dir esq dir esq NAO
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
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
|
||||
292120
|
||||
691930
|
||||
325420
|
||||
663670
|
||||
503820
|
||||
49600
|
||||
49300
|
||||
1631930
|
||||
1038740
|
||||
336760
|
||||
64000
|
||||
487580
|
||||
FIM
|
||||
19
|
||||
I 1487390
|
||||
I 258520
|
||||
I 1165270
|
||||
I 298140
|
||||
I 213610
|
||||
I 50510
|
||||
I 998660
|
||||
I 1740720
|
||||
I 24720
|
||||
I 1507410
|
||||
R Burn Zombie Burn!
|
||||
R Dredgers
|
||||
R Immortal Soul: Black Survival
|
||||
R NUTS
|
||||
R Pilot Brothers
|
||||
R Rage Wars
|
||||
R Samurai Bringer
|
||||
R Summoner
|
||||
R Virtual Pool 4
|
||||
Coloring Book for Kids
|
||||
After The War
|
||||
EDEN STAR
|
||||
Battle Brothers
|
||||
Fugl
|
||||
Crypto Is Dead
|
||||
BAD END THEATER
|
||||
HUNTDOWN
|
||||
Alien Prop Hunt
|
||||
Motorama
|
||||
BAD END THEATER
|
||||
Homebrew - Patent Unknown
|
||||
Football Manager 2019 Touch
|
||||
Everreach: Project Eden
|
||||
FIM
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
Coloring Book for Kids
|
||||
raiz esq esq ESQ dir dir dir ESQ dir ESQ DIR DIR esq dir esq esq esq SIM
|
||||
After The War
|
||||
raiz esq esq ESQ esq ESQ esq esq dir dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
EDEN STAR
|
||||
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ esq esq esq ESQ SIM
|
||||
Battle Brothers
|
||||
raiz esq esq ESQ dir esq ESQ dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
Fugl
|
||||
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
Crypto Is Dead
|
||||
raiz esq esq ESQ dir dir dir ESQ dir ESQ DIR DIR esq dir dir ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
BAD END THEATER
|
||||
raiz esq esq ESQ esq ESQ dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
HUNTDOWN
|
||||
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR SIM
|
||||
Alien Prop Hunt
|
||||
raiz esq esq ESQ esq ESQ esq esq dir dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
Motorama
|
||||
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ dir ESQ ESQ DIR dir dir ESQ DIR DIR ESQ DIR dir dir ESQ dir dir ESQ DIR DIR ESQ dir esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
BAD END THEATER
|
||||
raiz esq esq ESQ esq ESQ dir ESQ DIR DIR esq esq esq ESQ DIR DIR esq esq ESQ esq esq esq ESQ esq ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
Homebrew - Patent Unknown
|
||||
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR dir SIM
|
||||
Football Manager 2019 Touch
|
||||
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ dir dir ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
Everreach: Project Eden
|
||||
raiz dir ESQ dir dir dir ESQ dir ESQ DIR DIR dir ESQ DIR DIR esq esq ESQ esq esq esq ESQ dir ESQ DIR DIR esq esq ESQ esq ESQ ESQ DIR esq ESQ DIR DIR ESQ DIR esq ESQ esq ESQ DIR DIR ESQ esq esq ESQ DIR esq esq ESQ DIR DIR DIR ESQ DIR DIR ESQ ESQ esq ESQ ESQ esq ESQ esq esq esq ESQ DIR DIR DIR DIR esq ESQ DIR DIR ESQ DIR DIR NAO
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
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 Burn Zombie Burn!
|
||||
R Dredgers
|
||||
R Immortal Soul: Black Survival
|
||||
R NUTS
|
||||
R Pilot Brothers
|
||||
R Rage Wars
|
||||
R Samurai Bringer
|
||||
R Summoner
|
||||
R Virtual Pool 4
|
||||
Coloring Book for Kids
|
||||
After The War
|
||||
EDEN STAR
|
||||
Battle Brothers
|
||||
Fugl
|
||||
Crypto Is Dead
|
||||
BAD END THEATER
|
||||
HUNTDOWN
|
||||
Alien Prop Hunt
|
||||
Motorama
|
||||
BAD END THEATER
|
||||
Homebrew - Patent Unknown
|
||||
Football Manager 2019 Touch
|
||||
Everreach: Project Eden
|
||||
FIM
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
Coloring Book for Kids
|
||||
raiz esq esq dir esq esq SIM
|
||||
After The War
|
||||
raiz esq esq esq esq dir esq NAO
|
||||
EDEN STAR
|
||||
raiz esq esq dir dir SIM
|
||||
Battle Brothers
|
||||
raiz esq esq esq dir esq dir NAO
|
||||
Fugl
|
||||
raiz esq dir esq esq esq dir NAO
|
||||
Crypto Is Dead
|
||||
raiz esq esq dir esq dir dir NAO
|
||||
BAD END THEATER
|
||||
raiz esq esq esq dir esq esq NAO
|
||||
HUNTDOWN
|
||||
raiz esq dir esq esq SIM
|
||||
Alien Prop Hunt
|
||||
raiz esq esq esq esq dir esq NAO
|
||||
Motorama
|
||||
raiz esq dir dir dir esq NAO
|
||||
BAD END THEATER
|
||||
raiz esq esq esq dir esq esq NAO
|
||||
Homebrew - Patent Unknown
|
||||
raiz esq dir esq SIM
|
||||
Football Manager 2019 Touch
|
||||
raiz esq dir esq esq esq dir NAO
|
||||
Everreach: Project Eden
|
||||
raiz esq esq dir dir dir esq esq NAO
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
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 Burn Zombie Burn!
|
||||
R Dredgers
|
||||
R Immortal Soul: Black Survival
|
||||
R NUTS
|
||||
R Pilot Brothers
|
||||
R Rage Wars
|
||||
R Samurai Bringer
|
||||
R Summoner
|
||||
R Virtual Pool 4
|
||||
Coloring Book for Kids
|
||||
After The War
|
||||
EDEN STAR
|
||||
Battle Brothers
|
||||
Fugl
|
||||
Crypto Is Dead
|
||||
BAD END THEATER
|
||||
HUNTDOWN
|
||||
Alien Prop Hunt
|
||||
Motorama
|
||||
BAD END THEATER
|
||||
Homebrew - Patent Unknown
|
||||
Football Manager 2019 Touch
|
||||
Everreach: Project Eden
|
||||
FIM
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
Coloring Book for Kids
|
||||
raiz esq esq dir esq esq esq SIM
|
||||
After The War
|
||||
raiz esq esq esq esq dir esq NAO
|
||||
EDEN STAR
|
||||
raiz esq esq dir dir dir esq SIM
|
||||
Battle Brothers
|
||||
raiz esq esq esq dir esq dir NAO
|
||||
Fugl
|
||||
raiz esq dir esq esq esq dir NAO
|
||||
Crypto Is Dead
|
||||
raiz esq esq dir esq dir dir NAO
|
||||
BAD END THEATER
|
||||
raiz esq esq esq dir esq esq NAO
|
||||
HUNTDOWN
|
||||
raiz esq dir esq esq SIM
|
||||
Alien Prop Hunt
|
||||
raiz esq esq esq esq dir esq NAO
|
||||
Motorama
|
||||
raiz esq dir dir dir esq NAO
|
||||
BAD END THEATER
|
||||
raiz esq esq esq dir esq esq NAO
|
||||
Homebrew - Patent Unknown
|
||||
raiz esq dir esq esq dir dir SIM
|
||||
Football Manager 2019 Touch
|
||||
raiz esq dir esq esq esq dir NAO
|
||||
Everreach: Project Eden
|
||||
raiz esq esq dir dir dir esq dir NAO
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
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
|
||||
Samurai Bringer
|
||||
Another Otter
|
||||
Chuhou Joutai 2: Paraided!
|
||||
Mutant Mudds Deluxe
|
||||
HUNTDOWN
|
||||
A Detective's Novel
|
||||
Solasta: Crown of the Magister
|
||||
FIM
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
=> Samurai Bringer
|
||||
Posicao: 18
|
||||
=> Another Otter
|
||||
Posicao: 19
|
||||
=> Chuhou Joutai 2: Paraided!
|
||||
Posicao: 28
|
||||
=> Mutant Mudds Deluxe
|
||||
Posicao: 15
|
||||
=> HUNTDOWN
|
||||
Posicao: 1
|
||||
=> A Detective's Novel
|
||||
Posicao: 2
|
||||
=> Solasta: Crown of the Magister
|
||||
Posicao: 23
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
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
|
||||
Samurai Bringer
|
||||
Another Otter
|
||||
Chuhou Joutai 2: Paraided!
|
||||
Mutant Mudds Deluxe
|
||||
HUNTDOWN
|
||||
A Detective's Novel
|
||||
Solasta: Crown of the Magister
|
||||
FIM
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
=> Samurai Bringer
|
||||
Posicao: 18
|
||||
=> Another Otter
|
||||
Posicao: 20
|
||||
=> Chuhou Joutai 2: Paraided!
|
||||
NAO
|
||||
=> Mutant Mudds Deluxe
|
||||
Posicao: 16
|
||||
=> HUNTDOWN
|
||||
Posicao: 2
|
||||
=> A Detective's Novel
|
||||
NAO
|
||||
=> Solasta: Crown of the Magister
|
||||
Posicao: 4
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
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
|
||||
Samurai Bringer
|
||||
Another Otter
|
||||
Chuhou Joutai 2: Paraided!
|
||||
Mutant Mudds Deluxe
|
||||
HUNTDOWN
|
||||
A Detective's Novel
|
||||
Solasta: Crown of the Magister
|
||||
FIM
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
=> Samurai Bringer
|
||||
Posicao: 18
|
||||
=> Another Otter
|
||||
Posicao: 19
|
||||
=> Chuhou Joutai 2: Paraided!
|
||||
Posicao: 3
|
||||
=> Mutant Mudds Deluxe
|
||||
Posicao: 15
|
||||
=> HUNTDOWN
|
||||
Posicao: 1
|
||||
=> A Detective's Novel
|
||||
Posicao: 2
|
||||
=> Solasta: Crown of the Magister
|
||||
Posicao: 3
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
2
|
||||
3
|
||||
5 2 7
|
||||
9
|
||||
8 3 10 14 6 4 13 7 1
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
Case 1:
|
||||
Pre.: 5 2 7
|
||||
In..: 2 5 7
|
||||
Post: 2 7 5
|
||||
|
||||
Case 2:
|
||||
Pre.: 8 3 1 6 4 7 10 14 13
|
||||
In..: 1 3 4 6 7 8 10 13 14
|
||||
Post: 1 4 7 6 3 13 14 10 8
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
I c
|
||||
I f
|
||||
I a
|
||||
I h
|
||||
INFIXA
|
||||
PREFIXA
|
||||
POSFIXA
|
||||
P z
|
||||
P h
|
||||
I g
|
||||
INFIXA
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
a c f h
|
||||
c a f h
|
||||
a h f c
|
||||
nao existe
|
||||
h existe
|
||||
a c f g h
|
||||
|
|
@ -1,577 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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 boolean isFim(String line) { return line.compareTo("FIM") == 0; }
|
||||
|
||||
// -------------------------------------------------------------------------------------- //
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
ArrayList<Game> games = new ArrayList<Game>();
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
try {
|
||||
|
||||
// Read CSV file
|
||||
String basefile = "/tmp/games.csv";
|
||||
|
||||
FileInputStream fstream = new FileInputStream(basefile);
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
|
||||
|
||||
// ------------------------------------ //
|
||||
|
||||
// Explode CSV file reading games
|
||||
String line;
|
||||
|
||||
while((line = br.readLine()) != null) {
|
||||
|
||||
Game game = new Game();
|
||||
|
||||
game.read(line);
|
||||
games.add(game);
|
||||
}
|
||||
|
||||
// Close CSV file
|
||||
fstream.close();
|
||||
}
|
||||
catch(IOException e) { e.printStackTrace(); }
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
// Read .in file
|
||||
Scanner scr = new Scanner(System.in);
|
||||
String line = scr.nextLine();
|
||||
|
||||
while(true) {
|
||||
|
||||
if(isFim(line)) break;
|
||||
|
||||
int app_id = Integer.parseInt(line);
|
||||
|
||||
// Search game with .in id
|
||||
for(Game game : games) {
|
||||
|
||||
if(game.getAppId() == app_id) game.print();
|
||||
}
|
||||
|
||||
line = scr.nextLine();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
scr.close();
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
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]
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
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]
|
||||
|
|
@ -1,721 +0,0 @@
|
|||
// ------------------------------------------------------------------------------ //
|
||||
// Author: Vinicius Gabriel dos Santos - https://github.com/ravixr
|
||||
// Sep/2022
|
||||
//
|
||||
// DESCRIPTION:
|
||||
// In addition to the game data structure and
|
||||
// the solution to the second question of the assignment,
|
||||
// this file contains a basic implementation of a string type
|
||||
// which was extensively used in the game data structure
|
||||
// as well as in the solution algorithm.
|
||||
// ------------------------------------------------------------------------------ //
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define GAME_FIELDS_SIZE 17
|
||||
#define MAX_FIELD_SIZE 500
|
||||
#define MAX_LINE_SIZE 1000
|
||||
#define MAX_GAMES 100
|
||||
|
||||
// If on windows remove first slash -> 'tmp/games.csv'
|
||||
#define FILE_PATH "/tmp/games.csv"
|
||||
|
||||
// Assert macro to print custom message when assertion fails
|
||||
#define assert__(x) for (; !(x); assert(x))
|
||||
|
||||
// --------------------------- my_very_basic_string.h --------------------------- //
|
||||
|
||||
typedef struct string_t string;
|
||||
|
||||
typedef struct strarr_t strarr;
|
||||
|
||||
struct string_t {
|
||||
char *buf;
|
||||
char (*char_at)(const string *, size_t);
|
||||
int (*compare)(const string *, const string *);
|
||||
void (*delete)(string *);
|
||||
size_t (*find)(const string *, const char *);
|
||||
size_t (*length)(const string *);
|
||||
void (*replace)(string *, const char *, const char *);
|
||||
strarr (*split)(const string *, const char *);
|
||||
string (*substr)(const string *, size_t, size_t);
|
||||
float (*to_float)(const string *);
|
||||
int (*to_int)(const string *);
|
||||
void (*trim)(string *);
|
||||
};
|
||||
|
||||
struct strarr_t {
|
||||
string *src;
|
||||
size_t length;
|
||||
void (*delete)(strarr *);
|
||||
};
|
||||
|
||||
// string functions declaration
|
||||
char str_char_at(const string *, size_t);
|
||||
int str_compare(const string *, const string *);
|
||||
void str_delete(string *);
|
||||
size_t str_find(const string *, const char *);
|
||||
size_t str_length(const string *);
|
||||
void str_replace(string *, const char*, const char *);
|
||||
string new_string(char *);
|
||||
strarr str_split(const string *, const char *);
|
||||
string str_substr(const string *, size_t, size_t);
|
||||
float str_to_float(const string *);
|
||||
int str_to_int(const string *);
|
||||
void str_trim(string *);
|
||||
|
||||
// strarr functions declaration
|
||||
strarr new_strarr(string *, size_t);
|
||||
void strarr_delete(strarr *);
|
||||
|
||||
// --------------------------- my_very_basic_string.c --------------------------- //
|
||||
|
||||
// Fuction to initialize string type
|
||||
string new_string(char *src)
|
||||
{
|
||||
string str;
|
||||
if (src != NULL) {
|
||||
if (strcmp(src, "") != 0) {
|
||||
str.buf = malloc(sizeof(char) * (strlen(src) + 1));
|
||||
strcpy(str.buf, src);
|
||||
} else {
|
||||
str.buf = malloc(sizeof(char) * 5);
|
||||
strcpy(str.buf, "null");
|
||||
}
|
||||
} else str.buf = NULL;
|
||||
str.char_at = &str_char_at;
|
||||
str.compare = &str_compare;
|
||||
str.delete = &str_delete;
|
||||
str.find = &str_find;
|
||||
str.replace = &str_replace;
|
||||
str.length = &str_length;
|
||||
str.split = &str_split;
|
||||
str.substr = &str_substr;
|
||||
str.to_float = &str_to_float;
|
||||
str.to_int = &str_to_int;
|
||||
str.trim = &str_trim;
|
||||
return str;
|
||||
}
|
||||
|
||||
// Fuction to deallocate string type
|
||||
void str_delete(string *self)
|
||||
{
|
||||
free(self->buf);
|
||||
}
|
||||
|
||||
// Returns character present in the specified index of the string
|
||||
// e.g: "foo" idx: 0 -> 'f'
|
||||
char str_char_at(const string *self, size_t idx)
|
||||
{
|
||||
// Macro to assert index is in bounds
|
||||
assert__(idx < strlen(self->buf)) {
|
||||
fprintf(stderr, "String index %ld is out of bounds\n", idx);
|
||||
}
|
||||
return self->buf[idx];
|
||||
}
|
||||
|
||||
// Allows comparison between string type variables using strcmp in the raw data
|
||||
int str_compare(const string *self, const string *another_str)
|
||||
{
|
||||
return strcmp(self->buf, another_str->buf);
|
||||
}
|
||||
|
||||
// Searches the string for the first occurrence of the pattern specified.
|
||||
// Returns the index position of the first character of the pattern
|
||||
// or the length of the string if the pattern is not found
|
||||
// e.g.: "foo bar", "bar" -> 4 | "foo bar", "baz" -> 7
|
||||
size_t str_find(const string *self, const char *lkf)
|
||||
{
|
||||
size_t i = 0,
|
||||
self_len = strlen(self->buf),
|
||||
lkf_len = strlen(lkf);
|
||||
|
||||
// Macro to assert pattern string is valid
|
||||
assert__((strcmp(lkf, "") != 0) && (lkf_len <= self_len)) {
|
||||
fprintf(stderr, "Pattern '%s' is invalid for the specified string\n", lkf);
|
||||
}
|
||||
|
||||
// Find algorithm
|
||||
for (size_t j = 0; i < self_len; i++) {
|
||||
if (self->buf[i] == lkf[j]) {
|
||||
j++;
|
||||
} else {
|
||||
i-= j; j = 0;
|
||||
}
|
||||
if (j == lkf_len) {
|
||||
i -= (j - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
// Returns the length of the string using strlen in the raw data
|
||||
size_t str_length(const string *self)
|
||||
{
|
||||
return strlen(self->buf);
|
||||
}
|
||||
|
||||
// Replaces all occurrences of specified pattern in the string with the new specified pattern
|
||||
// if the string doesn't contains the pattern to be replaced the string is not changed
|
||||
// e.g.: "foobar", "bar", "" -> "foo" | "foobar", "baz", "" -> "foobar"
|
||||
void str_replace(string *self, const char *old_val, const char *new_val)
|
||||
{
|
||||
// Saving useful lengths in variables
|
||||
size_t old_len = strlen(self->buf),
|
||||
nv_len = strlen(new_val),
|
||||
ov_len = strlen(old_val);
|
||||
|
||||
// Macro to assert given pattern is valid
|
||||
assert__((strcmp(old_val, "") != 0) && (old_len >= ov_len)) {
|
||||
fprintf(stderr, "Invalid pattern for argument 'old_val'\n");
|
||||
}
|
||||
|
||||
// Calculating the max possible amount of patterns in the string
|
||||
// then allocating an array to store their indexes
|
||||
size_t idx_sz = (old_len / ov_len),
|
||||
*idx = malloc(sizeof(size_t) * (idx_sz + 1)),
|
||||
idx_i = 0, last_idx = 0, skip = 0;
|
||||
|
||||
// Getting all starting indexes of where the pattern is found
|
||||
string aux = new_string(NULL);
|
||||
aux.buf = (self->buf);
|
||||
while ((idx_i <= idx_sz) && (last_idx < old_len)) {
|
||||
idx[idx_i] = str_find(&aux, old_val) + skip;
|
||||
skip = idx[idx_i++] + ov_len;
|
||||
aux.buf = (self->buf + skip);
|
||||
last_idx = idx[idx_i - 1];
|
||||
}
|
||||
|
||||
// Checking if the pattern is actually on the string
|
||||
if (idx[0] != old_len) {
|
||||
// Assuring 'idx_i' will not be 0
|
||||
idx_i > 1 ? (idx_i -= 1) : (idx_i = 1);
|
||||
|
||||
// Calculating new length of the string then allocating
|
||||
size_t new_len = (old_len + ((nv_len - ov_len) * idx_i));
|
||||
char *tmp = malloc(sizeof(char) * (new_len + 1));
|
||||
|
||||
// Main Replacement algorithm: copies old string char by char,
|
||||
// when the index is equal to the range of the next found pattern
|
||||
// starts copying the new pattern char by chat into the string
|
||||
if (nv_len == 0) nv_len = 1;
|
||||
for (size_t i = 0, j = 0, k = 0, l = 0; i < new_len;) {
|
||||
if (k >= idx[l] && k < (idx[l] + ov_len)) {
|
||||
if (strcmp(new_val, "") != 0)
|
||||
tmp[i++] = new_val[j];
|
||||
j++;
|
||||
if (j == nv_len) {
|
||||
k += ov_len;
|
||||
j = 0; l++;
|
||||
}
|
||||
} else tmp[i++] = self->buf[k++];
|
||||
}
|
||||
tmp[new_len] = '\0'; // Adding null terminator in the new string
|
||||
free(self->buf); // freeing old string
|
||||
self->buf = tmp; // Pointing to new string
|
||||
}
|
||||
free(idx); // freeing array of indexes of the old string
|
||||
}
|
||||
|
||||
// Uses strtok to split the raw char array
|
||||
// then build new strings with the splitted char arrays
|
||||
// and bundle all of them in the strarr type
|
||||
// e.g.: 'foo,bar' ',' -> ['foo', 'bar']
|
||||
strarr str_split(const string *self, const char *delim)
|
||||
{
|
||||
char *str = malloc(sizeof(char) * (strlen(self->buf) + 1));
|
||||
strcpy(str, self->buf);
|
||||
char *token = strtok(str, delim);
|
||||
size_t count = 0;
|
||||
strarr str_arr = new_strarr(NULL, 0);
|
||||
string *tmp;
|
||||
while(token != NULL) {
|
||||
tmp = realloc(str_arr.src, sizeof(string) * (count + 1));
|
||||
if (tmp != NULL) {
|
||||
tmp[count++] = new_string(token);
|
||||
str_arr.src = tmp;
|
||||
}
|
||||
token = strtok(NULL, delim);
|
||||
}
|
||||
free(str);
|
||||
free(token);
|
||||
str_arr.length = count;
|
||||
return str_arr;
|
||||
}
|
||||
|
||||
// Returns a new string that is a copy of the portion of the original string
|
||||
// that starts at character position 'pos' and spans 'len' characters
|
||||
// e.g.: "foo bar" pos: 4, len: 3 -> "bar"
|
||||
string str_substr(const string *self, size_t pos, size_t len)
|
||||
{
|
||||
// Macro to assert pos and len are in bounds
|
||||
assert__((pos + len) <= strlen(self->buf)) {
|
||||
fprintf(stderr, "String index %ld is out of bounds for '%s'\n", (pos + len), self->buf);
|
||||
}
|
||||
string substr = new_string(NULL);
|
||||
substr.buf = malloc(sizeof(char) * (len + 1));
|
||||
for (size_t i = 0, j = 0; i < len; i++, j++) {
|
||||
substr.buf[j] = self->buf[pos + i];
|
||||
}
|
||||
substr.buf[len] = '\0';
|
||||
return substr;
|
||||
}
|
||||
|
||||
// Uses atof to convert string to float
|
||||
float str_to_float(const string *self)
|
||||
{
|
||||
return atof(self->buf);
|
||||
}
|
||||
|
||||
// Uses atoi to convert string to int
|
||||
int str_to_int(const string *self)
|
||||
{
|
||||
return atoi(self->buf);
|
||||
}
|
||||
|
||||
// Removes all spaces only from the beginning and ending of the string
|
||||
// e.g.: " foo " -> "foo" | "foo bar" -> "foo bar"
|
||||
void str_trim(string *self)
|
||||
{
|
||||
size_t i = 0, j = (strlen(self->buf) - 1);
|
||||
while (self->buf[i] == ' ' || self->buf[j] == ' ') {
|
||||
if (self->buf[i] == ' ') i++;
|
||||
if (self->buf[j] == ' ') j--;
|
||||
}
|
||||
string tmp = self->substr(self, i, (j - i) + 1);
|
||||
free(self->buf);
|
||||
self->buf = tmp.buf;
|
||||
}
|
||||
|
||||
// Fuction to initialize string array type
|
||||
strarr new_strarr(string *src, size_t src_length)
|
||||
{
|
||||
strarr str_arr;
|
||||
if (src != NULL)
|
||||
str_arr.src = src;
|
||||
else {
|
||||
src_length = (src_length > 0 ? src_length : 1);
|
||||
str_arr.src = malloc(sizeof(string *));
|
||||
}
|
||||
str_arr.length = src_length;
|
||||
str_arr.delete = &strarr_delete;
|
||||
return str_arr;
|
||||
}
|
||||
|
||||
// Fuction to deallocate string array type
|
||||
void strarr_delete(strarr *self)
|
||||
{
|
||||
for (size_t i = 0; i < self->length; i++) {
|
||||
free(self->src[i].buf);
|
||||
}
|
||||
free(self->src);
|
||||
}
|
||||
|
||||
// ----------------------------------- game.h ----------------------------------- //
|
||||
|
||||
typedef struct date_t date;
|
||||
|
||||
struct date_t {
|
||||
uint8_t day;
|
||||
char month[4];
|
||||
unsigned year;
|
||||
size_t value;
|
||||
};
|
||||
|
||||
date new_date(string *);
|
||||
unsigned strmon_to_int(const char *);
|
||||
|
||||
typedef struct game_t game;
|
||||
|
||||
struct game_t {
|
||||
unsigned app_id;
|
||||
string name;
|
||||
date release_date;
|
||||
string owners;
|
||||
unsigned age;
|
||||
float price;
|
||||
unsigned dlcs;
|
||||
strarr languages;
|
||||
string website;
|
||||
bool windows;
|
||||
bool mac;
|
||||
bool linux_;
|
||||
float upvotes;
|
||||
unsigned avg_pt;
|
||||
string developers;
|
||||
strarr genres;
|
||||
};
|
||||
|
||||
game empty_game(void);
|
||||
game new_game(string *);
|
||||
game str_to_game(string *);
|
||||
game chararr_to_game(char *);
|
||||
void game_print(game *);
|
||||
void game_read_csv(game *, size_t *, size_t);
|
||||
char *avgpt_to_chararr (unsigned);
|
||||
|
||||
// ----------------------------------- game.c ----------------------------------- //
|
||||
|
||||
// Converts month abbreviated char array in format 'Mmm'
|
||||
// to unsigned int, if unsuccessful returns 0
|
||||
// e.g.: "Aug" -> 8 | "aug" -> 0
|
||||
unsigned strmon_to_int(const char *mon)
|
||||
{
|
||||
unsigned i = 0;
|
||||
if (strcmp(mon, "Jan") == 0) { i = 1; }
|
||||
else if (strcmp(mon, "Feb") == 0) { i = 2; }
|
||||
else if (strcmp(mon, "Mar") == 0) { i = 3; }
|
||||
else if (strcmp(mon, "Apr") == 0) { i = 4; }
|
||||
else if (strcmp(mon, "May") == 0) { i = 5; }
|
||||
else if (strcmp(mon, "Jun") == 0) { i = 6; }
|
||||
else if (strcmp(mon, "Jul") == 0) { i = 7; }
|
||||
else if (strcmp(mon, "Aug") == 0) { i = 8; }
|
||||
else if (strcmp(mon, "Sep") == 0) { i = 9; }
|
||||
else if (strcmp(mon, "Oct") == 0) { i = 10; }
|
||||
else if (strcmp(mon, "Nov") == 0) { i = 11; }
|
||||
else if (strcmp(mon, "Dec") == 0) { i = 12; }
|
||||
return i;
|
||||
}
|
||||
|
||||
// Fuction to initialize date type
|
||||
// Assumes that argument is a string
|
||||
// in the format 'mmm dd, yyyy' or 'mmm yyyy'
|
||||
// or NULL for empty initialization
|
||||
date new_date(string *fmt)
|
||||
{
|
||||
date d;
|
||||
if (fmt != NULL) {
|
||||
uint8_t i = 0;
|
||||
string aux;
|
||||
// If the format is 'mmm dd, yyyy'
|
||||
if (strlen(fmt->buf) > 10) {
|
||||
// parsing day
|
||||
i = fmt->find(fmt, ",") - 4;
|
||||
aux = fmt->substr(fmt, 4, i);
|
||||
d.day = aux.to_int(&aux);
|
||||
aux.delete(&aux);
|
||||
|
||||
// parsing month
|
||||
aux = fmt->substr(fmt, 0, 3);
|
||||
strcpy(d.month, aux.buf);
|
||||
aux.delete(&aux);
|
||||
|
||||
// parsing year
|
||||
i = fmt->find(fmt, ",") + 2;
|
||||
aux = fmt->substr(fmt, i, (fmt->length(fmt) - i));
|
||||
d.year = aux.to_int(&aux);
|
||||
aux.delete(&aux);
|
||||
} else { // Assuming format is 'mmm yyyy'
|
||||
// no day provided in this format
|
||||
d.day = 0;
|
||||
|
||||
// parsing month
|
||||
i = fmt->find(fmt, " ");
|
||||
aux = fmt->substr(fmt, 0, i);
|
||||
strcpy(d.month, aux.buf);
|
||||
aux.delete(&aux);
|
||||
|
||||
// parsing year
|
||||
aux = fmt->substr(fmt, (i + 1), fmt->length(fmt) - (i + 1));
|
||||
d.year = aux.to_int(&aux);
|
||||
aux.delete(&aux);
|
||||
}
|
||||
// parsing value
|
||||
unsigned mon = strmon_to_int(d.month);
|
||||
d.value = ((d.year * 10000) + (mon * 100) + d.day);
|
||||
} else {
|
||||
d.day = 0;
|
||||
strcpy(d.month, "mmm");
|
||||
d.year = 0;
|
||||
d.value = 0;
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
// Function to initialize
|
||||
// an 'empty' game struct
|
||||
game empty_game(void)
|
||||
{
|
||||
game g;
|
||||
g.app_id = 0;
|
||||
g.name = new_string("");
|
||||
g.release_date = new_date(NULL);
|
||||
g.owners = new_string("");
|
||||
g.age = 0;
|
||||
g.price = 0.0f;
|
||||
g.dlcs = 0;
|
||||
g.languages = new_strarr(NULL, 0);
|
||||
g.website = new_string("");
|
||||
g.windows = false;
|
||||
g.mac = false;
|
||||
g.linux_ = false;
|
||||
g.upvotes = 0.0f;
|
||||
g.avg_pt = 0;
|
||||
g.developers = new_string("");
|
||||
g.genres = new_strarr(NULL, 0);
|
||||
return g;
|
||||
}
|
||||
|
||||
// Function to initialize a new game with
|
||||
// the retrievd data in the string array
|
||||
game new_game(string *s_arr)
|
||||
{
|
||||
game g;
|
||||
if (s_arr != NULL) {
|
||||
// App id
|
||||
g.app_id = atoi(s_arr[0].buf);
|
||||
// Name
|
||||
g.name = new_string(s_arr[1].buf);
|
||||
// Release date
|
||||
g.release_date = new_date(s_arr + 2);
|
||||
// Owners
|
||||
g.owners = new_string(s_arr[3].buf);
|
||||
// Age, Price, DLCs
|
||||
g.age = atoi(s_arr[4].buf);
|
||||
g.price = atof(s_arr[5].buf);
|
||||
g.dlcs = atoi(s_arr[6].buf);
|
||||
// Languages
|
||||
// If string is not empty then splits it into a string array
|
||||
if (strcmp(s_arr[7].buf, "[]") != 0) {
|
||||
string tmp = s_arr[7].substr(s_arr + 7, 2, strlen(s_arr[7].buf) - 4);
|
||||
tmp.replace(&tmp, "', '", "|");
|
||||
g.languages = tmp.split(&tmp, "|");
|
||||
tmp.delete(&tmp);
|
||||
} else {
|
||||
g.languages = new_strarr(NULL, 0);
|
||||
string *tmp = realloc(g.languages.src, sizeof(string));
|
||||
if (tmp != NULL) {
|
||||
tmp[0] = new_string("");
|
||||
g.languages.src = tmp;
|
||||
g.languages.length = 1;
|
||||
}
|
||||
}
|
||||
// Website
|
||||
g.website = new_string(s_arr[8].buf);
|
||||
// Windows, Mac, Linux
|
||||
g.windows = (strcmp(s_arr[9].buf, "True") == 0) ? true : false;
|
||||
g.mac = (strcmp(s_arr[10].buf, "True") == 0) ? true : false;
|
||||
g.linux_ = (strcmp(s_arr[11].buf, "True") == 0) ? true : false;
|
||||
// Upvotes
|
||||
float up_votes = atof(s_arr[12].buf);
|
||||
float down_votes = atof(s_arr[13].buf);
|
||||
g.upvotes = (up_votes / ((up_votes + down_votes) / 100));
|
||||
// Avg pt
|
||||
g.avg_pt = atoi(s_arr[14].buf);
|
||||
// Developers
|
||||
g.developers = new_string(s_arr[15].buf);
|
||||
// Genres
|
||||
// If string is not empty and has a ',' then splits it into a string array
|
||||
if ((strcmp(s_arr[16].buf, "") != 0) &&
|
||||
(s_arr[16].find(s_arr + 16, ",") != strlen(s_arr[16].buf))) {
|
||||
g.genres = s_arr[16].split(s_arr + 16, ",");
|
||||
} else {
|
||||
g.genres = new_strarr(NULL, 0);
|
||||
string *tmp = realloc(g.genres.src, sizeof(string));
|
||||
if (tmp != NULL) {
|
||||
tmp[0] = new_string(s_arr[16].buf);
|
||||
g.genres.src = tmp;
|
||||
g.genres.length = 1;
|
||||
}
|
||||
}
|
||||
} else g = empty_game();
|
||||
return g;
|
||||
}
|
||||
|
||||
// function to deallocates all
|
||||
// the heap variables inside the game struct
|
||||
void game_delete(game *g)
|
||||
{
|
||||
if (g != NULL) {
|
||||
g->name.delete(&g->name);
|
||||
g->owners.delete(&g->owners);
|
||||
g->languages.delete(&g->languages);
|
||||
g->website.delete(&g->website);
|
||||
g->developers.delete(&g->developers);
|
||||
g->genres.delete(&g->genres);
|
||||
}
|
||||
}
|
||||
|
||||
// Receives a char array that contains
|
||||
// the data of the game strut in a csv format
|
||||
// parses it and returns a game data structure
|
||||
game chararr_to_game(char *ch_arr)
|
||||
{
|
||||
game g;
|
||||
if (ch_arr != NULL) {
|
||||
// Initializing static array of strings
|
||||
// where each index will be a field of the game data struct
|
||||
string s_arr[GAME_FIELDS_SIZE];
|
||||
for (int i = 0; i < GAME_FIELDS_SIZE; i++) {
|
||||
s_arr[i] = new_string(NULL);
|
||||
}
|
||||
|
||||
// Initializing variables for the split algorithm
|
||||
string aux = new_string(NULL);
|
||||
aux.buf = malloc(sizeof(char) * MAX_LINE_SIZE);
|
||||
size_t ch_arr_len = strlen(ch_arr), s_arr_i = 0, aux_i = 0;
|
||||
bool is_str_lit = false;
|
||||
|
||||
// Loop to split each csv cell into a string
|
||||
// and adds it to the array of strings
|
||||
for (size_t i = 0; i < ch_arr_len; i++) {
|
||||
if (ch_arr[i] == '"') {
|
||||
is_str_lit = (is_str_lit ? false : true);
|
||||
} else if (ch_arr[i] == ',' && !is_str_lit) {
|
||||
aux.buf[aux_i] = '\0';
|
||||
s_arr[s_arr_i].buf = malloc(sizeof(char) * (strlen(aux.buf) + 1));
|
||||
strcpy(s_arr[s_arr_i].buf, aux.buf);
|
||||
s_arr_i++; aux_i = 0;
|
||||
} else {
|
||||
aux.buf[aux_i++] = ch_arr[i];
|
||||
}
|
||||
}
|
||||
// Adding last string cell to the array
|
||||
aux.buf[aux_i] = '\0';
|
||||
s_arr[s_arr_i].buf = malloc(sizeof(char) * (strlen(aux.buf) + 1));
|
||||
strcpy(s_arr[s_arr_i].buf, aux.buf);
|
||||
aux.delete(&aux);
|
||||
// Creating game with parsed data
|
||||
g = new_game(s_arr);
|
||||
|
||||
// Deallocating the string array
|
||||
for (size_t i = 0; i < GAME_FIELDS_SIZE; i++) {
|
||||
free(s_arr[i].buf);
|
||||
}
|
||||
} else g = empty_game();
|
||||
return g;
|
||||
}
|
||||
|
||||
// Converts avg_pt (int with amount of minutes)
|
||||
// to a string in format '[x]h [y]m' returns
|
||||
// a string with 'null' if avg_pt equals zero
|
||||
char *avgpt_to_chararr (unsigned avg_pt)
|
||||
{
|
||||
char *c_arr = calloc(16, sizeof(char));
|
||||
if (avg_pt != 0) {
|
||||
unsigned h = avg_pt / 60;
|
||||
unsigned m = avg_pt % 60;
|
||||
|
||||
if (h != 0 && m != 0) {
|
||||
snprintf(c_arr, 16, "%dh %dm", h, m);
|
||||
} else if (h != 0) {
|
||||
snprintf(c_arr, 16, "%dh", h);
|
||||
} else if (m != 0) {
|
||||
snprintf(c_arr, 16, "%dm", m);
|
||||
}
|
||||
} else {
|
||||
strcpy(c_arr, "null");
|
||||
}
|
||||
return c_arr;
|
||||
}
|
||||
|
||||
// prints the game structure in the format
|
||||
// as is specified in the assignment
|
||||
void game_print(game *g)
|
||||
{
|
||||
printf("%u %s %s/%d %s %u %.2f %u [",
|
||||
g->app_id, g->name.buf,
|
||||
g->release_date.month,
|
||||
g->release_date.year,
|
||||
g->owners.buf, g->age,
|
||||
g->price, g->dlcs);
|
||||
// languages
|
||||
for (size_t i = 0; i < g->languages.length - 1; i++)
|
||||
printf("%s, ", g->languages.src[i].buf);
|
||||
char *aux = avgpt_to_chararr(g->avg_pt);
|
||||
printf("%s] %s %s %s %s %.0f%% %s %s [",
|
||||
g->languages.src[g->languages.length - 1].buf, g->website.buf,
|
||||
(g->windows ? "true" : "false"), (g->mac ? "true" : "false"),
|
||||
(g->linux_ ? "true" : "false"), g->upvotes, aux, g->developers.buf);
|
||||
free(aux);
|
||||
// genres
|
||||
for (size_t i = 0; i < g->genres.length - 1; i++)
|
||||
printf("%s, ", g->genres.src[i].buf);
|
||||
printf("%s]\n", g->genres.src[g->genres.length - 1].buf);
|
||||
}
|
||||
|
||||
// Search for the matching 'app_id' and read the game data
|
||||
// from the file 'games.csv' then adds the game to the games array
|
||||
void game_read_csv(game *games, size_t *ids, size_t ids_len)
|
||||
{
|
||||
// Handling file opening
|
||||
FILE *f = fopen(FILE_PATH, "r");
|
||||
assert__(f != NULL) {
|
||||
fprintf(stderr, "Failed to open '%s'\n%s", FILE_PATH,
|
||||
"Hint: Try adding or removing a '/' in front (OS Dependent)\n");
|
||||
}
|
||||
|
||||
char line[MAX_LINE_SIZE + 1];
|
||||
size_t cur_id = 0;
|
||||
// Searching the desired id then calling the parser function
|
||||
for (size_t i = 0; i < ids_len; i++) {
|
||||
while (cur_id != ids[i]) {
|
||||
// reads line from file
|
||||
fgets(line, MAX_LINE_SIZE, f);
|
||||
// checking if is a reserved char to then trim it
|
||||
if (line[strlen(line) - 2] < ' ') line[strlen(line) - 2] = '\0';
|
||||
else if (line[strlen(line) - 1] < ' ') line[strlen(line) - 1] = '\0';
|
||||
// atoi will only parse the beginning of the string ;)
|
||||
cur_id = atoi(line);
|
||||
}
|
||||
rewind(f); // Resets file pointer to the beginning of the file
|
||||
games[i] = chararr_to_game(line); // calling parser function
|
||||
}
|
||||
fclose(f); // closing the file
|
||||
}
|
||||
|
||||
// ------------------------------------ main ------------------------------------ //
|
||||
|
||||
// Uses strcmp to check if
|
||||
// input string equals 'FIM'
|
||||
// meaning end of input
|
||||
bool is_fim(char *c_arr)
|
||||
{
|
||||
return (strcmp(c_arr, "FIM") == 0);
|
||||
}
|
||||
|
||||
// The main function contains the solution to
|
||||
// the second question of the assignment, which is
|
||||
// to read 'n' lines of strings containing the
|
||||
// desired IDs of games to be read from the file 'games.csv',
|
||||
// parse the data, store it in a game struct already defined,
|
||||
// and print all of them in a specified format.
|
||||
int main(void)
|
||||
{
|
||||
// game array
|
||||
game games[MAX_GAMES];
|
||||
size_t games_sz = 0;
|
||||
// input variables
|
||||
char input[MAX_FIELD_SIZE ];
|
||||
size_t ids[MAX_GAMES];
|
||||
|
||||
// Reading input and converting to integer
|
||||
// then adding it to the array of ids to be searched
|
||||
fgets(input, MAX_LINE_SIZE, stdin);
|
||||
input[strlen(input) - 1] = '\0';
|
||||
while (!is_fim(input)) {
|
||||
ids[games_sz++] = atoi(input);
|
||||
fgets(input, MAX_LINE_SIZE, stdin);
|
||||
// checking if is a reserved char to then trim it
|
||||
if (input[strlen(input) - 2] < ' ') input[strlen(input) - 2] = '\0';
|
||||
else if (input[strlen(input) - 1] < ' ') input[strlen(input) - 1] = '\0';
|
||||
}
|
||||
// If the array of ids is not empty
|
||||
if (games_sz > 0) {
|
||||
// Calls function to read from file and populate array of games
|
||||
game_read_csv(games, ids, games_sz);
|
||||
|
||||
// Prints the games read and frees the heap allocated memory
|
||||
for (size_t i = 0; i < games_sz; i++) {
|
||||
game_print(games + i);
|
||||
game_delete(games + i);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
|
|
@ -1,728 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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 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) - 2 - 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;
|
||||
}
|
||||
Binary file not shown.
|
|
@ -1,728 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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;
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
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]
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
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]
|
||||
|
|
@ -1,204 +0,0 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,607 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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();
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,204 +0,0 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,627 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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();
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------- //
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,739 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
}
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
(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]
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
(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]
|
||||
|
|
@ -1,669 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
}
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
(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]
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
(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]
|
||||
|
|
@ -1,714 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------ //
|
||||
}
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
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]
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
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]
|
||||
|
|
@ -1,869 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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.
|
|
@ -1,868 +0,0 @@
|
|||
/**
|
||||
|
||||
* @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;
|
||||
}
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
(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]
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
(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