dnd 5e – Does the mind flayer’s Extract Brain affect polymorphed or Wild Shaped humanoids?

A mind flayer has the following requirement in order to perform its Extract Brain Action (MM, 222):

one incapacitated humanoid grappled by the mind flayer.

If a humanoid has been polymorphed (PHB, 266):

This spell transforms a creature that you can see within range into a new form…

The target’s game statistics, including mental ability scores, are replaced by the statistics of the chosen beast. It retains its alignment and personality.

If a humanoid has used the Wild Shape class feature, they (PHB, 66-7):

magically assume the shape of a beast that (they) have seen before.

Your game statistics are replaced by the statistics of the beast, but you retain your alignment, personality, and Intelligence, Wisdom, and Charisma scores.

You retain the benefit of any features from your class, race, or other source and can use them if the new form is physically capable of doing so.

In both forms, the creatures are clearly in a beast shape, but are they (or their brains) still considered “humanoid”?

dnd 5e – Mind spike while concentrating in another spell

The rule says:

The following factors can break concentration:

Casting another spell that requires concentration. You lose
concentration on a spell if you cast another spell that requires
concentration. You can’t concentrate on two spells at once.

Thus casting mind spike requires concentration and stops the previously called Shadow Blade

I guess the confusion comes from the phrase:

Some spells require you to maintain concentration in order to keep their magic active. If you lose concentration, such a spell ends.

which gives the impression, that it’s not the casting, that requires concentration, but ‘just’ the maintaining.

Ruby Package – Mind Piff | Forum Promotion

dnd 5e – Can an Aberrant Mind Sorcerer cast Scrying using sorcery points without a 1000 gp focus?

There are two different ways of reading the rules regarding spell components and spells in general — “fiction first” (narrative approach) and “rules first” (mechanical approach). There is no “right” one, the choice depends on your own playstyle, what people at this particular table want, and other factors.

For instance, Find the Path spell requires

an object from the location you wish to find

From the “rules first” perspective you can substitute this object with your focus, since it has no price specified. However, this makes no sense for the “fiction first” point of view, because the result of the spell probably depends on the object being used, and your spellcasting focus is not a thing from the location you’re searching for.

Regarding the Scrying spell, if you prefer the “rules first” approach then the resolution is clear (but maybe kind of boring) — the spell just takes effect, no mirror nor crystal ball is required, because magic.

If you choose the “fiction first” approach then the spell probably should require some kind of “screen” for scrying. But asking for a full-price crystal ball would be disappointing for the player, since it’d be basically nullifying the character’s prominent feature. Instead, I suggest you to allow using any reflective surface in this case — a mundane mirror, a water puddle, anything.

Or just ask the player “how do you do that”? It’s their magic, after all.

Lykke changed its mind again after removing XRP from the list

Swiss-based coin exchange Lykke previously suspended XRP transactions with a decision. Deciding to resume XRP transactions suspended on January 18, 2021, the exchange sent an e-mail to its members on this issue. As of 11.03.2020, XRP transactions are now made.
What do you think about this development?

c# – Simple Snake Game With OOP in Mind

I am a beginner in C# and trying to learn how to program with OOP in mind. I am 100% that the code is not OOP-friendly at all, but the game is running and working, so if anyone could look throw the code and give me feedback on how to improve it, that would be helpful.

