Ejemplo n.º 1
0
    public static VArtifactData GetIsoData(string isoName, out ulong guid)
    {
        guid = GetGuidFromIsoName(isoName);
        if (guid == 0)
        {
            Debug.LogError("isoName not exist!");
            return(null);
        }
        if (!isos.ContainsKey(guid))
        {
            LoadIso(GetISONameFullPath(isoName));
        }
        VArtifactData isoData = isos[guid];

        return(isoData);
    }
Ejemplo n.º 2
0
    public static bool LoadIso(string path)
    {
        VArtifactData ISO;
        long          tick = System.DateTime.Now.Ticks;

        try
        {
            ISO = new VArtifactData();
            string fullpath = path;
            string filename = Path.GetFileNameWithoutExtension(fullpath);
            //TextAsset ta = Resources.Load(fullpath,typeof(TextAsset)) as TextAsset;
            using (FileStream fs = new FileStream(fullpath, FileMode.Open, FileAccess.Read))
            {
                byte[] iso_buffer = new byte[(int)(fs.Length)];
                //byte[] iso_buffer = ta.bytes;
                ulong guid = CRC64.Compute(iso_buffer);
                fs.Read(iso_buffer, 0, (int)(fs.Length));
                fs.Close();
                if (ISO.Import(iso_buffer, new VAOption(false)))
                {
                    isos[guid]          = ISO;
                    isoNameId[filename] = guid;
                    Debug.Log("loadIso Time: " + (System.DateTime.Now.Ticks - tick));
                    return(true);
                }
                else
                {
                    ISO = null;
                    return(false);
                }
            }
        }
        catch (Exception e)
        {
            Debug.LogError("Failed to load file " + path);
            GameLog.HandleIOException(e, GameLog.EIOFileType.InstallFiles);
            ISO = null;
            return(false);
        }
    }
Ejemplo n.º 3
0
    public bool CanSee(Vector3 iso_pos)
    {
        int x = Mathf.FloorToInt(iso_pos.x);
        int y = Mathf.FloorToInt(iso_pos.y);
        int z = Mathf.FloorToInt(iso_pos.z);

        if (x <= 0 || y <= 0 || z <= 0 ||
            x >= m_HeadInfo.xSize - 1 || y >= m_HeadInfo.ySize - 1 || z >= m_HeadInfo.zSize - 1)
        {
            return(true);
        }
        if (GetVoxel(VArtifactData.IPosToKey(x + 1, y, z)).Volume < 128)
        {
            return(true);
        }
        if (GetVoxel(VArtifactData.IPosToKey(x - 1, y, z)).Volume < 128)
        {
            return(true);
        }
        if (GetVoxel(VArtifactData.IPosToKey(x, y + 1, z)).Volume < 128)
        {
            return(true);
        }
        if (GetVoxel(VArtifactData.IPosToKey(x, y - 1, z)).Volume < 128)
        {
            return(true);
        }
        if (GetVoxel(VArtifactData.IPosToKey(x, y, z + 1)).Volume < 128)
        {
            return(true);
        }
        if (GetVoxel(VArtifactData.IPosToKey(x, y, z - 1)).Volume < 128)
        {
            return(true);
        }
        return(false);
    }
