ドラゴンクエストの元ネタ
大きいのはこの2本です。
- 『Ultima(ウルティマ)』
→ 見下ろし型のフィールドを歩いて、町・城・ダンジョンを探索する部分。堀井氏自身、Ultimaに強く刺激を受けたと語っています。 - 『Wizardry(ウィザードリィ)』
→ モンスターと戦う、経験値を稼ぐ、レベルアップして強くなる、HP・MP・能力値などのRPG部分。堀井氏は特に「戦って成長するレベルアップシステム」が大きな影響だったと話しています。
つまり、かなり乱暴に式にすると、
ドラクエ ≒ Ultimaの冒険世界 + Wizardryの戦闘・成長 + 堀井雄二のADV的ストーリー + 鳥山明のデザイン
です。
さらにルーツを遡ると、
Dungeons & Dragons(1974)
↓
Wizardry / Ultima(1981)
↓
ドラゴンクエスト(1986)
↓
大量のJRPG
という系譜になります。Wizardry自体がD&Dから強く影響を受けていたことも、Wizardry開発者Robert Woodheadが語っています。
面白いのは、ドラクエは単に洋RPGをそのまま持ってきたわけではなく、**「難しいPC RPGをファミコンで誰でも遊べる形に作り直した」**ところです。コマンド選択式UIなどには、堀井氏がそれ以前に作っていたアドベンチャーゲームのノウハウも入っています。
なので元ネタ度で並べるなら、1位 Wizardry、2位 Ultima、さらに祖先がD&Dという感じですね。
ちなみにここから掘るともっと面白くて、**スライム、勇者、竜王、ロト、ぱふぱふ、メタルスライムなど「ドラクエ固有に見える要素の元ネタ」**も個別にかなり辿れます。
ゼルダの伝説の元ネタ
| 元ネタ・影響 | ゼルダに入ったと考えられる要素 |
|---|---|
| Ultima | 広いフィールドを自由に探索するRPG的な感覚 |
| The Black Onyx | 剣と魔法、成長・装備を強化して冒険するRPG要素 |
| インディ・ジョーンズ | 宝探し・遺跡・冒険映画的なワクワク感 |
| ピーター・パン | リンクの緑色の服、長い帽子、妖精・エルフっぽい外見 |
| 宮本茂の少年時代の探検 | 森・洞窟を自分で歩いて秘密を見つけるゲーム構造 |
| 西洋ファンタジー | ハイラル、剣、盾、魔法、姫、怪物などの世界観 |
宮本茂本人は任天堂のインタビューで、当時『インディ・ジョーンズ』などの冒険映画が人気だったことに触れ、**「剣と魔法の世界で、宝探しをするアドベンチャーゲーム」**を作ろうとしたのがゼルダの始まりだったと話しています。
さらに宮本は、当時のPC RPGでプレイヤー同士が「自分の剣士がどれだけ強くなったか」「どこで何を見つけたか」を電話で情報交換しているのを面白いと思ったとも説明しています。つまり、RPGの成長要素+情報を自分で探す冒険を家庭用ゲーム向けに再構築したわけです。
ゲームとして一番「元ネタ臭」が強いのは
個人的には、
Ultima + The Black Onyx → 初代ゼルダ
の流れが一番分かりやすいです。宮本がこの2作品から影響を受けたという証言も残っています。
ただしゼルダ最大の特徴である、
「いきなりフィールドに放り出される → 好きな方向へ行く → 洞窟を発見する → アイテムで行動範囲が広がる」
という部分は、宮本自身の子供時代の探検体験がかなり大きいです。京都近郊の森や洞窟を探索した経験をゲームにした、と繰り返し語っています。
そして面白いのがリンクのデザイン。宮本はリンクの大きな耳と長い帽子について、ピーター・パンを連想し、ディズニーが好きだったのでそこから影響を受けたと語っています。
なのでかなり雑に系譜を書くと、
Ultima / Black Onyx
+ インディ・ジョーンズ
+ ピーター・パン/西洋ファンタジー
+ 宮本茂の洞窟探検
↓
1986年 初代『ゼルダの伝説』
という感じですね。
ちなみにもっと突っ込むと、『ハイドライド』『ドルアーガの塔』『ドラゴンスレイヤー』と初代ゼルダの類似点もかなり面白いです。こっちは「ゼルダ以前に日本で存在したアクションRPG」を並べると、ゼルダが完全な無から生まれたゲームではないことがかなり分かりやすくなります。
ToHeart3 – 未来の約束
『ToHeart3 – 未来の約束』完成しました。
『ToHeart』『ToHeart2』の世界とキャラクターたちを受け継ぎながら、新たな主人公、新たなヒロイン、そして新しい物語を描く長編ノベルゲームです。
テーマは、「思い出と未来、そしてもう一度交わす約束」。
懐かしい日常の中で再会する人たち。
新しく出会う仲間たち。
変わってしまったものと、それでも変わらなかった想い。
物語には『ToHeart』『ToHeart2』の歴代キャラクターが登場し、神岸あかり、柚原このみをはじめとしたキャラクターたちと、新たに生まれたオリジナルキャラクターが同じ世界で物語を紡いでいきます。
プレイヤーの選択によってキャラクターとの関係や物語が変化し、それぞれに長編の個別ルートを用意。
楽しい学園生活だけではなく、恋愛、友情、家族、別れ、再会、そして未来へ進んでいくことを描いた作品になっています。
主な特徴
- 『ToHeart』『ToHeart2』歴代キャラクターが登場
- 本作オリジナルキャラクターを追加
- キャラクターごとの立ち絵を実装
- 長編個別ルートを収録
- 選択肢によって変化するストーリー
- 複数のエンディング
- 日常・恋愛・青春・感動を中心とした物語
- 過去作品を知っている人が楽しめる再会やクロスオーバー要素
- 初めてこの世界に触れる人でも楽しめる新規ストーリー
昔、大切だった人。
いつの間にか離れてしまった人。
まだ出会っていない人。
そして、忘れたくない約束。
時間が流れても、人の想いは完全には消えない。
これは、過去を懐かしむだけの物語ではありません。
あの日の思い出を抱えたまま、それでも未来へ進んでいく人たちの物語です。
――いつか交わした約束の、その先へ。
『ToHeart3 – 未来の約束』
ここから、新しい物語が始まります。
Sora 3 企画書(たたき台)
Sora 3 企画書(たたき台)
企画名:Sora 3 — AI Movie Studio
コンセプト
「プロンプトを書く」から「作品を監督する」へ。
文章・画像・音声・絵コンテを入力すると、AIが映像制作工程を統合して一本の作品へ仕上げる次世代映像制作プラットフォーム。
ターゲット
個人クリエイター、YouTuber、アニメ・ゲーム制作者、映像制作会社、広告制作、インディー映画制作者。
主要機能
- 長尺動画生成:数秒単位ではなく、シーンをつないで数分〜長編作品を制作
- キャラクター固定:顔・服・体格・声などをシーンをまたいで維持
- AI絵コンテ:文章からカット割りを自動作成
- カメラ演出:パン、ドリー、ズーム、手持ち、ドローンなどを指定
- セリフ・音声・効果音・BGMを映像と同時生成
- 動画の一部分だけ再生成
- キャラクター、背景、アイテムを個別アセットとして保存
- 「監督AI」が脚本から最適な演出を提案
最大の差別化
従来:プロンプト → 動画
Sora 3:脚本 → 絵コンテ → キャラクター → 撮影 → 音声 → 編集 → 完成映像
つまり、**動画生成AIではなく「AI映像制作環境」**として設計する。
利用例
「田舎町を舞台にした90年代風青春アニメ。主人公の少女が夕暮れの駅で幼なじみを待っている」
と入力すると、キャラクターデザイン → 背景 → 絵コンテ → カメラワーク → セリフ → BGM → 映像まで自動生成。
キャッチコピー
「想像した物語を、そのまま映画に。」
アンリアルエンジン6の新機能
大きな新要素はこのあたりです。
- Verseが本格的なゲームプログラミング言語になる
- UE6ではゲームプレイのプログラミングモデルをVerseへ移行。
- PythonやC#に近い感覚を意識した言語です。
- C++とも連携します。
- 将来的には巨大なオンラインゲームを複数サーバーへ自動分散する構想まであります。
- Scene Graphという新しいゲームプレイフレームワーク
- Verseベースでゼロから設計。
- オブジェクトやゲーム機能を「再利用できるコンポーネント」として扱いやすくする方向。
- EpicはこれをUE6の新しいゲーム制作基盤にしようとしています。
- UE5とUEFNが統合される
- これがかなり大きいです。
- UE5のAAAゲーム制作能力+Fortnite/UEFNで培ったライブゲーム開発環境を、1つのUnreal Engine 6にまとめます。
- 普通のPC/PS5/Xbox向けゲームとして出すことも、Fortnite向けに出すことも、自前のオンライン環境に出すことも想定されています。
- AI開発支援がエンジン側に入る
- MCP(Model Context Protocol)対応。
- EpicはClaude、Geminiなどとの統合を明言しています。
- コード生成だけではなく、制作パイプラインそのものをAIで効率化する方向です。
- ゲーム間でコンテンツやコードを持ち運べる方向へ
- glTFやUSDなどのオープン標準を重視。
- コンテンツ・コード・ゲーム内経済などを、ゲームやエンジンをまたいで相互運用できる仕組みを目指しています。
そして気になるBlueprintですが、ここはかなり重要です。
UE6初期版ではActorとBlueprintは残ります。
いきなりBlueprintが消えるわけではありません。ただしEpicは、Scene Graph+Verseが十分成熟した段階で、Actor/Blueprintを最終的には非推奨にする計画を明言しています。その際は既存プロジェクトを新方式へ移す変換ツールも用意する方針です。
なので今Blueprintを勉強していることが無駄になるわけではありません。UE5プロジェクトについてもEpicはUE6へ「ハードな断絶を強制しない」方針です。
リリース予定
UE6 Early Access:2027年末予定
その後、
正式版:Early Accessから12〜18か月後
なので、順調なら正式版は2028年末〜2029年前半あたりになります。現在のUE5.8は「予定上最後のUE5メジャーリリース」で、必要なら5.9を出す可能性も残されています。
ゲーム開発という観点では、UE5:Blueprint中心 → UE6:Verse+Scene Graph+AI支援中心という移行が一番大きそうです。特に一人開発ではAI統合の部分がかなり面白いところです。
フルダイブVR
VR
│
├─ 1. フルダイブVR
│ │
│ ├─ 定義・目標
│ │ ├─ 人工世界内で行動と感覚の循環を成立
│ │ ├─ 現実の身体運動への依存を減らす
│ │ └─ 0/1ではなく段階的に実現
│ │
│ ├─ 必要な基本機能
│ │ ├─ ① 動作意図を取得する
│ │ ├─ ② アバター/仮想世界を動かす
│ │ ├─ ③ 感覚を身体へフィードバックする
│ │ └─ ④ 現実由来の不要な感覚を抑える
│ │
│ └─ 実現段階
│ ├─ 現在のVR
│ ├─ Motion-Less VR
│ ├─ ハーフ/クォータダイブ
│ └─ 完全フルダイブ
│
├─ 2. 入力技術 ── 人間 → VR
│ │
│ ├─ BMI / BCI
│ │ ├─ Brain-machine Interface
│ │ ├─ 脳波センサー
│ │ ├─ 脳波によるゲーム操作
│ │ ├─ 医療BMI
│ │ └─ Neurable
│ │
│ ├─ Motion-Less VR
│ │ └─ 動作意図の取得
│ │
│ └─ 従来方式
│ └─ フルボディトラッキング
│
├─ 3. 感覚出力 ── VR → 人間
│ │
│ ├─ 視覚
│ ├─ 聴覚
│ ├─ 触覚
│ │ ├─ テスラスーツ
│ │ └─ 「触原色」/舘研究室
│ ├─ 運動感覚
│ │ └─ Motion-Less VR
│ ├─ 味覚
│ │ ├─ VRの味覚
│ │ └─ VRで食べられる食べ物
│ └─ 前庭感覚・身体感覚
│
├─ 4. 仮想身体
│ │
│ ├─ アバター
│ ├─ VRM
│ ├─ VRMより高度なアバター
│ ├─ Live2D → 3DCG
│ ├─ AIによる3DCG化
│ └─ 身体図式
│
├─ 5. 仮想世界
│ │
│ ├─ Unity
│ ├─ 3DCG
│ ├─ AIによる自動生成・配置
│ ├─ Google Earth
│ │ ├─ 地球データ
│ │ └─ 地球規模の仮想世界
│ └─ AI
│ ├─ アセット生成
│ ├─ 自動読み込み
│ └─ 自動配置
│
├─ 6. フルダイブVRの用途
│ │
│ ├─ フルダイブMMO
│ ├─ ゲーム
│ ├─ Vtuber
│ │ └─ フルダイブMMO内でアイドル活動
│ ├─ アート
│ ├─ 教育
│ │ ├─ フルダイブ型授業
│ │ └─ AIとの語学学習
│ └─ オンラインコミュニケーション
│
├─ 7. 社会・安全
│ │
│ ├─ 法律
│ ├─ VR社会のルール
│ ├─ 長時間利用
│ └─ VR酔い
│
├─ 8. 研究機関・研究
│ │
│ ├─ 人工世界実装研究室(AWIL)
│ │ ├─ Motion-Less VR
│ │ ├─ 運動意図
│ │ ├─ 運動感覚
│ │ └─ VR酔い
│ │
│ ├─ 舘研究室
│ │ └─ 触覚・テレイグジスタンス
│ │
│ └─ フルダイブ型VR授業研究
│
├─ 9. 資料・論文・URL
│ │
│ ├─ AWIL
│ ├─ PROTRUDE 2021
│ ├─ KDDI Research
│ ├─ NHK BMI
│ ├─ UploadVR / Neurable
│ ├─ 4Gamer
│ └─ 論文
│
└─ 10. 遠未来アイデア【フルダイブと分離】
│
├─ 不老不死
├─ DNA情報
├─ 量子テレポート
├─ 空飛ぶ車
├─ 自動運転
└─ 生殖関連アイデア
文字数カウントサイト
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>文字数カウント</title>
<style>
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
font-family: Arial, "Hiragino Kaku Gothic ProN", "Yu Gothic", sans-serif;
background: #f4f6f8;
color: #222;
display: flex;
justify-content: center;
align-items: center;
padding: 30px;
}
.container {
width: 100%;
max-width: 900px;
background: white;
padding: 30px;
border-radius: 16px;
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08);
}
h1 {
margin-top: 0;
text-align: center;
}
textarea {
width: 100%;
height: 350px;
resize: vertical;
padding: 18px;
font-size: 16px;
line-height: 1.7;
border: 1px solid #ccc;
border-radius: 10px;
outline: none;
}
textarea:focus {
border-color: #555;
}
.counts {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 12px;
margin-top: 20px;
}
.count-box {
background: #f7f7f7;
padding: 18px;
border-radius: 10px;
text-align: center;
}
.count-box strong {
display: block;
font-size: 28px;
margin-top: 5px;
}
.buttons {
margin-top: 20px;
display: flex;
gap: 10px;
justify-content: center;
flex-wrap: wrap;
}
button {
border: none;
padding: 12px 22px;
border-radius: 8px;
cursor: pointer;
font-size: 15px;
background: #222;
color: white;
}
button:hover {
opacity: 0.8;
}
</style>
</head>
<body>
<div class="container">
<h1>文字数カウント</h1>
<textarea
id="text"
placeholder="ここに文章を入力してください"
></textarea>
<div class="counts">
<div class="count-box">
文字数
<strong id="characterCount">0</strong>
</div>
<div class="count-box">
空白を除く
<strong id="noSpaceCount">0</strong>
</div>
<div class="count-box">
行数
<strong id="lineCount">0</strong>
</div>
</div>
<div class="buttons">
<button id="copyButton">
コピー
</button>
<button id="clearButton">
すべて削除
</button>
</div>
</div>
<script>
const textArea = document.getElementById("text");
const characterCount =
document.getElementById("characterCount");
const noSpaceCount =
document.getElementById("noSpaceCount");
const lineCount =
document.getElementById("lineCount");
const copyButton =
document.getElementById("copyButton");
const clearButton =
document.getElementById("clearButton");
function countText() {
const text = textArea.value;
// 全文字数
characterCount.textContent = text.length;
// 空白・改行を除いた文字数
noSpaceCount.textContent =
text.replace(/\s/g, "").length;
// 行数
if (text.length === 0) {
lineCount.textContent = 0;
} else {
lineCount.textContent =
text.split("\n").length;
}
}
textArea.addEventListener(
"input",
countText
);
copyButton.addEventListener(
"click",
async () => {
await navigator.clipboard.writeText(
textArea.value
);
copyButton.textContent =
"コピーしました";
setTimeout(() => {
copyButton.textContent =
"コピー";
}, 1500);
}
);
clearButton.addEventListener(
"click",
() => {
textArea.value = "";
countText();
textArea.focus();
}
);
</script>
</body>
</html>
star_breaker_stg_stage5_power_barrage.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>STAR BREAKER - 5 STAGE STG</title>
<style>
:root{--cyan:#55efff;--pink:#ff4fd8;--yellow:#ffe66d;--bg:#02040e}
*{box-sizing:border-box}
html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#02040e;color:#fff;font-family:system-ui,-apple-system,"Yu Gothic UI",sans-serif}
body{display:grid;place-items:center;background:radial-gradient(circle at 50% 20%,#17265e,#050817 50%,#010208)}
#wrap{position:relative;width:min(100vw,900px);height:min(100vh,960px);aspect-ratio:3/4;overflow:hidden;border:1px solid #55efff55;box-shadow:0 0 36px #55efff22;background:#02040e}
canvas{display:block;width:100%;height:100%;touch-action:none;cursor:crosshair}
#hud{position:absolute;inset:0;pointer-events:none;font-weight:900;text-shadow:0 0 8px #55efff}
.top{position:absolute;top:12px;left:16px;right:16px;display:flex;justify-content:space-between;gap:12px;font-size:clamp(12px,2vw,19px)}
#stageLabel{position:absolute;top:45px;left:0;right:0;text-align:center;color:#bff8ff;letter-spacing:.22em}
#bossWrap{display:none;position:absolute;top:73px;left:9%;width:82%}
#bossName{text-align:center;font-size:13px;margin-bottom:5px;color:#ffd4f5}
.bar{height:13px;border:1px solid #ffffffaa;background:#ffffff12}
#bossHp{height:100%;width:100%;background:linear-gradient(90deg,#ff4fd8,#ff9a3d)}
.overlay{position:absolute;inset:0;display:grid;place-items:center;background:linear-gradient(#02040e33,#02040ecc);z-index:5}
.panel{width:min(88%,650px);padding:clamp(22px,5vw,44px);text-align:center;background:#081027e8;border:1px solid #55efff88;box-shadow:0 0 28px #55efff33;backdrop-filter:blur(7px)}
h1{margin:0 0 10px;font-size:clamp(38px,8vw,76px);line-height:.9;color:#fff;text-shadow:0 0 9px #fff,0 0 22px #55efff,4px 4px 0 #ff4fd8}
.sub{color:#8deeff;letter-spacing:.25em;margin-bottom:22px;font-weight:800}
#message{line-height:1.8;color:#ddebff}
button{margin:20px 7px 0;padding:14px 28px;border:0;border-radius:999px;color:#fff;font-weight:900;font-size:17px;cursor:pointer;background:linear-gradient(90deg,#55efff,#7277ff,#ff4fd8);box-shadow:0 0 18px #55efff66}
button.secondary{background:#252c46;box-shadow:none;border:1px solid #ffffff44}
button:hover{filter:brightness(1.15);transform:scale(1.03)}
.small{margin-top:18px;padding-top:14px;border-top:1px solid #ffffff22;color:#b7c9dd;font-size:13px;line-height:1.7}
#mobile{position:absolute;left:0;right:0;bottom:12px;display:none;justify-content:space-between;padding:0 14px;pointer-events:none;z-index:4}
.group{display:flex;gap:8px;pointer-events:auto}.touch{width:58px;height:58px;margin:0;padding:0;border-radius:50%;opacity:.62;font-size:20px}
@media(pointer:coarse){#mobile{display:flex}}
</style>
</head>
<body>
<div id="wrap">
<canvas id="game" width="720" height="960"></canvas>
<div id="hud">
<div class="top">
<div>SCORE <span id="score">0000000</span></div>
<div>HI <span id="high">0000000</span></div>
<div>POWER <span id="power">1</span></div>
</div>
<div id="stageLabel">STAGE 1 / 5</div>
<div id="bossWrap">
<div id="bossName">BOSS</div>
<div class="bar"><div id="bossHp"></div></div>
</div>
</div>
<div id="overlay" class="overlay">
<div class="panel">
<h1 id="title">STAR<br>BREAKER</h1>
<div class="sub" id="subtitle">5 STAGE MISSION</div>
<div id="message">全5ステージを突破し、最終要塞を破壊せよ。<br>敵弾に一発でも当たると爆発してゲームオーバー。<br>POWERアイテムでショットを最大5段階まで強化。</div>
<div id="buttons">
<button id="startBtn">GAME START</button>
</div>
<div class="small">PC:WASD / 矢印キー / マウスドラッグで移動 | P:一時停止<br>スマホ:画面ドラッグ、または下の移動ボタン</div>
</div>
</div>
<div id="mobile">
<div class="group"><button class="touch" data-key="left">◀</button><button class="touch" data-key="right">▶</button></div>
<div class="group"><button class="touch" data-key="up">▲</button><button class="touch" data-key="down">▼</button></div>
</div>
</div>
<script>
(()=>{
"use strict";
const canvas=document.getElementById("game"),ctx=canvas.getContext("2d");
const W=720,H=960;
const scoreEl=document.getElementById("score"),highEl=document.getElementById("high"),powerEl=document.getElementById("power");
const stageLabel=document.getElementById("stageLabel"),bossWrap=document.getElementById("bossWrap"),bossName=document.getElementById("bossName"),bossHp=document.getElementById("bossHp");
const overlay=document.getElementById("overlay"),title=document.getElementById("title"),subtitle=document.getElementById("subtitle"),message=document.getElementById("message"),buttons=document.getElementById("buttons");
let running=false,paused=false,dead=false,last=0,time=0,score=0,high=Number(localStorage.getItem("starBreaker5High")||0);
let stage=1,stageTime=0,waveTimer=0,wavesSpawned=0,bossActive=false,transition=false,shake=0,flash=0;
let pointer=false;
const keys={},bullets=[],enemyBullets=[],enemies=[],particles=[],powerups=[],stars=[];
const stageData=[
{name:"ORBITAL FRONT",duration:23,boss:"IRON TALON",hp:260,bg:["#07112c","#02040e"]},
{name:"CRIMSON NEBULA",duration:25,boss:"SCARLET MANTA",hp:380,bg:["#2b071c","#07030b"]},
{name:"ASTEROID BELT",duration:27,boss:"GRAVITY GOLEM",hp:520,bg:["#241b10","#050403"]},
{name:"VOID TEMPLE",duration:29,boss:"ABYSS SERAPH",hp:700,bg:["#16072a","#030109"]},
{name:"FINAL FORTRESS",duration:32,boss:"OMEGA EMPRESS",hp:980,bg:["#051b26","#010408"]}
];
const player={x:W/2,y:H-120,r:11,speed:410,cool:0,rate:.12,power:1,maxPower:5,inv:0,tilt:0};
for(let i=0;i<150;i++)stars.push({x:Math.random()*W,y:Math.random()*H,z:Math.random()*2.5+.5,a:Math.random()*.8+.2});
function clearAll(){bullets.length=enemyBullets.length=enemies.length=particles.length=powerups.length=0}
function updateHUD(){
scoreEl.textContent=String(Math.floor(score)).padStart(7,"0");
highEl.textContent=String(Math.floor(high)).padStart(7,"0");
powerEl.textContent=player.power>=player.maxPower?"MAX":player.power;
stageLabel.textContent=`STAGE ${stage} / 5 ${stageData[stage-1].name}`;
}
function reset(){
clearAll();stage=1;stageTime=0;waveTimer=0;wavesSpawned=0;bossActive=false;transition=false;dead=false;paused=false;
score=0;time=0;shake=0;flash=0;player.x=W/2;player.y=H-120;player.cool=0;player.power=1;player.inv=1;
bossWrap.style.display="none";updateHUD();
}
function begin(){
reset();running=true;overlay.style.display="none";last=performance.now();requestAnimationFrame(loop);
}
function addScore(n){
score+=n;if(score>high){high=score;localStorage.setItem("starBreaker5High",String(Math.floor(high)))}updateHUD();
}
function burst(x,y,color,count=25,speed=260){
for(let i=0;i<count;i++){const a=Math.random()*Math.PI*2,s=Math.random()*speed+40;
particles.push({x,y,vx:Math.cos(a)*s,vy:Math.sin(a)*s,life:Math.random()*.7+.3,max:1,size:Math.random()*6+2,color});
}}
function shoot(){
let shots=[];
if(player.power===1)shots=[{a:0,x:0,d:1}];
if(player.power===2)shots=[{a:-.10,x:-7,d:1},{a:.10,x:7,d:1}];
if(player.power===3)shots=[{a:-.18,x:-10,d:1},{a:0,x:0,d:2},{a:.18,x:10,d:1}];
if(player.power===4)shots=[{a:-.25,x:-15,d:2},{a:-.08,x:-5,d:2},{a:.08,x:5,d:2},{a:.25,x:15,d:2}];
if(player.power>=5)shots=[
{a:-.31,x:-18,d:2},{a:-.16,x:-10,d:2},{a:0,x:0,d:3},
{a:.16,x:10,d:2},{a:.31,x:18,d:2}
];
shots.forEach(s=>bullets.push({
x:player.x+s.x,y:player.y-20,
vx:Math.sin(s.a)*230,vy:-820,
r:s.d>=3?7:5,dmg:s.d,power:player.power
}));
player.rate=Math.max(.065,.13-player.power*.013);
}
function spawnEnemy(type,x,y){
const s=stage;
if(type==="scout")enemies.push({type,x,y,r:19,hp:1+s,maxHp:1+s,vx:(Math.random()-.5)*130,vy:105+s*11,age:0,shot:1.2+Math.random()});
if(type==="zig")enemies.push({type,x,y,r:22,hp:3+s,maxHp:3+s,vx:0,vy:80+s*7,age:Math.random()*5,shot:.9+Math.random()});
if(type==="tank")enemies.push({type,x,y,r:32,hp:11+s*4,maxHp:11+s*4,vx:0,vy:42+s*3,age:0,shot:.7});
}
function spawnWave(){
wavesSpawned++;
const pattern=(wavesSpawned+stage)%4;
if(pattern===0){for(let i=0;i<7;i++)spawnEnemy("scout",75+i*95,-40-i*34)}
if(pattern===1){for(let i=0;i<6;i++)spawnEnemy("zig",90+i*108,-45-i*70)}
if(pattern===2){spawnEnemy("tank",W/2,-70);for(let i=0;i<4;i++)spawnEnemy("scout",120+i*160,-160-i*40)}
if(pattern===3){for(let i=0;i<3;i++){spawnEnemy("zig",170+i*190,-60-i*80);spawnEnemy("scout",90+i*250,-190-i*50)}}
}
function spawnBoss(){
bossActive=true;enemyBullets.length=0;
const d=stageData[stage-1];
enemies.push({type:"boss",x:W/2,y:-130,r:82,hp:d.hp,maxHp:d.hp,age:0,shot:.6,stage,vy:48});
bossName.textContent=d.boss;bossHp.style.width="100%";bossWrap.style.display="block";
}
function addEnemyBullet(x,y,a,speed,r=7,color="#ff8ae7"){
enemyBullets.push({x,y,vx:Math.cos(a)*speed,vy:Math.sin(a)*speed,r,color});
}
function enemyShoot(e){
const aim=Math.atan2(player.y-e.y,player.x-e.x);
const base=145+stage*18;
if(e.type==="scout"){
if(stage<=2){
for(let i=-1;i<=1;i++)addEnemyBullet(e.x,e.y,aim+i*.12,base,6,"#ff8ae7");
}else{
for(let i=-2;i<=2;i++)addEnemyBullet(e.x,e.y,aim+i*.13,base+12,6,"#ff8ae7");
}
}
if(e.type==="zig"){
const count=5+stage;
for(let i=0;i<count;i++){
const a=(i/(count-1)-.5)*1.15+Math.PI/2;
addEnemyBullet(e.x,e.y,a,145+stage*12,6,"#9d8cff");
}
addEnemyBullet(e.x,e.y,aim,210+stage*8,5,"#ffffff");
}
if(e.type==="tank"){
const n=10+stage*2;
for(let i=0;i<n;i++){
const a=i*Math.PI*2/n+e.age*.32;
addEnemyBullet(e.x,e.y,a,125+stage*10,7,"#ffb25f");
}
for(let i=-2;i<=2;i++)addEnemyBullet(e.x,e.y,aim+i*.15,190+stage*10,6,"#fff0a8");
}
if(e.type==="boss"){
const ratio=e.hp/e.maxHp;
if(e.stage===1){
for(let ring=0;ring<2;ring++){
for(let i=-5;i<=5;i++){
const a=aim+i*.12+(ring?0.055:0);
addEnemyBullet(e.x,e.y+35,a,195+ring*45,7,ring?"#ffd1f4":"#ff78d8");
}
}
}
if(e.stage===2){
const n=22;
for(let i=0;i<n;i++){
const a=i*Math.PI*2/n+e.age*.62;
addEnemyBullet(e.x,e.y,a,155+(i%2)*42,7,i%2?"#ff7ac8":"#a884ff");
}
for(let i=-2;i<=2;i++)addEnemyBullet(e.x,e.y+25,aim+i*.13,235,6,"#ffffff");
}
if(e.stage===3){
for(let ring=0;ring<3;ring++){
const n=12+ring*4;
for(let i=0;i<n;i++){
const a=i*Math.PI*2/n+e.age*(ring%2?-.42:.42);
addEnemyBullet(e.x,e.y,a,115+ring*42,8-ring,"#ffb35f");
}
}
}
if(e.stage===4){
for(let side=-1;side<=1;side+=2){
for(let i=0;i<9;i++){
const a=aim+side*(.08+i*.085)+Math.sin(e.age*1.8)*.18;
addEnemyBullet(e.x+side*45,e.y+20,a,205+i*6,6,"#b477ff");
}
}
if(ratio<.5){
for(let i=0;i<18;i++){
const a=i*Math.PI/9-e.age*.55;
addEnemyBullet(e.x,e.y,a,175,7,"#ff70dd");
}
}
}
if(e.stage===5){
const n=ratio>.6?28:38;
for(let i=0;i<n;i++){
const a=i*Math.PI*2/n+e.age*.78;
addEnemyBullet(e.x,e.y,a,150+(i%4)*28,7,i%2?"#ff4fd8":"#65eaff");
}
for(let i=-5;i<=5;i++)addEnemyBullet(e.x,e.y+42,aim+i*.095,250,6,"#fff2a8");
if(ratio<.45){
for(let i=0;i<20;i++){
const a=i*Math.PI/10-e.age*1.05;
addEnemyBullet(e.x,e.y,a,225,5,"#ffffff");
}
}
}
}
}
function collide(a,b){const dx=a.x-b.x,dy=a.y-b.y;return dx*dx+dy*dy<(a.r+b.r)*(a.r+b.r)}
function gameOver(){
if(dead)return;dead=true;running=false;shake=34;flash=.75;
burst(player.x,player.y,"#ff4fd8",120,430);burst(player.x,player.y,"#ffe66d",80,360);
draw();
setTimeout(()=>{
title.innerHTML="GAME<br>OVER";subtitle.textContent="SHIP DESTROYED";
message.innerHTML=`敵弾に命中し、機体が爆発した。<br>SCORE:<b>${Math.floor(score).toLocaleString()}</b> STAGE:<b>${stage}</b>`;
buttons.innerHTML='<button id="retryBtn">リトライ</button><button id="quitBtn" class="secondary">やめる</button>';
overlay.style.display="grid";
document.getElementById("retryBtn").addEventListener("click",begin);
document.getElementById("quitBtn").addEventListener("click",quitGame);
},650);
}
function quitGame(){
clearAll();dead=false;bossWrap.style.display="none";
title.innerHTML="STAR<br>BREAKER";subtitle.textContent="MISSION ABORTED";
message.innerHTML="ゲームを終了しました。<br>もう一度遊ぶときはスタートを押してください。";
buttons.innerHTML='<button id="againBtn">GAME START</button>';
document.getElementById("againBtn").addEventListener("click",begin);
draw();
}
function stageClear(){
transition=true;bossActive=false;bossWrap.style.display="none";enemyBullets.length=0;clearAll();
addScore(2500*stage);
if(stage===5){running=false;title.innerHTML="ALL<br>CLEAR";subtitle.textContent="OMEGA FORTRESS DESTROYED";
message.innerHTML=`全5ステージ制覇!<br>FINAL SCORE:<b>${Math.floor(score).toLocaleString()}</b>`;
buttons.innerHTML='<button id="retryAll">もう一度遊ぶ</button><button id="quitAll" class="secondary">やめる</button>';
overlay.style.display="grid";
document.getElementById("retryAll").addEventListener("click",begin);
document.getElementById("quitAll").addEventListener("click",quitGame);
return;
}
running=false;title.innerHTML=`STAGE ${stage}<br>CLEAR`;subtitle.textContent=stageData[stage-1].boss+" DESTROYED";
message.innerHTML=`次は STAGE ${stage+1}「${stageData[stage].name}」`;
buttons.innerHTML='<button id="nextStage">NEXT STAGE</button>';
overlay.style.display="grid";
document.getElementById("nextStage").addEventListener("click",()=>{
stage++;stageTime=0;waveTimer=0;wavesSpawned=0;transition=false;player.x=W/2;player.y=H-120;player.inv=1.5;
updateHUD();overlay.style.display="none";running=true;last=performance.now();requestAnimationFrame(loop);
});
}
function update(dt){
time+=dt;stageTime+=dt;if(player.inv>0)player.inv-=dt;if(shake>0)shake=Math.max(0,shake-dt*55);if(flash>0)flash=Math.max(0,flash-dt*1.7);
stars.forEach(s=>{s.y+=(55+s.z*65+stage*8)*dt;if(s.y>H){s.y=-5;s.x=Math.random()*W}});
let dx=0,dy=0;if(keys.ArrowLeft||keys.a||keys.left)dx--;if(keys.ArrowRight||keys.d||keys.right)dx++;if(keys.ArrowUp||keys.w||keys.up)dy--;if(keys.ArrowDown||keys.s||keys.down)dy++;
const l=Math.hypot(dx,dy)||1;dx/=l;dy/=l;player.x+=dx*player.speed*dt;player.y+=dy*player.speed*dt;player.x=Math.max(25,Math.min(W-25,player.x));player.y=Math.max(95,Math.min(H-35,player.y));player.tilt+=(dx*.45-player.tilt)*Math.min(1,dt*10);
player.cool-=dt;if(player.cool<=0){shoot();player.cool=player.rate}
if(!bossActive){
waveTimer-=dt;if(waveTimer<=0){spawnWave();waveTimer=Math.max(2.5,4.6-stage*.28)}
if(stageTime>=stageData[stage-1].duration)spawnBoss();
}
for(let i=bullets.length-1;i>=0;i--){const b=bullets[i];b.x+=b.vx*dt;b.y+=b.vy*dt;if(b.y<-30||b.x<-30||b.x>W+30)bullets.splice(i,1)}
for(let i=enemyBullets.length-1;i>=0;i--){const b=enemyBullets[i];b.x+=b.vx*dt;b.y+=b.vy*dt;if(b.y>H+50||b.y<-60||b.x<-60||b.x>W+60){enemyBullets.splice(i,1);continue}if(player.inv<=0&&collide(b,player)){enemyBullets.splice(i,1);gameOver();return}}
for(let i=enemies.length-1;i>=0;i--){const e=enemies[i];e.age+=dt;
if(e.type==="scout"){e.x+=e.vx*dt;e.y+=e.vy*dt;if(e.x<30||e.x>W-30)e.vx*=-1}
if(e.type==="zig"){e.y+=e.vy*dt;e.x+=Math.sin(e.age*2.5)*125*dt}
if(e.type==="tank"){e.y+=e.vy*dt;e.x=W/2+Math.sin(e.age*.85)*220}
if(e.type==="boss"){if(e.y<165)e.y+=e.vy*dt;else e.x=W/2+Math.sin(e.age*(.55+e.stage*.06))*245;bossHp.style.width=Math.max(0,e.hp/e.maxHp*100)+"%"}
e.shot-=dt;if(e.shot<=0&&e.y>0){enemyShoot(e);e.shot=e.type==="boss"?Math.max(.22,.62-stage*.065):e.type==="tank"?1.08:e.type==="zig"?.92:1.12}
for(let j=bullets.length-1;j>=0;j--){const b=bullets[j];if(collide(b,e)){e.hp-=b.dmg;bullets.splice(j,1);burst(b.x,b.y,"#ffe66d",4,80);
if(e.hp<=0){const boss=e.type==="boss";burst(e.x,e.y,boss?"#ff4fd8":"#55efff",boss?130:28,boss?430:230);shake=boss?30:7;
addScore(boss?5000*stage:e.type==="tank"?550:e.type==="zig"?220:100);
if(!boss){
const dropRate=e.type==="tank"?.60:e.type==="zig"?.32:.20;
if(Math.random()<dropRate)powerups.push({x:e.x,y:e.y,r:15,vy:82,spin:0});
}
enemies.splice(i,1);if(boss){enemyBullets.length=0;setTimeout(stageClear,550)}break;
}}}
if(i<enemies.length&&e.y>H+100)enemies.splice(i,1);
else if(i<enemies.length&&player.inv<=0&&collide(e,player)){gameOver();return}
}
for(let i=powerups.length-1;i>=0;i--){const p=powerups[i];p.y+=p.vy*dt;p.spin+=dt*4;if(collide(p,player)){player.power=Math.min(player.maxPower,player.power+1);addScore(player.power>=player.maxPower?800:400);burst(p.x,p.y,"#ffe66d",20,190);powerups.splice(i,1);updateHUD()}else if(p.y>H+30)powerups.splice(i,1)}
for(let i=particles.length-1;i>=0;i--){const p=particles[i];p.x+=p.vx*dt;p.y+=p.vy*dt;p.vx*=.984;p.vy*=.984;p.life-=dt;if(p.life<=0)particles.splice(i,1)}
}
function drawShip(){
ctx.save();ctx.translate(player.x,player.y);ctx.rotate(player.tilt);if(player.inv>0&&Math.floor(player.inv*13)%2===0)ctx.globalAlpha=.3;
ctx.shadowBlur=22;ctx.shadowColor="#55efff";ctx.fillStyle="#e9fdff";ctx.beginPath();ctx.moveTo(0,-27);ctx.lineTo(18,19);ctx.lineTo(0,10);ctx.lineTo(-18,19);ctx.closePath();ctx.fill();
ctx.fillStyle="#ff4fd8";ctx.beginPath();ctx.moveTo(0,-13);ctx.lineTo(7,11);ctx.lineTo(-7,11);ctx.closePath();ctx.fill();
ctx.shadowColor="#ff9a3d";ctx.fillStyle="#fff";ctx.beginPath();ctx.moveTo(-7,15);ctx.lineTo(0,35+Math.random()*9);ctx.lineTo(7,15);ctx.closePath();ctx.fill();ctx.restore();
}
function drawEnemy(e){
ctx.save();ctx.translate(e.x,e.y);
if(e.type==="boss"){ctx.rotate(Math.sin(e.age*.8)*.07);ctx.shadowBlur=28;ctx.shadowColor="#ff4fd8";ctx.fillStyle=`hsl(${305-e.stage*18} 65% 22%)`;ctx.beginPath();ctx.moveTo(0,-72);ctx.lineTo(96,-18);ctx.lineTo(65,60);ctx.lineTo(0,36);ctx.lineTo(-65,60);ctx.lineTo(-96,-18);ctx.closePath();ctx.fill();ctx.strokeStyle="#ff76df";ctx.lineWidth=5;ctx.stroke();ctx.fillStyle="#fff";ctx.beginPath();ctx.arc(0,-4,25,0,Math.PI*2);ctx.fill();ctx.fillStyle="#ff4fd8";ctx.beginPath();ctx.arc(0,-4,11,0,Math.PI*2);ctx.fill()}
else{const c=e.type==="tank"?"#ff9a3d":e.type==="zig"?"#a873ff":"#55efff";ctx.shadowBlur=16;ctx.shadowColor=c;ctx.fillStyle=c;if(e.type==="tank"){ctx.beginPath();ctx.roundRect(-29,-24,58,48,12);ctx.fill();ctx.fillStyle="#fff";ctx.fillRect(-8,-31,16,24)}else{ctx.rotate(Math.PI);ctx.beginPath();ctx.moveTo(0,-24);ctx.lineTo(22,18);ctx.lineTo(0,8);ctx.lineTo(-22,18);ctx.closePath();ctx.fill();ctx.fillStyle="#fff";ctx.beginPath();ctx.arc(0,2,6,0,Math.PI*2);ctx.fill()}}
ctx.restore();
}
function draw(){
const bg=stageData[Math.max(0,stage-1)].bg,g=ctx.createLinearGradient(0,0,0,H);g.addColorStop(0,bg[0]);g.addColorStop(1,bg[1]);ctx.fillStyle=g;ctx.fillRect(0,0,W,H);
ctx.save();if(shake>0)ctx.translate((Math.random()-.5)*shake,(Math.random()-.5)*shake);
stars.forEach(s=>{ctx.globalAlpha=s.a;ctx.fillStyle="#fff";ctx.fillRect(s.x,s.y,s.z,s.z*3)});ctx.globalAlpha=1;
for(const b of bullets){ctx.shadowBlur=15;ctx.shadowColor="#55efff";ctx.fillStyle="#efffff";ctx.fillRect(b.x-3,b.y-13,6,24)}ctx.shadowBlur=0;
for(const b of enemyBullets){ctx.shadowBlur=14;ctx.shadowColor=b.color||"#ff4fd8";ctx.fillStyle=b.color||"#ff8ae7";ctx.beginPath();ctx.arc(b.x,b.y,b.r,0,Math.PI*2);ctx.fill()}ctx.shadowBlur=0;
enemies.forEach(drawEnemy);
powerups.forEach(p=>{ctx.save();ctx.translate(p.x,p.y);ctx.rotate(p.spin);ctx.shadowBlur=18;ctx.shadowColor="#ffe66d";ctx.fillStyle="#ffe66d";ctx.beginPath();for(let i=0;i<8;i++){const a=i*Math.PI/4,r=i%2?7:15;ctx.lineTo(Math.cos(a)*r,Math.sin(a)*r)}ctx.closePath();ctx.fill();ctx.restore()});
particles.forEach(p=>{ctx.globalAlpha=Math.max(0,p.life/p.max);ctx.fillStyle=p.color;ctx.fillRect(p.x,p.y,p.size,p.size)});ctx.globalAlpha=1;
if(!dead)drawShip();
if(paused){ctx.fillStyle="#0009";ctx.fillRect(0,0,W,H);ctx.fillStyle="#fff";ctx.textAlign="center";ctx.font="bold 54px system-ui";ctx.fillText("PAUSE",W/2,H/2)}
if(flash>0){ctx.globalAlpha=flash;ctx.fillStyle="#fff";ctx.fillRect(0,0,W,H);ctx.globalAlpha=1}
ctx.restore();
}
function loop(now){if(!running)return;const dt=Math.min(.033,(now-last)/1000);last=now;if(!paused)update(dt);draw();if(running)requestAnimationFrame(loop)}
function setPointer(e){const r=canvas.getBoundingClientRect();player.x=(e.clientX-r.left)/r.width*W;player.y=(e.clientY-r.top)/r.height*H}
addEventListener("keydown",e=>{keys[e.key]=true;keys[e.key.toLowerCase()]=true;if(e.key.toLowerCase()==="p"&&running)paused=!paused;if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"," "].includes(e.key))e.preventDefault()});
addEventListener("keyup",e=>{keys[e.key]=false;keys[e.key.toLowerCase()]=false});
canvas.addEventListener("pointerdown",e=>{pointer=true;setPointer(e)});canvas.addEventListener("pointermove",e=>{if(pointer)setPointer(e)});addEventListener("pointerup",()=>pointer=false);
document.querySelectorAll(".touch").forEach(b=>{const k=b.dataset.key;b.addEventListener("pointerdown",e=>{e.preventDefault();keys[k]=true});b.addEventListener("pointerup",()=>keys[k]=false);b.addEventListener("pointercancel",()=>keys[k]=false)});
document.getElementById("startBtn").addEventListener("click",begin);
highEl.textContent=String(high).padStart(7,"0");updateHUD();draw();
})();
</script>
</body>
</html>
「Gジェネレーション クロスブースト」ゲーム企画書
「Gジェネレーション クロスブースト」ゲーム企画書
タイトル
SDガンダム ジージェネレーション クロスブースト
ジャンル
- ガンダム戦略シミュレーションRPG
- 育成 × クロスオーバー × リアルタイム演出
コンセプト
歴代ガンダム作品の世界を越え、
異なる時代・勢力・機体・パイロットが交差する――
「限界突破(クロスブースト)」 をテーマにした
新世代Gジェネレーション。
従来のターン制戦略に加え、
- ブースト覚醒
- 合体戦術
- リンク必殺技
- 巨大ボスレイド
- AI戦艦支援
などを搭載し、
“育成の気持ちよさ” と “戦闘演出の熱さ” を極限まで強化する。
世界観
宇宙世紀、アナザー、未来世紀、厄祭戦…
全ガンダム世界を繋ぐ謎の次元崩壊
「クロスブレイク」 が発生。
時空が混ざり合い、
- アムロとキラ
- 刹那とヒイロ
- バナージとシーブック
など、本来出会わない戦士たちが共闘する。
しかしその裏では、
全時代を支配しようとする
謎の存在「ゼロ・オリジン」が動き始めていた。
ゲームシステム
1. クロスブーストシステム
本作最大の特徴。
戦闘中にテンションMAXで発動。
機体性能が大幅上昇し、
- 攻撃回数増加
- MAP兵器強化
- EN消費軽減
- 演出変化
- 専用BGM
などが発生。
例
機動戦士ガンダムSEED DESTINY
- ストライクフリーダムガンダム
→ スーパードラグーン全展開
機動戦士ガンダム00
- ダブルオーライザー
→ TRANS-AM BURST発動
機動戦士ガンダムUC
- ユニコーンガンダム
→ 覚醒モード変化
2. クロスリンク必殺技
特定キャラ同士で超演出発動。
例
アムロ × カミーユ × ジュドー
「宇宙世紀の光」
キラ × 刹那
「未来を切り開く力」
ヒイロ × 刹那
「ゼロとイノベイター」
超高火力+特殊カットイン。
3. 超大型レイドボス
最大8部隊で挑む。
レイド候補
- デビルガンダム最終形態
- ネオ・ジオング
- ELSクアンタ暴走体
- ターンX完全覚醒
- グレートジオング
- オリジナル巨大MA
4. 戦艦AI支援システム
艦長によって能力が変化。
例
オットー艦長
- EN回復
- 命中支援
- UC系強化
ブライト艦長
- 全体士気アップ
- 回避率上昇
マリュー艦長
- SEED系強化
5. SSP・ULT進化システム
既存のSP化をさらに進化。
SSP
- 限界突破
- 新武装追加
- カットイン追加
ULT
最終覚醒段階。
- 機体外観変化
- 専用BGM
- EX必殺技
- 特殊台詞追加
ストーリーモード
Chapter 1
「崩壊する宇宙世紀」
Chapter 2
「アナザー世界侵食」
Chapter 3
「鉄血とSEEDの衝突」
Chapter 4
「ELS襲来」
Chapter 5
「∀の黒歴史」
Final
「全てを超えるガンダム」
オリジナル主人公
男主人公
レイン・クロス
- 次元適応能力を持つ青年
女主人公
セリア・ノヴァ
- AIと共鳴する少女
プレイヤー選択式。
オリジナル機体
クロスガンダム・ゼロ
特徴:
- 全作品技術融合
- フェーズ変形
- 光の翼
- GNドライブ
- サイコミュ
- 月光蝶
ULT形態:
「クロスガンダム・インフィニティ」
PvP・オンライン
マスターリーグ
- 全国ランキング
- AI防衛編成
ギルド戦
- 20vs20
ワールドレイド
全ユーザー共闘。
ガシャシステム
Ver.シリーズ
Ver.1
宇宙世紀
Ver.2
アナザー系
Ver.3
神話級限定
ハーフアニバーサリー案
目玉機体候補
- ターンエーガンダム
- ターンX
- V2アサルトバスターガンダム
- クロスボーン・ガンダムX1フルクロス
- ダブルオークアンタ
UIイメージ
ホーム画面
- 3D機体表示
- ライブ背景
- AIナビキャラ
編成画面
- ドラッグ編成
- タグ自動表示
- 相性可視化
戦闘画面
- フル3D演出
- カメラズーム
- 必殺技シネマ
BGM
- 原作曲アレンジ
- オーケストラ版
- 覚醒専用BGM
ターゲット層
- Gジェネファン
- ガンダムファン
- 育成ゲーム好き
- 戦略RPG好き
- ソシャゲユーザー
