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:
parent
ea28c2c4a2
commit
3fe6884c90
|
@ -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(),
|
||||
|
|
|
@ -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 =
|
||||
|
|
Loading…
Reference in New Issue