elm2d_edit.hsp

sample\elm2d\elm2d_edit.hsp » Plain Format

;
;	HGIMG3 2D Elements Editor
;	onion software/onitama
;

;
;	詳しい使用方法は、doclibフォルダのelm2d_edit.txtを参照してください。
;

#include "hgimg3.as"
#include "mod_elm2d.as"
#packopt name "elm2d_edit"

#define global EDNAME "2D ElementEditor v1.0"


#module "hged"
#deffunc edinit

	edsx=640:edsy=480
	edbx=800:edby=600
	edwx=64:edwy=64
	ptmax=1:curpt=0
	ptuse=0
	sw_normal=1
	sw_loop=0
	sw_posini=3
	ed_fr=10:ed_scx=1.0:ed_scy=1.0:ed_rz=0:ed_efx=256
	ed_dist=40
	ptfr=ed_fr
	ptx=0:pty=0
	ptrz=0:ptefx=256:ptanm=0
	ptscx=1.0:ptscy=1.0
	return

#deffunc ptuse_update

	ptuse=0
	repeat ptmax
		if ptx(cnt)!=0 : ptuse|=PTUSE_POS
		if pty(cnt)!=0 : ptuse|=PTUSE_POS
		if ptrz(cnt)!=0 : ptuse|=PTUSE_ANG
		if ptscx(cnt)!=1.0 : ptuse|=PTUSE_SCALE
		if ptscy(cnt)!=1.0 : ptuse|=PTUSE_SCALE
		if ptefx(cnt)!=256 : ptuse|=PTUSE_EFX
		if ptanm(cnt)!=0 : ptuse|=PTUSE_ANM|PTUSE_POS
	loop
	return

#deffunc edload str fname

	sdim s1,$1000
	sdim s2,256
	elm2d_init fname
	elm2d_load
	ptmax=0+elm2d_getvar("ptmax")
	curpt=0+elm2d_getvar("curpt")
	edsx=0+elm2d_getvar("edsx")
	edsy=0+elm2d_getvar("edsy")
	edbx=0+elm2d_getvar("edbx")
	edby=0+elm2d_getvar("edby")
	edwx=0+elm2d_getvar("edwx")
	edwy=0+elm2d_getvar("edwy")
	ptuse=0+elm2d_getvar("ptuse")
	ed_loopid=0+elm2d_getvar("loopid")
	ed_dist=0+elm2d_getvar("dist")
	sw_loop=0+elm2d_getvar("loop")
	sw_normal=0+elm2d_getvar("normal")
	sw_posini=0+elm2d_getvar("posini")

	repeat ptmax
		elm2d_getdata s1
		i=0
		getstr s2,s1,i,',':i+=strsize
		ptfr(cnt)=0+s2
		getstr s2,s1,i,',':i+=strsize
		ptx(cnt)=0+s2
		getstr s2,s1,i,',':i+=strsize
		pty(cnt)=0+s2
		getstr s2,s1,i,',':i+=strsize
		ptrz(cnt)=0+s2
		getstr s2,s1,i,',':i+=strsize
		ptscx(cnt)=0.0+s2
		getstr s2,s1,i,',':i+=strsize
		ptscy(cnt)=0.0+s2
		getstr s2,s1,i,',':i+=strsize
		ptefx(cnt)=0+s2
		getstr s2,s1,i,',':i+=strsize
		ptanm(cnt)=0+s2
	loop
	return

#deffunc edsave str fname

	elm2d_init fname
	elm2d_seti "ptmax",ptmax
	elm2d_seti "curpt",curpt
	elm2d_seti "edsx",edsx
	elm2d_seti "edsy",edsy
	elm2d_seti "edbx",edbx
	elm2d_seti "edby",edby
	elm2d_seti "edwx",edwx
	elm2d_seti "edwy",edwy
	ptuse_update
	elm2d_seti "ptuse",ptuse
	elm2d_seti "loopid",ed_loopid
	elm2d_seti "dist",ed_dist
	elm2d_seti "loop",sw_loop
	elm2d_seti "normal",sw_normal
	elm2d_seti "posini",sw_posini

	repeat ptmax
	elm2d_data ""+ptfr(cnt)+","+ptx(cnt)+","+pty(cnt)+","+ptrz(cnt)+","+ptscx(cnt)+","+ptscy(cnt)+","+ptefx(cnt)+","+ptanm(cnt)
	loop
	elm2d_save
	return

