public override void Init() { base.Init(); Timer.Add(() => { Self.GetComponent <AudioEmitterComponent>().EmitRandomized("mob_fire_static"); var a = Self.AngleTo(Self.Target); var p = new ProjectilePattern(KeepShapePattern.Make(0)) { Position = Self.Center }; Self.Area.Add(p); ProjectileTemplate.MakeFast(Self, "small", Self.Center, a, (pr) => { pr.CanBeReflected = false; pr.CanBeBroken = false; p.Add(pr); pr.Color = ProjectileColor.Red; pr.AddLight(32, pr.Color); }, swordData, () => { Timer.Add(() => { p.Launch(a, 30); Self.GetComponent <AudioEmitterComponent>().EmitRandomized("mob_fire_static"); Become <FightState>(); }, 0.2f); }); }, 1f); }
public override void Init() { base.Init(); for (var i = 0; i < 4; i++) { ProjectileTemplate.Make(Self, "green_small", Self.Center, i * (float)Math.PI * 0.5f, 5, 2, 0, p => p.AddLight(16f, Projectile.GreenLight), " x ", "xxxx", " x "); } }
public override void Update(float dt) { base.Update(dt); if (T >= 0.2f && !fired) { fired = true; if (Self.Target != null) { var h = Self.Target.GetComponent <HealthComponent>(); var c = h.Health <= 1 ? 'f' : Chars[Rnd.Int(Chars.Length)]; var a = Self.AngleTo(Self.Target); var color = ProjectileColor.Rainbow[Rnd.Int(ProjectileColor.Rainbow.Length)]; var sprite = Rnd.Chance(60) ? "circle" : "square"; if (LetterTemplateData.Data.TryGetValue(c, out var data)) { var p = new ProjectilePattern(KeepShapePattern.Make(0)) { Position = Self.Center }; Self.Area.Add(p); ProjectileTemplate.MakeFast(Self, sprite, Self.Center, a, (pr) => { p.Add(pr); pr.Color = color; pr.AddLight(32, color); pr.CanBeReflected = false; pr.BodyComponent.Angle = a; }, data, () => { Timer.Add(() => { p.Launch(a, Rnd.Float(30, 80)); Self.GetComponent <AudioEmitterComponent>().EmitRandomized("mob_fire_static"); }, 0.2f); }); } } } if (T >= delay || Self.Target == null) { Become <ToIdleState>(); } }
public static ProjectileTemplate fromXML(XElement xmlProjectile) { //TODO: Remove the defaults from hard coding. string name = "UNNAMED PROJECTILE"; string spriteName = "NO_SPRITE"; FloatStat damageRatio = new FloatStatExplicit(1.0f); IntStat bounces = new IntStatExplicit(5); FloatStat lifespan = new FloatStatExplicit(10.0f); FloatStat speed = new FloatStatExplicit(1.0f); //Load in data from XML. if (xmlProjectile.Attribute("name") != null) { name = (string)xmlProjectile.Attribute("name"); } if (xmlProjectile.Element("Sprite") != null) { spriteName = (string)xmlProjectile.Element("Sprite"); } if (xmlProjectile.Element("DamageRatio") != null) { damageRatio = FloatStat.fromXML(xmlProjectile.Element("DamageRatio")); } if (xmlProjectile.Element("Bounces") != null) { bounces = IntStat.fromXML(xmlProjectile.Element("Bounces")); } if (xmlProjectile.Element("Lifespan") != null) { lifespan = FloatStat.fromXML(xmlProjectile.Element("Lifespan")); } if (xmlProjectile.Element("Speed") != null) { speed = FloatStat.fromXML(xmlProjectile.Element("Speed")); } ProjectileTemplate projectileTemplate = new ProjectileTemplate(name, spriteName, damageRatio, bounces, lifespan, speed); //Load in Behaviors from XML. //TODO: Load in behavior from XML. return projectileTemplate; }
public override void Update(float dt) { base.Update(dt); if (T >= (count + 1) * Delay) { count++; if (count == 4) { Self.SelectAttack(); return; } ProjectileTemplate.Make(Self, "green_small", Self.Center, Self.AngleTo(Self.Target), 5, 2, 0, p => p.AddLight(16f, Projectile.GreenLight), " x ", "xxxx", " x "); } }
private Entity GetProjectile(ProjectileTemplate data) { if (_poolDict.TryGetValue(data.ID, out var stack)) { if (stack.UsedCount > 0) { var pooled = stack.Pop(); if (pooled != null) { pooled.Pooled = false; return(pooled); } } } else { stack = new ManagedArray <Entity>(data.PoolSize); _poolDict.Add(data.ID, stack); } var entity = GetDefaultEntity(data.ID); //var prefab = data.GetValue<string>(DatabaseFields.Model); entity.Add(new TypeId(data.ID)); switch (data.Type) { default: case "Simple": break; case "SpriteAnimation": entity.Add(new CollisionCheckForward(data.CollisionDistance)); break; case "VolumeLaser": entity.Add(new CollisionCheckForward(data.CollisionDistance)); break; } switch (data.Movement) { case "Forward": entity.Add(new ForwardMover()); break; case "Arc": entity.Add(new ArcMover()); break; } entity.Get <DespawnTimer>().Length = data.Timeout; entity.Get <MoveSpeed>().Speed = data.Speed; entity.Get <RotationSpeed>().Speed = data.Rotation; if (data.ActionFx != null) { entity.Add(new ActionFxComponent(data.ActionFx)); if (data.ActionFx.TryGetColor(out var actionColor)) { entity.Add(new HitParticlesComponent(actionColor)); } } if (data.TrailAmount > 0) { entity.Add(new ParticleTrailComponent(data.TrailAmount, data.TrailFrequency, data.TrailColor, ParticleGravityStatus.Default)); } if (data.Components != null) { World.Get <DataFactory>().AddComponentList(entity, data.Data, data.Components); } return(entity); }