;hspupdate.as data.dpmに基づいてexeファイルをアップデートする ;hsp 2.5〜 ;02.02.05 #include "anthspex.as" #define UPD_VER "1.0" #define TITL "HSP exe updater" #define MAX_PATH 260 sdim file,MAX_PATH sdim path,MAX_PATH sdim dpm,MAX_PATH ;ウィンドウ title TITL+" "+UPD_VER wid=320: heit=96 screen 0,wid,heit,,dispx-wid/2,dispy-heit/2: gsel 0,1 if paluse: palette 245,191,191,191: palfade color 191,191,191: boxf: color 0,0,0 font "MS ゴシック",16: pos 32,16: mes "お待ちください" ;対象ファイル file=cmdline: divide file,file,' ' if file=="" { dialog "exe",16,"HSP exe ファイル": if stat==0: end file=refstr } longpath file,file exist file: flen=strsize: if flen<0: dialog "not found "+file: end lastchar p,file,'\': strmid path,file,0,p ;dpmファイル dpm=path+"\\data.dpm" exist dpm: dlen=strsize: if dlen<0: dialog dpm+"がみつかりません": end sdim dbuf,dlen bload dpm,dbuf,dlen dpnt=0 wpeek src,dbuf,4 ;データブロック先頭のdpm先頭からのオフセット ;ファイル数が2047を超えるならlongpeekかも wpeek dnum,dbuf,8 ;ファイル数 sdim dfile,64,dnum dim base,dnum ;data.dpmの内容を記憶 dpnt+=16: s="" repeat dnum base.cnt=dpnt ;ファイル情報ブロック先頭 ;ファイル名をdfile.cntに取得(strmidでいいと思う) repeat: peek c,dbuf,dpnt+cnt: poke s,cnt,c: if c==0: break loop: dfile.cnt=s dpnt+=32 loop ;exe解析 sdim buf,flen+dlen bload file,buf,flen peek c,buf,0: peek d,buf,1 if (c!='M')|(d!='Z'): dialog file+"は実行ファイルではありません": end wpeek p,buf,60 peek c,buf,p: peek d,buf,p+1: wpeek e,buf,p+2 if (c!='P')|(d!='E')|(e!=0) { dialog file+"のファイルフォーマットには対応していません": end } wpeek nsec,buf,p+6: p+=248 repeat nsec longpeek c,buf,p+20 longpeek d,buf,p+16 pend=c+d p+=40 loop s="DPMX": bfind buf,s,4,pend: pnt=stat if pnt>=(flen-4): dialog "HSPで作成されたexeファイルではありません": end ;dpm部の書き換え wpeek dst,buf,pnt+4: dst+=pnt wpeek num,buf,pnt+8 pnt+=16: dpnt=pnt: do=0 repeat num longpeek so,buf,pnt+24 longpeek len,buf,pnt+28 if dpnt