モジュール変数sample:modvar_sample_03_TEST.hsp

repeat 9
newmod obj_common,many_something
loop
repeat 9
tmp_i = cnt
set_mem_ID_many_somet obj_common.tmp_i, 50000 + (tmp_i + 1) * 100
set_mem_name_many_somet obj_common.tmp_i, "" + str(50000 + (tmp_i + 1) * 100) + "th many somet"
set_mem_long_name_many_somet obj_common.tmp_i, "chara common obj"
loop
// 8(9)はexchange用
repeat 9
set_mem_ID_somet obj_common.cnt, 1, 50001 + (cnt + 1) * 100
set_mem_name_somet obj_common.cnt, 1, "" + str(50001 + (cnt + 1) * 100) + "th one somet"
set_mem_long_name_somet obj_common.cnt,1, "character have money"
loop
repeat 9
set_mem_ID_somet obj_common.cnt, 2, 50002 + (cnt + 1) * 100
set_mem_name_somet obj_common.cnt, 2, "" + str(50002 + (cnt + 1) * 100) + "th one somet"
set_mem_long_name_somet obj_common.cnt, 2, "character num battle"
loop
repeat 9
set_mem_ID_somet obj_common.cnt, 3, 50003 + (cnt + 1) * 100
set_mem_name_somet obj_common.cnt, 3, "" + str(50003 + (cnt + 1) * 100) + "th one somet"
set_mem_long_name_somet obj_common.cnt, 3, "character num win"
loop
repeat 9
set_mem_ID_somet obj_common.cnt, 4, 50004 + (cnt + 1) * 100
set_mem_name_somet obj_common.cnt, 4, "" + str(50004 + (cnt + 1) * 100) + "th one somet"
set_mem_long_name_somet obj_common.cnt, 4, "character num lose"
loop
repeat 9
set_mem_ID_somet obj_common.cnt, 5, 50005 + (cnt + 1) * 100
set_mem_name_somet obj_common.cnt, 5, "" + str(50005 + (cnt + 1) * 100) + "th one somet"
set_mem_long_name_somet obj_common.cnt, 5, "character num death"
loop
repeat 9
set_mem_ID_somet obj_common.cnt, 6, 50006 + (cnt + 1) * 100
set_mem_name_somet obj_common.cnt, 6, "" + str(50006 + (cnt + 1) * 100) + "th one somet"
set_mem_long_name_somet obj_common.cnt, 6, "character MAX HP"
loop
repeat 9
set_mem_ID_somet obj_common.cnt, 7, 50007 + (cnt + 1) * 100
set_mem_name_somet obj_common.cnt, 7, "" + str(50007 + (cnt + 1) * 100) + "th one somet"
set_mem_long_name_somet obj_common.cnt, 7, "character cur HP"
loop
// 初期値代入:ほとんど-1代入w
tmp_n = -1
repeat 8,1
tmp_i = cnt
repeat 9
set_mem_value_somet obj_common.cnt, tmp_i, tmp_n
loop
loop
repeat 9
newmod obj_common_yobi,many_something
loop
repeat 9
tmp_i = cnt
set_mem_ID_many_somet obj_common_yobi.tmp_i, 60000 + (tmp_i + 1) * 100
set_mem_name_many_somet obj_common_yobi.tmp_i, "" + str(60000 + (tmp_i + 1) * 100) + "th many somet"
set_mem_long_name_many_somet obj_common_yobi.tmp_i, "chara common obj yobi"
loop
repeat 8,1
tmp_i=cnt
repeat 9
set_mem_ID_somet obj_common_yobi.cnt, tmp_i, 60000 + tmp_i + (cnt + 1) * 100
set_mem_name_somet obj_common_yobi.cnt, tmp_i, "" + str(60000 + tmp_i + (cnt + 1) * 100) + "th one somet"
loop
loop
repeat 9
set_mem_long_name_somet obj_common_yobi.cnt, 1, "character 状態"
// -1 キャラが存在しない 1 通常 2 戦闘不能
set_mem_long_name_somet obj_common_yobi.cnt, 2, "character 予備 2nd"
set_mem_long_name_somet obj_common_yobi.cnt, 3, "character 予備 3rd"
set_mem_long_name_somet obj_common_yobi.cnt, 4, "character 予備 4th"
set_mem_long_name_somet obj_common_yobi.cnt, 5, "character 予備 5th"
set_mem_long_name_somet obj_common_yobi.cnt, 6, "character 予備 6th"
set_mem_long_name_somet obj_common_yobi.cnt, 7, "character 予備 7th"
set_mem_long_name_somet obj_common_yobi.cnt, 8, "character 予備 8th"
loop
// 初期値代入:ほとんど-1代入w
tmp_n = -1
repeat 8,1
tmp_i = cnt
repeat 9
set_mem_value_somet obj_common_yobi.cnt, tmp_i, tmp_n
loop
loop
#if 0
repeat 9
logmes "-- common class --"
logmes "ID   : " + get_mem_ID_many_somet(obj_common.cnt)
logmes "name : " + get_mem_name_many_somet(obj_common.cnt)
logmes "lname: " + get_mem_long_name_many_somet(obj_common.cnt)
logmes "-- sub mod --"
	tmp_i = cnt
	repeat MAX_OBJ@many_something
	tmp_ii=get_mem_ID_somet(obj_common.tmp_i, cnt)
	if tmp_ii != -1{
		logmes "- ID("+cnt+") : " + get_mem_ID_somet(obj_common.tmp_i, cnt)
		logmes "- name : " + get_mem_name_somet(obj_common.tmp_i, cnt)
		logmes "- lname: " + get_mem_long_name_somet(obj_common.tmp_i, cnt)
		logmes "- value: " + get_mem_value_somet(obj_common.tmp_i, cnt)
		logmes "------"
	}
	loop
loop
#endif
#if 0
repeat 9
logmes "-- common class --"
logmes "ID   : " + get_mem_ID_many_somet(obj_common_yobi.cnt)
logmes "name : " + get_mem_name_many_somet(obj_common_yobi.cnt)
logmes "lname: " + get_mem_long_name_many_somet(obj_common_yobi.cnt)
logmes "-- sub mod --"
	tmp_i = cnt
	repeat MAX_OBJ@many_something
	tmp_ii=get_mem_ID_somet(obj_common_yobi.tmp_i, cnt)
	if tmp_ii != -1{
		logmes "- ID("+cnt+") : " + get_mem_ID_somet(obj_common_yobi.tmp_i, cnt)
		logmes "- name : " + get_mem_name_somet(obj_common_yobi.tmp_i, cnt)
		logmes "- lname: " + get_mem_long_name_somet(obj_common_yobi.tmp_i, cnt)
		logmes "- value: " + get_mem_value_somet(obj_common_yobi.tmp_i, cnt)
		logmes "------"
	}
	loop
loop
#endif
/*
// global variable
characters_turn			= 1
characters_sum_battle	= 0
characters_sum_win		= 0
characters_sum_lose		= 0
characters_sum_death	= 0
characters_sum_LVUP		= 0
characters_sum_pos_get	= 0
characters_sum_pos_use	= 0
*/
repeat 40
newmod obj_class,many_something
loop
// 余り8(9)はexchange用
repeat 40
tmp_i  = cnt \ 10
tmp_ii =cnt / 10 + 1
set_mem_ID_many_somet obj_class.cnt, tmp_ii * 10000 + (tmp_i + 1) * 100
set_mem_name_many_somet obj_class.cnt, "" + str(tmp_ii * 10000 + (tmp_i + 1) * 100) + "th many somet"
set_mem_long_name_many_somet obj_class.cnt, "each character"
loop
// 命令 半角スペース オブジェクト ドット オブジェクトのインデックス カンマ インデックス カンマ バリュー
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
set_mem_ID_somet obj_class.cnt,1, tmp_ii * 10000 + (tmp_i + 1) * 100 + 1
set_mem_name_somet obj_class.cnt,1, "" + str(tmp_ii * 10000 + (tmp_i + 1) * 100 + 1) + "th many somet"
set_mem_long_name_somet obj_class.cnt,1,"class type"
loop
repeat 10
tmp_str = "FIRE"
set_mem_value_somet obj_class.cnt, 1, tmp_str
loop
repeat 10
tmp_str = "WIND"
tmp_index = 10 + cnt
set_mem_value_somet obj_class.tmp_index, 1, tmp_str
loop
repeat 10
tmp_str = "THUNDER"
tmp_index = 20 + cnt
set_mem_value_somet obj_class.tmp_index, 1, tmp_str
loop
repeat 10
tmp_str = "LIGHT"
tmp_index = 30 + cnt
set_mem_value_somet obj_class.tmp_index, 1, tmp_str
loop
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
set_mem_ID_somet obj_class.cnt,2, tmp_ii * 10000 + (tmp_i + 1) * 100 + 2
set_mem_name_somet obj_class.cnt,2, "" + str(tmp_ii * 10000 + (tmp_i + 1) * 100 + 2) + "th many somet"
set_mem_long_name_somet obj_class.cnt, 2, "each class no"
tmp_int = cnt \ 10 + 1
set_mem_value_somet obj_class.cnt, 2, tmp_int
loop
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
set_mem_ID_somet obj_class.cnt, 3, tmp_ii * 10000 + (tmp_i + 1) * 100 + 3
set_mem_name_somet obj_class.cnt, 3, "" + str(tmp_ii * 10000 + (tmp_i + 1) * 100 + 3) + "th many somet"
set_mem_long_name_somet obj_class.cnt, 3, "each class battle"
tmp_int = 256.0
set_mem_value_somet obj_class.cnt, 3, tmp_int
loop
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
set_mem_ID_somet obj_class.cnt,4, tmp_ii * 10000 + (tmp_i + 1) * 100 + 4
set_mem_name_somet obj_class.cnt,4, "" + str(tmp_ii * 10000 + (tmp_i + 1) * 100 + 4) + "th many somet"
set_mem_long_name_somet obj_class.cnt, 4, "each class level"
tmp_int = 123
set_mem_value_somet obj_class.cnt, 4, tmp_int
loop
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
set_mem_ID_somet obj_class.cnt, 5, tmp_ii * 10000 + (tmp_i + 1) * 100 + 5
set_mem_name_somet obj_class.cnt, 5, "" + str(tmp_ii * 10000 + (tmp_i + 1) * 100 + 5) + "th many somet"
set_mem_long_name_somet obj_class.cnt, 5, "each class exp"
tmp_int = 234
set_mem_value_somet obj_class.cnt, 5, tmp_int
loop
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
set_mem_ID_somet obj_class.cnt, 6, tmp_ii * 10000 + (tmp_i + 1) * 100 + 6
set_mem_name_somet obj_class.cnt, 6, "" + str(tmp_ii * 10000 + (tmp_i + 1) * 100 + 6) + "th many somet"
set_mem_long_name_somet obj_class.cnt, 6, "each cost training"
tmp_int = cnt*100
set_mem_value_somet obj_class.cnt, 6, tmp_int
loop
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
set_mem_ID_somet obj_class.cnt, 7, tmp_ii * 10000 + (tmp_i + 1) * 100 + 7
set_mem_name_somet obj_class.cnt, 7, "" + str(tmp_ii * 10000 + (tmp_i + 1) * 100 + 7) + "th many somet"
set_mem_long_name_somet obj_class.cnt, 7, "each HP"
tmp_int = cnt*100
set_mem_value_somet obj_class.cnt, 7, tmp_int
loop
// 命令 ドット オブジェクトのインデックス 半角スペース オブジェクト カンマ インデックス カンマ バリュー
// 初期値代入:ほとんど-1代入w
tmp_n = -1
repeat 5,3
tmp_i = cnt
repeat 40
set_mem_value_somet obj_class.cnt, tmp_i, tmp_n
loop
loop
#if 0
repeat 40
	logmes "-- each character --"
	logmes "ID(" + cnt + ") : " + get_mem_ID_many_somet(obj_class.cnt)
	logmes "name : " + get_mem_name_many_somet(obj_class.cnt)
	logmes "lname: " + get_mem_long_name_many_somet(obj_class.cnt)
	logmes "-- sub mod --"
	tmp_i = cnt
	repeat MAX_OBJ@many_something
	tmp_ii=get_mem_ID_somet(obj_class.tmp_i, cnt)
	if tmp_ii != -1{
		logmes "- ID("+cnt+") : " + get_mem_ID_somet(obj_class.tmp_i, cnt)
		logmes "- name : " + get_mem_name_somet(obj_class.tmp_i, cnt)
		logmes "- lname: " + get_mem_long_name_somet(obj_class.tmp_i, cnt)
		logmes "- value: " + get_mem_value_somet(obj_class.tmp_i, cnt)
		logmes "------"
	}
	loop
loop
#endif
repeat 40
newmod obj_class_yobi,many_something
loop
// 余り8(9)はexchange用
repeat 40
tmp_i  = cnt \ 10
tmp_ii =cnt / 10 + 1
set_mem_ID_many_somet obj_class_yobi.cnt, 100000 + tmp_ii * 10000 + (tmp_i + 1) * 100
set_mem_name_many_somet obj_class_yobi.cnt, "" + str(100000 + tmp_ii * 10000 + (tmp_i + 1) * 100) + "th many somet"
set_mem_long_name_many_somet obj_class_yobi.cnt, "each character yobi"
loop
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
set_mem_ID_somet obj_class_yobi.cnt,1, 100000 + tmp_ii * 10000 + (tmp_i + 1) * 100 + 1
set_mem_name_somet obj_class_yobi.cnt,1, "" + str(100000 + tmp_ii * 10000 + (tmp_i + 1) * 100 + 1) + "th many somet"
set_mem_long_name_somet obj_class_yobi.cnt,1,"class type"
loop
repeat 10
tmp_str = "FIRE"
set_mem_value_somet obj_class_yobi.cnt, 1, tmp_str
loop
repeat 10
tmp_str = "WIND"
tmp_index = 10 + cnt
set_mem_value_somet obj_class_yobi.tmp_index, 1, tmp_str
loop
repeat 10
tmp_str = "THUNDER"
tmp_index = 20 + cnt
set_mem_value_somet obj_class_yobi.tmp_index, 1, tmp_str
loop
repeat 10
tmp_str = "LIGHT"
tmp_index = 30 + cnt
set_mem_value_somet obj_class_yobi.tmp_index, 1, tmp_str
loop
repeat 40
tmp_i  = cnt \ 10
tmp_ii = cnt / 10 + 1
tmp_j  = cnt
repeat 8,2
set_mem_ID_somet obj_class_yobi.tmp_j,cnt, 100000 + tmp_ii * 10000 + (tmp_i + 1) * 100 + cnt
set_mem_name_somet obj_class_yobi.tmp_j,cnt, "" + str(100000 + tmp_ii * 10000 + (tmp_i + 1) * 100 + cnt) + "th many somet"
tmp_int = tmp_j \ 10 + 1
set_mem_value_somet obj_class_yobi.tmp_j, cnt, tmp_int
loop
loop
repeat 40
set_mem_long_name_somet obj_class_yobi.cnt, 2, "each class yobi 1st"
set_mem_long_name_somet obj_class_yobi.cnt, 3, "each class yobi 2nd"
set_mem_long_name_somet obj_class_yobi.cnt, 4, "each class yobi 3rg"
set_mem_long_name_somet obj_class_yobi.cnt, 5, "each class yobi 4th"
set_mem_long_name_somet obj_class_yobi.cnt, 6, "each class yobi 5th"
set_mem_long_name_somet obj_class_yobi.cnt, 7, "each class yobi 6th"
set_mem_long_name_somet obj_class_yobi.cnt, 8, "each class yobi 7th"
set_mem_long_name_somet obj_class_yobi.cnt, 9, "each class yobi 8th"
loop
// 初期値代入:ほとんど-1代入w
tmp_n = -1
repeat 8,2
tmp_i = cnt
repeat 40
set_mem_value_somet obj_class_yobi.cnt, tmp_i, tmp_n
loop
loop
#if 0
repeat 40
	logmes "-- each character --"
	logmes "ID(" + cnt + ") : " + get_mem_ID_many_somet(obj_class_yobi.cnt)
	logmes "name : " + get_mem_name_many_somet(obj_class_yobi.cnt)
	logmes "lname: " + get_mem_long_name_many_somet(obj_class_yobi.cnt)
	logmes "-- sub mod --"
	tmp_i = cnt
	repeat MAX_OBJ@many_something
	tmp_ii=get_mem_ID_somet(obj_class_yobi.tmp_i, cnt)
	if tmp_ii != -1{
		logmes "- ID("+cnt+") : " + get_mem_ID_somet(obj_class_yobi.tmp_i, cnt)
		logmes "- name : " + get_mem_name_somet(obj_class_yobi.tmp_i, cnt)
		logmes "- lname: " + get_mem_long_name_somet(obj_class_yobi.tmp_i, cnt)
		logmes "- value: " + get_mem_value_somet(obj_class_yobi.tmp_i, cnt)
		logmes "------"
	}
	loop
