core: Frame labels are case insensitive
This commit is contained in:
parent
a835573f3c
commit
8aae07bbf3
|
@ -378,14 +378,16 @@ pub fn goto_frame<'gc>(
|
||||||
stop: bool,
|
stop: bool,
|
||||||
scene_offset: u16,
|
scene_offset: u16,
|
||||||
) -> Result<ReturnValue<'gc>, Error> {
|
) -> Result<ReturnValue<'gc>, Error> {
|
||||||
if let Some(value) = args.get(0) {
|
match args.get(0).cloned().unwrap_or(Value::Undefined) {
|
||||||
if let Ok(mut frame) = value.as_i32() {
|
Value::Number(n) => {
|
||||||
// Frame #
|
// Frame #
|
||||||
// Gotoing <= 0 has no effect.
|
// Gotoing <= 0 has no effect.
|
||||||
// Gotoing greater than _totalframes jumps to the last frame.
|
// Gotoing greater than _totalframes jumps to the last frame.
|
||||||
// Wraps around as an i32.
|
// Wraps around as an i32.
|
||||||
// TODO: -1 +1 here to match Flash's behavior.
|
// TODO: -1 +1 here to match Flash's behavior.
|
||||||
// We probably want to change our frame representation to 0-based.
|
// We probably want to change our frame representation to 0-based.
|
||||||
|
// Scene offset is only used by GotoFrame2 global opcode.
|
||||||
|
let mut frame = crate::avm1::value::f64_to_wrapping_i32(n);
|
||||||
frame = frame.wrapping_sub(1);
|
frame = frame.wrapping_sub(1);
|
||||||
frame = frame.wrapping_add(i32::from(scene_offset));
|
frame = frame.wrapping_add(i32::from(scene_offset));
|
||||||
if frame >= 0 {
|
if frame >= 0 {
|
||||||
|
@ -396,8 +398,10 @@ pub fn goto_frame<'gc>(
|
||||||
movie_clip.goto_frame(context, frame.saturating_add(1) as u16, stop);
|
movie_clip.goto_frame(context, frame.saturating_add(1) as u16, stop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
let frame_label = value.clone().coerce_to_string(avm, context)?;
|
val => {
|
||||||
|
// Coerce to string and search for a frame label.
|
||||||
|
let frame_label = val.clone().coerce_to_string(avm, context)?;
|
||||||
if let Some(mut frame) = movie_clip.frame_label_to_number(&frame_label) {
|
if let Some(mut frame) = movie_clip.frame_label_to_number(&frame_label) {
|
||||||
frame = frame.wrapping_add(scene_offset);
|
frame = frame.wrapping_add(scene_offset);
|
||||||
movie_clip.goto_frame(context, frame, stop);
|
movie_clip.goto_frame(context, frame, stop);
|
||||||
|
|
|
@ -160,12 +160,9 @@ impl<'gc> MovieClip<'gc> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn frame_label_to_number(self, frame_label: &str) -> Option<FrameNumber> {
|
pub fn frame_label_to_number(self, frame_label: &str) -> Option<FrameNumber> {
|
||||||
self.0
|
// Frame labels are case insensitive.
|
||||||
.read()
|
let label = frame_label.to_ascii_lowercase();
|
||||||
.static_data
|
self.0.read().static_data.frame_labels.get(&label).copied()
|
||||||
.frame_labels
|
|
||||||
.get(frame_label)
|
|
||||||
.copied()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the clip events for this movieclip.
|
/// Gets the clip events for this movieclip.
|
||||||
|
@ -1513,12 +1510,14 @@ impl<'gc, 'a> MovieClipData<'gc> {
|
||||||
cur_frame: FrameNumber,
|
cur_frame: FrameNumber,
|
||||||
static_data: &mut MovieClipStatic,
|
static_data: &mut MovieClipStatic,
|
||||||
) -> DecodeResult {
|
) -> DecodeResult {
|
||||||
let frame_label = reader.read_frame_label(tag_len)?;
|
let mut frame_label = reader.read_frame_label(tag_len)?;
|
||||||
if static_data
|
// Frame labels are case insensitive (ASCII).
|
||||||
.frame_labels
|
frame_label.label.make_ascii_lowercase();
|
||||||
.insert(frame_label.label, cur_frame)
|
if let std::collections::hash_map::Entry::Vacant(v) =
|
||||||
.is_some()
|
static_data.frame_labels.entry(frame_label.label)
|
||||||
{
|
{
|
||||||
|
v.insert(cur_frame);
|
||||||
|
} else {
|
||||||
log::warn!("Movie clip {}: Duplicated frame label", self.id());
|
log::warn!("Movie clip {}: Duplicated frame label", self.id());
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
Loading…
Reference in New Issue