#deffunc edpv_init

	screen 4,edsx,edsy,8+2:cls 4
	title "Preview"
	hgini
	return

#defcfunc rotadj int oldang, int newang

	told = oldang \ 1000
	loc_dist=abs( newang - told )
	if oldang<=newang {
		loc_cmp = abs( newang - 1000 - told )
		if loc_cmp<loc_dist : return newang-1000
	} else {
		loc_cmp = abs( newang + 1000 - told )
		if loc_cmp<loc_dist : return newang+1000
	}
	return newang

#deffunc edpv_exec

	gsel 4
	hgreset
	
	setuv 0,0,edwx-1,edwy-1
	addspr pchr,1
	tframe=0

	;	posイベント生成
	newevent ev1
	event_setpos ev1, ptx(0),pty(0),0
	i=1
	repeat ptmax-1
		event_pos ev1, ptfr(i), ptx(i), pty(i), 0, sw_posini&1
		event_wait ev1, ptfr(i)
		tframe+=ptfr(i)
		i++
	loop
	if sw_loop=1 : event_jump ev1,ed_loopid,0
	if sw_loop=2 : event_prmset ev1,PRMSET_FLAG,0

	;	angイベント生成
	newevent ev2
	event_setang ev2, 0, 0, PI_FIX * ptrz(0)
	i=1:prev=ptrz(0)
	repeat ptmax-1
		;newang = ptrz(i)
		newang = rotadj( prev, ptrz(i) )
		prev = newang
		event_ang ev2, ptfr(i), 0, 0, PI_FIX * newang
		event_wait ev2, ptfr(i)
		i++
	loop
	if sw_loop=1 : event_jump ev2,ed_loopid,0
	if sw_loop=2 : event_prmset ev2,PRMSET_FLAG,0

	;	scaleイベント生成
	newevent ev3
	event_setscale ev3, ptscx(0), ptscy(0), 1
	i=1
	repeat ptmax-1
		event_scale ev3, ptfr(i), ptscx(i), ptscy(i), 1
		event_wait ev3, ptfr(i)
		i++
	loop
	if sw_loop=1 : event_jump ev3,ed_loopid,0
	if sw_loop=2 : event_prmset ev3,PRMSET_FLAG,0

	;	efxイベント生成
	newevent ev4
	event_setefx ev4, ptefx(0),0,0
	i=1
	repeat ptmax-1
		event_efx ev4, ptfr(i), ptefx(i),0,0
		event_wait ev4, ptfr(i)
		i++
	loop
	if sw_loop=1 : event_jump ev4,ed_loopid,0
	if sw_loop=2 : event_prmset ev4,PRMSET_FLAG,0

	ptuse_update
	regobj mychr,pchr
	if ptuse&PTUSE_POS : setevent mychr,ev1
	if ptuse&PTUSE_ANG : setevent mychr,ev2
	if ptuse&PTUSE_SCALE : setevent mychr,ev3
	if ptuse&PTUSE_EFX : setevent mychr,ev4

	gsel 2
	settex edwx,edwy
	gsel 4,1
	frame=0
*edpv_1
	stick key
	if key&$3f0 : goto *edpv_2
	hgdraw
	hgsync 10
	if frame<tframe {
		frame++
		title "Frame:"+frame+"/"+tframe
	}
	goto *edpv_1
*edpv_2
	gsel 4,-1
	return


