diff --git a/core/src/avm1.rs b/core/src/avm1.rs index 461306bbf..5ea6e31f8 100644 --- a/core/src/avm1.rs +++ b/core/src/avm1.rs @@ -907,6 +907,28 @@ impl<'gc> Avm1<'gc> { clip } + /// Resolve a layer by ID. + /// + /// If the layer does not exist, then it will be created and instantiated + /// with a script object. + pub fn resolve_layer( + &self, + level_id: u32, + context: &mut UpdateContext<'_, 'gc, '_>, + ) -> DisplayObject<'gc> { + if let Some(layer) = context.layers.get(&level_id) { + *layer + } else { + let mut layer: DisplayObject<'_> = + MovieClip::new(NEWEST_PLAYER_VERSION, context.gc_context).into(); + + layer.post_instantiation(context.gc_context, layer, self.prototypes.movie_clip); + context.layers.insert(level_id, layer); + + layer + } + } + fn push(&mut self, value: impl Into>) { let value = value.into(); avm_debug!("Stack push {}: {:?}", self.stack.len(), value); @@ -1594,17 +1616,7 @@ impl<'gc> Avm1<'gc> { let url = url.to_string(); let level_id = target[6..].parse::()?; let fetch = context.navigator.fetch(url); - let layer = if let Some(layer) = context.layers.get(&level_id) { - *layer - } else { - let mut layer: DisplayObject<'_> = - MovieClip::new(NEWEST_PLAYER_VERSION, context.gc_context).into(); - - layer.post_instantiation(context.gc_context, layer, self.prototypes.movie_clip); - context.layers.insert(level_id, layer); - - layer - }; + let layer = self.resolve_layer(level_id, context); let process = context.load_manager.load_movie_into_clip( context.player.clone().unwrap(), diff --git a/core/src/avm1/globals.rs b/core/src/avm1/globals.rs index e6753d7c6..c2e40c9b0 100644 --- a/core/src/avm1/globals.rs +++ b/core/src/avm1/globals.rs @@ -4,8 +4,6 @@ use crate::avm1::listeners::SystemListeners; use crate::avm1::return_value::ReturnValue; use crate::avm1::{Avm1, Error, Object, ScriptObject, TObject, UpdateContext, Value}; use crate::backend::navigator::NavigationMethod; -use crate::display_object::{DisplayObject, MovieClip, TDisplayObject}; -use crate::player::NEWEST_PLAYER_VERSION; use enumset::EnumSet; use gc_arena::MutationContext; use rand::Rng; @@ -172,17 +170,7 @@ pub fn load_movie_num<'gc>( .cloned() .unwrap_or(Value::Undefined) .as_number(avm, context)? as u32; - let layer = if let Some(layer) = context.layers.get(&level_id) { - *layer - } else { - let mut layer: DisplayObject<'_> = - MovieClip::new(NEWEST_PLAYER_VERSION, context.gc_context).into(); - - layer.post_instantiation(context.gc_context, layer, avm.prototypes().movie_clip); - context.layers.insert(level_id, layer); - - layer - }; + let layer = avm.resolve_layer(level_id, context); let _method = args.get(2).cloned().unwrap_or(Value::Undefined); let fetch = context.navigator.fetch(url); let process =