
AmnesiaïŒRebirthã®ãªãªãŒã¹ã«å ç«ã¡ãFractional Gamesã¯ãäŒèª¬çãªAmnesiaïŒThe Dark Descentãšãã®ç¶ç·šã§ããAmnesiaïŒA Machine ForPigsã®ãœãŒã¹ã³ãŒãããªãªãŒã¹ããŸãããéçåæããŒã«ã䜿çšããŠããããã®ã«ã«ããã©ãŒã²ãŒã ã®å éšã«ã²ã©ãééããã©ã®ããã«é ãããŠãããã確èªããŠã¿ãŸãããïŒ
Redditã§ãã²ãŒã ãAmnesiaïŒThe DarkDescendããšãAmnesiaïŒA Machine for Pigsãã®ãœãŒã¹ã³ãŒããå ¬éããããšãããã¥ãŒã¹ãèŠãŠãPVS-Studioã䜿çšããŠãã®ã³ãŒããéãéããŠç¢ºèªããããšãã§ãããåæã«ãã®èšäºã«ã€ããŠãç¹ã«ã10æ20æ¥ïŒãããŠãã®èšäºã®çºè¡æç¹ã§ã¯ãã§ã«å ¬éãããŠããïŒã«ããã®ã·ãªãŒãºã®æ°ããéšåã§ãããèšæ¶åªå€±ïŒåçããšããäºå®ãèæ ®ããŸãã
AmnesiaïŒThe Dark Descentã¯2010幎ã«ãªãªãŒã¹ãããã«ã«ããµãã€ãã«ãã©ãŒã²ãŒã ã«ãªããŸãããæ£çŽãªãšãããç§ã¯åãã¢ã«ãŽãªãºã ã«åŸã£ãŠãã©ãŒã²ãŒã ããã¬ã€ããŠããã®ã§ãå°ãã§ããããééããããšãã§ããŸããã§ãããè³ãã5åéå ¥åããæåã®ã¯ãªãŒãã®ç¬éã«ãalt + f4ãã§çµäºããã²ãŒã ãåé€ããŸããããããç§ã¯YouTubeã§ãã®ã²ãŒã ã®ããã»ãŒãžãèŠãã®ã奜ãã§ããã
ãããŠã誰ãããŸã PVS-Studioã«ç²ŸéããŠããªãå Žåã«åããŠãããã¯ããã°ã©ã ã®ãœãŒã¹ã³ãŒãå ã®ãšã©ãŒãçãããå Žæãæ¢ãéçã¢ãã©ã€ã¶ãŒã§ãã

ç§ã¯ç¹ã«ã²ãŒã ã®ãœãŒã¹ã³ãŒãã調ã¹ãã®ã奜ããªã®ã§ãã©ã®ãããªééãããã£ãã®ãçåã«æã£ãŠããå Žåã¯ã以åã®èšäºãèªãããšãã§ããŸãããŸãã¯ãã²ãŒã ã®ãœãŒã¹ã³ãŒãã®ç¢ºèªã«é¢ããååã®èšäºãèŠãŠãã ããã
確èªãããšããããTheDarkDescendããšãAMachineFor Pigsãã®ã³ãŒãã®å€ããéè€ããŠããã2ã€ã®ãããžã§ã¯ãã®ã¬ããŒãã¯éââåžžã«äŒŒãŠããããšãããããŸããããããã£ãŠã以äžã§åŒçšãããšã©ãŒã®ã»ãšãã©ãã¹ãŠãäž¡æ¹ã®ãããžã§ã¯ãã«å«ãŸããŠããŸãã
ãããŠããããã®ãããžã§ã¯ãã§æ€åºããããã¹ãŠã®ã¢ãã©ã€ã¶ãŒã®ãšã©ãŒã®æå€§ã®å±€ã¯ããã³ããŒïŒããŒã¹ãããšã©ãŒã®å±€ã§ããããããã£ãŠãèšäºã®ã¿ã€ãã«ããããã®ãšã©ãŒã®äž»ãªçç±ã¯ããæåŸã®è¡ã®åœ±é¿ãã§ãã
ããŠãããžãã¹ã«åãæãããŸãããã
ã³ããŒïŒããŒã¹ããšã©ãŒ
äžæ³šæãªã³ããŒã«äŒŒãäžå¯©ãªå ŽæããããããããŸãããå Žåã«ãã£ãŠã¯ãã²ãŒã èªäœã®å éšããžãã¯ãåå ã§ããå¯èœæ§ããããŸãããããã圌ããç§ãšåæè ã®äž¡æ¹ãåœæãããã®ã§ããã°ãå°ãªããšã圌ãã«ã€ããŠã³ã¡ã³ããã䟡å€ããããŸãããçµå±ã®ãšãããä»ã®éçºè ã¯ç§ãšåãããã«æ©ç¥ã«å¯ãã§ããå¯èœæ§ããããŸãã
ã¹ãããã1.
颿°å šäœã2ã€ã®ãªããžã§ã¯ãaObjectDataAãšaObjectDataBã®ã¡ãœãããšãã£ãŒã«ãã®çµæãæ¯èŒããããšã§æ§æãããäŸããå§ããŸããããããããããããããã«ããã®é¢æ°ãå®å šã«èª¬æããŸãã颿°ã®ã©ãã§ãšã©ãŒãçºçããããèªåã§ç¢ºèªããŠãã ããã
static bool SortStaticSubMeshesForBodies(const ....& aObjectDataA,
const ....& aObjectDataB)
{
//Is shadow caster check
if( aObjectDataA.mpObject->GetRenderFlagBit(....)
!= aObjectDataB.mpObject->GetRenderFlagBit(....))
{
return aObjectDataA.mpObject->GetRenderFlagBit(....)
< aObjectDataB.mpObject->GetRenderFlagBit(....);
}
//Material check
if( aObjectDataA.mpPhysicsMaterial != aObjectDataB.mpPhysicsMaterial)
{
return aObjectDataA.mpPhysicsMaterial < aObjectDataB.mpPhysicsMaterial;
}
//Char collider or not
if( aObjectDataA.mbCharCollider != aObjectDataB.mbCharCollider)
{
return aObjectDataA.mbCharCollider < aObjectDataB.mbCharCollider;
}
return aObjectDataA.mpObject->GetVertexBuffer()
< aObjectDataA.mpObject->GetVertexBuffer();
}
誀ã£ãŠçããã¹ãã€ããªãããã«ãåçïŒ

