2017年 11月23日
途中だけど区切りが良いので。
ソースには魔法一揃い並べたけど、まだ機能は全部実装してない。
補助ステータスのソースをまとめたのとヒールを追加したくらい。
2017年 11月23日
途中だけど区切りが良いので。
ソースには魔法一揃い並べたけど、まだ機能は全部実装してない。
補助ステータスのソースをまとめたのとヒールを追加したくらい。
2017年 11月17日
前回より 2週間の時間が経ちました。
いやあ、今回も大変だった(こればっか)
何が大変だったかと言うと、ステータスを変化した値をどこに格納して参照するか。
ud、ユニットデータに格納すれば事は簡単なのだが、これだとステータスの変数が例えば 30種類だったとして、200ユニット作るとデータが 6000増える、6kバイト?いや、一つの変数はたぶん 4バイト、つまり 2バイトで最大値 65536だから、いくつかはめんどくさいので計算しないが、4バイトだとそれ以上の最大値で、それを確保してるはずだから・・・、まあいいや、とにかく 6000*4で 24Kバイト、1000ユニット作ったら、ええと・・・。
まあとにかくユニットデータに余分なデータを格納すると、死にデータ領域が増えるし、オーバーフローで動かなくなる可能性が。
と言っても最近のスマホなら気にしなくても大丈夫なんだろうか?
2017年 11月4日
魔法攻壁処理の基本的な部分が出来たので報告。
2017年 11月1日
たぶん今一番ややこしい箇所になってる。
やっぱり戦闘部分が一番複雑かもしれない。
今回は特殊攻撃を追加して、合わせてプログラムも改変している。
改変自体はまだまだどんどん続くだろう。
そういえば前にプログラムを適性化してはならないと言ったけど、それは完成して動いてるやつね。
それもたぶん、なるべくしない方が良いくらいのニュアンスだと思う。
2017年 10月25日
思った以上に複雑だった。
属性が単だったら簡単だけど、複数の属性を持った同士が想定されるので難解だ。
属性相関図
本ゲームでは、
火は、炎と熱、火傷。
地は、大地と植物、地震、重力、スタン(気絶)。
風は、突風やカマイタチ、雷、マヒ。
水は、水、冷気、フリーズ(氷化による鈍化)。
光は、聖なる、4属性に弱い、ターンアンデッド。
闇は、邪悪、4属性に強い、毒。
と言う取り決めに今の所なってるが、魔法などでどれだけ生かされるかは、まだ分からない。
2017年 10月19日
やっと初歩の攻撃部分だけできた。
差配プログラムも変更されたが、部隊が 3部隊で 1部隊 3ユニットというややこしさと、武器を持ってる持って無い、射程がある、ユニットによっては手の攻撃が無い、2手攻撃、複数攻撃とか要素が多くて大変だった。
あまりの作成する要素の量と、たぶん現在全行程の3割くらいしか進んでない状況から、もう完成しないのではないかと日に 1度は思う。
やっぱりもっと簡単なゲームから制作した方が良かったのか・・・・。
そう考えるのはクリエイターのお約束なんだろうなあ。
2017年 10月8日
戦闘部隊は最大でそれぞれ 3部隊ずつあるので、どの順番で戦うか、というプログラムね。
これが意外とややこしくて、てこずった。
部隊数が敵より少ない場合、順番にもう一度繰り返し戦う。
ソース。
*battle ; 戦闘メイン //////////////////////////////// btvf=0 ; 勝利フラグ repeat 1 ; ------------------------------------------------- dim ff1,4 ; forceフラグ、攻撃側 dim ff2,4 ; forceフラグ、防衛側 repeat 3 : cnt2=cnt ; 部隊が存在するか repeat 3 if mu(kn1*10+cnt2*3+cnt+1)=0 : continue ff1(cnt2+1)=1 : break loop repeat 3 if mu(kn2*10+cnt2*3+cnt+1)=0 : continue ff2(cnt2+1)=1 : ff2(0)=-1 : break loop loop if ff2(0)=0 : btvf=1 : break; 防衛部隊が無いので勝利 ; 戦闘部隊差配 ------------- fc1=0 : fc2=0 ; 部隊No. repeat 3 ; 攻撃側 if ff1(fc1\3+1)=0 : fc1+ : continue bf=0 ; 不戦勝フラグ repeat 3 ; 防衛側 if ff2(fc2\3+1)=1 : gosub *fight : fc2+ : bf=1 : break fc2+ loop if bf=0 : btvf+ ; 不戦勝 fc1+ loop repeat 3 ; 防衛側 if fc2>=3 : break ; 全部隊戦闘したので終わり if ff2(fc2\3+1)=0 : fc2+ : continue bf=0 ; 不戦負フラグ repeat 3 ; 攻撃側 if ff1(fc1\3+1)=1 : gosub *fight : fc1+ : bf=1 : break fc1+ loop if bf=0 : btvf- ; 不戦負 fc2+ loop loop ;------------------------------------------------------ return *fight ; 戦闘 /////////////////////////////////////// fg1=fc1\3+1 fg2=fc2\3+1 dim fn1,4 ; 攻撃側ユニットNp. dim fn2,4 ; 防衛側ユニットNp. repeat 3,1 ; ユニットNo.ひかえ fn1(cnt)=mu(kn1*10+(fg1-1)*3+cnt) fn2(cnt)=mu(kn2*10+(fg2-1)*3+cnt) loop return
btvf=勝敗数。
ff=どの部隊が存在するか。
1は攻撃側、2は防衛側。
fc=部隊の順番カウント。
部隊が敵より少ない場合に、順番に戦わせるため。
部隊数は fc\(余り)3+1で求める。
攻撃側と防御側、それぞれ 3回ずつで判定する。
fg=今戦っている部隊No.
fn=戦うユニットNo.
攻撃側
防衛側
1戦目。左が攻撃側、右が防衛側。
2戦目
3戦目
3戦目は防衛側が第 2部隊をもう一度出している。
1部隊しかなければ 3戦出る。
まだ戦闘が出来てないので、たぶん 1戦目でやられるだろうから、実際には 3戦目は不戦勝とかそんな感じ。
あ、そうそう、部隊は前衛、中衛、後衛で出来ていて、射程の概念がある。
2017年 10月4日
いやあ、ややこしかった。
おっと前々々回と入りが同じだ。
どう処理したらできるのか分からなくて、もうダメかと思ったけど、何も考えずにブロック積み上げるように地味にベタベタと組んだらなぜかできた。
まあ、難しい時はとりあえず紙に書くと良い。
ソースはこちら。
装備によるステータス計算の前半にぶち込む事にした。
後半の 2ブロックはとりあえず前にも出た部分で、今回は関係無い。
追加したのは増加枠の部分ね。
#deffunc equ_syo int equ_syon1,int equ_syon2; 装備処理 eun=equ_syon1 ; キャラNo. qin=equ_syon2 ; アイテムNo. qig=qin*idb ; アイテムデータ位置 ; 増加枠 ------- repeat n1=ud(ug+19) ; 元のアイテム枠数 n=0 repeat 7 qin2=ud(ug+40+cnt) if qin2<=0 : continue n+=id(qin2*idb+3) ; 知力を加算 loop n2=(ud(ug+3)+n)/20-ud(ug+18)+1 ; 枠元値 repeat 7 if equsi(cnt)!5 : continue ; 特殊枠 n=ud(ug+40+cnt) ; アイテムNo. if n<=0 : break ; 装備してない if id(n*idb+8)=19 : n2+=id(n*idb+9) ; 特殊の枠増加 break loop ud(ug+19)=n2 ; アイテム枠数 if n1<=n2 : break ; 枠が同数か増えてるなら終わり n3=ud(ug+16)+ud(ug+17)+ud(ug+18) if n3+n2>=7 : break ; 7枠以上なら終わり n4=n3+n2 repeat 7 ; 減った枠のアイテムを外す if n4+cnt>=7 : break if ud(ug+40+n4+cnt)<=0 : continue qin2=ud(ug+40+n4+cnt) : id(qin2*idb+13)=0 ; アイテムを外す ud(ug+40+n4+cnt)=0 loop loop sbk_syo ; 装備枠再計算 ; 基礎値 ------- repeat 5 : ud(ug+21+cnt)=ud(ug+1+cnt) : loop ; 基礎値 repeat sbkn : cnt2=cnt ; アイテムの基礎値+ qin=ud(ug+40+cnt2) ; アイテムNo. if qin<=0 : continue ; 装備してない qig=qin*idb ; アイテムデータ先頭 repeat 5 ; アイテム能力値+ ud(ug+21+cnt)+=id(qig+1+cnt) loop loop repeat 2 : ud(ug+11+cnt)=ud(ug+21) : loop ; 基礎攻防値 repeat 6 : ud(ug+31+cnt)=0 : loop ; 属性値リセット ; 装備 ------- f=0 repeat sbkn : cnt2=cnt qin=ud(ug+40+cnt2) ; アイテムNo. if qin<=0 : continue ; 装備してない qig=qin*idb ; アイテムデータ先頭 repeat 1 ; 攻撃 if ud(ug+16)<cnt2 : ud(ug+11)+=id(qig+11) : break if f=1 : break ud(ug+11)+=id(qig+11) : f=1 loop ud(ug+12)+=id(qig+12) ; 防御 repeat 6 : ud(ug+31+cnt)+=id(qig+31+cnt) : loop ; 属性値 loop return
どういう事をしてるかというと、まず変更前のアイテム枠の数をひかえ、アイテム枠の数に関係する知力の全装備アイテムの値を仮に計算して、現在の元枠数を出す。
次に特殊装備枠に枠数増加のアイテムが装備されていたら、その値をアイテム枠数に足す。
枠数が装備変更前の枠数と同じか増えてる分には変更無し。
枠数が 7枠以上なら装備を外す必要が無いので変更無し。
減った枠の分だけ装備をはずす。
そしたら始めに戻って再計算。
とまあそんな感じだ。
字ヅラだけ追っても何の事か分からないだろう。
大丈夫、自分にはさっぱり分からない。
これによって枠増加のアイテムは元より、知力の増加するアイテムを付けたり外した場合にも対処できる・・・・ハズ・・・。
まあ、後は追々バグを処理していこう。
装備前
アイテム枠増加アイテムを装備。
サックは +3。
とりあえず、能力値増加のアイテムを装備してみる。
ガントレットは力が、サークレットはその他が少し上がる。
ステータスが少し上がってると思う。
サックをはずすと、減った枠のアイテムが自動で外れる。
以上(T_T)
さて、やっと基本的な枠組みが出来上がった様なので、これでいよいよ「戦闘」をプログラムできると思う。
やっとメインかなあ、戦闘の要素は全プログラムの 2~3割くらいかな。
という訳でまた次回。
2017年 9月30日
その前にまずデータの扱いを整理する事にした。
ud(ユニットデータ)、cd(キャラデータ)、id(アイテムデータ)、itd(アイテム元データ)、これらの変数の何番目が何のデータかという奴だ。
最終的に今の所こんな感じになった。
; キャラ ;(0=フラグ、 ; 1=筋力、2=魔力、3=知性、4=魅力、5=HP、6=、 ; 7=属性、8=特殊能力、9=特殊能力値、 ; 10=GRNo、11=GRx、12=GRy、13=枠、14=背景、 ; 15=出現Lv、 ; 16=手スロット、17=防具スロット、18=特殊スロット、19=ITEMスロット、) ; ユニット ;(0=フラグ、cn(キャラNo、種類)、 ; 1=筋力、2=魔力、3=知性、4=魅力、5=HP、6=、 ; 7=属性、8=特殊能力、9=特殊能力値、 ; 10=所属PL、11=攻撃力、12=防御力、13=配属、14=、15=、 ; 16=手スロット、17=防具スロット、18=特殊スロット、19=ITEMスロット、) ; 最終値(21=筋力、22=魔力、23=知性、24=魅力、25=最大HP、26=現HP) ; 属性値(31=火、32=水、33=風、34=地、35=光、36=闇) ; 40=装備) ; ステータス(51=火傷、52=フリーズ、53=マヒ、54=スタン、55=ターンアンデッド、56=毒値) ; アイテム ;(0=フラグ、所持キャラ、 ; 1=筋力、2=魔力、3=知性、4=魅力、5=HP、6=、 ; 7=属性、8=特殊能力、9=能力値、10=所属PL、 ; 11=攻撃力、12=防御力、13=所持PL、 ; 14=装備箇所(1=手スロット、2=防具スロット、3=特殊スロット、4=ITEMスロット) ; 15=制作Lv ; 16=アイテム種類(0=未使用、1=右手、2=右両手、3=左手、4=左両手、 ; 5=盾、6=防具、7=アクセサリー、8=特殊、9=アイテム、10=魔法、回復魔法、状態魔法) ; ; 17=射程、18=攻撃範囲、19=
なぜこんな事をするのかと言うと、例えばキャラの 攻撃値格納が 15番で、アイテムの攻撃値格納が 11番だったりすると、扱いがややこしいからだ。
例えば統一した攻撃値の計算だと ud(ug+11)+=id(ig+11)のようになり、要するにそれぞれ 11番目の値が攻撃値なので分かりやすい。
今回それぞれ適当に手探りでやっていたので、データの扱いがバラバラだった。
大変だが、まだソースが少ない内にやってしまおう。
まず仕様番号の変わったデータを改変する、データコンバーターを作る。
と言ってもしごく簡単だ。
;/////// CHARA_data_converter /////// *chara_data cb=210 ; キャラ種類 cdb=20 ; データ量 dim cd,cdb,cb ; データ元 bload "c_data.dat",cd dim cd2,cdb,cb ; 改変データ repeat cb cd2(0,cnt)=cd(0,cnt) cd2(1,cnt)=cd(3,cnt) cd2(2,cnt)=cd(4,cnt) cd2(3,cnt)=cd(5,cnt) cd2(4,cnt)=cd(6,cnt) cd2(5,cnt)=cd(1,cnt) cd2(6,cnt)=cd(2,cnt) cd2(7,cnt)=cd(7,cnt) cd2(8,cnt)=cd(8,cnt) cd2(9,cnt)=cd(9,cnt) cd2(10,cnt)=cd(15,cnt) cd2(11,cnt)=cd(16,cnt) cd2(12,cnt)=cd(17,cnt) cd2(13,cnt)=cd(18,cnt) cd2(14,cnt)=cd(19,cnt) cd2(15,cnt)=cd(10,cnt) cd2(16,cnt)=cd(11,cnt) cd2(17,cnt)=cd(12,cnt) cd2(18,cnt)=cd(13,cnt) cd2(19,cnt)=cd(14,cnt) loop bsave "c_data.dat",cd2
そしてプログラム内のデータの扱いを全て変えていく。
隅から隅まで全部間違いなく変えないといけないので、これが大変な作業となる。
ところでこれ、たぶんプログラマー的に言うとやってはいけない事だと思う。
たしかプログラマーのハウツーに「最適化してはいけない」というようなものがあったと思う。
なぜかと言うと必ずバグが発生し、不慮のバグが残る可能性が増大し、最悪の場合動かなくなるからだ。
本当はデータの扱いを数字では無く、
d_str=1
ud(ug+d_str)、id(ig+d_str)
のような変数扱いでするべきなのだろう。
次回のプログラムからは考慮しようと思う。
さて、その作業で(バカみたいに)2日程費やし、いよいよ装備によるステータス計算を行う。
ソースはこんな感じ。
#deffunc equ_syo int equ_syon; 装備処理 cn=ud(ug) ; 基礎値 ------- repeat 5 : ud(ug+21+cnt)=ud(ug+1+cnt) : loop ; 基礎値 repeat sbkn : cnt2=cnt ; アイテムの基礎値+ in=ud(ug+40+cnt2) ; アイテムNo. if in<=0 : continue ; 装備してない ig=in*idb ; アイテムデータ先頭 repeat 5 ; アイテム能力値+ ud(ug+21+cnt)+=id(ig+1+cnt) loop loop repeat 2 : ud(ug+11+cnt)=ud(ug+21) : loop ; 基礎攻防値 repeat 6 : ud(ug+31+cnt)=0 : loop ; 属性値リセット ; 装備 ------- f=0 repeat sbkn : cnt2=cnt in=ud(ug+40+cnt2) ; アイテムNo. if in<=0 : continue ; 装備してない ig=in*idb ; アイテムデータ先頭 itn=id(ig) ; アイテム種類 repeat 1 ; 攻撃 if ud(ug+16)
装備無しの状態。
武器を装備。う~ん、気がつかなかったけど魔法防御値もいるんだよなあ。
うわあっ、そうだ魔攻値もだ。データ整理したばかりなのに、どうしたもんだろう。
今の所 2番目以降の武器の攻撃値は足さない。
防具のデータもまだ全部作ってないなあ。
後はアイテム枠増加の計算が残ってる。
これは頭痛いんだよなあ。枠増加枠に装備しているものが、枠増加アイテムを外した時に同時に外されるという・・・。
2017年 9月23日
アイテムの選択画面を整理する。
まずタップ座標を作って
; アイテム選択画面-------------------------------- iselx1=10 : iselxk=60 isely1=11 : isely2=51 : iselyk=38 iselx2=305 iselx3=iselx2+iselxk iselx4=iselx3+iselxk iselx5=iselx4+iselxk iselx6=iselx5+iselxk dim iselkx1,20 ; タップ座標 dim iselkx2,20 dim iselky1,20 dim iselky2,20 repeat 9,1 iselkx1(cnt)=0 : iselkx2(cnt)=wx iselky1(cnt)=isely2+iselyk*(cnt-1)-6 iselky2(cnt)=isely2+iselyk*(cnt)-6 iselky1(cnt+10)=0 iselky2(cnt+10)=isely2-6 loop iselky1(9)=iselky1(8) : iselky2(8)=wy : selky2(9)=wy k=4 iselkx1(8)=0 : iselkx2(8)=wx/2 iselkx1(9)=wx/2 : iselkx2(9)=wx iselkx1(11)=0 : iselkx2(11)=iselx2-k iselkx1(12)=iselx2-k : iselkx2(12)=iselx3-k iselkx1(13)=iselx3-k : iselkx2(13)=iselx4-k iselkx1(14)=iselx4-k : iselkx2(14)=iselx5-k iselkx1(15)=iselx5-k : iselkx2(15)=iselx6-k iselkx1(16)=iselx6-k : iselkx2(16)=wx
これは表示の座標も含まれていて、それを元にタップ座標を作っている。
表示してタップエリアを確認して調整。
それを元にキー座標を返す関数を作る。
#defcfunc isel_key ; 選択画面入力 x=mousex : y=mousey : isel_keyn=0 repeat 9,1 : n1=cnt : n2=cnt+10 if iselkx1(n1)<x and iselky1(n1)<y and iselkx2(n1)>x and iselky2(n1)>=y : isel_keyn=n1 : break if iselkx1(n2)<x and iselky1(n2)<y and iselkx2(n2)>x and iselky2(n2)>=y : isel_keyn=n2 : break loop return isel_keyn
アイテム選択は 1~7、外すボタンは 8、戻るボタンは 9、ソート座標は11~16の値が返る。
表示も整えて、こんな感じ。
キャラ選択のをコピペして改造してあるので、押してすべらせればスクロールもする。
8枠の 1つを潰して「外す」のと「戻る」のを加えた、これは後でキャラ選択にもつける予定。
選択画面のソース。
/////// アイテム選択画面 ////////////////////// *iselect dim isel,ib+1 ; 一時選択キャラNo.一覧 repeat ib ; クリア isel(cnt)=0 loop sbn=equsi(kyg) ; 装備場所 pn=mpl(kn) ; プレイヤー n=0 ; 自勢力のアイテムをピックアップ repeat ib,1 ig=idb*cnt ; ItemNo. if id(ig)=0 : continue if id(ig+10)!pn : continue ; 自勢力で無い if id(ig+19)=un : continue ; そのキャラが持ってる if sbn=1 : if id(ig+9)!1 and id(ig+9)!2 : continue ; 右手 if sbn=2 : if id(ig+9)!1 and id(ig+9)!3 and id(ig+9)!4 and id(ig+9)!5 : continue ; 左手 if sbn=3 { if id(ig+9)>5 : continue ; 複数手 if kyg=0 and id(ig+9)=4 : continue ; 左端で左両手装備 if kyg=ud(ug+11)-1 and id(ig+9)=2 : continue ; 右端で右両手装備 } if sbn=4 : if id(ig+9)!6 : continue ; 防具 if sbn=5 : if id(ig+9)<7 : continue ; 特殊 if sbn=6 : if id(ig+9)!7 and id(ig+9)!9 and id(ig+9)!10 : continue ; アイテム isel(n)=cnt : n+ ; アイテムNo.登録 loop iselb=n ; 総数 iself=0 : iseln=0 : sel_yg=0 : ky=0 : kb=0 repeat ;------- メイン ---------------- ;------- 入力 ------- repeat 1 if kc>0 : kc- : break ky=isel_key() ; タップ座標 stick kb,256 ; ボタン loop if ky=8 and kb=256 : remove_syo : break ; 外す if ky=9 and kb=256 : break ; 戻る ;------- スクロール処理 ------- repeat 1 ; スクロール if kb=256 { if isel_kn=0 : isel_kn=1 : isel_ky=mousey break } if isel_kn=0 : break : else : isel_kn=0 isel_dy=-(mousey-isel_ky)/20 ; 移動量 if isel_dy=0 : if 1<=ky and ky<=7 : iseln=isel(sel_yg+ky-1) : iself=1 ; 選択 loop if iself=1 : break ; 選択して戻る if sel_yg>0 and isel_dy<0 : sel_yg- : isel_dy+ if sel_yg+7<iselb and isel_dy>0 : sel_yg+ : isel_dy- ;------- その他 ---------------- repeat 1 ; ソート if kb!256 : break ; タップしてない if ky<11 or 16<ky : break if iselb<2 : break ; 少ない isel_kn=0 if ky=11 : dn=0 ; 照合データ if ky=12 : dn=12 ; 攻撃 if ky=13 : dn=13 ; 防御 if ky=14 : dn=7 ; 射程 if ky=15 : dn=30 ; 属性 if ky=16 : dn=14 ; 特殊 repeat iselb-1 : cnt2=iselb-cnt ; バブルソート repeat cnt2 n1=isel(iselb-cnt) : nd1=id(n1*idb+dn) n2=isel(iselb-cnt-1): nd2=id(n2*idb+dn) if nd1<=nd2 : continue isel(iselb-cnt)=n2 : isel(iselb-cnt-1)=n1 ; 入れ替え loop loop loop ;------- 表示 ------- redraw 0 color 0,0,0 : boxf : color 255,255,255 isel_put ; 表示 dg_put redraw 1 await 1000/20 loop ;--------------------------------- kc=3 return
これで大体装備装置はできたと思うので、次は装備したものをステータス計算するプログラムを作る。