Esempio n. 1
0
        public void AddToTest()
        {
            var ctx = new SimulationContext(true);

            Random        random       = new Random();
            List <Entity> testEntities = CreateEntities(ctx.LocalSpace, 100);

            EntityPool original = new EntityPool(ctx);

            foreach (var e in testEntities)
            {
                Assert.IsTrue(original.Insert(e));
            }
            original.VerifyIntegrity();

            var h0 = original.HashDigest;

            for (int i = 0; i < 100; i++)
            {
                EntityPool compare = new EntityPool(ctx);
                random.Shuffle(testEntities);
                foreach (var e in testEntities)
                {
                    Assert.IsTrue(compare.Insert(e));
                }
                compare.VerifyIntegrity();
                var h1 = compare.HashDigest;
                Assert.AreEqual(h0, h1);
            }
        }
Esempio n. 2
0
        public void EntityMotionTest()
        {
            int        numEntities = 100;
            var        ctx         = new SimulationContext(true);
            EntityPool pool        = new EntityPool(EntityPoolTests.CreateEntities(ctx.LocalSpace, numEntities, i => new RandomMotion()), ctx);

            InconsistencyCoverage ic = InconsistencyCoverage.NewCommon();

            for (int i = 0; i < 100; i++)
            {
                var             old = pool.ToArray();
                EntityChangeSet set = new EntityChangeSet();
                ctx.SetGeneration(i);
                var errors = pool.TestEvolve(set, InconsistencyCoverage.NewCommon(), i, TimeSpan.FromSeconds(1));
                Assert.IsNull(errors, errors != null ? errors[0].ToString() : "");
                Assert.AreEqual(numEntities, set.FindNamedSet("motions").Size);
                foreach (var e in old)
                {
                    var m = set.FindMotionOf(e.ID.Guid);
                    Assert.IsNotNull(m);
                    Assert.AreNotEqual(m.TargetLocation, m.Origin.Position, i.ToString());
                    Assert.IsTrue(Simulation.FullSimulationSpace.Contains(m.TargetLocation));
                    Assert.IsTrue(Simulation.MySpace.Contains(m.TargetLocation));
                }

                Assert.AreEqual(0, set.Execute(pool, ic, ctx));
                Assert.AreEqual(numEntities, pool.Count);
                Entity e1;
                foreach (var e in old)
                {
                    Assert.IsTrue(pool.Find(e.ID.Guid, out e1));
                    Assert.AreNotEqual(e.ID.Position, e1.ID.Position);
                }
            }
        }
Esempio n. 3
0
 public static void Initialize()
 {
     asteroidPool = new EntityPool<Asteroid>(() => { return new Asteroid(); }, 3*InitialAsteroidCount);
     laserPool = new EntityPool<Laser>(() => { return new Laser(); }, 300);
     shipPool = new EntityPool<Ship>(() => { return new Ship(); }, 8 * InitialShipCount);
     planetPool = new EntityPool<Planet>(() => { return new Planet(); }, 3*(int)Planets.Count );
 }
Esempio n. 4
0
        public PewLaser(EntityPreset preset, Player player)
            : base(preset.Position, "pew_laser", 16, 16, DrawOrder.ENTITIES)
        {
            immovable = true;


            bool isFast = false;
            int  frame  = preset.Frame % 4;

            SetFrame(frame);

            if (preset.Frame >= 4)
            {
                isFast = true;
            }

            facing = (frame) switch
            {
                1 => Facing.RIGHT,
                2 => Facing.UP,
                3 => Facing.LEFT,
                _ => Facing.DOWN,
            };

            lasers = new EntityPool <Laser>(5, () => new Laser(facing, isFast));
        }
