#ifndef VARIANTS_H_ #define VARIANTS_H_ #include #include "playfield.h" #include "piece.h" #include "highscore.h" #include "orientation.h" #include "input.h" typedef struct tetris_variant_t { /** * constructs a variant data object * @param pPl related playfield object * @return pointer to a newly created variant data object */ void* (*construct)(tetris_playfield_t *pPl); /** * destructs a variant data object * @param pVariantData pointer to a logic object to be destructed */ void (*destruct)(void *pVariantData); /** * chooses a new piece * @param pVariantData the variant instance of interest * @return a tetris piece */ tetris_piece_t* (*choosePiece)(void *pVariantData); /** * add points which result from single step dropping * @param pVariantData the variant data object we want to modify * @param nLines the number of rows involved */ void (*singleDrop)(void *pVariantData, uint8_t nLines); /** * add points which result from a complete drop * @param pVariantData the variant data object we want to modify * @param nLines the number of rows involved */ void (*completeDrop)(void *pVariantData, uint8_t nLines); /** * add points which result from removed rows * @param pVariantData the variant data object we want to modify * @param nRowMask bit mask of removed lines */ void (*removedLines)(void *pVariantData, uint8_t nRowMask); /** * returns the current score * @param pVariantData variant data object we want information from * @return score */ uint16_t (*getScore)(void *pVariantData); /** * returns the current highscore * @param pVariantData variant data object we want information from * @return highscore */ uint16_t (*getHighscore)(void *pVariantData); /** * set highscore * @param pVariantData variant data object we want to modify * @param nHighscore highscore */ void (*setHighscore)(void *pVariantData, uint16_t nHighscore); /** * returns the current highscore name * @param pVariantData variant data object we want information from * @return champion's name packed as uint16_t */ uint16_t (*getHighscoreName)(void *pVariantData); /** * set highscore name * @param pVariantData the variant data object we want to modify * @param nHighscoreName champion's name packed as uint16_t */ void (*setHighscoreName)(void *pVariantData, uint16_t nHighscoreName); /** * returns the current level * @param pVariantData variant data object we want information from * @return the level as uint8_t */ uint8_t (*getLevel)(void *pVariantData); /** * returns the number of completed lines * @param pVariantData the variant data object we want information from * @return number of completed lines */ uint16_t (*getLines)(void *pVariantData); /** * returns piece which was set via tetris_std_setPreviewPiece * @param pVariantData the variant data object we want information from * @return the piece intended to be the next one */ tetris_piece_t* (*getPreviewPiece)(void *pVariantData); /** * retrieves the variant's highscore index * @param pVariantData the variant data object we want information from */ tetris_highscore_index_t (*getHighscoreIndex)(void *pVariantData); void (*setLastInput)(void *pVariantData, tetris_input_command_t inCmd); tetris_orientation_t (*getOrientation)(void *pVariantData); } tetris_variant_t; #endif /* VARIANTS_H_ */