Mercurial > hg > batmud > materials
comparison parsematerial.pl @ 0:c4f3b5b88891
Import material and alloy stuff into new repository.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 05 Jan 2016 07:54:37 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c4f3b5b88891 |
---|---|
1 #!/usr/bin/perl -w | |
2 # | |
3 # BatMUD material data parser and converter | |
4 # Developed by Matti Hämäläinen (Ggr Pupunen) <ccr@tnsp.org> | |
5 # (C) Copyright 2006-2015 Tecnic Software productions (TNSP) | |
6 # | |
7 # Converts "raw" material data (output of 'cast identify at material') | |
8 # from log(s) into various formats and intermediate data for additional | |
9 # processing by other tools. | |
10 # | |
11 use strict; | |
12 use warnings; | |
13 use Data::Dumper; | |
14 | |
15 | |
16 # | |
17 # Data translation table generated with csv2transtab.pl | |
18 # | |
19 my $transTable = | |
20 { | |
21 2 => { | |
22 "very light" => 0, | |
23 "light" => 1, | |
24 "normal" => 2, | |
25 "heavy" => 3, | |
26 "very heavy" => 4, | |
27 "incredibly heavy" => 5, | |
28 }, | |
29 3 => { | |
30 "very fragile" => 0, | |
31 "fragile" => 1, | |
32 "normal" => 2, | |
33 "sturdy" => 3, | |
34 "very sturdy" => 4, | |
35 "incredibly sturdy" => 5, | |
36 }, | |
37 4 => { | |
38 "not magical" => 0, | |
39 "weakly magical" => 1, | |
40 "a bit magical" => 2, | |
41 "magical" => 3, | |
42 "notable magical" => 4, | |
43 "very magical" => 5, | |
44 "highly magical" => 6, | |
45 }, | |
46 5 => { | |
47 "unburnable" => 0, | |
48 "almost unburnable" => 1, | |
49 "quite unburnable" => 2, | |
50 "normal" => 3, | |
51 "quite flammable" => 4, | |
52 "very flammable" => 5, | |
53 "highly flammable" => 6, | |
54 }, | |
55 6 => { | |
56 "icy" => 0, | |
57 "chilly" => 1, | |
58 "drafty" => 2, | |
59 "comfortable" => 3, | |
60 "very warm" => 4, | |
61 "excellent" => 5, | |
62 }, | |
63 7 => { | |
64 "non toxic" => 0, | |
65 "very low toxicity" => 1, | |
66 "low toxicity" => 2, | |
67 "mediocre toxicity" => 3, | |
68 "toxic" => 4, | |
69 "very toxic" => 5, | |
70 "highly toxic" => 6, | |
71 }, | |
72 8 => { | |
73 "lousy" => 0, | |
74 "poor" => 1, | |
75 "weak" => 2, | |
76 "insulator" => 3, | |
77 "good" => 4, | |
78 "great" => 5, | |
79 }, | |
80 9 => { | |
81 "loose" => 0, | |
82 "a bit loose" => 1, | |
83 "quite solid" => 2, | |
84 "solid" => 3, | |
85 "very solid" => 4, | |
86 "incredibly solid" => 5, | |
87 }, | |
88 10 => { | |
89 "poor mentality" => 0, | |
90 "low mentality" => 1, | |
91 "some mentality" => 2, | |
92 "mental" => 3, | |
93 "high mentality" => 4, | |
94 "great mentality" => 5, | |
95 }, | |
96 11 => { | |
97 "great reactivity" => 0, | |
98 "high reactivity" => 1, | |
99 "notable reactivity" => 2, | |
100 "reactive" => 3, | |
101 "low reactivity" => 4, | |
102 "poor reactivity" => 5, | |
103 "not reactive" => 6, | |
104 }, | |
105 12 => { | |
106 "not used" => 0, | |
107 "rarely used" => 1, | |
108 "sometimes used" => 2, | |
109 "quite much used" => 3, | |
110 "frequently used" => 4, | |
111 "most common" => 5, | |
112 }, | |
113 13 => { | |
114 "not used" => 0, | |
115 "rarely used" => 1, | |
116 "sometimes used" => 2, | |
117 "quite much used" => 3, | |
118 "frequently used" => 4, | |
119 "most common" => 5, | |
120 }, | |
121 14 => { | |
122 "cheap" => 0, | |
123 "low-priced" => 1, | |
124 "average" => 2, | |
125 "valuable" => 3, | |
126 "very valuable" => 4, | |
127 "highly valuable" => 5, | |
128 }, | |
129 15 => { | |
130 "very common" => 0, | |
131 "quite common" => 1, | |
132 "common" => 2, | |
133 "average" => 3, | |
134 "rare" => 4, | |
135 "very rare" => 5, | |
136 "impossible" => 6, | |
137 }, | |
138 16 => { | |
139 "Organ" => 0, | |
140 "Cloth" => 1, | |
141 "Paper" => 2, | |
142 "Bone" => 3, | |
143 "Metal" => 4, | |
144 "Wood" => 5, | |
145 "Stone" => 6, | |
146 "Alloy" => 7, | |
147 "Inorg" => 8, | |
148 "Glass" => 9, | |
149 "Gem" => 10, | |
150 }, | |
151 17 => { | |
152 "No" => 0, | |
153 "Yes" => 1, | |
154 }, | |
155 18 => { | |
156 "Hit" => 0, | |
157 "Protrusion" => 1, | |
158 "Crag" => 2, | |
159 "Lode" => 3, | |
160 "Pocket" => 4, | |
161 "Gloss" => 5, | |
162 "Shard" => 6, | |
163 "Deposit" => 7, | |
164 "Mountain" => 8, | |
165 "Nest" => 9, | |
166 "Stack" => 10, | |
167 "Mound" => 11, | |
168 "Chunky" => 12, | |
169 "Puddle" => 13, | |
170 "Slab" => 14, | |
171 "Network" => 15, | |
172 "Pool" => 16, | |
173 "Hill" => 17, | |
174 "Mass" => 18, | |
175 "Tangle" => 19, | |
176 "Graveyard" => 20, | |
177 "Lump" => 21, | |
178 "Coil" => 22, | |
179 "Abyss" => 23, | |
180 "Pile" => 24, | |
181 "Torrent" => 25, | |
182 "Conflagration" => 26, | |
183 }, | |
184 19 => { | |
185 "heap" => 0, | |
186 "stick" => 1, | |
187 "pocket" => 2, | |
188 "hunk" => 3, | |
189 "shard" => 4, | |
190 "string" => 5, | |
191 "stone" => 6, | |
192 "slice" => 7, | |
193 "wisp" => 8, | |
194 "wad" => 9, | |
195 "clump" => 10, | |
196 "carcass" => 11, | |
197 "gob" => 12, | |
198 "strip" => 13, | |
199 "dough" => 14, | |
200 "ball" => 15, | |
201 "chunk" => 16, | |
202 "load" => 17, | |
203 "leaf" => 18, | |
204 "salt" => 19, | |
205 "pile" => 20, | |
206 "isotope" => 21, | |
207 "tusk" => 22, | |
208 "clod" => 23, | |
209 "lump" => 24, | |
210 "lode" => 25, | |
211 "piece" => 26, | |
212 "flame" => 27, | |
213 "stem" => 28, | |
214 "sphere" => 29, | |
215 "fragment" => 30, | |
216 "mineral" => 31, | |
217 "twig" => 32, | |
218 "stalk" => 33, | |
219 "crystal" => 34, | |
220 "log" => 35, | |
221 "reed" => 36, | |
222 "nugget" => 37, | |
223 "mix" => 38, | |
224 "mic" => 39, | |
225 "pulp" => 40, | |
226 "block" => 41, | |
227 "puddle" => 42, | |
228 "sliver" => 43, | |
229 "bulge" => 44, | |
230 }, | |
231 20 => { | |
232 "formed" => 0, | |
233 "stick" => 1, | |
234 "bundle" => 2, | |
235 "ellipsoid" => 3, | |
236 "pocket" => 4, | |
237 "brick" => 5, | |
238 "mold" => 6, | |
239 "gene" => 7, | |
240 "shard" => 8, | |
241 "form" => 9, | |
242 "wisp" => 10, | |
243 "isometric" => 11, | |
244 "cord" => 12, | |
245 "billot" => 13, | |
246 "bar" => 14, | |
247 "bolt" => 15, | |
248 "strip" => 16, | |
249 "ball" => 17, | |
250 "billit" => 18, | |
251 "chunk" => 19, | |
252 "octagon" => 20, | |
253 "cube" => 21, | |
254 "ingot" => 22, | |
255 "chip" => 23, | |
256 "casting" => 24, | |
257 "dean" => 25, | |
258 "piece" => 26, | |
259 "flame" => 27, | |
260 "billet" => 28, | |
261 "crafted" => 29, | |
262 "cut" => 30, | |
263 "pelt" => 31, | |
264 "strand" => 32, | |
265 "crystal" => 33, | |
266 "log" => 34, | |
267 "reed" => 35, | |
268 "tetragonal" => 36, | |
269 "sheet" => 37, | |
270 "strap" => 38, | |
271 "reem" => 39, | |
272 "length" => 40, | |
273 "sculpted" => 41, | |
274 "block" => 42, | |
275 "hexagonal" => 43, | |
276 "product" => 44, | |
277 "shaped" => 45, | |
278 "puddle" => 46, | |
279 "fibres" => 47, | |
280 "slab" => 48, | |
281 "flare" => 49, | |
282 }, | |
283 }; | |
284 | |
285 my $transFixes = | |
286 { | |
287 16 => { | |
288 "Organic" => 0, | |
289 "Cloth" => 1, | |
290 "Paper" => 2, | |
291 "Bone" => 3, | |
292 "Metal" => 4, | |
293 "Wood" => 5, | |
294 "Stone" => 6, | |
295 "Alloy" => 7, | |
296 "Inorganic" => 8, | |
297 "Glass" => 9, | |
298 "Gem" => 10, | |
299 }, | |
300 }; | |
301 | |
302 | |
303 my $revTransTable = {}; | |
304 | |
305 my @fieldInfo = ( | |
306 { "i" => 1, "f" => "name", "w" => 15, "l" => "Name", "s" => "Name" }, | |
307 { "i" => 2, "f" => "weight", "w" => 10, "l" => "Weight", "s" => "Weight" }, | |
308 | |
309 { "i" => 3, "f" => "sturdyness", "w" => 18, "l" => "Sturdyness", "s" => "Sturdyness" }, | |
310 { "i" => 4, "f" => "magic", "w" => 15, "l" => "Magic", "s" => "Magic" }, | |
311 { "i" => 5, "f" => "flammability", "w" => 18, "l" => "Flammability", "s" => "Flammability" }, | |
312 { "i" => 6, "f" => "warmth", "w" => 11, "l" => "Warmth", "s" => "Warmth" }, | |
313 { "i" => 7, "f" => "toxicity", "w" => 18, "l" => "Toxicity", "s" => "Toxicity" }, | |
314 { "i" => 8, "f" => "resistivity", "w" => 9, "l" => "Resistivity", "s" => "Resist" }, | |
315 { "i" => 9, "f" => "malleability", "w" => 18, "l" => "Malleability", "s" => "Malleability" }, | |
316 { "i" => 10, "f" => "mentality", "w" => 18, "l" => "Mentality", "s" => "Mentality" }, | |
317 { "i" => 11, "f" => "reactivity", "w" => 18, "l" => "Reactivity", "s" => "Reactivity" }, | |
318 | |
319 { "i" => 12, "f" => "weapon_rarity", "w" => 15, "l" => "Weapon rarity", "s" => "Weapon rarity" }, | |
320 { "i" => 13, "f" => "armour_rarity", "w" => 15, "l" => "Armour rarity", "s" => "Armour rarity" }, | |
321 { "i" => 14, "f" => "value", "w" => 15, "l" => "Value", "s" => "Value" }, | |
322 { "i" => 15, "f" => "rarity", "w" => 12, "l" => "Rarity", "s" => "Rarity" }, | |
323 { "i" => 16, "f" => "type", "w" => 6, "l" => "Type", "s" => "Type" }, | |
324 { "i" => 17, "f" => "found_nature", "w" => 3, "l" => "Found in Nature", "s" => "FN?" }, | |
325 { "i" => 18, "f" => "lode_name", "w" => 13, "l" => "Lode name", "s" => "Lode name" }, | |
326 { "i" => 19, "f" => "raw_names", "w" => 35, "l" => "Raw names", "s" => "Raw names" }, | |
327 { "i" => 20, "f" => "refined_names", "w" => 35, "l" => "Refined names", "s" => "Refined names" }, | |
328 ); | |
329 | |
330 | |
331 sub ptranslate($$) | |
332 { | |
333 if (defined($$revTransTable{$_[0]}{$_[1]})) | |
334 { | |
335 return $$revTransTable{$_[0]}{$_[1]}; | |
336 } | |
337 else | |
338 { | |
339 die("$0: Unknown REVERSE translation table type ".$_[0]." : ".$_[1]."\n"); | |
340 } | |
341 } | |
342 | |
343 | |
344 sub pt($$) | |
345 { | |
346 return ptranslate($_[1], $_[0]{$_[1]}) | |
347 } | |
348 | |
349 | |
350 sub pta($$) | |
351 { | |
352 return map { ptranslate($_[1], $_) } @{$_[0]{$_[1]}}; | |
353 } | |
354 | |
355 | |
356 sub mtranslate($$) | |
357 { | |
358 if (defined($$transTable{$_[0]}{$_[1]})) | |
359 { | |
360 return $$transTable{$_[0]}{$_[1]}; | |
361 } | |
362 else | |
363 { | |
364 die("$0: Unknown translation table type ".$_[0]." : ".$_[1]."\n"); | |
365 } | |
366 } | |
367 | |
368 | |
369 ### | |
370 ### Check options | |
371 ### | |
372 my $opt_mode = ""; | |
373 my $opt_strip = 1; | |
374 | |
375 while (defined(my $arg = shift)) | |
376 { | |
377 if ($arg eq "-csv") { $opt_mode = $arg; } | |
378 elsif ($arg eq "-tf") { $opt_mode = $arg; } | |
379 elsif ($arg eq "-names") { $opt_mode = $arg; } | |
380 elsif ($arg eq "-perl") { $opt_mode = $arg; } | |
381 elsif ($arg eq "-php") { $opt_mode = $arg; } | |
382 elsif ($arg eq "-table") { $opt_mode = $arg; } | |
383 elsif ($arg eq "-dumpfiles") { $opt_mode = $arg; $opt_strip = 0; } | |
384 elsif ($arg eq "-dump") { $opt_mode = $arg; $opt_strip = 0; } | |
385 else | |
386 { | |
387 die("Invalid option '$arg'\n"); | |
388 } | |
389 } | |
390 | |
391 | |
392 ### | |
393 ### Parse input materials | |
394 ### | |
395 my $data = {}; | |
396 my $name = ""; | |
397 my $nline = 0; | |
398 while (defined(my $line = <STDIN>)) | |
399 { | |
400 $nline++; | |
401 chomp($line); | |
402 if ($line =~ /MATERIAL STATS \(([a-z ]+)\)\:/) | |
403 { | |
404 $name = $1; | |
405 } | |
406 elsif ($line =~ /^Weight \(g\/l\)\: *\(([a-z. ]+)\) *Sturdyness\: *\(([a-z. ]+)\)/) | |
407 { | |
408 $$data{$name}{2} = mtranslate(2, $1); | |
409 $$data{$name}{3} = mtranslate(3, $2); | |
410 } | |
411 elsif ($line =~ /^Magic\: *\(([a-z. ]+)\) *Flammability\: *\(([a-z. ]+)\)/) | |
412 { | |
413 $$data{$name}{4} = mtranslate(4, $1); | |
414 $$data{$name}{5} = mtranslate(5, $2); | |
415 } | |
416 elsif ($line =~ /^Warmth\: *\(([a-z. ]+ outfit)\) *Toxicity\: *\(([a-z. ]+)\)/) | |
417 { | |
418 my ($tmp1, $tmp2) = ($1, $2); | |
419 $tmp1 =~ s/ +outfit$//; | |
420 $$data{$name}{6} = mtranslate(6, $tmp1); | |
421 $$data{$name}{7} = mtranslate(7, $tmp2); | |
422 } | |
423 elsif ($line =~ /^Warmth\: *\(([a-z. ]+)\) *Toxicity\: *\(([a-z. ]+)\)/) | |
424 { | |
425 my ($tmp1, $tmp2) = ($1, $2); | |
426 $$data{$name}{6} = mtranslate(6, $1); | |
427 $$data{$name}{7} = mtranslate(7, $2); | |
428 } | |
429 elsif ($line =~ /^Resistivity\: *\(([a-z. ]+ insulator)\) *Malleability\: *\(([a-z. ]+)\)?/) | |
430 { | |
431 my ($tmp1, $tmp2) = ($1, $2); | |
432 $tmp1 =~ s/ +insulator$//; | |
433 $$data{$name}{8} = mtranslate(8, $tmp1); | |
434 $$data{$name}{9} = mtranslate(9, $tmp2); | |
435 } | |
436 elsif ($line =~ /^Resistivity\: *\(([a-z. ]+)\) *Malleability\: *\(([a-z. ]+)\)?/) | |
437 { | |
438 $$data{$name}{8} = mtranslate(8, $1); | |
439 $$data{$name}{9} = mtranslate(9, $2); | |
440 } | |
441 elsif ($line =~ /^Mentality\: *\(([a-z. ]+)\) *Reactivity\: *\(([a-z. ]+)\)?/) | |
442 { | |
443 $$data{$name}{10} = mtranslate(10, $1); | |
444 $$data{$name}{11} = mtranslate(11, $2); | |
445 } | |
446 elsif ($line =~ /^Weapon rarity\: *\(([a-z. ]+)\) *Armour rarity\: *\(([a-z. ]+)\)/) | |
447 { | |
448 $$data{$name}{12} = mtranslate(12, $1); | |
449 $$data{$name}{13} = mtranslate(13, $2); | |
450 } | |
451 elsif ($line =~ /^Value \(gp\/kg\)\: *\(([a-z -]+)\) *Rarity\: *\(([a-z. ]+)\)/) | |
452 { | |
453 $$data{$name}{14} = mtranslate(14, $1); | |
454 $$data{$name}{15} = mtranslate(15, $2); | |
455 } | |
456 elsif ($line =~ /^Article\: *([a-z. ]+) *Type: *([A-Za-z]+)/) | |
457 { | |
458 my ($tmp1, $tmp2) = ($1, $2); | |
459 $tmp1 =~ s/ *$//; | |
460 | |
461 $$data{$name}{"article"} = $tmp1; | |
462 $$data{$name}{16} = mtranslate(16, $tmp2); | |
463 } | |
464 elsif ($line =~ /^Found nature\: *(Yes|No) *Lode name\: *([A-Za-z]+)/) | |
465 { | |
466 $$data{$name}{17} = mtranslate(17, $1); | |
467 $$data{$name}{18} = mtranslate(18, $2); | |
468 } | |
469 elsif ($line =~ /^Raw names\: *([a-z, ]+[a-z])/) | |
470 { | |
471 my $tmp = $1; | |
472 @{$$data{$name}{19}} = map { mtranslate(19, $_) } split(/, */, $tmp); | |
473 } | |
474 elsif ($line =~ /^Refined names\: *([a-z, ]+[a-z])/) | |
475 { | |
476 my $tmp = $1; | |
477 @{$$data{$name}{20}} = map { mtranslate(20, $_) } split(/, */, $tmp); | |
478 } | |
479 elsif ($line =~ /^-+$|^\s*$/) | |
480 { | |
481 # Ignore empty lines, and -* | |
482 } | |
483 else | |
484 { | |
485 print STDERR "Unparsed line #".$nline.": ".$line."\n"; | |
486 } | |
487 } | |
488 | |
489 # Fix material types | |
490 foreach my $mid (keys %$transFixes) | |
491 { | |
492 $$transTable{$mid} = $$transFixes{$mid}; | |
493 } | |
494 | |
495 # Sort the entries by name | |
496 my @entries = sort { $a cmp $b } keys %$data; | |
497 | |
498 # Sort materials by type | |
499 my %matByType = (); | |
500 foreach my $name (@entries) | |
501 { | |
502 push(@{$matByType{$$data{$name}{16}}}, lc($name)); | |
503 } | |
504 | |
505 # List of known types | |
506 my $matTypes = $$transTable{16}; | |
507 | |
508 # Create reverse translation table | |
509 foreach my $mid (keys %$transTable) | |
510 { | |
511 foreach my $mkey (keys %{$$transTable{$mid}}) | |
512 { | |
513 $$revTransTable{$mid}{$$transTable{$mid}{$mkey}} = $mkey; | |
514 } | |
515 } | |
516 | |
517 | |
518 sub get_datastr($$) | |
519 { | |
520 my ($name, $i) = @_; | |
521 return $name if ($i == 1); | |
522 return join(", ", pta($$data{$name}, $i)) if (ref($$data{$name}{$i}) eq "ARRAY"); | |
523 return pt($$data{$name}, $i); | |
524 } | |
525 | |
526 | |
527 sub print_material_long($$$) | |
528 { | |
529 my ($file, $mat, $name) = @_; | |
530 | |
531 printf $file | |
532 "MATERIAL STATS (".$name."):\n". | |
533 "-------------------------------------------------------------------------------\n". | |
534 "Weight (g/l): %-17s Sturdyness: (%s)\n". | |
535 "Magic: %-17s Flammability: (%s)\n", | |
536 "(".pt($mat, 2).")", pt($mat, 3), | |
537 "(".pt($mat, 4).")", pt($mat, 5); | |
538 | |
539 printf $file | |
540 "Warmth: %-17s Toxicity: (%s)\n". | |
541 "Resistivity: %-17s Malleability: (%s)\n", | |
542 "(".pt($mat, 6).")", pt($mat, 7), | |
543 "(".pt($mat, 8).")", pt($mat, 9); | |
544 | |
545 printf $file | |
546 "Mentality: %-17s Reactivity: (%s)\n". | |
547 "Weapon rarity: %-17s Armour rarity: (%s)\n". | |
548 "Value (gp/kg): %-17s Rarity: (%s)\n", | |
549 "(".pt($mat, 10).")", pt($mat, 11), | |
550 "(".pt($mat, 12).")", pt($mat, 13), | |
551 "(".pt($mat, 14).")", pt($mat, 15); | |
552 | |
553 printf $file | |
554 "Article: %-17s Type: %s\n". | |
555 "Found nature: %-17s Lode name: %s\n". | |
556 "Raw names: %s\n". | |
557 "Refined names: %s\n", | |
558 $$mat{"article"}, pt($mat, 16), | |
559 pt($mat, 17), pt($mat, 18), | |
560 join(", ", pta($mat, 19)), | |
561 join(", ", pta($mat, 20)); | |
562 } | |
563 | |
564 | |
565 ### | |
566 ### Output functionality begins here | |
567 ### | |
568 | |
569 ### | |
570 ### Print material names only, one per line | |
571 ### | |
572 if ($opt_mode eq "-names") | |
573 { | |
574 foreach my $name (@entries) | |
575 { | |
576 print $name."\n"; | |
577 } | |
578 } | |
579 ### | |
580 ### Print CSV format list | |
581 ### | |
582 elsif ($opt_mode eq "-csv") | |
583 { | |
584 foreach my $name (@entries) | |
585 { | |
586 print join(";", map { get_datastr($name, $$_{"i"}) } @fieldInfo)."\n"; | |
587 } | |
588 } | |
589 ### | |
590 ### Dump long-format material data to individual files | |
591 ### | |
592 elsif ($opt_mode eq "-dumpfiles") | |
593 { | |
594 foreach my $name (@entries) | |
595 { | |
596 my $filename = $name.".mat"; | |
597 $filename =~ s/[^a-z0-9]/_/g; | |
598 open(OUTFILE, ">", $filename) or die("Error opening file '".$filename."' ".$!."\n"); | |
599 print_material_long(\*OUTFILE, $$data{$name}, $name); | |
600 close(OUTFILE); | |
601 } | |
602 } | |
603 ### | |
604 ### Dump long-format material data to stdout | |
605 ### | |
606 elsif ($opt_mode eq "-dump") | |
607 { | |
608 foreach my $name (@entries) | |
609 { | |
610 print "\n". | |
611 "-------------------------------------------------------------------------------\n"; | |
612 print_material_long(\*STDOUT, $$data{$name}, $name); | |
613 } | |
614 } | |
615 ### | |
616 ### Print TinyFugue script variables | |
617 ### | |
618 elsif ($opt_mode eq "-tf") | |
619 { | |
620 print "/set gmat_names=".join(' ', map { my $tmp = $_; $tmp =~ s/ /_/g; $tmp } @entries)."\n"; | |
621 print "/set gmat_ntypes=".join(' ', map(lc(ptranslate(16, $$data{$_}{16})), @entries))."\n"; | |
622 print "/set gmat_types=".join(' ', sort map(lc(ptranslate(16, $_)), values %$matTypes))."\n"; | |
623 | |
624 foreach my $mkey (sort keys %$matTypes) | |
625 { | |
626 my $type = $$matTypes{$mkey}; | |
627 print "/set gmat_type_". | |
628 lc(ptranslate(16, $type))."=". | |
629 join('|', @{$matByType{$type}})."\n"; | |
630 } | |
631 } | |
632 ### | |
633 ### Print a nice ASCII table | |
634 ### | |
635 elsif ($opt_mode eq "-table") | |
636 { | |
637 my $str = join("", | |
638 map { | |
639 sprintf("%-".$$_{"w"}."s | ", $$_{"s"}) | |
640 } @fieldInfo); | |
641 | |
642 print $str."\n"; | |
643 $str =~ s/[^|]/-/g; | |
644 $str =~ s/\|/+/g; | |
645 print $str."\n"; | |
646 | |
647 foreach my $name (@entries) | |
648 { | |
649 print join("", map { | |
650 sprintf("%-".$$_{"w"}."s | ", get_datastr($name, $$_{"i"})); | |
651 } @fieldInfo)."\n"; | |
652 } | |
653 } | |
654 ### | |
655 ### Dump a Perl module with material data | |
656 ### | |
657 elsif ($opt_mode eq "-perl") | |
658 { | |
659 $Data::Dumper::Indent = 0; | |
660 $Data::Dumper::Useqq = 1; | |
661 $Data::Dumper::Purity = 1; | |
662 | |
663 print | |
664 "package Materials;\n". | |
665 "require Exporter;\n". | |
666 "\@ISA = qw(Exporter);\n". | |
667 "\n". | |
668 "\@EXPORT = qw(matTable transTable revTransTable matByType matTypes);\n". | |
669 "\n"; | |
670 | |
671 my $dumper = Data::Dumper->new([$data], ["matTable"]); | |
672 print "our ".$dumper->Dump()."\n\n"; | |
673 | |
674 $dumper = Data::Dumper->new([\%$transTable], ["transTable"]); | |
675 print "our ".$dumper->Dump()."\n\n"; | |
676 | |
677 $dumper = Data::Dumper->new([\%$revTransTable], ["revTransTable"]); | |
678 print "our ".$dumper->Dump()."\n\n"; | |
679 | |
680 $dumper = Data::Dumper->new([\%matByType], ["matByType"]); | |
681 print "our ".$dumper->Dump()."\n\n"; | |
682 | |
683 $dumper = Data::Dumper->new([\%$matTypes], ["matTypes"]); | |
684 print "our ".$dumper->Dump()."\n\n"; | |
685 | |
686 print "1;\n"; | |
687 } | |
688 ### | |
689 ### Dump PHP array format data | |
690 ### | |
691 elsif ($opt_mode eq "-php") | |
692 { | |
693 print "<?php\n". | |
694 "\$matTransNames = [". | |
695 join(",", map { "\"".$$_{"l"}."\"" } @fieldInfo). | |
696 "];\n\n". | |
697 "\$matTransTable = [\n"; | |
698 foreach my $i (sort { $a <=> $b } keys %$transTable) | |
699 { | |
700 print " ["; | |
701 foreach my $j (sort { $$transTable{$i}{$a} <=> $$transTable{$i}{$b} } keys %{$$transTable{$i}}) | |
702 { | |
703 print $$transTable{$i}{$j}; | |
704 $j =~ s/very /v./; | |
705 $j =~ s/incredibly /incr./; | |
706 print " => \"".$j."\"," | |
707 } | |
708 print "],\n"; | |
709 } | |
710 print "];\n\n". | |
711 "\$matDataTable = [\n"; | |
712 foreach my $name (sort { $a cmp $b } keys %$data) | |
713 { | |
714 print " \"$name\" => ["; | |
715 for (my $qn = 1; $qn < scalar(@fieldInfo); $qn++) | |
716 { | |
717 my $i = $fieldInfo[$qn]{"i"}; | |
718 if (ref($$data{$name}{$i}) eq "ARRAY") | |
719 { | |
720 print "[".join(",", @{$$data{$name}{$i}})."],"; | |
721 } | |
722 else | |
723 { | |
724 print $$data{$name}{$i}.", "; | |
725 } | |
726 } | |
727 print "],\n"; | |
728 } | |
729 print "];\n?>\n"; | |
730 } |