예제 #1
0
        static void Main(string[] args)
        {
            Raylib.InitWindow(screenWidth, screenHeight, "WorldTens");
            World world = new World();

            world.LoadMap("resources/default.bmp");

            Random random = new Random();

            for (int i = 0; i < 100; i++)
            {
                Creation creation = new Creation(new Vector2(235, 140), 10);
                world.detectors[0].creations.Add(creation);
            }

            for (int i = 0; i < 50; i++)
            {
                Creation creation = new Creation(new Vector2(250, 150), 10);
                creation.politStatus = PoliticalStatus.Builder;
                world.detectors[0].creations.Add(creation);
            }

            Raylib.SetTargetFPS(60);

            while (!Raylib.WindowShouldClose())
            {
                world.DecreaseTens(Raylib.GetFrameTime());

                Raylib.BeginDrawing();
                Raylib.ClearBackground(Color.WHITE);

                for (int i = 0; i < world.map.Count; i++)
                {
                    for (int j = 0; j < world.map[i].Count; j++)
                    {
                        MapPixel pixel = world.map[i][j];
                        if (pixel.grass)
                        {
                            Raylib.DrawPixel(i, j, Color.GREEN);
                        }
                        else if (pixel.water)
                        {
                            Raylib.DrawPixel(i, j, Color.BLUE);
                        }
                        if (pixel.city)
                        {
                            Raylib.DrawPixel(i, j, Color.BLACK);
                        }
                        else if (pixel.road)
                        {
                            Raylib.DrawPixel(i, j, Color.GRAY);
                        }
                        pixel = null;
                    }
                }

                for (int i = 0; i < world.detectors.Count; i++)
                {
                    for (int j = 0; j < world.detectors[i].creations.Count; j++)
                    {
                        Creation creation = world.detectors[i].creations[j];
                        creation.DoAction(Raylib.GetFrameTime(), world);

                        if (creation.alive)
                        {
                            Raylib.DrawPixel(creation.position.x, creation.position.y, Color.RED);
                        }
                        else
                        {
                            Raylib.DrawPixel(creation.position.x, creation.position.y, Color.BROWN);
                            world.detectors[i].creations.Remove(creation);
                        }
                    }
                }
                Raylib.DrawText("Good luck in WorldTens!", 10, 10, 14, Color.BLACK);
                Raylib.DrawText(world.GetTension().ToString(), screenWidth - 100, 10, 20, Color.BLACK);
                if (Raylib.IsKeyDown(KeyboardKey.KEY_F))
                {
                    Raylib.DrawText("FPS: " + Raylib.GetFPS().ToString(), 350, 0, 20, Color.BLACK);
                }
                Raylib.EndDrawing();
            }

            Raylib.CloseWindow();
        }
