<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>J3tBoy</title><author><name>J3tBoy</name></author><id>https://teletype.in/atom/j3tboy</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/j3tboy?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@j3tboy?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=j3tboy"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/j3tboy?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-25T04:06:56.546Z</updated><entry><id>j3tboy:nintendo_2ds_cia</id><link rel="alternate" type="text/html" href="https://teletype.in/@j3tboy/nintendo_2ds_cia?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=j3tboy"></link><title>Инструкция по запуску игр на Nintendo 3DS.</title><published>2023-10-10T19:39:17.295Z</published><updated>2023-10-10T19:39:17.295Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/96/ab/96ab70e3-ab88-4e59-8879-a0e19c82b46d.png"></media:thumbnail><tt:hashtag>3ds</tt:hashtag><tt:hashtag>2ds</tt:hashtag><tt:hashtag>nintendo</tt:hashtag><tt:hashtag>old_games</tt:hashtag><tt:hashtag>manuals</tt:hashtag><tt:hashtag>retro_games</tt:hashtag><tt:hashtag>retro</tt:hashtag><tt:hashtag>games</tt:hashtag><tt:hashtag>nintendo_ds</tt:hashtag><tt:hashtag>nintendo_3ds</tt:hashtag><tt:hashtag>nintendo_2ds</tt:hashtag><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/dc/81/dc81846c-cd12-4e49-a4d7-4f625f640614.png&quot;&gt;Сегодня будет инструкция о способах запуска ромов на прошитой консоли nintendo 3ds.</summary><content type="html">
  &lt;blockquote id=&quot;yEPi&quot;&gt;&lt;em&gt;Сегодня будет инструкция о способах запуска ромов на прошитой консоли nintendo 3ds.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;nYyl&quot;&gt;Мой интерес к этой консоли возник довольно давно, хотелось посмотреть, что это за портативка такая, с двумя экранами, 3d-эффектом и высоченным ценником. &lt;/p&gt;
  &lt;p id=&quot;qino&quot;&gt;Приобрел я эту консоль только в 2023 году, до нее были GameBoy Advance, классический GameBoy, Nintendo DS fat, Nintendo Switch, несколько портативок от других производителей &lt;strong&gt;и наконец 2DS&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;rUVY&quot;&gt;Вот не сложилось пока посмотреть 3d-эффект, это в перспективе.&lt;/p&gt;
  &lt;p id=&quot;UwNc&quot;&gt;2DS я купил случайно, попалось на авито очень интересное предложение, черно-синяя, в очень приличном состоянии и с прошивкой.&lt;/p&gt;
  &lt;figure id=&quot;SLyC&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/dc/81/dc81846c-cd12-4e49-a4d7-4f625f640614.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;sWgp&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;BKmi&quot;&gt;Покупка прошито консоли для меня всегда интереснее, чем не прошитая по понятным причинам.&lt;/p&gt;
  &lt;p id=&quot;XDWJ&quot;&gt;В моем случае, который является самым обычным, на консоль установлена Luma 3DS. Хорошая штука, не слетает при полном разряде батарейки (не проверял).&lt;/p&gt;
  &lt;p id=&quot;ovKQ&quot;&gt;К основным особенностям относится:&lt;/p&gt;
  &lt;ul id=&quot;0q1M&quot;&gt;
    &lt;li id=&quot;2Art&quot;&gt;запуск ромов, установка dlc;&lt;/li&gt;
    &lt;li id=&quot;kk0m&quot;&gt;отключение региональной защиты;&lt;/li&gt;
    &lt;li id=&quot;LWSp&quot;&gt;установка софта (эмуляторов и прочего);&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;4xuZ&quot;&gt;Собственно, большего мне ничего от приставки и не нужно. Официальный он-лайн мне не актуален, да его и нет вроде как.&lt;/p&gt;
  &lt;h3 id=&quot;JOFK&quot;&gt;Основные форматы rom для 3ds.&lt;/h3&gt;
  &lt;p id=&quot;j342&quot;&gt;В отличии от других приставок, у 3ds ромы бывают нескольких видов:&lt;/p&gt;
  &lt;ul id=&quot;WndF&quot;&gt;
    &lt;li id=&quot;jSmS&quot;&gt;cia - основной формат, запускаемых на Luma3DS;&lt;/li&gt;
    &lt;li id=&quot;AH8V&quot;&gt;3ds - формат ромов для эмулятора citra;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Pc4M&quot;&gt;Причем, более распространент как раз 3ds-формат, некоторые игры в cia просто не найти в инете и их придется конвертировать или играть на эмуляторе.&lt;/p&gt;
  &lt;h3 id=&quot;ZDbQ&quot;&gt;Установка cia&lt;/h3&gt;
  &lt;p id=&quot;iFiH&quot;&gt;С прошитой приставкой шла SD карточка на 16 гб, которая была забита всякой ерундой, типа марио, плюс, куча образов валялось разбросанная по папкам без всякой системы. &lt;/p&gt;
  &lt;p id=&quot;CQht&quot;&gt;Некоторые игры довольно увесистые, по этому, карточку я заменил на 64-гигабайтную, чтоб хватило на все. &lt;/p&gt;
  &lt;p id=&quot;UVEl&quot;&gt;Теперь опишим процесс установки ромов подробно через программу FBI:&lt;/p&gt;
  &lt;ul id=&quot;QICh&quot;&gt;
    &lt;li id=&quot;uCku&quot;&gt;На прямую подключить к компьютеру 2DS нельзя, нужно вынимать SD-карту или настраивать ftp;&lt;/li&gt;
    &lt;li id=&quot;WhnU&quot;&gt;Нужно поместить файлы формата cia в директорию /cias или /cia на sd-карте.&lt;/li&gt;
    &lt;li id=&quot;BgSN&quot;&gt;Возвращаем карточку обратнов в приставку, включаем и запускаем FBI.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;oWyq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4f/aa/4faa279d-c376-46b7-b43a-fc6c031a9490.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;JAUz&quot;&gt;
    &lt;li id=&quot;jg7C&quot;&gt;Выбираем раздел SD&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;vUew&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/44/38/44388df5-5f00-46ee-93dd-f882232792bd.png&quot; width=&quot;1233&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;kVI5&quot;&gt;
    &lt;li id=&quot;LfGG&quot;&gt;Переходим в раздел cias&lt;br /&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;QGql&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/31/26/31263982-8ab0-4095-8582-42486d86e0cc.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;G4bV&quot;&gt;
    &lt;li id=&quot;Iwd2&quot;&gt;Там должен лежать устанавливаемый ром, выбираем его и нажимаем кнопку ( А ) на консоли.&lt;/li&gt;
    &lt;li id=&quot;3P5d&quot;&gt;В разделе &amp;quot;Directory Action&amp;quot; выбираем пункт &amp;quot;Install and delete CIAs&amp;quot;, чтобы после установки ром был удален и не занимал память на карте.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;Chkd&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f0/b9/f0b94e32-c4dc-4bb3-af42-319090a5fc5f.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;E6CH&quot;&gt;Собственно, это все, остается дождаться установки рома, &lt;strong&gt;NEW SOFTWARE HAS BEEN ADDED&lt;/strong&gt;, после чего нажать кнопку &amp;quot;Home&amp;quot;, иконка игры появится в главном меню.&lt;/p&gt;
  &lt;p id=&quot;rOvZ&quot;&gt;С добавлением разобрались, теперь посмотрим, как удалить установленный ром.&lt;/p&gt;
  &lt;h3 id=&quot;0Zpv&quot;&gt;Удаление cia&lt;/h3&gt;
  &lt;p id=&quot;MBpE&quot;&gt;Удалять можно через FBI, но проще через системные настройки.&lt;/p&gt;
  &lt;figure id=&quot;0wHH&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1c/9c/1c9c3f67-4bb1-4d10-9a6c-ce901d1a0959.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;VAgj&quot;&gt;Переходим в раздел &amp;quot;Управленине данными&amp;quot;.&lt;/p&gt;
  &lt;figure id=&quot;1PV8&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d2/f0/d2f0fd76-8e35-4ee4-a51d-14b83cbeebaf.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;QY1C&quot;&gt;Выбираем &amp;quot;Nintendo 3DS&amp;quot;&lt;/p&gt;
  &lt;figure id=&quot;gbDE&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3f/48/3f48f7a6-e3f8-43c4-972d-1c251f0a2488.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Nc92&quot;&gt;Программы&lt;/p&gt;
  &lt;figure id=&quot;hqEa&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/05/b1/05b1c194-9eea-411d-a848-3055fa858766.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;wsqz&quot;&gt;В списке выбираем нужную программу и нажимаем удалить.&lt;/p&gt;
  &lt;figure id=&quot;9inY&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/59/bb/59bb4274-e5df-4206-881e-2e8f806c530a.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;iXXH&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cd/18/cd182bd7-a505-4e4a-ab93-4fa4cb5a6127.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bVvT&quot;&gt;Все, удалили игру.&lt;/p&gt;
  &lt;p id=&quot;oJ3K&quot;&gt;Следующий, самый распространенный формат ромов - 3ds, который на прямую нельзя установить через FBI. Формат этот предназначен для эмулятора Citra, который я и не смотрел, пока он мне не очень интересен.&lt;/p&gt;
  &lt;p id=&quot;SNaf&quot;&gt;Ромов игр в формате 3ds существенно больше, чтобы поиграть на консоли, придется конвертировать в cia.&lt;/p&gt;
  &lt;h3 id=&quot;fp0g&quot;&gt;Конвертирование 3ds в cia&lt;/h3&gt;
  &lt;p id=&quot;oJjQ&quot;&gt;Существует два способа конвертации,&lt;strong&gt; первый - внутри самой консоли&lt;/strong&gt;, но для чего такие заморочки, если все равно нужно вынимать карту памяти? Этот способ ввиду его замороченности я рассматривать не буду.&lt;/p&gt;
  &lt;p id=&quot;99Bv&quot;&gt;Второй способ - нормальный, конверация на компьютере через программу 3ds-to-cia, которая находится по этой вот ссылке &lt;a href=&quot;https://github.com/drizzt/3ds-to-cia/releases/tag/v0.2.1&quot; target=&quot;_blank&quot;&gt;https://github.com/drizzt/3ds-to-cia/releases/tag/v0.2.1&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;hkbb&quot;&gt;В простом случае, ничего, кроме копирования 3ds-рома  в папку &lt;strong&gt;/rom &lt;/strong&gt;и запуска 3ds-to-cia.exe не нужно. В папке &lt;strong&gt;/cia&lt;/strong&gt; появятся сконвертированные файлы. Как с ними поступить дальше - уже понятно. &lt;/p&gt;
  &lt;p id=&quot;gXoG&quot;&gt;Но есть случаи, когда конвертер зацикливается и пишет, что нужен &lt;strong&gt;xorpad, &lt;/strong&gt;что это - мне пока не понятно. &lt;/p&gt;
  &lt;p id=&quot;FEPZ&quot;&gt;Если попадется какая-то интересная игра, которая потребует чуть больше углубиться в процесс конвертации, то инструкция будет дополнена.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;tt-tags id=&quot;1743&quot;&gt;
      &lt;tt-tag name=&quot;3ds&quot;&gt;#3ds&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;2ds&quot;&gt;#2ds&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;nintendo&quot;&gt;#nintendo&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;old_games&quot;&gt;#old_games&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;manuals&quot;&gt;#manuals&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;retro_games&quot;&gt;#retro_games&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;retro&quot;&gt;#retro&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;games&quot;&gt;#games&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;nintendo_ds&quot;&gt;#nintendo_ds&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;nintendo_3ds&quot;&gt;#nintendo_3ds&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;nintendo_2ds&quot;&gt;#nintendo_2ds&lt;/tt-tag&gt;
    &lt;/tt-tags&gt;
  &lt;/section&gt;

