#!/usr/bin/perl # 拡張子を .pl に変更してください use strict; open(IN, 'starforc.2') or die($!); binmode IN; read(IN, $_, 0x4000); close(IN); my(@rom) = unpack('C*', $_); my($addr) = 0x4977 - 0x4000; my($recSize) = 6; my(@params, @parRange); readData(); for (;;) { my(@iy); my($addrt) = $addr + $recSize - 1; my(@dat) = @rom[$addr .. $addrt]; (!$dat[0]) && (!$dat[1]) and last; my($type) = $dat[1] & 0x1f; if ($type !~ /^(17|18|21)$/) { my($delay, $wait, $xpos, $interval, $num, $bulletNum, $bulletDelay, $bulletInterval, $cycle, $speed); $type = (0..16, 19, 20)[r(19)]; for (my $i = 0; $i < scalar(@params); $i++) { my($range) = $parRange[$type]->[$i]; my($param) = $range->[r(scalar(@$range))]; eval "\$$params[$i] = $param;"; } $dat[0] = ($wait & 0xf) | ($delay << 4); $dat[1] = ($type & 0x1f) | ($xpos << 5); $dat[2] = $interval; $dat[3] = ($bulletNum & 0xf) | ($num << 4); $dat[4] = ($bulletInterval & 0xf) | ($bulletDelay << 4); $dat[5] = ($cycle & 3) | ($speed << 2); @rom[$addr .. $addrt] = @dat; } $addr += $recSize; } #printf("%X\n", $addr); open(OUT, '>', 'STARFORC.2.new') or die($!); binmode OUT; print OUT pack('C*', @rom); close OUT; #============================================================================ sub r { return int(rand($_[0])); } #============================================================================ sub readData { $_ = ; chomp; (undef, @params) = split /\s+/; my($type) = 0; while () { my($u, @range) = split /\s+/; $parRange[$type] = [map([eval "$_"], @range)]; $type++; } if (0) { foreach (@parRange) { print join "\t", map(join('.', @$_), @$_); print "\n"; } } } # xpos: 0-3が ランダム, 自機と反対側, 最初の自機位置と反対側, 順番 に対応 # cycle: # Meeuwsの場合横方向の速度 # Quiri, Amara, Patartaの場合向かってくる速さ # speed: # Rivaの場合Y方向の振動中心 (上位3bit) # Amaraの場合向かってくる場所 (上位3bit -00:先頭, -01:真ん中, -1-:下) __END__ type wait delay xpos interval num bulletNum bulletDelay bulletInterval speed cycle Zoff 15 1 0,1 4..24 5..15 15 1 1 4..60 0..3 Galli 15 1 0,1 4..24 5..15 15 1 1 4..60 0..3 Lope 15 1 0,1 4..24 5..15 15 1 1 4..16 0..3 Riva 15 1 0,1 4..24 5..15 15 1 1 4..60 0..3 Faillar 15 1 0,1 4..24 5..15 15 1 1 4..60 0..3 Meeuws 15 1 0,1 4..24 5..15 15 1 1 32..60 0..3 Sultan 15 1 0,1 4..24 5..15 15 1 1 4..60 0..3 Quiri 15 1 0 4..24 5..15 15 1 1 16..60 3 Amara 15 1 0 4..24 5..15 15 1 1 16..60 3 Patarta 15 1 0,1 4..24 5..15 15 1 1 16..32 3 Neira 15 1 0,1 4..24 5..15 15 1 1 20..32 0..3 SuperSonic 15 1 0 4..24 5..15 15 1 1 60..255 3 Gadoha 15 1 0,1 4..24 5..15 15 1 1 32..60 0..3 Ettori 15 1 0,1 4..24 5..15 15 1 1 8..24 0..3 Titta 15 1 0,1 4..24 5..15 15 1 1 32..60 0..3 Girard 15 1 2 4..24 1 15 1 1 4..32 3 Topper 15 1 0 4..24 5..15 15 1 1 8..24 3 Larios 1 1 0 0 1 15 1 1 0 0 Splitta 1 1 0 0 1 15 1 1 0 0 Guiler 15 1 2 24..48 4..8 15 1 1 8..24 0..3 Obsess 15 1 0 4..24 5..15 15 1 1 0 0 Calderon 15 1 0 0 1 15 1 1 4 3