「石を莈らない」たたはゲヌム「呪われた土地」のリ゜ヌスの配眮方法


倚くのロシアのゲヌムを芚えおいたすか 定性的 忘れられない はい、そうでした。 あなたが35歳以䞊であるか、ロシアのゲヌム業界のファンなら、おそらく呪われた土地に粟通しおいるでしょう。


物語は非垞に普遍的に始たりたした倏、暑さ。 特別なこずは䜕もありたせん。ラップトップのハヌドドラむブのコンテンツをゆっくりず閲芧するずき、私の芖線は数幎の間アむドル状態だったおなじみのドラゎンのアむコンが付いたフォルダヌを぀かみたした。


ゲヌムのどのファンが䞭身を知りたがらないのでしょうか


はじめに


ゲヌム情報


Cursed Lands-たたは、CISの倖で呌ばれたように、 Evil IslandsCurse of the Lost Soul 、2000幎にリリヌスされたステルスRPGゲヌム。 このゲヌムはNival Interactiveによっお開発されたした。NivalInteractiveは、圓時すでに䞀連のAllodaゲヌム海倖のRage of Magesずしお確立されおいたした。 モスクワ州立倧孊のほずんどの卒業生はそこで働いおいたした-圌らは完党に3次元の䞖界を持぀最初のゲヌムの1぀を実珟するこずができたした。
2010幎、Mail.Ru information がタむトルを譲枡したしたが、ゲヌムはNivalに代わっおGOGストアで販売されおいたす。


比范的最近、ゲヌムは18歳になりたした-CISでのリリヌス日である10月26日の誕生日ず芋なされたす。 時代にもかかわらず、公匏のマスタヌサヌバヌはただ䜿甚䞭です。定期的に、誰かがGipatの森をい回り、仲間のチヌムで12個たたは2個のスケルトンを攻撃するこずにしたす。


蚘事に぀いお簡単に


圓初、私の目暙は、暙準ラむブラリのみを䜿甚しお、Python 3で「自分甚」の䞀方向コンバヌタを䜜成するこずだけでした。 しかし、その過皋で、フォヌマットに関する文曞化がスムヌズに始たり、䜕らかの圢で出力を暙準化しようずしたした。 䞀郚の圢匏では、構造はKaitai Structを䜿甚しお蚘述されたした。 その結果、すべおがこの蚘事ずwikiを圢匏で曞くこずになりたした。


すぐに泚意したす。ほずんどの堎合、ゲヌムファむルは既に調査されおおり、ファン゚ディタヌが䜜成されおいたす。 ただし、情報は非垞に断片化されおおり、パブリックドメむンの圢匏の完党な説明はほずんどありたせん。たた、倉曎を䜜成するための適切なセットもありたせん。


...そしおそれを読む方法


スキヌム.ksyファむルはすべおの圢匏で提䟛され、2回クリックするだけでいく぀かの最も䞀般的な蚀語のコヌドに倉換できたす。


残念ながら、すでにこの蚘事を曞いおいる最埌の段階で、尊敬されるHabrはYAMLおよびJSONを匷調衚瀺する方法を知らず、すべおのスキヌムがそれを䜿甚しおいるこずがわかりたした。 これは倧きな問題ではありたせんが、スキヌムを読むのが䞍䟿な堎合は、NPPなどのサヌドパヌティの゚ディタヌにコピヌするこずをお勧めしたす。


リ゜ヌスずその堎所


このゲヌムは、ラむブラリ、ランチャヌ、および実際にはリ゜ヌスが詰め蟌たれた゚ンゞンを含むポヌタブルアプリケヌションです。


これは興味深いです 。ゲヌムの蚭定は、ほが完党にレゞストリに保存されたす。 GOGバヌゞョンのカメラのバグは、むンストヌラヌが正しいデフォルト倀を登録しないずいう事実によるものです。

ゲヌムフォルダの内容を䞀芋するず、ASIずREGずいう2぀の新しいファむル拡匵子がすぐにわかりたす。
1぀目は動的ラむブラリであり、これは考慮したせんこれはリバヌス゚ンゞニアリングの専門家によっお行われたすが、2぀目はゲヌムの最初のネむティブファむル圢匏です。


REG


このタむプのファむルは、既知のテキストINIファむルのバむナリシリアル化です。
コンテンツは、キヌずその倀を栌玍するセクションに分割されたす。 REGファむルはこの階局を保持したすが、デヌタの読み取りず解析を高速化したす-2000幎には、これは明らかに重芁でした。


䞀般に、この図の構造を説明できたす。


構造説明
meta: id: reg title: Evil Islands, REG file (packed INI) application: Evil Islands file-extension: reg license: MIT endian: le doc: Packed INI file seq: - id: magic contents: [0xFB, 0x3E, 0xAB, 0x45] doc: Magic bytes - id: sections_count type: u2 doc: Number of sections - id: sections_offsets type: section_offset doc: Sections offset table repeat: expr repeat-expr: sections_count types: section_offset: doc: Section position in file seq: - id: order type: s2 doc: Section order number - id: offset type: u4 doc: Global offset of section in file instances: section: pos: offset type: section types: section: doc: Section representation seq: - id: keys_count type: u2 doc: Number of keys in section - id: name_len type: u2 doc: Section name lenght - id: name type: str encoding: cp1251 size: name_len doc: Section name - id: keys type: key doc: Section's keys repeat: expr repeat-expr: keys_count types: key: doc: Named key seq: - id: order type: s2 doc: Key order in section - id: offset type: u4 doc: Key offset in section instances: key_record: pos: _parent._parent.offset + offset type: key_data key_data: seq: - id: packed_type type: u1 doc: Key value info - id: name_len type: u2 doc: Key name lenght - id: name type: str encoding: cp1251 size: name_len doc: Key name - id: value type: value doc: Key value instances: is_array: value: packed_type > 127 doc: Is this key contain array value_type: value: packed_type & 0x7F doc: Key value type types: value: doc: Key value seq: - id: array_size type: u2 if: _parent.is_array doc: Value array size - id: data type: switch-on: _parent.value_type cases: 0: s4 1: f4 2: string repeat: expr repeat-expr: '_parent.is_array ? array_size : 1' doc: Key value data string: doc: Sized string seq: - id: len type: u2 doc: String lenght - id: value type: str encoding: cp1251 size: len doc: String 

これは興味深いものです 。2002幎、Nivalはゲヌムのコミュニティずいく぀かのツヌルを共有したした サむトスナップショット -それらの1぀はREGのINIシリアラむザヌでした。 ご想像のずおり、デシリアラむザヌは公匏ではありたせんが、ほずんどすぐに登堎したした。

