void doTurn(GameEvent *e, int direction) { Data *data = game->player[e->player].data; newTrail(data); data->last_dir = data->dir; data->dir = (data->dir + direction) % 4; data->turn_time = game2->time.current; }
// Creates a new DracView to summarise the current state of the game DracView newDracView(char *pastPlays, PlayerMessage messages[]) { DracView dracView = malloc(sizeof(struct dracView)); dracView->g = newGameView(pastPlays, messages); dracView->vampLocation = NOWHERE; dracView->traps = newTrail(TRAIL_SIZE); // If pastPlays is empty, we just return early. if (strcmp(pastPlays, "") == 0) { return dracView; } char *currentPlayMarker = pastPlays; char currentPlay[8] = {'\0'}; char givenLocation[3] = {'\0'}; LocationID currentPlace = NOWHERE; while (currentPlayMarker != NULL) { memcpy(currentPlay, currentPlayMarker, 8); // We isolate the location part for easy access.. memcpy(givenLocation, currentPlay + 1, 2); currentPlace = abbrevToID(givenLocation); if (currentPlay[0] == 'D') { // Then we parse each of the next four characters. for (int i = 3; i < 6; i++) { if (i == 3 || i == 4) { switch (currentPlay[i]) { // TRAP PLACED case 'T': prepend(dracView->traps, currentPlace); break; // VAMPIRE PLACED case 'V': dracView->vampLocation = currentPlace; break; // NOTHING default: break; } } else if (i == 5) { switch (currentPlay[i]) { // TRAP LEAVES case 'M': while (showElement(dracView->traps, TRAIL_SIZE - 1) != NOWHERE) { prepend(dracView->traps, NOWHERE); } prepend(dracView->traps, NOWHERE); break; // VAMPIRE MATURES case 'V': dracView->vampLocation = NOWHERE; break; // NOTHING default: break; } } } } else { // Then we parse each of the next four characters. for (int i = 3; i < 7; i++) { switch (currentPlay[i]) { // TRAP FOUND case 'T': removeElement(dracView->traps, abbrevToID(givenLocation)); break; // VAMPIRE FOUND case 'V': dracView->vampLocation = NOWHERE; break; // NOTHING default: break; } } } if (currentPlay[7] == '\0') break; currentPlayMarker += 8; } return dracView; }