CScValue::CScValue(CBGame *inGame, const char *Val): CBBase(inGame) { m_Type = VAL_STRING; m_ValString = NULL; SetStringVal(Val); m_ValBool = false; m_ValInt = 0; m_ValFloat = 0.0f; m_ValNative = NULL; m_ValRef = NULL; m_Persistent = false; m_IsConstVar = false; }
void CScValue::SetString(const char *Val) { if (m_Type == VAL_VARIABLE_REF) { m_ValRef->SetString(Val); return; } if (m_Type == VAL_NATIVE) { m_ValNative->ScSetString(Val); return; } SetStringVal(Val); if (m_ValString) m_Type = VAL_STRING; else m_Type = VAL_NULL; }
char* CScValue::GetString() { if(m_Type==VAL_VARIABLE_REF) return m_ValRef->GetString(); switch(m_Type) { case VAL_OBJECT: SetStringVal("[object]"); break; case VAL_NULL: SetStringVal("[null]"); break; case VAL_NATIVE: { char* StrVal = m_ValNative->ScToString(); SetStringVal(StrVal); return StrVal; break; } case VAL_BOOL: SetStringVal(m_ValBool?"yes":"no"); break; case VAL_INT: { char dummy[50]; sprintf(dummy, "%d", m_ValInt); SetStringVal(dummy); break; } case VAL_FLOAT: { char dummy[50]; sprintf(dummy, "%f", m_ValFloat); SetStringVal(dummy); break; } case VAL_STRING: break; default: SetStringVal(""); } return m_ValString; }
void CScValue::Copy(CScValue *orig, bool CopyWhole) { Game = orig->Game; if(m_ValNative && !m_Persistent) { m_ValNative->m_RefCount--; if(m_ValNative->m_RefCount<=0) { if(m_ValNative != orig->m_ValNative) delete m_ValNative; m_ValNative = NULL; } } if(orig->m_Type == VAL_VARIABLE_REF && orig->m_ValRef && CopyWhole) orig = orig->m_ValRef; Cleanup(true); m_Type = orig->m_Type; m_ValBool = orig->m_ValBool; m_ValInt = orig->m_ValInt; m_ValFloat = orig->m_ValFloat; SetStringVal(orig->m_ValString); m_ValRef = orig->m_ValRef; m_Persistent = orig->m_Persistent; m_ValNative = orig->m_ValNative; if(m_ValNative && !m_Persistent) m_ValNative->m_RefCount++; //!!!! ref->native++ // copy properties if(orig->m_Type == VAL_OBJECT && orig->m_ValObject.size()>0) { orig->m_ValIter = orig->m_ValObject.begin(); while(orig->m_ValIter!=orig->m_ValObject.end()) { m_ValObject[orig->m_ValIter->first] = new CScValue(Game); m_ValObject[orig->m_ValIter->first]->Copy(orig->m_ValIter->second); orig->m_ValIter++; } } else m_ValObject.clear(); }