Ejemplo n.º 4
0
    public static void GetArtifactUnit(VArtifactTown townData, ArtifactUnit[] artifactUnitArray, System.Random myRand)
    {
        int townPosXMin = townData.PosGen.x;
        int townPosZMin = townData.PosGen.y;
        int townPosXMax = townData.PosGen.x;
        int townPosZMax = townData.PosGen.y;

        int unitIndex = 0;

        for (int m = 0; m < artifactUnitArray.Count(); m++)
        {
            IntVector2 posXZ = VArtifactUtil.GetIntVector2FromStr(artifactUnitArray[m].pos);
            int        unitID;
            if (artifactUnitArray[m].id.Equals("-1"))
            {
                List <int> idList = VArtifactUtil.townArtifactsData.Keys.ToList();
                unitID = idList[myRand.Next(idList.Count)];
            }
            else
            {
                unitID = VArtifactUtil.RandIntFromStr(artifactUnitArray[m].id, myRand);
            }
            //Debug.Log("unitID:" + unitID);
            Town_artifacts townDataFromDataBase = VArtifactUtil.townArtifactsData[unitID];
            string         isoName = townDataFromDataBase.isoName;
            float          rot;
            if (artifactUnitArray[m].rot.Equals("-1"))
            {
                //--to do: "type" is not used
                rot = (float)(myRand.NextDouble() * 360);
            }
            else
            {
                rot = VArtifactUtil.RandFloatFromStr(artifactUnitArray[m].rot, myRand);
            }

            //--to do: get the isoData  from id;
            ulong guid;
            //townData.isodataList.Add(posXZ,GetIsoData(isoName,out guid));
            VArtifactUnit vau     = new VArtifactUnit();
            VArtifactData isoData = VArtifactUtil.GetIsoData(isoName, out guid);
            if (isoData == null)
            {
                Debug.LogError("unitID:" + unitID + " isoName not found! IsoName: " + isoName);
                continue;
            }
            vau.isoName   = isoName;
            vau.unitIndex = unitIndex++;
            vau.isoId     = unitID;
            vau.isoGuId   = guid;
            vau.vat       = townData;
            vau.rot       = rot;
            vau.PosCenter = posXZ + townData.PosGen;
            int xIsoSize = isoData.m_HeadInfo.xSize;
            int zIsoSize = isoData.m_HeadInfo.zSize;
            vau.isoStartPos = new IntVector2(posXZ.x - xIsoSize / 2, posXZ.y - zIsoSize / 2) + townData.PosGen;
            vau.isoEndPos   = new IntVector2(posXZ.x + xIsoSize / 2, posXZ.y + zIsoSize / 2) + townData.PosGen;
            int xSize = townDataFromDataBase.vaSize.x;
            int zSize = townDataFromDataBase.vaSize.y;
            vau.PosStart      = new IntVector2(posXZ.x - xSize / 2, posXZ.y - zSize / 2) + townData.PosGen;
            vau.PosEnd        = new IntVector2(posXZ.x + xSize / 2, posXZ.y + zSize / 2) + townData.PosGen;
            vau.level         = townData.level;
            vau.type          = townData.type;
            vau.buildingIdNum = artifactUnitArray[m].buildingIdNum.ToList();
            vau.npcIdNum      = artifactUnitArray[m].npcIdNum.ToList();
            vau.buildingCell  = townDataFromDataBase.buildingCell;
            vau.npcPos        = townDataFromDataBase.npcPos;
            vau.vaSize        = townDataFromDataBase.vaSize;
            vau.towerPos      = townDataFromDataBase.towerPos;
            if (vau.PosStart.x < townPosXMin)
            {
                townPosXMin = vau.PosStart.x;
            }
            if (vau.PosStart.y < townPosZMin)
            {
                townPosZMin = vau.PosStart.y;
            }
            if (vau.PosEnd.x > townPosXMax)
            {
                townPosXMax = vau.PosEnd.x;
            }
            if (vau.PosEnd.y > townPosZMax)
            {
                townPosZMax = vau.PosEnd.y;
            }
            townData.VAUnits.Add(vau);
        }
        townData.PosStart  = new IntVector2(townPosXMin, townPosZMin);
        townData.PosEnd    = new IntVector2(townPosXMax, townPosZMax);
        townData.PosCenter = new IntVector2((townPosXMin + townPosXMax) / 2, (townPosZMin + townPosZMax) / 2);
//        townData.height = Mathf.CeilToInt(townData.VAUnits[0].worldPos.y + townData.VAUnits[0].vaSize.z);
//        townData.TransPos = new Vector3(townData.PosCenter.x, townData.height, townData.PosCenter.y);
        townData.radius = (int)Mathf.Sqrt(Mathf.Pow((townPosXMax - townPosXMin) / 2, 2) + Mathf.Pow((townPosZMax - townPosZMin) / 2, 2));
    }
