#[Сокровищница]

Ответ на пост: На волне "Нелицеприятный"

41

Ответ на пост На волне "Нелицеприятный"

Воспоминание разблокировано!

Происходило это в весьма позднем детстве. Лето. Мне почти четырнадцать лет. Моя сестра поступила в вуз — и не абы куда, а в Москву! Гордость всей семьи!

Я тогда была созданием более чем невинным и далёким от глубоких познаний дворовых мальчишек о человеческих пороках.

Иду из магазина — и вдруг за мной увязались трое пацанов на пару лет младше. Докапываются: то уродкой назовут, то дурочкой, то лохушкой. Сначала их шугала, а потом стала за ними гоняться с обещаниями поймать и отлупить. А им только этого и надо: разбегаются в разные стороны, хохочут и продолжают дразниться. И тут среди прочих обидных эпитетов вылетает: «Праститутка!»

Я остановилась. Слово это слышала и раньше во дворе — применяли его к уже взрослым и красивым девочкам. Таким же взрослым и красивым, как моя сестра! Так кто же такая праСТИТУТка?.. Наверное, это та, кто учится в инСТИТУТе! — решила я и продолжила гоняться за шпаной, но теперь уже выкрикивая на весь двор:

«Не обзывайтесь так! Праституткой быть хорошо! У меня сестра — праститутка в Москве! И я, когда вырасту, тоже стану праституткой! А вы глупые и ничего не понимаете!»

Народ, к вам вопрос))

Про фотофокс

39

У нас появилась функция опросов.

С одной стороны, мне бы хотелось попробовать голосование за слово для фотофокс проводить с их помощью, чтобы в одном посте сразу были выкачены слова и там на месте уже бы все могли проголосовать, а не искали пост и не разворачивали комменты, чтобы глянуть все выдвинутые слова и поставить им оценку, как это делается сейчас…

Мне это кажется удобным. Но есть одно НО :D

Я не могу сообразить, как изменить механику начала выбора этих слов. Ибо если оставить всё так же, то получится странно, ведь по привычке, скорее всего, люди будут голосовать +/- в комментах и если я буду выкатывать эти слова потом опросом для повторного голосования - тоже неправильно.

Может быть, у кого-то найдутся мысли, как можно переебать систему, чтобы подрубить к выбору слова опросы? У меня чёт пока не приходит в голову.

Или, может, вообще не стоит ничего менять?

Обкатаем спрашивалку?

ВНИМАНИЕ!!!! ВАРНИНГ!!! МАТЮКИ!!!!

36

Ну что, дорогие мои детишечки, пришло время заняться серьезными вещами и немножечко напрячь свой мозг, который у вас большой, огромный, как у доцентов.

Давайте-ка начнем с чего-нибудь простого и всем известного. Так сказать, разомнем ваши пальчики. Хорошо? нет

Вот вам первый вопрос в качестве тренировки. Давайте думать вместе. Рассуждения и обсуждения, конечно же, происходят в комментариях. Потому что тс может нести хуйню... Уже начал есичо

Но если вы не хотите обсуждать и рассуждать, то просто молча ткните кнопку и идите по своим делам дальше, скролить бесконечную ленту.

Итак.

Фая!

Викторина Выберите 1 вариант

Правильный ответ задан автором.

Что из перечисленного, согласно самой строгой лингвистической трактовке, НЕ является исконно русским матерным корнем (основой трёхэтажной конструкции)?

Хуй
Пизда
Джигурда
Ебать
Блядь

«Танчики» на html5

Отображение карты уровня

41

Следующим этапом сделаем систему отображения тайлов на игровом поле. Мы предполагаем, что у нас есть тайлы разных типов: кирпичи там, бетон, вода, лёд, кусты.

И чтобы эти самые блоки рисовать на игровом поле, нужно ввести сущность карты и самих блоков.

Сущность карты:

class GameMap {
  constructor() {
    // Сетка 26x26 субтайлов
    this.tileGrid = [];
    for (let y = 0; y < GRID_SIZE; y++) {
      this.tileGrid[y] = new Array(GRID_SIZE).fill(TILE_EMPTY);
    }

    // Карта для хранения состояния повреждений разрушаемых тайлов
    this.damageMask = new Map();

    // Флаг необходимости перерисовки фона
    this.dirty = true;
  }
}