Esempio n. 5
0
 public static void CreateInstance()
 {
     if (_instance == null)
     {
         _instance = new EntityPool();
     }
 }
        public void LoadMap(List <TClass> entities, IQueryable <TClass> query)
        {
            var entityPool = new EntityPool();

            var deDupe = GenericProcessor.ProcessEntities(entityPool, query.GetDataContext <IDataContext>(), entities);

            entities.Clear();
            entities.AddRange(deDupe);

            foreach (var propertyAccessor in Properties.OrderBy(x => x.PropertyName))
            {
                if (propertyAccessor is PropertyAccessor <TClass> accessorImpl)
                {
                    accessorImpl.Load(entityPool, entities, query);
                }
                else if (typeof(TClass).IsAssignableFrom(propertyAccessor.DeclaringType))
                {
                    dynamic dynamicAccessor = propertyAccessor;
                    LoadForInheritedType(entityPool, dynamicAccessor, entities, query);
                }
                else
                {
                    throw new PropertyAccessorNotFoundException($"PropertyAccessor<{typeof(TClass).Name}> not found");
                }
            }
        }
Esempio n. 7
0
        public void SimpleEntityFaultTest()
        {
            var        ctx  = new SimulationContext(true);
            EntityPool pool = new EntityPool(EntityPoolTests.CreateEntities(ctx.LocalSpace, 100,
                                                                            new RandomLogic(new Type[] { typeof(ConsistentLogic), typeof(FaultLogic) }).Instantiate), ctx);

            InconsistencyCoverage ic = InconsistencyCoverage.NewCommon();
            int any = -1;

            for (int i = 0; i < 8; i++)
            {
                EntityChangeSet set = new EntityChangeSet();
                ctx.SetGeneration(i);
                var errors = pool.TestEvolve(set, ic, i, TimeSpan.FromSeconds(1));
                if (errors != null)
                {
                    Assert.IsTrue(ic.OneCount > 0);
                    if (any == -1)
                    {
                        any = i;
                    }
                }
                ic = ic.Grow(true);
                Assert.IsTrue(ic.Size == InconsistencyCoverage.CommonResolution);
            }
            if (any == 0)
            {
                Assert.AreEqual(ic.OneCount, ic.Size.Product);
            }
        }
Esempio n. 8
0
        public void UpdateEntityTest()
        {
            var        ctx      = new SimulationContext(true);
            Random     random   = new Random();
            EntityPool pool     = new EntityPool(ctx);
            var        entities = CreateEntities(ctx.LocalSpace, 3);

            foreach (var e in entities)
            {
                Assert.IsTrue(pool.Insert(e));
            }

            for (int i = 0; i < 10; i++)
            {
                Entity old   = entities[0];
                Entity moved = Relocate(old);
                Assert.IsTrue(pool.Contains(old.ID));
                Assert.IsTrue(pool.UpdateEntity(entities[0], moved), "Update moved entity " + i);
                Assert.IsFalse(pool.Contains(old.ID));
                entities[0] = moved;
                Assert.AreEqual(pool.Count, entities.Count);
                foreach (var e in entities)
                {
                    Assert.IsTrue(pool.Contains(e.ID.Guid));
                    Assert.IsTrue(pool.Contains(e.ID));
                }
            }
        }
Esempio n. 9
0
        public override void Configure()
        {
            opt.OptionEntity.buff = "buffGiant"; // todo: from biome
            string za = string.Join(",", biome.zombies, biome.animals);

            opt.OptionEntity.entity = Hashes.Rand(za.Split(','), seed, "giantZombie"); // todo: from biome
            EntityPool = new EntityPool(opt.OptionEntity.entity);                      // TODO: ref to reflect attibut change ?
            Printer.Log(60, "Giant Configure: done");
        }
        private static void LoadForInheritedType <T>(EntityPool entityPool, IPropertyAccessor <T> accessor, List <TClass> propertyEntities, IQueryable <TClass> query)
            where T : class
        {
            var accessorImpl = (PropertyAccessor <T>)accessor;

            var entitiesOfType = propertyEntities.OfType <T>().ToList();
            var queryOfType    = query.OfType <T>();

            accessorImpl.Load(entityPool, entitiesOfType, queryOfType);
        }
