コード例 #1
0
ファイル: Program.cs プロジェクト: odraencoded/ld22-brains
        static void MaekCity(int width, int height, int scale, int zmbCount, int zmbHealth, out bool[,] city, out Zombie[] zmbz)
        {
            city = new bool[width, height];
            zmbz = new Zombie[zmbCount];

            int livezmbz = 0;

            for (int i = 0; i < width * height; i++)
            {
                int cx = i % width;
                int cy = i / width;
                if (cx == 0 || cy == 0 || cx == width - 1 || cy == height - 1)
                {
                    city[cx, cy] = true;
                }
                else if (cx % 2 == 0 || cy % 2 == 0)
                {
                    city[cx, cy] = true;
                }
                else
                {
                    city[cx, cy] = false;
                }
            }

            for (int i = 0; i < width * height; i++)
            {
                int cx = i % width;
                int cy = i / width;

                if (cx == 0 || cy == 0 || cx == width - 1 || cy == height - 1)
                {
                    continue;
                }
                else if (cx % 2 == 0 && cy % 2 == 0)
                {
                    city[cx, cy] = true;

                    bool hasWall = !(city[cx + 1, cy] && city[cx - 1, cy] && city[cx, cy + 1] && city[cx, cy - 1]);

                    if (!hasWall)
                    {
                        int roll = rnd.Next(4);

                        if (cx == 2)
                        {
                            if (roll == 0)
                            {
                                city[cx - 1, cy] = false;
                            }
                            if (roll == 1)
                            {
                                city[cx + 1, cy] = false;
                            }
                        }
                        else
                        {
                            if (roll == 0 || roll == 1)
                            {
                                city[cx + 1, cy] = false;
                            }
                        }
                        if (cy == 2)
                        {
                            if (roll == 2)
                            {
                                city[cx, cy - 1] = false;
                            }
                            if (roll == 3)
                            {
                                city[cx, cy + 1] = false;
                            }
                        }
                        else
                        {
                            if (roll == 2 || roll == 3)
                            {
                                city[cx, cy + 1] = false;
                            }
                        }
                    }
                }
            }

            int zi   = 0;
            int zmbw = width / 2 + 1;
            int zmbh = height / 2 + 1;

            int copx = zmbw / 2;
            int copy = zmbh / 2;

            while (livezmbz < zmbCount)
            {
                int zx = zi % zmbw;
                int zy = zi / zmbw;

                int iCanHazZmb = Math.Abs(zx - copx) + Math.Abs(zy - copy);

                if (iCanHazZmb > 0)
                {
                    Zombie neoZmb = zmbz[livezmbz] = new Zombie();

                    neoZmb.x = zx * scale * 2 + rnd.Next(scale);
                    neoZmb.y = zy * scale * 2 + rnd.Next(scale);

                    neoZmb.hp = zmbHealth;

                    livezmbz++;
                }

                zi = (zi + 1) % (zmbw * zmbh);
            }
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: odraencoded/ld22-brains
        static bool GAEM(int level, ref int score)
        {
            long      freq      = Stopwatch.Frequency;
            const int bulletSpd = 3;
            const int cityScale = 32;
            const int zmbStpdty = frameLimit;
            const int zmbSight  = 48 * 48 + 48 * 48;

            int zmbHealth, zmbCount, zmbTeethPower, bulletDmg, bulletRate, totalBrains;
            int cityW, cityH;

            if (level == 0)
            {
                cityW = 17;
                cityH = 13;

                zmbHealth     = 0;
                zmbCount      = 0;
                zmbTeethPower = 0;
                bulletDmg     = 0;
                bulletRate    = 6;
                totalBrains   = 100;
            }
            else
            {
                if (level < 4)
                {
                    cityW      = 5;
                    cityH      = 5;
                    zmbHealth  = frameLimit * 2 + 1;
                    bulletDmg  = frameLimit * 2;
                    bulletRate = 10;

                    zmbCount = 22 * level;
                    if (level == 3)
                    {
                        zmbCount += 22;
                    }
                }
                else
                {
                    if (level < 7)
                    {
                        zmbCount = 100 + 19 * (level - 3) + level;
                    }
                    else
                    {
                        zmbCount = 183 + level + 9 * (level - 7);
                    }

                    if (level < 6)
                    {
                        cityW = 9;
                    }
                    else
                    {
                        cityW = 13;
                    }

                    if (level < 8)
                    {
                        cityH = 5;
                    }
                    else
                    {
                        cityH = 9;
                    }

                    zmbHealth  = frameLimit * level / 3;
                    bulletDmg  = frameLimit;
                    bulletRate = 11 - level / 2;
                }

                zmbTeethPower = level;
                totalBrains   = frameLimit * (5 + level);
            }

            // Pseudo player class
            int nomedBrains = 0;
            int reload = 0;
            int px, py;
            int pimg = 0;

            int bspdx = 0;
            int bspdy = bulletSpd;

            List <Bullet> manyBullets = new List <Bullet>();
            List <Zombie> manyZombies = new List <Zombie>();

            bool[,] city = null;
            Zombie[] ctyzmbz = null;

            MaekCity(cityW, cityH, cityScale, zmbCount, zmbHealth, out city, out ctyzmbz);
            manyZombies.AddRange(ctyzmbz);

            px = cityW * cityScale / 2;
            py = cityH * cityScale / 2;

            while (nomedBrains < totalBrains)
            {
                GL.Clear(ClearBufferMask.ColorBufferBit);

                long frameStart = Stopwatch.GetTimestamp();

                epicWINdow.ProcessEvents();

                if (!epicWINdow.Visible || epicWINdow.Keyboard[Key.Escape])
                {
                    Quit = true;
                    break;
                }

                int  pmx  = 0;
                int  pmy  = 0;
                bool FIRE = false;

                if (epicWINdow.Keyboard[Key.Up])
                {
                    pmy -= 1;
                }
                if (epicWINdow.Keyboard[Key.Down])
                {
                    pmy += 1;
                }
                if (epicWINdow.Keyboard[Key.Left])
                {
                    pmx -= 1;
                }
                if (epicWINdow.Keyboard[Key.Right])
                {
                    pmx += 1;
                }

                reload--;
                if (reload < 0 && (epicWINdow.Keyboard[Key.Space] || epicWINdow.Keyboard[Key.ControlLeft] || epicWINdow.Keyboard[Key.ShiftLeft]))
                {
                    reload = frameLimit / bulletRate;
                    FIRE   = true;
                }

                MoevDoll(ref px, ref py, ref pimg, 5, pmx, pmy, cityScale, cityW, cityH, city);

                if (pmx != 0 || pmy != 0)
                {
                    bspdx = pmx * 3;
                    bspdy = pmy * 3;

                    if (pmy < 0)
                    {
                        pimg = 3;
                    }
                    else if (pmx > 0)
                    {
                        pimg = 2;
                    }
                    else if (pmx < 0)
                    {
                        pimg = 1;
                    }
                    else
                    {
                        pimg = 0;
                    }
                }

                if (FIRE)
                {
                    Bullet neoBullet = new Bullet();

                    neoBullet.x = px + rnd.Next(-1, 1);
                    neoBullet.y = py - 2 + rnd.Next(-1, 1);

                    neoBullet.sx = bspdx;
                    neoBullet.sy = bspdy;

                    manyBullets.Add(neoBullet);

                    pewPewSnd.Play();

                    if (level > 0)
                    {
                        score--;
                    }
                }

                for (int i = 0; i < manyBullets.Count;)
                {
                    Bullet blt = manyBullets[i];

                    blt.img = rnd.Next(4);

                    blt.x += blt.sx;
                    blt.y += blt.sy;

                    bool remove = false;

                    if (blt.x < 0 || blt.x >= cityW * cityScale || blt.y < 0 || blt.y >= cityH * cityScale)
                    {
                        remove = true;
                    }
                    else if (blt.x < px - 160 || blt.x > px + 160 || blt.y < py - 90 || blt.y > py + 90)
                    {
                        remove = true;
                    }
                    else
                    {
                        int ctx = blt.x / cityScale;
                        int cty = blt.y / cityScale;

                        if (!city[ctx, cty])
                        {
                            remove = true;
                            timTimSnd.Play();
                        }
                    }
                    if (remove)
                    {
                        manyBullets.RemoveAt(i);
                    }
                    else
                    {
                        i++;
                    }
                }

                bool nomed = false;

                for (int i = 0; i < manyZombies.Count;)
                {
                    Zombie zmb = manyZombies[i];

                    zmb.thinkCooldown--;
                    if (zmb.thinkCooldown <= 0)
                    {
                        int dist = (zmb.x - px) * (zmb.x - px) + (zmb.y - py) * (zmb.y - py);

                        if (dist < zmbSight)
                        {
                            zmb.tx = px + rnd.Next(-16, 17);
                            zmb.ty = py + rnd.Next(-16, 17);

                            zmb.thinkCooldown = zmbStpdty / 3;
                        }
                        else
                        {
                            zmb.tx = zmb.x + rnd.Next(-64, 65);
                            zmb.ty = zmb.y + rnd.Next(-64, 65);

                            zmb.thinkCooldown = zmbStpdty;
                        }

                        zmb.thinkCooldown += rnd.Next(-zmbStpdty / 4, zmbStpdty / 4);
                    }
                    zmb.rightFoot = !zmb.rightFoot;

                    if (zmb.rightFoot)
                    {
                        int zmx = 0;
                        int zmy = 0;

                        if (zmb.tx > zmb.x + 2)
                        {
                            zmx = 1;
                        }
                        if (zmb.tx < zmb.x - 2)
                        {
                            zmx = -1;
                        }
                        if (zmb.ty > zmb.y + 2)
                        {
                            zmy = 1;
                        }
                        if (zmb.ty < zmb.y - 2)
                        {
                            zmy = -1;
                        }

                        MoevDoll(ref zmb.x, ref zmb.y, ref zmb.img, 5, zmx, zmy, cityScale, cityW, cityH, city);
                    }
                    bool hit = false;

                    for (int j = 0; j < manyBullets.Count; j++)
                    {
                        Bullet blt = manyBullets[j];

                        if (blt.x >= zmb.x - 4 && blt.x <= zmb.x + 4 && blt.y >= zmb.y - 2 && blt.y <= zmb.y + 6)
                        {
                            hit     = true;
                            zmb.hp -= bulletDmg;
                            manyBullets.RemoveAt(j);
                            break;
                        }
                    }

                    if (hit)
                    {
                        tumTumSnd.Play();
                        score += 2;
                    }
                    else if (zmb.hp < zmbHealth)
                    {
                        zmb.hp++;
                    }

                    if (zmb.hp <= 0)
                    {
                        manyZombies.RemoveAt(i);
                        score += level * 5;
                    }
                    else
                    {
                        if (px >= zmb.x - 5 && px <= zmb.x + 5 && py >= zmb.y - 2 && py <= zmb.y + 5)
                        {
                            nomed        = true;
                            nomedBrains += zmbTeethPower;
                        }
                        i++;
                    }
                }

                if (nomed)
                {
                    chompChompSnd.Play();
                }

                if (!nomed && nomedBrains > 0)
                {
                    nomedBrains--;
                }

                int cx = px;
                int cy = py;

                if (cx - 160 / 2 < 0)
                {
                    cx = 160 / 2;
                }
                if (cx + 160 / 2 > cityScale * cityW)
                {
                    cx = cityScale * cityW - 160 / 2;
                }
                if (cy - 90 / 2 < 0)
                {
                    cy = 90 / 2;
                }
                if (cy + 90 / 2 > cityScale * cityH)
                {
                    cy = cityScale * cityH - 90 / 2;
                }

                SetCamera(cx, cy, 160, 90);

                // Draw city
                GL.BindTexture(TextureTarget.Texture2D, leCtyTexName);
                GL.Begin(BeginMode.Quads);
                for (int i = 0; i < cityW * cityH; i++)
                {
                    int ctyx = i % cityW;
                    int ctyy = i / cityW;

                    if (city[ctyx, ctyy]) // Road
                    {
                        if ((ctyx > 0 && city[ctyx - 1, ctyy]) && (ctyx < cityW - 1 && city[ctyx + 1, ctyy]) &&
                            !(ctyy > 0 && city[ctyx, ctyy - 1]) && !(ctyy < cityH - 1 && city[ctyx, ctyy + 1]))
                        {
                            if ((ctyy > 0 && city[ctyx - 1, ctyy - 1]) || (ctyy < cityH - 1 && city[ctyx - 1, ctyy + 1]))
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale, 0, 32, 0, 0, 16, 128, 128);
                                DrawSqr(ctyx * cityScale, ctyy * cityScale + 16, 0, 48, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale, 0, 0, 0, 0, 16, 128, 128);
                                DrawSqr(ctyx * cityScale, ctyy * cityScale + 16, 0, 16, 0, 0, 16, 128, 128);
                            }

                            if ((ctyy > 0 && city[ctyx + 1, ctyy - 1]) || (ctyy < cityH - 1 && city[ctyx + 1, ctyy + 1]))
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale, 16, 32, 0, 0, 16, 128, 128);
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale + 16, 16, 32 + 16, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale, 16, 0, 0, 0, 16, 128, 128);
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale + 16, 16, 16, 0, 0, 16, 128, 128);
                            }
                        }
                        else if (!(ctyx > 0 && city[ctyx - 1, ctyy]) && !(ctyx < cityW - 1 && city[ctyx + 1, ctyy]) &&
                                 (ctyy > 0 && city[ctyx, ctyy - 1]) && (ctyy < cityH - 1 && city[ctyx, ctyy + 1]))
                        {
                            if ((ctyx > 0 && city[ctyx - 1, ctyy - 1]) || (ctyx < cityW - 1 && city[ctyx + 1, ctyy - 1]))
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale, 32, 32, 0, 0, 16, 128, 128);
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale, 32 + 16, 32, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale, 32, 0, 0, 0, 16, 128, 128);
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale, 32 + 16, 0, 0, 0, 16, 128, 128);
                            }

                            if ((ctyx > 0 && city[ctyx - 1, ctyy + 1]) || (ctyx < cityW - 1 && city[ctyx + 1, ctyy + 1]))
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale + 16, 32, 32 + 16, 0, 0, 16, 128, 128);
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale + 16, 32 + 16, 32 + 16, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale + 16, 32, 16, 0, 0, 16, 128, 128);
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale + 16, 32 + 16, 16, 0, 0, 16, 128, 128);
                            }
                        }
                        else
                        {
                            DrawSqr(ctyx * cityScale, ctyy * cityScale, 64, 0, 0, 0, 32, 128, 128);
                        }
                    }
                    else // Wall
                    {
                        if (city[ctyx - 1, ctyy])
                        {
                            if (city[ctyx, ctyy - 1])
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale, 0, 64, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale, 32, 64 + 16, 0, 0, 16, 128, 128);
                            }

                            if (city[ctyx, ctyy + 1])
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale + 16, 0, 64 + 16, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale + 16, 32, 64 + 16, 0, 0, 16, 128, 128);
                            }
                        }
                        else
                        {
                            if (city[ctyx, ctyy - 1])
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale, 32, 64, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale, 0, 96, 0, 0, 16, 128, 128);
                            }

                            if (city[ctyx, ctyy + 1])
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale + 16, 32 + 16, 64 + 16, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale, ctyy * cityScale + 16, 0, 96 + 16, 0, 0, 16, 128, 128);
                            }
                        }

                        if (city[ctyx + 1, ctyy])
                        {
                            if (city[ctyx, ctyy - 1])
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale, 16, 64, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale, 32 + 16, 64, 0, 0, 16, 128, 128);
                            }

                            if (city[ctyx, ctyy + 1])
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale + 16, 16, 64 + 16, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale + 16, 32 + 16, 64, 0, 0, 16, 128, 128);
                            }
                        }
                        else
                        {
                            if (city[ctyx, ctyy - 1])
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale, 32, 64, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale, 16, 96, 0, 0, 16, 128, 128);
                            }

                            if (city[ctyx, ctyy + 1])
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale + 16, 32 + 16, 64 + 16, 0, 0, 16, 128, 128);
                            }
                            else
                            {
                                DrawSqr(ctyx * cityScale + 16, ctyy * cityScale + 16, 16, 96 + 16, 0, 0, 16, 128, 128);
                            }
                        }
                    }
                }
                GL.End();

                // Draw srszmbzns
                GL.BindTexture(TextureTarget.Texture2D, leZmbTexName);
                GL.Begin(BeginMode.Quads);

                foreach (Zombie zombie in manyZombies)
                {
                    DrawSqr(zombie.x, zombie.y, zombie.img % 2 * 8, zombie.img / 2 * 8, 4, 7, 8, 16, 16);
                }
                GL.End();

                // Draw bltz
                GL.BindTexture(TextureTarget.Texture2D, leShtTexName);
                GL.Begin(BeginMode.Quads);
                foreach (Bullet bullet in manyBullets)
                {
                    DrawSqr(bullet.x, bullet.y, bullet.img % 2 * 8, bullet.img / 2 * 8, 4, 4, 8, 16, 16);
                }
                GL.End();

                // Draw Player
                GL.BindTexture(TextureTarget.Texture2D, leCopTexName);
                GL.Begin(BeginMode.Quads);
                DrawSqr(px, py, pimg % 2 * 8, pimg / 2 * 8, 4, 7, 8, 16, 16);
                GL.End();

                // Draw text stuff
                SetCamera(80, 45, 160, 90);

                GL.BindTexture(TextureTarget.Texture2D, leIcnTexName);
                GL.Begin(BeginMode.Quads);
                DrawSqr(2, 2, 0, 0, 0, 0, 16, 32, 16);
                DrawSqr(160 - 18, 2, 16, 0, 0, 0, 16, 32, 16);
                GL.End();

                GL.BindTexture(TextureTarget.Texture2D, leNmbTexName);
                GL.Begin(BeginMode.Quads);

                if (nomedBrains > 0)
                {
                    DrawNmbs(18, 6, (int)(100.0f / totalBrains * (totalBrains - nomedBrains)), 3);
                }
                else
                {
                    DrawNmbs(18, 6, 100, 3);
                }

                DrawNmbs(160 - 20 - 6 * 3, 6, manyZombies.Count, 3);
                GL.End();

                // Epic swap
                epicWINdow.SwapBuffers();

                if (manyZombies.Count == 0 && level > 0)
                {
                    return(true);
                }

                // System needs his framely resource fix
                long  frameEnd  = Stopwatch.GetTimestamp();
                float frameTime = (float)(frameEnd - frameStart) / freq;

                if (frameTime < 1.0f / frameLimit)
                {
                    Thread.Sleep((int)((1.0f / frameLimit - frameTime) * 1000));
                }
            }

            return(false);
        }