From a798cc954ce49937a58145fe6abb4ca98bc2aa68 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Thu, 3 Apr 2003 22:10:40 +0000 Subject: [PATCH] added ScreenEnding --- .../default/Fonts/MusicList titles 16x16.png | Bin 22339 -> 28096 bytes .../default/Fonts/ScreenCredits titles.redir | 1 + .../ScreenCredits background frame.png | Bin 0 -> 7497 bytes stepmania/Themes/default/metrics.ini | 20 ++ stepmania/src/ActorCollision.h | 41 +++ stepmania/src/ActorScroller.cpp | 87 +++++ stepmania/src/ActorScroller.h | 39 +++ stepmania/src/BGAnimationLayer.cpp | 21 +- stepmania/src/NoteField.cpp | 4 +- stepmania/src/NoteFieldPositioning.cpp | 3 +- stepmania/src/Screen.cpp | 2 + stepmania/src/ScreenCredits.cpp | 301 ++++++++++++++++++ stepmania/src/ScreenCredits.h | 51 +++ stepmania/src/ScreenMusicScroll.cpp | 121 +------ stepmania/src/ScreenMusicScroll.h | 4 +- stepmania/src/ScreenNameEntry.cpp | 14 +- stepmania/src/ScreenPlayerOptions.cpp | 4 +- stepmania/src/Sprite.cpp | 4 +- stepmania/src/StepMania.dsp | 40 ++- stepmania/src/StepMania.vcproj | 15 + 20 files changed, 620 insertions(+), 152 deletions(-) create mode 100644 stepmania/Themes/default/Fonts/ScreenCredits titles.redir create mode 100644 stepmania/Themes/default/Graphics/ScreenCredits background frame.png create mode 100644 stepmania/src/ActorCollision.h create mode 100644 stepmania/src/ActorScroller.cpp create mode 100644 stepmania/src/ActorScroller.h create mode 100644 stepmania/src/ScreenCredits.cpp create mode 100644 stepmania/src/ScreenCredits.h diff --git a/stepmania/Themes/default/Fonts/MusicList titles 16x16.png b/stepmania/Themes/default/Fonts/MusicList titles 16x16.png index 0b91d1e11f8f967a71698c843aecd90ca3a8818b..e68e158072240362f009c68b147c3bf977d5d0e6 100644 GIT binary patch literal 28096 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 literal 22339 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