ãšã©ãŒãèŠã€ããããŸããïŒã¯ããæåŸã®æ»ãå€ã¯ãäž¡åŽã§aObjectDataAã䜿çšããæ¯èŒã§ããå ã®ã³ãŒãã®ãã¹ãŠã®åŒã1è¡ã§èšè¿°ãããŠããããšã«æ³šæããŠãã ãããããã§ã¯ããã¹ãŠãè¡å¹ ã«æ£ç¢ºã«åãŸãããã«ãã€ãããŒã·ã§ã³ãäœæããŸããããã®ãããªæ¬ é¥ãäžæ¥ã®çµããã«äœãæ¢ããæ³åããŠã¿ãŠãã ããããããŠãã¢ãã©ã€ã¶ãŒã¯ãå¢ååæãçµã¿ç«ãŠãŠå®è¡ããçŽåŸã«ãããèŠã€ããŸãã
V501 '<'æŒç®åã®å·ŠåŽãšå³åŽã«åäžã®ãµãåŒ 'aObjectDataA.mpObject-> GetVertexBufferïŒïŒ'ããããŸãã WorldLoaderHplMap.cpp 1123
ãã®çµæããã®ãããªãšã©ãŒã¯ãããã€ãã®QAã¹ããŒãžããã³ãŒãã®æ·±éšã«é ããã®ã§ã¯ãªããã³ãŒããèšè¿°ããã»ãŒç¬éã«æ€åºãããæ€çŽ¢ãäœåãå°é£ã«ãªããŸãã
ååã®AndreyKarpovã«ããã¡ã¢ãã¯ããããã¯å€å žçãªãæçµè¡ãšã©ãŒãã§ãããã ããããã¯2ã€ã®ãªããžã§ã¯ããæ¯èŒãããšãã®å žåçãªãšã©ãŒãã¿ãŒã³ã§ããããŸããèšäºãæ¯èŒæ©èœã«ãããæªã®ç掻ããåç §ããŠãã ããããã©ã°ã¡ã³ã2ã
èŠåã®åå ãšãªã£ãã³ãŒããèŠãŠã¿ãŸãããã

