diff --git a/core/src/avm1/globals/matrix.rs b/core/src/avm1/globals/matrix.rs index ab34995f8..4c91ce20d 100644 --- a/core/src/avm1/globals/matrix.rs +++ b/core/src/avm1/globals/matrix.rs @@ -13,7 +13,14 @@ pub fn value_to_matrix<'gc>( avm: &mut Avm1<'gc>, context: &mut UpdateContext<'_, 'gc, '_>, ) -> Result { - object_to_matrix(value.as_object()?, avm, context) + let a = value.get("a", avm, context)?.as_number(avm, context)? as f32; + let b = value.get("b", avm, context)?.as_number(avm, context)? as f32; + let c = value.get("c", avm, context)?.as_number(avm, context)? as f32; + let d = value.get("d", avm, context)?.as_number(avm, context)? as f32; + let tx = Twips::from_pixels(value.get("tx", avm, context)?.as_number(avm, context)?); + let ty = Twips::from_pixels(value.get("ty", avm, context)?.as_number(avm, context)?); + + Ok(Matrix { a, b, c, d, tx, ty }) } pub fn gradient_object_to_matrix<'gc>( diff --git a/core/src/avm1/globals/point.rs b/core/src/avm1/globals/point.rs index 1fd036488..c7ee3c2ce 100644 --- a/core/src/avm1/globals/point.rs +++ b/core/src/avm1/globals/point.rs @@ -34,11 +34,9 @@ pub fn value_to_point<'gc>( avm: &mut Avm1<'gc>, context: &mut UpdateContext<'_, 'gc, '_>, ) -> Result<(f64, f64), Error> { - if let Value::Object(object) = value { - object_to_point(object, avm, context) - } else { - Ok((NAN, NAN)) - } + let x = value.get("x", avm, context)?.as_number(avm, context)?; + let y = value.get("y", avm, context)?.as_number(avm, context)?; + Ok((x, y)) } pub fn object_to_point<'gc>( @@ -98,7 +96,7 @@ fn equals<'gc>( this: Object<'gc>, args: &[Value<'gc>], ) -> Result, Error> { - if let Some(Value::Object(other)) = args.get(0) { + if let Some(other) = args.get(0) { let this_x = this.get("x", avm, context)?; let this_y = this.get("y", avm, context)?; let other_x = other.get("x", avm, context)?; @@ -155,14 +153,8 @@ fn distance<'gc>( let a = args.get(0).unwrap_or(&Value::Undefined); let b = args.get(1).unwrap_or(&Value::Undefined); - let delta = a - .call_method("subtract", &[b.to_owned()], avm, context)?; - if let Value::Object(object) = delta { - let length = object.get("length", avm, context)?; - Ok(length.into()) - } else { - Ok(Value::Undefined.into()) - } + let delta = a.call_method("subtract", &[b.to_owned()], avm, context)?; + Ok(delta.get("length", avm, context)?.into()) } fn polar<'gc>( diff --git a/core/src/avm1/value.rs b/core/src/avm1/value.rs index 17bec094f..c0f5c12eb 100644 --- a/core/src/avm1/value.rs +++ b/core/src/avm1/value.rs @@ -556,6 +556,19 @@ impl<'gc> Value<'gc> { } } + pub fn get( + &self, + name: &str, + avm: &mut Avm1<'gc>, + context: &mut UpdateContext<'_, 'gc, '_>, + ) -> Result, Error> { + if let Value::Object(object) = self { + object.get(name, avm, context) + } else { + Ok(Value::Undefined) + } + } + pub fn call( &self, avm: &mut Avm1<'gc>,