開始フォルダが敎理されたら、サブディレクトリに進みたしょう。
最初の倖芳は、CAMファむルを含むカメラフォルダヌにありたす。


カム


非垞に単玔な圢匏は、時間の経過ずずもにカメラの䜍眮を単玔にパックするこずです。 カメラは䜍眮ず回転によっお蚘述されたす。 他の2぀のフィヌルドは、おそらく移動シヌケンスの時間ずステップです。



構造説明
 meta: id: cam title: Evil Islands, CAM file (cameras) application: Evil Islands file-extension: cam license: MIT endian: le doc: Camera representation seq: - id: cams type: camera repeat: eos types: vec3: doc: 3d vector seq: - id: x type: f4 doc: x axis - id: y type: f4 doc: y axis - id: z type: f4 doc: z axis quat: doc: quaternion seq: - id: w type: f4 doc: w component - id: x type: f4 doc: x component - id: y type: f4 doc: y component - id: z type: f4 doc: z component camera: doc: Camera parameters seq: - id: unkn0 type: u4 doc: unknown - id: unkn1 type: u4 doc: unknown - id: position type: vec3 doc: camera's position - id: rotation type: quat doc: camera's rotation 

次のフォルダヌ-Res、予想倖アヌカむブであるRESファむルが保存されたす。


RES


この圢匏は他の拡匵機胜の䞋に隠されおいる堎合がありたすが、元の圢匏はただRESです。
デヌタ構造は、ファむルぞのランダムアクセスを持぀アヌカむブの非垞に兞型的なものです。内郚のファむルに関する情報を保存するためのテヌブル、名前のテヌブル、ファむルの内容がありたす。
ディレクトリ構造は名前に盎接含たれおいたす。


2぀の非垞に興味深い事実に泚目する䟡倀がありたす。


  1. アヌカむブは、ファむル情報をクロヌズドハッシュのリンクリストにロヌドするために最適化されおいたす。
  2. ファむルの内容は䞀床保存できたすが、別の名前で参照したす。 私の知る限り、この事実はファンのリパックで䜿甚されおいたした。これにより、ゲヌムのサむズが倧幅に瞮小されたした。 元のディストリビュヌションでは、アヌカむブの最適化は䜿甚されたせんでした。


構造説明
 meta: id: res title: Evil Islands, RES file (resources archive) application: Evil Islands file-extension: res license: MIT endian: le doc: Resources archive seq: - id: magic contents: [0x3C, 0xE2, 0x9C, 0x01] doc: Magic bytes - id: files_count type: u4 doc: Number of files in archive - id: filetable_offset type: u4 doc: Filetable offset - id: nametable_size type: u4 doc: Size of filenames instances: nametable_offset: value: filetable_offset + 22 * files_count doc: Offset of filenames table filetable: pos: filetable_offset type: file_record repeat: expr repeat-expr: files_count doc: Files metadata table types: file_record: doc: File metadata seq: - id: next_index type: s4 doc: Next file index - id: file_size type: u4 doc: Size of file in bytes - id: file_offset type: u4 doc: File data offset - id: last_change type: u4 doc: Unix timestamp of last change time - id: name_len type: u2 doc: Lenght of filename - id: name_offset type: u4 doc: Filename offset in name array instances: name: io: _root._io pos: name_offset + _parent.nametable_offset type: str encoding: cp1251 size: name_len doc: File name data: io: _root._io pos: file_offset size: file_size doc: Content of file 

これは興味深いものです。ロシア語版のゲヌムでは、Speech.resアヌカむブに2぀のサブディレクトリsずtが含たれ、内容がたったく同じです。そのため、アヌカむブサむズが2倍になりたす。

これで、すべおのアヌカむブを解凍できたすネスト可胜



アヌカむブ内のファむルに拡匵子がない堎合は、BONおよびANMアヌカむブ甚に芪拡匵子を付けたす。


受信したすべおのファむルを4぀のグルヌプに分割するこずもできたす。


  1. テクスチャヌ
  2. デヌタベヌス
  3. モデル
  4. レベルファむル。

シンプルから始めたしょう-テクスチャを䜿っお。


MMP


実際には、テクスチャ。 画像パラメヌタ、MIPレベルの数、䜿甚されおいる圧瞮を瀺す小さな芋出しがありたす。 ヘッダヌの埌に、サむズの降順でMIPむメヌゞレベルがありたす。



構造説明
 meta: id: mmp title: Evil Islands, MMP file (texture) application: Evil Islands file-extension: mmp license: MIT endian: le doc: MIP-mapping texture seq: - id: magic contents: [0x4D, 0x4D, 0x50, 0x00] doc: Magic bytes - id: width type: u4 doc: Texture width - id: height type: u4 doc: Texture height - id: mip_levels_count type: u4 doc: Number of MIP-mapping stored levels - id: fourcc type: u4 enum: pixel_formats doc: FourCC label of pixel format - id: bits_per_pixel type: u4 doc: Number of bits per pixel - id: alpha_format type: channel_format doc: Description of alpha bits - id: red_format type: channel_format doc: Description of red bits - id: green_format type: channel_format doc: Description of green bits - id: blue_format type: channel_format doc: Description of blue bits - id: unused size: 4 doc: Empty space - id: base_texture type: switch-on: fourcc cases: 'pixel_formats::argb4': block_custom 'pixel_formats::dxt1': block_dxt1 'pixel_formats::dxt3': block_dxt3 'pixel_formats::pnt3': block_pnt3 'pixel_formats::r5g6b5': block_custom 'pixel_formats::a1r5g5b5': block_custom 'pixel_formats::argb8': block_custom _: block_custom types: block_pnt3: seq: - id: raw size: _root.bits_per_pixel block_dxt1: seq: - id: raw size: _root.width * _root.height >> 1 block_dxt3: seq: - id: raw size: _root.width * _root.height block_custom: seq: - id: lines type: line_custom repeat: expr repeat-expr: _root.height types: line_custom: seq: - id: pixels type: pixel_custom repeat: expr repeat-expr: _root.width types: pixel_custom: seq: - id: raw type: switch-on: _root.bits_per_pixel cases: 8: u1 16: u2 32: u4 instances: alpha: value: '_root.alpha_format.count == 0 ? 255 : 255 * ((raw & _root.alpha_format.mask) >> _root.alpha_format.shift) / (_root.alpha_format.mask >> _root.alpha_format.shift)' red: value: '255 * ((raw & _root.red_format.mask) >> _root.red_format.shift) / (_root.red_format.mask >> _root.red_format.shift)' green: value: '255 * ((raw & _root.green_format.mask) >> _root.green_format.shift) / (_root.green_format.mask >> _root.green_format.shift)' blue: value: '255 * ((raw & _root.blue_format.mask) >> _root.blue_format.shift) / (_root.blue_format.mask >> _root.blue_format.shift)' channel_format: doc: Description of bits for color channel seq: - id: mask type: u4 doc: Binary mask for channel bits - id: shift type: u4 doc: Binary shift for channel bits - id: count type: u4 doc: Count of channel bits enums: pixel_formats: 0x00004444: argb4 0x31545844: dxt1 0x33545844: dxt3 0x33544E50: pnt3 0x00005650: r5g6b5 0x00005551: a1r5g5b5 0x00008888: argb8 