Ну и в нашем основном классе надо карту создать:

/** @type {GameMap} */
let gameMap = null;
...
// в методе init
// Создаём и загружаем карту
  gameMap = new GameMap();
  gameMap.loadLevel(TEST_LEVEL_1);

  // Рисуем фон (карта + рамка)
  renderBackground(gameMap);
  gameMap.dirty = false;

При это тестовый уровень сейчас выглядит вот так:

export const TEST_LEVEL_1 = [
  '..........................',  // 0   верхний ряд пустой (под спавн врагов)
  '..........................',  // 1
  '..BB..BB..BB..BB..BB..BB..',  // 2   кирпичные стены
  '..BB..BB..BB..BB..BB..BB..',  // 3
  '..BB..BB..BB..BB..BB..BB..',  // 4
  '..BB..BB..SS..BB..BB..BB..',  // 5   сталь/бетон
  '..BB..FF..SS..FF..BB..BB..',  // 6   лес
  '..BB..FF......FF..BB..BB..',  // 7
  '..BB..BB..BB..BB..BB..BB..',  // 8
  '..BB..BB..BB..BB..BB..BB..',  // 9
  '..........BB..BB..........',  // 10  
  '..........BB..BB..........',  // 11
  '..BB..BB..........BB..BB..',  // 12  
  '..BB..BB..........BB..BB..',  // 13
  '..BB..BB..BB..BB..BB..BB..',  // 14
  '..BB..BB..BB..BB..BB..BB..',  // 15
  '......WW..BB..BB..WW......',  // 16  вода
  '......WW..BB..BB..WW......',  // 17
  '..BB..BB..II..II..BB..BB..',  // 18  лёд
  '..BB..BB..II..II..BB..BB..',  // 19
  '..BB..BB..BB..BB..BB..BB..',  // 20
  '..BB..BB..BB..BB..BB..BB..',  // 21
  '..........BBBBBB..........',  // 22  защита базы
  '..........BBBBBB..........',  // 23
  '..........BBEEBB..........',  // 24  база
  '..........BBEEBB..........',  // 25
];

Не знаю, пока, на сколько такой формат хранения данных корректен и будет удобен в использовании в дальнейшем, но сейчас он по крайне мере очень нагляден и удобен для ручного левел дизайна.

Рисование блоков достаточно просто:

export function renderBackground(gameMap) {
  const ctx = backgroundCtx;

  // Очищаем весь фон
  clearBackground();

  // Рамка игрового поля
  renderGameFieldBorder();

  // Рисуем все непустые тайлы
  for (let y = 0; y < GRID_SIZE; y++) {
    for (let x = 0; x < GRID_SIZE; x++) {
      const tileId = gameMap.getTile(x, y);
      if (tileId === TILE_EMPTY) continue;

      const tileDef = TILE_DEFS[tileId];
      if (!tileDef) continue;

      // Логические координаты → физические координаты на canvas
      const px = GAME_FIELD_X + x * TILE_SIZE * GAME_SCALE;
      const py = GAME_FIELD_Y + y * TILE_SIZE * GAME_SCALE;
      const size = TILE_SIZE * GAME_SCALE;

      ctx.fillStyle = tileDef.color; // цвет в самих тайлах пока храню
      ctx.fillRect(px, py, size, size); // потом буду спрайты рисовать
    }
  }
}

Хранятся тайлы у меня вот таким образом:

