Skip to content

Commit 42c0f15

Browse files
committed
implementing expandfield c++ version
1 parent 6a63685 commit 42c0f15

File tree

10 files changed

+143
-77
lines changed

10 files changed

+143
-77
lines changed

NoteSkins/common/common/metrics.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ HoldTailNoteColorCount=8
7777
HoldTailNoteColorType=Denominator
7878

7979

80+
UseStretchHolds=0
81+
UseShrinkHolds=0
8082
StartDrawingHoldBodyOffsetFromHead=0
8183
StopDrawingHoldBodyOffsetFromTail=-32 // top of tail
8284
HoldLetGoGrayPercent=0.25

src/GhostArrowRow.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ void GhostArrowRow::DidTapNote( int iCol, TapNoteScore tns, bool bBright )
103103
msg.SetParam( "TapNoteScore", tns );
104104
// This may be useful for popn styled judgment :) -DaisuMaster
105105
msg.SetParam( "Column", iCol );
106+
msg.SetParam( "Color", NOTESKIN->GetLastSeenColor() );
106107
if( bBright )
107108
msg.SetParam( "Bright", true );
108109
m_Ghost[iCol]->HandleMessage( msg );
@@ -122,6 +123,7 @@ void GhostArrowRow::DidHoldNote( int iCol, HoldNoteScore hns, bool bBright )
122123
Message msg("ColumnJudgment");
123124
msg.SetParam( "HoldNoteScore", hns );
124125
msg.SetParam( "Column", iCol );
126+
msg.SetParam( "Color", NOTESKIN->GetLastSeenColor() );
125127
if( bBright )
126128
msg.SetParam( "Bright", true );
127129
m_Ghost[iCol]->HandleMessage( msg );

src/NoteDisplay.cpp

Lines changed: 88 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "global.h"
1+
#include "global.h"
22
#include "ActorUtil.h"
33
#include "ArrowEffects.h"
44
#include "Foreach.h"
@@ -80,7 +80,9 @@ struct NoteMetricCache_t
8080
bool m_bHoldTailIsAboveWavyParts;
8181
int m_iStartDrawingHoldBodyOffsetFromHead;
8282
int m_iStopDrawingHoldBodyOffsetFromTail;
83-
float m_fHoldLetGoGrayPercent;
83+
float m_fHoldLetGoGrayPercent;
84+
bool m_UseStretchHolds;
85+
bool m_UseShrinkHolds;
8486
bool m_bFlipHeadAndTailWhenReverse;
8587
bool m_bFlipHoldBodyWhenReverse;
8688
bool m_bTopHoldAnchorWhenReverse;
@@ -109,7 +111,9 @@ void NoteMetricCache_t::Load( const RString &sButton )
109111
m_NoteColorType[p] = StringToNoteColorType(ct);
110112
}
111113
//I was here -DaisuMaster
112-
m_bAnimationBasedOnBeats = NOTESKIN->GetMetricB(sButton,"AnimationIsBeatBased");
114+
m_bAnimationBasedOnBeats = NOTESKIN->GetMetricB(sButton,"AnimationIsBeatBased");
115+
m_UseStretchHolds = NOTESKIN->GetMetricB(sButton, "UseStretchHolds");
116+
m_UseShrinkHolds = NOTESKIN->GetMetricB(sButton, "UseShrinkHolds");
113117
m_bHoldHeadIsAboveWavyParts = NOTESKIN->GetMetricB(sButton,"HoldHeadIsAboveWavyParts");
114118
m_bHoldTailIsAboveWavyParts = NOTESKIN->GetMetricB(sButton,"HoldTailIsAboveWavyParts");
115119
m_iStartDrawingHoldBodyOffsetFromHead = NOTESKIN->GetMetricI(sButton,"StartDrawingHoldBodyOffsetFromHead");
@@ -182,26 +186,26 @@ struct NoteResource
182186
Actor *m_pActor; // todo: AutoActor me? -aj
183187
};
184188