可胜なピクセルパッケヌゞ圢匏


fourcc説明
44 44 00 00ARGB4
44 58 54 31Dxt1
44 58 54 33Dxt3
50 4E 54 33PNT3-RLE圧瞮ARGB8
50 56 00 00R5G5B5
51 55 00 00A1R5G5B5
88 88 00 00ARGB8

PNT3に぀いお

画像圢匏がPNT3の堎合、解凍埌のピクセル構造はARGB8です。 bits_per_pixel圧瞮画像のサむズバむト単䜍。


PNT3の開梱


 n = 0 destination = b"" while src < size: v = int.from_bytes(source[src:src + 4], byteorder='little') src += 4 if v > 1000000 or v == 0: n += 1 else: destination += source[src - (1 + n) * 4:src - 4] destination += b"\x00" * v n = 0 

これは興味深いです。テクスチャの䞀郚は垂盎に反映されたすたたは䞀郚は反映されたせんか。
そしお、ゲヌムは透明性に非垞にjeしおいたす-画像にアルファチャンネルがある堎合、透明ピクセルの色は正確に黒でなければなりたせん。 たたは癜-なんお幞運。

単玔なフォヌマットは終了したした。より厳栌なフォヌマットに移りたしょう-か぀お、MODメヌカヌのランクは次のフォヌマット甚の独自の線集ツヌルを猛烈に保持したしたが、無駄ではありたせんでした。 私はあなたに譊告したした。


デヌタベヌス* DBなど


この圢匏は説明するのが非垞に䞍䟿です-基本的に、これはノヌドたたはレコヌドテヌブルのシリアル化されたツリヌです。 ファむルは、指定されたフィヌルドタむプを持぀耇数のテヌブルで構成されたす。 䞀般構造テヌブルは共通の「ルヌト」ノヌドにネストされ、レコヌドはテヌブル内のノヌドです。


各ノヌドで、そのタむプずサむズが指定されたす


 unsigned char type_index; unsigned char raw_size; //      unsigned length; //     read(raw_size); if (raw_size & 1) { length = raw_size >> 1; for (int i = 0; i < 3; i++) length <<= 8; read(raw_size); length += raw_size; } else length = raw_size >> 1; 

テヌブルフィヌルドのタむプは、テヌブルのフォヌマット文字列からむンデックスによっお取埗され、実際のタむプは取埗された倀によっお決定されたす。


フィヌルドタむプ
指定説明
Sひも
私は4b int
うん4b笊号なし
F4bフロヌト
Xビットバむト
f浮動小数点配列
私はint配列
Bブヌル
bブヌル配列
H䞍明な16進バむト
T時間
0蚘茉なし
10FII
2SUFF
3FFFF
40SISS
50SISS00000U

拠点の説明

アむテム.idb


テヌブル構造
玠材SSSIFFFIFIFfIX
歊噚SSISIIIFFFFIFIXB00000IHFFFfHHFF
アヌマヌSSISIIIFFFFIFIXB00000ffBiHH
クむックアむテムSSISIIIFFFFIFIXB00000IIFFSbH
ク゚ストアむテムSSISIIIFFFFIFIXB00000Is
アむテムの販売SSISIIIFFFFIFIXB00000IHI

スむッチ.ldb


テヌブル構造
スむッチのプロトタむプSfIFTSSS

スキルずスキル.pdb


テヌブル構造
胜力SSI0000000s
スキルSSI0000000SSIIIFFFIIIIBI

フットプリントprints.db


テヌブル構造
血痕0S11
炎の痕跡0S110000001
足跡0S11

スペル.sdb


テヌブル構造
プロトタむプSSSFIFIFFFFIIIIUSSIIbIXFFFFF
修食子SSFIFFISX
パタヌン0SssSX
アヌマヌテンプレヌト0SssSX
歊噚のパタヌン0SssSX

クリヌチャヌ.udb


テヌブル構造
砎損郚品SffUU
人皮SUFFUUFfFUUf222222000000000000SssFSsfUUfUUIUSBFUUUU
モンスタヌのプロトタむプSSIUIFFFSFFFFFFFFFUFFFFFFff33sfssSFFFFFUFUSF
NPCSUFFFFbbssssFUB

叫び声acks.db


テヌブル構造
答え0S0000000044444444444444444444445444444444444
悲鳎0S0000000044444
その他0S0000000044

ク゚スト.qdb


テヌブル構造
タスクSFIISIIs
ブリヌフィングSFFsSsssssI

これは興味深いです。 2002幎1月16日、Nivalはcsv圢匏のマルチプレむダヌの゜ヌスベヌスず、ゲヌム圢匏のナヌティリティコンバヌタヌ サむトスナップショット を投皿したした。 圓然、逆コンバヌタヌの衚瀺は遅くありたせんでした。 たた、modmakerからフィヌルドずそのタむプを説明するドキュメントが少なくずも2぀ありたすが、それらを読むこずは非垞に困難です。

Adb


特定のタむプのナニットのアニメヌションデヌタベヌス。 䞊蚘の* DBずは察照的に、これは非垞に「人間」です。これは、静的フィヌルドサむズの単䞀レベルのテヌブルです。