Esempio n. 11
0
        public void Initialize(GameModel gameModel, InputManager inputManager)
        {
            asteroidPool = new EntityPool <Asteroid>(() => { return(new Asteroid(gameModel)); }, 3 * InitialAsteroidCount);
            laserPool    = new EntityPool <Laser>(() => { return(new Laser(gameModel)); }, 300);
            shipPool     = new EntityPool <Ship>(() => { return(new Ship(gameModel)); }, 8 * InitialShipCount);
            planetPool   = new EntityPool <Planet>(() => { return(new Planet(gameModel)); }, 3 * (int)Planets.Count);

            _gameModel    = gameModel;
            _inputManager = inputManager;
        }
Esempio n. 12
0
        public void StateAdvertisementTest()
        {
            var        ctx  = new SimulationContext();
            EntityPool pool = RandomDefaultPool(100, ctx);

            for (int i = 0; i < 100; i++)
            {
                EntityChangeSet set = new EntityChangeSet();
                ctx.SetGeneration(i);
                var errors = pool.TestEvolve(set, InconsistencyCoverage.NewCommon(), i, TimeSpan.FromSeconds(5));
                Assert.IsNull(errors, errors != null ? errors[0].ToString() : "");
                Assert.AreEqual(0, set.Execute(pool, ctx));

                HashSet <Guid> env   = new HashSet <Guid>();
                var            state = pool.ToArray();
                int            it    = 0;
                foreach (var e in state)
                {
                    env.Clear();
                    foreach (var e1 in state)
                    {
                        float dist = ctx.GetDistance(e.ID.Position, e1.ID.Position);
                        if (e1.ID.Guid != e.ID.Guid && dist <= Simulation.SensorRange)
                        {
                            Console.WriteLine(dist + "/" + Simulation.SensorRange);
                            env.Add(e1.ID.Guid);
                        }
                    }
                    Assert.AreEqual(env.Count, e.Contacts.Length, i + "." + it + ": " + e);
                    if (env.Count > 0)
                    {
                        it++;
                    }

                    foreach (var c in e.Contacts)
                    {
                        float dist = ctx.GetDistance(c.ID.Position, e.ID.Position);
                        Assert.IsTrue(dist <= Simulation.SensorRange, dist + " <= " + Simulation.SensorRange);
                        Assert.AreNotEqual(c.ID.Guid, e.ID.Guid);
                        Assert.IsTrue(env.Contains(c.ID.Guid));
                    }

                    var app = e.Appearances.Get <ConsistencyAppearance>();
                    if (i > 0)
                    {
                        Assert.IsNotNull(e.Appearances);
                        Assert.IsNotNull(app);
                    }
                    if (app != null)
                    {
                        Assert.IsTrue(app.IsConsistent);
                    }
                }
            }
        }
Esempio n. 13
0
    void Awake()
    {
        if (instance != null)
        {
            Debug.LogError("More than 1 instance of EntityPool in the scene!");

            return;
        }

        instance = this;
    }
Esempio n. 14
0
        public override void Configure()
        {
            string[] buffs = biome.buffGhost.Split(',');
            // buffs = new string[]{"buffZBShoking"}; // "buffZBFiring"

            // TODO: randomize from biome (if we convert everything ...)
            opt.OptionEntity.entity = Hashes.Rand(ghosts, seed, "ghost");
            opt.OptionEntity.buff   = Hashes.Rand(buffs, seed, "buff");
            EntityPool = new EntityPool(opt.OptionEntity.entity, 30);
            Printer.Log(60, "MovingGhost Configure: done");
        }
Esempio n. 15
0
        public static EntityPool RandomPool(int numEntities, EntityChange.ExecutionContext ctx)
        {
            var rs       = new EntityPool(ctx);
            var entities = CreateEntities(ctx.LocalSpace, numEntities);

            foreach (var e in entities)
            {
                Assert.IsTrue(rs.Insert(e));
            }
            return(rs);
        }
