2017年 12月2日
あ~もう 12月になってしまった.
計画では 12月末に、そう年末商戦に間に合うように作ろうと思ったんだけど、7ヶ月経って、これ半分くらいだろうか。
これは来年の 3月ですら怪しい。
今回のゲームはきちんとしたのを、という計画だったけど、流石に時間がかかる。
やはり、もうちょっとミニゲームの発表からやるべきだったかな。
ゲーム制作は、というか何でもそうなんだけど、思った以上に時間がかかる。
マーフィーの法則だと、見積もりの 2倍は見ておけだったかな?
さて、今回は状態異常を作った。
麻痺、気絶、魅惑、毒といったものだ。
ステータスは配列変数 bsの 1~6だ。
1 2 3 4 5 6 7 8 9 |
bsb=21 ; 最大数 dim bs,6*bsb ; 戦闘ステータス bsg=0 ; 現在のユニット ; 戦闘ステータス(0=un、1=火傷、2=氷、3=麻痺、4=気絶、5=魅惑、6=毒、 ; 7=ファイヤーウエポン、8=アイスエンチャント、9=ウインドエンチャント、10=サンダーウエポン、 ; 11=グラビティウエポン、12=ホーリーウエポン、13=ダークウエポン、 ; 14=攻撃、15=防御、16=加速、17=減速、 ; 18=ウォータースクリーン、19=ウインドウォール、20=ホーリーライトサークル、) |
状態異常のソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
#deffunc mahi int mahif,int mahin,int mahirg ; 麻痺 f=0 switch mahif case 0 ; 対象 if en=0 : f=1 : swbreak swbreak case 1 ; 前列 rang mahirg : if rangf=0 : f=1 : swbreak swbreak case 2 ; ランダム if fs=1 : en=rdp(2) if fs=2 : en=rdp(1) if en=0 : f=1 swbreak swend if f=1 : return ; 対象がいない r1=rnd(mho+mahin+1) r2=rnd(ud(en*udb+22)/5+1) if r1<=r2 : return ; かからなかった bsg=bsp(en) : bs(bsg+3)+=r1 ; 麻痺 return #deffunc stun int stunn; 気絶 r1=0 : r2=0 : bsg=bsp(en) repeat 2 r1+=rnd(ud(eg+21)/5+1) ; 筋力抵抗値 r2+=rnd(stunn+ud(ug+34)+1) ; 気絶値 loop if r1<r2 : bs(bsg+4)+=n return #deffunc poi int poif,int poin,int poirg ; 毒 f=0 switch poif case 0 ; 対象 if en=0 : f=1 : swbreak swbreak case 1 ; 前列 rang poirg : if rangf=0 : f=1 : swbreak swbreak case 2 ; ランダム if fs=1 : en=rdp(2) if fs=2 : en=rdp(1) if en=0 : f=1 swbreak swend if f=1 : return ; 対象がいない r1=rnd(mho+poin+ud(ug+36)+1) r2=rnd(ud(en*udb+22)/5+1) if r1<=r2 : return ; かからなかった bsg=bsp(en) : bs(bsg+6)+=r1 ; 毒 return #deffunc temp int tempf,int tempn ; 魅惑 f=0 switch tempf case 0 ; 対象 if en=0 : f=1 : swbreak swbreak case 1 ; 対面 if fs=1 { ; 攻撃側 if ut=2 : if fn1(1)>0 : f=1 : swbreak ; 前に味方がいる if ut=3 : if fn1(1)>0 or fn1(2)>0 : f=1 : swbreak ; 〃 en=0 repeat 3,1 en=fn2(cnt) : if en>0 : break loop if en=0 : f=1 : swbreak } if fs=2 { ; 防御側 if ut=2 : if fn2(1)>0 : f=1 : swbreak ; 前に味方がいる if ut=3 : if fn2(1)>0 or fn2(2)>0 : f=1 : swbreak ; 〃 en=0 repeat 3,1 en=fn1(cnt) : if en>0 : break loop if en=0 : f=1 : swbreak } swbreak case 2 ; ランダム if fs=1 : en=rdp(2) if fs=2 : en=rdp(1) if en=0 : f=1 swbreak case 3 ; 3体 repeat 3,1 if fs=1 : en=fn2(fs2+cnt) if fs=2 : en=fn1(fs1+cnt) if en<=0 : continue eg=en*udb : if ud(eg+26)<=0 : continue r1=rnd(mho+tempn+1) r2=rnd(ud(eg+22)/1+1) if r1<=r2 : continue ; かからなかった bsg=bsp(en) : bs(bsg+5)+=r1 ; 魅惑 loop swend if f=1 : return ; 対象がいない r1=rnd(mho+tempn+1) r2=rnd(ud(en*udb+22)/5+1) if r1<=r2 : return ; かからなかった bsg=bsp(en) : bs(bsg+5)+=r1 ; 魅惑 return #deffunc curse int cursen ; 呪い if fs=1 : en=rdp(2) ; 対象 if fs=2 : en=rdp(1) if en=0 : return cursen2=cursen+mho r1=0 : r2=0 : bsg=bsp(en) ;火 repeat 2 r1+=rnd(ud(eg+22)/5+1) ; 魔力抵抗値 r2+=rnd(cursen2+ud(ug+31)+1) ; 火傷値 loop if r1<r2 : bs(bsg+1)+=r2-r1 r1=0 : r2=0 : bsg=bsp(en) ;水 repeat 2 r1+=rnd(ud(eg+22)/5+1) ; 魔力抵抗値 r2+=rnd(cursen2+ud(ug+32)+1) ; 氷値 loop if r1<r2 : bs(bsg+2)+=r2-r1 mahi 0,cursen2,0 ; 麻痺 stun cursen2 ; 気絶 temp 0,cursen2 ; 魅惑 poi 0,cursen2,0 ; 毒 return |
麻痺と気絶は行動できなくなる。
1 2 3 4 5 |
*atack ; 攻撃処理 ---------------------------------------------------- bsg=bsp(un) if bs(bsg+3)>0 : return ; 麻痺により行動不能 if bs(bsg+4)>0 : return ; 気絶により行動不能 |
ユニットの攻撃の始めに判定処理があり、素直にそこから戻る。
魅惑は少し苦労した。
何がって、魅了状態のユニットが味方を攻撃する、というのが結構むずかしい。
何せ下手すると全攻撃プログラムを味方攻撃用に作らないといけない。
今のこのグチャグチャソースではとても無理だと思ったので、とりあえず隣接する味方を素アタックするだけのものにした。
そのソースはこれ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#deffunc temp_atk ; 魅惑状態の行動 r=rnd(2) : if r=0 : return ; 何もしない if fs=1 { ; 味方への攻撃 fs=2 if ut=1 or ut=3 : if fn1(fs1+2)>0 : et=2 : en=fn1(fs1+2) : eg=en*udb : atk 2,ud(ug+11),0 : return ; 隊列1番目 if ut=2 { if fn1(fs1+1)>0 and fn1(fs1+3)>0 { r=rnd(2) : if r=0 : en=fn1(fs1+1) : et=1 : else : en=fn1(fs1+3) : et=3 eg=en*udb : atk 2,ud(ug+11),0 : return } if fn1(fs1+1)>0 : en=fn1(fs1+1) : eg=en*udb : et=1 : atk 2,ud(ug+11),0 : return if fn1(fs1+3)>0 : en=fn1(fs1+3) : eg=en*udb : et=3 : atk 2,ud(ug+11),0 : return } } if fs=2 { ; 味方への攻撃 fs=1 if ut=1 or ut=3 : if fn2(fs2+2)>0 : et=2 : en=fn2(fs2+2) : eg=en*udb : atk 2,ud(ug+11),0 : return ; 隊列1番目 if ut=2 { if fn2(fs2+1)>0 and fn2(fs2+3)>0 { r=rnd(2) : if r=0 : et=1 : en=fn2(fs2+1) : else : et=3 : en=fn2(fs2+3) eg=en*udb : atk 2,ud(ug+11),0 : return } if fn2(1)>0 : en=fn2(fs2+1) : et=1 : eg=en*udb : atk 2,ud(ug+11),0 : return if fn2(3)>0 : en=fn2(fs2+3) : et=3 : eg=en*udb : atk 2,ud(ug+11),0 : return } } return |
fs=1はこちら側が攻撃している、fs=2は敵側が攻撃している状態を表す。
83はユニットNo.、敵が敵を攻撃している。
毒は素直にターンの終わりにダメージが入る。
ちょっと見にくいけど 2ダメージ、bsのステータスは半減している。
カース(呪い)は、火傷、コールド、麻痺、気絶、魅惑、毒が全部かかる凶悪な魔法だ。
これだとちょっとかかりすぎだと思うので、後でバランス調整しないと。
最後に状態回復魔法を作った。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#deffunc cure int curef ; 治療 c=0 repeat 3,1 ; 状態異常者をピックアップ if fs=1 : un2=fn1(cnt) if fs=2 : un2=fn2(cnt) if un2=0 or ud(un2*udb+26)<=0 : continue ; いない bsg=bsp(un2) if curef=2 : if bs(bsg+1)=0 and bs(bsg+4)=0 and bs(bsg+5)=0 and bs(bsg+6)=0 : continue ; 正常、水 if curef=4 : if bs(bsg+1)=0 and bs(bsg+3)=0 and bs(bsg+4)=0 and bs(bsg+6)=0 : continue ; 正常、地 if curef=5 : if bs(bsg+1)=0 and bs(bsg+2)=0 and bs(bsg+3)=0 and bs(bsg+4)=0 and bs(bsg+5)=0 and bs(bsg+6)=0 : continue ; 正常、光 rdpd(c)=bsg : c+ ; 状態異常者を格納 loop if c=0 : return ; 状態異常者がいない r=rnd(c) : bsg=rdpd(r) ; 治療者を選択 if curef=2 : bs(bsg+1)=0 : bs(bsg+4)=0 : bs(bsg+5)=0 : bs(bsg+6)=0 ; 治療、水 if curef=4 : bs(bsg+1)=0 : bs(bsg+3)=0 : bs(bsg+4)=0 : bs(bsg+6)=0 ; 治療、地 if curef=5 : bs(bsg+1)=0 : bs(bsg+2)=0 : bs(bsg+3)=0 : bs(bsg+4)=0 : bs(bsg+5)=0 : bs(bsg+6)=0 ; 治療、光 return |
水のピュリファイは、火傷、気絶、魅惑、毒を。
地のアースキュアは、火傷、麻痺、気絶、毒を。
ホーリーライトヒールなら全部回復してくれる。
麻痺、気絶、魅惑にはターンの終わりに自然治癒のチャンスがある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
repeat 6 ; 麻痺処理 bsg=cnt*bsb if bs(bsg)=0 : continue if bs(bsg+3)=0 : continue un=bs(bsg) : ug=un*udb : r1=0 : r2=0 repeat 2 r1+=rnd(ud(ug+22)+1) r2+=rnd(bs(bsg+3)+1) loop if r1<r2 : continue bs(bsg+3)=0 ; 解麻痺 loop repeat 6 ; 気絶処理 bsg=cnt*bsb if bs(bsg)=0 : continue if bs(bsg+4)=0 : continue un=bs(bsg) : ug=un*udb : r1=0 : r2=0 repeat 2 r1+=rnd(ud(ug+21)+1) r2+=rnd(bs(bsg+4)+1) loop if r1<r2 : continue bs(bsg+4)=0 ; 解気絶 loop repeat 6 ; 魅惑処理 bsg=cnt*bsb if bs(bsg)=0 : continue if bs(bsg+5)=0 : continue un=bs(bsg) : ug=un*udb : r1=0 : r2=0 repeat 2 r1+=rnd(ud(ug+22)/5+1) r2+=rnd(bs(bsg+5)+1) loop if r1<r2 : continue bs(bsg+5)=0 ; 解魅惑 loop |
火傷、氷、毒は半減していくだけ。
今回は大体そんな所だ。
これで魔法は後召還系とリザレクション(蘇生)を残すのみとなった。
この 2つについては、増えたり減ったりする隊列処理がややこしいので、これからそれをやる予定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
if itn=251 : matk 0,1,id(ig+9),id(ig+17) ; ファイヤー if itn=252 : enc 1,id(ig+9) ; ファイヤーウェポン if itn=253 : sad 2,14,id(ig+9) ; バーサーク if itn=254 : matk 1,1,id(ig+9),id(ig+17) ; ファイヤーピレイム if itn=255 : matk 2,1,id(ig+9),id(ig+17) ; フレイムアロー if itn=256 : sad 3,14,id(ig+9) ; バトルソング if itn=257 : matk 4,1,id(ig+9),id(ig+17) ; ファイアーボール if itn=258 : matk 3,1,id(ig+9),id(ig+17) ; ファイヤーウォール if itn=259 : matk 3,1,id(ig+9),id(ig+17) ; エクスプロージョン if itn=261 : matk 0,2,id(ig+9),id(ig+17) ; アイスニードル if itn=262 : matk 5,2,id(ig+9),id(ig+17) ; ウォーターストリーム if itn=263 : cure 2 ; ピュリファイ if itn=264 : enc 2,id(ig+9) ; アイスエンチャント if itn=265 : matk 2,2,id(ig+9),id(ig+17) ; アイスジャベリン if itn=266 : matk 1,2,id(ig+9),id(ig+17) ; アイスピラー if itn=267 : scr 2,id(ig+9) ; ウォータースクリーン if itn=268 : matk 2,2,id(ig+9),id(ig+17) ; 津波 if itn=269 : matk 4,2,id(ig+9),id(ig+17) ; メイルシュトローム if itn=270 : matk 3,2,id(ig+9),id(ig+17) ; ブリザード if itn=281 : matk 0,3,id(ig+9),id(ig+17) ; ウインドカッター if itn=282 : sad 2,16,id(ig+9) ; ウインドムーブ if itn=283 : matk 7,3,id(ig+9),id(ig+17) ; サンダー if itn=284 : enc 3,id(ig+9) ; ウィンドエンチャント if itn=285 : enc 4,id(ig+9) ; サンダーウエポン if itn=286 : temp 3,id(ig+9) ; セイレーンボイス if itn=287 : scr 3,id(ig+9) ; ウィンドウォール if itn=288 : matk 2,3,id(ig+9),id(ig+17) ; ライトニングボルト if itn=289 : matk 3,3,id(ig+9),id(ig+17) ; ウィンドストーム if itn=291 : cure 4 ; アースキュア if itn=292 : sad 1,15,id(ig+9) ; ハードコーティング if itn=293 : heal 1,id(ig+9) ; ネイチャーヒール if itn=294 : matk 8,4,id(ig+9),5;id(ig+17) ; グラヴィティマグネット if itn=295 : enc 5,id(ig+9) ; グラビティウエポン if itn=296 : sdc 17,1,id(ig+9) ; バインディングブランチ if itn=297 : matk 0,4,id(ig+9),id(ig+17) ; ストーンブラスト if itn=298 : ;matk 2,4,id(ig+9),id(ig+17) ; ゴーレムクリエイト if itn=299 : matk 3,4,id(ig+9),id(ig+17) ; アースクエイク if itn=301 : heal 1,id(ig+9) ; ヒール if itn=302 : tad 1,id(ig+9) ; ターンアンデッド if itn=303 : sad 2,16,id(ig+9) ; フォースセンス if itn=304 : cure 5 ; ホーリーライトキュア if itn=305 : enc 6,id(ig+9) ; ホーリーウエポン if itn=306 : sad 1,15,id(ig+9) ; プロテクト if itn=307 : matk 0,5,id(ig+9),id(ig+17) ; レイアロー if itn=308 : matk 5,5,id(ig+9),id(ig+17) ; サイキックフォース if itn=309 : sad 3,14,id(ig+9) ; ブレス if itn=310 : scr 5,id(ig+9) ; ホーリーライトサークル if itn=311 : matk 9,5,id(ig+9),id(ig+17) ; レイブレイド if itn=312 : heal 3,id(ig+9) ; ホーリーライトヒール if itn=313 : ;matk 4,5,id(ig+9),id(ig+17) ; ウィル・オ・ウィスプ if itn=314 : ;matk 3,5,id(ig+9),id(ig+17) ; リザレクション if itn=321 : matk 7,6,id(ig+9),id(ig+17) ; マインドブラスト if itn=322 : poi 2,id(ig+9),id(ig+17) ; ポイズン if itn=323 : mahi 1,id(ig+9),id(ig+17) ; 邪眼 if itn=324 : temp 2,id(ig+9) ; チャーム if itn=325 : sdc 1,14,id(ig+9) ; ウィークネス if itn=326 : curse id(ig+9) ; カース if itn=327 : sdc 3,16,id(ig+9) ; ダークネス if itn=328 : matk 3,6,id(ig+9),id(ig+17) ; フレイムカース if itn=329 : ;matk 3,4,id(ig+9),id(ig+17) ; デモンズゲート |
それじゃまた。