Example #1
0
        private LogicGate InitLogicGates(ActuatorItemData gateActuator, Tile gateActuatorTile)
        {
            //if nextTarget tile is current tile do not call recurese
            Tile nextTargetTile = gateActuatorTile.GridPosition == ((RemoteTarget)gateActuator.ActionLocation).Position.Position.ToAbsolutePosition(CurrentMap) ? gateActuatorTile : GetTargetTile(gateActuator);

            return(new LogicGate(nextTargetTile, gateActuator.GetActionStateX(), gateActuatorTile.Position, (gateActuator.Data & 0x10) == 0x10, (gateActuator.Data & 0x20) == 0x20, (gateActuator.Data & 0x40) == 0x40, (gateActuator.Data & 0x80) == 0x80));
        }
Example #2
0
        private CounterActuator InitCounters(ActuatorItemData gateActuator, Tile gateActuatorTile)
        {
            //if nextTarget tile is current tile do not call recurese
            Tile nextTargetTile = gateActuatorTile.GridPosition == ((RemoteTarget)gateActuator.ActionLocation).Position.Position.ToAbsolutePosition(CurrentMap) ? gateActuatorTile : GetTargetTile(gateActuator);

            return(new CounterActuator(nextTargetTile, gateActuator.GetActionStateX(), gateActuator.Data, gateActuatorTile.Position));
        }
        protected virtual async Task <SensorX> ParseLogicSensor(ActuatorItemData data)
        {
            switch (data.ActuatorType)
            {
            case 5:
                var logicGateInitializer = new LogicGateInitializer
                {
                    RefBit0 = (data.Data & 0x10) == 0x10,
                    RefBit1 = (data.Data & 0x20) == 0x20,
                    RefBit2 = (data.Data & 0x40) == 0x40,
                    RefBit3 = (data.Data & 0x80) == 0x80
                };
                await SetupInitializer(logicGateInitializer, data);

                return(new LogicGateSensor(logicGateInitializer));

            case 6:
                var counterInitializer = new CounterIntializer()
                {
                    Count = data.Data,
                };
                await SetupInitializer(counterInitializer, data);

                return(new CounterSensor(counterInitializer));

            default:
                throw new InvalidOperationException();
            }
        }
Example #4
0
 public Texture2D GetTexture(ActuatorItemData i, bool putOnWall)
 {
     if (i.Decoration > 0)
     {
         return(putOnWall ? WallTextures[i.Decoration - 1] : FloorTextures[i.Decoration - 1]);
     }
     return(null);
 }
Example #5
0
        private IList <ActuatorItemData> ReadActuatorsData(BinaryReader r)
        {
            var a = new ActuatorItemData[Data.ActuatorsCount];

            for (int i = 0; i < Data.ActuatorsCount; i++)
            {
                a[i] = ParseActuatorData(r);
            }

            return(a);
        }
Example #6
0
        protected virtual async Task <TileSide> CreateWallSide(MapDirection wallDirection, WallTileData wall, Point pos)
        {
            ActuatorItemData[] sensorsData;
            if (wall != null)
            {
                sensorsData = wall.Actuators.Where(a => a.TilePosition == wallDirection.Opposite.ToTilePosition()).ToArray();
            }
            else
            {
                sensorsData = new ActuatorItemData[0];
            }

            TextDataItem textData = wall?.TextTags.FirstOrDefault(x => x.TilePosition == wallDirection.Opposite.ToTilePosition());

            int?randomTexture;

            if (!sensorsData.Any() && AllowedRandomDecoration(wallDirection, wall, out randomTexture))
            {
                sensorsData = new[]
                {
                    new ActuatorItemData
                    {
                        ActuatorType = 0,
                        IsLocal      = true,
                        Decoration   = randomTexture.Value + 1
                    }
                }
            }
            ;

            if (textData != null)
            {
                var res = new TextTileSide(wallDirection, textData.IsVisible, textData.Text);
                res.Renderer = builder.Factories.RenderersSource.GetTextSideRenderer(res, builder.WallTexture);
                return(res);
            }
            else if (!sensorsData.Any())
            {
                var res = new TileSide(wallDirection);
                res.Renderer = builder.Factories.RenderersSource.GetWallSideRenderer(res, builder.WallTexture);
                return(res);
            }
            else
            {
                var items = wall.GrabableItems
                            .Select(builder.ItemCreator.CreateItem)
                            .ToList();

                var res = new ActuatorWallTileSide(await wallCreator.ParseActuatorX(sensorsData, items, pos), wallDirection);
                res.Renderer = builder.Factories.RenderersSource.GetActuatorWallSideRenderer(res, builder.WallTexture);
                return(res);
            }
        }
        public static ActionStateX GetActionStateX(this ActuatorItemData actuator)
        {
            int specifer = -1;
            var location = actuator.ActionLocation as RemoteTarget;

            if (location != null)
            {
                specifer = (int)location.Position.Direction;
            }

            return(new ActionStateX((ActionState)actuator.Action, actuator.ActionDelay * 1000 / 6, actuator.IsOnceOnly, specifer));
        }
