public void AssignReference(DMReference reference, DreamValue value) { switch (reference.RefType) { case DMReference.Type.Self: Result = value; break; case DMReference.Type.Argument: _localVariables[reference.Index] = value; break; case DMReference.Type.Local: _localVariables[ArgumentCount + reference.Index] = value; break; case DMReference.Type.SrcField: Instance.SetVariable(reference.Name, value); break; case DMReference.Type.Global: DreamManager.Globals[reference.Index] = value; break; case DMReference.Type.Src: //TODO: src can be assigned to non-DreamObject values if (!value.TryGetValueAsDreamObject(out Instance)) { throw new Exception($"Cannot assign src to {value}"); } break; case DMReference.Type.Field: { DreamValue owner = Pop(); if (!owner.TryGetValueAsDreamObject(out var ownerObj) || ownerObj == null) { throw new Exception($"Cannot assign field \"{reference.Name}\" on {owner}"); } ownerObj.SetVariable(reference.Name, value); break; } case DMReference.Type.ListIndex: { DreamValue index = Pop(); DreamValue list = Pop(); if (!list.TryGetValueAsDreamList(out var listObj)) { throw new Exception($"Cannot assign to index {index} of {list}"); } listObj.SetValue(index, value); break; } default: throw new Exception($"Cannot assign to reference type {reference.RefType}"); } }