構造説明
 meta: id: adb title: Evil Islands, ADB file (animations database) application: Evil Islands file-extension: adb license: MIT endian: le doc: Animations database seq: - id: magic contents: [0x41, 0x44, 0x42, 0x00] doc: Magic bytes - id: animations_count type: u4 doc: Number of animations in base - id: unit_name type: str encoding: cp1251 size: 24 doc: Name of unit - id: min_height type: f4 doc: Minimal height of unit - id: mid_height type: f4 doc: Middle height of unit - id: max_height type: f4 doc: Maximal height of unit - id: animations type: animation doc: Array of animations repeat: expr repeat-expr: animations_count types: animation: doc: Animation's parameters seq: - id: name type: str encoding: cp1251 size: 16 doc: Animation's name - id: number type: u4 doc: Index in animations array - id: additionals type: additional doc: Packed structure with animation parameters - id: action_probability type: u4 doc: Percents of action probability - id: animation_length type: u4 doc: Lenght of animation in game ticks - id: movement_speed type: f4 doc: Movement speed - id: start_show_hide1 type: u4 - id: start_show_hide2 type: u4 - id: start_step_sound1 type: u4 - id: start_step_sound2 type: u4 - id: start_step_sound3 type: u4 - id: start_step_sound4 type: u4 - id: start_hit_frame type: u4 - id: start_special_sound type: u4 - id: spec_sound_id1 type: u4 - id: spec_sound_id2 type: u4 - id: spec_sound_id3 type: u4 - id: spec_sound_id4 type: u4 types: additional: seq: - id: packed type: u8 instances: weapons: value: 'packed & 127' allowed_states: value: '(packed >> 15) & 7' action_type: value: '(packed >> 18) & 15' action_modifyer: value: '(packed >> 22) & 255' animation_stage: value: '(packed >> 30) & 3' action_forms: value: '(packed >> 36) & 63' 

これは興味深いものです。いく぀かのナニットでは、郚分的に切り捚おられたデヌタベヌス圢匏が䜿甚されたすが、ほずんど怜蚎されおいたせん。

デヌタベヌスを扱ったので、商業的な䌑憩を宣蚀したす。 しかし、我々は䜕も宣䌝したせん-私たちの方法ではありたせん。 次に䟿利なもの、クリヌチャヌファむルの名前の付け方をより適切に瀺したす。


モデル名の圢匏


名前は2文字のグルヌプ-論理「レベル」の略語から収集されたす。
たずえば、女性キャラクタヌはunhufe - Unit > Human > Femaleであり、 initwesp - Inventory > Item > Weapon > Spear 、぀たり圚庫の槍背䞭ではなく、それは良いです。


名前芁玠の完党なツリヌ
 un: # unit an: # animal wi: # wild ti # tiger ba # bat bo # boar hy # hyen de # deer gi # rat ra # rat cr # crawler wo # wolf ho: # home co # cow pi # pig do # dog ho # horse ha # hare or: # orc fe # female ma # male mo: # monster co # column (menu) un # unicorn cu # Curse be # beholder tr # troll el # elemental su # succub (harpie) ba # banshee dr # driad sh # shadow li # lizard sk # skeleton sp # spider go # golem, goblin ri # Rick og # ogre zo # zombie bi # Rik's dragon cy # cyclope dg # dragon wi # willwisp mi # octopus to # toad hu: # human fe # female ma # male in: # inventory it: # item qu # quest qi # interactive ar: # armor pl # plate gl # gloves lg # leggins bt # boots sh # shirt hl # helm pt # pants li: # loot mt # material tr # trade we: # weapon hm # hammer dg # dagger sp # spear cb # crossbow sw # sword ax # axe bw # bow gm # game menu fa: # faces un: # unit an: # animal wi: # wild ti: # tiger face # face ba: # bat face # face bo: # boar face # face de: # deer face # face ra: # rat face # face cr: # crawler face # face wo: # wolf face # face ho: # home co: # cow face # face pi: # pig face # face do: # dog face # face ho: # horse face # face ha: # hare face # face hu: # human fe: # female fa # me # th # ma: # male fa # me # th # mo: # monster to: # toad face # face tr: # troll face # face or: # orc face # face sp: # spider face # face li: # lizard face # face na: # nature fl: # flora bu # bush te # termitary tr # tree li # waterplant wa # waterfall sk # sky st # stone ef: # effects cu # ar # co # components st: # static si # switch bu: # building to # tower ho # house tr # trap br # bridge ga # gate we # well (waterhole) wa: # wall me # medium li # light to # torch st # static 

これは興味深いです。この分類によれば、キノコは朚であり、ゎブリンを持぀ゎヌレムは兄匟であり、Tka-Rickはモンスタヌです。 たた、ここでは、怪物の「働く」名前を芋るこずができたす。これは、DDの名前ず疑わしく䌌おいたす-芋る人邪県、サキュブハヌピヌ、鬌人食い人皮、ドリアド森の人。

道埳的に䌑んで、私たちは真っ向からモデルに飛び蟌みたす。 それらは、互いにリンクされたいく぀かの圢匏で衚瀺されたす。


Lnk


論理的に-モデルの基瀎。 モデルのパヌツの階局を、珟代の3Dモデリングの芳点から説明したす-ボヌンの階局。



構造説明
 meta: id: lnk title: Evil Islands, LNK file (bones hierarchy) application: Evil Islands file-extension: lnk license: MIT endian: le doc: Bones hierarchy seq: - id: bones_count type: u4 doc: Number of bones - id: bones_array type: bone repeat: expr repeat-expr: bones_count doc: Array of bones types: bone: doc: Bone node seq: - id: bone_name_len type: u4 doc: Length of bone's name - id: bone_name type: str encoding: cp1251 size: bone_name_len doc: Bone's name - id: parent_name_len type: u4 doc: Length of bone's parent name - id: parent_name type: str encoding: cp1251 size: parent_name_len doc: Bone's parent name 

芪ボヌンの芪名は空の文字列長さ0です。


骚はありたすが、名前を付けお組み立おるだけでは十分ではありたせん。骚に組み立おる必芁がありたす。


ボン


前述のように、この圢匏アヌカむブでない堎合は、芪パヌツに察するモデルのパヌツボヌンの䜍眮を蚭定したす。 回転せずにオフセットのみが保存されたす-最新のフォヌマットずの違いの1぀です。



構造説明
 meta: id: bon title: Evil Islands, BON file (bone position) application: Evil Islands file-extension: bon license: MIT endian: le doc: Bone position seq: - id: position type: vec3 doc: Bone translation repeat: eos types: vec3: doc: 3d vector seq: - id: x type: f4 doc: x axis - id: y type: f4 doc: y axis - id: z type: f4 doc: z axis 

ご芧のずおり、1぀のオフセットには数が倚すぎたす-実際、ここで最初にゲヌム゚ンゞンの重芁な機胜の1぀であるトリリニアモデル補間に出䌚いたした。


仕組みモデルには、条件、匷床、噚甚さ、成長ずいう3぀の補間パラメヌタヌがありたす。 モデルには8぀の極端な状態もありたす。 パラメヌタを䜿甚しお、トラむリニア補間により最終モデルを取埗できたす。


アルゎリズム自䜓
 def trilinear(val, coefs=[0, 0, 0]): # Linear interpolation by str t1 = val[0] + (val[1] - val[0]) * coefs[1] t2 = val[2] + (val[3] - val[2]) * coefs[1] # Bilinear interpolation by dex v1 = t1 + (t2 - t1) * coefs[0] # Linear interpolation by str t1 = val[4] + (val[5] - val[4]) * coefs[1] t2 = val[6] + (val[7] - val[6]) * coefs[1] # Bilinear interpolation by dex v2 = t1 + (t2 - t1) * coefs[0] # Trilinear interpolation by height return v1 + (v2 - v1) * coefs[2] 

これは興味深いです。たずえば、石のドアやチェストを開くなど、䞀郚のオブゞェクトをアニメヌション化するために、トラむリニアモデルの補間が䜿甚されたす。

今こそ、モデル自䜓の䞀郚を芋るずきです。


図


おそらく、この集䌚は理解するこずが䞍可胜です。 圌の説明ずブレンダヌのプラグむンはネット䞊で芋぀けるこずができたすが、それらを知っおいおもすぐには気づきたせん。 ご芧ください



構造説明
 meta: id: fig title: Evil Islands, FIG file (figure) application: Evil Islands file-extension: fig license: MIT endian: le doc: 3d mesh seq: - id: magic contents: [0x46, 0x49, 0x47, 0x38] doc: Magic bytes - id: vertex_count type: u4 doc: Number of vertices blocks - id: normal_count type: u4 doc: Number of normals blocks - id: texcoord_count type: u4 doc: Number of UV pairs - id: index_count type: u4 doc: Number of indeces - id: vertex_components_count type: u4 doc: Number of vertex components - id: morph_components_count type: u4 doc: Number of morphing components - id: unknown contents: [0, 0, 0, 0] doc: Unknown (aligment) - id: group type: u4 doc: Render group - id: texture_index type: u4 doc: Texture offset - id: center type: vec3 doc: Center of mesh repeat: expr repeat-expr: 8 - id: aabb_min type: vec3 doc: AABB point of mesh repeat: expr repeat-expr: 8 - id: aabb_max type: vec3 doc: AABB point of mesh repeat: expr repeat-expr: 8 - id: radius type: f4 doc: Radius of boundings repeat: expr repeat-expr: 8 - id: vertex_array type: vertex_block doc: Blocks of raw vertex data repeat: expr repeat-expr: 8 - id: normal_array type: vec4x4 doc: Packed normal data repeat: expr repeat-expr: normal_count - id: texcoord_array type: vec2 doc: Texture coordinates data repeat: expr repeat-expr: texcoord_count - id: index_array type: u2 doc: Triangles indeces repeat: expr repeat-expr: index_count - id: vertex_components_array type: vertex_component doc: Vertex components array repeat: expr repeat-expr: vertex_components_count - id: morph_components_array type: morph_component doc: Morphing components array repeat: expr repeat-expr: morph_components_count types: morph_component: doc: Morphing components indeces seq: - id: morph_index type: u2 doc: Index of morphing data - id: vertex_index type: u2 doc: Index of vertex vertex_component: doc: Vertex components indeces seq: - id: position_index type: u2 doc: Index of position data - id: normal_index type: u2 doc: Index of normal data - id: texture_index type: u2 doc: Index of texcoord data vec2: doc: 2d vector seq: - id: u type: f4 doc: u axis - id: v type: f4 doc: v axis vec3: doc: 3d vector seq: - id: x type: f4 doc: x axis - id: y type: f4 doc: y axis - id: z type: f4 doc: z axis vec3x4: doc: 3d vector with 4 values per axis seq: - id: x type: f4 doc: x axis repeat: expr repeat-expr: 4 - id: y type: f4 doc: y axis repeat: expr repeat-expr: 4 - id: z type: f4 doc: z axis repeat: expr repeat-expr: 4 vertex_block: doc: Vertex raw block seq: - id: block type: vec3x4 doc: Vertex data repeat: expr repeat-expr: _root.vertex_count vec4x4: doc: 4d vector with 4 values per axis seq: - id: x type: f4 doc: x axis repeat: expr repeat-expr: 4 - id: y type: f4 doc: y axis repeat: expr repeat-expr: 4 - id: z type: f4 doc: z axis repeat: expr repeat-expr: 4 - id: w type: f4 doc: w axis repeat: expr repeat-expr: 4 

難しさは䜕ですか したがっお、法線ず頂点のデヌタは4぀のブロックに栌玍され、頂点も補間のために8぀のブロックに配眮されたす。


これは興味深いです。おそらく、1999幎以降Intelプロセッサに登堎したSSE呜什の助けを借りお凊理を高速化するために、このようなグルヌプ化が行われたした。

さお、私たちはモデルを読んで構成したしたが、䜕かが欠けおいたす。 たさに-アニメヌション


あん


アニメヌションは、キヌの状態ずしおコンポヌネント圢匏で保存されたす。 興味深い事実は、骚栌アニメヌションだけでなく頂点モヌフィングもサポヌトされおいるこずです。



構造説明
 meta: id: anm title: Evil Islands, ANM file (bone animation) application: Evil Islands file-extension: anm license: MIT endian: le doc: Bone animation seq: - id: rotation_frames_count type: u4 doc: Number of rotation frames - id: rotation_frames type: quat repeat: expr repeat-expr: rotation_frames_count doc: Bone rotations - id: translation_frames_count type: u4 doc: Number of translation frames - id: translation_frames type: vec3 repeat: expr repeat-expr: translation_frames_count doc: Bone translation - id: morphing_frames_count type: u4 doc: Number of morphing frames - id: morphing_vertex_count type: u4 doc: Number of vertices with morphing - id: morphing_frames type: morphing_frame repeat: expr repeat-expr: morphing_frames_count doc: Array of morphing frames types: vec3: doc: 3d vector seq: - id: x type: f4 doc: x axis - id: y type: f4 doc: y axis - id: z type: f4 doc: z axis quat: doc: quaternion seq: - id: w type: f4 doc: w component - id: x type: f4 doc: x component - id: y type: f4 doc: y component - id: z type: f4 doc: z component morphing_frame: doc: Array of verteces morphing seq: - id: vertex_shift type: vec3 repeat: expr repeat-expr: _parent.morphing_vertex_count doc: Morphing shift per vertex 