The game is a simple snake game with three players option. I have done two players part, but the code seems to be ugly and messy, so I didn’t want to add anything more to the garbage, and I am completely ok if I have to redo everything I am doing this to learn anyways

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace snakeGame3players
{
    public partial class Form1 : Form
    {
        private readonly List<Square> SnakeBoddy = new List<Square>();
        private readonly List<Square> SnakeBoddy2 = new List<Square>();
        private readonly List<Square> SnakeFoods1 = new List<Square>();
        private readonly List<Square> SnakeFoods2 = new List<Square>();
        private readonly List<Square> SnakeFoods3 = new List<Square>();
        private readonly List<Square> SnakeFoods4 = new List<Square>();
        System.Windows.Forms.Timer eventTimer = new System.Windows.Forms.Timer();
        System.Windows.Forms.Timer foodTimer = new System.Windows.Forms.Timer();
        System.Windows.Forms.Timer foodTimer2 = new System.Windows.Forms.Timer();
        System.Windows.Forms.Timer foodTimer3 = new System.Windows.Forms.Timer();
        System.Windows.Forms.Timer foodTimer4 = new System.Windows.Forms.Timer();
        Random random = new Random();
        bool exitFlag = false;


        public Form1()
        {
            InitializeComponent();
            choice1.Appearance = System.Windows.Forms.Appearance.Button;
            choice2.Appearance = System.Windows.Forms.Appearance.Button;
            choice3.Appearance = System.Windows.Forms.Appearance.Button;
            choice1.Size = new Size(154, 56);
            choice2.Size = new Size(154, 56);
            choice3.Size = new Size(154, 56);
            new Player1setting();
            new Player2setting();
            new FoodSetting();
            GameTimer.Interval = 100;
            this.KeyPreview = true;
            GameTimer.Tick += UpdateScreen;
            GameTimer.Start();
            label3.Visible = false;
            label2.Visible = false;

        }

        private void UpdateScreen(object sender, EventArgs e)
        {

            if (label1.Visible == true)
            {
                if (KeyInput.KeyInputs(Keys.Q))
                {

                    Application.Restart();
                    Environment.Exit(0);
                }
            }
            if (choice2.Checked && Player1setting.Gameover ==false)
            {
                if (KeyInput.KeyInputs(Keys.Right) && Player1setting.Movment != SnakeMovment.Left)
                {
                    Player1setting.Movment = SnakeMovment.Right;
                }

                else if (KeyInput.KeyInputs(Keys.Left) && Player1setting.Movment != SnakeMovment.Right)
                {
                    Player1setting.Movment = SnakeMovment.Left;
                }

                else if (KeyInput.KeyInputs(Keys.Up) && Player1setting.Movment != SnakeMovment.Down)
                {
                    Player1setting.Movment = SnakeMovment.Up;
                }

                else if (KeyInput.KeyInputs(Keys.Down) && Player1setting.Movment != SnakeMovment.Up)
                {
                    Player1setting.Movment = SnakeMovment.Down;
                }

                PlayerMovment();
            }

            pictureBox1.Invalidate();

            
            if (choice1.Checked && Player2setting.Gameover2 == false)
            {
                if (KeyInput.KeyInputs(Keys.D) && Player2setting.Movment2 != SnakeMovment2.A)
                {
                    Player2setting.Movment2 = SnakeMovment2.D;
                }

                else if (KeyInput.KeyInputs(Keys.A) && Player2setting.Movment2 != SnakeMovment2.D)
                {
                    Player2setting.Movment2 = SnakeMovment2.A;
                }

                else if (KeyInput.KeyInputs(Keys.W) && Player2setting.Movment2 != SnakeMovment2.S)
                {
                    Player2setting.Movment2 = SnakeMovment2.W;
                }

                else if (KeyInput.KeyInputs(Keys.S) && Player2setting.Movment2 != SnakeMovment2.W)
                {
                    Player2setting.Movment2 = SnakeMovment2.S;
                }

                PlayerMovment2();
            }

            pictureBox1.Invalidate();

        }

        private void PlayerMovment()
        {
            if (choice2.Checked) {
                for (int i = SnakeBoddy.Count - 1; i >= 0; i--)
                {
                    if (i == 0)
                    {
                        switch (Player1setting.Movment)
                        {
                            case SnakeMovment.Right:
                                SnakeBoddy(i).X++;
                                break;

                            case SnakeMovment.Left:
                                SnakeBoddy(i).X--;
                                break;

                            case SnakeMovment.Up:
                                SnakeBoddy(i).Y--;
                                break;

                            case SnakeMovment.Down:
                                SnakeBoddy(i).Y++;
                                break;
                        }

                        int maxXPosition = pictureBox1.Size.Width / Player1setting.Width;
                        int maxYPosition = pictureBox1.Size.Height / Player1setting.Height;

                        if (
                            SnakeBoddy(i).X < 0 || SnakeBoddy(i).Y < 0 ||
                            SnakeBoddy(i).X > maxXPosition || SnakeBoddy(i).Y >= maxYPosition
                            )
                        {
                            Die();
                        }

                        for (int J = 1; J < SnakeBoddy.Count; J++)
                        {
                            if (SnakeBoddy(i).X == SnakeBoddy(J).X && SnakeBoddy(i).Y == SnakeBoddy(J).Y)
                            {
                                Die();
                            }
                        }
                        for (int g = 0; g < SnakeBoddy2.Count; g++)
                        {
                            if (SnakeBoddy(0).X == SnakeBoddy2(g).X && SnakeBoddy(0).Y == SnakeBoddy2(g).Y)
                            {
                                Player1setting.GameScore += FoodSetting.food2;
                                label3.Text = Player1setting.GameScore.ToString();
                                Die();
                            }
                        }
                        if (SnakeFoods1.Any(s => s.X == SnakeBoddy(0).X && s.Y == SnakeBoddy(0).Y))
                        {
                            EatFood();
                        }

                        if (SnakeFoods2.Any(s => s.X == SnakeBoddy(0).X && s.Y == SnakeBoddy(0).Y))
                        {
                            EatFood2();
                        }

                        if (SnakeFoods3.Any(s => s.X == SnakeBoddy(0).X && s.Y == SnakeBoddy(0).Y))
                        {
                            EatFood3();
                        }

                        if (SnakeFoods4.Any(s => s.X == SnakeBoddy(0).X && s.Y == SnakeBoddy(0).Y))
                        {
                            EatFood4();
                        }
                    }
                    else
                    {
                        SnakeBoddy(i).X = SnakeBoddy(i - 1).X;
                        SnakeBoddy(i).Y = SnakeBoddy(i - 1).Y;
                    }
                }
            }
                
        }
        
        private void PlayerMovment2()
        {
            if (choice1.Checked)
            {
                for (int x = SnakeBoddy2.Count - 1; x >= 0; x--)
                {
                    if (x == 0)
                    {
                        switch (Player2setting.Movment2)
                        {
                            case SnakeMovment2.D:
                                SnakeBoddy2(x).X++;
                                break;

                            case SnakeMovment2.A:
                                SnakeBoddy2(x).X--;
                                break;

                            case SnakeMovment2.W:
                                SnakeBoddy2(x).Y--;
                                break;

                            case SnakeMovment2.S:
                                SnakeBoddy2(x).Y++;
                                break;
                        }

                        int maxXPosition2 = pictureBox1.Size.Width / Player2setting.Width2;
                        int maxYPosition2 = pictureBox1.Size.Height / Player2setting.Height2;

                        if (
                            SnakeBoddy2(x).X < 0 || SnakeBoddy2(x).Y < 0 ||
                            SnakeBoddy2(x).X > maxXPosition2 || SnakeBoddy2(x).Y >= maxYPosition2
                            )
                        {
                            Die2();
                        }

                        for (int h = 1; h < SnakeBoddy2.Count; h++)
                        {
                            if (SnakeBoddy2(x).X == SnakeBoddy2(h).X && SnakeBoddy2(x).Y == SnakeBoddy2(h).Y)
                            {
                                Die2();
                            }
                        }

                        for (int g = 0; g < SnakeBoddy.Count; g++)
                        {
                            if (SnakeBoddy2(0).X == SnakeBoddy(g).X && SnakeBoddy2(0).Y == SnakeBoddy(g).Y)
                            {
                                Player1setting.GameScore += FoodSetting.food2;
                                label2.Text = Player1setting.GameScore.ToString();
                                Die2();
                            }
                        }


                        if (SnakeFoods1.Any(s => s.X == SnakeBoddy2(0).X && s.Y == SnakeBoddy2(0).Y))
                        {
                            EatFood();
                        }

                        if (SnakeFoods2.Any(s => s.X == SnakeBoddy2(0).X && s.Y == SnakeBoddy2(0).Y))
                        {
                            EatFood2();
                        }

                        if (SnakeFoods3.Any(s => s.X == SnakeBoddy2(0).X && s.Y == SnakeBoddy2(0).Y))
                        {
                            EatFood3();
                        }

                        if (SnakeFoods4.Any(s => s.X == SnakeBoddy2(0).X && s.Y == SnakeBoddy2(0).Y))
                        {
                            EatFood4();
                        }
                    }
                    else
                    {
                        SnakeBoddy2(x).X = SnakeBoddy2(x - 1).X;
                        SnakeBoddy2(x).Y = SnakeBoddy2(x - 1).Y;
                    }
                }
            }
               

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Keyisup(object sender, KeyEventArgs e)
        {
            KeyInput.SnakeDirections(e.KeyCode, false);
        }

        private void Keyisdown(object sender, KeyEventArgs e)
        {
            KeyInput.SnakeDirections(e.KeyCode, true);
        }

        private void UpdateGame(object sender, PaintEventArgs e)
        {

            Graphics canvas = e.Graphics;
            if (label1.Visible==false && Information.Visible==false)
            {
                foreach (Square SnakeFood in SnakeFoods1) {
                    canvas.FillRectangle(Brushes.Red,
                                       new Rectangle(
                                           SnakeFood.X * Player2setting.Width2,
                                           SnakeFood.Y * Player2setting.Width2,
                                           Player2setting.Width2, Player2setting.Height2
                                                  ));
                }
                foreach (Square SnakeFoods2 in SnakeFoods2) { 
                    canvas.FillRectangle(Brushes.Orange,
                                   new Rectangle(
                                       SnakeFoods2.X * Player1setting.Width,
                                       SnakeFoods2.Y * Player1setting.Width,
                                       Player1setting.Width, Player1setting.Height
                                              ));
                }
                foreach (Square SnakeFoods3 in SnakeFoods3) {
                    canvas.FillRectangle(Brushes.Purple,
                                   new Rectangle(
                                       SnakeFoods3.X * Player1setting.Width,
                                       SnakeFoods3.Y * Player1setting.Width,
                                       Player1setting.Width, Player1setting.Height
                                              ));
                }
                foreach (Square SnakeFoods4 in SnakeFoods4) {
                    canvas.FillRectangle(Brushes.Green,
                                   new Rectangle(
                                       SnakeFoods4.X * Player1setting.Width,
                                       SnakeFoods4.Y * Player1setting.Width,
                                       Player1setting.Width, Player1setting.Height
                                              ));
                }
            }
                

            if (choice2.Checked)
            {
                if (Player1setting.Gameover == false)
                {
                    Brush SnakeBoddyColor;

                    for (int i = 0; i < SnakeBoddy.Count; i++)
                    {
                        if (i == 0)
                        {
                            SnakeBoddyColor = Brushes.Black;
                            canvas.FillRectangle(SnakeBoddyColor,
                                               new Rectangle(
                                                   SnakeBoddy(i).X * Player1setting.Width,
                                                   SnakeBoddy(i).Y * Player1setting.Width,
                                                   Player1setting.Width, Player1setting.Height
                                                   ));
                        }
                        else
                        {
                            SnakeBoddyColor = Brushes.Red;
                            canvas.FillRectangle(SnakeBoddyColor,
                                               new Rectangle(
                                                   SnakeBoddy(i).X * Player1setting.Width,
                                                   SnakeBoddy(i).Y * Player1setting.Width,
                                                   Player1setting.Width, Player1setting.Height
                                                          ));
                        }
                    }
                }
            }
            if (choice1.Checked)
            {
                if (Player2setting.Gameover2 == false)
                {
                    Brush SnakeBoddyColor2;

                    for (int x = 0; x < SnakeBoddy2.Count; x++)
                    {
                        if (x == 0)
                        {
                            SnakeBoddyColor2 = Brushes.Black;
                            canvas.FillRectangle(SnakeBoddyColor2,
                                               new Rectangle(
                                                   SnakeBoddy2(x).X * Player2setting.Width2,
                                                   SnakeBoddy2(x).Y * Player2setting.Width2,
                                                   Player2setting.Width2, Player2setting.Height2
                                                   ));
                        }
                        else
                        {
                            SnakeBoddyColor2 = Brushes.Blue;
                            canvas.FillRectangle(SnakeBoddyColor2,
                                               new Rectangle(
                                                   SnakeBoddy2(x).X * Player2setting.Width2,
                                                   SnakeBoddy2(x).Y * Player2setting.Width2,
                                                   Player2setting.Width2, Player2setting.Height2
                                                          ));
                        }
                    }
                }
            }
               

            if (Player2setting.GameScore2 > Player1setting.GameScore && Player2setting.Gameover2 == true)
            {
                string gameEnd = "Player 1 n" + "With the score of " + Player2setting.GameScore2 + "nPress Q to play again n";
                label1.Text = gameEnd;
                label3.Visible = false;
                label2.Visible = false;
                label1.Visible = true;
            }
            if (Player2setting.GameScore2 < Player1setting.GameScore && Player1setting.Gameover == true) 
            {
                string gameEnd = "Player 2 n" + "With the score of " + Player1setting.GameScore + "nPress Q to play againn";
                label1.Text = gameEnd;
                label3.Visible = false;
                label2.Visible = false;
                label1.Visible = true;
            }
            if (Player2setting.GameScore2 == Player1setting.GameScore && Player1setting.Gameover == true && Player2setting.Gameover2 == true)
            {
                string gameEnd = "Draw nPress Q to play againn";
                label1.Text = gameEnd;
                label3.Visible = false;
                label2.Visible = false;
                label1.Visible = true;
            }

        }

        private void StartGame()
        {
            pictureBox1.Visible = false;
            Information.Visible = false;
            Player1Information.Visible = false;
            Player2Information.Visible = false;
            Player3Information.Visible = false;
            choice1.Visible = false;
            choice2.Visible = false;
            choice3.Visible = false;
            GameStart.Visible = false;
            pictureBox3.Visible = false;
            pictureBox1.Visible = true;
            label1.Visible = false;
            new FoodSetting();
            new Player1setting();
            new Player2setting();
            if (choice2.Checked)
            {
                label2.Visible = true;
                SnakeBoddy.Clear();
                Square SneakHead = new Square { X = 35, Y = 5 };
                SnakeBoddy.Add(SneakHead);
                if (choice2.Checked && !choice1.Checked)
                {
                    Square SneakHead2 = new Square { X = 35, Y = 5 };
                    Player2setting.GameScore2 = -1;
                    SnakeBoddy2.Add(SneakHead2);
                }
            }
            if (choice1.Checked)
            {
                label3.Visible = true;
                SnakeBoddy2.Clear();
                Square SneakHead2 = new Square { X = 10, Y = 5 };
                SnakeBoddy2.Add(SneakHead2);
                if (choice1.Checked && !choice2.Checked)
                {
                    Square SneakHead = new Square { X = 10, Y = 5 };
                    Player1setting.GameScore = -1;
                    SnakeBoddy.Add(SneakHead);
                }
            }
            label2.Text = Player1setting.GameScore.ToString();
            label3.Text = Player2setting.GameScore2.ToString();
            FoodEvent();

        }

        private void GenerateSnakeFood()
        {
            Square newFood = GenerateRandomFood();

            while (SnakeFoods1.Any(snakeFood => snakeFood.X == newFood.X && snakeFood.Y == newFood.Y))
            {
                newFood = GenerateRandomFood();
            }

            SnakeFoods1.Add(newFood);

        }

        private void GenerateSnakeFood2()
        {
            Square newFood = GenerateRandomFood();

            while (SnakeFoods2.Any(snakeFood => snakeFood.X == newFood.X && snakeFood.Y == newFood.Y))
            {
                newFood = GenerateRandomFood();
            }

            SnakeFoods2.Add(newFood);

        }

        private void GenerateSnakeFood3()
        {
            Square newFood = GenerateRandomFood();

            while (SnakeFoods3.Any(snakeFood => snakeFood.X == newFood.X && snakeFood.Y == newFood.Y))
            {
                newFood = GenerateRandomFood();
            }

            SnakeFoods3.Add(newFood);

        }

        private void GenerateSnakeFood4()
        {
            Square newFood = GenerateRandomFood();

            while (SnakeFoods4.Any(snakeFood => snakeFood.X == newFood.X && snakeFood.Y == newFood.Y))
            {
                newFood = GenerateRandomFood();
            }

            SnakeFoods4.Add(newFood);

        }

        private Square GenerateRandomFood()
        {
            int maxXPosition = pictureBox1.Size.Width / Player1setting.Width;
            int maxYPosition = pictureBox1.Size.Height / Player1setting.Height;

            return new Square { X = random.Next(0, maxXPosition), Y = random.Next(0, maxYPosition) };
        }


        private void EatFood()
        {
            if (SnakeFoods1.Any(s => s.X == SnakeBoddy(0).X && s.Y == SnakeBoddy(0).Y))
            {
                Square foodBody = new Square
                {
                    X = SnakeBoddy(SnakeBoddy.Count - 1).X,
                    Y = SnakeBoddy(SnakeBoddy.Count - 1).Y
                };

                SnakeBoddy.Add(foodBody);
                Player1setting.GameScore += FoodSetting.food1;
                label2.Text = Player1setting.GameScore.ToString();
                var snakePosition = SnakeBoddy(0);
                SnakeFoods1.RemoveAll(s => s.X == snakePosition.X && s.Y == snakePosition.Y);
            }
            if (SnakeFoods1.Any(s => s.X == SnakeBoddy2(0).X && s.Y == SnakeBoddy2(0).Y))
            {
                Square foodBody2 = new Square
                {
                    X = SnakeBoddy2(SnakeBoddy2.Count - 1).X,
                    Y = SnakeBoddy2(SnakeBoddy2.Count - 1).Y
                };

                SnakeBoddy2.Add(foodBody2);
                Player2setting.GameScore2 += FoodSetting.food1;
                label3.Text = Player2setting.GameScore2.ToString();
                var snakePosition = SnakeBoddy2(0);
                SnakeFoods1.RemoveAll(s => s.X == snakePosition.X && s.Y == snakePosition.Y);
            }
        }

        private void EatFood2()
        {
            if (SnakeFoods2.Any(s => s.X == SnakeBoddy(0).X && s.Y == SnakeBoddy(0).Y))
            {
                Square foodBody3 = new Square
                {
                    X = SnakeBoddy(SnakeBoddy.Count - 1).X,
                    Y = SnakeBoddy(SnakeBoddy.Count - 1).Y
                };

                SnakeBoddy.Add(foodBody3);

                Square foodBody35 = new Square
                {
                    X = SnakeBoddy(SnakeBoddy.Count - 1).X,
                    Y = SnakeBoddy(SnakeBoddy.Count - 1).Y
                };

                SnakeBoddy.Add(foodBody35);
                Player1setting.GameScore += FoodSetting.food2;
                label2.Text = Player1setting.GameScore.ToString();
                var snakePosition = SnakeBoddy(0);
                SnakeFoods2.RemoveAll(s => s.X == snakePosition.X && s.Y == snakePosition.Y);
            }
            if (SnakeFoods2.Any(s => s.X == SnakeBoddy2(0).X && s.Y == SnakeBoddy2(0).Y))
            {
                Square foodBody4 = new Square
                {
                    X = SnakeBoddy2(SnakeBoddy2.Count - 1).X,
                    Y = SnakeBoddy2(SnakeBoddy2.Count - 1).Y
                };
                SnakeBoddy2.Add(foodBody4);

                Square foodBody45 = new Square
                {
                    X = SnakeBoddy2(SnakeBoddy2.Count - 1).X,
                    Y = SnakeBoddy2(SnakeBoddy2.Count - 1).Y
                };

                SnakeBoddy2.Add(foodBody45);
                Player2setting.GameScore2 += FoodSetting.food2;
                label3.Text = Player2setting.GameScore2.ToString();
                var snakePosition = SnakeBoddy2(0);
                SnakeFoods2.RemoveAll(s => s.X == snakePosition.X && s.Y == snakePosition.Y);
            }
        }

        private void EatFood3()
        {
            if (SnakeFoods3.Any(s => s.X == SnakeBoddy(0).X && s.Y == SnakeBoddy(0).Y))
            {
                if (SnakeBoddy.Count > 1)
                {
                    SnakeBoddy.RemoveAt(SnakeBoddy.Count - 1);
                }
                Player1setting.GameScore += FoodSetting.food3;
                label2.Text = Player1setting.GameScore.ToString();
                var snakePosition = SnakeBoddy(0);
                SnakeFoods3.RemoveAll(s => s.X == snakePosition.X && s.Y == snakePosition.Y);
            }
            if (SnakeFoods3.Any(s => s.X == SnakeBoddy2(0).X && s.Y == SnakeBoddy2(0).Y))
            {
                if (SnakeBoddy2.Count > 1)
                {
                    SnakeBoddy2.RemoveAt(SnakeBoddy2.Count - 1);
                }
                Player2setting.GameScore2 += FoodSetting.food3;
                label3.Text = Player2setting.GameScore2.ToString();
                var snakePosition = SnakeBoddy2(0);
                SnakeFoods3.RemoveAll(s => s.X == snakePosition.X && s.Y == snakePosition.Y);
            }
        }


        private void EatFood4()
        {
            if (SnakeFoods4.Any(s => s.X == SnakeBoddy(0).X && s.Y == SnakeBoddy(0).Y))
            {
                Player1setting.GameScore += FoodSetting.food4;
                label2.Text = Player1setting.GameScore.ToString();
                var snakePosition = SnakeBoddy(0);
                SnakeFoods4.RemoveAll(s => s.X == snakePosition.X && s.Y == snakePosition.Y);
                RandomEevent();
            }

            if (SnakeFoods4.Any(s => s.X == SnakeBoddy2(0).X && s.Y == SnakeBoddy2(0).Y))
            {
                Player2setting.GameScore2 += FoodSetting.food4;
                label3.Text = Player2setting.GameScore2.ToString();
                var snakePosition = SnakeBoddy2(0);
                SnakeFoods4.RemoveAll(s => s.X == snakePosition.X && s.Y == snakePosition.Y);
                RandomEevent();
            }
        }

        private void RandomEevent()
        {
            var time = DateTime.Now;
            eventTimer.Tick += new EventHandler(TimerEventProcessor);
            eventTimer.Interval = 3000;
            eventTimer.Start();
            while (exitFlag == false)
            {
                //Application.DoEvents();
                if ((DateTime.Now - time).TotalSeconds > 30)
                {
                    eventTimer.Stop();
                    exitFlag = true;
                }
            }
        }

        private void TimerEventProcessor(Object sender, EventArgs e)
        {
            eventTimer.Enabled = true;
            Player2setting.Movment2 = (SnakeMovment2)random.Next(4);
        }

        private void FoodEvent() 
        {
            foodTimer.Tick += new EventHandler(FoodGenerator);
            foodTimer.Interval = random.Next(1000,4000);
            foodTimer.Start();
            foodTimer2.Tick += new EventHandler(FoodGenerator2);
            foodTimer2.Interval = random.Next(4000, 7000);
            foodTimer2.Start();
            foodTimer3.Tick += new EventHandler(FoodGenerator3);
            foodTimer3.Interval = random.Next(5000, 10000);
            foodTimer3.Start();
            foodTimer4.Tick += new EventHandler(FoodGenerator4);
            foodTimer4.Interval = random.Next(3000, 6000);
            foodTimer4.Start();
        }

        private void FoodGenerator(object sender, EventArgs e)
        {
            foodTimer.Enabled = true;
            GenerateSnakeFood();
        }

        private void FoodGenerator2(object sender, EventArgs e)
        {
            foodTimer2.Enabled = true;
            GenerateSnakeFood2();
        }

        private void FoodGenerator3(object sender, EventArgs e)
        {
            foodTimer3.Enabled = true;
            GenerateSnakeFood3();
        }

        private void FoodGenerator4(object sender, EventArgs e)
        {
            foodTimer4.Enabled = true;
            GenerateSnakeFood4();
        }

        private void Die()
        {
            Player1setting.Gameover = true;
        }

        private void Die2()
        {
            Player2setting.Gameover2 = true;
        }

        private void GameStart_Click(object sender, EventArgs e)
        {
            if (choice1.Checked || choice2.Checked || choice3.Checked) {
                StartGame();
            }

        }
    }
}

KeyInput.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Windows.Forms;

namespace snakeGame3players
{
    class KeyInput
    {

        private static Hashtable keyTable = new Hashtable();

        public static bool KeyInputs(Keys key)
        {
            if (keyTable(key) == null)
            {
                return false;
            }

            return (bool)keyTable(key);
        }

        public static void SnakeDirections(Keys key, bool direction)
        {
            keyTable(key) = direction;
        }

    }
}

Player1setting.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace snakeGame3players
{
    public enum SnakeMovment
    {
        Right,
        Left,
        Down,
        Up
    };

    public enum SnakeMovment2
    {
        W,
        S,
        D,
        A
    };


    class Player1setting
    {
        public static int Width { get; set; }
        public static int Height { get; set; }
        public static int GameScore { get; set; }
        public static bool Gameover { get; set; }
        public static SnakeMovment Movment { get; set; }

        public Player1setting()
        {
            Height = 16;
            Width = 16;
            Gameover = false;
            Movment = SnakeMovment.Down;
            GameScore = 0;
        }

    }

    class Player2setting
    {
        public static int Width2 { get; set; }
        public static int Height2 { get; set; }
        public static int GameScore2 { get; set; }
        public static bool Gameover2 { get; set; }
        public static SnakeMovment2 Movment2 { get; set; }

        public Player2setting()
        {
            Height2 = 16;
            Width2 = 16;
            Gameover2 = false;
            Movment2 = SnakeMovment2.S;
            GameScore2 = 0;
        }

    }
    class FoodSetting
    {
        public static int food1 { get; set; }
        public static int food2 { get; set; }
        public static int food3 { get; set; }
        public static int food4 { get; set; }

        public FoodSetting()
        {
            food1 = 1;
            food2 = 5;
            food3 = 1;
            food4 = 1;
        }
    }

}

Square.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace snakeGame3players
{
    class Square
    {
        public int X { get; set; }
        public int Y { get; set; }

        public Square()
        {
            X = 0;
            Y = 0;
        }
    }
}

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace snakeGame3players
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        (STAThread)
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

dnd 5e – Does Mind whip prevent bonus actions if you take away an action?

The text for mind whip states

You psychically lash out at one creature you can see within range. The target must make an Intelligence saving throw. On a failed save, the target takes 3d6 psychic damage, and it can’t take a reaction until the end of its next turn. Moreover, on its next turn, it must choose whether it gets a move, an action, or a bonus action; it gets only one of the three. On a successful save, the target takes half as much damage and suffers none of the spell’s other effects

Meanwhile, the rules state

[…] anything that deprives you of your ability to take actions also prevents you from taking a bonus action.

If the target chooses a bonus action, it technically shouldn’t be able to do so, as it was deprived of its action. Or is this a case of specific beats general?

dnd 5e – Can an Aberrant Mind and Clockwork Soul Sorcerer replace two spells at level up?

All sorcerers are allowed to replace one spell they known when they level up:

Additionally, when you gain a level in this class, you can choose one of the Sorcerer Spells you know and replace it with another spell from the Sorcerer spell list, which also must be of a level for which you have Spell Slots.

Moreover, the Clockwork Magic feature let the Clockwork Soul Sorcerer replace one of their spell known at level up:

Whenever you gain a sorcerer level, you can replace one spell you gained from this feature with another spell of the same level. The new spell must be an abjuration or a transmutation spell from the sorcerer, warlock, or wizard spell list.

Same for the Psionic Spells feature of the Aberrant Mind Sorcerer:

Whenever you gain a sorcerer level, you can replace one spell you gained from this feature with another spell of the same level. The new spell must be a divination or an enchantment spell from the sorcerer, warlock, or wizard spell list.

My question: can the Clockwork Soul Sorcerer and the Aberrant Mind Sorcerer swap two of their spells at level up, as long as one is from their “normal” list and one is from their origin?

Or, do these Sorcerers have to pick to either replace a single one of their Sorcerer spells using the general rule, or replace a single of their origin list using the special Clockwork Magic / Psionic Spells rules?

dnd 5e – Bard with a mind focus multiclass question 5e

I will be making a level 20 character for a D&D 5e one shot that will have alot of roleplay and combat. I want to be a bard plus something else. Either a lore or whisper bard and then either an Aberrant Mind Sorcerer or a Great Old One Warlock. I want to have at least 17 lvls of bard so at a key moment I can use true polymorph and turn into an aboleth. With all that in Mind, pun intended, what is the best combo for dealing damage or Survivability in a fight of 17 lvls of bard (lore or whisper) and 3 lvls of Aberrant Mind Sorcerer or a Great Old One Warlock?

Thank you in Advance.

dnd 3.5e – Item of Arrow Mind

I am looking to price out an item for one of my players. Basically, they would like an item that grants them continuous use Arrow Mind from the Spell Compendium. It is a 1st level sorcerer/wizard spell with a duration of 1 min/level. So, by standard item creation rules, it would be a 4,000gp item. It would grant them the ability to make attacks of opportunities with a bow and never provoke attacks of opportunity when firing within melee range. 4,000gp seems a bit low, as it provides a ton of versatility in combat. But, I am not sure of a good price point.

Does anyone have any suggestions for how I might evaluate what this is worth? I figure, it is granting a second level ability for a weak class (Order of the Bow Initiate) plus granting the potential for an extra attack per round (by granting attacks of opportunity with a bow). I am thinking the class ability alone is probably worth around 3-4,000gp. Add in the possible extra attack that occurs on average once a combat and you have something similar to a very limited haste effect. Maybe 10,000gp would be more appropriate for the item? Would it make sense for it to take the eyes slot given the fluff for the Arrow Mind spell affecting your vision?