Exemplo n.º 1
0
        public void ReadEvents(Stream s, uint layoutVersion, GameDifficulty difficulty)
        {
            using (BinaryReader r = new BinaryReader(s)) {
                int width  = r.ReadInt32();
                int height = r.ReadInt32();

                byte difficultyBit;
                switch (difficulty)
                {
                case GameDifficulty.Easy:
                    difficultyBit = 4;
                    break;

                case GameDifficulty.Hard:
                    difficultyBit = 6;
                    break;

                case GameDifficulty.Normal:
                //case GameDifficulty.Default:
                //case GameDifficulty.Multiplayer:
                default:
                    difficultyBit = 5;
                    break;
                }

                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        ushort   eventID     = r.ReadUInt16();
                        byte     flags       = r.ReadByte();
                        ushort[] eventParams = new ushort[8];

                        // ToDo: Remove inlined constants

                        // Flag 0x02: Generator
                        byte generatorFlags, generatorDelay;
                        if ((flags & 0x02) != 0)
                        {
                            //eventFlags ^= 0x02;
                            generatorFlags = r.ReadByte();
                            generatorDelay = r.ReadByte();
                        }
                        else
                        {
                            generatorFlags = 0;
                            generatorDelay = 0;
                        }

                        // Flag 0x01: No params provided
                        if ((flags & 0x01) == 0)
                        {
                            flags ^= 0x01;
                            for (int i = 0; i < 8; ++i)
                            {
                                eventParams[i] = r.ReadUInt16();
                            }
                        }

                        ActorInstantiationFlags eventFlags = (ActorInstantiationFlags)(flags & 0x04);

                        // Flag 0x02: Generator
                        if ((flags & 0x02) != 0)
                        {
                            if ((flags & (0x01 << difficultyBit)) != 0 && (flags & 0x80) == 0)
                            {
                                ushort generatorIdx = (ushort)generators.Count;
                                float  timeLeft     = ((generatorFlags & 0x01) != 0 ? generatorDelay : 0f);

                                generators.Add(new GeneratorInfo {
                                    EventPos    = x + y * layoutWidth,
                                    EventType   = (EventType)eventID,
                                    EventParams = eventParams,
                                    Delay       = generatorDelay,
                                    TimeLeft    = timeLeft
                                });

                                StoreTileEvent(x, y, EventType.Generator, eventFlags, new[] { generatorIdx });
                            }
                            continue;
                        }

                        // If the difficulty bytes for the event don't match the selected difficulty, don't add anything to the event map
                        // Additionally, never show events that are multiplayer-only
                        if (flags == 0 || ((flags & (0x01 << difficultyBit)) != 0 && (flags & 0x80) == 0))
                        {
                            switch ((EventType)eventID)
                            {
                            case EventType.Empty:
                                break;

                            case EventType.LevelStart: {
                                for (int i = 0; i < /*16*/ 4; i++)
                                {
                                    if ((eventParams[0] & (1 << i)) != 0)       // Bitmask - 1: Jazz, 2: Spaz, 4: Lori
                                    {
                                        AddSpawnPosition((PlayerType)i, x, y);
                                    }
                                }
                                break;
                            }

#if MULTIPLAYER && SERVER
                            case EventType.LevelStartMultiplayer: {
                                // ToDo: check parameters
                                spawnPositionsForMultiplayer.Add(new Vector2(32 * x + 16, 32 * y + 16 - 8));
                                break;
                            }
#endif

                            case EventType.ModifierOneWay:
                            case EventType.ModifierVine:
                            case EventType.ModifierHook:
                            case EventType.ModifierHurt:
                            case EventType.SceneryDestruct:
                            case EventType.SceneryDestructButtstomp:
                            case EventType.TriggerArea:
                            case EventType.SceneryDestructSpeed:
                            case EventType.SceneryCollapse:
                            case EventType.ModifierHPole:
                            case EventType.ModifierVPole: {
                                StoreTileEvent(x, y, (EventType)eventID, eventFlags, eventParams);
                                TileMap tiles = levelHandler.TileMap;
                                if (tiles != null)
                                {
                                    tiles.SetTileEventFlags(x, y, (EventType)eventID, eventParams);
                                }
                                break;
                            }

                            case EventType.WarpTarget:
                                AddWarpTarget(eventParams[0], x, y);
                                break;

                            case EventType.LightReset:
                                eventParams[0] = (ushort)levelHandler.AmbientLightDefault;
                                StoreTileEvent(x, y, EventType.LightSet, eventFlags, eventParams);
                                break;

                            default:
                                StoreTileEvent(x, y, (EventType)eventID, eventFlags, eventParams);
                                break;
                            }
                        }
                    }
                }
            }

            Array.Copy(eventLayout, eventLayoutForRollback, eventLayout.Length);
        }
Exemplo n.º 2
0
 public ActorBase SpawnEvent(ActorInstantiationFlags flags, EventType type, int x, int y, float z, ushort[] spawnParams)
 {
     return(SpawnEvent(flags, type, new Vector3(x * 32 + 16, y * 32 + 16, z), spawnParams));
 }