#deffunc edpv_make str fname

	;	スクリプト生成
	;
	sdim sbuf,$1000
	sdim evlist,$100
	myname = getpath( fname, 1+8+16 )
	ptuse_update
	tframe=0:i=1
	repeat ptmax-1
		tframe+=ptfr(i)
		i++
	loop

	sbuf=";generated from elm2d\n"
	sbuf+="#ifndef __"+myname+"__\n#define __"+myname+"__\n"
	sbuf+="#define global "+myname+"_frame "+tframe+"\n"
	;
	evlist=""
	if ptuse&PTUSE_POS : evlist="setevent %1,"+myname+"_ev1"
	if ptuse&PTUSE_ANG {
		if evlist!="" : evlist+=":"
		evlist+="setevent %1,"+myname+"_ev2"
	}
	if ptuse&PTUSE_SCALE {
		if evlist!="" : evlist+=":"
		evlist+="setevent %1,"+myname+"_ev3"
	}
	if ptuse&PTUSE_EFX {
		if evlist!="" : evlist+=":"
		evlist+="setevent %1,"+myname+"_ev4"
	}
	;
	dummy=evlist
	if evlist="" {
		dialog "データがありません。"+evlist
		return
	}
	;
	sbuf+="#define global "+myname+"_setevent(%1) "+evlist+"\n"
	sbuf+="\n#deffunc "+myname+"_init\n"

	;	posイベント生成
	if ptuse&PTUSE_POS {
		sbuf+="newevent "+myname+"_ev1\n"
		lastx=ptx(0):lasty=pty(0)
		if (sw_posini&2)=0 {
			sbuf+="event_setpos "+myname+"_ev1,"+lastx+","+lasty+",0\n"
		}
		i=1
		repeat ptmax-1
			x=ptx(i):y=pty(i)
			if (x!=lastx)|(y!=lasty) {
				if sw_posini&2 {
					sbuf+="event_pos "+myname+"_ev1,"+ptfr(i)+","+(x-lastx)+","+(y-lasty)+",0,"+sw_posini+"\n"
				} else {
					sbuf+="event_pos "+myname+"_ev1,"+ptfr(i)+","+x+","+y+",0,"+sw_posini+"\n"
				}
			}
			sbuf+="event_wait "+myname+"_ev1,"+ptfr(i)+"\n"
			lastx=x:lasty=y
			i++
		loop
		if sw_loop=1 : sbuf+="event_jump "+myname+"_ev1,"+ed_loopid+",0\n"
		if sw_loop=2 : sbuf+="event_prmset "+myname+"_ev1,PRMSET_FLAG,0\n"
	}
	;	angイベント生成
	if ptuse&PTUSE_ANG {
		sbuf+="newevent "+myname+"_ev2\n"
		lastx=ptrz(0)
		sbuf+="event_setang "+myname+"_ev2,0,0,"+(PI_FIX*lastx)+"\n"
		i=1
		repeat ptmax-1
			;x=ptrz(i)
			x = rotadj( lastx, ptrz(i) )
			if x!=lastx {
				sbuf+="event_ang "+myname+"_ev2,"+ptfr(i)+",0,0,"+(PI_FIX*x)+"\n"
			}
			sbuf+="event_wait "+myname+"_ev2,"+ptfr(i)+"\n"
			lastx=x
			i++
		loop
		if sw_loop=1 : sbuf+="event_jump "+myname+"_ev2,"+ed_loopid+",0\n"
		if sw_loop=2 : sbuf+="event_prmset "+myname+"_ev2,PRMSET_FLAG,0\n"
	}
	;	scaleイベント生成
	if ptuse&PTUSE_SCALE {
		sbuf+="newevent "+myname+"_ev3\n"
		lastx=ptscx(0):lasty=ptscy(0)
		sbuf+="event_setscale "+myname+"_ev3,"+lastx+","+lasty+",1\n"
		i=1
		repeat ptmax-1
			x=ptscx(i):y=ptscy(i)
			if (x!=lastx)|(y!=lasty) {
				sbuf+="event_scale "+myname+"_ev3,"+ptfr(i)+","+x+","+y+",1\n"
			}
			sbuf+="event_wait "+myname+"_ev3,"+ptfr(i)+"\n"
			lastx=x:lasty=y
			i++
		loop
		if sw_loop=1 : sbuf+="event_jump "+myname+"_ev3,"+ed_loopid+",0\n"
		if sw_loop=2 : sbuf+="event_prmset "+myname+"_ev3,PRMSET_FLAG,0\n"
	}
	;	efxイベント生成
	if ptuse&PTUSE_EFX {
		sbuf+="newevent "+myname+"_ev4\n"
		lastx=ptefx(0)
		sbuf+="event_setefx "+myname+"_ev4,"+lastx+",0,0\n"
		i=1
		repeat ptmax-1
			x=ptefx(i)
			if x!=lastx {
				sbuf+="event_efx "+myname+"_ev4,"+ptfr(i)+","+x+",0,0\n"
			}
			sbuf+="event_wait "+myname+"_ev4,"+ptfr(i)+"\n"
			lastx=x
			i++
		loop
		if sw_loop=1 : sbuf+="event_jump "+myname+"_ev4,"+ed_loopid+",0\n"
		if sw_loop=2 : sbuf+="event_prmset "+myname+"_ev4,PRMSET_FLAG,0\n"
	}

	sbuf+="return\n"
	sbuf+="\n#endif\n"

	notesel sbuf
	myname = getpath( fname, 1 )+".hsp"
	dialog "["+myname+"]を作成しました。"
	notesave myname
	return


