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@31: #include "presetManager.h" rt300@31: #include "TrainingScoreManager.h" rt300@36: rt300@42: #define MIN_TARGETS_IN_SEQUENCE 1 rt300@49: #define NUM_REPETITIONS_AT_LEVEL 2 rt300@44: #define MAX_TARGETS_IN_SEQUENCE 3 rt300@43: #define MIN_TEMPO 90 rt300@43: #define MAX_TEMPO 520 rt300@36: #define TEMPO_RANDOM_AMOUNT rt300@36: #define MAX_TIME 2800 rt300@36: #define MIN_TIME 200 rt300@44: #define NUM_TEMPO_STEPS 15 rt300@41: #define END_NEUTRAL_MATCH 0 rt300@36: rt300@14: #define NUM_PRESETS 8 rt300@45: #define SLIDER_SLOW_FACTOR 1 rt300@31: #define SPACER_BARS false rt300@31: #define NO_GUIDES_LEVEL false rt300@36: 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@35: PREVIEW_LAST, rt300@31: GUIDED_MOVE, rt300@31: GUIDED_HIT, rt300@27: MATCHING_MOVE, rt300@35: MATCHING_LAST} rt300@27: stepType; rt300@27: rt300@27: stepType type; rt300@36: int getTimeAllowed(){ rt300@36: return timeAllowedMs; rt300@36: } rt300@27: float getTimeBetweenTicks(){ rt300@36: //return 1000* (60.0/tempo); rt300@36: return timeAllowedMs/4.0; rt300@36: } rt300@36: rt300@36: void setTempoFromTime(){ rt300@43: tempo = 4 * 1000. * 60.0 / (timeAllowedMs); rt300@36: } rt300@36: void setTimeFromTempo(){ rt300@36: timeAllowedMs = 4*1000* (60.0/tempo); rt300@27: } rt300@27: int presetIndex; rt300@31: Preset * currentTargetPreset; rt300@31: Preset * nextTargetPreset; rt300@27: int whichInSequence; rt300@27: bool isLastOfAll; rt300@27: rt300@27: int tempo; rt300@36: int tempoLevel; rt300@36: int timeAllowedMs; rt300@27: int seqNumber; rt300@27: int runNumber; rt300@35: int difficulty; rt300@27: bool isLastOfSeq; rt300@27: bool isLastOfRun; rt300@27: rt300@27: bool showsGuides; // depends on 'level' rt300@31: bool showsIcons; rt300@31: bool showsResultsAtEnd; rt300@43: int totalLengthOfSeq; rt300@27: vector thisSequence; // so that we can show the whole sequence at the top? rt300@31: rt300@31: TrainingTestResult result; // only applies to steps that were scored. rt300@31: rt300@31: rt300@31: void saveResult(TrainingTestResult result); rt300@27: }; rt300@22: rt300@31: // NOT USED 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@31: rt300@13: }; rt300@13: rt300@10: class SequenceController{ rt300@10: public: rt300@21: SequenceController(); rt300@45: void init(bool asoundOnlyMode, controlPanelType whichInterfaceAreWeUsing, bool demoMode); rt300@48: void clearAll(); rt300@27: AnimStep getNextStep(); rt300@21: void setToStart(); rt300@21: void stepForward(); rt300@43: float getStartIntervalTime(); rt300@31: void saveResultForCurrentStep(TrainingTestResult result); rt300@31: TrainingTestResult getResultForPreviousStep(); rt300@32: int getTotNumRuns(){return totNumRuns;}; rt300@43: int getCurrentRunNumber(){return currentRunNumber;}; rt300@43: void skipRun(); rt300@14: private: rt300@21: void generateSteps(); rt300@50: void generateSteps12(); rt300@45: void generateTestSequence(int run); rt300@43: void generateCountIn(int countInLength, int runNumber); rt300@43: void generateRun(int run, int numInSequence);// use this now rt300@43: void generateARun(int run, int numInSequence); rt300@34: void generateAnEasyRun(int run, int numInSequence = 1); rt300@32: void generateASoundOnlyRun(int run, int numInSequence); rt300@27: vector randomSequence(int numInSequence); rt300@32: vector nonRandomSequence(int numInSequence); rt300@21: int getRandomButNot(int max, vector notThese); rt300@41: void makeGuidedSequence(vector stepPresetIndices, int run, AnimStep& nextStep); rt300@41: void makeMatchingSequence(vector stepPresetIndices, int run, AnimStep& nextStep); rt300@41: void makePreview(vector stepPresetIndices, int run, AnimStep& nextStep); rt300@21: protected: rt300@27: vector steps; rt300@27: vector::iterator currentStep; rt300@13: float tempoInc; rt300@36: int timeInc; rt300@32: bool soundOnlyMode; rt300@47: bool demoMode; rt300@43: controlPanelType panelType; rt300@32: int totNumRuns; rt300@43: vector timeIntervalsHard; rt300@43: int currentRunNumber; rt300@8: }; rt300@8: rt300@14: #endif /* defined(__riftathon__SequenceGenerator__) */