2018-11-07

Cyber Sprtie高等級的攻擊力補正

Cyber Sprite裡,大部分角色VERSION 1一次發一顆子彈,VERSION 2一次發兩顆,一直到最多四顆,乍看之下VERSION 4的攻擊力是VERSION 1的四倍。
(因為主角是程式語言,本遊戲用VERSION代表武器等級)


但是,這遊戲的攻擊力計算藏有一些秘密,VERSION 4的攻擊力並沒有到VERSION 1的四倍,只有約兩倍而已。

同時發在巴哈姆特



首先,程式內部會將子彈分組,一次同時發射的子彈是一組,不論VERSION 2就能發四顆子彈的貝姬,還是VERSION 4才能發四顆子彈的露亞。
往正前方射的灰色子彈則沒有分組。




然後,同一組子彈如果有兩顆以上命中敵人,第二顆以後的攻擊力會下降,規則如下:

第一顆:基本攻擊力
第二顆:基本攻擊力×0.5
第三顆:基本攻擊力×0.2
第四顆以後:基本攻擊力×0.1

如果相乘後有小數則無條件進位。
目前還沒有一次發五顆子彈的角色,但提可的貫通彈可能命中敵人五次以上,第四次以上就都是0.1倍。

照以上倍率四發都命中的話攻擊力是1.8倍,不過還有小敵人不容易四發都命中、VERSION高時範圍變大較易打中敵人、無條件進位等因素影響,就姑且算是兩倍。

例如艾瑪的基本攻擊力是7,計算如下:
第一顆命中,攻擊力 7。
第二顆命中,攻擊力 7×0.5=3.5,進位後是 4。
第三顆命中,攻擊力 7×0.2=1.4,進位後是 2。
第四顆命中,攻擊力 7×0.1=0.7,進位後是 1。


即使兩顆子彈在同一個frame命中,內部仍然會分成第一顆、第二顆,照以上方式算。
灰子彈攻擊力固定是2,不會下降。

上面的算式是乘上一個0~1的數,但程式實際上是這樣寫。
//將power設成基本攻擊力
uint32_t power=......;

//第二顆
power = (power+1)/2;
//第三顆
power = (power+4)/5;
//第四顆以後
power = (power+9)/10;
用整數而不用浮點數,而且不用ceil()函式,可以避免整數浮點數之間轉換的消耗、計算ceil()的消耗、以及浮點數誤差。
(註:ceil()是所謂的intrinsic function,會編譯成組合語言指令而不會真的呼叫函式,但也要很多指令才算得出來)

電腦算整數除法如果不能整除會將小數部分捨去,但如上式先加上(n-1)再除以n,就可以計算無條件進位。

還有一個技巧是把power宣告成無號整數,從組合語言的角度來看,無號整數除以2 compiler可以直接轉換為右移位元,除以其他常數也有快速的算法,比除法指令快,有號整數除以2不完全等價於移位元故編譯後會多幾條指令,比無號整數慢。



除此之外,還有對各角色個別調整。

提可的貫通彈:

同一顆子彈打中多個敵人也會照以上規則降低攻擊力。
例如第一關有一些成排的敵人,如果發一組子彈穿過它們:


子彈1命中敵人A:基本攻擊力=6
子彈2命中敵人A:ceil(6×0.5) =3,敵人A累積傷害9
子彈1命中敵人B:ceil(6×0.2) =2
子彈2命中敵人B:ceil(6×0.1) =1,敵人B累積傷害3
子彈1命中敵人C:ceil(6×0.1) =1
子彈2命中敵人C:ceil(6×0.1) =1,敵人C累積傷害2

命中一個敵人後,子彈會記住這個敵人已經被打過,即使下一frame碰撞判定有重疊也不會再扣一次HP。

或許有人玩的時候注意到,貫通彈明明穿過好幾個敵人卻只有第一個敵人爆,再射一發才能打倒下一隻,原因就是攻擊力補正。
地形射擊遊戲裡貫通是很強的能力,所以用這個方法避免過於強勢。


露亞子機的子彈:

VERSION 1和2的發射間隔是11 frame,但VERSION 3和4的發射間隔是12 frame,比對一下子彈間的距離可以看出來。


露亞可以調整子機位置做到廣範圍或集中攻擊,比其他角色更具泛用性,為了不讓集中攻擊時太強所以削弱一點VERSION 3和4的威力。


艾瑪的爆發彈:

一顆子彈有「子彈碰到敵人」和「子彈爆炸的爆風」兩個攻擊判定。


子彈直接碰到的敵人會受到兩個判定,傷害是7+3=10。直接碰到的判定只會發生一次,也就是說如果同時碰到兩個敵人,只有其中一個算是碰到,碰到之後子彈就消失並產生爆風的判定。
其他在爆風範圍內,子彈沒直接碰到的敵人就只有爆風的判定,傷害是3。

爆風就沒有攻擊力補正了,固定是3,第二顆子彈命中的攻擊力是4+3=7。因為試玩後覺得爆風有沒有補正對平衡影響不大所以沒有做。

附帶一提艾瑪的子彈對敵人和對地形的碰撞判定大小不一樣,對地形的判定比較小,因此上圖看似directly hit的圓圈很大,但不會很容易被地形擋住。



以上這些調整是為了防止VERSION 1和VERSION 4強度差太多。如果攻擊力相差很多,用VERSION 1的標準製作關卡則自機等級高時會太簡單,以VERSION 4為標準製作則等級低時又太難。而且本遊戲的升級很慢,想升到最強要費一番工夫,要考慮到讓最弱的狀態也能夠過關。

如果用比較簡單的調法:等級高時將單一子彈的攻擊力下降,四發都命中時沒問題,但敵人太小或是地形阻擋,只有一發命中時就有VERSION 4反而比較弱的感覺,所以用以上較複雜的調整法。

會想動手腳是參考前人的經驗,早期有些射擊遊戲是一開始和全副武裝強度差很多,如Gradius和Aero Blasters,後半的難度是以自機已經強化為前提製作,一旦死了裝備全掉就很難繼續玩下去,個人覺得這點很討厭。此外還有「在後面關卡接關時不是從VERSION 1.00開始」和「中彈時等級只扣0.5而不是降到最弱」的設計,也是因應這個問題。

有的遊戲是自機強化的時候敵人會變強(彈速變快、敵人變多等等),miss後失去裝備就恢復原狀,本作沒有採用這個做法。

沒有留言 :

張貼留言