2017年 9月10日
前回から 10日程経ったので中途半端ではありますが、経過報告です。
というのもアクセス解析を入れた所、一日2~3人程の人に見てもらってるようで、思ったより見てくれているようです。
実は 9月に入ってから涼しくなったので作業自体は割と順調でした。
では前回から、まず作成したデータを本体に取り込んで表示。
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 |
/////// UNIT DATA /////// ; キャラデータ *chara_data cb=210 ; キャラ種類 cdb=20 ; データ量 dim cd,cdb,cb ; キャラデータ bload "c_data.dat",cd sdim cs,30,cb notesel cs ; 名前 noteload "c_name.txt" sdim cs2,30,cb repeat cb noteget s,cnt : cs2(cnt)=s loop cha_syu=0,16,22,27,25,18,25 ; 属性各種類 cha_zoks=0,1,31,71,111,151,181 ;(0=フラグ、 ; 1=HP、2=、3=筋力、4=魔力、5=知性、6=魅力、 ; 7=属性、8=特殊能力、9=特殊能力値、10=出現Lv、 ; 11=手スロット、12=防具スロット、13=特殊スロット、14=ITEMスロット、) ; 15=GRNo、16=GRx、17=GRy、18=枠、19=背景、 utksb=73 dim utks,20,utksb utks(0)="無","攻勢","守備","行政","魔術","祭司","制作","宝の番人" utks(10)="火傷","コールド","麻痺","スタン","ターンアンデッド","毒","テンプテーション" utks(20)="バーサーク","ディフェンサー","速攻","盗む","スナイピング","剛弓","貫通" utks(30)="アンデッド","ネクロマンサー","吸血","再生","絶叫","ナイトメア" utks(40)="2回攻撃","3回攻撃","兜割り" utks(50)="ファイアーブレス","コールドブレス","サンダーブレス","咆哮","ホーリーブレス","ポイズンブレス","津波" utks(60)="火の息","ファイアーボール","ファイアーストーム","コールドストーム","ダークスファイア","ウインドストーム" utks(70)="ヒール","ヒールオール","ヒールソング","" utks(99)="" zks="","火","水","風","地","光","闇" return ; ユニットデータ *unit_syoki ub=200 ; ユニットの最大数 udb=60 ; 1ユニットのデータ量 dim ud,udb*(ub+1) ; 200ユニット分 ;(0=フラグ、 ; 1=HP、2=、3=筋力、4=魔力、5=知性、6=魅力、 ; 7=属性、8=特殊能力、9=特殊能力値、10=出現Lv、 ; 11=手スロット、12=防具スロット、13=特殊スロット、14=ITEMスロット、) ; 15=GRNo、16=GRx、17=GRy、18=枠、19=背景、 ;(0=フラグ、cn(キャラNo、種類)、 ; 1=最大HP、2=現HP、3=筋力、4=魔力、5=知性、6=魅力、 ; 7=属性、8=特殊能力、9=配属、 ; 10=所属PL、 ; 11=手スロット、12=防具スロット、13=特殊スロット、14=ITEMスロット、 ; 15=攻撃力、16=防御力、17=特殊能力値、18=、19=、 ; ; 最終値(21=最大HP、22=HP、23=筋力、24=魔力、25=知性、26=魅力) ; ステータス(31=火傷、32=フリーズ、33=マヒ、34=スタン、35=ターンアンデッド、36=毒値) ; 40=装備) ; ; 火傷値、フリーズ%、マヒ%、スタン%、ターンアンデッド%、毒値% ; 火傷人数、フリーズ人数、マヒ人数、スタン人数、ターンアンデッド人数、毒人数 return |
とは言っても、すり合わせがややこしく、これだけの事で 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 |
; UNIT 初期配置------------------------------------------- repeat 7,1 : pn=cnt ; プレイヤー kn=mpc(pn) ; HEX n=map(kn);n=rnd(6)+1 ; 属性 repeat 16 : cnt2=cnt cn=rnd(cha_syu(n))+cha_zoks(n) repeat ub,1 un=cnt : ug=un*udb ; ユニットNo. if ud(ug)=0 : break loop ud(ug)=cn ; cnキャラ種類 repeat 9,1 ud(ug+cnt+20)=cd(cnt,cn) ; データ loop ud(ug+8)=cd(8,cn) ; 特殊能力 ud(ug+10)=pn ; 所属 repeat 3,11 ; 装備 ud(ug+cnt)=cd(cnt,cn) loop ud(ug+14)=cd(5,cn)/20-ud(ug+13)+1 ; アイテム装備数 ud(ug+22)=ud(ug+21) ; HP if cnt2>9 : continue mu(kn*10+cnt2)=un ; 領主、部隊配置 ud(ug+9)=kn*10+cnt2 ; 配属 loop loop ; ITEM初期配置 ---------------------------------------- n=1 repeat 7,1 : pn=cnt ; プレイヤー repeat 15 repeat r=rnd(itb) : if itd(0,r)>0 : itn=r : break ; アイテム種類 loop in=n : n+ ; アイテムNo. ig=in*idb ; データ位置 repeat idb id(ig+cnt)=itd(cnt,itn) ; データ loop id(ig)=itn id(ig+10)=pn ; 所属PL loop loop |
変数について、ほんとは文字にして何のデータか分かるようにしないといけないんだと思います。
でも自分はめんどくさいし、変数ごときにそんなに長々と文字打ってられないし、プログラムが長くなって何やってんだか分からなくなるしで、短く udとか unとか udbとか使ってます。
短い変数だと別の所で使う可能性もあるので、あんまり良くは無いとは思いますが、思考錯誤しながらプログラムしてるのに長文なんて打ってらんないです。
これ uならユニット、dはデータ、bは最大数と言う風に決まりはあります。
iならアイテム、jなら自機、evならイベント、eなら敵、と言う風に自分なりに決めていつも使ってます。
n=値、f=フラグ、c=カウンター、k=間隔、a=最小値、g=現在値、o=大きさ、r=乱数、s=文字列、t=時間、xyz=座標、pならputで表示、inならアイテムNo、cnならキャラNo、unならユニットNoとかそんな感じです。
例えば自機座標なら jx,jy、HPなら jhpとかですね、これだけだと割りと普通だけど(笑)
アマチュア仕様ですのでオススメはしません。
たぶんプロのだと Jiki_xとか Item_Dataだとか文になってると思うのね。
国表示画面で表示するようにします。
この時点でこの画面では原則 mes表示はしてません。
bmpフォントで数字を表示し、文字は作成してます。
|
---|
最終的に mes表示は全部使いません。
スマホ用の操作にするため、ワンクリックで情報表示。
選択カーソルも表示するようにします。
この状態の選択キャラ上で、縦 130ドットの内、上 80ドットでキャラ選択、下50 ドットで装備変更になってます。
キャラの無い状態だと 130ドット全部キャラ選択になってます。
インフォ画面のプログラム
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 |
*info ; 国インフォ画面 infof=0 repeat ;------- メインルーチン ------- ;------- 入力 ------- ky=inf_key() stick kb,256,0 if kb=128 : break ; ESC END if kc>0 : kc- : kb=0 ; 入力ウイエト switch infof case 0 ; 待機 if kb!256 : swbreak if mu(kn*10+ky\10)=0 : kc=5 : sel_syo : swbreak ; キャラがいない kc=5 : infof=1 : ky2=ky : if ky=-1 : hextf=0 swbreak case 1 ; インフォ表示 if kb!256 : swbreak kc=5 : if ky=-1 : infof=0 : swbreak if (ky\10)!(ky2\10) { ; 選択しているキャラではない if mu(kn*10+ky\10)=0 : kc=5 : sel_syo : /*infof=0*/ : swbreak ; キャラがいない ky2=ky : swbreak } if 10<=ky and ky<=19 { ; 装備 un=mu(kn*10+ky-10) : ug=un*udb : cn=ud(ug) if cn>0 : gosub *equipment : swbreak } sel_syo swbreak swend if hextf!1 : break ; 戻る ;------- 表示 ------- redraw 0 color 0,0,0 : boxf : color 255,255,255 map_put ; マップ表示 inf_put ; HEX情報表示 dg_put ; デバッグ表示 redraw 1 await 1000/20 loop ;--------------------------------- return |
まだ途中なのでバグが残ってるけど、これだけでも相当にややこしい。
inf_key()は別の場所で #deffuncによりキー入力のプログラムを作ってあって、カード座標の上 80ドットは 0~9、下 50ドットは 10~19の値を返すようになってます。
sel_syoは、前に作ったセレクト画面です。
とりあえず報告ここまで、現在装備画面を作ってます。
これがまた恐ろしくややこしい。