protected void initializeCommandTypeInfo()
    {
        commandTypes = new Integer[] {
                new Integer(EVENT_COMMAND__None), // 0;
                new Integer(EVENT_COMMAND__EndEvent), // 1 - EVENT_COMMAND__STOP_PROCESSING
                new Integer(EVENT_COMMAND__TownEvent), // 2 - EVENT_COMMAND__IDENTITY
                new Integer(EVENT_COMMAND__EV_PlaySound), // 3 - unverified
                new Integer(EVENT_COMMAND__EventVerb), // 4 - EVENT_COMMAND__MOUSEOVER
                new Integer(EVENT_COMMAND__EventMazeInfo), // 5 - unverified
                new Integer(EVENT_COMMAND__ChangeXYZ), // 6 - EVENT_COMMAND__TELEPORT
                new Integer(EVENT_COMMAND__GiveChest), // 7 - EVENT_COMMAND__OPEN_CHEST
                new Integer(EVENT_COMMAND__PlayFace), // 8 - EVENT_COMMAND__SHOW_FACIAL_EXPRESSION
                new Integer(EVENT_COMMAND__CharDamage), // 9 - unverified
                new Integer(EVENT_COMMAND__Weather), // 10 - unverified
                
                new Integer(EVENT_COMMAND__EV_PlaySmacker), // 11 - unverified
                // changing an object texture is 12, maybe playsmacker is 11 instead (swapped for mm7/8?)
                new Integer(EVENT_COMMAND__ModifyTexture), // 12 - EVENT_COMMAND__CHANGE_3DOBJECT_FACE_BITMAP
                
                new Integer(EVENT_COMMAND__ModifyDecoration), // 13 - EVENT_COMMAND__CHANGE_SPRITE
                new Integer(EVENT_COMMAND__IfHas), // 14 - EVENT_COMMAND__BRANCH_ON_CONDITION_TRUE
                new Integer(EVENT_COMMAND__EV_Door), // 15 - unverified
                new Integer(EVENT_COMMAND__Give), // 16 - EVENT_COMMAND__ADD_TARGET
                new Integer(EVENT_COMMAND__Take), // 17 - EVENT_COMMAND__DELETE_TARGET
                new Integer(EVENT_COMMAND__Set), // 18 - EVENT_COMMAND__SET_TARGET
                new Integer(EVENT_COMMAND__CreateMonster), // 19 - EVENT_COMMAND__CREATE_LOCAL_MONSTER
                new Integer(EVENT_COMMAND__ModifyItem), // 20 - unverified
                new Integer(EVENT_COMMAND__EV_CastSpell), // 21 - EVENT_COMMAND__CAST_SPELL_FROM_LOCATION
                new Integer(EVENT_COMMAND__DoNPC), // 22 - unverified
                new Integer(EVENT_COMMAND__FacetAttrib), // 23 - unverified
                new Integer(EVENT_COMMAND__ModifyMonster), // 24 - unverified
                new Integer(EVENT_COMMAND__RandomGoto), // 25 - unverified
                new Integer(EVENT_COMMAND__GetInput), // 26 - unverified
                new Integer(EVENT_COMMAND__RndPassword), // 27 - unverified
                new Integer(EVENT_COMMAND__RndAnswer), // 28 - unverified
                new Integer(EVENT_COMMAND__EV_PrintStatus), // 29 - EVENT_COMMAND__SHOW_LOCAL_EVENT_STRING
                new Integer(EVENT_COMMAND__PrintScroll), // 30 - EVENT_COMMAND__SHOW_NPCTEXT_STRING
                new Integer(EVENT_COMMAND__TimeEvent), // 31 - unverified
                new Integer(EVENT_COMMAND__ModifyLight), // 32 - unverified
                new Integer(EVENT_COMMAND__AnyKey), // 33 - unverified
                new Integer(EVENT_COMMAND__SpoutObject), // 34 - EVENT_COMMAND__UNKNOWN_VOLCANO_EFFECT, something to do with the volcano buoy effect at New Sorpigal
                new Integer(EVENT_COMMAND__SetActiveChar), // 35 - EVENT_COMMAND__MODIFY_NEXT_COMMAND_BY_PARTY_MEMBER
                new Integer(EVENT_COMMAND__EV_Goto), // 36 - EVENT_COMMAND__GOTO
                new Integer(EVENT_COMMAND__OnLoad), // 37 - EVENT_COMMAND__ON_LEVEL_RELOAD_EXECUTE, Stop processing / On level load level?
                new Integer(EVENT_COMMAND__TimeEvent2), // 38 - EVENT_COMMAND__UNKNOWN_ON_X2_EXECUTE
                new Integer(EVENT_COMMAND__ChangeNPCEvent), // 39 - EVENT_COMMAND__CHANGE_DIALOG_EVENT, npctext/npctopic
                new Integer(EVENT_COMMAND__ChangeNPC2DLoc), // 40 - unverified
                new Integer(EVENT_COMMAND__CreateItem), // 41 - unverified
                new Integer(EVENT_COMMAND__ChangeEvent), // 42 - unverified
                new Integer(EVENT_COMMAND__CheckSkill), // 43 - unverified
                new Integer(EVENT_COMMAND__IfHasPrecondition), // 44 - unverified
                new Integer(EVENT_COMMAND__EndPrecondition), // 45 - unverified
                new Integer(EVENT_COMMAND__Precondition), // 46 - unverified
                new Integer(EVENT_COMMAND__ChangeGroupNews), // 47 - unverified
                new Integer(EVENT_COMMAND__ChangeMonsterGroup), // 48 - unverified
                new Integer(EVENT_COMMAND__ChangeNPCInv), // 49 - unverified
                new Integer(EVENT_COMMAND__ChangeNPCGreeting), // 50 - unverified
                new Integer(EVENT_COMMAND__IfMonsterDead), // 51 - unverified
                new Integer(EVENT_COMMAND__IfMonsterDeadPrecondition), // 52 - unverified
                new Integer(EVENT_COMMAND__OnExit), // 53 - unverified
                new Integer(EVENT_COMMAND__ChangeGroupToGroup), // 54 - unverified
                new Integer(EVENT_COMMAND__ChangeGroupAlly), // 55 - unverified
                new Integer(EVENT_COMMAND__IfSeason), // 56 - unverified
                new Integer(EVENT_COMMAND__ModifyMonsterGroup), // 57 - unverified
                new Integer(EVENT_COMMAND__ModifyChest), // 58 - unverified
                new Integer(EVENT_COMMAND__PlayAction), // 59 - unverified
                new Integer(EVENT_COMMAND__ChangeMonsterInv) // 60 - unverified
        };

        Object argumentTypesForCommandTypeArray[] = new Object[] {
                _I_(EVENT_COMMAND__None),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__EndEvent),  new Object[] {
                        _I_(ARGUMENT_TYPE__ZERO_BYTE_PLACEHOLDER), null, null, _I_(0)
                	},
                _I_(EVENT_COMMAND__TownEvent),  new Object[] { 
                        _I_(ARGUMENT_TYPE__2DEVENT_NUMBER), "Execute 2DEvent#", null, _I_(0)
                	},
                _I_(EVENT_COMMAND__EV_PlaySound),  new Object[] {
        				_I_(ARGUMENT_TYPE__SOUND_NUMBER), "#", null, _I_(0),
            			_I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "unknown int", null, _I_(1), // followed by 8 zero bytes?
            			_I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "unknown int", null, _I_(2)
                	},
                _I_(EVENT_COMMAND__EventVerb),  new Object[] { 
                        _I_(ARGUMENT_TYPE__LOCAL_EVENT_STRING_NUMBER), "local event string #", null, _I_(0)
                    },
                _I_(EVENT_COMMAND__EventMazeInfo),  new Object[] { // sequence is never incremented "free item", ignored in actual game?
                		_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "?", null, _I_(0)
                	},
                _I_(EVENT_COMMAND__ChangeXYZ),  new Object[] { 
                        _I_(ARGUMENT_TYPE__COORDINATE_SET), "destination coordinates", null, _I_(1), // dest x, y, z
                        _I_(ARGUMENT_TYPE__COORDINATE_SET), "facing", null, _I_(2), // dest HORIZONTAL p, phi_angle; VERTICAL t, theta_angle; ? v, vz - not really sure if this is an orientation
                        _I_(ARGUMENT_TYPE__DIALOG_NUMBER), "dialog#", null, _I_(3), // smacker number - 1 byte mm6/7, 2 bytes mm8
                        _I_(ARGUMENT_TYPE__MINI_ICON_NUMBER), "icon#", null, _I_(4), // picture
                        _I_(ARGUMENT_TYPE__FILENAME_13), "to level", null, _I_(0) // level name
                	},
                _I_(EVENT_COMMAND__GiveChest),  new Object[] {
                        _I_(ARGUMENT_TYPE__CHEST_NUMBER), "#", null, _I_(0)
                    },
                _I_(EVENT_COMMAND__PlayFace),  new Object[] {
                        _I_(ARGUMENT_TYPE__PARTY_MEMBER), "for", null, _I_(1),
                        _I_(ARGUMENT_TYPE__FACE_IMAGE_NUMBER), "image #", null, _I_(0)
                },
                _I_(EVENT_COMMAND__CharDamage),  new Object[] {
            			_I_(ARGUMENT_TYPE__PARTY_MEMBER),  null, null, _I_(0),
            			_I_(ARGUMENT_TYPE__UNKNOWN_BYTE),  "damage type", null, _I_(1),
            			_I_(ARGUMENT_TYPE__UNKNOWN_INTEGER),  "damage amount", null, _I_(2)
                },
                _I_(EVENT_COMMAND__Weather),  new Object[] {
                    	_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "should change state?", null, _I_(0), // only change the weather if non-zero?
                    	_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "mode?", null, _I_(1), // 0 is normal, 1 is snow
                	},
                _I_(EVENT_COMMAND__ModifyTexture),  new Object[] { 
                        _I_(ARGUMENT_TYPE__3DOBJECT_NUMBER), "object #", null, _I_(0), // looks like this may be gone in mm7/8
                        _I_(ARGUMENT_TYPE__FACET_NUMBER), "face #", null, _I_(0), // 
                        _I_(ARGUMENT_TYPE__FILENAME_12), "to texture", null, _I_(0) // bitmap name, maybe only 7 characters?
                	},
                _I_(EVENT_COMMAND__EV_PlaySmacker),  new Object[] {
						_I_(ARGUMENT_TYPE__UNKNOWN_BYTE),  "?", null, _I_(0),
						_I_(ARGUMENT_TYPE__UNKNOWN_BYTE),  "?", null, _I_(0),
						_I_(ARGUMENT_TYPE__UNKNOWN_BYTE),  "stretch?", null, _I_(0),
    					_I_(ARGUMENT_TYPE__UNKNOWN_BYTE),  "exit now?", null, _I_(1),
                		_I_(ARGUMENT_TYPE__FILENAME_12), null, null, _I_(2) // movie name, seems like it might only be 9 characters
                	},
                _I_(EVENT_COMMAND__ModifyDecoration),  new Object[] { 
                        _I_(ARGUMENT_TYPE__SPRITE_NUMBER), "#", null, _I_(0), // 
                        _I_(ARGUMENT_TYPE__BOOLEAN), null, "remove if set", _I_(2), // remove decoration if 1, restore if 0
                        _I_(ARGUMENT_TYPE__FILENAME_12), "to", null, _I_(1) // sprite name
                	},
                _I_(EVENT_COMMAND__IfHas),  new Object[] { 
                        _I_(ARGUMENT_TYPE__TARGET_TYPE), "(", null, _I_(0),
                        _I_(ARGUMENT_TYPE__TARGET_NUMBER), null, ")", _I_(1), //  ">= for most target types, unless obviously '=='
                        _I_(ARGUMENT_TYPE__SEQUENCE), "goto seq#", null, _I_(2)
                    },
                _I_(EVENT_COMMAND__EV_Door),  new Object[] {
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "ID", null, _I_(0), // Door ID
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), null, null, _I_(1) // IMPLEMENT: _I_(ARGUMENT_TYPE__DOOR_TRIGGER_TYPE), null, null, _I_(0): 0-open,1-close,2-toggle
                    },
                _I_(EVENT_COMMAND__Give),  new Object[] {
                        _I_(ARGUMENT_TYPE__TARGET_TYPE), null, null, _I_(0),
                        _I_(ARGUMENT_TYPE__TARGET_NUMBER), null, null, _I_(1)
                    },
                _I_(EVENT_COMMAND__Take),  new Object[] {
                        _I_(ARGUMENT_TYPE__TARGET_TYPE), null, null, _I_(0),
                        _I_(ARGUMENT_TYPE__TARGET_NUMBER), null, null, _I_(1)
                    },
                _I_(EVENT_COMMAND__Set),  new Object[] {
                        _I_(ARGUMENT_TYPE__TARGET_TYPE), null, null, _I_(0),
                        _I_(ARGUMENT_TYPE__TARGET_NUMBER), null, null, _I_(1)
                    },
                _I_(EVENT_COMMAND__CreateMonster),  new Object[] {
                        _I_(ARGUMENT_TYPE__SPECIES_TYPE), "Map species #", null, _I_(1),
                        _I_(ARGUMENT_TYPE__SUBSPECIES_TYPE), "subspecies", null, _I_(2),
                        _I_(ARGUMENT_TYPE__MONSTER_CREATION_COUNT), "count", null, _I_(0),
                        _I_(ARGUMENT_TYPE__COORDINATE_SET), "at", null, _I_(3)
                    },
                _I_(EVENT_COMMAND__ModifyItem),  new Object[] {
                		_I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) // 5 bytes, no longer supported in MM7 & MM8? // probably a 4-byte int & a 1 byte
                	},
                _I_(EVENT_COMMAND__EV_CastSpell),  new Object[] {
                        _I_(ARGUMENT_TYPE__SPELL_NUMBER), "Spell #", null, _I_(1),
                        _I_(ARGUMENT_TYPE__SPELL_SKILL_EXPERTISE), "at expertise", null, _I_(2), // TODO: ARGUMENT_TYPE__SPELL_SKILL_EXPERTISE pulldown
                        _I_(ARGUMENT_TYPE__SPELL_SKILL_LEVEL), "level", null, _I_(0), // 
                        _I_(ARGUMENT_TYPE__COORDINATE_SET), "starting at coordinate", null, _I_(3),
                        _I_(ARGUMENT_TYPE__COORDINATE_SET), "ending at coordinate", null, _I_(4)
                    },
                _I_(EVENT_COMMAND__DoNPC),  new Object[] {
                        _I_(ARGUMENT_TYPE__NPCDATA_NUMBER), "npcDataNumber", null, _I_(1) // TODO: npcDataNumber
                    },
                _I_(EVENT_COMMAND__FacetAttrib),  new Object[] { 
                        _I_(ARGUMENT_TYPE__FACET_NUMBER), "facet #", null, _I_(1),
                        _I_(ARGUMENT_TYPE__FACET_ATTRIBUTE_TYPE), "attribute", null, _I_(2),
                        _I_(ARGUMENT_TYPE__BOOLEAN), "Set?", null, _I_(0), // set or unset
                	},
                _I_(EVENT_COMMAND__ModifyMonster),  new Object[] {
                    _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "monsterId?", null, _I_(1),
                    _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "bit?", null, _I_(1),
                    _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "bit?", null, _I_(2), // see MONSTER_ATTRIBUTE_ values
                    _I_(ARGUMENT_TYPE__BOOLEAN), "Set?", null, _I_(0), // set or unset
                	},
                // tested for mm7,mm8
                _I_(EVENT_COMMAND__RandomGoto),  new Object[] {
                        _I_(ARGUMENT_TYPE__SEQUENCE), "non-zero seq# in list: ", ",", _I_(0),
                        _I_(ARGUMENT_TYPE__SEQUENCE), null, ",", _I_(1),
                        _I_(ARGUMENT_TYPE__SEQUENCE), null, ",", _I_(2),
                        _I_(ARGUMENT_TYPE__SEQUENCE), null, ",", _I_(3),
                        _I_(ARGUMENT_TYPE__SEQUENCE), null, ",", _I_(4),
                        _I_(ARGUMENT_TYPE__SEQUENCE), null, null, _I_(5)
                	},
                	
                _I_(EVENT_COMMAND__GetInput),  new Object[] {
                    _I_(ARGUMENT_TYPE__NPCTEXT_NUMBER), ", on failure print status #", ",", _I_(4), // print this if no match
                    _I_(ARGUMENT_TYPE__NPCTEXT_NUMBER), "match #", null, _I_(1), // match either first value
                    _I_(ARGUMENT_TYPE__NPCTEXT_NUMBER), "or #", null, _I_(2), // or match second value
                    _I_(ARGUMENT_TYPE__SEQUENCE), ", on success goto seq#", null, _I_(3) // goto here if matched one
                	},
                _I_(EVENT_COMMAND__RndPassword),  new Object[] { // only in MM6? D09.evt
            			_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "?", null, _I_(0),
            			_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "?", null, _I_(0)
                	},
                _I_(EVENT_COMMAND__RndAnswer),  new Object[] { // only in MM6? D09.evt
                		_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "?", null, _I_(0)
                	},
                _I_(EVENT_COMMAND__EV_PrintStatus),  new Object[] {
                        _I_(ARGUMENT_TYPE__NPCTEXT_NUMBER), "#", null, _I_(0)
                	},
                _I_(EVENT_COMMAND__PrintScroll),  new Object[] {
                        _I_(ARGUMENT_TYPE__NPCTEXT_NUMBER), "#", null, _I_(0)
                   	},
                _I_(EVENT_COMMAND__TimeEvent),  new Object[] {
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "month", null, _I_(0), // TODO: month
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "week", null, _I_(1), // TODO: week
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "day", null, _I_(2), // TODO: day
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "hour", null, _I_(3), // TODO: hour
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "minute", null, _I_(4), // TODO: minute
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "seconds", null, _I_(5), // TODO: seconds
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "interval", null, _I_(6)  // TODO: interval
                	},
                _I_(EVENT_COMMAND__ModifyLight),  new Object[] {
	            		_I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "#?", null, _I_(0),
	            		_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "mode?", null, _I_(0)
                	},
                _I_(EVENT_COMMAND__AnyKey),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN_ZERO_BYTE), null, null, _I_(0) },
                _I_(EVENT_COMMAND__SpoutObject),  new Object[] {
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "item number/power", null, _I_(1), // TODO: type (combo item number and power?) num % 1000, power / 1000
                        _I_(ARGUMENT_TYPE__COORDINATE_SET), "at", null, _I_(2), // x, y, z
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "velocity", null, _I_(4), // TODO: velocity
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), null, null, _I_(0), // TODO: num
                        _I_(ARGUMENT_TYPE__BOOLEAN), "random?", null, _I_(3) // TODO: randomize direction of spout
                	},
                _I_(EVENT_COMMAND__SetActiveChar),  new Object[] {
                        _I_(ARGUMENT_TYPE__PARTY_MEMBER),  "#", null, _I_(0)
                	},
                _I_(EVENT_COMMAND__EV_Goto),  new Object[] {
                        _I_(ARGUMENT_TYPE__SEQUENCE), "seq#", null, _I_(0)
                    },
                _I_(EVENT_COMMAND__OnLoad),  new Object[] {
                        _I_(ARGUMENT_TYPE__ZERO_BYTE_PLACEHOLDER), null, null, _I_(0)
                    },
                _I_(EVENT_COMMAND__TimeEvent2),  new Object[] {
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "month", null, _I_(0), // TODO: month
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "week", null, _I_(1), // TODO: week
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "day", null, _I_(2), // TODO: day
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "hour", null, _I_(3), // TODO: hour
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "minute", null, _I_(4), // TODO: minute
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "seconds", null, _I_(5), // TODO: seconds
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "interval", null, _I_(6)  // TODO: interval
                	},
                _I_(EVENT_COMMAND__ChangeNPCEvent),  new Object[] {
                        _I_(ARGUMENT_TYPE__NPCDATA_NUMBER), "for NPC#", ",", _I_(0),
                        _I_(ARGUMENT_TYPE__NPC_MENU_INDEX), "index", null, _I_(1),
                        _I_(ARGUMENT_TYPE__GLOBAL_EVENT_NUMBER), "to global event #", null, _I_(2)
                    },
                _I_(EVENT_COMMAND__ChangeNPC2DLoc),  new Object[] {
            			_I_(ARGUMENT_TYPE__NPCDATA_NUMBER), "Move npc #", null, _I_(0), // npc #
            			_I_(ARGUMENT_TYPE__2DEVENT_NUMBER), "to 2DEvent Location", null, _I_(1) // 2DEvent.txt location
                	},
                _I_(EVENT_COMMAND__CreateItem),  new Object[] {
            			_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "generated level?", null, _I_(0), // must be 1 to 6
            			_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "generated item type?", null, _I_(1), // unclear what this means, but probably see TREASURE_TYPE_* values defined elsewhere
            			_I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "new item type if non-zero?", null, _I_(2) // same as above
                	},
                	
                	
                _I_(EVENT_COMMAND__ChangeEvent),  new Object[] { // Global.evt
                		_I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "event to change?", null, _I_(0) // no idea, but it has to do with decorations
                	},
/* 
 * Change event values
// 268 Empty Barrel
// 269 Red Barrel
// 270 Yellow Barrel
// 271 Blue Barrel
// 272 Orange Barrel
// 273 Green Barrel
// 274 Purple Barrel
// 275 White Barrel
// 276 Empty Cauldron
// 277 Steaming Cauldron
// 278 Frosty Cauldron
// 279 Shocking Cauldron
// 280 Dirty Cauldron
// 281 Trash Heap
// 282 Trash Heap
// 283 Trash Heap
// 284 Trash Heap
// 285 Camp Fire
// 286 Camp Fire
// 287 Food Bowl
// 288 Empty Cask
// 289 Cask

// 531 Haste Pedestal
// 532 Earth Resistance Pedestal
// 533 Day of the Gods Pedestal
// 534 Shield Pedestal
// 535 Water Resistance Pedestal
// 536 Fire Resistance Pedestal
// 537 
// ...
// 570
 */
                _I_(EVENT_COMMAND__CheckSkill),  new Object[] {
	            		_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "#?", null, _I_(0),  // skill #?  SKILLDES.TXT with 0-based entries?
	            		_I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "skill mastery?", null, _I_(1), // 0 - has skill, 1 - expert, 2 - master, 3 - grand master
	            		_I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "minimum required?", null, _I_(2), // minimum amount of skill needed
	            		_I_(ARGUMENT_TYPE__SEQUENCE), ", on success goto seq", null, _I_(3)
                	},
                _I_(EVENT_COMMAND__IfHasPrecondition),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__EndPrecondition),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__Precondition),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__ChangeGroupNews),  new Object[] { 
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "for NPC group index", null, _I_(0), // TODO: ARGUMENT_TYPE__NPC_GROUP_INDEX
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "to news number", null, _I_(1)  // TODO: ARGUMENT_TYPE__NEWS_NUMBER
                	},
                _I_(EVENT_COMMAND__ChangeMonsterGroup),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__ChangeNPCInv),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__ChangeNPCGreeting),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__IfMonsterDead),  new Object[] { 
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "type", null, _I_(2), // TODO: type
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "val", null, _I_(3),  // TODO: val
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), null, "monster(s)", _I_(1), // TODO: count
                        _I_(ARGUMENT_TYPE__BOOLEAN), "include disabled?", null, _I_(0), // TODO: disabledIsDead
                        _I_(ARGUMENT_TYPE__SEQUENCE), "seq#", null, _I_(4)
                	},
                _I_(EVENT_COMMAND__IfMonsterDeadPrecondition),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__OnExit),  new Object[] {
                        _I_(ARGUMENT_TYPE__ZERO_BYTE_PLACEHOLDER), null, null, _I_(0)
                    },
                _I_(EVENT_COMMAND__ChangeGroupToGroup),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__ChangeGroupAlly),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__IfSeason),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__ModifyMonsterGroup),  new Object[] { 
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "monster group", null, _I_(0), // TODO: ARGUMENT_TYPE__MONSTER_GROUP
                        _I_(ARGUMENT_TYPE__UNKNOWN_INTEGER), "attribute", null, _I_(2), // TODO: ARGUMENT_TYPE__ATTRIBUTE (MG or M?)
                        _I_(ARGUMENT_TYPE__BOOLEAN), "Set?", null, _I_(1)  // set/unset
                	},
                _I_(EVENT_COMMAND__ModifyChest),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) },
                _I_(EVENT_COMMAND__PlayAction),  new Object[] {
                        _I_(ARGUMENT_TYPE__PARTY_MEMBER), "for", null, _I_(1),
                        _I_(ARGUMENT_TYPE__UNKNOWN_BYTE), "action state", null, _I_(0)  // TODO: ARGUMENT_TYPE__ACTION_STATE
                    },
                _I_(EVENT_COMMAND__ChangeMonsterInv),  new Object[] { _I_(ARGUMENT_TYPE__UNKNOWN), null, null, _I_(0) }
            };

        int argumentTypesForCommandTypeArrayColumns = 2;
        if (argumentTypesForCommandTypeArray.length % argumentTypesForCommandTypeArrayColumns != 0)
        {
            throw new RuntimeException("argumentTypesForCommandTypeArray.length = " + argumentTypesForCommandTypeArray.length + " which is not a power of " + argumentTypesForCommandTypeArrayColumns + ".");
        }
        
        argumentTypeArrayByCommandTypeMap = new HashMap<Integer,int[]>();
        argumentTypeDisplayInfoArrayByCommandTypeMap = new HashMap<Integer,ArgumentTypeDisplayInfo[]>();
        for (int argumentTypesForCommandTypeArrayIndex = 0; argumentTypesForCommandTypeArrayIndex < argumentTypesForCommandTypeArray.length; argumentTypesForCommandTypeArrayIndex = argumentTypesForCommandTypeArrayIndex+argumentTypesForCommandTypeArrayColumns)
        {
            Integer commandTypeNumber = (Integer)argumentTypesForCommandTypeArray[argumentTypesForCommandTypeArrayIndex];
            Object argumentTypeDataArray[] = (Object [])argumentTypesForCommandTypeArray[argumentTypesForCommandTypeArrayIndex+1];
            
            Integer key = null;
            for (int index = 0; index < commandTypes.length; index++) {
    			if (commandTypes[index].equals(commandTypeNumber))
    			{
    				key = new Integer(index);
    			}
    		}
            if (null == key)
            {
                throw new RuntimeException("Unable to find command type value" + commandTypeNumber + " in commandTypes");
            }

            int[] argumentTypeArray = getArgumentTypeArrayFromArgumentTypeDataArray(argumentTypeDataArray);

            if (argumentTypeArrayByCommandTypeMap.containsKey(key))
            {
            	int[] value = argumentTypeArrayByCommandTypeMap.get(key);
                throw new RuntimeException("argumentTypeArrayByCommandTypeMap already contains key " + key + " with value of " + value);
            }

            argumentTypeArrayByCommandTypeMap.put(key, argumentTypeArray);
            
            
            ArgumentTypeDisplayInfo[] argumentTypeDisplayInfoArray = getArgumentTypeDisplayInfoArrayFromArgumentTypeDataArray(argumentTypeDataArray);

            if (argumentTypeDisplayInfoArrayByCommandTypeMap.containsKey(key))
            {
            	ArgumentTypeDisplayInfo[] value = argumentTypeDisplayInfoArrayByCommandTypeMap.get(key);
                throw new RuntimeException("argumentTypeDisplayInfoArrayByCommandTypeMap already contains key " + key + " with value of " + value);
            }

            argumentTypeDisplayInfoArrayByCommandTypeMap.put(key, argumentTypeDisplayInfoArray);
        }
        
        initializedCommandTypeInfo = true;
    }