かんたん神業ゲーム攻略

なぜ、宗教関係者が日本に多いのか

Fallout4、2026年、ハロウィン前のアップデートがありました。

久々にFallout4なので上手く書ける自身が無いのですが、気になって書いてしまいしました。

2026年の10月29日にハロウィン前のアップデートがありました。

ベセスダが10月に実施したゲーム本体への公式アップデートは、バグ修正のみ

しかもMOD向けのマイナー修正のみ。マイナー修正でも充分にありがたい気もする。

[PS5]007ファースト・ライト SALE価格で簡単に攻略 若き日のボンド

ライセンスはAmazonのジェームズ・ボンドに帰属します。

本作はAmazon MGM Studiosが製作、開発元(デベロッパー)は Amazon ではなく、デンマークの「IO Interactive(IOI)」というゲーム開発スタジオです。、1人で遊ぶためのゲームとなっています。

007ファースト・ライトはPS5向けのTPS・アクション・アドヴェンチャーゲームです

007

PS5版『007 ファースト・ライト』の実勢販売価格はおおむね6,921円〜8,010円(税込)前後と高めです。

ですが店舗での在庫処分や、オンラインでのタイムセールを狙うと4980円前後と大誤算のSALE価格での購入が可能になっています。

小手先のテクニックよりもストーリー重視で攻略をしたいと思います。

予算・・・時間の許す限り

目標・・・クリア後のやり込みまで

※プレイ開始時にオンライン接続を求められます、接続不能で遊べない人は返品できるので返品しましょう。

若き士官候補生のジェームズ・ボンドが大型軍用ヘリに乗って辿り着いた先は、海底付近だった。

ボンド青年は、とはいっても時は2026年前後であり、私たちとは交わらない時間軸の上で、大破したヘリコプターの残骸と一緒に海に沈んでいた。

実はここから操作が始まるので、コントローラーの接続準備を忘れずに行いましょう。

悪夢にうなされた彼は、それが夢ではないことに気づく。ゆっくりと海底に向かい沈みながら、それでも彼の心臓は生きようとしていた。

操作を受け付けているのでコントローラーの右スティックや左スティックで指示に従って入力しましょう。といっても指示はでませんが、動かしている内にボンド青年が目を覚まします。

海岸に辿り着き、打ち上げられた跡、この物語がどこに向かっていくのか。わざわざスクショを数百枚も撮っておいて、選んだのは以下であることをご了承ください。

腕時計を着けてみるボンド青年。

007のエージェントになる前のボンドを追体験できるゲーム。懐かしさと新鮮さが同時に押し寄せてくる。

初めての懐中電灯

おもいっきりオメガのロゴが入った腕時計を、5つのカラーリングの中から1つ選べるので、じっくり考えて決めましょう。(見た目だけです、性能に違いはありません)

がっつりTPSではない

①本作はスパイ・アクションがメインのため、長時間の撃ちあいになることはありません。どちらかというと、ヒットマンのような潜入に、カーチェイスを足した懐かしくてほろ苦くて新しいアドヴェンチャーです。

②Amazonのゲームだから遊びづらい、というようなこともありません。よく作り込まれていて収集要素などがちりばめられています。本作はヒットマンシリーズを開発したスタジオが開発を手掛けていることもあり、同じ処理がいくつか使用されています。

③難易度は自分次第。難易度は3段階で選べる(最初はノーマルを推奨)ので、チャプター毎に遊び直すことも出来ます。

④謎解きと探索がほどほどに入っているため、仕様がよく分からない人は慣れてください。余計なクイズ監修はないので、謎解きが難しいということはないです。

ファースト・ライトとは何か

日本語の妥当な意味は、夜明け、です。

ダニエル・クレイグ版のジェームズボンドによく似た設定になっている、特にカジノ・ロワイヤルをリスペクトしたと開発陣もインタビューで語っています。「特定の映画の続編ではない」としつつも、多くの要素でダニエル・クレイグ版を意識しているので、予習として見ておくとゲームがより楽しくなります。

※私は故ショーン・コネリーが演じるボンドを見ていました。

ゲーム内のボンド役は若手俳優のパトリック・ギブソンが演じていますが、初期の開発段階は、ダニエル・クレイグの顔で行われていました。あふれ出るヒットマン臭。

はい、しばらく記事を書かなかった理由を打ち明けますと、私事ですがゲーム開発に携わっており、しばらくゲームが楽しくなかった。いや、楽しく開発をしているのでゲームする暇が減ってしまった点が考えられます。