Example #8
0
        protected virtual async Task <FloorSensor> CreateSensor(ActuatorItemData arg)
        {
            SensorInitializer <IActuatorX> initializer = new SensorInitializer <IActuatorX>();

            await SetupFloorInitializer(initializer, arg);

            switch (arg.ActuatorType)
            {
            case 5:
            case 0:
                throw new InvalidOperationException();

            case 1:
                return(new FloorSensorC01(initializer));

            case 2:
                return(new FloorSensorC02(initializer));

            case 3:
                var directionInitializer = new DirectionIntializer {
                    Direction = GetDirection(arg.Data)
                };
                await SetupFloorInitializer(directionInitializer, arg);

                return(new FloorSensorC03(directionInitializer));

            case 4:
            case 8:
                var constrainSensorInitalizer = new ItemConstrainSensorInitalizer <IActuatorX> {
                    Data = builder.GetItemFactory(arg.Data)
                };
                await SetupFloorInitializer(constrainSensorInitalizer, arg);

                if (arg.ActuatorType == 4)
                {
                    return(new FloorSensorC04(constrainSensorInitalizer));
                }
                else
                {
                    return(new FloorSensorC08(constrainSensorInitalizer));
                }

            case 6:
                return(new FloorSensorC06(initializer));

            case 7:
                return(new FloorSensorC07(initializer));

            default:
                throw new InvalidOperationException();
            }
        }
Example #9
0
        private ActuatorItemData ParseActuatorData(BinaryReader r)
        {
            var a = new ActuatorItemData();

            a.NextObjectID = r.ReadUInt16();

            ushort data0 = r.ReadUInt16();

            a.Data         = (data0 >> 7 & nineBitsMask);
            a.ActuatorType = data0 & sevenBitsMask;

            ushort data1 = r.ReadUInt16();

            a.Decoration     = (data1 >> 12) & fourBitsMask;
            a.IsLocal        = ((data1 >> 11) & oneBitMask) == 1;
            a.ActionDelay    = (data1 >> 7) & fourBitsMask;
            a.HasSoundEffect = ((data1 >> 6) & oneBitMask) == 1;
            a.IsRevertable   = ((data1 >> 5) & oneBitMask) == 1; //fixed bug
            a.Action         = (ActionType)((data1 >> 3) & twoBitsMask);
            a.IsOnceOnly     = ((data1 >> 2) & oneBitMask) == 1;

            ushort data2 = r.ReadUInt16();

            if (a.IsLocal)
            {
                int action = (data2 >> 4);
                a.ActionLocation = new LocalTarget
                {
                    RotateAutors   = (action == 1 || action == 2),
                    ExperienceGain = action == 10
                };
            }
            else
            {
                a.ActionLocation = new RemoteTarget
                {
                    Position = new MapPosition
                    {
                        Position = new Position
                        {
                            Y = (data2 >> 11) & fiveBitsMask,
                            X = (data2 >> 6) & fiveBitsMask
                        },

                        Direction = (Direction)((data2 >> 4) & twoBitsMask)
                    }
                };
            }

            return(a);
        }
Example #10
0
        protected async Task <WallSensor> CreateChampionActuator(ActuatorItemData data, List <IGrabableItem> items, Point pos)
        {
            var face = builder.ChampionTextures[data.Data];
            var sensor127initializer = new ChampionSensorInitializer
            {
                Champion     = new ChampionCreator(builder).GetChampion(pos, face, items),
                GridPosition = pos,
            };

            await SetupInitializer(sensor127initializer, data);

            var dec = new ChampionDecoration(true);

            sensor127initializer.Graphics          = dec;
            sensor127initializer.Graphics.Renderer = builder.Factories.RenderersSource.GetChampionActuatorRenderer(dec, builder.WallTextures[data.Decoration - 1], face);
            return(new Sensor127(sensor127initializer));
        }
