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)); }
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(); } }
public Texture2D GetTexture(ActuatorItemData i, bool putOnWall) { if (i.Decoration > 0) { return(putOnWall ? WallTextures[i.Decoration - 1] : FloorTextures[i.Decoration - 1]); } return(null); }
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); }
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)); }
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(); } }
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); }
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)); }
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 ? } }
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); }
public Texture2D GetTexture(ActuatorItemData i, bool putOnWall) { if (i.Decoration > 0) return putOnWall ? WallTextures[i.Decoration - 1] : FloorTextures[i.Decoration - 1]; return null; }
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; }
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); }
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); }
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 ? } }
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(); } }
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); }
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); }
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; }
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; }
public ItemData CreateActuator(ActuatorItemData actuator) { currentTile.Actuators.Add(actuator); return(actuator); }
public IGrabableItem CreateActuator(ActuatorItemData actuator) { throw new InvalidOperationException("Not supported."); }