#deffunc edinfo_update

	ptx(curpt) = ed_x
	pty(curpt) = ed_y
	ptfr(curpt) = ed_fr
	ptrz(curpt) = ed_rz
	ptscx(curpt) = ed_scx
	ptscy(curpt) = ed_scy
	ptefx(curpt) = ed_efx
	ptanm(curpt) = ed_anm
	return

#deffunc ptinsert

	ptmax++
	curpt++
	i=ptmax
	repeat
	ptx(i)=ptx(i-1)
	pty(i)=pty(i-1)
	ptfr(i)=ptfr(i-1)
	ptrz(i)=ptrz(i-1)
	ptscx(i)=ptscx(i-1)
	ptscy(i)=ptscy(i-1)
	ptefx(i)=ptefx(i-1)
	ptanm(i)=ptanm(i-1)
	i--:if i<=curpt : break
	loop
	edinfo_update
	return

#deffunc ptadd int xx, int yy

	x=xx-edcx:y=yy-edcy

	if sw_normal {
		orgx = ptx(ptmax-1)
		orgy = pty(ptmax-1)
		resang=atan( x-orgx, y-orgy )
		x = orgx + ( sin(resang) * ed_dist )
		y = orgy + ( cos(resang) * ed_dist )
	}

	ed_x=x : ed_y=y
	curpt=ptmax
	edinfo_update
	ptmax++
	return

#deffunc ptmove int id, int xx, int yy

	x=xx-edcx:y=yy-edcy
	ptx(id)=x
	pty(id)=y
	return

#deffunc ptrot int xx, int yy

	x=xx-edcx:y=yy-edcy
	resang=atan( y-pty(curpt), x-ptx(curpt) )
	ptrz(curpt)=int( resang * 159.15494309189533576888376337251 )
	return

#deffunc ptset int id

	curpt=id
	return

#deffunc ptinc
	i=curpt+1
	if i>=ptmax : i=curpt
	curpt=i
	return

#deffunc ptdec
	i=curpt-1
	if i<0 : i=0
	curpt=i
	return

#deffunc ptdel int id

	i=id:if i<0 : i=curpt
	if ptmax<=1 : return
	repeat
	if (i+1)>=ptmax : break
	ptx(i)=ptx(i+1)
	pty(i)=pty(i+1)
	ptfr(i)=ptfr(i+1)
	ptrz(i)=ptrz(i+1)
	ptscx(i)=ptscx(i+1)
	ptscy(i)=ptscy(i+1)
	ptefx(i)=ptefx(i+1)
	ptanm(i)=ptanm(i+1)
	i++
	loop
	ptmax--
	if curpt=ptmax : curpt--
	return

#deffunc pttrans int xx, int yy

	repeat ptmax
	ptx(cnt)+=xx
	pty(cnt)+=yy
	loop
	return

#deffunc ptcheck int xx,int yy

	x=xx-edcx:y=yy-edcy
	res=-1

	repeat ptmax

	if cnt=curpt {
		x1=ptx(cnt)-(edwx>>1)
		y1=pty(cnt)-(edwy>>1)
		x2=x1+edwx
		y2=y1+edwy
	} else {
		x1=ptx(cnt)-4
		y1=pty(cnt)-4
		x2=x1+8:y2=y1+8
	}
	if (x>=x1)&(x<x2)&(y>=y1)&(y<y2) : res=cnt : break
	loop
	return res