ããããããããããã«ãã¹ã¯ãªãŒã³ã·ã§ããä»ãã®ã³ãŒãã瀺ããŸãã
èŠåèªäœã¯æ¬¡ã®ããã«ãªããŸãã
V501åãéšååŒãLTYPE == eLuxJournalState_OpenNoteãã®å·Šã«ãšã||ãã®å³åŽã«ãããŸãããªãã¬ãŒã¿ãŒã LuxJournal.cpp 2262
ã¢ãã©ã€ã¶ãŒã¯ãlType倿°ã®å€ã®ãã§ãã¯äžã«ãšã©ãŒãããããšãæ€åºããŸãããåçæ§ã¯ãeLuxJournalState_OpenNoteåæåã®åãã¡ã³ããŒã§2åãã§ãã¯ãããŸãã
ãŸããèªã¿ããããåäžãããããã«ããã®ãããªæ¡ä»¶ãã衚圢åŒãã§èšè¿°ããŠã»ãããããããã¯ãããã°ã©ãã³ã°ããªãã¡ã¯ã¿ãªã³ã°ããã®ä»ãã¹ãŠã®æå€§ã®åé¡ãã®ç¬¬N13ç« ãåç §ããŠãã ããã
if(!( lType == eLuxJournalState_OpenNote
|| lType == eLuxJournalState_OpenDiary
|| lType == eLuxJournalState_OpenNote
|| lType == eLuxJournalState_OpenNarratedDiary))
return false;
ãã®åœ¢åŒã§ã¯ãã¢ãã©ã€ã¶ãŒããªããŠããšã©ãŒãèŠã€ããã®ãã¯ããã«ç°¡åã«ãªããŸãã
ããããçåãçããŸãããã®ãããªèª€ã£ããã§ãã¯ã¯ããã°ã©ã ããžãã¯ã®æªã¿ã«ã€ãªãããŸããïŒçµå±ã®ãšãããããããä»ã®lTypeå€ããã§ãã¯ããå¿ èŠããããŸãããã³ããŒïŒããŒã¹ããšã©ãŒã®ããã«ãã§ãã¯ã«å€±æããŸãããåæèªäœãèŠãŠã¿ãŸãããã
enum eLuxJournalState
{
eLuxJournalState_Main,
eLuxJournalState_Notes,
eLuxJournalState_Diaries,
eLuxJournalState_QuestLog,
eLuxJournalState_OpenNote,
eLuxJournalState_OpenDiary,
eLuxJournalState_OpenNarratedDiary,
eLuxJournalState_LastEnum,
};
ååã«ããªãŒãã³ããšããèšèãå«ãŸããŠããæå³ã¯3ã€ã ãã§ãããããŠã3ã€ãã¹ãŠããã§ãã¯ã«å«ãŸããŠããŸãããããããããã«ã¯è«çã®æªã¿ã¯ãããŸããããããã§ã確å®ã«èšãããšã¯äžå¯èœã§ãããã®ãããã¢ãã©ã€ã¶ãŒã¯ãã²ãŒã éçºè ãä¿®æ£ã§ããè«çãšã©ãŒãèŠã€ããããããæç¢ºã«ããããã«æžãçŽãã¹ããéããæžãããå ŽæãèŠã€ããŸããã
ãã©ã°ã¡ã³ã3ã
次ã®ã±ãŒã¹ã¯ãäžè¬ã«ãã³ããŒãšè²Œãä»ãã®ãšã©ãŒã®æãæçœãªäŸã§ãã
V7782ã€ã®é¡äŒŒããã³ãŒããã©ã°ã¡ã³ããèŠã€ãããŸããããããããããã¯ã¿ã€ããã¹ã§ããããmvAttackerIDsãã®ä»£ããã«ãmvSearcherIDsã倿°ã䜿çšããå¿ èŠããããŸãã LuxSavedGameTypes.cpp 615
void cLuxMusicHandler_SaveData::ToMusicHandler(....)
{
....
// Enemies
//Attackers
for(size_t i=0; i<mvAttackerIDs.Size(); ++i)
{
iLuxEntity *pEntity = apMap
->GetEntityByID(mvAttackerIDs[i]);
if(....)
{
....
}
else
{
Warning("....", mvAttackerIDs[i]);
}
}
//Searchers
for(size_t i=0; i<mvSearcherIDs.Size(); ++i)
{
iLuxEntity *pEntity = apMap->GetEntityByID(mvSearcherIDs[i]);
if(....)
{
....
}
else
{
Warning("....", mvAttackerIDs[i]);
}
}
}
æåã®ãµã€ã¯ã«ã§ã¯ãä»äºã¯ãã§è¡ãpEntityã®ãã€ã³ã¿ãä»ããŠåä¿¡ããmvAttackerIDsãæ¡ä»¶ãæºããããªãå Žåã¯ããããã°çšã®ã¡ãã»ãŒãžãåãã«å¯ŸããŠçºè¡ãmvAttackerIDsããã ããã³ãŒãã®åã®ã»ã¯ã·ã§ã³ãšãŸã£ããåãã¹ã¿ã€ã«ã®æ¬¡ã®ã«ãŒãã§ã¯ãpEntityã¯mvSearcherIDsã䜿çšããŠååŸãããŸãããã ããèŠåã¯mvAttackerIDã®èšåãšãšãã«çºè¡ãããŸãã
ã»ãšãã©ã®å ŽåãããµãŒãã£ãŒãã«çœ²åããã³ãŒããããã¯ã¯ããæ»æè ããããã¯ããã³ããŒããããmvAttackerIDsã眮æããåŸmvSearcherIDsããä»ã®ãããã¯ã¯å€æŽãããŸããã§ããããã®çµæããšã©ãŒã¡ãã»ãŒãžã¯ééã£ãé åã®èŠçŽ ã䜿çšããŸãã
ãã®ãšã©ãŒã¯ã²ãŒã ã®ããžãã¯ã«ã¯åœ±é¿ããŸãããããã®æ¹æ³ã§ããã®å Žæããããã°ããééã£ãmvSearcherIDsèŠçŽ ã§äœæ¥ããæéãç¡é§ã«ããå¿ èŠãããäººã«æ·±å»ãªè±ã眮ãããšãã§ããŸãã