</content></entry><entry><id>j3tboy:ngIfElse</id><link rel="alternate" type="text/html" href="https://teletype.in/@j3tboy/ngIfElse?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=j3tboy"></link><title>Как использовать *ngIf совместно с else</title><published>2023-05-25T13:15:57.255Z</published><updated>2023-05-25T13:15:57.255Z</updated><summary type="html">Самая простая форма </summary><content type="html">
  &lt;p id=&quot;3Czc&quot;&gt;Самая простая форма &lt;/p&gt;
  &lt;pre id=&quot;ezDj&quot;&gt;&amp;lt;div *ngIf=&amp;quot;condition&amp;quot;&amp;gt;Контент отображается, если условие истинно&amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;Uwvk&quot;&gt;Расширенный синтаксис &lt;/p&gt;
  &lt;pre id=&quot;YJ8z&quot;&gt;&amp;lt;ng-template [ngIf]=&amp;quot;condition&amp;quot;&amp;gt;
 &amp;lt;div&amp;gt;Контент отображается, если условие истинно&amp;lt;/div&amp;gt;
&amp;lt;/ng-template&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;sEgk&quot;&gt;Использование else&lt;/p&gt;
  &lt;pre id=&quot;urnI&quot;&gt;&amp;lt;div *ngIf=&amp;quot;condition; else elseBlock&amp;quot;&amp;gt;
    Контент отображается, если условие истинно
