{"id":14,"date":"2018-05-07T17:17:50","date_gmt":"2018-05-07T17:17:50","guid":{"rendered":"https:\/\/blogs.scummvm.org\/pantherengine\/?p=14"},"modified":"2022-05-23T17:18:23","modified_gmt":"2022-05-23T17:18:23","slug":"pink-files-format","status":"publish","type":"post","link":"https:\/\/blogs.scummvm.org\/pantherengine\/2018\/05\/07\/pink-files-format\/","title":{"rendered":"Pink Files Format"},"content":{"rendered":"<p>The Pink Panther games use only two data files.<\/p>\n<p>These are\u00a0ORB and BRO.<\/p>\n<p>&nbsp;<\/p>\n<p>Structure of ORB file header<\/p>\n<div>\n<div id=\"highlighter_500261\" class=\"syntaxhighlighter  cpp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"cpp color1 bold\">char<\/code> <code class=\"cpp plain\">name[4]; <\/code><code class=\"cpp comments\">\/\/ ORB<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"cpp plain\">uint16 minorVersion;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"cpp plain\">uint16 majorVersion;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"cpp plain\">uint32 timestamp;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"cpp plain\">uint32 tableOffset;<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"cpp plain\">uint32 tableSize;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>After header, we will look at the table. It is located at the end of ORB. It contains descriptions of objects. The names in this table are sorted, so the binary search is used for searching.<\/p>\n<div>\n<div id=\"highlighter_236024\" class=\"syntaxhighlighter  cpp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"cpp keyword bold\">struct<\/code> <code class=\"cpp plain\">ObjectDescription {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp color1 bold\">char<\/code> <code class=\"cpp plain\">name[16];<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp plain\">uint32 objectsOffset;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp plain\">uint32 objectsCount;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp plain\">uint32 resourcesOffset;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp plain\">uint32 resourcesCount;<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"cpp plain\">};<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Let\u2019s look at resources table. Each object description has offset to the resource descriptions table.<\/p>\n<div>\n<div id=\"highlighter_185816\" class=\"syntaxhighlighter  cpp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"cpp keyword bold\">struct<\/code> <code class=\"cpp plain\">ResourceDescription {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp color1 bold\">char<\/code> <code class=\"cpp plain\">name[16];<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp plain\">uint32 offset;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp plain\">uint32 size;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"cpp spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"cpp color1 bold\">bool<\/code> <code class=\"cpp plain\">inBro;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"cpp plain\">};<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The last field determines where the resource is located.<\/p>\n<p>BRO file contains only resources and it is only used in Passport to Peril. In Hokus Pokus it is empty.<\/p>\n<div>\n<div id=\"highlighter_242483\" class=\"syntaxhighlighter  cpp\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"cpp color1 bold\">char<\/code> <code class=\"cpp plain\">name[4]; <\/code><code class=\"cpp comments\">\/\/ BRO<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"cpp plain\">uint16 minorVersion;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"cpp plain\">uint16 majorVersion;<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"cpp plain\">uint32 timestamp;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The timestamps of BRO and ORB must be equal to each other.<\/p>\n<div id=\"atatags-26942-608cefbfc9477\"><\/div>\n<div id=\"jp-post-flair\" class=\"sharedaddy sd-like-enabled sd-sharing-enabled\">\n<div class=\"sharedaddy sd-sharing-enabled\"><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The Pink Panther games use only two data files. These are\u00a0ORB and BRO. &nbsp; Structure of ORB file header 1 2 3 4 5 6 7 8 char name[4]; \/\/ ORB uint16 minorVersion; uint16 majorVersion; uint32 timestamp; uint32 tableOffset; uint32 tableSize; After header, we will look at the table. It is located at the end [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":1,"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":15,"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/posts\/14\/revisions\/15"}],"wp:attachment":[{"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/pantherengine\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}