ãã©ã°ã¡ã³ã4ã
ã¢ãã©ã€ã¶ãŒã¯ã次ã®çãããå Žæã3ã€ã®èŠåãšãšãã«ç€ºããŸããã
- V547åŒ 'pEntity == 0'ã¯åžžã«falseã§ããLuxScriptHandler.cpp 2444
- V649åäžã®æ¡ä»¶åŒãæã€2ã€ã®ãifãã¹ããŒãã¡ã³ãããããŸããæåã®ãifãã¹ããŒãã¡ã³ãã«ã¯é¢æ°returnãå«ãŸããŠããŸããããã¯ã2çªç®ã®ãifãã¹ããŒãã¡ã³ããç¡æå³ã§ããããšãæå³ããŸãããã§ãã¯è¡ïŒ2433ã2444ãLuxScriptHandler.cpp 2444
- V1051ãã¹ããªã³ãã®ãã§ãã¯ãæ€èšããŠãã ãããããã§ãpTargetEntityãããã§ãã¯ããå¿ èŠãããå¯èœæ§ããããŸããLuxScriptHandler.cpp 2444
ã³ãŒããèŠãŠã¿ãŸãããïŒ
void __stdcall cLuxScriptHandler::PlaceEntityAtEntity(....)
{
cLuxMap *pMap = gpBase->mpMapHandler->GetCurrentMap();
iLuxEntity *pEntity = GetEntity(....);
if(pEntity == NULL) return;
if(pEntity->GetBodyNum() == 0)
{
....
}
iPhysicsBody *pBody = GetBodyInEntity(....);
if(pBody == NULL) return;
iLuxEntity *pTargetEntity = GetEntity(....);
if(pEntity == NULL) return; // <=
iPhysicsBody *pTargetBody = GetBodyInEntity(....);
if(pTargetBody == NULL) return;
....
}
2çªç®ã®ãã§ãã¯pEntity == NULLã«å¯ŸããŠV547 èŠåãçºè¡ãããŸãããã¢ãã©ã€ã¶ãŒã®å Žåããã®ãã§ãã¯ã¯åžžã«falseã«ãªããŸããããã¯ããã®æ¡ä»¶ãtrueã®å Žåãåã®åæ§ã®ãã§ãã¯ã®ããã«é¢æ°ãããé«ãçµäºããããã§ãã æ¬¡ã®èŠåã§ããV649ã¯ã2ã€ã®åäžã®ãã§ãã¯ãããããã«çºè¡ãããŸãããéåžžããã®ãããªå Žåã¯ãšã©ãŒã§ã¯ãªãå¯èœæ§ããããŸããçªç¶ãã³ãŒãã®äžéšã1ã€ã®ããžãã¯ãå®è£ ããã³ãŒãã®å¥ã®éšåã§ãåããã§ãã¯ã«åŸã£ãŠãå¥ã®äœããå®è£ ããå¿ èŠããããŸãããã ãããã®å Žåãæåã®ãã§ãã¯ã®æ¬æã¯è¿åã§æ§æãããŸã
ããããã£ãŠãæ¡ä»¶ãçã§ããããšã倿ããå Žåã2çªç®ã®ãã§ãã¯ã¯ãã€ã³ãã«å°éããããšãããããŸããããã®ããžãã¯ã远跡ããããšã«ãããã¢ãã©ã€ã¶ãŒã¯çãããã³ãŒãã®èª€ã£ãã¡ãã»ãŒãžã®æ°ãæžãããéåžžã«å¥åŠãªããžãã¯ã«å¯ŸããŠã®ã¿ããããåºåããŸãã
æåŸã®èŠåã§ç€ºããããšã©ãŒã¯ãæ¬è³ªçã«åã®äŸãšéåžžã«ãã䌌ãŠããŸããã»ãšãã©ã®å ŽåãïŒpEntity == NULLïŒã®å Žåãæåã®ãã§ãã¯ãããã¹ãŠã®ãã§ãã¯ãè€è£œããããã§ãã¯ããããªããžã§ã¯ããå¿ èŠãªãªããžã§ã¯ãã«çœ®ãæããããŸããã以äžã®å Žåã«pBodyãšpTargetBodyãªããžã§ã¯ãã亀æããªãããããpTargetEntityã®ãªããžã§ã¯ãããå¿ããŸããããã®çµæããã®ãªããžã§ã¯ãã¯ãã§ãã¯ãããŸããã
ç§ãã¡ãæ€èšããŠããäŸã§ã¯ãã³ãŒããããå°ãæ·±ãæãäžããŠã¿ããšããã®ãããªãšã©ãŒã¯äžè¬ã«ããã°ã©ã ã®ã³ãŒã¹ã«åœ±é¿ãäžããªãããšãããããŸããpTargetBodyãã€ã³ã¿ãŒã¯ãGetBodyInEntity颿°ãããã®å€ãååŸããŸãã
iPhysicsBody *pTargetBody = GetBodyInEntity(pTargetEntity,
asTargetBodyName);
ããã§ã®æåã®åŒæ°ã¯ã以åã«ãã§ãã¯ãããŠããªããã€ã³ã¿ã§ãããä»ã®å Žæã§ã¯äœ¿çšãããŠããŸããããããŠå¹žããªããšã«ããã®é¢æ°ã®äžã«ã¯NULLã®æåã®åŒæ°ã®ãã§ãã¯ããããŸãïŒ
iPhysicsBody* ....::GetBodyInEntity(iLuxEntity* apEntity, ....)
{
if(apEntity == NULL){
return NULL;
}
....
}
ãã®çµæããã®ã³ãŒãã«ã¯ãšã©ãŒãå«ãŸããŠããŸãããæçµçã«ã¯æ£ããæ©èœããŸãã
ãã©ã°ã¡ã³ã5ã
ãããŠãã³ããŒïŒããŒã¹ãã§ãã1ã€ã®çãããå ŽæïŒ

