// --------------------------------------------------- \\
        // -----------------Display Methods------------------- \\
        // --------------------------------------------------- \\
        //  Display the event's name, offset and parameters.
        public void DisplayEvent(Event eventData)
        {
            lstParameters.Items.Clear();
            cboType.SelectedIndex = -1;
            cboType.Text = "";
            cboType.Enabled = false;
            lblParamDescription.Text = "No Description Available.";
            for (int i = 0; i < typeDisp.Length; i++)
                typeDisp[i].Visible = false;

            paramData = p.GetParameterInfo(eventData.eventId);
            lblEventName.Text = p.GetEventInfo(eventData.eventId).name;
            lblEventId.Text = eventData.eventId;
            lblParameterListOffset.Text = "0x" + p.Hex(eventData.pParameters);

            for (int i = 0; i < eventData.lParameters; i++)
                lstParameters.Items.Add(paramData.GetName(i));
        }
        //  Construct the scirpt for the events to be displayed in the windows.
        public string[] MakeScript(Event[] events)
        {
            string[] script = new string[events.Length];
            long tabs = 0;

            for (int i = 0; i < events.Length; i++)
            {
                //  Format the event and it's parameters into readable script.
                string syntax = GetEventSyntax(events[i].eventId);
                script[i] = ResolveEventSyntax(syntax, events[i]);
                if (script[i] == "") script[i] = GetDefaultSyntax(events[i]);

                //  Add tabs to the script in correspondence to the code blocks.
                tabs -= TabDownEvents(events[i].eventId);
                for (int i2 = 0; i2 < tabs; i2++) script[i] = "\t" + script[i];
                tabs += TabUpEvents(events[i].eventId);
            }
            return script;
        }
        //  Return the parameters contained in the keyword's parameter list.
        public string[] GetParameters(string strParams, Event eventData)
        {
            string[] parameters = new string[0];
            char chrFound = '\0';
            int paramEnd = -1;
            int index = 0;
            int loc = 0;

            //  Search for a ',' or a ')' and return the preceeding string.
            do
            {
                paramEnd = FindFirstOfIgnoreNest(strParams, loc, new char[] { ',', ')' }, ref chrFound);
                if (paramEnd == -1) paramEnd = strParams.Length;

                Array.Resize<string>(ref parameters, index + 1);
                parameters[index] = strParams.Substring(loc, paramEnd - loc);
                parameters[index] = ClearWhiteSpace(parameters[index]);

                loc = paramEnd + 1;
                index++;
            } while (chrFound != ')' && chrFound != '\0');

            //  Check each parameter for keywords and resolve if they are present.
            for (int i = 0; i < parameters.Length; i++)
                if (parameters[i] != "") parameters[i] = ResolveEventSyntax(parameters[i], eventData);

            return parameters;
        }
        //  Return the event name followed by each parameter paired with it's type.
        public string GetDefaultSyntax(Event eventData)
        {
            string script = GetEventInfo(eventData.eventId).name + ": ";
            for (int i = 0; i < eventData.lParameters; i++)
                script += Hex(eventData.parameters[i].word1) + "-" + Hex(eventData.parameters[i].word2) + ", ";

            return script;
        }
        public Event Deserialize(string s)
        {
            if (String.IsNullOrEmpty(s))
                return null;

            try
            {
                string[] lines = s.Split('|');

                if (lines[0].Length != 8)
                    return null;

                Event newEvent = new Event();

                string id = lines[0];
                uint idNumber = Convert.ToUInt32(id, 16);

                newEvent.SetEventWord(idNumber);
                newEvent.pParameters = Allocate(newEvent.lParameters * 2);

                for (int i = 0; i < newEvent.lParameters; i++)
                {
                    string[] pLines = lines[i + 1].Split('\\');
                    int word1 = int.Parse(pLines[0]);
                    int word2 = UnHex(pLines[1]);

                    newEvent.parameters[i].word1 = word1;
                    newEvent.parameters[i].word2 = word2;

                    SetWord(newEvent.parameters[i].word1, newEvent.pParameters + ToBlock(i));
                    if (newEvent.parameters[i].word1 != 2)
                        SetWord(newEvent.parameters[i].word2, newEvent.pParameters + ToBlock(i) + B_WORD2);
                    else
                        SetPointer(newEvent.parameters[i].word2, newEvent.pParameters + ToBlock(i) + B_WORD2);
                }

                AddEvent(newEvent.GetEventWord(), newEvent.pParameters);

                return newEvent;
            }
            catch { return null; }
        }
        //  Return a string of the parameter in the format corresponding to it's type.
        public string[] ResolveParamTypes(Event eventData)
        {
            string[] p = new string[eventData.parameters.Length];

            for (int i = 0; i < p.Length; i++)
            {
                switch (eventData.parameters[i].word1)
                {
                    case 0: p[i] = Hex(eventData.parameters[i].word2); break;
                    case 1: p[i] = UnScalar(eventData.parameters[i].word2).ToString(); break;
                    case 2: p[i] = ResolvePointer(eventData.pParameters + ToBlock(i) + B_WORD2, eventData.parameters[i]); break;
                    case 3: p[i] = (eventData.parameters[i].word2 != 0 ? "true" : "false"); break;
                    case 4: p[i] = Hex(eventData.parameters[i].word2); break;
                    case 5: p[i] = ResolveVariable(eventData.parameters[i].word2); break;
                    case 6: p[i] = GetRequirement(eventData.parameters[i].word2); break;
                }
            }
            return p;
        }
        //  Return the string result from the passed keyword and it`s parameters.
        public string ResolveKeyword(string keyword, string[] Params, Event eventData)
        {
            switch (keyword)
            {
                case "\\value":
                    try { return ResolveParamTypes(eventData)[int.Parse(Params[0])]; }
                    catch { return "Value-" + Params[0]; }
                case "\\type":
                    try { return eventData.parameters[int.Parse(Params[0])].word1.ToString(); }
                    catch { return "Type-" + Params[0]; }
                case "\\if":
                    bool compare = false;

                    try
                    {
                        switch (Params[1])
                        {
                            case "==": compare = int.Parse(Params[0]) == int.Parse(Params[2]); break;
                            case "!=": compare = int.Parse(Params[0]) != int.Parse(Params[2]); break;
                            case ">=": compare = int.Parse(Params[0]) >= int.Parse(Params[2]); break;
                            case "<=": compare = int.Parse(Params[0]) <= int.Parse(Params[2]); break;
                            case ">": compare = int.Parse(Params[0]) > int.Parse(Params[2]); break;
                            case "<": compare = int.Parse(Params[0]) < int.Parse(Params[2]); break;
                        }
                    }
                    finally { }

                    if (compare) return Params[3];
                    else return Params[4];
                case "\\unhex":
                    try { return UnHex(Params[0]).ToString(); }
                    catch { return Params[0]; }
                case "\\hex":
                    try { return Hex(int.Parse(Params[0])); }
                    catch { return Params[0]; }
                case "\\hex8":
                    try { return Hex8(int.Parse(Params[0])); }
                    catch { return Params[0]; }
                case "\\half1":
                    return WordH(Params[0], 0);
                case "\\half2":
                    return WordH(Params[0], 1);
                case "\\byte1":
                    return WordB(Params[0], 0);
                case "\\byte2":
                    return WordB(Params[0], 1);
                case "\\byte3":
                    return WordB(Params[0], 2);
                case "\\byte4":
                    return WordB(Params[0], 3);
                case "\\collision":
                    try { return GetCollisionStatus(UnHex(Params[0])); }
                    catch { return Params[0]; }
                case "\\airground":
                    try { return GetAirGroundStatus(UnHex(Params[0])); }
                    catch { return Params[0]; }
                case "\\cmpsign":
                    try { return GetComparrisonSign(UnHex(Params[0])); }
                    catch { return Params[0]; }
                case "\\name":
                    return GetEventInfo(eventData.eventId).name;
                case "\\white":
                    return " ";
                default:
                    return "";
            }
        }
        //  Return the passed syntax with all keywords replaced with their proper values.
        public string ResolveEventSyntax(string syntax, Event eventData)
        {
            while (true)
            {
                string keyword = "";
                string keyResult = "";
                string strParams = "";
                string[] kParams;
                int keyBegin = FindFirst(syntax, 0, '\\');
                if (keyBegin == -1) break;
                int keyEnd = FindFirst(syntax, keyBegin, '(');
                if (keyEnd == -1) keyEnd = syntax.Length;
                int paramsBegin = keyEnd + 1;
                int paramsEnd = FindFirstIgnoreNest(syntax, paramsBegin, ')');
                if (paramsEnd == -1) paramsEnd = syntax.Length;

                keyword = syntax.Substring(keyBegin, keyEnd - keyBegin);
                strParams = syntax.Substring(paramsBegin, paramsEnd - paramsBegin);
                kParams = GetParameters(strParams, eventData);
                keyResult = ResolveKeyword(keyword, kParams, eventData);
                syntax = DelSubstring(syntax, keyBegin, (paramsEnd + 1) - keyBegin);
                syntax = InsString(syntax, keyResult, keyBegin);
            }

            return syntax;
        }
        //  Read the list of events at the specified offset and return as an array of Events.
        public Event[] ReadEventList(long offset)
        {
            Event[] eventData = new Event[0];

            if (offset != 0)
            {
                for (int i = 0; ; i++)
                {
                    Array.Resize<Event>(ref eventData, i + 1);
                    eventData[i] = ReadEventData(offset + ToBlock(i));

                    if (eventData[i].GetEventWord() == 0)
                    { Array.Resize<Event>(ref eventData, i); break; }
                }
            }
            return eventData;
        }
        //  Read the event data at the specified offset and return as an Event.
        public Event ReadEventData(long offset)
        {
            Event eventData = new Event();

            try
            {
                eventData.pThis = offset;
                eventData.SetEventWord(GetWord(eventData.pThis));
                eventData.pParameters = GetWord(eventData.pThis + B_WORD2);

                for (int i = 0; i < eventData.lParameters; i++)
                {
                    eventData.parameters[i].word1 = GetWord(eventData.pParameters + ToBlock(i));
                    eventData.parameters[i].word2 = GetWord(eventData.pParameters + ToBlock(i) + B_WORD2);
                }
            }
            catch
            {
                eventData = new Event();
            }

            return eventData;
        }