예제 #2
0
        static void Main(string[] args)
        {
            string modelName = args.Length > 0 ? args[0] : "default";

            string modelPath = "resources/models/" + modelName;

            if (!File.Exists(modelPath + "/map.bmp") || !File.Exists(modelPath + "/spawn.yml"))
            {
                Console.WriteLine("Wrong model title!");
                return;
            }
            World world = new World(modelPath + "/map.bmp");

            screenWidth  = world.GetMapWidth();
            screenHeight = world.GetMapHeight();
            Raylib.InitWindow(screenWidth, screenHeight, "WorldTens");

            string spawnYaml    = System.IO.File.ReadAllText("resources/models/" + modelName + "/spawn.yml");
            var    deserializer = new YamlDotNet.Serialization.Deserializer();

            CreationSet[] creationSets = deserializer.Deserialize <CreationSet[]>(spawnYaml);

            for (int i = 0; i < creationSets.Length; i++)
            {
                for (int j = 0; j < creationSets[i].count; j++)
                {
                    Creation creation = new Creation(new Vector2(
                                                         creationSets[i].posX, creationSets[i].posY
                                                         ), creationSets[i].mind);

                    creation.politStatus = creationSets[i].politStatus;
                    creation.GetDetectorFirstTime(world).creations.Add(creation);
                }
            }

            while (!Raylib.WindowShouldClose())
            {
                world.DecreaseTens(Raylib.GetFrameTime());

                Raylib.BeginDrawing();

                if (OperatingSystem.IsWindows() || args.Length < 2 || (args.Length > 1 && args[1] != "time"))
                {
                    Raylib.ClearBackground(Color.WHITE);
                    world.DrawOptimized();
                    Raylib.DrawText("Good luck in WorldTens!", 10, 10, 14, Color.BLACK);
                    Raylib.DrawText(iterations.ToString(), 0, screenHeight - 20, 20, Color.BLACK);
                    Raylib.DrawText(world.GetTension().ToString(), screenWidth - 100, 10, 20, Color.BLACK);
                    Raylib.DrawText("FPS: " + Raylib.GetFPS().ToString(), 350, 0, 20, Color.BLACK);
                }

                if (iterTmp >= iterMax || iterations == 0 || OperatingSystem.IsWindows() || (args.Length > 1 && args[1] == "redraw"))
                {
                    Raylib.ClearBackground(Color.WHITE);
                    for (int i = 0; i < world.map.Count; i++)
                    {
                        for (int j = 0; j < world.map[i].Count; j++)
                        {
                            world.DrawMapPixel(new Vector2(i, j));
                        }
                    }
                    Raylib.DrawText("Good luck in WorldTens!", 10, 10, 14, Color.BLACK);
                    Raylib.DrawText(iterations.ToString(), 0, screenHeight - 20, 20, Color.BLACK);
                    Raylib.DrawText(world.GetTension().ToString(), screenWidth - 100, 10, 20, Color.BLACK);
                    Raylib.DrawText("FPS: " + Raylib.GetFPS().ToString(), 350, 0, 20, Color.BLACK);
                    iterTmp = 0;
                }

                for (int i = 0; i < world.detectors.Count; i++)
                {
                    int             citizensCounter = 0;
                    List <Creation> citizens        = new List <Creation>();
                    for (int j = 0; j < world.detectors[i].creations.Count; j++)
                    {
                        Creation creation = world.detectors[i].creations[j];
                        //if (world.map[creation.position.x][creation.position.y].city) {
                        citizensCounter++;
                        citizens.Add(creation);
                        //}
                        Vector2 prevPos = new Vector2(creation.position.x, creation.position.y);
                        creation.DoAction(Raylib.GetFrameTime(), world);
                        world.DrawMapPixel(prevPos);

                        world.DrawMapPixel(creation.position);

                        if (creation.alive)
                        {
                            Raylib.DrawPixel(creation.position.x, creation.position.y, Color.RED);
                        }
                        else
                        {
                            Raylib.DrawPixel(creation.position.x, creation.position.y, Color.BROWN);
                            world.detectors[i].creations.Remove(creation);
                        }
                    }
                    if (citizensCounter > 2)
                    {
                        if (world.countries.Count == 0)
                        {
                            world.CreateCountry(citizens, i);
                        }
                        int enemyCounter   = 0;
                        int citizenCounter = 0;
                        foreach (Creation citizen in citizens)
                        {
                            if (citizen.country == null && world.detectors[i].country == null)
                            {
                                world.CreateCountry(citizens, i);
                            }
                            if (world.detectors[i].country == citizen.country)
                            {
                                citizenCounter++;
                            }
                            else
                            {
                                enemyCounter++;
                            }
                        }
                        if (enemyCounter > citizenCounter)
                        {
                            Country dominator = null;
                            foreach (Creation citizen in citizens)
                            {
                                if (citizen.country != world.detectors[i].country)
                                {
                                    world.detectors[i].country = citizen.country;
                                    dominator = citizen.country;
                                    break;
                                }
                            }
                            foreach (Creation citizen in citizens)
                            {
                                if (citizen.country != world.detectors[i].country)
                                {
                                    citizen.country = world.detectors[i].country;
                                }
                            }
                            if (dominator == null)
                            {
                                world.CreateCountry(citizens, i);
                            }
                            Console.WriteLine("territory captured");
                        }
                    }
                    if (world.year != yearCalc)
                    {
                        foreach (Country country in world.countries)
                        {
                            if (world.detectors[i].country == country)
                            {
                                country.CalculateWars(world);
                                country.CalculateRequirements(world);
                                country.ExecuteRequirements(citizens);
                            }
                        }
                    }
                    citizens = null;
                }

                if (world.year != yearCalc)
                {
                    yearCalc = world.year;
                }
                iterations++;
                iterTmp++;
                world.AddTime();

                if (Raylib.IsKeyDown(KeyboardKey.KEY_KP_MULTIPLY))
                {
                    world.IncreaseTens(100, world.countries[0]);
                }

                if (Raylib.IsKeyDown(KeyboardKey.KEY_J))
                {
                    Console.WriteLine(world.GetTension());
                }

                if (Raylib.IsKeyDown(KeyboardKey.KEY_K))
                {
                    foreach (MapDetectorSquare detector in world.detectors)
                    {
                        if (detector.country != null)
                        {
                            Random random = new Random(detector.country.ident);
                            int    red    = random.Next(255);
                            int    blue   = new Random(detector.country.blue).Next(255);
                            int    green  = new Random(detector.country.green).Next(255);
                            Raylib.DrawRectangle(detector.position.x, detector.position.y, detector.wh.x, detector.wh.y, new Color(red, blue, green, 100));
                        }
                    }
                }

                if (Raylib.IsMouseButtonPressed(MouseButton.MOUSE_LEFT_BUTTON))
                {
                    mouseSelPos = Raylib.GetMousePosition();
                }

                if (Raylib.IsMouseButtonReleased(MouseButton.MOUSE_LEFT_BUTTON))
                {
                    mouseReleasePos = Raylib.GetMousePosition();

                    Rectangle rect = new Rectangle(mouseSelPos.X, mouseReleasePos.Y, Math.Abs(mouseReleasePos.X - mouseSelPos.X), Math.Abs(mouseReleasePos.Y - mouseSelPos.Y));
                    foreach (MapDetectorSquare detector in world.detectors)
                    {
                        foreach (Creation creation in detector.creations)
                        {
                            if (Raylib.CheckCollisionPointRec(new System.Numerics.Vector2(creation.position.x, creation.position.y), rect))
                            {
                                if (creation.country != null)
                                {
                                    Console.WriteLine("Country: " + creation.country.ident);
                                }
                                else
                                {
                                    Console.WriteLine("Country: null");
                                }
                                Console.WriteLine("PolitStatus: " + creation.politStatus);
                                Vector2 dest = creation.GetDesination();
                                if (dest != null)
                                {
                                    Console.WriteLine("Destination: {0}, {1}", dest.x, dest.y);
                                }
                                else
                                {
                                    Console.WriteLine("Destination: None");
                                }
                            }
                        }
                    }
                }

                Raylib.EndDrawing();
            }

            Raylib.CloseWindow();
        }