loop
#endif

モジュール変数sample:modvar_sample_03_subr.hsp

#module one_something mem_ID_somet, mem_name_somet, mem_long_name_somet, mem_value_somet
#modinit
	mem_ID_somet = -1
	sdim mem_name_somet,32
	mem_name_somet = "nil -4"
	sdim mem_long_name_somet,1
	mem_value_somet = 0.0
	return
#modfunc  set_mem_ID_somet_mod int ___p
	mem_ID_somet = ___p
	return
#modcfunc get_mem_ID_somet_mod
	return mem_ID_somet
#modfunc  set_mem_name_somet_mod str ___p_str
	mem_name_somet = ___p_str
	return
#modcfunc get_mem_name_somet_mod
	return mem_name_somet
#modfunc  set_mem_long_name_somet_mod str ___p_str
	mem_long_name_somet = ___p_str
	return
#modcfunc get_mem_long_name_somet_mod
	return mem_long_name_somet
#modfunc  set_reginfo_somet_mod int ___p1, str ___p2_str, str ___p3_str
	mem_ID_somet   = ___p1
	mem_name_somet = ___p2_str
	mem_long_name_somet = ___p3_str
	return
#modfunc  get_reginfo_somet_mod var ___r1, var ___r2_str, var ___r3_str
	___r1 = mem_ID_somet
	___r2_str = mem_name_somet
	___r3_str = mem_long_name_somet
	return
#modfunc  set_mem_value_somet_mod var ___p_var
	logmes "set one somet value : " + mem_ID_somet + " : " + mem_long_name_somet
	mem_value_somet = ___p_var
	return
#modcfunc get_mem_value_somet_mod
	logmes "get one somet value : " + mem_ID_somet + " : " + mem_long_name_somet
	return mem_value_somet
#global
#if 0
newmod fire_tmp_int,one_something
set_mem_ID_somet_mod fire_tmp_int,1
set_mem_name_somet_mod fire_tmp_int,"1st somet"
set_mem_long_name_somet_mod fire_tmp_int,"fire int"
tmp_a=123
set_mem_value_somet_mod fire_tmp_int,tmp_a
newmod fire_tmp_dbl,one_something
set_mem_ID_somet_mod fire_tmp_dbl,2
set_mem_name_somet_mod fire_tmp_dbl,"2nd somet"
set_mem_long_name_somet_mod fire_tmp_dbl,"fire dbl"
tmp_b=456.789
set_mem_value_somet_mod fire_tmp_dbl,tmp_b
newmod fire_tmp_str,one_something
set_mem_ID_somet_mod fire_tmp_str,3
set_mem_name_somet_mod fire_tmp_str,"3rd somet"
set_mem_long_name_somet_mod fire_tmp_str,"fire str"
tmp_c="batake"
set_mem_value_somet_mod fire_tmp_str,tmp_c
logmes "id   : " + get_mem_ID_somet_mod(fire_tmp_int)
logmes "name : " + get_mem_name_somet_mod(fire_tmp_int)
logmes "lname: " + get_mem_long_name_somet_mod(fire_tmp_int)
logmes "value: " + get_mem_value_somet_mod(fire_tmp_int)
logmes "id   : " + get_mem_ID_somet_mod(fire_tmp_dbl)
logmes "name : " + get_mem_name_somet_mod(fire_tmp_dbl)
logmes "lname: " + get_mem_long_name_somet_mod(fire_tmp_dbl)
logmes "value: " + get_mem_value_somet_mod(fire_tmp_dbl)
logmes "id   : " + get_mem_ID_somet_mod(fire_tmp_str)
logmes "name : " + get_mem_name_somet_mod(fire_tmp_str)
logmes "lname: " + get_mem_long_name_somet_mod(fire_tmp_str)
logmes "value: " + get_mem_value_somet_mod(fire_tmp_str)
newmod wind_tmp,one_something
newmod wind_tmp,one_something
newmod wind_tmp,one_something
set_reginfo_somet_mod wind_tmp.0,4,"4th somet","wind int"
set_reginfo_somet_mod wind_tmp.1,5,"5th somet","wind dbl"
set_reginfo_somet_mod wind_tmp.2,6,"6th somet","wind str"
tmp_a = 321
set_mem_value_somet_mod wind_tmp.0,tmp_a
tmp_b = 987.654
set_mem_value_somet_mod wind_tmp.1,tmp_b
tmp_c = "tack"
set_mem_value_somet_mod wind_tmp.2,tmp_c
tmp_r1=""
tmp_r2=""
tmp_r3=""
get_reginfo_somet_mod wind_tmp.0,tmp_r1,tmp_r2,tmp_r3
logmes "ID : " + tmp_r1 + " name : " + tmp_r2 + " lname : " + tmp_r3
logmes "value : " + get_mem_value_somet_mod(wind_tmp.0)
get_reginfo_somet_mod wind_tmp.1,tmp_r1,tmp_r2,tmp_r3
logmes "ID : " + tmp_r1 + " name : " + tmp_r2 + " lname : " + tmp_r3
logmes "value : " + get_mem_value_somet_mod(wind_tmp.1)
get_reginfo_somet_mod wind_tmp.2,tmp_r1,tmp_r2,tmp_r3
logmes "ID : " + tmp_r1 + " name : " + tmp_r2 + " lname : " + tmp_r3
logmes "value : " + get_mem_value_somet_mod(wind_tmp.2)
#endif

モジュール変数sample:modvar_sample_03_module.hsp

#include "modvar_sample_03_subr.hsp"
#module many_something mem_ID_m_somet, mem_name_m_somet, mem_long_name_m_somet, mem_obj_m_somet 
#define MAX_OBJ 10
#modinit
	mem_ID_m_somet = -1
	sdim mem_name_m_somet ,30
	mem_name_m_somet = "nil -5"
	mem_long_name_m_somet = ""
	repeat MAX_OBJ
		newmod mem_obj_m_somet,one_something
	loop
	return
#modfunc  set_mem_ID_many_somet int __p
	mem_ID_m_somet = __p
	return
#modcfunc get_mem_ID_many_somet
	return mem_ID_m_somet
#modfunc  set_mem_name_many_somet str __p_str
	mem_name_m_somet = __p_str
	return
#modcfunc get_mem_name_many_somet
	return mem_name_m_somet
#modfunc  set_mem_long_name_many_somet str __p_str
	mem_long_name_m_somet = __p_str
	return
#modcfunc get_mem_long_name_many_somet
	return mem_long_name_m_somet
////////////////////////////////////////////////////////////
// one something に委譲
////////////////////////////////////////////////////////////
#modfunc  set_mem_ID_somet int __p_index,int __p
	set_mem_ID_somet_mod mem_obj_m_somet.__p_index,__p
	return
#modcfunc get_mem_ID_somet int __p_index
	return get_mem_ID_somet_mod(mem_obj_m_somet.__p_index)
#modfunc  set_mem_name_somet int __p_index,str __p_str
	set_mem_name_somet_mod mem_obj_m_somet.__p_index,__p_str
	return
#modcfunc get_mem_name_somet int __p_index
	return get_mem_name_somet_mod(mem_obj_m_somet.__p_index)
#modfunc  set_mem_long_name_somet int __p_index, str __p_str
	set_mem_long_name_somet_mod mem_obj_m_somet.__p_index,__p_str
	return
#modcfunc get_mem_long_name_somet int __p_index
	return get_mem_long_name_somet_mod(mem_obj_m_somet.__p_index)
#modfunc  set_reginfo_somet int __p_index, int __p1, str __p2_str, str __p3_str
	set_mem_ID_somet_mod mem_obj_m_somet.__p_index,__p1
	set_mem_name_somet_mod mem_obj_m_somet.__p_index,__p2_str
	set_mem_long_name_somet_mod mem_obj_m_somet.__p_index,__p3_str
	return
#modfunc  get_reginfo_somet int __p_index, var __r1, var __r2_str, var __r3_str
	__r1 = get_mem_ID_somet_mod(mem_obj_m_somet.__p_index)
	__r2_str = get_mem_name_somet_mod(mem_obj_m_somet.__p_index)
	__r3_str = get_mem_long_name_somet_mod(mem_obj_m_somet.__p_index)
	return
#modfunc  set_mem_value_somet int __p_index, var __p_var
	set_mem_value_somet_mod mem_obj_m_somet.__p_index,__p_var
	return
