Initial commit
This commit is contained in:
commit
ff25887f41
119 changed files with 24901 additions and 0 deletions
88
binding-mri/audio-binding.cpp
Normal file
88
binding-mri/audio-binding.cpp
Normal file
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
** audio-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "audio.h"
|
||||
#include "globalstate.h"
|
||||
#include "binding-util.h"
|
||||
#include "exception.h"
|
||||
|
||||
#define DEF_PLAY_STOP(entity) \
|
||||
RB_METHOD(audio_##entity##Play) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
const char *filename; \
|
||||
int volume = 100; \
|
||||
int pitch = 100; \
|
||||
rb_get_args(argc, argv, "z|ii", &filename, &volume, &pitch); \
|
||||
GUARD_EXC( gState->audio().entity##Play(filename, volume, pitch); ) \
|
||||
return Qnil; \
|
||||
} \
|
||||
RB_METHOD(audio_##entity##Stop) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
gState->audio().entity##Stop(); \
|
||||
return Qnil; \
|
||||
}
|
||||
|
||||
#define DEF_FADE(entity) \
|
||||
RB_METHOD(audio_##entity##Fade) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
int time; \
|
||||
rb_get_args(argc, argv, "i", &time); \
|
||||
gState->audio().bgmFade(time); \
|
||||
return Qnil; \
|
||||
}
|
||||
|
||||
#define DEF_PLAY_STOP_FADE(entity) \
|
||||
DEF_PLAY_STOP(entity) \
|
||||
DEF_FADE(entity)
|
||||
|
||||
DEF_PLAY_STOP_FADE( bgm )
|
||||
DEF_PLAY_STOP_FADE( bgs )
|
||||
DEF_PLAY_STOP_FADE( me )
|
||||
|
||||
DEF_PLAY_STOP( se )
|
||||
|
||||
|
||||
#define BIND_PLAY_STOP(entity) \
|
||||
_rb_define_module_function(module, #entity "_play", audio_##entity##Play); \
|
||||
_rb_define_module_function(module, #entity "_stop", audio_##entity##Stop);
|
||||
|
||||
#define BIND_FADE(entity) \
|
||||
_rb_define_module_function(module, #entity "_fade", audio_##entity##Fade);
|
||||
|
||||
#define BIND_PLAY_STOP_FADE(entity) \
|
||||
BIND_PLAY_STOP(entity) \
|
||||
BIND_FADE(entity)
|
||||
|
||||
|
||||
void
|
||||
audioBindingInit()
|
||||
{
|
||||
VALUE module = rb_define_module("Audio");
|
||||
|
||||
BIND_PLAY_STOP_FADE( bgm )
|
||||
BIND_PLAY_STOP_FADE( bgs )
|
||||
BIND_PLAY_STOP_FADE( me )
|
||||
|
||||
BIND_PLAY_STOP( se )
|
||||
}
|
313
binding-mri/binding-mri.cpp
Normal file
313
binding-mri/binding-mri.cpp
Normal file
|
@ -0,0 +1,313 @@
|
|||
/*
|
||||
** binding-mri.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "binding.h"
|
||||
#include "binding-util.h"
|
||||
#include "globalstate.h"
|
||||
#include "eventthread.h"
|
||||
#include "filesystem.h"
|
||||
|
||||
#include "./ruby/include/ruby.h"
|
||||
|
||||
#include "zlib.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QByteArray>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
extern const char module_rpg[];
|
||||
|
||||
static void mriBindingExecute();
|
||||
static void mriBindingTerminate();
|
||||
|
||||
ScriptBinding scriptBindingImpl =
|
||||
{
|
||||
mriBindingExecute,
|
||||
mriBindingTerminate
|
||||
};
|
||||
|
||||
ScriptBinding *scriptBinding = &scriptBindingImpl;
|
||||
|
||||
void tableBindingInit();
|
||||
void etcBindingInit();
|
||||
void fontBindingInit();
|
||||
void bitmapBindingInit();
|
||||
void spriteBindingInit();
|
||||
void viewportBindingInit();
|
||||
void planeBindingInit();
|
||||
void windowBindingInit();
|
||||
void tilemapBindingInit();
|
||||
|
||||
void inputBindingInit();
|
||||
void audioBindingInit();
|
||||
void graphicsBindingInit();
|
||||
|
||||
void fileIntBindingInit();
|
||||
|
||||
static VALUE mriPrint(int, VALUE*, VALUE);
|
||||
static VALUE mriP(int, VALUE*, VALUE);
|
||||
|
||||
static void mriBindingInit()
|
||||
{
|
||||
tableBindingInit();
|
||||
etcBindingInit();
|
||||
fontBindingInit();
|
||||
bitmapBindingInit();
|
||||
spriteBindingInit();
|
||||
viewportBindingInit();
|
||||
planeBindingInit();
|
||||
windowBindingInit();
|
||||
tilemapBindingInit();
|
||||
|
||||
inputBindingInit();
|
||||
audioBindingInit();
|
||||
graphicsBindingInit();
|
||||
|
||||
fileIntBindingInit();
|
||||
|
||||
_rb_define_module_function(rb_mKernel, "print", mriPrint);
|
||||
_rb_define_module_function(rb_mKernel, "p", mriP);
|
||||
|
||||
rb_eval_string(module_rpg);
|
||||
|
||||
rb_define_global_const("MKXP", Qtrue);
|
||||
}
|
||||
|
||||
static void
|
||||
showMsg(const QByteArray &msg)
|
||||
{
|
||||
gState->eThread().showMessageBox(msg.constData());
|
||||
}
|
||||
|
||||
static void printP(int argc, VALUE *argv,
|
||||
const char *convMethod, const char *sep)
|
||||
{
|
||||
VALUE dispString = rb_str_buf_new(128);
|
||||
ID conv = rb_intern(convMethod);
|
||||
|
||||
for (int i = 0; i < argc; ++i)
|
||||
{
|
||||
VALUE str = rb_funcall(argv[i], conv, 0);
|
||||
rb_str_buf_append(dispString, str);
|
||||
|
||||
if (i < argc)
|
||||
rb_str_buf_cat2(dispString, sep);
|
||||
}
|
||||
|
||||
showMsg(RSTRING_PTR(dispString));
|
||||
|
||||
rb_str_free(dispString);
|
||||
}
|
||||
|
||||
RB_METHOD(mriPrint)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
printP(argc, argv, "to_s", "");
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
RB_METHOD(mriP)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
printP(argc, argv, "inspect", "\n");
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static void runCustomScript(const char *filename)
|
||||
{
|
||||
QFile scriptFile(filename);
|
||||
if (!scriptFile.open(QFile::ReadOnly))
|
||||
{
|
||||
showMsg(QByteArray("Unable to open '") + filename + "'");
|
||||
return;
|
||||
}
|
||||
|
||||
QByteArray scriptData = scriptFile.readAll();
|
||||
scriptFile.close();
|
||||
|
||||
rb_eval_string_protect(scriptData.constData(), 0);
|
||||
}
|
||||
|
||||
VALUE kernelLoadDataInt(const char *filename);
|
||||
|
||||
struct Script
|
||||
{
|
||||
QByteArray name;
|
||||
QByteArray encData;
|
||||
uint32_t unknown;
|
||||
|
||||
QByteArray decData;
|
||||
};
|
||||
|
||||
static void runRMXPScripts()
|
||||
{
|
||||
const QByteArray &scriptPack = gState->rtData().config.game.scripts;
|
||||
|
||||
if (!gState->fileSystem().exists(scriptPack.constData()))
|
||||
{
|
||||
showMsg("Unable to open '" + scriptPack + "'");
|
||||
return;
|
||||
}
|
||||
|
||||
VALUE scriptArray = kernelLoadDataInt(scriptPack.constData());
|
||||
|
||||
if (rb_type(scriptArray) != RUBY_T_ARRAY)
|
||||
{
|
||||
showMsg("Failed to read script data");
|
||||
return;
|
||||
}
|
||||
|
||||
int scriptCount = RARRAY_LEN(scriptArray);
|
||||
|
||||
QByteArray decodeBuffer;
|
||||
decodeBuffer.resize(0x1000);
|
||||
|
||||
QVector<Script> encScripts(scriptCount);
|
||||
|
||||
for (int i = 0; i < scriptCount; ++i)
|
||||
{
|
||||
VALUE script = rb_ary_entry(scriptArray, i);
|
||||
|
||||
if (rb_type(script) != RUBY_T_ARRAY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
VALUE scriptUnknown = rb_ary_entry(script, 0);
|
||||
VALUE scriptName = rb_ary_entry(script, 1);
|
||||
VALUE scriptString = rb_ary_entry(script, 2);
|
||||
|
||||
Script &sc = encScripts[i];
|
||||
sc.name = RSTRING_PTR(scriptName);
|
||||
sc.encData = QByteArray(RSTRING_PTR(scriptString), RSTRING_LEN(scriptString));
|
||||
sc.unknown = FIX2UINT(scriptUnknown);
|
||||
}
|
||||
|
||||
for (int i = 0; i < scriptCount; ++i)
|
||||
{
|
||||
Script &sc = encScripts[i];
|
||||
|
||||
int result = Z_OK;
|
||||
ulong bufferLen;
|
||||
|
||||
while (true)
|
||||
{
|
||||
unsigned char *bufferPtr =
|
||||
reinterpret_cast<unsigned char*>(const_cast<char*>(decodeBuffer.constData()));
|
||||
const unsigned char *sourcePtr =
|
||||
reinterpret_cast<const unsigned char*>(sc.encData.constData());
|
||||
|
||||
bufferLen = decodeBuffer.length();
|
||||
|
||||
result = uncompress(bufferPtr, &bufferLen,
|
||||
sourcePtr, sc.encData.length());
|
||||
|
||||
bufferPtr[bufferLen] = '\0';
|
||||
|
||||
if (result != Z_BUF_ERROR)
|
||||
break;
|
||||
|
||||
decodeBuffer.resize(decodeBuffer.size()*2);
|
||||
}
|
||||
|
||||
if (result != Z_OK)
|
||||
{
|
||||
static char buffer[256];
|
||||
snprintf(buffer, sizeof(buffer), "Error decoding script %d: '%s'",
|
||||
i, sc.name.constData());
|
||||
|
||||
showMsg(buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
// QFile file(QString("/home/Ancurio/programming/C++/mkxp/dump/%1.rb").arg(i, 3, 10, QChar('0')));
|
||||
// if (file.open(QFile::WriteOnly))
|
||||
// file.write(decodeBuffer.constData(), bufferLen);
|
||||
|
||||
sc.decData = QByteArray(decodeBuffer.constData(), bufferLen);
|
||||
|
||||
ruby_script(sc.name.constData());
|
||||
|
||||
rb_gc_start();
|
||||
|
||||
qDebug() << "Executing script:" << QString("%1").arg(i, 3, 10, QChar('0'));
|
||||
|
||||
/* Execute code */
|
||||
rb_eval_string_protect(decodeBuffer.constData(), 0);
|
||||
|
||||
VALUE exc = rb_gv_get("$!");
|
||||
if (rb_type(exc) != RUBY_T_NIL)
|
||||
break;
|
||||
}
|
||||
|
||||
// QFile file("/home/Ancurio/programming/C++/mkxp/dump/index");
|
||||
// if (file.open(QFile::WriteOnly))
|
||||
// {
|
||||
// for (int i = 0; i < encScripts.size(); ++i)
|
||||
// {
|
||||
// const Script &sc = encScripts[i];
|
||||
// file.write(sc.name);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
static void mriBindingExecute()
|
||||
{
|
||||
ruby_setup();
|
||||
|
||||
RbData rbData;
|
||||
gState->setBindingData(&rbData);
|
||||
|
||||
mriBindingInit();
|
||||
|
||||
QByteArray &customScript = gState->rtData().config.customScript;
|
||||
if (!customScript.isEmpty())
|
||||
runCustomScript(customScript.constData());
|
||||
else
|
||||
runRMXPScripts();
|
||||
|
||||
VALUE exc = rb_gv_get("$!");
|
||||
if (rb_type(exc) != RUBY_T_NIL && !rb_eql(rb_obj_class(exc), rb_eSystemExit))
|
||||
{
|
||||
qDebug() << "Had exception:" << rb_class2name(rb_obj_class(exc));
|
||||
VALUE bt = rb_funcall(exc, rb_intern("backtrace"), 0);
|
||||
rb_p(bt);
|
||||
VALUE msg = rb_funcall(exc, rb_intern("message"), 0);
|
||||
if (RSTRING_LEN(msg) < 256)
|
||||
showMsg(RSTRING_PTR(msg));
|
||||
else
|
||||
qDebug() << (RSTRING_PTR(msg));
|
||||
}
|
||||
|
||||
ruby_cleanup(0);
|
||||
|
||||
gState->rtData().rqTermAck = true;
|
||||
}
|
||||
|
||||
static void mriBindingTerminate()
|
||||
{
|
||||
rb_raise(rb_eSystemExit, " ");
|
||||
}
|
40
binding-mri/binding-types.h
Normal file
40
binding-mri/binding-types.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
** binding-types.h
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef BINDINGTYPES_H
|
||||
#define BINDINGTYPES_H
|
||||
|
||||
#include "binding-util.h"
|
||||
|
||||
DECL_TYPE(Table);
|
||||
DECL_TYPE(Rect);
|
||||
DECL_TYPE(Color);
|
||||
DECL_TYPE(Tone);
|
||||
DECL_TYPE(Font);
|
||||
|
||||
DECL_TYPE(Bitmap);
|
||||
DECL_TYPE(Sprite);
|
||||
DECL_TYPE(Plane);
|
||||
DECL_TYPE(Viewport);
|
||||
DECL_TYPE(Tilemap);
|
||||
DECL_TYPE(Window);
|
||||
|
||||
#endif // BINDINGTYPES_H
|
306
binding-mri/binding-util.cpp
Normal file
306
binding-mri/binding-util.cpp
Normal file
|
@ -0,0 +1,306 @@
|
|||
/*
|
||||
** binding-util.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "binding-util.h"
|
||||
|
||||
#include "globalstate.h"
|
||||
#include "exception.h"
|
||||
#include "util.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
void initType(rb_data_type_struct &type,
|
||||
const char *name,
|
||||
void (*freeInst)(void *))
|
||||
{
|
||||
type.wrap_struct_name = name;
|
||||
type.function.dmark = 0;
|
||||
type.function.dsize = 0;
|
||||
type.function.dfree = freeInst;
|
||||
type.function.reserved[0] =
|
||||
type.function.reserved[1] = 0;
|
||||
type.parent = 0;
|
||||
}
|
||||
|
||||
RbData *getRbData()
|
||||
{
|
||||
return static_cast<RbData*>(gState->bindingData());
|
||||
}
|
||||
|
||||
//enum RbException
|
||||
//{
|
||||
// RGSS = 0,
|
||||
// PHYSFS,
|
||||
// SDL,
|
||||
|
||||
// ErrnoENOENT,
|
||||
|
||||
// IOError,
|
||||
|
||||
// TypeError,
|
||||
// ArgumentError,
|
||||
|
||||
// RbExceptionsMax
|
||||
//};
|
||||
|
||||
struct
|
||||
{
|
||||
RbException id;
|
||||
const char *name;
|
||||
} static customExc[] =
|
||||
{
|
||||
{ RGSS, "RGSSError" },
|
||||
{ PHYSFS, "PHYSFSError" },
|
||||
{ SDL, "SDLError" }
|
||||
};
|
||||
|
||||
RbData::RbData()
|
||||
{
|
||||
for (size_t i = 0; i < ARRAY_SIZE(customExc); ++i)
|
||||
exc[customExc[i].id] = rb_define_class(customExc[i].name, rb_eException);
|
||||
|
||||
exc[ErrnoENOENT] = rb_const_get(rb_const_get(rb_cObject, rb_intern("Errno")), rb_intern("ENOENT"));
|
||||
exc[IOError] = rb_eIOError;
|
||||
exc[TypeError] = rb_eTypeError;
|
||||
exc[ArgumentError] = rb_eArgError;
|
||||
}
|
||||
|
||||
RbData::~RbData()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/* Indexed with Exception::Type */
|
||||
static const RbException excToRbExc[] =
|
||||
{
|
||||
RGSS, /* RGSSError */
|
||||
ErrnoENOENT, /* NoFileError */
|
||||
IOError,
|
||||
|
||||
TypeError,
|
||||
ArgumentError,
|
||||
|
||||
PHYSFS, /* PHYSFSError */
|
||||
SDL /* SDLError */
|
||||
};
|
||||
|
||||
void raiseRbExc(const Exception &exc)
|
||||
{
|
||||
RbData *data = getRbData();
|
||||
VALUE excClass = data->exc[excToRbExc[exc.type]];
|
||||
|
||||
static char buffer[512];
|
||||
exc.snprintf(buffer, sizeof(buffer));
|
||||
rb_raise(excClass, buffer);
|
||||
}
|
||||
|
||||
int
|
||||
rb_get_args(int argc, VALUE *argv, const char *format, ...)
|
||||
{
|
||||
char c;
|
||||
VALUE *arg = argv;
|
||||
va_list ap;
|
||||
bool opt = false;
|
||||
int argI = 0;
|
||||
|
||||
va_start(ap, format);
|
||||
|
||||
while ((c = *format++))
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '|' :
|
||||
break;
|
||||
default:
|
||||
// FIXME print num of needed args vs provided
|
||||
if (argc <= argI && !opt)
|
||||
rb_raise(rb_eArgError, "wrong number of arguments");
|
||||
break;
|
||||
}
|
||||
|
||||
if (argI >= argc)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 'o' :
|
||||
{
|
||||
if (argI >= argc)
|
||||
break;
|
||||
|
||||
VALUE *obj = va_arg(ap, VALUE*);
|
||||
|
||||
*obj = *arg++;
|
||||
++argI;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'S' :
|
||||
{
|
||||
if (argI >= argc)
|
||||
break;
|
||||
|
||||
VALUE *str = va_arg(ap, VALUE*);
|
||||
VALUE tmp = *arg;
|
||||
|
||||
if (!rb_type(tmp) == RUBY_T_STRING)
|
||||
rb_raise(rb_eTypeError, "Argument %d: Expected string", argI);
|
||||
|
||||
*str = tmp;
|
||||
++argI;
|
||||
break;
|
||||
}
|
||||
|
||||
case 's' :
|
||||
{
|
||||
if (argI >= argc)
|
||||
break;
|
||||
|
||||
const char **s = va_arg(ap, const char**);
|
||||
int *len = va_arg(ap, int*);
|
||||
|
||||
VALUE tmp = *arg;
|
||||
|
||||
if (!rb_type(tmp) == RUBY_T_STRING)
|
||||
rb_raise(rb_eTypeError, "Argument %d: Expected string", argI);
|
||||
|
||||
*s = RSTRING_PTR(tmp);
|
||||
*len = RSTRING_LEN(tmp);
|
||||
++argI;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'z' :
|
||||
{
|
||||
if (argI >= argc)
|
||||
break;
|
||||
|
||||
const char **s = va_arg(ap, const char**);
|
||||
|
||||
VALUE tmp = *arg++;
|
||||
|
||||
if (!rb_type(tmp) == RUBY_T_STRING)
|
||||
rb_raise(rb_eTypeError, "Argument %d: Expected string", argI);
|
||||
|
||||
*s = RSTRING_PTR(tmp);
|
||||
++argI;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'f' :
|
||||
{
|
||||
if (argI >= argc)
|
||||
break;
|
||||
|
||||
double *f = va_arg(ap, double*);
|
||||
VALUE fVal = *arg++;
|
||||
|
||||
switch (rb_type(fVal))
|
||||
{
|
||||
case RUBY_T_FLOAT :
|
||||
*f = rb_float_value(fVal);
|
||||
break;
|
||||
|
||||
case RUBY_T_FIXNUM :
|
||||
*f = rb_fix2int(fVal);
|
||||
break;
|
||||
|
||||
default:
|
||||
rb_raise(rb_eTypeError, "Argument %d: Expected float", argI);
|
||||
}
|
||||
|
||||
++argI;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'i' :
|
||||
{
|
||||
if (argI >= argc)
|
||||
break;
|
||||
|
||||
int *i = va_arg(ap, int*);
|
||||
VALUE iVal = *arg++;
|
||||
|
||||
switch (rb_type(iVal))
|
||||
{
|
||||
case RUBY_T_FLOAT :
|
||||
// FIXME check int range?
|
||||
*i = rb_num2long(iVal);
|
||||
break;
|
||||
|
||||
case RUBY_T_FIXNUM :
|
||||
*i = rb_fix2int(iVal);
|
||||
break;
|
||||
|
||||
default:
|
||||
rb_raise(rb_eTypeError, "Argument %d: Expected fixnum", argI);
|
||||
}
|
||||
|
||||
++argI;
|
||||
break;
|
||||
}
|
||||
|
||||
case 'b' :
|
||||
{
|
||||
if (argI >= argc)
|
||||
break;
|
||||
|
||||
bool *b = va_arg(ap, bool*);
|
||||
VALUE bVal = *arg++;
|
||||
|
||||
switch (rb_type(bVal))
|
||||
{
|
||||
case RUBY_T_TRUE :
|
||||
*b = true;
|
||||
break;
|
||||
|
||||
case RUBY_T_FALSE :
|
||||
case RUBY_T_NIL :
|
||||
*b = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
rb_raise(rb_eTypeError, "Argument %d: Expected bool", argI);
|
||||
}
|
||||
|
||||
++argI;
|
||||
break;
|
||||
}
|
||||
|
||||
case '|' :
|
||||
opt = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
rb_raise(rb_eFatal, "invalid argument specifier %c", c);
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME print num of needed args vs provided
|
||||
if (!c && argc > argI)
|
||||
rb_raise(rb_eArgError, "wrong number of arguments");
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return argI;
|
||||
}
|
297
binding-mri/binding-util.h
Normal file
297
binding-mri/binding-util.h
Normal file
|
@ -0,0 +1,297 @@
|
|||
/*
|
||||
** binding-util.h
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef BINDING_UTIL_H
|
||||
#define BINDING_UTIL_H
|
||||
|
||||
#include "./ruby/ruby.h"
|
||||
|
||||
#define PRIV_IV "priv"
|
||||
|
||||
enum RbException
|
||||
{
|
||||
RGSS = 0,
|
||||
PHYSFS,
|
||||
SDL,
|
||||
|
||||
ErrnoENOENT,
|
||||
|
||||
IOError,
|
||||
|
||||
TypeError,
|
||||
ArgumentError,
|
||||
|
||||
RbExceptionsMax
|
||||
};
|
||||
|
||||
struct RbData
|
||||
{
|
||||
VALUE exc[RbExceptionsMax];
|
||||
|
||||
RbData();
|
||||
~RbData();
|
||||
};
|
||||
|
||||
RbData *getRbData();
|
||||
|
||||
struct Exception;
|
||||
|
||||
void
|
||||
raiseRbExc(const Exception &exc);
|
||||
|
||||
#define DECL_TYPE(Klass) \
|
||||
extern rb_data_type_struct Klass##Type
|
||||
|
||||
#define DEF_TYPE(Klass) \
|
||||
rb_data_type_struct Klass##Type
|
||||
|
||||
void initType(rb_data_type_struct &type,
|
||||
const char *name,
|
||||
void (*freeInst)(void*));
|
||||
|
||||
template<class C>
|
||||
static inline void freeInstance(void *inst)
|
||||
{
|
||||
delete static_cast<C*>(inst);
|
||||
}
|
||||
|
||||
#define INIT_TYPE(Klass) initType(Klass##Type, #Klass, freeInstance<Klass>)
|
||||
|
||||
template<class C>
|
||||
static inline C *
|
||||
getPrivateData(VALUE self)
|
||||
{
|
||||
VALUE priv = rb_iv_get(self, PRIV_IV);
|
||||
return static_cast<C*>(RTYPEDDATA_DATA(priv));
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static inline C *
|
||||
getPrivateDataCheck(VALUE self, const rb_data_type_struct &type)
|
||||
{
|
||||
VALUE priv = rb_iv_get(self, PRIV_IV);
|
||||
void *obj = rb_check_typeddata(priv, &type);
|
||||
return static_cast<C*>(obj);
|
||||
}
|
||||
|
||||
static inline void
|
||||
setPrivateData(VALUE self, void *p, const rb_data_type_struct &type)
|
||||
{
|
||||
VALUE priv = rb_data_typed_object_alloc(rb_cData, p, &type);
|
||||
rb_iv_set(self, PRIV_IV, priv);
|
||||
}
|
||||
|
||||
inline VALUE
|
||||
wrapObject(void *p, const rb_data_type_struct &type)
|
||||
{
|
||||
VALUE klass = rb_const_get(rb_cObject, rb_intern(type.wrap_struct_name));
|
||||
VALUE obj = rb_obj_alloc(klass);
|
||||
|
||||
setPrivateData(obj, p, type);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
inline VALUE
|
||||
wrapProperty(VALUE self, void *prop, const char *iv,
|
||||
const rb_data_type_struct &type)
|
||||
{
|
||||
VALUE propObj = wrapObject(prop, type);
|
||||
|
||||
rb_iv_set(self, iv, propObj);
|
||||
|
||||
return propObj;
|
||||
}
|
||||
|
||||
inline void
|
||||
wrapNilProperty(VALUE self, const char *iv)
|
||||
{
|
||||
rb_iv_set(self, iv, Qnil);
|
||||
}
|
||||
|
||||
/* Implemented: oSszfib| */
|
||||
int
|
||||
rb_get_args(int argc, VALUE *argv, const char *format, ...);
|
||||
|
||||
typedef VALUE (*RubyMethod)(int argc, VALUE *argv, VALUE self);
|
||||
|
||||
static inline void
|
||||
_rb_define_method(VALUE klass, const char *name, RubyMethod func)
|
||||
{
|
||||
rb_define_method(klass, name, RUBY_METHOD_FUNC(func), -1);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rb_define_class_method(VALUE klass, const char *name, RubyMethod func)
|
||||
{
|
||||
rb_define_singleton_method(klass, name, RUBY_METHOD_FUNC(func), -1);
|
||||
}
|
||||
|
||||
static inline void
|
||||
_rb_define_module_function(VALUE module, const char *name, RubyMethod func)
|
||||
{
|
||||
rb_define_module_function(module, name, RUBY_METHOD_FUNC(func), -1);
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static inline VALUE
|
||||
objectLoad(int argc, VALUE *argv, VALUE self, rb_data_type_struct &type)
|
||||
{
|
||||
const char *data;
|
||||
int dataLen;
|
||||
rb_get_args(argc, argv, "s", &data, &dataLen);
|
||||
|
||||
VALUE obj = rb_obj_alloc(self);
|
||||
|
||||
C *c = C::deserialize(data, dataLen);
|
||||
|
||||
setPrivateData(obj, c, type);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static inline VALUE
|
||||
rb_bool_new(bool value)
|
||||
{
|
||||
return value ? Qtrue : Qfalse;
|
||||
}
|
||||
|
||||
#define RB_METHOD(name) \
|
||||
static VALUE name(int argc, VALUE *argv, VALUE self)
|
||||
|
||||
#define RB_UNUSED_PARAM \
|
||||
{ (void) argc; (void) argv; (void) self; }
|
||||
|
||||
#define MARSH_LOAD_FUN(Typ) \
|
||||
RB_METHOD(Typ##Load) \
|
||||
{ \
|
||||
return objectLoad<Typ>(argc, argv, self, Typ##Type); \
|
||||
}
|
||||
|
||||
#define CLONE_FUNC(Klass) \
|
||||
static mrb_value \
|
||||
Klass##Clone(mrb_state *mrb, mrb_value self) \
|
||||
{ \
|
||||
Klass *k = getPrivateData<Klass>(mrb, self); \
|
||||
mrb_value dupObj = mrb_obj_clone(mrb, self); \
|
||||
Klass *dupK = new Klass(*k); \
|
||||
setPrivateData(mrb, dupObj, dupK, Klass##Type); \
|
||||
return dupObj; \
|
||||
}
|
||||
|
||||
#define CLONE_FUN(Klass) \
|
||||
RB_METHOD(Klass##Clone) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM \
|
||||
Klass *k = getPrivateData<Klass>(self); \
|
||||
VALUE dupObj = rb_obj_clone(self); \
|
||||
Klass *dupK = new Klass(*k); \
|
||||
setPrivateData(dupObj, dupK, Klass##Type); \
|
||||
return dupObj; \
|
||||
}
|
||||
|
||||
/* If we're not binding a disposable class,
|
||||
* we want to #undef DEF_PROP_CHK_DISP */
|
||||
#define DEF_PROP_CHK_DISP \
|
||||
checkDisposed(k, DISP_CLASS_NAME);
|
||||
|
||||
#define DEF_PROP_OBJ(Klass, PropKlass, PropName, prop_iv) \
|
||||
RB_METHOD(Klass##Get##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Klass *k = getPrivateData<Klass>(self); (void) k; \
|
||||
DEF_PROP_CHK_DISP \
|
||||
return rb_iv_get(self, prop_iv); \
|
||||
} \
|
||||
RB_METHOD(Klass##Set##PropName) \
|
||||
{ \
|
||||
Klass *k = getPrivateData<Klass>(self); \
|
||||
VALUE propObj; \
|
||||
PropKlass *prop; \
|
||||
rb_get_args(argc, argv, "o", &propObj); \
|
||||
prop = getPrivateDataCheck<PropKlass>(propObj, PropKlass##Type); \
|
||||
GUARD_EXC( k->set##PropName(prop); ) \
|
||||
rb_iv_set(self, prop_iv, propObj); \
|
||||
return propObj; \
|
||||
}
|
||||
|
||||
/* Object property with allowed NIL */
|
||||
#define DEF_PROP_OBJ_NIL(Klass, PropKlass, PropName, prop_iv) \
|
||||
RB_METHOD(Klass##Get##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Klass *k = getPrivateData<Klass>(self); (void) k; \
|
||||
DEF_PROP_CHK_DISP \
|
||||
return rb_iv_get(self, prop_iv); \
|
||||
} \
|
||||
RB_METHOD(Klass##Set##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Klass *k = getPrivateData<Klass>(self); \
|
||||
VALUE propObj; \
|
||||
PropKlass *prop; \
|
||||
rb_get_args(argc, argv, "o", &propObj); \
|
||||
if (rb_type(propObj) == RUBY_T_NIL) \
|
||||
prop = 0; \
|
||||
else \
|
||||
prop = getPrivateDataCheck<PropKlass>(propObj, PropKlass##Type); \
|
||||
GUARD_EXC( k->set##PropName(prop); ) \
|
||||
rb_iv_set(self, prop_iv, propObj); \
|
||||
return propObj; \
|
||||
}
|
||||
|
||||
#define DEF_PROP(Klass, type, PropName, param_t_s, value_fun) \
|
||||
RB_METHOD(Klass##Get##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Klass *k = getPrivateData<Klass>(self); \
|
||||
DEF_PROP_CHK_DISP \
|
||||
return value_fun(k->get##PropName()); \
|
||||
} \
|
||||
RB_METHOD(Klass##Set##PropName) \
|
||||
{ \
|
||||
Klass *k = getPrivateData<Klass>(self); \
|
||||
type value; \
|
||||
rb_get_args(argc, argv, param_t_s, &value); \
|
||||
GUARD_EXC( k->set##PropName(value); ) \
|
||||
return value_fun(value); \
|
||||
}
|
||||
|
||||
#define DEF_PROP_I(Klass, PropName) \
|
||||
DEF_PROP(Klass, int, PropName, "i", rb_fix_new)
|
||||
|
||||
#define DEF_PROP_F(Klass, PropName) \
|
||||
DEF_PROP(Klass, double, PropName, "f", rb_float_new)
|
||||
|
||||
#define DEF_PROP_B(Klass, PropName) \
|
||||
DEF_PROP(Klass, bool, PropName, "b", rb_bool_new)
|
||||
|
||||
#define INIT_PROP_BIND(Klass, PropName, prop_name_s) \
|
||||
{ \
|
||||
_rb_define_method(klass, prop_name_s, Klass##Get##PropName); \
|
||||
_rb_define_method(klass, prop_name_s "=", Klass##Set##PropName); \
|
||||
}
|
||||
|
||||
#define GUARD_EXC(exp) \
|
||||
{ try { exp } catch (const Exception &exc) { raiseRbExc(exc); } }
|
||||
|
||||
|
||||
#endif // BINDING_UTIL_H
|
324
binding-mri/bitmap-binding.cpp
Normal file
324
binding-mri/bitmap-binding.cpp
Normal file
|
@ -0,0 +1,324 @@
|
|||
/*
|
||||
** bitmap-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "bitmap.h"
|
||||
#include "font.h"
|
||||
#include "exception.h"
|
||||
#include "disposable-binding.h"
|
||||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
#define DISP_CLASS_NAME "bitmap"
|
||||
|
||||
DEF_TYPE(Bitmap);
|
||||
|
||||
RB_METHOD(bitmapInitialize)
|
||||
{
|
||||
Bitmap *b = 0;
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
char *filename;
|
||||
rb_get_args(argc, argv, "z", &filename);
|
||||
|
||||
GUARD_EXC( b = new Bitmap(filename); )
|
||||
}
|
||||
else
|
||||
{
|
||||
int width, height;
|
||||
rb_get_args(argc, argv, "ii", &width, &height);
|
||||
|
||||
b = new Bitmap(width, height);
|
||||
}
|
||||
|
||||
setPrivateData(self, b, BitmapType);
|
||||
|
||||
/* Wrap properties */
|
||||
Font *font = new Font();
|
||||
b->setFont(font);
|
||||
font->setColor(new Color(*font->getColor()));
|
||||
|
||||
VALUE fontProp = wrapProperty(self, font, "font", FontType);
|
||||
wrapProperty(fontProp, font->getColor(), "color", ColorType);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapWidth)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
int value = 0;
|
||||
GUARD_EXC( value = b->width(); );
|
||||
|
||||
return INT2FIX(value);
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapHeight)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
int value = 0;
|
||||
GUARD_EXC( value = b->height(); );
|
||||
|
||||
return INT2FIX(value);
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapRect)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
IntRect rect;
|
||||
GUARD_EXC( rect = b->rect(); );
|
||||
|
||||
Rect *r = new Rect(rect);
|
||||
|
||||
return wrapObject(r, RectType);
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapBlt)
|
||||
{
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
int x, y;
|
||||
VALUE srcObj;
|
||||
VALUE srcRectObj;
|
||||
int opacity = 255;
|
||||
|
||||
Bitmap *src;
|
||||
Rect *srcRect;
|
||||
|
||||
rb_get_args(argc, argv, "iioo|i", &x, &y, &srcObj, &srcRectObj, &opacity);
|
||||
|
||||
src = getPrivateDataCheck<Bitmap>(srcObj, BitmapType);
|
||||
srcRect = getPrivateDataCheck<Rect>(srcRectObj, RectType);
|
||||
|
||||
GUARD_EXC( b->blt(x, y, *src, srcRect->toIntRect(), opacity); );
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapStretchBlt)
|
||||
{
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
VALUE destRectObj;
|
||||
VALUE srcObj;
|
||||
VALUE srcRectObj;
|
||||
int opacity = 255;
|
||||
|
||||
Bitmap *src;
|
||||
Rect *destRect, *srcRect;
|
||||
|
||||
rb_get_args(argc, argv, "ooo|i", &destRectObj, &srcObj, &srcRectObj);
|
||||
|
||||
src = getPrivateDataCheck<Bitmap>(srcObj, BitmapType);
|
||||
destRect = getPrivateDataCheck<Rect>(destRectObj, RectType);
|
||||
srcRect = getPrivateDataCheck<Rect>(srcRectObj, RectType);
|
||||
|
||||
GUARD_EXC( b->stretchBlt(destRect->toIntRect(), *src, srcRect->toIntRect(), opacity); );
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapFillRect)
|
||||
{
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
VALUE colorObj;
|
||||
Color *color;
|
||||
|
||||
if (argc == 2)
|
||||
{
|
||||
VALUE rectObj;
|
||||
Rect *rect;
|
||||
|
||||
rb_get_args(argc, argv, "oo", &rectObj, &colorObj);
|
||||
|
||||
rect = getPrivateDataCheck<Rect>(rectObj, RectType);
|
||||
color = getPrivateDataCheck<Color>(colorObj, ColorType);
|
||||
|
||||
GUARD_EXC( b->fillRect(rect->toIntRect(), color->norm); );
|
||||
}
|
||||
else
|
||||
{
|
||||
int x, y, width, height;
|
||||
|
||||
rb_get_args(argc, argv, "iiiio", &x, &y, &width, &height, &colorObj);
|
||||
|
||||
color = getPrivateDataCheck<Color>(colorObj, ColorType);
|
||||
|
||||
GUARD_EXC( b->fillRect(x, y, width, height, color->norm); );
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapClear)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
GUARD_EXC( b->clear(); )
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapGetPixel)
|
||||
{
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
int x, y;
|
||||
|
||||
rb_get_args(argc, argv, "ii", &x, &y);
|
||||
|
||||
GUARD_EXC(
|
||||
if (x < 0 || y < 0 || x >= b->width() || y >= b->height())
|
||||
return Qnil;
|
||||
)
|
||||
|
||||
Vec4 value;
|
||||
GUARD_EXC( value = b->getPixel(x, y); );
|
||||
|
||||
Color *color = new Color(value);
|
||||
|
||||
return wrapObject(color, ColorType);
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapSetPixel)
|
||||
{
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
int x, y;
|
||||
VALUE colorObj;
|
||||
|
||||
Color *color;
|
||||
|
||||
rb_get_args(argc, argv, "iio", &x, &y, &colorObj);
|
||||
|
||||
color = getPrivateDataCheck<Color>(colorObj, ColorType);
|
||||
|
||||
GUARD_EXC( b->setPixel(x, y, color->norm); );
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapHueChange)
|
||||
{
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
int hue;
|
||||
|
||||
rb_get_args(argc, argv, "i", &hue);
|
||||
|
||||
GUARD_EXC( b->hueChange(hue); );
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapDrawText)
|
||||
{
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
const char *str;
|
||||
int align = Bitmap::Left;
|
||||
|
||||
if (argc == 2 || argc == 3)
|
||||
{
|
||||
VALUE rectObj;
|
||||
Rect *rect;
|
||||
|
||||
rb_get_args(argc, argv, "oz|i", &rectObj, &str, &align);
|
||||
|
||||
rect = getPrivateDataCheck<Rect>(rectObj, RectType);
|
||||
|
||||
GUARD_EXC( b->drawText(rect->toIntRect(), str, align); );
|
||||
}
|
||||
else
|
||||
{
|
||||
int x, y, width, height;
|
||||
|
||||
rb_get_args(argc, argv, "iiiiz|i", &x, &y, &width, &height, &str, &align);
|
||||
|
||||
GUARD_EXC( b->drawText(x, y, width, height, str, align); );
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(bitmapTextSize)
|
||||
{
|
||||
Bitmap *b = getPrivateData<Bitmap>(self);
|
||||
|
||||
const char *str;
|
||||
|
||||
rb_get_args(argc, argv, "z", &str);
|
||||
|
||||
IntRect value;
|
||||
GUARD_EXC( value = b->textSize(str); );
|
||||
|
||||
Rect *rect = new Rect(value);
|
||||
|
||||
return wrapObject(rect, RectType);
|
||||
}
|
||||
|
||||
DEF_PROP_OBJ(Bitmap, Font, Font, "font")
|
||||
|
||||
CLONE_FUN(Bitmap)
|
||||
|
||||
|
||||
void
|
||||
bitmapBindingInit()
|
||||
{
|
||||
INIT_TYPE(Bitmap);
|
||||
|
||||
VALUE klass = rb_define_class("Bitmap", rb_cObject);
|
||||
|
||||
disposableBindingInit<Bitmap>(klass);
|
||||
|
||||
_rb_define_method(klass, "initialize", bitmapInitialize);
|
||||
|
||||
_rb_define_method(klass, "width", bitmapWidth);
|
||||
_rb_define_method(klass, "height", bitmapHeight);
|
||||
_rb_define_method(klass, "rect", bitmapRect);
|
||||
_rb_define_method(klass, "blt", bitmapBlt);
|
||||
_rb_define_method(klass, "stretch_blt", bitmapStretchBlt);
|
||||
_rb_define_method(klass, "fill_rect", bitmapFillRect);
|
||||
_rb_define_method(klass, "clear", bitmapClear);
|
||||
_rb_define_method(klass, "get_pixel", bitmapGetPixel);
|
||||
_rb_define_method(klass, "set_pixel", bitmapSetPixel);
|
||||
_rb_define_method(klass, "hue_change", bitmapHueChange);
|
||||
_rb_define_method(klass, "draw_text", bitmapDrawText);
|
||||
_rb_define_method(klass, "text_size", bitmapTextSize);
|
||||
|
||||
INIT_PROP_BIND(Bitmap, Font, "font");
|
||||
|
||||
_rb_define_method(klass, "clone", BitmapClone);
|
||||
}
|
65
binding-mri/disposable-binding.h
Normal file
65
binding-mri/disposable-binding.h
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
** disposable-binding.h
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DISPOSABLEBINDING_H
|
||||
#define DISPOSABLEBINDING_H
|
||||
|
||||
#include "disposable.h"
|
||||
#include "binding-util.h"
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(disposableDispose)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Disposable *d = getPrivateData<C>(self);
|
||||
|
||||
d->dispose();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(disposableIsDisposed)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Disposable *d = getPrivateData<C>(self);
|
||||
|
||||
return rb_bool_new(d->isDisposed());
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static void disposableBindingInit(VALUE klass)
|
||||
{
|
||||
_rb_define_method(klass, "dispose", disposableDispose<C>);
|
||||
_rb_define_method(klass, "disposed?", disposableIsDisposed<C>);
|
||||
}
|
||||
|
||||
inline void checkDisposed(Disposable *d, const char *klassName)
|
||||
{
|
||||
RbData *data = getRbData(); (void) data;
|
||||
|
||||
if (d->isDisposed())
|
||||
rb_raise(getRbData()->exc[RGSS], "disposed %s", klassName);
|
||||
}
|
||||
|
||||
#endif // DISPOSABLEBINDING_H
|
204
binding-mri/etc-binding.cpp
Normal file
204
binding-mri/etc-binding.cpp
Normal file
|
@ -0,0 +1,204 @@
|
|||
/*
|
||||
** etc-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "etc.h"
|
||||
#include "binding-util.h"
|
||||
#include "serializable-binding.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
DEF_TYPE(Color);
|
||||
DEF_TYPE(Tone);
|
||||
DEF_TYPE(Rect);
|
||||
|
||||
#define ATTR_RW(Klass, Attr, arg_type, arg_t_s, value_fun) \
|
||||
RB_METHOD(Klass##Get##Attr) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM \
|
||||
Klass *p = getPrivateData<Klass>(self); \
|
||||
return value_fun(p->get##Attr()); \
|
||||
} \
|
||||
RB_METHOD(Klass##Set##Attr) \
|
||||
{ \
|
||||
Klass *p = getPrivateData<Klass>(self); \
|
||||
arg_type arg; \
|
||||
rb_get_args(argc, argv, arg_t_s, &arg); \
|
||||
p->set##Attr(arg); \
|
||||
return *argv; \
|
||||
}
|
||||
|
||||
#define ATTR_DOUBLE_RW(Klass, Attr) ATTR_RW(Klass, Attr, double, "f", rb_float_new)
|
||||
#define ATTR_INT_RW(Klass, Attr) ATTR_RW(Klass, Attr, int, "i", rb_fix_new)
|
||||
|
||||
ATTR_DOUBLE_RW(Color, Red)
|
||||
ATTR_DOUBLE_RW(Color, Green)
|
||||
ATTR_DOUBLE_RW(Color, Blue)
|
||||
ATTR_DOUBLE_RW(Color, Alpha)
|
||||
|
||||
ATTR_DOUBLE_RW(Tone, Red)
|
||||
ATTR_DOUBLE_RW(Tone, Green)
|
||||
ATTR_DOUBLE_RW(Tone, Blue)
|
||||
ATTR_DOUBLE_RW(Tone, Gray)
|
||||
|
||||
ATTR_INT_RW(Rect, X)
|
||||
ATTR_INT_RW(Rect, Y)
|
||||
ATTR_INT_RW(Rect, Width)
|
||||
ATTR_INT_RW(Rect, Height)
|
||||
|
||||
#define EQUAL_FUN(Klass) \
|
||||
RB_METHOD(Klass##Equal) \
|
||||
{ \
|
||||
Klass *p = getPrivateData<Klass>(self); \
|
||||
VALUE otherObj; \
|
||||
Klass *other; \
|
||||
rb_get_args(argc, argv, "o", &otherObj); \
|
||||
other = getPrivateDataCheck<Klass>(otherObj, Klass##Type); \
|
||||
return rb_bool_new(*p == *other); \
|
||||
}
|
||||
|
||||
EQUAL_FUN(Color)
|
||||
EQUAL_FUN(Tone)
|
||||
EQUAL_FUN(Rect)
|
||||
|
||||
#define INIT_FUN(Klass, param_type, param_t_s, last_param_def) \
|
||||
RB_METHOD(Klass##Initialize) \
|
||||
{ \
|
||||
param_type p1, p2, p3, p4 = last_param_def; \
|
||||
rb_get_args(argc, argv, param_t_s, &p1, &p2, &p3, &p4); \
|
||||
Klass *k = new Klass(p1, p2, p3, p4); \
|
||||
setPrivateData(self, k, Klass##Type); \
|
||||
return self; \
|
||||
}
|
||||
|
||||
INIT_FUN(Color, double, "fff|f", 255)
|
||||
INIT_FUN(Tone, double, "fff|f", 0)
|
||||
INIT_FUN(Rect, int, "iiii", 0)
|
||||
|
||||
#define SET_FUN(Klass, param_type, param_t_s, last_param_def) \
|
||||
RB_METHOD(Klass##Set) \
|
||||
{ \
|
||||
param_type p1, p2, p3, p4 = last_param_def; \
|
||||
rb_get_args(argc, argv, param_t_s, &p1, &p2, &p3, &p4); \
|
||||
Klass *k = getPrivateData<Klass>(self); \
|
||||
k->set(p1, p2, p3, p4); \
|
||||
return self; \
|
||||
}
|
||||
|
||||
SET_FUN(Color, double, "fff|f", 255)
|
||||
SET_FUN(Tone, double, "fff|f", 0)
|
||||
SET_FUN(Rect, int, "iiii", 0)
|
||||
|
||||
RB_METHOD(rectEmpty)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
Rect *r = getPrivateData<Rect>(self);
|
||||
r->empty();
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(ColorStringify)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Color *c = getPrivateData<Color>(self);
|
||||
|
||||
return rb_sprintf("(%f, %f, %f, %f)",
|
||||
c->red, c->green, c->blue, c->alpha);
|
||||
}
|
||||
|
||||
RB_METHOD(ToneStringify)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Tone *t = getPrivateData<Tone>(self);
|
||||
|
||||
return rb_sprintf("(%f, %f, %f, %f)",
|
||||
t->red, t->green, t->blue, t->gray);
|
||||
}
|
||||
|
||||
RB_METHOD(RectStringify)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Rect *r = getPrivateData<Rect>(self);
|
||||
|
||||
return rb_sprintf("(%d, %d, %d, %d)",
|
||||
r->x, r->y, r->width, r->height);
|
||||
}
|
||||
|
||||
MARSH_LOAD_FUN(Color)
|
||||
MARSH_LOAD_FUN(Tone)
|
||||
MARSH_LOAD_FUN(Rect)
|
||||
|
||||
CLONE_FUN(Tone)
|
||||
CLONE_FUN(Color)
|
||||
CLONE_FUN(Rect)
|
||||
|
||||
#define INIT_BIND(Klass) \
|
||||
{ \
|
||||
INIT_TYPE(Klass); \
|
||||
klass = rb_define_class(#Klass, rb_cObject); \
|
||||
rb_define_class_method(klass, "_load", Klass##Load); \
|
||||
serializableBindingInit<Klass>(klass); \
|
||||
_rb_define_method(klass, "initialize", Klass##Initialize); \
|
||||
_rb_define_method(klass, "set", Klass##Set); \
|
||||
_rb_define_method(klass, "clone", Klass##Clone); \
|
||||
_rb_define_method(klass, "==", Klass##Equal); \
|
||||
_rb_define_method(klass, "to_s", Klass##Stringify); \
|
||||
_rb_define_method(klass, "inspect", Klass##Stringify); \
|
||||
}
|
||||
|
||||
#define MRB_ATTR_R(Class, attr) mrb_define_method(mrb, klass, #attr, Class##Get_##attr, MRB_ARGS_NONE())
|
||||
#define MRB_ATTR_W(Class, attr) mrb_define_method(mrb, klass, #attr "=", Class##Set_##attr, MRB_ARGS_REQ(1))
|
||||
#define MRB_ATTR_RW(Class, attr) { MRB_ATTR_R(Class, attr); MRB_ATTR_W(Class, attr); }
|
||||
|
||||
#define RB_ATTR_R(Klass, Attr, attr) _rb_define_method(klass, #attr, Klass##Get##Attr)
|
||||
#define RB_ATTR_W(Klass, Attr, attr) _rb_define_method(klass, #attr "=", Klass##Set##Attr)
|
||||
#define RB_ATTR_RW(Klass, Attr, attr) \
|
||||
{ RB_ATTR_R(Klass, Attr, attr); RB_ATTR_W(Klass, Attr, attr); }
|
||||
|
||||
void
|
||||
etcBindingInit()
|
||||
{
|
||||
VALUE klass;
|
||||
|
||||
INIT_BIND(Color);
|
||||
|
||||
RB_ATTR_RW(Color, Red, red);
|
||||
RB_ATTR_RW(Color, Green, green);
|
||||
RB_ATTR_RW(Color, Blue, blue);
|
||||
RB_ATTR_RW(Color, Alpha, alpha);
|
||||
|
||||
INIT_BIND(Tone);
|
||||
|
||||
RB_ATTR_RW(Tone, Red, red);
|
||||
RB_ATTR_RW(Tone, Green, green);
|
||||
RB_ATTR_RW(Tone, Blue, blue);
|
||||
RB_ATTR_RW(Tone, Gray, gray);
|
||||
|
||||
INIT_BIND(Rect);
|
||||
|
||||
RB_ATTR_RW(Rect, X, x);
|
||||
RB_ATTR_RW(Rect, Y, y);
|
||||
RB_ATTR_RW(Rect, Width, width);
|
||||
RB_ATTR_RW(Rect, Height, height);
|
||||
_rb_define_method(klass, "empty", rectEmpty);
|
||||
}
|
173
binding-mri/filesystem-binding.cpp
Normal file
173
binding-mri/filesystem-binding.cpp
Normal file
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
** filesystem-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "binding-util.h"
|
||||
|
||||
#include "globalstate.h"
|
||||
#include "filesystem.h"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
DEF_TYPE(FileInt);
|
||||
|
||||
static VALUE
|
||||
fileIntForPath(const char *path)
|
||||
{
|
||||
SDL_RWops *ops = SDL_AllocRW();
|
||||
gState->fileSystem().openRead(*ops, path);
|
||||
|
||||
VALUE klass = rb_const_get(rb_cObject, rb_intern("FileInt"));
|
||||
|
||||
VALUE obj = rb_obj_alloc(klass);
|
||||
|
||||
setPrivateData(obj, ops, FileIntType);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
RB_METHOD(fileIntRead)
|
||||
{
|
||||
|
||||
int length = -1;
|
||||
rb_get_args(argc, argv, "i", &length);
|
||||
|
||||
SDL_RWops *ops = getPrivateData<SDL_RWops>(self);
|
||||
|
||||
if (length == -1)
|
||||
{
|
||||
Sint64 cur = SDL_RWtell(ops);
|
||||
Sint64 end = SDL_RWseek(ops, 0, SEEK_END);
|
||||
length = end - cur;
|
||||
SDL_RWseek(ops, cur, SEEK_SET);
|
||||
}
|
||||
|
||||
if (length == 0)
|
||||
return Qnil;
|
||||
|
||||
VALUE data = rb_str_new(0, length);
|
||||
|
||||
SDL_RWread(ops, RSTRING_PTR(data), 1, length);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
RB_METHOD(fileIntClose)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
SDL_RWops *ops = getPrivateData<SDL_RWops>(self);
|
||||
SDL_RWclose(ops);
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
RB_METHOD(fileIntGetByte)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
SDL_RWops *ops = getPrivateData<SDL_RWops>(self);
|
||||
|
||||
unsigned char byte;
|
||||
size_t result = SDL_RWread(ops, &byte, 1, 1);
|
||||
|
||||
return (result == 1) ? rb_fix_new(byte) : Qnil;
|
||||
}
|
||||
|
||||
RB_METHOD(fileIntBinmode)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static void
|
||||
fileIntFreeInstance(void *inst)
|
||||
{
|
||||
SDL_RWops *ops = static_cast<SDL_RWops*>(inst);
|
||||
|
||||
SDL_RWclose(ops);
|
||||
SDL_FreeRW(ops);
|
||||
}
|
||||
|
||||
VALUE
|
||||
kernelLoadDataInt(const char *filename)
|
||||
{
|
||||
rb_gc_start();
|
||||
|
||||
VALUE port = fileIntForPath(filename);
|
||||
|
||||
VALUE marsh = rb_const_get(rb_cObject, rb_intern("Marshal"));
|
||||
|
||||
VALUE result = rb_funcall(marsh, rb_intern("load"), 1, port);
|
||||
|
||||
rb_funcall(port, rb_intern("close"), 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
RB_METHOD(kernelLoadData)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
const char *filename;
|
||||
rb_get_args(argc, argv, "z", &filename);
|
||||
|
||||
return kernelLoadDataInt(filename);
|
||||
}
|
||||
|
||||
RB_METHOD(kernelSaveData)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
VALUE obj;
|
||||
VALUE filename;
|
||||
|
||||
rb_get_args(argc, argv, "oS", &obj, &filename);
|
||||
|
||||
VALUE file = rb_funcall(rb_cFile, rb_intern("open"), 2, filename, rb_str_new_cstr("w"));
|
||||
|
||||
VALUE marsh = rb_const_get(rb_cObject, rb_intern("Marshal"));
|
||||
|
||||
rb_funcall(marsh, rb_intern("dump"), 2, obj, file);
|
||||
|
||||
rb_funcall(file, rb_intern("close"), 0);
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
void
|
||||
fileIntBindingInit()
|
||||
{
|
||||
initType(FileIntType, "FileInt", fileIntFreeInstance);
|
||||
|
||||
VALUE klass = rb_define_class("FileInt", rb_cIO);
|
||||
|
||||
_rb_define_method(klass, "read", fileIntRead);
|
||||
// _rb_define_method(klass, "eof?", fileIntIsEof);
|
||||
// _rb_define_method(klass, "pos", fileIntGetPos);
|
||||
// _rb_define_method(klass, "pos=", fileIntSetPos);
|
||||
_rb_define_method(klass, "getbyte", fileIntGetByte);
|
||||
_rb_define_method(klass, "binmode", fileIntBinmode);
|
||||
_rb_define_method(klass, "close", fileIntClose);
|
||||
|
||||
_rb_define_module_function(rb_mKernel, "load_data", kernelLoadData);
|
||||
_rb_define_module_function(rb_mKernel, "save_data", kernelSaveData);
|
||||
}
|
73
binding-mri/flashable-binding.h
Normal file
73
binding-mri/flashable-binding.h
Normal file
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
** flashable-binding.h
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef FLASHABLEBINDING_H
|
||||
#define FLASHABLEBINDING_H
|
||||
|
||||
#include "flashable.h"
|
||||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(flashableFlash)
|
||||
{
|
||||
Flashable *f = getPrivateData<C>(self);
|
||||
|
||||
VALUE colorObj;
|
||||
int duration;
|
||||
|
||||
Color *color;
|
||||
|
||||
rb_get_args(argc, argv, "oi", &colorObj, &duration);
|
||||
|
||||
if (rb_type(colorObj) == RUBY_T_NIL)
|
||||
{
|
||||
f->flash(0, duration);
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
color = getPrivateDataCheck<Color>(colorObj, ColorType);
|
||||
|
||||
f->flash(&color->norm, duration);
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(flashableUpdate)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Flashable *f = getPrivateData<C>(self);
|
||||
|
||||
f->update();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static void flashableBindingInit(VALUE klass)
|
||||
{
|
||||
_rb_define_method(klass, "flash", flashableFlash<C>);
|
||||
_rb_define_method(klass, "update", flashableUpdate<C>);
|
||||
}
|
||||
|
||||
#endif // FLASHABLEBINDING_H
|
173
binding-mri/font-binding.cpp
Normal file
173
binding-mri/font-binding.cpp
Normal file
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
** font-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "font.h"
|
||||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
#include "exception.h"
|
||||
|
||||
DEF_TYPE(Font);
|
||||
|
||||
RB_METHOD(fontDoesExist)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
const char *name;
|
||||
rb_get_args(argc, argv, "z", &name);
|
||||
|
||||
return rb_bool_new(Font::doesExist(name));
|
||||
}
|
||||
|
||||
RB_METHOD(fontInitialize)
|
||||
{
|
||||
const char *name = 0;
|
||||
int size = 0;
|
||||
|
||||
rb_get_args(argc, argv, "|zi", &name, &size);
|
||||
|
||||
Font *f = new Font(name, size);
|
||||
|
||||
setPrivateData(self, f, FontType);
|
||||
|
||||
/* Wrap property objects */
|
||||
f->setColor(new Color(*f->getColor()));
|
||||
wrapProperty(self, f->getColor(), "color", ColorType);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(FontGetName)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Font *f = getPrivateData<Font>(self);
|
||||
|
||||
return rb_str_new_cstr(f->getName());
|
||||
}
|
||||
|
||||
RB_METHOD(FontSetName)
|
||||
{
|
||||
Font *f = getPrivateData<Font>(self);
|
||||
|
||||
VALUE name;
|
||||
rb_get_args(argc, argv, "S", &name);
|
||||
|
||||
f->setName(RSTRING_PTR(name));
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
#undef DEF_PROP_CHK_DISP
|
||||
#define DEF_PROP_CHK_DISP
|
||||
|
||||
DEF_PROP_I(Font, Size)
|
||||
DEF_PROP_B(Font, Bold)
|
||||
DEF_PROP_B(Font, Italic)
|
||||
DEF_PROP_OBJ(Font, Color, Color, "color")
|
||||
|
||||
#define DEF_KLASS_PROP(Klass, type, PropName, param_t_s, value_fun) \
|
||||
RB_METHOD(Klass##Get##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
return value_fun(Klass::get##PropName()); \
|
||||
} \
|
||||
RB_METHOD(Klass##Set##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
type value; \
|
||||
rb_get_args(argc, argv, param_t_s, &value); \
|
||||
Klass::set##PropName(value); \
|
||||
return value_fun(value); \
|
||||
}
|
||||
|
||||
DEF_KLASS_PROP(Font, int, DefaultSize, "i", rb_fix_new)
|
||||
DEF_KLASS_PROP(Font, bool, DefaultBold, "b", rb_bool_new)
|
||||
DEF_KLASS_PROP(Font, bool, DefaultItalic, "b", rb_bool_new)
|
||||
|
||||
RB_METHOD(FontGetDefaultName)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
return rb_str_new_cstr(Font::getDefaultName());
|
||||
}
|
||||
|
||||
RB_METHOD(FontSetDefaultName)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
VALUE nameObj;
|
||||
rb_get_args(argc, argv, "S", &nameObj);
|
||||
|
||||
Font::setDefaultName(RSTRING_PTR(nameObj));
|
||||
|
||||
return nameObj;
|
||||
}
|
||||
|
||||
RB_METHOD(FontGetDefaultColor)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
return rb_iv_get(self, "default_color");
|
||||
}
|
||||
|
||||
|
||||
RB_METHOD(FontSetDefaultColor)
|
||||
{
|
||||
VALUE colorObj;
|
||||
rb_get_args(argc, argv, "o", &colorObj);
|
||||
|
||||
Color *c = getPrivateDataCheck<Color>(colorObj, ColorType);
|
||||
|
||||
Font::setDefaultColor(c);
|
||||
rb_iv_set(self, "default_color", colorObj);
|
||||
|
||||
return colorObj;
|
||||
}
|
||||
|
||||
#define INIT_KLASS_PROP_BIND(Klass, PropName, prop_name_s) \
|
||||
{ \
|
||||
rb_define_class_method(klass, prop_name_s, Klass##Get##PropName); \
|
||||
rb_define_class_method(klass, prop_name_s "=", Klass##Set##PropName); \
|
||||
}
|
||||
|
||||
void
|
||||
fontBindingInit()
|
||||
{
|
||||
INIT_TYPE(Font);
|
||||
|
||||
VALUE klass = rb_define_class("Font", rb_cObject);
|
||||
|
||||
Font::setDefaultColor(new Color(*Font::getDefaultColor()));
|
||||
wrapProperty(klass, Font::getDefaultColor(), "default_color", ColorType);
|
||||
|
||||
INIT_KLASS_PROP_BIND(Font, DefaultName, "default_name");
|
||||
INIT_KLASS_PROP_BIND(Font, DefaultSize, "default_size");
|
||||
INIT_KLASS_PROP_BIND(Font, DefaultBold, "default_bold");
|
||||
INIT_KLASS_PROP_BIND(Font, DefaultItalic, "default_italic");
|
||||
INIT_KLASS_PROP_BIND(Font, DefaultColor, "default_color");
|
||||
|
||||
rb_define_class_method(klass, "exist?", fontDoesExist);
|
||||
|
||||
_rb_define_method(klass, "initialize", fontInitialize);
|
||||
|
||||
INIT_PROP_BIND(Font, Name, "name");
|
||||
INIT_PROP_BIND(Font, Size, "size");
|
||||
INIT_PROP_BIND(Font, Bold, "bold");
|
||||
INIT_PROP_BIND(Font, Italic, "italic");
|
||||
INIT_PROP_BIND(Font, Color, "color");
|
||||
}
|
124
binding-mri/graphics-binding.cpp
Normal file
124
binding-mri/graphics-binding.cpp
Normal file
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
** graphics-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "graphics.h"
|
||||
#include "globalstate.h"
|
||||
#include "binding-util.h"
|
||||
#include "exception.h"
|
||||
|
||||
RB_METHOD(graphicsUpdate)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
gState->graphics().update();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
RB_METHOD(graphicsFreeze)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
gState->graphics().freeze();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
RB_METHOD(graphicsTransition)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
int duration = 8;
|
||||
const char *filename = 0;
|
||||
int vague = 40;
|
||||
|
||||
rb_get_args(argc, argv, "|izi", &duration, &filename, &vague);
|
||||
|
||||
GUARD_EXC( gState->graphics().transition(duration, filename, vague); )
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
RB_METHOD(graphicsFrameReset)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
gState->graphics().frameReset();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
#define DEF_GRA_PROP_I(PropName) \
|
||||
RB_METHOD(graphics##Get##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
return rb_fix_new(gState->graphics().get##PropName()); \
|
||||
} \
|
||||
RB_METHOD(graphics##Set##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
int value; \
|
||||
rb_get_args(argc, argv, "i", &value); \
|
||||
gState->graphics().set##PropName(value); \
|
||||
return rb_fix_new(value); \
|
||||
}
|
||||
|
||||
DEF_GRA_PROP_I(FrameRate)
|
||||
DEF_GRA_PROP_I(FrameCount)
|
||||
|
||||
RB_METHOD(graphicsGetFullscreen)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
return rb_bool_new(gState->graphics().getFullscreen());
|
||||
}
|
||||
|
||||
RB_METHOD(graphicsSetFullscreen)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
bool mode;
|
||||
rb_get_args(argc, argv, "b", &mode);
|
||||
|
||||
gState->graphics().setFullscreen(mode);
|
||||
|
||||
return rb_bool_new(mode);
|
||||
}
|
||||
|
||||
#define INIT_GRA_PROP_BIND(PropName, prop_name_s) \
|
||||
{ \
|
||||
_rb_define_module_function(module, prop_name_s, graphics##Get##PropName); \
|
||||
_rb_define_module_function(module, prop_name_s "=", graphics##Set##PropName); \
|
||||
}
|
||||
|
||||
void graphicsBindingInit()
|
||||
{
|
||||
VALUE module = rb_define_module("Graphics");
|
||||
|
||||
_rb_define_module_function(module, "update", graphicsUpdate);
|
||||
_rb_define_module_function(module, "freeze", graphicsFreeze);
|
||||
_rb_define_module_function(module, "transition", graphicsTransition);
|
||||
_rb_define_module_function(module, "frame_reset", graphicsFrameReset);
|
||||
|
||||
INIT_GRA_PROP_BIND( FrameRate, "frame_rate" );
|
||||
INIT_GRA_PROP_BIND( FrameCount, "frame_count" );
|
||||
|
||||
INIT_GRA_PROP_BIND( Fullscreen, "fullscreen" );
|
||||
}
|
146
binding-mri/input-binding.cpp
Normal file
146
binding-mri/input-binding.cpp
Normal file
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
** input-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "input.h"
|
||||
#include "globalstate.h"
|
||||
#include "exception.h"
|
||||
#include "binding-util.h"
|
||||
|
||||
RB_METHOD(inputUpdate)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
gState->input().update();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
RB_METHOD(inputPress)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
int num;
|
||||
rb_get_args(argc, argv, "i", &num);
|
||||
|
||||
Input::ButtonCode bc = (Input::ButtonCode) num;
|
||||
|
||||
return rb_bool_new(gState->input().isPressed(bc));
|
||||
}
|
||||
|
||||
RB_METHOD(inputTrigger)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
int num;
|
||||
rb_get_args(argc, argv, "i", &num);
|
||||
|
||||
Input::ButtonCode bc = (Input::ButtonCode) num;
|
||||
|
||||
return rb_bool_new(gState->input().isTriggered(bc));
|
||||
}
|
||||
|
||||
RB_METHOD(inputRepeat)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
int num;
|
||||
rb_get_args(argc, argv, "i", &num);
|
||||
|
||||
Input::ButtonCode bc = (Input::ButtonCode) num;
|
||||
|
||||
return rb_bool_new(gState->input().isRepeated(bc));
|
||||
}
|
||||
|
||||
RB_METHOD(inputDir4)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return rb_fix_new(gState->input().dir4Value());
|
||||
}
|
||||
|
||||
RB_METHOD(inputDir8)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return rb_fix_new(gState->input().dir8Value());
|
||||
}
|
||||
|
||||
/* Non-standard extensions */
|
||||
RB_METHOD(inputMouseX)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return rb_fix_new(gState->input().mouseX());
|
||||
}
|
||||
|
||||
RB_METHOD(inputMouseY)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return rb_fix_new(gState->input().mouseY());
|
||||
}
|
||||
|
||||
#define DEF_CONST_I(name, value) \
|
||||
rb_const_set(module, rb_intern(name), rb_fix_new(value))
|
||||
|
||||
void
|
||||
inputBindingInit()
|
||||
{
|
||||
VALUE module = rb_define_module("Input");
|
||||
|
||||
_rb_define_module_function(module, "update", inputUpdate);
|
||||
_rb_define_module_function(module, "press?", inputPress);
|
||||
_rb_define_module_function(module, "trigger?", inputTrigger);
|
||||
_rb_define_module_function(module, "repeat?", inputRepeat);
|
||||
_rb_define_module_function(module, "dir4", inputDir4);
|
||||
_rb_define_module_function(module, "dir8", inputDir8);
|
||||
|
||||
DEF_CONST_I("DOWN", Input::Down );
|
||||
DEF_CONST_I("LEFT", Input::Left );
|
||||
DEF_CONST_I("RIGHT", Input::Right);
|
||||
DEF_CONST_I("UP", Input::Up );
|
||||
|
||||
DEF_CONST_I("A", Input::A );
|
||||
DEF_CONST_I("B", Input::B );
|
||||
DEF_CONST_I("C", Input::C );
|
||||
DEF_CONST_I("X", Input::X );
|
||||
DEF_CONST_I("Y", Input::Y );
|
||||
DEF_CONST_I("Z", Input::Z );
|
||||
DEF_CONST_I("L", Input::L );
|
||||
DEF_CONST_I("R", Input::R );
|
||||
|
||||
DEF_CONST_I("SHIFT", Input::Shift);
|
||||
DEF_CONST_I("CTRL", Input::Ctrl );
|
||||
DEF_CONST_I("ALT", Input::Alt );
|
||||
|
||||
DEF_CONST_I("F5", Input::F5 );
|
||||
DEF_CONST_I("F6", Input::F6 );
|
||||
DEF_CONST_I("F7", Input::F7 );
|
||||
DEF_CONST_I("F8", Input::F8 );
|
||||
DEF_CONST_I("F9", Input::F9 );
|
||||
|
||||
_rb_define_module_function(module, "mouse_x", inputMouseX);
|
||||
_rb_define_module_function(module, "mouse_y", inputMouseY);
|
||||
|
||||
DEF_CONST_I("MOUSELEFT", Input::MouseLeft );
|
||||
DEF_CONST_I("MOUSEMIDDLE", Input::MouseMiddle);
|
||||
DEF_CONST_I("MOUSERIGHT", Input::MouseRight );
|
||||
}
|
1
binding-mri/module_rpg.cpp
Normal file
1
binding-mri/module_rpg.cpp
Normal file
|
@ -0,0 +1 @@
|
|||
#include "module_rpg.rb.xxd"
|
2407
binding-mri/module_rpg.rb.xxd
Normal file
2407
binding-mri/module_rpg.rb.xxd
Normal file
File diff suppressed because it is too large
Load diff
82
binding-mri/plane-binding.cpp
Normal file
82
binding-mri/plane-binding.cpp
Normal file
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
** plane-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "plane.h"
|
||||
#include "disposable-binding.h"
|
||||
#include "viewportelement-binding.h"
|
||||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
|
||||
DEF_TYPE(Plane);
|
||||
|
||||
RB_METHOD(planeInitialize)
|
||||
{
|
||||
Plane *p = viewportElementInitialize<Plane>(argc, argv, self);
|
||||
|
||||
setPrivateData(self, p, PlaneType);
|
||||
|
||||
p->setColor(new Color);
|
||||
p->setTone(new Tone);
|
||||
|
||||
wrapNilProperty(self, "bitmap");
|
||||
wrapProperty(self, p->getColor(), "color", ColorType);
|
||||
wrapProperty(self, p->getTone(), "tone", ToneType);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
#define DISP_CLASS_NAME "plane"
|
||||
|
||||
DEF_PROP_OBJ(Plane, Bitmap, Bitmap, "bitmap")
|
||||
DEF_PROP_OBJ(Plane, Color, Color, "color")
|
||||
DEF_PROP_OBJ(Plane, Tone, Tone, "tone")
|
||||
|
||||
DEF_PROP_I(Plane, OX)
|
||||
DEF_PROP_I(Plane, OY)
|
||||
DEF_PROP_I(Plane, Opacity)
|
||||
DEF_PROP_I(Plane, BlendType)
|
||||
|
||||
DEF_PROP_F(Plane, ZoomX)
|
||||
DEF_PROP_F(Plane, ZoomY)
|
||||
|
||||
|
||||
void
|
||||
planeBindingInit()
|
||||
{
|
||||
INIT_TYPE(Plane);
|
||||
|
||||
VALUE klass = rb_define_class("Plane", rb_cObject);
|
||||
|
||||
disposableBindingInit<Plane> (klass);
|
||||
viewportElementBindingInit<Plane>(klass);
|
||||
|
||||
_rb_define_method(klass, "initialize", planeInitialize);
|
||||
|
||||
INIT_PROP_BIND( Plane, Bitmap, "bitmap" );
|
||||
INIT_PROP_BIND( Plane, OX, "ox" );
|
||||
INIT_PROP_BIND( Plane, OY, "oy" );
|
||||
INIT_PROP_BIND( Plane, ZoomX, "zoom_x" );
|
||||
INIT_PROP_BIND( Plane, ZoomY, "zoom_y" );
|
||||
INIT_PROP_BIND( Plane, Opacity, "opacity" );
|
||||
INIT_PROP_BIND( Plane, BlendType, "blend_type" );
|
||||
INIT_PROP_BIND( Plane, Color, "color" );
|
||||
INIT_PROP_BIND( Plane, Tone, "tone" );
|
||||
}
|
90
binding-mri/sceneelement-binding.h
Normal file
90
binding-mri/sceneelement-binding.h
Normal file
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
** sceneelement-binding.h
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef SCENEELEMENTBINDING_H
|
||||
#define SCENEELEMENTBINDING_H
|
||||
|
||||
#include "scene.h"
|
||||
#include "binding-util.h"
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(sceneElementGetZ)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
SceneElement *se = getPrivateData<C>(self);
|
||||
|
||||
int value = 0;
|
||||
GUARD_EXC( value = se->getZ(); );
|
||||
|
||||
return rb_fix_new(value);
|
||||
}
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(sceneElementSetZ)
|
||||
{
|
||||
SceneElement *se = getPrivateData<C>(self);
|
||||
|
||||
int z;
|
||||
rb_get_args(argc, argv, "i", &z);
|
||||
|
||||
GUARD_EXC( se->setZ(z); );
|
||||
|
||||
return rb_fix_new(z);
|
||||
}
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(sceneElementGetVisible)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
SceneElement *se = getPrivateData<C>(self);
|
||||
|
||||
bool value = false;
|
||||
GUARD_EXC( value = se->getVisible(); );
|
||||
|
||||
return rb_bool_new(value);
|
||||
}
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(sceneElementSetVisible)
|
||||
{
|
||||
SceneElement *se = getPrivateData<C>(self);
|
||||
|
||||
bool visible;
|
||||
rb_get_args(argc, argv, "b", &visible);
|
||||
|
||||
GUARD_EXC( se->setVisible(visible); );
|
||||
|
||||
return rb_bool_new(visible);
|
||||
}
|
||||
|
||||
template<class C>
|
||||
void
|
||||
sceneElementBindingInit(VALUE klass)
|
||||
{
|
||||
_rb_define_method(klass, "z", sceneElementGetZ<C>);
|
||||
_rb_define_method(klass, "z=", sceneElementSetZ<C>);
|
||||
_rb_define_method(klass, "visible", sceneElementGetVisible<C>);
|
||||
_rb_define_method(klass, "visible=", sceneElementSetVisible<C>);
|
||||
}
|
||||
|
||||
#endif // SCENEELEMENTBINDING_H
|
51
binding-mri/serializable-binding.h
Normal file
51
binding-mri/serializable-binding.h
Normal file
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
** serializable-binding.h
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef SERIALIZABLEBINDING_H
|
||||
#define SERIALIZABLEBINDING_H
|
||||
|
||||
#include "serializable.h"
|
||||
#include "binding-util.h"
|
||||
#include "exception.h"
|
||||
|
||||
template<class C>
|
||||
static VALUE
|
||||
serializableDump(int, VALUE *, VALUE self)
|
||||
{
|
||||
Serializable *s = getPrivateData<C>(self);
|
||||
|
||||
int dataSize = s->serialSize();
|
||||
|
||||
VALUE data = rb_str_new(0, dataSize);
|
||||
|
||||
GUARD_EXC( s->serialize(RSTRING_PTR(data)); );
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
template<class C>
|
||||
void
|
||||
serializableBindingInit(VALUE klass)
|
||||
{
|
||||
_rb_define_method(klass, "_dump", serializableDump<C>);
|
||||
}
|
||||
|
||||
#endif // SERIALIZABLEBINDING_H
|
100
binding-mri/sprite-binding.cpp
Normal file
100
binding-mri/sprite-binding.cpp
Normal file
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
** sprite-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "sprite.h"
|
||||
#include "disposable-binding.h"
|
||||
#include "flashable-binding.h"
|
||||
#include "sceneelement-binding.h"
|
||||
#include "viewportelement-binding.h"
|
||||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
|
||||
DEF_TYPE(Sprite);
|
||||
|
||||
RB_METHOD(spriteInitialize)
|
||||
{
|
||||
Sprite *s = viewportElementInitialize<Sprite>(argc, argv, self);
|
||||
|
||||
setPrivateData(self, s, SpriteType);
|
||||
|
||||
/* Wrap property objects */
|
||||
s->setSrcRect(new Rect);
|
||||
s->setColor(new Color);
|
||||
s->setTone(new Tone);
|
||||
|
||||
wrapNilProperty(self, "bitmap");
|
||||
wrapProperty(self, s->getSrcRect(), "src_rect", RectType);
|
||||
wrapProperty(self, s->getColor(), "color", ColorType);
|
||||
wrapProperty(self, s->getTone(), "tone", ToneType);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
#define DISP_CLASS_NAME "sprite"
|
||||
|
||||
DEF_PROP_OBJ_NIL(Sprite, Bitmap, Bitmap, "bitmap")
|
||||
DEF_PROP_OBJ(Sprite, Rect, SrcRect, "src_rect")
|
||||
DEF_PROP_OBJ(Sprite, Color, Color, "color")
|
||||
DEF_PROP_OBJ(Sprite, Tone, Tone, "tone")
|
||||
|
||||
DEF_PROP_I(Sprite, X)
|
||||
DEF_PROP_I(Sprite, Y)
|
||||
DEF_PROP_I(Sprite, OX)
|
||||
DEF_PROP_I(Sprite, OY)
|
||||
DEF_PROP_I(Sprite, BushDepth)
|
||||
DEF_PROP_I(Sprite, Opacity)
|
||||
DEF_PROP_I(Sprite, BlendType)
|
||||
|
||||
DEF_PROP_F(Sprite, ZoomX)
|
||||
DEF_PROP_F(Sprite, ZoomY)
|
||||
DEF_PROP_F(Sprite, Angle)
|
||||
|
||||
DEF_PROP_B(Sprite, Mirror)
|
||||
|
||||
void
|
||||
spriteBindingInit()
|
||||
{
|
||||
INIT_TYPE(Sprite);
|
||||
|
||||
VALUE klass = rb_define_class("Sprite", rb_cObject);
|
||||
|
||||
disposableBindingInit <Sprite>(klass);
|
||||
flashableBindingInit <Sprite>(klass);
|
||||
viewportElementBindingInit<Sprite>(klass);
|
||||
|
||||
_rb_define_method(klass, "initialize", spriteInitialize);
|
||||
|
||||
INIT_PROP_BIND( Sprite, Bitmap, "bitmap" );
|
||||
INIT_PROP_BIND( Sprite, SrcRect, "src_rect" );
|
||||
INIT_PROP_BIND( Sprite, X, "x" );
|
||||
INIT_PROP_BIND( Sprite, Y, "y" );
|
||||
INIT_PROP_BIND( Sprite, OX, "ox" );
|
||||
INIT_PROP_BIND( Sprite, OY, "oy" );
|
||||
INIT_PROP_BIND( Sprite, ZoomX, "zoom_x" );
|
||||
INIT_PROP_BIND( Sprite, ZoomY, "zoom_y" );
|
||||
INIT_PROP_BIND( Sprite, Angle, "angle" );
|
||||
INIT_PROP_BIND( Sprite, Mirror, "mirror" );
|
||||
INIT_PROP_BIND( Sprite, BushDepth, "bush_depth" );
|
||||
INIT_PROP_BIND( Sprite, Opacity, "opacity" );
|
||||
INIT_PROP_BIND( Sprite, BlendType, "blend_type" );
|
||||
INIT_PROP_BIND( Sprite, Color, "color" );
|
||||
INIT_PROP_BIND( Sprite, Tone, "tone" );
|
||||
}
|
162
binding-mri/table-binding.cpp
Normal file
162
binding-mri/table-binding.cpp
Normal file
|
@ -0,0 +1,162 @@
|
|||
/*
|
||||
** table-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "table.h"
|
||||
#include "binding-util.h"
|
||||
#include "serializable-binding.h"
|
||||
|
||||
DEF_TYPE(Table);
|
||||
|
||||
RB_METHOD(tableInitialize)
|
||||
{
|
||||
int x, y, z;
|
||||
x = y = z = 1;
|
||||
|
||||
rb_get_args(argc, argv, "i|ii", &x, &y, &z);
|
||||
|
||||
Table *t = new Table(x, y, z);
|
||||
|
||||
setPrivateData(self, t, TableType);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(tableResize)
|
||||
{
|
||||
Table *t = getPrivateData<Table>(self);
|
||||
|
||||
switch (argc)
|
||||
{
|
||||
default:
|
||||
case 1:
|
||||
t->resize(rb_fix2int(argv[0]));
|
||||
return Qnil;
|
||||
|
||||
case 2:
|
||||
t->resize(rb_fix2int(argv[0]),
|
||||
rb_fix2int(argv[1]));
|
||||
return Qnil;
|
||||
|
||||
case 3:
|
||||
t->resize(rb_fix2int(argv[0]),
|
||||
rb_fix2int(argv[1]),
|
||||
rb_fix2int(argv[2]));
|
||||
return Qnil;
|
||||
}
|
||||
}
|
||||
|
||||
#define TABLE_SIZE(d, D) \
|
||||
RB_METHOD(table##D##Size) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM \
|
||||
Table *t = getPrivateData<Table>(self); \
|
||||
return rb_int2inum(t->d##Size()); \
|
||||
}
|
||||
|
||||
TABLE_SIZE(x, X)
|
||||
TABLE_SIZE(y, Y)
|
||||
TABLE_SIZE(z, Z)
|
||||
|
||||
RB_METHOD(tableGetAt)
|
||||
{
|
||||
Table *t = getPrivateData<Table>(self);
|
||||
|
||||
int x, y, z;
|
||||
x = y = z = 0;
|
||||
|
||||
x = rb_num2int(argv[0]);
|
||||
if (argc > 1)
|
||||
y = rb_num2int(argv[1]);
|
||||
if (argc > 2)
|
||||
z = rb_num2int(argv[2]);
|
||||
|
||||
if (argc > 3)
|
||||
rb_raise(rb_eArgError, "wrong number of arguments");
|
||||
|
||||
if (x < 0 || x >= t->xSize()
|
||||
|| y < 0 || y >= t->ySize()
|
||||
|| z < 0 || z >= t->zSize())
|
||||
{
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
int result = t->get(x, y, z);
|
||||
|
||||
return rb_int2inum(result);
|
||||
}
|
||||
|
||||
RB_METHOD(tableSetAt)
|
||||
{
|
||||
Table *t = getPrivateData<Table>(self);
|
||||
|
||||
int x, y, z, value;
|
||||
x = y = z = 0;
|
||||
|
||||
if (argc < 2)
|
||||
rb_raise(rb_eArgError, "wrong number of arguments");
|
||||
|
||||
switch (argc)
|
||||
{
|
||||
default:
|
||||
case 2 :
|
||||
x = rb_fix2int(argv[0]);
|
||||
value = rb_fix2int(argv[1]);
|
||||
break;
|
||||
case 3 :
|
||||
x = rb_fix2int(argv[0]);
|
||||
y = rb_fix2int(argv[1]);
|
||||
value = rb_fix2int(argv[2]);
|
||||
break;
|
||||
case 4 :
|
||||
x = rb_fix2int(argv[0]);
|
||||
y = rb_fix2int(argv[1]);
|
||||
z = rb_fix2int(argv[2]);
|
||||
value = rb_fix2int(argv[3]);
|
||||
break;
|
||||
}
|
||||
|
||||
t->set(value, x, y, z);
|
||||
|
||||
return rb_int2inum(value);
|
||||
}
|
||||
|
||||
MARSH_LOAD_FUN(Table)
|
||||
|
||||
void
|
||||
tableBindingInit()
|
||||
{
|
||||
INIT_TYPE(Table);
|
||||
|
||||
VALUE klass = rb_define_class("Table", rb_cObject);
|
||||
|
||||
serializableBindingInit<Table>(klass);
|
||||
|
||||
rb_define_class_method(klass, "_load", TableLoad);
|
||||
|
||||
_rb_define_method(klass, "initialize", tableInitialize);
|
||||
_rb_define_method(klass, "resize", tableResize);
|
||||
_rb_define_method(klass, "xsize", tableXSize);
|
||||
_rb_define_method(klass, "ysize", tableYSize);
|
||||
_rb_define_method(klass, "zsize", tableZSize);
|
||||
_rb_define_method(klass, "[]", tableGetAt);
|
||||
_rb_define_method(klass, "[]=", tableSetAt);
|
||||
|
||||
}
|
160
binding-mri/tilemap-binding.cpp
Normal file
160
binding-mri/tilemap-binding.cpp
Normal file
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
** tilemap-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "tilemap.h"
|
||||
#include "viewport.h"
|
||||
#include "bitmap.h"
|
||||
#include "table.h"
|
||||
|
||||
#include "disposable-binding.h"
|
||||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
|
||||
static rb_data_type_struct TilemapAutotilesType;
|
||||
|
||||
RB_METHOD(tilemapAutotilesSet)
|
||||
{
|
||||
Tilemap::Autotiles *a = getPrivateData<Tilemap::Autotiles>(self);
|
||||
|
||||
int i;
|
||||
VALUE bitmapObj;
|
||||
|
||||
rb_get_args(argc, argv, "io", &i, &bitmapObj);
|
||||
|
||||
Bitmap *bitmap = getPrivateDataCheck<Bitmap>(bitmapObj, BitmapType);
|
||||
|
||||
a->set(i, bitmap);
|
||||
|
||||
VALUE ary = rb_iv_get(self, "array");
|
||||
rb_ary_store(ary, i, bitmapObj);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(tilemapAutotilesGet)
|
||||
{
|
||||
int i;
|
||||
rb_get_args (argc, argv, "i", &i);
|
||||
|
||||
if (i < 0 || i > 6)
|
||||
return Qnil;
|
||||
|
||||
VALUE ary = rb_iv_get(self, "array");
|
||||
|
||||
return rb_ary_entry(ary, i);
|
||||
}
|
||||
|
||||
DEF_TYPE(Tilemap);
|
||||
|
||||
RB_METHOD(tilemapInitialize)
|
||||
{
|
||||
Tilemap *t;
|
||||
|
||||
/* Get parameters */
|
||||
VALUE viewportObj = Qnil;
|
||||
Viewport *viewport = 0;
|
||||
|
||||
rb_get_args(argc, argv, "|o", &viewportObj);
|
||||
|
||||
if (rb_type(viewportObj) != RUBY_T_NIL)
|
||||
viewport = getPrivateDataCheck<Viewport>(viewportObj, ViewportType);
|
||||
|
||||
/* Construct object */
|
||||
t = new Tilemap(viewport);
|
||||
|
||||
setPrivateData(self, t, TilemapType);
|
||||
|
||||
rb_iv_set(self, "viewport", viewportObj);
|
||||
|
||||
wrapProperty(self, &t->getAutotiles(), "autotiles", TilemapAutotilesType);
|
||||
|
||||
VALUE autotilesObj = rb_iv_get(self, "autotiles");
|
||||
|
||||
VALUE ary = rb_ary_new2(7);
|
||||
for (int i = 0; i < 7; ++i)
|
||||
rb_ary_push(ary, Qnil);
|
||||
|
||||
rb_iv_set(autotilesObj, "array", ary);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(tilemapGetAutotiles)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return rb_iv_get(self, "autotiles");
|
||||
}
|
||||
|
||||
RB_METHOD(tilemapUpdate)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Tilemap *t = getPrivateData<Tilemap>(self);
|
||||
|
||||
t->update();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
#define DISP_CLASS_NAME "tilemap"
|
||||
|
||||
DEF_PROP_OBJ(Tilemap, Viewport, Viewport, "viewport")
|
||||
DEF_PROP_OBJ(Tilemap, Bitmap, Tileset, "tileset")
|
||||
DEF_PROP_OBJ(Tilemap, Table, MapData, "map_data")
|
||||
DEF_PROP_OBJ(Tilemap, Table, FlashData, "flash_data")
|
||||
DEF_PROP_OBJ(Tilemap, Table, Priorities, "priorities")
|
||||
|
||||
DEF_PROP_B(Tilemap, Visible)
|
||||
|
||||
DEF_PROP_I(Tilemap, OX)
|
||||
DEF_PROP_I(Tilemap, OY)
|
||||
|
||||
void
|
||||
tilemapBindingInit()
|
||||
{
|
||||
initType(TilemapAutotilesType, "TilemapAutotiles", 0);
|
||||
|
||||
VALUE klass = rb_define_class("TilemapAutotiles", rb_cObject);
|
||||
|
||||
_rb_define_method(klass, "[]=", tilemapAutotilesSet);
|
||||
_rb_define_method(klass, "[]", tilemapAutotilesGet);
|
||||
|
||||
INIT_TYPE(Tilemap);
|
||||
|
||||
klass = rb_define_class("Tilemap", rb_cObject);
|
||||
|
||||
disposableBindingInit<Tilemap>(klass);
|
||||
|
||||
_rb_define_method(klass, "initialize", tilemapInitialize);
|
||||
_rb_define_method(klass, "autotiles", tilemapGetAutotiles);
|
||||
_rb_define_method(klass, "update", tilemapUpdate);
|
||||
|
||||
INIT_PROP_BIND( Tilemap, Viewport, "viewport" );
|
||||
INIT_PROP_BIND( Tilemap, Tileset, "tileset" );
|
||||
INIT_PROP_BIND( Tilemap, MapData, "map_data" );
|
||||
INIT_PROP_BIND( Tilemap, FlashData, "flash_data" );
|
||||
INIT_PROP_BIND( Tilemap, Priorities, "priorities" );
|
||||
INIT_PROP_BIND( Tilemap, Visible, "visible" );
|
||||
INIT_PROP_BIND( Tilemap, OX, "ox" );
|
||||
INIT_PROP_BIND( Tilemap, OY, "oy" );
|
||||
}
|
||||
|
100
binding-mri/viewport-binding.cpp
Normal file
100
binding-mri/viewport-binding.cpp
Normal file
|
@ -0,0 +1,100 @@
|
|||
/*
|
||||
** viewport-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "viewport.h"
|
||||
#include "disposable-binding.h"
|
||||
#include "flashable-binding.h"
|
||||
#include "sceneelement-binding.h"
|
||||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
|
||||
DEF_TYPE(Viewport);
|
||||
|
||||
RB_METHOD(viewportInitialize)
|
||||
{
|
||||
Viewport *v;
|
||||
|
||||
if (argc == 1)
|
||||
{
|
||||
/* The rect arg is only used to init the viewport,
|
||||
* and does NOT replace its 'rect' property */
|
||||
VALUE rectObj;
|
||||
Rect *rect;
|
||||
|
||||
rb_get_args(argc, argv, "o", &rectObj);
|
||||
|
||||
rect = getPrivateDataCheck<Rect>(rectObj, RectType);
|
||||
|
||||
v = new Viewport(rect);
|
||||
}
|
||||
else
|
||||
{
|
||||
int x, y, width, height;
|
||||
|
||||
rb_get_args(argc, argv, "iiii", &x, &y, &width, &height);
|
||||
|
||||
v = new Viewport(x, y, width, height);
|
||||
}
|
||||
|
||||
setPrivateData(self, v, ViewportType);
|
||||
|
||||
/* Wrap property objects */
|
||||
v->setRect(new Rect(*v->getRect()));
|
||||
v->setColor(new Color);
|
||||
v->setTone(new Tone);
|
||||
|
||||
wrapProperty(self, v->getRect(), "rect", RectType);
|
||||
wrapProperty(self, v->getColor(), "color", ColorType);
|
||||
wrapProperty(self, v->getTone(), "tone", ToneType);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
#define DISP_CLASS_NAME "viewport"
|
||||
|
||||
DEF_PROP_OBJ(Viewport, Rect, Rect, "rect")
|
||||
DEF_PROP_OBJ(Viewport, Color, Color, "color")
|
||||
DEF_PROP_OBJ(Viewport, Tone, Tone, "tone")
|
||||
|
||||
DEF_PROP_I(Viewport, OX)
|
||||
DEF_PROP_I(Viewport, OY)
|
||||
|
||||
|
||||
void
|
||||
viewportBindingInit()
|
||||
{
|
||||
INIT_TYPE(Viewport);
|
||||
|
||||
VALUE klass = rb_define_class("Viewport", rb_cObject);
|
||||
|
||||
disposableBindingInit <Viewport>(klass);
|
||||
flashableBindingInit <Viewport>(klass);
|
||||
sceneElementBindingInit<Viewport>(klass);
|
||||
|
||||
_rb_define_method(klass, "initialize", viewportInitialize);
|
||||
|
||||
INIT_PROP_BIND( Viewport, Rect, "rect" );
|
||||
INIT_PROP_BIND( Viewport, OX, "ox" );
|
||||
INIT_PROP_BIND( Viewport, OY, "oy" );
|
||||
INIT_PROP_BIND( Viewport, Color, "color" );
|
||||
INIT_PROP_BIND( Viewport, Tone, "tone" );
|
||||
}
|
||||
|
74
binding-mri/viewportelement-binding.h
Normal file
74
binding-mri/viewportelement-binding.h
Normal file
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
** viewportelement-binding.h
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef VIEWPORTELEMENTBINDING_H
|
||||
#define VIEWPORTELEMENTBINDING_H
|
||||
|
||||
#include "viewport.h"
|
||||
#include "binding-util.h"
|
||||
#include "binding-types.h"
|
||||
|
||||
#include "sceneelement-binding.h"
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(viewportElementGetViewport)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
ViewportElement *ve = getPrivateData<C>(self);
|
||||
|
||||
GUARD_EXC( ve->aboutToAccess(); );
|
||||
|
||||
return rb_iv_get(self, "viewport");
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static C *
|
||||
viewportElementInitialize(int argc, VALUE *argv, VALUE self)
|
||||
{
|
||||
/* Get parameters */
|
||||
VALUE viewportObj = Qnil;
|
||||
Viewport *viewport = 0;
|
||||
|
||||
rb_get_args(argc, argv, "|o", &viewportObj);
|
||||
|
||||
if (rb_type(viewportObj) != RUBY_T_NIL)
|
||||
viewport = getPrivateDataCheck<Viewport>(viewportObj, ViewportType);
|
||||
|
||||
/* Construct object */
|
||||
C *ve = new C(viewport);
|
||||
|
||||
/* Set property objects */
|
||||
rb_iv_set(self, "viewport", viewportObj);
|
||||
|
||||
return ve;
|
||||
}
|
||||
|
||||
template<class C>
|
||||
void
|
||||
viewportElementBindingInit(VALUE klass)
|
||||
{
|
||||
sceneElementBindingInit<C>(klass);
|
||||
|
||||
_rb_define_method(klass, "viewport", viewportElementGetViewport<C>);
|
||||
}
|
||||
|
||||
#endif // VIEWPORTELEMENTBINDING_H
|
103
binding-mri/window-binding.cpp
Normal file
103
binding-mri/window-binding.cpp
Normal file
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
** window-binding.cpp
|
||||
**
|
||||
** This file is part of mkxp.
|
||||
**
|
||||
** Copyright (C) 2013 Jonas Kulla <Nyocurio@gmail.com>
|
||||
**
|
||||
** mkxp is free software: you can redistribute it and/or modify
|
||||
** it under the terms of the GNU General Public License as published by
|
||||
** the Free Software Foundation, either version 2 of the License, or
|
||||
** (at your option) any later version.
|
||||
**
|
||||
** mkxp is distributed in the hope that it will be useful,
|
||||
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
** GNU General Public License for more details.
|
||||
**
|
||||
** You should have received a copy of the GNU General Public License
|
||||
** along with mkxp. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "window.h"
|
||||
#include "disposable-binding.h"
|
||||
#include "viewportelement-binding.h"
|
||||
#include "binding-util.h"
|
||||
|
||||
DEF_TYPE(Window);
|
||||
|
||||
RB_METHOD(windowInitialize)
|
||||
{
|
||||
Window *w = viewportElementInitialize<Window>(argc, argv, self);
|
||||
|
||||
setPrivateData(self, w, WindowType);
|
||||
|
||||
w->setCursorRect(new Rect);
|
||||
wrapNilProperty(self, "windowskin");
|
||||
wrapNilProperty(self, "contents");
|
||||
wrapProperty(self, w->getCursorRect(), "cursor_rect", RectType);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
RB_METHOD(windowUpdate)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
Window *w = getPrivateData<Window>(self);
|
||||
|
||||
w->update();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
#define DISP_CLASS_NAME "window"
|
||||
|
||||
DEF_PROP_OBJ_NIL(Window, Bitmap, Windowskin, "windowskin")
|
||||
DEF_PROP_OBJ_NIL(Window, Bitmap, Contents, "contents")
|
||||
DEF_PROP_OBJ(Window, Rect, CursorRect, "cursor_rect")
|
||||
|
||||
DEF_PROP_B(Window, Stretch)
|
||||
DEF_PROP_B(Window, Active)
|
||||
DEF_PROP_B(Window, Pause)
|
||||
|
||||
DEF_PROP_I(Window, X)
|
||||
DEF_PROP_I(Window, Y)
|
||||
DEF_PROP_I(Window, Width)
|
||||
DEF_PROP_I(Window, Height)
|
||||
DEF_PROP_I(Window, OX)
|
||||
DEF_PROP_I(Window, OY)
|
||||
DEF_PROP_I(Window, Opacity)
|
||||
DEF_PROP_I(Window, BackOpacity)
|
||||
DEF_PROP_I(Window, ContentsOpacity)
|
||||
|
||||
|
||||
void
|
||||
windowBindingInit()
|
||||
{
|
||||
INIT_TYPE(Window);
|
||||
|
||||
VALUE klass = rb_define_class("Window", rb_cObject);
|
||||
|
||||
disposableBindingInit <Window>(klass);
|
||||
viewportElementBindingInit<Window>(klass);
|
||||
|
||||
_rb_define_method(klass, "initialize", windowInitialize);
|
||||
_rb_define_method(klass, "update", windowUpdate);
|
||||
|
||||
INIT_PROP_BIND( Window, Windowskin, "windowskin" );
|
||||
INIT_PROP_BIND( Window, Contents, "contents" );
|
||||
INIT_PROP_BIND( Window, Stretch, "stretch" );
|
||||
INIT_PROP_BIND( Window, CursorRect, "cursor_rect" );
|
||||
INIT_PROP_BIND( Window, Active, "active" );
|
||||
INIT_PROP_BIND( Window, Pause, "pause" );
|
||||
INIT_PROP_BIND( Window, X, "x" );
|
||||
INIT_PROP_BIND( Window, Y, "y" );
|
||||
INIT_PROP_BIND( Window, Width, "width" );
|
||||
INIT_PROP_BIND( Window, Height, "height" );
|
||||
INIT_PROP_BIND( Window, OX, "ox" );
|
||||
INIT_PROP_BIND( Window, OY, "oy" );
|
||||
INIT_PROP_BIND( Window, Opacity, "opacity" );
|
||||
INIT_PROP_BIND( Window, BackOpacity, "back_opacity" );
|
||||
INIT_PROP_BIND( Window, ContentsOpacity, "contents_opacity" );
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue