Wow, I fell behind.

This commit is contained in:
Jason Felds
2011-07-31 23:45:08 -04:00
15 changed files with 42 additions and 3946 deletions
+1 -2
View File
@@ -1171,7 +1171,7 @@ sm-ssc v1.0 Public Beta 2 | 20100331
20100309
--------
* [ScreenSelectMaster] Add GetSelectionIndex(pn) Lua binding. (You'll have to
call this one using GAMESTATE:GetTopScreen():GetSelectionIndex(PLAYER_1) or
call this one using SCREENMAN:GetTopScreen():GetSelectionIndex(PLAYER_1) or
something like that.)
20100308
@@ -1246,7 +1246,6 @@ helper functions available to you in scripts via the fallback theme, either. :)
--------
* [Player] CheckpointsFlashOnHold metric added. Fixes issue 16.
20100222
--------
* [CodeDetector] NextBannerGroup and NextBannerGroup2 were previously used
+5
View File
@@ -8,6 +8,11 @@ ________________________________________________________________________________
StepMania 5.0 Preview 3 | 20110???
--------------------------------------------------------------------------------
2011/07/31
----------
* [ScreenGameplay, LyricDisplay] Stop lyrics from animating on failure.
Fixes issue 298. [AJ]
2011/07/30
----------
* [ProfileManager] Fix an issue when deleting recently created profiles. [AJ]
+1 -1
View File
@@ -2,7 +2,7 @@ The following is a list of known issues with StepMania 5.
* Hidden, Sudden, Stealth, and RandomVanish do not work with layered
note skins. Random Vanish, in particular, has caused crashes.
* The course editor is not working completley.
* The course editor is not working completely.
* The scoring system needs to be made global for the game instead
of tying it to the theme. Right now, this is causing a number
of themes to have no score display during gameplay.
-17
View File
@@ -148,20 +148,3 @@ POSSIBILITY OF SUCH DAMAGE.
The MAD library (included with most Windows binary distributions), and
interface code in RageSoundReader_MP3, is under the GPL, available in
Copying.MAD. Support for this library can be disabled at compile-time.
******************************************************************************
NotesLoaderMidi contains code from STK under the following license:
Copyright 2003 Gary P. Scavone
LEGAL AND ETHICAL:
This software was designed and created to be made publicly available for
free, primarily for academic purposes, so if you use it, pass it on with
this documentation, and for free.
On April 19 2007, StepMania was granted an MIT license by Gary Scavone
for any STK code on the condition that all of the the STK
credits/disclaimers/copyrights from the README are retained in the
source code and in the project documentation.
@@ -1,4 +1,4 @@
sm-ssc Beginner's Guide
StepMania 5 Beginner's Guide
Written and edited by the spinal shark collective
--------------------------------------------------------------------------------
Table of Contents
@@ -14,15 +14,15 @@ Table of Contents
2.3.1 Installing Song Files
2.3.2 Installing Noteskins/New Gametypes
2.3.3 Installing Themes
3. sm-ssc
3. StepMania 5
================================================================================
Chapter 1: Introduction
================================================================================
Welcome to the sm-ssc Beginner's Guide. This guide is primarily meant for people
who do not have any previous experience with StepMania, but also includes
information on how sm-ssc differs from StepMania. If you already know what
StepMania is, and the basics of adding things to an install, you can skip ahead
to Chapter 3: sm-ssc. Otherwise, read on.
Welcome to the StepMania 5 Beginner's Guide. This guide is primarily meant for
people who do not have any previous experience with StepMania, but also includes
information on how SM5 differs from previous StepMania versions. If you already
know what StepMania is, and the basics of adding things to an install, you can
skip ahead to Chapter 3: StepMania 5. Otherwise, read on.
================================================================================
Chapter 2: StepMania
@@ -372,8 +372,9 @@ When in doubt, read any documentation that comes with the theme for proper
installation instructions.
================================================================================
Chapter 3: sm-ssc
Chapter 3: StepMania 5
================================================================================
sm-ssc is a fork of the current StepMania codebase. It is focused on adding
features for theming, but also tries to make the process of dealing with
StepMania a little easier.
The modern StepMania 5 originally began life as sm-ssc, a fork of StepMania 4
alpha 5 (later renamed to StepMania 5 after the reboot of SM4). sm-ssc was a fork
focused on adding features for theming, but also tried to make the process of
dealing with StepMania a little easier.
+1 -1
View File
@@ -1,5 +1,5 @@
[IMPORTANT INSTALL NOTE]
If you are using Windows Vista or Windows 7, please do not install StepMania SSC into the Program Files directory.
If you are using Windows Vista or Windows 7, please do not install StepMania 5 into the Program Files directory.
[Using Google Chrome?]
If you are using Google Chrome as your primary web browser, you will have to perform some extra steps to get stepmania:// URI handling to work:
+4 -1
View File
@@ -14,4 +14,7 @@ be-pachi music [MIT license]
http://x-raise.cjb.net/bpm.html
marfitude [GPL license]
http://www.erestar.net/games/marfitude/
http://www.erestar.net/games/marfitude/
Kick it Up [unknown license]
http://club.paran.com/club/home.do?clubid=prg-bbsView.do?menuno=7209-clubno=291-bbs_no=0L6DV
@@ -212,10 +212,11 @@ local function GetSpeedMods()
local playerMods = {}
for pn in ivalues(GAMESTATE:GetHumanPlayers()) do
-- file loading logic per player;
-- only bother if it's not the machine profile though.
if PROFILEMAN:IsPersistentProfile(pn) or
MEMCARDMAN:GetCardState(pn) == 'MemoryCardState_ready' then
-- file loading logic per player.
if PROFILEMAN:IsPersistentProfile(pn) then
playerMods[#playerMods+1] = ParseSpeedModFile(profileDirs[pn]..baseFilename)
-- we need to make sure the memory card is ready if we're gonna grab from it.
elseif MEMCARDMAN:GetCardState(pn) == 'MemoryCardState_ready' then
playerMods[#playerMods+1] = ParseSpeedModFile(profileDirs[pn]..baseFilename)
end
end
+8
View File
@@ -31,10 +31,18 @@ void LyricDisplay::Init()
m_iCurLyricNumber = 0;
m_fLastSecond = -500;
m_bStopped = false;
}
void LyricDisplay::Stop() {
m_bStopped = true;
}
void LyricDisplay::Update( float fDeltaTime )
{
if( m_bStopped )
return;
ActorFrame::Update( fDeltaTime );
if( GAMESTATE->m_pCurSong == NULL )
+4
View File
@@ -13,10 +13,14 @@ public:
// Call when song changes:
void Init();
// Call on song failed:
void Stop();
private:
BitmapText m_textLyrics[2];
unsigned m_iCurLyricNumber;
float m_fLastSecond;
bool m_bStopped;
};
#endif
-386
View File
@@ -1,386 +0,0 @@
#include "global.h"
#include "PitchDetectionTest.h"
#include "PitchDetectionTestUtil.h"
#include "srpd.h"
#include "EST_filter.h"
#include "RageLog.h"
#include "RageUtil.h"
#include "NoteTypes.h"
#include <MMSystem.h>
MicrophoneStatus PitchDetectionTest::s_ms;
Microphone *PitchDetectionTest::s_pMicrophone = NULL;
#define MAX_BUFFERS 3
// http://tomscarff.tripod.com/midi_analyser/midi_note_frequency.htm
// http://musicdsp.org/showone.php?id=125
const float MIDI_A4_FREQUENCY = 440.0;
const int MIDI_A4_NUMBER = 69;
const int MIDI_C4_NUMBER = 60; // middle C
const RString NOTE_NAME[MIDI_NOTES_PER_OCTAVE] = {"A ","A#","B ","C ","C#","D ","D#","E ","F ","F#","G ","G#"};
float MidiNoteToFreq( int iMidiNote )
{
return MIDI_A4_FREQUENCY * powf( 2.0, ((float)iMidiNote - MIDI_A4_NUMBER) / MIDI_NOTES_PER_OCTAVE );
}
float log2f( float n )
{
// logb (x) = (loga(x)) / (loga(B))
return logf(n) / logf(2);
}
bool FreqToMidiNote( float fFreq, float &fMidiNoteOut )
{
if( fFreq < 20 ) // well below A0 (MidiNote = 1)
return false;
fMidiNoteOut = MIDI_NOTES_PER_OCTAVE * log2f( fFreq / MIDI_A4_FREQUENCY) + MIDI_A4_NUMBER;
return fMidiNoteOut >= 1;
}
#undef bool
bool PitchDetectionTest::MidiNoteToString( int iMidiNote, RString &sMidiNoteOut )
{
if( iMidiNote < 1 )
return false;
int iDiff = iMidiNote - MIDI_A4_NUMBER;
wrap( iDiff, MIDI_NOTES_PER_OCTAVE );
sMidiNoteOut = NOTE_NAME[iDiff];
return true;
}
bool MidiNoteToOctave( int iMidiNote, int &iOctaveOut )
{
if( iMidiNote < 1 )
return false;
// middle C is start of octave 4.
int iOctave = (int)floorf( ((float)iMidiNote - MIDI_C4_NUMBER) / MIDI_NOTES_PER_OCTAVE );
iOctaveOut = iOctave + 4;
return true;
}
bool MidiNoteToStringAndOctave( int iMidiNote, RString &sMidiNoteOut )
{
if( !PitchDetectionTest::MidiNoteToString(iMidiNote, sMidiNoteOut) )
return false;
int iOctave;
if( !MidiNoteToOctave(iMidiNote, iOctave) )
return false;
sMidiNoteOut += ssprintf("%d",iOctave);
return true;
}
float PitchDetectionTest::WrapToNearestOctave( float fMidiNote, float fTargetMidiNote )
{
float fDiff = fMidiNote - fTargetMidiNote;
fDiff += MIDI_NOTES_PER_OCTAVE / 2;
wrap( fDiff, (float)MIDI_NOTES_PER_OCTAVE );
fDiff -= MIDI_NOTES_PER_OCTAVE / 2;
float fRet = fTargetMidiNote + fDiff;
return fRet;
}
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2);
class MicrophoneImpl
{
public:
HWAVEIN m_hWaveIn;
WAVEFORMATEX m_stWFEX;
WAVEHDR m_stWHDR[MAX_BUFFERS];
DetectPitch m_dp;
HMMIO m_hOPFile;
MMIOINFO m_stmmIF;
MMCKINFO m_stckOut,m_stckOutRIFF;
static MicrophoneImpl *s_pMicrophoneImpl; // one and only for the callback function to use
void Init()
{
m_hWaveIn=NULL;
ZeroMemory(&m_stWFEX,sizeof(WAVEFORMATEX));
ZeroMemory(m_stWHDR,MAX_BUFFERS*sizeof(WAVEHDR));
s_pMicrophoneImpl = this;
}
void FillDevices()
{
WAVEINCAPS stWIC={0};
UINT nDevices=waveInGetNumDevs();
for(UINT nC1=0;nC1<nDevices;++nC1)
{
ZeroMemory(&stWIC,sizeof(WAVEINCAPS));
MMRESULT mRes=waveInGetDevCaps(nC1,&stWIC,sizeof(WAVEINCAPS));
if(mRes==0)
LOG->Trace( stWIC.szPname );
else
FAIL_M("bad");
}
}
void StartRecording()
{
OpenDevice();
m_dp.Init( SAMPLES_PER_SEC );
PrepareBuffers();
MMRESULT mRes=waveInStart(m_hWaveIn);
if(mRes!=0)
FAIL_M("bad");
}
void StopRecording()
{
CloseDevice();
}
void OpenDevice()
{
MMRESULT mRes=0;
m_stWFEX.nSamplesPerSec=SAMPLES_PER_SEC;
m_stWFEX.nChannels=1;
m_stWFEX.wBitsPerSample = 16;
m_stWFEX.wFormatTag=WAVE_FORMAT_PCM;
m_stWFEX.nBlockAlign=m_stWFEX.nChannels*m_stWFEX.wBitsPerSample/8;
m_stWFEX.nAvgBytesPerSec=m_stWFEX.nSamplesPerSec*m_stWFEX.nBlockAlign;
m_stWFEX.cbSize=sizeof(WAVEFORMATEX);
int device = 0;
WAVEINCAPS stWIC={0};
ZeroMemory(&stWIC,sizeof(WAVEINCAPS));
mRes=waveInGetDevCaps(device,&stWIC,sizeof(WAVEINCAPS));
if(mRes==0)
LOG->Trace( stWIC.szPname );
else
FAIL_M("bad");
mRes=waveInOpen(&m_hWaveIn,device,&m_stWFEX,(DWORD_PTR)waveInProc,(DWORD_PTR)this,CALLBACK_FUNCTION);
if(mRes!=MMSYSERR_NOERROR)
FAIL_M("bad");
const char *csT1 = "C:\\cvs\\stepmania\\speech-test.wav";
ZeroMemory(&m_stmmIF,sizeof(MMIOINFO));
DeleteFile((PCHAR)(LPCTSTR)csT1);
m_hOPFile=mmioOpen((PCHAR)(LPCTSTR)csT1,&m_stmmIF,MMIO_WRITE | MMIO_CREATE);
if(m_hOPFile==NULL)
FAIL_M("Can not open file...");
ZeroMemory(&m_stckOutRIFF,sizeof(MMCKINFO));
m_stckOutRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E');
mRes=mmioCreateChunk(m_hOPFile, &m_stckOutRIFF, MMIO_CREATERIFF);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
ZeroMemory(&m_stckOut,sizeof(MMCKINFO));
m_stckOut.ckid = mmioFOURCC('f', 'm', 't', ' ');
m_stckOut.cksize = sizeof(m_stWFEX);
mRes=mmioCreateChunk(m_hOPFile, &m_stckOut, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
int nT1=mmioWrite(m_hOPFile, (HPSTR) &m_stWFEX, sizeof(m_stWFEX));
if(nT1!=sizeof(m_stWFEX))
{
FAIL_M("bad");
}
mRes=mmioAscend(m_hOPFile, &m_stckOut, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
m_stckOut.ckid = mmioFOURCC('d', 'a', 't', 'a');
mRes=mmioCreateChunk(m_hOPFile, &m_stckOut, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
}
void PrepareBuffers()
{
MMRESULT mRes=0;
for(int nT1=0;nT1<MAX_BUFFERS;++nT1)
{
int iSampleCount = SAMPLES_PER_SEC / 60; // 60 times per second
int iBufferSizeBytes = iSampleCount*sizeof(short);
m_stWHDR[nT1].lpData=(LPSTR)HeapAlloc(GetProcessHeap(),8,iBufferSizeBytes);
m_stWHDR[nT1].dwBufferLength=iBufferSizeBytes;
m_stWHDR[nT1].dwUser=nT1;
mRes=waveInPrepareHeader(m_hWaveIn,&m_stWHDR[nT1],sizeof(WAVEHDR));
if(mRes!=0)
FAIL_M("bad");
mRes=waveInAddBuffer(m_hWaveIn,&m_stWHDR[nT1],sizeof(WAVEHDR));
if(mRes!=0)
FAIL_M("bad");
}
}
void ProcessHeader(WAVEHDR * pHdr)
{
//LOG->Trace("%d",pHdr->dwUser);
if(WHDR_DONE==(WHDR_DONE &pHdr->dwFlags))
{
//LOG->Trace("Got %d bytes of data", pHdr->dwBytesRecorded );
int iSampleCount = pHdr->dwBytesRecorded / sizeof(short);
m_dp.ReadOne( (short*)pHdr->lpData, iSampleCount );
mmioWrite(m_hOPFile,pHdr->lpData,pHdr->dwBytesRecorded);
MMRESULT mRes = waveInAddBuffer(m_hWaveIn,pHdr,sizeof(WAVEHDR));
if(mRes!=0)
FAIL_M("bad");
}
}
void CloseDevice()
{
MMRESULT mRes=0;
if(m_hWaveIn)
{
UnPrepareBuffers();
mRes=waveInClose(m_hWaveIn);
}
if(m_hOPFile)
{
mRes=mmioAscend(m_hOPFile, &m_stckOut, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
mRes=mmioAscend(m_hOPFile, &m_stckOutRIFF, 0);
if(mRes!=MMSYSERR_NOERROR)
{
FAIL_M("bad");
}
mmioClose(m_hOPFile,0);
m_hOPFile=NULL;
}
m_hWaveIn=NULL;
}
void UnPrepareBuffers()
{
MMRESULT mRes=0;
if(m_hWaveIn)
{
mRes=waveInStop(m_hWaveIn);
for(int nT1=0;nT1<3;++nT1)
{
if(m_stWHDR[nT1].lpData)
{
mRes=waveInUnprepareHeader(m_hWaveIn,&m_stWHDR[nT1],sizeof(WAVEHDR));
HeapFree(GetProcessHeap(),0,m_stWHDR[nT1].lpData);
ZeroMemory(&m_stWHDR[nT1],sizeof(WAVEHDR));
}
}
}
}
void GetStatus( MicrophoneStatus &out )
{
return m_dp.GetStatus( out );
}
};
MicrophoneImpl *MicrophoneImpl::s_pMicrophoneImpl = NULL;
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
switch(uMsg)
{
case WIM_CLOSE:
break;
case WIM_DATA:
{
MicrophoneImpl::s_pMicrophoneImpl->ProcessHeader( (WAVEHDR *)dwParam1 );
}
break;
case WIM_OPEN:
break;
default:
break;
}
}
void PitchDetectionTest::Update()
{
s_pMicrophone->GetStatus( s_ms );
}
void DoPitchDetectionTest()
{
MicrophoneImpl mr;
mr.Init();
mr.StartRecording();
//srpd2(); // do f0 tracking
}
Microphone::Microphone()
{
m_pImpl = new MicrophoneImpl;
m_pImpl->Init();
m_pImpl->StartRecording();
}
Microphone::~Microphone()
{
m_pImpl->StopRecording();
SAFE_DELETE( m_pImpl );
}
void Microphone::GetStatus( MicrophoneStatus &out )
{
m_pImpl->GetStatus( out );
if( !FreqToMidiNote(out.fFreq, out.fMidiNote) )
out.fMidiNote = 0;
int iMidiNote = (int)roundf( out.fMidiNote );
if( !MidiNoteToStringAndOctave( iMidiNote, out.sMidiNote ) )
out.sMidiNote = "";
}
/*
* (c) 2007 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
-62
View File
@@ -1,62 +0,0 @@
/* Microphone - Holdover from incomplete karaoke mode. */
#ifndef Microphone_H
#define Microphone_H
class MicrophoneImpl;
struct MicrophoneStatus
{
float fFreq;
float fMaxFreq;
bool bVoiced;
float fMidiNote;
RString sMidiNote;
};
class Microphone
{
public:
Microphone();
~Microphone();
void GetStatus( MicrophoneStatus &out );
protected:
MicrophoneImpl *m_pImpl;
};
class PitchDetectionTest
{
public:
static MicrophoneStatus s_ms;
static Microphone *s_pMicrophone;
static void Update();
static bool MidiNoteToString( int iMidiNote, RString &sMidiNoteOut );
static float WrapToNearestOctave( float fMidiNote, float fTargetMidiNote );
};
#endif
/*
* (c) 2004 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
File diff suppressed because it is too large Load Diff
-75
View File
@@ -1,75 +0,0 @@
/* PitchDetectionTestUtil - Holdover from incomplete karaoke mode. */
#ifndef PitchDetectionTestUtil_H
#define PitchDetectionTestUtil_H
enum EST_bo_t {bo_big, bo_little, bo_perq};
static int est_endian_loc = 1;
/* Sun, HP, SGI Mips, M68000 */
#define EST_BIG_ENDIAN (((char *)&est_endian_loc)[0] == 0)
/* Intel, Alpha, DEC Mips, Vax */
#define EST_LITTLE_ENDIAN (((char *)&est_endian_loc)[0] != 0)
#define EST_NATIVE_BO (EST_BIG_ENDIAN ? bo_big : bo_little)
#define EST_SWAPPED_BO (EST_BIG_ENDIAN ? bo_little : bo_big)
#define SAMPLES_PER_SEC 44100
struct Srpd_Op;
struct SEGMENT_;
struct CROSS_CORR_;
struct STATUS_;
class RageSoundReader_FileReader;
struct MicrophoneStatus;
class DetectPitch
{
Srpd_Op *m_pSrpdOp;
SEGMENT_ *m_pSegment;
int m_iSamplesFilledInSegment; // how many samples in m_pSegment are filled
CROSS_CORR_ *m_pCC;
STATUS_ *m_pPdaStatus;
public:
DetectPitch();
~DetectPitch();
void Init(RageSoundReader_FileReader *sample);
void Init(int iSampleFreq);
int ReadOne(RageSoundReader_FileReader *sample);
int ReadOne(short *pData, int iCount);
void GetStatus( MicrophoneStatus &out );
void End();
};
#endif
/*
* (c) 2004 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
+1 -1
View File
@@ -1713,7 +1713,7 @@ void ScreenGameplay::Update( float fDeltaTime )
{
m_pSoundMusic->StopPlaying();
SCREENMAN->PostMessageToTopScreen( SM_NotesEnded, 0 );
// todo: stop lyrics (m_LyricDisplay) from animating -aj
m_LyricDisplay.Stop();
}
// Update living players' alive time