#modcfunc get_mem_value_somet int __p_index
	return get_mem_value_somet_mod(mem_obj_m_somet.__p_index)
	/*
#modfunc  set_mem_value_somet_mod var ___p_var
	mem_value_somet = ___p_var
	return
#modcfunc get_mem_value_somet_mod
	return mem_value_somet
	*/
#global
#include "modvar_sample_03_TEST.hsp"

モジュール変数sample:modvar_sample_02.hsp

#module wep_class_kaisuu mem_ID_wep, mem_chara_name_wep, wep_kaisuu_nokori, wep_Fire, wep_Fire_cur, wep_Wind, wep_Wind_cur, wep_Thunder, wep_Thunder_cur, wep_Light, wep_light_cur
#enum WEP_KAISUU_ALL = 18
#enum WEP_KIND_FIRE = 1
#enum WEP_KIND_WIND = 2
#enum WEP_KIND_THUNDER = 3
#enum WEP_KIND_LIGHT = 4
#modfunc  set_mem_ID_wep int __p
	mem_ID_wep = __p
	return
#modcfunc get_mem_ID_wep
	return mem_ID_wep
#modfunc  set_mem_chara_name_wep str __p_str
	mem_chara_name_wep = __p_str
	return
#modcfunc get_mem_chara_name_wep
	return mem_chara_name_wep
#modinit
	mem_ID_wep = -1
	mem_chara_name_wep = "name_tmp_player -1"
	wep_kaisuu_nokori = 0
	wep_Fire = 0
	wep_Wind = 0
	wep_Thunder = 0
	wep_Light = 0
	wep_Fire_cur = 0
	wep_Wind_cur = 0
	wep_Thunder_cur = 0
	wep_Light_cur = 0
	return
#modfunc delete_chara_wep
	logmes "wep delete : " + mem_ID_wep
;	mem_ID_wep = -1
;	mem_chara_name_wep = "name_tmp_player -1"
	wep_kaisuu_nokori = 0
	wep_Fire = 0
	wep_Wind = 0
	wep_Thunder = 0
	wep_Light = 0
	wep_Fire_cur = 0
	wep_Wind_cur = 0
	wep_Thunder_cur = 0
	wep_Light_cur = 0
	return
#modfunc set_wep_kaisuu_first
	logmes "set wep kaisuu first : " + mem_ID_wep
	wep_kaisuu_nokori = 2
	wep_Fire = 4
	wep_Wind = 4
	wep_Thunder = 4
	wep_Light = 4
	wep_Fire_cur = 4
	wep_Wind_cur = 4
	wep_Thunder_cur = 4
	wep_Light_cur = 4
	return
#modfunc  set_wep_kaisuu_nokori int __p
	logmes "set wep kaisuu nokori : " + mem_ID_wep
	wep_kaisuu_nokori = __p
	return
#modcfunc get_wep_kaisuu_nokori
	logmes "get wep kaisuu nokori : " + mem_ID_wep
	return wep_kaisuu_nokori
#modfunc  set_wep_kaisuu int __p, int __p_val
	logmes "set wep kaisuu : " + mem_ID_wep
	if __p == WEP_KIND_FIRE{
		wep_Fire = __p_val
		wep_Fire_cur = __p_val
		return
	}
	if __p == WEP_KIND_WIND{
		wep_Wind = __p_val
		wep_Wind_cur = __p_val
		return
	}
	if __p == WEP_KIND_THUNDER{
		wep_Thunder = __p_val
		wep_Thunder_cur = __p_val
		return
	}
	if __p == WEP_KIND_LIGHT{
		wep_Light = __p_val
		wep_Light_cur = __p_val
		return
	}
	dialog "error:wep_class_kaisuu:set_wep_kaisuu:__p " + __p,1
	return
#modfunc  set_wep_kaisuu_cur int __p, int __p_val
	logmes "set wep kaisuu cur : " + mem_ID_wep
	logmes ""+__p_val
	if __p == WEP_KIND_FIRE{
		wep_Fire_cur = __p_val
		return
	}
	if __p == WEP_KIND_WIND{
		wep_Wind_cur = __p_val
		return
	}
	if __p == WEP_KIND_THUNDER{
		wep_Thunder_cur = __p_val
		return
	}
	if __p == WEP_KIND_LIGHT{
		wep_Light_cur = __p_val
		return
	}
	dialog "error:wep_class_kaisuu:set_wep_kaisuu_cur:__p " + __p,1
	return
#modcfunc get_wep_kaisuu int __p
	logmes "wep wep kaisuu : " + mem_ID_wep
	if __p == WEP_KIND_FIRE{
		return wep_Fire 
	}
	if __p == WEP_KIND_WIND{
		return wep_Wind
	}
	if __p == WEP_KIND_THUNDER{
		return wep_Thunder
	}
	if __p == WEP_KIND_LIGHT{
		return wep_Light
	}
	dialog "error:wep_class_kaisuu:get_wep_kaisuu:__p " + __p,1
	return
#modcfunc get_wep_kaisuu_cur int __p
	logmes "get_kaisuu : " + mem_ID_wep + " : " + __p
	if __p == WEP_KIND_FIRE{
		return wep_Fire_cur
	}
	if __p == WEP_KIND_WIND{
		return wep_Wind_cur
	}
	if __p == WEP_KIND_THUNDER{
		return wep_Thunder_cur
	}
	if __p == WEP_KIND_LIGHT{
		return wep_Light_cur
	}
	dialog "error:wep_class_kaisuu:get_wep_kaisuu_cur:__p " + __p,1
	return
#modfunc  kaihuku_wep_kaisuu_cur	
	logmes "wep kaihuku : " + mem_ID_wep
	wep_Fire_cur = wep_Fire
	wep_Wind_cur = wep_Wind
	wep_Thunder_cur = wep_Thunder
	wep_Light_cur = wep_Light
	return
#modfunc  wep_kaisuu_pp int __p, var __p_error
	logmes "kaisuu_pp : " + mem_ID_wep + " : " + __p
	__p_error=""
	if wep_kaisuu_nokori <= 0{
		__p_error = "wep の ++ の 残り可能数がありません"
		return
	}
	if __p == WEP_KIND_FIRE{
		wep_Fire++
		return
	}
	if __p == WEP_KIND_WIND{
		wep_Wind++
		return
	}
	if __p == WEP_KIND_THUNDER{
		wep_Thunder++
		return
	}
	if __p == WEP_KIND_LIGHT{
		wep_Light++
		return
	}
	dialog "error:wep_class_kaisuu:set_kaisuu_pp:__p " + __p,1
	return
#modfunc  wep_kaisuu_mm int __p, var __p_error
	logmes "kaisuu_mm : " + mem_ID_wep + " : " + __p
	if __p == WEP_KIND_FIRE{
		if wep_Fire >= 1{
			wep_Fire--
			return
		}else{
			__p_error = "wep_Fireの使用回数はこれ以上下げられません"
			return
		}
	}
	if __p == WEP_KIND_WIND{
		if wep_Wind >= 1{
			wep_Wind--
			return
		}else{
			__p_error = "wep_Windの使用回数はこれ以上下げられません"
			return
		}
	}
	if __p == WEP_KIND_THUNDER{
		if wep_Thunder >= 1{
			wep_Thunder--
			return
		}else{
			__p_error = "wep_Thunderの使用回数はこれ以上下げられません"
			return
		}
	}
	if __p == WEP_KIND_LIGHT{
		if wep_Light >= 1{
			wep_Light--
			return
		}else{
			__p_error = "wep_Lightの使用回数はこれ以上下げられません"
			return
		}
	}
	dialog "error:wep_class_kaisuu:set_kaisuu_mm:__p " + __p,1
	return
#modcfunc  do_wep_magic_use int __p
	logmes "wep_use : " + mem_ID_wep + " : " + __p
	if __p == WEP_KIND_FIRE{
		if wep_Fire_cur >= 1{
			return 1
		}else{
			return 0
		}
	}
	if __p == WEP_KIND_WIND{
		if wep_Wind_cur >= 1{
			return 1
		}else{
			return 0
		}
	}
	if __p == WEP_KIND_THUNDER{
		if wep_Thunder_cur >= 1{
			return 1
		}else{
			return 0
		}
	}
	if __p == WEP_KIND_LIGHT{
		if wep_Light_cur >= 1{
			return 1
		}else{
			return 0
		}
	}
	dialog "error:wep_class_kaisuu:set_kaisuu_mm:__p " + __p,1
	return
