From b2f539302617396a2bb05143b89b36f506c7c729 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Mon, 9 Jun 2003 19:22:04 +0000 Subject: [PATCH] finalize dancing character directory structure better camera movements animated face textures --- stepmania/Themes/default/metrics.ini | 4 +- stepmania/src/Background.cpp | 88 ++++++++++----------- stepmania/src/Character.cpp | 80 ++++++++++++++++--- stepmania/src/Character.h | 14 +++- stepmania/src/DancingCharacters.cpp | 101 +++++++++++++++--------- stepmania/src/DancingCharacters.h | 1 + stepmania/src/GameState.cpp | 25 ++++++ stepmania/src/GameState.h | 16 +++- stepmania/src/IniFile.cpp | 2 +- stepmania/src/ModelTypes.cpp | 9 ++- stepmania/src/RageBitmapTexture.cpp | 36 ++++++++- stepmania/src/RaveHelper.cpp | 3 +- stepmania/src/ScreenSelectCharacter.cpp | 44 ++++------- stepmania/src/ScreenSelectCharacter.h | 4 +- 14 files changed, 295 insertions(+), 132 deletions(-) diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 5047997812..ed0ab02b12 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -482,7 +482,7 @@ MusicListOffCommand= SleepAfterTweenOffSeconds=0.8 HelpText=Use &LEFT; &RIGHT; to select, then press START TimerSeconds=40 -NextScreen=ScreenInstructions +NextScreen=ScreenSelectCharacter [GroupList] StartX=0 @@ -507,7 +507,7 @@ NextScreenNonstop=ScreenSelectCourse NextScreenOni=ScreenSelectCourse NextScreenEndless=ScreenSelectCourse NextScreenBattle=ScreenSelectMusic -NextScreenRave=ScreenSelectCharacter +NextScreenRave=ScreenSelectMusic HelpText=Press START to continue TimerSeconds=15 diff --git a/stepmania/src/Background.cpp b/stepmania/src/Background.cpp index a9a1343dea..6a47fb4174 100644 --- a/stepmania/src/Background.cpp +++ b/stepmania/src/Background.cpp @@ -359,55 +359,55 @@ void Background::Update( float fDeltaTime ) if( m_aBGChanges.size() == 0 ) return; - /* If we're in a freeze, hold all animations (don't animate by calling Update). */ - if( GAMESTATE->m_bFreeze ) - return; - - // Find the BGSegment we're in - int i; - int size = (int)(m_aBGChanges.size()) - 1; - for( i=0; im_fSongBeat < m_aBGChanges[i+1].m_fStartBeat ) - break; - - if( i != m_iCurBGChangeIndex ) + /* Only update BGAnimations if we're not in the middle of a stop. */ + if( !GAMESTATE->m_bFreeze ) { - LOG->Trace( "old bga %d -> new bga %d, %f, %f", i, m_iCurBGChangeIndex, m_aBGChanges[i].m_fStartBeat, GAMESTATE->m_fSongBeat ); + // Find the BGSegment we're in + int i; + int size = (int)(m_aBGChanges.size()) - 1; + for( i=0; im_fSongBeat < m_aBGChanges[i+1].m_fStartBeat ) + break; - m_iCurBGChangeIndex = i; - - const BackgroundChange& change = m_aBGChanges[i]; - - BGAnimation* pOld = m_pCurrentBGA; - - if( change.m_bFadeLast ) - m_pFadingBGA = m_pCurrentBGA; - else - m_pFadingBGA = NULL; - - m_pCurrentBGA = m_BGAnimations[ change.m_sBGName ]; - - if( pOld != m_pCurrentBGA ) + if( i != m_iCurBGChangeIndex ) { - if( pOld ) - pOld->LosingFocus(); - if( m_pCurrentBGA ) - m_pCurrentBGA->GainingFocus( change.m_fRate, change.m_bRewindMovie, change.m_bLoop ); + LOG->Trace( "old bga %d -> new bga %d, %f, %f", i, m_iCurBGChangeIndex, m_aBGChanges[i].m_fStartBeat, GAMESTATE->m_fSongBeat ); + + m_iCurBGChangeIndex = i; + + const BackgroundChange& change = m_aBGChanges[i]; + + BGAnimation* pOld = m_pCurrentBGA; + + if( change.m_bFadeLast ) + m_pFadingBGA = m_pCurrentBGA; + else + m_pFadingBGA = NULL; + + m_pCurrentBGA = m_BGAnimations[ change.m_sBGName ]; + + if( pOld != m_pCurrentBGA ) + { + if( pOld ) + pOld->LosingFocus(); + if( m_pCurrentBGA ) + m_pCurrentBGA->GainingFocus( change.m_fRate, change.m_bRewindMovie, change.m_bLoop ); + } + + m_fSecsLeftInFade = m_pFadingBGA!=NULL ? FADE_SECONDS : 0; } - m_fSecsLeftInFade = m_pFadingBGA!=NULL ? FADE_SECONDS : 0; - } - - if( m_pCurrentBGA ) - m_pCurrentBGA->Update( fDeltaTime ); - if( m_pFadingBGA ) - { - m_pFadingBGA->Update( fDeltaTime ); - m_fSecsLeftInFade -= fDeltaTime; - float fPercentOpaque = m_fSecsLeftInFade / FADE_SECONDS; - m_pFadingBGA->SetDiffuse( RageColor(1,1,1,fPercentOpaque) ); - if( fPercentOpaque <= 0 ) - m_pFadingBGA = NULL; + if( m_pCurrentBGA ) + m_pCurrentBGA->Update( fDeltaTime ); + if( m_pFadingBGA ) + { + m_pFadingBGA->Update( fDeltaTime ); + m_fSecsLeftInFade -= fDeltaTime; + float fPercentOpaque = m_fSecsLeftInFade / FADE_SECONDS; + m_pFadingBGA->SetDiffuse( RageColor(1,1,1,fPercentOpaque) ); + if( fPercentOpaque <= 0 ) + m_pFadingBGA = NULL; + } } } diff --git a/stepmania/src/Character.cpp b/stepmania/src/Character.cpp index c45a2d13db..73e2a321c1 100644 --- a/stepmania/src/Character.cpp +++ b/stepmania/src/Character.cpp @@ -15,18 +15,80 @@ #include "RageUtil.h" -void Character::Load( CString sCharIniPath ) +bool Character::Load( CString sCharDir ) { - IniFile ini; - ini.SetPath( sCharIniPath ); - ini.ReadFile(); + // Save character directory + if( sCharDir.Right(1)!="/" ) + sCharDir += '/'; + m_sCharDir = sCharDir; - // save file name - CString sThrowAway; - splitrelpath( sCharIniPath, sThrowAway, m_sFileName, sThrowAway ); - - // load attacks + // Save character name + vector as; + split( sCharDir, "/", as ); + m_sName = as.back(); + + // Save attacks + IniFile ini; + ini.SetPath( sCharDir+"character.ini" ); + if( !ini.ReadFile() ) + return false; for( int i=0; im_bShowDancingCharacters ) { - m_Character[PLAYER_1].SetX( MODEL_X[PLAYER_1] ); - m_Character[PLAYER_1].LoadMilkshapeAscii( "C:\\My Documents\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\char0000\\model.txt" ); - m_Character[PLAYER_1].LoadMilkshapeAsciiBones( "rest", "C:\\My Documents\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\rest.bones.txt" ); - m_Character[PLAYER_1].LoadMilkshapeAsciiBones( "warmup", "C:\\My Documents\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\warmup.bones.txt" ); - m_Character[PLAYER_1].LoadMilkshapeAsciiBones( "dance", "C:\\My Documents\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\dance0001.bones.txt" ); - m_Character[PLAYER_1].PlayAnimation( "rest" ); - this->AddChild( &m_Character[PLAYER_1] ); + for( int p=0; pIsPlayerEnabled(p) ) + continue; - m_Character[PLAYER_2].SetX( MODEL_X[PLAYER_2] ); - m_Character[PLAYER_2].LoadMilkshapeAscii( "C:\\My Documents\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\char0011\\model.txt" ); - m_Character[PLAYER_2].LoadMilkshapeAsciiBones( "rest", "C:\\My Documents\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\rest.bones.txt" ); - m_Character[PLAYER_2].LoadMilkshapeAsciiBones( "warmup", "C:\\My Documents\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\warmup.bones.txt" ); - m_Character[PLAYER_2].LoadMilkshapeAsciiBones( "dance", "C:\\My Documents\\Dev\\ddrpc char hacking\\DDRPCRip\\models\\dance0001.bones.txt" ); - m_Character[PLAYER_2].PlayAnimation( "rest" ); - this->AddChild( &m_Character[PLAYER_2] ); + Character* pChar = GAMESTATE->m_pCurCharacters[p]; + if( !pChar ) + continue; + if( GAMESTATE->GetNumPlayersEnabled()==2 ) + m_Character[p].SetX( MODEL_X_TWO_PLAYERS[p] ); + else + m_Character[p].SetX( MODEL_X_ONE_PLAYER ); + m_Character[p].LoadMilkshapeAscii( pChar->GetModelPath() ); + m_Character[p].LoadMilkshapeAsciiBones( "rest", pChar->GetRestAnimationPath() ); + m_Character[p].LoadMilkshapeAsciiBones( "warmup", pChar->GetWarmUpAnimationPath() ); + m_Character[p].LoadMilkshapeAsciiBones( "dance", pChar->GetDanceAnimationPath() ); + m_Character[p].PlayAnimation( "rest" ); + this->AddChild( &m_Character[p] ); + } } // initial camera sweep is still m_CameraDistance = CAMERA_REST_DISTANCE; m_CameraPanYStart = 0; m_CameraPanYEnd = 0; - m_fCameraHeightStart = LOOK_AT_HEIGHT; - m_fCameraHeightEnd = LOOK_AT_HEIGHT; + m_fCameraHeightStart = CAMERA_REST_LOOK_AT_HEIGHT; + m_fCameraHeightEnd = CAMERA_REST_LOOK_AT_HEIGHT; + m_fLookAtHeight = CAMERA_REST_LOOK_AT_HEIGHT; m_fThisCameraStartBeat = 0; m_fThisCameraEndBeat = GAMESTATE->m_pCurSong->m_fFirstBeat; @@ -70,16 +82,27 @@ int Neg1OrPos1() { return rand()%2 ? -1 : +1; } void DancingCharacters::Update( float fDelta ) { - if( !GAMESTATE->m_bFreeze ) - ActorFrame::Update( fDelta ); - + if( GAMESTATE->m_bFreeze ) + { + // spin the camera Matrix style + m_CameraPanYStart += fDelta*40; + m_CameraPanYEnd += fDelta*40; + } + else + { + // make the characters move + float fBPM = GAMESTATE->m_fCurBPS*60; + float fUpdateScale = SCALE( fBPM, 60.f, 300.f, 0.75f, 1.5f ); + CLAMP( fUpdateScale, 0.75f, 1.5f ); + ActorFrame::Update( fDelta*fUpdateScale ); + } static bool bWasHereWeGo = false; bool bIsHereWeGo = GAMESTATE->m_bPastHereWeGo; if( !bWasHereWeGo && bIsHereWeGo ) { - m_Character[PLAYER_1].PlayAnimation( "warmup" ); - m_Character[PLAYER_2].PlayAnimation( "warmup" ); + for( int p=0; pm_pCurSong->m_fFirstBeat && fThisBeat >= GAMESTATE->m_pCurSong->m_fFirstBeat ) { - m_Character[PLAYER_1].PlayAnimation( "dance" ); - m_Character[PLAYER_2].PlayAnimation( "dance" ); + for( int p=0; pm_fSongBeat > m_fThisCameraEndBeat ) { - if( rand()%2 ) + if( (rand()%5) >= 2 ) { - m_CameraDistance = CAMERA_SWEEP_DISTANCE; + // sweeping camera + m_CameraDistance = CAMERA_SWEEP_DISTANCE + RandomInt(-1,1) * CAMERA_SWEEP_DISTANCE_VARIANCE; m_CameraPanYStart = m_CameraPanYEnd = RandomInt(-1,1) * CAMERA_SWEEP_PAN_Y_RANGE_DEGREES; - m_fCameraHeightStart = m_fCameraHeightEnd = LOOK_AT_HEIGHT; + m_fCameraHeightStart = m_fCameraHeightEnd = CAMERA_STILL_LOOK_AT_HEIGHT; m_CameraPanYEnd += RandomInt(-1,1) * CAMERA_SWEEP_PAN_Y_VARIANCE_DEGREES; m_fCameraHeightStart = m_fCameraHeightEnd = m_fCameraHeightStart + RandomInt(-1,1) * CAMERA_SWEEP_HEIGHT_VARIANCE; @@ -109,12 +133,17 @@ void DancingCharacters::Update( float fDelta ) float fCameraHeightVariance = RandomInt(-1,1) * CAMERA_SWEEP_HEIGHT_VARIANCE; m_fCameraHeightStart -= fCameraHeightVariance; m_fCameraHeightEnd += fCameraHeightVariance; + + m_fLookAtHeight = CAMERA_SWEEP_LOOK_AT_HEIGHT; } else { - m_CameraDistance = CAMERA_STILL_DISTANCE; + // still camera + m_CameraDistance = CAMERA_STILL_DISTANCE + RandomInt(-1,1) * CAMERA_STILL_DISTANCE_VARIANCE; m_CameraPanYStart = m_CameraPanYEnd = Neg1OrPos1() * CAMERA_STILL_PAN_Y_RANGE_DEGREES; - m_fCameraHeightStart = m_fCameraHeightEnd = LOOK_AT_HEIGHT + Neg1OrPos1() * CAMERA_STILL_HEIGHT_VARIANCE; + m_fCameraHeightStart = m_fCameraHeightEnd = CAMERA_SWEEP_LOOK_AT_HEIGHT + Neg1OrPos1() * CAMERA_STILL_HEIGHT_VARIANCE; + + m_fLookAtHeight = CAMERA_STILL_LOOK_AT_HEIGHT; } int iCurBeat = (int)GAMESTATE->m_fSongBeat; @@ -136,7 +165,7 @@ void DancingCharacters::DrawPrimitives() RageVector3 m_CameraPoint( 0, fCameraHeight, -m_CameraDistance ); RageVec3TransformCoord( &m_CameraPoint, &m_CameraPoint, &RageMatrixRotationY(fCameraPanY) ); - RageVector3 m_LookAt( 0, LOOK_AT_HEIGHT, 0 ); + RageVector3 m_LookAt( 0, m_fLookAtHeight, 0 ); DISPLAY->LookAt( m_CameraPoint, diff --git a/stepmania/src/DancingCharacters.h b/stepmania/src/DancingCharacters.h index 204aa66594..643b3b8782 100644 --- a/stepmania/src/DancingCharacters.h +++ b/stepmania/src/DancingCharacters.h @@ -31,6 +31,7 @@ protected: float m_CameraDistance; float m_CameraPanYStart; float m_CameraPanYEnd; + float m_fLookAtHeight; float m_fCameraHeightStart; float m_fCameraHeightEnd; float m_fThisCameraStartBeat; diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 6cf8001048..de3ee763f7 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -24,6 +24,7 @@ #include "NoteSkinManager.h" #include "ModeChoice.h" #include "NoteFieldPositioning.h" +#include "Character.h" GameState* GAMESTATE = NULL; // global and accessable from anywhere in our program @@ -39,6 +40,7 @@ GameState::GameState() m_pPosition = NULL; ResetLastRanking(); + ReloadCharacters(); } GameState::~GameState() @@ -134,6 +136,29 @@ void GameState::ResetLastRanking() } } +void GameState::ReloadCharacters() +{ + int i; + + for( i=0; iLoad( as[i] ) ) + m_pCharacters.push_back( pChar ); + else + delete pChar; + } +} + const float GameState::MUSIC_SECONDS_INVALID = -5000.0f; void GameState::ResetMusicStatistics() diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index bbdc05a025..b015b6c453 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -27,7 +27,7 @@ class GameDef; class StyleDef; struct ModeChoice; class NoteFieldPositioning; - +class Character; class GameState { @@ -70,6 +70,14 @@ public: void GetPlayerInfo( PlayerNumber pn, bool& bIsEnabledOut, bool& bIsHumanOut ); bool IsPlayerEnabled( PlayerNumber pn ); bool IsPlayerEnabled( int p ) { return IsPlayerEnabled( (PlayerNumber)p ); }; + int GetNumPlayersEnabled() + { + int count = 0; + for( int p=0; p m_pCharacters; + Character* m_pCurCharacters[NUM_PLAYERS]; + + void ReloadCharacters(); // used in PLAY_MODE_RAVE and PLAY_MODE_BATTLE diff --git a/stepmania/src/IniFile.cpp b/stepmania/src/IniFile.cpp index 57e3dfc483..c3f4041107 100644 --- a/stepmania/src/IniFile.cpp +++ b/stepmania/src/IniFile.cpp @@ -40,7 +40,7 @@ bool IniFile::ReadFile() { ifstream file(path); - if (file.bad()) + if (!file.is_open()) { error = "Unable to open ini file."; return 0; diff --git a/stepmania/src/ModelTypes.cpp b/stepmania/src/ModelTypes.cpp index 42656d34bc..659baba389 100644 --- a/stepmania/src/ModelTypes.cpp +++ b/stepmania/src/ModelTypes.cpp @@ -26,8 +26,8 @@ void AnimatedTexture::Load( CString sTexOrIniPath ) { ASSERT( vFrames.empty() ); // don't load more than once - CString sDir, sThrowAway; - splitrelpath( sTexOrIniPath, sDir, sThrowAway, sThrowAway ); + CString sDir, sFName, sExt; + splitrelpath( sTexOrIniPath, sDir, sFName, sExt ); bool bIsIni = sTexOrIniPath.Right(3).CompareNoCase("ini")== 0; if( bIsIni ) @@ -50,6 +50,7 @@ void AnimatedTexture::Load( CString sTexOrIniPath ) RageTextureID ID; ID.filename = sDir+sFileName; ID.bStretch = true; + ID.bHotPinkColorKey = true; AnimatedTextureState state = { TEXTUREMAN->LoadTexture( ID ), fDelay @@ -64,6 +65,7 @@ void AnimatedTexture::Load( CString sTexOrIniPath ) { RageTextureID ID; ID.filename = sTexOrIniPath; + ID.bHotPinkColorKey = true; ID.bStretch = true; AnimatedTextureState state = { TEXTUREMAN->LoadTexture( ID ), @@ -81,7 +83,10 @@ void AnimatedTexture::Update( float fDelta ) ASSERT( iCurState < (int)vFrames.size() ); fSecsIntoFrame += fDelta; if( fSecsIntoFrame > vFrames[iCurState].fDelaySecs ) + { + fSecsIntoFrame -= vFrames[iCurState].fDelaySecs; iCurState = (iCurState+1) % vFrames.size(); + } } RageTexture* AnimatedTexture::GetCurrentTexture() diff --git a/stepmania/src/RageBitmapTexture.cpp b/stepmania/src/RageBitmapTexture.cpp index 71a0f80469..10cb758083 100644 --- a/stepmania/src/RageBitmapTexture.cpp +++ b/stepmania/src/RageBitmapTexture.cpp @@ -92,7 +92,41 @@ void RageBitmapTexture::Create() if(actualID.bHotPinkColorKey) { - int color = mySDL_MapRGBExact(img->format, 0xFF, 0, 0xFF); + // HACK: Some Pump banners and DDR PC textures have (248,0,248) as the color key. + // Search the edge for (248,0,248). If we find it, use that as the color key. + // TODO: Get rid of this hack and save DDR PC textures in a format that supports alpha. + bool bUse248 = false; + { + const Uint8 *p = (Uint8*)img->pixels; + for( int i=0; iw; i++ ) + { + Uint8 color[4]; + mySDL_GetRGBAV( p, img, color ); + if( color[0]==248 && color[1]==0 && color[2]==248 ) + { + bUse248 = true; + goto apply_color_key; + } + p += img->format->BytesPerPixel; + } + } + { + const Uint8 *p = (Uint8*)img->pixels; + p += img->pitch * (img->h-1); + for( int i=0; iw; i++ ) + { + Uint8 color[4]; + mySDL_GetRGBAV( p, img, color ); + if( color[0]==248 && color[1]==0 && color[2]==248 ) + { + bUse248 = true; + goto apply_color_key; + } + p += img->format->BytesPerPixel; + } + } +apply_color_key: + int color = mySDL_MapRGBExact(img->format, bUse248 ? 248 : 0xFF, 0, bUse248 ? 248 : 0xFF); if( color != -1 ) SDL_SetColorKey( img, SDL_SRCCOLORKEY, color ); } diff --git a/stepmania/src/RaveHelper.cpp b/stepmania/src/RaveHelper.cpp index 9ca15f0ed0..1418f9127d 100644 --- a/stepmania/src/RaveHelper.cpp +++ b/stepmania/src/RaveHelper.cpp @@ -14,6 +14,7 @@ #include "ThemeManager.h" #include "RageUtil.h" #include "GameState.h" +#include "Character.h" CachedThemeMetricF ATTACK_DURATION_SECONDS ("RaveHelper","AttackDurationSeconds"); @@ -76,7 +77,7 @@ void RaveHelper::Update( float fDelta ) void RaveHelper::LaunchAttack( AttackLevel al ) { - CString* asAttacks = GAMESTATE->m_sAttacks[m_PlayerNumber][al]; // [NUM_ATTACKS_PER_LEVEL] + CString* asAttacks = GAMESTATE->m_pCurCharacters[m_PlayerNumber]->m_sAttacks[al]; // [NUM_ATTACKS_PER_LEVEL] CString sAttackToGive = asAttacks[ rand()%NUM_ATTACKS_PER_LEVEL ]; PlayerNumber pnToAttack = OPPOSITE_PLAYER[m_PlayerNumber]; diff --git a/stepmania/src/ScreenSelectCharacter.cpp b/stepmania/src/ScreenSelectCharacter.cpp index 0fedc8dfd3..aa4be55fed 100644 --- a/stepmania/src/ScreenSelectCharacter.cpp +++ b/stepmania/src/ScreenSelectCharacter.cpp @@ -18,6 +18,7 @@ #include "ThemeManager.h" #include "AnnouncerManager.h" #include "GameState.h" +#include "Character.h" #define TITLE_ON_COMMAND( p ) THEME->GetMetric ("ScreenSelectCharacter",ssprintf("TitleP%dOnCommand",p+1)) @@ -48,6 +49,13 @@ ScreenSelectCharacter::ScreenSelectCharacter() : Screen("ScreenSelectCharacter") { LOG->Trace( "ScreenSelectCharacter::ScreenSelectCharacter()" ); + if( GAMESTATE->m_pCharacters.empty() ) + { + HandleScreenMessage( SM_GoToNextScreen ); + return; + } + + m_Menu.Load( "ScreenSelectCharacter" ); this->AddChild( &m_Menu ); @@ -63,15 +71,6 @@ ScreenSelectCharacter::ScreenSelectCharacter() : Screen("ScreenSelectCharacter") } - CStringArray asCharacterPaths; - GetDirListing( "Characters/*.ini", asCharacterPaths, false, true ); - for( unsigned i=0; iGetPathToG("ScreenSelectCharacter title 2x2") ); @@ -220,21 +219,13 @@ void ScreenSelectCharacter::AfterValueChange( PlayerNumber pn ) case CHOOSING_CPU_CHARACTER: case CHOOSING_HUMAN_CHARACTER: { - Character& character = m_vCharacters[ m_iSelectedCharacter[pnAffected] ]; - CStringArray asGraphicPaths; - GetDirListing( "Characters/" + character.m_sFileName + ".png", asGraphicPaths, false, true ); - GetDirListing( "Characters/" + character.m_sFileName + ".jpg", asGraphicPaths, false, true ); - GetDirListing( "Characters/" + character.m_sFileName + ".gif", asGraphicPaths, false, true ); - GetDirListing( "Characters/" + character.m_sFileName + ".bmp", asGraphicPaths, false, true ); - if( asGraphicPaths.empty() ) - m_sprCharacter[pnAffected].UnloadTexture(); - else - m_sprCharacter[pnAffected].Load( asGraphicPaths[0] ); - + Character* pChar = GAMESTATE->m_pCharacters[ m_iSelectedCharacter[pnAffected] ]; + m_sprCharacter[pnAffected].UnloadTexture(); + m_sprCharacter[pnAffected].Load( pChar->GetCardPath() ); for( int i=0; im_sAttacks[i][j] ); } break; case FINISHED_CHOOSING: @@ -274,8 +265,8 @@ void ScreenSelectCharacter::Move( PlayerNumber pn, int deltaValue ) { case CHOOSING_CPU_CHARACTER: case CHOOSING_HUMAN_CHARACTER: - m_iSelectedCharacter[pnAffected] = (m_iSelectedCharacter[pnAffected]+deltaValue)+m_vCharacters.size(); - m_iSelectedCharacter[pnAffected] %= m_vCharacters.size(); + m_iSelectedCharacter[pnAffected] = (m_iSelectedCharacter[pnAffected]+deltaValue)+GAMESTATE->m_pCharacters.size(); + m_iSelectedCharacter[pnAffected] %= GAMESTATE->m_pCharacters.size(); AfterValueChange(pn); m_soundChange.PlayRandom(); break; @@ -312,11 +303,8 @@ void ScreenSelectCharacter::MenuStart( PlayerNumber pn ) { for( int p=0; pm_sCharacterName[p] = character.m_sFileName; - for( int i=0; im_sAttacks[p][i][j] = character.m_sAttacks[i][j]; + Character* pChar = GAMESTATE->m_pCharacters[ m_iSelectedCharacter[p] ]; + GAMESTATE->m_pCurCharacters[p] = pChar; } m_Menu.m_MenuTimer.Stop(); diff --git a/stepmania/src/ScreenSelectCharacter.h b/stepmania/src/ScreenSelectCharacter.h index 54c2aed2e7..bee627c13b 100644 --- a/stepmania/src/ScreenSelectCharacter.h +++ b/stepmania/src/ScreenSelectCharacter.h @@ -13,7 +13,6 @@ #include "Sprite.h" #include "RandomSample.h" #include "MenuElements.h" -#include "Character.h" #include "OptionIcon.h" @@ -47,8 +46,7 @@ private: void AfterValueChange( PlayerNumber pn ); void Move( PlayerNumber pn, int deltaValue ); - vector m_vCharacters; - int m_iSelectedCharacter[NUM_PLAYERS]; + int m_iSelectedCharacter[NUM_PLAYERS]; enum { CHOOSING_HUMAN_CHARACTER, CHOOSING_CPU_CHARACTER,