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); } }
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; } } }
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(); }
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(')'); }
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(')'); }
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; } }
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; } }
public void ConvertScriptExpression(ModPackage modPack, HsSyntaxNode expr) { ConvertScriptExpressionData(modPack, expr); }
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 }
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; } }