rt300@8: // rt300@14: // SequenceGenerator.h rt300@8: // riftathon rt300@8: // rt300@14: // Created by Robert Tubb on 21/10/2014. rt300@8: // rt300@8: // rt300@8: rt300@14: #ifndef __riftathon__SequenceGenerator__ rt300@14: #define __riftathon__SequenceGenerator__ rt300@8: rt300@8: #include rt300@14: #include "ofMain.h" rt300@8: rt300@28: #define MIN_TARGETS_IN_SEQUENCE 2 rt300@14: #define MAX_TARGETS_IN_SEQUENCE 5 rt300@22: #define MIN_TEMPO 60 rt300@28: #define MAX_TEMPO 300 rt300@28: #define NUM_TEMPO_STEPS 12 rt300@14: #define NUM_PRESETS 8 rt300@28: #define NO_GUIDES_LEVEL true rt300@27: class AnimStep{ rt300@10: rt300@27: rt300@27: public: rt300@27: rt300@27: AnimStep(); rt300@27: typedef enum {PREVIEW_NEUTRAL_COUNT, rt300@27: MATCHING_NEUTRAL_COUNT, rt300@27: PREVIEW_MOVE, rt300@27: PREVIEW_HIT, rt300@27: MATCHING_MOVE, rt300@27: MATCHING_HIT} rt300@27: stepType; rt300@27: rt300@27: stepType type; rt300@27: rt300@27: float getTimeBetweenTicks(){ rt300@28: return 1000* (60.0/tempo); rt300@27: } rt300@27: int presetIndex; rt300@27: int whichInSequence; rt300@27: bool isLastOfAll; rt300@27: rt300@27: int tempo; rt300@27: int seqNumber; rt300@27: int runNumber; rt300@27: bool isLastOfSeq; rt300@27: bool isLastOfRun; rt300@27: rt300@27: bool showsGuides; // depends on 'level' rt300@27: rt300@27: vector thisSequence; // so that we can show the whole sequence at the top? rt300@27: }; rt300@22: rt300@14: class Step{ rt300@13: public: rt300@22: typedef enum {COUNT_IN, PREVIEW_PREPARER, PREVIEW_DISPLAYER, MATCHING_PREPARER, MATCHING_INTERACTION, MATCHING_RESULT} stepTypes; rt300@21: rt300@21: Step(); rt300@21: rt300@14: // gui display rt300@14: bool showsTargetIcon; rt300@14: bool showsControlSettings; rt300@14: bool showsControlGuides; rt300@14: bool showsMatchResults; rt300@14: // gui input rt300@14: bool allowsCandidateControl; rt300@14: // sound rt300@14: bool playsTarget; rt300@14: bool playsCandidate; rt300@14: // control flow rt300@14: stepTypes type; rt300@14: bool isPreview; rt300@14: rt300@14: int seqNumber; rt300@14: int runNumber; rt300@14: bool isLastOfSeq; rt300@14: bool isLastOfRun; rt300@22: bool showsCountDown; rt300@22: bool hidesSliders; rt300@14: int tempo; rt300@14: // preset info rt300@14: int presetIndex; rt300@14: int numInSequence; rt300@14: bool isLastOfAll; rt300@21: rt300@22: void setAsBlankCounter(); rt300@22: void setAsPreviewPreparer(); rt300@21: void setAsPreviewPlayer(); rt300@21: void setAsMatchingPreparer(); rt300@22: void setAsMatchingInteraction(); rt300@22: void setAsMatchingFeedback(); rt300@13: rt300@14: float getTimeBetweenTicks(){ rt300@14: return 1000. * (60.0/tempo); rt300@14: } rt300@13: }; rt300@13: rt300@10: class SequenceController{ rt300@10: public: rt300@21: SequenceController(); rt300@27: AnimStep getNextStep(); rt300@21: void setToStart(); rt300@21: void stepForward(); rt300@21: float getStartTickTime(); rt300@14: private: rt300@21: void generateSteps(); rt300@21: void generateCountIn(int countInLength); rt300@21: void generateARun(int run, int numInSequence); rt300@27: vector randomSequence(int numInSequence); rt300@14: rt300@21: int getRandomButNot(int max, vector notThese); rt300@21: protected: rt300@27: vector steps; rt300@27: vector::iterator currentStep; rt300@13: float tempoInc; rt300@8: }; rt300@8: rt300@14: #endif /* defined(__riftathon__SequenceGenerator__) */