using System; using System.Diagnostics; using System.Collections; namespace BinLogReader { public enum BinLogOp { BinLog_Invalid=0, BinLog_Start=1, BinLog_End, BinLog_NativeCall, // BinLog_NativeError, BinLog_NativeRet, BinLog_CallPubFunc, // BinLog_SetLine, // BinLog_Registered, // BinLog_FormatString, BinLog_NativeParams, BinLog_GetString, BinLog_SetString, }; public enum BinLogFlags { Show_RealTime = (1<<0), Show_GameTime = (1<<1), Show_PlugId = (1<<2), Show_PlugFile = (1<<3), }; public abstract class BinLogEntry { protected float GameTime; protected long RealTime; protected Plugin pl; protected BinLogEntry(float gt, long rt, Plugin _pl) { GameTime = gt; RealTime = rt; pl = _pl; } public static bool HasFlag(BinLogFlags a, BinLogFlags b) { return ( (a & b) == b ); } public static string PluginText(Plugin pl, BinLogFlags flags) { string plugintext = ""; if (HasFlag(flags, BinLogFlags.Show_PlugId) && HasFlag(flags, BinLogFlags.Show_PlugFile)) { plugintext = "\"" + pl.File + "\"" + " (" + pl.Index + ")"; } else if (HasFlag(flags, BinLogFlags.Show_PlugId)) { plugintext = pl.Index.ToString(); } else if (HasFlag(flags, BinLogFlags.Show_PlugFile)) { plugintext = "\"" + pl.File + "\""; } return plugintext; } public static string BinLogString(BinLogEntry ble, BinLogFlags flags) { string logtext = ""; if (HasFlag(flags, BinLogFlags.Show_RealTime)) logtext += ble.realtime.ToString(); if (HasFlag(flags, BinLogFlags.Show_GameTime)) { if (logtext.Length > 0) { logtext += ", " + ble.gametime.ToString(); } else { logtext += ble.gametime.ToString(); } } logtext += ": "; logtext += ble.ToLogString(flags); return logtext; } public float gametime { [DebuggerStepThrough] get { return GameTime; } } public Plugin plugin { [DebuggerStepThrough] get { return pl; } } public long realtime { [DebuggerStepThrough] get { return RealTime; } } public abstract BinLogOp Op(); public abstract string ToLogString(BinLogFlags flags); }; public class BinLogSetLine : BinLogEntry { private int line; public int Line { get { return line; } } public BinLogSetLine(int _line, float gt, long rt, Plugin _pl) : base(gt, rt, _pl) { line = _line; } public override string ToLogString(BinLogFlags flags) { string plugtext = BinLogEntry.PluginText(plugin, flags); string logtext = "Plugin hit line " + Line + "."; return logtext; } public override BinLogOp Op() { return BinLogOp.BinLog_SetLine; } } public class BinLogPublic : BinLogEntry { private int pubidx; public string Public { get { return plugin.FindPublic(pubidx); } } public BinLogPublic(int pi, float gt, long rt, Plugin _pl) : base(gt, rt, _pl) { pubidx = pi; } public override string ToLogString(BinLogFlags flags) { string plugtext = BinLogEntry.PluginText(plugin, flags); string logtext = "Plugin " + plugtext + " had public function "; logtext += "\"" + Public + "\" (" + pubidx + ") called."; return logtext; } public override BinLogOp Op() { return BinLogOp.BinLog_CallPubFunc; } } public class BinLogSetString : BinLogEntry { private long address; private int maxlen; private string text; public BinLogSetString(long addr, int _maxlen, string fmt, float gt, long rt, Plugin _pl) : base(gt, rt, _pl) { address = addr; maxlen = _maxlen; text = fmt; } public override string ToLogString(BinLogFlags flags) { string plugtext = BinLogEntry.PluginText(plugin, flags); string logtext = "Setting string (addr " + address + ") (maxlen " + maxlen + ") from Plugin " + plugtext + ". String:"; logtext += "\n\t " + text; return logtext; } public override BinLogOp Op() { return BinLogOp.BinLog_GetString; } } public class BinLogGetString : BinLogEntry { private long address; private string text; public BinLogGetString(long addr, string fmt, float gt, long rt, Plugin _pl) : base(gt, rt, _pl) { address = addr; text = fmt; } public override string ToLogString(BinLogFlags flags) { string plugtext = BinLogEntry.PluginText(plugin, flags); string logtext = "Retrieving string (addr " + address + ") from Plugin " + plugtext + ". String:"; logtext += "\n\t " + text; return logtext; } public override BinLogOp Op() { return BinLogOp.BinLog_GetString; } } public class BinLogNativeRet : BinLogEntry { private long returnval; public BinLogNativeRet(long ret, float gt, long rt, Plugin _pl) : base(gt, rt, _pl) { returnval = ret; } public override string ToLogString(BinLogFlags flags) { return "Native returned: " + returnval; } public override BinLogOp Op() { return BinLogOp.BinLog_NativeRet; } } public class BinLogNativeCall : BinLogEntry { private int nativeidx; private int numparams; public string Native { get { return plugin.FindNative(nativeidx); } } public BinLogNativeCall(int na, int nu, float gt, long rt, Plugin _pl) : base(gt, rt, _pl) { nativeidx = na; numparams = nu; } public override string ToLogString(BinLogFlags flags) { string plugtext = BinLogEntry.PluginText(plugin, flags); string logtext = "Plugin " + plugtext + " called native "; logtext += "\"" + Native + "\" (" + nativeidx + ")"; logtext += " with " + numparams + " parameters."; return logtext; } public override BinLogOp Op() { return BinLogOp.BinLog_NativeCall; } } public class BinLogSimple : BinLogEntry { private BinLogOp my_op; public BinLogSimple(BinLogOp op, float gt, long rt, Plugin _pl) : base(gt, rt, _pl) { my_op = op; } public override string ToLogString(BinLogFlags flags) { switch (my_op) { case BinLogOp.BinLog_Start: { return "Binary log started."; } case BinLogOp.BinLog_End: { return "Binary log ended."; } case BinLogOp.BinLog_Invalid: { return "Binary log corrupt past this point."; } } return ""; } public override BinLogOp Op() { return my_op; } } public class BinLogNativeParams : BinLogEntry { private ArrayList plist; public ArrayList ParamList { get { return plist; } set { plist = value; } } public override BinLogOp Op() { return BinLogOp.BinLog_NativeParams; } public BinLogNativeParams(float gt, long rt, Plugin _pl) : base(gt, rt, _pl) { } public override string ToLogString(BinLogFlags flags) { string logtext = "Native parameters: ("; if (plist != null) { for (int i=0; i