Files
AC_Pro/StyleUploadFormUnit.cpp
2026-06-13 00:05:19 +08:00

508 lines
12 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "StyleUploadFormUnit.h"
#include "GlobalUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CKBox"
#pragma link "GeneralDialogPanel"
#pragma link "LineEdit"
#pragma link "TextButton"
#pragma resource "*.dfm"
TStyleUploadForm *StyleUploadForm;
//---------------------------------------------------------------------------
__fastcall TStyleUploadForm::TStyleUploadForm(TComponent* Owner, TPROSTYLE* pStyle, bool bShare)
: TForm(Owner)
{
m_bShare = bShare;
m_pStyle = pStyle;
m_iCheckCount = 0;
m_nScore = 0;
memset( m_iStyleType, -1, MAX_TYPE );
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::FormCreate(TObject *Sender)
{
m_GPanelBKG->Font->Size = g_szFont9;
m_btnOk->FontSize = g_szFont9;
m_btnCancel->FontSize = g_szFont9;
m_editStyleName->SetTextFont(g_strTxtFontName, g_szFont9);
m_editAuthor->SetTextFont(g_strTxtFontName, g_szFont9);
m_editCost->SetTextFont(g_strTxtFontName, g_szFont9);
m_cbTypes[0] = m_checkPop;
m_cbTypes[1] = m_checkFolk;
m_cbTypes[2] = m_checkRock;
m_cbTypes[3] = m_checkDance;
m_cbTypes[4] = m_checkJazz;
m_cbTypes[5] = m_checkBlues;
m_cbTypes[6] = m_checkSamba;
m_cbTypes[7] = m_checkClassic;
m_cbTypes[8] = m_checkWaltz;
m_cbTypes[9] = m_checkIndpent;
m_cbTypes[10] = m_checkCountry;
m_cbTypes[11] = m_checkOthers;
for(int i=0; i<12; i++ ){
m_cbTypes[i]->Font->Name = g_strTxtFontName;
m_cbTypes[i]->Font->Size = g_szFont9;
}
if( m_bShare ){
PresetType();
m_nScore = SystemScore() + 500;
char buf[16];
int score10 = (int)(m_nScore/10.0 + 0.5);
sprintf( buf, "%.1f", score10 / 10.0 );
m_lblNote->Caption = buf;
m_lblCost->Caption = "系统评分:";
m_lblCost->Left = m_editCost->Left;
m_editCost->Visible = false;
m_lblProtocol->Visible = false;
m_lblTips->Top = m_btnOk->Top;
m_lblTips->Height = 30;
}
else{
m_lblTips->Top = m_lblProtocol->Top - 24;
}
m_editStyleName->Text = UTF8ToMBCS(m_pStyle->pLocal->strStyleName).c_str();
m_editAuthor->Text = g_infoUser.strNickName;
SetTransparent( this );
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::EditNameChange(TObject *Sender)
{
TLineEdit* pEdit = ((TLineEdit*)Sender);
AnsiString strName = pEdit->Text.Trim();
string strTmp = GBToUTF8(strName.c_str());
if( strTmp.length()>pEdit->MaxLength ){
pEdit->OnChange = NULL;
pEdit->Text = pEdit->Text.SubString( 0, pEdit->Text.Length()-1 );
pEdit->SelStart = pEdit->Text.Length();
pEdit->OnChange = EditNameChange;
}
m_btnOk->Enabled = UploadEnabled();
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::MemoChange(TObject *Sender)
{
TMemo* memo = (TMemo*)Sender;
AnsiString strText = memo->Text.Trim();
string strTmp = GBToUTF8(strText.c_str());
if( strTmp.length()>memo->MaxLength ){
memo->OnChange = NULL;
memo->Text = memo->Text.SubString( 0, memo->Text.Length()-1 );
memo->SelStart = memo->Text.Length();
memo->OnChange = MemoChange;
}
m_btnOk->Enabled = UploadEnabled();
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::CheckBoxClick(TObject *Sender)
{
int iType = ((TCKBox*)Sender)->Tag;
bool bChecked = ((TCKBox*)Sender)->Checked;
bool bChanged = false;
if( bChecked ){
if( m_iCheckCount==MAX_TYPE ){
((TCKBox*)Sender)->Checked = false;
}
else{
for( int k=0; k<MAX_TYPE; k++ ){
if( m_iStyleType[k]==-1 ){
m_iStyleType[k] = iType;
m_iCheckCount++;
bChanged = true;
break;
}
}
}
}
else{
for( int k=0; k<MAX_TYPE; k++ ){
if( m_iStyleType[k]==iType ){
m_iStyleType[k] = -1;
m_iCheckCount--;
bChanged = true;
break;
}
}
}
if( bChanged )
m_btnOk->Enabled = UploadEnabled();
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::AuthorChange(TObject *Sender)
{
m_btnOk->Enabled = UploadEnabled();
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::CostChange(TObject *Sender)
{
m_btnOk->Enabled = UploadEnabled();
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::GetShareInfo( TSTYLESHARE* pInfo )
{
AnsiString strText = m_editStyleName->Text.Trim();
string strTmp = GBToUTF8(strText.c_str());
strcpy( pInfo->strStyleName, strTmp.c_str() );
strText = m_editAuthor->Text.Trim();
strTmp = GBToUTF8(strText.c_str());
strcpy( pInfo->strAuthor, strTmp.c_str() );
strText = m_memoDescription->Text.Trim();
strTmp = GBToUTF8(strText.c_str());
strcpy( pInfo->strDescription, strTmp.c_str() );
memset( pInfo->type, -1, MAX_TYPE );
int count = 0;
for( int i=0; i<TYPE_NUM; i++ ){
if( m_cbTypes[i]->Checked ){
pInfo->type[count++] = m_cbTypes[i]->Tag;
}
}
pInfo->score = m_nScore;
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::GetMakeInfo( TMAKESTYLEINFO* pInfo )
{
AnsiString strText = m_editStyleName->Text.Trim();
string strTmp = GBToUTF8(strText.c_str());
strcpy( pInfo->detail.strStyleName, strTmp.c_str() );
strText = m_editAuthor->Text.Trim();
strTmp = GBToUTF8(strText.c_str());
strcpy( pInfo->detail.strAuthor, strTmp.c_str() );
strText = m_memoDescription->Text.Trim();
strTmp = GBToUTF8(strText.c_str());
strcpy( pInfo->detail.strDescription, strTmp.c_str() );
memset( pInfo->detail.type, -1, 4 );
int count = 0;
for( int i=0; i<TYPE_NUM; i++ ){
if( m_cbTypes[i]->Checked ){
pInfo->detail.type[count++] = m_cbTypes[i]->Tag;
}
}
pInfo->cost = StrToInt( m_editCost->Text.Trim() );
}
//---------------------------------------------------------------------------
void TStyleUploadForm::PresetType()
{
TSTYLELOCAL* pLocal = m_pStyle->pLocal;
UINT aStyleIDs[MAX_STYLE];
memset( aStyleIDs, 0, MAX_STYLE*sizeof(UINT) );
int count = 0;
for( int i=0; count<MAX_STYLE && i<4; i++ ){
for( int j=0; count<MAX_STYLE && j<8; j++ ){
for( int k=0; k<16; k++ ){
if( pLocal->trkRef[i][j][k].idLoc==0
&& pLocal->trkRef[i][j][k].idStyle==0 )
break;
int id = pLocal->trkRef[i][j][k].idStyle;
bool bExist = false;
for( int j=0; j<count; j++ ){
if( id==aStyleIDs[j] ){
bExist = true;
break;
}
}
if( !bExist ){
aStyleIDs[count++] = id;
if( count>=MAX_STYLE ){
break;
}
}
}
}
}
for( int i=0; m_iCheckCount<MAX_TYPE && i<count; i++ ){
TPROSTYLE* pStyle = GetStyleInfo( 0, aStyleIDs[i] );
for( int j=0; j<MAX_TYPE; j++ ){
if( pStyle->pOrigin->detail.type[j]>=0 ){
char iType = pStyle->pOrigin->detail.type[j];
char iCB = iType;
if( iType>=TYPE_NUM-1 ){
iCB = TYPE_NUM-1;
iType = 127;
}
bool bFound = false;
for( int k=0; k<m_iCheckCount; k++ ){
if( m_iStyleType[k]==iType ){
bFound = true;
break;
}
}
if( !bFound ){
m_cbTypes[iCB]->Checked = true;
for( int k=0; k<MAX_TYPE; k++ ){
if( m_iStyleType[k]==-1 ){
m_iStyleType[k] = iType;
m_iCheckCount++;
break;
}
}
if( m_iCheckCount>=MAX_TYPE ){
break;
}
}
}
}
}
}
//---------------------------------------------------------------------------
int TStyleUploadForm::SystemScore()
{
int score = 0;
vector<UINT> aSegID;
for( int s=0; s<4; s++ ){
int repeat = s<2 ? 1 : 2; //前尾奏计算大小调
for( int r=0; r<repeat; r++ ){
int begin = r==0 ? 0 : 4, //前尾奏小调从4开始
end = begin + ( s==0 ? 4 : 2 ); //伴奏计算4个,其它计算2个
for( int n=begin; n<end; n++ ){
int segScore = 0;
UINT aTrkID[16], aTrkSN[16], aCount[16], nIDNum = 0;
memset( aTrkID, 0, sizeof(aTrkID) );
memset( aTrkSN, 0, sizeof(aTrkSN) );
memset( aCount, 0, sizeof(aCount) );
for( int t=0; segScore<25 && t<16; t++ ){
TTRACKREF& trkRef = m_pStyle->pLocal->trkRef[s][n][t];
int sn = trkRef.segNo;
if( trkRef.idStyle==0 )
break;
bool bDiffID = true;
for( int i=0; i<nIDNum; i++ ){
if( trkRef.idStyle==aTrkID[i] && sn==aTrkSN[i] ){
aCount[i]++;
bDiffID = false;
break;
}
}
if( bDiffID ){
if( nIDNum>0 )
segScore += 5;
aTrkID[nIDNum] = trkRef.idStyle;
aTrkSN[nIDNum] = sn;
aCount[nIDNum]++;
nIDNum++;
}
else{
TPROSTYLE* pTrkStyle = GetStyleInfo( 0, trkRef.idStyle );
TSTYLEDETAIL& detail = pTrkStyle->pOrigin->detail;
for( int i=0; i<16; i++ ){
TCHAN& trkOrig = detail.tracks[s][sn][i];
if( trkOrig.no<0 )
break;
if( trkOrig.no==trkRef.chan ){
if( trkOrig.prog!=trkRef.prog //修改了乐器和音量
|| trkOrig.vol!=trkRef.vol ){
segScore += 5;
}
break;
}
}
}
}
int maxCount = aCount[0], iMax = 0;
for( int i=1; i<nIDNum; i++ ){
if( aCount[i]>maxCount ){
maxCount = aCount[i];
iMax = i;
}
}
if( segScore<25 ){
TPROSTYLE* pSegStyle = GetStyleInfo( 0, aTrkID[iMax] );
TSTYLEDETAIL& detail = pSegStyle->pOrigin->detail;
int sn = aTrkSN[iMax];
int tc;
for( tc=0; tc<16 && detail.tracks[s][sn][tc].no>=0; tc++ );
if( tc>aCount[iMax] ){
segScore += 5 * ( tc-aCount[iMax] );
}
}
bool bDiffID = true;
for( int i=0; i<aSegID.size(); i++ ){
if( aSegID[i]==aTrkID[iMax] ){
bDiffID = false;
break;
}
}
bool bScore = false;
if( bDiffID ){
if( segScore<25 && aSegID.size()>0 ){
segScore += 10;
bScore = true;
}
aSegID.push_back( aTrkID[iMax] );
}
if( !bScore && m_pStyle->pLocal->nSegVol[s][n]<100
&& m_pStyle->pLocal->nSegVol[s][n]>50 ){
segScore += 5;
}
if( segScore>25 )
segScore = 25;
score += segScore;
}
}
}
if( score>350 )
score = 350;
if( score<100 ){
m_lblTips->Caption =
"提示:系统评分低于6分,不能上传\n 关于系统评分参看用户手册";
m_lblTips->Font->Color = 0x004040FF;
}
return score;
}
//---------------------------------------------------------------------------
bool TStyleUploadForm::UploadEnabled()
{
if( m_bShare && m_nScore<600 ){
return false;
}
if( m_editStyleName->Text.Trim().IsEmpty() ){
m_lblTips->Caption = "提示:请输入风格名称";
// m_editStyleName->SetFocus();
return false;
}
if( m_editAuthor->Text.Trim().IsEmpty() ){
if( m_bShare )
m_lblTips->Caption = "提示:请输入分享者名称";
else
m_lblTips->Caption = "提示:请输入制作者名称";
// m_editAuthor->SetFocus();
return false;
}
if( !m_bShare && m_editCost->Text.Trim().IsEmpty() ){
m_lblTips->Caption = "提示:请输入使用价格(0~9999)";
// m_editCost->SetFocus();
return false;
}
if( m_iCheckCount==0 ){
m_lblTips->Caption = "提示:请选择分类";
return false;
}
if( m_memoDescription->Text.Trim().IsEmpty() ){
m_lblTips->Caption = "提示:请输入描述信息";
// m_memoDescription->SetFocus();
return false;
}
m_lblTips->Caption = "";
return true;
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
switch( Key ){
case VK_RETURN:
if(m_btnOk->Enabled)
ModalResult = mrOk;
break;
case VK_ESCAPE:
ModalResult = mrCancel;
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::ProtocolMouseEnter(TObject *Sender)
{
m_lblProtocol->Font->Style = TFontStyles()<<fsUnderline<<fsBold;
m_lblProtocol->Font->Color = clAqua;
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::ProtocolMouseLeave(TObject *Sender)
{
m_lblProtocol->Font->Style = TFontStyles()<<fsBold;
m_lblProtocol->Font->Color = clHighlight;
}
//---------------------------------------------------------------------------
void __fastcall TStyleUploadForm::ProtocolClick(TObject *Sender)
{
String strUrl = g_strServerURL;
strUrl += L"/index.php/Web?tpl=style_agreement";
ShellExecute(Handle,NULL, strUrl.c_str(), NULL,NULL,SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------