>HSP3.7に向けたβテストについてのお願い(3.7β9)
>の方が相応しい場だと思います。
確かにそうなのですが・・
gameplay-encoderにメスを入れるのは相当な覚悟が必要かと思いますので
余り触れたくはなかったのです。
かといって、スクリプトを貼らなければ何も進まないかとも思います
新たにスレッドを立てるほどのことではないと思いますので
なにかいい方法があれば別スレッドを誰か立ててください
なのでここに貼っておきます。
#include "hsp3utf.as"
; GPBファイルのReferences部分のテキスト化
; GPBファイルのアニメーション部分のテキスト化
#module
#defcfunc tofloat double p1
temp = p1
return lpeek(temp)>>29&7|(p1<0)<<31|lpeek(temp,4)-(p1!0)*0x38000000<<3
#defcfunc todouble int p1
temp = 0.0
lpoke temp, 4, (p1 & 0x80000000) | (((p1 & 0x7fffffff) >> 3) + ((p1 & 0x7fffffff) ! 0) * 0x38000000)
lpoke temp, 0, p1 << 29
return temp
#global
screen 0,800,480
dialog "gpb",16,"gpbファイル"
if stat=0 : goto *error
exist refstr
input_file_size=strsize
text_file_size=0
sdim input_file,strsize
sdim output_file,strsize
sdim ref_file,65536*10
sdim ref_file1,65536*10
sdim ref_file2,65536*10
sdim ref_file3,65536*10
sdim str_buf,256
sdim str_buf_mo,256
sdim int_buf,8
sdim hex_buf,8
sdim anim_name,50,1000
dim anim_name_len,1000
sdim id_ref,50,1000
dim id_len_ref,1000
dim type_ref,1000
dim offset_ref,1000
dim serial_ref,1000
dim file_start,8,1000
; 1 1 2 2 3 3 4 4 5
; 0 5 0 5 0 5 0 5 0 5 0
str_buf=" verline serial type offset idframes"
bload refstr,input_file
;Header Identifier
;
;Reference 読み込み
input_file_adr=1 : ref_file_adr=0
lpoke ref_file,ref_file_adr,lpeek(input_file,input_file_adr)
ref_file_adr+=3
mes_put1 ' ' ; 計4バイト
; Version 書き込み
mes_put4 9 ;" ver" 書き込み
mes_put1 '0'+peek(input_file,0x9)
mes_put1 '.'
mes_put1 '0'+peek(input_file,0xa)
mes_put1 ' ' ; 計8バイト
;line数 書き込み
input_file_adr=0x0b ; offset 0x0b References
index_val=lpeek(input_file,input_file_adr) : input_file_adr+=4; index_val=line数
str_buf=strf("%4d",index_val)
mes_put4 0
mes_put1 ' '
mes_put4 13;"line" 書き込み
mes_put1 ' '
mes_put2 0x0a0d ;計12バイト
repeat 6;"serial type offset id" 書き込み
mes_put4 cnt*4+21
loop
mes_put2 0x0a0d;計26バイト 合計50バイト
;index 読み込み
serial_num=0
repeat index_val
index=cnt
;serial_num
serial_ref(index)=serial_num : serial_num+
;id string
str_len=lpeek(input_file,input_file_adr) : input_file_adr+=4
if str_len>256 : str_len=256
ref_adr=0
repeat str_len
poke id_ref(index),ref_adr,peek(input_file,input_file_adr) :ref_adr+ : input_file_adr++
loop
id_len_ref(index)=ref_adr
;type
lpoke int_val,0,lpeek(input_file,input_file_adr) : input_file_adr+=4
type_ref(index)=int_val
;offset アドレス
lpoke hex_val,0,lpeek(input_file,input_file_adr) : input_file_adr+=4
offset_ref(index)=hex_val
;if int_val=34 : test_val=hex_val : test_val=0xce00
if int_val=3 : input_file_adr_bak=hex_val ; アニメーション id
loop
;オフセット ソート
;何故かidがオフセット順に並んでいないのでソートする
repeat index_val,1
c=cnt
repeat index_val-c
index=cnt
if offset_ref(index)>offset_ref(index+1) {
b=offset_ref(index) : offset_ref(index)=offset_ref(index+1) : offset_ref(index+1)=b
b=serial_ref(index) : serial_ref(index)=serial_ref(index+1) : serial_ref(index+1)=b
b=type_ref(index) : type_ref(index)=type_ref(index+1) : type_ref(index+1)=b
}
loop
loop
;Reference 文字数計算
id_len_val=0
repeat index_val
id_len_val=id_len_val+id_len_ref(cnt)
loop
id_len_val=id_len_val+index_val*24+50
;Reference
;GPBファイル mesbox References 書き込み
repeat index_val
index=cnt
;serial_num
str_buf=strf("%4d",serial_ref(index))
mes_put1 ' '
mes_put4 0
mes_put1 ' ';計6バイト
;type
str_buf=strf("%4d",type_ref(index))
mes_put1 ' '
mes_put4 0
mes_put1 ' ';計6バイト
;offset アドレス
str_buf=strf("%8x",offset_ref(index))
mes_put4 0
mes_put4 4
mes_put1 ' '
mes_put1 ' ';計10バイト
;id string
repeat 50
b=peek(id_ref(serial_ref(index)),cnt)
if b=0 : break
poke ref_file,ref_file_adr,b
ref_file_adr+
loop
mes_put2 0x0a0d;改行 idバイト数+2バイト 計24バイト + idバイト数
loop
repeat ref_file_adr ; mesbox用 コピー
poke ref_file1,cnt,peek(ref_file,cnt)
loop
font "MS ゴシック",16
objmode 2
pos 10,0 : mes "入力ファイル "+refstr
pos 10,20 : mes " GPBファイル References部 "
pos 10,40 : objsize 340,200 : mesbox ref_file1,,,4
if input_file_adr_bak=0 : stop;アニメーション部 なければストップ"
;アニメーション部 ボーン名 初期設定
id_len_val=0
repeat 2
loop_count=cnt
ref_file_adr=0
input_file_adr=input_file_adr_bak
sys_flg1 = lpeek(input_file,input_file_adr)
input_file_adr+=4
repeat
index=cnt
file_start(0,index)=input_file_adr
anim_name_count=0
repeat 2
if cnt=1 { sys_flg1--
if sys_flg1<0 : break
if loop_count=0 : id_len_val+=2
if loop_count=1 : mes_put2 0x2020:lpoke anim_name(index),anim_name_count,0x2020:anim_name_count+=2
input_file_adr+=4
}
str_len=lpeek(input_file,input_file_adr) : input_file_adr+=4
if str_len>100 : str_len=100
repeat str_len
if loop_count=0 : id_len_val++
if loop_count=1 : mes_put1 peek(input_file,input_file_adr)
poke anim_name(index),anim_name_count,peek(input_file,input_file_adr)
input_file_adr++
anim_name_count++
loop
loop
anim_name_len(index)=anim_name_count
input_file_adr+=4
if loop_count=0 : id_len_val+=2
if loop_count=1 : mes_put2 0x0a0d
file_start(1,index)=input_file_adr;キーフレームタイム部先頭アドレス
input_file_adr+=lpeek(input_file,input_file_adr)*4 : input_file_adr+=4
file_start(2,index)=input_file_adr;キーフレーム vec 部先頭アドレス キーフレーム数×7×4 float
input_file_adr+=lpeek(input_file,input_file_adr)*4 : input_file_adr+=4
file_start(3,index)=input_file_adr;最終部先頭アドレス
input_file_adr+=16
if input_file_size<=input_file_adr :file_start(0,index+1)=input_file_adr : break
loop
if loop_count=0 : title " "+id_len_val+" "+lpeek(input_file,file_start(1,0))
loop
test_a=index+1
repeat ref_file_adr ; mesbox用 コピー
poke ref_file2,cnt,peek(ref_file,cnt)
loop
pos 380,20 : mes "GPBファイル アニメーション部 ボーン名"
pos 380,40 : objsize 240,200 : mesbox ref_file2,,,4
; アニメーション モーションデータテキスト書き出し
; 1 1 2 2 3 3 4 4 5 6 7 8 9 10
; 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0
str_buf_mo="keyTimes uint[] (milliseconds) valuesfloat[] tangents_in float[] tangents_out float[] interpolation uint[]"
ref_file_adr=0
id_len_val=0
test=test_a
repeat 2
loop_count=cnt
repeat 105
if loop_count=1 : mes_put1 peek(str_buf_mo,cnt)
loop
if loop_count=1 : mes_put2 0x0a0d
repeat test
index=cnt
str_len=anim_name_len(index)
input_file_adr1=file_start(1,index)
str_len1=lpeek(input_file,input_file_adr1):input_file_adr1+=4
input_file_adr2=file_start(2,index)
str_len2=lpeek(input_file,input_file_adr2):input_file_adr2+=4
len_val=str_len2/str_len1
repeat str_len
if loop_count=0 : id_len_val++
if loop_count=1 : mes_put1 peek(anim_name(index),cnt)
loop
if loop_count=0 : id_len_val+=2
if loop_count=1 : mes_put2 0x0a0d
repeat str_len2/len_val
if loop_count=0 : id_len_val+=10
if loop_count=1 {
str_buf=strf("%8u",lpeek(input_file,input_file_adr1)):input_file_adr1+=4
mes_put4 0 : mes_put4 4 : mes_put2 0x2020
}
repeat len_val-1
if loop_count=0 : id_len_val+=10
if loop_count=1 {
str_buf=strf("%5.10f",todouble(lpeek(input_file,input_file_adr2))):input_file_adr2+=4
mes_put4 0 : mes_put4 4 : mes_put2 0x2020
}
loop
repeat 1
if loop_count=0 : id_len_val+=10
if loop_count=1 {
str_buf=strf("%5.10f",todouble(lpeek(input_file,input_file_adr2))):input_file_adr2+=4
mes_put4 0 : mes_put4 4 : mes_put2 0x2020
}
loop
if loop_count=0 : id_len_val+=2
if loop_count=1 : mes_put2 0x0a0d
loop
if loop_count=0 : id_len_val+=2
if loop_count=1 : mes_put2 0x0a0d
if loop_count=1 : title " "+id_len_val_m+" "+ref_file_adr : await 10
loop
if loop_count=0 {
id_len_val_m=id_len_val
title " "+id_len_val
sdim ref_file,id_len_val+10000
pos 100,300 : objsize 200,100
button goto "変換",*next_flg
stop
*next_flg
}
loop
clrobj 2
pos 400,300
objsize 200,100
button goto "記録",*save_file
stop
*save_file
dialog "txt",17,"txtファイル"
if stat=0 : goto *error
bsave refstr,ref_file,ref_file_adr
*error
end
#deffunc mes_put1 int a
poke ref_file,ref_file_adr,a : ref_file_adr+
return
#deffunc mes_put2 int a
wpoke ref_file,ref_file_adr,a : ref_file_adr+=2
return
#deffunc mes_put3 int a
lpoke ref_file,ref_file_adr,lpeek(str_buf_mo,a) : ref_file_adr+=4
return
#deffunc mes_put4 int a
lpoke ref_file,ref_file_adr,lpeek(str_buf,a) : ref_file_adr+=4
return