185-
static map<NoteSkinAndPath, NoteResource *> g_NoteResource;
189+
static map<RString, map<NoteSkinAndPath, NoteResource *>> g_NoteResource;
186190

187-
static NoteResource *MakeNoteResource( const RString &sButton, const RString &sElement, PlayerNumber pn, GameController gc, bool bSpriteOnly )
191+
static NoteResource *MakeNoteResource( const RString &sButton, const RString &sElement, PlayerNumber pn, GameController gc, bool bSpriteOnly, RString Color)
188192
{
189193
RString sElementAndType = ssprintf( "%s, %s", sButton.c_str(), sElement.c_str() );
190194
NoteSkinAndPath nsap( NOTESKIN->GetCurrentNoteSkin(), sElementAndType, pn, gc );
191195

192-
map<NoteSkinAndPath, NoteResource *>::iterator it = g_NoteResource.find( nsap );
193-
if( it == g_NoteResource.end() )
196+
map<NoteSkinAndPath, NoteResource *>::iterator it = g_NoteResource[Color].find( nsap );
197+
if( it == g_NoteResource[Color].end() )
194198
{
195199
auto *pRes = new NoteResource( nsap );
196200

197201
NOTESKIN->SetPlayerNumber( pn );
198202
NOTESKIN->SetGameController( gc );
199203

200-
pRes->m_pActor = NOTESKIN->LoadActor( sButton, sElement, NULL, bSpriteOnly );
204+
pRes->m_pActor = NOTESKIN->LoadActor( sButton, sElement, NULL, bSpriteOnly, Color);
201205
ASSERT( pRes->m_pActor != NULL );
202206

203-
g_NoteResource[nsap] = pRes;
204-
it = g_NoteResource.find( nsap );
207+
g_NoteResource[Color][nsap] = pRes;
208+
it = g_NoteResource[Color].find( nsap );
205209
}
206210

207211
NoteResource *pRet = it->second;
@@ -218,55 +222,63 @@ static void DeleteNoteResource( NoteResource *pRes )
218222
if( pRes->m_iRefCount != 0 )
219223
return;
220224

221-
g_NoteResource.erase( pRes->m_nsap );
225+
map<RString, map<NoteSkinAndPath, NoteResource *>>::iterator it;
226+
for (it = g_NoteResource.begin(); it != g_NoteResource.end(); it++)
227+
it->second.erase(pRes->m_nsap);
222228
delete pRes;
223229
}
224230

225231
/* NoteColorActor */
226232

227233
NoteColorActor::NoteColorActor()
228234
{
229-
m_p = NULL;
235+
g_p.clear();
230236
}
231237

232238
NoteColorActor::~NoteColorActor()
233239
{
234-
if( m_p != nullptr )
235-
DeleteNoteResource( m_p );
240+
map<RString, NoteResource*>::iterator it;
241+
for (it = g_p.begin(); it != g_p.end(); it++)
242+
if (it->second)
243+
DeleteNoteResource(it->second);
244+
g_p.clear();
236245
}
237246

238-
void NoteColorActor::Load( const RString &sButton, const RString &sElement, PlayerNumber pn, GameController gc )
247+
void NoteColorActor::Load( const RString &sButton, const RString &sElement, PlayerNumber pn, GameController gc ,RString Color)
239248
{
240-
m_p = MakeNoteResource( sButton, sElement, pn, gc, false );
249+
g_p[Color] = MakeNoteResource( sButton, sElement, pn, gc, false, Color);
241250
}
242251

243252

244-
Actor *NoteColorActor::Get()
253+
Actor *NoteColorActor::Get(RString Color)
245254
{
246-
return m_p->m_pActor;
255+
return g_p[Color]->m_pActor;
247256
}
248257

249258
/* NoteColorSprite */
250259

251260
NoteColorSprite::NoteColorSprite()
252261
{
253-
m_p = NULL;
262+
g_p.clear();
254263
}
255264

