Ejemplo n.º 1
0
 public LegInfo(int lType, Vector2 initialPos, Yamata m)
 {
     yamata         = m;
     position       = initialPos;
     pointToStandOn = position;
     limbType       = lType;
     Hitbox         = new Rectangle(0, 0, 70, 38);
     legOrigin      = new Vector2(limbType == 1 || limbType == 3 ? Hitbox.Width - 12 : 12, 12);
 }
Ejemplo n.º 2
0
        public override void AI()
        {
            int attackpower = 130;

            if (Main.expertMode)
            {
                damage = npc.damage / 4;
            }
            else
            {
                damage = npc.damage / 2;
            }
            if (Body == null)
            {
                NPC npcBody = Main.npc[(int)npc.ai[0]];
                if (npcBody.type == ModContent.NPCType <Yamata>() || npcBody.type == ModContent.NPCType <YamataA>())
                {
                    Body   = npcBody;
                    yamata = (Yamata)npcBody.modNPC;
                }
            }
            if (Body == null)
            {
                return;
            }
            if (!Body.active)
            {
                if (Main.netMode != 1) //force a kill to prevent 'ghost hands'
                {
                    npc.life = 0;
                    npc.checkDead();
                    npc.netUpdate = true;
                }
                return;
            }

            npc.realLife = Body.whoAmI;
            npc.timeLeft = 100;
            npc.TargetClosest(true);
            Player player = Main.player[npc.target];

            npc.alpha = Body.alpha;
            if (npc.alpha > 0)
            {
                npc.damage = 0;
            }
            else
            {
                npc.damage = attackpower;
            }

            int roarSound = mod.GetSoundSlot(SoundType.Item, "Sounds/Sounds/YamataRoar");

            Vector2 PlayerDistance = new Vector2(npc.position.X + npc.width * 0.5f, npc.position.Y + npc.height * 0.5f);
            float   num433         = 6f;
            float   PlayerPosX     = Main.player[npc.target].position.X + (Main.player[npc.target].width / 2) - PlayerDistance.X;
            float   PlayerPosY     = Main.player[npc.target].position.Y + (Main.player[npc.target].height / 2) - PlayerDistance.Y;
            float   PlayerPos      = (float)Math.Sqrt(PlayerPosX * PlayerPosX + PlayerPosY * PlayerPosY);

            PlayerPos         = num433 / PlayerPos;
            PlayerPosX       *= PlayerPos;
            PlayerPosY       *= PlayerPos;
            PlayerPosY       += Main.rand.Next(-40, 41) * 0.01f;
            PlayerPosX       += Main.rand.Next(-40, 41) * 0.01f;
            PlayerPosY       += npc.velocity.Y * 0.5f;
            PlayerPosX       += npc.velocity.X * 0.5f;
            PlayerDistance.X -= PlayerPosX * 1f;
            PlayerDistance.Y -= PlayerPosY * 1f;

            if (npc.alpha <= 0)
            {
                internalAI[2]++;
            }
            if (internalAI[2] == 399)
            {
                QuoteSaid = false;
                Main.PlaySound(roarSound, npc.Center);
                internalAI[1] = Main.rand.Next(4);
            }

            if (internalAI[2] >= 400)
            {
                Attacks(internalAI[1]);
            }

            if (internalAI[2] >= 600)
            {
                EATTHELITTLEMAGGOT = false;
                internalAI[2]      = 0;
            }

            if (npc.ai[3] == 1)
            {
                attackCounter++;
                if (attackCounter > 10)
                {
                    attackFrame++;
                    attackCounter = 0;
                }
                if (attackFrame >= 3)
                {
                    attackFrame = 2;
                }
            }

            if (!player.active || player.dead || !Body.active)
            {
                npc.TargetClosest(false);
                player = Main.player[npc.target];
                if (!player.active || player.dead || !Body.active)
                {
                    if (npc.timeLeft > 10)
                    {
                        npc.timeLeft = 10;
                    }
                    return;
                }
            }
            fireTimer++;
            if (fireTimer >= 240 && npc.ai[3] == 0)
            {
                Main.PlaySound(roarSound, npc.Center);
                npc.ai[3] = 1;
                fireTimer = 0;
            }
            projDamage = npc.damage / 6;
            if (npc.ai[3] == 1)
            {
                attackTimer++;
                if (Main.rand.Next(3) == 0)
                {
                    if (attackTimer == 40)
                    {
                        Main.PlaySound(2, (int)npc.Center.X, (int)npc.Center.Y, 20);
                        int proj2 = Projectile.NewProjectile(npc.Center.X + Main.rand.Next(-20, 20), npc.Center.Y + Main.rand.Next(-20, 20), npc.velocity.X * 2f, npc.velocity.Y * 2f, mod.ProjectileType("YamataBomb"), projDamage, 0, Main.myPlayer);
                        Main.projectile[proj2].damage = projDamage;
                        attackTimer   = 0;
                        attackFrame   = 0;
                        attackCounter = 0;
                    }
                    if (attackTimer >= 80)
                    {
                        npc.ai[3] = 0;
                    }
                }
                else
                {
                    if (attackTimer == 8 || attackTimer == 16 || attackTimer == 24 || attackTimer == 32 || attackTimer == 40 || attackTimer == 48 || attackTimer == 56 || attackTimer == 64 || attackTimer == 72 || attackTimer == 79)
                    {
                        Main.PlaySound(2, (int)npc.Center.X, (int)npc.Center.Y, 20);
                        for (int i = 0; i < 5; ++i)
                        {
                            if (Main.netMode != 1)
                            {
                                Projectile.NewProjectile(PlayerDistance.X, PlayerDistance.Y, PlayerPosX * 2f, PlayerPosY * 2f, mod.ProjectileType("YamataBreath"), projDamage, 0f, Main.myPlayer);
                            }
                        }
                    }
                    if (attackTimer >= 80)
                    {
                        npc.ai[3]     = 0;
                        attackTimer   = 0;
                        attackFrame   = 0;
                        attackCounter = 0;
                    }
                }
            }

            Vector2 moveTo = new Vector2(Body.Center.X + npc.ai[1], Body.Center.Y - (130f + npc.ai[2])) - npc.Center;

            npc.velocity  = moveTo * moveSpeedBoost;
            npc.rotation  = 0;
            npc.position += Body.position - Body.oldPosition;

            if (Yamata.TeleportMeBitch)
            {
                Yamata.TeleportMeBitch = false;
                npc.Center             = yamata.npc.Center;
                return;
            }
        }