#modcfunc  wep_kaisuu_4use_mm int __p, var __p_error
	logmes "wep_use_mm : " + mem_ID_wep + " : " + __p
	if __p == WEP_KIND_FIRE{
		if wep_Fire_cur >= 1{
			wep_Fire_cur--
			return 1
		}else{
			__p_error = "Fireはこれ以上使えません"
			return 0
		}
	}
	if __p == WEP_KIND_WIND{
		if wep_Wind_cur >= 1{
			wep_Wind_cur--
			return 1
		}else{
			__p_error = "Windはこれ以上使えません"
			return 0
		}
	}
	if __p == WEP_KIND_THUNDER{
		if wep_Thunder_cur >= 1{
			wep_Thunder_cur--
			return 1
		}else{
			__p_error = "Thunderはこれ以上使えません"
			return 0
		}
	}
	if __p == WEP_KIND_LIGHT{
		if wep_Light_cur >= 1{
			wep_Light_cur--
			return 1
		}else{
			__p_error = "Lightはこれ以上使えません"
			return 0
		}
	}
	dialog "error:wep_class_kaisuu:set_kaisuu_mm:__p " + __p,1
	return
#global
newmod player_wep,wep_class_kaisuu
newmod player_wep,wep_class_kaisuu
newmod player_wep,wep_class_kaisuu
newmod player_wep,wep_class_kaisuu
newmod player_wep,wep_class_kaisuu
newmod player_wep,wep_class_kaisuu
newmod player_wep,wep_class_kaisuu
newmod player_wep,wep_class_kaisuu
set_mem_ID_wep player_wep.0,1
set_mem_ID_wep player_wep.1,2
set_mem_ID_wep player_wep.2,3
set_mem_ID_wep player_wep.3,4
set_mem_ID_wep player_wep.4,5
set_mem_ID_wep player_wep.5,6
set_mem_ID_wep player_wep.6,7
set_mem_ID_wep player_wep.7,8
set_mem_chara_name_wep player_wep.0,"1st pl wep"
set_mem_chara_name_wep player_wep.1,"2nd pl wep"
set_mem_chara_name_wep player_wep.2,"3rd pl wep"
set_mem_chara_name_wep player_wep.3,"4th pl wep"
set_mem_chara_name_wep player_wep.4,"5th pl wep"
set_mem_chara_name_wep player_wep.5,"6th pl wep"
set_mem_chara_name_wep player_wep.6,"7th pl wep"
set_mem_chara_name_wep player_wep.7,"8th pl wep"
#if 0
#include "mod_wep_TEST\\TEST_setter_wep.hsp"
#include "mod_wep_TEST\\TEST_getter_wep.hsp"
#endif

モジュール変数sample:modvar_sample_01.hsp

#module data_module mem_ID_data, mem_name_data, mem_data_basic, mem_data_pow, mem_data_real
#modinit
	mem_ID_data = -1
	sdim mem_name_data,20
	mem_name_data = "name null -3"
	mem_data_basic = 0
	mem_data_pow   = 0.0
	mem_data_real  = 0.0
	return
#modfunc  set_mem_ID_data int __p
	mem_ID_data = __p
	return
#modcfunc get_mem_ID_data
	return mem_ID_data
#modfunc  set_mem_name_data str __p_str
	mem_name_data = __p_str
	return
#modcfunc get_mem_name_data
	return mem_name_data
#modfunc  set_mem_data_basic int __p
	mem_data_basic == __p
	return
#modfunc  calc_mem_pow_and_real
	mem_data_real = double(mem_data_basic) * double(mem_data_basic)*10.0
	mem_data_pow  = double(mem_data_real) / 2.0
	return
#modcfunc get_mem_data_basic
	return mem_data_basic
#modcfunc get_mem_data_pow
	return mem_data_pow
#modcfunc get_mem_data_real
	return mem_data_real
#modcfunc get_mem_data_real_div2
	return mem_data_real / 2.0
#modcfunc get_mem_data_real_div4
	return mem_data_real / 4.0
#global
repeat 110
newmod obj_data,data_module
if cnt != 0:set_mem_ID_data obj_data.cnt,cnt
loop
set_mem_name_data obj_data.1, "1st data"
set_mem_name_data obj_data.2, "2nd data"
set_mem_name_data obj_data.3, "3rd data"
set_mem_name_data obj_data.4, "4th data"
set_mem_name_data obj_data.5, "5th data"
repeat 100,6
set_mem_name_data obj_data.cnt, "" + cnt + "th data"
loop
repeat 105
set_mem_data_basic obj_data.cnt, cnt
loop
set_mem_data_basic obj_data.31,32
set_mem_data_basic obj_data.32,34
set_mem_data_basic obj_data.33,36
set_mem_data_basic obj_data.34,38
set_mem_data_basic obj_data.35,40
repeat 75
tmp_i  = 32 + cnt
tmp_ii = 30 + (tmp_i - 30) * 2
set_mem_data_basic obj_data.tmp_i,tmp_ii
loop
set_mem_data_basic obj_data.61,94
set_mem_data_basic obj_data.62,98
set_mem_data_basic obj_data.63,102
set_mem_data_basic obj_data.64,106
set_mem_data_basic obj_data.65,110
repeat 45
tmp_j  = 62 + cnt
tmp_jj = 30 + 60 + (tmp_j - 60) * 4
set_mem_data_basic obj_data.tmp_j,tmp_jj
loop
repeat 105
calc_mem_pow_and_real obj_data.cnt
loop
#if 0
repeat 105
logmes "ID   : " + get_mem_ID_data(obj_data.cnt)  + " name : " + get_mem_name_data(obj_data.cnt)
logmes "basic: " + get_mem_data_basic(obj_data.cnt)
logmes "pow  : " + get_mem_data_pow(obj_data.cnt)
logmes "real : " + get_mem_data_real(obj_data.cnt) + " div2 : " + get_mem_data_real_div2(obj_data.cnt) + " next div4 : " + get_mem_data_real_div4(obj_data.cnt)
loop
#endif

モジュール機能のサンプルに寄せて

・ “modvar_sample_01.hsp”に寄せて
3番目に書いたモジュールです
パラメータとかに参照するように書きました
並び替えをする必要がないので、そういう意味では楽です
自分、基本、今回はデータは読み出して使用して戻すという流れを
想定していましたが、
このモジュールは、並び替えなくて良さそうなので、
少々データと操作がまとまっています

・”modvar_sample_02.hsp”に寄せて
2番目に書いたモジュールです
(ちなみに最初に書いたのはさすがに汚いですw)
プレイヤーの所持している武器データの管理用です
武器レベルはないので、武器の使用回数だけ管理しています
武器の強さも実装してみたかったのですが
時間的に実装しきれなさそうなので諦めました
諦めたのにGAMEの完成は出来ませんでしたw
そういえばこのモジュールも
setterとgetter以外のデータの操作を書いてます
並び替えにミスがあっても致命的ではないような気がしましたので
最初に書いたモジュールがsetterとgetterがいっぱいあったので
このモジュールでは、setterとgetterをまとめてみました

・”modvar_sample_03_module.hsp”に寄せて
4番目に書いたモジュールです
キャラクターデータとキャラクター属性データと
それぞれの予備を管理しているのですが
モジュール変数の管理のモジュールを使い回してます
少々詳しく記述した文章は後述です

