void PlayerState::RebuildPlayerOptionsFromActiveAttacks() { // rebuild player options PlayerOptions po = m_PlayerOptions.GetStage(); SongOptions so = GAMESTATE->m_SongOptions.GetStage(); for( unsigned s=0; s<m_ActiveAttacks.size(); s++ ) { if( !m_ActiveAttacks[s].bOn ) continue; /* hasn't started yet */ po.FromString( m_ActiveAttacks[s].sModifiers ); so.FromString( m_ActiveAttacks[s].sModifiers ); } m_PlayerOptions.Assign( ModsLevel_Song, po ); if( m_PlayerNumber == GAMESTATE->GetMasterPlayerNumber() ) GAMESTATE->m_SongOptions.Assign( ModsLevel_Song, so ); int iSumOfAttackLevels = GetSumOfActiveAttackLevels(); if( iSumOfAttackLevels > 0 ) { m_iLastPositiveSumOfAttackLevels = iSumOfAttackLevels; m_fSecondsUntilAttacksPhasedOut = 10000; // any positive number that won't run out before the attacks } else { // don't change! m_iLastPositiveSumOfAttackLevels[p] = iSumOfAttackLevels; m_fSecondsUntilAttacksPhasedOut = 2; // 2 seconds to phase out } }
static int SetPlayerOptions( T* p, lua_State *L ) { ModsLevel m = Enum::Check<ModsLevel>( L, 1 ); PlayerOptions po; po.FromString( SArg(2) ); p->m_PlayerOptions.Assign( m, po ); return 0; }
const RadarValues &Trail::GetRadarValues() const { if( m_bRadarValuesCached ) { return m_CachedRadarValues; } if( IsSecret() ) { // Don't calculate RadarValues for a non-fixed Course. They values are // worthless because they'll change every time this Trail is // regenerated. m_CachedRadarValues = RadarValues(); return m_CachedRadarValues; } else { RadarValues rv; rv.Zero(); FOREACH_CONST( TrailEntry, m_vEntries, e ) { const Steps *pSteps = e->pSteps; ASSERT( pSteps != NULL ); // Hack: don't calculate for autogen entries if( !pSteps->IsAutogen() && e->ContainsTransformOrTurn() ) { NoteData nd; pSteps->GetNoteData( nd ); RadarValues rv_orig; GAMESTATE->SetProcessedTimingData(const_cast<TimingData *>(pSteps->GetTimingData())); NoteDataUtil::CalculateRadarValues( nd, e->pSong->m_fMusicLengthSeconds, rv_orig ); PlayerOptions po; po.FromString( e->Modifiers ); if( po.ContainsTransformOrTurn() ) { NoteDataUtil::TransformNoteData(nd, *(pSteps->GetTimingData()), po, pSteps->m_StepsType); } NoteDataUtil::TransformNoteData(nd, *(pSteps->GetTimingData()), e->Attacks, pSteps->m_StepsType, e->pSong); RadarValues transformed_rv; NoteDataUtil::CalculateRadarValues( nd, e->pSong->m_fMusicLengthSeconds, transformed_rv ); GAMESTATE->SetProcessedTimingData(NULL); rv += transformed_rv; } else { rv += pSteps->GetRadarValues( PLAYER_1 ); } } /* Hack: SetRadarValues is non-const (a const setter doesn't * make sense), but it only modifies a mutable value. Just * cast away const. */ const_cast<Trail*>(this)->SetRadarValues( rv ); return m_CachedRadarValues; } }
static void SetDefaultModifiers( const PlayerOptions &po, const SongOptions &so ) { CStringArray as; if( po.GetString() != "" ) as.push_back( po.GetString() ); if( so.GetString() != "" ) as.push_back( so.GetString() ); PREFSMAN->m_sDefaultModifiers.Set( join(", ",as) ); }
bool TrailEntry::ContainsTransformOrTurn() const { PlayerOptions po; po.FromString( Modifiers ); if( po.ContainsTransformOrTurn() ) return true; if( Attacks.ContainsTransformOrTurn() ) return true; return false; }
const RadarValues &Trail::GetRadarValues() const { if( m_bRadarValuesCached ) { return m_CachedRadarValues; } else if( IsSecret() ) { // Don't calculate RadarValues for a non-fixed Course. The values are // worthless because they'll change every time this Trail is // regenerated. m_CachedRadarValues = RadarValues(); return m_CachedRadarValues; } else { RadarValues rv; rv.Zero(); FOREACH_CONST( TrailEntry, m_vEntries, e ) { const Steps *pSteps = e->pSteps; ASSERT( pSteps ); /* Hack: don't calculate for autogen entries; it makes writing Catalog.xml * take way too long. (Tournamix 4 Sample.crs takes me ~10s.) */ if( !pSteps->IsAutogen() && e->ContainsTransformOrTurn() ) { NoteData nd; pSteps->GetNoteData( nd ); RadarValues rv_orig; NoteDataUtil::CalculateRadarValues( nd, e->pSong->MusicLengthSeconds(), rv_orig ); PlayerOptions po; po.FromString( e->Modifiers ); if( po.ContainsTransformOrTurn() ) NoteDataUtil::TransformNoteData( nd, po, pSteps->m_StepsType ); NoteDataUtil::TransformNoteData( nd, e->Attacks, pSteps->m_StepsType, e->pSong ); RadarValues transformed_rv; NoteDataUtil::CalculateRadarValues( nd, e->pSong->MusicLengthSeconds(), transformed_rv ); rv += transformed_rv; } else { rv += pSteps->GetRadarValues(); } } /* Hack: SetRadarValues is non-const (a const setter doesn't * make sense), but it only modifies a mutable value. Just * cast away const. */ const_cast<Trail*>(this)->SetRadarValues( rv ); return m_CachedRadarValues; } }
static void SetPrefsDefaultModifiers( const PlayerOptions &po, const SongOptions &so ) { vector<RString> as; #define remove_empty_back() if(as.back() == "") { as.pop_back(); } as.push_back(po.GetString()); remove_empty_back(); as.push_back(so.GetString()); remove_empty_back(); #undef remove_empty_back PREFSMAN->m_sDefaultModifiers.Set( join(", ",as) ); }
void ActiveAttackList::Refresh() { const AttackArray& attacks = m_pPlayerState->m_ActiveAttacks; vector<CString> vsThemedMods; for( unsigned i=0; i<attacks.size(); i++ ) { const Attack& attack = attacks[i]; if( !attack.bOn ) continue; /* hasn't started yet */ if( !attack.bShowInAttackList ) continue; PlayerOptions po; po.FromString( attack.sModifiers, true ); po.GetThemedMods( vsThemedMods ); } CString s = join( "\n", vsThemedMods ); this->SetText( s ); // BitmapText will not rebuild vertices if these strings are the same. }
static void GetDefaultModifiers( PlayerOptions &po, SongOptions &so ) { po.FromString( PREFSMAN->m_sDefaultModifiers ); so.FromString( PREFSMAN->m_sDefaultModifiers ); }
bool Attack::ContainsTransformOrTurn() const { PlayerOptions po; po.FromString(sModifiers); return po.ContainsTransformOrTurn(); }
void EditCoursesMenu::OnRowValueChanged( Row row ) { LOG->Trace( "EditCoursesMenu::OnRowValueChanged(%i)", row ); const bool bCanGoLeft = CanGoLeft(), bCanGoRight = CanGoRight(); m_sprArrows[0].SetDiffuse( bCanGoLeft?RageColor(1,1,1,1):RageColor(0.2f,0.2f,0.2f,1) ); m_sprArrows[1].SetDiffuse( bCanGoRight?RageColor(1,1,1,1):RageColor(0.2f,0.2f,0.2f,1) ); m_sprArrows[0].EnableAnimation( bCanGoLeft ); m_sprArrows[1].EnableAnimation( bCanGoRight ); Course* pCourse = GetSelectedCourse(); CourseEntry* pEntry = GetSelectedEntry(); switch( row ) { case ROW_COURSE: CHECKPOINT; m_textValue[ROW_COURSE].SetText( pCourse->GetFullDisplayTitle() ); m_CourseBanner.LoadFromCourse( pCourse ); m_CourseBanner.ScaleToClipped( COURSE_BANNER_WIDTH, COURSE_BANNER_HEIGHT ); m_iSelection[ROW_ENTRY] = 0; pEntry = GetSelectedEntry(); if( pEntry == NULL ) { CourseEntry ce; const vector<Song*> &apSongs = SONGMAN->GetAllSongs(); ASSERT( !apSongs.empty() ); ce.pSong = apSongs[0]; pCourse->m_entries.push_back( ce ); pEntry = GetSelectedEntry(); } // fall through case ROW_COURSE_OPTIONS: CHECKPOINT; m_textValue[ROW_COURSE_OPTIONS].SetText( ssprintf( "(START) %s, %s, ", pCourse->m_bRepeat ? "repeat" : "no repeat", pCourse->m_bRandomize ? "randomize" : "no randomize" ) + ssprintf( (pCourse->m_iLives==-1) ? "use bar life" : "%d lives", pCourse->m_iLives ) ); // fall through case ROW_ACTION: CHECKPOINT; m_textValue[ROW_ACTION].SetText( "(START) " + ActionToString(GetSelectedAction()) ); // fall through case ROW_ENTRY: CHECKPOINT; m_textValue[ROW_ENTRY].SetText( ssprintf("%d of %d",m_iSelection[ROW_ENTRY]+1, (int)GetSelectedCourse()->m_entries.size()) ); m_iSelection[ROW_ENTRY_TYPE] = pEntry->type; // fall through case ROW_ENTRY_TYPE: CHECKPOINT; m_textValue[ROW_ENTRY_TYPE].SetText( pEntry ? CourseEntryTypeToString(pEntry->type) : CString("(none)") ); // fall through case ROW_ENTRY_OPTIONS: CHECKPOINT; { CStringArray as; const bool *bShow = g_bRowEnabledForType[GetSelectedEntry()->type]; if( bShow[song] ) as.push_back( pEntry->pSong ? pEntry->pSong->GetFullTranslitTitle() : CString("(missing song)") ); if( bShow[group] ) as.push_back( pEntry->group_name.empty() ? CString("(no group)") : pEntry->group_name ); if( bShow[difficulty] ) if( pEntry->difficulty != DIFFICULTY_INVALID ) as.push_back( DifficultyToString(pEntry->difficulty) ); if( bShow[low_meter] ) if( pEntry->low_meter > 0 ) as.push_back( ssprintf("low meter %d", pEntry->low_meter) ); if( bShow[high_meter] ) if( pEntry->high_meter > 0 ) as.push_back( ssprintf("high meter %d", pEntry->high_meter) ); if( bShow[best_worst_value] ) if( pEntry->players_index != -1 ) as.push_back( ssprintf("rank %d", pEntry->players_index+1) ); m_textValue[ROW_ENTRY_OPTIONS].SetText( "(START) " + join(", ",as) ); } // fall through case ROW_ENTRY_PLAYER_OPTIONS: CHECKPOINT; { CString s = "(START) "; PlayerOptions po; po.FromString( pEntry->modifiers ); if( po.GetString().empty() ) s += "(none)"; else s += po.GetString(); m_textValue[ROW_ENTRY_PLAYER_OPTIONS].SetText( s ); } // fall through case ROW_ENTRY_SONG_OPTIONS: CHECKPOINT; { CString s = "(START) "; SongOptions so; so.FromString( pEntry->modifiers ); if( so.GetString().empty() ) s += "(none)"; else s += so.GetString(); m_textValue[ROW_ENTRY_SONG_OPTIONS].SetText( s ); } break; default: ASSERT(0); // invalid row } }
int main(int argc, char **argv) { PlayerOptions options; po::variables_map vm; po::options_description desc("Kitti_player, a player for KITTI visual odometry datasets\nDatasets can be downloaded from: http://www.cvlibs.net/datasets/kitti/eval_odometry.php\n\nAllowed options",200); desc.add_options() ("help,h" , "help message") ("directory,d" , po::value<string>(&options.path)->required() , "*required* - path to the kitti dataset Directory") ("sequence ,s" , po::value<string>(&options.sequence)->required() , "*required* - sequence number (starts at 00)") ("poses ,p" , po::value<bool>(&options.poses) ->implicit_value(1) ->default_value(0) , "replay poses") ("frequency,f" , po::value<float>(&options.frequency) ->default_value(10.0) , "set replay Frequency") ("all,a" , po::value<bool> (&options.all_data) ->implicit_value(1) ->default_value(0) , "replay All data") ("velodyne,v" , po::value<bool> (&options.velodyne) ->implicit_value(1) ->default_value(0) , "replay Velodyne data") ("grayscale,g" , po::value<bool> (&options.grayscale) ->implicit_value(1) ->default_value(0) , "replay Stereo Grayscale images") ("color,c" , po::value<bool> (&options.color) ->implicit_value(1) ->default_value(0) , "replay Stereo Color images") ("viewer,V" , po::value<bool> (&options.viewer) ->implicit_value(1) ->default_value(0) , "enable image viewer") ("timestamps,T" , po::value<bool> (&options.timestamps) ->implicit_value(1) ->default_value(0) , "use KITTI timestamps") ("pause,P" , po::value<bool> (&options.start_paused) ->implicit_value(1) ->default_value(0) , "start the player paused") ("clock,C" , po::value<bool> (&options.clock) ->implicit_value(1) ->default_value(0) , "publish timestamps on /clock") ("frame_velodyne", po::value<string>(&options.frame_velodyne)->default_value("velodyne") , "name of frame attached to velodyne") ("frame_image00" , po::value<string>(&options.frame_image00)->default_value("image00") , "name of frame attached to camera 00") ("frame_image01" , po::value<string>(&options.frame_image01)->default_value("image01") , "name of frame attached to camera 01") ("frame_image02" , po::value<string>(&options.frame_image02)->default_value("image02") , "name of frame attached to camera 02") ("frame_image03" , po::value<string>(&options.frame_image03)->default_value("image03") , "name of frame attached to camera 03") ("bag,b" , po::value<string>(&options.bagpath)->default_value("") , "if informed th player will write the dataset as a rosbag on the informed path") ; try // parse options { po::parsed_options parsed = po::command_line_parser(argc, argv).options(desc).allow_unregistered().run(); po::store(parsed, vm); po::notify(vm); // vector<string> to_pass_further = po::collect_unrecognized(parsed.options, po::include_positional); // Can't handle __ros (ROS parameters ... ) // if (to_pass_further.size()>0) // { // ROS_WARN_STREAM("Unknown Options Detected, shutting down node\n"); // cerr << desc << endl; // return 1; // } } catch(...) { cerr << desc << endl; options.printRequiredDirectoryTree(); ROS_WARN_STREAM("Parse error, shutting down node\n"); return 1; } if (vm.count("help")) { cout << desc << endl; options.printRequiredDirectoryTree(); return 1; } if (!(options.all_data || options.color || options.grayscale || options.velodyne )) { ROS_WARN_STREAM("Job finished without playing the dataset. No 'publishing' parameters provided"); return 1; } ros::init(argc, argv, "kitti_player"); ros::NodeHandle n; ros::NodeHandle pn("~"); PlayerVisualOdometry player(n, pn, options); if (!options.bagpath.empty()) player.writeBag(); else player.publish(); return 0; }