]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/Interpreter.cpp
new language, new compiler
[l2e.git] / src / loader / Interpreter.cpp
index 51c6b9ce3b2648d23310f00f015126f2f394e2d7..1888361c465dd3c75de8f8a0057e68f8025bd0ec 100644 (file)
@@ -337,6 +337,7 @@ void Interpreter::ReadObject(int typeId, int id, char *object, const PropertyLis
                                array.data = alloc.Alloc(array.size);
                                array.ref = fd.IsReferenced();
                                arrays.push_back(array);
+                               std::memset(array.data, 0, array.size);
                                char *iter = reinterpret_cast<char *>(array.data);
                                if (i->second->GetLiteral().GetType() == Literal::ARRAY_PROPS) {
                                        const vector<PropertyList *> &list(i->second->GetLiteral().GetPropertyLists());
@@ -384,7 +385,8 @@ void Interpreter::ReadObject(int typeId, int id, char *object, const PropertyLis
                                                }
                                        }
                                }
-                               std::memcpy(dest, &array.data, sizeof(char *));
+                               size_t pLen = sizeof(char *);
+                               std::memcpy(dest, &array.data, pLen);
                                dest += sizeof(char *);
                                std::memcpy(dest, &arraySize, sizeof(int));
                        } else if (i->second->IsLiteral() && !fd.IsReferenced()) {
@@ -623,6 +625,8 @@ void Interpreter::ReadScript(const std::vector<ScriptToken *> &s, Script *script
                                                ReadScriptVector(**i, text + cursor);
                                                cursor += sizeof(Vector<int>);
                                                break;
+                                       default:
+                                               break;
                                }
                        }
                } else if (cmd == "add") {
@@ -669,6 +673,8 @@ void Interpreter::ReadScript(const std::vector<ScriptToken *> &s, Script *script
                                                ReadScriptVector(**i, text + cursor);
                                                cursor += sizeof(Vector<int>);
                                                break;
+                                       default:
+                                               break;
                                }
                        }
                } else if (cmd == "mod") {
@@ -906,6 +912,17 @@ SDL_Surface *Interpreter::GetImage(const string &path) {
        }
 }
 
+const string &Interpreter::FindImage(SDL_Surface *img) const {
+       for (std::map<string, SDL_Surface *>::const_iterator
+                       i(imageCache.begin()), end(imageCache.end());
+                       i != end; ++i) {
+               if (i->second == img) {
+                       return i->first;
+               }
+       }
+       throw Error("unable to locate image");
+}
+
 
 bool Interpreter::CanLink(const Value &v) const {
        return v.IsLiteral() || source.IsDefined(v.GetIdentifier());
@@ -947,16 +964,18 @@ void Interpreter::CreateTypeDescriptions() {
                td.SetDescription("A signed integer.");
                td.SetSize(sizeof(int));
        }
-       {;
+       {
                TypeDescription &td(TypeDescription::Create(PATH_ID, "Path"));
                td.SetDescription("A path in the filesystem which is interpreted relative to the source file's location.");
                td.SetSize(1);
                td.AddSupertype(STRING_ID, 0);
        }
        {
+               Script s;
                TypeDescription &td(TypeDescription::Create(SCRIPT_ID, "Script"));
                td.SetDescription("Collection of commands that define a behaviour.");
                td.SetSize(sizeof(Script));
+               td.AddField("text", FieldDescription(((char *)&s.text) - ((char *)&s), STRING_ID).SetAggregate());
        }
        {
                TypeDescription &td(TypeDescription::Create(STRING_ID, "String"));