Example #11
0
        public Tile GetTargetTile(ActuatorItemData callingActuator)
        {
            var targetPos = ((RemoteTarget)callingActuator.ActionLocation).Position.Position.ToAbsolutePosition(CurrentMap);

            Tile targetTile = null;

            if (TilesPositions.TryGetValue(targetPos, out targetTile))
            {
                return(targetTile);
            }
            else
            {
                //try find tile in raw data, and than actuator, add it to Tiles Positions
                var virtualTileData = CurrentMap[targetPos.X, targetPos.Y];
                if (virtualTileData.Actuators.Any()) //virtual tile will be proccessed at the and so any checking shouldnt be necessary
                {
                    var newTile = new LogicTile(targetPos.ToGridVector3(CurrentLevel));
                    newTile.Gates    = virtualTileData.Actuators.Where(x => x.ActuatorType == 5).Select(y => InitLogicGates(y, newTile)).ToArray(); //recurse
                    newTile.Counters = virtualTileData.Actuators.Where(x => x.ActuatorType == 6).Select(y => InitCounters(y, newTile)).ToArray();   //recurse

                    TilesPositions.Add(targetPos, targetTile = newTile);                                                                            //subitems will be processed
                }
                else if (virtualTileData.TextTags.Any())
                {
                    var textTag = virtualTileData.TextTags.Single();
                    textTag.HasTargetingActuator = true;
                    targetTile = TilesPositions[textTag.GetParentPosition(targetPos)];

                    if (textTag.Processed)
                    {
                        targetTile.SubItems.Single(x => x is TextTag).AcceptMessages = true;
                    }
                }

                return(targetTile); //TODO (if null)  think out what to do
                //Acutor at the begining references wall near by with tag only ... what to do ?
            }
        }
Example #12
0
        public bool PrepareActuatorData(ActuatorItemData i, out Tile targetTile, out IConstrain constrain, out Texture2D decoration, bool putOnWall)
        {
            targetTile = GetTargetTile(i);
            constrain  = null;
            decoration = null;


            if (i.Data > 0)
            {
                constrain = new GrabableItemConstrain(GetItemFactory(i.Data), i.IsRevertable);
            }
            else
            {
                constrain = new NoConstrain();
            }

            if (i.IsLocal)
            {
                throw new NotSupportedException("yet");
            }
            decoration = GetTexture(i, putOnWall);

            return(true);
        }
Example #13
0
 public Texture2D GetTexture(ActuatorItemData i, bool putOnWall)
 {
     if (i.Decoration > 0)
         return putOnWall ? WallTextures[i.Decoration - 1] : FloorTextures[i.Decoration - 1];
     return null;
 }
Example #14
0
        public bool PrepareActuatorData(ActuatorItemData i, out Tile targetTile, out IConstrain constrain, out Texture2D decoration, bool putOnWall)
        {
            targetTile = GetTargetTile(i);
            constrain = null;
            decoration = null;


            if (i.Data > 0)
                constrain = new GrabableItemConstrain(GetItemFactory(i.Data), i.IsRevertable);
            else
                constrain = new NoConstrain();

            if (i.IsLocal)
                throw new NotSupportedException("yet");
            decoration = GetTexture(i, putOnWall);

            return true;
        }
Example #15
0
        private LogicGate InitLogicGates(ActuatorItemData gateActuator, Tile gateActuatorTile)
        {
            //if nextTarget tile is current tile do not call recurese
            Tile nextTargetTile = gateActuatorTile.GridPosition == ((RemoteTarget)gateActuator.ActionLocation).Position.Position.ToAbsolutePosition(CurrentMap) ? gateActuatorTile : GetTargetTile(gateActuator);

            return new LogicGate(nextTargetTile, gateActuator.GetActionStateX(), gateActuatorTile.Position, (gateActuator.Data & 0x10) == 0x10, (gateActuator.Data & 0x20) == 0x20, (gateActuator.Data & 0x40) == 0x40, (gateActuator.Data & 0x80) == 0x80);
        }
Example #16
0
        private CounterActuator InitCounters(ActuatorItemData gateActuator, Tile gateActuatorTile)
        {
            //if nextTarget tile is current tile do not call recurese
            Tile nextTargetTile = gateActuatorTile.GridPosition == ((RemoteTarget)gateActuator.ActionLocation).Position.Position.ToAbsolutePosition(CurrentMap) ? gateActuatorTile : GetTargetTile(gateActuator);

            return new CounterActuator(nextTargetTile, gateActuator.GetActionStateX(), gateActuator.Data, gateActuatorTile.Position);
        }
