; blue crystal stage editer (BCED) #define TITLESTR "Blue Crystal Stage Editer v0.01" ;タイトル登録 title TITLESTR ;メモリ確保 sdim mapdata,16000 sdim stagedata,145 sdim stagestr,128,100 sdim sdtname,256 sdim editer,18 sdim editer_addr,66 sdim sdtname_real,256 dim clear_flag,100 dim dx,4 dim dy,4 dx = 0,-1,1,0 dy = 1,0,0,-1 ;画面初期化 screen 0,640,390,1 picload "char.bmp",1 color 0,0,0 boxf 0,0,640,390 gmode 1 buffer 2,640,390,1 picload "char.bmp",1 color 0,0,0 boxf 0,0,640,390 gmode 1 buffer 3,256,256,1 picload "char.bmp",1 onexit *Quit redraw 0 screen 6,200,200,1,-240,-220 screen 7,200,40,1,-240,-60 gsel 6,-1 gsel 7,-1 redraw 1 ;変数初期化(面データ初期設定) *ValInit mapdata="" sdtname="新規Map.sdt" sdtname_real="新規Map.sdt" editer_addr="" editer="名無しの権兵衛" passwd="" map_ver=0 parts_sel=0 modflag=0 limstage=1 : stage=1 gosub *StageInit ;編集画面初期設定 *EditInit title TITLESTR+" ["+sdtname+"]" a=0 repeat 144 peek a,mapdata,(stage-1)*144+cnt if a=12 : x_mpos=cnt\12 : y_mpos=cnt/12 : a=0 if a=4 : x_cpos=cnt\12 : y_cpos=cnt/12 : a=0 poke stagedata,cnt,a loop redraw 0 gsel 0,1 color 0,0,0 boxf 0,0,640,390 gosub *ScrInit gosub *MapDisp gosub *StatDisp gosub *CharDisp wait 10 ;編集開始 *EditStart ;編集メインループ *EditMain await 1 ginfo 1 : if prmx=-1 : goto *EditMain ginfo 0 : x_pos=prmx : y_pos=prmy-16 ginfo 2 : if (x_pos-prmx<0)|(x_pos-prmx>640)|(y_pos-prmy<0)|(y_pos-prmy>390) : goto *EditMain stick a,256:if (a&800)=0 : goto *EditMain if a=32 : gosub *Stage2Map : goto *TestInit if (mousex<384) : x_pos=mousex/32 : y_pos=mousey/32 : goto *PushMap if (mousex>400)&(mousex<624)&(mousey>160)&(mousey<192) : parts_sel=mousex-400/32 : gosub *StatDisp if (mousex>420)&(mousex<612)&(mousey>240)&(mousey<256)&(a=256) : x_pos=mousex-420/64 : goto *BtnChk if (mousex>420)&(mousex<612)&(mousey>272)&(mousey<288)&(a=256) : x_pos=mousex-420/64 : goto *BtnChk2 if (mousex>494)&(mousex<622)&(mousey>128)&(mousey<144)&(a=256) : x_pos=mousex-494/32 : goto *StageSel if (mousex>420)&(mousex<620)&(mousey>110)&(mousey<118)&(a=256) : x_pos=mousex-420 : goto *StageBar goto *EditMain ;ステージボタン押下 *StageSel gosub *Stage2Map : wait 10 if (x_pos=0)&(stage<10) : stage =1 : redraw 0 : goto *EditInit if (x_pos=0) : stage-=10 : redraw 0 : goto *EditInit if (x_pos=3)&(limstage-101) : stage-- : redraw 0 : goto *EditInit if (x_pos=2)&(limstage>stage) : stage++ : redraw 0 : goto *EditInit goto *EditMain ;ステージバー押下 *Stagebar b=x_pos*limstage/200+1 if stage!b : gosub *Stage2Map : stage=b : redraw 0 : goto *EditInit goto *EditMain ;ボタン押下 *BtnChk wait 1 redraw 0 stick a,256:if (a&256)=0 : goto *RrsBtn a=64*x_pos : b=a+420 : pos b,240 c=0 if ((mousex>b)&(mousex<(b+64))&(mousey>240)&(mousey<256)) :gcopy 3,a,241,64,15:c=1: else :gcopy 3,a,225,64,15 redraw 1,b,240,b+64,256 goto *BtnChk *BtnChk2 wait 1 redraw 0 stick a,256:if (a&256)=0 : goto *RrsBtn2 a=32*x_pos+161 : b=64*x_pos+420 : pos b,272 c=0 if ((mousex>b)&(mousex<(b+64))&(mousey>272)&(mousey<288)) :gcopy 3,192,a+16,64,15:c=1: else :gcopy 3,192,a,64,15 redraw 1,b,272,b+64,288 goto *BtnChk2 *RrsBtn a=64*x_pos : b=a+420 : pos b,240 redraw 0 gcopy 3,a,225,64,15 redraw 1,b,240,b+64,256 if c=0 : goto *EditMain if x_pos=0 : goto *NewFile if x_pos=1 : goto *LoadFile goto *SaveFile *RrsBtn2 a=32*x_pos+161 : b=64*x_pos+420 : pos b,272 redraw 0 gcopy 3,192,a,64,15 redraw 1,b,272,b+64,288 if c=0 : goto *EditMain if x_pos=0 : goto *DelStage if x_pos=1 : goto *DupStage goto *InfoStage ;ファイル関係メニュー処理 *NewFile dialog "現在のデータを破棄してよろしいですか?",2,"新規作成" if stat=7 : goto *EditMain goto *ValInit *LoadFile if modflag=1 :dialog "変更されています。セーブしますか?",2,"確認":if stat=6 : goto *SaveFile dialog "sdt",16,"BlueCrystal StageFile" : if stat=0 : goto *EditMain a=0 : b=0 : sdtname_real=refstr : strlen b,sdtname_real repeat getstr sdtname,sdtname_real,a,'\' a+=strsize if a>=b : break loop gosub *MapLoad goto *EditInit *SaveFile gosub *Stage2Map gosub *InfoFile dialog "sdt",17,"BlueCrystal StageFile" : if stat=0 : goto *EditMain a=0 : b=0 : sdtname_real=refstr : strlen b,sdtname_real repeat getstr sdtname,sdtname_real,a,'\' a+=strsize if a>=b : break loop title TITLESTR+" ["+sdtname+"]" gosub *MapSave goto *EditMain ;ステージ関係メニュー処理 *DelStage dialog "現在の面を消去してよろしいですか?",2,"面の消去" if stat=7 : goto *EditMain if limstage=1 : gosub *StageInit : goto *EditInit if stage=limstage : limstage-- : stage-- : goto *EditInit repeat (limstage-stage)*144,stage*144 peek a,mapdata,cnt poke mapdata,cnt-144,a loop repeat limstage-stage,stage a=cnt-1 clear_flag.a=clear_flag.cnt loop limstage-- modflag=1 redraw 0 goto *EditInit *DupStage dialog "現在の面を複製してよろしいですか?",2,"面の複製" if stat=7 : goto *EditMain gosub *Stage2Map limstage++ repeat (limstage-stage)*144,1 peek a,mapdata,limstage*144-cnt-144 poke mapdata,limstage*144-cnt,a loop repeat limstage-stage,0 a=limstage-cnt : b=a-1 clear_flag.a=clear_flag.b loop modflag=1 redraw 0 goto *EditInit *InfoStage onexit *InfoOK screen 6,400,200,1,200,200 cls 1 : color 0,0,0 title "ファイル情報" pos 10,22 :mes "作成者 : "+editer pos 10,62 :mes "E-Mail : "+editer_addr pos 10,102 if passwd="" : mes "Password : ロックなし" : else : mes "Password : ロックあり" a=map_ver/100 : str a,3 b=map_ver\100 : str b,2 pos 10,142:mes "Version : ver. "+a+"."+b pos 170,165 : objsize 60,24 button "OK",*InfoOK stop *InfoOK onexit *Quit gsel 6,-1 : gsel 0 goto *EditMain ;マップ書き込み *PushMap if a=512 : goto *GetChar if a!256 : goto *EditMain if (x_pos=0)|(y_pos=0)|(x_pos=11) : goto *EditMain if (y_pos=11)&((parts_sel!5)&(parts_sel!1)) : goto *EditMain peek a,stagedata,y_pos*12+x_pos if (parts_sel=4)&(a!0) : goto *EditMain if (parts_sel=6)&(a!0) : goto *EditMain if (parts_sel=4)&(x_pos=x_mpos)&(y_pos=y_mpos) : goto *EditMain if (parts_sel=6)&(x_pos=x_cpos)&(y_pos=y_cpos) : goto *EditMain if parts_sel=4 :gosub *CharDel:x_cpos=x_pos:y_cpos=y_pos:modflag=1:a=stage-1:clear_flag.a=0:gosub *CharDisp if parts_sel=6 :gosub *CharDel:x_mpos=x_pos:y_mpos=y_pos:modflag=1:a=stage-1:clear_flag.a=0:gosub *CharDisp if (x_pos=x_mpos)&(y_pos=y_mpos) : goto *EditMain if (x_pos=x_cpos)&(y_pos=y_cpos) : goto *EditMain poke stagedata,y_pos*12+x_pos,parts_sel if a!parts_sel : modflag=1 : a=stage-1 : clear_flag.a = 0 : gosub *StatDisp gosub *MapDisp : gosub *CharDisp goto *EditMain *GetChar peek a,stagedata,y_pos*12+x_pos if (x_pos=x_mpos)&(y_pos=y_mpos) : a=6 if (x_pos=x_cpos)&(y_pos=y_cpos) : a=4 parts_sel=a gosub *StatDisp goto *EditMain ;====[ Test routines ]============================================ ;テストルーチン *TestInit title TITLESTR+" [ T E S T M O D E ]" onexit *GiveUP a=0 : dir=0 : grav=0 repeat 144 peek a,mapdata,(stage-1)*144+cnt if a=12 : x_mpos=cnt\12 : y_mpos=cnt/12 : a=0 if a=4 : x_cpos=cnt\12 : y_cpos=cnt/12 poke stagedata,cnt,a loop gosub *MapDisp gosub *TestStatDisp gosub *CharDisp goto *FallCheck *TestMain await 10 stick a,15 if a&15 : goto *Moving if a&16 : goto *TestInit if a&32 : goto *GiveUP if a&64 : goto *GiveUP goto *TestMain *Moving if a&8 : dir=0 if a&1 : dir=1 if a&4 : dir=2 if a&2 : dir=3 peek a,stagedata,(y_mpos+dy.dir)*12+(x_mpos+dx.dir) if (a=0) : goto *CharMove if (a=3) : goto *PushBlk if (a=4) : goto *PushCry if (a=2) : goto *GetGrav *MoveEnd redraw 0 gmode 1 x_gpos=x_mpos*32 : y_gpos=y_mpos*32 pos x_gpos,y_gpos gcopy 3,0,32,32,32 pos x_gpos,y_gpos gmode 2 gcopy 3,64*dir+(32*mot),0,32,32 redraw 1 goto *TestMain *GetGrav gsel 0,0 x_gpos=x_mpos*32 y_gpos=y_mpos*32 repeat 8,1 redraw 0 gmode 1 pos x_gpos,y_gpos gcopy 3,0,32,32,32 pos dx.dir*32+x_gpos,dy.dir*32+y_gpos gcopy 3,0,32,32,32 pos cnt*dx.dir*4+x_gpos,cnt*dy.dir*4+y_gpos gmode 2 gcopy 3,64*dir+(32*mot),0,32,32 if ((cnt+2)\4)=0 : mot=(mot+1)\2 redraw 1 await 10 loop gmode 1 y_mpos+=dy.dir x_mpos+=dx.dir poke stagedata,y_mpos*12+x_mpos,0 grav=(grav+1)\2 gosub *TestStatDisp gosub *CharDisp goto *FallCheck *FallCheck if grav=1 : goto *RevFallCheck c=0 : d=0 : e=0 repeat 11 y_count=10-cnt repeat 12 x_count=cnt a=0 : peek a,stagedata,y_count*12+x_count b=0 : peek b,stagedata,(y_count+1)*12+x_count if (a=3)&(b!1)&(b!4)&(b!5)&(b!3) : poke stagedata,y_count*12+x_count,11 :c++ if (a=4)&(b!1)&(b!2)&(b!3) : poke stagedata,y_count*12+x_count,12 : e++ if (a=4)&(b=5) : d=1 loop loop if c100) : dialog "ファイルが不正です",1,"読み込みエラー" : goto *LoadERR d = 0 : c = 0 repeat limstage b="" : getstr b,mapdata,a a += strsize stagestr.cnt=b repeat 12 b="" : getstr b,mapdata,a a += strsize repeat 12 peek c,b,cnt c-='0' if (c<0)|(c>0x0c) : dialog "ファイルが不正です",1,"読み込みエラー" : c=999 : break poke mapdata,d,c : d++ loop if c=999 : break loop if c=999 : break loop if c=999 : goto *LoadERR b="" : getstr b,mapdata,a,'\n' a += strsize editer=b stage=1 return *NewLoad getstr a,mapdata,23 : int a : limstage=a getstr editer,mapdata,35 getstr editer_addr,mapdata,58 getstr a,mapdata,128 : int a : map_ver=a c=0:a=0 repeat 144,0 peek a,mapdata,cnt c=c+a loop randomize c a=0 : b=0 : d=limstage*144+111 repeat d,144 peek a,mapdata,cnt rnd b,256 b=b^a poke mapdata,cnt,b loop repeat 100 peek a,mapdata,limstage*144+155+cnt clear_flag.cnt=a loop c=0 repeat limstage*144,144 peek a,mapdata,cnt poke mapdata,cnt-144,a c+=a loop b=0 peek a,mapdata,limstage*144+144 b+=a peek a,mapdata,limstage*144+145 b+=a*256 peek a,mapdata,limstage*144+146 b+=a*256*256 modflag=0 passwd="":a="" repeat 8 peek a,mapdata,limstage*144+147+cnt strmid a,a,0,1 passwd+=a loop if passwd=" " : goto *PassINP screen 7,200,40,1,200,200 cls 4 title "パスワードを入れてください" pos 20,8 a="" input a,120,24 pos 140,8 : objsize 40,24 button "OK",*PassINP d=0 : objsend 0,$c5,8,d,1 *PassLoop await 1 stick d:if d&32 : goto *PassINP goto *PassLoop *PassINP d=0 : strlen d,a repeat 8-d if d=8 : break a+=" " loop strmid a,a,0,8 if a!passwd : goto *LoadERR if c=b : stage=1 : gsel 7,-1 : gsel 0 : parts_sel=0 : return *LoadERR gsel 7,-1 : gsel 0 dialog "データが不正です!",1,"エラー" passwd="" mapdata="" sdtname="新規Map.sdt" sdtname_real="新規Map.sdt" editer_addr="" editer="名無しの権兵衛" map_ver=0 parts_sel=0 limstage=1 : stage=1 gosub *StageInit return ;マップ書き込み *MapSave modflag=0 map_ver++ ;[CHECKSUM] c=0 repeat limstage*144,1 peek a,mapdata,limstage*144-cnt poke mapdata,limstage*144-cnt+144,a c+=a loop a=c\256 poke mapdata,limstage*144+144,a a=c/256\256 poke mapdata,limstage*144+145,a a=c/256/256\256 poke mapdata,limstage*144+146,a repeat 100 a=(clear_flag.cnt)\256 poke mapdata,limstage*144+155+cnt,a loop ;[PASSWORD] a=0 : strlen a,passwd repeat 8-a if a=8 : break passwd+=" " loop strmid passwd,passwd,0,8 a=0 repeat 8 peek a,passwd,cnt poke mapdata,limstage*144+147+cnt,a loop ;[HEADER] repeat 144,0 poke mapdata,cnt,0 loop mapdata="[BC_STAGE_DATA]\n" a=limstage : str a,3 mapdata += "STAGE="+a+"\n" a=0 : strlen a,editer repeat 16-a if a=16 : break editer+=" " loop strmid editer,editer,0,16 mapdata += "EDITER="+editer+"\n" a=0 : strlen a,editer_addr repeat 64-a if a=64 : break editer_addr+=" " loop strmid editer_addr,editer_addr,0,64 mapdata += "ADDR="+editer_addr+"\n" a=map_ver : str a,7 mapdata += "VER="+a+"\n" ;[SEED] c=0:a=0 repeat 144,0 peek a,mapdata,cnt c=c+a loop ;[CRYPT] randomize c b=0 : d=limstage*144+111 repeat d,144 peek a,mapdata,cnt rnd b,256 b=b^a poke mapdata,cnt,b loop bsave sdtname_real,mapdata,d+144 randomize c repeat d,144 peek a,mapdata,cnt rnd b,256 b=b^a poke mapdata,cnt,b loop repeat limstage*144,144 peek a,mapdata,cnt poke mapdata,cnt-144,a loop return ;ファイル情報入力 *InfoFile onexit *InfoImpOK screen 6,400,200,1,200,200 getstr editer_addr,editer_addr,0,' ' getstr editer,editer,0,' ' getstr passwd,passwd,0,' ' cls 1 : color 0,0,0 title "ファイル情報を入れてください" pos 10,22 :mes "作成者 :" pos 100,20 :objsize 280,24 input editer,280,24 pos 10,62 :mes "E-Mail :" pos 100,60 :objsize 140,24 input editer_addr,280,24 pos 10,102:mes "Password:" pos 100,100:objsize 140,24 input passwd,280,24 a=map_ver/100 : str a,3 b=map_ver\100 : str b,2 pos 10,142:mes "Version : ver. "+a+"."+b pos 170,165 : objsize 60,24 button "OK",*InfoImpOK d=0 : objsend 0,$c5,16,d,1 d=0 : objsend 1,$c5,64,d,1 d=0 : objsend 2,$c5,8,d,1 stop *InfoImpOK onexit *Quit gsel 6,-1 : gsel 0 return ;====[ End Processing ]============================================ *Quit if modflag=0 : goto *EndVrf dialog "変更されています。セーブしますか?",2,"終了確認" if stat=7 : end gosub *Stage2Map dialog "sdt",17,"BlueCrystal StageFile" : if stat=0 : goto *EditMain a=0 : b=0 : sdtname_real=refstr : strlen b,sdtname_real repeat getstr sdtname,sdtname_real,a,'\' a+=strsize if a>=b : break loop title TITLESTR+" ["+sdtname+"]" gosub *MapSave *EndVrf dialog"終了してもよろしいですか?",2,"確認" if stat=7 : wait 50 : goto *EditMain end