#deffunc ptpos int id

	x=edcx+ptx(id):y=edcy+pty(id)
	return

#deffunc eddraw

	gsel 0
	objprm obj_edx,ptx(curpt)
	objprm obj_edy,pty(curpt)
	objprm obj_edfr,ptfr(curpt)
	objprm obj_edrz,ptrz(curpt)
	objprm obj_edscx,ptscx(curpt)
	objprm obj_edscy,ptscy(curpt)
	objprm obj_edefx,ptefx(curpt)
	objprm obj_edanm,ptanm(curpt)

	gsel 1
	redraw 0
	x=(edbx-edsx)/2
	y=(edby-edsy)/2
	color 0,0,0:boxf x,y,x+edsx,y+edsy 
	color 64,64,64
	boxf 0,0,x,edby
	boxf x+edsx,0,edbx,edby
	boxf x,0,edbx,y
	boxf x,y+edsy,edbx,edby
	;
	boxf 0,edby/2,edbx,edby/2
	boxf edbx/2,0,edbx/2,edby
	;
	color 255,0,0
	ptpos 0:lastx=x:lasty=y
	repeat ptmax
	ptpos cnt
		boxf x-2,y-2,x+2,y+2
		line x,y,lastx,lasty
		lastx=x:lasty=y
	loop

	ptpos curpt:pos x,y:gmode 0,edwx,edwy
	grotate 2,0,0,PI_FIX * ptrz(curpt), ptscx(curpt)*edwx, ptscy(curpt)*edwy

	redraw 1
	return

#deffunc edreset

	edcx=edbx>>1:edcy=edby>>1
	buffer 2,edwx,edwy
	color 0,0,128:boxf 2,2,edwx-5,edwy-3
	i=edwx
	color 255,255,255:font "Arial",i,1
	pos (edwx>>3)+2,0:mes "A"
	;
	screen 1,edbx,edby,8
	title "View screen"
	eddraw
	return

#deffunc edinfo_init

	gsel 0
	x=200:y=8
	objsize 48,20
	pos x,y+24:mes "座標XY"
	pos x+50,y+20:input ed_x:obj_edx=stat
	pos x+105,y+20:input ed_y:obj_edy=stat
	pos x+160,y+24:mes "倍率XY"
	pos x+210,y+20:input ed_scx:obj_edscx=stat
	pos x+265,y+20:input ed_scy:obj_edscy=stat
	;
	pos x,y+58:mes "角度"
	pos x+50,y+54:input ed_rz:obj_edrz=stat
	pos x+160,y+58:mes "EFX"
	pos x+190,y+54:input ed_efx:obj_edefx=stat
	pos x,y+92:mes "フレーム"
	pos x+50,y+88:input ed_fr:obj_edfr=stat
	pos x+160,y+92:mes "アニメ"
	pos x+190,y+88:input ed_anm:obj_edanm=stat
	;
	objsize 100,20
	pos x,y+130
	combox sw_loop,100,"通常\n繰り返し\n最後に消滅"
	pos x,y+158
	chkbox "距離を補正する",sw_normal
	;
	objsize 128,20
	pos x+190,y+130
	combox sw_posini,200,"リニア移動(絶対)\nスプライン移動(絶対)\nリニア移動(相対)\nスプライン移動(相対)"
	objsize 48,20
	pos x+120,y+132:input ed_loopid
	pos x+120,y+158:input ed_dist
	;
	return

#deffunc edinfo

	gsel 0
	x=200:y=8
	redraw 0
	syscolor 15:boxf x,y,640,y+20
	color 0,0,0
	pos x,y:mes "#"+curpt+" ("+ptmax+")"
	redraw 1
	return

#global

	;	Starting point
	;
	onexit gosub *cmd_bye
*boot
	edinit
