--- deliantra/server/ext/player-env.ext 2007/07/31 02:01:18 1.13 +++ deliantra/server/ext/player-env.ext 2007/09/19 21:56:30 1.15 @@ -19,8 +19,11 @@ } our %MUSIC_QUEUE; +our %MUSIC_FACE_CACHE; # cleared by reload_facedata our $MUSIC_SCHEDULER = cf::async_ext { + $Coro::current->{desc} = "music scheduler"; + while () { for (keys %MUSIC_QUEUE) { delete $MUSIC_QUEUE{$_}; @@ -33,33 +36,25 @@ $ns->extcmd or next; my $map = $pl->ob->map or next; - my $faces; + my $faces = $MUSIC_FACE_CACHE{$map} ||= do { + # 1. map-specific music info + parse_facelist "music/", $map->{music} + or do { + # 2. fall back to region if no map-specific music + my $rgn = $pl->ob->region + or next; + + my $par = $rgn; + while () { + last if exists $par->{music}; + $par = $par->parent + or last; + } - # 1. update map-specific music info - unless (exists $map->{music_faces}) { - $map->{music_faces} = parse_facelist "music/", $map->{music}; - } - - my $faces = $map->{music_faces}; - - # 2. fall back to region if no map-specific music - unless ($faces) { - my $rgn = $pl->ob->region - or next; - - unless (exists $rgn->{music_faces}) { - my $par = $rgn; - while () { - last if exists $par->{music}; - $par = $par->parent - or last; + parse_facelist "music/", $par->{music} } - - $rgn->{music_faces} = parse_facelist "music/", $par->{music}; - } - - $faces = $rgn->{music_faces}; - } + ; + }; $faces or next;