Esempio n. 16
0
        public Slime(EntityPreset preset, Player player)
            : base(preset, preset.Position, "slime", 16, 16, DrawOrder.ENTITIES)
        {
            _type = preset.Frame == 3 ? SlimeType.Bullet : SlimeType.Normal;

            int o = GlobalState.IsCell ? 4 : 0;

            AddAnimation("Move", CreateAnimFrameArray(0 + o, 1 + o), 3);
            AddAnimation("Hurt", CreateAnimFrameArray(0 + o, 8, 0 + o, 8), 15, false);
            AddAnimation("Dying", CreateAnimFrameArray(0 + o, 8, 0 + o, 8), 12, false);

            goos   = new EntityPool <Goo>(8, () => new Goo());
            target = player;

            if (_type == SlimeType.Bullet)
            {
                bullets = new EntityPool <Bullet>(4, () => new Bullet());
                _speed *= 2;
            }

            state = new StateMachineBuilder()
                    .State <MoveState>("Move")
                    .Enter((state) =>
            {
                Play("Move");
                state.Advance((float)(DateTime.Now - state.exit_time).TotalSeconds);
                if (_type == SlimeType.Bullet)
                {
                    state.AddTimer(1.8f, "ShootTimer");
                }
            })
                    .Update((state, time) => SyncSplash(state))
                    .Event("ShootTimer", (state) => bullets.Spawn(b => b.Spawn(this, target)))
                    .Event("MoveTimer", (state) => ChangeDir())
                    .Event <CollisionEvent <Player> >("Player", (state, p) => p.entity.ReceiveDamage(1))
                    .Event <CollisionEvent <Broom> >("Hit", (state, b) => GetHit(b.entity))
                    .Exit((s) =>
            {
                s.exit_time = DateTime.Now;
            })
                    .End()
                    .State("Hurt")
                    .Enter((state) => Play("Hurt"))
                    .Event <CollisionEvent <Player> >("Player", (state, p) => p.entity.ReceiveDamage(1))
                    .Condition(() => _health <= 0, (state) => state.Parent.ChangeState("Dying"))
                    .Condition(() => _curAnim.Finished, (state) => state.Parent.ChangeState("Move"))
                    .End()
                    .State("Dying")
                    .Enter((state) => Play("Dying"))
                    .Condition(() => _curAnim.Finished, (state) => { GlobalState.SpawnEntity(new Explosion(this)); Die(); })
                    .End()
                    .Build();
            state.ChangeState("Move");
        }
Esempio n. 17
0
        public SteamPipe(EntityPreset preset, Player player)
            : base(preset.Position, "steam_pipe", 16, 16, DrawOrder.ENTITIES)
        {
            _player = player;

            Vector2 startPos = Vector2.Zero;

            SetFrame(preset.Frame);

            switch (GetFrame())
            {
            case 0:
                width = 10;

                offset   = new Vector2(3, 16);
                startPos = Position + new Vector2(2, 10);

                facing = Facing.DOWN;
                break;

            case 1:
                height = 10;

                offset   = new Vector2(14, 5);
                startPos = Position + new Vector2(14, 5);

                facing = Facing.RIGHT;
                break;

            case 2:
                width = 10;

                offset   = new Vector2(3, -4);
                startPos = Position + new Vector2(3, -2);

                facing = Facing.UP;
                break;

            case 3:
                height = 10;

                offset   = new Vector2(-6, 3);
                startPos = Position + new Vector2(-6, 3);

                facing = Facing.LEFT;
                break;
            }
            Position += offset;

            _steam = new EntityPool <Steam>(6, () => new Steam(startPos, this));

            _steam.Spawn(s => s.Spawn(), 6);
        }
