From be83045f108e6bada8bdbd32d6ed5fa00de60f7a Mon Sep 17 00:00:00 2001 From: Mischa Poslawsky Date: Sun, 1 Mar 2009 17:18:24 +0100 Subject: [PATCH] parse-wormedit: detect common finish code in 86s data --- parse-wormedit | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/parse-wormedit b/parse-wormedit index 8136c58..4fd22e7 100755 --- a/parse-wormedit +++ b/parse-wormedit @@ -329,9 +329,39 @@ sub read { } if ($variant eq 'single') { - $data->{finish}->{code} = substr( - delete($data->{leveldata}), $offset, -5 * $slots + $offset++; + $data->{finish}->{code} = + my $code = substr delete($data->{leveldata}), $offset, -5*$slots; + + my %FINISHCODE = ( + 0 => chr 0xC9, # ret + 1 => join('', + chr 0x21, # ld hl, MESSAGE + pack('v', $offsetbase + $offset + 9), + (map {chr} + 0xCD, 0x37, 0x4A, # call _puts + 0xC3, 0xAA, 0x55, # jp _getkey + ), + ), + 2 => join('', + (map {chr} + 0x21, 0, 0x1C, # ld hl, $POS + 0x22, 0x7C, 0xC3, # ld (_penCol), hl + 0x21, # ld hl, MESSAGE + ), + pack('v', $offsetbase + $offset + 15), + (map {chr} + 0xCD, 0xA5, 0x4A, # call _vputs + 0xC3, 0xAA, 0x55, # jp _getkey + ), + ), ); + while (my ($finish, $match) = each %FINISHCODE) { + $match eq substr $code, 0, length $match or next; + $data->{finish}->{type} = $finish or last; + $data->{finish}->{message} = unpack 'Z*', substr($code, length $match); + last; + } } } -- 2.30.0