・今後の改善点。IDに関して
モジュール変数にキャラクターIDを格納しているのですが
作成するたびに増えるキャラクターIDと
最初に指定したまんまのキャラクターIDが混ざっています
キャラクターのデータは作成のたびに増える方がいいでしょうし
武器のデータとかはIDは固定した方がいいでしょう
更にキャラクターのデータは存在しなければIDが-1にしている
モジュールもあってややこしいです
モジュール固有のID。キャラクターID。存在するか削除されているかのID
と分けてモジュール変数を持った方がいいかもしれません。
という改善点です
改善した方がいいなら改善しとおいて。と思うかもしれませんが
現在10月20なんにちで改善したいけれど
改善していたら締め切りを破りそうなので
完成しなそうなので資料としての投稿としたのに
そういうことをやっていたら
締め切りを余裕で突破しそうです
そもそもモジュール変数の利用の仕方の応用がよくわかってないから
ちゃんと締め切りを守れないのでしょう
アジャイルな開発のごとく何周かして品質を高めるのが
よろしそうですが
毎年、思うがままに書いて
書いたスクリプトの保守とかをしないから
10月に作成しはじめて完成するのかもしれませんね
今回はよくわかんなくなるのを織り込んで
少々早く製作し始め
且つ途中で、よくわからなくなるのも想定して
自分で書いたスクリプトを写経しながらやっていたら
実は開発期間はもっと必要そうという結論です
モジュール変数が多いと、一行に書ききれないかもしれませんが
例えば炎素質と雷素質が一つのモジュールに入っていたりするので
操作はめんどくさそうですが分けた方がいい気もします
“modvar_sample_03_module.hsp”
でキャラクターの属性データを
委譲をしたモジュールに属性を格納してるのですが
属性データはそんないにいっぱい格納しなくていいし
インスタンスに委譲をしないモジュール変数として
mem_typeとかそんなかんじの
モジュール変数として記述をすればいいのかなと思いました
とまあいっぱいデータを作成したんですが
デバッグがわかりにくいんですよね
モジュールに分けて管理していても
そこでsetterしたIDの番号とか
getterしたIDの番号とかをlogmesすれば
;そもそもその手法にバグあれば別ですが
;そこが大丈夫なら
このIDにsetしたな。とか
このIDからgetしたな。とかがわかるわけです
なのでそのIDからちゃんとsetしたかちゃんとgetしたか想像するのです

・今後の改善点。委譲に関して
最初は委譲はなんか似たような処理になりそうで
躊躇していたのですが
実装してみると委譲を利用したモジュールは
使い回せることに気付きました
“modvar_sample_03_module.hsp”
ではキャラクターデータとキャラクター属性データで
とそれぞれの予備。に委譲したのを使い回してます
委譲の使い回しはめんどくさいしデバッグもしにくそうですが
管理するデータを配列形式でたくさん持てますし
命令の使用もポリモーフィズムのように共通になります
(インスタンスの名前で区別するかんじになります)
最初に記述したモジュールも委譲を使用した方が
すっきりとする気もしてきました

・今後の改善点。配列かモジュールか
どうもファミコンとかでは複数のかたまりのデータを
配列で管理してる気がするんです
例えばキャラクターAの変数Aの隣にキャラキクターBの変数Aを置くみたいな
それに対してプレステ2とかは構造体っぽく
キャラクターAの変数Aの隣にキャラクターAの変数Bを置くみたいに
データの格納を行っている気がします
キャラクターのデータを多くしてみた今回は構造体っぽく
1キャラごとのデータがまとまっているかんじで実装しました
並び替えもしたいのでそうしたんですが
仕様を詰めてないのでどんな変数が現れるかよくわかりませんでした
そういう時は一つめの案のように配列で管理する方がいいのかもしれません
ただ今年くらいにプログラムの写経をしてて
写経したプログラムで
インスタンスの中に予備変数を保持しているプログラムがあって
それを参考に予備のモジュール変数を作成してみました
足りなくなったらまたオブジェクトを作成すればいいかな。と
モジュールの委譲をすればいいですし
使い回せばいいですし
委譲の利点として
repeatでsetterとか繰り返せます
とか言って調子に乗って
0~9を炎10~19を雷とかやってたんですが
逆にknowbugで値を参照するのがめんどくさいし
参照出来る値が途中で切れてるし
(まあ少々古めのknowbug使ってるのもありますが)
あんまり調子に乗るのも問題ですね
そこではインスタンスを4種類に分けた方が楽っぽいですし
0と10と20と30とか
繰り返しが(最初はそうでもないかもですが)理解しにくくなるぽいです
大量にデータ記述するとどの種類の何番目とか
考えるのめんどくさくなりますし

・今後の改善点。中途はんぱなローカル変数もどき
HSPはローカル変数はあまり相性よくないですよね
よくjumpしますし
しかしローカル変数的に使いたい時もあります
自分はローカル変数にはloc_なんとか
命令に入ってない時はtmp_なんとか。とか命名します
しかし、たまにtmp_なんとかの変数を遠くから参照してたりします
バグは起きないんですけど
こういう使い方をするとセーブ/ロードがどうやればいいのかな。だなんて
めんどくさいから全部vsave/vloadでやってて思ったんですけど
vsave/vloadしたファイルを
教えてもらったのに上手く暗号かけれないですし
そういう意味ではこまめに命令化してローカル変数機能を多用した方が
いいのかな。なんて思います
命令は増えても保存しなくていいし

・検討案。キャラメイクか転職か
自分、今回はキャラメイクとキャラの並び替えを想定して
コーディングしてました
しかし、現在締め切りが迫っているのに
星ドラにはまっちゃったりして
ちょうど5周年で30000ジェムくれたり色々優遇されてたりもして
はまっちゃいましたw
で、星ドラは自分のキャラは3人で他にキャラメイクしたりせず
転職して他の職業を楽しめます
で、思ったんですけど
キャラメイクシステムは管理するキャラも増えますし
自分、今回は最大8キャラと想定しました
並び替えもバグると致命的な不具合にもなります
ユーザーさん的には不親切かもしれませんが
僕みたいな短編ばかり作ってる人は
転職システムの方が向いてるのかな。と思いました
繰り返しですが管理するキャラクター少ないですし
並び替えもいらないですし
キャラクターが減るとデバッグの労力も減りますし
自分、キャラメイクシステムのゲームも好きではありますがw

HSP公式BBS投稿文章:HSPのオブジェクト思考に関する議論のスレッド:その4

自分はモジュール変数を一行に書かなければ辛いという意見を書きましたが
モジュール変数を委譲の配列として使用すれば
かなり定義できますな
これは毎回作成しなければならないのではなく
一回作成すれば使い回せるかんじです
あんまり直感的な操作ではないので
途中でよくわからなくなってくるのもありますが
あんまり大量のデータを格納してしますと
確認が大変なのでほどほどに
モジュール変数をどのように作成したり格納したりするかは
やってると微妙に納得いかない感が出てきて
リファクタリングのアジャイルですね
上手いこと実装出来なくて前に進まなくなってきますw

自分、モジュール変数を利用してて
3回くらい同じミスしたんですけど
例えば
モジュールAとモジュールBがあって
モジュールAをobj_Aとしてnewmodして
モジュールBをobj_Bとしてnewmodしたとします
で、モジュールAにはfuncAがあり
モジュールBにはfuncBがあるとします
で、コピペして、修正漏れがあり
funcBをobj_Aで呼び出してもエラーにならなかったです
funcA obj_A
funcB obj_A(コピペしたのにBと修正してない)
みたいな記述で
再現スクリプト必要っすかね?

自分は最近、Pythonの勉強中でございます
で、Pythonは特にメンバの記述をしなくても
メンバを代入したり、メンバの値を取得出来るっぽいです
で、HSPは#moduleの行にモジュール変数書いて
newmodで初期値入れて
setterとgetter書いてやっと使えますよね
確認用にdump命令みたいのかかなきゃいけないですし
なんかあんまりHSPの思想と合ってないような
めんどくさい操作しなくても代入したり取得したり確認出来たり
する方がHSPらしい気がしました

ちょっとHSP3って後方交換取っててすごいなあ
と思ったんです
でも、もうHSPTV!プログラムは動かないっぽいですね
HSPTV!プログラムは
小型の作品を対象としたランタイムなので
プログラム初心者にとってとっつきやすかったと思います
自分もコンテスト投稿はHSPTV!部門からです
そして、現在も行数の多いプログラムは完成しませんねw
なので
HSPTV!プログラムの後継のランタイムも
需要はあるのではないでしょうか
HSPTV!よりサイズの上限が大きかったり
名前をつけて保存ダイアログによる
SAVE/LOADもあるといいなあ
って言って、自分は、さすがにHSPTV!プログラム向けの
小型ゲームはネタ切れっぽかったり