Esempio n. 18
0
        public Face() : base(MapUtilities.GetRoomUpperLeftPos(GlobalState.CurrentMapGrid) + Vector2.UnitX * (160 - 64) / 2, "f_wallboss_face", 64, 32, Drawing.DrawOrder.ENTITIES)
        {
            AddAnimation("normal", CreateAnimFrameArray(0, 2), 5);
            AddAnimation("hurt", CreateAnimFrameArray(3, 5), 14);
            AddAnimation("charge", CreateAnimFrameArray(1), 5);
            AddAnimation("shoot", CreateAnimFrameArray(4), 10);
            Play("normal");

            state = StateLogic();

            bullets = new(8, () => new(this));
        }
Esempio n. 19
0
        public Slime(EntityPreset preset, Player player)
            : base(preset.Position, "slime", 16, 16, DrawOrder.ENTITIES)
        {
            _preset = preset;

            _type = _preset.Frame == 3 ? SlimeType.Bullet : SlimeType.Normal;

            AddAnimation("Move", CreateAnimFrameArray(0, 1), 3);
            AddAnimation("Hurt", CreateAnimFrameArray(0, 8, 0, 8), 15);
            AddAnimation("Dying", CreateAnimFrameArray(0, 8, 0, 8), 12, false);

            goos   = new EntityPool <Goo>(8, () => new Goo());
            target = player;

            if (_type == SlimeType.Bullet)
            {
                bullets = new EntityPool <Bullet>(4, () => new Bullet());
                _speed *= 2;
            }

            state = new StateMachineBuilder()
                    .State <MoveState>("Move")
                    .Enter((state) =>
            {
                Play("Move");
                state.Reset();
                state.AddTimer(0.5f, "MoveTimer");
                if (_type == SlimeType.Bullet)
                {
                    state.AddTimer(1.8f, "ShootTimer");
                }
            })
                    .Update((state, time) => SyncSplash(state))
                    .Event("ShootTimer", (state) => bullets.Spawn(b => b.Spawn(this, target)))
                    .Event("MoveTimer", (state) => ChangeDir())
                    .Event <CollisionEvent <Player> >("Player", (state, p) => p.entity.ReceiveDamage(1))
                    .Event <CollisionEvent <Broom> >("Hit", (state, b) => GetHit(b.entity))
                    .End()
                    .State("Hurt")
                    .Enter((state) => Play("Hurt"))
                    .Event <CollisionEvent <Player> >("Player", (state, p) => p.entity.ReceiveDamage(1))
                    .Condition(() => _health <= 0, (state) => state.Parent.ChangeState("Dying"))
                    .Condition(() => finished, (state) => state.Parent.ChangeState("Move"))
                    .End()
                    .State("Dying")
                    .Enter((state) => Play("Dying"))
                    .Condition(() => finished, (state) => { _preset.Alive = false; Die(); })
                    .End()
                    .Build();
            state.ChangeState("Move");
        }
Esempio n. 20
0
        public static IEnumerator _Ghosts(Vector3 ppos)
        {
            /* Using bear ghost creates Warning, when ZMoe ghost does not ...
             * but moe stops moving ?
             */
            //EntityPool EntityPool = new EntityPool("zombieMoeGhost", 20);
            // EntityPool EntityPool = new EntityPool("animalBearGhost", 20);
            // EntityPool EntityPool = new EntityPool("animalChickenGhost", 20);
            EntityPool EntityPool = new EntityPool("animalChickenGhostV2", 20);

            HashSet <Entity> done = new HashSet <Entity>();

            lastExec = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
            while (true)
            {
                lastExec = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
                Bounds area = new Bounds(ppos, new Vector3(40, 40, 40));
                EntityPool.Update(area);
                foreach (Entity entity in EntityPool.Entities)
                {
                    lastExec = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
                    if (entity == null)
                    {
                        continue;
                    }
                    if (entity as EntityAlive == null)
                    {
                        continue;
                    }
                    if (_StopGhost)
                    {
                        Attaching.Remove(entity as EntityAlive, currentName);
                        // if (done.Contains(entity)) done.Remove(entity);
                        done.Clear();
                    }
                    else
                    {
                        if (done.Contains(entity))
                        {
                            continue;
                        }
                        Attaching.Apply(entity as EntityAlive, currentName);
                        done.Add(entity);
                    }
                    lastExec = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
                    yield return(new WaitForEndOfFrame());
                }
                lastExec = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
                yield return(new WaitForEndOfFrame());
            }
        }
