… | |
… | |
946 | =cut |
946 | =cut |
947 | |
947 | |
948 | sub load_tilecache() { |
948 | sub load_tilecache() { |
949 | require Gtk2; |
949 | require Gtk2; |
950 | |
950 | |
951 | if (-e "$LIB/facedata") { # Crossfire TRT faces |
|
|
952 | cache_file "$LIB/facedata", "$VARDIR/tilecache.pst", \&use_tilecache, |
951 | cache_file "$LIB/facedata", "$VARDIR/tilecache.pst", \&use_tilecache, |
953 | sub { |
952 | sub { |
954 | my %cache; |
953 | my %cache; |
955 | my $facedata = Storable::retrieve "$LIB/facedata"; |
954 | my $facedata = Storable::retrieve "$LIB/facedata"; |
956 | |
955 | |
957 | $facedata->{version} == 2 |
956 | $facedata->{version} == 2 |
958 | or die "$LIB/facedata: version mismatch, cannot proceed."; |
957 | or die "$LIB/facedata: version mismatch, cannot proceed."; |
959 | |
958 | |
960 | my $faces = $facedata->{faceinfo}; |
959 | my $faces = $facedata->{faceinfo}; |
961 | my $idx = 0; |
960 | my $idx = 0; |
962 | |
961 | |
963 | for (sort keys %$faces) { |
962 | for (sort keys %$faces) { |
964 | my ($face, $info) = ($_, $faces->{$_}); |
963 | my ($face, $info) = ($_, $faces->{$_}); |
965 | |
964 | |
966 | my $pb = new Gtk2::Gdk::PixbufLoader; |
965 | my $pb = new Gtk2::Gdk::PixbufLoader; |
967 | $pb->write ($info->{data32}); |
966 | $pb->write ($info->{data32}); |
968 | $pb->close; |
967 | $pb->close; |
969 | my $pb = $pb->get_pixbuf; |
968 | my $pb = $pb->get_pixbuf; |
970 | |
969 | |
971 | my $tile = $cache{$face} = { |
970 | my $tile = $cache{$face} = { |
972 | pb => $pb, |
971 | pb => $pb, |
973 | idx => $idx, |
972 | idx => $idx, |
974 | w => int $pb->get_width / TILESIZE, |
973 | w => int $pb->get_width / TILESIZE, |
975 | h => int $pb->get_height / TILESIZE, |
974 | h => int $pb->get_height / TILESIZE, |
976 | }; |
975 | }; |
977 | |
976 | |
978 | $idx += $tile->{w} * $tile->{h}; |
977 | $idx += $tile->{w} * $tile->{h}; |
979 | } |
978 | } |
980 | |
979 | |
981 | construct_tilecache_pb $idx, \%cache; |
980 | construct_tilecache_pb $idx, \%cache; |
982 | |
981 | |
983 | \%cache |
982 | \%cache |
984 | }; |
983 | }; |
985 | |
|
|
986 | *FACEDATA = Storable::retrieve "$LIB/facedata"; |
|
|
987 | |
|
|
988 | } elsif (-e "$LIB/crossfire.0") { # Crossfire1 version |
|
|
989 | cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", \&use_tilecache, |
|
|
990 | sub { |
|
|
991 | my $tile = read_pak "$LIB/crossfire.0"; |
|
|
992 | |
|
|
993 | my %cache; |
|
|
994 | |
|
|
995 | my $idx = 0; |
|
|
996 | |
|
|
997 | for my $name (sort keys %$tile) { |
|
|
998 | my $pb = new Gtk2::Gdk::PixbufLoader; |
|
|
999 | $pb->write ($tile->{$name}); |
|
|
1000 | $pb->close; |
|
|
1001 | my $pb = $pb->get_pixbuf; |
|
|
1002 | |
|
|
1003 | my $tile = $cache{$name} = { |
|
|
1004 | pb => $pb, |
|
|
1005 | idx => $idx, |
|
|
1006 | w => int $pb->get_width / TILESIZE, |
|
|
1007 | h => int $pb->get_height / TILESIZE, |
|
|
1008 | }; |
|
|
1009 | |
|
|
1010 | $idx += $tile->{w} * $tile->{h}; |
|
|
1011 | } |
|
|
1012 | |
|
|
1013 | construct_tilecache_pb $idx, \%cache; |
|
|
1014 | |
|
|
1015 | \%cache |
|
|
1016 | }; |
|
|
1017 | |
|
|
1018 | *FACEDATA = { }; |
|
|
1019 | } |
|
|
1020 | } |
984 | } |
1021 | |
985 | |
1022 | =head1 AUTHOR |
986 | =head1 AUTHOR |
1023 | |
987 | |
1024 | Marc Lehmann <schmorp@schmorp.de> |
988 | Marc Lehmann <schmorp@schmorp.de> |