Example #17
0
        public Tile GetTargetTile(ActuatorItemData callingActuator)
        {
            var targetPos = ((RemoteTarget)callingActuator.ActionLocation).Position.Position.ToAbsolutePosition(CurrentMap);

            Tile targetTile = null;
            if (TilesPositions.TryGetValue(targetPos, out targetTile))
                return targetTile;
            else
            {
                //try find tile in raw data, and than actuator, add it to Tiles Positions
                var virtualTileData = CurrentMap[targetPos.X, targetPos.Y];
                if (virtualTileData.Actuators.Any()) //virtual tile will be proccessed at the and so any checking shouldnt be necessary
                {
                    var newTile = new LogicTile(targetPos.ToGridVector3(CurrentLevel));
                    newTile.Gates = virtualTileData.Actuators.Where(x => x.ActuatorType == 5).Select(y => InitLogicGates(y, newTile)).ToArray(); //recurse
                    newTile.Counters = virtualTileData.Actuators.Where(x => x.ActuatorType == 6).Select(y => InitCounters(y, newTile)).ToArray(); //recurse

                    TilesPositions.Add(targetPos, targetTile = newTile); //subitems will be processed 
                }
                else if (virtualTileData.TextTags.Any())
                {
                    var textTag = virtualTileData.TextTags.Single();
                    textTag.HasTargetingActuator = true;
                    targetTile = TilesPositions[textTag.GetParentPosition(targetPos)];

                    if (textTag.Processed)
                        targetTile.SubItems.Single(x => x is TextTag).AcceptMessages = true;
                }

                return targetTile; //TODO (if null)  think out what to do 
                //Acutor at the begining references wall near by with tag only ... what to do ? 
            }
        }
Example #18
0
        protected virtual async Task <WallSensor> ParseSensor(ActuatorItemData data, List <IGrabableItem> items, Point pos)
        {
            SensorInitializer <IActuatorX> initializer = new SensorInitializer <IActuatorX>();

            switch (data.ActuatorType)
            {
            case 10:
            //TODO

            case 0:
                await SetupInitializer(initializer, data);

                initializer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor0(initializer));

            case 1:
                var wallDecoration = CreateWallDecoration(data.Decoration - 1, items);
                if (data.Action == ActionType.Hold && wallDecoration is Alcove)
                {
                    var alcInitializer = new SensorInitializer <Alcove>();
                    await SetupInitializer(alcInitializer, data);

                    alcInitializer.Graphics = (Alcove)wallDecoration;
                    return(new Sensor1HoldAlcove(alcInitializer));
                }
                else
                {
                    await SetupInitializer(initializer, data);

                    initializer.Graphics = wallDecoration;
                    return(new Sensor1(initializer));
                }

            case 2:
                var sensor2initalizer = new ItemConstrainSensorInitalizer <IActuatorX> {
                    Data = builder.GetItemFactory(data.Data)
                };
                await SetupInitializer(sensor2initalizer, data);

                sensor2initalizer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor2(sensor2initalizer));

            case 3:
                var sensor3initalizer = new ItemConstrainSensorInitalizer <IActuatorX> {
                    Data = builder.GetItemFactory(data.Data)
                };
                await SetupInitializer(sensor3initalizer, data);

                sensor3initalizer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor3(sensor3initalizer));

            case 4:
                var sensor4initalizer = new ItemConstrainSensorInitalizer <IActuatorX> {
                    Data = builder.GetItemFactory(data.Data)
                };
                await SetupInitializer(sensor4initalizer, data);

                sensor4initalizer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor4(sensor4initalizer));

            case 11:
                var sensor11initalizer = new ItemConstrainSensorInitalizer <IActuatorX> {
                    Data = builder.GetItemFactory(data.Data)
                };
                await SetupInitializer(sensor11initalizer, data);

                sensor11initalizer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor11(sensor11initalizer));

            case 12:
                var sensor12initalizer = new ItemConstrainSensorInitalizer <IActuatorX> {
                    Data = builder.GetItemFactory(data.Data)
                };
                await SetupInitializer(sensor12initalizer, data);

                sensor12initalizer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor12(sensor12initalizer));

            case 13:
                var sensor13initalizer = new StorageSensorInitializer <IActuatorX> {
                    StoredItem = GetStoredObject(items, data.Data), Data = builder.GetItemFactory(data.Data)
                };
                await SetupInitializer(sensor13initalizer, data);

                sensor13initalizer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor13(sensor13initalizer));

            case 16:
                var sensor16initalizer = new StorageSensorInitializer <IActuatorX> {
                    StoredItem = GetStoredObject(items, data.Data), Data = builder.GetItemFactory(data.Data)
                };
                await SetupInitializer(sensor16initalizer, data);

                sensor16initalizer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor16(sensor16initalizer));

            case 17:
                var sensor17initalizer = new ItemConstrainSensorInitalizer <IActuatorX> {
                    Data = builder.GetItemFactory(data.Data)
                };
                await SetupInitializer(sensor17initalizer, data);

                sensor17initalizer.Graphics = CreateWallDecoration(data.Decoration - 1, items);
                return(new Sensor17(sensor17initalizer));

            case 127:
                return(await CreateChampionActuator(data, items, pos));

            default:
                throw new InvalidOperationException();
            }
        }
Example #19
0
 protected async Task SetupFloorInitializer(SensorInitializer <IActuatorX> initializer, ActuatorItemData data)
 {
     if (data.Decoration > 0)
     {
         var texture    = builder.FloorTextures[data.Decoration - 1];
         var decoration = new DecorationItem();
         decoration.Renderer  = builder.Factories.RenderersSource.GetRandomDecorationRenderer(decoration, texture);
         initializer.Graphics = decoration;
     }
     await SetupInitializer(initializer, data);
 }
Example #20
0
        protected async Task <TInitializer> SetupInitializer <TInitializer>(TInitializer initializer, ActuatorItemData data) where TInitializer : SensorInitializerX
        {
            var local  = data.ActionLocation as LocalTarget;
            var remote = data.ActionLocation as RemoteTarget;

            initializer.Audible        = data.HasSoundEffect;
            initializer.Effect         = (SensorEffect)data.Action;
            initializer.LocalEffect    = data.IsLocal;
            initializer.ExperienceGain = local?.ExperienceGain ?? false;
            initializer.Rotate         = local?.RotateAutors ?? false;
            initializer.OnceOnly       = data.IsOnceOnly;
            initializer.RevertEffect   = data.IsRevertable;
            initializer.TimeDelay      = 1000 / 6 * data.ActionDelay;

            initializer.Specifer = remote?.Position.Direction.ToMapDirection() ?? MapDirection.North;

            var tileResult = await builder.GetTargetTile(remote?.Position.Position.ToAbsolutePosition(builder.CurrentMap), initializer.Specifer);

            initializer.TargetTile = tileResult?.Item1;
            if (tileResult != null) //invertDirection
            {
                initializer.Specifer = tileResult.Item2;
            }


            return(initializer);
        }
Example #21
0
        private IList<ActuatorItemData> ReadActuatorsData(BinaryReader r)
        {
            var a = new ActuatorItemData[Data.ActuatorsCount];
            for (int i = 0; i < Data.ActuatorsCount; i++)
                a[i] = ParseActuatorData(r);

            return a;
        }
Example #22
0
        private ActuatorItemData ParseActuatorData(BinaryReader r)
        {
            var a = new ActuatorItemData();
            a.NextObjectID = r.ReadUInt16();

            ushort data0 = r.ReadUInt16();
            a.Data = (data0 >> 7 & nineBitsMask);
            a.ActuatorType = data0 & sevenBitsMask;

            ushort data1 = r.ReadUInt16();
            a.Decoration = (data1 >> 12) & fourBitsMask;
            a.IsLocal = ((data1 >> 11) & oneBitMask) == 1;
            a.ActionDelay = (data1 >> 7) & fourBitsMask;
            a.HasSoundEffect = ((data1 >> 6) & oneBitMask) == 1;
            a.IsRevertable = ((data1 >> 6) & oneBitMask) == 0;
            a.Action = (ActionType)((data1 >> 3) & twoBitsMask);
            a.IsOnceOnly = ((data1 >> 2) & oneBitMask) == 1;

            ushort data2 = r.ReadUInt16();
            if (a.IsLocal)
            {
                int action = (data2 >> 4);
                a.ActionLocation = new LocTrg
                {
                    RotateAutors = (action == 1 || action == 2),
                    ExperienceGain = action == 10
                };
            }
            else
            {
                a.ActionLocation = new RemoteTarget
                {
                    Position = new MapPosition
                    {
                        Position = new Position
                        {
                            Y = (data2 >> 11) & fiveBitsMask,
                            X = (data2 >> 6) & fiveBitsMask
                        },

                        Direction = (Direction)((data2 >> 4) & twoBitsMask)
                    }
                };
            }

            return a;
        }
Example #23
0
 public ItemData CreateActuator(ActuatorItemData actuator)
 {
     currentTile.Actuators.Add(actuator);
     return(actuator);
 }
Example #24
0
 public IGrabableItem CreateActuator(ActuatorItemData actuator)
 {
     throw new InvalidOperationException("Not supported.");
 }