public bool ShowInspectorGUI(){
		// this is called from the ScriptedAction custom inspector, and only shows the fields needed for the selected type
		bool dirty = false;
		if (serializedObject == null) serializedObject = new SerializedObject(this); // needed to display arrays in editor like fashion
		msgType = (eMsgType)EditorGUILayout.EnumPopup("msgType",(Enum)msgType);
		EditorGUI.BeginChangeCheck();
		if (msgType == eMsgType.interactMsg){
			if (gameObjectName == null) gameObjectName = "";
			gameObjectName = EditorGUILayout.TextField("gameObject",gameObjectName);
			if (map != null) dirty |= map.ShowInspectorGUI("map");		
			log = EditorGUILayout.Toggle("log",log);
		}
		if (msgType == eMsgType.interactStatusMsg){
			if (gameObjectName == null) gameObjectName = "";
			gameObjectName = EditorGUILayout.TextField("gameObject",gameObjectName);
			sendMap = EditorGUILayout.Toggle("send Map?",sendMap);
			if (sendMap && map != null) 
				dirty |= map.ShowInspectorGUI("map");		
			else
				interactName = EditorGUILayout.TextField("interactName",interactName);
			log = EditorGUILayout.Toggle("log",log);
			
			// to show a string array in the editor:
			serializedObject.Update();
    		EditorGUIUtility.LookLikeInspector();
    		SerializedProperty myIterator = serializedObject.FindProperty("Params");
   			while (true){
        	Rect myRect = GUILayoutUtility.GetRect(0f, 16f);
        	bool showChildren = EditorGUI.PropertyField(myRect, myIterator);
			if (!myIterator.NextVisible(showChildren)) break;
			}
    		serializedObject.ApplyModifiedProperties()	;
			EditorGUIUtility.LookLikeControls();
			
		}
		if (msgType == eMsgType.animateMsg){
			state = (eAnimateState)EditorGUILayout.EnumPopup("state",(Enum)state);
			if (name == null) name = "";
			name = EditorGUILayout.TextField("name",name);
		}
		if (msgType == eMsgType.taskMsg){
			
		}
		if (msgType == eMsgType.dialogMsg 
			|| msgType == eMsgType.errorDialogMsg 
			|| msgType == eMsgType.quickInfoDialogMsg
			|| msgType == eMsgType.popupMsg )
		{
			command = (DialogMsg.Cmd)EditorGUILayout.EnumPopup("command",(Enum)command);
			x = EditorGUILayout.IntField("x",x);
			y = EditorGUILayout.IntField("y",y);
			w = EditorGUILayout.IntField("w",w);
			h = EditorGUILayout.IntField("h",h);
			text = EditorGUILayout.TextField("text",text);	
			title = EditorGUILayout.TextField("title",title);
			time = EditorGUILayout.FloatField("time",time);
			modal = EditorGUILayout.Toggle("modal",modal);
		}
		if (msgType == eMsgType.dialogMsg) 
		{
			if (xmlName == null) xmlName = "";
			xmlName = EditorGUILayout.TextField ("xmlName",xmlName);
			if (className == null) className = "";
			className = EditorGUILayout.TextField("className",className);
			dialogName = EditorGUILayout.TextField("dialogName",dialogName);
			waitForDialogClosed = EditorGUILayout.Toggle("waitForDialogClosed",waitForDialogClosed);
			if ( waitForDialogClosed == true )
				waitForDialogName = EditorGUILayout.TextField("waitForDalogName",waitForDialogName);
			anchor = EditorGUILayout.TextField("anchor",anchor);
			numArguments = EditorGUILayout.IntField("numArguments",numArguments);
			// display number of arguments...change number of fields on change
			if (arguments.Count != numArguments )
			{
				List<string> newlist = new List<string>();
				if ( numArguments > arguments.Count )
				{
					// new is greater than current...just copy old to new
					foreach( string arg in arguments )
						newlist.Add(arg);
					// add blank(s) at the end
					for( int i=0 ; i<(numArguments-arguments.Count) ; i++)
						newlist.Add("");
				}
				else
				{
					// new is less than current...just copy old-1 to new
					foreach( string arg in arguments )
					{
						if ( newlist.Count < numArguments )
							newlist.Add(arg);
					}
				}
				// reassign
				arguments = newlist;
			}
			for (int i=0 ; i<arguments.Count ; i++)
			{
				arguments[i] = EditorGUILayout.TextField ("argument" + (i+1).ToString (),arguments[i]);
			}
		}
		if (msgType == eMsgType.guiScreenMsg) 
		{
			if (ScreenName == null) ScreenName = "";
			ScreenName = EditorGUILayout.TextField ("xmlName",ScreenName);
			numArguments = EditorGUILayout.IntField("numArguments",numArguments);
			// display number of arguments...change number of fields on change
			if (arguments.Count != numArguments )
			{
				List<string> newlist = new List<string>();
				if ( numArguments > arguments.Count )
				{
					// new is greater than current...just copy old to new
					foreach( string arg in arguments )
						newlist.Add(arg);
					// add blank(s) at the end
					for( int i=0 ; i<(numArguments-arguments.Count) ; i++)
						newlist.Add("");
				}
				else
				{
					// new is less than current...just copy old-1 to new
					foreach( string arg in arguments )
					{
						if ( newlist.Count < numArguments )
							newlist.Add(arg);
					}
				}
				// reassign
				arguments = newlist;
			}
			for (int i=0 ; i<arguments.Count ; i++)
			{
				arguments[i] = EditorGUILayout.TextField ("argument" + (i+1).ToString (),arguments[i]);
			}
		}
		
		
		
		if (msgType == eMsgType.errorDialogMsg){
			
		}
		if (msgType == eMsgType.interactDialogMsg){
			
		}
		if (msgType == eMsgType.quickInfoDialogMsg){
			timeout = EditorGUILayout.FloatField("timeout",timeout);
			editbox = EditorGUILayout.Toggle("editbox",editbox);
			if (editboxlabel == null) editboxlabel = "";
			editboxlabel = EditorGUILayout.TextField("editboxlabel",editboxlabel);
			if (editboxprompt == null) editboxprompt = "";
			editboxprompt = EditorGUILayout.TextField("editboxprompt",editboxprompt);
		}
		if (msgType == eMsgType.popupMsg){
			hasCancel = EditorGUILayout.Toggle("hasCancel",hasCancel);
			if (commandString == null) commandString = "";
			commandString = EditorGUILayout.TextField("commandString",commandString);
		}

		dirty |= EditorGUI.EndChangeCheck();
		if (dirty) EditorUtility.SetDirty(this);
		return dirty;
	}
	public void InitFrom(GameMsgFormInfo info){

		msgType = info.msgType; // type of message to construct from this form

		gameObjectName = info.gameObjectName;
		log = info.log;
			// interact status message
		interactName = info.interactName;

			// dialog message
		command = info.command;
		x = info.x;
		y = info.y;
		w = info.w;
		h = info.h;
		text = info.text;
		title = info.title;
		time = info.time;
		modal = info.modal;
		xmlName = info.xmlName;
		className = info.className;
		dialogName = info.dialogName;
		anchor = info.anchor;
		arguments = info.arguments;
		numArguments = info.numArguments;
		waitForDialogClosed = info.waitForDialogClosed;
		waitForDialogName = info.waitForDialogName;
			//quickinfomsg
		timeout = info.timeout;
		editbox = info.editbox;
		editboxlabel = info.editboxlabel;
		editboxprompt = info.editboxprompt;
		sendMap = info.sendMap;
			//interact dialog
		items = info.items;
		//info.baseobj = gmf.baseobj;
		baseXML = info.baseXML;

			//popupmsg
		hasCancel = info.hasCancel;
		commandString = info.commandString;
		Params = info.Params; // used for interact status message	
			// GUIScreenMsg
		ScreenName = info.ScreenName;

	}