Ejemplo n.º 3
0
        public int movementVariance = 60;       //how far from the center point to move.

        public override void AI()
        {
            npc.defDamage = isAwakened ? 200 : 180;
            if (Body == null)
            {
                NPC npcBody = Main.npc[(int)npc.ai[0]];
                if (npcBody.type == ModContent.NPCType <Yamata>() || npcBody.type == ModContent.NPCType <YamataA>())
                {
                    Body = (Yamata)npcBody.modNPC;
                }
            }
            if (Body == null)
            {
                return;
            }

            npc.alpha = Body.npc.alpha;

            if (npc.alpha > 0)
            {
                npc.damage = 0;
            }
            else
            {
                npc.damage = npc.defDamage;
            }
            npc.TargetClosest();
            Player targetPlayer = Main.player[npc.target];

            if (targetPlayer == null || !targetPlayer.active || targetPlayer.dead)
            {
                targetPlayer = null;                                                                    //deliberately set to null
            }
            float playerDistance = targetPlayer == null ? 99999f : Vector2.Distance(targetPlayer.Center, npc.Center);

            if (!Body.npc.active)
            {
                if (Main.netMode != 1) //force a kill to prevent 'ghost hands'
                {
                    npc.life = 0;
                    npc.checkDead();
                    npc.netUpdate  = true;
                    killedbyplayer = false;
                }
                return;
            }
            Vector2 nextTarget = Body.npc.Center + new Vector2(leftHead ? -distFromBodyX : distFromBodyX, -distFromBodyY) + new Vector2(npc.ai[2], npc.ai[3]);
            float   dist       = Vector2.Distance(nextTarget, npc.Center);

            if (YamataHead.EATTHELITTLEMAGGOT && playerDistance < 300f)
            {
                BaseAI.AIFlier(npc, ref customAI, true, .5f, .8f, 5, 5, false, 300);
            }
            else
            if (dist < 40f)
            {
                npc.velocity *= 0.9f;
                if (Math.Abs(npc.velocity.X) < 0.05f)
                {
                    npc.velocity.X = 0f;
                }
                if (Math.Abs(npc.velocity.Y) < 0.05f)
                {
                    npc.velocity.Y = 0f;
                }
            }
            else
            {
                npc.velocity  = Vector2.Normalize(nextTarget - npc.Center);
                npc.velocity *= 5f;
            }
            npc.position       += Body.npc.position - Body.npc.oldPosition;
            npc.spriteDirection = -1;
            if (Body.TeleportMe1)
            {
                Body.TeleportMe1 = false;
                npc.Center       = Body.npc.Center;
                return;
            }
            if (Body.TeleportMe2)
            {
                Body.TeleportMe2 = false;
                npc.Center       = Body.npc.Center;
                return;
            }
            if (Body.TeleportMe3)
            {
                Body.TeleportMe3 = false;
                npc.Center       = Body.npc.Center;
                for (int i = 0; i < 5; ++i)
                {
                    Main.PlaySound(2, (int)npc.Center.X, (int)npc.Center.Y, 20);
                    Vector2 dir = Vector2.Normalize(targetPlayer.Center - npc.Center);
                    dir *= 5f;
                    Projectile.NewProjectile(npc.Center.X, npc.Center.Y, dir.X, dir.Y, isAwakened ? mod.ProjectileType("YamataABreath") : mod.ProjectileType("YamataBreath"), npc.damage / 4, 0f, Main.myPlayer);
                }
                return;
            }
            if (Body.TeleportMe4)
            {
                Body.TeleportMe4 = false;
                npc.Center       = Body.npc.Center;
                return;
            }
            if (Body.TeleportMe5)
            {
                Body.TeleportMe5 = false;
                npc.Center       = Body.npc.Center;
                return;
            }
            if (Body.TeleportMe6)
            {
                Body.TeleportMe6 = false;
                npc.Center       = Body.npc.Center;
                return;
            }

            if (Main.netMode != 1 && !YamataHead.EATTHELITTLEMAGGOT)
            {
                if (npc.alpha <= 0)
                {
                    npc.ai[1]++;;
                }
                int aiTimerFire = npc.whoAmI % 3 == 0 ? 50 : npc.whoAmI % 2 == 0 ? 150 : 100;
                if (leftHead)
                {
                    aiTimerFire += 30;
                }
                if (targetPlayer != null && npc.ai[1] == aiTimerFire)
                {
                    fireAttack = true;
                    for (int i = 0; i < 5; ++i)
                    {
                        Main.PlaySound(2, (int)npc.Center.X, (int)npc.Center.Y, 20);
                        Vector2 dir = Vector2.Normalize(targetPlayer.Center - npc.Center);
                        dir *= 5f;
                        Projectile.NewProjectile(npc.Center.X, npc.Center.Y, dir.X, dir.Y, isAwakened ? mod.ProjectileType("YamataABreath") : mod.ProjectileType("YamataBreath"), npc.damage / 4, 0f, Main.myPlayer);
                    }
                }
                else
                if (npc.ai[1] >= 200) //pick random spot to move head to
                {
                    fireAttack    = false;
                    npc.ai[1]     = 0;
                    npc.ai[2]     = Main.rand.Next(-movementVariance, movementVariance);
                    npc.ai[3]     = Main.rand.Next(-movementVariance, movementVariance);
                    npc.netUpdate = true;
                }
            }
        }