最近は冗談抜きに朝5時までコードを打つ日が続いており、起きるのは昼すぎの14時という状況です。その間にヨッシーとフカシギの図鑑やスプラトゥーンレイダースで遊んだりしていました。

 

はい、そういうわけで、ファースト・ライトの冒頭では見慣れたモーションが沢山出てきます。あれ?いまのはレンガを投げる時の動きだったような?というデジャヴを感じる人、正解です。今作はヒットマンシリーズのUIや動きの流用が多く、フラッシュバックする人もいると思います。

 

かんたん攻略 チャプター001

基本的な立ち回りは①謎を解く②殴る③撃つ、こんな感じです。

①~③が1セットになっており、人に拠ってですが②が隠密行動の場合もあります。

チャプター001ではステルス行動の練習と謎解きの練習です。

若きボンド青年(24歳)は人員救出任務の途中で別の任務に巻き込まれてしまいます。幸か不幸か、匿名の通信が指示を伝えます。給料は安い、やるなら経歴を見て見ないふりをするかどうかまでは言わなかったけど、そんな感じの話をされます。使命感の強いボンド青年は謎の女性の言葉を信用し、指示に従うのでした。(一部、従っていない)

ロマンスは一瞬あります。お約束的な感じでムービーに映ります。

 

紅の砂漠 最終アップデート、来る8月13日(日本時間)

『紅の砂漠(Crimson Desert)』の最新の大型アップデート(Ver.2.00〜2.01「Enhanced」)における変更点と、それに伴うプレイヤーの心理学的負荷(認知・精神的ストレスへの影響)について、認知心理学やゲーム心理学の観点から考察を取得します。

 

2026年3月のリリース以降、高頻度な改善パッチを重ねてきた『紅の砂漠(Crimson Desert)』。その集大成となる大型アップデート「Crimson Desert Enhanced(Ver.2.00〜2.01)」によって、ゲーム体験とプレイヤー心理はどのように変化したのか、心理学的な観点および海外(特に韓国・欧州など)の反響から整理します。

1. 最終・大型アップデートで何が変わったのか?

開発元Pearl Abyssがコミュニティのフィードバックを反映した主な変更点は以下の通りです。

  • 物語導入とカットシーンの大幅な再構成:序盤からクリフたちの目的や背景世界が明確に把握できるよう、新規ムービーやセリフ・導線が追加。
  • 操作性・難易度とボス戦の再設計:難易度設定(イージー/基本/ハード)の追加に加え、複雑すぎた入力判定の緩和、ボス再戦機能やギミック明瞭化。
  • 育成・経済システムの緩和:素材抽出(リサイクル)システムの導入、キャンプ資金獲得量の大幅増加など、初期の過酷なリソース制限を撤廃。
  • 多言語フルボイス&生活要素の拡張:日・独・仏・西・伯葡フルボイス実装、ハウジングやフォトモード、マウント・スキルの拡充。

1本の製品として、パッケージ化された開発手法にようやく到達することができた、と、開発陣が嬉しそうに語った反面、既存の手直しがされないままになった幾つものバグが残っている。

紅の砂漠のフィールドをゆっくりと歩く巨大な樹木型の巨人のゲーム画面

謎の巡回者

2. プレイヤーの「心理学的負荷」はどう変化したのか?

① 認知負荷(Cognitive Load)の劇的低減

リリース当初の最大の壁は、複雑なバグと文脈依存コンボと説明不足な世界観によるワーキングメモリのオーバーヒートでした。どこに向かい、どのキーをどの順で押すべきか常に迷う状態は、脳に過度な認知的疲労を与えていました。
アップデートによる導線整理と操作レスポンスの向上により、無駄な迷いが排除され、「目の前の戦闘や探索そのものに没頭するフロー状態(Flow State)」に入りやすくなりました。

開発の裏側:モバイル向けのゲームエンジンを搭載したことによって引き起こされた数々のバグは手直しされて、操作性の改善が実感できるほどに変わったと言えそうです。

①床を勝手に走り続けなくなった。:アナログコントローラーから指を話しても少し歩き続けていた、それらはストレスフルな操作でしたが緩和され、1秒近い無駄な徒歩がなくなりました。今では指を話してから2歩目を踏むかどうか、まで改善されています。

② 学習性無力感から自己効力感(Self-Efficacy)へ

リトライ時のペナルティがほぼ緩和、いえ解消といったほうがいいかもしれません。

