[Scummvm-git-logs] scummvm-tools master -> ce0a9b81ac741b5b12248ac1eedfa7b9c0b2eb02
sev-
sev at scummvm.org
Wed May 2 22:15:40 CEST 2018
This automated email contains information about 29 new commits which have been
pushed to the 'scummvm-tools' repo located at https://github.com/scummvm/scummvm-tools .
Summary:
8a5e63454a TOOLS: PRINCE: Preparations for PO file generation
953e3fde8f TOOLS: PRINCE: Put POT file contents into memory before generation
76c7b1e489 TOOLS: PRINCE: Generate language-specific PO file
bd7787d7d9 TOOLS: PRINCE: Count miss/extra statistics
2764de78ac TOOLS: PRINCE: Read talk ids in POT generation
4b9b5068f3 TOOLS: PRINCE: Use text ids in POT generation
7b8681521a TOOLS: PRINCE: Initial code for deprince
19280448e7 TOOLS: PRINCE: Split out decompressor class
24ba29a05a TOOLS: PRINCE: Read rooms in decompiler
000dfc955a TOOLS: PRINCE: decompiler prints opcodes
e154982666 TOOLS: PRINCE: Print flag names in decompiler
9693e24bdf TOOLS: PRINCE: Added support for location table in dexompiler
661e2fc50b TOOLS: PRINCE: Implemented data marking in decompiler
fd31295798 TOOLS: PRINCE: Read two more fields in rooms
c33f3d97a6 TOOLS: PRINCE: Dump room contents in disassembly
defe4355dc TOOLS: PRINCE: Parse whole game definition
d487887b5e TOOLS: PRINCE: Decompile all immediate scripts
7462c33857 TOOLS: PRINCE: Initial code for two-pass decompilation
634bf1d6b8 TOOLS: PRINCE: Decompile in 2 passes
70e4267290 TOOLS: PRINCE: Print out not decompiled data
39f44d8710 TOOLS: PRINCE: Fix whole script disassembly
311b48cc78 TOOLS: PRINCE: Improve decompilation output
eda9c15966 TOOLS: PRINCE: Located more script data
3e6a124d06 TOOLS: PRINCE: More bytes were mapped
1f95b177b8 TOOLS: PRINCE: Parse backAnim in decompiler
ad42267fdd TOOLS: PRINCE: Implemented special decompilation for O_SETHEROANIM
c49fd5d036 TOOLS: PRINCE: Special decompilation for O_PUTBACKANIM
bd670bfaf2 TOOLS: PRINCE: Print out strings in decompilation
ce0a9b81ac TOOLS: PRINCE: Fix O_LOADPATH
Commit: 8a5e63454acfab6fc28b7ade4017c184c30dbc33
https://github.com/scummvm/scummvm-tools/commit/8a5e63454acfab6fc28b7ade4017c184c30dbc33
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-04-30T11:37:54+02:00
Commit Message:
TOOLS: PRINCE: Preparations for PO file generation
Changed paths:
engines/prince/gen-po.pl
diff --git a/engines/prince/gen-po.pl b/engines/prince/gen-po.pl
index 7ef2e9a..9449b04 100644
--- a/engines/prince/gen-po.pl
+++ b/engines/prince/gen-po.pl
@@ -4,24 +4,25 @@
use utf8;
-sub process_inv($);
-sub process_varia($);
-sub process_mob($);
-sub process_credits($);
-sub process_talk($);
+sub process_inv($$);
+sub process_varia($$);
+sub process_mob($$);
+sub process_credits($$);
+sub process_talk($$);
-sub process_talkWithDialog($$);
-sub process_talkNoDialog($$);
+sub process_talkWithDialog($$$);
+sub process_talkNoDialog($$$);
use open qw/:std :utf8/;
-if ($#ARGV != 0) {
- die "Usage: $0 <language-code>";
+if ($#ARGV != 1) {
+ die "Usage: $0 <language-code> <directory-to-polish>";
}
-my %data;
+our %data;
-my $lang = $ARGV[0];
+our $lang = $ARGV[0];
+my $poldir = $ARGV[1];
print <<EOF;
# The Prince and the Coward lanugage file
@@ -45,15 +46,16 @@ msgstr ""
"X-Generator: Weblate 2.9\\n"
EOF
-process_inv "invtxt.txt.out";
-process_varia "variatxt.txt.out";
-process_mob "mob.txt.out";
-process_credits "credits.txt.out";
-process_talk "talktxt.txt.out";
+process_inv $lang, "invtxt.txt.out";
+process_varia $lang, "variatxt.txt.out";
+process_mob $lang, "mob.txt.out";
+process_credits $lang, "credits.txt.out";
+process_talk $lang, "talktxt.txt.out";
exit;
-sub process_inv($) {
+sub process_inv($$) {
+ my $lang = shift;
my $file = shift;
open(*IN, $file) or die "Cannot open file $file: $!";
@@ -65,7 +67,7 @@ sub process_inv($) {
/^([\d]+)\.\s+(.*)$/;
- $data{'invtxt.dat'}{$1} = $2;
+ $data{$lang}{'invtxt.dat'}{$1} = $2;
print <<EOF;
@@ -78,7 +80,8 @@ EOF
close IN;
}
-sub process_varia($) {
+sub process_varia($$) {
+ my $lang = shift;
my $file = shift;
open(*IN, $file) or die "Cannot open file $file: $!";
@@ -90,7 +93,7 @@ sub process_varia($) {
/^([\d]+)\.\s+(.*)$/;
- $data{'variatxt.dat'}{$1} = $2;
+ $data{$lang}{'variatxt.dat'}{$1} = $2;
print <<EOF;
@@ -103,7 +106,8 @@ EOF
close IN;
}
-sub process_mob($) {
+sub process_mob($$) {
+ my $lang = shift;
my $file = shift;
open(*IN, $file) or die "Cannot open file $file: $!";
@@ -126,7 +130,7 @@ sub process_mob($) {
$line++;
- $data{'mob.lst'}{$n} = $_;
+ $data{$lang}{'mob.lst'}{$n} = $_;
print <<EOF;
@@ -139,7 +143,8 @@ EOF
close IN;
}
-sub process_credits($) {
+sub process_credits($$) {
+ my $lang = shift;
my $file = shift;
open(*IN, $file) or die "Cannot open file $file: $!";
@@ -157,7 +162,7 @@ sub process_credits($) {
$str .= "\"$_\\n\"\n";
if ($line == 10) {
- $data{'credits.txt'}{$n} = $str;
+ $data{$lang}{'credits.txt'}{$n} = $str;
$n++;
$line = 0;
@@ -174,7 +179,7 @@ EOF
}
}
- $data{'credits.txt'}{$n} = $str;
+ $data{$lang}{'credits.txt'}{$n} = $str;
print <<EOF;
@@ -186,7 +191,8 @@ EOF
close IN;
}
-sub process_talk($) {
+sub process_talk($$) {
+ my $lang = shift;
my $file = shift;
open(*IN, $file) or die "Cannot open file $file: $!";
@@ -203,9 +209,9 @@ sub process_talk($) {
my $d = sprintf("%03d", $dialog);
if ($_ eq "\@DIALOGBOX_LINES:") {
- process_talkWithDialog($d, IN);
+ process_talkWithDialog($lang, $d, IN);
} elsif ($_ eq "\@NORMAL_LINES:") {
- process_talkNoDialog($d, IN);
+ process_talkNoDialog($lang, $d, IN);
}
$dialog++;
@@ -215,7 +221,8 @@ sub process_talk($) {
}
-sub process_talkWithDialog($$) {
+sub process_talkWithDialog($$$) {
+ my $lang = shift;
my $dialog = shift;
my $in = shift;
@@ -240,7 +247,7 @@ sub process_talkWithDialog($$) {
last; # Break
} else {
$line++;
- $data{$fname}{$line} = "$s$_";
+ $data{$lang}{$fname}{$line} = "$s$_";
print <<EOF;
#: $fname:$line
@@ -274,7 +281,7 @@ EOF
$line++;
} else {
my $n = sprintf("%d%02d", $box, $line);
- $data{$fname}{$n} = "$s$_";
+ $data{$lang}{$fname}{$n} = "$s$_";
print <<EOF;
#: $fname:$n
@@ -335,7 +342,7 @@ EOF
my $n = sprintf("%d%02d", 1000 + $box, $line);
if ($line) {
- $data{$fname}{$n} = "$s";
+ $data{$lang}{$fname}{$n} = "$s";
print <<EOF;
#: $fname:$n
@@ -351,7 +358,8 @@ EOF
}
}
-sub process_talkNoDialog($$) {
+sub process_talkNoDialog($$$) {
+ my $lang = shift;
my $dialog = shift;
my $in = shift;
@@ -375,7 +383,7 @@ sub process_talkNoDialog($$) {
last; # Break
} else {
$line++;
- $data{$fname}{$line} = "$s$_";
+ $data{$lang}{$fname}{$line} = "$s$_";
print <<EOF;
#: $fname:$line
Commit: 953e3fde8f22dfadfed8f446c749841a5a1b253a
https://github.com/scummvm/scummvm-tools/commit/953e3fde8f22dfadfed8f446c749841a5a1b253a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-04-30T17:53:54+02:00
Commit Message:
TOOLS: PRINCE: Put POT file contents into memory before generation
Changed paths:
engines/prince/gen-po.pl
diff --git a/engines/prince/gen-po.pl b/engines/prince/gen-po.pl
index 9449b04..7a6f78a 100644
--- a/engines/prince/gen-po.pl
+++ b/engines/prince/gen-po.pl
@@ -46,11 +46,32 @@ msgstr ""
"X-Generator: Weblate 2.9\\n"
EOF
-process_inv $lang, "invtxt.txt.out";
-process_varia $lang, "variatxt.txt.out";
-process_mob $lang, "mob.txt.out";
process_credits $lang, "credits.txt.out";
process_talk $lang, "talktxt.txt.out";
+process_inv $lang, "invtxt.txt.out";
+process_mob $lang, "mob.txt.out";
+process_varia $lang, "variatxt.txt.out";
+
+for my $f (sort keys $data{$lang}) {
+ for my $n (sort {$a<=>$b} keys $data{$lang}{$f}) {
+ if (index($data{$lang}{$f}{$n}, "\\n") != -1) { # Multiline
+ print <<EOF;
+
+#: $f:$n
+msgid ""
+$data{$lang}{$f}{$n}
+msgstr ""
+EOF
+ } else {
+ print <<EOF;
+
+#: $f:$n
+msgid "$data{$lang}{$f}{$n}"
+msgstr ""
+EOF
+ }
+ }
+}
exit;
@@ -67,14 +88,7 @@ sub process_inv($$) {
/^([\d]+)\.\s+(.*)$/;
- $data{$lang}{'invtxt.dat'}{$1} = $2;
-
- print <<EOF;
-
-#: invtxt.txt:$1
-msgid "$2"
-msgstr ""
-EOF
+ $data{$lang}{'invtxt.txt'}{$1} = $2;
}
close IN;
@@ -93,14 +107,7 @@ sub process_varia($$) {
/^([\d]+)\.\s+(.*)$/;
- $data{$lang}{'variatxt.dat'}{$1} = $2;
-
- print <<EOF;
-
-#: variatxt.txt:$1
-msgid "$2"
-msgstr ""
-EOF
+ $data{$lang}{'variatxt.txt'}{$1} = $2;
}
close IN;
@@ -131,13 +138,6 @@ sub process_mob($$) {
$line++;
$data{$lang}{'mob.lst'}{$n} = $_;
-
- print <<EOF;
-
-#: mob.lst:$n
-msgid "$_"
-msgstr ""
-EOF
}
close IN;
@@ -162,32 +162,15 @@ sub process_credits($$) {
$str .= "\"$_\\n\"\n";
if ($line == 10) {
- $data{$lang}{'credits.txt'}{$n} = $str;
-
$n++;
+ $data{$lang}{'credits.txt'}{$n} = $str;
$line = 0;
-
- print <<EOF;
-
-#: credits.txt:$n
-msgid ""
-$str
-msgstr ""
-EOF
-
$str = "";
}
}
+ $n++;
$data{$lang}{'credits.txt'}{$n} = $str;
-
- print <<EOF;
-
-#: credits.txt:$n
-msgid ""
-${str}msgstr ""
-EOF
-
close IN;
}
@@ -248,13 +231,6 @@ sub process_talkWithDialog($$$) {
} else {
$line++;
$data{$lang}{$fname}{$line} = "$s$_";
- print <<EOF;
-
-#: $fname:$line
-msgid "$s$_"
-msgstr ""
-EOF
-
$s = "";
}
}
@@ -282,13 +258,6 @@ EOF
} else {
my $n = sprintf("%d%02d", $box, $line);
$data{$lang}{$fname}{$n} = "$s$_";
- print <<EOF;
-
-#: $fname:$n
-msgid "$s$_"
-msgstr ""
-EOF
-
}
}
@@ -343,12 +312,6 @@ EOF
if ($line) {
$data{$lang}{$fname}{$n} = "$s";
- print <<EOF;
-
-#: $fname:$n
-msgid "$s"
-msgstr ""
-EOF
}
$s = $snew;
@@ -384,13 +347,6 @@ sub process_talkNoDialog($$$) {
} else {
$line++;
$data{$lang}{$fname}{$line} = "$s$_";
- print <<EOF;
-
-#: $fname:$line
-msgid "$s$_"
-msgstr ""
-EOF
-
$s = "";
}
}
Commit: 76c7b1e48994cb618c45e8e32bcf0f2c023d532c
https://github.com/scummvm/scummvm-tools/commit/76c7b1e48994cb618c45e8e32bcf0f2c023d532c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-04-30T18:07:05+02:00
Commit Message:
TOOLS: PRINCE: Generate language-specific PO file
Changed paths:
engines/prince/gen-po.pl
diff --git a/engines/prince/gen-po.pl b/engines/prince/gen-po.pl
index 7a6f78a..05f6d9c 100644
--- a/engines/prince/gen-po.pl
+++ b/engines/prince/gen-po.pl
@@ -52,24 +52,49 @@ process_inv $lang, "invtxt.txt.out";
process_mob $lang, "mob.txt.out";
process_varia $lang, "variatxt.txt.out";
-for my $f (sort keys $data{$lang}) {
- for my $n (sort {$a<=>$b} keys $data{$lang}{$f}) {
- if (index($data{$lang}{$f}{$n}, "\\n") != -1) { # Multiline
- print <<EOF;
+process_credits 'pl', "$poldir/credits.txt.out";
+process_talk 'pl', "$poldir/talktxt.txt.out";
+process_inv 'pl', "$poldir/invtxt.txt.out";
+process_mob 'pl', "$poldir/mob.txt.out";
+process_varia 'pl', "$poldir/variatxt.txt.out";
+
+for my $f (sort keys $data{'pl'}) {
+ for my $n (sort {$a<=>$b} keys $data{'pl'}{$f}) {
+ if (not exists $data{$lang}{$f}{$n}) {
+ warn "$lang:$f:$n does not exist";
+ $data{$lang}{$f}{$n} = "";
+ }
+
+ if (index($data{'pl'}{$f}{$n}, "\\n") != -1) { # Multiline
+ chomp $data{'pl'}{$f}{$n};
+ chomp $data{$lang}{$f}{$n};
+
+ print <<EOF;
#: $f:$n
msgid ""
-$data{$lang}{$f}{$n}
+$data{'pl'}{$f}{$n}
msgstr ""
+$data{$lang}{$f}{$n}
EOF
} else {
print <<EOF;
#: $f:$n
-msgid "$data{$lang}{$f}{$n}"
-msgstr ""
+msgid "$data{'pl'}{$f}{$n}"
+msgstr "$data{$lang}{$f}{$n}"
EOF
}
+
+ delete $data{$lang}{$f}{$n};
+ }
+}
+
+for my $f (sort keys $data{$lang}) {
+ for my $n (sort {$a<=>$b} keys $data{$lang}{$f}) {
+ if (not exists $data{$lang}{$f}{$n}) {
+ warn "$lang:$f:$n extra";
+ }
}
}
Commit: bd7787d7d9602e2a9009fa9a140573c139a5f65c
https://github.com/scummvm/scummvm-tools/commit/bd7787d7d9602e2a9009fa9a140573c139a5f65c
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-01T11:35:20+02:00
Commit Message:
TOOLS: PRINCE: Count miss/extra statistics
Changed paths:
engines/prince/gen-po.pl
diff --git a/engines/prince/gen-po.pl b/engines/prince/gen-po.pl
index 05f6d9c..12cfb70 100644
--- a/engines/prince/gen-po.pl
+++ b/engines/prince/gen-po.pl
@@ -58,11 +58,16 @@ process_inv 'pl', "$poldir/invtxt.txt.out";
process_mob 'pl', "$poldir/mob.txt.out";
process_varia 'pl', "$poldir/variatxt.txt.out";
+my $miss_tr = 0;
+my $extra_tr = 0;
+
for my $f (sort keys $data{'pl'}) {
for my $n (sort {$a<=>$b} keys $data{'pl'}{$f}) {
if (not exists $data{$lang}{$f}{$n}) {
warn "$lang:$f:$n does not exist";
$data{$lang}{$f}{$n} = "";
+
+ $miss_tr++;
}
if (index($data{'pl'}{$f}{$n}, "\\n") != -1) { # Multiline
@@ -92,12 +97,16 @@ EOF
for my $f (sort keys $data{$lang}) {
for my $n (sort {$a<=>$b} keys $data{$lang}{$f}) {
- if (not exists $data{$lang}{$f}{$n}) {
+ if (exists $data{$lang}{$f}{$n}) {
warn "$lang:$f:$n extra";
+
+ $extra_tr++;
}
}
}
+warn "Missing: $miss_tr Extra: $extra_tr" if ($miss_tr || $extra_tr);
+
exit;
sub process_inv($$) {
Commit: 2764de78ace1a26e094006e5764ec3a8710fcf30
https://github.com/scummvm/scummvm-tools/commit/2764de78ace1a26e094006e5764ec3a8710fcf30
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-01T11:43:37+02:00
Commit Message:
TOOLS: PRINCE: Read talk ids in POT generation
Changed paths:
engines/prince/gen-po.pl
diff --git a/engines/prince/gen-po.pl b/engines/prince/gen-po.pl
index 12cfb70..3a0e483 100644
--- a/engines/prince/gen-po.pl
+++ b/engines/prince/gen-po.pl
@@ -9,6 +9,7 @@ sub process_varia($$);
sub process_mob($$);
sub process_credits($$);
sub process_talk($$);
+sub process_talk_ids($$);
sub process_talkWithDialog($$$);
sub process_talkNoDialog($$$);
@@ -20,6 +21,7 @@ if ($#ARGV != 1) {
}
our %data;
+our %data_ids;
our $lang = $ARGV[0];
my $poldir = $ARGV[1];
@@ -51,12 +53,14 @@ process_talk $lang, "talktxt.txt.out";
process_inv $lang, "invtxt.txt.out";
process_mob $lang, "mob.txt.out";
process_varia $lang, "variatxt.txt.out";
+process_talk_ids $lang, "talktxt_ids.txt";
process_credits 'pl', "$poldir/credits.txt.out";
process_talk 'pl', "$poldir/talktxt.txt.out";
process_inv 'pl', "$poldir/invtxt.txt.out";
process_mob 'pl', "$poldir/mob.txt.out";
process_varia 'pl', "$poldir/variatxt.txt.out";
+process_talk_ids 'pl', "talktxt_ids.txt";
my $miss_tr = 0;
my $extra_tr = 0;
@@ -385,3 +389,24 @@ sub process_talkNoDialog($$$) {
}
}
}
+
+sub process_talk_ids($$) {
+ my $lang = shift;
+ my $file = shift;
+
+ open(*IN, $file) or die "Cannot open file $file: $!";
+
+ my $n = 0;
+
+ while (<IN>) {
+ chomp;
+
+ next if $_ eq 'talktxt_ids';
+
+ $data_ids{$lang}[$n] = $_;
+
+ $n++;
+ }
+
+ close IN;
+}
Commit: 4b9b5068f3f95d5a8d6c00dc6eee44b83303d63b
https://github.com/scummvm/scummvm-tools/commit/4b9b5068f3f95d5a8d6c00dc6eee44b83303d63b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-01T22:58:30+02:00
Commit Message:
TOOLS: PRINCE: Use text ids in POT generation
Changed paths:
engines/prince/gen-po.pl
diff --git a/engines/prince/gen-po.pl b/engines/prince/gen-po.pl
index 3a0e483..00a713c 100644
--- a/engines/prince/gen-po.pl
+++ b/engines/prince/gen-po.pl
@@ -48,19 +48,19 @@ msgstr ""
"X-Generator: Weblate 2.9\\n"
EOF
+process_talk_ids $lang, "talktxt_ids.txt";
process_credits $lang, "credits.txt.out";
process_talk $lang, "talktxt.txt.out";
process_inv $lang, "invtxt.txt.out";
process_mob $lang, "mob.txt.out";
process_varia $lang, "variatxt.txt.out";
-process_talk_ids $lang, "talktxt_ids.txt";
+process_talk_ids 'pl', "talktxt_ids.txt";
process_credits 'pl', "$poldir/credits.txt.out";
process_talk 'pl', "$poldir/talktxt.txt.out";
process_inv 'pl', "$poldir/invtxt.txt.out";
process_mob 'pl', "$poldir/mob.txt.out";
process_varia 'pl', "$poldir/variatxt.txt.out";
-process_talk_ids 'pl', "talktxt_ids.txt";
my $miss_tr = 0;
my $extra_tr = 0;
@@ -68,7 +68,7 @@ my $extra_tr = 0;
for my $f (sort keys $data{'pl'}) {
for my $n (sort {$a<=>$b} keys $data{'pl'}{$f}) {
if (not exists $data{$lang}{$f}{$n}) {
- warn "$lang:$f:$n does not exist";
+ warn "$lang:$f:$n missing";
$data{$lang}{$f}{$n} = "";
$miss_tr++;
@@ -227,7 +227,7 @@ sub process_talk($$) {
next if $_ eq 'talktxt.dat';
- my $d = sprintf("%03d", $dialog);
+ my $d = sprintf("%03d", $data_ids{$lang}[$dialog]);
if ($_ eq "\@DIALOGBOX_LINES:") {
process_talkWithDialog($lang, $d, IN);
@@ -404,6 +404,7 @@ sub process_talk_ids($$) {
next if $_ eq 'talktxt_ids';
$data_ids{$lang}[$n] = $_;
+ #$data_ids{$lang}[$_] = $n if $_ > 0;
$n++;
}
Commit: 7b8681521a2fa3b1fd8ff785835967d828f20a9d
https://github.com/scummvm/scummvm-tools/commit/7b8681521a2fa3b1fd8ff785835967d828f20a9d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-01T22:59:02+02:00
Commit Message:
TOOLS: PRINCE: Initial code for deprince
Changed paths:
A engines/prince/deprince.cpp
Makefile
Makefile.common
diff --git a/Makefile b/Makefile
index 9e41c4c..0109d9a 100644
--- a/Makefile
+++ b/Makefile
@@ -105,6 +105,7 @@ ifeq "$(USE_BOOST)" "1"
endif
$(STRIP) degob$(EXEEXT) -o $(WIN32PATH)/tools/degob$(EXEEXT)
$(STRIP) dekyra$(EXEEXT) -o $(WIN32PATH)/tools/dekyra$(EXEEXT)
+ $(STRIP) deprince$(EXEEXT) -o $(WIN32PATH)/tools/deprince$(EXEEXT)
$(STRIP) deriven$(EXEEXT) -o $(WIN32PATH)/tools/deriven$(EXEEXT)
$(STRIP) descumm$(EXEEXT) -o $(WIN32PATH)/tools/descumm$(EXEEXT)
$(STRIP) desword2$(EXEEXT) -o $(WIN32PATH)/tools/desword2$(EXEEXT)
@@ -143,6 +144,7 @@ ifeq "$(USE_BOOST)" "1"
endif
$(STRIP) degob$(EXEEXT) -o $(srcdir)/$(WIN32BUILD)/degob$(EXEEXT)
$(STRIP) dekyra$(EXEEXT) -o $(srcdir)/$(WIN32BUILD)/dekyra$(EXEEXT)
+ $(STRIP) deprince$(EXEEXT) -o $(srcdir)/$(WIN32BUILD)/deprince$(EXEEXT)
$(STRIP) deriven$(EXEEXT) -o $(srcdir)/$(WIN32BUILD)/deriven$(EXEEXT)
$(STRIP) descumm$(EXEEXT) -o $(srcdir)/$(WIN32BUILD)/descumm$(EXEEXT)
$(STRIP) desword2$(EXEEXT) -o $(srcdir)/$(WIN32BUILD)/desword2$(EXEEXT)
@@ -245,6 +247,7 @@ ifeq "$(USE_BOOST)" "1"
endif
$(STRIP) degob$(EXEEXT) -o $(AMIGAOS4PATH)/tools/degob$(EXEEXT)
$(STRIP) dekyra$(EXEEXT) -o $(AMIGAOS4PATH)/tools/dekyra$(EXEEXT)
+ $(STRIP) deprince$(EXEEXT) -o $(AMIGAOS4PATH)/tools/deprince$(EXEEXT)
$(STRIP) deriven$(EXEEXT) -o $(AMIGAOS4PATH)/tools/deriven$(EXEEXT)
$(STRIP) descumm$(EXEEXT) -o $(AMIGAOS4PATH)/tools/descumm$(EXEEXT)
$(STRIP) desword2$(EXEEXT) -o $(AMIGAOS4PATH)/tools/desword2$(EXEEXT)
@@ -278,6 +281,7 @@ riscosdist: all
elf2aif decine$(EXEEXT) !ScummTool/bin/decine,ff8
elf2aif degob$(EXEEXT) !ScummTool/bin/degob,ff8
elf2aif dekyra$(EXEEXT) !ScummTool/bin/dekyra,ff8
+ elf2aif deprince$(EXEEXT) !ScummTool/bin/deprince,ff8
elf2aif deriven$(EXEEXT) !ScummTool/bin/deriven,ff8
elf2aif descumm$(EXEEXT) !ScummTool/bin/descumm,ff8
elf2aif desword2$(EXEEXT) !ScummTool/bin/desword2,ff8
diff --git a/Makefile.common b/Makefile.common
index 91fdd6e..aef8e8b 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -26,6 +26,7 @@ PROGRAMS = \
decine \
degob \
dekyra \
+ deprince \
deriven \
descumm \
desword2 \
@@ -98,6 +99,10 @@ dekyra_OBJS := \
engines/kyra/dekyra_v1.o \
$(UTILS)
+deprince_OBJS := \
+ engines/prince/deprince.o \
+ $(UTILS)
+
deriven_OBJS := \
engines/mohawk/archive.o \
engines/mohawk/deriven.o \
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
new file mode 100644
index 0000000..9de990e
--- /dev/null
+++ b/engines/prince/deprince.cpp
@@ -0,0 +1,402 @@
+/* ScummVM Tools
+ *
+ * ScummVM Tools is the legal property of its developers, whose
+ * names are too numerous to list here. Please refer to the
+ * COPYRIGHT file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/* Prince script decompiler */
+
+#include "common/file.h"
+#include "common/util.h"
+
+#include <assert.h>
+
+enum OpCode {
+ O_WAITFOREVER,
+ O_BLACKPALETTE,
+ O_SETUPPALETTE,
+ O_INITROOM,
+ O_SETSAMPLE,
+ O_FREESAMPLE,
+ O_PLAYSAMPLE,
+ O_PUTOBJECT,
+ O_REMOBJECT,
+ O_SHOWANIM,
+ O_CHECKANIMEND,
+ O_FREEANIM,
+ O_CHECKANIMFRAME,
+ O_PUTBACKANIM,
+ O_REMBACKANIM,
+ O_CHECKBACKANIMFRAME,
+ O_FREEALLSAMPLES,
+ O_SETMUSIC,
+ O_STOPMUSIC,
+ O__WAIT,
+ O_UPDATEOFF,
+ O_UPDATEON,
+ O_UPDATE,
+ O_CLS,
+ O__CALL,
+ O_RETURN,
+ O_GO,
+ O_BACKANIMUPDATEOFF,
+ O_BACKANIMUPDATEON,
+ O_CHANGECURSOR,
+ O_CHANGEANIMTYPE,
+ O__SETFLAG,
+ O_COMPARE,
+ O_JUMPZ,
+ O_JUMPNZ,
+ O_EXIT,
+ O_ADDFLAG,
+ O_TALKANIM,
+ O_SUBFLAG,
+ O_SETSTRING,
+ O_ANDFLAG,
+ O_GETMOBDATA,
+ O_ORFLAG,
+ O_SETMOBDATA,
+ O_XORFLAG,
+ O_GETMOBTEXT,
+ O_MOVEHERO,
+ O_WALKHERO,
+ O_SETHERO,
+ O_HEROOFF,
+ O_HEROON,
+ O_CLSTEXT,
+ O_CALLTABLE,
+ O_CHANGEMOB,
+ O_ADDINV,
+ O_REMINV,
+ O_REPINV,
+ O_OBSOLETE_GETACTION,
+ O_ADDWALKAREA,
+ O_REMWALKAREA,
+ O_RESTOREWALKAREA,
+ O_WAITFRAME,
+ O_SETFRAME,
+ O_RUNACTION,
+ O_COMPAREHI,
+ O_COMPARELO,
+ O_PRELOADSET,
+ O_FREEPRELOAD,
+ O_CHECKINV,
+ O_TALKHERO,
+ O_WAITTEXT,
+ O_SETHEROANIM,
+ O_WAITHEROANIM,
+ O_GETHERODATA,
+ O_GETMOUSEBUTTON,
+ O_CHANGEFRAMES,
+ O_CHANGEBACKFRAMES,
+ O_GETBACKANIMDATA,
+ O_GETANIMDATA,
+ O_SETBGCODE,
+ O_SETBACKFRAME,
+ O_GETRND,
+ O_TALKBACKANIM,
+ O_LOADPATH,
+ O_GETCHAR,
+ O_SETDFLAG,
+ O_CALLDFLAG,
+ O_PRINTAT,
+ O_ZOOMIN,
+ O_ZOOMOUT,
+ O_SETSTRINGOFFSET,
+ O_GETOBJDATA,
+ O_SETOBJDATA,
+ O_SWAPOBJECTS,
+ O_CHANGEHEROSET,
+ O_ADDSTRING,
+ O_SUBSTRING,
+ O_INITDIALOG,
+ O_ENABLEDIALOGOPT,
+ O_DISABLEDIALOGOPT,
+ O_SHOWDIALOGBOX,
+ O_STOPSAMPLE,
+ O_BACKANIMRANGE,
+ O_CLEARPATH,
+ O_SETPATH,
+ O_GETHEROX,
+ O_GETHEROY,
+ O_GETHEROD,
+ O_PUSHSTRING,
+ O_POPSTRING,
+ O_SETFGCODE,
+ O_STOPHERO,
+ O_ANIMUPDATEOFF,
+ O_ANIMUPDATEON,
+ O_FREECURSOR,
+ O_ADDINVQUIET,
+ O_RUNHERO,
+ O_SETBACKANIMDATA,
+ O_VIEWFLC,
+ O_CHECKFLCFRAME,
+ O_CHECKFLCEND,
+ O_FREEFLC,
+ O_TALKHEROSTOP,
+ O_HEROCOLOR,
+ O_GRABMAPA,
+ O_ENABLENAK,
+ O_DISABLENAK,
+ O_GETMOBNAME,
+ O_SWAPINVENTORY,
+ O_CLEARINVENTORY,
+ O_SKIPTEXT,
+ O_SETVOICEH,
+ O_SETVOICEA,
+ O_SETVOICEB,
+ O_SETVOICEC,
+ O_VIEWFLCLOOP,
+ O_FLCSPEED,
+ O_OPENINVENTORY,
+ O_KRZYWA,
+ O_GETKRZYWA,
+ O_GETMOB,
+ O_INPUTLINE,
+ O_SETVOICED,
+ O_BREAK_POINT
+};
+
+static const char *opcode_names[] = {
+ "O_WAITFOREVER",
+ "O_BLACKPALETTE",
+ "O_SETUPPALETTE",
+ "O_INITROOM",
+ "O_SETSAMPLE",
+ "O_FREESAMPLE",
+ "O_PLAYSAMPLE",
+ "O_PUTOBJECT",
+ "O_REMOBJECT",
+ "O_SHOWANIM",
+ "O_CHECKANIMEND",
+ "O_FREEANIM",
+ "O_CHECKANIMFRAME",
+ "O_PUTBACKANIM",
+ "O_REMBACKANIM",
+ "O_CHECKBACKANIMFRAME",
+ "O_FREEALLSAMPLES",
+ "O_SETMUSIC",
+ "O_STOPMUSIC",
+ "O__WAIT",
+ "O_UPDATEOFF",
+ "O_UPDATEON",
+ "O_UPDATE",
+ "O_CLS",
+ "O__CALL",
+ "O_RETURN",
+ "O_GO",
+ "O_BACKANIMUPDATEOFF",
+ "O_BACKANIMUPDATEON",
+ "O_CHANGECURSOR",
+ "O_CHANGEANIMTYPE",
+ "O__SETFLAG",
+ "O_COMPARE",
+ "O_JUMPZ",
+ "O_JUMPNZ",
+ "O_EXIT",
+ "O_ADDFLAG",
+ "O_TALKANIM",
+ "O_SUBFLAG",
+ "O_SETSTRING",
+ "O_ANDFLAG",
+ "O_GETMOBDATA",
+ "O_ORFLAG",
+ "O_SETMOBDATA",
+ "O_XORFLAG",
+ "O_GETMOBTEXT",
+ "O_MOVEHERO",
+ "O_WALKHERO",
+ "O_SETHERO",
+ "O_HEROOFF",
+ "O_HEROON",
+ "O_CLSTEXT",
+ "O_CALLTABLE",
+ "O_CHANGEMOB",
+ "O_ADDINV",
+ "O_REMINV",
+ "O_REPINV",
+ "O_OBSOLETE_GETACTION",
+ "O_ADDWALKAREA",
+ "O_REMWALKAREA",
+ "O_RESTOREWALKAREA",
+ "O_WAITFRAME",
+ "O_SETFRAME",
+ "O_RUNACTION",
+ "O_COMPAREHI",
+ "O_COMPARELO",
+ "O_PRELOADSET",
+ "O_FREEPRELOAD",
+ "O_CHECKINV",
+ "O_TALKHERO",
+ "O_WAITTEXT",
+ "O_SETHEROANIM",
+ "O_WAITHEROANIM",
+ "O_GETHERODATA",
+ "O_GETMOUSEBUTTON",
+ "O_CHANGEFRAMES",
+ "O_CHANGEBACKFRAMES",
+ "O_GETBACKANIMDATA",
+ "O_GETANIMDATA",
+ "O_SETBGCODE",
+ "O_SETBACKFRAME",
+ "O_GETRND",
+ "O_TALKBACKANIM",
+ "O_LOADPATH",
+ "O_GETCHAR",
+ "O_SETDFLAG",
+ "O_CALLDFLAG",
+ "O_PRINTAT",
+ "O_ZOOMIN",
+ "O_ZOOMOUT",
+ "O_SETSTRINGOFFSET",
+ "O_GETOBJDATA",
+ "O_SETOBJDATA",
+ "O_SWAPOBJECTS",
+ "O_CHANGEHEROSET",
+ "O_ADDSTRING",
+ "O_SUBSTRING",
+ "O_INITDIALOG",
+ "O_ENABLEDIALOGOPT",
+ "O_DISABLEDIALOGOPT",
+ "O_SHOWDIALOGBOX",
+ "O_STOPSAMPLE",
+ "O_BACKANIMRANGE",
+ "O_CLEARPATH",
+ "O_SETPATH",
+ "O_GETHEROX",
+ "O_GETHEROY",
+ "O_GETHEROD",
+ "O_PUSHSTRING",
+ "O_POPSTRING",
+ "O_SETFGCODE",
+ "O_STOPHERO",
+ "O_ANIMUPDATEOFF",
+ "O_ANIMUPDATEON",
+ "O_FREECURSOR",
+ "O_ADDINVQUIET",
+ "O_RUNHERO",
+ "O_SETBACKANIMDATA",
+ "O_VIEWFLC",
+ "O_CHECKFLCFRAME",
+ "O_CHECKFLCEND",
+ "O_FREEFLC",
+ "O_TALKHEROSTOP",
+ "O_HEROCOLOR",
+ "O_GRABMAPA",
+ "O_ENABLENAK",
+ "O_DISABLENAK",
+ "O_GETMOBNAME",
+ "O_SWAPINVENTORY",
+ "O_CLEARINVENTORY",
+ "O_SKIPTEXT",
+ "O_SETVOICEH",
+ "O_SETVOICEA",
+ "O_SETVOICEB",
+ "O_SETVOICEC",
+ "O_VIEWFLCLOOP",
+ "O_FLCSPEED",
+ "O_OPENINVENTORY",
+ "O_KRZYWA",
+ "O_GETKRZYWA",
+ "O_GETMOB",
+ "O_INPUTLINE",
+ "O_SETVOICED",
+ "O_BREAK_POINT"
+};
+
+struct ScriptInfo {
+ int rooms;
+ int startGame;
+ int restoreGame;
+ int stdExamine;
+ int stdPickup;
+ int stdUse;
+ int stdOpen;
+ int stdClose;
+ int stdTalk;
+ int stdGive;
+ int usdCode;
+ int invObjExam;
+ int invObjUse;
+ int invObjUU;
+ int stdUseItem;
+ int lightSources;
+ int specRout;
+ int invObjGive;
+ int stdGiveItem;
+ int goTester;
+};
+
+void printUsage(const char *appName) {
+ printf("Usage: %s skrypt.dat\n", appName);
+}
+
+int main(int argc, char *argv[]) {
+ if (argc != 2) {
+ printUsage(argv[0]);
+ return 1;
+ }
+
+ Common::File scriptFile(argv[1], "rb");
+ if (!scriptFile.isOpen()) {
+ error("couldn't load file '%s'", argv[1]);
+ return 1;
+ }
+
+ uint32 size = scriptFile.size();
+ uint8 *data = new uint8[size];
+ assert(data);
+ if (size != scriptFile.read_noThrow(data, size)) {
+ delete [] data;
+ error("couldn't read all bytes from file '%s'", argv[1]);
+ return 1;
+ }
+
+ scriptFile.seek(0, SEEK_SET);
+
+ ScriptInfo scriptInfo;
+
+ scriptInfo.rooms = scriptFile.readSint32LE();
+ scriptInfo.startGame = scriptFile.readSint32LE();
+ scriptInfo.restoreGame = scriptFile.readSint32LE();
+ scriptInfo.stdExamine = scriptFile.readSint32LE();
+ scriptInfo.stdPickup = scriptFile.readSint32LE();
+ scriptInfo.stdUse = scriptFile.readSint32LE();
+ scriptInfo.stdOpen = scriptFile.readSint32LE();
+ scriptInfo.stdClose = scriptFile.readSint32LE();
+ scriptInfo.stdTalk = scriptFile.readSint32LE();
+ scriptInfo.stdGive = scriptFile.readSint32LE();
+ scriptInfo.usdCode = scriptFile.readSint32LE();
+ scriptInfo.invObjExam = scriptFile.readSint32LE();
+ scriptInfo.invObjUse = scriptFile.readSint32LE();
+ scriptInfo.invObjUU = scriptFile.readSint32LE();
+ scriptInfo.stdUseItem = scriptFile.readSint32LE();
+ scriptInfo.lightSources = scriptFile.readSint32LE();
+ scriptInfo.specRout = scriptFile.readSint32LE();
+ scriptInfo.invObjGive = scriptFile.readSint32LE();
+ scriptInfo.stdGiveItem = scriptFile.readSint32LE();
+ scriptInfo.goTester = scriptFile.readSint32LE();
+
+ printf("Rooms: %d\n", scriptInfo.rooms);
+ printf("StartGame: %d\n", scriptInfo.startGame);
+
+ scriptFile.close();
+
+ return 0;
+}
Commit: 19280448e7bbd33d74ed57551b888713c540383e
https://github.com/scummvm/scummvm-tools/commit/19280448e7bbd33d74ed57551b888713c540383e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-01T23:06:07+02:00
Commit Message:
TOOLS: PRINCE: Split out decompressor class
Changed paths:
A engines/prince/utils.cpp
A engines/prince/utils.h
Makefile.common
engines/prince/extract_prince.cpp
engines/prince/extract_prince.h
diff --git a/Makefile.common b/Makefile.common
index aef8e8b..7613fa7 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -101,6 +101,7 @@ dekyra_OBJS := \
deprince_OBJS := \
engines/prince/deprince.o \
+ engines/prince/utils.o \
$(UTILS)
deriven_OBJS := \
@@ -207,6 +208,7 @@ tools_OBJS := \
engines/kyra/extract_kyra.o \
engines/prince/extract_prince.o \
engines/prince/pack_prince.o \
+ engines/prince/utils.o \
engines/parallaction/extract_parallaction.o \
engines/scumm/extract_loom_tg16.o \
engines/scumm/extract_mm_apple.o \
diff --git a/engines/prince/extract_prince.cpp b/engines/prince/extract_prince.cpp
index 4dce073..201550f 100644
--- a/engines/prince/extract_prince.cpp
+++ b/engines/prince/extract_prince.cpp
@@ -20,6 +20,7 @@
*/
#include "extract_prince.h"
+#include "utils.h"
#include "common/endian.h"
#include "common/str.h"
@@ -690,149 +691,6 @@ char ExtractPrince::correctPolishLetter(char c) {
}
}
-// John_Doe's implementation
-static const uint16 table1[] = {
- 0x8000, 0x0002,
- 0x4000, 0x0004,
- 0x2000, 0x0008,
- 0x1000, 0x0010,
- 0x0800, 0x0020,
- 0x0400, 0x0040,
- 0x0200, 0x0080,
- 0x0100, 0x0100,
- 0x0080, 0x0200,
- 0x0040, 0x0400
-};
-
-static const uint32 table2[] = {
- 0x0000F000,
- 0x0020FC00,
- 0x00A0FF00,
- 0x02A0FF80,
- 0x06A0FFC0,
- 0x0EA0FFE0,
- 0x1EA0FFF0,
- 0x3EA0FFF8
-};
-
-static const uint16 table3[] = {
- 0x8000, 0x0000,
- 0x4000, 0x0002,
- 0x2000, 0x0006,
- 0x1000, 0x000E,
- 0x0800, 0x001E,
- 0x0400, 0x003E,
- 0x0200, 0x007E,
- 0x0100, 0x00FE,
- 0x0080, 0x01FE,
- 0x0040, 0x03FE,
- 0x0020, 0x07FE,
- 0x0010, 0x0FFE,
- 0x0008, 0x1FFE,
- 0x0004, 0x3FFE,
- 0x0002, 0x7FFE,
- 0x0001, 0xFFFE
-};
-
-void Decompressor::decompress(byte *source, byte *dest, uint32 destSize) {
- byte *destEnd = dest + destSize;
- int more;
- _src = source;
- _dst = dest;
- _bitBuffer = 0x80;
- while (_dst < destEnd) {
- uint32 ebp;
- uint16 offset, length;
- if (getBit()) {
- if (getBit()) {
- if (getBit()) {
- if (getBit()) {
- if (getBit()) {
- if (getBit()) {
- uint32 tableIndex = 0;
- while (getBit())
- tableIndex++;
- length = table3[tableIndex * 2 + 0];
- do {
- more = !(length & 0x8000);
- length = (length << 1) | getBit();
- } while (more);
- length += table3[tableIndex * 2 + 1];
- length++;
- memcpy(_dst, _src, length);
- _src += length;
- _dst += length;
- }
- *_dst++ = *_src++;
- }
- *_dst++ = *_src++;
- }
- *_dst++ = *_src++;
- }
- *_dst++ = *_src++;
- }
- *_dst++ = *_src++;
- }
- if (!getBit()) {
- if (getBit()) {
- uint32 tableIndex = getBit();
- tableIndex = (tableIndex << 1) | getBit();
- tableIndex = (tableIndex << 1) | getBit();
- ebp = table2[tableIndex];
- length = 1;
- } else {
- ebp = 0x0000FF00;
- length = 0;
- }
- } else {
- uint32 tableIndex = 0;
- while (getBit())
- tableIndex++;
- length = table1[tableIndex * 2 + 0];
- do {
- more = !(length & 0x8000);
- length = (length << 1) | getBit();
- } while (more);
- length += table1[tableIndex * 2 + 1];
- tableIndex = getBit();
- tableIndex = (tableIndex << 1) | getBit();
- tableIndex = (tableIndex << 1) | getBit();
- ebp = table2[tableIndex];
- }
- offset = ebp & 0xFFFF;
- do {
- if (_bitBuffer == 0x80) {
- if (offset >= 0xFF00) {
- offset = (offset << 8) | *_src++;
- }
- }
- more = offset & 0x8000;
- offset = (offset << 1) | getBit();
- } while (more);
- offset += (ebp >> 16);
- length += 2;
- while (length--) {
- if (_dst >= destEnd) {
- return;
- }
- *_dst = *(_dst - offset);
- _dst++;
- }
- }
-}
-
-int Decompressor::getBit() {
- int bit = (_bitBuffer & 0x80) >> 7;
- _bitBuffer <<= 1;
- if (_bitBuffer == 0) {
- _bitBuffer = *_src++;
- bit = (_bitBuffer & 0x80) >> 7;
- _bitBuffer <<= 1;
- _bitBuffer |= 1;
- }
- return bit;
-}
-
#ifdef STANDALONE_MAIN
int main(int argc, char *argv[]) {
ExtractPrince prince(argv[0]);
diff --git a/engines/prince/extract_prince.h b/engines/prince/extract_prince.h
index 14c7122..2dfa6e7 100644
--- a/engines/prince/extract_prince.h
+++ b/engines/prince/extract_prince.h
@@ -65,14 +65,4 @@ protected:
Common::File _databank, _fFiles;
};
-class Decompressor {
-public:
- void decompress(byte *source, byte *dest, uint32 destSize);
-protected:
- byte *_src, *_dst;
- byte _bitBuffer;
- int _bitsLeft;
- int getBit();
-};
-
#endif
diff --git a/engines/prince/utils.cpp b/engines/prince/utils.cpp
new file mode 100644
index 0000000..b46451d
--- /dev/null
+++ b/engines/prince/utils.cpp
@@ -0,0 +1,166 @@
+/* ScummVM Tools
+ *
+ * ScummVM Tools is the legal property of its developers, whose
+ * names are too numerous to list here. Please refer to the
+ * COPYRIGHT file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "common/scummsys.h"
+#include "utils.h"
+
+// John_Doe's implementation
+static const uint16 table1[] = {
+ 0x8000, 0x0002,
+ 0x4000, 0x0004,
+ 0x2000, 0x0008,
+ 0x1000, 0x0010,
+ 0x0800, 0x0020,
+ 0x0400, 0x0040,
+ 0x0200, 0x0080,
+ 0x0100, 0x0100,
+ 0x0080, 0x0200,
+ 0x0040, 0x0400
+};
+
+static const uint32 table2[] = {
+ 0x0000F000,
+ 0x0020FC00,
+ 0x00A0FF00,
+ 0x02A0FF80,
+ 0x06A0FFC0,
+ 0x0EA0FFE0,
+ 0x1EA0FFF0,
+ 0x3EA0FFF8
+};
+
+static const uint16 table3[] = {
+ 0x8000, 0x0000,
+ 0x4000, 0x0002,
+ 0x2000, 0x0006,
+ 0x1000, 0x000E,
+ 0x0800, 0x001E,
+ 0x0400, 0x003E,
+ 0x0200, 0x007E,
+ 0x0100, 0x00FE,
+ 0x0080, 0x01FE,
+ 0x0040, 0x03FE,
+ 0x0020, 0x07FE,
+ 0x0010, 0x0FFE,
+ 0x0008, 0x1FFE,
+ 0x0004, 0x3FFE,
+ 0x0002, 0x7FFE,
+ 0x0001, 0xFFFE
+};
+
+void Decompressor::decompress(byte *source, byte *dest, uint32 destSize) {
+ byte *destEnd = dest + destSize;
+ int more;
+ _src = source;
+ _dst = dest;
+ _bitBuffer = 0x80;
+ while (_dst < destEnd) {
+ uint32 ebp;
+ uint16 offset, length;
+ if (getBit()) {
+ if (getBit()) {
+ if (getBit()) {
+ if (getBit()) {
+ if (getBit()) {
+ if (getBit()) {
+ uint32 tableIndex = 0;
+ while (getBit())
+ tableIndex++;
+ length = table3[tableIndex * 2 + 0];
+ do {
+ more = !(length & 0x8000);
+ length = (length << 1) | getBit();
+ } while (more);
+ length += table3[tableIndex * 2 + 1];
+ length++;
+ memcpy(_dst, _src, length);
+ _src += length;
+ _dst += length;
+ }
+ *_dst++ = *_src++;
+ }
+ *_dst++ = *_src++;
+ }
+ *_dst++ = *_src++;
+ }
+ *_dst++ = *_src++;
+ }
+ *_dst++ = *_src++;
+ }
+ if (!getBit()) {
+ if (getBit()) {
+ uint32 tableIndex = getBit();
+ tableIndex = (tableIndex << 1) | getBit();
+ tableIndex = (tableIndex << 1) | getBit();
+ ebp = table2[tableIndex];
+ length = 1;
+ } else {
+ ebp = 0x0000FF00;
+ length = 0;
+ }
+ } else {
+ uint32 tableIndex = 0;
+ while (getBit())
+ tableIndex++;
+ length = table1[tableIndex * 2 + 0];
+ do {
+ more = !(length & 0x8000);
+ length = (length << 1) | getBit();
+ } while (more);
+ length += table1[tableIndex * 2 + 1];
+ tableIndex = getBit();
+ tableIndex = (tableIndex << 1) | getBit();
+ tableIndex = (tableIndex << 1) | getBit();
+ ebp = table2[tableIndex];
+ }
+ offset = ebp & 0xFFFF;
+ do {
+ if (_bitBuffer == 0x80) {
+ if (offset >= 0xFF00) {
+ offset = (offset << 8) | *_src++;
+ }
+ }
+ more = offset & 0x8000;
+ offset = (offset << 1) | getBit();
+ } while (more);
+ offset += (ebp >> 16);
+ length += 2;
+ while (length--) {
+ if (_dst >= destEnd) {
+ return;
+ }
+ *_dst = *(_dst - offset);
+ _dst++;
+ }
+ }
+}
+
+int Decompressor::getBit() {
+ int bit = (_bitBuffer & 0x80) >> 7;
+ _bitBuffer <<= 1;
+ if (_bitBuffer == 0) {
+ _bitBuffer = *_src++;
+ bit = (_bitBuffer & 0x80) >> 7;
+ _bitBuffer <<= 1;
+ _bitBuffer |= 1;
+ }
+ return bit;
+}
diff --git a/engines/prince/utils.h b/engines/prince/utils.h
new file mode 100644
index 0000000..bf5d030
--- /dev/null
+++ b/engines/prince/utils.h
@@ -0,0 +1,35 @@
+/* ScummVM Tools
+ *
+ * ScummVM Tools is the legal property of its developers, whose
+ * names are too numerous to list here. Please refer to the
+ * COPYRIGHT file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef PRINCE_UTILS_H
+#define PRINCE_UTILS_H
+
+class Decompressor {
+public:
+ void decompress(byte *source, byte *dest, uint32 destSize);
+protected:
+ byte *_src, *_dst;
+ byte _bitBuffer;
+ int _bitsLeft;
+ int getBit();
+};
+
+#endif
Commit: 24ba29a05a6b18249aa37da33a3a97000e67b8bf
https://github.com/scummvm/scummvm-tools/commit/24ba29a05a6b18249aa37da33a3a97000e67b8bf
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-01T23:35:55+02:00
Commit Message:
TOOLS: PRINCE: Read rooms in decompiler
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 9de990e..61d42c1 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -22,10 +22,15 @@
/* Prince script decompiler */
#include "common/file.h"
+#include "common/endian.h"
#include "common/util.h"
+#include "utils.h"
+
#include <assert.h>
+static const int16 kMaxRooms = 60;
+
enum OpCode {
O_WAITFOREVER,
O_BLACKPALETTE,
@@ -343,10 +348,31 @@ struct ScriptInfo {
int goTester;
};
+struct Room {
+ int mobs; // mob flag offset
+ int backAnim; // offset to array of animation numbers
+ int obj; // offset to array of object numbers
+ int nak; // offset to array of masks
+ int itemUse;
+ int itemGive;
+ int walkTo; // offset to array of WALKTO events or 0
+ int examine; // offset to array of EXAMINE events or 0
+ int pickup;
+ int use;
+ int pushOpen;
+ int pullClose;
+ int talk;
+ int give;
+};
+
void printUsage(const char *appName) {
printf("Usage: %s skrypt.dat\n", appName);
}
+void decompile(const char *sname, int pos) {
+ printf("Script %s\n", sname);
+}
+
int main(int argc, char *argv[]) {
if (argc != 2) {
printUsage(argv[0]);
@@ -368,35 +394,64 @@ int main(int argc, char *argv[]) {
return 1;
}
- scriptFile.seek(0, SEEK_SET);
+ scriptFile.close();
+
+ Decompressor dec;
+ uint32 decompLen = READ_BE_UINT32(data + 14);
+ byte *decompData = (byte *)malloc(decompLen);
+ dec.decompress(data + 18, decompData, decompLen);
+ delete [] data;
+
+ byte *pos = decompData;
ScriptInfo scriptInfo;
- scriptInfo.rooms = scriptFile.readSint32LE();
- scriptInfo.startGame = scriptFile.readSint32LE();
- scriptInfo.restoreGame = scriptFile.readSint32LE();
- scriptInfo.stdExamine = scriptFile.readSint32LE();
- scriptInfo.stdPickup = scriptFile.readSint32LE();
- scriptInfo.stdUse = scriptFile.readSint32LE();
- scriptInfo.stdOpen = scriptFile.readSint32LE();
- scriptInfo.stdClose = scriptFile.readSint32LE();
- scriptInfo.stdTalk = scriptFile.readSint32LE();
- scriptInfo.stdGive = scriptFile.readSint32LE();
- scriptInfo.usdCode = scriptFile.readSint32LE();
- scriptInfo.invObjExam = scriptFile.readSint32LE();
- scriptInfo.invObjUse = scriptFile.readSint32LE();
- scriptInfo.invObjUU = scriptFile.readSint32LE();
- scriptInfo.stdUseItem = scriptFile.readSint32LE();
- scriptInfo.lightSources = scriptFile.readSint32LE();
- scriptInfo.specRout = scriptFile.readSint32LE();
- scriptInfo.invObjGive = scriptFile.readSint32LE();
- scriptInfo.stdGiveItem = scriptFile.readSint32LE();
- scriptInfo.goTester = scriptFile.readSint32LE();
+ scriptInfo.rooms = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.startGame = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.restoreGame = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdExamine = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdPickup = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdUse = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdOpen = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdClose = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdTalk = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdGive = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.usdCode = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.invObjExam = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.invObjUse = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.invObjUU = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdUseItem = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.lightSources = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.specRout = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.invObjGive = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.stdGiveItem = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.goTester = READ_LE_UINT32(pos); pos += 4;
printf("Rooms: %d\n", scriptInfo.rooms);
printf("StartGame: %d\n", scriptInfo.startGame);
- scriptFile.close();
+ Room rooms[kMaxRooms];
+
+ for (int i = 0; i < kMaxRooms; i++) {
+ pos = &decompData[scriptInfo.rooms + i * 64];
+
+ rooms[i].mobs = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].backAnim = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].obj = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].nak = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].itemUse = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].itemGive = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].walkTo = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].examine = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].pickup = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].use = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].pushOpen = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].pullClose = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].talk = READ_LE_UINT32(pos); pos += 4;
+ rooms[i].give = READ_LE_UINT32(pos); pos += 4;
+ }
+
+ decompile("StartGame", scriptInfo.startGame);
return 0;
}
Commit: 000dfc955aa224512a5879dd5359469a0d2cf7a9
https://github.com/scummvm/scummvm-tools/commit/000dfc955aa224512a5879dd5359469a0d2cf7a9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T05:19:10+02:00
Commit Message:
TOOLS: PRINCE: decompiler prints opcodes
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 61d42c1..1c141b1 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -31,298 +31,155 @@
static const int16 kMaxRooms = 60;
-enum OpCode {
- O_WAITFOREVER,
- O_BLACKPALETTE,
- O_SETUPPALETTE,
- O_INITROOM,
- O_SETSAMPLE,
- O_FREESAMPLE,
- O_PLAYSAMPLE,
- O_PUTOBJECT,
- O_REMOBJECT,
- O_SHOWANIM,
- O_CHECKANIMEND,
- O_FREEANIM,
- O_CHECKANIMFRAME,
- O_PUTBACKANIM,
- O_REMBACKANIM,
- O_CHECKBACKANIMFRAME,
- O_FREEALLSAMPLES,
- O_SETMUSIC,
- O_STOPMUSIC,
- O__WAIT,
- O_UPDATEOFF,
- O_UPDATEON,
- O_UPDATE,
- O_CLS,
- O__CALL,
- O_RETURN,
- O_GO,
- O_BACKANIMUPDATEOFF,
- O_BACKANIMUPDATEON,
- O_CHANGECURSOR,
- O_CHANGEANIMTYPE,
- O__SETFLAG,
- O_COMPARE,
- O_JUMPZ,
- O_JUMPNZ,
- O_EXIT,
- O_ADDFLAG,
- O_TALKANIM,
- O_SUBFLAG,
- O_SETSTRING,
- O_ANDFLAG,
- O_GETMOBDATA,
- O_ORFLAG,
- O_SETMOBDATA,
- O_XORFLAG,
- O_GETMOBTEXT,
- O_MOVEHERO,
- O_WALKHERO,
- O_SETHERO,
- O_HEROOFF,
- O_HEROON,
- O_CLSTEXT,
- O_CALLTABLE,
- O_CHANGEMOB,
- O_ADDINV,
- O_REMINV,
- O_REPINV,
- O_OBSOLETE_GETACTION,
- O_ADDWALKAREA,
- O_REMWALKAREA,
- O_RESTOREWALKAREA,
- O_WAITFRAME,
- O_SETFRAME,
- O_RUNACTION,
- O_COMPAREHI,
- O_COMPARELO,
- O_PRELOADSET,
- O_FREEPRELOAD,
- O_CHECKINV,
- O_TALKHERO,
- O_WAITTEXT,
- O_SETHEROANIM,
- O_WAITHEROANIM,
- O_GETHERODATA,
- O_GETMOUSEBUTTON,
- O_CHANGEFRAMES,
- O_CHANGEBACKFRAMES,
- O_GETBACKANIMDATA,
- O_GETANIMDATA,
- O_SETBGCODE,
- O_SETBACKFRAME,
- O_GETRND,
- O_TALKBACKANIM,
- O_LOADPATH,
- O_GETCHAR,
- O_SETDFLAG,
- O_CALLDFLAG,
- O_PRINTAT,
- O_ZOOMIN,
- O_ZOOMOUT,
- O_SETSTRINGOFFSET,
- O_GETOBJDATA,
- O_SETOBJDATA,
- O_SWAPOBJECTS,
- O_CHANGEHEROSET,
- O_ADDSTRING,
- O_SUBSTRING,
- O_INITDIALOG,
- O_ENABLEDIALOGOPT,
- O_DISABLEDIALOGOPT,
- O_SHOWDIALOGBOX,
- O_STOPSAMPLE,
- O_BACKANIMRANGE,
- O_CLEARPATH,
- O_SETPATH,
- O_GETHEROX,
- O_GETHEROY,
- O_GETHEROD,
- O_PUSHSTRING,
- O_POPSTRING,
- O_SETFGCODE,
- O_STOPHERO,
- O_ANIMUPDATEOFF,
- O_ANIMUPDATEON,
- O_FREECURSOR,
- O_ADDINVQUIET,
- O_RUNHERO,
- O_SETBACKANIMDATA,
- O_VIEWFLC,
- O_CHECKFLCFRAME,
- O_CHECKFLCEND,
- O_FREEFLC,
- O_TALKHEROSTOP,
- O_HEROCOLOR,
- O_GRABMAPA,
- O_ENABLENAK,
- O_DISABLENAK,
- O_GETMOBNAME,
- O_SWAPINVENTORY,
- O_CLEARINVENTORY,
- O_SKIPTEXT,
- O_SETVOICEH,
- O_SETVOICEA,
- O_SETVOICEB,
- O_SETVOICEC,
- O_VIEWFLCLOOP,
- O_FLCSPEED,
- O_OPENINVENTORY,
- O_KRZYWA,
- O_GETKRZYWA,
- O_GETMOB,
- O_INPUTLINE,
- O_SETVOICED,
- O_BREAK_POINT
-};
-
-static const char *opcode_names[] = {
- "O_WAITFOREVER",
- "O_BLACKPALETTE",
- "O_SETUPPALETTE",
- "O_INITROOM",
- "O_SETSAMPLE",
- "O_FREESAMPLE",
- "O_PLAYSAMPLE",
- "O_PUTOBJECT",
- "O_REMOBJECT",
- "O_SHOWANIM",
- "O_CHECKANIMEND",
- "O_FREEANIM",
- "O_CHECKANIMFRAME",
- "O_PUTBACKANIM",
- "O_REMBACKANIM",
- "O_CHECKBACKANIMFRAME",
- "O_FREEALLSAMPLES",
- "O_SETMUSIC",
- "O_STOPMUSIC",
- "O__WAIT",
- "O_UPDATEOFF",
- "O_UPDATEON",
- "O_UPDATE",
- "O_CLS",
- "O__CALL",
- "O_RETURN",
- "O_GO",
- "O_BACKANIMUPDATEOFF",
- "O_BACKANIMUPDATEON",
- "O_CHANGECURSOR",
- "O_CHANGEANIMTYPE",
- "O__SETFLAG",
- "O_COMPARE",
- "O_JUMPZ",
- "O_JUMPNZ",
- "O_EXIT",
- "O_ADDFLAG",
- "O_TALKANIM",
- "O_SUBFLAG",
- "O_SETSTRING",
- "O_ANDFLAG",
- "O_GETMOBDATA",
- "O_ORFLAG",
- "O_SETMOBDATA",
- "O_XORFLAG",
- "O_GETMOBTEXT",
- "O_MOVEHERO",
- "O_WALKHERO",
- "O_SETHERO",
- "O_HEROOFF",
- "O_HEROON",
- "O_CLSTEXT",
- "O_CALLTABLE",
- "O_CHANGEMOB",
- "O_ADDINV",
- "O_REMINV",
- "O_REPINV",
- "O_OBSOLETE_GETACTION",
- "O_ADDWALKAREA",
- "O_REMWALKAREA",
- "O_RESTOREWALKAREA",
- "O_WAITFRAME",
- "O_SETFRAME",
- "O_RUNACTION",
- "O_COMPAREHI",
- "O_COMPARELO",
- "O_PRELOADSET",
- "O_FREEPRELOAD",
- "O_CHECKINV",
- "O_TALKHERO",
- "O_WAITTEXT",
- "O_SETHEROANIM",
- "O_WAITHEROANIM",
- "O_GETHERODATA",
- "O_GETMOUSEBUTTON",
- "O_CHANGEFRAMES",
- "O_CHANGEBACKFRAMES",
- "O_GETBACKANIMDATA",
- "O_GETANIMDATA",
- "O_SETBGCODE",
- "O_SETBACKFRAME",
- "O_GETRND",
- "O_TALKBACKANIM",
- "O_LOADPATH",
- "O_GETCHAR",
- "O_SETDFLAG",
- "O_CALLDFLAG",
- "O_PRINTAT",
- "O_ZOOMIN",
- "O_ZOOMOUT",
- "O_SETSTRINGOFFSET",
- "O_GETOBJDATA",
- "O_SETOBJDATA",
- "O_SWAPOBJECTS",
- "O_CHANGEHEROSET",
- "O_ADDSTRING",
- "O_SUBSTRING",
- "O_INITDIALOG",
- "O_ENABLEDIALOGOPT",
- "O_DISABLEDIALOGOPT",
- "O_SHOWDIALOGBOX",
- "O_STOPSAMPLE",
- "O_BACKANIMRANGE",
- "O_CLEARPATH",
- "O_SETPATH",
- "O_GETHEROX",
- "O_GETHEROY",
- "O_GETHEROD",
- "O_PUSHSTRING",
- "O_POPSTRING",
- "O_SETFGCODE",
- "O_STOPHERO",
- "O_ANIMUPDATEOFF",
- "O_ANIMUPDATEON",
- "O_FREECURSOR",
- "O_ADDINVQUIET",
- "O_RUNHERO",
- "O_SETBACKANIMDATA",
- "O_VIEWFLC",
- "O_CHECKFLCFRAME",
- "O_CHECKFLCEND",
- "O_FREEFLC",
- "O_TALKHEROSTOP",
- "O_HEROCOLOR",
- "O_GRABMAPA",
- "O_ENABLENAK",
- "O_DISABLENAK",
- "O_GETMOBNAME",
- "O_SWAPINVENTORY",
- "O_CLEARINVENTORY",
- "O_SKIPTEXT",
- "O_SETVOICEH",
- "O_SETVOICEA",
- "O_SETVOICEB",
- "O_SETVOICEC",
- "O_VIEWFLCLOOP",
- "O_FLCSPEED",
- "O_OPENINVENTORY",
- "O_KRZYWA",
- "O_GETKRZYWA",
- "O_GETMOB",
- "O_INPUTLINE",
- "O_SETVOICED",
- "O_BREAK_POINT"
+struct OpCodes {
+ const char *name;
+ const char *params;
+ bool nf;
+} static opcodes[] = {
+ { "O_WAITFOREVER", "", true },
+ { "O_BLACKPALETTE", "", false },
+ { "O_SETUPPALETTE", "", false },
+ { "O_INITROOM", "f", true },
+ { "O_SETSAMPLE", "fs", false },
+ { "O_FREESAMPLE", "f", false },
+ { "O_PLAYSAMPLE", "fh", false },
+ { "O_PUTOBJECT", "fff", false },
+ { "O_REMOBJECT", "ff", false },
+ { "O_SHOWANIM", "ff", false },
+ { "O_CHECKANIMEND", "f", false },
+ { "O_FREEANIM", "f", false },
+ { "O_CHECKANIMFRAME", "ff", false },
+ { "O_PUTBACKANIM", "ffi", false },
+ { "O_REMBACKANIM", "ff", false },
+ { "O_CHECKBACKANIMFRAME", "ff", false },
+ { "O_FREEALLSAMPLES", "r", false },
+ { "O_SETMUSIC", "h", false },
+ { "O_STOPMUSIC", "", false },
+ { "O__WAIT", "f", false },
+ { "O_UPDATEOFF", "r", false },
+ { "O_UPDATEON", "r", false },
+ { "O_UPDATE", "r", false },
+ { "O_CLS", "r", false },
+ { "O__CALL", "o", false },
+ { "O_RETURN", "", false },
+ { "O_GO", "o", false },
+ { "O_BACKANIMUPDATEOFF", "f", false },
+ { "O_BACKANIMUPDATEON", "f", false },
+ { "O_CHANGECURSOR", "f", false },
+ { "O_CHANGEANIMTYPE", "r", false },
+ { "O__SETFLAG", "df", false },
+ { "O_COMPARE", "df", false },
+ { "O_JUMPZ", "o", false },
+ { "O_JUMPNZ", "o", false },
+ { "O_EXIT", "", true },
+ { "O_ADDFLAG", "df", false },
+ { "O_TALKANIM", "ff", false },
+ { "O_SUBFLAG", "df", false },
+ { "O_SETSTRING", "i", false },
+ { "O_ANDFLAG", "df", false },
+ { "O_GETMOBDATA", "dff", false },
+ { "O_ORFLAG", "df", false },
+ { "O_SETMOBDATA", "fff", false },
+ { "O_XORFLAG", "df", false },
+ { "O_GETMOBTEXT", "f", false },
+ { "O_MOVEHERO", "ffff", false },
+ { "O_WALKHERO", "f", true },
+ { "O_SETHERO", "ffff", false },
+ { "O_HEROOFF", "f", false },
+ { "O_HEROON", "f", false },
+ { "O_CLSTEXT", "f", false },
+ { "O_CALLTABLE", "dt", false },
+ { "O_CHANGEMOB", "ff", false },
+ { "O_ADDINV", "ff", false },
+ { "O_REMINV", "ff", false },
+ { "O_REPINV", "r", false },
+ { "O_OBSOLETE_GETACTION", "r", false },
+ { "O_ADDWALKAREA", "r", false },
+ { "O_REMWALKAREA", "r", false },
+ { "O_RESTOREWALKAREA", "r", false },
+ { "O_WAITFRAME", "", true },
+ { "O_SETFRAME", "ff", false },
+ { "O_RUNACTION", "r", false },
+ { "O_COMPAREHI", "df", false },
+ { "O_COMPARELO", "df", false },
+ { "O_PRELOADSET", "r", false },
+ { "O_FREEPRELOAD", "r", false },
+ { "O_CHECKINV", "r", false },
+ { "O_TALKHERO", "f", false },
+ { "O_WAITTEXT", "f", false },
+ { "O_SETHEROANIM", "fi", false },
+ { "O_WAITHEROANIM", "f", true },
+ { "O_GETHERODATA", "dff", false },
+ { "O_GETMOUSEBUTTON", "", false },
+ { "O_CHANGEFRAMES", "ffff", false },
+ { "O_CHANGEBACKFRAMES", "ffff", false },
+ { "O_GETBACKANIMDATA", "dff", false },
+ { "O_GETANIMDATA", "dff", false },
+ { "O_SETBGCODE", "o", false },
+ { "O_SETBACKFRAME", "ff", false },
+ { "O_GETRND", "dh", false },
+ { "O_TALKBACKANIM", "ff", false },
+ { "O_LOADPATH", "i", false },
+ { "O_GETCHAR", "d", false },
+ { "O_SETDFLAG", "do", false },
+ { "O_CALLDFLAG", "d", false },
+ { "O_PRINTAT", "fff", false },
+ { "O_ZOOMIN", "f", false },
+ { "O_ZOOMOUT", "f", false },
+ { "O_SETSTRINGOFFSET", "r", false },
+ { "O_GETOBJDATA", "dff", false },
+ { "O_SETOBJDATA", "fff", false },
+ { "O_SWAPOBJECTS", "r", false },
+ { "O_CHANGEHEROSET", "ff", false },
+ { "O_ADDSTRING", "r", false },
+ { "O_SUBSTRING", "f", false },
+ { "O_INITDIALOG", "", false },
+ { "O_ENABLEDIALOGOPT", "f", false },
+ { "O_DISABLEDIALOGOPT", "f", false },
+ { "O_SHOWDIALOGBOX", "f", false },
+ { "O_STOPSAMPLE", "f", false },
+ { "O_BACKANIMRANGE", "fhff", false },
+ { "O_CLEARPATH", "", false },
+ { "O_SETPATH", "", false },
+ { "O_GETHEROX", "fd", false },
+ { "O_GETHEROY", "fd", false },
+ { "O_GETHEROD", "fd", false },
+ { "O_PUSHSTRING", "", false },
+ { "O_POPSTRING", "", false },
+ { "O_SETFGCODE", "o", false },
+ { "O_STOPHERO", "f", false },
+ { "O_ANIMUPDATEOFF", "f", false },
+ { "O_ANIMUPDATEON", "f", false },
+ { "O_FREECURSOR", "", false },
+ { "O_ADDINVQUIET", "ff", false },
+ { "O_RUNHERO", "ffff", false },
+ { "O_SETBACKANIMDATA", "hhd", false },
+ { "O_VIEWFLC", "f", false },
+ { "O_CHECKFLCFRAME", "f", false },
+ { "O_CHECKFLCEND", "", false },
+ { "O_FREEFLC", "", false },
+ { "O_TALKHEROSTOP", "f", false },
+ { "O_HEROCOLOR", "ff", false },
+ { "O_GRABMAPA", "", false },
+ { "O_ENABLENAK", "f", false },
+ { "O_DISABLENAK", "f", false },
+ { "O_GETMOBNAME", "f", false },
+ { "O_SWAPINVENTORY", "f", false },
+ { "O_CLEARINVENTORY", "f", false },
+ { "O_SKIPTEXT", "", false },
+ { "O_SETVOICEH", "f", false },
+ { "O_SETVOICEA", "f", false },
+ { "O_SETVOICEB", "f", false },
+ { "O_SETVOICEC", "f", false },
+ { "O_VIEWFLCLOOP", "f", false },
+ { "O_FLCSPEED", "f", false },
+ { "O_OPENINVENTORY", "", true },
+ { "O_KRZYWA", "", false },
+ { "O_GETKRZYWA", "", false },
+ { "O_GETMOB", "dff", false },
+ { "O_INPUTLINE", "r", false },
+ { "O_SETVOICED", "f", false },
+ { "O_BREAK_POINT", "r", false }
};
struct ScriptInfo {
@@ -369,8 +226,66 @@ void printUsage(const char *appName) {
printf("Usage: %s skrypt.dat\n", appName);
}
-void decompile(const char *sname, int pos) {
+void decompile(const char *sname, byte *data, int pos) {
printf("Script %s\n", sname);
+
+ bool nf = false;
+
+ while (!nf) {
+ uint16 op = READ_LE_UINT16(&data[pos]); pos += 2;
+
+ nf = opcodes[op].nf;
+
+ const char *param = opcodes[op].params;
+
+ printf("%s", opcodes[op].name);
+
+ if (*param)
+ printf(" ");
+
+ int v;
+
+ while (*param) {
+ switch (*param) {
+ case 'f':
+ v = READ_LE_UINT16(&data[pos]); pos += 2;
+
+ if (v & 0x8000) {
+ //printf("%s", getFlagName(v));
+ } else {
+ printf("%d", v);
+ }
+ break;
+ case 'h':
+ v = READ_LE_UINT16(&data[pos]); pos += 2;
+ printf("%d", v);
+ break;
+ case 'i':
+ v = READ_LE_UINT32(&data[pos]); pos += 4;
+ printf("%d", v);
+ break;
+ case 'd':
+ v = READ_LE_UINT16(&data[pos]); pos += 2;
+ //printf("%s", getFlagName(v));
+ break;
+ case 'o':
+ v = READ_LE_UINT32(&data[pos]); pos += 4;
+ printf("[%d]", v);
+ break;
+ case 'r':
+ error("Unsupported op %s", opcodes[op].name);
+ default:
+ error("Unhandled param '%c' for %s", opcodes[op].name);
+ }
+
+ param++;
+
+ if (*param)
+ printf(", ");
+ }
+
+ printf("\n");
+ }
}
int main(int argc, char *argv[]) {
@@ -429,6 +344,24 @@ int main(int argc, char *argv[]) {
printf("Rooms: %d\n", scriptInfo.rooms);
printf("StartGame: %d\n", scriptInfo.startGame);
+ printf("restoreGame: %d\n", scriptInfo.restoreGame);
+ printf("stdExamine: %d\n", scriptInfo.stdExamine);
+ printf("stdPickup: %d\n", scriptInfo.stdPickup);
+ printf("stdUse: %d\n", scriptInfo.stdUse);
+ printf("stdOpen: %d\n", scriptInfo.stdOpen);
+ printf("stdClose: %d\n", scriptInfo.stdClose);
+ printf("stdTalk: %d\n", scriptInfo.stdTalk);
+ printf("stdGive: %d\n", scriptInfo.stdGive);
+ printf("usdCode: %d\n", scriptInfo.usdCode);
+ printf("invObjExam: %d\n", scriptInfo.invObjExam);
+ printf("invObjUse: %d\n", scriptInfo.invObjUse);
+ printf("invObjUU: %d\n", scriptInfo.invObjUU);
+ printf("stdUseItem: %d\n", scriptInfo.stdUseItem);
+ printf("lightSources: %d\n", scriptInfo.lightSources);
+ printf("specRout: %d\n", scriptInfo.specRout);
+ printf("invObjGive: %d\n", scriptInfo.invObjGive);
+ printf("stdGiveItem: %d\n", scriptInfo.stdGiveItem);
+ printf("goTester: %d\n", scriptInfo.goTester);
Room rooms[kMaxRooms];
@@ -449,9 +382,24 @@ int main(int argc, char *argv[]) {
rooms[i].pullClose = READ_LE_UINT32(pos); pos += 4;
rooms[i].talk = READ_LE_UINT32(pos); pos += 4;
rooms[i].give = READ_LE_UINT32(pos); pos += 4;
+
+ printf("r%02d mobs: %d\n", i, rooms[i].mobs);
+ printf("r%02d backAnim: %d\n", i, rooms[i].backAnim);
+ printf("r%02d obj: %d\n", i, rooms[i].obj);
+ printf("r%02d nak: %d\n", i, rooms[i].nak);
+ printf("r%02d itemUse: %d\n", i, rooms[i].itemUse);
+ printf("r%02d itemGive: %d\n", i, rooms[i].itemGive);
+ printf("r%02d walkTo: %d\n", i, rooms[i].walkTo);
+ printf("r%02d examine: %d\n", i, rooms[i].examine);
+ printf("r%02d pickup: %d\n", i, rooms[i].pickup);
+ printf("r%02d use: %d\n", i, rooms[i].use);
+ printf("r%02d pushOpen: %d\n", i, rooms[i].pushOpen);
+ printf("r%02d pullClose: %d\n", i, rooms[i].pullClose);
+ printf("r%02d talk: %d\n", i, rooms[i].talk);
+ printf("r%02d give: %d\n", i, rooms[i].give);
}
- decompile("StartGame", scriptInfo.startGame);
+ decompile("StartGame", decompData, scriptInfo.startGame);
return 0;
}
Commit: e15498266661aa5260f14a91e5a8d8193e7df9ff
https://github.com/scummvm/scummvm-tools/commit/e15498266661aa5260f14a91e5a8d8193e7df9ff
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T05:24:52+02:00
Commit Message:
TOOLS: PRINCE: Print flag names in decompiler
Changed paths:
A engines/prince/flags.cpp
A engines/prince/flags.h
Makefile.common
engines/prince/deprince.cpp
diff --git a/Makefile.common b/Makefile.common
index 7613fa7..ca77142 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -101,6 +101,7 @@ dekyra_OBJS := \
deprince_OBJS := \
engines/prince/deprince.o \
+ engines/prince/flags.o \
engines/prince/utils.o \
$(UTILS)
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 1c141b1..78e76ca 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -26,6 +26,7 @@
#include "common/util.h"
#include "utils.h"
+#include "flags.h"
#include <assert.h>
@@ -251,7 +252,7 @@ void decompile(const char *sname, byte *data, int pos) {
v = READ_LE_UINT16(&data[pos]); pos += 2;
if (v & 0x8000) {
- //printf("%s", getFlagName(v));
+ printf("%s", Flags::getFlagName(v));
} else {
printf("%d", v);
}
@@ -266,7 +267,7 @@ void decompile(const char *sname, byte *data, int pos) {
break;
case 'd':
v = READ_LE_UINT16(&data[pos]); pos += 2;
- //printf("%s", getFlagName(v));
+ printf("%s", Flags::getFlagName(v));
break;
case 'o':
v = READ_LE_UINT32(&data[pos]); pos += 4;
diff --git a/engines/prince/flags.cpp b/engines/prince/flags.cpp
new file mode 100644
index 0000000..56fca25
--- /dev/null
+++ b/engines/prince/flags.cpp
@@ -0,0 +1,415 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "flags.h"
+
+const char *Flags::getFlagName(uint16 flagId) {
+ FlagDebug *flagd = nullptr;
+ flagd = (FlagDebug *)bsearch(&flagId, _flagNames, kFlagDebugAmount, sizeof(FlagDebug), Flags::compareFlagDebug);
+ if (flagd != nullptr) {
+ return flagd->flagName;
+ } else {
+ return "unknown_flag";
+ }
+}
+
+int Flags::compareFlagDebug(const void *a, const void *b) {
+ const uint32 *flagId = (const uint32 *)a;
+ const FlagDebug *entry = (const FlagDebug *)b;
+ if (*flagId < (uint32)entry->id) {
+ return -1;
+ } else if (*flagId > (uint32)entry->id) {
+ return 1;
+ }
+ return 0;
+}
+
+const Flags::FlagDebug Flags::_flagNames[Flags::kFlagDebugAmount] = {
+ { Flags::FLAGA1, "FLAGA1" },
+ { Flags::FLAGA2, "FLAGA2" },
+ { Flags::FLAGA3, "FLAGA3" },
+ { Flags::DESTX, "DESTX" },
+ { Flags::DESTY, "DESTY" },
+ { Flags::DESTD, "DESTD" },
+ { Flags::DwarfDone, "DwarfDone" },
+ { Flags::GRABARZCOUNTER, "GRABARZCOUNTER" },
+ { Flags::KIERUNEK, "KIERUNEK" },
+ { Flags::BACKFLAG1, "BACKFLAG1" },
+ { Flags::BACKFLAG2, "BACKFLAG2" },
+ { Flags::BACKFLAG3, "BACKFLAG3" },
+ { Flags::BACKFLAG4, "BACKFLAG4" },
+ { Flags::MACROFLAG1, "MACROFLAG1" },
+ { Flags::MACROFLAG2, "MACROFLAG2" },
+ { Flags::MACROFLAG3, "MACROFLAG3" },
+ { Flags::HEROLDDONE, "HEROLDDONE" },
+ { Flags::BRIDGESET, "BRIDGESET" },
+ { Flags::U_BT_1, "U_BT_1" },
+ { Flags::U_BT_2, "U_BT_2" },
+ { Flags::U_BT_3, "U_BT_3" },
+ { Flags::U_BT_4, "U_BT_4" },
+ { Flags::U_BT_5, "U_BT_5" },
+ { Flags::U_BT_6, "U_BT_6" },
+ { Flags::U_BT_7, "U_BT_7" },
+ { Flags::U_BT_8, "U_BT_8" },
+ { Flags::U_BT_9, "U_BT_9" },
+ { Flags::U_BT_COUNTER, "U_BT_COUNTER" },
+ { Flags::ARIVALDALIVE, "ARIVALDALIVE" },
+ { Flags::TALKCHAR1, "TALKCHAR1" },
+ { Flags::TalkType1, "TalkType1" },
+ { Flags::TALKROUT1, "TALKROUT1" },
+ { Flags::TALKROUT2, "TALKROUT2" },
+ { Flags::TALKROUT3, "TALKROUT3" },
+ { Flags::TALKROUT4, "TALKROUT4" },
+ { Flags::TALKANIM1, "TALKANIM1" },
+ { Flags::TALKANIM2, "TALKANIM2" },
+ { Flags::TALKCOLOR1, "TALKCOLOR1" },
+ { Flags::TALKCOLOR2, "TALKCOLOR2" },
+ { Flags::KapciuchTaken, "KapciuchTaken" },
+ { Flags::CurrentBeggarA, "CurrentBeggarA" },
+ { Flags::TempKapc, "TempKapc" },
+ { Flags::HomTaken, "HomTaken" },
+ { Flags::WizardTalk, "WizardTalk" },
+ { Flags::SunlordTalk, "SunlordTalk" },
+ { Flags::HermitTalk, "HermitTalk" },
+ { Flags::RunyMode, "RunyMode" },
+ { Flags::FatMerchantTalk, "FatMerchantTalk" },
+ { Flags::HotDogTalk, "HotDogTalk" },
+ { Flags::ThiefTalk, "ThiefTalk" },
+ { Flags::BeggarTalk, "BeggarTalk" },
+ { Flags::MonkTalk, "MonkTalk" },
+ { Flags::BardTalk, "BardTalk" },
+ { Flags::BarmanTalk, "BarmanTalk" },
+ { Flags::LeftPlayerTalk, "LeftPlayerTalk" },
+ { Flags::OczySowy, "OczySowy" },
+ { Flags::CzachySpeed1, "CzachySpeed1" },
+ { Flags::CzachySpeed2, "CzachySpeed2" },
+ { Flags::CzachySpeed3, "CzachySpeed3" },
+ { Flags::CzachySlowDown1, "CzachySlowDown1" },
+ { Flags::CzachySlowDown2, "CzachySlowDown2" },
+ { Flags::CzachySlowDown3, "CzachySlowDown3" },
+ { Flags::FjordDane, "FjordDane" },
+ { Flags::GKopany1, "GKopany1" },
+ { Flags::GKopany2, "GKopany2" },
+ { Flags::GKopany3, "GKopany3" },
+ { Flags::GKopany4, "GKopany4" },
+ { Flags::KnowGodWord, "KnowGodWord" },
+ { Flags::TALKROUT21, "TALKROUT21" },
+ { Flags::TALKROUT22, "TALKROUT22" },
+ { Flags::TALKROUT23, "TALKROUT23" },
+ { Flags::TALKROUT24, "TALKROUT24" },
+ { Flags::TalkType2, "TalkType2" },
+ { Flags::GrabarzTalk, "GrabarzTalk" },
+ { Flags::LastTalker, "LastTalker" },
+ { Flags::MapaPustelniaEnabled, "MapaPustelniaEnabled" },
+ { Flags::MapaTempleEnabled, "MapaTempleEnabled" },
+ { Flags::MapaFjordEnabled, "MapaFjordEnabled" },
+ { Flags::MapaSilmanionaEnabled, "MapaSilmanionaEnabled" },
+ { Flags::MapaKurhanEnabled, "MapaKurhanEnabled" },
+ { Flags::MapaDragonEnabled, "MapaDragonEnabled" },
+ { Flags::MapaMillEnabled, "MapaMillEnabled" },
+ { Flags::DwarfRunning, "DwarfRunning" },
+ { Flags::DwarfTalk, "DwarfTalk" },
+ { Flags::CurseLift, "CurseLift" },
+ { Flags::KosciSwapped, "KosciSwapped" },
+ { Flags::BookStolen, "BookStolen" },
+ { Flags::MapaUsable, "MapaUsable" },
+ { Flags::FjordBoss, "FjordBoss" },
+ { Flags::FjordHotDog, "FjordHotDog" },
+ { Flags::FjordLewy, "FjordLewy" },
+ { Flags::FjordPrawy, "FjordPrawy" },
+ { Flags::TalkArivald, "TalkArivald" },
+ { Flags::ShootDone, "ShootDone" },
+ { Flags::ShootRunning, "ShootRunning" },
+ { Flags::ShootKnow, "ShootKnow" },
+ { Flags::MirrorKnow, "MirrorKnow" },
+ { Flags::Gar1stTime, "Gar1stTime" },
+ { Flags::KosciTaken, "KosciTaken" },
+ { Flags::ArivGotSpell, "ArivGotSpell" },
+ { Flags::BookGiven, "BookGiven" },
+ { Flags::Wywieszka, "Wywieszka" },
+ { Flags::TalkSheila, "TalkSheila" },
+ { Flags::TalkSheila2, "TalkSheila2" },
+ { Flags::BackHuman, "BackHuman" },
+ { Flags::SkarbiecOpen, "SkarbiecOpen" },
+ { Flags::LustroTaken, "LustroTaken" },
+ { Flags::GargoyleHom, "GargoyleHom" },
+ { Flags::GargoyleBroken, "GargoyleBroken" },
+ { Flags::FjordDzien, "FjordDzien" },
+ { Flags::GargoyleHom2, "GargoyleHom2" },
+ { Flags::RunMonstersRunning, "RunMonstersRunning" },
+ { Flags::FoundPaperInCoffin, "FoundPaperInCoffin" },
+ { Flags::KnowSunlord, "KnowSunlord" },
+ { Flags::KnowSunlordTalk, "KnowSunlordTalk" },
+ { Flags::ArivaldCzyta, "ArivaldCzyta" },
+ { Flags::TelepX, "TelepX" },
+ { Flags::TelepY, "TelepY" },
+ { Flags::TelepDir, "TelepDir" },
+ { Flags::TelepRoom, "TelepRoom" },
+ { Flags::ListStolen, "ListStolen" },
+ { Flags::WifeInDoor, "WifeInDoor" },
+ { Flags::TalkWifeFlag, "TalkWifeFlag" },
+ { Flags::LetterGiven, "LetterGiven" },
+ { Flags::LutniaTaken, "LutniaTaken" },
+ { Flags::BardHomeOpen, "BardHomeOpen" },
+ { Flags::FjordNoMonsters, "FjordNoMonsters" },
+ { Flags::ShandriaWallTalking, "ShandriaWallTalking" },
+ { Flags::ShandriaWallCounter, "ShandriaWallCounter" },
+ { Flags::ShandriaWallDone, "ShandriaWallDone" },
+ { Flags::FutureDone, "FutureDone" },
+ { Flags::TalkButch, "TalkButch" },
+ { Flags::GotSzalik, "GotSzalik" },
+ { Flags::GotCzosnek, "GotCzosnek" },
+ { Flags::BearDone, "BearDone" },
+ { Flags::NekrVisited, "NekrVisited" },
+ { Flags::SunRiddle, "SunRiddle" },
+ { Flags::PtaszekAway, "PtaszekAway" },
+ { Flags::KotGadanie, "KotGadanie" },
+ { Flags::SzlafmycaTaken, "SzlafmycaTaken" },
+ { Flags::BabkaTalk, "BabkaTalk" },
+ { Flags::SellerTalk, "SellerTalk" },
+ { Flags::CzosnekDone, "CzosnekDone" },
+ { Flags::PriestCounter, "PriestCounter" },
+ { Flags::PriestGest1, "PriestGest1" },
+ { Flags::PriestGest2, "PriestGest2" },
+ { Flags::PriestGest3, "PriestGest3" },
+ { Flags::PriestGest4, "PriestGest4" },
+ { Flags::PriestAnim, "PriestAnim" },
+ { Flags::HolyWaterTaken, "HolyWaterTaken" },
+ { Flags::AxeTaken, "AxeTaken" },
+ { Flags::BadylTaken1, "BadylTaken1" },
+ { Flags::BadylTaken2, "BadylTaken2" },
+ { Flags::BadylSharpened, "BadylSharpened" },
+ { Flags::PorwanieSmoka, "PorwanieSmoka" },
+ { Flags::ShopReOpen, "ShopReOpen" },
+ { Flags::LuskaShown, "LuskaShown" },
+ { Flags::CudKnow, "CudKnow" },
+ { Flags::VampireDead, "VampireDead" },
+ { Flags::MapaVisible1, "MapaVisible1" },
+ { Flags::MapaVisible2, "MapaVisible2" },
+ { Flags::MapaVisible3, "MapaVisible3" },
+ { Flags::MapaVisible4, "MapaVisible4" },
+ { Flags::MapaVisible5, "MapaVisible5" },
+ { Flags::MapaVisible6, "MapaVisible6" },
+ { Flags::MapaVisible7, "MapaVisible7" },
+ { Flags::MapaVisible8, "MapaVisible8" },
+ { Flags::MapaVisible9, "MapaVisible9" },
+ { Flags::MapaX, "MapaX" },
+ { Flags::MapaY, "MapaY" },
+ { Flags::MapaD, "MapaD" },
+ { Flags::OldMapaX, "OldMapaX" },
+ { Flags::OldMapaY, "OldMapaY" },
+ { Flags::OldMapaD, "OldMapaD" },
+ { Flags::MovingBack, "MovingBack" },
+ { Flags::MapaCount, "MapaCount" },
+ { Flags::Pustelnia1st, "Pustelnia1st" },
+ { Flags::CzarnePole1st, "CzarnePole1st" },
+ { Flags::TalkArivNum, "TalkArivNum" },
+ { Flags::Pfui, "Pfui" },
+ { Flags::MapaSunlordEnabled, "MapaSunlordEnabled" },
+ { Flags::WebDone, "WebDone" },
+ { Flags::DragonDone, "DragonDone" },
+ { Flags::KanPlay, "KanPlay" },
+ { Flags::OldKanPlay, "OldKanPlay" },
+ { Flags::LapkiWait, "LapkiWait" },
+ { Flags::WebNoCheck, "WebNoCheck" },
+ { Flags::Perfumeria, "Perfumeria" },
+ { Flags::SmokNoCheck, "SmokNoCheck" },
+ { Flags::IluzjaBroken, "IluzjaBroken" },
+ { Flags::IluzjaWorking, "IluzjaWorking" },
+ { Flags::IluzjaCounter, "IluzjaCounter" },
+ { Flags::KurhanOpen1, "KurhanOpen1" },
+ { Flags::KastetTaken, "KastetTaken" },
+ { Flags::KastetDown, "KastetDown" },
+ { Flags::KurhanDone, "KurhanDone" },
+ { Flags::SkelCounter, "SkelCounter" },
+ { Flags::SkelDial1, "SkelDial1" },
+ { Flags::SkelDial2, "SkelDial2" },
+ { Flags::SkelDial3, "SkelDial3" },
+ { Flags::SkelDial4, "SkelDial4" },
+ { Flags::SameTalker, "SameTalker" },
+ { Flags::RunMonstersText, "RunMonstersText" },
+ { Flags::PiwnicaChecked, "PiwnicaChecked" },
+ { Flags::DragonTalked, "DragonTalked" },
+ { Flags::ToldAboutBook, "ToldAboutBook" },
+ { Flags::SilmanionaDone, "SilmanionaDone" },
+ { Flags::ToldBookCount, "ToldBookCount" },
+ { Flags::SmrodNoCheck, "SmrodNoCheck" },
+ { Flags::RopeTaken, "RopeTaken" },
+ { Flags::RopeTime, "RopeTime" },
+ { Flags::LaskaFree, "LaskaFree" },
+ { Flags::ShanSmokTalked, "ShanSmokTalked" },
+ { Flags::SwordTaken, "SwordTaken" },
+ { Flags::Mill1st, "Mill1st" },
+ { Flags::SawRat, "SawRat" },
+ { Flags::KnowRat, "KnowRat" },
+ { Flags::DziuraTimer, "DziuraTimer" },
+ { Flags::LaskaInside, "LaskaInside" },
+ { Flags::HoleBig, "HoleBig" },
+ { Flags::EnableWiedzmin, "EnableWiedzmin" },
+ { Flags::EnableTrucizna, "EnableTrucizna" },
+ { Flags::KnowPoison, "KnowPoison" },
+ { Flags::KufelTaken, "KufelTaken" },
+ { Flags::BojkaEnabled, "BojkaEnabled" },
+ { Flags::BitwaNot1st, "BitwaNot1st" },
+ { Flags::BojkaTimer, "BojkaTimer" },
+ { Flags::BojkaGirl, "BojkaGirl" },
+ { Flags::Look1st, "Look1st" },
+ { Flags::RatTaken, "RatTaken" },
+ { Flags::LaskaTalkedGr, "LaskaTalkedGr" },
+ { Flags::RatusGivus, "RatusGivus" },
+ { Flags::MamObole, "MamObole" },
+ { Flags::Speed1st, "Speed1st" },
+ { Flags::SpeedTimer, "SpeedTimer" },
+ { Flags::ProveIt, "ProveIt" },
+ { Flags::Proven, "Proven" },
+ { Flags::ShowWoalka, "ShowWoalka" },
+ { Flags::PoisonTaken, "PoisonTaken" },
+ { Flags::HellOpened, "HellOpened" },
+ { Flags::HellNoCheck, "HellNoCheck" },
+ { Flags::TalAn1, "TalAn1" },
+ { Flags::TalAn2, "TalAn2" },
+ { Flags::TalAn3, "TalAn3" },
+ { Flags::TalkDevilGuard, "TalkDevilGuard" },
+ { Flags::Sword1st, "Sword1st" },
+ { Flags::IluzjaNoCheck, "IluzjaNoCheck" },
+ { Flags::RozdzielniaNumber, "RozdzielniaNumber" },
+ { Flags::JailChecked, "JailChecked" },
+ { Flags::JailTalked, "JailTalked" },
+ { Flags::TrickFailed, "TrickFailed" },
+ { Flags::WegielVisible, "WegielVisible" },
+ { Flags::WegielTimer1, "WegielTimer1" },
+ { Flags::RandomSample, "RandomSample" },
+ { Flags::RandomSampleTimer, "RandomSampleTimer" },
+ { Flags::SampleTimer, "SampleTimer" },
+ { Flags::ZonaSample, "ZonaSample" },
+ { Flags::HoleTryAgain, "HoleTryAgain" },
+ { Flags::TeleportTimer, "TeleportTimer" },
+ { Flags::RozLezy, "RozLezy" },
+ { Flags::UdkoTimer, "UdkoTimer" },
+ { Flags::ZaworZatkany, "ZaworZatkany" },
+ { Flags::ZaworOpened, "ZaworOpened" },
+ { Flags::DoorExploded, "DoorExploded" },
+ { Flags::SkoraTaken, "SkoraTaken" },
+ { Flags::CiezkieByl, "CiezkieByl" },
+ { Flags::MamWegiel, "MamWegiel" },
+ { Flags::SwiecaAway, "SwiecaAway" },
+ { Flags::ITSAVE, "ITSAVE" },
+ { Flags::RozpadlSie, "RozpadlSie" },
+ { Flags::WegielFullTimer, "WegielFullTimer" },
+ { Flags::WegielDown, "WegielDown" },
+ { Flags::WegielDownTimer, "WegielDownTimer" },
+ { Flags::PaliSie, "PaliSie" },
+ { Flags::DiabGuardTalked, "DiabGuardTalked" },
+ { Flags::GuardsNoCheck, "GuardsNoCheck" },
+ { Flags::TalkedPowloka, "TalkedPowloka" },
+ { Flags::JailOpen, "JailOpen" },
+ { Flags::PrzytulTimer, "PrzytulTimer" },
+ { Flags::JailDone, "JailDone" },
+ { Flags::MamMonety, "MamMonety" },
+ { Flags::LotTimer, "LotTimer" },
+ { Flags::LotObj, "LotObj" },
+ { Flags::PtakTimer, "PtakTimer" },
+ { Flags::BookTimer, "BookTimer" },
+ { Flags::BookGiba, "BookGiba" },
+ { Flags::PtakLata, "PtakLata" },
+ { Flags::Podej, "Podej" },
+ { Flags::GotHint, "GotHint" },
+ { Flags::LawaLeci, "LawaLeci" },
+ { Flags::PowerKlik, "PowerKlik" },
+ { Flags::LucekBad, "LucekBad" },
+ { Flags::LucekBad1st, "LucekBad1st" },
+ { Flags::IntroDial1, "IntroDial1" },
+ { Flags::IntroDial2, "IntroDial2" },
+ { Flags::ItsOutro, "ItsOutro" },
+ { Flags::KamienComment, "KamienComment" },
+ { Flags::KamienSkip, "KamienSkip" },
+ { Flags::TesterFlag, "TesterFlag" },
+ { Flags::RememberLine, "RememberLine" },
+ { Flags::OpisLapek, "OpisLapek" },
+ { Flags::TalWait, "TalWait" },
+ { Flags::OpisKamienia, "OpisKamienia" },
+ { Flags::JumpBox, "JumpBox" },
+ { Flags::JumpBox1, "JumpBox1" },
+ { Flags::JumpBox2, "JumpBox2" },
+ { Flags::JumpBox3, "JumpBox3" },
+ { Flags::SpecPiesek, "SpecPiesek" },
+ { Flags::SpecPiesekCount, "SpecPiesekCount" },
+ { Flags::SpecPiesekGadanie, "SpecPiesekGadanie" },
+ { Flags::ZnikaFlag, "ZnikaFlag" },
+ { Flags::ZnikaTimer, "ZnikaTimer" },
+ { Flags::SowaTimer, "SowaTimer" },
+ { Flags::MamrotanieOff, "MamrotanieOff" },
+ { Flags::CURRMOB, "CURRMOB" },
+ { Flags::KOLOR, "KOLOR" },
+ { Flags::MBFLAG, "MBFLAG" },
+ { Flags::MXFLAG, "MXFLAG" },
+ { Flags::MYFLAG, "MYFLAG" },
+ { Flags::SCROLLTYPE, "SCROLLTYPE" },
+ { Flags::SCROLLVALUE, "SCROLLVALUE" },
+ { Flags::SCROLLVALUE2, "SCROLLVALUE2" },
+ { Flags::TALKEXITCODE, "TALKEXITCODE" },
+ { Flags::SPECROUTFLAG1, "SPECROUTFLAG1" },
+ { Flags::SPECROUTFLAG2, "SPECROUTFLAG2" },
+ { Flags::SPECROUTFLAG3, "SPECROUTFLAG3" },
+ { Flags::TALKFLAGCODE, "TALKFLAGCODE" },
+ { Flags::CURRROOM, "CURRROOM" },
+ { Flags::Talker1Init, "Talker1Init" },
+ { Flags::Talker2Init, "Talker2Init" },
+ { Flags::RESTOREROOM, "RESTOREROOM" },
+ { Flags::INVALLOWED, "INVALLOWED" },
+ { Flags::BOXSEL, "BOXSEL" },
+ { Flags::CURSEBLINK, "CURSEBLINK" },
+ { Flags::EXACTMOVE, "EXACTMOVE" },
+ { Flags::MOVEDESTX, "MOVEDESTX" },
+ { Flags::MOVEDESTY, "MOVEDESTY" },
+ { Flags::NOANTIALIAS, "NOANTIALIAS" },
+ { Flags::ESCAPED, "ESCAPED" },
+ { Flags::ALLOW1OPTION, "ALLOW1OPTION" },
+ { Flags::VOICE_H_LINE, "VOICE_H_LINE" },
+ { Flags::VOICE_A_LINE, "VOICE_A_LINE" },
+ { Flags::VOICE_B_LINE, "VOICE_B_LINE" },
+ { Flags::VOICE_C_LINE, "VOICE_C_LINE" },
+ { Flags::NOHEROATALL, "NOHEROATALL" },
+ { Flags::MOUSEENABLED, "MOUSEENABLED" },
+ { Flags::DIALINES, "DIALINES" },
+ { Flags::SHANWALK, "SHANWALK" },
+ { Flags::SHANDOG, "SHANDOG" },
+ { Flags::GETACTIONBACK, "GETACTIONBACK" },
+ { Flags::GETACTIONDATA, "GETACTIONDATA" },
+ { Flags::GETACTION, "GETACTION" },
+ { Flags::HEROFAST, "HEROFAST" },
+ { Flags::SELITEM, "SELITEM" },
+ { Flags::LMOUSE, "LMOUSE" },
+ { Flags::MINMX, "MINMX" },
+ { Flags::MAXMX, "MAXMX" },
+ { Flags::MINMY, "MINMY" },
+ { Flags::MAXMY, "MAXMY" },
+ { Flags::TORX1, "TORX1" },
+ { Flags::TORY1, "TORY1" },
+ { Flags::TORX2, "TORX2" },
+ { Flags::TORY2, "TORY2" },
+ { Flags::POWER, "POWER" },
+ { Flags::POWERENABLED, "POWERENABLED" },
+ { Flags::FLCRESTORE, "FLCRESTORE" },
+ { Flags::NOCLSTEXT, "NOCLSTEXT" },
+ { Flags::ESCAPED2, "ESCAPED2" },
+};
diff --git a/engines/prince/flags.h b/engines/prince/flags.h
new file mode 100644
index 0000000..667f3a4
--- /dev/null
+++ b/engines/prince/flags.h
@@ -0,0 +1,417 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef PRINCE_FLAGS_H
+#define PRINCE_FLAGS_H
+
+#include "common/scummsys.h"
+
+class Flags {
+public:
+ static int compareFlagDebug(const void *a, const void *b);
+ static const char *getFlagName(uint16 flagId);
+
+ enum Id {
+ FLAGA1 = 0x8000,
+ FLAGA2 = 0x8002,
+ FLAGA3 = 0x8004,
+ DESTX = 0x8006,
+ DESTY = 0x8008,
+ DESTD = 0x800A,
+ DwarfDone = 0x800C,
+ GRABARZCOUNTER = 0x800E,
+ KIERUNEK = 0x8010,
+ BACKFLAG1 = 0x8012,
+ BACKFLAG2 = 0x8014,
+ BACKFLAG3 = 0x8016,
+ BACKFLAG4 = 0x8018,
+ MACROFLAG1 = 0x801A,
+ MACROFLAG2 = 0x801C,
+ MACROFLAG3 = 0x801E,
+ HEROLDDONE = 0x8020,
+ BRIDGESET = 0x8022,
+ U_BT_1 = 0x8024,
+ U_BT_2 = 0x8026,
+ U_BT_3 = 0x8028,
+ U_BT_4 = 0x802A,
+ U_BT_5 = 0x802C,
+ U_BT_6 = 0x802E,
+ U_BT_7 = 0x8030,
+ U_BT_8 = 0x8032,
+ U_BT_9 = 0x8034,
+ U_BT_COUNTER = 0x8036,
+ ARIVALDALIVE = 0x8038,
+ TALKCHAR1 = 0x803A,
+ TalkType1 = 0x803C,
+ TALKROUT1 = 0x803E,
+ TALKROUT2 = 0x8042,
+ TALKROUT3 = 0x8046,
+ TALKROUT4 = 0x804A,
+ TALKANIM1 = 0x804E,
+ TALKANIM2 = 0x8050,
+ TALKCOLOR1 = 0x8052,
+ TALKCOLOR2 = 0x8054,
+ KapciuchTaken = 0x8056,
+ CurrentBeggarA = 0x8058,
+ TempKapc = 0x805A,
+ HomTaken = 0x805C,
+ WizardTalk = 0x805E,
+ SunlordTalk = 0x8060,
+ HermitTalk = 0x8062,
+ RunyMode = 0x8064,
+ FatMerchantTalk = 0x8066,
+ HotDogTalk = 0x8068,
+ ThiefTalk = 0x806A,
+ BeggarTalk = 0x806C,
+ // DwarfTalk = 0x806E, // Redefinition
+ MonkTalk = 0x8070,
+ BardTalk = 0x8072,
+ BarmanTalk = 0x8074,
+ LeftPlayerTalk = 0x8076,
+ OczySowy = 0x8078,
+ CzachySpeed1 = 0x807A,
+ CzachySpeed2 = 0x807C,
+ CzachySpeed3 = 0x807E,
+ CzachySlowDown1 = 0x8080,
+ CzachySlowDown2 = 0x8082,
+ CzachySlowDown3 = 0x8084,
+ FjordDane = 0x8086,
+ GKopany1 = 0x8088,
+ GKopany2 = 0x808A,
+ GKopany3 = 0x808C,
+ GKopany4 = 0x808E,
+ KnowGodWord = 0x8090,
+ TALKROUT21 = 0x8092,
+ TALKROUT22 = 0x8096,
+ TALKROUT23 = 0x809A,
+ TALKROUT24 = 0x809E,
+ TalkType2 = 0x80A2,
+ GrabarzTalk = 0x80A4,
+ LastTalker = 0x80A6,
+ MapaPustelniaEnabled = 0x80A8,
+ MapaTempleEnabled = 0x80AA,
+ MapaFjordEnabled = 0x80AC,
+ MapaSilmanionaEnabled = 0x80AE,
+ MapaKurhanEnabled = 0x80B0,
+ MapaDragonEnabled = 0x80B2,
+ MapaMillEnabled = 0x80B4,
+ DwarfRunning = 0x80B6,
+ DwarfTalk = 0x80B8,
+ CurseLift = 0x80BA,
+ KosciSwapped = 0x80BC,
+ BookStolen = 0x80BE,
+ MapaUsable = 0x80C0,
+ FjordBoss = 0x80C2,
+ FjordHotDog = 0x80C4,
+ FjordLewy = 0x80C6,
+ FjordPrawy = 0x80C8,
+ TalkArivald = 0x80CA,
+ ShootDone = 0x80CC,
+ ShootRunning = 0x80CE,
+ ShootKnow = 0x80D0,
+ MirrorKnow = 0x80D2,
+ Gar1stTime = 0x80D4,
+ KosciTaken = 0x80D6,
+ ArivGotSpell = 0x80D8,
+ BookGiven = 0x80DA,
+ Wywieszka = 0x80DC,
+ TalkSheila = 0x80DE,
+ TalkSheila2 = 0x80E0,
+ BackHuman = 0x80E2,
+ SkarbiecOpen = 0x80E4,
+ LustroTaken = 0x80E6,
+ GargoyleHom = 0x80E8,
+ GargoyleBroken = 0x80EA,
+ FjordDzien = 0x80EC,
+ GargoyleHom2 = 0x80EE,
+ RunMonstersRunning = 0x80F0,
+ FoundPaperInCoffin = 0x80F2,
+ KnowSunlord = 0x80F4,
+ KnowSunlordTalk = 0x80F6,
+ ArivaldCzyta = 0x80F8,
+ TelepX = 0x80FA,
+ TelepY = 0x80FC,
+ TelepDir = 0x80FE,
+ TelepRoom = 0x8100,
+ ListStolen = 0x8102,
+ WifeInDoor = 0x8104,
+ TalkWifeFlag = 0x8106,
+ LetterGiven = 0x8108,
+ LutniaTaken = 0x810A,
+ BardHomeOpen = 0x810C,
+ FjordNoMonsters = 0x810E,
+ ShandriaWallTalking = 0x8110,
+ ShandriaWallCounter = 0x8112,
+ ShandriaWallDone = 0x8114,
+ FutureDone = 0x8116,
+ TalkButch = 0x8118,
+ GotSzalik = 0x811A,
+ GotCzosnek = 0x811C,
+ BearDone = 0x811E,
+ NekrVisited = 0x8120,
+ SunRiddle = 0x8122,
+ PtaszekAway = 0x8124,
+ KotGadanie = 0x8126,
+ SzlafmycaTaken = 0x8128,
+ BabkaTalk = 0x812A,
+ SellerTalk = 0x812C,
+ CzosnekDone = 0x812E,
+ PriestCounter = 0x8130,
+ PriestGest1 = 0x8132,
+ PriestGest2 = 0x8134,
+ PriestGest3 = 0x8136,
+ PriestGest4 = 0x8138,
+ PriestAnim = 0x813A,
+ HolyWaterTaken = 0x813C,
+ AxeTaken = 0x813E,
+ BadylTaken1 = 0x8140,
+ BadylTaken2 = 0x8142,
+ BadylSharpened = 0x8144,
+ PorwanieSmoka = 0x8146,
+ ShopReOpen = 0x8148,
+ LuskaShown = 0x814A,
+ CudKnow = 0x814C,
+ VampireDead = 0x814E,
+ MapaVisible1 = 0x8150,
+ MapaVisible2 = 0x8152,
+ MapaVisible3 = 0x8154,
+ MapaVisible4 = 0x8156,
+ MapaVisible5 = 0x8158,
+ MapaVisible6 = 0x815A,
+ MapaVisible7 = 0x815C,
+ MapaVisible8 = 0x815E,
+ MapaVisible9 = 0x8160,
+ MapaX = 0x8162,
+ MapaY = 0x8164,
+ MapaD = 0x8166,
+ OldMapaX = 0x8168,
+ OldMapaY = 0x816A,
+ OldMapaD = 0x816C,
+ MovingBack = 0x816E,
+ MapaCount = 0x8170,
+ Pustelnia1st = 0x8172,
+ CzarnePole1st = 0x8174,
+ TalkArivNum = 0x8176,
+ Pfui = 0x8178,
+ MapaSunlordEnabled = 0x817A,
+ WebDone = 0x817C,
+ DragonDone = 0x817E,
+ KanPlay = 0x8180,
+ OldKanPlay = 0x8182,
+ LapkiWait = 0x8184,
+ WebNoCheck = 0x8186,
+ Perfumeria = 0x8188,
+ SmokNoCheck = 0x818A,
+ IluzjaBroken = 0x818C,
+ IluzjaWorking = 0x818E,
+ IluzjaCounter = 0x8190,
+ KurhanOpen1 = 0x8192,
+ KastetTaken = 0x8194,
+ KastetDown = 0x8196,
+ KurhanDone = 0x8198,
+ SkelCounter = 0x819A,
+ SkelDial1 = 0x819C,
+ SkelDial2 = 0x819E,
+ SkelDial3 = 0x81A0,
+ SkelDial4 = 0x81A2,
+ SameTalker = 0x81A4,
+ RunMonstersText = 0x81A6,
+ PiwnicaChecked = 0x81A8,
+ DragonTalked = 0x81AA,
+ ToldAboutBook = 0x81AC,
+ SilmanionaDone = 0x81AE,
+ ToldBookCount = 0x81B0,
+ SmrodNoCheck = 0x81B2,
+ RopeTaken = 0x81B4,
+ RopeTime = 0x81B6,
+ LaskaFree = 0x81B8,
+ ShanSmokTalked = 0x81BA,
+ SwordTaken = 0x81BC,
+ Mill1st = 0x81BE,
+ SawRat = 0x81C0,
+ KnowRat = 0x81C2,
+ DziuraTimer = 0x81C4,
+ LaskaInside = 0x81C6,
+ HoleBig = 0x81C8,
+ EnableWiedzmin = 0x81CA,
+ EnableTrucizna = 0x81CC,
+ KnowPoison = 0x81CE,
+ KufelTaken = 0x81D0,
+ BojkaEnabled = 0x81D2,
+ BitwaNot1st = 0x81D4,
+ BojkaTimer = 0x81D6,
+ BojkaGirl = 0x81D8,
+ Look1st = 0x81DA,
+ RatTaken = 0x81DC,
+ LaskaTalkedGr = 0x81DE,
+ RatusGivus = 0x81E0,
+ MamObole = 0x81E2,
+ Speed1st = 0x81E4,
+ SpeedTimer = 0x81E6,
+ ProveIt = 0x81E8,
+ Proven = 0x81EA,
+ ShowWoalka = 0x81EC,
+ PoisonTaken = 0x81EE,
+ HellOpened = 0x81F0,
+ HellNoCheck = 0x81F2,
+ TalAn1 = 0x81F4,
+ TalAn2 = 0x81F6,
+ TalAn3 = 0x81F8,
+ TalkDevilGuard = 0x81fA,
+ Sword1st = 0x81FC,
+ IluzjaNoCheck = 0x81FE,
+ RozdzielniaNumber = 0x8200,
+ JailChecked = 0x8202,
+ JailTalked = 0x8204,
+ TrickFailed = 0x8206,
+ WegielVisible = 0x8208,
+ WegielTimer1 = 0x820A,
+ RandomSample = 0x820C,
+ RandomSampleTimer = 0x820E,
+ SampleTimer = 0x8210,
+ ZonaSample = 0x8212,
+ HoleTryAgain = 0x8214,
+ TeleportTimer = 0x8216,
+ RozLezy = 0x8218,
+ UdkoTimer = 0x821A,
+ ZaworZatkany = 0x821C,
+ ZaworOpened = 0x821E,
+ DoorExploded = 0x8220,
+ SkoraTaken = 0x8222,
+ CiezkieByl = 0x8224,
+ MamWegiel = 0x8226,
+ SwiecaAway = 0x8228,
+ ITSAVE = 0x822A,
+ RozpadlSie = 0x822C,
+ WegielFullTimer = 0x822E,
+ WegielDown = 0x8230,
+ WegielDownTimer = 0x8232,
+ PaliSie = 0x8234,
+ DiabGuardTalked = 0x8236,
+ GuardsNoCheck = 0x8238,
+ TalkedPowloka = 0x823A,
+ JailOpen = 0x823C,
+ PrzytulTimer = 0x823E,
+ JailDone = 0x8240,
+ MamMonety = 0x8242,
+ LotTimer = 0x8244,
+ LotObj = 0x8246,
+ PtakTimer = 0x8248,
+ BookTimer = 0x824A,
+ BookGiba = 0x824C,
+ PtakLata = 0x824E,
+ Podej = 0x8250,
+ GotHint = 0x8252,
+ LawaLeci = 0x8254,
+ PowerKlik = 0x8258,
+ LucekBad = 0x825A,
+ LucekBad1st = 0x825C,
+ IntroDial1 = 0x825E,
+ IntroDial2 = 0x8260,
+ ItsOutro = 0x8262,
+ KamienComment = 0x8264,
+ KamienSkip = 0x8266,
+ TesterFlag = 0x8268,
+ RememberLine = 0x826A,
+ OpisLapek = 0x826C,
+ //OpisKamienia = 0x826E, // Redefinition
+ TalWait = 0x8270,
+ OpisKamienia = 0x8272,
+ JumpBox = 0x8274,
+ JumpBox1 = 0x8276,
+ JumpBox2 = 0x8278,
+ JumpBox3 = 0x827A,
+ SpecPiesek = 0x827C,
+ SpecPiesekCount = 0x827E,
+ SpecPiesekGadanie = 0x8282,
+ ZnikaFlag = 0x8284,
+ ZnikaTimer = 0x8286,
+ SowaTimer = 0x8288,
+ MamrotanieOff = 0x828A,
+ // System flags controlled by script
+ CURRMOB = 0x8400,
+ KOLOR = 0x8402,
+ MBFLAG = 0x8404,
+ MXFLAG = 0x8406,
+ MYFLAG = 0x8408,
+ SCROLLTYPE = 0x840A,
+ SCROLLVALUE = 0x840C,
+ SCROLLVALUE2 = 0x840E,
+ TALKEXITCODE = 0x8410,
+ SPECROUTFLAG1 = 0x8412,
+ SPECROUTFLAG2 = 0x8414,
+ SPECROUTFLAG3 = 0x8416,
+ TALKFLAGCODE = 0x8418,
+ CURRROOM = 0x841A,
+ Talker1Init = 0x841C,
+ Talker2Init = 0x841E,
+ RESTOREROOM = 0x8420,
+ INVALLOWED = 0x8422,
+ BOXSEL = 0x8424,
+ CURSEBLINK = 0x8426,
+ EXACTMOVE = 0x8428,
+ MOVEDESTX = 0x842A,
+ MOVEDESTY = 0x842C,
+ NOANTIALIAS = 0x842E,
+ ESCAPED = 0x8430,
+ ALLOW1OPTION = 0x8432,
+ VOICE_H_LINE = 0x8434,
+ VOICE_A_LINE = 0x8436,
+ VOICE_B_LINE = 0x8438,
+ VOICE_C_LINE = 0x843A,
+ NOHEROATALL = 0x843C,
+ MOUSEENABLED = 0x843E,
+ DIALINES = 0x8440,
+ //SELITEM = 0x8442, // Redefinition
+ SHANWALK = 0x8444,
+ SHANDOG = 0x8446,
+ GETACTIONBACK = 0x8448,
+ GETACTIONDATA = 0x844C,
+ GETACTION = 0x8450,
+ HEROFAST = 0x8452,
+ SELITEM = 0x8454,
+ LMOUSE = 0x8456,
+ MINMX = 0x8458,
+ MAXMX = 0x845A,
+ MINMY = 0x845C,
+ MAXMY = 0x845E,
+ TORX1 = 0x8460,
+ TORY1 = 0x8462,
+ TORX2 = 0x8464,
+ TORY2 = 0x8466,
+ POWER = 0x8468,
+ POWERENABLED = 0x846A,
+ FLCRESTORE = 0x846C,
+ NOCLSTEXT = 0x846E,
+ ESCAPED2 = 0x8470
+ };
+
+ struct FlagDebug {
+ Id id;
+ char flagName[30];
+ };
+
+ static const int kFlagDebugAmount = 368;
+ static const FlagDebug _flagNames[kFlagDebugAmount];
+};
+
+#endif
Commit: 9693e24bdf2833920bc09a8b0499dfbd7384770b
https://github.com/scummvm/scummvm-tools/commit/9693e24bdf2833920bc09a8b0499dfbd7384770b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T05:43:41+02:00
Commit Message:
TOOLS: PRINCE: Added support for location table in dexompiler
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 78e76ca..3386a16 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -231,6 +231,7 @@ void decompile(const char *sname, byte *data, int pos) {
printf("Script %s\n", sname);
bool nf = false;
+ int tableOffset = -1;
while (!nf) {
uint16 op = READ_LE_UINT16(&data[pos]); pos += 2;
@@ -239,7 +240,7 @@ void decompile(const char *sname, byte *data, int pos) {
const char *param = opcodes[op].params;
- printf("%s", opcodes[op].name);
+ printf(" %s", opcodes[op].name);
if (*param)
printf(" ");
@@ -273,10 +274,20 @@ void decompile(const char *sname, byte *data, int pos) {
v = READ_LE_UINT32(&data[pos]); pos += 4;
printf("[%d]", v);
break;
+ case 't':
+ v = READ_LE_UINT32(&data[pos]); pos += 4;
+ if (tableOffset != -1 && tableOffset != v) {
+ error("Duplicate tableOffset: %d vs %d", tableOffset, v);
+ }
+ tableOffset = v;
+ printf("<tableOffset>");
+ break;
case 'r':
error("Unsupported op %s", opcodes[op].name);
+ return;
default:
- error("Unhandled param '%c' for %s", opcodes[op].name);
+ error("Unhandled param '%c' for %s", *param, opcodes[op].name);
+ return;
}
param++;
@@ -287,6 +298,21 @@ void decompile(const char *sname, byte *data, int pos) {
printf("\n");
}
+
+ if (tableOffset != -1) {
+ printf("tableOffset: %d\n[", tableOffset);
+ for (int i = 0; i < kMaxRooms; i++) {
+ if (i && !(i % 10))
+ printf("\n ");
+
+ printf("%d", (uint32)READ_LE_UINT32(&data[tableOffset + i * 4]));
+ if (i != kMaxRooms - 1)
+ printf(", ");
+ }
+ printf("]\n");
+ }
+
+ printf("End Script\n\n");
}
int main(int argc, char *argv[]) {
@@ -401,6 +427,7 @@ int main(int argc, char *argv[]) {
}
decompile("StartGame", decompData, scriptInfo.startGame);
+ decompile("RestoreGame", decompData, scriptInfo.restoreGame);
return 0;
}
Commit: 661e2fc50b1d0a430c8f5e76e963e2563424a2b0
https://github.com/scummvm/scummvm-tools/commit/661e2fc50b1d0a430c8f5e76e963e2563424a2b0
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T06:04:09+02:00
Commit Message:
TOOLS: PRINCE: Implemented data marking in decompiler
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 3386a16..ca3f5e4 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -227,14 +227,21 @@ void printUsage(const char *appName) {
printf("Usage: %s skrypt.dat\n", appName);
}
-void decompile(const char *sname, byte *data, int pos) {
+byte *data;
+uint32 dataLen;
+bool *dataMark;
+
+#define ADVANCE2() dataMark[pos] = true; pos++; dataMark[pos] = true; pos++
+#define ADVANCE4() ADVANCE2(); ADVANCE2()
+
+void decompile(const char *sname, int pos) {
printf("Script %s\n", sname);
bool nf = false;
int tableOffset = -1;
while (!nf) {
- uint16 op = READ_LE_UINT16(&data[pos]); pos += 2;
+ uint16 op = READ_LE_UINT16(&data[pos]); ADVANCE2();
nf = opcodes[op].nf;
@@ -250,7 +257,7 @@ void decompile(const char *sname, byte *data, int pos) {
while (*param) {
switch (*param) {
case 'f':
- v = READ_LE_UINT16(&data[pos]); pos += 2;
+ v = READ_LE_UINT16(&data[pos]); ADVANCE2();
if (v & 0x8000) {
printf("%s", Flags::getFlagName(v));
@@ -259,23 +266,23 @@ void decompile(const char *sname, byte *data, int pos) {
}
break;
case 'h':
- v = READ_LE_UINT16(&data[pos]); pos += 2;
+ v = READ_LE_UINT16(&data[pos]); ADVANCE2();
printf("%d", v);
break;
case 'i':
- v = READ_LE_UINT32(&data[pos]); pos += 4;
+ v = READ_LE_UINT32(&data[pos]); ADVANCE4();
printf("%d", v);
break;
case 'd':
- v = READ_LE_UINT16(&data[pos]); pos += 2;
+ v = READ_LE_UINT16(&data[pos]); ADVANCE2();
printf("%s", Flags::getFlagName(v));
break;
case 'o':
- v = READ_LE_UINT32(&data[pos]); pos += 4;
+ v = READ_LE_UINT32(&data[pos]); ADVANCE4();
printf("[%d]", v);
break;
case 't':
- v = READ_LE_UINT32(&data[pos]); pos += 4;
+ v = READ_LE_UINT32(&data[pos]); ADVANCE4();
if (tableOffset != -1 && tableOffset != v) {
error("Duplicate tableOffset: %d vs %d", tableOffset, v);
}
@@ -301,11 +308,14 @@ void decompile(const char *sname, byte *data, int pos) {
if (tableOffset != -1) {
printf("tableOffset: %d\n[", tableOffset);
+
+ pos = tableOffset;
+
for (int i = 0; i < kMaxRooms; i++) {
if (i && !(i % 10))
printf("\n ");
- printf("%d", (uint32)READ_LE_UINT32(&data[tableOffset + i * 4]));
+ printf("%d", (uint32)READ_LE_UINT32(&data[pos])); ADVANCE4();
if (i != kMaxRooms - 1)
printf(", ");
}
@@ -328,10 +338,10 @@ int main(int argc, char *argv[]) {
}
uint32 size = scriptFile.size();
- uint8 *data = new uint8[size];
- assert(data);
- if (size != scriptFile.read_noThrow(data, size)) {
- delete [] data;
+ uint8 *fdata = new uint8[size];
+ assert(fdata);
+ if (size != scriptFile.read_noThrow(fdata, size)) {
+ delete [] fdata;
error("couldn't read all bytes from file '%s'", argv[1]);
return 1;
}
@@ -339,35 +349,37 @@ int main(int argc, char *argv[]) {
scriptFile.close();
Decompressor dec;
- uint32 decompLen = READ_BE_UINT32(data + 14);
- byte *decompData = (byte *)malloc(decompLen);
- dec.decompress(data + 18, decompData, decompLen);
- delete [] data;
+ dataLen = READ_BE_UINT32(fdata + 14);
+ data = (byte *)malloc(dataLen);
+ dec.decompress(fdata + 18, data, dataLen);
+ delete [] fdata;
- byte *pos = decompData;
+ dataMark = (bool *)calloc(dataLen, sizeof(bool));
+
+ int pos = 0;
ScriptInfo scriptInfo;
- scriptInfo.rooms = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.startGame = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.restoreGame = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdExamine = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdPickup = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdUse = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdOpen = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdClose = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdTalk = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdGive = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.usdCode = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.invObjExam = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.invObjUse = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.invObjUU = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdUseItem = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.lightSources = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.specRout = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.invObjGive = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.stdGiveItem = READ_LE_UINT32(pos); pos += 4;
- scriptInfo.goTester = READ_LE_UINT32(pos); pos += 4;
+ scriptInfo.rooms = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.startGame = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.restoreGame = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdExamine = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdPickup = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdUse = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdOpen = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdClose = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdTalk = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdGive = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.usdCode = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.invObjExam = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.invObjUse = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.invObjUU = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdUseItem = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.lightSources = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.specRout = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.invObjGive = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.stdGiveItem = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ scriptInfo.goTester = READ_LE_UINT32(&data[pos]); ADVANCE4();
printf("Rooms: %d\n", scriptInfo.rooms);
printf("StartGame: %d\n", scriptInfo.startGame);
@@ -393,22 +405,22 @@ int main(int argc, char *argv[]) {
Room rooms[kMaxRooms];
for (int i = 0; i < kMaxRooms; i++) {
- pos = &decompData[scriptInfo.rooms + i * 64];
-
- rooms[i].mobs = READ_LE_UINT32(pos); pos += 4;
- rooms[i].backAnim = READ_LE_UINT32(pos); pos += 4;
- rooms[i].obj = READ_LE_UINT32(pos); pos += 4;
- rooms[i].nak = READ_LE_UINT32(pos); pos += 4;
- rooms[i].itemUse = READ_LE_UINT32(pos); pos += 4;
- rooms[i].itemGive = READ_LE_UINT32(pos); pos += 4;
- rooms[i].walkTo = READ_LE_UINT32(pos); pos += 4;
- rooms[i].examine = READ_LE_UINT32(pos); pos += 4;
- rooms[i].pickup = READ_LE_UINT32(pos); pos += 4;
- rooms[i].use = READ_LE_UINT32(pos); pos += 4;
- rooms[i].pushOpen = READ_LE_UINT32(pos); pos += 4;
- rooms[i].pullClose = READ_LE_UINT32(pos); pos += 4;
- rooms[i].talk = READ_LE_UINT32(pos); pos += 4;
- rooms[i].give = READ_LE_UINT32(pos); pos += 4;
+ pos = scriptInfo.rooms + i * 64;
+
+ rooms[i].mobs = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].backAnim = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].obj = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].nak = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].itemUse = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].itemGive = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].walkTo = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].examine = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].pickup = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].use = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].pushOpen = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].pullClose = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].talk = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].give = READ_LE_UINT32(&data[pos]); ADVANCE4();
printf("r%02d mobs: %d\n", i, rooms[i].mobs);
printf("r%02d backAnim: %d\n", i, rooms[i].backAnim);
@@ -426,8 +438,13 @@ int main(int argc, char *argv[]) {
printf("r%02d give: %d\n", i, rooms[i].give);
}
- decompile("StartGame", decompData, scriptInfo.startGame);
- decompile("RestoreGame", decompData, scriptInfo.restoreGame);
+ decompile("StartGame", scriptInfo.startGame);
+ decompile("RestoreGame", scriptInfo.restoreGame);
+
+ for (uint i = 0; i < dataLen & 0; i++)
+ printf("%c", dataMark[i] ? '*' : '.');
+
+ printf("\n");
return 0;
}
Commit: fd31295798203d199edbd05a674ca00f0a773277
https://github.com/scummvm/scummvm-tools/commit/fd31295798203d199edbd05a674ca00f0a773277
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T06:09:05+02:00
Commit Message:
TOOLS: PRINCE: Read two more fields in rooms
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index ca3f5e4..bd67f3d 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -221,6 +221,8 @@ struct Room {
int pullClose;
int talk;
int give;
+ int unk1;
+ int unk2;
};
void printUsage(const char *appName) {
@@ -421,6 +423,8 @@ int main(int argc, char *argv[]) {
rooms[i].pullClose = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].talk = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].give = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].unk1 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].unk2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
printf("r%02d mobs: %d\n", i, rooms[i].mobs);
printf("r%02d backAnim: %d\n", i, rooms[i].backAnim);
@@ -436,15 +440,19 @@ int main(int argc, char *argv[]) {
printf("r%02d pullClose: %d\n", i, rooms[i].pullClose);
printf("r%02d talk: %d\n", i, rooms[i].talk);
printf("r%02d give: %d\n", i, rooms[i].give);
+ printf("r%02d unk1: %d\n", i, rooms[i].unk1);
+ printf("r%02d unk2: %d\n", i, rooms[i].unk2);
}
decompile("StartGame", scriptInfo.startGame);
decompile("RestoreGame", scriptInfo.restoreGame);
- for (uint i = 0; i < dataLen & 0; i++)
+#if 0
+ for (uint i = 0; i < dataLen; i++)
printf("%c", dataMark[i] ? '*' : '.');
printf("\n");
+#endif
return 0;
}
Commit: c33f3d97a6ca125c6abe4a032148075297ba4ee9
https://github.com/scummvm/scummvm-tools/commit/c33f3d97a6ca125c6abe4a032148075297ba4ee9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T10:07:44+02:00
Commit Message:
TOOLS: PRINCE: Dump room contents in disassembly
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index bd67f3d..0937efe 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -31,6 +31,9 @@
#include <assert.h>
static const int16 kMaxRooms = 60;
+static const int kMaxBackAnims = 64;
+static const int kMaxMobs = 64;
+static const int kMaxObjects = 64;
struct OpCodes {
const char *name;
@@ -225,6 +228,19 @@ struct Room {
int unk2;
};
+struct Mask {
+ uint16 _state; // visible / invisible
+ int16 _flags; // turning on / turning off of an mask
+ int16 _x1;
+ int16 _y1;
+ int16 _x2;
+ int16 _y2;
+ int16 _z;
+ int16 _number; // number of mask for background recreating
+ int16 _width;
+ int16 _height;
+};
+
void printUsage(const char *appName) {
printf("Usage: %s skrypt.dat\n", appName);
}
@@ -233,9 +249,36 @@ byte *data;
uint32 dataLen;
bool *dataMark;
-#define ADVANCE2() dataMark[pos] = true; pos++; dataMark[pos] = true; pos++
+#define ADVANCE() dataMark[pos] = true; pos++
+#define ADVANCE2() ADVANCE(); ADVANCE()
#define ADVANCE4() ADVANCE2(); ADVANCE2()
+void printArray(int offset, int type, int size, bool split = true) {
+ printf("[");
+
+ int pos = offset;
+
+ for (int i = 0; i < size; i++) {
+ if (split && i && !(i % 10))
+ printf("\n ");
+
+ if (type == 1) {
+ printf("%d", data[pos]); ADVANCE();
+ } else if (type == 2) {
+ printf("%d", (uint16)READ_LE_UINT16(&data[pos])); ADVANCE2();
+ } else if (type == 4) {
+ printf("%d", (uint32)READ_LE_UINT32(&data[pos])); ADVANCE4();
+ } else {
+ error("printArray: unknown type %d", type);
+ }
+
+ if (i != size - 1)
+ printf(", ");
+ }
+
+ printf("]\n");
+}
+
void decompile(const char *sname, int pos) {
printf("Script %s\n", sname);
@@ -309,22 +352,63 @@ void decompile(const char *sname, int pos) {
}
if (tableOffset != -1) {
- printf("tableOffset: %d\n[", tableOffset);
+ printf("tableOffset: %d\n", tableOffset);
- pos = tableOffset;
+ printArray(tableOffset, 4, kMaxRooms);
+ }
- for (int i = 0; i < kMaxRooms; i++) {
- if (i && !(i % 10))
- printf("\n ");
+ printf("End Script\n\n");
+}
- printf("%d", (uint32)READ_LE_UINT32(&data[pos])); ADVANCE4();
- if (i != kMaxRooms - 1)
- printf(", ");
+void loadMask(int offset) {
+ Mask tempMask;
+
+ int pos = offset;
+ int n = 0;
+
+ while (1) {
+ tempMask._state = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ if (tempMask._state == 0xffff) {
+ break;
}
- printf("]\n");
+ tempMask._flags = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ tempMask._x1 = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ tempMask._y1 = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ tempMask._x2 = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ tempMask._y2 = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ tempMask._z = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ tempMask._number = READ_LE_UINT16(&data[pos]); ADVANCE2();
+
+ printf(" mask%d state=%d fl=%d x1=%d y1=%d x2=%d y2=%d z=%d number=%d\n", n, tempMask._state,
+ tempMask._flags, tempMask._x1, tempMask._y1, tempMask._x2, tempMask._y2,
+ tempMask._z, tempMask._number);
+
+ n++;
}
+}
- printf("End Script\n\n");
+void loadMobEvents(int offset) {
+ if (!offset)
+ return;
+
+ int pos = offset;
+ int i = 0;
+ int16 mob;
+ int16 item;
+ int32 code;
+ while(1) {
+ mob = (int16)READ_LE_UINT16(&data[pos]); ADVANCE2();
+
+ if (mob == -1)
+ break;
+
+ item = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ code = READ_LE_UINT32(&data[pos]); ADVANCE4();
+
+ printf(" mob%02d: mob=%d item=%d code=%d\n", i, mob, item, code);
+
+ i++;
+ }
}
int main(int argc, char *argv[]) {
@@ -409,13 +493,13 @@ int main(int argc, char *argv[]) {
for (int i = 0; i < kMaxRooms; i++) {
pos = scriptInfo.rooms + i * 64;
- rooms[i].mobs = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].backAnim = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].obj = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].nak = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].mobs = READ_LE_UINT32(&data[pos]); ADVANCE4(); // byte[kMaxMobs]
+ rooms[i].backAnim = READ_LE_UINT32(&data[pos]); ADVANCE4(); // int32[kMaxBackAnims]
+ rooms[i].obj = READ_LE_UINT32(&data[pos]); ADVANCE4(); // byte [kMaxObjects]
+ rooms[i].nak = READ_LE_UINT32(&data[pos]); ADVANCE4(); // offset pointing to Mask structure
rooms[i].itemUse = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].itemGive = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].walkTo = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].walkTo = READ_LE_UINT32(&data[pos]); ADVANCE4(); // scripts
rooms[i].examine = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].pickup = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].use = READ_LE_UINT32(&data[pos]); ADVANCE4();
@@ -426,12 +510,21 @@ int main(int argc, char *argv[]) {
rooms[i].unk1 = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].unk2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
- printf("r%02d mobs: %d\n", i, rooms[i].mobs);
- printf("r%02d backAnim: %d\n", i, rooms[i].backAnim);
- printf("r%02d obj: %d\n", i, rooms[i].obj);
- printf("r%02d nak: %d\n", i, rooms[i].nak);
- printf("r%02d itemUse: %d\n", i, rooms[i].itemUse);
- printf("r%02d itemGive: %d\n", i, rooms[i].itemGive);
+ printf("r%02d mobs: [%d]: ", i, rooms[i].mobs);
+ printArray(rooms[i].mobs, 1, kMaxMobs, false);
+ printf("r%02d backAnim: [%d]: ", i, rooms[i].backAnim);
+ printArray(rooms[i].backAnim, 4, kMaxBackAnims, false);
+ printf("r%02d obj: [%d]: ", i, rooms[i].obj);
+ printArray(rooms[i].obj, 1, kMaxObjects, false);
+ printf("r%02d masks [%d]\n", i, rooms[i].nak);
+ loadMask(rooms[i].nak);
+ printf("end masks\n");
+ printf("r%02d itemUse: [%d]\n", i, rooms[i].itemUse);
+ loadMobEvents(rooms[i].itemUse);
+ printf("end itemUse\n");
+ printf("r%02d itemGive: [%d]\n", i, rooms[i].itemGive);
+ loadMobEvents(rooms[i].itemGive);
+ printf("end itemGive\n");
printf("r%02d walkTo: %d\n", i, rooms[i].walkTo);
printf("r%02d examine: %d\n", i, rooms[i].examine);
printf("r%02d pickup: %d\n", i, rooms[i].pickup);
Commit: defe4355dc430ce6079d92fd5322ded616b1337e
https://github.com/scummvm/scummvm-tools/commit/defe4355dc430ce6079d92fd5322ded616b1337e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T10:31:46+02:00
Commit Message:
TOOLS: PRINCE: Parse whole game definition
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 0937efe..47ab41a 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -394,6 +394,28 @@ void loadMobEvents(int offset) {
int pos = offset;
int i = 0;
int16 mob;
+ int32 code;
+ while(1) {
+ mob = (int16)READ_LE_UINT16(&data[pos]); ADVANCE2();
+
+ if (mob == -1)
+ break;
+
+ code = READ_LE_UINT32(&data[pos]); ADVANCE4();
+
+ printf(" mob%02d: mob=%d code=%d\n", i, mob, code);
+
+ i++;
+ }
+}
+
+void loadMobEventsWithItem(int offset) {
+ if (!offset)
+ return;
+
+ int pos = offset;
+ int i = 0;
+ int16 mob;
int16 item;
int32 code;
while(1) {
@@ -405,12 +427,25 @@ void loadMobEvents(int offset) {
item = READ_LE_UINT16(&data[pos]); ADVANCE2();
code = READ_LE_UINT32(&data[pos]); ADVANCE4();
- printf(" mob%02d: mob=%d item=%d code=%d\n", i, mob, item, code);
+ printf(" mobitem%02d: mob=%d item=%d code=%d\n", i, mob, item, code);
i++;
}
}
+void loadLightSources(int offset) {
+ int pos = offset;
+
+ for (int i = 0; i < kMaxRooms; i++) {
+ int x = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int y = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int scale = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int unk = READ_LE_UINT16(&data[pos]); ADVANCE2();
+
+ printf(" light%02d: x=%d y=%d scale=%d unk=%d\n", i, x, y, scale, unk);
+ }
+}
+
int main(int argc, char *argv[]) {
if (argc != 2) {
printUsage(argv[0]);
@@ -478,11 +513,19 @@ int main(int argc, char *argv[]) {
printf("stdTalk: %d\n", scriptInfo.stdTalk);
printf("stdGive: %d\n", scriptInfo.stdGive);
printf("usdCode: %d\n", scriptInfo.usdCode);
- printf("invObjExam: %d\n", scriptInfo.invObjExam);
- printf("invObjUse: %d\n", scriptInfo.invObjUse);
+ printf("invObjExam: [%d]\n", scriptInfo.invObjExam);
+ loadMobEvents(scriptInfo.invObjExam);
+ printf("end invObjExam\n");
+ printf("invObjUse: [%d]\n", scriptInfo.invObjUse);
+ loadMobEvents(scriptInfo.invObjUse);
+ printf("end invObjUse\n");
printf("invObjUU: %d\n", scriptInfo.invObjUU);
+ loadMobEventsWithItem(scriptInfo.invObjUU);
+ printf("end invObjUU\n");
printf("stdUseItem: %d\n", scriptInfo.stdUseItem);
- printf("lightSources: %d\n", scriptInfo.lightSources);
+ printf("lightSources: [%d]\n", scriptInfo.lightSources);
+ loadLightSources(scriptInfo.lightSources);
+ printf("end lightSources\n");
printf("specRout: %d\n", scriptInfo.specRout);
printf("invObjGive: %d\n", scriptInfo.invObjGive);
printf("stdGiveItem: %d\n", scriptInfo.stdGiveItem);
@@ -499,14 +542,14 @@ int main(int argc, char *argv[]) {
rooms[i].nak = READ_LE_UINT32(&data[pos]); ADVANCE4(); // offset pointing to Mask structure
rooms[i].itemUse = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].itemGive = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].walkTo = READ_LE_UINT32(&data[pos]); ADVANCE4(); // scripts
- rooms[i].examine = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].pickup = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].use = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].pushOpen = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].pullClose = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].talk = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].give = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].walkTo = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
+ rooms[i].examine = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
+ rooms[i].pickup = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
+ rooms[i].use = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
+ rooms[i].pushOpen = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
+ rooms[i].pullClose = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
+ rooms[i].talk = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
+ rooms[i].give = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
rooms[i].unk1 = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].unk2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
@@ -520,10 +563,10 @@ int main(int argc, char *argv[]) {
loadMask(rooms[i].nak);
printf("end masks\n");
printf("r%02d itemUse: [%d]\n", i, rooms[i].itemUse);
- loadMobEvents(rooms[i].itemUse);
+ loadMobEventsWithItem(rooms[i].itemUse);
printf("end itemUse\n");
printf("r%02d itemGive: [%d]\n", i, rooms[i].itemGive);
- loadMobEvents(rooms[i].itemGive);
+ loadMobEventsWithItem(rooms[i].itemGive);
printf("end itemGive\n");
printf("r%02d walkTo: %d\n", i, rooms[i].walkTo);
printf("r%02d examine: %d\n", i, rooms[i].examine);
@@ -539,6 +582,16 @@ int main(int argc, char *argv[]) {
decompile("StartGame", scriptInfo.startGame);
decompile("RestoreGame", scriptInfo.restoreGame);
+ decompile("stdExamine", scriptInfo.stdExamine);
+ decompile("stdPickup", scriptInfo.stdPickup);
+ decompile("stdUse", scriptInfo.stdUse);
+ decompile("stdOpen", scriptInfo.stdOpen);
+ decompile("stdClose", scriptInfo.stdClose);
+ decompile("stdTalk", scriptInfo.stdTalk);
+ decompile("stdGive", scriptInfo.stdGive);
+ decompile("usdCode", scriptInfo.usdCode);
+ decompile("stdUseItem", scriptInfo.stdUseItem);
+ decompile("stdGiveItem", scriptInfo.stdGiveItem);
#if 0
for (uint i = 0; i < dataLen; i++)
Commit: d487887b5e2bdba54410a6a644c932cbf8f5b206
https://github.com/scummvm/scummvm-tools/commit/d487887b5e2bdba54410a6a644c932cbf8f5b206
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T11:25:42+02:00
Commit Message:
TOOLS: PRINCE: Decompile all immediate scripts
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 47ab41a..597fe14 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -248,6 +248,7 @@ void printUsage(const char *appName) {
byte *data;
uint32 dataLen;
bool *dataMark;
+int numscripts = 0;
#define ADVANCE() dataMark[pos] = true; pos++
#define ADVANCE2() ADVANCE(); ADVANCE()
@@ -280,6 +281,11 @@ void printArray(int offset, int type, int size, bool split = true) {
}
void decompile(const char *sname, int pos) {
+ if (pos == 0)
+ return;
+
+ numscripts++;
+
printf("Script %s\n", sname);
bool nf = false;
@@ -326,6 +332,10 @@ void decompile(const char *sname, int pos) {
v = READ_LE_UINT32(&data[pos]); ADVANCE4();
printf("[%d]", v);
break;
+ case 's':
+ v = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ printf("\"%s\"", &data[pos + v - 4]);
+ break;
case 't':
v = READ_LE_UINT32(&data[pos]); ADVANCE4();
if (tableOffset != -1 && tableOffset != v) {
@@ -358,6 +368,19 @@ void decompile(const char *sname, int pos) {
}
printf("End Script\n\n");
+
+ if (tableOffset != -1) {
+ char buf[100];
+
+ for (int i = 0; i < kMaxRooms; i++) {
+ sprintf(buf, "tableOffset%02d", i);
+
+ uint off = READ_LE_UINT32(&data[tableOffset]);
+ tableOffset += 4;
+
+ decompile(buf, off);
+ }
+ }
}
void loadMask(int offset) {
@@ -387,7 +410,7 @@ void loadMask(int offset) {
}
}
-void loadMobEvents(int offset) {
+void loadMobEvents(int offset, const char *name) {
if (!offset)
return;
@@ -395,6 +418,9 @@ void loadMobEvents(int offset) {
int i = 0;
int16 mob;
int32 code;
+
+ char buf[100];
+
while(1) {
mob = (int16)READ_LE_UINT16(&data[pos]); ADVANCE2();
@@ -405,11 +431,14 @@ void loadMobEvents(int offset) {
printf(" mob%02d: mob=%d code=%d\n", i, mob, code);
+ sprintf(buf, "%s.mob%d", name, mob);
+ decompile(buf, code);
+
i++;
}
}
-void loadMobEventsWithItem(int offset) {
+void loadMobEventsWithItem(int offset, const char *name) {
if (!offset)
return;
@@ -418,6 +447,9 @@ void loadMobEventsWithItem(int offset) {
int16 mob;
int16 item;
int32 code;
+
+ char buf[100];
+
while(1) {
mob = (int16)READ_LE_UINT16(&data[pos]); ADVANCE2();
@@ -429,6 +461,9 @@ void loadMobEventsWithItem(int offset) {
printf(" mobitem%02d: mob=%d item=%d code=%d\n", i, mob, item, code);
+ sprintf(buf, "%s.mobitem%d", name, mob);
+ decompile(buf, code);
+
i++;
}
}
@@ -514,13 +549,13 @@ int main(int argc, char *argv[]) {
printf("stdGive: %d\n", scriptInfo.stdGive);
printf("usdCode: %d\n", scriptInfo.usdCode);
printf("invObjExam: [%d]\n", scriptInfo.invObjExam);
- loadMobEvents(scriptInfo.invObjExam);
+ loadMobEvents(scriptInfo.invObjExam, "invObjExam");
printf("end invObjExam\n");
printf("invObjUse: [%d]\n", scriptInfo.invObjUse);
- loadMobEvents(scriptInfo.invObjUse);
+ loadMobEvents(scriptInfo.invObjUse, "invObjUse");
printf("end invObjUse\n");
printf("invObjUU: %d\n", scriptInfo.invObjUU);
- loadMobEventsWithItem(scriptInfo.invObjUU);
+ loadMobEventsWithItem(scriptInfo.invObjUU, "invObjUU");
printf("end invObjUU\n");
printf("stdUseItem: %d\n", scriptInfo.stdUseItem);
printf("lightSources: [%d]\n", scriptInfo.lightSources);
@@ -542,17 +577,19 @@ int main(int argc, char *argv[]) {
rooms[i].nak = READ_LE_UINT32(&data[pos]); ADVANCE4(); // offset pointing to Mask structure
rooms[i].itemUse = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].itemGive = READ_LE_UINT32(&data[pos]); ADVANCE4();
- rooms[i].walkTo = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
- rooms[i].examine = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
- rooms[i].pickup = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
- rooms[i].use = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
- rooms[i].pushOpen = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
- rooms[i].pullClose = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
- rooms[i].talk = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
- rooms[i].give = READ_LE_UINT32(&data[pos]); ADVANCE4(); // script
+ rooms[i].walkTo = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].examine = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].pickup = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].use = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].pushOpen = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].pullClose = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].talk = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ rooms[i].give = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].unk1 = READ_LE_UINT32(&data[pos]); ADVANCE4();
rooms[i].unk2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ char buf[100];
+
printf("r%02d mobs: [%d]: ", i, rooms[i].mobs);
printArray(rooms[i].mobs, 1, kMaxMobs, false);
printf("r%02d backAnim: [%d]: ", i, rooms[i].backAnim);
@@ -563,19 +600,45 @@ int main(int argc, char *argv[]) {
loadMask(rooms[i].nak);
printf("end masks\n");
printf("r%02d itemUse: [%d]\n", i, rooms[i].itemUse);
- loadMobEventsWithItem(rooms[i].itemUse);
+ sprintf(buf, "rooms%02d.itemUse", i);
+ loadMobEventsWithItem(rooms[i].itemUse, buf);
printf("end itemUse\n");
printf("r%02d itemGive: [%d]\n", i, rooms[i].itemGive);
- loadMobEventsWithItem(rooms[i].itemGive);
+ sprintf(buf, "rooms%02d.itemGive", i);
+ loadMobEventsWithItem(rooms[i].itemGive, buf);
printf("end itemGive\n");
- printf("r%02d walkTo: %d\n", i, rooms[i].walkTo);
- printf("r%02d examine: %d\n", i, rooms[i].examine);
- printf("r%02d pickup: %d\n", i, rooms[i].pickup);
- printf("r%02d use: %d\n", i, rooms[i].use);
- printf("r%02d pushOpen: %d\n", i, rooms[i].pushOpen);
- printf("r%02d pullClose: %d\n", i, rooms[i].pullClose);
- printf("r%02d talk: %d\n", i, rooms[i].talk);
- printf("r%02d give: %d\n", i, rooms[i].give);
+ printf("r%02d walkTo: [%d]\n", i, rooms[i].walkTo);
+ sprintf(buf, "rooms%02d.walkTo", i);
+ loadMobEvents(rooms[i].walkTo, buf);
+ printf("end walkTo\n");
+ printf("r%02d examine: [%d]\n", i, rooms[i].examine);
+ sprintf(buf, "rooms%02d.examine", i);
+ loadMobEvents(rooms[i].examine, buf);
+ printf("end examine\n");
+ printf("r%02d pickup: [%d]\n", i, rooms[i].pickup);
+ sprintf(buf, "rooms%02d.pickup", i);
+ loadMobEvents(rooms[i].pickup, buf);
+ printf("end pickup\n");
+ printf("r%02d use: [%d]\n", i, rooms[i].use);
+ sprintf(buf, "rooms%02d.use", i);
+ loadMobEvents(rooms[i].use, buf);
+ printf("end use\n");
+ printf("r%02d pushOpen: [%d]\n", i, rooms[i].pushOpen);
+ sprintf(buf, "rooms%02d.pushOpen", i);
+ loadMobEvents(rooms[i].pushOpen, buf);
+ printf("end pushOpen\n");
+ printf("r%02d pullClose: [%d]\n", i, rooms[i].pullClose);
+ sprintf(buf, "rooms%02d.pullClose", i);
+ loadMobEvents(rooms[i].pullClose, buf);
+ printf("end pullClose\n");
+ printf("r%02d talk: [%d]\n", i, rooms[i].talk);
+ sprintf(buf, "rooms%02d.talk", i);
+ loadMobEvents(rooms[i].talk, buf);
+ printf("end talk\n");
+ printf("r%02d give: [%d]\n", i, rooms[i].give);
+ sprintf(buf, "rooms%02d.give", i);
+ loadMobEvents(rooms[i].give, buf);
+ printf("end give\n");
printf("r%02d unk1: %d\n", i, rooms[i].unk1);
printf("r%02d unk2: %d\n", i, rooms[i].unk2);
}
@@ -594,11 +657,22 @@ int main(int argc, char *argv[]) {
decompile("stdGiveItem", scriptInfo.stdGiveItem);
#if 0
- for (uint i = 0; i < dataLen; i++)
- printf("%c", dataMark[i] ? '*' : '.');
+ int n = 0;
+ const char *shades[] = {" ", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"};
+ for (uint i = 0; i < dataLen; i++) {
+ if (i % 8 == 0 && i) {
+ printf("%s", shades[n]);
+ n = 0;
+ }
+
+ if (dataMark[i])
+ n++;
+ }
printf("\n");
#endif
+ printf("Total scripts: %d\n", numscripts);
+
return 0;
}
Commit: 7462c338571b28fa943535e0b2834d7608ba8ad6
https://github.com/scummvm/scummvm-tools/commit/7462c338571b28fa943535e0b2834d7608ba8ad6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T12:11:23+02:00
Commit Message:
TOOLS: PRINCE: Initial code for two-pass decompilation
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 597fe14..52c8d90 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -21,8 +21,10 @@
/* Prince script decompiler */
+#include "common/array.h"
#include "common/file.h"
#include "common/endian.h"
+#include "common/str.h"
#include "common/util.h"
#include "utils.h"
@@ -65,7 +67,7 @@ struct OpCodes {
{ "O_UPDATE", "r", false },
{ "O_CLS", "r", false },
{ "O__CALL", "o", false },
- { "O_RETURN", "", false },
+ { "O_RETURN", "", true },
{ "O_GO", "o", false },
{ "O_BACKANIMUPDATEOFF", "f", false },
{ "O_BACKANIMUPDATEON", "f", false },
@@ -241,6 +243,16 @@ struct Mask {
int16 _height;
};
+struct ScriptEntry {
+ Common::String name;
+ uint32 offset;
+
+ ScriptEntry(const char *name_, uint32 offset_) {
+ name = name_;
+ offset = offset_;
+ }
+};
+
void printUsage(const char *appName) {
printf("Usage: %s skrypt.dat\n", appName);
}
@@ -248,12 +260,19 @@ void printUsage(const char *appName) {
byte *data;
uint32 dataLen;
bool *dataMark;
+bool *dataDecompile;
int numscripts = 0;
+Common::Array<ScriptEntry *> scripts;
+
#define ADVANCE() dataMark[pos] = true; pos++
#define ADVANCE2() ADVANCE(); ADVANCE()
#define ADVANCE4() ADVANCE2(); ADVANCE2()
+#define ADVANCES() dataMark[pos] = dataDecompile[pos] = true; pos++
+#define ADVANCES2() ADVANCES(); ADVANCES()
+#define ADVANCES4() ADVANCES2(); ADVANCES2()
+
void printArray(int offset, int type, int size, bool split = true) {
printf("[");
@@ -280,27 +299,41 @@ void printArray(int offset, int type, int size, bool split = true) {
printf("]\n");
}
-void decompile(const char *sname, int pos) {
+void decompile(const char *sname, int pos, bool printOut = false) {
if (pos == 0)
return;
- numscripts++;
+ ScriptEntry *entry = new ScriptEntry(sname, pos);
+ scripts.push_back(entry);
- printf("Script %s\n", sname);
+ if (!printOut)
+ numscripts++;
+
+ if (printOut)
+ printf("Script %s\n", sname);
bool nf = false;
int tableOffset = -1;
+ char buf[100];
+
while (!nf) {
- uint16 op = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ if (dataDecompile[pos])
+ break;
+
+ uint16 op = READ_LE_UINT16(&data[pos]); ADVANCES2();
+
+ if (op >= ARRAYSIZE(opcodes))
+ error("Invalid op: %d at %d", op, pos - 2);
nf = opcodes[op].nf;
const char *param = opcodes[op].params;
- printf(" %s", opcodes[op].name);
+ if (printOut)
+ printf(" %s", opcodes[op].name);
- if (*param)
+ if (*param && printOut)
printf(" ");
int v;
@@ -308,7 +341,10 @@ void decompile(const char *sname, int pos) {
while (*param) {
switch (*param) {
case 'f':
- v = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ v = READ_LE_UINT16(&data[pos]); ADVANCES2();
+
+ if (!printOut)
+ break;
if (v & 0x8000) {
printf("%s", Flags::getFlagName(v));
@@ -317,32 +353,56 @@ void decompile(const char *sname, int pos) {
}
break;
case 'h':
- v = READ_LE_UINT16(&data[pos]); ADVANCE2();
- printf("%d", v);
+ v = READ_LE_UINT16(&data[pos]); ADVANCES2();
+
+ if (printOut)
+ printf("%d", v);
break;
case 'i':
- v = READ_LE_UINT32(&data[pos]); ADVANCE4();
- printf("%d", v);
+ v = READ_LE_UINT32(&data[pos]); ADVANCES4();
+
+ if (printOut)
+ printf("%d", v);
break;
case 'd':
- v = READ_LE_UINT16(&data[pos]); ADVANCE2();
- printf("%s", Flags::getFlagName(v));
+ v = READ_LE_UINT16(&data[pos]); ADVANCES2();
+
+ if (printOut)
+ printf("%s", Flags::getFlagName(v));
break;
case 'o':
- v = READ_LE_UINT32(&data[pos]); ADVANCE4();
- printf("[%d]", v);
+ v = READ_LE_UINT32(&data[pos]); ADVANCES4();
+
+ if (printOut)
+ printf("[%d]", v);
+
+ sprintf(buf, "script%06d", pos + v - 4);
+ decompile(buf, pos + v - 4);
+
break;
case 's':
- v = READ_LE_UINT32(&data[pos]); ADVANCE4();
- printf("\"%s\"", &data[pos + v - 4]);
+ v = READ_LE_UINT32(&data[pos]); ADVANCES4();
+
+ if (printOut)
+ printf("\"%s\"", &data[pos + v - 4]);
+
+ v = pos + v - 4;
+ while (data[v]) {
+ dataMark[v] = dataDecompile[v] = true;
+ v++;
+ }
+ dataMark[v] = dataDecompile[v] = true;
+
break;
case 't':
- v = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ v = READ_LE_UINT32(&data[pos]); ADVANCES4();
if (tableOffset != -1 && tableOffset != v) {
error("Duplicate tableOffset: %d vs %d", tableOffset, v);
}
tableOffset = v;
- printf("<tableOffset>");
+
+ if (printOut)
+ printf("<tableOffset>");
break;
case 'r':
error("Unsupported op %s", opcodes[op].name);
@@ -354,29 +414,30 @@ void decompile(const char *sname, int pos) {
param++;
- if (*param)
+ if (*param && printOut)
printf(", ");
}
- printf("\n");
+ if (printOut)
+ printf("\n");
}
- if (tableOffset != -1) {
+ if (tableOffset != -1 && printOut) {
printf("tableOffset: %d\n", tableOffset);
printArray(tableOffset, 4, kMaxRooms);
}
- printf("End Script\n\n");
+ if (printOut)
+ printf("End Script\n\n");
if (tableOffset != -1) {
- char buf[100];
+ pos = tableOffset;
for (int i = 0; i < kMaxRooms; i++) {
sprintf(buf, "tableOffset%02d", i);
- uint off = READ_LE_UINT32(&data[tableOffset]);
- tableOffset += 4;
+ uint off = READ_LE_UINT32(&data[tableOffset]); ADVANCE4();
decompile(buf, off);
}
@@ -511,6 +572,7 @@ int main(int argc, char *argv[]) {
delete [] fdata;
dataMark = (bool *)calloc(dataLen, sizeof(bool));
+ dataDecompile = (bool *)calloc(dataLen, sizeof(bool));
int pos = 0;
Commit: 634bf1d6b87ce8d847b41063e8025a081ae10e7e
https://github.com/scummvm/scummvm-tools/commit/634bf1d6b87ce8d847b41063e8025a081ae10e7e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T12:34:13+02:00
Commit Message:
TOOLS: PRINCE: Decompile in 2 passes
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 52c8d90..96458df 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -243,16 +243,6 @@ struct Mask {
int16 _height;
};
-struct ScriptEntry {
- Common::String name;
- uint32 offset;
-
- ScriptEntry(const char *name_, uint32 offset_) {
- name = name_;
- offset = offset_;
- }
-};
-
void printUsage(const char *appName) {
printf("Usage: %s skrypt.dat\n", appName);
}
@@ -263,7 +253,7 @@ bool *dataMark;
bool *dataDecompile;
int numscripts = 0;
-Common::Array<ScriptEntry *> scripts;
+Common::String *labels;
#define ADVANCE() dataMark[pos] = true; pos++
#define ADVANCE2() ADVANCE(); ADVANCE()
@@ -303,14 +293,15 @@ void decompile(const char *sname, int pos, bool printOut = false) {
if (pos == 0)
return;
- ScriptEntry *entry = new ScriptEntry(sname, pos);
- scripts.push_back(entry);
+ if (labels[pos].empty() || labels[pos].hasPrefix("script")) {
+ labels[pos] = sname;
+ }
if (!printOut)
numscripts++;
if (printOut)
- printf("Script %s\n", sname);
+ printf("%s:\n", sname);
bool nf = false;
int tableOffset = -1;
@@ -318,7 +309,7 @@ void decompile(const char *sname, int pos, bool printOut = false) {
char buf[100];
while (!nf) {
- if (dataDecompile[pos])
+ if (!printOut && dataDecompile[pos])
break;
uint16 op = READ_LE_UINT16(&data[pos]); ADVANCES2();
@@ -373,11 +364,12 @@ void decompile(const char *sname, int pos, bool printOut = false) {
case 'o':
v = READ_LE_UINT32(&data[pos]); ADVANCES4();
- if (printOut)
- printf("[%d]", v);
-
- sprintf(buf, "script%06d", pos + v - 4);
- decompile(buf, pos + v - 4);
+ if (printOut) {
+ printf("%s[%d]", labels[pos + v - 4].c_str(), v);
+ } else {
+ sprintf(buf, "script%06d", pos + v - 4);
+ decompile(buf, pos + v - 4);
+ }
break;
case 's':
@@ -429,7 +421,7 @@ void decompile(const char *sname, int pos, bool printOut = false) {
}
if (printOut)
- printf("End Script\n\n");
+ printf("\n");
if (tableOffset != -1) {
pos = tableOffset;
@@ -571,8 +563,19 @@ int main(int argc, char *argv[]) {
dec.decompress(fdata + 18, data, dataLen);
delete [] fdata;
+#if 0
+ Common::File dumpFile("skrypt.dump", "wb");
+ if (!dumpFile.isOpen()) {
+ error("couldn't load file '%s'", argv[1]);
+ return 1;
+ }
+ dumpFile.write(data, dataLen);
+ dumpFile.close();
+#endif
+
dataMark = (bool *)calloc(dataLen, sizeof(bool));
dataDecompile = (bool *)calloc(dataLen, sizeof(bool));
+ labels = new Common::String[dataLen];
int pos = 0;
@@ -718,7 +721,7 @@ int main(int argc, char *argv[]) {
decompile("stdUseItem", scriptInfo.stdUseItem);
decompile("stdGiveItem", scriptInfo.stdGiveItem);
-#if 0
+#if 1
int n = 0;
const char *shades[] = {" ", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"};
for (uint i = 0; i < dataLen; i++) {
@@ -736,5 +739,9 @@ int main(int argc, char *argv[]) {
printf("Total scripts: %d\n", numscripts);
+ for (int i = 0; i < dataLen; i++)
+ if (!labels[i].empty())
+ decompile(labels[i].c_str(), i, true);
+
return 0;
}
Commit: 70e42672908682c42d16c228b7b84caecc00017d
https://github.com/scummvm/scummvm-tools/commit/70e42672908682c42d16c228b7b84caecc00017d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T13:16:12+02:00
Commit Message:
TOOLS: PRINCE: Print out not decompiled data
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 96458df..fb1d319 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -47,142 +47,142 @@ struct OpCodes {
{ "O_SETUPPALETTE", "", false },
{ "O_INITROOM", "f", true },
{ "O_SETSAMPLE", "fs", false },
- { "O_FREESAMPLE", "f", false },
+ { "O_FREESAMPLE", "f", false }, // 5
{ "O_PLAYSAMPLE", "fh", false },
{ "O_PUTOBJECT", "fff", false },
{ "O_REMOBJECT", "ff", false },
{ "O_SHOWANIM", "ff", false },
- { "O_CHECKANIMEND", "f", false },
+ { "O_CHECKANIMEND", "f", false }, // 10
{ "O_FREEANIM", "f", false },
{ "O_CHECKANIMFRAME", "ff", false },
{ "O_PUTBACKANIM", "ffi", false },
{ "O_REMBACKANIM", "ff", false },
- { "O_CHECKBACKANIMFRAME", "ff", false },
+ { "O_CHECKBACKANIMFRAME", "ff", false }, // 15
{ "O_FREEALLSAMPLES", "r", false },
{ "O_SETMUSIC", "h", false },
{ "O_STOPMUSIC", "", false },
{ "O__WAIT", "f", false },
- { "O_UPDATEOFF", "r", false },
+ { "O_UPDATEOFF", "r", false }, // 20
{ "O_UPDATEON", "r", false },
{ "O_UPDATE", "r", false },
{ "O_CLS", "r", false },
{ "O__CALL", "o", false },
- { "O_RETURN", "", true },
+ { "O_RETURN", "", true }, // 25
{ "O_GO", "o", false },
{ "O_BACKANIMUPDATEOFF", "f", false },
{ "O_BACKANIMUPDATEON", "f", false },
{ "O_CHANGECURSOR", "f", false },
- { "O_CHANGEANIMTYPE", "r", false },
+ { "O_CHANGEANIMTYPE", "r", false }, // 30
{ "O__SETFLAG", "df", false },
{ "O_COMPARE", "df", false },
{ "O_JUMPZ", "o", false },
{ "O_JUMPNZ", "o", false },
- { "O_EXIT", "", true },
+ { "O_EXIT", "", true }, // 35
{ "O_ADDFLAG", "df", false },
{ "O_TALKANIM", "ff", false },
{ "O_SUBFLAG", "df", false },
{ "O_SETSTRING", "i", false },
- { "O_ANDFLAG", "df", false },
+ { "O_ANDFLAG", "df", false }, // 40
{ "O_GETMOBDATA", "dff", false },
{ "O_ORFLAG", "df", false },
{ "O_SETMOBDATA", "fff", false },
{ "O_XORFLAG", "df", false },
- { "O_GETMOBTEXT", "f", false },
+ { "O_GETMOBTEXT", "f", false }, // 45
{ "O_MOVEHERO", "ffff", false },
{ "O_WALKHERO", "f", true },
{ "O_SETHERO", "ffff", false },
{ "O_HEROOFF", "f", false },
- { "O_HEROON", "f", false },
+ { "O_HEROON", "f", false }, // 50
{ "O_CLSTEXT", "f", false },
{ "O_CALLTABLE", "dt", false },
{ "O_CHANGEMOB", "ff", false },
{ "O_ADDINV", "ff", false },
- { "O_REMINV", "ff", false },
+ { "O_REMINV", "ff", false }, // 55
{ "O_REPINV", "r", false },
{ "O_OBSOLETE_GETACTION", "r", false },
{ "O_ADDWALKAREA", "r", false },
{ "O_REMWALKAREA", "r", false },
- { "O_RESTOREWALKAREA", "r", false },
+ { "O_RESTOREWALKAREA", "r", false },// 60
{ "O_WAITFRAME", "", true },
{ "O_SETFRAME", "ff", false },
{ "O_RUNACTION", "r", false },
{ "O_COMPAREHI", "df", false },
- { "O_COMPARELO", "df", false },
+ { "O_COMPARELO", "df", false }, // 65
{ "O_PRELOADSET", "r", false },
{ "O_FREEPRELOAD", "r", false },
{ "O_CHECKINV", "r", false },
{ "O_TALKHERO", "f", false },
- { "O_WAITTEXT", "f", false },
+ { "O_WAITTEXT", "f", false }, // 70
{ "O_SETHEROANIM", "fi", false },
{ "O_WAITHEROANIM", "f", true },
{ "O_GETHERODATA", "dff", false },
{ "O_GETMOUSEBUTTON", "", false },
- { "O_CHANGEFRAMES", "ffff", false },
+ { "O_CHANGEFRAMES", "ffff", false },// 75
{ "O_CHANGEBACKFRAMES", "ffff", false },
{ "O_GETBACKANIMDATA", "dff", false },
{ "O_GETANIMDATA", "dff", false },
{ "O_SETBGCODE", "o", false },
- { "O_SETBACKFRAME", "ff", false },
+ { "O_SETBACKFRAME", "ff", false }, // 80
{ "O_GETRND", "dh", false },
{ "O_TALKBACKANIM", "ff", false },
{ "O_LOADPATH", "i", false },
{ "O_GETCHAR", "d", false },
- { "O_SETDFLAG", "do", false },
+ { "O_SETDFLAG", "do", false }, // 85
{ "O_CALLDFLAG", "d", false },
{ "O_PRINTAT", "fff", false },
{ "O_ZOOMIN", "f", false },
{ "O_ZOOMOUT", "f", false },
- { "O_SETSTRINGOFFSET", "r", false },
+ { "O_SETSTRINGOFFSET", "r", false },// 90
{ "O_GETOBJDATA", "dff", false },
{ "O_SETOBJDATA", "fff", false },
{ "O_SWAPOBJECTS", "r", false },
{ "O_CHANGEHEROSET", "ff", false },
- { "O_ADDSTRING", "r", false },
+ { "O_ADDSTRING", "r", false }, // 95
{ "O_SUBSTRING", "f", false },
{ "O_INITDIALOG", "", false },
{ "O_ENABLEDIALOGOPT", "f", false },
{ "O_DISABLEDIALOGOPT", "f", false },
- { "O_SHOWDIALOGBOX", "f", false },
+ { "O_SHOWDIALOGBOX", "f", false }, // 100
{ "O_STOPSAMPLE", "f", false },
{ "O_BACKANIMRANGE", "fhff", false },
{ "O_CLEARPATH", "", false },
{ "O_SETPATH", "", false },
- { "O_GETHEROX", "fd", false },
+ { "O_GETHEROX", "fd", false }, // 105
{ "O_GETHEROY", "fd", false },
{ "O_GETHEROD", "fd", false },
{ "O_PUSHSTRING", "", false },
{ "O_POPSTRING", "", false },
- { "O_SETFGCODE", "o", false },
+ { "O_SETFGCODE", "o", false }, // 110
{ "O_STOPHERO", "f", false },
{ "O_ANIMUPDATEOFF", "f", false },
{ "O_ANIMUPDATEON", "f", false },
{ "O_FREECURSOR", "", false },
- { "O_ADDINVQUIET", "ff", false },
+ { "O_ADDINVQUIET", "ff", false }, // 115
{ "O_RUNHERO", "ffff", false },
{ "O_SETBACKANIMDATA", "hhd", false },
{ "O_VIEWFLC", "f", false },
{ "O_CHECKFLCFRAME", "f", false },
- { "O_CHECKFLCEND", "", false },
+ { "O_CHECKFLCEND", "", false }, // 120
{ "O_FREEFLC", "", false },
{ "O_TALKHEROSTOP", "f", false },
{ "O_HEROCOLOR", "ff", false },
{ "O_GRABMAPA", "", false },
- { "O_ENABLENAK", "f", false },
+ { "O_ENABLENAK", "f", false }, // 125
{ "O_DISABLENAK", "f", false },
{ "O_GETMOBNAME", "f", false },
{ "O_SWAPINVENTORY", "f", false },
{ "O_CLEARINVENTORY", "f", false },
- { "O_SKIPTEXT", "", false },
+ { "O_SKIPTEXT", "", false }, // 130
{ "O_SETVOICEH", "f", false },
{ "O_SETVOICEA", "f", false },
{ "O_SETVOICEB", "f", false },
{ "O_SETVOICEC", "f", false },
- { "O_VIEWFLCLOOP", "f", false },
+ { "O_VIEWFLCLOOP", "f", false }, // 135
{ "O_FLCSPEED", "f", false },
{ "O_OPENINVENTORY", "", true },
{ "O_KRZYWA", "", false },
{ "O_GETKRZYWA", "", false },
- { "O_GETMOB", "dff", false },
+ { "O_GETMOB", "dff", false }, // 140
{ "O_INPUTLINE", "r", false },
{ "O_SETVOICED", "f", false },
{ "O_BREAK_POINT", "r", false }
@@ -263,7 +263,7 @@ Common::String *labels;
#define ADVANCES2() ADVANCES(); ADVANCES()
#define ADVANCES4() ADVANCES2(); ADVANCES2()
-void printArray(int offset, int type, int size, bool split = true) {
+void printArray(int offset, int type, int size, bool split = true, bool offsets = false) {
printf("[");
int pos = offset;
@@ -277,7 +277,11 @@ void printArray(int offset, int type, int size, bool split = true) {
} else if (type == 2) {
printf("%d", (uint16)READ_LE_UINT16(&data[pos])); ADVANCE2();
} else if (type == 4) {
- printf("%d", (uint32)READ_LE_UINT32(&data[pos])); ADVANCE4();
+ uint32 v = (uint32)READ_LE_UINT32(&data[pos]); ADVANCE4();
+ if (offsets && v && !labels[v].empty())
+ printf("%s[%d]", labels[v].c_str(), v);
+ else
+ printf("%d", v);
} else {
error("printArray: unknown type %d", type);
}
@@ -417,7 +421,7 @@ void decompile(const char *sname, int pos, bool printOut = false) {
if (tableOffset != -1 && printOut) {
printf("tableOffset: %d\n", tableOffset);
- printArray(tableOffset, 4, kMaxRooms);
+ printArray(tableOffset, 4, kMaxRooms, true, true);
}
if (printOut)
@@ -429,7 +433,7 @@ void decompile(const char *sname, int pos, bool printOut = false) {
for (int i = 0; i < kMaxRooms; i++) {
sprintf(buf, "tableOffset%02d", i);
- uint off = READ_LE_UINT32(&data[tableOffset]); ADVANCE4();
+ uint off = READ_LE_UINT32(&data[pos]); ADVANCES4();
decompile(buf, off);
}
@@ -739,9 +743,23 @@ int main(int argc, char *argv[]) {
printf("Total scripts: %d\n", numscripts);
+ bool inDB = false;
+
for (int i = 0; i < dataLen; i++)
- if (!labels[i].empty())
+ if (!labels[i].empty()) {
+ if (inDB) {
+ printf("\n\n");
+ inDB = false;
+ }
decompile(labels[i].c_str(), i, true);
+ } else if (!dataMark[i]) {
+ if (!inDB) {
+ printf("db %d", data[i]);
+ inDB = true;
+ } else {
+ printf(", %d", data[i]);
+ }
+ }
return 0;
}
Commit: 39f44d8710998d8ab56c8a1f0ef0d95cb779fa5d
https://github.com/scummvm/scummvm-tools/commit/39f44d8710998d8ab56c8a1f0ef0d95cb779fa5d
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T13:24:43+02:00
Commit Message:
TOOLS: PRINCE: Fix whole script disassembly
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index fb1d319..adac18f 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -45,7 +45,7 @@ struct OpCodes {
{ "O_WAITFOREVER", "", true },
{ "O_BLACKPALETTE", "", false },
{ "O_SETUPPALETTE", "", false },
- { "O_INITROOM", "f", true },
+ { "O_INITROOM", "f", false /* true */},
{ "O_SETSAMPLE", "fs", false },
{ "O_FREESAMPLE", "f", false }, // 5
{ "O_PLAYSAMPLE", "fh", false },
@@ -89,7 +89,7 @@ struct OpCodes {
{ "O_XORFLAG", "df", false },
{ "O_GETMOBTEXT", "f", false }, // 45
{ "O_MOVEHERO", "ffff", false },
- { "O_WALKHERO", "f", true },
+ { "O_WALKHERO", "f", false /* true */ },
{ "O_SETHERO", "ffff", false },
{ "O_HEROOFF", "f", false },
{ "O_HEROON", "f", false }, // 50
@@ -103,7 +103,7 @@ struct OpCodes {
{ "O_ADDWALKAREA", "r", false },
{ "O_REMWALKAREA", "r", false },
{ "O_RESTOREWALKAREA", "r", false },// 60
- { "O_WAITFRAME", "", true },
+ { "O_WAITFRAME", "", false /* true */ },
{ "O_SETFRAME", "ff", false },
{ "O_RUNACTION", "r", false },
{ "O_COMPAREHI", "df", false },
@@ -114,7 +114,7 @@ struct OpCodes {
{ "O_TALKHERO", "f", false },
{ "O_WAITTEXT", "f", false }, // 70
{ "O_SETHEROANIM", "fi", false },
- { "O_WAITHEROANIM", "f", true },
+ { "O_WAITHEROANIM", "f", false /* true */ },
{ "O_GETHERODATA", "dff", false },
{ "O_GETMOUSEBUTTON", "", false },
{ "O_CHANGEFRAMES", "ffff", false },// 75
@@ -179,11 +179,11 @@ struct OpCodes {
{ "O_SETVOICEC", "f", false },
{ "O_VIEWFLCLOOP", "f", false }, // 135
{ "O_FLCSPEED", "f", false },
- { "O_OPENINVENTORY", "", true },
+ { "O_OPENINVENTORY", "", false /* true */ },
{ "O_KRZYWA", "", false },
{ "O_GETKRZYWA", "", false },
{ "O_GETMOB", "dff", false }, // 140
- { "O_INPUTLINE", "r", false },
+ { "O_INPUTLINE", "", false },
{ "O_SETVOICED", "f", false },
{ "O_BREAK_POINT", "r", false }
};
@@ -401,7 +401,7 @@ void decompile(const char *sname, int pos, bool printOut = false) {
printf("<tableOffset>");
break;
case 'r':
- error("Unsupported op %s", opcodes[op].name);
+ error("Unsupported op %s at %d (%x)", opcodes[op].name, pos - 2, pos - 2);
return;
default:
error("Unhandled param '%c' for %s", *param, opcodes[op].name);
Commit: 311b48cc78a8dba5f892f2a75fb28f57584a3a8a
https://github.com/scummvm/scummvm-tools/commit/311b48cc78a8dba5f892f2a75fb28f57584a3a8a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T13:43:56+02:00
Commit Message:
TOOLS: PRINCE: Improve decompilation output
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index adac18f..a8e3c56 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -606,27 +606,27 @@ int main(int argc, char *argv[]) {
scriptInfo.stdGiveItem = READ_LE_UINT32(&data[pos]); ADVANCE4();
scriptInfo.goTester = READ_LE_UINT32(&data[pos]); ADVANCE4();
- printf("Rooms: %d\n", scriptInfo.rooms);
- printf("StartGame: %d\n", scriptInfo.startGame);
- printf("restoreGame: %d\n", scriptInfo.restoreGame);
- printf("stdExamine: %d\n", scriptInfo.stdExamine);
- printf("stdPickup: %d\n", scriptInfo.stdPickup);
- printf("stdUse: %d\n", scriptInfo.stdUse);
- printf("stdOpen: %d\n", scriptInfo.stdOpen);
- printf("stdClose: %d\n", scriptInfo.stdClose);
- printf("stdTalk: %d\n", scriptInfo.stdTalk);
- printf("stdGive: %d\n", scriptInfo.stdGive);
- printf("usdCode: %d\n", scriptInfo.usdCode);
+ printf("rooms: [%d]\n", scriptInfo.rooms);
+ printf("startGame: [%d]\n", scriptInfo.startGame);
+ printf("restoreGame: [%d]\n", scriptInfo.restoreGame);
+ printf("stdExamine: [%d]\n", scriptInfo.stdExamine);
+ printf("stdPickup: [%d]\n", scriptInfo.stdPickup);
+ printf("stdUse: [%d]\n", scriptInfo.stdUse);
+ printf("stdOpen: [%d]\n", scriptInfo.stdOpen);
+ printf("stdClose: [%d]\n", scriptInfo.stdClose);
+ printf("stdTalk: [%d]\n", scriptInfo.stdTalk);
+ printf("stdGive: [%d]\n", scriptInfo.stdGive);
+ printf("usdCode: [%d]\n", scriptInfo.usdCode);
printf("invObjExam: [%d]\n", scriptInfo.invObjExam);
loadMobEvents(scriptInfo.invObjExam, "invObjExam");
printf("end invObjExam\n");
printf("invObjUse: [%d]\n", scriptInfo.invObjUse);
loadMobEvents(scriptInfo.invObjUse, "invObjUse");
printf("end invObjUse\n");
- printf("invObjUU: %d\n", scriptInfo.invObjUU);
+ printf("invObjUU: [%d]\n", scriptInfo.invObjUU);
loadMobEventsWithItem(scriptInfo.invObjUU, "invObjUU");
printf("end invObjUU\n");
- printf("stdUseItem: %d\n", scriptInfo.stdUseItem);
+ printf("stdUseItem: [%d]\n", scriptInfo.stdUseItem);
printf("lightSources: [%d]\n", scriptInfo.lightSources);
loadLightSources(scriptInfo.lightSources);
printf("end lightSources\n");
@@ -712,8 +712,8 @@ int main(int argc, char *argv[]) {
printf("r%02d unk2: %d\n", i, rooms[i].unk2);
}
- decompile("StartGame", scriptInfo.startGame);
- decompile("RestoreGame", scriptInfo.restoreGame);
+ decompile("startGame", scriptInfo.startGame);
+ decompile("restoreGame", scriptInfo.restoreGame);
decompile("stdExamine", scriptInfo.stdExamine);
decompile("stdPickup", scriptInfo.stdPickup);
decompile("stdUse", scriptInfo.stdUse);
@@ -734,6 +734,9 @@ int main(int argc, char *argv[]) {
n = 0;
}
+ if (i % 800 == 0 && i)
+ printf("\n");
+
if (dataMark[i])
n++;
}
@@ -754,11 +757,16 @@ int main(int argc, char *argv[]) {
decompile(labels[i].c_str(), i, true);
} else if (!dataMark[i]) {
if (!inDB) {
- printf("db %d", data[i]);
+ printf("label%d: ; 0x%x\n db %d", i, i, data[i]);
inDB = true;
} else {
printf(", %d", data[i]);
}
+ } else {
+ if (inDB) {
+ printf("\n\n");
+ inDB = false;
+ }
}
return 0;
Commit: eda9c15966e7a7b5b52b24a6fb74d99ed08ac063
https://github.com/scummvm/scummvm-tools/commit/eda9c15966e7a7b5b52b24a6fb74d99ed08ac063
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T13:49:21+02:00
Commit Message:
TOOLS: PRINCE: Located more script data
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index a8e3c56..184c30c 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -480,12 +480,11 @@ void loadMobEvents(int offset, const char *name) {
while(1) {
mob = (int16)READ_LE_UINT16(&data[pos]); ADVANCE2();
+ code = READ_LE_UINT32(&data[pos]); ADVANCE4();
if (mob == -1)
break;
- code = READ_LE_UINT32(&data[pos]); ADVANCE4();
-
printf(" mob%02d: mob=%d code=%d\n", i, mob, code);
sprintf(buf, "%s.mob%d", name, mob);
@@ -509,12 +508,10 @@ void loadMobEventsWithItem(int offset, const char *name) {
while(1) {
mob = (int16)READ_LE_UINT16(&data[pos]); ADVANCE2();
-
- if (mob == -1)
- break;
-
item = READ_LE_UINT16(&data[pos]); ADVANCE2();
code = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ if (mob == -1)
+ break;
printf(" mobitem%02d: mob=%d item=%d code=%d\n", i, mob, item, code);
Commit: 3e6a124d06d3f10511cfce0905bc365ab1e138d6
https://github.com/scummvm/scummvm-tools/commit/3e6a124d06d3f10511cfce0905bc365ab1e138d6
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T13:56:36+02:00
Commit Message:
TOOLS: PRINCE: More bytes were mapped
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 184c30c..3839446 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -448,9 +448,6 @@ void loadMask(int offset) {
while (1) {
tempMask._state = READ_LE_UINT16(&data[pos]); ADVANCE2();
- if (tempMask._state == 0xffff) {
- break;
- }
tempMask._flags = READ_LE_UINT16(&data[pos]); ADVANCE2();
tempMask._x1 = READ_LE_UINT16(&data[pos]); ADVANCE2();
tempMask._y1 = READ_LE_UINT16(&data[pos]); ADVANCE2();
@@ -459,6 +456,10 @@ void loadMask(int offset) {
tempMask._z = READ_LE_UINT16(&data[pos]); ADVANCE2();
tempMask._number = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ if (tempMask._state == 0xffff) {
+ break;
+ }
+
printf(" mask%d state=%d fl=%d x1=%d y1=%d x2=%d y2=%d z=%d number=%d\n", n, tempMask._state,
tempMask._flags, tempMask._x1, tempMask._y1, tempMask._x2, tempMask._y2,
tempMask._z, tempMask._number);
@@ -478,7 +479,7 @@ void loadMobEvents(int offset, const char *name) {
char buf[100];
- while(1) {
+ while (1) {
mob = (int16)READ_LE_UINT16(&data[pos]); ADVANCE2();
code = READ_LE_UINT32(&data[pos]); ADVANCE4();
@@ -506,7 +507,7 @@ void loadMobEventsWithItem(int offset, const char *name) {
char buf[100];
- while(1) {
+ while (1) {
mob = (int16)READ_LE_UINT16(&data[pos]); ADVANCE2();
item = READ_LE_UINT16(&data[pos]); ADVANCE2();
code = READ_LE_UINT32(&data[pos]); ADVANCE4();
@@ -741,11 +742,10 @@ int main(int argc, char *argv[]) {
printf("\n");
#endif
- printf("Total scripts: %d\n", numscripts);
-
bool inDB = false;
+ int nunmapped = 0;
- for (int i = 0; i < dataLen; i++)
+ for (int i = 0; i < dataLen; i++) {
if (!labels[i].empty()) {
if (inDB) {
printf("\n\n");
@@ -753,6 +753,8 @@ int main(int argc, char *argv[]) {
}
decompile(labels[i].c_str(), i, true);
} else if (!dataMark[i]) {
+ nunmapped++;
+
if (!inDB) {
printf("label%d: ; 0x%x\n db %d", i, i, data[i]);
inDB = true;
@@ -765,6 +767,9 @@ int main(int argc, char *argv[]) {
inDB = false;
}
}
+ }
+
+ printf("\nTotal scripts: %d Unmapped bytes: %d\n", numscripts, nunmapped);
return 0;
}
Commit: 1f95b177b840e038362a491733afe086f8c7c815
https://github.com/scummvm/scummvm-tools/commit/1f95b177b840e038362a491733afe086f8c7c815
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T20:58:04+02:00
Commit Message:
TOOLS: PRINCE: Parse backAnim in decompiler
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 3839446..44eae26 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -36,6 +36,8 @@ static const int16 kMaxRooms = 60;
static const int kMaxBackAnims = 64;
static const int kMaxMobs = 64;
static const int kMaxObjects = 64;
+static const int kStructSizeBAS = 28;
+static const int kStructSizeBASA = 8;
struct OpCodes {
const char *name;
@@ -264,6 +266,9 @@ Common::String *labels;
#define ADVANCES4() ADVANCES2(); ADVANCES2()
void printArray(int offset, int type, int size, bool split = true, bool offsets = false) {
+ if (!offset)
+ return;
+
printf("[");
int pos = offset;
@@ -536,6 +541,41 @@ void loadLightSources(int offset) {
}
}
+void loadBackAnim(int anum, int offset) {
+ int pos = offset;
+
+ printf("loadBackAnim: %d 0x%x\n", offset, offset);
+
+ if (offset != 0) {
+ // Anim BAS data
+ int type = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int bdata = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int anims = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int unk1 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int unk2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int unk3 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int data2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+
+ printf("backanim%02d: type=%x data=%x anims=%x unk1=%x unk2=%x unk3=%x data2=%x\n", anum,
+ type, bdata, anims, unk1, unk2, unk3, data2);
+
+ if (anims == 0) {
+ anims = 1; // anims with 0 as amount in game data has just 1 animation
+ }
+
+ for (int i = 0; i < anims; i++) {
+ pos = offset + kStructSizeBAS + kStructSizeBASA * i;
+ // Anim BASA data
+ int num = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int start = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int end = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int unk = READ_LE_UINT16(&data[pos]); ADVANCE2();
+
+ printf(" backanim%02d.%d: num=%d start=%d end=%d unk=%d\n", anum, i, num, start, end, unk);
+ }
+ }
+}
+
int main(int argc, char *argv[]) {
if (argc != 2) {
printUsage(argv[0]);
@@ -708,6 +748,11 @@ int main(int argc, char *argv[]) {
printf("end give\n");
printf("r%02d unk1: %d\n", i, rooms[i].unk1);
printf("r%02d unk2: %d\n", i, rooms[i].unk2);
+
+ if (rooms[i].backAnim)
+ for (int b = 0; b < kMaxBackAnims; b++) {
+ loadBackAnim(b, READ_LE_UINT32(&data[rooms[i].backAnim + b * 4]));
+ }
}
decompile("startGame", scriptInfo.startGame);
Commit: ad42267fdd598e6e393628243909d710a8610aa5
https://github.com/scummvm/scummvm-tools/commit/ad42267fdd598e6e393628243909d710a8610aa5
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T21:16:31+02:00
Commit Message:
TOOLS: PRINCE: Implemented special decompilation for O_SETHEROANIM
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 44eae26..1c517b1 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -115,7 +115,7 @@ struct OpCodes {
{ "O_CHECKINV", "r", false },
{ "O_TALKHERO", "f", false },
{ "O_WAITTEXT", "f", false }, // 70
- { "O_SETHEROANIM", "fi", false },
+ { "O_SETHEROANIM", "fS", false },
{ "O_WAITHEROANIM", "f", false /* true */ },
{ "O_GETHERODATA", "dff", false },
{ "O_GETMOUSEBUTTON", "", false },
@@ -266,8 +266,10 @@ Common::String *labels;
#define ADVANCES4() ADVANCES2(); ADVANCES2()
void printArray(int offset, int type, int size, bool split = true, bool offsets = false) {
- if (!offset)
+ if (!offset) {
+ printf("\n");
return;
+ }
printf("[");
@@ -310,7 +312,7 @@ void decompile(const char *sname, int pos, bool printOut = false) {
numscripts++;
if (printOut)
- printf("%s:\n", sname);
+ printf("%s: ; %d 0x%x\n", sname, pos, pos);
bool nf = false;
int tableOffset = -1;
@@ -381,11 +383,27 @@ void decompile(const char *sname, int pos, bool printOut = false) {
}
break;
+ case 'S':
+ v = READ_LE_UINT32(&data[pos]); ADVANCES4();
+
+ if (v < 100) {
+ if (printOut)
+ printf("%d", v);
+ } else {
+ if (printOut)
+ printf("\"%s\"[%d]", &data[v], v);
+ while (data[v]) {
+ dataMark[v] = dataDecompile[v] = true;
+ v++;
+ }
+ dataMark[v] = dataDecompile[v] = true;
+ }
+ break;
case 's':
v = READ_LE_UINT32(&data[pos]); ADVANCES4();
if (printOut)
- printf("\"%s\"", &data[pos + v - 4]);
+ printf("\"%s\"[%d]", &data[pos + v - 4], pos + v - 4);
v = pos + v - 4;
while (data[v]) {
@@ -446,6 +464,9 @@ void decompile(const char *sname, int pos, bool printOut = false) {
}
void loadMask(int offset) {
+ if (!offset)
+ return;
+
Mask tempMask;
int pos = offset;
@@ -542,37 +563,36 @@ void loadLightSources(int offset) {
}
void loadBackAnim(int anum, int offset) {
- int pos = offset;
+ if (!offset)
+ return;
- printf("loadBackAnim: %d 0x%x\n", offset, offset);
+ int pos = offset;
- if (offset != 0) {
- // Anim BAS data
- int type = READ_LE_UINT32(&data[pos]); ADVANCE4();
- int bdata = READ_LE_UINT32(&data[pos]); ADVANCE4();
- int anims = READ_LE_UINT32(&data[pos]); ADVANCE4();
- int unk1 = READ_LE_UINT32(&data[pos]); ADVANCE4();
- int unk2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
- int unk3 = READ_LE_UINT32(&data[pos]); ADVANCE4();
- int data2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ // Anim BAS data
+ int type = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int bdata = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int anims = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int unk1 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int unk2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int unk3 = READ_LE_UINT32(&data[pos]); ADVANCE4();
+ int data2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
- printf("backanim%02d: type=%x data=%x anims=%x unk1=%x unk2=%x unk3=%x data2=%x\n", anum,
- type, bdata, anims, unk1, unk2, unk3, data2);
+ printf("backanim%02d: type=%x data=%x anims=%x unk1=%x unk2=%x unk3=%x data2=%x\n", anum,
+ type, bdata, anims, unk1, unk2, unk3, data2);
- if (anims == 0) {
- anims = 1; // anims with 0 as amount in game data has just 1 animation
- }
+ if (anims == 0) {
+ anims = 1; // anims with 0 as amount in game data has just 1 animation
+ }
- for (int i = 0; i < anims; i++) {
- pos = offset + kStructSizeBAS + kStructSizeBASA * i;
- // Anim BASA data
- int num = READ_LE_UINT16(&data[pos]); ADVANCE2();
- int start = READ_LE_UINT16(&data[pos]); ADVANCE2();
- int end = READ_LE_UINT16(&data[pos]); ADVANCE2();
- int unk = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ for (int i = 0; i < anims; i++) {
+ pos = offset + kStructSizeBAS + kStructSizeBASA * i;
+ // Anim BASA data
+ int num = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int start = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int end = READ_LE_UINT16(&data[pos]); ADVANCE2();
+ int unk = READ_LE_UINT16(&data[pos]); ADVANCE2();
- printf(" backanim%02d.%d: num=%d start=%d end=%d unk=%d\n", anum, i, num, start, end, unk);
- }
+ printf(" backanim%02d.%d: num=%d start=%d end=%d unk=%d\n", anum, i, num, start, end, unk);
}
}
Commit: c49fd5d036d76932124e4f5b989eb946920def52
https://github.com/scummvm/scummvm-tools/commit/c49fd5d036d76932124e4f5b989eb946920def52
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T21:53:23+02:00
Commit Message:
TOOLS: PRINCE: Special decompilation for O_PUTBACKANIM
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 1c517b1..08c5a56 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -57,7 +57,7 @@ struct OpCodes {
{ "O_CHECKANIMEND", "f", false }, // 10
{ "O_FREEANIM", "f", false },
{ "O_CHECKANIMFRAME", "ff", false },
- { "O_PUTBACKANIM", "ffi", false },
+ { "O_PUTBACKANIM", "ffB", false },
{ "O_REMBACKANIM", "ff", false },
{ "O_CHECKBACKANIMFRAME", "ff", false }, // 15
{ "O_FREEALLSAMPLES", "r", false },
@@ -257,6 +257,8 @@ int numscripts = 0;
Common::String *labels;
+void loadBackAnim(int anum, int offset, bool printOut = true);
+
#define ADVANCE() dataMark[pos] = true; pos++
#define ADVANCE2() ADVANCE(); ADVANCE()
#define ADVANCE4() ADVANCE2(); ADVANCE2()
@@ -318,6 +320,8 @@ void decompile(const char *sname, int pos, bool printOut = false) {
int tableOffset = -1;
char buf[100];
+ uint32 backAnims[20];
+ int numBackAnims = 0;
while (!nf) {
if (!printOut && dataDecompile[pos])
@@ -423,6 +427,21 @@ void decompile(const char *sname, int pos, bool printOut = false) {
if (printOut)
printf("<tableOffset>");
break;
+ case 'B':
+ v = READ_LE_UINT32(&data[pos]); ADVANCES4();
+
+ if (printOut)
+ printf("backanim%d", v);
+
+ if (labels[v].empty() || !printOut) {
+ backAnims[numBackAnims++] = v;
+
+ if (printOut) {
+ sprintf(buf, "backanim%d", v);
+ labels[v] = buf;
+ }
+ }
+ break;
case 'r':
error("Unsupported op %s at %d (%x)", opcodes[op].name, pos - 2, pos - 2);
return;
@@ -447,6 +466,14 @@ void decompile(const char *sname, int pos, bool printOut = false) {
printArray(tableOffset, 4, kMaxRooms, true, true);
}
+ if (numBackAnims > 0) {
+ for (int i = 0; i < numBackAnims; i++) {
+ if (printOut)
+ printf("\n");
+ loadBackAnim(backAnims[i], backAnims[i], printOut);
+ }
+ }
+
if (printOut)
printf("\n");
@@ -562,7 +589,7 @@ void loadLightSources(int offset) {
}
}
-void loadBackAnim(int anum, int offset) {
+void loadBackAnim(int anum, int offset, bool printOut) {
if (!offset)
return;
@@ -577,7 +604,8 @@ void loadBackAnim(int anum, int offset) {
int unk3 = READ_LE_UINT32(&data[pos]); ADVANCE4();
int data2 = READ_LE_UINT32(&data[pos]); ADVANCE4();
- printf("backanim%02d: type=%x data=%x anims=%x unk1=%x unk2=%x unk3=%x data2=%x\n", anum,
+ if (printOut)
+ printf("backanim%02d: type=%x data=%x anims=%x unk1=%x unk2=%x unk3=%x data2=%x\n", anum,
type, bdata, anims, unk1, unk2, unk3, data2);
if (anims == 0) {
@@ -592,7 +620,8 @@ void loadBackAnim(int anum, int offset) {
int end = READ_LE_UINT16(&data[pos]); ADVANCE2();
int unk = READ_LE_UINT16(&data[pos]); ADVANCE2();
- printf(" backanim%02d.%d: num=%d start=%d end=%d unk=%d\n", anum, i, num, start, end, unk);
+ if (printOut)
+ printf(" backanim%02d.%d: num=%d start=%d end=%d unk=%d\n", anum, i, num, start, end, unk);
}
}
@@ -811,7 +840,7 @@ int main(int argc, char *argv[]) {
int nunmapped = 0;
for (int i = 0; i < dataLen; i++) {
- if (!labels[i].empty()) {
+ if (!labels[i].empty() && !labels[i].hasPrefix("backanim")) {
if (inDB) {
printf("\n\n");
inDB = false;
Commit: bd670bfaf2f47d1a9b1a3e8ee18e7a55f4e183c9
https://github.com/scummvm/scummvm-tools/commit/bd670bfaf2f47d1a9b1a3e8ee18e7a55f4e183c9
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T22:08:11+02:00
Commit Message:
TOOLS: PRINCE: Print out strings in decompilation
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 08c5a56..9c4b99b 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -395,7 +395,11 @@ void decompile(const char *sname, int pos, bool printOut = false) {
printf("%d", v);
} else {
if (printOut)
- printf("\"%s\"[%d]", &data[v], v);
+ printf("\"%s\"[string%d]", &data[v], v);
+
+ sprintf(buf, "string%d", v);
+ labels[v] = buf;
+
while (data[v]) {
dataMark[v] = dataDecompile[v] = true;
v++;
@@ -407,9 +411,12 @@ void decompile(const char *sname, int pos, bool printOut = false) {
v = READ_LE_UINT32(&data[pos]); ADVANCES4();
if (printOut)
- printf("\"%s\"[%d]", &data[pos + v - 4], pos + v - 4);
+ printf("\"%s\"[string%d]", &data[pos + v - 4], pos + v - 4);
v = pos + v - 4;
+ sprintf(buf, "string%d", v);
+ labels[v] = buf;
+
while (data[v]) {
dataMark[v] = dataDecompile[v] = true;
v++;
@@ -845,7 +852,12 @@ int main(int argc, char *argv[]) {
printf("\n\n");
inDB = false;
}
- decompile(labels[i].c_str(), i, true);
+
+ if (labels[i].hasPrefix("string")) {
+ printf("%s:\n db \"%s\", 0\n", labels[i].c_str(), &data[i]);
+ } else {
+ decompile(labels[i].c_str(), i, true);
+ }
} else if (!dataMark[i]) {
nunmapped++;
Commit: ce0a9b81ac741b5b12248ac1eedfa7b9c0b2eb02
https://github.com/scummvm/scummvm-tools/commit/ce0a9b81ac741b5b12248ac1eedfa7b9c0b2eb02
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2018-05-02T22:10:47+02:00
Commit Message:
TOOLS: PRINCE: Fix O_LOADPATH
Changed paths:
engines/prince/deprince.cpp
diff --git a/engines/prince/deprince.cpp b/engines/prince/deprince.cpp
index 9c4b99b..81fb0a7 100644
--- a/engines/prince/deprince.cpp
+++ b/engines/prince/deprince.cpp
@@ -127,7 +127,7 @@ struct OpCodes {
{ "O_SETBACKFRAME", "ff", false }, // 80
{ "O_GETRND", "dh", false },
{ "O_TALKBACKANIM", "ff", false },
- { "O_LOADPATH", "i", false },
+ { "O_LOADPATH", "s", false },
{ "O_GETCHAR", "d", false },
{ "O_SETDFLAG", "do", false }, // 85
{ "O_CALLDFLAG", "d", false },
More information about the Scummvm-git-logs
mailing list