diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 60f0063..a850a85 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -83,6 +83,7 @@ class BuiltinFunctions //一応可変長は最後 if(va) return va; writeln("====function overloads==="); + writefln("func = %s argc = %d outargc = %d", func[0].name, argc, outargc); foreach(f; func) { writefln("name=\"%s\", argments=%s, results = %s, variadic = %s, startoptional = %d, function pointer=%s", f.name, f.argments, f.results, f.variadic, f.startskip, f.func); @@ -1043,6 +1044,34 @@ class BuiltinFunction } p.sprite.spchr(id, defno); } + static void SPCHR(PetitComputer p, int id, out int defno) + { + if (!p.sprite.isSpriteDefined(id)) + { + throw new IllegalFunctionCall("SPCHR", 1); + } + p.sprite.spchr(id, defno); + } + static void SPCHR(PetitComputer p, int id, out int u, out int v, out int w, out int h, out int attr) + { + if (!p.sprite.isSpriteDefined(id)) + { + throw new IllegalFunctionCall("SPCHR", 1); + } + SpriteAttr spriteattr; + p.sprite.spchr(id, u, v, w, h, spriteattr); + attr = cast(int)spriteattr; + } + static void SPCHR(PetitComputer p, int id, out int u, out int v) + { + int w, h, attr; + SPCHR(p, id, u, v, w, h , attr); + } + static void SPCHR(PetitComputer p, int id, out int u, out int v, out int w, out int h) + { + int attr; + SPCHR(p, id, u, v, w, h , attr); + } static void SPHIDE(PetitComputer p, int id) { p.sprite.sphide(id); diff --git a/SMILEBASIC/error.d b/SMILEBASIC/error.d index 8555c3e..3ebe00d 100644 --- a/SMILEBASIC/error.d +++ b/SMILEBASIC/error.d @@ -55,6 +55,11 @@ class IllegalFunctionCall : SmileBasicError this.errnum = 4; super("Illegal function call(" ~ func ~ ")"); } + this(string func, int arg) + { + this.errnum = 4; + super("Illegal function call(" ~ func ~ ":" ~ arg.to!string ~ ")"); + } } class StackOverFlow : SmileBasicError { diff --git a/SMILEBASIC/sprite.d b/SMILEBASIC/sprite.d index a13a43f..7c87faa 100644 --- a/SMILEBASIC/sprite.d +++ b/SMILEBASIC/sprite.d @@ -343,6 +343,11 @@ class Sprite HY= SPDEFTable[id].hy; A = SPDEFTable[id].a; } + bool isSpriteDefined(int i) + { + i = spid(i); + return sprites[i].define; + } void spchr(int i, int d) { i = spid(i); @@ -354,6 +359,20 @@ class Sprite auto spdef = SpriteDef(u, v, w, h, sprites[id].homex, sprites[id].homey, attr); sprites[id].change(spdef); } + void spchr(int i, out int d) + { + i = spid(i); + d = sprites[i].defno; + } + void spchr(int id, out int u, out int v, out int w, out int h, out SpriteAttr attr) + { + id = spid(id); + u = sprites[id].u; + v = sprites[id].v; + w = sprites[id].w; + h = sprites[id].h; + attr = sprites[id].attr; + } this(PetitComputer petitcom) { initSpriteAnimationTable();