&amp;lt;/div&amp;gt;

&amp;lt;ng-template #elseBlock&amp;gt;
    Контент отображается, если условие ложно
&amp;lt;/ng-template&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;V4Tc&quot;&gt;Использование блоков then и else&lt;/p&gt;
  &lt;pre id=&quot;FwlV&quot;&gt;&amp;lt;div *ngIf=&amp;quot;condition; then thenBlock else elseBlock&amp;quot;&amp;gt;
    Контент никогда не отображается
&amp;lt;/div&amp;gt;

&amp;lt;ng-template #thenBlock&amp;gt;
    Контент отображается, если условие истинно
&amp;lt;/ng-template&amp;gt;

&amp;lt;ng-template #elseBlock&amp;gt;
    Контент отображается, если условие ложно
&amp;lt;/ng-template&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;UdDq&quot;&gt;Расширенный функционал&lt;/p&gt;
  &lt;pre id=&quot;KpGv&quot;&gt;&amp;lt;ng-template 
   [ngIf]=&amp;quot;condition&amp;quot; 
   [ngIfThen]=&amp;quot;thenBlock&amp;quot; 
   [ngIfElse]=&amp;quot;elseBlock&amp;quot;
&amp;gt;
  Контент никогда не отображается
&amp;lt;/ng-template&amp;gt;

&amp;lt;ng-template #thenBlock&amp;gt;
  Контент отображается, если условие истинно
&amp;lt;/ng-template&amp;gt;

&amp;lt;ng-template #elseBlock&amp;gt;
  Контент отображается, если условие ложно
&amp;lt;/ng-template&amp;gt;&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;DVpJ&quot;&gt;&lt;a href=&quot;https://devsday.ru/blog/details/39571&quot; target=&quot;_blank&quot;&gt;https://devsday.ru/blog/details/39571&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>j3tboy:ngIf</id><link rel="alternate" type="text/html" href="https://teletype.in/@j3tboy/ngIf?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=j3tboy"></link><title>Как использовать *ngIf с Async Pipe</title><published>2023-05-25T13:00:43.500Z</published><updated>2023-05-25T13:01:54.332Z</updated><summary type="html">Чтобы вывести два Observable значения в шаблоне с *ngIf нужно сделать следующее:</summary><content type="html">
  &lt;p id=&quot;sRFx&quot;&gt;Чтобы вывести два Observable значения в шаблоне с *ngIf нужно сделать следующее:&lt;/p&gt;
  &lt;pre id=&quot;S6FX&quot;&gt;&amp;lt;div *ngIf=&amp;quot;product$ | async as product &amp;amp;&amp;amp; price$ | async as price&amp;quot;&amp;gt;
    &amp;lt;b&amp;gt;{{product}}&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;{{price}}&amp;lt;/b&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;s6h1&quot;&gt;Лучшим решением будет скомбинировать два значения можно внутри компонента используя withLatestFrom, но обязательно нужно проверять на null  в шаблоне productPrice?.price.&lt;/p&gt;
  &lt;p id=&quot;o4j8&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;9BWK&quot;&gt;Самым лучшим вариантом комбинации двух Observable  значений будет испльзование вложенных *ngIf.&lt;/p&gt;
  &lt;pre id=&quot;D02U&quot;&gt;&amp;lt;ng-container *ngIf=&amp;quot;product$ | async as product&amp;quot;&amp;gt;
  &amp;lt;div *ngIf=&amp;quot;price$ | async as price&amp;quot;&amp;gt;
    &amp;lt;b&amp;gt;{{product}}&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;{{price}}&amp;lt;/b&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;ng-container&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;oxAC&quot;&gt;При этом следует учесть, что запросы будут выполняться последовательно.&lt;/p&gt;
  &lt;p id=&quot;OGZU&quot;&gt;Если требуется выполнить запросы одновременно, то уровней вложенности следует добавить.&lt;/p&gt;
  &lt;pre id=&quot;iBAZ&quot;&gt;&amp;lt;ng-container *ngIf=&amp;quot;{ product: product$ | async, price: price$ | async } 
              as productPrice&amp;quot;&amp;gt;
  &amp;lt;ng-container *ngIf=&amp;quot;productPrice.product as product&amp;quot;&amp;gt;
    &amp;lt;ng-container *ngIf=&amp;quot;productPrice.price as price&amp;quot;&amp;gt;
      &amp;lt;div&amp;gt;&amp;lt;b&amp;gt;{{product}}&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;{{price}}&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/ng-container&amp;gt;
  &amp;lt;/ng-container&amp;gt;
&amp;lt;/ng-container&amp;gt;&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;ksC2&quot;&gt;&lt;a href=&quot;https://blog.angular-university.io/angular-reactive-templates/&quot; target=&quot;_blank&quot;&gt;https://blog.angular-university.io/angular-reactive-templates/&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>j3tboy:Input</id><link rel="alternate" type="text/html" href="https://teletype.in/@j3tboy/Input?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=j3tboy"></link><title>Как обнаруживать изменения в @Input</title><published>2023-03-27T14:26:51.559Z</published><updated>2023-03-27T14:26:51.559Z</updated><summary type="html">Суть сводится к проверке объекта changes, получено ли изменение. Сhanges содержит текущее и предыдущее значение.</summary><content type="html">
  &lt;h2 id=&quot;lMvJ&quot;&gt;Способ №1 - &lt;em&gt;ngOnChanges&lt;/em&gt;&lt;/h2&gt;
  &lt;p id=&quot;D71o&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;AkDs&quot; data-lang=&quot;javascript&quot;&gt;export class SimpleComponent implements OnChanges {
@Input() id: number;

 ngOnChanges(changes: SimpleChanges) {
  if (!changes.id.firstChange) {
    console.log(changes.id.currentValue);
   }
  }
 }&lt;/pre&gt;
  &lt;p id=&quot;CNwl&quot;&gt;Суть сводится к проверке объекта &lt;strong&gt;changes&lt;/strong&gt;, получено ли изменение. Сhanges содержит текущее и предыдущее значение.&lt;/p&gt;
  &lt;p id=&quot;rxCg&quot;&gt; &lt;/p&gt;
  &lt;h2 id=&quot;sSG2&quot;&gt;Способ №2 - использование set и get в параметре.&lt;/h2&gt;
  &lt;pre id=&quot;WRUB&quot; data-lang=&quot;javascript&quot;&gt;export class SimpleComponent implements OnChanges {
private _id: number;


@Input() 
set id(value: number) {
 this._id = value;
 }
 
get id(): number {
 return this._id;
 }
}&lt;/pre&gt;
  &lt;p id=&quot;Ic8h&quot;&gt;Тут определяем функцию-сеттер для обнаружения изменений входной переменной. Сеттер всегда будет вызываться первым перед хуком жизненного цикла ngOnchanges.&lt;/p&gt;