本来はユーザーが押して図るべきボスの攻撃段階が可視化され、ボスは弱体化しました。ですが難易度オプションの追加により、プレイヤーは「自分の腕前次第で状況をコントロールできる」という感覚を取り戻しました。理不尽な猛攻からの死の繰り返しによる諦めが解消され、健全な達成感へとシフトしています。一部の浮遊するボスは、今までと同じように、少し歯痒い相手に変わりありません。攻撃が届くことは開発者目線では非常に重要です。

③ サンクコスト効果と心理的飽和の緩和

以前は装備強化に膨大な時間を要し、ここまで育てたから後戻りできないという執着(サンクコスト効果)や、単調な素材集めによる心理的飽和を招いていました。
素材抽出システムや資金緩和により試行錯誤のリスクが低下し、新しいビルドを試す自由度と心理的安全性が確保されました。ビルドの可能性は大きくありませんが、一部の技を発動するための時間的な安全性は確保できる余裕が生じています。当たらなければ意味がないものが多いため、直接ダメージが主体になる傾向は変わらないままです。

3. アメリカ以外の「海外の反応」

本作は初動で評価が激しく割れましたが、非アメリカ圏のゲーマーコミュニティでは以下のような独自の受容と変化が見られます。

◆ 韓国(本国コミュニティ:Inven、Ruliweb等)

  • 開発速度への賛辞と安堵:「MMO運営仕込みの尋常じゃないアップデート速度で、ようやく本来目指していたシングルアクションRPGの完成形になった」と評価。
  • コンソール市場開拓への自負:モバイル・PC中心だった韓国ゲーム界において、世界水準のAAAコンソール大作を成し遂げたという国民的関心が高く、「初動の粗さを即座に修正した開発姿勢は誇らしい」との声が主流です。

◆ ヨーロッパ(ドイツ、フランス、英国など)

  • 母国語フルボイス対応への熱狂:Gamescom(ドイツ)での展示や今回の独・仏・西語フルボイス実装に対し、「テキストだけでなく音声までローカライズしてくれたことで、世界への没入感が格段に跳ね上がった」と絶賛。
  • 硬派なアクションゲームとしての再評価:欧州圏(特にフランスの批評メディア等)では発売直後「複雑すぎるシミュレーター寄りアクション」として賛否が二極化していましたが、操作の洗練によって「奥深い格闘アクションとオープンワールドの融合」として再評価が進んでいます。

◆ 中国・その他アジア圏

  • グラフィックと探索の受容など:中国のゲームアワード(China Game Innovation Awards)を受賞するなど技術面へのリスペクトが強く、ハウジングやペット・マウント集めといった「生活・自由度系コンテンツ」の拡張が非常に好意的に受け止められた一方で、もっと課金して色々な家畜を飼いたいといった錯誤も起きていました。

要点をまとめるなら

最終大型アップデートは単なるバグ修正にとどまらず、「プレイヤーを苦しめていた理不尽な精神的摩擦」を取り除き、挑戦しやすさを前面に引き出しました。これを最後にアップデートをしないという理不尽さが残るだけに、黒い砂漠との対称さが際立ちました。

■

生成AI専門メディアである「Ainova(エーアイノヴァ)」が提供している、登録不要・完全無料のAI画像生成アプリ・ツールページのはずですがつながりません。

 

Ainova AI:本サイトが独自に公開している、ログイン・登録不要でStable Diffusionが使える完全無料の画像・イラスト生成ツールです。

 

その他の多くのツールは

「一部機能のみ無料(フリーミアム)」、または「毎日もらえる無料コインの範囲内で使える」という課金誘導になっています。

 

突然ですが、「スマホやパソコンですぐ遊べる無料ゲームサイト、どうやって選んでいますか?」
インストールや登録が不要で、パズルやアクション、協力対戦など2000種類以上の豊富なジャンルが揃う“pokiみたいなサイト”は、世界中で毎月延べ【1億人以上】のユーザーが利用しています。

「広告ばかりでストレスがたまる」「どのサイトが本当に安全か分からない」と迷う声をよく耳にします。特に未成年のネット利用が年々増える中、安全なサイト選びは大人も子どもも無視できない課題です。

実際に、主要サイトの広告表示率やセキュリティ対策を比較したところ、pokiみたいなサイトはSSL化やプライバシーポリシー整備が徹底されていて、快適さと安全性を両立しています。さらに口コミ分析では、「すぐにプレイできる手軽さ」「友達や家族と楽しめる機能」など、満足度の高いポイントが多く挙がっています。