Ejemplo n.º 4
0
        public int movementVariance = 60;       //how far from the center point to move.

        public override void AI()
        {
            if (Body == null)
            {
                NPC npcBody = Main.npc[(int)npc.ai[0]];
                if (npcBody.type == mod.NPCType <Yamata>() || npcBody.type == mod.NPCType <YamataA>())
                {
                    Body = (Yamata)npcBody.modNPC;
                }
                else if (npcBody.type == mod.NPCType <YamataHead>())
                {
                    Head = (Yamata)npcBody.modNPC;
                    int latestNPC = npcBody.whoAmI;
                    latestNPC = NPC.NewNPC((int)npcBody.Center.X, (int)npcBody.Center.Y + 100, mod.NPCType("Yamata"), 0, npcBody.whoAmI);
                    Main.npc[(int)latestNPC].realLife = npcBody.whoAmI;
                    Main.npc[(int)latestNPC].ai[0]    = npcBody.whoAmI;
                    NPC RealBody = Main.npc[latestNPC];
                    Body      = (Yamata)RealBody.modNPC;
                    Head.Tag  = true;
                    latestNPC = NPC.NewNPC((int)Body.npc.Center.X, (int)Body.npc.Center.Y - 100, mod.NPCType("YamataHeadF1"), 0, Body.npc.whoAmI);
                    Main.npc[(int)latestNPC].ai[0] = Body.npc.whoAmI;
                    Body.Head2 = Main.npc[latestNPC];
                    latestNPC  = NPC.NewNPC((int)Body.npc.Center.X, (int)Body.npc.Center.Y - 100, mod.NPCType("YamataHeadF1"), 0, Body.npc.whoAmI);
                    Main.npc[(int)latestNPC].ai[0] = Body.npc.whoAmI;
                    Body.Head3 = Main.npc[latestNPC];
                    latestNPC  = NPC.NewNPC((int)Body.npc.Center.X, (int)Body.npc.Center.Y - 100, mod.NPCType("YamataHeadF1"), 0, Body.npc.whoAmI);
                    Main.npc[(int)latestNPC].ai[0] = Body.npc.whoAmI;
                    Body.Head4 = Main.npc[latestNPC];
                    latestNPC  = NPC.NewNPC((int)Body.npc.Center.X, (int)Body.npc.Center.Y - 100, mod.NPCType("YamataHeadF2"), 0, Body.npc.whoAmI);
                    Main.npc[(int)latestNPC].ai[0] = Body.npc.whoAmI;
                    Body.Head5 = Main.npc[latestNPC];
                    latestNPC  = NPC.NewNPC((int)Body.npc.Center.X, (int)Body.npc.Center.Y - 100, mod.NPCType("YamataHeadF2"), 0, Body.npc.whoAmI);
                    Main.npc[(int)latestNPC].ai[0] = Body.npc.whoAmI;
                    Body.Head6 = Main.npc[latestNPC];
                    latestNPC  = NPC.NewNPC((int)Body.npc.Center.X, (int)Body.npc.Center.Y - 100, mod.NPCType("YamataHeadF2"), 0, Body.npc.whoAmI);
                    Main.npc[(int)latestNPC].ai[0] = Body.npc.whoAmI;
                    Body.Head7        = Main.npc[latestNPC];
                    Body.HeadsSpawned = true;
                }
            }
            if (!Body.npc.active)
            {
                if (npc.timeLeft > 10)
                {
                    npc.timeLeft = 10;
                }
                killedbyplayer = false;
                return;
            }
            if (Main.expertMode)
            {
                damage = npc.damage / 4;
                //attackDelay = 180;
            }
            else
            {
                damage = npc.damage / 2;
            }
            npc.TargetClosest();
            Player targetPlayer = Main.player[npc.target];

            if (targetPlayer == null || !targetPlayer.active || targetPlayer.dead)
            {
                targetPlayer = null;                                                                               //deliberately set to null
            }
            if (!Body.npc.active)
            {
                if (Main.netMode != 1) //force a kill to prevent 'ghost hands'
                {
                    npc.life = 0;
                    npc.checkDead();
                    npc.netUpdate  = true;
                    killedbyplayer = false;
                }
                return;
            }
            if (Main.netMode != 1)
            {
                npc.ai[1]++;
                int aiTimerFire = (npc.whoAmI % 3 == 0 ? 50 : npc.whoAmI % 2 == 0 ? 150 : 100);                 //aiTimerFire is different per head by using whoAmI (which is usually different)
                if (leftHead)
                {
                    aiTimerFire += 30;
                }
                if (targetPlayer != null && npc.ai[1] == aiTimerFire)
                {
                    fireAttack = true;
                    for (int i = 0; i < 5; ++i)
                    {
                        Vector2 dir = Vector2.Normalize(targetPlayer.Center - npc.Center);
                        dir *= 5f;
                        Projectile.NewProjectile(npc.Center.X, npc.Center.Y, dir.X, dir.Y, mod.ProjectileType("YamataBreath"), (int)(damage * .8f), 0f, Main.myPlayer);
                    }
                }
                else
                if (npc.ai[1] >= 200)                //pick random spot to move head to
                {
                    fireAttack    = false;
                    npc.ai[1]     = 0;
                    npc.ai[2]     = Main.rand.Next(-movementVariance, movementVariance);
                    npc.ai[3]     = Main.rand.Next(-movementVariance, movementVariance);
                    npc.netUpdate = true;
                }
            }
            npc.rotation = 1.57f;
            Vector2 nextTarget = Body.npc.Center + new Vector2(leftHead ? -distFromBodyX : distFromBodyX, -distFromBodyY) + new Vector2(npc.ai[2], npc.ai[3]);

            if (Vector2.Distance(nextTarget, npc.Center) < 40f)
            {
                npc.velocity *= 0.9f;
                if (Math.Abs(npc.velocity.X) < 0.05f)
                {
                    npc.velocity.X = 0f;
                }
                if (Math.Abs(npc.velocity.Y) < 0.05f)
                {
                    npc.velocity.Y = 0f;
                }
            }
            else
            {
                npc.velocity  = Vector2.Normalize(nextTarget - npc.Center);
                npc.velocity *= 5f;
            }
            npc.position       += (Body.npc.oldPos[0] - Body.npc.position);
            npc.spriteDirection = -1;
        }