unit shade; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, TGameB, MPlayer, Display; type TForm1 = class(TForm) GW1: TGW; MediaPlayer1: TMediaPlayer; ChangeDisplay1: TChangeDisplay; procedure GW1_0_Create(Sender: TObject); procedure FormCreate(Sender: TObject); procedure GW1_4_MainJob(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private 宣言 } public { Public 宣言 } procedure FilterLoad(px,py:integer); procedure Search(px,py,mv,di:integer; mway:String); end; var Form1: TForm1; ExePath: String; x,y,pose,pd,rop,shadeflg,melb: integer; mvrec: Packed array[0..255,0..255] of String; implementation {$R *.DFM} procedure TForm1.GW1_0_Create(Sender: TObject); var i,j:integer; begin for i:=0 to 255 do for j:=0 to 255 do begin GW1.BGf[1,i,j]:=11; mvrec[i,j]:=''; end; // プレイヤーキャラ初期設定(16ピクセル単位) x:=14; y:=14; pose:=0; pd:=5; // マップデータの読み込み GW1.BG_ChipDataRead(0,'field.dat'); FilterLoad((x div 2),(y div 2)); // 音楽鳴らします MediaPlayer1.FileName:=ExePath+'grass.mid'; MediaPlayer1.Open; MediaPlayer1.Play; end; procedure TForm1.FormCreate(Sender: TObject); begin ExePath:=ExtractFilePath(Application.ExeName); Left:=0; Top:=0; rop:=0; shadeflg:=0; melb:=0; ChangeDisPlay1.Change(640,480,0); end; procedure TForm1.GW1_4_MainJob(Sender: TObject); var dx,dy,tix:integer; begin // リターンを押すとシェードの設定 if (GW1.boolTRGButtonRight) then begin rop:=1; FilterLoad((x div 2),(y div 2)); end; // 主人公キャラの移動(4方向のみ) dx:=0; dy:=0; if GW1.iVec4=2 then begin dy:=1; pd:=5 end else if GW1.iVec4=4 then begin dx:=-1; pd:=7 end else if GW1.iVec4=6 then begin dx:=1; pd:=3 end else if GW1.ivec4=8 then begin dy:=-1; pd:=1 end; if GW1.BGf[0,((x+dx) div 2),((y+dy) div 2)]>7 then begin x:=x+dx; y:=y+dy; rop:=0; FilterLoad((x div 2),(y div 2)); end; // 主人公キャラの表示 pose:=pose+1; tix:=(pose div 3) mod 2; GW1.Put('plh',pd+tix,300-2,200-32-14); GW1.Put('plt',pd+tix,300-2,200-14); GW1.FloaterBGput(ExePath+'mapchip',0,x*16-32*9,y*16-32*6,1); GW1.FloaterBGput(ExePath+'filter7',1,x*16-32*9,y*16-32*6,2); end; procedure Tform1.FilterLoad(px,py:integer); var i,j:integer; a1,a2,a3,a4:integer; begin // フィルタ初期化 for i:=0 to 100 do for j:=0 to 100 do begin GW1.BGf[1,i,j]:=11; mvrec[i,j]:=''; end; if pd=5 then begin a1:=1; a2:=4; a3:=10; a4:=4; end else if pd=1 then begin a1:=10; a2:=4; a3:=1; a4:=4; end else if pd=3 then begin a1:=4; a2:=10; a3:=4; a4:=1; end else begin a1:=4; a2:=1; a3:=4; a4:=10; end; if rop=1 then begin if shadeflg=0 then shadeflg:=1 else shadeflg:=0; end; Search(px,py-1,a1,1,'1'); // 上方向探索 Search(px+1,py,a2,2,'2'); // 右方向探索 Search(px,py+1,a3,3,'3'); // 下方向探索 Search(px-1,py,a4,4,'4'); // 左方向探索 GW1.BGf[1,px,py]:=0; end; procedure TForm1.Search(px,py,mv,di:integer; mway:String); var down,num,ml,dx,dy:integer; begin ml:=Length(mway); if (mvrec[px,py]<>'') and (ml>Length(mvrec[px,py])) then exit; if shadeflg=0 then melb:=0 else melb:=ml; down:=0; num:=GW1.BGf[0,px,py]; if (num<=7) then down:=6 else if (num<=23) then down:=1 else if (num<=31) then down:=3; if mv-down<0 then begin GW1.BGf[1,px,py]:=melb; exit; end; GW1.BGf[1,px,py]:=melb; mvrec[px,py]:=mway; if (di<>3) and (copy(mway,ml-1,2)<>'34') then Search(px,py-1,mv-down,1,mway+'1'); if (di<>4) and (copy(mway,ml-1,2)<>'41') then Search(px+1,py,mv-down,2,mway+'2'); if (di<>1) and (copy(mway,ml-1,2)<>'12') then Search(px,py+1,mv-down,3,mway+'3'); if (di<>2) and (copy(mway,ml-1,2)<>'23') then Search(px-1,py,mv-down,4,mway+'4'); end; procedure TForm1.FormDestroy(Sender: TObject); begin ChangeDisplay1.Restoration; end; end.