「知らなかった…」だけで損しないために、いま話題のpokiみたいなサイトの選び方・楽しみ方・危険回避まで網羅解説。本編を読むと、はじめての方も迷わず安心して、あなたにぴったりのゲームで遊び始められます。

紅の砂漠 最新アップデート(5月14日) 鳥、全種の捕獲方法

スズメとクロエリコウライウグイス- デュヘイブンのスリーブラザーズクリフにて

カモメ、ワカケホンセイインコ、ハト2種、オオハシウミツバメ、カラス- バウスプリット岬にて

小型のコガモとガチョウ- クリムゾンデザートのマーチャンツ・レスティング・プレイスにて

ステップイーグル + コンドル + カッコウ + ハヤブサ + イワヒバリ + ハト- クリムゾンデザートの西

シジュウカラ + キツツキ + ワシ + 草原 + ハイタカ- 廃墟の回廊 パイルーン

フクロウと灰色のオウム、シマエナガ- スカラストーン近郊

機械ワシ デレシア丘陵 水銀が50個必要 朝5時

タカとシロハヤブサ- シルバーウルフ山脈パイルーン

キバシウシツツキ- 先祖の荒野

チャレンジ:鳥を3羽つかむ(3/5) 博士!これはいったい…!?

スキルギア92種類は未開放のまま。

フェニックス 砂漠のオアシスで出現を待ち、高台に降りてきたところをバクダン矢などで倒す

動物に変装して倒してもよい。はぎ取り素材を魔女に渡す

紅の砂漠 アップデート1.06『2026年5月12日』 変更点など細かな話 ライオン・ラクダ・ラプトル

ラプトル

紅の砂漠 アップデート1.06 変更点など細かな話 ライオン・ラクダ・ラプトル

PS5

 

アビスから飛び込みしてない皆さん、こんにちは

 

今回は、アップデートの話です。

実装されたものは、

・焼き入れ対象アイテムの拡充

・共感のソッテ、2個目の追加(鳥をペットにする時に使う)

・新規の騎乗動物が登録可能に。

 

焼き入れ対象アイテム

変装用の装備、全てが焼き入れ可能です
ただし防御の上昇幅が1しかありません。

 

特殊な用途の装備:ポロリン花摘み帽、など

 

騎乗できる動物の追加

乗ることができて、インベントリから餌やりでき、好感度が上がる動物は登録可能になりました。サーカスライオンや盗んだ巨大イグアナも可能です。赤いクークー鳥、生まれたてのクークー鳥、ラプトルも登録できます。

真っ赤なクークー鳥が全滅しても、建物の2階に行けば卵を盗めるので、それを白い巣に入れて7分待つと産まれます。

手なづけかた

ライオン:やわらかい肉で40好感度が上昇します

巨大イグアナ:野菜を与える(騎乗状態のほうがあげやすい)

 

一部の騎乗動物向けに、装備が販売されています

 

 

 

【紅の砂漠】元素:氷結 の取得方法 響きの尖塔の攻略 Crimson Desert

水銀を採取するために

古代人ソクラテス、みたいなおじいさんを倒しました。

Crimson Desert Priscus The Ancient

 

 

場 所

パイルーンの文字の北に、高い塔があります。

6章に入ると、途中の町が入れなくなり、侵入すると戻されるため、空から行くか、川沿いを北上するかして迂回しましょう。カルシュウムみたいな感じの町だった気がする。

響きの尖塔の下に古代人が潜んでいます。

 

塔のギミックは大したことがありませんでした。ひもを撃つと足場ができる、その仕組みの簡単なことといったら。

摂理の力ジャンプで進めばすぐに鐘まで辿り着くので、鐘の鎖を弓で撃って落としてから、自分も落下すると会えます。

 

古代人プリスクス

砂漠のおじいさんと同じ動きをします。浮いている。

基本的には空飛ぶおじいさんなので、

・弓で集中射撃をする

・大砲槍で砲撃する

・ハンドキャノンで撃つ

・アビスギア「否定の珠」が付与された大剣「闇の導き手(Darkbringer)」で斬る

このあたりを中心に戦うといいですね。

『リトライしたらワンパンできたわ』

※いいえ、それはウソ。

たしかに、負けてからリトライしたほうが
戦闘開始直後に掌波を叩き込めた。3割は削れるけど、
浮かび始めたらロックオン解除される。

