単独実行モジュール

外部ファイルが必要な命令 (bload, noteload, picload, celload) を置換して
テキトーな処理に置き換えてしまうモジュール。ただしサイズは指定する必要あり。
それと noteload の対象バッファを取得するために黒魔術を使っている。notesel/noteunsel も置換した方がよかったかも。

外部ファイルが必要な命令 (bload, noteload, picload, celload) を置換して
テキトーな処理に置き換えてしまうモジュール。ただしサイズは指定する必要あり。
それと noteload の対象バッファを取得するために黒魔術を使っている。notesel/noteunsel も置換した方がよかったかも。

  • タグ:
  • タグはありません
// 単独実行モジュール

#ifndef IG_RUN_ALONE_AS
#define IG_RUN_ALONE_AS

#undef bload
#undef noteload
#undef picload
#undef celload

#define bload(%1 = "", %2, %3, %4 = 0) bload_impl %1, %2, %3, %4,  __HERE__@RunAlone
#define noteload(%1 = "", %2, %3 = "") noteload_impl %1, %2,  %3, __HERE__@RunAlone
#define picload(%1 = "", %2 = 0, %3 = -1, %4 = -1) picload_impl %1, %2, %3, %4,  __HERE__@RunAlone
#define celload(%1 = "", %2 = -1, %3 = 0) celload_impl %1, %2, %3, %4,  __HERE__@RunAlone

#module RunAlone

#define error(%1, %2 = _here) dialog %1 + "\n" + (%2), 1, "RunAlone" : assert
#define ctype RGB(%1,%2,%3) (((%1) & 0xFF) | ((%2) & 0xFF) << 8 | ((%3) & 0xFF) << 16)
#define ctype random_cref RGB(rnd(256), rnd(256), rnd(256))
#define __HERE__ (__FILE__ + " (#" + __LINE__ + ")")
dim ctx@exporter	// 警告抑制

// bload
// 前から順に 1, 2, 3, ..., 255, 1, ... と並んでいることにする
#deffunc bload_impl str fname, var buf, int size, int offset,  str _here
	if ( size < 0 ) { error "bload にサイズを指定してください。" }
	if ( vartype(buf) == 2 ) { memexpand buf, size }
	repeat size
		poke buf, cnt, (offset + cnt) \ 255 + 1
	loop
	_strsize@exporter = size
	return
	
// noteload
// 各行に (行番号 + 1) * "X" を書き込む (謎)。
// @ 対象バッファを操作するために exporter を用いている。
#deffunc noteload_impl str fname, int _size,  str dummy, str _here,  local size, local buf, local pval, local data, local n, local k
	if ( dummy != "" ) {
		data = dummy
		if ( _size > 0 ) { data = strmid(data, 0, _size) }
	} else {
		if ( size < 0 ) { error "noteload にサイズ上限を指定してください。" }
		sdim data, _size + 1
		repeat , 1
			if ( n + cnt + 2 > _size ) { break }
			for k, 0, cnt : poke data, n + k, 'X' : next
			wpoke data, n + cnt, 0x0A0D
			n += cnt + 2
		loop
	}
	_strsize@exporter = strlen(data)
	AssignToPVal@exporter ctx@exporter(202), varptr(data), ctx@exporter(203)
	return
	
#deffunc picload_impl str fname, int mode,  int cx, int cy, str _here
	if ( cx < 0 || cy < 0 ) { error "picload/celload には追加パラメータで画像サイズを与える必要があります。" }
	if ( mode == 0 || mode == 2 ) {
		width cx, cy : pos 0, 0
		if ( mode == 2 ) { gradf 0, 0, ginfo_winx, ginfo_winy, 0, 0, 0 }
	}
	gradf@hsp ginfo_cx, ginfo_cy, cx, cy, rnd(2), random_cref(), random_cref()
	return
	
#deffunc celload_impl str fname, int _id, int mode,  int cx, int cy, str _here,  local id, local id_bak
	id_bak = ginfo_sel
	if ( _id < 0 ) {
		buffer ginfo_newid, cx, cy, mode
		id = ginfo_sel
	} else {
		id = _id
		gsel id
	}
	picload_impl fname, 1,  cx, cy, _here
	gsel id_bak
	return id
	
#global

#module exporter
// small

#deffunc local _init
	mref ctx, 68
	dupptr exinfo, ctx(219), 49 * 4
	dupptr _strsize, exinfo(8), 4
	return
	
#deffunc AssignToPVal@exporter int ppval, int ptr, int aptr,  local pval, local hvp, local prm
	dupptr pval, ppval, 48
	prm = pval(0) & 0xFFFF
	dupptr hvp, callfunc( prm, exinfo(25), 1 ), 35 * 4
	pval(10) = aptr
	prm = ppval
	prm(1) = callfunc( prm, hvp(7), 1 )
	prm(2) = ptr
	return callfunc( prm, hvp(18), 3 )
#global

_init@exporter
randomize 256

#endif