bool CContainer::r_WriteValContainer(LPCTSTR pszKey, CGString & sVal, CTextConsole *pSrc) { ADDTOCALLSTACK("CContainer::r_WriteValContainer"); EXC_TRY("WriteVal"); static LPCTSTR const sm_szParams[] = { "count", "fcount", "rescount", "restest" }; int i = FindTableHeadSorted(pszKey, sm_szParams, COUNTOF(sm_szParams)); if ( i < 0 ) return false; LPCTSTR pKey = pszKey + strlen(sm_szParams[i]); SKIP_SEPARATORS(pKey); switch ( i ) { case 0: // count { int iTotal = 0; for ( CItem* pItem = GetContentHead(); pItem != NULL; pItem = pItem->GetNext() ) iTotal++; sVal.FormatVal(iTotal); } break; case 1: // fcount sVal.FormatVal(ContentCountAll()); break; case 2: // rescount sVal.FormatVal(*pKey ? ContentCount(g_Cfg.ResourceGetID(RES_ITEMDEF, pKey)) : GetCount()); break; case 3: // restest { CResourceQtyArray Resources; sVal.FormatVal(Resources.Load(pKey) ? ResourceConsume(&Resources, 1, true) : 0); } break; default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pSrc); EXC_DEBUG_END; return false; }
bool CScriptObj::r_LoadVal( CScript & s ) { LOCKDATA; LPCTSTR pszKey = s.GetKey(); EXC_TRY(("r_LoadVal('%s %s')", pszKey, s.GetArgStr())); if ( !strnicmp(pszKey, "CLEARVARS", 9) ) { pszKey = s.GetArgStr(); SKIP_SEPERATORS(pszKey); g_Exp.m_VarGlobals.ClearKeys(pszKey); return true; } // ignore these. int index = FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 ); if ( index < 0 ) { DEBUG_ERR(( "Undefined keyword '%s'\n", s.GetKey())); return( false ); } if ( index == SSC_VAR ) { bool fQuoted = false; int i = g_Exp.m_VarGlobals.SetStr( pszKey+4, fQuoted, s.GetArgStr( &fQuoted ), false ); return( true ); } if ( index == SSC_VAR0 ) { bool fQuoted = false; int i = g_Exp.m_VarGlobals.SetStr( pszKey+5, fQuoted, s.GetArgStr( &fQuoted ), true ); return( true ); } if ( index == SSC_DEFMSG ) { long l; pszKey += 7; for ( l = 0; l < DEFMSG_QTY; l++ ) { if ( !strcmpi(pszKey, (const char *)g_Exp.sm_szMsgNames[0][l]) ) { bool fQuoted = false; TCHAR *args = s.GetArgStr(&fQuoted); strcpy(g_Exp.sm_szMessages[l], args); return(true); } } g_Log.Event(LOGM_INIT|LOGL_ERROR, "Setting not used message override named '%s'" DEBUG_CR, pszKey); return(false); } return true; EXC_CATCH("CScriptObj"); return false; }
bool CClient::r_GetRef( LPCTSTR & pszKey, CScriptObj * & pRef ) { ADDTOCALLSTACK("CClient::r_GetRef"); int i = FindTableHeadSorted(pszKey, sm_szRefKeys, COUNTOF(sm_szRefKeys) - 1); if ( i >= 0 ) { pszKey += strlen(sm_szRefKeys[i]); SKIP_SEPARATORS(pszKey); switch ( i ) { case CLIR_ACCOUNT: if ( pszKey[-1] != '.' ) // only used as a ref ! break; pRef = m_pAccount; return true; case CLIR_GMPAGEP: pRef = m_pGMPage; return true; case CLIR_HOUSEDESIGN: pRef = m_pHouseDesign; return true; case CLIR_PARTY: if ( !m_pChar->m_pParty ) { LPCTSTR oldKey = pszKey; if ( !strnicmp(pszKey, "CREATE", 7) ) pszKey += 7; SKIP_SEPARATORS(pszKey); CChar *pChar = static_cast<CChar *>(static_cast<CGrayUID>(Exp_GetSingle(pszKey)).CharFind()); if ( !pChar ) return false; if ( !pChar->m_pClient ) return false; CPartyDef::AcceptEvent(pChar, m_pChar->GetUID(), true); if ( !m_pChar->m_pParty ) return false; pszKey = oldKey; // restoring back to real pszKey, so we don't get errors for giving an uid instead of PDV_CREATE } pRef = m_pChar->m_pParty; return true; case CLIR_TARG: pRef = m_Targ_UID.ObjFind(); return true; case CLIR_TARGPRV: pRef = m_Targ_PrvUID.ObjFind(); return true; case CLIR_TARGPROP: pRef = m_Prop_UID.ObjFind(); return true; } } return CScriptObj::r_GetRef(pszKey, pRef); }
bool CRegionWorld::r_WriteVal( LPCTSTR pszKey, CGString & sVal, CTextConsole * pSrc ) { ADDTOCALLSTACK("CRegionWorld::r_WriteVal"); EXC_TRY("WriteVal"); //bool fZero = false; switch ( FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case RWC_DEFNAME: // "DEFNAME" = for the speech system. sVal = GetResourceName(); break; case RWC_RESOURCES: m_Events.WriteResourceRefList( sVal ); break; case RWC_REGION: { // Check that the syntax is correct. if ( pszKey[6] && pszKey[6] != '.' ) return false; CRegionWorld * pRegionTemp = dynamic_cast <CRegionWorld*>(m_pt.GetRegion( REGION_TYPE_AREA )); if ( !pszKey[6] ) { // We're just checking if the reference is valid. sVal.FormatVal( pRegionTemp? 1:0 ); return true; } // ELSE - We're trying to retrieve a property from the region. pszKey += 7; if ( pRegionTemp && m_pt.GetRegion( REGION_TYPE_MULTI ) ) return pRegionTemp->r_WriteVal( pszKey, sVal, pSrc ); return( this->r_WriteVal( pszKey, sVal, pSrc )); } default: return( CRegionBase::r_WriteVal( pszKey, sVal, pSrc )); } return true; EXC_CATCH; EXC_DEBUG_START; g_Log.EventDebug("command '%s' ret '%s' [%p]\n", pszKey, static_cast<LPCTSTR>(sVal), static_cast<void *>(pSrc)); EXC_DEBUG_END; return false; }
bool CPartyDef::r_LoadVal( CScript & s ) { ADDTOCALLSTACK("CPartyDef::r_LoadVal"); EXC_TRY("LoadVal"); LPCTSTR pszKey = s.GetKey(); int index = FindTableHeadSorted(pszKey, sm_szLoadKeys, COUNTOF(sm_szLoadKeys)-1); switch ( index ) { case PDC_SPEECHFILTER: { if ( !s.HasArgs() ) this->m_pSpeechFunction.Empty(); else { LPCTSTR pszArg = s.GetArgStr(); CResourceLink * m_pTestEvent = dynamic_cast<CResourceLink *>( g_Cfg.ResourceGetDefByName( RES_FUNCTION, pszArg ) ); if ( m_pTestEvent == NULL ) return( false ); this->m_pSpeechFunction.Format("%s", pszArg); } } break; case PDC_TAG0: case PDC_TAG: { bool fQuoted = false; pszKey = pszKey + ((index == PDC_TAG0) ? 5 : 4); m_TagDefs.SetStr( pszKey, fQuoted, s.GetArgStr( &fQuoted ), (index == PDC_TAG0) ); } break; default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPT; EXC_DEBUG_END; return false; }
bool CRegionWorld::r_LoadVal( CScript &s ) { ADDTOCALLSTACK("CRegionWorld::r_LoadVal"); EXC_TRY("LoadVal"); // Load the values for the region from script. switch ( FindTableHeadSorted( s.GetKey(), sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case RWC_DEFNAME: // "DEFNAME" = for the speech system. return SetResourceName( s.GetArgStr()); case RWC_RESOURCES: SetModified( REGMOD_EVENTS ); return( m_Events.r_LoadVal( s, RES_REGIONTYPE )); default: break; } return(CRegionBase::r_LoadVal(s)); EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPT; EXC_DEBUG_END; return false; }
bool CRegionBase::r_WriteVal( LPCTSTR pszKey, CGString & sVal, CTextConsole * pSrc ) { ADDTOCALLSTACK("CRegionBase::r_WriteVal"); EXC_TRY("WriteVal"); bool fZero = false; int index = FindTableHeadSorted(pszKey, sm_szLoadKeys, COUNTOF(sm_szLoadKeys) - 1); if ( index < 0 ) return CScriptObj::r_WriteVal(pszKey, sVal, pSrc); switch ( index ) { case RC_ANNOUNCE: sVal.FormatVal( IsFlag(REGION_FLAG_ANNOUNCE)); break; case RC_ARENA: sVal.FormatVal( IsFlag(REGION_FLAG_ARENA)); break; case RC_BUILDABLE: sVal.FormatVal( ! IsFlag(REGION_FLAG_NOBUILDING)); break; case RC_CLIENTS: { int i = 0; size_t iClients = 0; for ( ; ; i++ ) { CSector *pSector = GetSector(i); if ( pSector == NULL ) break; iClients += pSector->m_Chars_Active.HasClients(); } sVal.FormatVal(static_cast<long>(iClients)); break; } case RC_EVENTS: m_Events.WriteResourceRefList( sVal ); break; case RC_ISEVENT: if ( pszKey[7] != '.' ) return( false ); pszKey += 8; sVal.FormatVal(m_Events.ContainsResourceName(RES_EVENTS, pszKey)); return( true ); case RC_FLAGS: sVal.FormatHex( GetRegionFlags() ); break; case RC_GATE: sVal.FormatVal( ! IsFlag(REGION_ANTIMAGIC_GATE)); break; case RC_GROUP: sVal = m_sGroup; break; case RC_GUARDED: sVal.FormatVal( IsFlag(REGION_FLAG_GUARDED)); break; case RC_MAGIC: sVal.FormatVal( ! IsFlag(REGION_ANTIMAGIC_ALL)); break; case RC_MAP: sVal.FormatVal( m_pt.m_map ); break; case RC_MARK: case RC_RECALLIN: sVal.FormatVal( ! IsFlag(REGION_ANTIMAGIC_RECALL_IN)); break; case RC_NAME: // The previous name was really the DEFNAME ??? sVal = GetName(); break; case RC_NOBUILD: sVal.FormatVal( IsFlag(REGION_FLAG_NOBUILDING)); break; case RC_NODECAY: sVal.FormatVal( IsFlag(REGION_FLAG_NODECAY)); break; case RC_NOPVP: sVal.FormatVal( IsFlag(REGION_FLAG_NO_PVP)); break; case RC_P: sVal = m_pt.WriteUsed(); break; case RC_RECALL: case RC_RECALLOUT: sVal.FormatVal( ! IsFlag(REGION_ANTIMAGIC_RECALL_OUT)); break; case RC_RECT: { size_t iQty = m_Rects.GetCount(); pszKey += 4; if ( *pszKey == '\0' ) { sVal.FormatVal( static_cast<long>(iQty)); return true; } SKIP_SEPARATORS( pszKey ); size_t iRect = Exp_GetVal( pszKey ); if ( iRect <= 0 ) { sVal = m_rectUnion.Write(); return true; } iRect -= 1; if ( !m_Rects.IsValidIndex( iRect ) ) { sVal.FormatVal( 0 ); return true; } sVal = m_Rects[iRect].Write(); return( true ); } case RC_SAFE: sVal.FormatVal( IsFlag(REGION_FLAG_SAFE)); break; case RC_TAGCOUNT: sVal.FormatVal( static_cast<long>(m_TagDefs.GetCount()) ); break; case RC_TAGAT: { pszKey += 5; // eat the 'TAGAT' if ( *pszKey == '.' ) // do we have an argument? { SKIP_SEPARATORS( pszKey ); size_t iQty = static_cast<size_t>( Exp_GetVal( pszKey ) ); if ( iQty >= m_TagDefs.GetCount() ) return( false ); // trying to get non-existant tag CVarDefCont * pTagAt = m_TagDefs.GetAt( iQty ); if ( !pTagAt ) return( false ); // trying to get non-existant tag SKIP_SEPARATORS( pszKey ); if ( ! *pszKey ) { sVal.Format("%s=%s", pTagAt->GetKey(), pTagAt->GetValStr()); return( true ); } else if ( !strnicmp( pszKey, "KEY", 3 )) // key? { sVal = pTagAt->GetKey(); return( true ); } else if ( !strnicmp( pszKey, "VAL", 3 )) // val? { sVal = pTagAt->GetValStr(); return( true ); } } return( false ); } break; case RC_TAG0: fZero = true; ++pszKey; // fall through case RC_TAG: // "TAG" = get/set a local tag. { if ( pszKey[3] != '.' ) return( false ); pszKey += 4; sVal = m_TagDefs.GetKeyStr( pszKey, fZero ); return( true ); } case RC_TYPE: { const CItemBase * pBase = NULL; const CItem * pItem = GetResourceID().ItemFind(); if (pItem != NULL) pBase = pItem->Item_GetDef(); if (pBase != NULL) sVal = pBase->GetResourceName(); else sVal = ""; } break; case RC_UID: // Allow use of UID.x.KEY on the REGION object if ( pszKey[3] == '.' ) return CScriptObj::r_WriteVal( pszKey, sVal, pSrc ); sVal.FormatHex( GetResourceID() ); break; case RC_UNDERGROUND: sVal.FormatVal( IsFlag(REGION_FLAG_UNDERGROUND)); break; default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; g_Log.EventDebug("command '%s' ret '%s' [%p]\n", pszKey, static_cast<LPCTSTR>(sVal), static_cast<void *>(pSrc)); EXC_DEBUG_END; return false; }
bool CPartyDef::r_WriteVal( LPCTSTR pszKey, CGString &sVal, CTextConsole *pSrc ) { ADDTOCALLSTACK("CPartyDef::r_WriteVal"); EXC_TRY("WriteVal"); CScriptObj *pRef; if ( r_GetRef(pszKey, pRef) ) { if ( pRef == NULL ) // good command but bad link. { sVal = "0"; return true; } if ( pszKey[0] == '\0' ) // we where just testing the ref. { CObjBase *pObj = dynamic_cast<CObjBase *>(pRef); if ( pObj ) sVal.FormatHex(static_cast<DWORD>(pObj->GetUID())); else sVal.FormatVal(1); return true; } return pRef->r_WriteVal(pszKey, sVal, pSrc); } bool fZero = false; switch ( FindTableHeadSorted(pszKey, sm_szLoadKeys, COUNTOF(sm_szLoadKeys) - 1) ) { case PDC_ISSAMEPARTYOF: { pszKey += 13; GETNONWHITESPACE(pszKey); if ( pszKey[0] != '\0' ) { CGrayUID uidToCheck = static_cast<CGrayUID>(Exp_GetVal(pszKey)); CChar *pCharToCheck = uidToCheck.CharFind(); sVal.FormatVal(pCharToCheck && (pCharToCheck->m_pParty == this)); } else return false; } break; case PDC_MEMBERS: sVal.FormatVal(m_Chars.GetCharCount()); break; case PDC_SPEECHFILTER: sVal = m_pSpeechFunction.IsEmpty() ? "" : m_pSpeechFunction; break; case PDC_TAG0: fZero = true; pszKey++; case PDC_TAG: { if ( pszKey[3] != '.' ) return false; pszKey += 4; sVal = m_TagDefs.GetKeyStr(pszKey, fZero); } break; case PDC_TAGAT: { pszKey += 5; // eat the 'TAGAT' if ( *pszKey == '.' ) // do we have an argument? { SKIP_SEPARATORS(pszKey); size_t iQty = static_cast<size_t>(Exp_GetVal(pszKey)); if ( iQty >= m_TagDefs.GetCount() ) return false; // trying to get non-existant tag CVarDefCont *pTagAt = m_TagDefs.GetAt(iQty); if ( !pTagAt ) return false; // trying to get non-existant tag SKIP_SEPARATORS(pszKey); if ( !*pszKey ) { sVal.Format("%s=%s", pTagAt->GetKey(), pTagAt->GetValStr()); return true; } else if ( !strnicmp(pszKey, "KEY", 3) ) { sVal = pTagAt->GetKey(); return true; } else if ( !strnicmp(pszKey, "VAL", 3) ) { sVal = pTagAt->GetValStr(); return true; } } return false; } case PDC_TAGCOUNT: sVal.FormatVal(m_TagDefs.GetCount()); break; default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pSrc); EXC_DEBUG_END; return false; }
bool CDataBase::r_WriteVal(LPCTSTR pszKey, CGString &sVal, CTextConsole *pSrc) { ADDTOCALLSTACK("CDataBase::r_WriteVal"); EXC_TRY("WriteVal"); if ( !g_Cfg.m_bMySql ) { sVal.FormatVal(0); return true; } int index = FindTableHeadSorted(pszKey, sm_szLoadKeys, COUNTOF(sm_szLoadKeys) - 1); switch ( index ) { case DBO_AEXECUTE: case DBO_AQUERY: { pszKey += strlen(sm_szLoadKeys[index]); GETNONWHITESPACE(pszKey); TCHAR *ppArgs[2]; if ( (pszKey[0] != '\0') && (Str_ParseCmds(const_cast<TCHAR *>(pszKey), ppArgs, COUNTOF(ppArgs)) == 2) ) sVal.FormatVal(AsyncQueue((index == DBO_AQUERY), ppArgs[0], ppArgs[1])); else { g_Log.EventError("Invalid %s arguments\n", CDataBase::sm_szLoadKeys[index]); sVal.FormatVal(0); } break; } case DBO_CONNECTED: { sVal.FormatVal(m_connected); break; } case DBO_ESCAPEDATA: { pszKey += strlen(sm_szLoadKeys[index]); GETNONWHITESPACE(pszKey); sVal = ""; if ( pszKey[0] != '\0' ) { TCHAR *escapedString = Str_GetTemp(); SimpleThreadLock lock(m_connectionMutex); if ( m_connected && mysql_real_escape_string(m_socket, escapedString, pszKey, static_cast<unsigned long>(strlen(pszKey))) ) sVal = escapedString; } break; } case DBO_ROW: { pszKey += strlen(sm_szLoadKeys[index]); SKIP_SEPARATORS(pszKey); sVal = m_QueryResult.GetKeyStr(pszKey); break; } default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; g_Log.EventDebug("command '%s' [%p]\n", pszKey, static_cast<void *>(pSrc)); EXC_DEBUG_END; return false; }
bool CCharNPC::r_LoadVal( CChar * pChar, CScript &s ) { EXC_TRY("LoadVal"); switch ( FindTableSorted( s.GetKey(), sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { //Set as Strings case CNC_THROWDAM: case CNC_THROWOBJ: case CNC_THROWRANGE: { bool fQuoted = false; pChar->SetDefStr(s.GetKey(), s.GetArgStr( &fQuoted ), fQuoted); } break; //Set as numbers only case CNC_BONDED: m_bonded = (s.GetArgVal() > 0); break; case CNC_FOLLOWERSLOTS: pChar->SetDefNum(s.GetKey(), s.GetArgVal(), false ); break; case CNC_ACTPRI: m_Act_Motivation = static_cast<unsigned char>(s.GetArgVal()); break; case CNC_NPC: m_Brain = static_cast<NPCBRAIN_TYPE>(s.GetArgVal()); break; case CNC_HOMEDIST: if ( ! pChar->m_ptHome.IsValidPoint()) { pChar->m_ptHome = pChar->GetTopPoint(); } m_Home_Dist_Wander = static_cast<WORD>(s.GetArgVal()); break; case CNC_NEED: case CNC_NEEDNAME: { TCHAR * pTmp = s.GetArgRaw(); m_Need.Load(pTmp); } break; case CNC_SPEECH: return( m_Speech.r_LoadVal( s, RES_SPEECH )); case CNC_SPEECHCOLOR: m_SpeechHue = static_cast<HUE_TYPE>(s.GetArgVal()); break; case CNC_VENDCAP: { CItemContainer * pBank = pChar->GetBank(); if ( pBank ) pBank->m_itEqBankBox.m_Check_Restock = s.GetArgVal(); } break; case CNC_VENDGOLD: { CItemContainer * pBank = pChar->GetBank(); if ( pBank ) pBank->m_itEqBankBox.m_Check_Amount = s.GetArgVal(); } break; case CNC_SPELLADD: { INT64 ppCmd[255]; size_t count = Str_ParseCmds(s.GetArgStr(), ppCmd, COUNTOF(ppCmd)); if (count < 1) return false; for (size_t i = 0; i < count; i++) Spells_Add(static_cast<SPELL_TYPE>(ppCmd[i])); } default: // Just ignore any player type stuff. if ( FindTableHeadSorted( s.GetKey(), CCharPlayer::sm_szLoadKeys, COUNTOF( CCharPlayer::sm_szLoadKeys )-1 ) >= 0 ) return( true ); return(false ); } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPT; EXC_DEBUG_END; return false; }
bool CCharPlayer::r_WriteVal( CChar * pChar, LPCTSTR pszKey, CGString & sVal ) { ADDTOCALLSTACK("CCharPlayer::r_WriteVal"); EXC_TRY("WriteVal"); if ( !pChar || !GetAccount() ) return false; if ( !strnicmp(pszKey, "SKILLCLASS.", 11) ) { return GetSkillClass()->r_WriteVal(pszKey + 11, sVal, pChar); } else if ( ( !strnicmp(pszKey, "GUILD", 5) ) || ( !strnicmp(pszKey, "TOWN", 4) ) ) { bool bIsGuild = !strnicmp(pszKey, "GUILD", 5); pszKey += bIsGuild ? 5 : 4; if ( *pszKey == 0 ) { CItemStone *pMyGuild = pChar->Guild_Find(bIsGuild ? MEMORY_GUILD : MEMORY_TOWN); if ( pMyGuild ) sVal.FormatHex((DWORD)pMyGuild->GetUID()); else sVal.FormatVal(0); return true; } else if ( *pszKey == '.' ) { pszKey += 1; CItemStone *pMyGuild = pChar->Guild_Find(bIsGuild ? MEMORY_GUILD : MEMORY_TOWN); if ( pMyGuild ) return pMyGuild->r_WriteVal(pszKey, sVal, pChar); } return false; } switch ( FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case CPC_ACCOUNT: sVal = GetAccount()->GetName(); return( true ); case CPC_DEATHS: sVal.FormatVal( m_wDeaths ); return( true ); case CPC_DSPEECH: m_Speech.WriteResourceRefList( sVal ); return( true ); case CPC_KILLS: sVal.FormatVal( m_wMurders ); return( true ); case CPC_KRTOOLBARSTATUS: sVal.FormatVal( m_bKrToolbarEnabled ); return true; case CPC_ISDSPEECH: if ( pszKey[9] != '.' ) return( false ); pszKey += 10; sVal = m_Speech.ContainsResourceName(RES_SPEECH, pszKey) ? "1" : "0"; return( true ); case CPC_LASTUSED: sVal.FormatLLVal( - g_World.GetTimeDiff( m_timeLastUsed ) / TICK_PER_SEC ); return( true ); case CPC_PFLAG: sVal.FormatVal(m_pflag); return( true ); case CPC_PROFILE: { TCHAR szLine[SCRIPT_MAX_LINE_LEN-16]; Str_MakeUnFiltered( szLine, m_sProfile, sizeof(szLine)); sVal = szLine; } return( true ); case CPC_REFUSETRADES: { CVarDefCont * pVar = pChar->GetDefKey(pszKey, true); sVal.FormatLLVal(pVar ? pVar->GetValNum() : 0); } return( true ); case CPC_SKILLCLASS: sVal = GetSkillClass()->GetResourceName(); return( true ); case CPC_SKILLLOCK: { // "SkillLock[alchemy]" SKILL_TYPE skill = Skill_GetLockType( pszKey ); if ( skill <= SKILL_NONE ) return( false ); sVal.FormatVal( Skill_GetLock( skill )); } return( true ); case CPC_SPEEDMODE: sVal.FormatVal( m_speedMode ); return( true ); case CPC_STATLOCK: { // "StatLock[str]" STAT_TYPE stat = Stat_GetLockType( pszKey ); if (( stat <= STAT_NONE ) || ( stat >= STAT_BASE_QTY )) return( false ); sVal.FormatVal( Stat_GetLock( stat )); } return( true ); default: if ( FindTableSorted( pszKey, CCharNPC::sm_szLoadKeys, COUNTOF( CCharNPC::sm_szLoadKeys )-1 ) >= 0 ) { sVal = "0"; return( true ); } return( false ); } EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pChar); EXC_DEBUG_END; return false; }
bool CBaseBaseDef::r_WriteVal(LPCTSTR pszKey, CGString &sVal, CTextConsole *pSrc) { ADDTOCALLSTACK("CBaseBaseDef::r_WriteVal"); EXC_TRY("WriteVal"); bool fZero = false; switch ( FindTableHeadSorted(pszKey, sm_szLoadKeys, COUNTOF(sm_szLoadKeys) - 1) ) { // Return as string or hex number (NULL if not set) case OBC_CATEGORY: case OBC_DESCRIPTION: case OBC_SUBSECTION: sVal = GetDefStr(pszKey, false); break; // Return as decimal number (0 if not set) case OBC_COMBATBONUSPERCENT: case OBC_COMBATBONUSSTAT: case OBC_DAMCHAOS: case OBC_DAMDIRECT: case OBC_EXPANSION: case OBC_NAMELOC: case OBC_REGENFOOD: case OBC_REGENHITS: case OBC_REGENMANA: case OBC_REGENSTAM: case OBC_REGENVALFOOD: case OBC_REGENVALHITS: case OBC_REGENVALMANA: case OBC_REGENVALSTAM: sVal.FormatLLVal(GetDefNum(pszKey)); break; case OBC_ARMOR: { pszKey += 5; if ( *pszKey == '.' ) { SKIP_SEPARATORS(pszKey); if ( !strnicmp(pszKey, "LO", 2) ) sVal.Format("%hu", m_defenseBase); else if ( !strnicmp(pszKey, "HI", 2) ) sVal.Format("%hu", m_defenseBase + m_defenseRange); } else sVal.Format("%hu,%hu", m_defenseBase, m_defenseBase + m_defenseRange); break; } case OBC_BASEID: sVal = g_Cfg.ResourceGetName(GetResourceID()); break; case OBC_CAN: sVal.FormatHex(m_Can); break; case OBC_DAM: { pszKey += 3; if ( *pszKey == '.' ) { SKIP_SEPARATORS(pszKey); if ( !strnicmp(pszKey, "LO", 2) ) sVal.Format("%hu", m_attackBase); else if ( !strnicmp(pszKey, "HI", 2) ) sVal.Format("%hu", m_attackBase + m_attackRange); } else sVal.Format("%hu,%hu", m_attackBase, m_attackBase + m_attackRange); break; } case OBC_DAMCOLD: sVal.FormatVal(m_DamCold); break; case OBC_DAMENERGY: sVal.FormatVal(m_DamEnergy); break; case OBC_DAMFIRE: sVal.FormatVal(m_DamFire); break; case OBC_DAMPHYSICAL: sVal.FormatVal(m_DamPhysical); break; case OBC_DAMPOISON: sVal.FormatVal(m_DamPoison); break; case OBC_DEFNAME: sVal = GetResourceName(); break; case OBC_ENHANCEPOTIONS: sVal.FormatVal(m_EnhancePotions); break; case OBC_FASTERCASTING: sVal.FormatVal(m_FasterCasting); break; case OBC_FASTERCASTRECOVERY: sVal.FormatVal(m_FasterCastRecovery); break; case OBC_HEIGHT: sVal.FormatVal(GetHeight()); break; case OBC_HITLEECHLIFE: sVal.FormatVal(m_HitLifeLeech); break; case OBC_HITLEECHMANA: sVal.FormatVal(m_HitManaLeech); break; case OBC_HITLEECHSTAM: sVal.FormatVal(m_HitStaminaLeech); break; case OBC_HITMANADRAIN: sVal.FormatVal(m_HitManaDrain); break; case OBC_INCREASEDAM: sVal.FormatVal(m_DamIncrease); break; case OBC_INCREASEDEFCHANCE: sVal.FormatVal(m_DefChanceIncrease); break; case OBC_INCREASEDEFCHANCEMAX: sVal.FormatVal(m_DefChanceIncreaseMax); break; case OBC_INCREASEHITCHANCE: sVal.FormatVal(m_HitChanceIncrease); break; case OBC_INCREASESPELLDAM: sVal.FormatVal(m_SpellDamIncrease); break; case OBC_INCREASESWINGSPEED: sVal.FormatVal(m_SwingSpeedIncrease); break; case OBC_INSTANCES: sVal.FormatUVal(GetRefInstances()); break; case OBC_LOWERMANACOST: sVal.FormatVal(m_LowerManaCost); break; case OBC_LOWERREAGENTCOST: sVal.FormatVal(m_LowerReagentCost); break; case OBC_LUCK: sVal.FormatVal(m_Luck); break; case OBC_NAME: sVal = GetName(); break; case OBC_NIGHTSIGHT: sVal.FormatVal(m_NightSight); break; case OBC_REFLECTPHYSICALDAM: sVal.FormatVal(m_ReflectPhysicalDamage); break; case OBC_RANGE: if ( GetRangeH() == 0 ) sVal.Format("%hhu", GetRangeL()); else sVal.Format("%hhu,%hhu", GetRangeH(), GetRangeL()); break; case OBC_RANGEH: sVal.FormatUVal(GetRangeL()); break; case OBC_RANGEL: sVal.FormatUVal(GetRangeH()); break; case OBC_RESCOLD: sVal.FormatVal(m_ResCold); break; case OBC_RESCOLDMAX: sVal.FormatVal(m_ResColdMax); break; case OBC_RESDISPDNHUE: sVal.FormatHex(GetResDispDnHue()); break; case OBC_RESENERGY: sVal.FormatVal(m_ResEnergy); break; case OBC_RESENERGYMAX: sVal.FormatVal(m_ResEnergyMax); break; case OBC_RESFIRE: sVal.FormatVal(m_ResFire); break; case OBC_RESFIREMAX: sVal.FormatVal(m_ResFireMax); break; case OBC_RESLEVEL: sVal.FormatUVal(GetResLevel()); break; case OBC_RESOURCES: { pszKey += 9; if ( *pszKey == '.' ) { SKIP_SEPARATORS(pszKey); if ( !strnicmp(pszKey, "COUNT", 5) ) sVal.FormatVal(m_BaseResources.GetCount()); else { size_t index = static_cast<size_t>(Exp_GetLLVal(pszKey)); SKIP_SEPARATORS(pszKey); bool fQtyOnly = false; bool fKeyOnly = false; if ( !strnicmp(pszKey, "KEY", 3) ) fKeyOnly = true; else if ( !strnicmp(pszKey, "VAL", 3) ) fQtyOnly = true; TCHAR *pszTmp = Str_GetTemp(); m_BaseResources.WriteKeys(pszTmp, index, fQtyOnly, fKeyOnly); if ( fQtyOnly && (pszTmp[0] == '\0') ) strcpy(pszTmp, "0"); sVal = pszTmp; } } else { TCHAR *pszTmp = Str_GetTemp(); m_BaseResources.WriteKeys(pszTmp); sVal = pszTmp; } break; } case OBC_RESPHYSICAL: sVal.FormatVal(m_ResPhysical); break; case OBC_RESPHYSICALMAX: sVal.FormatVal(m_ResPhysicalMax); break; case OBC_RESPOISON: sVal.FormatVal(m_ResPoison); break; case OBC_RESPOISONMAX: sVal.FormatVal(m_ResPoisonMax); break; case OBC_TAG0: fZero = true; ++pszKey; // fall through case OBC_TAG: if ( pszKey[3] != '.' ) return false; pszKey += 4; sVal = m_TagDefs.GetKeyStr(pszKey, fZero); break; case OBC_TEVENTS: m_TEvents.WriteResourceRefList(sVal); break; default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pSrc); EXC_DEBUG_END; return false; }
bool CPointBase::r_WriteVal( LPCTSTR pszKey, CGString & sVal ) const { ADDTOCALLSTACK("CPointBase::r_WriteVal"); if ( !strnicmp( pszKey, "STATICS", 7 ) ) { pszKey += 7; const CGrayMapBlock * pBlock = g_World.GetMapBlock( *(this) ); if ( !pBlock ) return false; if ( *pszKey == '\0' ) { int iStaticQty = 0; for ( size_t i = 0; i < pBlock->m_Statics.GetStaticQty(); i++ ) { const CUOStaticItemRec * pStatic = pBlock->m_Statics.GetStatic( i ); CPointMap ptTest( pStatic->m_x+pBlock->m_x, pStatic->m_y+pBlock->m_y, pStatic->m_z, this->m_map ); if ( this->GetDist( ptTest ) > 0 ) continue; iStaticQty++; } sVal.FormatVal( iStaticQty ); return true; } SKIP_SEPARATORS( pszKey ); const CUOStaticItemRec * pStatic = NULL; int iStatic = 0; int type = 0; if ( !strnicmp( pszKey, "FINDID", 6 ) ) { pszKey += 6; SKIP_SEPARATORS( pszKey ); iStatic = Exp_GetVal( pszKey ); type = RES_GET_TYPE( iStatic ); if ( type == 0 ) type = RES_ITEMDEF; SKIP_SEPARATORS( pszKey ); } else { iStatic = Exp_GetVal( pszKey ); type = RES_GET_TYPE( iStatic ); } if ( type == RES_ITEMDEF ) { const CItemBase * pItemDef = CItemBase::FindItemBase(static_cast<ITEMID_TYPE>(RES_GET_INDEX(iStatic))); if ( !pItemDef ) { sVal.FormatVal( 0 ); return false; } for ( size_t i = 0; i < pBlock->m_Statics.GetStaticQty(); pStatic = NULL, i++ ) { pStatic = pBlock->m_Statics.GetStatic( i ); CPointMap ptTest( pStatic->m_x+pBlock->m_x, pStatic->m_y+pBlock->m_y, pStatic->m_z, this->m_map); if ( this->GetDist( ptTest ) > 0 ) continue; if ( pStatic->GetDispID() == pItemDef->GetDispID() ) break; } } else { for ( size_t i = 0; i < pBlock->m_Statics.GetStaticQty(); pStatic = NULL, i++ ) { pStatic = pBlock->m_Statics.GetStatic( i ); CPointMap ptTest( pStatic->m_x+pBlock->m_x, pStatic->m_y+pBlock->m_y, pStatic->m_z, this->m_map); if ( this->GetDist( ptTest ) > 0 ) continue; if ( iStatic == 0 ) break; iStatic--; } } if ( !pStatic ) { sVal.FormatHex(0); return true; } SKIP_SEPARATORS( pszKey ); if ( !*pszKey ) pszKey = "ID"; ITEMID_TYPE idTile = pStatic->GetDispID(); if ( !strnicmp( pszKey, "COLOR", 5 ) ) { sVal.FormatHex( pStatic->m_wHue ); return true; } else if ( !strnicmp( pszKey, "ID", 2 ) ) { sVal.FormatHex( idTile ); return true; } else if ( !strnicmp( pszKey, "Z", 1 ) ) { sVal.FormatVal( pStatic->m_z ); return true; } // Check the script def for the item. CItemBase * pItemDef = CItemBase::FindItemBase( idTile ); if ( pItemDef == NULL ) { DEBUG_ERR(("Must have ITEMDEF section for item ID 0%x\n", idTile )); return false; } return pItemDef->r_WriteVal( pszKey, sVal, &g_Serv ); } else if ( !strnicmp( pszKey, "COMPONENTS", 10) ) { pszKey += 10; CRegionLinks rlinks; const CRegionBase* pRegion = NULL; CItem* pItem = NULL; const CGrayMulti* pMulti = NULL; const CUOMultiItemRec2* pMultiItem = NULL; size_t iMultiQty = GetRegions(REGION_TYPE_MULTI, rlinks); if ( *pszKey == '\0' ) { int iComponentQty = 0; for (size_t i = 0; i < iMultiQty; i++) { pRegion = rlinks.GetAt(i); if (pRegion == NULL) continue; pItem = pRegion->GetResourceID().ItemFind(); if (pItem == NULL) continue; const CPointMap ptMulti = pItem->GetTopPoint(); pMulti = g_Cfg.GetMultiItemDefs(pItem); if (pMulti == NULL) continue; size_t iQty = pMulti->GetItemCount(); for (size_t ii = 0; ii < iQty; ii++) { pMultiItem = pMulti->GetItem(ii); if (pMultiItem == NULL) break; if (pMultiItem->m_visible == 0) continue; CPointMap ptTest(static_cast<WORD>(ptMulti.m_x + pMultiItem->m_dx), static_cast<WORD>(ptMulti.m_y + pMultiItem->m_dy), static_cast<signed char>(ptMulti.m_z + pMultiItem->m_dz), this->m_map); if (GetDist(ptTest) > 0) continue; iComponentQty++; } } sVal.FormatVal( iComponentQty ); return true; } SKIP_SEPARATORS( pszKey ); int iComponent = 0; int type = 0; if ( strnicmp( pszKey, "FINDID", 6 ) == 0 ) { pszKey += 6; SKIP_SEPARATORS( pszKey ); iComponent = Exp_GetVal( pszKey ); type = RES_GET_TYPE( iComponent ); if ( type == 0 ) type = RES_ITEMDEF; SKIP_SEPARATORS( pszKey ); } else { iComponent = Exp_GetVal( pszKey ); type = RES_GET_TYPE( iComponent ); } if ( type == RES_ITEMDEF ) { const CItemBase * pItemDef = CItemBase::FindItemBase(static_cast<ITEMID_TYPE>(RES_GET_INDEX(iComponent))); if ( pItemDef == NULL ) { sVal.FormatVal( 0 ); return false; } for (size_t i = 0; i < iMultiQty; i++) { pRegion = rlinks.GetAt(i); if (pRegion == NULL) continue; pItem = pRegion->GetResourceID().ItemFind(); if (pItem == NULL) continue; const CPointMap ptMulti = pItem->GetTopPoint(); pMulti = g_Cfg.GetMultiItemDefs(pItem); if (pMulti == NULL) continue; size_t iQty = pMulti->GetItemCount(); for (size_t ii = 0; ii < iQty; pMultiItem = NULL, ii++) { pMultiItem = pMulti->GetItem(ii); if (pMultiItem == NULL) break; if (pMultiItem->m_visible == 0) continue; CPointMap ptTest(static_cast<WORD>(ptMulti.m_x + pMultiItem->m_dx), static_cast<WORD>(ptMulti.m_y + pMultiItem->m_dy), static_cast<signed char>(ptMulti.m_z + pMultiItem->m_dz), this->m_map); if (GetDist(ptTest) > 0) continue; const CItemBase* pMultiItemDef = CItemBase::FindItemBase(pMultiItem->GetDispID()); if (pMultiItemDef != NULL && pMultiItemDef->GetDispID() == pItemDef->GetDispID()) break; } if (pMultiItem != NULL) break; } } else { for (size_t i = 0; i < iMultiQty; i++) { pRegion = rlinks.GetAt(i); if (pRegion == NULL) continue; pItem = pRegion->GetResourceID().ItemFind(); if (pItem == NULL) continue; const CPointMap ptMulti = pItem->GetTopPoint(); pMulti = g_Cfg.GetMultiItemDefs(pItem); if (pMulti == NULL) continue; size_t iQty = pMulti->GetItemCount(); for (size_t ii = 0; ii < iQty; pMultiItem = NULL, ii++) { pMultiItem = pMulti->GetItem(ii); if (pMultiItem == NULL) break; if (pMultiItem->m_visible == 0) continue; CPointMap ptTest(static_cast<WORD>(ptMulti.m_x + pMultiItem->m_dx), static_cast<WORD>(ptMulti.m_y + pMultiItem->m_dy), static_cast<signed char>(ptMulti.m_z + pMultiItem->m_dz), this->m_map); if (GetDist(ptTest) > 0) continue; if (iComponent == 0) break; iComponent--; } if (pMultiItem != NULL) break; } } if ( pMultiItem == NULL ) { sVal.FormatHex(0); return true; } SKIP_SEPARATORS( pszKey ); if ( !*pszKey ) pszKey = "ID"; ITEMID_TYPE idTile = pMultiItem->GetDispID(); if ( strnicmp( pszKey, "ID", 2 ) == 0 ) { sVal.FormatHex( idTile ); return true; } else if ( strnicmp( pszKey, "MULTI", 5 ) == 0 ) { pszKey += 5; if (*pszKey != '\0') { SKIP_SEPARATORS(pszKey); return pItem->r_WriteVal( pszKey, sVal, &g_Serv ); } sVal.FormatHex( pItem->GetUID() ); return true; } else if ( strnicmp( pszKey, "Z", 1 ) == 0 ) { sVal.FormatVal( pItem->GetTopZ() + pMultiItem->m_dz ); return true; } // Check the script def for the item. CItemBase * pItemDef = CItemBase::FindItemBase( idTile ); if ( pItemDef == NULL ) { DEBUG_ERR(("Must have ITEMDEF section for item ID 0%x\n", idTile )); return false; } return pItemDef->r_WriteVal( pszKey, sVal, &g_Serv ); } int index = FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF(sm_szLoadKeys)-1 ); if ( index < 0 ) return false; switch ( index ) { case PT_M: case PT_MAP: sVal.FormatVal(m_map); break; case PT_X: sVal.FormatVal(m_x); break; case PT_Y: sVal.FormatVal(m_y); break; case PT_Z: sVal.FormatVal(m_z); break; case PT_ISNEARTYPE: { pszKey += 10; SKIP_SEPARATORS( pszKey ); SKIP_ARGSEP( pszKey ); int iType = g_Cfg.ResourceGetIndexType( RES_TYPEDEF, pszKey ); int iDistance = 0; bool bCheckMulti = false; SKIP_IDENTIFIERSTRING( pszKey ); SKIP_SEPARATORS( pszKey ); SKIP_ARGSEP( pszKey ); if ( *pszKey ) iDistance = Exp_GetVal(pszKey); if ( *pszKey ) bCheckMulti = Exp_GetVal(pszKey) != 0; sVal.FormatVal( g_World.IsItemTypeNear(*this, static_cast<IT_TYPE>(iType), iDistance, bCheckMulti)); break; } case PT_REGION: { // Check that the syntax is correct. if ( pszKey[6] && pszKey[6] != '.' ) return false; CRegionWorld * pRegionTemp = dynamic_cast <CRegionWorld*>(this->GetRegion(REGION_TYPE_AREA | REGION_TYPE_MULTI)); if ( !pszKey[6] ) { // We're just checking if the reference is valid. sVal.FormatVal( pRegionTemp? 1:0 ); return true; } // We're trying to retrieve a property from the region. pszKey += 7; if ( pRegionTemp ) return pRegionTemp->r_WriteVal( pszKey, sVal, &g_Serv ); return false; } case PT_ROOM: { if ( pszKey[4] && pszKey[4] != '.' ) return false; CRegionBase * pRegionTemp = this->GetRegion( REGION_TYPE_ROOM ); if ( !pszKey[4] ) { sVal.FormatVal( pRegionTemp? 1:0 ); return true; } pszKey += 5; if ( pRegionTemp ) return pRegionTemp->r_WriteVal( pszKey, sVal, &g_Serv ); return false; } case PT_SECTOR: { if ( pszKey[6] == '.' ) { pszKey += 7; CSector * pSectorTemp = this->GetSector(); if (pSectorTemp) return pSectorTemp->r_WriteVal(pszKey, sVal, &g_Serv); } return false; } default: { const CUOMapMeter * pMeter = g_World.GetMapMeter(*this); if ( pMeter ) { switch( index ) { case PT_TYPE: { CItemTypeDef * pTypeDef = g_World.GetTerrainItemTypeDef( pMeter->m_wTerrainIndex ); if ( pTypeDef != NULL ) sVal = pTypeDef->GetResourceName(); else sVal = ""; } return true; case PT_TERRAIN: { pszKey += strlen(sm_szLoadKeys[index]); if ( *pszKey == '.' ) // do we have an argument? { SKIP_SEPARATORS( pszKey ); if ( !strnicmp( pszKey, "Z", 1 )) { sVal.FormatVal( pMeter->m_z ); return( true ); } return( false ); } else { sVal.FormatHex( pMeter->m_wTerrainIndex ); } } return true; } } return false; } } return true; }
INT64 CExpression::GetSingle( LPCTSTR & pszArgs ) { ADDTOCALLSTACK("CExpression::GetSingle"); // Parse just a single expression without any operators or ranges. ASSERT(pszArgs); GETNONWHITESPACE( pszArgs ); LPCTSTR orig = pszArgs; if (pszArgs[0]=='.') pszArgs++; if ( pszArgs[0] == '0' ) // leading '0' = hex value. { // A hex value. if ( pszArgs[1] == '.' ) // leading 0. means it really is decimal. { pszArgs += 2; goto try_dec; } LPCTSTR pStart = pszArgs; ULONGLONG val = 0; for (;;) { TCHAR ch = *pszArgs; if ( IsDigit( ch )) ch -= '0'; else { ch = static_cast<TCHAR>(tolower(ch)); if ( ch > 'f' || ch <'a' ) { if ( ch == '.' && pStart[0] != '0' ) // ok i'm confused. it must be decimal. { pszArgs = pStart; goto try_dec; } break; } ch -= 'a' - 10; } val *= 0x10; val += ch; pszArgs ++; } return( (INT64)val ); } else if ( pszArgs[0] == '.' || IsDigit(pszArgs[0])) { // A decminal number try_dec: INT64 iVal = 0; for ( ; ; pszArgs++ ) { if ( *pszArgs == '.' ) continue; // just skip this. if ( ! IsDigit( *pszArgs )) break; iVal *= 10; iVal += *pszArgs - '0'; } return( iVal ); } else if ( ! _ISCSYMF(pszArgs[0])) { #pragma region maths // some sort of math op ? switch ( pszArgs[0] ) { case '{': pszArgs ++; return( GetRange( pszArgs )); case '[': case '(': // Parse out a sub expression. pszArgs ++; return(GetVal( pszArgs )); case '+': pszArgs++; break; case '-': pszArgs++; return( -GetSingle( pszArgs )); case '~': // Bitwise not. pszArgs++; return( ~GetSingle( pszArgs )); case '!': // boolean not. pszArgs++; if ( pszArgs[0] == '=' ) // odd condition such as (!=x) which is always true of course. { pszArgs++; // so just skip it. and compare it to 0 return( GetSingle( pszArgs )); } return( !GetSingle( pszArgs )); case ';': // seperate field. case ',': // seperate field. case '\0': return( 0 ); } #pragma endregion maths } else #pragma region intrinsics { // Symbol or intrinsinc function ? INTRINSIC_TYPE iIntrinsic = (INTRINSIC_TYPE) FindTableHeadSorted( pszArgs, sm_IntrinsicFunctions, COUNTOF(sm_IntrinsicFunctions)-1 ); if ( iIntrinsic >= 0 ) { size_t iLen = strlen(sm_IntrinsicFunctions[iIntrinsic]); if ( pszArgs[iLen] == '(' ) { pszArgs += (iLen + 1); TCHAR * pszArgsNext; Str_Parse( const_cast<TCHAR*>(pszArgs), &(pszArgsNext), ")" ); TCHAR * ppCmd[5]; INT64 iResult; size_t iCount = 0; switch ( iIntrinsic ) { case INTRINSIC_ID: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = RES_GET_INDEX( GetVal( pszArgs )); // RES_GET_INDEX } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_LOGARITHM: { iCount = 0; iResult = 0; if ( pszArgs && *pszArgs ) { int iArgument = static_cast<long>(GetVal(pszArgs)); if ( iArgument <= 0 ) { DEBUG_ERR(( "Exp_GetVal: (x)Log(%d) is %s\n", iArgument, (!iArgument) ? "infinite" : "undefined" )); } else { iCount = 1; if ( strchr(pszArgs, ',') ) { iCount++; SKIP_ARGSEP(pszArgs); if ( !strcmpi(pszArgs, "e") ) { iResult = static_cast<INT64>(log(static_cast<double>(iArgument))); } else if ( !strcmpi(pszArgs, "pi") ) { iResult = static_cast<INT64>(log(static_cast<double>(iArgument)) / log(M_PI)); } else { INT64 iBase = GetVal(pszArgs); if ( iBase <= 0 ) { DEBUG_ERR(( "Exp_GetVal: (%lld)Log(%d) is %s\n", iBase, iArgument, (!iBase) ? "infinite" : "undefined" )); iCount = 0; } else { iResult = static_cast<INT64>(log(static_cast<double>(iArgument)) / log(static_cast<double>(iBase))); } } } else { iResult = static_cast<INT64>(log10(static_cast<double>(iArgument))); } } } } break; case INTRINSIC_NAPIERPOW: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = static_cast<INT64>(exp(static_cast<double>(GetVal(pszArgs)))); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_SQRT: { iCount = 0; iResult = 0; if ( pszArgs && *pszArgs ) { int iTosquare = static_cast<long>(GetVal(pszArgs)); if (iTosquare >= 0) { iCount++; iResult = static_cast<INT64>(sqrt(static_cast<double>(iTosquare))); } else { DEBUG_ERR(( "Exp_GetVal: Sqrt of negative number (%d) is impossible\n", iTosquare )); } } } break; case INTRINSIC_SIN: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = static_cast<INT64>(sin(static_cast<double>(GetVal(pszArgs)))); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_ARCSIN: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = static_cast<INT64>(asin(static_cast<double>(GetVal(pszArgs)))); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_COS: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = static_cast<INT64>(cos(static_cast<double>(GetVal(pszArgs)))); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_ARCCOS: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = static_cast<INT64>(acos(static_cast<double>(GetVal(pszArgs)))); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_TAN: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = static_cast<INT64>(tan(static_cast<double>(GetVal(pszArgs)))); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_ARCTAN: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = static_cast<INT64>(atan(static_cast<double>(GetVal(pszArgs)))); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_StrIndexOf: { iCount = Str_ParseCmds( const_cast<TCHAR*>(pszArgs), ppCmd, 3, "," ); if ( iCount < 2 ) iResult = -1; else iResult = Str_IndexOf(ppCmd[0],ppCmd[1],(iCount==3)?static_cast<long>(GetVal(ppCmd[2])):0); } break; case INTRINSIC_STRMATCH: { iCount = Str_ParseCmds( const_cast<TCHAR*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 0; else iResult = (Str_Match( ppCmd[0], ppCmd[1] ) == MATCH_VALID ) ? 1 : 0; } break; case INTRINSIC_STRREGEX: { iCount = Str_ParseCmds( const_cast<TCHAR*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 0; else { TCHAR * tLastError = Str_GetTemp(); iResult = Str_RegExMatch( ppCmd[0], ppCmd[1], tLastError ); if ( iResult == -1 ) { DEBUG_ERR(( "STRREGEX bad function usage. Error: %s\n", tLastError )); } } } break; case INTRINSIC_RANDBELL: { iCount = Str_ParseCmds( const_cast<TCHAR*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 0; else iResult = Calc_GetBellCurve( static_cast<long>(GetVal( ppCmd[0] )), static_cast<long>(GetVal( ppCmd[1] ))); } break; case INTRINSIC_STRASCII: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = pszArgs[0]; } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_RAND: { iCount = Str_ParseCmds( const_cast<TCHAR*>(pszArgs), ppCmd, 2, "," ); if ( iCount <= 0 ) iResult = 0; else { INT64 val1 = GetVal( ppCmd[0] ); if ( iCount == 2 ) { INT64 val2 = GetVal( ppCmd[1] ); iResult = Calc_GetRandLLVal2( val1, val2 ); } else iResult = Calc_GetRandLLVal(val1); } } break; case INTRINSIC_STRCMP: { iCount = Str_ParseCmds( const_cast<TCHAR*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 1; else iResult = strcmp(ppCmd[0], ppCmd[1]); } break; case INTRINSIC_STRCMPI: { iCount = Str_ParseCmds( const_cast<TCHAR*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 1; else iResult = strcmpi(ppCmd[0], ppCmd[1]); } break; case INTRINSIC_STRLEN: { iCount = 1; iResult = strlen(pszArgs); } break; case INTRINSIC_ISOBSCENE: { iCount = 1; iResult = g_Cfg.IsObscene( pszArgs ); } break; case INTRINSIC_ISNUMBER: { iCount = 1; { char z[64]; LTOA(atol(pszArgs), z, 10); iResult = strcmp(pszArgs, z) ? 0 : 1; } } break; case INTRINSIC_QVAL: { iCount = Str_ParseCmds( const_cast<TCHAR*>(pszArgs), ppCmd, 5, "," ); if ( iCount < 3 ) iResult = 0; else { INT64 a1 = GetSingle(ppCmd[0]); INT64 a2 = GetSingle(ppCmd[1]); if ( a1 < a2 ) iResult = GetSingle(ppCmd[2]); else if ( a1 == a2 ) iResult = ( iCount < 4 ) ? 0 : GetSingle(ppCmd[3]); else iResult = ( iCount < 5 ) ? 0 : GetSingle(ppCmd[4]); } } break; case INTRINSIC_ABS: { iCount = 1; iResult = llabs(GetVal(pszArgs)); } break; default: iCount = 0; iResult = 0; break; } pszArgs = pszArgsNext; if ( ! iCount ) { DEBUG_ERR(( "Bad intrinsic function usage: Missing arguments\n" )); return 0; } else { return iResult; } } } // Must be a symbol of some sort ? long long lVal; if ( m_VarGlobals.GetParseVal( pszArgs, &lVal ) ) return(lVal); if ( m_VarDefs.GetParseVal( pszArgs, &lVal ) ) return(lVal); } #pragma endregion intrinsics // hard end ! Error of some sort. TCHAR szTag[ EXPRESSION_MAX_KEY_LEN ]; size_t i = GetIdentifierString( szTag, pszArgs ); pszArgs += i; // skip it. if (strlen(orig)> 1) DEBUG_ERR(("Undefined symbol '%s' ['%s']\n", szTag, orig)); else DEBUG_ERR(("Undefined symbol '%s'\n", szTag)); return( 0 ); }
bool CBaseBaseDef::r_WriteVal( LPCTSTR pszKey, CGString & sVal, CTextConsole * pSrc ) { ADDTOCALLSTACK("CBaseBaseDef::r_WriteVal"); EXC_TRY("WriteVal"); bool fZero = false; int index = FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 ); switch ( index ) { //return as string or hex number or NULL if not set case OBC_CATEGORY: case OBC_DESCRIPTION: case OBC_SUBSECTION: case OBC_HITSPELL: case OBC_SLAYER: case OBC_SLAYERLESSER: case OBC_SLAYERMISC: case OBC_SLAYERSUPER: case OBC_ABILITYPRIMARY: case OBC_ABILITYSECONDARY: case OBC_MANABURST: sVal = GetDefStr(pszKey, false); break; //return as decimal number or 0 if not set case OBC_BALANCED: case OBC_BANE: case OBC_BATTLELUST: case OBC_BLOODDRINKER: case OBC_CASTINGFOCUS: case OBC_DAMCHAOS: case OBC_DAMCOLD: case OBC_DAMDIRECT: case OBC_DAMENERGY: case OBC_DAMFIRE: case OBC_DAMMODIFIER: case OBC_DAMPHYSICAL: case OBC_DECREASEHITCHANCE: case OBC_DAMPOISON: case OBC_EATERCOLD: case OBC_EATERDAM: case OBC_EATERENERGY: case OBC_EATERFIRE: case OBC_EATERKINETIC: case OBC_EATERPOISON: case OBC_ENHANCEPOTIONS: case OBC_EXPANSION: case OBC_FASTERCASTING: case OBC_FASTERCASTRECOVERY: case OBC_HITAREACOLD: case OBC_HITAREAENERGY: case OBC_HITAREAFIRE: case OBC_HITAREAPHYSICAL: case OBC_HITAREAPOISON: case OBC_HITCURSE: case OBC_HITDISPEL: case OBC_HITFATIGUE: case OBC_HITFIREBALL: case OBC_HITHARM: case OBC_HITLEECHLIFE: case OBC_HITLEECHMANA: case OBC_HITLEECHSTAM: case OBC_HITLIGHTNING: case OBC_HITLOWERATK: case OBC_HITLOWERDEF: case OBC_HITMAGICARROW: case OBC_HITMANADRAIN: case OBC_INCREASEDAM: case OBC_INCREASEDEFCHANCE: case OBC_INCREASEDEFCHANCEMAX: case OBC_INCREASEHITCHANCE: case OBC_INCREASEGOLD: case OBC_INCREASEKARMALOSS: case OBC_INCREASESPELLDAM: case OBC_INCREASESWINGSPEED: case OBC_LOWERAMMOCOST: case OBC_LOWERMANACOST: case OBC_LOWERREAGENTCOST: case OBC_LOWERREQ: case OBC_LUCK: case OBC_MANABURSTFREQUENCY: case OBC_MANABURSTKARMA: case OBC_NIGHTSIGHT: case OBC_RAGEFOCUS: case OBC_REACTIVEPARALYZE: case OBC_REFLECTPHYSICALDAM: case OBC_REGENFOOD: case OBC_REGENHITS: case OBC_REGENMANA: case OBC_REGENSTAM: case OBC_REGENVALFOOD: case OBC_REGENVALHITS: case OBC_REGENVALMANA: case OBC_REGENVALSTAM: case OBC_RESCOLD: case OBC_RESFIRE: case OBC_RESENERGY: case OBC_RESPHYSICAL: case OBC_RESPOISON: case OBC_RESCOLDMAX: case OBC_RESFIREMAX: case OBC_RESENERGYMAX: case OBC_RESPHYSICALMAX: case OBC_RESPOISONMAX: case OBC_RESONANCECOLD: case OBC_RESONANCEENERGY: case OBC_RESONANCEFIRE: case OBC_RESONANCEKINETIC: case OBC_RESONANCEPOISON: case OBC_SOULCHARGE: case OBC_SOULCHARGECOLD: case OBC_SOULCHARGEENERGY: case OBC_SOULCHARGEFIRE: case OBC_SOULCHARGEKINETIC: case OBC_SOULCHARGEPOISON: case OBC_SPELLCONSUMPTION: case OBC_SPELLFOCUSING: case OBC_SPLINTERINGWEAPON: case OBC_VELOCITY: case OBC_SPELLCHANNELING: case OBC_NAMELOC: case OBC_HITSPELLSTR: case OBC_WEIGHTREDUCTION: case OBC_COMBATBONUSSTAT: case OBC_COMBATBONUSPERCENT: sVal.FormatLLVal(GetDefNum(pszKey, true)); break; case OBC_DEFNAME: sVal = GetResourceName(); break; case OBC_ARMOR: { pszKey += strlen(sm_szLoadKeys[index]); // 9; if ( *pszKey == '.' ) { SKIP_SEPARATORS( pszKey ); if ( !strnicmp( pszKey, "LO", 2 ) ) { sVal.Format( "%d", m_defenseBase ); } else if ( !strnicmp( pszKey, "HI", 2 ) ) { sVal.Format( "%d", m_defenseBase+m_defenseRange ); } } else { sVal.Format( "%d,%d", m_defenseBase, m_defenseBase+m_defenseRange ); } } break; case OBC_DAM: { pszKey += strlen(sm_szLoadKeys[index]); // 9; if ( *pszKey == '.' ) { SKIP_SEPARATORS( pszKey ); if ( !strnicmp( pszKey, "LO", 2 ) ) { sVal.Format( "%d", m_attackBase ); } else if ( !strnicmp( pszKey, "HI", 2 ) ) { sVal.Format( "%d", m_attackBase+m_attackRange ); } } else { sVal.Format( "%d,%d", m_attackBase, m_attackBase+m_attackRange ); } } break; case OBC_BASEID: sVal = g_Cfg.ResourceGetName( GetResourceID()); break; case OBC_CAN: sVal.FormatHex( m_Can ); break; case OBC_HEIGHT: { //CBaseBaseDef * pBaseBaseDef = dynamic_cast<CBaseBaseDef*>(this); //DEBUG_ERR(("OBC_HEIGHT - m_dwDispIndex %d GetHeight() %d pBaseBaseDef->GetHeight() %d pBaseBaseDef 0x%x\n",m_wDispIndex,GetHeight(),pBaseBaseDef->GetHeight(),pBaseBaseDef)); sVal.FormatVal( GetHeight() ); } break; case OBC_INSTANCES: sVal.FormatVal( GetRefInstances()); break; case OBC_NAME: sVal = GetName(); break; case OBC_RANGE: if ( RangeH() == 0 ) sVal.Format( "%d", RangeL() ); else sVal.Format( "%d,%d", RangeH(), RangeL() ); break; case OBC_RANGEL: // internally: rangel seems to be Range Highest value sVal.FormatVal( RangeH() ); break; case OBC_RANGEH: // but rangeh seems to be the Range Lowest value. sVal.FormatVal( RangeL() ); break; case OBC_RESOURCES: // Print the resources { pszKey += strlen(sm_szLoadKeys[index]); // 9; if ( *pszKey == '.' ) { SKIP_SEPARATORS( pszKey ); if ( !strnicmp( pszKey, "COUNT", 5 )) { sVal.FormatVal(m_BaseResources.GetCount()); } else { bool fQtyOnly = false; bool fKeyOnly = false; index = Exp_GetVal( pszKey ); SKIP_SEPARATORS( pszKey ); if ( !strnicmp( pszKey, "KEY", 3 )) fKeyOnly = true; else if ( !strnicmp( pszKey, "VAL", 3 )) fQtyOnly = true; TCHAR *pszTmp = Str_GetTemp(); m_BaseResources.WriteKeys( pszTmp, index, fQtyOnly, fKeyOnly ); if ( fQtyOnly && pszTmp[0] == '\0' ) strcpy( pszTmp, "0" ); sVal = pszTmp; } } else { TCHAR *pszTmp = Str_GetTemp(); m_BaseResources.WriteKeys( pszTmp ); sVal = pszTmp; } } break; case OBC_RESLEVEL: sVal.FormatVal( GetResLevel() ); break; case OBC_RESDISPDNHUE: sVal.FormatHex( GetResDispDnHue() ); break; case OBC_TAG0: fZero = true; pszKey++; case OBC_TAG: // "TAG" = get/set a local tag. if ( pszKey[3] != '.' ) return( false ); pszKey += 4; sVal = m_TagDefs.GetKeyStr(pszKey, fZero ); break; case OBC_TEVENTS: m_TEvents.WriteResourceRefList( sVal ); break; default: return false; } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pSrc); EXC_DEBUG_END; return false; }
bool CSector::r_WriteVal( LPCTSTR pszKey, CGString & sVal, CTextConsole * pSrc ) { ADDTOCALLSTACK("CSector::r_WriteVal"); EXC_TRY("WriteVal"); static const CValStr sm_ComplexityTitles[] = { { "HIGH", INT_MIN }, // speech can be very complex if low char count { "MEDIUM", 5 }, { "LOW", 10 }, { NULL, INT_MAX } }; switch ( FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case SC_CLIENTS: sVal.FormatVal(m_Chars_Active.HasClients()); return true; case SC_COLDCHANCE: sVal.FormatVal( GetColdChance()); return( true ); case SC_COMPLEXITY: if ( pszKey[10] == '.' ) { pszKey += 11; sVal = ( ! strcmpi( pszKey, sm_ComplexityTitles->FindName( GetCharComplexity()))) ? "1" : "0"; return( true ); } sVal.FormatVal( GetCharComplexity()); return( true ); case SC_FLAGS: sVal.FormatHex(m_dwFlags); return( true ); case SC_LIGHT: sVal.FormatVal(GetLight()); return true; case SC_LOCALTIME: sVal = GetLocalGameTime(); return( true ); case SC_LOCALTOD: sVal.FormatVal( GetLocalTime()); return( true ); case SC_NUMBER: sVal.FormatVal(m_index); return( true ); case SC_ISDARK: sVal.FormatVal( IsDark() ); return( true ); case SC_ISNIGHTTIME: { int iMinutes = GetLocalTime(); sVal = ( iMinutes < 7*60 || iMinutes > (9+12)*60 ) ? "1" : "0"; } return( true ); case SC_RAINCHANCE: sVal.FormatVal( GetRainChance()); return( true ); case SC_ITEMCOUNT: sVal.FormatVal(GetItemComplexity()); return true; case SC_SEASON: sVal.FormatVal(static_cast<int>(GetSeason())); return true; case SC_WEATHER: sVal.FormatVal(static_cast<int>(GetWeather())); return true; } EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pSrc); EXC_DEBUG_END; return false; }
bool CScriptObj::r_WriteVal( LPCTSTR pszKey, CGString &sVal, CTextConsole * pSrc ) { EXC_TRY(("r_WriteVal('%s',,%x)", pszKey, pSrc)); CScriptObj * pRef; if ( r_GetRef( pszKey, pRef )) { if ( pRef == NULL ) // good command but bad link. { sVal = "0"; return true; } if ( pszKey[0] == '\0' ) // we where just testing the ref. { CObjBase * pObj = dynamic_cast <CObjBase *> (pRef); if ( pObj ) sVal.FormatHex( (DWORD) pObj->GetUID() ); else sVal.FormatVal( 1 ); return( true ); } return pRef->r_WriteVal( pszKey, sVal, pSrc ); } int i = FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 ); if ( i < 0 ) { // <dSOMEVAL> same as <eval <SOMEVAL>> to get dec from the val if (( *pszKey == 'd' ) || ( *pszKey == 'D' )) { LPCTSTR arg = pszKey + 1; if ( r_WriteVal(arg, sVal, pSrc) ) { if ( !IsStrNumericDec(sVal) ) // dValue dec -> hex fix { sVal.FormatVal(ahextoi(sVal)); } return true; } } // <r>, <r15>, <r3,15> are shortcuts to rand(), rand(15) and rand(3,15) else if (( *pszKey == 'r' ) || ( *pszKey == 'R' )) { char *zTemp = Str_GetTemp(); strcpy(zTemp, pszKey+1); if (( *zTemp ) && (( *zTemp < '0' ) || ( *zTemp > '9' )) ) goto badcmd; TCHAR *ppCmd[2]; int qty = Str_ParseCmds(zTemp, ppCmd, COUNTOF(ppCmd)); int min = 0, max = 1000; if ( qty == 1 ) max = atoi(ppCmd[0]); else if ( qty == 2 ) { min = g_Exp.GetVal(ppCmd[0]); max = g_Exp.GetVal(ppCmd[1]); } if ( min > max ) { int a = min; min = max; max = a; } if ( min == max ) sVal.FormatVal(min); else sVal.FormatVal(min + Calc_GetRandVal(max - min)); return true; } badcmd: return false; // Bad command. } pszKey += strlen( sm_szLoadKeys[i] ); SKIP_SEPERATORS(pszKey); bool fZero = false; switch ( i ) { case SSC_LISTCOL: // Set the alternating color. sVal = (CWebPageDef::sm_iListIndex&1) ? "bgcolor=\"#E8E8E8\"" : ""; return( true ); case SSC_OBJ: if ( !g_World.m_uidObj.ObjFind() ) g_World.m_uidObj = 0; sVal.FormatHex((DWORD)g_World.m_uidObj); return true; case SSC_NEW: if ( !g_World.m_uidNew.ObjFind() ) g_World.m_uidNew = 0; sVal.FormatHex((DWORD)g_World.m_uidNew); return true; case SSC_SRC: if ( pSrc == NULL ) pRef = NULL; else { pRef = pSrc->GetChar(); // if it can be converted . if ( ! pRef ) pRef = dynamic_cast <CScriptObj*> (pSrc); // if it can be converted . } if ( ! pRef ) { sVal.FormatVal( 0 ); return true; } if ( !*pszKey ) { CObjBase * pObj = dynamic_cast <CObjBase*> (pRef); // if it can be converted . sVal.FormatHex( pObj ? (DWORD) pObj->GetUID() : 0 ); return true; } return pRef->r_WriteVal( pszKey, sVal, pSrc ); case SSC_VAR0: fZero = true; case SSC_VAR: // "VAR." = get/set a system wide variable. { CVarDefBase * pVar = g_Exp.m_VarGlobals.GetKey(pszKey); if ( pVar ) sVal = pVar->GetValStr(); else if ( fZero ) sVal = "0"; } return true; case SSC_DEF0: fZero = true; case SSC_DEF: { CVarDefBase * pVar = g_Exp.m_VarDefs.GetKey(pszKey); if ( pVar ) sVal = pVar->GetValStr(); else if ( fZero ) sVal = "0"; } return( true ); case SSC_EVAL: sVal.FormatVal( Exp_GetVal( pszKey )); return( true ); case SSC_FVAL: { int iVal = Exp_GetVal( pszKey ); sVal.Format( "%i.%i", iVal/10, abs(iVal%10) ); return true; } case SSC_HVAL: sVal.FormatHex( Exp_GetVal( pszKey )); return( true ); case SSC_QVAL: { // Do a switch ? type statement <QVAL conditional ? option1 : option2> TCHAR * ppCmds[3]; ppCmds[0] = const_cast<TCHAR*>(pszKey); Str_Parse( ppCmds[0], &(ppCmds[1]), "?" ); Str_Parse( ppCmds[1], &(ppCmds[2]), ":" ); sVal = ppCmds[ Exp_GetVal( ppCmds[0] ) ? 1 : 2 ]; if ( sVal.IsEmpty()) sVal = " "; } return( true ); case SSC_ISEMPTY: sVal.FormatVal( IsStrEmpty( pszKey ) ); return true; case SSC_ISNUM: GETNONWHITESPACE( pszKey ); sVal.FormatVal( IsStrNumeric( pszKey ) ); return true; case SSC_StrRev: { GETNONWHITESPACE( pszKey ); sVal = pszKey; sVal.Reverse(); return true; } case SSC_StrPos: { GETNONWHITESPACE( pszKey ); int iPos = Exp_GetVal( pszKey ); TCHAR ch; if ( isdigit( *pszKey) && isdigit( *(pszKey+1) ) ) ch = (TCHAR) Exp_GetVal( pszKey ); else { ch = *pszKey; pszKey++; } GETNONWHITESPACE( pszKey ); int iLen = strlen( pszKey ); if ( iPos < 0 ) iPos = iLen + iPos; if ( iPos < 0 ) iPos = 0; else if ( iPos > iLen ) iPos = iLen; TCHAR * pszPos = strchr( pszKey + iPos, ch ); if ( !pszPos ) sVal.FormatVal( -1 ); else sVal.FormatVal( pszPos - pszKey ); } return true; case SSC_StrSub: { int iPos = Exp_GetVal( pszKey ); int iCnt = Exp_GetVal( pszKey ); SKIP_ARGSEP( pszKey ); GETNONWHITESPACE( pszKey ); int iLen = strlen( pszKey ); if ( iPos < 0 ) iPos += iLen; if ( iPos > iLen || iPos < 0 ) iPos = 0; if ( iPos + iCnt > iLen || iCnt == 0 ) iCnt = iLen - iPos; TCHAR *buf = Str_GetTemp(); strncpy( buf, pszKey + iPos, iCnt ); buf[iCnt] = '\0'; sVal = buf; } return true; case SSC_StrArg: { TCHAR *buf = Str_GetTemp(); GETNONWHITESPACE( pszKey ); if ( *pszKey == '"' ) pszKey++; int i = 0; while ( *pszKey && !isspace( *pszKey ) && *pszKey != ',' ) { buf[i] = *pszKey; pszKey++; i++; } buf[i] = '\0'; sVal = buf; } return true; case SSC_StrEat: { GETNONWHITESPACE( pszKey ); while ( *pszKey && !isspace( *pszKey ) && *pszKey != ',' ) pszKey++; SKIP_ARGSEP( pszKey ); sVal = pszKey; } return true; case SSC_ASC: { TCHAR *buf = Str_GetTemp(); REMOVE_QUOTES( pszKey ); sVal.FormatHex( *pszKey ); sprintf( buf, sVal ); while ( *(++pszKey) ) { if ( *pszKey == '"' ) break; sVal.FormatHex( *pszKey ); strcat( buf, " " ); strcat( buf, sVal ); } sVal = buf; } return true; case SSC_READFILE: { if ( !IsSetOF( OF_FileCommands ) ) return false; TCHAR *rfArgs[1]; FILE *rfFD; TCHAR *buf = Str_GetTemp(); int line; rfArgs[0] = const_cast<TCHAR*>(pszKey); Str_Parse( rfArgs[0], &(rfArgs[1]), " " ); // Remove other junk Str_Parse( rfArgs[1], NULL, " " ); line = atoi( rfArgs[1] ); sVal = ""; if ( rfFD = fopen( rfArgs[0], "r" )) { if ( line == -1 ) // First line of the file fgets(buf, SCRIPT_MAX_LINE_LEN, rfFD ); else if ( line == 0 ) { // Last line of the file while ( ! feof( rfFD ) ) fgets(buf, SCRIPT_MAX_LINE_LEN, rfFD ); } else { // Line "line" of the file int x; for ( x = 1; x <= line; x++ ) { if ( feof(rfFD) ) { buf[0] = 0; break; } fgets(buf, SCRIPT_MAX_LINE_LEN, rfFD ); } } sVal = buf; fclose(rfFD); } } return true; case SSC_FILELINES: { if ( !IsSetOF( OF_FileCommands ) ) return false; TCHAR *buf = Str_GetTemp(); FILE *flFD; int x(0); GETNONWHITESPACE( pszKey ); if ( flFD = fopen( pszKey, "r" ) ) { while ( ! feof(flFD) ) { fgets(buf, SCRIPT_MAX_LINE_LEN, flFD ); x++; } fclose(flFD); } sVal.FormatVal(x); } return true; case SSC_SYSCMD: case SSC_SYSSPAWN: { if ( !IsSetOF(OF_FileCommands) ) return false; GETNONWHITESPACE(pszKey); TCHAR *buf = Str_GetTemp(); TCHAR *Arg_ppCmd[10]; // limit to 9 arguments strcpy(buf, pszKey); int iQty = Str_ParseCmds(buf, Arg_ppCmd, COUNTOF(Arg_ppCmd)); if ( iQty < 1 ) return false; #ifdef WIN32 _spawnl( ( i == SSC_SYSCMD ) ? _P_WAIT : _P_NOWAIT, Arg_ppCmd[0], Arg_ppCmd[0], Arg_ppCmd[1], Arg_ppCmd[2], Arg_ppCmd[3], Arg_ppCmd[4], Arg_ppCmd[5], Arg_ppCmd[6], Arg_ppCmd[7], Arg_ppCmd[8], Arg_ppCmd[9], NULL ); #else g_Log.EventError("sysspawn/syscmd is not available on unix builds." DEBUG_CR); #endif return true; } default: StringFunction( i, pszKey, sVal ); return true; } EXC_CATCH("CScriptObj"); return false; }
bool CCharPlayer::r_LoadVal( CChar * pChar, CScript &s ) { ADDTOCALLSTACK("CCharPlayer::r_LoadVal"); EXC_TRY("LoadVal"); LPCTSTR pszKey = s.GetKey(); if ( !strnicmp(pszKey, "GMPAGE", 6) ) // GM pages { pszKey += 6; if ( *pszKey == '.' ) // GMPAGE.* { SKIP_SEPARATORS(pszKey); size_t index = Exp_GetVal(pszKey); if ( index >= g_World.m_GMPages.GetCount() ) return false; CGMPage* pPage = STATIC_CAST <CGMPage*> (g_World.m_GMPages.GetAt(index)); if ( pPage == NULL ) return false; SKIP_SEPARATORS(pszKey); if ( !strcmpi(pszKey, "HANDLE") ) { CChar *ppChar = pChar; LPCTSTR pszArgs = s.GetArgStr(); //Moved here because of error with quoted strings!?!? if ( *pszArgs ) ppChar = dynamic_cast<CChar*>(g_World.FindUID(s.GetArgVal())); if ( ppChar == NULL ) return false; CClient *pClient = ppChar->GetClient(); if ( pClient == NULL ) return false; pPage->SetGMHandler(pClient); } else if ( !strcmpi(pszKey, "DELETE") ) { delete pPage; } else if ( pPage->FindGMHandler() ) { CClient* pClient = pChar->GetClient(); if ( pClient != NULL && pClient->GetChar() != NULL ) pClient->Cmd_GM_PageCmd(pszKey); } else { return false; } return true; } return false; } else if ( ( !strnicmp(pszKey, "GUILD", 5) ) || ( !strnicmp(pszKey, "TOWN", 4) ) ) { bool bIsGuild = !strnicmp(pszKey, "GUILD", 5); pszKey += bIsGuild ? 5 : 4; if ( *pszKey == '.' ) { pszKey += 1; CItemStone *pMyGuild = pChar->Guild_Find(bIsGuild ? MEMORY_GUILD : MEMORY_TOWN); if ( pMyGuild ) return pMyGuild->r_SetVal(pszKey, s.GetArgRaw()); } return false; } switch ( FindTableHeadSorted( s.GetKey(), sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case CPC_DEATHS: m_wDeaths = static_cast<WORD>(s.GetArgVal()); return true; case CPC_DSPEECH: return( m_Speech.r_LoadVal( s, RES_SPEECH )); case CPC_KILLS: m_wMurders = static_cast<WORD>(s.GetArgVal()); pChar->NotoSave_Update(); return true; case CPC_KRTOOLBARSTATUS: m_bKrToolbarEnabled = ( s.GetArgVal() != 0 ); if ( pChar->IsClient() ) pChar->GetClient()->addKRToolbar( m_bKrToolbarEnabled ); return true; case CPC_LASTUSED: m_timeLastUsed = CServTime::GetCurrentTime() - ( s.GetArgVal() * TICK_PER_SEC ); return( true ); case CPC_PFLAG: { m_pflag = s.GetArgVal(); } return( true ); case CPC_PROFILE: m_sProfile = Str_MakeFiltered( s.GetArgStr()); return( true ); case CPC_REFUSETRADES: pChar->SetDefNum(s.GetKey(), s.GetArgVal() > 0 ? 1 : 0, false); return( true ); case CPC_SKILLCLASS: return SetSkillClass( pChar, g_Cfg.ResourceGetIDType( RES_SKILLCLASS, s.GetArgStr())); case CPC_SKILLLOCK: { SKILL_TYPE skill = Skill_GetLockType( s.GetKey()); if ( skill <= SKILL_NONE ) return false; int bState = s.GetArgVal(); if ( bState < SKILLLOCK_UP || bState > SKILLLOCK_LOCK ) return false; Skill_SetLock(skill, static_cast<SKILLLOCK_TYPE>(bState)); } return true; case CPC_SPEEDMODE: { m_speedMode = static_cast<unsigned short>(s.GetArgVal()); pChar->UpdateSpeedMode(); } return true; case CPC_STATLOCK: { STAT_TYPE stat = Stat_GetLockType( s.GetKey()); if (( stat <= STAT_NONE ) || ( stat >= STAT_BASE_QTY )) return false; int bState = s.GetArgVal(); if ( bState < SKILLLOCK_UP || bState > SKILLLOCK_LOCK ) return false; Stat_SetLock(stat, static_cast<SKILLLOCK_TYPE>(bState)); } return true; default: // Just ignore any NPC type stuff. if ( FindTableSorted( s.GetKey(), CCharNPC::sm_szLoadKeys, COUNTOF( CCharNPC::sm_szLoadKeys )-1 ) >= 0 ) { return( true ); } return( false ); } EXC_CATCH; EXC_DEBUG_START; EXC_ADD_SCRIPT; EXC_DEBUG_END; return false; }
llong CExpression::GetSingle( lpctstr & pszArgs ) { ADDTOCALLSTACK("CExpression::GetSingle"); // Parse just a single expression without any operators or ranges. ASSERT(pszArgs); GETNONWHITESPACE( pszArgs ); lpctstr orig = pszArgs; if (pszArgs[0]=='.') ++pszArgs; if ( pszArgs[0] == '0' ) // leading '0' = hex value. { // A hex value. if ( pszArgs[1] == '.' ) // leading 0. means it really is decimal. { pszArgs += 2; goto try_dec; } lpctstr pStart = pszArgs; ullong val = 0; while (true) { tchar ch = *pszArgs; if ( IsDigit(ch) ) ch -= '0'; else { ch = static_cast<tchar>(tolower(ch)); if ( ch > 'f' || ch < 'a' ) { if ( ch == '.' && pStart[0] != '0' ) // ok i'm confused. it must be decimal. { pszArgs = pStart; goto try_dec; } break; } ch -= 'a' - 10; } val *= 0x10; val += ch; ++pszArgs; } return (llong)val; } else if ( pszArgs[0] == '.' || IsDigit(pszArgs[0]) ) { // A decminal number try_dec: llong iVal = 0; for ( ; ; ++pszArgs ) { if ( *pszArgs == '.' ) continue; // just skip this. if ( ! IsDigit(*pszArgs) ) break; iVal *= 10; iVal += *pszArgs - '0'; } return iVal; } else if ( ! _ISCSYMF(pszArgs[0]) ) { #pragma region maths // some sort of math op ? switch ( pszArgs[0] ) { case '{': ++pszArgs; return GetRangeNumber( pszArgs ); case '[': case '(': // Parse out a sub expression. ++pszArgs; return GetVal( pszArgs ); case '+': ++pszArgs; break; case '-': ++pszArgs; return -GetSingle( pszArgs ); case '~': // Bitwise not. ++pszArgs; return ~GetSingle( pszArgs ); case '!': // boolean not. ++pszArgs; if ( pszArgs[0] == '=' ) // odd condition such as (!=x) which is always true of course. { ++pszArgs; // so just skip it. and compare it to 0 return GetSingle( pszArgs ); } return !GetSingle( pszArgs ); case ';': // seperate field. case ',': // seperate field. case '\0': return 0; } #pragma endregion maths } else #pragma region intrinsics { // Symbol or intrinsinc function ? INTRINSIC_TYPE iIntrinsic = (INTRINSIC_TYPE) FindTableHeadSorted( pszArgs, sm_IntrinsicFunctions, CountOf(sm_IntrinsicFunctions)-1 ); if ( iIntrinsic >= 0 ) { size_t iLen = strlen(sm_IntrinsicFunctions[iIntrinsic]); if ( pszArgs[iLen] == '(' ) { pszArgs += (iLen + 1); tchar * pszArgsNext; Str_Parse( const_cast<tchar*>(pszArgs), &(pszArgsNext), ")" ); tchar * ppCmd[5]; llong iResult; size_t iCount = 0; switch ( iIntrinsic ) { case INTRINSIC_ID: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = RES_GET_INDEX( GetVal(pszArgs) ); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_MAX: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 0; else { const int64 iVal1 = GetVal(ppCmd[0]), iVal2 = GetVal(ppCmd[1]); iResult = maximum(iVal1, iVal2); } } break; case INTRINSIC_MIN: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 0; else { const int64 iVal1 = GetVal(ppCmd[0]), iVal2 = GetVal(ppCmd[1]); iResult = minimum(iVal1, iVal2); } } break; case INTRINSIC_LOGARITHM: { iCount = 0; iResult = 0; if ( pszArgs && *pszArgs ) { llong iArgument = GetVal(pszArgs); if ( iArgument <= 0 ) { DEBUG_ERR(( "Exp_GetVal: (x)Log(%" PRId64 ") is %s\n", iArgument, (!iArgument) ? "infinite" : "undefined" )); } else { iCount = 1; if ( strchr(pszArgs, ',') ) { ++iCount; SKIP_ARGSEP(pszArgs); if ( !strcmpi(pszArgs, "e") ) { iResult = (llong)log( (double)iArgument ); } else if ( !strcmpi(pszArgs, "pi") ) { iResult = (llong)(log( (double)iArgument ) / log( M_PI ) ); } else { llong iBase = GetVal(pszArgs); if ( iBase <= 0 ) { DEBUG_ERR(( "Exp_GetVal: (%" PRId64 ")Log(%" PRId64 ") is %s\n", iBase, iArgument, (!iBase ? "infinite" : "undefined") )); iCount = 0; } else iResult = (llong)(log( (double)iArgument ) / log( (double)iBase )); } } else iResult = (llong)log10( (double)iArgument ); } } } break; case INTRINSIC_NAPIERPOW: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = (llong)exp( (double)GetVal( pszArgs ) ); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_SQRT: { iCount = 0; iResult = 0; if ( pszArgs && *pszArgs ) { llong iTosquare = GetVal(pszArgs); if (iTosquare >= 0) { ++iCount; iResult = (llong)sqrt( (double)iTosquare ); } else DEBUG_ERR(( "Exp_GetVal: Sqrt of negative number (%" PRId64 ") is impossible\n", iTosquare )); } } break; case INTRINSIC_SIN: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = (llong)sin( (double)GetVal( pszArgs ) ); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_ARCSIN: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = (llong)asin( (double)GetVal( pszArgs ) ); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_COS: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = (llong)cos( (double)GetVal( pszArgs ) ); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_ARCCOS: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = (llong)acos( (double)GetVal( pszArgs ) ); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_TAN: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = (llong)tan( (double)GetVal( pszArgs ) ); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_ARCTAN: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = (llong)atan( (double)GetVal( pszArgs ) ); } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_StrIndexOf: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 3, "," ); if ( iCount < 2 ) iResult = -1; else iResult = Str_IndexOf( ppCmd[0] , ppCmd[1] , (iCount==3)?(int)GetVal(ppCmd[2]):0 ); } break; case INTRINSIC_STRMATCH: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 0; else iResult = (Str_Match( ppCmd[0], ppCmd[1] ) == MATCH_VALID ) ? 1 : 0; } break; case INTRINSIC_STRREGEX: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 0; else { tchar * tLastError = Str_GetTemp(); iResult = Str_RegExMatch( ppCmd[0], ppCmd[1], tLastError ); if ( iResult == -1 ) { DEBUG_ERR(( "STRREGEX bad function usage. Error: %s\n", tLastError )); } } } break; case INTRINSIC_RANDBELL: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 0; else iResult = Calc_GetBellCurve( (int)GetVal( ppCmd[0] ), (int)GetVal( ppCmd[1] ) ); } break; case INTRINSIC_STRASCII: { if ( pszArgs && *pszArgs ) { iCount = 1; iResult = pszArgs[0]; } else { iCount = 0; iResult = 0; } } break; case INTRINSIC_RAND: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 2, "," ); if ( iCount <= 0 ) iResult = 0; else { int64 val1 = GetVal( ppCmd[0] ); if ( iCount == 2 ) { int64 val2 = GetVal( ppCmd[1] ); iResult = Calc_GetRandLLVal2( val1, val2 ); } else iResult = Calc_GetRandLLVal(val1); } } break; case INTRINSIC_STRCMP: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 1; else iResult = strcmp(ppCmd[0], ppCmd[1]); } break; case INTRINSIC_STRCMPI: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 2, "," ); if ( iCount < 2 ) iResult = 1; else iResult = strcmpi(ppCmd[0], ppCmd[1]); } break; case INTRINSIC_STRLEN: { iCount = 1; iResult = strlen(pszArgs); } break; case INTRINSIC_ISOBSCENE: { iCount = 1; iResult = g_Cfg.IsObscene( pszArgs ); } break; case INTRINSIC_ISNUMBER: { iCount = 1; { GETNONWHITESPACE( pszArgs ); if (*pszArgs == '-') ++pszArgs; iResult = IsStrNumeric( pszArgs ); } } break; case INTRINSIC_QVAL: { iCount = Str_ParseCmds( const_cast<tchar*>(pszArgs), ppCmd, 5, "," ); if ( iCount < 3 ) iResult = 0; else { llong a1 = GetSingle(ppCmd[0]); llong a2 = GetSingle(ppCmd[1]); if ( a1 < a2 ) iResult = GetSingle(ppCmd[2]); else if ( a1 == a2 ) iResult = ( iCount < 4 ) ? 0 : GetSingle(ppCmd[3]); else iResult = ( iCount < 5 ) ? 0 : GetSingle(ppCmd[4]); } } break; case INTRINSIC_ABS: { iCount = 1; iResult = llabs(GetVal(pszArgs)); } break; default: iCount = 0; iResult = 0; break; } pszArgs = pszArgsNext; if ( !iCount ) { DEBUG_ERR(( "Bad intrinsic function usage: Missing arguments\n" )); return 0; } else return iResult; } } // Must be a symbol of some sort ? lpctstr ptcArgsOriginal = pszArgs; llong llVal; if ( m_VarGlobals.GetParseVal_Advance( pszArgs, &llVal ) ) // VAR. return llVal; if ( m_VarResDefs.GetParseVal( ptcArgsOriginal, &llVal ) ) // RESDEF. return llVal; if ( m_VarDefs.GetParseVal( ptcArgsOriginal, &llVal ) ) // DEF. return llVal; } #pragma endregion intrinsics // hard end ! Error of some sort. tchar szTag[ EXPRESSION_MAX_KEY_LEN ]; size_t i = GetIdentifierString( szTag, pszArgs ); pszArgs += i; // skip it. if ( strlen(orig) > 1) DEBUG_ERR(("Undefined symbol '%s' ['%s']\n", szTag, orig)); else DEBUG_ERR(("Undefined symbol '%s'\n", szTag)); return 0; }
bool CCharNPC::r_WriteVal( CChar * pChar, LPCTSTR pszKey, CGString & sVal ) { EXC_TRY("WriteVal"); switch ( FindTableSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { //return as string or hex number or NULL if not set //On these ones, check BaseDef too if not found on dynamic case CNC_THROWDAM: case CNC_THROWOBJ: case CNC_THROWRANGE: sVal = pChar->GetDefStr(pszKey, false, true); break; //return as decimal number or 0 if not set //On these ones, check BaseDef if not found on dynamic case CNC_BONDED: sVal.FormatVal( m_bonded ); break; case CNC_FOLLOWERSLOTS: sVal.FormatLLVal(pChar->GetDefNum(pszKey, true, true)); break; case CNC_ACTPRI: sVal.FormatVal( m_Act_Motivation ); break; case CNC_NPC: sVal.FormatVal( m_Brain ); break; case CNC_HOMEDIST: sVal.FormatVal( m_Home_Dist_Wander ); break; case CNC_NEED: { TCHAR *pszTmp = Str_GetTemp(); m_Need.WriteKey( pszTmp ); sVal = pszTmp; } break; case CNC_NEEDNAME: { TCHAR *pszTmp = Str_GetTemp(); m_Need.WriteNameSingle( pszTmp ); sVal = pszTmp; } break; case CNC_SPEECH: m_Speech.WriteResourceRefList( sVal ); break; case CNC_SPEECHCOLOR: sVal.FormatVal( m_SpeechHue ); break; case CNC_VENDCAP: { CItemContainer * pBank = pChar->GetBank(); if ( pBank ) sVal.FormatVal( pBank->m_itEqBankBox.m_Check_Restock ); } break; case CNC_VENDGOLD: { CItemContainer * pBank = pChar->GetBank(); if ( pBank ) sVal.FormatVal( pBank->m_itEqBankBox.m_Check_Amount ); } break; default: if ( FindTableHeadSorted( pszKey, CCharPlayer::sm_szLoadKeys, COUNTOF( CCharPlayer::sm_szLoadKeys )-1 ) >= 0 ) { sVal = "0"; return( true ); } if ( FindTableSorted( pszKey, CClient::sm_szLoadKeys, CC_QTY ) >= 0 ) { sVal = "0"; return( true ); } return(false ); } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pChar); EXC_DEBUG_END; return false; }
bool CRandGroupDef::r_WriteVal( LPCTSTR pszKey, CGString &sVal, CTextConsole * pSrc ) { ADDTOCALLSTACK("CRandGroupDef::r_WriteVal"); EXC_TRY("WriteVal"); switch ( FindTableHeadSorted( pszKey, sm_szLoadKeys, COUNTOF( sm_szLoadKeys )-1 )) { case RGC_CATEGORY: sVal = m_sCategory; break; case RGC_SUBSECTION: sVal = m_sSubsection; break; case RGC_DESCRIPTION: sVal = m_sDescription; break; case RGC_ID: case RGC_CONTAINER: { size_t i = GetRandMemberIndex(); if ( i != BadMemberIndex() ) sVal.FormatHex(GetMemberID(i) & 0xFFFFFF); break; } case RGC_CALCMEMBERINDEX: { pszKey += 15; GETNONWHITESPACE( pszKey ); if ( pszKey[0] == '\0' ) { sVal.FormatVal( GetRandMemberIndex(NULL, false) ); } else { CGrayUID uidTofind = static_cast<DWORD>(Exp_GetVal(pszKey)); CChar * pSend = uidTofind.CharFind(); if ( pSend ) { sVal.FormatVal( GetRandMemberIndex(pSend, false) ); } else { return false; } } } break; case RGC_DEFNAME: // "DEFNAME" sVal = GetResourceName(); break; case RGC_RESOURCES: { pszKey += 9; if ( *pszKey == '.' ) { SKIP_SEPARATORS( pszKey ); if ( !strnicmp( pszKey, "COUNT", 5 )) { sVal.FormatVal(m_Members.GetCount()); } else { bool fQtyOnly = false; bool fKeyOnly = false; int index = Exp_GetVal( pszKey ); SKIP_SEPARATORS( pszKey ); if ( !strnicmp( pszKey, "KEY", 3 )) fKeyOnly = true; else if ( !strnicmp( pszKey, "VAL", 3 )) fQtyOnly = true; TCHAR *pszTmp = Str_GetTemp(); m_Members.WriteKeys( pszTmp, index, fQtyOnly, fKeyOnly ); if ( fQtyOnly && pszTmp[0] == '\0' ) strcpy( pszTmp, "0" ); sVal = pszTmp; } } else { TCHAR *pszTmp = Str_GetTemp(); m_Members.WriteKeys( pszTmp ); sVal = pszTmp; } } break; default: return( CResourceDef::r_WriteVal( pszKey, sVal, pSrc )); } return true; EXC_CATCH; EXC_DEBUG_START; EXC_ADD_KEYRET(pSrc); EXC_DEBUG_END; return false; }