CItem * CContainer::ContentFind( RESOURCE_ID_BASE rid, DWORD dwArg, int iDecendLevels ) const { ADDTOCALLSTACK("CContainer::ContentFind"); // send all the items in the container. if ( rid.GetResIndex() == 0 ) return( NULL ); CItem* pItem=GetContentHead(); for ( ; pItem!=NULL; pItem=pItem->GetNext()) { if ( pItem->IsResourceMatch( rid, dwArg )) break; if ( iDecendLevels <= 0 ) continue; CItemContainer * pCont = dynamic_cast <CItemContainer*>(pItem); if ( pCont != NULL ) { if ( ! pCont->IsSearchable()) continue; CItem * pItemInCont = pCont->ContentFind( rid, dwArg, iDecendLevels-1 ); if ( pItemInCont ) return( pItemInCont ); } } return( pItem ); }
TRIGRET_TYPE CContainer::OnContTriggerForLoop( CScript &s, CTextConsole * pSrc, CScriptTriggerArgs * pArgs, CGString * pResult, CScriptLineContext & StartContext, CScriptLineContext & EndContext, RESOURCE_ID_BASE rid, DWORD dwArg, int iDecendLevels ) { ADDTOCALLSTACK("CContainer::OnContTriggerForLoop"); if ( rid.GetResIndex() != 0 ) { CItem* pItem = GetContentHead(); CItem * pItemNext; for ( ; pItem!=NULL; pItem=pItemNext) { pItemNext = pItem->GetNext(); if ( pItem->IsResourceMatch( rid, dwArg )) { s.SeekContext( StartContext ); TRIGRET_TYPE iRet = pItem->OnTriggerRun( s, TRIGRUN_SECTION_TRUE, pSrc, pArgs, pResult ); if ( iRet == TRIGRET_BREAK ) { EndContext = StartContext; break; } if (( iRet != TRIGRET_ENDIF ) && ( iRet != TRIGRET_CONTINUE )) return( iRet ); if ( iRet == TRIGRET_CONTINUE ) EndContext = StartContext; else EndContext = s.GetContext(); } if ( iDecendLevels <= 0 ) continue; CItemContainer * pCont = dynamic_cast <CItemContainer*>(pItem); if ( pCont != NULL ) { if ( pCont->IsSearchable()) { CContainer * pContBase = dynamic_cast <CContainer *> (pCont); TRIGRET_TYPE iRet = pContBase->OnContTriggerForLoop( s, pSrc, pArgs, pResult, StartContext, EndContext, rid, dwArg, iDecendLevels-1 ); if ( iRet != TRIGRET_ENDIF ) { return( iRet ); } // Since the previous call has already found the EndContext, set it. EndContext = s.GetContext(); } } } } if ( EndContext.m_lOffset <= StartContext.m_lOffset ) { CScriptObj * pScript = dynamic_cast <CScriptObj *> (this); TRIGRET_TYPE iRet = pScript->OnTriggerRun( s, TRIGRUN_SECTION_FALSE, pSrc, pArgs, pResult ); if ( iRet != TRIGRET_ENDIF ) return( iRet ); } else s.SeekContext( EndContext ); return( TRIGRET_ENDIF ); }
int CContainer::ContentConsume( RESOURCE_ID_BASE rid, int amount, bool fTest, DWORD dwArg ) { ADDTOCALLSTACK("CContainer::ContentConsume"); // ARGS: // dwArg = a hack for ores. // RETURN: // 0 = all consumed ok. // # = number left to be consumed. (still required) if ( rid.GetResIndex() == 0 ) return( amount ); // from skills menus. CItem * pItemNext; for ( CItem* pItem=GetContentHead(); pItem!=NULL; pItem=pItemNext) { pItemNext = pItem->GetNext(); if ( pItem->IsResourceMatch( rid, dwArg )) { amount -= pItem->ConsumeAmount( amount, fTest ); if ( amount <= 0 ) break; } CItemContainer * pCont = dynamic_cast <CItemContainer*> (pItem); if ( pCont != NULL ) // this is a sub-container. { if ( rid == RESOURCE_ID(RES_TYPEDEF,IT_GOLD)) { if ( pCont->IsType(IT_CONTAINER_LOCKED)) continue; } else { if ( ! pCont->IsSearchable()) continue; } amount = pCont->ContentConsume( rid, amount, fTest, dwArg ); if ( amount <= 0 ) break; } } return( amount ); }