Stai inserendo tutti i dati nel primo elemento dell'array allocato dinamicamente:
deck->type e deck->phrase sono equivalenti a fare deck[0].type e deck[0].phrase.
Puoi risolvere in 2 modi: tieni un indice per capire dove vai a scrivere o incrementi il puntatore per scorrere l'array.
In ogni caso se conosci a priori la dimensione del mazzo quello non è il modo corretto di leggere il file, infatti così non consideri i casi di errore in cui ci siano più o meno elementi.
Un altro "errore" è che la tua funzione non restituirà nulla al main. Per allocare un array in quel modo o lo ritorni come valore della funzione o prendi come parametro un puntatore "extra":
codice:void deckCreationMedium(Card **deck) { Card *ret = (Card *)malloc(MEDIUM * sizeof(Card)); //... //... *deck = ret; } //main Card *deck; deckCreationMedium(&deck);