Ejemplo n.º 1
0
        public bool ScriptExpressionIsValue(HsSyntaxNode expr)
        {
            switch (expr.Flags)
            {
            case HsSyntaxNodeFlags.ParameterReference:
            case HsSyntaxNodeFlags.GlobalsReference:
                return(true);

            case HsSyntaxNodeFlags.Expression:
                if (GetHsTypeAsInteger(Cache.Version, expr.ValueType) > 0x4)     // 0x4 = Void
                {
                    return(true);
                }
                else
                {
                    return(false);
                }

            case HsSyntaxNodeFlags.ScriptReference:     // The opcode is the tagblock index of the script it uses, so ignore
            case HsSyntaxNodeFlags.Group:
                return(false);

            default:
                return(false);
            }
        }
Ejemplo n.º 2
0
        public void ConvertScriptExpressionData(ModPackage modPack, HsSyntaxNode expr)
        {
            if (expr.Flags == HsSyntaxNodeFlags.Expression)
            {
                switch (expr.ValueType.HaloOnline)
                {
                case HsType.HaloOnlineValue.Sound:
                case HsType.HaloOnlineValue.Effect:
                case HsType.HaloOnlineValue.Damage:
                case HsType.HaloOnlineValue.LoopingSound:
                case HsType.HaloOnlineValue.AnimationGraph:
                case HsType.HaloOnlineValue.DamageEffect:
                case HsType.HaloOnlineValue.ObjectDefinition:
                case HsType.HaloOnlineValue.Bitmap:
                case HsType.HaloOnlineValue.Shader:
                case HsType.HaloOnlineValue.RenderModel:
                case HsType.HaloOnlineValue.StructureDefinition:
                case HsType.HaloOnlineValue.LightmapDefinition:
                case HsType.HaloOnlineValue.CinematicDefinition:
                case HsType.HaloOnlineValue.CinematicSceneDefinition:
                case HsType.HaloOnlineValue.BinkDefinition:
                case HsType.HaloOnlineValue.AnyTag:
                case HsType.HaloOnlineValue.AnyTagNotResolving:
                    ConvertScriptTagReferenceExpressionData(modPack, expr);
                    return;

                default:
                    break;
                }
            }
        }
Ejemplo n.º 3
0
        public void ConvertScriptTagReferenceExpressionData(ModPackage modPack, HsSyntaxNode expr)
        {
            var tagIndex = BitConverter.ToInt32(expr.Data.ToArray(), 0);

            if (tagIndex == -1)
            {
                return;
            }

            var tag = ConvertCachedTagInstance(modPack, modPack.TagCaches[0].Tags[tagIndex]);

            expr.Data = BitConverter.GetBytes(tag.Index).ToArray();
        }
Ejemplo n.º 4
0
        private void WriteGroupExpression(HsSyntaxNode expr, BinaryReader stringReader, StreamWriter scriptWriter)
        {
            scriptWriter.Write('(');

            for (var exprIndex = Definition.ScriptExpressions.IndexOf(expr) + 1; Definition.ScriptExpressions[exprIndex].ValueType.HaloOnline != HsType.HaloOnlineValue.Invalid; exprIndex = Definition.ScriptExpressions[exprIndex].NextExpressionHandle.Index)
            {
                WriteExpression(Definition.ScriptExpressions[exprIndex], stringReader, scriptWriter);

                if (Definition.ScriptExpressions[exprIndex].NextExpressionHandle.Index == ushort.MaxValue)
                {
                    break;
                }

                scriptWriter.Write(' ');
            }

            scriptWriter.Write(')');
        }
Ejemplo n.º 5
0
        private void WriteGroupExpression(HsSyntaxNode expr, BinaryReader stringReader, StreamWriter scriptWriter)
        {
            scriptWriter.Write('(');

            for (var exprIndex = (ushort)(Definition.ScriptExpressions.IndexOf(expr) + 1); GetHsTypeAsString(Cache.Version, Definition.ScriptExpressions[exprIndex].ValueType) != "Invalid"; exprIndex = Definition.ScriptExpressions[exprIndex].NextExpressionHandle.Index)
            {
                WriteExpression(Definition.ScriptExpressions[exprIndex], stringReader, scriptWriter);

                if (Definition.ScriptExpressions[exprIndex].NextExpressionHandle.Index == ushort.MaxValue || Definition.ScriptExpressions[exprIndex].NextExpressionHandle.Index + 1 > Definition.ScriptExpressions.Count)
                {
                    break;
                }

                scriptWriter.Write(' ');
            }

            scriptWriter.Write(')');
        }