ãã®ã¡ãœããã¯ãcLuxPlayerã¯ã©ã¹ã®ãªããžã§ã¯ãã®ãã£ãŒã«ããã¯ãªã¢ããŸãã
void cLuxPlayer::Reset()
{
....
mfRoll=0;
mfRollGoal=0;
mfRollSpeedMul=0; //<-
mfRollMaxSpeed=0; //<-
mfLeanRoll=0;
mfLeanRollGoal=0;
mfLeanRollSpeedMul=0;
mfLeanRollMaxSpeed=0;
mvCamAnimPos =0;
mvCamAnimPosGoal=0;
mfRollSpeedMul=0; //<-
mfRollMaxSpeed=0; //<-
....
}
ããããäœããã®çç±ã§ã2ã€ã®å€æ°mfRollSpeedMulãšmfRollMaxSpeedã2åç¡å¹ã«ãªããŸãã
- V519'mfRollSpeedMul '倿°ã«ã¯ã2åé£ç¶ããŠå€ãå²ãåœãŠãããŸããããããããã¯ééãã§ãããã§ãã¯ã©ã€ã³ïŒ298ã308ãLuxPlayer.cpp 308
- V519'mfRollMaxSpeed '倿°ã«ã¯ã2åé£ç¶ããŠå€ãå²ãåœãŠãããŸããããããããã¯ééãã§ãããã§ãã¯ã©ã€ã³ïŒ299ã309ãLuxPlayer.cpp 309
ã¯ã©ã¹èªäœã調ã¹ãŠãã¯ã©ã¹ã«å«ãŸãããã£ãŒã«ãã確èªããŸãããã
class cLuxPlayer : ....
{
....
private:
....
float mfRoll;
float mfRollGoal;
float mfRollSpeedMul;
float mfRollMaxSpeed;
float mfLeanRoll;
float mfLeanRollGoal;
float mfLeanRollSpeedMul;
float mfLeanRollMaxSpeed;
cVector3f mvCamAnimPos;
cVector3f mvCamAnimPosGoal;
float mfCamAnimPosSpeedMul;
float mfCamAnimPosMaxSpeed;
....
}
è峿·±ãããšã«ãé¢é£ããååãæã€å€æ°ã®3ã€ã®é¡äŒŒãããããã¯ããããŸãïŒmfRollãmfLeanRollãããã³mvCamAnimPosãã§ãªã»ããããããã®äžã€ã®ãããã¯ã¯ã第3ã®ãããã¯ããã®æåŸã®2ã€ã®å€æ°ãé€ããŠãã¯ãªã¢ããmfCamAnimPosSpeedMulãšmfCamAnimPosMaxSpeedããããŠãéè€ããå²ãåœãŠãèŠã€ããã®ã¯ããŸãã«ããã2ã€ã®å€æ°ã®ä»£ããã§ããã»ãšãã©ã®å Žåããããã®å²ãåœãŠã¯ãã¹ãŠæåã®å²ãåœãŠãããã¯ããã³ããŒãããæ¬¡ã«å€æ°åãå¿ èŠãªååã«çœ®ãæããããŸããã
2ã€ã®æ¬ èœããŠãã倿°ããŒãã«èšå®ããã¹ãã§ã¯ãªãã£ãå¯èœæ§ããããŸãããå察ã®å¯èœæ§ãéåžžã«é«ããªããŸãããããŠãåå²ãåœãŠã¯æããã«ãã®ã³ãŒãã®ç¶æã«åœ¹ç«ã¡ãŸãããã芧ã®ãšãããåãã¢ã¯ã·ã§ã³ã®é·ããããã¯ãã¹ã§ã¯ããã®ãããªãšã©ãŒã«æ°ä»ããªãå Žåããããã¢ãã©ã€ã¶ãŒãããã§åœ¹ç«ã¡ãŸãã
ãã©ã°ã¡ã³ã5.5ã
ãã®äŸã¯åã®äŸãšéåžžã«ãã䌌ãŠããŸããã³ãŒãã¹ãããããšããã«å¯Ÿããã¢ãã©ã€ã¶ãŒã®èŠåãæäŸããŸãã
V519'mfTimePos '倿°ã«ã¯ã2åé£ç¶ããŠå€ãå²ãåœãŠãããŸããããããããã¯ééãã§ãããã§ãã¯ã©ã€ã³ïŒ49ã53ãAnimationState.cpp 53
cAnimationState::cAnimationState(....)
{
....
mfTimePos = 0;
mfWeight = 1;
mfSpeed = 1.0f;
mfBaseSpeed = 1.0f;
mfTimePos = 0;
mfPrevTimePos=0;
....
}
mfTimePos 倿°ã«ã¯å€0ã2åå²ãåœãŠãããŠããŸããåã®äŸãšåæ§ã«ããã®ãã£ãŒã«ãã®å®£èšãèŠãŠã¿ãŸãããã
class cAnimationState
{
....
private:
....
//Properties of the animation
float mfLength;
float mfWeight;
float mfSpeed;
float mfTimePos;
float mfPrevTimePos;
....
}
åã®äŸã®ããã«ããã®å®£èšãããã¯ããšã©ãŒã³ãŒãã¹ããããã®å²ãåœãŠé åºãšäžèŽããŠããããšãããããŸããããã§ãå²ãåœãŠã§ã¯ãmfLength倿°ã®ä»£ããã«ãå€ã¯mfTimePosãååŸããŸããããããããã§ã¯ããããã¯ãšãæåŸã®è¡ã®å¹æããã³ããŒããŠããšã©ãŒã説æã§ããŸãããããã¯ãã®ããããmfLengthã¯ãæ°ããå€ãå²ãåœãŠãå¿ èŠããããŸãããããã®å Žæã¯ãŸã çãããã§ãã
ãã©ã°ã¡ã³ã6.
ã¢ãã©ã€ã¶ãŒã¯ããAmnesiaïŒA MachineForPigsãã®æ¬¡ã®ã³ãŒããã©ã°ã¡ã³ãã«å¯ŸããŠå€§éã®èŠåãçºè¡ããŸãããåãçš®é¡ã®ãšã©ãŒãçºè¡ãããã³ãŒãã®äžéšã®ã¿ã瀺ããŸãã
void cLuxEnemyMover::UpdateMoveAnimation(float afTimeStep)
{
....
if(prevMoveState != mMoveState)
{
....
//Backward
if(mMoveState == eLuxEnemyMoveState_Backward)
{
....
}
....
//Walking
else if(mMoveState == eLuxEnemyMoveState_Walking)
{
bool bSync = prevMoveState == eLuxEnemyMoveState_Running
|| eLuxEnemyMoveState_Jogging
? true : false;
....
}
....
}
}
ããã®ééãã¯ã©ãã«ãããŸããïŒ
ã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®èŠåãçºè¡ããŸããã
- V768åæå®æ° 'eLuxEnemyMoveState_Jogging'ã¯ãããŒã«åã®å€æ°ãšããŠäœ¿çšãããŸããLuxEnemyMover.cpp 672
- V768åæå®æ° 'eLuxEnemyMoveState_Walking'ã¯ãããŒã«åã®å€æ°ãšããŠäœ¿çšãããŸããLuxEnemyMover.cpp 680
- V768åæå®æ° 'eLuxEnemyMoveState_Jogging'ã¯ãããŒã«åã®å€æ°ãšããŠäœ¿çšãããŸããLuxEnemyMover.cpp 688
if-else-ifãã§ãŒã³ãå ã®ã³ãŒãã§ç¹°ãè¿ããããã®åŸããããã®èŠåã¯ãifã®åæ¬äœã«å¯ŸããŠçºè¡ãããŸããã
ããŒãµãŒãæãç·ã«ã€ããŠèããŠã¿ãŸãã
bool bSync = prevMoveState == eLuxEnemyMoveState_Running
|| eLuxEnemyMoveState_Jogging
? true : false;
ãã®ãããªè¡šçŸã«èª€ããå¿ã³èŸŒãã ã®ãåœç¶ã®ããšã§ãããããããªãªãžãã«ã®è¡ã«æžãããŠããŸãããããŠãããªãã¯ãããããã§ã«ããã«æ°ã¥ããŠããŸãããeLuxEnemyMoveState_Joggingåæã®ã¡ã³ããŒã¯äœãšãæ¯èŒãããããã®å€ããã§ãã¯ãããŸããã»ãšãã©ã®å ŽåãåŒ 'prevMoveState == eLuxEnemyMoveState_Jogging'ãæç€ºãããŠããŸããã
ãã®ãããªééãã¯å®å šã«ç¡å®³ã«èŠãããããããŸãããããããä»ã®èšäºã§ãBullet Engineã®ãã§ãã¯ã«ã€ããŠããããžã§ã¯ããžã®ã³ãããã®äžã§ããã°ä¿®æ£ãèŠã€ããŸããåãçš®é¡ã®ãã®ã§ãå察åŽãããªããžã§ã¯ãã«åãå ããããŸãããããŠãã®å Žåããã®ééãã¯äœåºŠããããŸãããããŠãç§ã¯ãŸããäžå æ¡ä»¶ã¯å®å šã«ç¡æå³ã§ããããšã«æ³šæããŸãããªããªããããã¯æåŸã«ãè«çæŒç®åã®ããŒã«çµæã«å¯ŸããŠæºããããããã§ãã
ãã©ã°ã¡ã³ã7ã
æåŸã«ãã³ããŒãšè²Œãä»ãã®ãšã©ãŒã®æåŸã®2ã€ã®äŸãä»åãæ¡ä»¶ä»ãã¹ããŒãã¡ã³ãã§ãã¢ãã©ã€ã¶ãŒã¯ã次ã®ã³ãŒãã«å¯ŸããŠèŠåãçºè¡ããŸããã
void iParticleEmitter::SetSubDivUV(const cVector2l &avSubDiv)
{
//Check so that there is any subdivision
// and that no sub divison axis is
//equal or below zero
if( (avSubDiv.x > 1 || avSubDiv.x > 1) && (avSubDiv.x >0 && avSubDiv.y >0))
{
....
}
....
}
ã³ãŒãå šäœãšã¯å¥ã«ããã®ãããªãã©ã°ã¡ã³ãå ã®çãããå Žæã«æ°ä»ãã®ã¯éåžžã«ç°¡åã ãšæããŸãããããããã®ãšã©ãŒã¯ãªããšããã®ã²ãŒã ã®éçºè ããé ãããŸããã
ã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®èŠåãçºè¡ããŸãã
ãV501ã||ãã®å·ŠåŽãšå³åŽã«åäžã®éšååŒããããŸããæŒç®åïŒavSubDiv.x> 1 || avSubDiv.x> 1 ParticleEmitter.cpp 199
æ¡ä»¶ã®2çªç®ã®æ¬åŒ§ã¯ãxãã£ãŒã«ããšyãã£ãŒã«ãã®äž¡æ¹ããã§ãã¯ãããŠããããšã瀺ããŠããŸããããããæåã®æ¬åŒ§ã§ã¯ãäœããã®çç±ã§ããã®ç¬éã倱ããããã£ãŒã«ãxã®ã¿ããã§ãã¯ãããŸãã..ãããã«ãæ€èšŒã³ã¡ã³ããã倿ãããšãäž¡æ¹ã®ãã£ãŒã«ããæ€èšŒãããŠããã¯ãã§ããããã§ã©ãããããããæ©èœããã®ã¯ãæåŸã®è¡ã®å¹æãã§ã¯ãªããæåã®æ¬åŒ§ã§ãããæåã®æ¬åŒ§ã§ãxãã£ãŒã«ãã®åŒã³åºããyãã£ãŒã«ãã®åŒã³åºãã«çœ®ãæããã®ãå¿ããŠããããã§ãã
ãããã£ãŠããã®å Žåãéçºè ã¯æ¡ä»¶ã«èª¬æçãªã³ã¡ã³ããæžãããšããå©ããããªãã£ãã®ã§ããã®ãããªãšã©ãŒã¯éåžžã«é°æ¹¿ã§ãã
ãã®ãããªå Žåã¯ãé¢é£ããå°åæã衚圢åŒã§èšé²ããç¿æ £ãã€ããããšããå§ãããŸãããã®æ¹æ³ã§ç·šéããæ¹ãç°¡åã§ãæ¬ é¥ãã¯ããã«ç®ç«ã¡ãŸãã
if( (avSubDiv.x > 1 || avSubDiv.x > 1)
&& (avSubDiv.x > 0 && avSubDiv.y > 0))
ãã©ã°ã¡ã³ã7.5ã
ãŸã£ããåãã§ãããå®éã«ã¯ããšã©ãŒã¯ãŸã£ããå¥ã®å Žæã§èŠã€ãããŸããã
static bool EdgeTriEqual(const cTriEdge &edge1, const cTriEdge &edge2)
{
if(edge1.tri1 == edge2.tri1 && edge1.tri2 == edge2.tri2)
return true;
if(edge1.tri1 == edge1.tri1 && edge1.tri2 == edge2.tri1)
return true;
return false;
}
ããŠãã©ããã£ãŠåœŒå¥³ãã©ãã«é ããŠããã®ãããã«ããããŸãããïŒéåžžã«å€ãã®äŸããã§ã«æŽçãããŠããã®ã¯åœç¶ã§ã:)
ã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®èŠåãçºè¡ããŸããïŒ
V501 '=='æŒç®åã®å·Šå³ã«åäžã®éšååŒããããŸãïŒedge1.tri1 == edge1.tri1 Math.cpp2914
ãããåæããŸãããé çªã«ãã©ã°ã¡ã³ãããŸããæããã«ãæåã®ãã§ãã¯ã¯ãã£ãŒã«ãedge1.tri1ãšedge2.tri2ã®åçæ§ããã§ãã¯ããåæã«edge1.tri2ãšedge2.tri2ã®åçæ§ããã§ãã¯ããŸãã
edge1.tri1 -> edge2.tri1
edge1.tri2 -> edge2.tri2
ãããŠã2çªç®ã®ãã§ãã¯ã§ã¯ããã§ã㯠'edge1.tri2 == edge2.tri1'ã®æ£ããéšåãã倿ããŠããããã®ãã£ãŒã«ãããæšªæ¹åãã«çãããã©ããããã§ãã¯ããå¿ èŠããããŸããã

ãã ããedge1.tri1 == edge2.tri2ããã§ãã¯ãã代ããã«ãç¡æå³ãªãã§ãã¯ãedge1.tri1 == edge1.tri1ã§å®è¡ãããŸãããããããããã¯é¢æ°ã®ãã¹ãŠã®å 容ã§ãããç§ã¯ããããäœãåé€ããŸããã§ããããããŠãããã§ãããã®ãããªãšã©ãŒãã³ãŒãã«å ¥ããŸããã
ãã®ä»ã®ãšã©ãŒ
ãã©ã°ã¡ã³ã1.
å ã®ã€ã³ãã³ãã䜿çšããŠæ¬¡ã®ã³ãŒããã©ã°ã¡ã³ããæäŸããŸãã
void iCharacterBody::CheckMoveCollision(....)
{
....
/////////////////////////////////////
//Forward velocity reflection
//Make sure that new velocity points in the right direction
//and that it is not too large!
if(mfMoveSpeed[eCharDir_Forward] != 0)
{
vForwardVel = ....;
float fForwardSpeed = vForwardVel.Length();
if(mfMoveSpeed[eCharDir_Forward] > 0)
if(mfMoveSpeed[eCharDir_Forward] > fForwardSpeed)
mfMoveSpeed[eCharDir_Forward] = fForwardSpeed;
else
if(mfMoveSpeed[eCharDir_Forward] < fForwardSpeed)
mfMoveSpeed[eCharDir_Forward] = -fForwardSpeed;
}
....
}
PVS-StudioèŠåïŒV563ãã®ãelseããã©ã³ããåã®ãifãã¹ããŒãã¡ã³ãã«é©çšããå¿ èŠãããå¯èœæ§ããããŸãã CharacterBody.cpp1591
ãã®äŸã¯æ··ä¹±ãæãå¯èœæ§ããããŸãããªãä»ã®å Žåã¯å€åŽãšåãããã«ã€ã³ãã³ããããŸããïŒããã¯å€çæ¡ä»¶ã®ããã®ä»ã®ãã®ã§ããïŒããã§ã¯ãããªãã¯ãã以å€ã®å Žåã¯ãæ¬åŒ§ãé 眮ããå¿ èŠããããä»çŽåã®ãæããŠããå Žåã
if(mfMoveSpeed[eCharDir_Forward] > 0)
{
if(mfMoveSpeed[eCharDir_Forward] > fForwardSpeed)
mfMoveSpeed[eCharDir_Forward] = fForwardSpeed;
}
else if(mfMoveSpeed[eCharDir_Forward] < fForwardSpeed)
{
mfMoveSpeed[eCharDir_Forward] = -fForwardSpeed;
}
ãåŠãïŒãã®èšäºãæžãéçšã§ãç§ã¯ãã®ã³ãŒãã®èããããã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ã®ã©ã®ããªã¢ã³ããæãå¯èœæ§ãé«ããã«ã€ããŠäœåºŠãæèŠãå€ããŸããã
ãã®ã³ãŒããããå°ãæ·±ãæãäžããŠã¿ããšãããäœãifã§æ¯èŒãå®è¡ãããfForwardSpeed倿°ã¯ãLengthã¡ãœããããå€ãåãåãããããŒãæªæºã®å€ãæã€ããšã¯ã§ããŸããã
inline T Length() const
{
return sqrt( x * x + y * y + z * z);
}
次ã«ãããããããããã®ãã§ãã¯ã®æ¬è³ªã¯ãæåã«èŠçŽ mfMoveSpeedããŒããã倧ãããã©ããããã§ãã¯ããæ¬¡ã«fForwardSpeedãšæ¯èŒããŠãã®å€ããã§ãã¯ããããšã§ããããã«ãæåŸã®2ã€ã®ifã¯ããã®æèšã§äºãã«å¯Ÿå¿ããŠããŸãã
ãã®å Žåãå ã®ã³ãŒãã¯æå³ãããšããã«æ©èœããŸããããããããã¯ééããªããããç·šé/ãªãã¡ã¯ã¿ãªã³ã°ããããã«ãªã人ãå°æãããã§ãããã
ãã®ãããªã³ãŒãã«åºãããããšã¯ãªããšæããŸãããè峿·±ãããšã«ãç§ã¯ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§èŠã€ãããèšäºã§èª¬æãããŠãããšã©ãŒã®ããŒã¿ããŒã¹ã調ã¹ãŸããããããŠããã®ãšã©ãŒã®äŸã¯ä»ã®ãããžã§ã¯ãã§èŠã€ãããŸãã-ããªãã¯ããããèªåã§èŠãããšãã§ããŸãã
ãããŠããã®å Žåãããªãèªèº«ãæç¢ºã§ãã£ãŠãããã®ããã«æžããªãã§ãã ããããŸãã¯ãäžæ¬åŒ§ãŸãã¯æ£ããã€ã³ãã³ãããããã¯ãã®äž¡æ¹ãããªãã®ã³ãŒããçè§£ããããã«ãªã£ã人ã ããããŠå°æ¥åœŒãèªèº«ãèŠãããããšã«çªå ¥ããªãã§ãã ãã;ïŒ
ãã©ã°ã¡ã³ã2.
次ã®ãšã©ãŒã¯ç§ãå°ãæ··ä¹±ãããŸããããããŠç§ã¯é·ãéããã§è«çãèŠã€ããããšããŸãããããããçµå±ã®ãšãããããã¯ããããééãã§ãããããªãé倧ãªééãã§ããããã«æãããŸãã
ã³ãŒããèŠãŠã¿ãŸãããïŒ
bool cBinaryBuffer::DecompressAndAdd(char *apSrcData, size_t alSize)
{
....
///////////////////////////
// Init decompression
int ret = inflateInit(&zipStream);
if (ret != Z_OK) return false;
///////////////////////////
// Decompress, chunk by chunk
do
{
//Set current output chunk
zipStream.avail_out = lMaxChunkSize;
....
//Decompress as much as possible to current chunk
int ret = inflate(&zipStream, Z_NO_FLUSH);
if(ret != Z_OK && ret != Z_STREAM_END)
{
inflateEnd(&zipStream);
return false;
}
....
}
while (zipStream.avail_out == 0 && ret != Z_STREAM_END);
....
return true;
}
V711ãã®ã«ãŒããå¶åŸ¡ãã倿°ãšåãååã®ããŒã«ã«å€æ°ãã«ãŒãå ã«äœæããããšã¯å±éºã§ããBinaryBuffer.cpp 371
ãããã£ãŠãdo-whileã«ãŒãããã®çµäºãå¶åŸ¡ãã倿°retããããŸãããã ãããã®ã«ãŒãå ã§ã¯ããã®å€éšå€æ°ã«æ°ããå€ãå²ãåœãŠã代ããã«ãretãšããååã®æ°ãã倿°ã宣èšãããŸãããã®çµæãå€éšå€æ°retããªãŒããŒã©ã€ãããã«ãŒãæ¡ä»¶ã§ãã§ãã¯ããã倿°ã倿Žãããããšã¯ãããŸããã
äžå¹žãªç¶æ³ã®çµã¿åããã§ã¯ããã®ãããªãµã€ã¯ã«ã¯ç¡éã«ãªãå¯èœæ§ããããŸããã»ãšãã©ã®å Žåããã®å Žåããã®ã³ãŒãã¯å éšå€æ°retã®å€ããã§ãã¯ããå éšæ¡ä»¶ãä¿åããŸã ãããŠã颿°ãçµäºããŸãã

