aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/script/objects/smap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/script/objects/smap.cpp')
-rw-r--r--Src/Wasabi/api/script/objects/smap.cpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/Src/Wasabi/api/script/objects/smap.cpp b/Src/Wasabi/api/script/objects/smap.cpp
new file mode 100644
index 00000000..6c829628
--- /dev/null
+++ b/Src/Wasabi/api/script/objects/smap.cpp
@@ -0,0 +1,205 @@
+#include <precomp.h>
+#include "smap.h"
+
+#include <api/script/script.h>
+#include <api/script/scriptmgr.h>
+#include <api/script/objects/sregion.h>
+#include <api/script/objecttable.h>
+
+MapScriptController _mapController;
+MapScriptController *mapController=&_mapController;
+
+// -- Functions table -------------------------------------
+function_descriptor_struct MapScriptController::exportedFunction[] = {
+ {L"getValue", 2, (void*)SMap::script_vcpu_getValue },
+ {L"getARGBValue", 3, (void*)SMap::script_vcpu_getARGBValue },
+ {L"inRegion", 2, (void*)SMap::script_vcpu_inRegion },
+ {L"loadMap", 1, (void*)SMap::script_vcpu_loadMap },
+ {L"getWidth", 0, (void*)SMap::script_vcpu_getWidth },
+ {L"getHeight", 0, (void*)SMap::script_vcpu_getHeight },
+ {L"getRegion", 0, (void*)SMap::script_vcpu_getRegion },
+ // todo: stretch
+};
+// --------------------------------------------------------
+
+const wchar_t *MapScriptController::getClassName() {
+ return L"Map";
+}
+
+const wchar_t *MapScriptController::getAncestorClassName() {
+ return L"Object";
+}
+
+ScriptObjectController *MapScriptController::getAncestorController() { return rootScriptObjectController; }
+
+ScriptObject *MapScriptController::instantiate() {
+ SMap *m = new SMap;
+ ASSERT(m != NULL);
+ return m->getScriptObject();
+}
+
+void MapScriptController::destroy(ScriptObject *o) {
+ SMap *m = static_cast<SMap *>(o->vcpu_getInterface(mapGuid));
+ ASSERT(m != NULL);
+ delete m;
+}
+
+void *MapScriptController::encapsulate(ScriptObject *o) {
+ return NULL; // no encapsulation for maps for now
+}
+
+void MapScriptController::deencapsulate(void *o) {
+}
+
+int MapScriptController::getNumFunctions() {
+ return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
+}
+
+const function_descriptor_struct *MapScriptController::getExportedFunctions() {
+ return exportedFunction;
+}
+
+GUID MapScriptController::getClassGuid() {
+ return mapGuid;
+}
+
+
+
+SMap::SMap() {
+ getScriptObject()->vcpu_setInterface(mapGuid, (void *)static_cast<SMap *>(this));
+ getScriptObject()->vcpu_setClassName(L"Map");
+ getScriptObject()->vcpu_setController(mapController);
+ bmp = NULL;
+ region_so = ObjectTable::instantiate(ObjectTable::getClassFromName(L"Region"));
+ reg = static_cast<SRegion *>(region_so->vcpu_getInterface(regionGuid));
+}
+
+SMap::~SMap() {
+ if (bmp) delete bmp;
+ ObjectTable::destroy(region_so);
+}
+
+int SMap::getValue(int x, int y) {
+ if (!bmp) return 0;
+ ARGB32 c = bmp->getPixel(x, y);
+// if ((c & 0xFF000000) >> 24 != 0xFF) return -1;
+ int v = MAX(MAX((c & 0xFF0000) >> 16, (c & 0xFF00) >> 8), c & 0xFF);
+ return v;
+}
+
+int SMap::getARGBValue(int x, int y, int whichCol) {
+ if (!bmp) return 0;
+ ARGB32 c = bmp->getPixel(x, y);
+
+ whichCol %= 4;
+
+ /**
+ whichCol
+ 0: blue
+ 1: green
+ 2: red
+ 3: alpha
+ */
+
+ ARGB32 a = c >> 24;
+ a &= 0x000000FF; //just to be sure
+
+ if (whichCol == 3) return a;
+
+ c = c >> (whichCol * 8);
+ c &= 0x000000FF;
+
+ if (0 == a || 255 == a) return c;
+
+ double d = c*255/a; // Correction for bitmaps w/ alpha channel, otherwise a lesser rgb value is returned
+ d = ceil(d);
+
+ return (int)d;
+}
+
+void SMap::loadMap(const wchar_t *b)
+{
+ bmp = new SkinBitmap(b, 0);
+ reg->loadFromBitmap(b);
+}
+
+int SMap::getWidth() {
+ if (!bmp) return 0;
+ return bmp->getWidth();
+}
+
+int SMap::getHeight() {
+ if (!bmp) return 0;
+ return bmp->getHeight();
+}
+
+int SMap::inRegion(int x, int y) {
+ POINT pt={x,y};
+ return reg->getRegion()->ptInRegion(&pt);
+}
+
+SRegion *SMap::getSRegion() {
+ return reg;
+}
+
+// VCPU
+
+scriptVar SMap::script_vcpu_loadMap(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar bmp) {
+ SCRIPT_FUNCTION_INIT;
+ ASSERT(bmp.type == SCRIPT_STRING);
+ SMap *m = static_cast<SMap *>(o->vcpu_getInterface(mapGuid));
+ if (m) m->loadMap(bmp.data.sdata);
+ RETURN_SCRIPT_VOID;
+}
+
+scriptVar SMap::script_vcpu_getValue(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar x, scriptVar y) {
+ SCRIPT_FUNCTION_INIT;
+ ASSERT(SOM::isNumeric(&x));
+ ASSERT(SOM::isNumeric(&y));
+ SMap *m = static_cast<SMap *>(o->vcpu_getInterface(mapGuid));
+ if (m) return MAKE_SCRIPT_INT(m->getValue(SOM::makeInt(&x), SOM::makeInt(&y)));
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar SMap::script_vcpu_getARGBValue(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar x, scriptVar y, scriptVar wichCol) {
+ SCRIPT_FUNCTION_INIT;
+ ASSERT(SOM::isNumeric(&x));
+ ASSERT(SOM::isNumeric(&y));
+ ASSERT(SOM::isNumeric(&wichCol));
+ SMap *m = static_cast<SMap *>(o->vcpu_getInterface(mapGuid));
+ if (m) return MAKE_SCRIPT_INT(m->getARGBValue(SOM::makeInt(&x), SOM::makeInt(&y), SOM::makeInt(&wichCol)));
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar SMap::script_vcpu_getWidth(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT;
+ SMap *m = static_cast<SMap *>(o->vcpu_getInterface(mapGuid));
+ if (m) return MAKE_SCRIPT_INT(m->getWidth());
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar SMap::script_vcpu_getHeight(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT;
+ SMap *m = static_cast<SMap *>(o->vcpu_getInterface(mapGuid));
+ if (m) return MAKE_SCRIPT_INT(m->getHeight());
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar SMap::script_vcpu_inRegion(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar x, scriptVar y) {
+ SCRIPT_FUNCTION_INIT;
+ ASSERT(SOM::isNumeric(&x));
+ ASSERT(SOM::isNumeric(&y));
+ SMap *m = static_cast<SMap *>(o->vcpu_getInterface(mapGuid));
+ if (m) return MAKE_SCRIPT_BOOLEAN(m->inRegion(SOM::makeInt(&x), SOM::makeInt(&y)));
+ RETURN_SCRIPT_ZERO;
+}
+
+scriptVar SMap::script_vcpu_getRegion(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
+ SCRIPT_FUNCTION_INIT;
+ SMap *m = static_cast<SMap *>(o->vcpu_getInterface(mapGuid));
+ if (m) {
+ SRegion *s = m->getSRegion();
+ if (s) return MAKE_SCRIPT_OBJECT(s->getScriptObject());
+ }
+ RETURN_SCRIPT_ZERO;
+} \ No newline at end of file