Add the entire class hierarchy of `MovieClip` and `Sprite`.
This commit is contained in:
parent
f6e2ca1fe5
commit
a557867c71
|
@ -1,6 +1,6 @@
|
||||||
//! Global scope built-ins
|
//! Global scope built-ins
|
||||||
|
|
||||||
use crate::avm2::function::FunctionObject;
|
use crate::avm2::function::{FunctionObject, NativeFunction};
|
||||||
use crate::avm2::names::{Namespace, QName};
|
use crate::avm2::names::{Namespace, QName};
|
||||||
use crate::avm2::object::{Object, TObject};
|
use crate::avm2::object::{Object, TObject};
|
||||||
use crate::avm2::script_object::ScriptObject;
|
use crate::avm2::script_object::ScriptObject;
|
||||||
|
@ -18,6 +18,26 @@ pub struct SystemPrototypes<'gc> {
|
||||||
pub function: Object<'gc>,
|
pub function: Object<'gc>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn class<'gc>(
|
||||||
|
mc: MutationContext<'gc, '_>,
|
||||||
|
mut global_scope: Object<'gc>,
|
||||||
|
package: &str,
|
||||||
|
name: &str,
|
||||||
|
constr: NativeFunction<'gc>,
|
||||||
|
proto: Object<'gc>,
|
||||||
|
fn_proto: Object<'gc>,
|
||||||
|
) {
|
||||||
|
global_scope
|
||||||
|
.install_dynamic_property(
|
||||||
|
mc,
|
||||||
|
QName::new(Namespace::package(package), name),
|
||||||
|
FunctionObject::from_builtin_constr(mc, constr, proto, fn_proto)
|
||||||
|
.unwrap()
|
||||||
|
.into(),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
/// Construct a new global scope.
|
/// Construct a new global scope.
|
||||||
///
|
///
|
||||||
/// This function returns both the global scope object, as well as all builtin
|
/// This function returns both the global scope object, as well as all builtin
|
||||||
|
@ -25,76 +45,108 @@ pub struct SystemPrototypes<'gc> {
|
||||||
pub fn construct_global_scope<'gc>(
|
pub fn construct_global_scope<'gc>(
|
||||||
mc: MutationContext<'gc, '_>,
|
mc: MutationContext<'gc, '_>,
|
||||||
) -> (Object<'gc>, SystemPrototypes<'gc>) {
|
) -> (Object<'gc>, SystemPrototypes<'gc>) {
|
||||||
let mut global_scope = ScriptObject::bare_object(mc);
|
let gs = ScriptObject::bare_object(mc);
|
||||||
|
|
||||||
|
// public / root package
|
||||||
let object_proto = ScriptObject::bare_object(mc);
|
let object_proto = ScriptObject::bare_object(mc);
|
||||||
let function_proto = function::create_proto(mc, object_proto);
|
let fn_proto = function::create_proto(mc, object_proto);
|
||||||
let sprite_proto = flash::display::sprite::create_proto(mc, object_proto, function_proto);
|
|
||||||
let movieclip_proto = flash::display::movieclip::create_proto(mc, sprite_proto, function_proto);
|
|
||||||
|
|
||||||
object::fill_proto(mc, object_proto, function_proto);
|
object::fill_proto(mc, object_proto, fn_proto);
|
||||||
|
|
||||||
|
class(
|
||||||
|
mc,
|
||||||
|
gs,
|
||||||
|
"",
|
||||||
|
"Object",
|
||||||
|
object::constructor,
|
||||||
|
object_proto,
|
||||||
|
fn_proto,
|
||||||
|
);
|
||||||
|
class(
|
||||||
|
mc,
|
||||||
|
gs,
|
||||||
|
"",
|
||||||
|
"Function",
|
||||||
|
function::constructor,
|
||||||
|
fn_proto,
|
||||||
|
fn_proto,
|
||||||
|
);
|
||||||
|
|
||||||
|
// package `flash.events`
|
||||||
|
let eventdispatcher_proto =
|
||||||
|
flash::events::eventdispatcher::create_proto(mc, object_proto, fn_proto);
|
||||||
|
|
||||||
|
class(
|
||||||
|
mc,
|
||||||
|
gs,
|
||||||
|
"flash.events",
|
||||||
|
"EventDispatcher",
|
||||||
|
flash::events::eventdispatcher::constructor,
|
||||||
|
eventdispatcher_proto,
|
||||||
|
fn_proto,
|
||||||
|
);
|
||||||
|
|
||||||
|
// package `flash.display`
|
||||||
|
let displayobject_proto =
|
||||||
|
flash::display::displayobject::create_proto(mc, eventdispatcher_proto, fn_proto);
|
||||||
|
let interactiveobject_proto =
|
||||||
|
flash::display::interactiveobject::create_proto(mc, displayobject_proto, fn_proto);
|
||||||
|
let displayobjectcontainer_proto =
|
||||||
|
flash::display::displayobjectcontainer::create_proto(mc, interactiveobject_proto, fn_proto);
|
||||||
|
let sprite_proto =
|
||||||
|
flash::display::sprite::create_proto(mc, displayobjectcontainer_proto, fn_proto);
|
||||||
|
let movieclip_proto = flash::display::movieclip::create_proto(mc, sprite_proto, fn_proto);
|
||||||
|
|
||||||
|
class(
|
||||||
|
mc,
|
||||||
|
gs,
|
||||||
|
"flash.display",
|
||||||
|
"DisplayObject",
|
||||||
|
flash::display::displayobject::constructor,
|
||||||
|
displayobject_proto,
|
||||||
|
fn_proto,
|
||||||
|
);
|
||||||
|
class(
|
||||||
|
mc,
|
||||||
|
gs,
|
||||||
|
"flash.display",
|
||||||
|
"InteractiveObject",
|
||||||
|
flash::display::interactiveobject::constructor,
|
||||||
|
interactiveobject_proto,
|
||||||
|
fn_proto,
|
||||||
|
);
|
||||||
|
class(
|
||||||
|
mc,
|
||||||
|
gs,
|
||||||
|
"flash.display",
|
||||||
|
"DisplayObjectContainer",
|
||||||
|
flash::display::displayobjectcontainer::constructor,
|
||||||
|
sprite_proto,
|
||||||
|
fn_proto,
|
||||||
|
);
|
||||||
|
class(
|
||||||
|
mc,
|
||||||
|
gs,
|
||||||
|
"flash.display",
|
||||||
|
"Sprite",
|
||||||
|
flash::display::sprite::constructor,
|
||||||
|
sprite_proto,
|
||||||
|
fn_proto,
|
||||||
|
);
|
||||||
|
class(
|
||||||
|
mc,
|
||||||
|
gs,
|
||||||
|
"flash.display",
|
||||||
|
"MovieClip",
|
||||||
|
flash::display::movieclip::constructor,
|
||||||
|
movieclip_proto,
|
||||||
|
fn_proto,
|
||||||
|
);
|
||||||
|
|
||||||
let system_prototypes = SystemPrototypes {
|
let system_prototypes = SystemPrototypes {
|
||||||
object: object_proto,
|
object: object_proto,
|
||||||
function: function_proto,
|
function: fn_proto,
|
||||||
};
|
};
|
||||||
|
|
||||||
global_scope
|
(gs, system_prototypes)
|
||||||
.install_dynamic_property(
|
|
||||||
mc,
|
|
||||||
QName::new(Namespace::public_namespace(), "Object"),
|
|
||||||
FunctionObject::from_builtin_constr(
|
|
||||||
mc,
|
|
||||||
object::constructor,
|
|
||||||
object_proto,
|
|
||||||
function_proto,
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
global_scope
|
|
||||||
.install_dynamic_property(
|
|
||||||
mc,
|
|
||||||
QName::new(Namespace::public_namespace(), "Function"),
|
|
||||||
FunctionObject::from_builtin_constr(
|
|
||||||
mc,
|
|
||||||
function::constructor,
|
|
||||||
function_proto,
|
|
||||||
function_proto,
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
global_scope
|
|
||||||
.install_dynamic_property(
|
|
||||||
mc,
|
|
||||||
QName::new(Namespace::package("flash.display"), "Sprite"),
|
|
||||||
FunctionObject::from_builtin_constr(
|
|
||||||
mc,
|
|
||||||
flash::display::sprite::constructor,
|
|
||||||
sprite_proto,
|
|
||||||
function_proto,
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
global_scope
|
|
||||||
.install_dynamic_property(
|
|
||||||
mc,
|
|
||||||
QName::new(Namespace::package("flash.display"), "MovieClip"),
|
|
||||||
FunctionObject::from_builtin_constr(
|
|
||||||
mc,
|
|
||||||
flash::display::movieclip::constructor,
|
|
||||||
movieclip_proto,
|
|
||||||
function_proto,
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
(global_scope, system_prototypes)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
//! `flash` namespace
|
//! `flash` namespace
|
||||||
|
|
||||||
pub mod display;
|
pub mod display;
|
||||||
|
pub mod events;
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
//! `flash.display` namespace
|
//! `flash.display` namespace
|
||||||
|
|
||||||
|
pub mod displayobject;
|
||||||
|
pub mod displayobjectcontainer;
|
||||||
|
pub mod interactiveobject;
|
||||||
pub mod movieclip;
|
pub mod movieclip;
|
||||||
pub mod sprite;
|
pub mod sprite;
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
//! `flash.display.DisplayObject` builtin/prototype
|
||||||
|
|
||||||
|
use crate::avm2::object::Object;
|
||||||
|
use crate::avm2::return_value::ReturnValue;
|
||||||
|
use crate::avm2::script_object::ScriptObject;
|
||||||
|
use crate::avm2::value::Value;
|
||||||
|
use crate::avm2::{Avm2, Error};
|
||||||
|
use crate::context::UpdateContext;
|
||||||
|
use gc_arena::MutationContext;
|
||||||
|
|
||||||
|
/// Implements `flash.display.DisplayObject`'s constructor.
|
||||||
|
pub fn constructor<'gc>(
|
||||||
|
_avm: &mut Avm2<'gc>,
|
||||||
|
_action_context: &mut UpdateContext<'_, 'gc, '_>,
|
||||||
|
_this: Object<'gc>,
|
||||||
|
_args: &[Value<'gc>],
|
||||||
|
) -> Result<ReturnValue<'gc>, Error> {
|
||||||
|
Ok(Value::Undefined.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Construct `DisplayObject.prototype`.
|
||||||
|
pub fn create_proto<'gc>(
|
||||||
|
mc: MutationContext<'gc, '_>,
|
||||||
|
super_proto: Object<'gc>,
|
||||||
|
_fn_proto: Object<'gc>,
|
||||||
|
) -> Object<'gc> {
|
||||||
|
// TODO: Use `StageObject` here.
|
||||||
|
ScriptObject::object(mc, super_proto)
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
//! `flash.display.DisplayObjectContainer` builtin/prototype
|
||||||
|
|
||||||
|
use crate::avm2::object::Object;
|
||||||
|
use crate::avm2::return_value::ReturnValue;
|
||||||
|
use crate::avm2::script_object::ScriptObject;
|
||||||
|
use crate::avm2::value::Value;
|
||||||
|
use crate::avm2::{Avm2, Error};
|
||||||
|
use crate::context::UpdateContext;
|
||||||
|
use gc_arena::MutationContext;
|
||||||
|
|
||||||
|
/// Implements `flash.display.DisplayObjectContainer`'s constructor.
|
||||||
|
pub fn constructor<'gc>(
|
||||||
|
_avm: &mut Avm2<'gc>,
|
||||||
|
_action_context: &mut UpdateContext<'_, 'gc, '_>,
|
||||||
|
_this: Object<'gc>,
|
||||||
|
_args: &[Value<'gc>],
|
||||||
|
) -> Result<ReturnValue<'gc>, Error> {
|
||||||
|
Ok(Value::Undefined.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Construct `DisplayObjectContainer.prototype`.
|
||||||
|
pub fn create_proto<'gc>(
|
||||||
|
mc: MutationContext<'gc, '_>,
|
||||||
|
super_proto: Object<'gc>,
|
||||||
|
_fn_proto: Object<'gc>,
|
||||||
|
) -> Object<'gc> {
|
||||||
|
// TODO: Use `StageObject` here.
|
||||||
|
ScriptObject::object(mc, super_proto)
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
//! `flash.display.InteractiveObject` builtin/prototype
|
||||||
|
|
||||||
|
use crate::avm2::object::Object;
|
||||||
|
use crate::avm2::return_value::ReturnValue;
|
||||||
|
use crate::avm2::script_object::ScriptObject;
|
||||||
|
use crate::avm2::value::Value;
|
||||||
|
use crate::avm2::{Avm2, Error};
|
||||||
|
use crate::context::UpdateContext;
|
||||||
|
use gc_arena::MutationContext;
|
||||||
|
|
||||||
|
/// Implements `flash.display.InteractiveObject`'s constructor.
|
||||||
|
pub fn constructor<'gc>(
|
||||||
|
_avm: &mut Avm2<'gc>,
|
||||||
|
_action_context: &mut UpdateContext<'_, 'gc, '_>,
|
||||||
|
_this: Object<'gc>,
|
||||||
|
_args: &[Value<'gc>],
|
||||||
|
) -> Result<ReturnValue<'gc>, Error> {
|
||||||
|
Ok(Value::Undefined.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Construct `InteractiveObject.prototype`.
|
||||||
|
pub fn create_proto<'gc>(
|
||||||
|
mc: MutationContext<'gc, '_>,
|
||||||
|
super_proto: Object<'gc>,
|
||||||
|
_fn_proto: Object<'gc>,
|
||||||
|
) -> Object<'gc> {
|
||||||
|
// TODO: Use `StageObject` here.
|
||||||
|
ScriptObject::object(mc, super_proto)
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
//! `flash.events` namespace
|
||||||
|
|
||||||
|
pub mod eventdispatcher;
|
|
@ -0,0 +1,29 @@
|
||||||
|
//! `flash.events.EventDispatcher` builtin/prototype
|
||||||
|
|
||||||
|
use crate::avm2::object::Object;
|
||||||
|
use crate::avm2::return_value::ReturnValue;
|
||||||
|
use crate::avm2::script_object::ScriptObject;
|
||||||
|
use crate::avm2::value::Value;
|
||||||
|
use crate::avm2::{Avm2, Error};
|
||||||
|
use crate::context::UpdateContext;
|
||||||
|
use gc_arena::MutationContext;
|
||||||
|
|
||||||
|
/// Implements `flash.events.EventDispatcher`'s constructor.
|
||||||
|
pub fn constructor<'gc>(
|
||||||
|
_avm: &mut Avm2<'gc>,
|
||||||
|
_action_context: &mut UpdateContext<'_, 'gc, '_>,
|
||||||
|
_this: Object<'gc>,
|
||||||
|
_args: &[Value<'gc>],
|
||||||
|
) -> Result<ReturnValue<'gc>, Error> {
|
||||||
|
Ok(Value::Undefined.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Construct `EventDispatcher.prototype`.
|
||||||
|
pub fn create_proto<'gc>(
|
||||||
|
mc: MutationContext<'gc, '_>,
|
||||||
|
super_proto: Object<'gc>,
|
||||||
|
_fn_proto: Object<'gc>,
|
||||||
|
) -> Object<'gc> {
|
||||||
|
// TODO: Use `StageObject` here.
|
||||||
|
ScriptObject::object(mc, super_proto)
|
||||||
|
}
|
Loading…
Reference in New Issue