</content></entry><entry><id>j3tboy:css-has</id><link rel="alternate" type="text/html" href="https://teletype.in/@j3tboy/css-has?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=j3tboy"></link><title>CSS псевдоклас :has - проверка наличия</title><published>2023-02-09T14:11:40.611Z</published><updated>2023-02-09T14:14:35.508Z</updated><summary type="html">Псевдокласс :has позволяет проверить, существует ли блок внутри родительского. Своеобразный if в CSS.</summary><content type="html">
  &lt;p id=&quot;OSc7&quot;&gt;Псевдокласс :has позволяет проверить, существует ли блок внутри родительского. Своеобразный if в CSS.&lt;/p&gt;
  &lt;p id=&quot;dYKG&quot;&gt;Предположим, есть следующая структура:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;rH3Z&quot;&gt;&amp;lt;div class=&amp;#x27;parent&amp;#x27;&amp;gt;&lt;br /&gt;  &amp;lt;div class = &amp;#x27;child&amp;#x27;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;jPVH&quot;&gt;Если chid имеется, то углы бордюра parent нужно скруглить, в противном случае - оставить 90 градусов.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;EtaW&quot;&gt;.parent&lt;br /&gt;.child {&lt;br /&gt;  border: 1px solid blck;	&lt;br /&gt;  border-radius: 0;&lt;br /&gt; }&lt;/p&gt;
    &lt;p id=&quot;3jVM&quot;&gt;.parent:has(.child) {&lt;br /&gt;  border-radius: 16px;&lt;br /&gt;}&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;XiDh&quot;&gt;Если нужно сделать наоборот, если нет child, то parent скруглить углы, то пишем&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Zbbg&quot;&gt;.parent:not(:has(.child)) {&lt;br /&gt;  border-radius: 16px;&lt;br /&gt;}&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Q52e&quot;&gt;Кроме этого, можно проверить, следует ли за parent child:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;f5cd&quot;&gt;.parent:has(+ child) {}&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;OKeo&quot;&gt;Можно выбрать прямой дочерний элемент:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;8QJb&quot;&gt;.parent:has(&amp;gt; child) {}&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;xJqY&quot;&gt;Можно проверить наличие сразу нескольких элементов:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;yIHL&quot;&gt;.parent:has(.child, .sibling) {}&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;er7O&quot;&gt;Проверка отмеченного чек-бокса:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;tcZS&quot;&gt;.button-clear { &lt;br /&gt;  display: none;&lt;br /&gt; }&lt;/p&gt;
    &lt;p id=&quot;zuMq&quot;&gt; .main-menu:has(input:checked) .button-clear { &lt;br /&gt;   display: block;&lt;br /&gt; }&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;FOfw&quot;&gt;Также, можно обработать выбранное в селекторе значение:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;OqQH&quot;&gt;.some-prm {&lt;br /&gt;    display: block;&lt;br /&gt;}&lt;/p&gt;
    &lt;p id=&quot;XlC2&quot;&gt;form:has(option[value=&amp;quot;some&amp;quot;]:checked) some-prm {&lt;br /&gt;    display: block;&lt;br /&gt;}&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;LOzH&quot;&gt;Проверить наличие нескольких дочерних элементов (количественные запросы) и сделать что-либо с каким-то из них:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;HsT7&quot;&gt;.child {&lt;br /&gt;    display: flex;&lt;br /&gt;    gap: 1em;&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;.parent:has(.child:nth-last-child(n + 3)) .child:last-child {&lt;br /&gt;    margin-left: auto;&lt;br /&gt;}&lt;/p&gt;
    &lt;blockquote id=&quot;KUEB&quot;&gt;последний элемент будет прижат к левому краю&lt;/blockquote&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;enkF&quot;&gt;&lt;a href=&quot;https://css-live.ru/css/psevdoklass-has-ne-tolko-roditelskij-selektor.html&quot; target=&quot;_blank&quot;&gt;https://css-live.ru/css/psevdoklass-has-ne-tolko-roditelskij-selektor.html&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;EdJ5&quot;&gt;&lt;a href=&quot;https://habr.com/ru/post/662355/&quot; target=&quot;_blank&quot;&gt;https://habr.com/ru/post/662355/&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;TztP&quot;&gt;&lt;a href=&quot;http://alistapart.com/article/quantity-queries-for-css/&quot; target=&quot;_blank&quot;&gt;http://alistapart.com/article/quantity-queries-for-css/&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>j3tboy:rxjs-cheat-sheet</id><link rel="alternate" type="text/html" href="https://teletype.in/@j3tboy/rxjs-cheat-sheet?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=j3tboy"></link><title>RxJS - шпаргалка</title><published>2022-12-19T19:31:24.181Z</published><updated>2023-01-11T19:30:20.104Z</updated><tt:hashtag>rxjs</tt:hashtag><tt:hashtag>cheat_sheet</tt:hashtag><tt:hashtag>шпаргалка</tt:hashtag><summary type="html">Оператор слияния merge используется, когда мы хотим создать поток, который генерируется всякий раз, когда наблюдаемый источник (один из множества) выдает значение. </summary><content type="html">
  &lt;h2 id=&quot;OSJY&quot;&gt;Операторы объединение Observable.&lt;/h2&gt;
  &lt;h3 id=&quot;lFct&quot;&gt;merge - слияние&lt;/h3&gt;
  &lt;p id=&quot;QMrQ&quot;&gt;Оператор слияния merge используется, когда мы хотим создать поток, который генерируется всякий раз, когда наблюдаемый источник (один из множества) выдает значение. &lt;/p&gt;
  &lt;p id=&quot;inWA&quot;&gt;Например, если нужно отслеживать активность пользователя,чтобы выйти из системы или показать уведомление. Чтобы сделать это, нам нужно отслеживать активность пользователя, такую как клики, прокрутки, щелчки правой кнопкой мыши и тому подобное, и действовать, когда в течение определенных периодов времени не происходило никаких событий. Вот пример кода:&lt;/p&gt;
  &lt;pre id=&quot;PAn5&quot; data-lang=&quot;javascript&quot;&gt;const ACTIVE_EVENTS = [
  &amp;#x27;click&amp;#x27;, &amp;#x27;scroll&amp;#x27;, &amp;#x27;contextmenu&amp;#x27;, &amp;#x27;dblclick&amp;#x27;, &amp;#x27;mousemove&amp;#x27;,
];
// можно добавить любые события, для определения неактивности пользователя

merge(...ACTIVE_EVENTS
.map(event =&amp;gt; fromEvent(document, event)))
.pipe(
bufferWhen(() =&amp;gt; interval(10000)),
filter(events =&amp;gt; events.length === 0),)
.subscribe(() =&amp;gt; alert(&amp;#x27;You have been inactive for ten seconds!&amp;#x27;))&lt;/pre&gt;
  &lt;p id=&quot;2JAv&quot;&gt;Тут создаются несколько потоков (используя FromEvent) для отслеживания различных событий браузера, которые могут указывать на активность пользователя, а затем объединяем их в один поток, чтобы действовать, когда какое-то время событий не было. Тип событий не важен, важен  факт, что событие произошло.&lt;/p&gt;
  &lt;p id=&quot;3wAC&quot;&gt;Если важен сам факт наступления события, придется использовать “слияние” &lt;strong&gt;merge&lt;/strong&gt;.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;twjS&quot;&gt;bufferWhen(closingSelector: Observable): Observable&lt;/p&gt;
    &lt;p id=&quot;aVLu&quot;&gt;&lt;strong&gt;bufferWhen -&lt;/strong&gt; собирает данные из источника, наблюдаемого до тех пор, пока функция closingSelector не закроет буфер. &lt;/p&gt;
    &lt;p id=&quot;6w34&quot;&gt;&lt;strong&gt;closingSelector &lt;/strong&gt;- фабричная функция закрытия Observable, чтобы указать, когда закрывать, испускать и сбрасывать буфер.&lt;/p&gt;
    &lt;p id=&quot;wa6T&quot;&gt;В данном случае, каждые 10000 мс происходит эммит значений.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;jzVg&quot;&gt;&lt;strong&gt;Отличие buffer от bufferWhen&lt;/strong&gt;&lt;/p&gt;
    &lt;p id=&quot;QnBH&quot;&gt;Оператор &lt;strong&gt;buffer &lt;/strong&gt;принимает второй наблюдаемый объект в качестве аргумента и будет буферизовать значения из первого наблюдаемого объекта до тех пор, пока второй объект не будет передан. Затем buffer сбрасывается и начинает буферизацию снова, пока второй наблюдаемый объект не будет передан еще раз.&lt;/p&gt;
    &lt;p id=&quot;4xr9&quot;&gt;&lt;strong&gt;bufferWhen &lt;/strong&gt;похож на buffer, но вместо того, чтобы принимать наблюдаемый объект, он принимает функцию селектора (так называемый закрывающий селектор). &lt;/p&gt;
    &lt;p id=&quot;fZoN&quot;&gt;Т.е. buffer эммитит значение, когда приходит значение наблюдаемого объекта, а bufferWen эммитит значение, когда выполняется функция.&lt;/p&gt;
    &lt;p id=&quot;QzY7&quot;&gt;Есть еще:&lt;/p&gt;
    &lt;p id=&quot;1gWA&quot;&gt; -  &lt;strong&gt;bufferCount &lt;/strong&gt;- позволяет задавать количество значений, которые нужно хранить в буфере, прежде чем они будут переданы.&lt;/p&gt;
    &lt;p id=&quot;hvx3&quot;&gt; - &lt;strong&gt;bufferTime &lt;/strong&gt;- принимает количество миллисекунд для буферизации значений. По истечении времени буферизованные значения передаются, а буфер запускается снова.&lt;/p&gt;
    &lt;p id=&quot;HSAb&quot;&gt; - &lt;strong&gt;bufferToggle &lt;/strong&gt;- принимает два аргумента: наблюдаемый объект, чтобы начать буферизацаию, и закрывающий селектор, чтобы остановить ее и выдать значения.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;aR7F&quot;&gt;combineLatest&lt;/h3&gt;
  &lt;p id=&quot;h8qz&quot;&gt;В некоторых случаях несколько отдельных событий запускают изменения в одной части пользовательского интерфейса. При этом нужны значения всех Observable (потоков) для вычисления &lt;strong&gt;конечного значения&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;YZtI&quot;&gt;Например, в зависимости от ввода значений в поля, с сервера приходят признаки обязательности для других полей и происходит перестройка интерфейса. &lt;/p&gt;
  &lt;p id=&quot;cqBl&quot;&gt;combineLatest эммитит значение, когда какое-либо из отдельных потоков эмитит значение.&lt;/p&gt;
  &lt;pre id=&quot;WGfv&quot; data-lang=&quot;javascript&quot;&gt;// получаем данные от сервера - например, перечень
// динамических компонентов 
dynamicControls$ = this.controlsService.getDynamicControls();

formValue$ = combineLatest([
        this.form.valueChanges,
        this.dynamicControls$,
    ]).pipe(
        tap(([value]) =&amp;gt; {
// тут происходит установка валидатора для полей.
            if (value.attachmentsRequired) {
                this.controls.attachments
                    .setValidators(Validators.required);
            } else {
                this.controls.attachments.clearValidators();
            }
        }),
        map(([value, controls]) =&amp;gt; {
            const controlsValue = { ...value, ...controls };
            return controlsValue;
        }),
    );

&lt;/pre&gt;
  &lt;h3 id=&quot;VOGq&quot;&gt;forkJoin &lt;/h3&gt;
  &lt;p id=&quot;FBRD&quot;&gt;Если необходимо получить несколько наборов данных, которые извлекаются из разных API, нужно использовать &lt;strong&gt;forkJoin&lt;/strong&gt;, чтобы дождаться, пока все данные будут доступны, и только после этого что-то делать в пользовательском интерфейсе.&lt;/p&gt;
  &lt;pre id=&quot;clPJ&quot; data-lang=&quot;javascript&quot;&gt;homePageData$ = forkJoin([
    this.userService.getUserInfo(),
    this.dataService.getData(),
    this.otherDataService.getOtherData(),
]).pipe(
    map(([userInfo, data, otherData]) =&amp;gt; ({
        userInfo,
        data,
        otherData,
    })),
    catchError(error =&amp;gt; of({/*error object*/})),
);&lt;/pre&gt;
  &lt;h3 id=&quot;Jnpm&quot;&gt;pairwise&lt;/h3&gt;
  &lt;p id=&quot;I6HR&quot;&gt;Объединяет предыдущее и текущее значение потока.&lt;/p&gt;
  &lt;p id=&quot;Gzsc&quot;&gt;Например, когда нужно в предварительно заполненной форме проверить изменения.&lt;/p&gt;
  &lt;p id=&quot;DdVY&quot;&gt;Для простых случаев можно использовать состояние формы &lt;strong&gt;dirty&lt;/strong&gt;, но если необходимо учитывать не только факт изменения в полях, а еще чтобы старое значение не совпадало с новым, то можно использовать pairwaise.&lt;/p&gt;
  &lt;pre id=&quot;aSiv&quot; data-lang=&quot;javascript&quot;&gt;disabled$ = this.form.valueChanges.pipe(
    pairwise(),
    map(([prev, current]) =&amp;gt; {
        return this.utilitiesService.isEqual(prev, currentnged
    }),
);&lt;/pre&gt;
  &lt;h3 id=&quot;aVnW&quot;&gt;withLatestFrom - &amp;quot;с последним из&amp;quot;&lt;/h3&gt;
  &lt;p id=&quot;cadI&quot;&gt;Объединяет два потока, причем из потока &lt;strong&gt;withLatestFrom &lt;/strong&gt;эммитит только последнее значение.&lt;/p&gt;
  &lt;p id=&quot;FkvL&quot;&gt;Когда основной поток выкидывает значение, то он просит &lt;strong&gt;withLatestFrom &lt;/strong&gt;дать последнее значение которое у него было.&lt;/p&gt;
  &lt;pre id=&quot;hqo0&quot; data-lang=&quot;javascript&quot;&gt;this.authService.login(credentials).pipe(
    withLatestFrom(
      this.route.queryParamMap.pipe(startWith(new Map())),
    ),
).subscribe(([, params]) =&amp;gt; {
    if (params.get(&amp;#x27;redirectUrl&amp;#x27;)) {
        const navUrl = params.get(&amp;#x27;redirectUrl&amp;#x27;) ?? &amp;#x27;/home&amp;#x27;;
        this.router.navigateByUrl(decodeURIComponent(navUrl));
    }
});&lt;/pre&gt;
  &lt;p id=&quot;Xlc0&quot;&gt;Необходимо перенаправить со страницы при успешном входе в систему,&lt;strong&gt; но только &lt;/strong&gt;при наличии параметра запроса “redirect_url”. Мы можем взять это значение из наблюдаемого параметра queryParamMap, но мы не хотим запускать перенаправление, когда параметр запроса изменяется по какой-либо причине, только после завершения успешного HTTP-вызова login.&lt;/p&gt;
  &lt;p id=&quot;mmaI&quot;&gt;Действие не будет выполнено при изменении параметров запроса, а только при успешном завершении вызова login.&lt;/p&gt;
  &lt;h3 id=&quot;JAga&quot;&gt;debounceTime, throttleTime, auditTime&lt;/h3&gt;
  &lt;p id=&quot;GXbK&quot;&gt;&lt;strong&gt;debounceTime -&lt;/strong&gt; эмитит значение из Observable, только после того, как прошел определенный промежуток времени. Использовать, если нужно реализовать автокомплит или упреждаюдищий ввод ( typeahead ).&lt;/p&gt;
  &lt;p id=&quot;EI40&quot;&gt;&lt;strong&gt;throttleTime -&lt;/strong&gt; эмитит значение из Observable, затем игнорирует последующие значения источника в течение миллисекунд, затем повторяет этот процесс. Использовать, если нужно реализовать ограничение частоты кликов, обработку двойного клика.&lt;/p&gt;
  &lt;p id=&quot;2wrB&quot;&gt;&lt;strong&gt;auditTime &lt;/strong&gt;- эмитит самое последнее значение за указанный период времени.&lt;/p&gt;
  &lt;h3 id=&quot;FcaY&quot;&gt;retry&lt;/h3&gt;
  &lt;p id=&quot;RrSN&quot;&gt;Простейший случай:&lt;/p&gt;
  &lt;pre id=&quot;sLWF&quot; data-lang=&quot;javascript&quot;&gt;responseFromServer$.pipe(
    retry(3), // делаем три попытки
); // после 3 неудачных попыток обрабатываем ошибку.&lt;/pre&gt;
  &lt;p id=&quot;P8BW&quot;&gt;Ожидание нажатия кнопки с оператором повторов:&lt;/p&gt;
  &lt;pre id=&quot;y2q9&quot; data-lang=&quot;javascript&quot;&gt;responseFromServer$.pipe(
    retry({
        count: 3, // можем указать опциональное количество
                  // сколько раз пользователь может 
                  // повторить попытку
        delay: () =&amp;gt; fromEvent(
              document.querySelector(&amp;#x27;#retryBtn&amp;#x27;),
              &amp;#x27;click&amp;#x27;,
        ), // ожидаем нажатия кнопки
    }),
);&lt;/pre&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;e93E&quot;&gt;&lt;a href=&quot;https://dev.to/this-is-learning/understanding-rxjs-use-cases-part-ii-51ll&quot; target=&quot;_blank&quot;&gt;https://dev.to/this-is-learning/understanding-rxjs-use-cases-part-ii-51ll&lt;/a&gt; оригинал статьи.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;tt-tags id=&quot;mhyY&quot;&gt;
      &lt;tt-tag name=&quot;rxjs&quot;&gt;#rxjs&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;cheat_sheet&quot;&gt;#cheat_sheet&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;шпаргалка&quot;&gt;#шпаргалка&lt;/tt-tag&gt;
    &lt;/tt-tags&gt;
  &lt;/section&gt;

</content></entry><entry><id>j3tboy:The_Chronicles_of_Riddick_widescreen_manual</id><link rel="alternate" type="text/html" href="https://teletype.in/@j3tboy/The_Chronicles_of_Riddick_widescreen_manual?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=j3tboy"></link><title>The Chronicles of Riddick: Escape from Butcher Bay - как настроить для игры на широкоформатном мониторе</title><published>2022-12-11T21:15:51.162Z</published><updated>2023-05-25T13:19:27.032Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/61/9d/619dcd2c-cd85-4d43-b23f-f27ff1ced6f6.png"></media:thumbnail><tt:hashtag>the_chronicles_of_riddick</tt:hashtag><tt:hashtag>escape_from_butcher_bay</tt:hashtag><tt:hashtag>widescreen</tt:hashtag><tt:hashtag>old_games</tt:hashtag><tt:hashtag>manuals</tt:hashtag><tt:hashtag>retro_games</tt:hashtag><tt:hashtag>retro</tt:hashtag><tt:hashtag>games</tt:hashtag><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/30/f5/30f56869-4ecb-4663-85a3-da311163adfb.png&quot;&gt;Это краткая инструкция по настройке стареньких игр для воспроизведения на широкоформатных мониторах.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;DKAy&quot;&gt;Это краткая инструкция по настройке стареньких игр для воспроизведения на широкоформатных мониторах.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h2 id=&quot;GLB5&quot;&gt;В чем проблема?&lt;/h2&gt;
  &lt;p id=&quot;sUoE&quot;&gt;Нельзя просто взять и запустить игру 2004 года на широкоформатном мониторе widescreen. Придется чуть настроить.  Без настроек изображение выводиться просто огромное, как будто видишь одним глазом, левый верхний угол экрана до середины.&lt;/p&gt;
  &lt;p id=&quot;aiqq&quot;&gt;Для примера, на рисунке 1 отображется игра без настройки.&lt;/p&gt;
  &lt;figure id=&quot;Ggdt&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/f5/30f56869-4ecb-4663-85a3-da311163adfb.png&quot; width=&quot;2004&quot; /&gt;
    &lt;figcaption&gt;Рисунок 1 - без настроек и тут видно, что на экране уместилось дай бог четверть картинки, что вообще никак не играбельно. &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;WvhB&quot;&gt;А на рисунке 2 - уже с настройкой. &lt;/p&gt;
  &lt;figure id=&quot;UtDR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b4/21/b4214f95-fb60-454d-aa98-484e21c8eaa5.png&quot; width=&quot;1526&quot; /&gt;
    &lt;figcaption&gt;Рисунок 2 - настройка выполнена&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NT6e&quot;&gt;Добиться пропорционального вида так и не получилось, но в принципе, уже играть хоть как-то можно. &lt;/p&gt;
  &lt;h3 id=&quot;VMYs&quot;&gt;Шаг №1&lt;/h3&gt;
  &lt;p id=&quot;w6gL&quot;&gt;1.1 Переходим в папку с игрой, находим riddick.exe и правой кнопкой мыши открываем свойства, переходим на вкладку &amp;quot;Совместимость.&amp;quot;&lt;/p&gt;
  &lt;p id=&quot;rdhO&quot;&gt;1.2 Установить &amp;quot;Режим совместимости&amp;quot; - Windows XP (Service Pack 3).&lt;/p&gt;
  &lt;p id=&quot;3XLJ&quot;&gt;1.3 Установить галочку &amp;quot;Отключить оптимизацию во весь экран&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;vQWk&quot;&gt;1.4 Нажать кнопку &amp;quot;Изменить параметры высокого DPI&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;03uw&quot;&gt;1.5 Установить галочку &amp;quot;Переопределить режим масштабирования высокого разрешения&amp;quot; - &amp;quot;Масштабирование выполняется&amp;quot; - выбрать &amp;quot;Приложение&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;8gnW&quot;&gt;1.6 СОХРАНИТЬ.&lt;/p&gt;
  &lt;p id=&quot;5RxB&quot;&gt;На рисунке 3 отмечены основные моменты шага 1.&lt;/p&gt;
  &lt;p id=&quot;wZQX&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;Y7jv&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3b/1c/3b1c966c-a152-4b8c-a9c2-db716bbafc0c.png&quot; width=&quot;1434&quot; /&gt;
    &lt;figcaption&gt;Рисунок 3 - основные настройки шага 1.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;pfq0&quot;&gt;Шаг №2&lt;/h3&gt;
  &lt;p id=&quot;BYUh&quot;&gt;2.1 Запускаем игру и переходим в настройки монитора.&lt;/p&gt;
  &lt;p id=&quot;Kd7A&quot;&gt;2.2. Устаналвиваем разрешение 1920x1440.&lt;/p&gt;
  &lt;p id=&quot;gugd&quot;&gt;2.3 Устанавливаем соотношение сторон (aspect ration) 4: 3 -&amp;gt;2.35.&lt;/p&gt;
  &lt;p id=&quot;DZcS&quot;&gt;2.4 Применяем настройки и начинаем играть.&lt;/p&gt;
  &lt;p id=&quot;4KQG&quot;&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;pSRu&quot;&gt;Да, еще интересный момент - я не смог нормально сделать скрины или захватить видео геймплея. Рисунки 1 и 2 - это мои скрины, но сделаные через сальто.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;SjWA&quot;&gt;Ссылка на исходник мануала - &lt;a href=&quot;https://www.nexusmods.com/chroniclesofriddick/mods/1&quot; target=&quot;_blank&quot;&gt;https://www.nexusmods.com/chroniclesofriddick/mods/1&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;tt-tags id=&quot;Ieh1&quot;&gt;
      &lt;tt-tag name=&quot;the_chronicles_of_riddick&quot;&gt;#the_chronicles_of_riddick&lt;/tt-tag&gt;
    &lt;/tt-tags&gt;
    &lt;tt-tags id=&quot;hFFJ&quot;&gt;
      &lt;tt-tag name=&quot;escape_from_butcher_bay&quot;&gt;#escape_from_butcher_bay&lt;/tt-tag&gt;
    &lt;/tt-tags&gt;
    &lt;tt-tags id=&quot;kTzW&quot;&gt;
      &lt;tt-tag name=&quot;widescreen&quot;&gt;#widescreen&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;old_games&quot;&gt;#old_games&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;manuals&quot;&gt;#manuals&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;retro_games&quot;&gt;#retro_games&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;retro&quot;&gt;#retro&lt;/tt-tag&gt;
      &lt;tt-tag name=&quot;games&quot;&gt;#games&lt;/tt-tag&gt;
    &lt;/tt-tags&gt;
  &lt;/section&gt;

</content></entry></feed>