Merge branch 'master' into floatcvt
# Conflicts: # src/dobjtype.cpp # src/dobjtype.h
This commit is contained in:
commit
0eb35d6c6e
6 changed files with 176 additions and 40 deletions
|
|
@ -4565,12 +4565,12 @@ int DLevelScript::LineFromID(int id)
|
|||
}
|
||||
}
|
||||
|
||||
bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType *&type)
|
||||
bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType *&type, bool readonly)
|
||||
{
|
||||
PField *var = dyn_cast<PField>(self->GetClass()->Symbols.FindSymbol(varname, true));
|
||||
PArray *arraytype;
|
||||
|
||||
if (var == NULL || (var->Flags & VARF_Native))
|
||||
if (var == NULL || (!readonly && (var->Flags & VARF_Native)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -4593,6 +4593,17 @@ bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType *
|
|||
return false;
|
||||
}
|
||||
addr = baddr;
|
||||
// We don't want Int subclasses like Name or Color to be accessible,
|
||||
// but we do want to support Float subclasses like Fixed.
|
||||
if (!type->IsA(RUNTIME_CLASS(PInt)) || !type->IsKindOf(RUNTIME_CLASS(PFloat)))
|
||||
{
|
||||
// For reading, we also support Name and String types.
|
||||
if (readonly && (type->IsA(RUNTIME_CLASS(PName)) || type->IsA(RUNTIME_CLASS(PString))))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -4601,9 +4612,16 @@ static void SetUserVariable(AActor *self, FName varname, int index, int value)
|
|||
void *addr;
|
||||
PType *type;
|
||||
|
||||
if (GetVarAddrType(self, varname, index, addr, type))
|
||||
if (GetVarAddrType(self, varname, index, addr, type, false))
|
||||
{
|
||||
type->SetValue(addr, value);
|
||||
if (!type->IsKindOf(RUNTIME_CLASS(PFloat)))
|
||||
{
|
||||
type->SetValue(addr, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
type->SetValue(addr, FIXED2DBL(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4612,9 +4630,24 @@ static int GetUserVariable(AActor *self, FName varname, int index)
|
|||
void *addr;
|
||||
PType *type;
|
||||
|
||||
if (GetVarAddrType(self, varname, index, addr, type))
|
||||
if (GetVarAddrType(self, varname, index, addr, type, true))
|
||||
{
|
||||
return type->GetValueInt(addr);
|
||||
if (type->IsKindOf(RUNTIME_CLASS(PFloat)))
|
||||
{
|
||||
return FLOAT2FIXED(type->GetValueFloat(addr));
|
||||
}
|
||||
else if (type->IsA(RUNTIME_CLASS(PName)))
|
||||
{
|
||||
return GlobalACSStrings.AddString(FName(ENamedName(type->GetValueInt(addr))).GetChars());
|
||||
}
|
||||
else if (type->IsA(RUNTIME_CLASS(PString)))
|
||||
{
|
||||
return GlobalACSStrings.AddString(*(FString *)addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
return type->GetValueInt(addr);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue