Exemplo n.º 1
0
        int last_bucket; /**< Last bucket acted upon. */

        #endregion Fields

        #region Constructors

        public MapContent(Map map)
        {
            last_bucket=0;
            zones=null;

            buckets[0]=new ObjectBucket();
            buckets[0].allocate(); // Skip ID 0
            for(int i=1; i<256; ++i) //TODO Unötig in C#?
            {
                buckets[i]=null;
            }

            mapWidth=(ushort)((map.getWidth()*map.getTileWidth()+zoneDiam-1)
                /zoneDiam);
            mapHeight=(ushort)((map.getHeight()*map.getTileHeight()+zoneDiam-1)
                /zoneDiam);
            zones=new MapZone[mapWidth*mapHeight];

            //ZOnen initialisieren //TODO wird das an anderer Stelle getan?
            for(int i=0; i<zones.Length; i++)
            {
                zones[i]=new MapZone();
            }

            things=new List<Thing>();
        }
Exemplo n.º 2
0
        public bool activate()
        {
            //assert(!isActive());

            string file="maps/"+mName+".tmx";
            if(!ResourceManager.exists(file))
                file+=".gz";

            mMap=MapReader.readMap(file);
            if(mMap==null)
                return false;

            initializeContent();

            string sPvP=mMap.getProperty("pvp");
            if(sPvP=="")
                sPvP=Configuration.getValue("game_defaultPvp", "");

            if(sPvP=="free")
                mPvPRules=PvPRules.PVP_FREE;
            else
                mPvPRules=PvPRules.PVP_NONE;

            Script s=getScript();
            if(s!=null)
            {
                //TODO Skript implementieren
                //s.setMap(this);
                //s.prepare("initialize");
                //s.execute();
            }

            return true;
        }
Exemplo n.º 3
0
        //        static std::vector< int > tilesetFirstGids;
        //        
        public static Map readMap(string filename)
        {
            TMX tmx=null;

            try
            {
                tmx=new TMX(filename);
            }
            catch
            {
                Logger.Write(LogLevel.Error, "Not a map file ({0}), filename)");
                return null;
            }

            int w=tmx.Width;
            int h=tmx.Height;
            int tileW=tmx.TileWidth;
            int tileH=tmx.TileHeight;

            Map map=new Map(w, h, tileW, tileH);

            foreach(Property prop in  tmx.Properties)
            {
                Logger.Write(LogLevel.Debug, " {0}: {1}", prop.Name, prop.Value);
                map.setProperty(prop.Name, prop.Value);
            }

            foreach(TMX.LayerData layer in tmx.Layers)
            {
                if(layer.name.ToLower() == "collision")
                {
                    for(int y=0; y<layer.height; y++)
                    {
                        for(int x=0; x<layer.width; x++)
                        {
                            if(layer.data[x, y] != 0)
                            {
                                map.blockTile(x, y, invertika_game.Enums.BlockType.BLOCKTYPE_WALL);
                            }
                        }
                    }
                }

                //TODO Layer lesen implementieren
                //            node = node->xmlChildrenNode;
                //            int h = map->getHeight();
                //            int w = map->getWidth();
                //            int x = 0;
                //            int y = 0;
                //
                //            // Layers are assumed to be map size, with (0,0) as origin.
                //            // Find its single "data" element.
                //            while (node)
                //            {
                //                if (xmlStrEqual(node->name, BAD_CAST "data")) break;
                //                node = node->next;
                //            }
                //
                //            if (!node)
                //            {
                //                LOG_WARN("Layer without any 'data' element.");
                //                return;
                //            }
                //
                //            std::string encoding = XML::getProperty(node, "encoding", std::string());
                //            if (encoding == "base64")
                //            {
                //                // Read base64 encoded map file
                //                xmlNodePtr dataChild = node->xmlChildrenNode;
                //                if (!dataChild)
                //                {
                //                    LOG_WARN("Corrupted layer.");
                //                    return;
                //                }
                //
                //                int len = strlen((const char *) dataChild->content) + 1;
                //                char *charData = new char[len + 1];
                //                const char *charStart = (const char *) dataChild->content;
                //                char *charIndex = charData;
                //
                //                while (*charStart)
                //                {
                //                    if (*charStart != ' ' && *charStart != '\t' && *charStart != '\n')
                //                    {
                //                        *charIndex = *charStart;
                //                        ++charIndex;
                //                    }
                //                    ++charStart;
                //                }
                //                *charIndex = '\0';
                //
                //                int binLen;
                //                unsigned char *binData =
                //                    php_base64_decode((unsigned char *)charData, strlen(charData), &binLen);
                //
                //                delete[] charData;
                //
                //                if (!binData)
                //                {
                //                    LOG_WARN("Failed to decode base64-encoded layer.");
                //                    return;
                //                }
                //
                //                std::string compression =
                //                    XML::getProperty(node, "compression", std::string());
                //                if (compression == "gzip" || compression == "zlib")
                //                {
                //                    // Inflate the gzipped layer data
                //                    char *inflated;
                //                    unsigned inflatedSize;
                //                    bool res = inflateMemory((char *)binData, binLen, inflated, inflatedSize);
                //                    free(binData);
                //
                //                    if (!res)
                //                    {
                //                        LOG_WARN("Failed to decompress compressed layer");
                //                        return;
                //                    }
                //
                //                    binData = (unsigned char *)inflated;
                //                    binLen = inflatedSize;
                //                }
                //
                //                for (int i = 0; i < binLen - 3; i += 4)
                //                {
                //                    int gid = binData[i] |
                //                        (binData[i + 1] << 8)  |
                //                            (binData[i + 2] << 16) |
                //                            (binData[i + 3] << 24);
                //
                //                    setTileWithGid(map, x, y, gid);
                //
                //                    if (++x == w)
                //                    {
                //                        x = 0;
                //                        ++y;
                //                    }
                //                }
                //                free(binData);
                //                return;
                //            }
                //            else if (encoding == "csv")
                //            {
                //                xmlNodePtr dataChild = node->xmlChildrenNode;
                //                if (!dataChild)
                //                    return;
                //
                //                const char *data = (const char*) xmlNodeGetContent(dataChild);
                //                std::string csv(data);
                //
                //                size_t pos = 0;
                //                size_t oldPos = 0;
                //
                //                while (oldPos != csv.npos)
                //                {
                //                    pos = csv.find_first_of(",", oldPos);
                //
                //                    const int gid = atoi(csv.substr(oldPos, pos - oldPos).c_str());
                //
                //                    setTileWithGid(map, x, y, gid);
                //
                //                    x++;
                //                    if (x == w)
                //                    {
                //                        x = 0;
                //                        ++y;
                //
                //                        // When we're done, don't crash on too much data
                //                        if (y == h)
                //                            break;
                //                    }
                //
                //                    oldPos = pos + 1;
                //                }
                //            }
                //            else
                //            {
                //
                //                // Read plain XML map file
                //                node = node->xmlChildrenNode;
                //
                //                while (node)
                //                {
                //                    if (xmlStrEqual(node->name, BAD_CAST "tile") && y < h)
                //                    {
                //                        int gid = XML::getProperty(node, "gid", -1);
                //                        setTileWithGid(map, x, y, gid);
                //
                //                        if (++x == w)
                //                        {
                //                            x = 0;
                //                            ++y;
                //                        }
                //                    }
                //
                //                    node = node->next;
                //                }
                //            }
            }

            foreach(Objectgroup oGroup in tmx.ObjectLayers)
            {
                if(oGroup.Name.ToLower() != "object")
                    continue;

                foreach(CSCL.FileFormats.TMX.Object obj in oGroup.Objects)
                {
                    string objName = obj.Name;
                    string objType = obj.Type.ToUpper();

                    Rectangle rect = new Rectangle(obj.X, obj.Y, obj.Width, obj.Height);
                    MapObject newObject = new MapObject(rect, objName, objType);

                    foreach(Property prop in obj.Properties)
                    {
                        newObject.addProperty(prop.Name, prop.Value);
                    }

                    map.addObject(newObject);
                }
            }

            return map;
        }