Adiciona gabarito - TP02Q02
This commit is contained in:
parent
e3c92ee3ca
commit
696f82e18d
Binary file not shown.
|
|
@ -0,0 +1,718 @@
|
|||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// 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.
|
|
@ -0,0 +1,718 @@
|
|||
// -------------------------------------------------------------------------------- //
|
||||
|
||||
// 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;
|
||||
ssize_t read;
|
||||
|
||||
fp = fopen("/tmp/games.csv", "r");
|
||||
|
||||
if(fp == NULL) exit(EXIT_FAILURE);
|
||||
|
||||
// ------------------------- //
|
||||
|
||||
// Fill games list
|
||||
while((read = getline(&line, &len, fp)) != -1) {
|
||||
|
||||
Game game;
|
||||
|
||||
game_start(&game);
|
||||
game_read(&game, line);
|
||||
list_insert(game);
|
||||
}
|
||||
|
||||
// ------------------------- //
|
||||
|
||||
fclose(fp);
|
||||
|
||||
if(line) free(line);
|
||||
|
||||
// ------------------------------------------------------------ //
|
||||
|
||||
// Second part - Print .in games
|
||||
|
||||
char in[15];
|
||||
scanf(" %[^\n]s", in);
|
||||
|
||||
while(true) {
|
||||
|
||||
if(isFim(in)) break;
|
||||
else {
|
||||
|
||||
int app_id = atoi(in);
|
||||
|
||||
for(int i = 0; i < n; i++) {
|
||||
|
||||
if(games[i].app_id == app_id) {
|
||||
|
||||
game_print(&games[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------- //
|
||||
|
||||
scanf(" %[^\n]s", in);
|
||||
}
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
|
||||
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
|
||||
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
|
||||
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
|
||||
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
|
||||
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
|
||||
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
|
||||
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
|
||||
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
|
||||
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
|
||||
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
|
||||
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
|
||||
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
|
||||
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
|
||||
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
|
||||
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
|
||||
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
|
||||
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
|
||||
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
|
||||
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
|
||||
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
|
||||
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
|
||||
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
|
||||
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
|
||||
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
|
||||
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
|
||||
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
|
||||
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
|
||||
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
|
||||
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
|
||||
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
|
||||
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
|
||||
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
|
||||
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
|
||||
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
|
||||
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
|
||||
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
|
||||
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
|
||||
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
|
||||
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
|
||||
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
|
||||
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
|
||||
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
|
||||
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
|
||||
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
|
||||
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
|
||||
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
|
||||
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
|
||||
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
|
||||
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
840010
|
||||
866510
|
||||
1970560
|
||||
411740
|
||||
1509590
|
||||
458520
|
||||
920210
|
||||
1444020
|
||||
1232460
|
||||
2026070
|
||||
258880
|
||||
295250
|
||||
299500
|
||||
574080
|
||||
598780
|
||||
1217190
|
||||
257730
|
||||
1807730
|
||||
773670
|
||||
1803150
|
||||
1573070
|
||||
513930
|
||||
385250
|
||||
261880
|
||||
533300
|
||||
542340
|
||||
1209040
|
||||
8790
|
||||
8000
|
||||
415150
|
||||
2012500
|
||||
691150
|
||||
283370
|
||||
249650
|
||||
268870
|
||||
1172510
|
||||
927890
|
||||
25700
|
||||
281610
|
||||
485610
|
||||
1276850
|
||||
722340
|
||||
1499640
|
||||
1848450
|
||||
615700
|
||||
744980
|
||||
10180
|
||||
234390
|
||||
1641670
|
||||
427520
|
||||
FIM
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
840010 Garden Paws Dec/2018 50000 - 100000 0 19.99 2 [English] http://www.gardenpawsgame.com true true false 92% 5h 46m Bitten Toast Games Inc. [Adventure, Indie, RPG, Simulation]
|
||||
866510 !AnyWay! Jun/2018 50000 - 100000 0 1.79 37 [English, Russian, French, Italian, German, Polish, Ukrainian, Swedish, Simplified Chinese] null true false false 69% 5h 53m EYEFRONT [Adventure, Casual, Indie]
|
||||
1970560 Bobbi Adventure May/2022 50000 - 100000 0 24.99 0 [English] null true false false 67% null Felio Stung ROG [Indie]
|
||||
411740 Yet Another World Nov/2015 50000 - 100000 0 5.99 0 [English] null true true true 78% 6h 24m Energy Milk [Action, Adventure, Indie]
|
||||
1509590 Fujiwara Bittersweet Jan/2021 50000 - 100000 0 0.00 0 [English] null true true true 91% null MagicBenchVN [Free to Play, Indie]
|
||||
458520 Wrath of Anna Apr/2018 50000 - 100000 0 19.99 1 [English, Spanish - Spain, Hungarian, German, Norwegian, Polish, Swedish, Russian] http://LorenzoEnt.com true false false 35% 2h 50m Lorenzo Ent.,Michael L. Fiorentino Gutierrez [Action, Adventure, Indie]
|
||||
920210 LEGO® Star Wars™: The Skywalker Saga Apr/2022 500000 - 1000000 0 49.99 8 [English, French, Italian, German, Spanish - Spain, Arabic, Danish, Dutch, Korean, Polish, Portuguese - Brazil, Russian, Spanish - Latin America, Traditional Chinese, Japanese] null true false false 92% 22h 42m TT Games [Action, Adventure]
|
||||
1444020 Reactor Tech² Aug/2021 50000 - 100000 0 14.99 0 [English, Russian] null true false false 68% null 4Co [Indie, Simulation, Strategy]
|
||||
1232460 Onee Chanbara ORIGIN Oct/2020 50000 - 100000 18 59.99 96 [English, Simplified Chinese, Traditional Chinese, Japanese, Korean] null true false false 72% 2h 25m Tamsoft [Action]
|
||||
2026070 Tank Commander: Battlefield Jul/2022 50000 - 100000 0 2.99 0 [English] null true false false 100% null SP GAMES [Action, Indie, Simulation]
|
||||
258880 Professional Farmer 2014 Nov/2013 50000 - 100000 0 2.99 2 [English, French, Italian, German, Spanish - Spain, Polish, Russian, Dutch, Swedish, Norwegian] http://www.professional-farmer.com/ true false false 46% 32h 9m PlayWay S.A. [Simulation]
|
||||
295250 Stranded May/2014 50000 - 100000 0 0.49 0 [English] null true true true 35% 3h 56m Peter Moorhead [Adventure, Indie]
|
||||
299500 International Snooker May/2014 50000 - 100000 0 5.99 0 [English] http://www.bigheadgames.co.uk/ true false false 62% 1h 11m Big Head Games Ltd [Casual, Sports]
|
||||
574080 Fog of War Jun/2018 50000 - 100000 0 4.99 1 [English, Russian] null true false false 48% 6h 14m Monkeys Lab. [Action, Indie, Massively Multiplayer, RPG, Simulation, Strategy]
|
||||
598780 Boreal Blade Nov/2020 50000 - 100000 0 3.99 0 [English, French, Italian, German, Spanish - Spain, Japanese, Korean, Portuguese - Brazil, Russian, Simplified Chinese] https://www.borealblade.com true false false 66% null Frozenbyte [Action, Early Access]
|
||||
1217190 浮世万千之前世今生 Jan/2020 50000 - 100000 0 5.49 1 [Simplified Chinese] null true false false 78% null 飞天大胖喵 [Adventure, Casual, Indie, RPG, Strategy]
|
||||
257730 Infinity Wars: Animated Trading Card Game Sep/2014 500000 - 1000000 0 0.00 0 [English, Simplified Chinese] http://www.infinitywarsgame.com true false false 77% 6h 24m Lightmare Studios [Indie, Massively Multiplayer, Strategy]
|
||||
1807730 Lab Bio-Terror Dec/2021 50000 - 100000 0 12.99 0 [English] null true false false 82% null VOLTECH [Action, Indie]
|
||||
773670 Delete Jan/2018 50000 - 100000 0 1.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean] null true true false 96% 1h 24m PONY [Casual, Indie]
|
||||
1803150 Void Slayer Jan/2022 50000 - 100000 0 4.99 0 [English] null true false false 79% null Madmind Studio: After hours [Action, Indie]
|
||||
1573070 Endless Furry Blackjack Mar/2021 50000 - 100000 0 0.99 0 [English] https://m.youtube.com/ericyoungvfx/ true false false 20% null Tegridy Made Games [Casual, Indie, Sports, Strategy]
|
||||
513930 J.U.R : Japan Underground Racing Aug/2016 50000 - 100000 0 0.49 0 [English] null true false false 32% null JDM4iK [Casual, Indie, Racing, Simulation]
|
||||
385250 Paint it Back Oct/2015 50000 - 100000 0 7.99 0 [English] http://casuallabs.com/wp/?page_id=24 true true true 98% null Casual Labs [Casual]
|
||||
261880 Corporate Lifestyle Simulator Mar/2014 50000 - 100000 0 4.99 1 [English] http://www.dolphinbarn.com true false false 83% 4h 7m DolphinBarn [Action, Casual, Indie]
|
||||
533300 Zup! Oct/2016 500000 - 1000000 0 0.99 1 [English, French, Italian, German, Spanish - Spain, Arabic, Bulgarian, Portuguese - Brazil, Hungarian, Greek, Danish, Traditional Chinese, Simplified Chinese, Korean, Dutch, Norwegian, Polish, Portuguese, Romanian, Russian, Thai, Turkish, Ukrainian, Finnish, Czech, Swedish, Japanese] http://quietriver.info/ true false false 94% 1h 42m Quiet River [Casual, Indie]
|
||||
542340 Slingshot people Oct/2016 500000 - 1000000 0 0.99 0 [English] http://www.vsemagy.ru/index.php true false false 47% 3h 50m StalkerAlex [Action, Casual, Indie, Simulation]
|
||||
1209040 Cyber Hunter Jun/2020 500000 - 1000000 0 0.00 0 [English, French, German, Spanish - Spain, Russian, Japanese, Simplified Chinese, Traditional Chinese, Portuguese - Brazil, Korean, Thai, Vietnamese] https://www.cyberhunter.game/ true false false 73% 5h 41m NetEase Games [Action, Free to Play, Massively Multiplayer]
|
||||
8790 GTR 2 FIA GT Racing Game Dec/2012 50000 - 100000 0 7.99 0 [English] http://www.simbin.com/games/gtr2/ true false false 93% 11m SimBin Studios AB [Racing, Simulation, Sports]
|
||||
8000 Tomb Raider: Anniversary Jun/2007 500000 - 1000000 13 8.99 0 [English, French, German, Italian, Spanish - Spain] http://www.tombraider.com/anniversary/ true false false 82% 6h Crystal Dynamics [Action, Adventure]
|
||||
415150 Pang Adventures Apr/2016 50000 - 100000 0 9.99 0 [English, French, Italian, German, Spanish - Spain, Portuguese - Brazil, Russian] https://www.facebook.com/Pang.Adventures/ true false false 80% 3h 29m Dotemu [Action, Casual, Strategy]
|
||||
2012500 The Katydids Incident Jun/2022 50000 - 100000 0 4.99 0 [English] https://punxstudios.co true false false 100% null Punx Studios [Indie, Simulation]
|
||||
691150 Saku Saku: Love Blooms with the Cherry Blossoms Oct/2017 50000 - 100000 0 19.99 0 [English] null true false false 92% 5h 16m PALETTE [Sexual Content, Nudity, Casual]
|
||||
283370 Marine Sharpshooter II: Jungle Warfare Apr/2014 50000 - 100000 0 2.99 0 [English] http://www.funboxmedia.co.uk/ true false false 32% 2h 3m Jarhead Games [Action]
|
||||
249650 Blackguards Jan/2014 500000 - 1000000 0 0.99 2 [English, German, French, Spanish - Spain, Portuguese - Brazil, Russian, Italian, Japanese, Korean, Czech, Turkish, Polish, Simplified Chinese] http://www.blackguards-game.com true false false 62% 8h 58m Daedalic Entertainment [Indie, RPG, Strategy]
|
||||
268870 Satellite Reign Aug/2015 500000 - 1000000 0 29.99 3 [English, French, Italian, German, Spanish - Spain, Czech, Russian] http://www.satellitereign.com/ true true true 71% 5h 18m 5 Lives Studios [Action, Indie, Strategy]
|
||||
1172510 Unlock The King Nov/2019 50000 - 100000 0 0.99 0 [English] null true true false 96% null Minimol Games [Casual, Strategy]
|
||||
927890 Hentai Girl Linda Dec/2018 50000 - 100000 0 0.99 0 [English, French, Italian, German, Spanish - Spain, Danish, Ukrainian, Russian, Bulgarian, Hungarian, Turkish, Greek, Norwegian, Czech, Japanese, Polish, Thai, Swedish, Simplified Chinese, Traditional Chinese, Romanian, Finnish, Dutch, Portuguese, Portuguese - Brazil, Arabic, Korean, Spanish - Latin America, Vietnamese] null true true false 94% 1h 13m GirlGames [Casual, Indie, RPG, Simulation]
|
||||
25700 Madballs in Babo:Invasion Sep/2009 50000 - 100000 0 4.99 7 [English, German, Korean, Portuguese, Spanish - Spain, French, Italian, Russian] http://www.baboinvasion.com true true false 84% 4h 15m Playbrains [Action, Casual, Indie]
|
||||
281610 Homeworld: Deserts of Kharak Jan/2016 500000 - 1000000 0 49.99 4 [English, French, Italian, German, Spanish - Spain, Russian, Polish] http://www.desertsofkharak.com true true false 83% 8h 32m Blackbird Interactive [Strategy]
|
||||
485610 Ball 3D: Soccer Online Mar/2017 500000 - 1000000 0 9.99 0 [English] http://www.ball3d.com true true false 83% 2h 49m Unusualsoft [Sports]
|
||||
1276850 Kane's Shadow Apr/2020 50000 - 100000 0 0.00 0 [English] null true true false 67% null Plush Productions LLC [Casual, Indie]
|
||||
722340 Captain vs Sky Pirates Oct/2017 50000 - 100000 0 2.99 5 [English] https://store.steampowered.com/publisher/boogygames/ true false false 25% null Boogygames Studios [Action, Adventure, Indie, Strategy]
|
||||
1499640 Y.E.T.I Jan/2021 50000 - 100000 0 0.49 0 [English] https://anpa.us true false false 80% null Racing Bros [Action, Indie]
|
||||
1848450 Nightmare of Decay May/2022 50000 - 100000 0 3.99 0 [English, French, Polish, Russian, Simplified Chinese, Traditional Chinese, Spanish - Latin America, Portuguese - Brazil, Italian, German, Czech, Hungarian, Turkish, Norwegian, Swedish] null true false false 98% 5h 56m Checkmaty [Action, Adventure, Indie]
|
||||
615700 A Plunge into Darkness Mar/2020 50000 - 100000 0 5.99 1 [English] https://www.aldorlea.org/ true false false 73% null Aldorlea [Adventure, Indie, RPG, Simulation, Strategy]
|
||||
744980 Super Club Soccer Oct/2019 50000 - 100000 0 0.00 0 [English] http://www.superclubsoccer.com/ true false true 69% null Trick27 Studios Limited [Free to Play, Massively Multiplayer, Sports, Early Access]
|
||||
10180 Call of Duty®: Modern Warfare® 2 (2009) Nov/2009 5000000 - 10000000 0 19.99 2 [English, French, German, Italian, Spanish - Spain] https://www.callofduty.com/ true true false 93% 12h 56m Infinity Ward [Action]
|
||||
234390 Teleglitch: Die More Edition Jul/2013 500000 - 1000000 0 3.24 1 [English] http://www.teleglitch.com true true true 85% 2h 20m Test3 Projects [Action, Indie]
|
||||
1641670 EdgeOfTheAbyssAwaken Jun/2022 50000 - 100000 0 18.99 3 [English, Simplified Chinese] null true false false 74% null TrinityBJ [Action, Indie, RPG, Strategy]
|
||||
427520 Factorio Aug/2020 5000000 - 10000000 0 30.00 1 [English, French, Italian, German, Spanish - Spain, Hungarian, Dutch, Norwegian, Polish, Portuguese, Portuguese - Brazil, Romanian, Finnish, Swedish, Czech, Russian, Ukrainian, Japanese, Simplified Chinese, Traditional Chinese, Korean, Turkish] https://www.factorio.com true true true 97% 89h 43m Wube Software LTD. [Casual, Indie, Simulation, Strategy]
|
||||
Loading…
Reference in New Issue