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); } }
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); }