Refactor layer resolution into a separate function.

This function is part of `Avm1`, rather than a hypothetical `LayerManager`, because we're going to need to eventually construct layers differently for AVM2.
This commit is contained in:
David Wendt 2020-01-12 12:34:16 -05:00
parent ea28c2c4a2
commit 3fe6884c90
2 changed files with 24 additions and 24 deletions

View File

@ -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<Value<'gc>>) {
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::<u32>()?;
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(),

View File

@ -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 =