*boot2
	screen 0,640,200
	syscolor 15:boxf
	title EDNAME
	color 0,0,0:sysfont 17
	y=8
	pos 8,y+4:mes "編集サイズ":objsize 32,20
	pos 96,y:input edbx@hged:pos 136,y:input edby@hged
	y=32
	pos 8,y+4:mes "画面サイズ":objsize 32,20
	pos 96,y:input edsx@hged:pos 136,y:input edsy@hged
	y=56
	pos 8,y+4:mes "キャラクタサイズ":objsize 32,20
	pos 96,y:input edwx@hged:pos 136,y:input edwy@hged
	objsize 80,80
	pos 540,96:button "プレビュー...",*cmd_prev
	objsize 80,20
	pos 96,92
	button "変換...",*cmd_make
	pos 8,92
	button "ロード...",*cmd_load
	button "セーブ...",*cmd_save
	button "リフレッシュ",*main0
	button "新規...",*cmd_new
	button gosub "終了...",*cmd_bye
	pos 540,22:button "データ変更",*cmd_update
	pos 540,44:button "ポイント挿入",*cmd_ins
	pos 540,66:button "ポイント削除",*cmd_del
	;
	x=200:y=4
	objsize 20,20
	pos x+60,y
	button "前",*cmd_dec
	pos x+80,y
	button "次",*cmd_inc
	pos x+100,y
	button "終",*cmd_last
	;
	edinfo_init
	edpv_init
*main0
	edreset
	gsel 0,1
*main1
	edinfo
	eddraw
*main2
	await 15
	stick key,64

	if dlgmode : goto *main2
	;
	if key&$100 : goto *clk1
	if key&$200 : goto *clk2
	;
	if ginfo_act!=1 : goto *main2
	;
	if key&$20 : goto *cmd_prev
	if key&1 : ptdec : goto *main1
	if key&4 : ptinc : goto *main1
	goto *main2
*clk1
	if ginfo_act!=1 : goto *main2
	ptcheck mousex,mousey
	if stat>=0 : goto *clkmove
*clk1x
	await 15
	stick key,$3ff
	if key&$100 : goto *clk1x
	;
	ptadd mousex,mousey
	goto *main1
*clk2
	if ginfo_act!=1 : goto *main2
	ptcheck mousex,mousey
	if stat<0 : goto *main2
	ptset stat
	goto *main1
*clkmove
	target=stat
	if key&64 : goto *main4
	getkey a,16:if a : goto *main5
*main3
	edinfo
	eddraw
	await 15
	stick key,$3ff
	if (key&$100)=0 : goto *main1
	ptmove target,mousex,mousey
	goto *main3
*main4
	x=mousex:y=mousey
	edinfo
	eddraw
	await 15
	stick key,$3ff
	if (key&$100)=0 : goto *main1
	pttrans mousex-x, mousey-y
	goto *main4
*main5
	edinfo
	eddraw
	await 15
	stick key,$3ff
	if (key&$100)=0 : goto *main1
	ptrot mousex, mousey
	goto *main5

*cmd_inc
	curpt++
	if curpt>=ptmax : curpt = ptmax-1
	goto *main1
*cmd_dec
	curpt--
	if curpt<0 : curpt = 0
	goto *main1
*cmd_last
	curpt = ptmax-1
	goto *main1

*cmd_del
	ptdel -1
	goto *main1
*cmd_ins
	ptinsert
	goto *main1
*cmd_update
	edinfo_update
	goto *main1
*cmd_save
	dlgmode=1
	dialog "elm2d",17,"2D Element"
	dlgmode=0
	if stat=0 : goto *main1
	edsave refstr
	goto *main1
*cmd_load
	dlgmode=1
	dialog "elm2d",16,"2D Element"
	dlgmode=0
	if stat=0 : goto *main1
	edload refstr
	goto *boot2
*cmd_prev
	edpv_exec
	goto *main1
*cmd_make
	dlgmode=1
	dialog "hsp",17,"HSP Script"
	dlgmode=0
	if stat=0 : goto *main1
	edpv_make refstr
	goto *main1
*cmd_new
	dlgmode=1
	dialog "初期状態に戻していいですか?",2
	dlgmode=0
	if stat!=6 : goto *main1
	goto *boot
*cmd_bye
	dlgmode=1
	dialog "終了していいですか?",2
	dlgmode=0
	if stat!=6 : return
	end