Ejemplo n.º 6
0
        private void WriteExpression(HsSyntaxNode expr, BinaryReader stringReader, StreamWriter scriptWriter)
        {
            switch (expr.Flags)
            {
            case HsSyntaxNodeFlags.Group:
                WriteGroupExpression(expr, stringReader, scriptWriter);
                break;

            case HsSyntaxNodeFlags.Expression:
                WriteValueExpression(expr, stringReader, scriptWriter);
                break;

            case HsSyntaxNodeFlags.GlobalsReference:
            case HsSyntaxNodeFlags.ParameterReference:
                scriptWriter.Write(expr.StringAddress == 0 ? "none" : ReadScriptString(stringReader, expr.StringAddress));
                break;

            default:
                scriptWriter.Write($"<UNIMPLEMENTED EXPR: {expr.Flags.ToString()} {expr.ValueType.ToString()}>");
                break;
            }
        }
Ejemplo n.º 7
0
        private void WriteValueExpression(HsSyntaxNode expr, BinaryReader stringReader, StreamWriter scriptWriter)
        {
            var valueType = (HsType.Halo3ODSTValue)Enum.Parse(typeof(HsType.Halo3ODSTValue), expr.ValueType.HaloOnline.ToString());

            switch (valueType)
            {
            case HsType.Halo3ODSTValue.FunctionName:
                scriptWriter.Write(expr.StringAddress == 0 ? OpcodeLookup(expr.Opcode) : ReadScriptString(stringReader, expr.StringAddress));
                break;     //Trust the string table, its faster than going through the dictionary with OpcodeLookup.

            case HsType.Halo3ODSTValue.Boolean:
                scriptWriter.Write(expr.Data[0] == 0 ? "false" : "true");
                break;

            case HsType.Halo3ODSTValue.Real:
                scriptWriter.Write(BitConverter.ToSingle(new[] { expr.Data[0], expr.Data[1], expr.Data[2], expr.Data[3] }, 0));
                break;

            case HsType.Halo3ODSTValue.Short:
                scriptWriter.Write(BitConverter.ToInt16(new[] { expr.Data[0], expr.Data[1], }, 0));
                break;

            case HsType.Halo3ODSTValue.Long:
                scriptWriter.Write(BitConverter.ToInt32(new[] { expr.Data[0], expr.Data[1], expr.Data[2], expr.Data[3] }, 0));
                break;

            case HsType.Halo3ODSTValue.String:
                scriptWriter.Write(expr.StringAddress == 0 ? "none" : $"\"{ReadScriptString(stringReader, expr.StringAddress)}\"");
                break;

            case HsType.Halo3ODSTValue.Script:
                scriptWriter.Write(Definition.Scripts[BitConverter.ToInt16(new[] { expr.Data[0], expr.Data[1] }, 0)].ScriptName);
                break;

            case HsType.Halo3ODSTValue.StringId:
                scriptWriter.Write(CacheContext.GetString(new StringId(BitConverter.ToUInt32(new[] { expr.Data[0], expr.Data[1], expr.Data[2], expr.Data[3] }, 0))));
                break;

            case HsType.Halo3ODSTValue.GameDifficulty:
                switch (BitConverter.ToInt16(new[] { expr.Data[0], expr.Data[1] }, 0))
                {
                case 0: scriptWriter.Write("easy"); break;

                case 1: scriptWriter.Write("normal"); break;

                case 2: scriptWriter.Write("heroic"); break;

                case 3: scriptWriter.Write("legendary"); break;

                default: throw new NotImplementedException();
                }
                break;

            case HsType.Halo3ODSTValue.Object:
            case HsType.Halo3ODSTValue.Device:
            case HsType.Halo3ODSTValue.CutsceneCameraPoint:
            case HsType.Halo3ODSTValue.TriggerVolume:
            case HsType.Halo3ODSTValue.UnitSeatMapping:
            case HsType.Halo3ODSTValue.Vehicle:
            case HsType.Halo3ODSTValue.VehicleName:
                scriptWriter.Write(expr.StringAddress == 0 ? "none" : $"\"{ReadScriptString(stringReader, expr.StringAddress)}\"");
                break;

            default:
                scriptWriter.Write($"<UNIMPLEMENTED VALUE: {expr.Flags.ToString()} {expr.ValueType.ToString()}>");
                break;
            }
        }