紅の砂漠の古代人はホーミング性能が高め。

攻略班はいませんので自力で倒しました。

なんか老人が唸り声を出したら、縦一列の太鼓落としが2回続きます。

危険な攻撃をする古代人

画面の真ん中でいきみ始めたら、
12連続ホーミング太鼓落としが来る前兆です、
吸い込み判定があるため、すぐに逃げましょう。
着弾と同時に少し破裂します。

ワープしてからの急降下キックに注意。

老人は空中で消えてから、ふわりと出現して、
亀仙人のじっちゃんみたいな動きをしました。
蹴りが着地すると、
地面が爆散して追加ダメージが入ります。
全部当たって、地面のぶつかりダメージも含めると、約500前後くらうので体力を8段階強化しても7割近くもっていかれます。直撃したらすぐに回復を入力しましょう。

 

『このゲーム、防御力の意味ない気がする』

 

そう思ったのは4回負けたせいでしょうか。

ハンバーグを70個作って持ち込みました。

本当は秘薬とか植物で強化して戦うほうがよかった。

 

古代人の倒しかた:1周目

装備の焼き入れは4段階目で止まっています。
まず、戦闘が始まったら
とりあえずダッシュして前進します

やつらが浮く前に掌波をあてて
デバフを入れてR2→R2→R1→△→△→R3→R3→R3

 

なんとか倒すと、
・古代人の首飾り

。アビスギア:古代の太鼓、だかなんだかが手に入りますね。

 

倒したときの装備:1周目

呪霜の鎧セット、冷たい闇のマント、
儚き者の弓、ビスマスの大砲槍

儚き者の殻

 

倒したときのアビスギア

攻撃のやつⅢ・・・2箇所、
会心のやつⅢ・・・2箇所
防御のやつⅢ・・・4箇所
体力回復0.2毎秒

クライミング速度倍率2%

 

脳筋が過ぎたなと反省しました。

ボス部屋の中はまあ狭く、

壁にくぼみがあって隠れたりできます

 

柱が4つあるので

隠れたり捕まったり

 

古代人の正しい倒し方

風の帳(とばり)を使いながら待ちます

敵の弾が全部、吸収できるので受け止めます

溜まってきたら放出して跳ね返します

ガードゲージを半分ほど削ることができる

 

基本的に集中状態でいればいい、
飛び蹴りが来た時も
すぐに回避することができる、らしい。

ボスの装備について

古代人プリスクスのクロスアーマーを装備している。

装備ドロップ1%の靴を装備して、

何回か倒し続けると落とすのか?

 

 