自分も配列はドット派ですね
なんでオブジェクト機能の議論に配列の記法が出てくるのか
謎でしたが
オブジェクト指向の記法にドットが出てくるからかあ。なんて
配列をドットじゃなくするのは
配列にドットを使用しているとこを
エラー出してくるれるならいいかな?ってとこです
機械的に修正していってOKならいいのかな
でも大きいスクリプトとかデバッグするのが大変な人も
いるかもしれませんね
仮にHSP4で配列の記法としてドットを廃止するとして
でもHSP3はしばらく配布していそうですね
2.61も今でも配布してますし
Rubyと違って
HSPはゲームとかはexeで完結してるので
古いHSPでもexeにしちゃえば普通に実行出来る訳です
例えば今HSP3をVC2019でコンパイルしてしまえば
VC2019が10年くらい動くと
10年くらいは動作する訳です
10年以上経過して後方交換が取れないとか文句言っても
やりすぎな気もしますね
HSPTV!プログラムもHSP3の古いのなら動くのかな
とちょっと思いました
HSPTV!プログラムも最新のでは動かないですし
HSPLetも動かないですし
おちゃっこ様の3Dのも動かないっぽいですし
環境を全部切り捨てていないかと問えば否だったり
作者様が今後はHSP3のように一気には変更しないって
発言を読んだことはあるような
オブジェクト指向的に言えば
オブジェクトを第一引数にする使用は直感的ではなく
そっちもわかり易くして欲しいです
Pythonもメソッドの第一引数はselfという慣習もありますが
それともまた違うややこしさではありますが
なんかPythonの話がちょいちょい出て来ますが
Pythonも微妙にBASICの流れの言語なので
Pythonの機能とかも取り込んで欲しいっすね

関数/命令
関数で統一と言えばPythonも括弧記法の割合多くなったっぽいっすが
Rubyのように特に曖昧すぎなければ、どっちでも良い
って方がいいかもですね
命令によって関数記法、命令記法って定義されていますが
どっちでも良くていいものも多い気もします
自分がHSP初心者の頃、関数記法が導入されて
ちょっと異議を唱えたら怒られた過去がありますw

HSP公式BBS投稿文章:HSPのオブジェクト思考に関する議論のスレッド:その3

こんばんわ。ここのスレッドではお久しぶりでございます
自分は今回のプロコン向け作品が未完成で
資料として投稿いたしまして
そこよりテンプレートもどきの引用でございます


/////////////////////////////////////////////////////////////
//
// HSPモジュール機能。テンプレートもどき
//
/////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////
// #deffunc/#defcfunc の覚え書き
/////////////////////////////////////////////////////////////

#deffunc/#defcfunc スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・

関数/命令名と引数Aの型の区切りはスペース
引数Aの型と引数Aの名前の区切りもスペース
引数Aの名前と引数Bの型の区切りは ","

型の種類
int、整数値(値渡し)
str、文字列(値渡し)
double、実数(値渡し)
var、変数(参照渡し)
array、配列(参照渡し)
label、ラベル
local、ローカル変数

関数は値を渡す変数に代入していないとエラー
関数の引数は()で括っていないとエラー 

/////////////////////////////////////////////////////////////
// モジュール/モジュール変数の覚え書き
/////////////////////////////////////////////////////////////

トークンの区切りはスペースと "," があるのでややこしい

/////////////////////////////////////////////////////////////
// "#module"
/////////////////////////////////////////////////////////////

"#module" スペース モジュール名 スペース モジュール変数 "," モジュール変数・・・

例 #module m a,b,c・・・

モジュール名と第一変数の区切りはスペースだが
第一変数と第二変数の区切りは ","

/////////////////////////////////////////////////////////////
// "#modinit"
/////////////////////////////////////////////////////////////

モジュールのコンストラクタは "#modinit"命令

"#modinit" スペース 型 スペース 引数A "," 型 スペース 引数B・・・

#modinit int l,int n,int m・・・

命令の名前は不要
"#modinit"と引数Aの型の区切りはスペース
引数Aの型と引数Aの名前の区切りもスペース
引数Aの名前と引数Bの型の区切りは ","

/////////////////////////////////////////////////////////////
// "#modfunc"
/////////////////////////////////////////////////////////////

モジュール命令の定義は "#modfunc"命令

"#modfunc" スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・

例 #modfunc mf int l,int n,int m・・・

モジュール命令名と引数Aの型の区切りはスペース
引数Aの型と引数Aの名前の区切りもスペース
引数Aの名前と引数Bの型の区切りは ","

"#modcfunc"
"#modcfunc" スペース モジュール命令名 スペース 型 スペース 引数A "," 型 スペース 引数B・・・

例 #modcfunc mf int l,int n,int m・・・

モジュール命令名と引数Aの型の区切りはスペース
引数Aの型と引数Aの名前の区切りもスペース
引数Aの名前と引数Bの型の区切りは ","

/////////////////////////////////////////////////////////////
// "newmod"命令
/////////////////////////////////////////////////////////////

オブジェクトの作成は"newmod"命令

"newmod" スペース オブジェクト名 "," モジュール名 "," 引数A "," 引数B・・・

例 newmod o,m,1,2,3・・・

オブジェクトを"newmod"命令で作成しないとモジュール命令は使用できない
"newmod" と オブジェクト名 の区切りはスペース
オブジェクト名と モジュール名 の区切りは ","

/////////////////////////////////////////////////////////////
// "newmod" モジュール変数版
/////////////////////////////////////////////////////////////

newmodで作成するオブジェクトをモジュール変数とすることで委譲が出来る

"newmod" スペース モジュール変数 "," 委譲のモジュール名 "," 引数A "," 引数B・・・

例 newmod mem_obj_m_somet,one_something

/////////////////////////////////////////////////////////////
// モジュール命令の使用
/////////////////////////////////////////////////////////////

モジュール命令 スペース オブジェクト名 "," 引数A "," 引数B・・・

例 mf o,1,2,3・・・

モジュール命令 と オブジェクト名 の 区切りは スペース
オブジェクト名 と 引数 の 区切りは スペース

/////////////////////////////////////////////////////////////
// モジュール関数の使用
/////////////////////////////////////////////////////////////

モジュール命令 "(" オブジェクト名 "," 引数A "," 引数B・・・")"

例 mf(o,1,2,3・・・)

モジュール命令 と オブジェクト名 の 区切りは "("
オブジェクト名 と 引数 の 区切りは スペース
最後の 区切りは ")"

/////////////////////////////////////////////////////////////
// local キーワード
/////////////////////////////////////////////////////////////

#modfuncとか local 命令名

例 #modfunc local hoge

/////////////////////////////////////////////////////////////
// "thismod" キーワード
/////////////////////////////////////////////////////////////

"thismod"キーワードは"#modfunc"の中で
同じモジュール内のモジュール命令を呼び出したい時に
オブジェクト名を指定するかわりに指定する

モジュール外から

mf o,1,2,3・・・

モジュール内から

mf thismod,1,2,3・・・

/////////////////////////////////////////////////////////////
// インスタンスの配列化
/////////////////////////////////////////////////////////////

オブジェクトの作成は"newmod"命令
"newmod" スペース オブジェクト名 "," モジュール名 "," 引数A "," 引数B・・・
を複数回実行する

例
newmod Player,player_chara_status
newmod Player,player_chara_status

/////////////////////////////////////////////////////////////
// 配列化したモジュール変数の使用
/////////////////////////////////////////////////////////////

#modfunc で定義した命令

命令 スペース オブジェクト ドット 配列の添え字
コンマ 引数 の繰り返し 省略しても良い

例
set_mem_ID_many_somet obj_common.tmp_i, 100

#modcfunc で定義した命令

命令 括弧 オブジェクト ドット 配列の添え字
コンマ 引数 の繰り返し省略しても良い
括弧閉じ

例
get_mem_ID_many_somet(obj_common.tmp_i)

配列をドットで記述しているが括弧で記述してもいい気もする
興味のある方は試してみてください

/////////////////////////////////////////////////////////////
// "newmod" モジュール変数版 配列化
/////////////////////////////////////////////////////////////

newmodで作成するオブジェクトをモジュール変数とすることで委譲が出来る
newmodを複数回使用すると配列化出来る

"newmod" スペース モジュール変数 "," 委譲のモジュール名 "," 引数A "," 引数B・・・

例
	repeat MAX_OBJ
		newmod mem_obj_m_somet,one_something
	loop

/////////////////////////////////////////////////////////////
// モジュール変数 アクセサ
/////////////////////////////////////////////////////////////

setter の例
#modfunc  set_mem_ID_data int __p
	mem_ID_data = __p
	return
	
getter の例
#modcfunc get_mem_ID_data
	return mem_ID_data

/////////////////////////////////////////////////////////////
// モジュール変数 アクセサ インデックス使用 モジュール命令
/////////////////////////////////////////////////////////////

一つ一つsetterとgetterを書くのがめんどくさくなって
まとめて書いたサンプルです

例
// #moduleとモジュール変数は一行で記述して下さい
#module wep_class_kaisuu mem_ID_wep, mem_chara_name_wep, wep_kaisuu_nokori, wep_Fire, wep_Fire_cur, wep_Wind, wep_Wind_cur, wep_Thunder, wep_Thunder_cur, wep_Light, wep_light_cur

