void C4Effect::SetPropertyByS(C4String * k, const C4Value & to) { if (k >= &Strings.P[0] && k < &Strings.P[P_LAST]) { switch(k - &Strings.P[0]) { case P_Name: if (!to.getStr() || !*to.getStr()->GetCStr()) throw C4AulExecError("effect: Name has to be a nonempty string"); C4PropListNumbered::SetPropertyByS(k, to); ReAssignCallbackFunctions(); return; case P_Priority: throw C4AulExecError("effect: Priority is readonly"); case P_Interval: iInterval = to.getInt(); return; case P_CommandTarget: throw C4AulExecError("effect: CommandTarget is readonly"); case P_Target: throw C4AulExecError("effect: Target is readonly"); case P_Time: iTime = to.getInt(); return; case P_Prototype: throw new C4AulExecError("effect: Prototype is readonly"); } } C4PropListNumbered::SetPropertyByS(k, to); }
int32_t C4Def::GetValue(C4Object *pInBase, int32_t iBuyPlayer) { C4Value r = Call(PSF_CalcDefValue, &C4AulParSet(pInBase, iBuyPlayer)); int32_t iValue = Value; if (r != C4VNull) iValue = r.getInt(); // do any adjustments based on where the item is bought if (pInBase) { r = pInBase->Call(PSF_CalcBuyValue, &C4AulParSet(this, iValue)); if (r != C4VNull) iValue = r.getInt(); } return iValue; }
bool C4MapScriptAlgo::GetXYProps(const C4PropList *props, C4PropertyName k, int32_t *out_xy, bool zero_defaults) { // Evaluate property named "k" in proplist props to store two numbers in out_xy: // If props->k is a single integer, fill both numbers in out_xy with it // If props->k is an array, check that it contains two numbers and store them in out_xy if (!props->HasProperty(&Strings.P[k])) { if (zero_defaults) out_xy[0] = out_xy[1] = 0; return false; } C4Value val; C4ValueArray *arr; props->GetProperty(k, &val); if ((arr = val.getArray())) { if (arr->GetSize() != 2) throw C4AulExecError(FormatString("C4MapScriptAlgo: Expected either integer or array with two integer elements in property \"%s\".", Strings.P[k].GetCStr()).getData()); out_xy[0] = arr->GetItem(0).getInt(); out_xy[1] = arr->GetItem(1).getInt(); } else { out_xy[0] = out_xy[1] = val.getInt(); } return true; }
void C4ParticleValueProvider::SetParameterValue(int type, const C4Value &value, float C4ParticleValueProvider::*floatVal, int C4ParticleValueProvider::*intVal, size_t keyFrameIndex) { // just an atomic data type if (value.GetType() == C4V_Int) { if (type == VAL_TYPE_FLOAT) this->*floatVal = (float)value.getInt(); else if (type == VAL_TYPE_INT) this->*intVal = value.getInt(); else if (type == VAL_TYPE_KEYFRAMES) this->keyFrames[keyFrameIndex] = (float)value.getInt(); } else if (value.GetType() == C4V_Array) { // might be another value provider! C4ParticleValueProvider *child = new C4ParticleValueProvider(); childrenValueProviders.push_back(child); child->Set(*value.getArray()); child->typeOfValueToChange = type; if (type == VAL_TYPE_FLOAT) { child->floatValueToChange = floatVal; } else if (type == VAL_TYPE_INT) { child->intValueToChange = intVal; } else if (type == VAL_TYPE_KEYFRAMES) { child->keyFrameIndex = keyFrameIndex; } } else // invalid { if (type == VAL_TYPE_FLOAT) this->*floatVal = 0.f; else if (type == VAL_TYPE_INT) this->*intVal = 0; else if (type == VAL_TYPE_KEYFRAMES) this->keyFrames[keyFrameIndex] = 0.f; } }
void C4ParticleValueProvider::Set(const C4Value &value) { C4ValueArray *valueArray= value.getArray(); if (valueArray != 0) Set(*valueArray); else Set((float)value.getInt()); }
static int32_t FnLayerGetDefaultBackgroundIndex(C4PropList * _this, const C4Value &value) { uint8_t fg; C4String* str; if ((str = value.getStr())) { if (!TexColSingle(str->GetCStr(), fg)) return -1; } else { if (!Inside(value.getInt(), 0, 255)) return -1; fg = value.getInt(); } return ::MapScript.pTexMap->DefaultBkgMatTex(fg); }