星期六, 3月 31, 2012

戰鬥畫面文字完成

戰鬥中的解說部分也完成了,這部分沒啥特別好提的,不過說服指令只有遇到中立角色時才會出現,差點因此漏了這個指令解說。目前戰鬥中所有可能出現的8x16文字都弄好了,只有以半透明圖片顯示的8x8指令名沒處理,直接改成英文名的話應該5分鐘能全弄完,不過也許以後再看看要不要弄成8x16吧。

接下來要開始填狀態欄、地圖上會出現的8x16文字,相關字庫函式方面是修改完了(大概...),但是選字、寫入譯名也很麻煩就是,這部分大概有近千個人名、道具名、地名、職業名...etc.

進度上已經超越2年前了吧(茶


星期二, 3月 27, 2012

戰鬥畫面文字...75%

呃......上週突然發現我出了個大包.......
我沒發現動畫關掉會顯示出完全不同的招式技能名啊 XD

結果要解決的問題變得更複雜了
因為狀態欄跟戰鬥用字庫原本是用不同索引同一字庫
之前好不容易把共用的字庫一分為二讓兩個索引各自取用
結果動畫關掉後的技能名文字是兩個索引都有部分引用
變成同一個技能名其實有3種交叉顯示辦法(噴血)

最簡單的解決法....強制動畫開啟
....算啦  這不符合我的性格
只好硬著頭皮找一下解決辦法....
吐血的過程就不提了   反正改了好一些code
原本遊戲只有平片假名的小字庫(8x8, 180字字庫)  
現在預估至少要有6個(8x16, 110字字庫x4 + 800字x2)才能應付這情況
下圖是其中3個大致決定好的110字字庫  全用於戰鬥畫面


左邊是這次的罪魁禍首...關掉動畫後會出現的技能名
中間是之前弄的...動畫開啟時會出現的技能名
右邊是中斷戰鬥時可能會出現的塔羅牌名跟策略名跟少量選單解釋
這些字已經是盡量規劃後挑出來的了
例如為了顯示"winner"、"draw"、"on"、"off"而留下了些英文字
甚至還有共用一個中文字上半部分的例子
例如"雷"、"電"、"雪"、"震"、"霧"等字共用了上面的"雨"
應該看得出來我很努力在塞可用字了....(線條那些是邊框  不能砍)
更注意一點看會發現左圖跟中間圖許多字都是一樣的
基本上這些字就是不管開不開動畫都會出現用到
差異主要在於最下面兩列
左圖動畫關掉部分會多了一堆像"揮砍"這種一般攻擊名用字
中間圖主要是因boss戰強制開啟動畫而出現的敵boss技能用字

講了這麼多  總之戰鬥畫面文字這部分
主要只剩下按選擇鍵會出現的解釋文字  所以這部分完成至少75%
最後附上目前戰鬥畫面的樣子




星期三, 3月 21, 2012

戰鬥畫面文字

這部份意外地煩人,因為是用Sprites所以不太能用前文的方法取代,只能用一次讀入256個8x8字的方式。但是它部分函式又跟其他混合使用,動到這邊代碼就會影響另一邊。所以最後我投降了....回去找自己兩年前是怎麼改這部份的XD,最神奇的是最後總算在維持其他部分正常的情況下改好,但我卻不太確定原理(爆。

Anyway,反正戰鬥這部份出現的文字是獨立於狀態畫面等其他地方的(例如同一個魔法名稱會有複數份在Rom裡供不同地方使用),既然不用跟其他地方"同步",文字代碼就隨便我亂用了。

戰鬥畫面會出現的文字又能再分獨立三個部分:戰鬥中的招式與策略名、中斷選單中的塔羅牌與策略名、按選擇鍵的說明文。所以這三部分再各分3個256大小8x8字庫出來塞會用到的字,扣掉畫邊框用的與指令碼,大概會剩224個8x8字可用。再把少數會用到的8x8英文字獨立出來,8x16中文字大概塞100個左右吧。目前用來塞第一部份剛好夠用,記得以前精算過另外兩部分也沒問題。接下來應該會先把這三部分字先塞完,確認沒問題再去規劃狀態畫面跟地圖畫面的字庫(這邊可以使用700字以上,應該充裕得多...)。

下面是錄下來的影片,別問我怎麼取追魂暗影這種中二味十足的名稱...原文Dark Quest這種名稱鬼才知道怎麼翻...反正現在是套用兩年前的字庫,先將就著吧(逃

星期一, 3月 12, 2012

OB解析再開

呃....我還活著!
事實上有點活得太好,過得太爽了....
所以自虐老毛病又犯....突然對OB解析又有興趣了

雖然這兩年Blog被FB等整個覆滅了
不過我還是比較喜歡這種半日記的記事方式

之前.....哇~一年半前嗎(笑)
OB解析到一半時   因為要換工作太忙而停了
結果最近打開之前OB資料夾來看....完全看不懂XD
所以乾脆直接重來(爆)

先來確認一下情況一下吧!

OB系統面全部是8x8字  劇情面是16x16字
16x16字原始約有900字可用  まぁ....這完全是小case
壓縮法很簡單  索引方式比較不正規罷了
這部份有看到之前寫的解壓程式 但我卻完全沒有印象何時寫的(爆

討厭的是8x8字  主要有三大問題...

1. 顯示的方法太多種:
有Sprites的、有BG的、有字庫全讀的、有用到才讀的、有解壓展開的....etc.
之前解決法是case by case直接根據函式進入點寫死到VRAM固定位置
但這樣會變成不同視窗裡同代碼用不同字庫...

 2. 8x8字庫有夠小:
只有256個字可用  扣掉約一半是基本符號不能用....剩128字 
再加上至少2個字才能組出8x16中文字....變64字
雖然可以用取巧方法  讓64字變回兩倍128字....
但OB光武器名就需要兩倍量了吧.....

3. 沒辦法隨便擴容:
8x8字基本上只用到1 byte代碼
2 byte代碼"基本上是不存在的"(濁音字雖是2byte但其實是用table湊出來)
在同一地方要顯示超過256種字以上就一定要用到2byte
簡單來說就是....程式要"加寫"很大 orz
如果是C語言其實不是大問題  可惜這邊全是機械碼...
(e.g. AF 00  ff 7f表示將Ram 7fff00位置的值載入A暫存器)
一個for loop就能讓人看到淚目  更不用說去改了.....

好吧   對這種改很大的...好的工具是絕對必要的
除了看圖的YY-CHR跟看binary code的UltraEdit,下面是我ASM解析時不可缺的:

Snes9X1.43.ep9r8
>> 兩年前用的SFC debugger,用來輸出執行過程函式,很方便就沒想過要換了

65816 Reference (http://wiki.superfamicom.org/snes/show/65816+Reference)
>> SFC OP code一覽,沒這個就看不懂ROM在講什麼

總之....經過幾個假日約30~40小時的重新解析   8x8的主問題算解決了
簡單來說,就是將VRAM tile B1~FE兩兩一組  依顯示順序固定配給
再使代碼多出19xx~1Bxx  依不同顯示函式進行大小修改   
遇到這範圍的代碼就依序將整個字送到tile B1~FE的對應位置
用更白話一點的方式說
就是雖然知道有700多人  但同時間會進來房間坐的最多只有近40
所以乾脆準備40張椅子  有人進來就發一張椅子隨他要坐哪(位置不固定)
(之前的方式是把700人分組在不同房間  每個房間椅子都是固定位置)
好處是700字總算夠讓8x8系統用字使用  而且可以跟16x16代碼同步一致


測試圖如下  就解析來說是完成的
但因為我只有改其中兩個8x16字的代碼跟字樣而已  所以一副未完成樣XD
事實上是比之前做的方案還完善得多!