Esempio n. 21
0
    // Use this for initialization
    void Start()
    {
        pool = EntityPoolBuilder.FindByName("TestPool");

        ZEntity en = pool.CreateEntity(1);

        Debug.Log(" en data is " + en.GetComponent <TestComponent4> ().data4.ToString());

        //test singleton
        TestSingleton test = SingletonEntity <TestSingleton> .Instance;

        if (test != null)
        {
            Debug.Log(" SingletonEntity data is " + test.data2.ToString());
        }
    }
Esempio n. 22
0
        public Big_Key(EntityPreset preset, Player p) : base(preset.Position, "key_green", 16, 16, Drawing.DrawOrder.ENTITIES)
        {
            _preset = preset;
            _player = p;
            SetFrame(preset.Frame);
            immovable = true;

            width       = 9;
            offset.X    = 4;
            Position.X += 4;

            shadow         = new(this, Vector2.One * 4);
            shadow.visible = false;

            _sparkles = new(3, () => new());

            state = States();
        }
Esempio n. 23
0
        public override bool Execute(EntityPool pool, ExecutionContext ctx)
        {
            if (!ctx.CheckM("Insert", Origin.Position, TargetLocation))
            {
                return(false);
            }
            if (!ctx.LocalSpace.Contains(TargetLocation))
            {
                return(false);
            }
            pool.ConflictFreeInsert(Origin, new Entity(new EntityID(Guid.NewGuid(), TargetLocation), Vec3.Zero, directState, SerialLogic
#if STATE_ADV
                                                       , Appearances
#endif
                                                       ));
            directState = null;
            return(true);
        }
Esempio n. 24
0
        public Frog(EntityPreset preset, Player p) : base(preset, preset.Position, "frog", 16, 16, Drawing.DrawOrder.ENTITIES, 0.7f)
        {
            AddAnimation("idle", CreateAnimFrameArray(0, 1), 2, true);
            AddAnimation("shoot_d", CreateAnimFrameArray(3), 3, false);
            AddAnimation("shoot_r", CreateAnimFrameArray(4), 3, false);
            AddAnimation("shoot_l", CreateAnimFrameArray(4), 3, false);
            AddAnimation("shoot_u", CreateAnimFrameArray(5), 3, false);
            Play("idle");
            immovable = true;
            _player   = p;

            int i = 0;

            _bullets = new(3, () => new(i++));

            _state = new StateMachineBuilder()
                     .State <TimerState>("Initial")
                     .Enter((s) =>
            {
                s.Reset();
                s.AddTimer(0.8f, "goToIdle");
            })
                     .Event("goToIdle", (s) => _state.ChangeState("Idle"))
                     .End()
                     .State("Idle")
                     .Enter((s) =>
            {
                Play("idle");
            })
                     .Condition(() => (Center - _player.Center).LengthSquared() < 64 * 64, (s) =>
            {
                _bullets.Spawn((b) => b.Spawn(this, _player), 3);
                FaceTowards(_player.Center);
                PlayFacing("shoot");
                SoundManager.PlaySoundEffect("bubble_triple");
                _state.ChangeState("BulletsFlying");
            })
                     .End()
                     .State("BulletsFlying")
                     .Condition(() => _bullets.Alive == 0, (s) => _state.ChangeState("Idle"))
                     .End()
                     .Build();
            _state.ChangeState("Initial");
        }