#enum WEP_KIND_FIRE = 1
#enum WEP_KIND_WIND = 2
#enum WEP_KIND_THUNDER = 3
#enum WEP_KIND_LIGHT = 4
// 略
#modfunc  set_wep_kaisuu int __p, int __p_val
	logmes "set wep kaisuu : " + mem_ID_wep
	if __p == WEP_KIND_FIRE{
		wep_Fire = __p_val : wep_Fire_cur = __p_val
		return	}
	if __p == WEP_KIND_WIND{
		wep_Wind = __p_val : wep_Wind_cur = __p_val
		return	}
	if __p == WEP_KIND_THUNDER{
		wep_Thunder = __p_val : wep_Thunder_cur = __p_val
		return	}
	if __p == WEP_KIND_LIGHT{
		wep_Light = __p_val : 	wep_Light_cur = __p_val
		return	}
	dialog "error:wep_class_kaisuu:set_wep_kaisuu:__p " + __p,1
	return
#modcfunc get_wep_kaisuu int __p
	logmes "wep wep kaisuu : " + mem_ID_wep
	if __p == WEP_KIND_FIRE{	return wep_Fire }
	if __p == WEP_KIND_WIND{	return wep_Wind	}
	if __p == WEP_KIND_THUNDER{	return wep_Thunder	}
	if __p == WEP_KIND_LIGHT{	return wep_Light	}
	dialog "error:wep_class_kaisuu:get_wep_kaisuu:__p " + __p,1
	return
// 略
#global
// 略

/////////////////////////////////////////////////////////////

// 呼び出し例
// インストラクタの例
newmod player_wep,wep_class_kaisuu
// setter使用例
set_wep_kaisuu player_wep.0,1,100
// getter使用例
get_wep_kaisuu(player_wep.0,1)

/////////////////////////////////////////////////////////////
// モジュール変数 アクセサ 委譲
/////////////////////////////////////////////////////////////

setter の例

#modfunc スペース アクセサ命令の名前 スペース int インデックス
コンマ 型 代入したい値
コンマ 型 引数 の繰り返し省略可 改行
委譲元の命令 スペース モジュール変数 ドット 配列の添え字
ドット インデックス コンマ 代入したい値
コンマ 引数 の繰り返し省略可 改行
return

#modfunc  set_mem_ID_somet int __p_index,int __p
	set_mem_ID_somet_mod mem_obj_m_somet.__p_index,__p
	return

getter の例

#modfunc スペース アクセサ命令の名前 スペース int インデックス
コンマ 型 引数 の繰り返し省略可 改行
return 委譲元の命令 括弧 モジュール変数 ドット 配列の添え字
コンマ 引数 の繰り返し 括弧閉じ 改行

#modcfunc get_mem_ID_somet int __p_index
	return get_mem_ID_somet_mod(mem_obj_m_somet.__p_index)

作成したモジュールの委譲がindex付きで操作しているが
indexなしのアクセサ版を作成したければ
試行錯誤してみれば動くと思われる

HSP公式BBS投稿文章:HSPのオブジェクト思考に関する議論のスレッド:その2

#module m4test mem
#modinit
	mem = 1
	return
// なんかしないとモジュールが削除されるかもなので
#deffunc tmp
	mes "tmp"
	return
#global
tmp
// error起こるかな
newmod obj,m4tes

objの属するモジュールの指定が間違っている
errorは「Error35 モジュール変数が指定されていません」
わかりにくいので、もう少しわかりやすいerror情報にならないかな

#module m4test mem
#modinit
	mem = 1
	return
#modfunc hoge
	mes mem
	return
#modcfunc piyo
	mes "a"
	return 1
#modcfunc piyopiyo
	mes "A"
	return
// なんかしないとモジュールが削除されるかもなので
#deffunc tmp
	mes "tmp"
	return
#global
tmp
newmod obj,m4test
// error起こるかな
// hog obj
// error 2 : 文法が間違っています 
// モジュール命令の名前が間違っています
// 文法間違いと端的に明示されても分かりにくいと思います
// hoge ob
// error 36 : モジュール変数の指定が無効です
// モジュール変数じゃなくオブジェクトが間違っています
// 無効とかじゃなく、存在しないオブジェクトを指定してます。とかならいいのに
hoge(obj)
// 命令形式の書式っぽいのを関数形式で呼び出したのですがerrorにならないっすね
// piyo obj
// error 2 : 文法が間違っています
// 「関数形式を要求するところを命令形式で記述してます」とかの方がいいのに
// 文法ミスっちゃ文法ミスですが
// piyopiyo(obj)
// error 2 : 文法が間違っています
// 「関数の中で値を返していません」とかの方がいいのに
// 文法ミスっちゃ文法ミスですが

public属性とかを記述するならなおさらで
モジュール変数に関する記述は
1行にしなきゃいけないのは辛いっす
最近モジュール変数がいっぱいあるデータを二つのモジュールに分割したのですが
それもわかりにくいですよね
複数行でも良くなればいいなあ。なんて
後、データを引数とかで渡すにしても一個一個渡していくのもめんどうなので
モジュールのオブジェクト(塊)を渡せたらいいなあ。なんて思ってます

HSP公式BBS投稿文章:HSPのオブジェクト思考に関する議論のスレッド:その1

HSP3が登場して大分経ちますが
それとともに実装された簡単なオブジェクト指向
使いにくいとの感想もありそうですが
そろそろ。皆さんのHSPのオブジェクト機能に関する
提言を書き込みしていく時期でもあるのかな。と思い
スレッドを建ててみました

自分はHSPのまとめサイトを作成しいていきたくもあるので
ここのスレッドの中身をまとめサイトに更新していくつもりです
そういうの嫌な人がいたら、注意書きしておいてください
大丈夫。僕のまとめサイトなんて公式BBSに比べて
検索順位はものすごい下ですから

HSPのエラー情報は難しくすると
初心者の方々にわかりにくくなるのでしょうが
中級者の方々とか
(自分はたぶん初級者と中級者の間くらいだと思います)
エラー情報を少々難しくしても大丈夫なのではないでしょうか
そういうのをスイッチする命令があって
スイッチONの状態では難しめでも有意義なエラー情報を吐くとか
どうでしょうか

・オブジェクトの名前
変数は書いてすぐ使えて
それに支障はないのでしょうが
オブジェクトの名前は
特にオブジェクト変数に入れた場合
モジュール変数とこに定義して
インスタンス関数書いて
モジュール書いて
setter/getter書いて
やっとその辺で使えるんですよね
まあ。前の書き込みした時の間違えに関するのですが
書いてもすぐには使えないんで
使おうとした時にすぐ使えないので
間違え易いと
そもそもnewmodでオブジェクトを作成しないと使えないので
作成してないオブジェクトを使おうとした場合
ほぼタイプミスとかのエラーだと思います
そういう時はそういうエラーを吐いちゃっていいと思います
ってHSPの警告情報、全然見てないんですが
警告吐くものなのでしょうか

・テンプレート
自分はモジュール変数
使い出した頃に
seesaawikiにメモを書いておいてたので
それをテンプレートとして
それを見ながらモジュール変数を使ってます
で、モジュール変数にモジュールのオブジェクトを入れたい時の
メモはまだ書いてなくて
それもあってどう書けば良いかわかりませんでした
なので参照しながらコーディングとかに使える
HSPのオブジェクトに関するテンプレートがあったら便利なのでは?
と思ったのでした

ちょっと連動してますが
前にも書き込みしたこともありますが
モジュール変数のアクセサとか欲しいっすね
getter/setter書いてテストするのめんどくさいかんじします
それかモジュール変数のpublic指定もいいっすね

以前、newmodしたのの所属するモジュールがわからない
みたいな投稿があったぽいですが
所属するモジュールを教えてもらえる命令とかあれば便利そうっすね
HSPはポリモーフィズムもないですし
共通するユーザー定義命令とか実現出来ないですし
モジュール命令を呼び出して
あれば定義してあるので動いて
定義してなければエラー吐く
とか微妙にめんどくさくもあります
自分は配列にドット使ってるんで交換性なくさないで欲しいっすね
括弧で括る方が命令呼び出しっぽくてしっくりこないっす
普通に[]で括った方がいいと思いますね

配列がドットなのは目新しくて好感持った記憶がありますね
ドットは色々意味付けがあって、配列がドットなのは
廃止されても仕方がない気はしますが
廃止されるにしても
例えばHSP4からとかにして欲しいっすね
出るんでしょうかねHSP4w