[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