Пример #1
0
        public static EntryAction FromOffsetOrRead(Pointer offset, Reader reader)
        {
            if (offset == null)
            {
                return(null);
            }
            EntryAction e = EntryAction.FromOffset(offset);

            if (e == null)
            {
                Pointer.DoAt(ref reader, offset, () => {
                    e = EntryAction.Read(reader, offset);
                    MapLoader.Loader.print(e.ToString());
                });
            }
            return(e);
        }
Пример #2
0
        public static EntryAction Read(Reader reader, Pointer offset)
        {
            MapLoader   l  = MapLoader.Loader;
            EntryAction ea = new EntryAction(offset);

            //l.print("EntryAction " + offset);
            l.entryActions.Add(ea);

            if (Settings.s.game == Settings.Game.TTSE)
            {
                ea.off_entryAction_next = Pointer.Read(reader);
                ea.off_entryAction_prev = Pointer.Read(reader);
                reader.ReadUInt32(); //element.off_entryAction_hdr = Pointer.Read(reader); // hdr pointer doesn't work here
                ea.keywords = LinkedList <KeyWord> .Read(ref reader, Pointer.Current(reader),
                                                         (off_element) => {
                    return(KeyWord.Read(reader, off_element));
                },
                                                         flags : Settings.s.hasLinkedListHeaderPointers?
                                                         LinkedList.Flags.HasHeaderPointers :
                                                         LinkedList.Flags.NoPreviousPointersForDouble,
                                                         type : LinkedList.Type.Default);

                ea.off_name = Pointer.Read(reader);
                reader.ReadInt32(); // -2
                reader.ReadUInt32();
                reader.ReadByte();
                ea.active = reader.ReadByte();
                reader.ReadBytes(2);
            }
            else
            {
                if (Settings.s.hasExtraInputData)
                {
                    reader.ReadBytes(0x18);
                }
                if (Settings.s.platform == Settings.Platform.PS2 &&
                    (Settings.s.game == Settings.Game.RM ||
                     Settings.s.game == Settings.Game.RA ||
                     Settings.s.mode == Settings.Mode.Rayman3PS2Demo_2002_12_18))
                {
                    reader.ReadBytes(0x8);
                }
                ea.num_keywords = reader.ReadUInt32();
                ea.off_keywords = Pointer.Read(reader);
                ea.keywords     = new LinkedList <KeyWord>(Pointer.Current(reader), ea.off_keywords, ea.num_keywords, type: LinkedList.Type.SingleNoElementPointers);
                if (Settings.s.engineVersion < Settings.EngineVersion.R2)
                {
                    reader.ReadUInt32();                                                       // Offset of extra input data in tmp memory? It's different by 0x18 every time
                }
                ea.off_name = Pointer.Read(reader);
                if (Settings.s.hasExtraInputData || Settings.s.platform == Settings.Platform.DC || Settings.s.engineVersion == Settings.EngineVersion.R3)
                {
                    ea.off_name2 = Pointer.Read(reader);
                }
                reader.ReadInt32();                 // -2
                reader.ReadUInt32();
                ea.active = reader.ReadByte();
                reader.ReadBytes(3);

                ea.keywords.ReadEntries(ref reader, (off_element) => {
                    return(KeyWord.Read(reader, off_element));
                });
            }
            if (ea.keywords != null && ea.keywords.Count > 0)
            {
                int keywordsRead = ea.keywords[0].FillInSubKeywords(ref reader, ea.keywords, 0);
                if (keywordsRead != ea.keywords.Count)
                {
                    Debug.LogError(offset + " - Keywords read was: " + keywordsRead + " vs " + ea.keywords.Count);
                    Debug.LogError(ea.ToString());
                }
            }
            Pointer.DoAt(ref reader, ea.off_name, () => {
                ea.name = reader.ReadNullDelimitedString();
            });
            Pointer.DoAt(ref reader, ea.off_name2, () => {
                ea.name2 = reader.ReadNullDelimitedString();
            });

            return(ea);
        }