… | |
… | |
805 | } |
805 | } |
806 | } |
806 | } |
807 | |
807 | |
808 | substr $dir, 0, 1 + length $PATH, ""; |
808 | substr $dir, 0, 1 + length $PATH, ""; |
809 | |
809 | |
810 | $RESOURCE{"$dir/$file"} = { |
810 | my %info = ( |
811 | type => (exists $meta->{type} ? delete $meta->{type} : $type), |
811 | type => (exists $meta->{type} ? delete $meta->{type} : $type), |
812 | data => $data, |
812 | data => $data, |
813 | %$meta ? (meta => $meta) : (), |
813 | %$meta ? (meta => $meta) : (), |
814 | }; |
814 | ); |
|
|
815 | |
|
|
816 | $RESOURCE{"$dir/$file"} = \%info; |
815 | } |
817 | } |
816 | |
818 | |
817 | sub process_any { |
819 | sub process_any { |
818 | while (my ($func, @args) = @{ $c_any->get }) { |
820 | while (my ($func, @args) = @{ $c_any->get }) { |
819 | $func->(@args); |
821 | $func->(@args); |
… | |
… | |
1104 | } |
1106 | } |
1105 | } |
1107 | } |
1106 | |
1108 | |
1107 | print "processing resources...\n" if $VERBOSE; |
1109 | print "processing resources...\n" if $VERBOSE; |
1108 | my $enc = JSON::XS->new->utf8->canonical->relaxed; |
1110 | my $enc = JSON::XS->new->utf8->canonical->relaxed; |
1109 | while (my ($k, $v) = each %RESOURCE) { |
1111 | for my $k (sort keys %RESOURCE) { |
|
|
1112 | my $v = $RESOURCE{$k}; |
1110 | |
1113 | |
1111 | if ($v->{meta} && $v->{meta}{datadir}) { |
1114 | if ($v->{meta} && $v->{meta}{datadir}) { |
1112 | delete $RESOURCE{$k}; |
1115 | delete $RESOURCE{$k}; |
1113 | |
1116 | |
1114 | $k =~ s/^res\/// or die "$k: datadir files must be in res/"; |
1117 | $k =~ s/^res\/// or die "$k: datadir files must be in res/"; |
… | |
… | |
1133 | |
1136 | |
1134 | make_hash $k, $v->{data}, $v->{hash}, 6; # 6 for the benefit of existing clients |
1137 | make_hash $k, $v->{data}, $v->{hash}, 6; # 6 for the benefit of existing clients |
1135 | } |
1138 | } |
1136 | } |
1139 | } |
1137 | |
1140 | |
|
|
1141 | printf "writing facedata...\n" if $VERBOSE; |
|
|
1142 | |
|
|
1143 | { |
|
|
1144 | open my $fh, ">:perlio", "$DATADIR/facedata~" |
|
|
1145 | or die "$DATADIR/facedata~: $!"; |
|
|
1146 | |
|
|
1147 | print $fh "FACEDATA"; |
|
|
1148 | my $fofs = 8; |
|
|
1149 | |
|
|
1150 | my $put = sub { |
|
|
1151 | my $len = length $_[0]; |
|
|
1152 | my $ofs = $fofs; |
|
|
1153 | |
|
|
1154 | print $fh $_[0]; |
|
|
1155 | $fofs += $len; |
|
|
1156 | |
|
|
1157 | ($len, $ofs) |
|
|
1158 | }; |
|
|
1159 | |
|
|
1160 | for (values %FACEINFO) { |
|
|
1161 | ($_->{size32}, $_->{fofs32}) = $put->(delete $_->{data32}); |
|
|
1162 | ($_->{size64}, $_->{fofs64}) = $put->(delete $_->{data64}); |
|
|
1163 | } |
|
|
1164 | |
|
|
1165 | for (values %RESOURCE) { |
|
|
1166 | ($_->{size}, $_->{fofs}) = $put->(delete $_->{data}); |
|
|
1167 | } |
|
|
1168 | |
|
|
1169 | close $fh; |
|
|
1170 | } |
|
|
1171 | |
1138 | printf "writing facedata (%d faces, %d anims, %d resources)...\n", |
1172 | printf "writing faceinfo (%d faces, %d anims, %d resources)...\n", |
1139 | scalar keys %FACEINFO, |
1173 | scalar keys %FACEINFO, |
1140 | scalar keys %ANIMINFO, |
1174 | scalar keys %ANIMINFO, |
1141 | scalar keys %RESOURCE |
1175 | scalar keys %RESOURCE |
1142 | if $VERBOSE; |
1176 | if $VERBOSE; |
1143 | |
1177 | |
1144 | open my $fh, ">:perlio", "$DATADIR/facedata~" |
1178 | open my $fh, ">:perlio", "$DATADIR/faceinfo~" |
1145 | or die "$DATADIR/facedata~: $!"; |
1179 | or die "$DATADIR/faceinfo~: $!"; |
1146 | |
1180 | |
1147 | print $fh nfreeze { |
1181 | print $fh nfreeze { |
1148 | version => 2, |
1182 | version => 2, |
1149 | faceinfo => \%FACEINFO, |
1183 | faceinfo => \%FACEINFO, |
1150 | animinfo => \%ANIMINFO, |
1184 | animinfo => \%ANIMINFO, |
… | |
… | |
1152 | }; |
1186 | }; |
1153 | } |
1187 | } |
1154 | |
1188 | |
1155 | print "committing files...\n" if $VERBOSE; |
1189 | print "committing files...\n" if $VERBOSE; |
1156 | |
1190 | |
1157 | for (qw(archetypes facedata treasures), @COMMIT) { |
1191 | for (qw(archetypes faceinfo facedata treasures), @COMMIT) { |
1158 | chmod 0644, "$DATADIR/$_~"; |
1192 | chmod 0644, "$DATADIR/$_~"; |
1159 | rename "$DATADIR/$_~", "$DATADIR/$_" |
1193 | rename "$DATADIR/$_~", "$DATADIR/$_" |
1160 | or die "$DATADIR/$_: $!"; |
1194 | or die "$DATADIR/$_: $!"; |
1161 | } |
1195 | } |
1162 | |
1196 | |