Modify logic for "at" operator.

This commit is contained in:
2022-11-11 10:02:43 +08:00
parent cf00bd8db0
commit 383fca1a8e

View File

@@ -261,11 +261,16 @@ namespace Cryville.Crtr {
int _;
var op0 = GetOperand(0);
var op1 = (int)Math.Round(GetOperand(1).AsNumber());
if (op0.Type != PdtInternalType.Vector) throw new InvalidOperationException("Not a vector");
if (op0.Type == PdtInternalType.Vector) {
op0.GetArraySuffix(out _, out _);
if (op1 >= (op0.Length - sizeof(int)) / sizeof(float)) throw new IndexOutOfRangeException();
float result = GetOperand(0).AsNumber(op1 * sizeof(float));
GetReturnFrame(PdtInternalType.Number, sizeof(float)).SetNumber(result);
GetReturnFrame(PdtInternalType.Number, sizeof(float)).SetNumber(op0.AsNumber(op1 * sizeof(float)));
}
else if (op0.Type == PdtInternalType.Number) {
if (op1 != 0) throw new IndexOutOfRangeException();
GetReturnFrame(PdtInternalType.Number, sizeof(float)).SetNumber(op0.AsNumber());
}
else throw new InvalidOperationException("Not a vector or number");
}
}
class func_frame_seq : PdtOperator {