Ejemplo n.º 5
0
    //public static void OutputVoxels(Vector3 worldPos, ulong guid, VArtifactTown newTown)
    //{
    //    ISO = isos[guid];
    //    OutputVoxels(worldPos,newTown);
    //}

    //public static void OutputVoxels(Vector3 worldPos, int townId, VArtifactTown newTown)
    //{
    //    ulong guid = townIdIso[townId];
    //    ISO = isos[guid];
    //    OutputVoxels(worldPos,newTown);
    //}


    public static void OutputVoxels(Vector3 worldPos, VArtifactUnit newTown, float rotation = 0)
    {
        if (!isos.ContainsKey(newTown.isoGuId))
        {
            LoadIso(GetISONameFullPath(newTown.isoName));
        }
        if (!isos.ContainsKey(newTown.isoGuId))
        {
            Debug.LogError("isoGuId error: " + newTown.isoGuId + "isoName: " + newTown.isoName);
            return;
        }
        VArtifactData isoData = isos[newTown.isoGuId];
        //long tick = System.DateTime.Now.Ticks;
        Quaternion q = new Quaternion();

        q.eulerAngles = new Vector3(0, rotation, 0);
        Vector3 XDir = (q * Vector3.right).normalized;
        Vector3 YDir = (q * Vector3.up).normalized;
        Vector3 ZDir = (q * Vector3.forward).normalized;
        //Vector3 XDir = Vector3.right;
        //Vector3 YDir = Vector3.up;
        //Vector3 ZDir = Vector3.forward;
        Vector3 ofs     = new Vector3(isoData.m_HeadInfo.xSize, 0, isoData.m_HeadInfo.zSize) * (-0.5f);
        Vector3 new_pos = worldPos + q * ofs;

        foreach (KeyValuePair <int, VCVoxel> kvp in isoData.m_Voxels)
        {
            Vector3 lpos = new Vector3(kvp.Key & 0x3ff, kvp.Key >> 20, (kvp.Key >> 10) & 0x3ff);
            Vector3 wpos = new_pos
                           + lpos.x * XDir
                           + lpos.y * YDir
                           + lpos.z * ZDir;

            INTVECTOR3 wpos_floor = new INTVECTOR3(Mathf.FloorToInt(wpos.x), Mathf.FloorToInt(wpos.y), Mathf.FloorToInt(wpos.z));
            INTVECTOR3 wpos_ceil  = new INTVECTOR3(Mathf.CeilToInt(wpos.x), Mathf.CeilToInt(wpos.y), Mathf.CeilToInt(wpos.z));

            if (wpos_floor == wpos_ceil)
            {
                OutputTownVoxel(wpos_floor.x, wpos_floor.y, wpos_floor.z, kvp.Value, newTown);
            }
            else
            {
                for (int x = wpos_floor.x; x <= wpos_ceil.x; ++x)
                {
                    for (int y = wpos_floor.y; y <= wpos_ceil.y; ++y)
                    {
                        for (int z = wpos_floor.z; z <= wpos_ceil.z; ++z)
                        {
                            float deltax = 1 - Mathf.Abs(wpos.x - x);
                            float deltay = 1 - Mathf.Abs(wpos.y - y);
                            float deltaz = 1 - Mathf.Abs(wpos.z - z);
                            float u      = deltax * deltay * deltaz;
                            if (u < 0.5f)
                            {
                                u = u / (0.5f + u);
                            }
                            else
                            {
                                u = 0.5f / (1.5f - u);
                            }
                            VCVoxel voxel = kvp.Value;
                            voxel.Volume = (byte)Mathf.CeilToInt(voxel.Volume * u);
                            if (voxel.Volume > 1)
                            {
                                OutputTownVoxel(x, y, z, voxel, newTown);
                            }
                        }
                    }
                }
            }
        }
        // Debug.LogError("Output Time: " + (System.DateTime.Now.Ticks - tick) + " townCount:" + (++townCount));
    }