Exemple #1
0
// int XMain::GetResIdxByCheckSum( XArrayLinear<XPatch::XRES_INFO> &ary, XUINT64 llCheckSum )
int XMain::GetResIdxByCheckSum( const XVector<XPatch::XRES_INFO> &ary, XUINT64 llCheckSum )
{
    int max = ary.size();
    for( int i = 0; i < max; ++i )	{
        if( ary[ i ].llChecksum == llCheckSum )
            return i;
    }
    return -1;
}
Exemple #2
0
/**
 @brief 효과 시전
 pEffect의 효과를 기준타겟(pBaseTarget)을 기준으로 시전대상을 선정하여 시전한다.
 현재 _vPos는 사용하지 않는다
*/
xtError XSkillUser::UseEffect( const XSkillDat *pDat,
															 EFFECT *pEffect,
															 int level,
															 XSkillReceiver *pBaseTarget,
															 const XE::VEC2& vBaseTarget,		// 기준타겟이 좌표형일경우.
															 ID idCallerSkill )
{
	// 좌표에 값이 있으면 타겟은 널이어야 한다.,
	XBREAK( vBaseTarget.IsNotZero() && pBaseTarget != nullptr );
	XVector<XSkillReceiver*> aryCastTargets;		// 시전대상
	// 기준타겟이나 기준좌표로 시전대상을 얻는다.
	XBREAK( pBaseTarget == nullptr && vBaseTarget.IsZero() );
	//
	XE::VEC2 vCastTarget;
	GetCastingTargetList( &aryCastTargets,
												&vCastTarget,
												pEffect->castTarget,
												pDat,
												pEffect,
												level,
												pBaseTarget,
												vBaseTarget );
	//
	if( vCastTarget.IsZero() && aryCastTargets.empty() ) {
		return xERR_NOT_FOUND_CASTING_TARGET;		// 시전대상을 찾지 못함
	}
	if( aryCastTargets.size() ) {
		// 캐스팅 대상들에게 효과를 시전한다.
		for( auto pCastingTarget : aryCastTargets ) {
			// 즉시시전 or 버프방식
			const XE::VEC2 vZero;
			CastEffToCastTarget( pDat,
													 pEffect,
													 level,
//												 pBaseTarget,
													 pCastingTarget,
													 vZero,
													 idCallerSkill );
		}
	} else 
	if( vCastTarget.IsNotZero() ) {
		// 시전대상이 좌표형
		CastEffToCastTarget( pDat,
												 pEffect,
												 level,
												 nullptr,
												 vCastTarget,
												 idCallerSkill );
	} else {
		XBREAK(1);
	}
	return xOK;
}
Exemple #3
0
/**
 @brief 즉시시전형태(비버프형)의 효과를 시전대상에게 시전한다.
*/
xtError XSkillUser::CastEffToCastTargetByDirect( const XSkillDat *pDat,
																								 const EFFECT *pEffect,
																								 int level,
																								 XSkillReceiver *pCastingTarget,
																								 const XE::VEC2& vCastTarget )
{
	XVector<XSkillReceiver*> aryInvokeTarget;
	// 1회성이기때문에 루아도 쓰고 바로 파괴되는걸로 함
	// 시전대상자(pCastingTarget)기준 발동대상 얻음
	XE::VEC2 vIvkTarget;			// 발동대상이 좌표형태일때 여기로 좌표가 담긴다.
	int numInvoke = GetInvokeTarget( &aryInvokeTarget,
																	 &vIvkTarget,
																	 pDat,
																	 level,
																	 pEffect->invokeTarget,
																	 pEffect,
																	 pCastingTarget,
																	 vCastTarget );
	if( numInvoke > 0 || vIvkTarget.IsNotZero() ) {
		bool bCreateSfx = ( pEffect->m_invokeTargetEff.m_strSpr.empty() ) ? false : true;
		if( aryInvokeTarget.size() ) {
			for( auto pInvokeTarget : aryInvokeTarget ) {
				// 발동대상들에게 효과 적용
				ApplyInvokeEffToIvkTarget( pInvokeTarget,
																	 vIvkTarget,
																	 pDat,
																	 pEffect,
																	 GetThisRecv(),		// invoker
																	 bCreateSfx,
																	 level,
																	 nullptr );		// pBuff
			} // for
		} else
		if( vIvkTarget.IsNotZero() ) {
			// 발동좌표에 효과적용
			ApplyInvokeEffToIvkTarget( nullptr,
																 vIvkTarget,
																 pDat,
																 pEffect,
																 GetThisRecv(),		// invoker
																 bCreateSfx,
																 level,
																 nullptr );		// pBuff
		}
	}
	return xOK;
} // CastEffToCastTargetByDirect
Exemple #4
0
void XGeometry::setAttribute( const QString &n, const XVector<XVector4D> &v )
  {
  if( v.size() )
    {
    _attr4[n] = v;
    if( _attr4[n].size() != _attributeSize )
      {
      _attributeSize = _attr4[n].size();
      _attributeSizeChanged = true;
      }
    }
  else
    {
    _attr1.remove(n);
    }
  _changedA4 << n;
  _changedAttrs = true;
  }
Exemple #5
0
// full_list.txt를 쓴다.
// int XMain::WriteFullList( XArrayLinear<XPatch::XRES_INFO>& aryAll )
int XMain::WriteFullList( const XVector<XPatch::XRES_INFO>& aryAll )
{
    char cPath[ 1024 ];
    strcpy_s( cPath, SZ2C( XE::_GetPathPackageRoot() ) );
    strcat_s( cPath, "full_list.txt" );
    FILE *fp = NULL;
    fopen_s( &fp, cPath, "wt" );
    if( fp == NULL )
        return 0;
    char cBuff[ 1024 ];
//	XARRAYLINEAR_LOOP( aryAll, XPatch::XRES_INFO, info )
    for( auto& info : aryAll ) {
        strcpy_s( cBuff, SZ2C( info.strFile.c_str() ) );
        strReplace( cBuff, '\\', '/' );
        fprintf_s( fp, "\"%s\"\t%d\t%llu\n", cBuff, info.size, info.llChecksum );
    }
    fprintf_s( fp, "// num files %d \n", aryAll.size() );
    fclose( fp );
    return 1;
}
Exemple #6
0
// core_list.txt를 쓴다.
//int XMain::WriteCoreList( XArrayLinear<_tstring>& aryCore )
int XMain::WriteCoreList( const XVector<_tstring>& aryCore )
{
    char cPath[ 1024 ];
    strcpy_s( cPath, SZ2C( XE::_GetPathPackageRoot() ) );
    strcat_s( cPath, "core_list.txt" );
    FILE *fp = NULL;
    fopen_s( &fp, cPath, "wt" );
    if( fp == NULL )
        return 0;
    char cBuff[ 1024 ];
//	XARRAYLINEAR_LOOP( aryCore, _tstring, strRes )
    for( auto& strRes : aryCore ) {
        strcpy_s( cBuff, SZ2C( strRes.c_str() ) );
        strReplace( cBuff, '\\', '/' );
        fprintf_s( fp, "\"%s\"\n", cBuff );
        //		fprintf_s( fp, "\"%s\"\n", SZ2C( strRes.c_str() ) );
    }
    fprintf_s( fp, "// num files %d \n", aryCore.size() );
    fclose( fp );
    return 1;
}