TILE_DEFS = {
  [TILE_EMPTY]: {
    id: TILE_EMPTY,
    name: 'empty',
    blocksTank: false,
    blocksBullet: false,
    destructible: false,
    overlay: false,
    color: COLOR_EMPTY // эта вся фигня в константах забита
  },
...

У сущности карты есть метод для загрузки из вот того текстового бреда, который чуть выше скинут

loadLevel(levelData) {
    for (let y = 0; y < GRID_SIZE; y++) {
      for (let x = 0; x < GRID_SIZE; x++) {
        const char = levelData[y]?.[x] || '.';
        this.tileGrid[y][x] = charToTile(char);
      }
    }

    // Инициализируем damageMask для всех разрушаемых тайлов
    this.damageMask.clear();
    for (let y = 0; y < GRID_SIZE; y++) {
      for (let x = 0; x < GRID_SIZE; x++) {
        const tileDef = TILE_DEFS[this.tileGrid[y][x]];
        if (tileDef && tileDef.destructible) {
          this.damageMask.set(`${x},${y}`, DAMAGE_FULL);
        }
      }
    }

    this.dirty = true;
    console.log(`Level loaded. Destructible tiles: ${this.damageMask.size}`);
  }

function charToTile(char) {
  switch (char) {
    case 'B': return TILE_BRICK;
    case 'S': return TILE_STEEL;
    case 'W': return TILE_WATER;
    case 'F': return TILE_FOREST;
    case 'I': return TILE_ICE;
    case 'E': return TILE_BASE;
    default:  return TILE_EMPTY;
  }
}

И вот такой вот получается итог

В целом, уже похоже на правду и с этим можно работать.

план на следующий этап:

ВОТ БЛИН! ЭКСТРЕННОЕ МАСЛЕНИЧНОЕ ОБЪЯВЛЕНИЕ, СОСТАВЛЕННОЕ В СОСТОЯНИИ АГОНИИ ОТ ПЕРЕЕДАНИЯ БЛИНАМИ.

47

Ситуация, товарищи, критическая. ЧП локального, но очень маслянистого масштаба!

ЧТО ПРОИЗОШЛО:

Наша главная по блинной части Лиса демонстрировала высший пилотаж на полевой кухне. Всё шло по плану: блины летали со сковороды, масло брызгало во все стороны, атмосфера праздника. Но в самый ответственный момент она, поскользнувшись на собственном же стратегическом запасе масла, совершила неконтролируемый полёт в подвал. Теперь она там, среди банок с огурцами и старой картошки, а выбраться не может.

Нужна цепь. Длинная, прочная, из постов.

ЧТО ДЕЛАТЬ (ПРАВИЛА БЛИННОЙ ЭСТАФЕТЫ):

Это гонка. Не на скорость, а на длину. Смысл в цепочке.

Ты делаешь пост.

Содержание: Всё, что связано с Масленицей или блинами.

Это может быть:

* Фото своего блина (идеального, комом или угольком).

* Смешная/стыдная история про готовку.

* Исторический экскурс в традиции.

* Стих про сметану.

* Что угодно! Главное — тема.

ОБЯЗАТЕЛЬНЫЙ РИТУАЛ:

В начале поста чётко пишешь: «Эстафету принял(а) у @[имя того, кто тебя позвал]».

В конце поста зовёшь ОДНОГО следующего. Пишешь что-то вроде: «А теперь эстафету передаю тебе, @[имя следующего]! Давай, спасаем лису!»

Твоя миссия завершена. Жди, не позовут ли тебя в другой цепочке или... начни свою цепочку!

Потому что НАЧАТЬ может каждый! Если тебя пока не позвали, но душа требует блинов и славы — просто начни новую цепочку. Напиши пост и позови первого смельчака. Поздравляю, вы уже команда!

ВАЖНЫЕ НЮАНСЫ (ЧИТАТЬ, А ТО ЛИСА НЕ ВЫБЕРЕТСЯ):

Звать можно ЛЮБОГО, даже если он уже бежит в другой цепочке. Это не саботаж, это стратегическое сшивание цепей! Если ты позвал Петю из параллельной ветки, ваши две цепочки мгновенно сливаются в одну мега-цепь. Так и побеждаем.

НЕЛЬЗЯ звать того, кто уже есть в твоей собственной ветке. Это создаст временную петлю, Лиса будет ходить кругами вокруг картошки, и мы все опоздаем к празднику.

ПОДВЕДЕНИЕ ИТОГОВ:

Всё закончится 22 февраля вечером. Мы измерим все цепочки, которые удалось сшить.

Команда с самой длинной цепью получает почётное звание «ВОТ БЛИН ПЕРВОЙ СТЕПЕНИ», а также всеобщее уважение и право первыми есть блины в следующем году.

А Лиса? Чем длиннее общая цепь из всех постов в конце, тем больше у неё шансов ухватиться и выкарабкаться. Так что в выигрыше все. Особенно Лиса. И особенно блины.

Давай, спасем лису! Ей там, среди картошки, одиноко и голодно (все блины остались наверху).

P.S. Если не хотите помогать Лисе, просто представьте: там, в подвале, вместе с ней теперь и всё масло, и последняя банка сгущёнки. Действуйте!