Ejemplo n.º 8
0
 public void ConvertScriptExpression(ModPackage modPack, HsSyntaxNode expr)
 {
     ConvertScriptExpressionData(modPack, expr);
 }
Ejemplo n.º 9
0
        public void ConvertScriptTagReferenceExpressionData(ModPackageExtended modPack, HsSyntaxNode expr)
        {
            var tagIndex          = BitConverter.ToInt32(expr.Data.ToArray(), 0);
            CachedTagInstance tag = null;

            if (modPack.Tags.Index[tagIndex] == null)
            {
                return;  // references an HO tag
            }
            if (TagMapping.ContainsKey(tagIndex))
            {
                tag = CacheContext.TagCache.Index[TagMapping[tagIndex]];
            }

            expr.Data = BitConverter.GetBytes(tag?.Index ?? -1).ToArray();  // apply proper tag index or set to -1
        }
Ejemplo n.º 10
0
        private void WriteValueExpression(HsSyntaxNode expr, BinaryReader stringReader, StreamWriter scriptWriter)
        {
            var valueType = GetHsTypeAsString(Cache.Version, expr.ValueType);

            switch (valueType)
            {
            case "FunctionName":
                scriptWriter.Write(expr.StringAddress == 0 ? OpcodeLookup(expr.Opcode) : ReadScriptString(stringReader, expr.StringAddress));
                break;     //Trust the string table, its faster than going through the dictionary with OpcodeLookup.

            case "Boolean":
                scriptWriter.Write(expr.Data[0] == 0 ? "false" : "true");
                break;

            case "Real":
                scriptWriter.Write(BitConverter.ToSingle(SortExpressionDataArray(Cache.Endianness, expr.Data, 4), 0));
                break;

            case "Short":
                scriptWriter.Write(BitConverter.ToInt16(SortExpressionDataArray(Cache.Endianness, expr.Data, 2), 0));
                break;

            case "Long":
                scriptWriter.Write(BitConverter.ToInt32(SortExpressionDataArray(Cache.Endianness, expr.Data, 4), 0));
                break;

            case "String":
                scriptWriter.Write(expr.StringAddress == 0 ? "none" : $"\"{ReadScriptString(stringReader, expr.StringAddress)}\"");
                break;

            case "Script":
                scriptWriter.Write(Definition.Scripts[BitConverter.ToInt16(SortExpressionDataArray(Cache.Endianness, expr.Data, 2), 0)].ScriptName);
                break;

            case "StringId":
                scriptWriter.Write(Cache.StringTable.GetString(new StringId(BitConverter.ToUInt32(SortExpressionDataArray(Cache.Endianness, expr.Data, 4), 0))));
                break;

            case "GameDifficulty":
                switch (BitConverter.ToInt16(SortExpressionDataArray(Cache.Endianness, expr.Data, 2), 0))
                {
                case 0: scriptWriter.Write("easy"); break;

                case 1: scriptWriter.Write("normal"); break;

                case 2: scriptWriter.Write("heroic"); break;

                case 3: scriptWriter.Write("legendary"); break;

                default: throw new NotImplementedException();
                }
                break;

            case "Object":
            case "Device":
            case "CutsceneCameraPoint":
            case "TriggerVolume":
            case "UnitSeatMapping":
            case "Vehicle":
            case "VehicleName":
                scriptWriter.Write(expr.StringAddress == 0 ? "none" : $"\"{ReadScriptString(stringReader, expr.StringAddress)}\"");
                break;

            default:
                scriptWriter.Write($"<UNIMPLEMENTED VALUE: {expr.Flags.ToString()} {valueType}>");
                break;
            }
        }