çµè«
å€ãã®å Žåãéçºè ã¯éçåæã宿çã«ã§ã¯ãªããé·ãäŒæ©ããšã£ãŠäœ¿çšããŸãããŸãã¯ãã¢ãã©ã€ã¶ãŒãä»ããŠãããžã§ã¯ãã1åå®è¡ããããšãã§ããŸãããã®ã¢ãããŒãã®çµæãšããŠãã¢ãã©ã€ã¶ãŒã¯å€ãã®å Žåãæ·±å»ãªãã®ãæ€åºããªãããæ€èšããŠããäŸã®ãããªãã®ãæ€åºããŸããããã¯ãããããã²ãŒã ã®æ©èœã«ç¹ã«åœ±é¿ãäžããŸããã§ãããã¢ãã©ã€ã¶ãŒã¯ç¹ã«æçšã§ã¯ãªãããã§ãããŸãã圌ã¯ãã®ãããªå ŽæãèŠã€ããŸããããããã§ãæ©èœããŸãã
å®éã«ã¯ããšã©ãŒã¯ãã¹ã¯ãããŠããŸããããæããã«ããã°ã©ã ã®ãã°ã«ã€ãªãã£ãŠããåæ§ã®å Žæã¯ãé·æéã®ãããã°ããã¹ãã®å®è¡ãããã³ãã¹ãéšéã«ãã£ãŠãã§ã«ä¿®æ£ãããŠããŸãããã®çµæããããžã§ã¯ãããã§ãã¯ãããšããã¢ãã©ã€ã¶ãŒã¯ããŸã£ããçŸããŠããªãåé¡ã®ã¿ã衚瀺ããŸãããã®ãããªåé¡ã®äžã«ã¯ãããã°ã©ã ã®åäœã«å®éã«åœ±é¿ãäžããæ·±å»ãªç¬éãããããšããããŸãããããã°ã©ã ããã®ãã¹ããã©ãå¯èœæ§ã¯äœãããããã£ãŠãã®ãšã©ãŒã¯éçºè ã«ã¯ããããŸããã§ããã
ãããã£ãŠãéçåæã®æçšæ§ãè©äŸ¡ããããšã¯ãéåžžã®äœ¿çšåŸã«ã®ã¿éåžžã«éèŠã§ããPVS-Studioã1åå®è¡ããã ãã§ããã®ã²ãŒã ã®ã³ãŒãã«ãã®ãããªçãããäžæ£ç¢ºãªå ŽæãèŠã€ãã£ãå Žåãéçºããã»ã¹äžã«ãã®çš®ã®æãããªãšã©ãŒãããŒã«ã©ã€ãºããŠä¿®æ£ããå¿ èŠããããŸããã
éçã¢ãã©ã€ã¶ãŒã宿çã«äœ¿çšããŠãã ããïŒ

ãã®èšäºãè±èªã話ãèŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãªã³ã¯ã䜿çšããŠãã ããïŒVictoriaKhanievaãèšæ¶åªå€±ïŒããŒã¯ãã£ã»ã³ããŸãã¯ã³ããŒããŒã¹ãã®ä¿®æ£ãå¿ããæ¹æ³ã