avm1: Stub out ActionSetProperty

Rough impl of ActionSetProperty action. Not all properties
implemented. Add DisplayObject::matrix_mut.
This commit is contained in:
Mike Welsh 2019-08-15 14:42:45 -07:00
parent 0ab20e01c1
commit 6c923930e6
3 changed files with 47 additions and 0 deletions

View File

@ -120,6 +120,7 @@ impl Avm1 {
Action::RemoveSprite => self.action_remove_sprite(context)?,
Action::Return => self.action_return(context)?,
Action::SetMember => self.action_set_member(context)?,
Action::SetProperty => self.action_set_property(context)?,
Action::SetTarget(target) => self.action_set_target(context, &target)?,
Action::SetVariable => self.action_set_variable(context)?,
Action::StackSwap => self.action_stack_swap(context)?,
@ -828,6 +829,29 @@ impl Avm1 {
unimplemented!("Action::SetMember");
}
fn action_set_property(&mut self, context: &mut ActionContext) -> Result<(), Error> {
let value = self.pop()?.as_f64()? as f32;
let prop_index = self.pop()?.as_u32()? as usize;
let clip_path = self.pop()?;
let path = clip_path.as_string()?;
if let Some(clip) =
Avm1::resolve_slash_path(context.active_clip, context.root, path)
{
if let Some(clip) = clip.write(context.gc_context).as_movie_clip_mut() {
match prop_index {
0 => clip.set_x(value),
1 => clip.set_y(value),
2 => clip.set_x_scale(value),
3 => clip.set_y_scale(value),
_ => log::warn!("ActionSetProperty: Unimplemented property index {}", prop_index),
}
}
} else {
log::warn!("ActionSetProperty: Invalid path {}", path);
}
Ok(())
}
fn action_set_variable(&mut self, context: &mut ActionContext) -> Result<(), Error> {
// Flash 4-style variable
let value = self.pop()?;

View File

@ -33,6 +33,9 @@ impl<'gc> DisplayObject<'gc> for DisplayObjectBase<'gc> {
fn matrix(&self) -> &Matrix {
&self.transform.matrix
}
fn matrix_mut(&mut self) -> &mut Matrix {
&mut self.transform.matrix
}
fn set_matrix(&mut self, matrix: &Matrix) {
self.transform.matrix = *matrix;
}
@ -76,6 +79,7 @@ pub trait DisplayObject<'gc>: 'gc + Collect {
fn transform(&self) -> &Transform;
fn matrix(&self) -> &Matrix;
fn matrix_mut(&mut self) -> &mut Matrix;
fn set_matrix(&mut self, matrix: &Matrix);
fn color_transform(&self) -> &ColorTransform;
fn set_color_transform(&mut self, color_transform: &ColorTransform);
@ -136,6 +140,9 @@ macro_rules! impl_display_object {
fn matrix(&self) -> &crate::matrix::Matrix {
self.$field.matrix()
}
fn matrix_mut(&mut self) -> &mut crate::matrix::Matrix {
self.$field.matrix_mut()
}
fn set_matrix(&mut self, matrix: &crate::matrix::Matrix) {
self.$field.set_matrix(matrix)
}

View File

@ -118,18 +118,34 @@ impl<'gc> MovieClip<'gc> {
self.matrix().tx
}
pub fn set_x(&mut self, val: f32) {
self.matrix_mut().tx = val;
}
pub fn y(&self) -> f32 {
self.matrix().ty
}
pub fn set_y(&mut self, val: f32) {
self.matrix_mut().ty = val;
}
pub fn x_scale(&self) -> f32 {
self.matrix().a * 100.0
}
pub fn set_x_scale(&mut self, val: f32) {
self.matrix_mut().a = val / 100.0;
}
pub fn y_scale(&self) -> f32 {
self.matrix().d * 100.0
}
pub fn set_y_scale(&mut self, val: f32) {
self.matrix_mut().d = val / 100.0;
}
pub fn current_frame(&self) -> FrameNumber {
self.current_frame
}