Я "нормально" играл только в одну такую игру -- Thouhou 6 (EoSD).
Итак, что же такое "динамическая сложность" в игре?
Игра постоянно анализирует, насколько хорош игрок. Если игрок хорош -- он получает "усложнение". Если же игра видит, что игрок не справляется, задачу ему упрощают. При этом такой анализ ведётся постоянно -- если на следующем отрезке игрок вдруг начал играть лучше, задача снова усложняется.
В EoSD игромеханика очень бедная, поэтому "анализ" и "сложность" реализованы незамысловато: -- Если умер, то становится меньше пуль, плюс они летят медленнее. -- Если долгое время не умираешь, сложность постепенно нарастает до определённого предела, после чего становится постоянной.
Есть ещё NetHack. Там есть элемент динамической сложности: чем более прокачанный игрок, и чем глубже он забрался, тем более сильных мобов ему присылает игра. Это, однако, не может считаться динамической сложностью в полном смысле слова, поскольку: -- при правильной стратегии NetHack в течение каждой катки упрощается, а не усложняется, т.е. повышение сложности компенсируется. -- сложность не зависит от качества игры игрока, если только качеством не считать сам факт выживания. -- даже если считать, смерть приводит к концу игры, поэтому "упрощение" для плохих игроков невозможно.
Сюда же относятся игры, где сложность только растёт, например, увеличивается скорость в тетрисе. Впрочем, именно в тетрисе есть большой простор по созданию "добрых" и "злых" генераторов деталек, но это отдельная тема. Такими способами можно реализовать динамическую сложность.
Если вы знаете другие игры с динамической сложностью (кроме Doom Eternal, о котором мне рассказали сегодня), сообщите, пожалуйста, как там это реализовано.
Так вот, динамической сложностью я недоволен. Вот причины: 1. Статическая сложность это определённая "планка", "челлендж", который надо преодолеть. Это приносит чувство удовлетворения. Если же ты преодолел динамическую сложность, то... что ты преодолел? Ты преодолел свою индивидуальную планку. Но достижение ли это, когда специально для тебя планку понизили? Как мериться с другими? 2. Динамическая сложность наказывает (!) хороших игроков. Это вызывает ощущение несправедливости. Обычно за хорошую игру, вообще-то, положены бонусы. 3. Игра подыгрывает плохим игрокам. Это нечестность другого рода. Во-первых меня, как плохого игрока, жалеют, а жалости вашей мне не надо. Если бы я не хотел порвать жопу на этом боссе, я бы просто не запускал игру. Во-вторых, игра с челленджем (в смысле, игра "на прохождение", а не "песочница") -- это распределение ролей. Разработчики ставят перед игроками задачу, а игроки её решают. Подыгрывание -- это нарушение роли.
Я недавно упражнялся по поводу того, что оплата штрафов "со скидкой" -- это как "товар по акции". Так что вы думаете, если оплачивать штраф через интернет по карте, то в смс-ке так и пишут -- "Покупка SHTRAFI GIBDD".
Маску я надеваю, когда захожу в магазин. Когда просто по улице иду -- нос освобождаю. И то, мужики на скамеечке у магазина смеются -- ишь какой, в маске и перчатках идёт.
А на улице ремонт. Я мимо шёл, а рабочий с болгаркой вдруг ВЖЖЖЖ. И поднялось облако пыли. После пары непечатных мыслей я начинаю думать, что надо бы раздобыть противогаз. А потом понимаю, что противогаз-то у меня уже есть. И надвигаю маску на нос.
Поставил старый жёсткий диск в новый комп -- не грузится. Решил, что это из-за того, что железо слишком новое. Наверное, надо винду с 7 до 10 обновить. С нуля ставить не хотел, надо было сохранить установленные программы.
Запускаю установщик, а он мне пишет, что если вместо чистой установки я хочу "обновление", то установку надо вызывать из-под запущенной старой версии! А она не запускается.
***
Дело было не совсем в железе. Это был STOP 0x7B, INACCESSIBLE_BOOT_DEVICE. На решение этой проблемы можно потратить несколько дней. Поэтому коллега решил установить винду на другой винт.
MFC -- фреймворк устаревший, написанный вразрез с парадигмой ООП. Тем не менее, на нём у нас крутятся проекты. Особенность этого фреймворка в том, что он очень близок к чистому WinAPI. И знание основ WinAPI может помочь определить, в чём проблема.
Евгений Евгеньевич, наш доктор наук, рассказывает, что интуиция -- это, в первую очередь -- опыт. Чем больше различных ситуаций ты видел, тем быстрее ты догадаешься о решении в сходной или даже новой ситуации.
Я так уклончиво начинаю, а что случилось-то? История крайне странная.
Создаю чекбокс. Мне надо, чтобы при клике на чекбокс производились определённые действия. Пишу действия -- это называется "обработчик". Обработчик не вызывается. В окне есть другой чекбокс, со своим обработчиком -- он прекрасно вызывается. Никакой разницы между чекбоксами нет. Переименовал чекбокс, создал новый обработчик -- не помогает. В чём же дело?
Тогда я полез проверять идентификаторы чекбоксов. Идентификатор -- это просто число, которое уникально для каждого элемента управления в окне. Как же происходит нажатие кнопки в WinAPI? (а кнопка и чекбокс с точки зрения WinAPI отличаются слабо).
Когда пользователь нажимает кнопку, генерируется сообщение, например, WM_COMMAND. Это сообщение ставится в очередь сообщений для того окна, где нажали кнопку. Цикл обработки сообщений на очередной итерации узнает, что произошёл щелчок. Но как он узнает, по какой кнопке щёлкнули? А вот у каждого сообщения есть "параметр" и этот параметр содержит идентификатор кнопки.
MFC и вижуал студия хорошо назначают идентификаторы только когда вы рисуете окно с нуля и ничего в нём не переделываете. Много ума для этого не надо. Когда же вы начинаете удалять элементы управления, студия за вами не "подчищает" мусор. Это надо делать самому. И для этого надо понимать, что и где чистить. Ситуация парадоксальная: ломать сложнее, чем строить.
ОКАЗАЛОСЬ
Много лет назад в диалоговом окне, где я рисовал чекбокс, уже была кнопка с идентификатором 1016. Потом её удалили. А идентификатор и обработчик нажатия остались. Когда я добавил новый чекбокс, студия посмотрела, какие идентификаторы не заняты? Ага, 1016 не занят ни одной кнопкой. Ставим его.
И тут в игру вступил притаившийся устаревший обработчик. Хотя у меня и было указано, что вызывать надо новый, но мои указания были в самом конце таблицы вызовов. А при поиске обработчика таблица просматривается с начала. При клике на чекбокс вызывался обработчик старой, давно удалённой кнопки! Ну и когда я его удалил -- всё заработало.
Если (когда) дайари закроется, по этим адресам я напишу о том, куда переехал.
Насколько понимаю, многие с дайари уходят или на блог-хаус или на дыбр. Как по вашим наблюдениям, записи с которого из них лучше ищутся гуглом? Какие есть ещё варианты?
***
Хочу отметить перспективность телеграма самого по себе. С 2011 года я набрал 70 читателей на дайари. В телеграме же я набрал 30, но с 2018 года. Короче говоря, можете меня поздравить, сегодня моя суммарная аудитория впервые достигла 100 человек.
Опять я борюсь с типами в Си, но в этот раз борьба получилась... поучительной, что ли.
Поскольку проверить, что конкретно зашито в микроконтроллер, нелегко, как правило в прошивку добавляется команда, возвращающая номер версии. У меня по основному проекту такой функции долго не было -- и я мучился. Потом я такую функцию добавил. Вместо номера версии я решил хранить дату коммита. Для хранения я выбрал целое число (int32). Дата содержит восемь цифр, YYYYMMDD, поэтому 32-битный тип вполне подходит для её хранения.
Далее, дату надо как-то получать. У меня уже была готовая функция для чтения и записи параметров в микроконтроллер, но поскольку контроллер работает и с некоторой математикой, для единообразия я получал и записывал данные как float (32 бита). Целые числа тоже перегонялись во флоат и обратно. Я знаю, как устроен тип флоат, и как с ним работать, поэтому я мог быть уверен, что целые числа будут гоняться туда-сюда без погрешностей.
На самом деле я знал это не досконально, а именно, я не помнил конкретное число бит под мантиссу и порядок.
Один из коммитов был первого июля. Дата: 20210701. Однако, когда я решил получить номер версии у прошитого микроконтроллера, я с удивлением получил несуществующий день, а именно, 20210700. Почему же? Я открыл интернет и обнаружил, что под мантиссу в типе float выделяется 23 бита (24 неявно), что в пересчёте на десятичные числа даёт 7-8 значащих цифр (знак хранится отдельно, поэтому можно рассчитывать на сохранение чисел от -16777215 до 16777215). 20210701 превышает максимальное число, которое можно хранить без потерь. И в рамках типа float это необоримо.
Остаётся только не хранить ведущие цифры года, поскольку и так понятно, что они будут "20". Шесть цифр я могу хранить гарантированно.
Надо было совершить техническую поездку на дачу. Холодильник ещё не включен. Хотя часто говорят, что в жару холодное пить не надо, потому что холодная вода не усваивается, но всё равно холодненького хочется. Обещали +35.
Как взять с собой холодненькое? Мама предложила заморозить бутылку, а ко времени употребления она как раз оттает. Я видел, как тают замороженные бутылки, поэтому полагаю, что её решение бы не сработало. Но это навело меня на идею получше.
Термос подходит не только для сохранения тепла, но и холода. И! В термос можно положить лёд кубиками. А потом этим льдом охлаждать уже всё, что хочется.
Уже не раз замечал, что когда начинаешь чем-нибудь интересоваться, обнаруживаешь в окружающей реальности дополнительный "слой", который содержит информацию по теме. Ты раньше проходил мимо и ничего не видел -- а теперь видишь.
Очень чётко я это в своё время ощутил, когда ходил в автошколу. До этого улицы -- это были просто улицы. После автошколы они оказались определённой структурой, натянутой на город. Эта структура осмысленная -- и теперь я могу её читать.
Но вот ещё один пример. В продуктовых магазинах я бывал периодически -- брал там что надо. Однако, видел при этом я лишь малую долю того, что там есть. Когда я стал учиться готовить, я старался каждое следующее блюдо брать с каким-нибудь незнакомым ингредиентом (и сейчас делаю так же). После этого такая простая, казалось бы, вещь, как супермаркет, преобразилась. Я по-прежнему знаю очень не всё, но теперь вижу полки иначе -- и оказывается, что в супермаркете есть мноооого всего -- и теперь понятно, что это, и зачем.
Но бывают и более интересные случаи, когда того, что тебе нужно -- нет. И ты такой -- это как так нет? Это же, блин, не вяленые собачьи уши. Не консервированные рыбьи голоса в птичьей слюне. А вот так -- нет. Топай в другой магазин.
Новый прикол у постаматов Озона -- при выдаче товара показывают сообщение о том, что не следует оставлять товар в ячейке, если вы хотите его вернуть. Иначе, типа, мы не сможем вернуть вам деньги. Что это значит?
1) Кто-то так уже делал. 2) Это чертовски логично.
И тут у меня вопрос. А почему, блин, действительно нельзя сделать возврат через ячейку постамата? Вот я стою, получаю товар, он не тот. А я уже стою перед открытой ячейкой.
Текущая схема возврата иная. Я должен оформить возврат на сайте, потом прийти в отделение с живым человеком и сдать товар ему.
Да, схема с мгновенным возвратом через постамат усложняет логистику Озону. Но текущая схема усложняет логистику МНЕ.
Необычность этого сериала про попаданцев заключается в двух вещах: 1) Это сериал про девочку и для девочек; 2) В другой мир попадают две девочки но... они почти не контактируют друг с другом!
Что думаю
Особенностей на самом деле больше. Классический попаданец -- это Мэри Сью. Сэй в данном случае исключением не стала. Однако, в отличие от большинства других попаданцев, она не сражается на передовой. Её основное назначение -- маг поддержки. Много ли вы помните исекаев, где гг -- маг поддержки?
Далее. Я люблю всякое злое и противное, поэтому я постоянно ждал подставы среди своих. Но нет. Все "свои" оказались добрейшей души людьми. И даже заговоры у них няшные. Главный злодей среди своих -- это верховный маг, которым движет научное любопытство. Но даже он грамотно расставляет приоритеты и держит себя в руках (хотя на лице проскакивает).
И ещё одно -- девица РАБОТАЕТ. Не приключается, не учится в школе, не чиллит. Это очень клёво. Попаданцы редко находят в новом мире нормальную работу, потому что про это будет скучно смотреть/читать.
А тут не скучно. Сериал получился спокойным, добрым и довольно интересным.
Что я отнёс бы к недостаткам: хотелось бы, чтобы Сэй умела применять больше видов магии. Ну, ещё научится. Потому что история не то чтобы недорассказана. Она вообще -- едва началась.
Сэй начинает как девочка в очках, но потом, увы, очки снимает.
Думаете, что это? Это магическая артель, где маги на потоке производят артефакты.
SHAFT
Госпиталь с белым флагом. Для кого флаг? Зло в этом сериале недоговороспособно и, скорее всего, неразумно.
:3
Занимать целый класс для индивидуальных занятий?..
Когда сестра была маленькая, однажды бабушка надевала на неё шубу, а потом стала завязывать шнурок на капюшоне. Сестра кричит: Бабушка, не затягивай! А бабушка, проделывая примерно то же, что изображено на скриншоте, ответила: да я и не затягиваю!
Когда у огнетушителя в машине кончился срок годности, я купил новый. Я читал, что есть углекислотные, а есть порошковые. Углекислотные меньше портят вещи, когда ими тушишь. Поэтому я хотел купить углекислотный. И купил.
Оказалось, что он очень большой. У порошковых распылитель очень маленький, а у углекислотного -- огромный чёрный конус. Из-за технологии распыления поменять один на другой нельзя.
Поэтому я плюнул на "меньше портят вещи" и купил в машину порошковый, который при таком же об'ёме распыляемого вещества (для машин положено 2 кг) места занимает гораздо меньше. А что же делать с углекислотным?
Я его положил в квартиру на видное место. На всякий пожарный.
Сегодня я услышал из прихожей непонятные щелчки. Я пошёл слушать поближе и обнаружил, что щёлкает как раз огнетушитель. Была идея, что он начал течь из-за повышенного внутреннего давления, которое появилось из-за жары. Но сейчас не так жарко, как было неделю назад, а тогда он не щёлкал. На многих огнетушителях есть манометр, показывающий, норм там давление или нет. На моём такого манометра не было.
Ну и что с ним делать? Даже если устранить течь кустарными методами -- непонятно, насколько он пригоден к употреблению. Заправка огнетушителей -- геморрой. В общем, выбросил я его.
Не помню, писал об этом или нет, но написать ещё раз -- лишним не будет.
Почему я повесил на работе рядом со столом таблицу приоритетов операций в Си/Си++? Потому что не все они очевидны -- и я на этом накалывался.
Главный прикол для меня -- это битовые операции. Например, проверим, чему равен последний бит числа:
if(a&0x1==1) //если последний бит числа установлен, то сделать что-либо
Как бы не так. Битовые операции имеют приоритет НИЖЕ, чем сравнение. Видимо, считается, что они являются аналогами обычных логических операций, таких как &&, однако это не так. Битовые операции ближе к арифметическим. А арифметические выше, чем сравнения. Противоречие.
Как же выполняется это условие?
if(a&(1==1)) //...
Вот так. По чудесному стечению обстоятельств эта конструкция будет работать. Но если бы мы, к примеру, проверяли предпоследний бит, нас бы ждал сюрприз.
Я уже как-то раз писал, что мошенники перед тем, как попытаться развести клиента, могут ему рассказывать о том, какие виды мошенничества бывают -- и как им противостоять. Это вызывает доверие, потому что кажется, что мошенник, предупреждающий о мошенничестве, действует против себя. А значит, человек, предупреждающий о мошенничестве, мошенником не является. Однако это не так. Если у вас что-либо непроверяемое вызывает доверие, то мошенник не просто может, но и будет это использовать.
Звонки о поверке водосчётчиков уже замучили, минимум раз неделю звонят точно. Но недавно пришло письмо в почтовый ящик. Письмо выглядит как официальное письмо от управляющей компании или ЕПД. В нём содержится предупреждение о мошенничестве. Глядя на письмо я уже стал сомневаться -- блин, а вдруг это нормальная поверка счётчиков? Забил телефон в гугл. И... нет, это всё-таки были мошенники. Примеры писем, приходящих от них, можно посмотреть вот в этой группе:
А теперь, внимание. У нас действительно скоро наступает срок поверки водосчётчиков. И... а к кому обратиться для поверки? Телефон конторы, в которую папа звонил в прошлый раз, он потерял. А попробуй загуглить "поверка счётчиков" -- и стооолько мошенников найдёшь. Придётся внимательно изучать отрицательные отзывы, видимо.
Собирали с папой на даче водопровод. Мы собираем его каждый год, а осенью разбираем. Такова традиция.
Водопровод полностью уличный. Он начинается у точки входа на участок и проходит примерно 3/4 его длины. Имеется четыре крана различного назначения.
Водопроводу лет пятьдесят. Резьбовые соединения изнашиваются. Иногда приходится дорезать сантиметр резьбы (внешней), а изношенную часть отпиливать. Так и случилось в этот раз.
Закручиваю очередной участок -- резьба срывается. Идём к верстаку, нарезаем, отпиливаем. По виду диаметр резьбы увеличился чуть ли не на миллиметр. Папа обёртывает льном резьбу и пытаемся вкрутить. Резьба опять срывается. Это очень странно, поскольку от увеличения резьбы ситуация обязана была улучшиться.
Мне в голове приходит идея, что дело было не во внешней резьбе, а во внутренней, она тоже изношена. А если внешнюю можно легко дорезать, то с внутренней ничего не сделаешь. Требовалась замена уголка, в который вкручивалась труба. С собой уголка у нас не было.
Папа говорит -- давай я сейчас слой льна сделаю ПОТОЛЩЕ. И сделал. И это тоже не помогло. Ещё несколько попыток закручивания ничего не дали, но обнаружилась странная деталь: если до ремонта трубы резьба "заходила", но потом "срывалась", то после ремонта резьба даже не начинала заходить. Крути сколько хочешь, потом дёргай трубу -- и она выпадает. Эта картина не соответствует типичному "срыву" резьбы.
Я говорю -- слушай-ка, убери лён, давай попробуем так вкрутить. И мы попробовали. И резьба прекрасно зашла, вкрутилась и затянулась.
Естественно, без пропитанного льна водопровод эксплуатировать нельзя, поэтому мы всё опять раскрутили. И в этот раз папа уже сделал слой льна не потолще, а наоборот -- потоньше. И после этого уже проблем не возникало.
То есть, ОКАЗАЛОСЬ, что резьба не срывается, а наоборот -- не лезет.
Не уверен, что мой совет кому-то поможет, но уж для себя я его запишу.
Периодически приходится править код по удалёнке. У меня во всех средах разработки стоит шрифт Courier New. Я к нему привык и я его люблю. Но вот незадача: когда разрешение удалённого компьютера больше, чем разрешение местного, Courier New начинает не просто выглядеть как говно, он становится еле различим. Какое-то время я ломал глаза, но потом обнаружил, что есть другой моноширинный шрифт -- Consolas. И вот он НОРМАЛЬНО выглядит при любом сжатии изображения. Да, он не такой красивый, но целостность глаз важнее.
Папа переболел официально. На одной из работ его отправили на удалёнку как 65+, но при этом обязали привиться. Папа был недоволен. Записался к терапевту, чтобы выяснить, не может ли он получить мед. отвод по какой-либо причине.
У терапевта ему сказали, что терапевт мед. отводы не даёт. Для этого надо встать в отдельную очередь на получение отвода. Очередь живая и очень большая. Смешно, наверное, заразиться в такой очереди.
Врачу папа сказал, что официально переболел в апреле, после чего ему выдали справку о том, что он имеет временный отвод на 4 месяца. Отдельно было указано, что наличие коронавируса у него было подтверждено лабораторно.
Таким образом, официально перенесённый коронавирус ЯВЛЯЕТСЯ мед. отводом от прививки.
Еду по главное дороге, другая машина приближается по второстепенной. Я вижу, что она не тормозит, а конкретнее -- не уступает мне дорогу.
Кидаться под машину я не хочу (тем более, что одна из них была огромным автобусом), поэтому тормозить начинаю я. Да, мне должны уступить, но если не уступают -- я настаивать не буду.
И тут машина, едущая за мной, начинает мне гудеть! Один из водителей вообще, когда меня обогнал, стал на меня орать. Вот что хотели те, кто сзади ехал? Чтобы я таки рискнул? Я и так не очень аккуратно вожу. Я бы, может быть, и проскочил бы, а им-то уж точно пришлось бы тормозить.