Esempio n. 25
0
        public void MotionConflictOrderingTest()
        {
            var ctx = new SimulationContext(true);

            for (int i = 0; i < 10; i++)
            {
                var  entities = CreateEntities(ctx.LocalSpace, 1);
                var  e        = entities[0];
                Vec3 original = e.ID.Position;

                EntityChange.Motion[] motions = new EntityChange.Motion[10];
                for (int j = 0; j < motions.Length; j++)
                {
                    motions[j] = new EntityChange.Motion(new EntityID(e.ID.Guid, random.NextVec3(0, 1)), ctx.LocalSpace.Clamp(original + random.NextVec3(-ctx.Ranges.R, ctx.Ranges.R)), e.MyLogic, null);
                }

                Entity e0 = null;

                for (int j = 0; j < motions.Length; j++)
                {
                    var             motions2 = motions.OrderBy(x => random.Next()).ToArray();
                    EntityPool      pool     = new EntityPool(entities, ctx);
                    EntityChangeSet set      = new EntityChangeSet();
                    foreach (var m in motions2)
                    {
                        set.Add(m);
                    }

                    int errors = set.Execute(pool, InconsistencyCoverage.NewAllOne(), ctx);
                    Assert.AreEqual(motions.Length - 1, errors);                        //motions-1 get rejected, one is accepted. must always be the same

                    var e1 = pool.First();
                    Assert.AreNotEqual(e1, e);                          //must have moved
                    if (e0 == null)
                    {
                        e0 = e1;
                    }
                    else
                    {
                        Assert.AreEqual(e0, e1);                         //must have moved to the same location
                    }
                }
            }
        }
Esempio n. 26
0
        public Red_Boss(EntityPreset preset, Player p) : base(preset.Position, "red_boss", 32, 32, Drawing.DrawOrder.ENTITIES)
        {
            height = 19;
            width  = 26;
            offset = new Vector2(3, 13);

            AddAnimation("bob", CreateAnimFrameArray(0), 20);
            AddAnimation("close_eyes", CreateAnimFrameArray(1), 10, false);
            AddAnimation("warn", CreateAnimFrameArray(2), 24);
            AddAnimation("die", CreateAnimFrameArray(0, 1, 2, 1), 3, false);

            Play("close_eyes");

            ripple = new(this);
            Vector2 tl           = MapUtilities.GetRoomUpperLeftPos(GlobalState.CurrentMapGrid);
            Point   splash_start = new(2, 2);

            splash_bullets = new(4, () =>
            {
                splash_start.Y++;
                return(new(tl + splash_start.ToVector2() * 16 + Vector2.One * 3));
            });

            int start = 0;

            tentacles = new(4, () => new(start++));

            sensors = new ProximitySensor[]
            {
                new(Touching.LEFT, this),
                new(Touching.RIGHT, this),
                new(Touching.UP, this),
                new(Touching.DOWN, this),
            };

            small_wave = new(this);
            big_wave   = new(this);

            player      = p;
            this.preset = preset;

            state = State();
        }
Esempio n. 27
0
        public override bool Execute(EntityPool pool, ExecutionContext ctx)
        {
            Vec3?loc;
            var  rs = pool.CheckFindAndRemove(Target, e => ctx.CheckM("Removal", Target.Position, e), out loc);

            switch (rs)
            {
            case EntityPool.Result.NoError:
                return(true);

            case EntityPool.Result.IDNotFoundLocationMismatch:
            case EntityPool.Result.IDNotFound:
            case EntityPool.Result.VerificationFailed:
                return(false);                          //do not distinbuish. these errors could all be either caused by bad node states OR bad entity behavior

            default:
                throw new IntegrityViolation(Target + ": Unsupported CheckFindAndRemove() return value (" + rs + ")");
            }
        }
