Beispiel #1
0
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;
}
Beispiel #2
0
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();
}