add explosion graphic and sound if step on mine

This commit is contained in:
Chris Danford
2003-08-10 21:27:54 +00:00
parent 09c5bd5d88
commit 7bd15144cb
14 changed files with 146 additions and 244 deletions
@@ -29,3 +29,31 @@ UseLighting=0
ReverseDrawOrder=1101
HoldHeadIsAboveWavyParts=1
HoldTailIsAboveWavyParts=1
[GhostArrowDim]
NoneCommand=
MissCommand=
BooCommand=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
GoodCommand=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
GreatCommand=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
PerfectCommand=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
MarvelousCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
[GhostArrowBright]
NoneCommand=
MissCommand=
BooCommand=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
GoodCommand=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
GreatCommand=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
PerfectCommand=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
MarvelousCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
[GhostArrowMine]
NoneCommand=
MissCommand=blend,add;diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0
BooCommand=
GoodCommand=
GreatCommand=
PerfectCommand=
MarvelousCommand=
-20
View File
@@ -1711,26 +1711,6 @@ OddLineIn=addx,640;decelerate,0.5;addx,-640;
EvenLineOut=stoptweening;accelerate,0.3;addx,-640;
OddLineOut=stoptweening;accelerate,0.3;addx,640;
[GhostArrow]
ShowSeconds=0.12
ZoomStart=1.0
ZoomEnd=1.3
ColorMarvelous=1.0,1.0,1.0,1 // white
ColorPerfect=1.0,1.0,0.3,1 // yellow
ColorGreat=0.0,1.0,0.4,1 // green
ColorGood=0.3,0.8,1.0,1 // blue
ColorBoo=0.8,0.0,0.6,1 // purple
[GhostArrowBright]
ShowSeconds=0.12
ZoomStart=1.0
ZoomEnd=1.3
ColorMarvelous=1.0,1.0,1.0,1 // white
ColorPerfect=1.0,1.0,0.3,1 // yellow
ColorGreat=0.0,1.0,0.4,1 // green
ColorGood=0.3,0.8,1.0,1 // blue
ColorBoo=0.8,0.0,0.6,1 // purple
[HoldGhostArrow]
WarmUpSeconds=0.25
+16
View File
@@ -141,3 +141,19 @@ SongSortOrder StringToSongSortOrder( CString str )
return SORT_INVALID;
}
CString TapNoteScoreToString( TapNoteScore tns )
{
switch( tns )
{
case TNS_NONE: return "none";
case TNS_MISS: return "miss";
case TNS_BOO: return "boo";
case TNS_GOOD: return "good";
case TNS_GREAT: return "great";
case TNS_PERFECT: return "perfect";
case TNS_MARVELOUS: return "marvelous";
default: ASSERT(0); return ""; // invalid Difficulty
}
}
+1
View File
@@ -144,6 +144,7 @@ enum TapNoteScore {
NUM_TAP_NOTE_SCORES
};
CString TapNoteScoreToString( TapNoteScore tns );
//enum TapNoteTiming {
// TNT_NONE,
+14 -51
View File
@@ -12,34 +12,26 @@
*/
#include "GhostArrow.h"
#include "PrefsManager.h"
#include "ThemeManager.h"
CachedThemeMetricF GA_SHOW_SECONDS ("GhostArrow","ShowSeconds");
CachedThemeMetricF GA_ZOOM_START ("GhostArrow","ZoomStart");
CachedThemeMetricF GA_ZOOM_END ("GhostArrow","ZoomEnd");
CachedThemeMetricC GA_COLOR_MARVELOUS ("GhostArrow","ColorMarvelous");
CachedThemeMetricC GA_COLOR_PERFECT ("GhostArrow","ColorPerfect");
CachedThemeMetricC GA_COLOR_GREAT ("GhostArrow","ColorGreat");
CachedThemeMetricC GA_COLOR_GOOD ("GhostArrow","ColorGood");
CachedThemeMetricC GA_COLOR_BOO ("GhostArrow","ColorBoo");
#include "NoteSkinManager.h"
GhostArrow::GhostArrow()
{
GA_SHOW_SECONDS.Refresh();
GA_ZOOM_START.Refresh();
GA_ZOOM_END.Refresh();
GA_COLOR_MARVELOUS.Refresh();
GA_COLOR_PERFECT.Refresh();
GA_COLOR_GREAT.Refresh();
GA_COLOR_GOOD.Refresh();
GA_COLOR_BOO.Refresh();
SetDiffuse( RageColor(1,1,1,0) );
}
void GhostArrow::Init( PlayerNumber pn )
{
m_PlayerNumber = pn;
for( int i=0; i<NUM_TAP_NOTE_SCORES; i++ )
{
CString sJudge = TapNoteScoreToString( (TapNoteScore)i );
CString sCommand = Capitalize(sJudge)+"Command";
m_sScoreCommand[i] = NOTESKIN->GetMetric(m_PlayerNumber,m_sName,sCommand);
}
}
void GhostArrow::Update( float fDeltaTime )
{
Sprite::Update( fDeltaTime );
@@ -47,34 +39,5 @@ void GhostArrow::Update( float fDeltaTime )
void GhostArrow::Step( TapNoteScore score )
{
// HACK: set the length of each frame so the animation plays in exactly 1 pop up time.
// We can't do this in the constructor because the image hasn't been loaded yet
for( int i=0; i<Sprite::GetNumStates(); i++ )
Sprite::m_States[i].fDelay = GA_SHOW_SECONDS / Sprite::GetNumStates();
RageColor colorStart;
switch( score )
{
case TNS_MARVELOUS: colorStart = GA_COLOR_MARVELOUS; break;
case TNS_PERFECT: colorStart = GA_COLOR_PERFECT; break;
case TNS_GREAT: colorStart = GA_COLOR_GREAT; break;
case TNS_GOOD: colorStart = GA_COLOR_GOOD; break;
case TNS_BOO: colorStart = GA_COLOR_BOO; break;
case TNS_MISS: // miss should never be passed in here
default:
ASSERT(0);
}
RageColor colorEnd = colorStart;
colorEnd.a = 0;
StopTweening();
SetDiffuse( colorStart );
SetState( 0 );
SetZoom( GA_ZOOM_START );
BeginTweening( (float)GA_SHOW_SECONDS/2.0f );
SetZoom( ((float)GA_ZOOM_START+(float)GA_ZOOM_END)/2.0f );
BeginTweening( (float)GA_SHOW_SECONDS/2.0f );
SetZoom( GA_ZOOM_END );
SetDiffuse( colorEnd );
this->Command( m_sScoreCommand[score] );
}
+5 -1
View File
@@ -12,20 +12,24 @@
-----------------------------------------------------------------------------
*/
#include "Sprite.h"
#include "GameConstantsAndTypes.h"
#include "PlayerNumber.h"
class GhostArrow : public Sprite
{
public:
GhostArrow();
virtual void Init( PlayerNumber pn );
virtual void Update( float fDeltaTime );
void Step( TapNoteScore score );
protected:
PlayerNumber m_PlayerNumber;
CString m_sScoreCommand[NUM_TAP_NOTE_SCORES];
};
-80
View File
@@ -1,80 +0,0 @@
#include "global.h"
/*
-----------------------------------------------------------------------------
Class: GhostArrowBright
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Ben Nordstrom
Chris Danford
-----------------------------------------------------------------------------
*/
#include "GhostArrowBright.h"
#include "PrefsManager.h"
#include "ThemeManager.h"
CachedThemeMetricF GAB_SHOW_SECONDS ("GhostArrowBright","ShowSeconds");
CachedThemeMetricF GAB_ZOOM_START ("GhostArrowBright","ZoomStart");
CachedThemeMetricF GAB_ZOOM_END ("GhostArrowBright","ZoomEnd");
CachedThemeMetricC GAB_COLOR_MARVELOUS ("GhostArrowBright","ColorMarvelous");
CachedThemeMetricC GAB_COLOR_PERFECT ("GhostArrowBright","ColorPerfect");
CachedThemeMetricC GAB_COLOR_GREAT ("GhostArrowBright","ColorGreat");
CachedThemeMetricC GAB_COLOR_GOOD ("GhostArrowBright","ColorGood");
CachedThemeMetricC GAB_COLOR_BOO ("GhostArrowBright","ColorBoo");
GhostArrowBright::GhostArrowBright()
{
GAB_SHOW_SECONDS.Refresh();
GAB_ZOOM_START.Refresh();
GAB_ZOOM_END.Refresh();
GAB_COLOR_MARVELOUS.Refresh();
GAB_COLOR_PERFECT.Refresh();
GAB_COLOR_GREAT.Refresh();
GAB_COLOR_GOOD.Refresh();
GAB_COLOR_BOO.Refresh();
SetDiffuse( RageColor(1,1,1,0) );
}
void GhostArrowBright::Update( float fDeltaTime )
{
Sprite::Update( fDeltaTime );
}
void GhostArrowBright::Step( TapNoteScore score )
{
// HACK: set the length of each frame so the animation plays in exactly 1 pop up time.
// We can't do this in the constructor because the image hasn't been loaded yet
for( int i=0; i<Sprite::GetNumStates(); i++ )
Sprite::m_States[i].fDelay = GAB_SHOW_SECONDS / Sprite::GetNumStates();
RageColor colorStart;
switch( score )
{
case TNS_MARVELOUS: colorStart = GAB_COLOR_MARVELOUS; break;
case TNS_PERFECT: colorStart = GAB_COLOR_PERFECT; break;
case TNS_GREAT: colorStart = GAB_COLOR_GREAT; break;
case TNS_GOOD: colorStart = GAB_COLOR_GOOD; break;
case TNS_BOO: colorStart = GAB_COLOR_BOO; break;
case TNS_MISS: // miss should never be passed in here
default:
ASSERT(0);
}
RageColor colorEnd = colorStart;
colorEnd.a = 0;
StopTweening();
SetDiffuse( colorStart );
SetState( 0 );
SetZoom( GAB_ZOOM_START );
BeginTweening( (float)GAB_SHOW_SECONDS/2 );
SetZoom( ((float)GAB_ZOOM_START+(float)GAB_ZOOM_END)/2 );
BeginTweening( (float)GAB_SHOW_SECONDS/2 );
SetZoom( GAB_ZOOM_END );
SetDiffuse( colorEnd );
}
-30
View File
@@ -1,30 +0,0 @@
#ifndef GHOSTARROWBRIGHT_H
#define GHOSTARROWBRIGHT_H
/*
-----------------------------------------------------------------------------
Class: GhostArrowBright
Desc: Ghost arrow used when over 100 combo.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Ben Nordstrom
Chris Danford
-----------------------------------------------------------------------------
*/
#include "Sprite.h"
#include "GameConstantsAndTypes.h"
class GhostArrowBright : public Sprite
{
public:
GhostArrowBright();
virtual void Update( float fDeltaTime );
void Step( TapNoteScore score );
protected:
};
#endif
+44 -22
View File
@@ -41,13 +41,25 @@ void GhostArrowRow::Load( PlayerNumber pn )
if(Button == "")
Button = NoteSkinManager::ColToButtonName(c);
m_GhostArrowRow[c].Load( NOTESKIN->GetPathTo(pn, Button, "tap explosion dim") );
m_GhostArrowRowBright[c].Load( NOTESKIN->GetPathTo(pn, Button, "tap explosion bright") );
m_HoldGhostArrowRow[c].Load( NOTESKIN->GetPathTo(pn, Button, "hold explosion") );
m_GhostDim[c].SetName( "GhostArrowDim" );
m_GhostBright[c].SetName( "GhostArrowBright" );
m_GhostMine[c].SetName( "GhostArrowMine" );
m_HoldGhost[c].SetName( "HoldGhostArrow" );
m_GhostDim[c].Init( pn );
m_GhostBright[c].Init( pn );
m_GhostMine[c].Init( pn );
//m_HoldGhost[c].Init( pn );
m_GhostArrowRow[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
m_GhostArrowRowBright[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
m_HoldGhostArrowRow[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
m_GhostDim[c].Load( NOTESKIN->GetPathTo(pn, Button, "tap explosion dim") );
m_GhostBright[c].Load( NOTESKIN->GetPathTo(pn, Button, "tap explosion bright") );
m_GhostMine[c].Load( NOTESKIN->GetPathTo(pn, Button, "tap explosion mine") );
m_HoldGhost[c].Load( NOTESKIN->GetPathTo(pn, Button, "hold explosion") );
m_GhostDim[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
m_GhostBright[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
m_GhostMine[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
m_HoldGhost[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
}
}
@@ -56,9 +68,10 @@ void GhostArrowRow::Update( float fDeltaTime )
{
for( int c=0; c<m_iNumCols; c++ )
{
m_GhostArrowRow[c].Update( fDeltaTime );
m_GhostArrowRowBright[c].Update( fDeltaTime );
m_HoldGhostArrowRow[c].Update( fDeltaTime );
m_GhostDim[c].Update( fDeltaTime );
m_GhostBright[c].Update( fDeltaTime );
m_GhostMine[c].Update( fDeltaTime );
m_HoldGhost[c].Update( fDeltaTime );
}
}
@@ -69,17 +82,21 @@ void GhostArrowRow::DrawPrimitives()
g_NoteFieldMode[m_PlayerNumber].BeginDrawTrack(c);
float fX = ArrowGetXPos( m_PlayerNumber, c, 0 );
m_GhostArrowRow[c].SetX( fX );
m_GhostArrowRowBright[c].SetX( fX );
m_HoldGhostArrowRow[c].SetX( fX );
float fZ = ArrowGetZPos( m_PlayerNumber, c, 0 );
m_GhostArrowRow[c].SetZ( fZ );
m_GhostArrowRowBright[c].SetZ( fZ );
m_HoldGhostArrowRow[c].SetZ( fZ );
m_GhostDim[c].SetX( fX );
m_GhostBright[c].SetX( fX );
m_GhostMine[c].SetX( fX );
m_HoldGhost[c].SetX( fX );
m_GhostArrowRow[c].Draw();
m_GhostArrowRowBright[c].Draw();
m_HoldGhostArrowRow[c].Draw();
float fZ = ArrowGetZPos( m_PlayerNumber, c, 0 );
m_GhostDim[c].SetZ( fZ );
m_GhostBright[c].SetZ( fZ );
m_GhostMine[c].SetZ( fZ );
m_HoldGhost[c].SetZ( fZ );
m_GhostDim[c].Draw();
m_GhostBright[c].Draw();
m_GhostMine[c].Draw();
m_HoldGhost[c].Draw();
g_NoteFieldMode[m_PlayerNumber].EndDrawTrack(c);
}
@@ -90,13 +107,18 @@ void GhostArrowRow::TapNote( int iCol, TapNoteScore score, bool bBright )
{
ASSERT( iCol >= 0 && iCol < m_iNumCols );
if( bBright )
m_GhostArrowRowBright[iCol].Step( score );
m_GhostBright[iCol].Step( score );
else
m_GhostArrowRow[iCol].Step( score );
m_GhostDim[iCol].Step( score );
}
void GhostArrowRow::HoldNote( int iCol )
{
ASSERT( iCol >= 0 && iCol < m_iNumCols );
m_HoldGhostArrowRow[iCol].Step();
m_HoldGhost[iCol].Step();
}
void GhostArrowRow::TapMine( int iCol, TapNoteScore score )
{
m_GhostMine[iCol].Step( score );
}
+5 -4
View File
@@ -13,7 +13,6 @@
#include "ActorFrame.h"
#include "GhostArrow.h"
#include "GhostArrowBright.h"
#include "HoldGhostArrow.h"
#include "GameConstantsAndTypes.h"
#include "StyleDef.h"
@@ -30,15 +29,17 @@ public:
void Load( PlayerNumber pn );
void TapNote( int iCol, TapNoteScore score, bool bBright );
void TapMine( int iCol, TapNoteScore score );
void HoldNote( int iCol );
protected:
int m_iNumCols;
PlayerNumber m_PlayerNumber;
GhostArrow m_GhostArrowRow[MAX_NOTE_TRACKS];
GhostArrowBright m_GhostArrowRowBright[MAX_NOTE_TRACKS];
HoldGhostArrow m_HoldGhostArrowRow[MAX_NOTE_TRACKS];
GhostArrow m_GhostDim[MAX_NOTE_TRACKS];
GhostArrow m_GhostBright[MAX_NOTE_TRACKS];
GhostArrow m_GhostMine[MAX_NOTE_TRACKS];
HoldGhostArrow m_HoldGhost[MAX_NOTE_TRACKS];
};
+26 -3
View File
@@ -199,6 +199,8 @@ void Player::Load( PlayerNumber pn, NoteData* pNoteData, LifeMeter* pLM, Combine
}
m_sLastSeenNoteSkin = GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_sNoteSkin;
m_soundMineExplosion.Load( THEME->GetPathToS("Player explosion") );
}
void Player::Update( float fDeltaTime )
@@ -458,6 +460,9 @@ void Player::Step( int col, RageTimer tm )
const float fSecondsFromPerfect = fabsf( fNoteOffset );
TapNote tn = GetTapNote(col,iIndexOverlappingNote);
// calculate TapNoteScore
TapNoteScore score;
@@ -472,6 +477,15 @@ void Player::Step( int col, RageTimer tm )
else if( fScaledSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowGoodSeconds ) score = TNS_GOOD;
else if( fScaledSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowBooSeconds ) score = TNS_BOO;
else score = TNS_NONE;
// Penalize for stepping on mines
if( tn == TAP_MINE && score > TNS_NONE )
{
m_soundMineExplosion.Play();
score = TNS_MISS;
m_GhostArrowRow.TapMine( col, TNS_MISS );
}
break;
}
case PC_CPU:
@@ -483,9 +497,21 @@ void Player::Step( int col, RageTimer tm )
* misses. */
if( score == TNS_MISS )
return;
// Unless the computer made a very good step, they were fooled by the mine
if( tn == TAP_MINE && score <= TNS_GREAT )
{
m_soundMineExplosion.Play();
score = TNS_MISS;
m_GhostArrowRow.TapMine( col, TNS_MISS );
}
break;
case PC_AUTOPLAY:
score = TNS_MARVELOUS;
// Don't step on mines
if( tn == TAP_MINE )
return;
break;
default:
ASSERT(0);
@@ -493,9 +519,6 @@ void Player::Step( int col, RageTimer tm )
break;
}
// Stepping on a mine counts as a miss
if( GetTapNote(col,iIndexOverlappingNote) == TAP_MINE )
score = TNS_MISS;
if( score != TNS_NONE && score != TNS_MISS )
{
+3 -4
View File
@@ -16,10 +16,6 @@
#include "Sprite.h"
#include "BitmapText.h"
#include "GrayArrow.h"
#include "GhostArrow.h"
#include "GhostArrowBright.h"
#include "HoldGhostArrow.h"
#include "ActorFrame.h"
#include "RandomSample.h"
#include "Judgment.h"
@@ -32,6 +28,7 @@
#include "ArrowBackdrop.h"
#include "RageTimer.h"
#include "ProTimingDisplay.h"
#include "RageSound.h"
class ScoreDisplay;
class LifeMeter;
@@ -97,6 +94,8 @@ protected:
CString m_sLastSeenNoteSkin;
bool m_bShowJudgment;
int m_iRowLastCrossed;
RageSound m_soundMineExplosion;
};
#endif
+4 -23
View File
@@ -65,7 +65,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
@@ -102,7 +102,7 @@ IntDir=.\Debug
TargetDir=\stepmania\stepmania
TargetName=default
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
@@ -142,7 +142,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
@@ -183,7 +183,7 @@ IntDir=.\StepMania___Xbox_Release
TargetDir=\stepmania\stepmania
TargetName=default
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
@@ -2984,25 +2984,6 @@ SOURCE=.\GhostArrow.h
# End Source File
# Begin Source File
SOURCE=.\GhostArrowBright.cpp
!IF "$(CFG)" == "StepMania - Win32 Debug"
!ELSEIF "$(CFG)" == "StepMania - Xbox Debug"
!ELSEIF "$(CFG)" == "StepMania - Win32 Release"
!ELSEIF "$(CFG)" == "StepMania - Xbox Release"
!ENDIF
# End Source File
# Begin Source File
SOURCE=.\GhostArrowBright.h
# End Source File
# Begin Source File
SOURCE=.\GhostArrowRow.cpp
!IF "$(CFG)" == "StepMania - Win32 Debug"
-6
View File
@@ -1349,12 +1349,6 @@ cl /Zl /nologo /c verstub.cpp /Fo&quot;$(IntDir)&quot;\
<File
RelativePath=".\GhostArrow.h">
</File>
<File
RelativePath=".\GhostArrowBright.cpp">
</File>
<File
RelativePath=".\GhostArrowBright.h">
</File>
<File
RelativePath="GhostArrowRow.cpp">
</File>