256265
NoteColorSprite::~NoteColorSprite()
257266
{
258-
if( m_p != nullptr )
259-
DeleteNoteResource( m_p );
267+
map<RString, NoteResource*>::iterator it;
268+
for (it = g_p.begin(); it != g_p.end(); it++)
269+
if (it->second)
270+
DeleteNoteResource(it->second);
271+
g_p.clear();
260272
}
261273

262-
void NoteColorSprite::Load( const RString &sButton, const RString &sElement, PlayerNumber pn, GameController gc )
274+
void NoteColorSprite::Load( const RString &sButton, const RString &sElement, PlayerNumber pn, GameController gc, RString Color)
263275
{
264-
m_p = MakeNoteResource( sButton, sElement, pn, gc, true );
276+
g_p[Color] = MakeNoteResource(sButton, sElement, pn, gc, true, Color);
265277
}
266278

267-
Sprite *NoteColorSprite::Get()
279+
Sprite *NoteColorSprite::Get(RString Color)
268280
{
269-
return dynamic_cast<Sprite *>( m_p->m_pActor );
281+
return dynamic_cast<Sprite *>( g_p[Color]->m_pActor );
270282
}
271283

272284
static const char *HoldTypeNames[] = {
@@ -418,23 +430,28 @@ void NoteDisplay::Load( int iColNum, const PlayerState* pPlayerState, float fYRe
418430

419431
cache->Load( sButton );
420432

421-
// "normal" note types
422-
m_TapNote.Load( sButton, "Tap Note", pn, GameI[0].controller );
423-
//m_TapAdd.Load( sButton, "Tap Addition", pn, GameI.controller );
424-
m_TapMine.Load( sButton, "Tap Mine", pn, GameI[0].controller );
425-
m_TapLift.Load( sButton, "Tap Lift", pn, GameI[0].controller );
426-
m_TapFake.Load( sButton, "Tap Fake", pn, GameI[0].controller );
433+
vector<RString> Colors = {"4th","8th", "12th", "16th", "24th", "32nd", "48th", "64th", "192nd" };
427434

428-
// hold types
429-
FOREACH_HoldType( ht )
435+
vector<RString>::iterator Color;
436+
for( Color = Colors.begin() ; Color != Colors.end() ; Color++ )
430437
{
431-
FOREACH_ActiveType( at )
438+
// "normal" note types
439+
m_TapNote.Load( sButton, "Tap Note", pn, GameI[0].controller, *Color);
440+
m_TapMine.Load( sButton, "Tap Mine", pn, GameI[0].controller, *Color);
441+
m_TapLift.Load( sButton, "Tap Lift", pn, GameI[0].controller, *Color);
442+
m_TapFake.Load( sButton, "Tap Fake", pn, GameI[0].controller, *Color);
443+
444+
// hold types
445+
FOREACH_HoldType( ht )
432446
{
433-
m_HoldHead[ht][at].Load( sButton, HoldTypeToString(ht)+" Head "+ActiveTypeToString(at), pn, GameI[0].controller );
434-
m_HoldTopCap[ht][at].Load( sButton, HoldTypeToString(ht)+" Topcap "+ActiveTypeToString(at), pn, GameI[0].controller );
435-
m_HoldBody[ht][at].Load( sButton, HoldTypeToString(ht)+" Body "+ActiveTypeToString(at), pn, GameI[0].controller );
436-
m_HoldBottomCap[ht][at].Load( sButton, HoldTypeToString(ht)+" Bottomcap "+ActiveTypeToString(at), pn, GameI[0].controller );
437-
m_HoldTail[ht][at].Load( sButton, HoldTypeToString(ht)+" Tail "+ActiveTypeToString(at), pn, GameI[0].controller );
447+
FOREACH_ActiveType( at )
448+
{
449+
m_HoldHead[ht][at].Load( sButton, HoldTypeToString(ht)+" Head "+ActiveTypeToString(at), pn, GameI[0].controller, *Color);
450+
m_HoldTopCap[ht][at].Load( sButton, HoldTypeToString(ht)+" Topcap "+ActiveTypeToString(at), pn, GameI[0].controller, *Color);
451+
m_HoldBody[ht][at].Load( sButton, HoldTypeToString(ht)+" Body "+ActiveTypeToString(at), pn, GameI[0].controller, *Color);
452+
m_HoldBottomCap[ht][at].Load( sButton, HoldTypeToString(ht)+" Bottomcap "+ActiveTypeToString(at), pn, GameI[0].controller, *Color);
453+
m_HoldTail[ht][at].Load( sButton, HoldTypeToString(ht)+" Tail "+ActiveTypeToString(at), pn, GameI[0].controller, *Color);
454+
}
438455
}
439456
}
440457
}
@@ -609,11 +626,15 @@ void NoteDisplay::Update( float fDeltaTime )
609626
{
610627
/* This function is static: it's called once per game loop, not once per
611628
* NoteDisplay. Update each cached item exactly once. */
629+
map<RString, map<NoteSkinAndPath, NoteResource *>>::iterator it2;
612630
map<NoteSkinAndPath, NoteResource *>::iterator it;
613-
for( it = g_NoteResource.begin(); it != g_NoteResource.end(); ++it )
631+
for (it2 = g_NoteResource.begin() ; it2 != g_NoteResource.end() ; it2++)
614632
{
615-
NoteResource *pRes = it->second;
616-
pRes->m_pActor->Update( fDeltaTime );
633+
for(it = it2->second.begin(); it != it2->second.end(); it++)
634+
{
635+
NoteResource *pRes = it->second;
636+
pRes->m_pActor->Update(fDeltaTime);
637+
}
617638
}
618639
}
619640

@@ -652,7 +673,8 @@ void NoteDisplay::SetActiveFrame( float fNoteBeat, Actor &actorToSet, float fAni
652673

653674
Actor *NoteDisplay::GetTapActor( NoteColorActor &nca, NotePart part, float fNoteBeat )
654675
{
655-
Actor *pActorOut = nca.Get();
676+
RString Color = NoteTypeToString(BeatToNoteType(fNoteBeat));
677+
Actor *pActorOut = nca.Get(Color);
656678

657679
SetActiveFrame( fNoteBeat, *pActorOut, cache->m_fAnimationLength[part], cache->m_bAnimationIsVivid[part] );
658680
return pActorOut;
@@ -665,8 +687,9 @@ Actor *NoteDisplay::GetHoldActor( NoteColorActor nca[NUM_HoldType][NUM_ActiveTyp
665687

666688
Sprite *NoteDisplay::GetHoldSprite( NoteColorSprite ncs[NUM_HoldType][NUM_ActiveType], NotePart part, float fNoteBeat, bool bIsRoll, bool bIsBeingHeld )
667689
{
668-
Sprite *pSpriteOut = ncs[bIsRoll ? roll:hold][bIsBeingHeld ? active:inactive].Get();
669-
690+
RString Color = NoteTypeToString(BeatToNoteType(fNoteBeat));
691+
Sprite *pSpriteOut = ncs[bIsRoll ? roll:hold][bIsBeingHeld ? active:inactive].Get(Color);
692+
670693
SetActiveFrame( fNoteBeat, *pSpriteOut, cache->m_fAnimationLength[part], cache->m_bAnimationIsVivid[part] );
671694
return pSpriteOut;
672695
}
@@ -728,7 +751,9 @@ void NoteDisplay::DrawHoldPart(vector<Sprite*> &vpSpr,
728751
if(part_args.flip_texture_vertically)
729752
swap(rect.top, rect.bottom);
730753
const float fFrameWidth = pSprite->GetUnzoomedWidth();
731-
const float unzoomed_frame_height= pSprite->GetUnzoomedHeight();
754+
float unzoomed_frame_height = pSprite->GetUnzoomedHeight();
755+
if (part_type == hpt_body && cache->m_UseStretchHolds)
756+
unzoomed_frame_height = part_args.y_length;
732757

733758
/* Only draw the section that's within the range specified. If a hold note is
734759
* very long, don't process or draw the part outside of the range. Don't change
@@ -1000,7 +1025,7 @@ void NoteDisplay::DrawHoldBodyInternal(vector<Sprite*>& sprite_top,
10001025
const NoteColumnRenderArgs& column_args,
10011026
draw_hold_part_args& part_args,
10021027
const float head_minus_top, const float tail_plus_bottom,
1003-
const float y_head, const float y_tail, const float top_beat,
1028+
const float y_head, const float y_tail, const float y_length, const float top_beat,
10041029
const float bottom_beat, bool glow)
10051030
{
10061031
if (y_head < y_tail)
@@ -1015,7 +1040,8 @@ void NoteDisplay::DrawHoldBodyInternal(vector<Sprite*>& sprite_top,
10151040

10161041
// Draw the body if the start is not lower than the start of the tail
10171042
part_args.y_top = y_head;
1018-
part_args.y_bottom = y_tail;
1043+
part_args.y_bottom = y_tail;
1044+
part_args.y_length = y_length;
10191045
part_args.top_beat = top_beat;
10201046
part_args.bottom_beat = bottom_beat;
10211047
part_args.wrapping = true;
@@ -1034,7 +1060,7 @@ void NoteDisplay::DrawHoldBodyInternal(vector<Sprite*>& sprite_top,
10341060
void NoteDisplay::DrawHoldBody(const TapNote& tn,
10351061
const NoteFieldRenderArgs& field_args,
10361062
const NoteColumnRenderArgs& column_args, float beat,
1037-
bool being_held, float y_head, float y_tail, float percent_fade_to_fail,
1063+
bool being_held, float y_head, float y_tail, float y_length, float percent_fade_to_fail,
10381064
float color_scale, float top_beat, float bottom_beat)
10391065
{
10401066
draw_hold_part_args part_args;
@@ -1111,7 +1137,7 @@ void NoteDisplay::DrawHoldBody(const TapNote& tn,
11111137
DISPLAY->SetTextureMode(TextureUnit_1, TextureMode_Modulate);
11121138
DrawHoldBodyInternal(vpSprTop, vpSprBody, vpSprBottom, field_args,
11131139
column_args, part_args, head_minus_top,
1114-
tail_plus_bottom, y_head, y_tail, top_beat, bottom_beat,
1140+
tail_plus_bottom, y_head, y_tail, y_length, top_beat, bottom_beat,
11151141
false);
11161142

11171143
if((*field_args.selection_begin_marker != -1 && *field_args.selection_end_marker != -1)
@@ -1121,10 +1147,12 @@ void NoteDisplay::DrawHoldBody(const TapNote& tn,
11211147
DISPLAY->SetTextureMode(TextureUnit_1, TextureMode_Glow);
11221148
DrawHoldBodyInternal(vpSprTop, vpSprBody, vpSprBottom, field_args,
11231149
column_args, part_args, head_minus_top,
1124-
tail_plus_bottom, y_head, y_tail, top_beat, bottom_beat,
1150+
tail_plus_bottom, y_head, y_tail, y_length, top_beat, bottom_beat,
11251151
true);
11261152
}
1127-
}
1153+
}
1154+
1155+
static map<int, map<int, map<int, float>>> HoldSize;
11281156

11291157
void NoteDisplay::DrawHold(const TapNote& tn,
11301158
const NoteFieldRenderArgs& field_args,
@@ -1155,7 +1183,13 @@ void NoteDisplay::DrawHold(const TapNote& tn,
11551183

11561184
float fEndPeakYOffset = 0;
11571185
bool bEndIsPastPeak = false;
1158-
float fEndYOffset = ArrowEffects::GetYOffset( m_pPlayerState, column_args.column, NoteRowToBeat(iEndRow), fEndPeakYOffset, bEndIsPastPeak );
1186+
float fEndYOffset = ArrowEffects::GetYOffset( m_pPlayerState, column_args.column, NoteRowToBeat(iEndRow), fEndPeakYOffset, bEndIsPastPeak );
1187+
float length;
1188+
if (!tn.HoldResult.bActive)
1189+
HoldSize[m_pPlayerState->m_PlayerNumber][iRow][column_args.column] = fEndYOffset - fStartYOffset;
1190+
length = HoldSize[m_pPlayerState->m_PlayerNumber][iRow][column_args.column];
1191+
if (cache->m_UseShrinkHolds)
1192+
length = fEndYOffset - fStartYOffset;
11591193

11601194
// In boomerang, the arrows reverse direction at Y offset value fPeakAtYOffset.
11611195
// If fPeakAtYOffset lies inside of the hold we're drawing, then the we
@@ -1194,7 +1228,7 @@ void NoteDisplay::DrawHold(const TapNote& tn,
11941228
}
11951229
*/
11961230

1197-
DrawHoldBody(tn, field_args, column_args, fBeat, bIsBeingHeld, fYHead, fYTail, fPercentFadeToFail, fColorScale, top_beat, bottom_beat);
1231+
DrawHoldBody(tn, field_args, column_args, fBeat, bIsBeingHeld, fYHead, fYTail, length, fPercentFadeToFail, fColorScale, top_beat, bottom_beat);
11981232

11991233
/* These set the texture mode themselves. */
12001234
// this part was modified in pumpmania, where it flips the draw order

src/NoteDisplay.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,20 @@ struct NoteColorActor
4848
{
4949
NoteColorActor();
5050
~NoteColorActor();
51-
void Load( const RString &sButton, const RString &sElement, PlayerNumber, GameController );
52-
Actor *Get();
51+
void Load( const RString &sButton, const RString &sElement, PlayerNumber, GameController, RString );
52+
Actor *Get(RString);
5353
private:
54-
NoteResource *m_p;
54+
map<RString, NoteResource*> g_p;
5555
};
5656

5757
struct NoteColorSprite
5858
{
5959
NoteColorSprite();
6060
~NoteColorSprite();
61-
void Load( const RString &sButton, const RString &sElement, PlayerNumber, GameController );
62-
Sprite *Get();
61+
void Load( const RString &sButton, const RString &sElement, PlayerNumber, GameController, RString );
62+
Sprite *Get(RString);
6363
private:
64-
NoteResource *m_p;
64+
map<RString, NoteResource*> g_p;
6565
};
6666
/** @brief What types of holds are there? */
6767
enum HoldType
@@ -227,6 +227,7 @@ class NoteDisplay
227227
float overlapped_time;
228228
float y_top;
229229
float y_bottom;
230+
float y_length;
230231
float y_start_pos;
231232
float y_end_pos;
232233
float top_beat;
@@ -251,11 +252,11 @@ class NoteDisplay
251252
const NoteColumnRenderArgs& column_args,
252253
draw_hold_part_args& part_args,
253254
const float head_minus_top, const float tail_plus_bottom,
254-
const float y_head, const float y_tail, const float top_beat,
255+
const float y_head, const float y_tail, const float y_length, const float top_beat,
255256
const float bottom_beat, bool glow);
256257
void DrawHoldBody(const TapNote& tn, const NoteFieldRenderArgs& field_args,
257258
const NoteColumnRenderArgs& column_args, float beat, bool being_held,
258-
float y_head, float y_tail, float percent_fade_to_fail,
259+
float y_head, float y_tail, float y_end, float percent_fade_to_fail,
259260
float color_scale, float top_beat, float bottom_beat);
260261

261262
const PlayerState *m_pPlayerState; // to look up PlayerOptions

0 commit comments

Comments
 (0)