예제 #3
0
        public void DoAction(float delta, World world)
        {
            if (!alive)
            {
                return;
            }

            CheckDetector(world);
            // Checks here
            if (world.map[position.x][position.y].status == PixelStatus.Water)
            {
                status = AIStatus.Move;
            }

            //List<Creation> creations = searchCreations(world);

            /*if (detectorLocation.creations.Count > 0) {
             *  status = AIStatus.Follow;
             * }*/

            if (politStatus == PoliticalStatus.Civilian && detectorLocation.creations.Count > 1)
            {
                status = AIStatus.Reproduce;
            }

            if ((world.map[position.x][position.y].status == PixelStatus.Grass || world.map[position.x][position.y].status == PixelStatus.Road) && politStatus == PoliticalStatus.Builder)
            {
                status = AIStatus.Build;
            }
            else if (politStatus == PoliticalStatus.Civilian && world.map[position.x][position.y].status != PixelStatus.City)
            {
                status = AIStatus.Move;
            }
            else if (politStatus == PoliticalStatus.Builder || politStatus == PoliticalStatus.Soldier)
            {
                status = AIStatus.Move;
            }

            if (full <= 35 && world.map[position.x][position.y].status == PixelStatus.City)
            {
                status = AIStatus.Eat;
            }

            if (full <= 0)
            {
                if (politStatus == PoliticalStatus.Soldier)
                {
                    Console.WriteLine("Soldier dies from starvation");
                }
                alive = false;
                return;
            }

            Random random = new Random();

            //int followIndex = random.Next(creations.Count);
            //Actions here
            switch (status)
            {
            case AIStatus.Move:
                if (politStatus == PoliticalStatus.Civilian)
                {
                    MoveToCity(world);
                }
                else if (politStatus == PoliticalStatus.Builder)
                {
                    /*if (destination == null) {
                     *  destination = SearchGrass(world);
                     * }
                     * if (destination != null) {
                     *  moveOnProgress(GetDirection(destination));
                     * }*/
                    //else {
                    moveOnProgress(new Vector2(random.Next(-1, 2), random.Next(-1, 2)));
                    //}
                }
                else if (politStatus == PoliticalStatus.Soldier)
                {
                    full = 100;
                    if (destination == null)
                    {
                        destination = SearchEnemy(world);
                    }
                    if (destination != null)
                    {
                        moveOnProgress(GetDirection(destination));
                    }

                    foreach (Creation creation in detectorLocation.creations)
                    {
                        if (creation.country != country && creation.country != null && country != null)
                        {
                            if (!country.warLevel.TryGetValue(creation.country, out byte level))
                            {
                                continue;
                            }
                            progress += (float)random.NextDouble() * mind;
                            if (progress > 100)
                            {
                                creation.alive = false;
                                progress       = 0;
                                world.IncreaseTens(0.001f, country);
                                if (!country.warLevel.ContainsKey(creation.country))
                                {
                                    country.warLevel.Add(creation.country, 1);
                                }
                                else
                                {
                                    if (country.warLevel[creation.country] < byte.MaxValue)
                                    {
                                        country.warLevel[creation.country]++;
                                    }
                                }
                            }
                        }
                    }
                }
                break;

            /*case AIStatus.Follow:
             *  Vector2 direction = GetDirection(creations[followIndex].position);
             *  position.x += direction.x;
             *  position.y += direction.y;
             *  break;*/
            case AIStatus.Build:
                progress += speedBuid * delta;
                if (progress >= 100)
                {
                    if (world.map[position.x][position.y].status == PixelStatus.Road)
                    {
                        world.map[position.x][position.y].status = PixelStatus.City;
                    }
                    else
                    {
                        world.map[position.x][position.y].status = PixelStatus.Road;
                    }
                    progress = 0;
                    world.IncreaseTens(0.01f, country);
                }
                break;

            case AIStatus.Eat:
                if (world.map[position.x][position.y].status == PixelStatus.City)
                {
                    full += eatSpeed * delta;
                }
                else
                {
                    MoveToCity(world);
                }
                break;

            case AIStatus.Reproduce:
                progress += 1.0f * delta;
                if (progress >= 100 && detectorLocation != null)
                {
                    Creation child = new Creation(position, mind + 2);
                    child.country = country;
                    detectorLocation.creations.Add(child);
                    Console.WriteLine("Detector population is now {0}", detectorLocation.creations.Count);
                    progress -= 100;
                    world.IncreaseTens(0.005f, country);
                }
                break;
            }
        }