それだけです-これで本栌的なモデルができたした。新しくレンダリングされたダドカリを賞賛できたす



懐かしい瞬間

トカゲに必芁なものを芋぀ける


圌の家でトカゲずの䌚話


隠者リザヌドあなたは来た、男。 これはいいです。


ザックあなたが私に䌝えたかったこずはそれだけですか


隠者リザヌドあなたは再び急いでいたす。 私はあなたの質問を芚えおおり、それらに答えたす。 取匕をするために鉄の人々に来たした。 しかし、私は圌らがあなたにどうしたかを芋たした。 圌らは蚀葉を持ちたせん、私は圌らを信じるこずを止めたした。 あなたは蚀葉を守りたした。 取匕があなたに提䟛されたす。


隠者リザヌド人々は金が倧奜きです。 金のトカゲは面癜くない。 あなたは私の仕事を完了したす、そしお私はあなたに私が持っおいる金を䞎えたす。 たくさんの金がありたす。


ザック思慮深く、あたり興味がない うヌん...ゎヌルド...それは確かに傷぀けないだろう...


ザック私が長幎探しおいた老魔術垫の居堎所を芋぀けおくれるずいいのですが。 結局のずころ、トカゲは叀代の人々であり、あなたはそれを知るこずができたす


隠者リザヌドそのずおりです。 トカゲは叀代の人々です。 私たちは老人に぀いお知っおいるすべおを集めるこずができたす。 私のミッションを完了するこずに同意したすか


ザックなんお話だ すべおがすでに行われおいるこずを考慮しおください。


Hermit Lizard たじめに もうやったの 私をだたしたすか


ザック実際、私は冗談を蚀いたかった。そうでなければ、あなたは本圓に真剣だった。


隠者トカゲなるほど。 これは冗談です。 私も冗談を蚀うこずができるず思いたす。 それから。 そしお今、運河に氎を戻す必芁がありたす。 オヌクは私たちから氎を盗みたした。


隠者トカゲ氎に沿っお南に行きたす。 ダムず運河が芋えたす。 ダムを䞊げる必芁がありたす。 レバレッゞ。 あげたす チャネルをブロックする必芁がありたす。 石。 石をあげたせん 圌はすでに運河の端に暪たわっおいたす。 ダムの䞊流。 石は重いです。 オヌクが掘ったずき、圌らは長い間圌を持ち䞊げたした。 あなたが圌を抌すず、圌はすぐに埌退したす。


隠者リザヌドその埌、戻っおきおください。 昔の魔術垫に぀いお孊んだこずをすべおお話ししたす。


ザック手に しかし、ちなみに、ストヌリヌに少しコむンを远加しおも、私はたったく気分を害するこずはありたせん。


隠者のトカゲさらに南の浅瀬に䜏んでいる私の芪relativeにコむンを求めおください。 3番目に䞊んでいる最も遠い砂浜の島に行きたす。 宝物はあなたのものになりたす


トカゲの隠者圌自身ぞ 奇劙な。 この男はナヌモアが倧奜きです。 私は冗談を蚀っおいたした。 男は笑いたせんでした。 ずおも奇劙です。


さお、最も興味深いのは、マップの保存方法です。


MP


これはマップヘッダヌファむルです。 䞍幞な偶然の䞀臎により、拡匵子はマルチプレむダヌの保存ファむルの拡匵子ず䞀臎したすが、これは考慮したせん。


最初に、颚景の䞀般的な説明をする必芁がありたす。



さらに、マップマテリアルの説明ず、アニメヌションタむル氎や溶岩などがありたす。



構造説明
 meta: id: mp title: Evil Islands, MP file (map header) application: Evil Islands file-extension: mp license: MIT endian: le doc: Map header seq: - id: magic contents: [0x72, 0xF6, 0x4A, 0xCE] doc: Magic bytes - id: max_altitude type: f4 doc: Maximal height of terrain - id: x_chunks_count type: u4 doc: Number of sectors by x - id: y_chunks_count type: u4 doc: Number of sectors by y - id: textures_count type: u4 doc: Number of texture files - id: texture_size type: u4 doc: Size of texture in pixels by side - id: tiles_count type: u4 doc: Number of tiles - id: tile_size type: u4 doc: Size of tile in pixels by side - id: materials_count type: u2 doc: Number of materials - id: animated_tiles_count type: u4 doc: Number of animated tiles - id: materials type: material doc: Map materials repeat: expr repeat-expr: materials_count - id: id_array type: u4 doc: Tile type repeat: expr repeat-expr: tiles_count enum: tile_type - id: animated_tiles type: animated_tile doc: Animated tiles repeat: expr repeat-expr: animated_tiles_count types: material: doc: Material parameters seq: - id: type type: u4 doc: Material type by enum: terrain_type - id: color type: rgba doc: RGBA diffuse color - id: self_illumination type: f4 doc: Self illumination - id: wave_multiplier type: f4 doc: Wave speed multiplier - id: warp_speed type: f4 doc: Warp speed multiplier - id: unknown size: 12 types: rgba: doc: RGBA color seq: - id: r type: f4 doc: Red channel - id: g type: f4 doc: Green channel - id: b type: f4 doc: Blue channel - id: a type: f4 doc: Alpha channel enums: terrain_type: 0: base 1: water_notexture 2: grass 3: water animated_tile: doc: Animated tile parameters seq: - id: start_index type: u2 doc: First tile of animation - id: length type: u2 doc: Animation frames count enums: tile_type: 0: grass 1: ground 2: stone 3: sand 4: rock 5: field 6: water 7: road 8: empty 9: snow 10: ice 11: drygrass 12: snowballs 13: lava 14: swamp 15: highrock 

terrain type皮類
0
1
2
3

material type皮類
0grass
1ground
2stone
3sand
4rock
5field
6water
7road
8(empty)
9snow
10ice
11drygrass
12snowballs
13lava
14swamp
15highrock

, Res/aiinfo.res/tileDesc.reg .


: , — .
: .

. !


SEC


— 3232 . , ZonenameXXXYYY .



 meta: id: sec title: Evil Islands, SEC file (map sector) application: Evil Islands file-extension: sec license: MIT endian: le doc: Map sector seq: - id: magic contents: [0x74, 0xF7, 0x4B, 0xCF] doc: Magic bytes - id: liquids type: u1 doc: Liquids layer indicator - id: vertexes type: vertex doc: Vertex array 33x33 repeat: expr repeat-expr: 1089 - id: liquid_vertexes type: vertex doc: Vertex array 33x33 if: liquids != 0 repeat: expr repeat-expr: 'liquids != 0 ? 1089 : 0' - id: tiles type: tile doc: Tile array 16x16 repeat: expr repeat-expr: 256 - id: liquid_tiles type: tile doc: Tile array 16x16 if: liquids != 0 repeat: expr repeat-expr: 'liquids != 0 ? 256 : 0' - id: liquid_material type: u2 doc: Index of material if: liquids != 0 repeat: expr repeat-expr: 'liquids != 0 ? 256 : 0' types: vertex: doc: Vertex data seq: - id: x_shift type: s1 doc: Shift by x axis - id: y_shift type: s1 doc: Shift by y axis - id: altitude type: u2 doc: Height (z position) - id: packed_normal type: normal doc: Packed normal normal: doc: Normal (3d vector) seq: - id: packed type: u4 doc: Normal packed in 4b instances: x: doc: Unpacked x component value: packed >> 11 & 0x7FF y: doc: Unpacked y component value: packed & 0x7FF z: doc: Unpacked z component value: packed >> 22 tile: doc: Tile parameters seq: - id: packed type: u2 doc: Tile information packed in 2b instances: index: doc: Tile index in texture value: packed & 63 texture: doc: Texture index value: packed >> 6 & 255 rotation: doc: Tile rotation (*90 degrees) value: packed >> 14 & 3 

— .



10 z, 11 x y


 unsigned packed_normal; float x = ((float)((packed_normal >> 11) & 0x7FF) - 1000.0f) / 1000.0f; float y = ((float)(packed_normal & 0x7FF) - 1000.0f) / 1000.0f; float z = (float)(packed_normal >> 22) / 1000.0f; 


6 , 8 , 2


 unsigned short texture; unsigned char tile_index = f & 63; unsigned char texture_index = (f >> 6) & 255; unsigned char rotation = (f >> 14) & 3; 

3d


33 33 , , 3232 . — 1 .


:
x = x + x_offset / 254
y = y + y_offset / 254
z = altitude / 65535 * max_altitude ( .mp )


"", :


  0 1 2 *-*-* |\|\| ~ 33 *-*-* |\|\| ~ 66 *-*-* ~ ~ ~ 

, , 1616 . — 2 . , 90 .


. , , ID , MP .


: MP, , : ID , - .
ID — .

— :



- — , .


MOB


( ) , , : . — " ", .
, ( ).


:


 typedef structure { unsigned type_id; unsigned size; byte data[size - 8]; } node; 

(, !)


( , )


 meta: id: mob title: Evil Islands, MOB file (map entities) application: Evil Islands file-extension: mob license: MIT endian: le doc: Map entities tree seq: - id: root_node type: node doc: Root node types: node: doc: Entity node seq: - id: type_id type: u4 doc: Node children type ID - id: size type: u4 doc: Node full size - id: data type: node_data size: size - 8 doc: Node stored data node_data: doc: Node data seq: - id: value type: switch-on: _parent.type_id cases: 0xA000: node 0x00001E00: node 0x00001E01: node 0x00001E02: node 0x00001E03: node 0x00001E0B: node 0x00001E0E: node 0x0000A000: node 0x0000AA01: node 0x0000ABD0: node 0x0000B000: node 0x0000B001: node 0x0000CC01: node 0x0000DD01: node 0x0000E000: node 0x0000E001: node 0x0000F000: node 0x0000FF00: node 0x0000FF01: node 0x0000FF02: node 0xBBAB0000: node 0xBBAC0000: node 0xBBBB0000: node 0xBBBC0000: node 0xBBBD0000: node 0xBBBE0000: node 0xBBBF0000: node 0xDDDDDDD1: node _: u1 doc: Node elements repeat: eos 

()
AiGraph
AreaArray
Byte11
Diplomacy409632x32 2
Dword44
Float44
LeverStats12
Null0
Plot123 floats (vec3)
Plot2DArray
Quaternion164 floats (vec4)
Record>8
Rectangle
ひも
StringArray>4
StringEncrypted>4
UnitStats180
Unknown

type_id
type_id
0x00000000RecordROOT
0x00001E00RecordVSS_SECTION
0x00001E01RecordVSS_TRIGER
0x00001E02RecordVSS_CHECK
0x00001E03RecordVSS_PATH
0x00001E04DwordVSS_ID
0x00001E05RectangleVSS_RECT
0x00001E06DwordVSS_SRC_ID
0x00001E07DwordVSS_DST_ID
0x00001E08ひもVSS_TITLE
0x00001E09ひもVSS_COMMANDS
0x00001E0AByteVSS_ISSTART
0x00001E0BRecordVSS_LINK
0x00001E0CひもVSS_GROUP
0x00001E0DByteVSS_IS_USE_GROUP
0x00001E0ERecordVSS_VARIABLE
0x00001E0FStringArrayVSS_BS_CHECK
0x00001E10StringArrayVSS_BS_COMMANDS
0x00001E11ひもVSS_CUSTOM_SRIPT
0x0000A000RecordOBJECTDBFILE
0x0000AA00NullLIGHT_SECTION
0x0000AA01Record軜い
0x0000AA02FloatLIGHT_RANGE
0x0000AA03ひもLIGHT_NAME
0x0000AA04PlotLIGHT_POSITION
0x0000AA05DwordLIGHT_ID
0x0000AA06ByteLIGHT_SHADOW
0x0000AA07PlotLIGHT_COLOR
0x0000AA08ひもLIGHT_COMMENTS
0x0000ABD0RecordWORLD_SET
0x0000ABD1PlotWS_WIND_DIR
0x0000ABD2FloatWS_WIND_STR
0x0000ABD3FloatWS_TIME
0x0000ABD4FloatWS_AMBIENT
0x0000ABD5FloatWS_SUN_LIGHT
0x0000B000RecordOBJECTSECTION
0x0000B001RecordOBJECT
0x0000B002DwordNID
0x0000B003DwordOBJTYPE
0x0000B004ひもOBJNAME
0x0000B005NullOBJINDEX
0x0000B006ひもOBJTEMPLATE
0x0000B007ひもOBJPRIMTXTR
0x0000B008ひもOBJSECTXTR
0x0000B009PlotOBJPOSITION
0x0000B00AQuaternionOBJROTATION
0x0000B00BNullOBJTEXTURE
0x0000B00CPlotOBJCOMPLECTION
0x0000B00DStringArrayOBJBODYPARTS
0x0000B00EひもPARENTTEMPLATE
0x0000B00FひもOBJCOMMENTS
0x0000B010NullOBJ_DEF_LOGIC
0x0000B011ByteOBJ_PLAYER
0x0000B012DwordOBJ_PARENT_ID
0x0000B013ByteOBJ_USE_IN_SCRIPT
0x0000B014ByteOBJ_IS_SHADOW
0x0000B015NullOBJ_R
0x0000B016ひもOBJ_QUEST_INFO
0x0000C000NullSC_OBJECTDBFILE
0x0000CC00NullSOUND_SECTION
0x0000CC01RecordSOUND
0x0000CC02DwordSOUND_ID
0x0000CC03PlotSOUND_POSITION
0x0000CC04DwordSOUND_RANGE
0x0000CC05ひもSOUND_NAME
0x0000CC06DwordSOUND_MIN
0x0000CC07DwordSOUND_MAX
0x0000CC08ひもSOUND_COMMENTS
0x0000CC09NullSOUND_VOLUME
0x0000CC0AStringArraySOUND_RESNAME
0x0000CC0BDwordSOUND_RANGE2
0x0000CC0DByteSOUND_AMBIENT
0x0000CC0EByteSOUND_IS_MUSIC
0x0000D000NullPR_OBJECTDBFILE
0x0000DD00NullPARTICL_SECTION
0x0000DD01RecordPARTICL
0x0000DD02DwordPARTICL_ID
0x0000DD03PlotPARTICL_POSITION
0x0000DD04ひもPARTICL_COMMENTS
0x0000DD05ひもPARTICL_NAME
0x0000DD06DwordPARTICL_TYPE
0x0000DD07FloatPARTICL_SCALE
0x0000E000RecordDIRICTORY
0x0000E001RecordFOLDER
0x0000E002ひもDIR_NAME
0x0000E003DwordDIR_NINST
0x0000E004DwordDIR_PARENT_FOLDER
0x0000E005ByteDIR_TYPE
0x0000F000RecordDIRICTORY_ELEMENTS
0x0000FF00RecordSEC_RANGE
0x0000FF01RecordMAIN_RANGE
0x0000FF02RecordRANGE
0x0000FF05DwordMIN_ID
0x0000FF06DwordMAX_ID
0x31415926AiGraphAIGRAPH
0xACCEECCAひもSS_TEXT_OLD
0xACCEECCBStringEncryptedSS_TEXT
0xBBAB0000RecordMAGIC_TRAP
0xBBAB0001DwordMT_DIPLOMACY
0xBBAB0002ひもMT_SPELL
0xBBAB0003AreaArrayMT_AREAS
0xBBAB0004Plot2DArrayMT_TARGETS
0xBBAB0005DwordMT_CAST_INTERVAL
0xBBAC0000RecordLEVER
0xBBAC0001NullLEVER_SCIENCE_STATS
0xBBAC0002ByteLEVER_CUR_STATE
0xBBAC0003ByteLEVER_TOTAL_STATE
0xBBAC0004ByteLEVER_IS_CYCLED
0xBBAC0005ByteLEVER_CAST_ONCE
0xBBAC0006LeverStatsLEVER_SCIENCE_STATS_NEW
0xBBAC0007ByteLEVER_IS_DOOR
0xBBAC0008ByteLEVER_RECALC_GRAPH
0xBBBB0000RecordUNIT
0xBBBB0001NullUNIT_R
0xBBBB0002ひもUNIT_PROTOTYPE
0xBBBB0003NullUNIT_ITEMS
0xBBBB0004UnitStatsUNIT_STATS
0xBBBB0005StringArrayUNIT_QUEST_ITEMS
0xBBBB0006StringArrayUNIT_QUICK_ITEMS
0xBBBB0007StringArrayUNIT_SPELLS
0xBBBB0008StringArrayUNIT_WEAPONS
0xBBBB0009StringArrayUNIT_ARMORS
0xBBBB000AByteUNIT_NEED_IMPORT
0xBBBC0000RecordUNIT_LOGIC
0xBBBC0001NullUNIT_LOGIC_AGRESSIV
0xBBBC0002ByteUNIT_LOGIC_CYCLIC
0xBBBC0003DwordUNIT_LOGIC_MODEL
0xBBBC0004FloatUNIT_LOGIC_GUARD_R
0xBBBC0005PlotUNIT_LOGIC_GUARD_PT
0xBBBC0006ByteUNIT_LOGIC_NALARM
0xBBBC0007ByteUNIT_LOGIC_USE
0xBBBC0008NullUNIT_LOGIC_REVENGE
0xBBBC0009NullUNIT_LOGIC_FEAR
0xBBBC000AFloatUNIT_LOGIC_WAIT
0xBBBC000BByteUNIT_LOGIC_ALARM_CONDITION
0xBBBC000CFloatUNIT_LOGIC_HELP
0xBBBC000DByteUNIT_LOGIC_ALWAYS_ACTIVE
0xBBBC000EByteUNIT_LOGIC_AGRESSION_MODE
0xBBBD0000RecordGUARD_PT
0xBBBD0001PlotGUARD_PT_POSITION
0xBBBD0002NullGUARD_PT_ACTION
0xBBBE0000RecordACTION_PT
0xBBBE0001PlotACTION_PT_LOOK_PT
0xBBBE0002DwordACTION_PT_WAIT_SEG
0xBBBE0003DwordACTION_PT_TURN_SPEED
0xBBBE0004ByteACTION_PT_FLAGS
0xBBBF0000RecordTORCH
0xBBBF0001FloatTORCH_STRENGHT
0xBBBF0002PlotTORCH_PTLINK
0xBBBF0003ひもTORCH_SOUND
0xDDDDDDD1RecordDIPLOMATION
0xDDDDDDD2DiplomacyDIPLOMATION_FOF
0xDDDDDDD3StringArrayDIPLOMATION_PL_NAMES
0xFFFFFFFFUnknownUNKNOWN

— , , Nival, — , ( , ).


 unsigned key; for (size_t i = 0; i < size; i++) { key += (((((key * 13) << 4) + key) << 8) - key) * 4 + 2531011; data[i] ^= key >> 16; } 

: , ( ) . , , , .

( , , — Windows 98):



: , . , ( , , " : ", ).

, , - - , , Collada :



゚ピロヌグ


. , .


, . - , — - , . , -...


— !


UPD (23.01.2019):
, : github .
, (, "" ).




Source: https://habr.com/ru/post/J434802/


All Articles