Esempio n. 28
0
        public Burst_Plant(EntityPreset preset, Player p) : base(preset, preset.Position, "burst_plant", 16, 16, Drawing.DrawOrder.ENTITIES, 0.7f)
        {
            AddAnimation("idle", CreateAnimFrameArray(0));
            AddAnimation("charging", CreateAnimFrameArray(0, 1), 8);
            AddAnimation("shoot", CreateAnimFrameArray(3));
            Play("idle");
            immovable = true;

            _bullets = new(8, () => new());

            _state = new StateMachineBuilder()
                     .State <TimerState>("Initial")
                     .Enter((s) => s.AddTimer(0.4f, "goToIdle"))
                     .Event("goToIdle", (s) => _state.ChangeState("Idle"))
                     .End()
                     .State <TimerState>("Idle")
                     .Enter((s) =>
            {
                Play("idle");
                s.Reset();
                s.AddTimer(0.4f + (float)GlobalState.RNG.NextDouble(), "idleTimer");
            })
                     .Event("idleTimer", (s) => _state.ChangeState("Charging"))
                     .End()
                     .State <ChargeState>("Charging")
                     .Enter((s) => Play("charging"))
                     .Event("Fire", (s) =>
            {
                int sign      = MathUtilities.OneRandomOf(-1, 1);
                float max_vel = 10 + 30 * (float)GlobalState.RNG.NextDouble();
                _bullets.Spawn((b) => b.SpawnToPlayer(this, max_vel, p));         //one straight to the player
                _bullets.Spawn((b) => b.Spawn(this, max_vel, sign), 7);
                Play("shoot");
                SoundManager.PlaySoundEffect("bubble_triple");
                _state.ChangeState("BulletsFlying");
            })
                     .End()
                     .State("BulletsFlying")
                     .Condition(() => _bullets.Alive == 0, (s) => _state.ChangeState("Idle"))
                     .End()
                     .Build();
            _state.ChangeState("Initial");
        }
Esempio n. 29
0
        public override bool Execute(EntityPool pool, ExecutionContext ctx)
        {
            Int3 opCoords = TargetLocation.FloorInt3;

            if (ctx.LocalSpace.Contains(Origin.Position))
            {
                Entity e;
                if (!pool.Find(Origin.Guid, out e))
                {
                    return(false);
                }
                if (!ctx.CheckM("Motion", TargetLocation, e))
                {
                    return(false);
                }

                if (ctx.LocalSpace.Contains(TargetLocation))
                {
                    pool.ConflictFreeUpdateEntity(Origin, Entity);
                }
                else
                {
                    pool.ConflictFreeFindAndRemove(e.ID);
                }
                return(true);
            }
            else
            {
                if (!ctx.LocalSpace.Contains(TargetLocation))
                {
                    ctx.LogMessage("Motion: Shard coordinate mismatch. Local=" + ctx.LocalSpace + ", target=" + TargetLocation);
                    return(false);
                }
                if (!ctx.CheckM("Motion", Origin.Position, TargetLocation))
                {
                    return(false);
                }
                pool.ConflictFreeInsert(Origin, Entity);
                return(true);
            }
        }
    private void InstantiateSystemsManager()
    {
        SystemsManager      = Instantiate(new GameObject());
        SystemsManager.name = "SystemsManager";


        movementSystem       = SystemsManager.AddComponent <MovementSystem>();
        keyboardInputSystem  = SystemsManager.AddComponent <KeyboardInputSystem>();
        mouseInputSystem     = SystemsManager.AddComponent <MouseInputSystem>();
        factorySystem        = SystemsManager.AddComponent <FactorySystem>();
        lSystemSystem        = SystemsManager.AddComponent <LSystemSystem>();
        lSystemFactorySystem = SystemsManager.AddComponent <LSystemFactorySystem>();

        entityPool = SystemsManager.AddComponent <EntityPool>();
        entityPool.InitialiseEntitiesList();


        movementSystem.entityPool       = entityPool;
        keyboardInputSystem.entityPool  = entityPool;
        mouseInputSystem.entityPool     = entityPool;
        factorySystem.entityPool        = entityPool;
        lSystemSystem.entityPool        = entityPool;
        lSystemFactorySystem.entityPool = entityPool;
    }