@@ -9,7 +9,7 @@ use crate::backend::locale::LocaleBackend;
9
9
use crate :: backend:: navigator:: { NavigatorBackend , RequestOptions } ;
10
10
use crate :: backend:: storage:: StorageBackend ;
11
11
use crate :: backend:: {
12
- audio:: AudioBackend , log:: LogBackend , render:: Letterbox , render:: RenderBackend ,
12
+ audio:: AudioBackend , log:: LogBackend , render:: Letterbox , render:: RenderBackend , ui :: UiBackend ,
13
13
} ;
14
14
use crate :: context:: { ActionQueue , ActionType , RenderContext , UpdateContext } ;
15
15
use crate :: display_object:: { EditText , MorphShape , MovieClip } ;
@@ -23,7 +23,7 @@ use crate::prelude::*;
23
23
use crate :: property_map:: PropertyMap ;
24
24
use crate :: tag_utils:: SwfMovie ;
25
25
use crate :: transform:: TransformStack ;
26
- use crate :: vminterface:: Instantiator ;
26
+ use crate :: vminterface:: { AvmType , Instantiator } ;
27
27
use enumset:: EnumSet ;
28
28
use gc_arena:: { make_arena, ArenaParameters , Collect , GcCell } ;
29
29
use instant:: Instant ;
@@ -134,6 +134,7 @@ type Input = Box<dyn InputBackend>;
134
134
type Storage = Box < dyn StorageBackend > ;
135
135
type Locale = Box < dyn LocaleBackend > ;
136
136
type Log = Box < dyn LogBackend > ;
137
+ type UI = Box < dyn UiBackend > ;
137
138
138
139
pub struct Player {
139
140
/// The version of the player we're emulating.
@@ -159,6 +160,7 @@ pub struct Player {
159
160
input : Input ,
160
161
locale : Locale ,
161
162
log : Log ,
163
+ pub user_interface : UI ,
162
164
transform_stack : TransformStack ,
163
165
view_matrix : Matrix ,
164
166
inverse_view_matrix : Matrix ,
@@ -205,6 +207,7 @@ pub struct Player {
205
207
self_reference : Option < Weak < Mutex < Self > > > ,
206
208
}
207
209
210
+ #[ allow( clippy:: too_many_arguments) ]
208
211
impl Player {
209
212
pub fn new (
210
213
renderer : Renderer ,
@@ -214,6 +217,7 @@ impl Player {
214
217
storage : Storage ,
215
218
locale : Locale ,
216
219
log : Log ,
220
+ user_interface : UI ,
217
221
) -> Result < Arc < Mutex < Self > > , Error > {
218
222
let fake_movie = Arc :: new ( SwfMovie :: empty ( NEWEST_PLAYER_VERSION ) ) ;
219
223
let movie_width = 550 ;
@@ -280,6 +284,7 @@ impl Player {
280
284
input,
281
285
locale,
282
286
log,
287
+ user_interface,
283
288
self_reference : None ,
284
289
system : SystemProperties :: default ( ) ,
285
290
instance_counter : 0 ,
@@ -305,10 +310,10 @@ impl Player {
305
310
306
311
player. build_matrices ( ) ;
307
312
player. audio . set_frame_rate ( frame_rate) ;
308
-
309
313
let player_box = Arc :: new ( Mutex :: new ( player) ) ;
310
314
let mut player_lock = player_box. lock ( ) . unwrap ( ) ;
311
315
player_lock. self_reference = Some ( Arc :: downgrade ( & player_box) ) ;
316
+
312
317
std:: mem:: drop ( player_lock) ;
313
318
314
319
Ok ( player_box)
@@ -624,7 +629,7 @@ impl Player {
624
629
} ) ;
625
630
}
626
631
627
- // Propagte clip events.
632
+ // Propagate clip events.
628
633
self . mutate_with_update_context ( |context| {
629
634
let ( clip_event, listener) = match event {
630
635
PlayerEvent :: KeyDown { .. } => {
@@ -799,22 +804,28 @@ impl Player {
799
804
/// This should only be called once. Further movie loads should preload the
800
805
/// specific `MovieClip` referenced.
801
806
fn preload ( & mut self ) {
807
+ let mut is_action_script_3 = false ;
802
808
self . mutate_with_update_context ( |context| {
803
809
let mut morph_shapes = fnv:: FnvHashMap :: default ( ) ;
804
810
let root = * context. levels . get ( & 0 ) . expect ( "root level" ) ;
805
811
root. as_movie_clip ( )
806
812
. unwrap ( )
807
813
. preload ( context, & mut morph_shapes) ;
808
814
815
+ let lib = context
816
+ . library
817
+ . library_for_movie_mut ( root. as_movie_clip ( ) . unwrap ( ) . movie ( ) . unwrap ( ) ) ;
818
+
819
+ is_action_script_3 = lib. avm_type ( ) == AvmType :: Avm2 ;
809
820
// Finalize morph shapes.
810
821
for ( id, static_data) in morph_shapes {
811
822
let morph_shape = MorphShape :: new ( context. gc_context , static_data) ;
812
- context
813
- . library
814
- . library_for_movie_mut ( root. as_movie_clip ( ) . unwrap ( ) . movie ( ) . unwrap ( ) )
815
- . register_character ( id, crate :: character:: Character :: MorphShape ( morph_shape) ) ;
823
+ lib. register_character ( id, crate :: character:: Character :: MorphShape ( morph_shape) ) ;
816
824
}
817
825
} ) ;
826
+ if is_action_script_3 {
827
+ self . user_interface . message ( "This SWF contains ActionScript 3 which is not yet supported by Ruffle. The movie may not work as intended." ) ;
828
+ }
818
829
}
819
830
820
831
pub fn run_frame ( & mut self ) {
0 commit comments