Unofficial Game Boy Advance port

把 Tyrian 的滿天彈幕,帶進 16.78 MHz 的 GBA。

TyrianGbaPoc 以原版 Tyrian 2.1 資料與 OpenTyrian 程式行為為規格, 在 GBA 的 CPU、記憶體、VRAM 與 OAM 限制內,重建多圖層關卡、 敵人、武器、音樂與完整遊戲流程。

AGB / build preview runtime verified
GBA 上的 Tyrian 第一關 Boss 與最強武器壓力配置彈幕畫面
240×1601:1 final crop
128OAM entries
3 layersindependent BG
9 voicescomplete OPL2 score

Why this exists

從可行性測試,走向完整移植。

專案起初只想回答一個問題:PC 版 Tyrian 能否在 GBA 上保留原本的節奏、 多層背景與高密度戰鬥?克服資源格式、繪圖順序、快取與時序問題後, 答案逐漸變得明確,因此目標也從單關技術展示,改為可維護、 盡可能完整且忠於原始程式的 GBA 移植版。

這不是拿 Tyrian 美術做一款相似射擊遊戲。關卡事件、敵人定義、武器、 碰撞、linked destruction、獎賞、Boss 與破關流程,盡量沿著 OpenTyrian 的原始控制流翻寫;GBA 專屬修改集中在顯示、輸入、聲音、 儲存與效能 adapter。

原始 PC 戰鬥視窗不做整體縮放。264×184 gameplay space 維持原座標, GBA 以 240×160 柔性視窗利用兩軸各 24 pixels 的裁切餘量;敵人與碰撞 公式不必背負縮放成本,玩家靠近邊界時也能平順取回原版可見範圍。

目標不是證明 GBA「毫無限制」,而是找出在真實硬體預算內, 忠實度可以被推到什麼位置。

What already works

不只是一張能動的畫面。

目前已打通開頭、設定選單、存讀檔、Game Menu、Upgrade Ship、 Next Level、Demo、JukeBox、關卡、死亡與破關統計等主要流程;四章 62 個 playable sections 都納入資料回歸,少見路線與裝備組合持續 QA。

01 / SOURCE DATA

原始資料直接驅動

MUS、SHP、PIC、HDT、LVL 與 levelsN.dat 收進 ROMFS,runtime 仍以原始編號與規則決定內容。

02 / GAME LOOP

完整戰鬥要素

敵人移動、子彈、碰撞、damage transition、linked death、掉落、金錢、Boss 與關卡結束流程。

03 / PRESENTATION

多圖層與原版順序

三個獨立捲動背景,搭配 GBA BG/OBJ priority 還原地面、中層、雲層與前景敵人的遮擋。

04 / SPRITES

128 OAM 與雙層快取

Sprite2 依 palette 即時映射,build-time 無損預解壓,再以 EWRAM L2 與 VRAM L1 承接高密度動畫。

05 / AUDIO

音樂、音效與語音

41 首曲目完整保留九個 OPL2 source channel;關卡歌曲、爆炸與打擊音效、Boss/Data Cube 語音仍依原版 ID 播放。

06 / FRONTEND

可用而流暢的設定介面

靜態底圖、文字與動態 OBJ 分離,轉場分幀組裝後原子換頁,選單切換不再拖慢音樂。

Engineering under constraint

限制沒有消失;它們被逐一量化。

GBA 無法用 PC 的方式直接畫完整場景。專案把每個瓶頸拆成可觀測的資料流、 cache miss、DMA、VBlank 與 cycle budget,再選擇對原始語意侵入最小的解法。

01

Sprite2 解碼風暴

不可變 RLE 與 tile 重排移到 build;runtime 只依當前 palette 上色。64-slot EWRAM L2 讓 Boss 多部件動畫暖身後只需 VRAM DMA。

02

背景工作集超過 VRAM

以 source row 為單位分區、預取與回收,保留 layer identity;沒有用「最近圖塊」猜測缺少素材,因此不會以錯圖掩蓋 cache miss。

03

高負荷場景超時

遊戲邏輯採固定時間步進;必要時只延後 presentation,不讓遊戲時鐘與音樂變慢。IWRAM、ARM hot path、active mask 與 cache telemetry 持續受測。

04

靜態選單也會卡

完整原始圖章在 build-time 預備,ship panel 用 19.2 KiB EWRAM cache,頁面工作拆成有界 phase;960 次壓力轉場為 0 missed VBlank。

05

資料不能每關手工補

原版 ROMFS 是單一真實來源。通用 loader、section offset index 與完整 bank 轉換取代 per-level Python 對照表,才能把同一套方法延伸到後續章節。

06

128 個 OAM 必須分配,而非搶先者全拿

由 owning pool 與 Boss manifest 確定物件身分,先保障玩家、Boss、敵人與玩法子彈;爆炸以公平輪替使用餘額,cache admission 也沿用同一份 presentation snapshot。

AI-assisted development

AI 加速探勘,人負責方向與驗收。

本專案使用 Codex 協助長期原始碼對照、實作、測試與文件整理,也曾以 Gemini 3.1 Pro 諮詢選單渲染、GBA hot path 與 frame-drop 策略。 建議必須回到 OpenTyrian 原始碼、GBA 硬體規格與實測 telemetry 驗證; AI 不是新的遊戲規格來源,也不取代人工試玩與視覺 QA。

Try the current build

在模擬器或真實硬體上試玩。

v89 正式版採 LOW Detail、Normal Speed、正常傷害與一般劇情裝備, 並包含完整九聲道音訊。ROM 以 GitHub Release 資產提供,不存進 原始碼 Git;也可以直接從獨立建置環境自行產生。