(() => { 'use strict'; const CONFIG = { articleSelector: '.entry-content', headingSelector: 'h2, h3, h4, h5', minimumHeadingsForToc: 3, enableImageZoom: true, enableProgressBar: true, enableBackToTop: true }; const ready = (fn) => { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', fn, { once: true }); } else { fn(); } }; const safeId = (text, index) => { const normalized = String(text || '') .trim() .toLowerCase() .replace(/[^\p{L}\p{N}_-]+/gu, '-') .replace(/^-+|-+$/g, '') .slice(0, 70); return normalized || `have-reader-heading-${index + 1}`; }; const uniqueId = (base, used) => { let id = base; let n = 2; while (used.has(id) || document.getElementById(id)) { id = `${base}-${n++}`; } used.add(id); return id; }; const buildToc = (article) => { const headings = [...article.querySelectorAll(CONFIG.headingSelector)] .filter((heading) => heading.textContent.trim()); if (headings.length < CONFIG.minimumHeadingsForToc) return; const usedIds = new Set(); const nav = document.createElement('nav'); nav.className = 'have-reader-toc'; nav.setAttribute('aria-label', '記事内の見出し'); const head = document.createElement('div'); head.className = 'have-reader-toc__head'; const title = document.createElement('p'); title.className = 'have-reader-toc__title'; title.textContent = 'この記事の見出し'; const toggle = document.createElement('button'); toggle.type = 'button'; toggle.className = 'have-reader-toc__toggle'; toggle.textContent = '閉じる'; toggle.setAttribute('aria-expanded', 'true'); const list = document.createElement('ol'); list.className = 'have-reader-toc__list'; const links = new Map(); headings.forEach((heading, index) => { if (!heading.id) { heading.id = uniqueId(safeId(heading.textContent, index), usedIds); } const item = document.createElement('li'); item.dataset.level = heading.tagName.slice(1); const link = document.createElement('a'); link.href = `#${encodeURIComponent(heading.id)}`; link.textContent = heading.textContent.trim(); link.addEventListener('click', (event) => { event.preventDefault(); heading.scrollIntoView({ behavior: 'smooth', block: 'start' }); history.replaceState(null, '', `#${encodeURIComponent(heading.id)}`); }); item.appendChild(link); list.appendChild(item); links.set(heading, link); }); toggle.addEventListener('click', () => { const willHide = !list.hidden; list.hidden = willHide; toggle.textContent = willHide ? '開く' : '閉じる'; toggle.setAttribute('aria-expanded', String(!willHide)); }); head.append(title, toggle); nav.append(head, list); article.parentNode.insertBefore(nav, article); if ('IntersectionObserver' in window) { const observer = new IntersectionObserver((entries) => { const visible = entries .filter((entry) => entry.isIntersecting) .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top); if (!visible.length) return; links.forEach((link) => link.classList.remove('is-current')); const current = links.get(visible[0].target); if (current) current.classList.add('is-current'); }, { rootMargin: '-12% 0px -72% 0px', threshold: [0, 1] }); headings.forEach((heading) => observer.observe(heading)); } }; const installProgressBar = (article) => { if (!CONFIG.enableProgressBar) return; const bar = document.createElement('div'); bar.className = 'have-reader-progress'; bar.setAttribute('aria-hidden', 'true'); document.body.appendChild(bar); let ticking = false; const update = () => { ticking = false; const rect = article.getBoundingClientRect(); const articleTop = window.scrollY + rect.top; const start = articleTop - Math.min(window.innerHeight * 0.2, 140); const end = articleTop + article.offsetHeight - window.innerHeight; const span = Math.max(1, end - start); const ratio = Math.min(1, Math.max(0, (window.scrollY - start) / span)); bar.style.width = `${ratio * 100}%`; }; const requestUpdate = () => { if (!ticking) { ticking = true; requestAnimationFrame(update); } }; window.addEventListener('scroll', requestUpdate, { passive: true }); window.addEventListener('resize', requestUpdate, { passive: true }); update(); }; const installBackToTop = () => { if (!CONFIG.enableBackToTop) return; const button = document.createElement('button'); button.type = 'button'; button.className = 'have-reader-top'; button.textContent = '↑'; button.setAttribute('aria-label', 'ページ上部へ戻る'); document.body.appendChild(button); const update = () => { button.classList.toggle('is-visible', window.scrollY > 700); }; button.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); window.addEventListener('scroll', update, { passive: true }); update(); }; const installImageZoom = (article) => { if (!CONFIG.enableImageZoom) return; const images = [...article.querySelectorAll('img')] .filter((img) => !img.closest('a[href]')); if (!images.length) return; const box = document.createElement('div'); box.className = 'have-reader-lightbox'; box.hidden = true; box.setAttribute('role', 'dialog'); box.setAttribute('aria-modal', 'true'); box.setAttribute('aria-label', '画像の拡大表示'); const close = document.createElement('button'); close.type = 'button'; close.className = 'have-reader-lightbox__close'; close.textContent = '×'; close.setAttribute('aria-label', '拡大表示を閉じる'); const large = document.createElement('img'); large.alt = ''; const closeBox = () => { box.hidden = true; large.removeAttribute('src'); document.documentElement.style.overflow = ''; }; const openBox = (img) => { large.src = img.currentSrc || img.src; large.alt = img.alt || ''; box.hidden = false; document.documentElement.style.overflow = 'hidden'; close.focus(); }; images.forEach((img) => { img.tabIndex = 0; img.setAttribute('role', 'button'); img.setAttribute('aria-label', `${img.alt || '記事画像'}を拡大`); img.addEventListener('click', () => openBox(img)); img.addEventListener('keydown', (event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); openBox(img); } }); }); close.addEventListener('click', closeBox); large.addEventListener('click', closeBox); box.addEventListener('click', (event) => { if (event.target === box) closeBox(); }); document.addEventListener('keydown', (event) => { if (event.key === 'Escape' && !box.hidden) closeBox(); }); box.append(close, large); document.body.appendChild(box); }; ready(() => { const articles = [...document.querySelectorAll(CONFIG.articleSelector)]; if (!articles.length) return; articles.forEach((article) => buildToc(article)); const primaryArticle = articles[0]; installProgressBar(primaryArticle); installImageZoom(primaryArticle); installBackToTop(); }); })();