!;b8PV~s;nWH#a;31 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/2; } +inline float GetOffScreenRight( Actor* pActor ) { return SCREEN_RIGHT + pActor->GetZoomedWidth()/2; } +inline float GetOffScreenTop( Actor* pActor ) { return SCREEN_TOP - pActor->GetZoomedHeight()/2; } +inline float GetOffScreenBottom(Actor* pActor ) { return SCREEN_BOTTOM+ pActor->GetZoomedHeight()/2; } + +inline bool IsOffScreenLeft( Actor* pActor ) { return pActor->GetX() < GetOffScreenLeft(pActor); } +inline bool IsOffScreenRight( Actor* pActor ) { return pActor->GetX() > GetOffScreenRight(pActor); } +inline bool IsOffScreenTop( Actor* pActor ) { return pActor->GetY() < GetOffScreenTop(pActor); } +inline bool IsOffScreenBottom(Actor* pActor ) { return pActor->GetY() > GetOffScreenBottom(pActor); } +inline bool IsOffScreen( Actor* pActor ) { return IsOffScreenLeft(pActor) || IsOffScreenRight(pActor) || IsOffScreenTop(pActor) || IsOffScreenBottom(pActor); } + +// guard rail is the area that keeps particles from going off screen +inline float GetGuardRailLeft( Actor* pActor ) { return SCREEN_LEFT + pActor->GetZoomedWidth()/2; } +inline float GetGuardRailRight( Actor* pActor ) { return SCREEN_RIGHT - pActor->GetZoomedWidth()/2; } +inline float GetGuardRailTop( Actor* pActor ) { return SCREEN_TOP + pActor->GetZoomedHeight()/2; } +inline float GetGuardRailBottom(Actor* pActor ) { return SCREEN_BOTTOM- pActor->GetZoomedHeight()/2; } + +inline bool HitGuardRailLeft( Actor* pActor ) { return pActor->GetX() < GetGuardRailLeft(pActor); } +inline bool HitGuardRailRight( Actor* pActor ) { return pActor->GetX() > GetGuardRailRight(pActor); } +inline bool HitGuardRailTop( Actor* pActor ) { return pActor->GetY() < GetGuardRailTop(pActor); } +inline bool HitGuardRailBottom(Actor* pActor ) { return pActor->GetY() > GetGuardRailBottom(pActor); } + + +#endif \ No newline at end of file diff --git a/stepmania/src/ActorScroller.cpp b/stepmania/src/ActorScroller.cpp new file mode 100644 index 0000000000..4624c19fce --- /dev/null +++ b/stepmania/src/ActorScroller.cpp @@ -0,0 +1,87 @@ +#include "global.h" // testing updates +/* +----------------------------------------------------------------------------- + Class: ActorScroller + + Desc: See header. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "ActorScroller.h" +#include "ActorCollision.h" +#include +#include "RageUtil.h" + + +ActorScroller::ActorScroller() +{ + m_fSecsIntoScroll = 0; +} + +void ActorScroller::Load( vector vActors, float fBaseX, float fBaseY, float fVelX, float fVelY, float fSpacingX, float fSpacingY ) +{ + m_vActors = vActors; + m_vBase.x = fBaseX; + m_vBase.y = fBaseY; + m_vVelocity.x = fVelX; + m_vVelocity.y = fVelY; + m_vSpacing.x = fSpacingX; + m_vSpacing.y = fSpacingY; + + // adjust base + float t = 10000; // inf + if( m_vSpacing.x != 0 ) + t = min( t, m_vBase.x / fabsf(m_vSpacing.x) ); + if( m_vSpacing.y != 0 ) + t = min( t, m_vBase.y / fabsf(m_vSpacing.y) ); + m_vBase.x -= t * fabsf(m_vSpacing.x); + m_vBase.y -= t * fabsf(m_vSpacing.y); + if( m_vVelocity.x < 0 ) + m_vBase.x += SCREEN_WIDTH; + if( m_vVelocity.y < 0 ) + m_vBase.y += SCREEN_HEIGHT; + + // push off screen + if( m_vVelocity.x!=0 ) m_vBase.x += m_vSpacing.x/2; + if( m_vVelocity.y!=0 ) m_vBase.y += m_vSpacing.y/2; +} + +float ActorScroller::GetTotalSecsToScroll() +{ + float fMaxSecToScroll = 0; + if( m_vVelocity.x != 0 ) + { + float fSecToScroll = fabsf(m_vSpacing.x*(m_vActors.size()+1) + SCREEN_WIDTH) / fabsf(m_vVelocity.x); + fMaxSecToScroll = max( fMaxSecToScroll, fSecToScroll ); + } + if( m_vVelocity.y != 0 ) + { + float fSecToScroll = fabsf(m_vSpacing.y*(m_vActors.size()+1) + SCREEN_HEIGHT) / fabsf(m_vVelocity.y); + fMaxSecToScroll = max( fMaxSecToScroll, fSecToScroll ); + } + return fMaxSecToScroll; +} + +void ActorScroller::Update( float fDeltaTime ) +{ + m_fSecsIntoScroll += fDeltaTime; + + for( unsigned i=0; iSetXY( fX, fY ); + } +} + +void ActorScroller::DrawPrimitives() +{ + for( unsigned i=0; iDraw(); +} \ No newline at end of file diff --git a/stepmania/src/ActorScroller.h b/stepmania/src/ActorScroller.h new file mode 100644 index 0000000000..7723764b14 --- /dev/null +++ b/stepmania/src/ActorScroller.h @@ -0,0 +1,39 @@ +#ifndef ActorScroller_H +#define ActorScroller_H +/* +----------------------------------------------------------------------------- + Class: ActorScroller + + Desc: A container for other actors. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "Actor.h" + + +class ActorScroller : public Actor +{ +public: + ActorScroller(); + + // owner's responsibility to delete vActors! + void Load( vector vActors, float fBaseX, float fBaseY, float fVelX, float fVelY, float fSpacingX, float fSpacingY ); + + void Update( float fDelta ); + void DrawPrimitives(); + + float GetTotalSecsToScroll(); + +protected: + float m_fSecsIntoScroll; + RageVector2 m_vBase; + RageVector2 m_vVelocity; + RageVector2 m_vSpacing; + vector m_vActors; +}; + + +#endif diff --git a/stepmania/src/BGAnimationLayer.cpp b/stepmania/src/BGAnimationLayer.cpp index c8ac692436..339c9334fa 100644 --- a/stepmania/src/BGAnimationLayer.cpp +++ b/stepmania/src/BGAnimationLayer.cpp @@ -22,28 +22,9 @@ #include "RageLog.h" #include "song.h" #include "ThemeManager.h" +#include "ActorCollision.h" -inline float GetOffScreenLeft( Actor* pActor ) { return SCREEN_LEFT - pActor->GetZoomedWidth()/2; } -inline float GetOffScreenRight( Actor* pActor ) { return SCREEN_RIGHT + pActor->GetZoomedWidth()/2; } -inline float GetOffScreenTop( Actor* pActor ) { return SCREEN_TOP - pActor->GetZoomedHeight()/2; } -inline float GetOffScreenBottom(Actor* pActor ) { return SCREEN_BOTTOM+ pActor->GetZoomedHeight()/2; } - -inline bool IsOffScreenLeft( Actor* pActor ) { return pActor->GetX() < GetOffScreenLeft(pActor); } -inline bool IsOffScreenRight( Actor* pActor ) { return pActor->GetX() > GetOffScreenRight(pActor); } -inline bool IsOffScreenTop( Actor* pActor ) { return pActor->GetY() < GetOffScreenTop(pActor); } -inline bool IsOffScreenBottom(Actor* pActor ) { return pActor->GetY() > GetOffScreenBottom(pActor); } - -// guard rail is the area that keeps particles from going off screen -inline float GetGuardRailLeft( Actor* pActor ) { return SCREEN_LEFT + pActor->GetZoomedWidth()/2; } -inline float GetGuardRailRight( Actor* pActor ) { return SCREEN_RIGHT - pActor->GetZoomedWidth()/2; } -inline float GetGuardRailTop( Actor* pActor ) { return SCREEN_TOP + pActor->GetZoomedHeight()/2; } -inline float GetGuardRailBottom(Actor* pActor ) { return SCREEN_BOTTOM- pActor->GetZoomedHeight()/2; } - -inline bool HitGuardRailLeft( Actor* pActor ) { return pActor->GetX() < GetGuardRailLeft(pActor); } -inline bool HitGuardRailRight( Actor* pActor ) { return pActor->GetX() > GetGuardRailRight(pActor); } -inline bool HitGuardRailTop( Actor* pActor ) { return pActor->GetY() < GetGuardRailTop(pActor); } -inline bool HitGuardRailBottom(Actor* pActor ) { return pActor->GetY() > GetGuardRailBottom(pActor); } const float PARTICLE_SPEED = 300; diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index 0c909f3af6..a43cc59c6d 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -225,8 +225,8 @@ void NoteField::DrawPrimitives() fDrawScale *= 1 + 0.5f * fabsf( GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_fPerspectiveTilt ); fDrawScale *= 1 + fabsf( GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_fEffects[PlayerOptions::EFFECT_MINI] ); - iFirstPixelToDraw *= fDrawScale; - iLastPixelToDraw *= fDrawScale; + iFirstPixelToDraw = (int)(iFirstPixelToDraw * fDrawScale); + iLastPixelToDraw = (int)(iLastPixelToDraw * fDrawScale); // CPU OPTIMIZATION OPPORTUNITY: diff --git a/stepmania/src/NoteFieldPositioning.cpp b/stepmania/src/NoteFieldPositioning.cpp index b8c9115ad5..336521e37c 100644 --- a/stepmania/src/NoteFieldPositioning.cpp +++ b/stepmania/src/NoteFieldPositioning.cpp @@ -143,7 +143,8 @@ void NoteFieldPositioning::LoadFromStyleDef(const StyleDef *s, PlayerNumber pn) if(!fgets(buf, 1000, f)) break; sscanf(buf, "%f", &m_fFov[t]); } - fclose(f); + if( f ) + fclose(f); // XXX } diff --git a/stepmania/src/Screen.cpp b/stepmania/src/Screen.cpp index 508bdf10da..a5661b7e7c 100644 --- a/stepmania/src/Screen.cpp +++ b/stepmania/src/Screen.cpp @@ -272,6 +272,7 @@ void Screen::ClearMessageQueue( const ScreenMessage SM ) #include "ScreenGameplayOptions.h" #include "ScreenStyleSplash.h" #include "ScreenAutogenOptions.h" +#include "ScreenCredits.h" Screen* Screen::Create( CString sClassName ) { @@ -332,6 +333,7 @@ Screen* Screen::Create( CString sClassName ) else if( 0==stricmp(sClassName, "ScreenGameplayOptions") ) ret = new ScreenGameplayOptions; else if( 0==stricmp(sClassName, "ScreenStyleSplash") ) ret = new ScreenStyleSplash; else if( 0==stricmp(sClassName, "ScreenAutogenOptions") ) ret = new ScreenAutogenOptions; + else if( 0==stricmp(sClassName, "ScreenCredits") ) ret = new ScreenCredits; else RageException::Throw( "Invalid Screen class name '%s'", sClassName.GetString() ); return ret; diff --git a/stepmania/src/ScreenCredits.cpp b/stepmania/src/ScreenCredits.cpp new file mode 100644 index 0000000000..ea503056bd --- /dev/null +++ b/stepmania/src/ScreenCredits.cpp @@ -0,0 +1,301 @@ +#include "global.h" +/* +----------------------------------------------------------------------------- + Class: ScreenCredits + + Desc: See header. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + + +#include "ScreenCredits.h" +#include "ScreenManager.h" +#include "RageLog.h" +#include "GameConstantsAndTypes.h" +#include "SongManager.h" +#include "GameState.h" +#include "ThemeManager.h" +#include "AnnouncerManager.h" +#include +#include "CroppedSprite.h" +#include "Song.h" +#include "BitmapText.h" + + +#define BACKGROUNDS_BASE_X THEME->GetMetricF("ScreenCredits","BackgroundsBaseX") +#define BACKGROUNDS_BASE_Y THEME->GetMetricF("ScreenCredits","BackgroundsBaseY") +#define BACKGROUNDS_VELOCITY_X THEME->GetMetricF("ScreenCredits","BackgroundsVelocityX") +#define BACKGROUNDS_VELOCITY_Y THEME->GetMetricF("ScreenCredits","BackgroundsVelocityY") +#define BACKGROUNDS_SPACING_X THEME->GetMetricF("ScreenCredits","BackgroundsSpacingX") +#define BACKGROUNDS_SPACING_Y THEME->GetMetricF("ScreenCredits","BackgroundsSpacingY") +#define BACKGROUNDS_WIDTH THEME->GetMetricF("ScreenCredits","BackgroundsWidth") +#define BACKGROUNDS_HEIGHT THEME->GetMetricF("ScreenCredits","BackgroundsHeight") +#define TEXTS_COLOR_INTRO THEME->GetMetricC("ScreenCredits","TextsColorIntro") +#define TEXTS_COLOR_HEADER THEME->GetMetricC("ScreenCredits","TextsColorHeader") +#define TEXTS_COLOR_NORMAL THEME->GetMetricC("ScreenCredits","TextsColorNormal") +#define TEXTS_ZOOM THEME->GetMetricF("ScreenCredits","TextsZoom") +#define TEXTS_BASE_X THEME->GetMetricF("ScreenCredits","TextsBaseX") +#define TEXTS_BASE_Y THEME->GetMetricF("ScreenCredits","TextsBaseY") +#define TEXTS_VELOCITY_X THEME->GetMetricF("ScreenCredits","TextsVelocityX") +#define TEXTS_VELOCITY_Y THEME->GetMetricF("ScreenCredits","TextsVelocityY") +#define TEXTS_SPACING_X THEME->GetMetricF("ScreenCredits","TextsSpacingX") +#define TEXTS_SPACING_Y THEME->GetMetricF("ScreenCredits","TextsSpacingY") +#define NEXT_SCREEN THEME->GetMetric ("ScreenCredits","NextScreen") + +const int NUM_BACKGROUNDS = 20; + +struct CreditLine +{ + int colorIndex; + const char* text; +}; + +const CreditLine CREDIT_LINES[] = +{ + {1,"STEPMANIA TEAM"}, + {0,""}, + {0,""}, + {0,""}, + {2,"☆☆GRAPHICS☆☆"}, + {0,"v1ral (Lucas Tang)"}, + {0,"SPiGuMuS"}, + {0,"Visage"}, + {0,"DJ McFox (Ryan McKanna)"}, + {0,"Cloud34 (Lamden Travis)"}, + {0,"Redcrusher (Michael Curry)"}, + {0,"Steve 'healing_vision' Klise"}, + {0,"Mauro Panichella"}, + {0,""}, + {0,""}, + {0,""}, + {2,"☆☆WEB DESIGN☆☆"}, + {0,"Brian 'Bork' Bugh"}, + {0,""}, + {0,""}, + {0,""}, + {2,"☆☆SOUND☆☆"}, + {0,"Kyle 'KeeL' Ward"}, + {0,"Jim 'Izlude' Cabeen"}, + {0,""}, + {0,""}, + {0,""}, + {2,"☆☆TESTING☆☆"}, + {0,"Gotetsu"}, + {0,"spds (James Sanders)"}, + {0,""}, + {0,""}, + {0,""}, + {2,"☆☆PROGRAMMING☆☆"}, + {0,"Chris Danford"}, + {0,"Andrew 'Frieza' Livy"}, + {0,"Glenn Maynard"}, + {0,"Bruno Figueiredo"}, + {0,"Dro Kulix (Peter S. May)"}, + {0,"nmspaz (Jared Roberts)"}, + {0,"binarys (Brendan Walker)"}, + {0,"Lance Gilbert (Neovanglist)"}, + {0,"Michel Donais"}, + {0,"Mantis (Ben Nordstrom)"}, + {0,"Parasyte (Chris Gomez)"}, + {0,"dirkthedaring (Michael Patterson)"}, + {0,"angedelamort (Sauleil Lamarre)"}, + {0,"Edwin Evans"}, + {0,"Brian 'Bork' Bugh"}, + {0,"Elvis314 (Joel Maher)"}, + {0,"Kefabi (Garth Smith)"}, + {0,"Pkillah (Playah Killah)"}, + {0,"DJ McFox (Ryan McKanna)"}, + {0,"Robert Kemmetmueller"}, + {0,"Shabach (Ben Andersen)"}, + {0,"SlinkyWizard (Will Valladao)"}, + {0,"TheChip"}, + {0,"WarriorBob (David H)"}, + {0,"Mike Waltson"}, + {0,""}, + {0,""}, + {0,""}, + {2,"☆☆SPECIAL THANKS TO☆☆"}, + {0,"SimWolf"}, + {0,"DJ DraftHorse"}, + {0,"Dance With Intensity"}, + {0,"BeMaNiRuler"}, + {0,"DDRLlama"}, + {0,"DDRManiaX"}, + {0,"NMR"}, + {0,"Random Hajile"}, + {0,"Lagged"}, + {0,"The Melting Pot"}, + {0,"DDRJamz Global BBS"}, + {0,"Eric 'WaffleKing' Webster"}, + {0,"Mark 'Foobly' Verrey"}, + {0,"Mandarin Blue"}, + {0,"Anne Kiel"}, + {0,"BeMaNiFiNiNaTiC (Jeremy Hine)"}, + {0,"Garett Sakamoto"}, + {0,"SailorBob"}, + {0,"AngelTK (Kenny Lai)"}, + {0,"Illusionz - Issaquah, WA"}, + {0,"Quarters - Kirkland, WA"}, + {0,"Segapark - Bournemouth, UK"}, + {0,"Pier Amusements - Bournemouth, UK"}, + {0,"Westcliff Amusements - Bournemouth, UK"}, + {0,"Naoki"}, + {0,"Konami Computer Entertainment Japan"}, + {0,""}, + {0,""}, + {0,""}, + {0,""}, + {0,""}, + {0,""}, + {0,""}, + {0,""}, + {1,"Join the StepMania team"}, + {1,"and help us out!"}, +}; +const unsigned NUM_CREDIT_LINES = sizeof(CREDIT_LINES) / sizeof(CreditLine); + + +ScreenCredits::ScreenCredits() +{ + LOG->Trace( "ScreenCredits::ScreenCredits()" ); + + unsigned i; + + GAMESTATE->Reset(); // so that credits message for both players will show + + + m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenCredits background") ); + this->AddChild( &m_Background ); + + vector arraySongs; + SONGMAN->GetSongs( arraySongs ); + SortSongPointerArrayByTitle( arraySongs ); + + for( i=0; iHasBackground() ) + break; + } + + CroppedSprite* pBackground = new CroppedSprite; + pBackground->SetCroppedSize( BACKGROUNDS_WIDTH, BACKGROUNDS_HEIGHT ); + pBackground->LoadBG( pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathTo("Graphics","Common fallback background") ); + m_vBackgrounds.push_back( pBackground ); + + Sprite* pFrame = new Sprite; + pFrame->Load( THEME->GetPathTo("Graphics","ScreenCredits background frame") ); + m_vFrames.push_back( pFrame ); + } + m_ScrollerBackgrounds.Load( m_vBackgrounds, BACKGROUNDS_BASE_X, BACKGROUNDS_BASE_Y, BACKGROUNDS_VELOCITY_X, BACKGROUNDS_VELOCITY_Y, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y ); + this->AddChild( &m_ScrollerBackgrounds ); + m_ScrollerFrames.Load( m_vFrames, BACKGROUNDS_BASE_X, BACKGROUNDS_BASE_Y, BACKGROUNDS_VELOCITY_X, BACKGROUNDS_VELOCITY_Y, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y ); + this->AddChild( &m_ScrollerFrames ); + + + for( i=0; iLoadFromFont( THEME->GetPathTo("Fonts","ScreenCredits titles") ); + pText->SetText( CREDIT_LINES[i].text ); + switch( CREDIT_LINES[i].colorIndex ) + { + case 1: pText->SetDiffuse( TEXTS_COLOR_INTRO ); break; + case 2: pText->SetDiffuse( TEXTS_COLOR_HEADER ); break; + case 0: pText->SetDiffuse( TEXTS_COLOR_NORMAL ); break; + default: ASSERT(0); + } + pText->SetZoom( TEXTS_ZOOM ); + m_vTexts.push_back( pText ); + } + m_ScrollerTexts.Load( m_vTexts, TEXTS_BASE_X, TEXTS_BASE_Y, TEXTS_VELOCITY_X, TEXTS_VELOCITY_Y, TEXTS_SPACING_X, TEXTS_SPACING_Y ); + this->AddChild( &m_ScrollerTexts ); + + + m_Overlay.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenCredits overlay") ); + this->AddChild( &m_Overlay ); + + m_In.Load( THEME->GetPathTo("BGAnimations","ScreenCredits in") ); + this->AddChild( &m_In ); // draw and update manually + m_In.StartTransitioning(); + + m_Out.Load( THEME->GetPathTo("BGAnimations","ScreenCredits out") ); + this->AddChild( &m_Out ); // draw and update manually + + this->PostScreenMessage( SM_BeginFadingOut, m_ScrollerTexts.GetTotalSecsToScroll() ); + + SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("credits") ); + + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenCredits music") ); +} + +ScreenCredits::~ScreenCredits() +{ + unsigned i; + + for( i=0; iTrace( "ScreenCredits::Input()" ); + + if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) + return; + + Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler +} + +void ScreenCredits::HandleScreenMessage( const ScreenMessage SM ) +{ + switch( SM ) + { + case SM_BeginFadingOut: + if( !m_Out.IsTransitioning() ) + m_Out.StartTransitioning( SM_GoToNextScreen ); + break; + case SM_GoToNextScreen: + SONGMAN->SaveMachineScoresToDisk(); + SCREENMAN->SetNewScreen( NEXT_SCREEN ); + break; + } +} + +void ScreenCredits::MenuStart( PlayerNumber pn ) +{ + this->PostScreenMessage( SM_BeginFadingOut, 0 ); +} + +void ScreenCredits::MenuBack( PlayerNumber pn ) +{ + this->PostScreenMessage( SM_BeginFadingOut, 0 ); +} + diff --git a/stepmania/src/ScreenCredits.h b/stepmania/src/ScreenCredits.h new file mode 100644 index 0000000000..9e589aeb00 --- /dev/null +++ b/stepmania/src/ScreenCredits.h @@ -0,0 +1,51 @@ +/* +----------------------------------------------------------------------------- + File: ScreenCredits.h + + Desc: Music plays and song names scroll across the screen. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "Screen.h" +#include "TransitionBGAnimation.h" +#include "ActorScroller.h" + + +class ScreenCredits : public Screen +{ +public: + ScreenCredits(); + ~ScreenCredits(); + + virtual void Update( float fDeltaTime ); + virtual void DrawPrimitives(); + + virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); + virtual void HandleScreenMessage( const ScreenMessage SM ); + + void MenuStart( PlayerNumber pn ); + void MenuBack( PlayerNumber pn ); + +private: + + BGAnimation m_Background; + + ActorScroller m_ScrollerBackgrounds; + vector m_vBackgrounds; + + ActorScroller m_ScrollerFrames; + vector m_vFrames; + + ActorScroller m_ScrollerTexts; + vector m_vTexts; + + BGAnimation m_Overlay; + + TransitionBGAnimation m_In; + TransitionBGAnimation m_Out; +}; + + diff --git a/stepmania/src/ScreenMusicScroll.cpp b/stepmania/src/ScreenMusicScroll.cpp index ac69da82b3..96a8b58bdb 100644 --- a/stepmania/src/ScreenMusicScroll.cpp +++ b/stepmania/src/ScreenMusicScroll.cpp @@ -31,110 +31,7 @@ const CString CREDIT_LINES[] = { - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "GRAPHICS:", - "v1ral (Lucas Tang)", - "SPiGuMuS", - "Visage", - "DJ McFox (Ryan McKanna)", - "Cloud34 (Lamden Travis)", - "Redcrusher (Michael Curry)", - "Steve 'healing_vision' Klise", - "Mauro Panichella", - "", - "", - "", - "WEB DESIGN:", - "Brian 'Bork' Bugh", - "", - "", - "", - "SOUND:", - "Kyle 'KeeL' Ward", - "Jim 'Animechanic' Cabeen" - "", - "", - "", - "TESTING:", - "Gotetsu", - "spds (James Sanders)", - "", - "", - "", - "PROGRAMMING:", - "Chris Danford", - "Andrew 'Frieza' Livy", - "Glenn Maynard", - "Bruno Figueiredo", - "Dro Kulix (Peter S. May)", - "nmspaz (Jared Roberts)", - "binarys (Brendan Walker)", - "Lance Gilbert (Neovanglist)", - "Michel Donais", - "Mantis (Ben Nordstrom)", - "Parasyte (Chris Gomez)", - "dirkthedaring (Michael Patterson)", - "angedelamort (Sauleil Lamarre)", - "Edwin Evans", - "Brian 'Bork' Bugh", - "Elvis314 (Joel Maher)", - "Kefabi (Garth Smith)", - "Pkillah (Playah Killah)", - "DJ McFox (Ryan McKanna)", - "Robert Kemmetmueller", - "Shabach (Ben Andersen)", - "SlinkyWizard (Will Valladao)", - "TheChip (The Chip)", - "WarriorBob (David H)", - "Mike Waltson", - "", - "", - "", - "SPECIAL THANKS TO:", - "SimWolf", - "DJ DraftHorse", - "Dance With Intensity", - "BeMaNiRuler", - "DDRLlama", - "DDRManiaX", - "NMR", - "Random Hajile", - "Lagged", - "The Melting Pot", - "DDRJamz Global BBS", - "Eric 'WaffleKing' Webster", - "Mark 'Foobly' Verrey", - "Mandarin Blue", - "Anne Kiel", - "BeMaNiFiNiNaTiC (Jeremy Hine)", - "Garett Sakamoto", - "SailorBob", - "AngelTK (Kenny Lai)", - "Illusionz - Issaquah, WA", - "Quarters - Kirkland, WA", - "Segapark - Bournemouth, UK", - "Pier Amusements - Bournemouth, UK", - "Westcliff Amusements - Bournemouth, UK", - "Naoki", - "Konami Computer Entertainment Japan", - "", - "", - "", - "", - "", - "", - "", - "", - "Please, join the StepMania team and help us out!", +"" }; const unsigned NUM_CREDIT_LINES = sizeof(CREDIT_LINES) / sizeof(CString); @@ -168,14 +65,14 @@ ScreenMusicScroll::ScreenMusicScroll() m_iNumLines++; } - for( i=0; iGetPathTo("Fonts","ScreenMusicScroll titles") ); - m_textLines[m_iNumLines].SetText( CREDIT_LINES[i] ); - m_textLines[m_iNumLines].SetZoom( TEXT_ZOOM ); - - m_iNumLines++; - } +// for( i=0; iGetPathTo("Fonts","ScreenMusicScroll titles") ); +// m_textLines[m_iNumLines].SetText( CREDIT_LINES[i] ); +// m_textLines[m_iNumLines].SetZoom( TEXT_ZOOM ); +// +// m_iNumLines++; +// } for( i=0; iSetNewScreen( "ScreenMusicScroll" ); + { + Grade max_grade = GRADE_E; + vector vSongs; + StageStats stats; + GAMESTATE->GetFinalEvalStatsAndSongs( stats, vSongs ); + for( int p=0; pIsPlayerEnabled(p) ) + max_grade = max( max_grade, stats.GetGrade((PlayerNumber)p) ); + if( max_grade >= GRADE_AA ) + SCREENMAN->SetNewScreen( "ScreenCredits" ); + else + SCREENMAN->SetNewScreen( "ScreenMusicScroll" ); + } break; } } diff --git a/stepmania/src/ScreenPlayerOptions.cpp b/stepmania/src/ScreenPlayerOptions.cpp index 4802bce6ef..58174858dd 100644 --- a/stepmania/src/ScreenPlayerOptions.cpp +++ b/stepmania/src/ScreenPlayerOptions.cpp @@ -123,7 +123,7 @@ void ScreenPlayerOptions::ImportOptions() m_iSelectedOption[p][PO_HOLD_NOTES] = po.m_bHoldNotes ? 1 : 0; m_iSelectedOption[p][PO_DARK] = po.m_fDark==1 ? 1 : 0; - m_iSelectedOption[p][PO_PERSPECTIVE]= SCALE( po.m_fPerspectiveTilt, -1, +1, 0, 2 ); + m_iSelectedOption[p][PO_PERSPECTIVE]= SCALE( (int)po.m_fPerspectiveTilt, -1, +1, 0, 2 ); po.Init(); @@ -171,7 +171,7 @@ void ScreenPlayerOptions::ExportOptions() po.m_bHoldNotes = (m_iSelectedOption[p][PO_HOLD_NOTES] == 1); po.m_fDark = (m_iSelectedOption[p][PO_DARK] == 1) ? 1.f : 0.f; - po.m_fPerspectiveTilt = m_iSelectedOption[p][PO_PERSPECTIVE] - 1; + po.m_fPerspectiveTilt = (float)m_iSelectedOption[p][PO_PERSPECTIVE] - 1; } } diff --git a/stepmania/src/Sprite.cpp b/stepmania/src/Sprite.cpp index ba5940da30..dcb0b964c8 100644 --- a/stepmania/src/Sprite.cpp +++ b/stepmania/src/Sprite.cpp @@ -310,8 +310,8 @@ void Sprite::DrawPrimitives() ////////////////////// // render the diffuse pass ////////////////////// - v[0].c = m_temp.diffuse[2]; // bottom left - v[1].c = m_temp.diffuse[0]; // top left + v[0].c = m_temp.diffuse[0]; // top left + v[1].c = m_temp.diffuse[2]; // bottom left v[2].c = m_temp.diffuse[3]; // bottom right v[3].c = m_temp.diffuse[1]; // top right DISPLAY->DrawQuad( v ); diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index c87b8b6d41..b330afe261 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -60,7 +60,7 @@ IntDir=.\../Release6 TargetDir=\stepmania\stepmania TargetName=StepMania SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -95,7 +95,7 @@ IntDir=.\../Debug6 TargetDir=\stepmania\stepmania TargetName=StepMania-debug SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -407,6 +407,14 @@ SOURCE=.\NoteDataWithScoring.h # End Source File # Begin Source File +SOURCE=.\NoteFieldPositioning.cpp +# End Source File +# Begin Source File + +SOURCE=.\NoteFieldPositioning.h +# End Source File +# Begin Source File + SOURCE=.\Notes.cpp # End Source File # Begin Source File @@ -553,14 +561,6 @@ SOURCE=.\TitleSubstitution.cpp SOURCE=.\TitleSubstitution.h # End Source File -# Begin Source File - -SOURCE=.\NoteFieldPositioning.cpp -# End Source File -# Begin Source File - -SOURCE=.\NoteFieldPositioning.h -# End Source File # End Group # Begin Group "File Types" @@ -932,6 +932,10 @@ SOURCE=.\Actor.h # End Source File # Begin Source File +SOURCE=.\ActorCollision.h +# End Source File +# Begin Source File + SOURCE=.\ActorFrame.cpp # End Source File # Begin Source File @@ -940,6 +944,14 @@ SOURCE=.\ActorFrame.h # End Source File # Begin Source File +SOURCE=.\ActorScroller.cpp +# End Source File +# Begin Source File + +SOURCE=.\ActorScroller.h +# End Source File +# Begin Source File + SOURCE=.\BitmapText.cpp # End Source File # Begin Source File @@ -1512,6 +1524,14 @@ SOURCE=.\ScreenCompany.h # End Source File # Begin Source File +SOURCE=.\ScreenCredits.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenCredits.h +# End Source File +# Begin Source File + SOURCE=.\ScreenDemonstration.cpp # End Source File # Begin Source File diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index c2a9f7e01b..6ff9b16f10 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -202,6 +202,12 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + + @@ -1513,12 +1519,21 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + + + +