예제 #1
0
        ///
        /// Read entity data from all layers in a .lvl file.
        /// Callbacks are used so that the caller can handle the creation
        /// of new layers and instantiate new game objects using the entity
        /// data from the file.
        ///
        public bool ReadAll(
            Action <LvlLayer> create_layer_callback,
            Action <LvlEntity, Vector2Int> create_entity_callback,
            out LvlHeader header)
        {
            if (!TryReadHeader(out header))
            {
                return(false);
            }

            for (int layer = 0; layer < header.layers; layer++)
            {
                create_layer_callback(ReadLayer());

                for (int i = 0; i < header.width; i++)
                {
                    for (int j = 0; j < header.height; j++)
                    {
                        var pos    = new Vector2Int(i, j);
                        var entity = ReadEntity();

                        if (entity.empty)
                        {
                            // Don't invoke callback unless there is data
                            continue;
                        }

                        create_entity_callback(entity, pos);
                    }
                }
            }
            return(true);
        }
예제 #2
0
        public bool WriteHeader(LvlHeader header)
        {
            if (!ValidState(State.Header))
            {
                return(false);
            }

            writer.Write(LvlHeader.SIGNATURE_VERSION);
            writer.Write(header.layers);
            writer.Write(header.palette);
            writer.Write(header.width);
            writer.Write(header.height);
            writer.Write(header.camera.x);
            writer.Write(header.camera.y);
            writer.Write(header.camera.z);
            writer.Write(header.camera.ortho_size);
            writer.Write(header.camera.set_color);
            writer.Write(header.camera.r);
            writer.Write(header.camera.g);
            writer.Write(header.camera.b);
            writer.Write(header.name);
            writer.Write(header.author);
            state = State.Layer;
            return(true);
        }
예제 #3
0
        public bool TryReadHeader(out LvlHeader header)
        {
            header = new LvlHeader();
            int sign = reader.ReadInt32();

            if (sign != (LvlHeader.SIGNATURE_VERSION))
            {
                Debug.LogErrorFormat("[lvl2d] Incompatible version {0:X8}", sign);
                return(false);
            }

            header.layers  = reader.ReadUInt16();
            header.palette = reader.ReadUInt16();
            header.width   = reader.ReadUInt16();
            header.height  = reader.ReadUInt16();
            header.camera  = new LvlHeader.Camera()
            {
                x          = reader.ReadSingle(),
                y          = reader.ReadSingle(),
                z          = reader.ReadSingle(),
                ortho_size = reader.ReadSingle(),
                set_color  = reader.ReadBoolean(),
                r          = reader.ReadByte(),
                g          = reader.ReadByte(),
                b          = reader.ReadByte()
            };
            header.name   = reader.ReadString();
            header.author = reader.ReadString();

            return(true);
        }
예제 #4
0
        public bool WriteAll(
            LvlHeader header,
            Func <int, LvlLayer> layer_callback,
            Func <int, Vector2Int, GameObject> entity_callback,
            Func <GameObject, int> find_palette_index_callback)
        {
            if (!WriteHeader(header))
            {
                return(false);
            }

            int map_size = header.width * header.height;

            for (int layer = 0; layer < header.layers; layer++)
            {
                if (!WriteLayer(layer_callback(layer)))
                {
                    return(false);
                }

                for (int i = 0; i < header.width; i++)
                {
                    for (int j = 0; j < header.height; j++)
                    {
                        var entity = entity_callback(layer, new Vector2Int(i, j));
                        int palette_index;

                        if (entity)
                        {
                            palette_index = find_palette_index_callback(entity);
                        }
                        else
                        {
                            palette_index = -1;
                        }

                        if (!WriteEntity(entity, palette_index, map_size))
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }