Ejemplo n.º 1
0
TOKEN_DEF_END
//////////////////////////////////////////////////////////////////////////
HRESULT CUIButton::LoadBuffer(byte  *Buffer, bool Complete) {
	TOKEN_TABLE_START(commands)
	TOKEN_TABLE(BUTTON)
	TOKEN_TABLE(TEMPLATE)
	TOKEN_TABLE(DISABLED)
	TOKEN_TABLE(VISIBLE)
	TOKEN_TABLE(FOCUSABLE)
	TOKEN_TABLE(BACK_HOVER)
	TOKEN_TABLE(BACK_PRESS)
	TOKEN_TABLE(BACK_DISABLE)
	TOKEN_TABLE(BACK_FOCUS)
	TOKEN_TABLE(BACK)
	TOKEN_TABLE(CENTER_IMAGE)
	TOKEN_TABLE(IMAGE_HOVER)
	TOKEN_TABLE(IMAGE_PRESS)
	TOKEN_TABLE(IMAGE_DISABLE)
	TOKEN_TABLE(IMAGE_FOCUS)
	TOKEN_TABLE(IMAGE)
	TOKEN_TABLE(FONT_HOVER)
	TOKEN_TABLE(FONT_PRESS)
	TOKEN_TABLE(FONT_DISABLE)
	TOKEN_TABLE(FONT_FOCUS)
	TOKEN_TABLE(FONT)
	TOKEN_TABLE(TEXT_ALIGN)
	TOKEN_TABLE(TEXT)
	TOKEN_TABLE(X)
	TOKEN_TABLE(Y)
	TOKEN_TABLE(WIDTH)
	TOKEN_TABLE(HEIGHT)
	TOKEN_TABLE(CURSOR)
	TOKEN_TABLE(NAME)
	TOKEN_TABLE(EVENTS)
	TOKEN_TABLE(SCRIPT)
	TOKEN_TABLE(CAPTION)
	TOKEN_TABLE(PARENT_NOTIFY)
	TOKEN_TABLE(PRESSED)
	TOKEN_TABLE(PIXEL_PERFECT)
	TOKEN_TABLE(EDITOR_PROPERTY)
	TOKEN_TABLE_END

	byte *params;
	int cmd = 2;
	CBParser parser(Game);

	if (Complete) {
		if (parser.GetCommand((char **)&Buffer, commands, (char **)&params) != TOKEN_BUTTON) {
			Game->LOG(0, "'BUTTON' keyword expected.");
			return E_FAIL;
		}
		Buffer = params;
	}

	while (cmd > 0 && (cmd = parser.GetCommand((char **)&Buffer, commands, (char **)&params)) > 0) {
		switch (cmd) {
		case TOKEN_TEMPLATE:
			if (FAILED(LoadFile((char *)params))) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_NAME:
			SetName((char *)params);
			break;

		case TOKEN_CAPTION:
			SetCaption((char *)params);
			break;

		case TOKEN_BACK:
			delete m_Back;
			m_Back = new CUITiledImage(Game);
			if (!m_Back || FAILED(m_Back->LoadFile((char *)params))) {
				delete m_Back;
				m_Back = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_BACK_HOVER:
			delete m_BackHover;
			m_BackHover = new CUITiledImage(Game);
			if (!m_BackHover || FAILED(m_BackHover->LoadFile((char *)params))) {
				delete m_BackHover;
				m_BackHover = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_BACK_PRESS:
			delete m_BackPress;
			m_BackPress = new CUITiledImage(Game);
			if (!m_BackPress || FAILED(m_BackPress->LoadFile((char *)params))) {
				delete m_BackPress;
				m_BackPress = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_BACK_DISABLE:
			delete m_BackDisable;
			m_BackDisable = new CUITiledImage(Game);
			if (!m_BackDisable || FAILED(m_BackDisable->LoadFile((char *)params))) {
				delete m_BackDisable;
				m_BackDisable = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_BACK_FOCUS:
			delete m_BackFocus;
			m_BackFocus = new CUITiledImage(Game);
			if (!m_BackFocus || FAILED(m_BackFocus->LoadFile((char *)params))) {
				delete m_BackFocus;
				m_BackFocus = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_IMAGE:
			delete m_Image;
			m_Image = new CBSprite(Game);
			if (!m_Image || FAILED(m_Image->LoadFile((char *)params))) {
				delete m_Image;
				m_Image = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_IMAGE_HOVER:
			delete m_ImageHover;
			m_ImageHover = new CBSprite(Game);
			if (!m_ImageHover || FAILED(m_ImageHover->LoadFile((char *)params))) {
				delete m_ImageHover;
				m_ImageHover = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_IMAGE_PRESS:
			delete m_ImagePress;
			m_ImagePress = new CBSprite(Game);
			if (!m_ImagePress || FAILED(m_ImagePress->LoadFile((char *)params))) {
				delete m_ImagePress;
				m_ImagePress = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_IMAGE_DISABLE:
			delete m_ImageDisable;
			m_ImageDisable = new CBSprite(Game);
			if (!m_ImageDisable || FAILED(m_ImageDisable->LoadFile((char *)params))) {
				delete m_ImageDisable;
				m_ImageDisable = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_IMAGE_FOCUS:
			delete m_ImageFocus;
			m_ImageFocus = new CBSprite(Game);
			if (!m_ImageFocus || FAILED(m_ImageFocus->LoadFile((char *)params))) {
				delete m_ImageFocus;
				m_ImageFocus = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_FONT:
			if (m_Font) Game->m_FontStorage->RemoveFont(m_Font);
			m_Font = Game->m_FontStorage->AddFont((char *)params);
			if (!m_Font) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_FONT_HOVER:
			if (m_FontHover) Game->m_FontStorage->RemoveFont(m_FontHover);
			m_FontHover = Game->m_FontStorage->AddFont((char *)params);
			if (!m_FontHover) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_FONT_PRESS:
			if (m_FontPress) Game->m_FontStorage->RemoveFont(m_FontPress);
			m_FontPress = Game->m_FontStorage->AddFont((char *)params);
			if (!m_FontPress) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_FONT_DISABLE:
			if (m_FontDisable) Game->m_FontStorage->RemoveFont(m_FontDisable);
			m_FontDisable = Game->m_FontStorage->AddFont((char *)params);
			if (!m_FontDisable) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_FONT_FOCUS:
			if (m_FontFocus) Game->m_FontStorage->RemoveFont(m_FontFocus);
			m_FontFocus = Game->m_FontStorage->AddFont((char *)params);
			if (!m_FontFocus) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_TEXT:
			SetText((char *)params);
			Game->m_StringTable->Expand(&m_Text);
			break;

		case TOKEN_TEXT_ALIGN:
			if (scumm_stricmp((char *)params, "left") == 0) m_Align = TAL_LEFT;
			else if (scumm_stricmp((char *)params, "right") == 0) m_Align = TAL_RIGHT;
			else m_Align = TAL_CENTER;
			break;

		case TOKEN_X:
			parser.ScanStr((char *)params, "%d", &m_PosX);
			break;

		case TOKEN_Y:
			parser.ScanStr((char *)params, "%d", &m_PosY);
			break;

		case TOKEN_WIDTH:
			parser.ScanStr((char *)params, "%d", &m_Width);
			break;

		case TOKEN_HEIGHT:
			parser.ScanStr((char *)params, "%d", &m_Height);
			break;

		case TOKEN_CURSOR:
			delete m_Cursor;
			m_Cursor = new CBSprite(Game);
			if (!m_Cursor || FAILED(m_Cursor->LoadFile((char *)params))) {
				delete m_Cursor;
				m_Cursor = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_SCRIPT:
			AddScript((char *)params);
			break;

		case TOKEN_PARENT_NOTIFY:
			parser.ScanStr((char *)params, "%b", &m_ParentNotify);
			break;

		case TOKEN_DISABLED:
			parser.ScanStr((char *)params, "%b", &m_Disable);
			break;

		case TOKEN_VISIBLE:
			parser.ScanStr((char *)params, "%b", &m_Visible);
			break;

		case TOKEN_FOCUSABLE:
			parser.ScanStr((char *)params, "%b", &m_CanFocus);
			break;

		case TOKEN_CENTER_IMAGE:
			parser.ScanStr((char *)params, "%b", &m_CenterImage);
			break;

		case TOKEN_PRESSED:
			parser.ScanStr((char *)params, "%b", &m_StayPressed);
			break;

		case TOKEN_PIXEL_PERFECT:
			parser.ScanStr((char *)params, "%b", &m_PixelPerfect);
			break;

		case TOKEN_EDITOR_PROPERTY:
			ParseEditorProperty(params, false);
			break;
		}
	}
	if (cmd == PARSERR_TOKENNOTFOUND) {
		Game->LOG(0, "Syntax error in BUTTON definition");
		return E_FAIL;
	}
	if (cmd == PARSERR_GENERIC) {
		Game->LOG(0, "Error loading BUTTON definition");
		return E_FAIL;
	}

	CorrectSize();

	return S_OK;
}
TOKEN_DEF_END
//////////////////////////////////////////////////////////////////////////
HRESULT CUIWindow::LoadBuffer(BYTE* Buffer, bool Complete)
{
    TOKEN_TABLE_START(commands)
    TOKEN_TABLE (WINDOW)
    TOKEN_TABLE (ALPHA_COLOR)
    TOKEN_TABLE (ALPHA)
    TOKEN_TABLE (TEMPLATE)
    TOKEN_TABLE (DISABLED)
    TOKEN_TABLE (VISIBLE)
    TOKEN_TABLE (BACK_INACTIVE)
    TOKEN_TABLE (BACK)
    TOKEN_TABLE (IMAGE_INACTIVE)
    TOKEN_TABLE (IMAGE)
    TOKEN_TABLE (FONT_INACTIVE)
    TOKEN_TABLE (FONT)
    TOKEN_TABLE (TITLE_ALIGN)
    TOKEN_TABLE (TITLE_RECT)
    TOKEN_TABLE (TITLE)
    TOKEN_TABLE (DRAG_RECT)
    TOKEN_TABLE (X)
    TOKEN_TABLE (Y)
    TOKEN_TABLE (WIDTH)
    TOKEN_TABLE (HEIGHT)
    TOKEN_TABLE (FADE_ALPHA)
    TOKEN_TABLE (FADE_COLOR)
    TOKEN_TABLE (CURSOR)
    TOKEN_TABLE (NAME)
    TOKEN_TABLE (BUTTON)
    TOKEN_TABLE (STATIC)
    TOKEN_TABLE (TRANSPARENT)
    TOKEN_TABLE (SCRIPT)
    TOKEN_TABLE (CAPTION)
    TOKEN_TABLE (PARENT_NOTIFY)
    TOKEN_TABLE (MENU)
    TOKEN_TABLE (IN_GAME)
    TOKEN_TABLE (CLIP_CONTENTS)
    TOKEN_TABLE (PAUSE_MUSIC)
    TOKEN_TABLE (EDITOR_PROPERTY)
    TOKEN_TABLE (EDIT)
    TOKEN_TABLE_END

    BYTE* params;
    int cmd=2;
    CBParser parser(Game);

    int FadeR=0, FadeG=0, FadeB=0, FadeA=0;
    int ar=0, ag=0, ab=0, alpha=0;

    if(Complete)
    {
        if(parser.GetCommand ((char**)&Buffer, commands, (char**)&params)!=TOKEN_WINDOW)
        {
            Game->LOG(0, "'WINDOW' keyword expected.");
            return E_FAIL;
        }
        Buffer = params;
    }

    while (cmd >= PARSERR_TOKENNOTFOUND && (cmd = parser.GetCommand ((char**)&Buffer, commands, (char**)&params)) >= PARSERR_TOKENNOTFOUND)
    {
        switch (cmd)
        {
        case TOKEN_TEMPLATE:
            if(FAILED(LoadFile((char*)params))) cmd = PARSERR_GENERIC;
            break;

        case TOKEN_NAME:
            SetName((char*)params);
            break;

        case TOKEN_CAPTION:
            SetCaption((char*)params);
            break;

        case TOKEN_BACK:
            SAFE_DELETE(m_Back);
            m_Back = new CUITiledImage(Game);
            if(!m_Back || FAILED(m_Back->LoadFile((char*)params)))
            {
                SAFE_DELETE(m_Back);
                cmd = PARSERR_GENERIC;
            }
            break;

        case TOKEN_BACK_INACTIVE:
            SAFE_DELETE(m_BackInactive);
            m_BackInactive = new CUITiledImage(Game);
            if(!m_BackInactive || FAILED(m_BackInactive->LoadFile((char*)params)))
            {
                SAFE_DELETE(m_BackInactive);
                cmd = PARSERR_GENERIC;
            }
            break;

        case TOKEN_IMAGE:
            SAFE_DELETE(m_Image);
            m_Image = new CBSprite(Game);
            if(!m_Image || FAILED(m_Image->LoadFile((char*)params)))
            {
                SAFE_DELETE(m_Image);
                cmd = PARSERR_GENERIC;
            }
            break;

        case TOKEN_IMAGE_INACTIVE:
            SAFE_DELETE(m_ImageInactive);
            m_ImageInactive = new CBSprite(Game);
            if(!m_ImageInactive || FAILED(m_ImageInactive->LoadFile((char*)params)))
            {
                SAFE_DELETE(m_ImageInactive);
                cmd = PARSERR_GENERIC;
            }
            break;

        case TOKEN_FONT:
            if(m_Font) Game->m_FontStorage->RemoveFont(m_Font);
            m_Font = Game->m_FontStorage->AddFont((char*)params);
            if(!m_Font) cmd = PARSERR_GENERIC;
            break;

        case TOKEN_FONT_INACTIVE:
            if(m_FontInactive) Game->m_FontStorage->RemoveFont(m_FontInactive);
            m_FontInactive = Game->m_FontStorage->AddFont((char*)params);
            if(!m_FontInactive) cmd = PARSERR_GENERIC;
            break;

        case TOKEN_TITLE:
            SetText((char*)params);
            Game->m_StringTable->Expand(&m_Text);
            break;

        case TOKEN_TITLE_ALIGN:
            if(CBPlatform::stricmp((char*)params, "left")==0) m_TitleAlign = TAL_LEFT;
            else if(CBPlatform::stricmp((char*)params, "right")==0) m_TitleAlign = TAL_RIGHT;
            else m_TitleAlign = TAL_CENTER;
            break;

        case TOKEN_TITLE_RECT:
            parser.ScanStr((char*)params, "%d,%d,%d,%d", &m_TitleRect.left, &m_TitleRect.top, &m_TitleRect.right, &m_TitleRect.bottom);
            break;

        case TOKEN_DRAG_RECT:
            parser.ScanStr((char*)params, "%d,%d,%d,%d", &m_DragRect.left, &m_DragRect.top, &m_DragRect.right, &m_DragRect.bottom);
            break;

        case TOKEN_X:
            parser.ScanStr((char*)params, "%d", &m_PosX);
            break;

        case TOKEN_Y:
            parser.ScanStr((char*)params, "%d", &m_PosY);
            break;

        case TOKEN_WIDTH:
            parser.ScanStr((char*)params, "%d", &m_Width);
            break;

        case TOKEN_HEIGHT:
            parser.ScanStr((char*)params, "%d", &m_Height);
            break;

        case TOKEN_CURSOR:
            SAFE_DELETE(m_Cursor);
            m_Cursor = new CBSprite(Game);
            if(!m_Cursor || FAILED(m_Cursor->LoadFile((char*)params)))
            {
                SAFE_DELETE(m_Cursor);
                cmd = PARSERR_GENERIC;
            }
            break;

        case TOKEN_BUTTON:
        {
            CUIButton* btn = new CUIButton(Game);
            if(!btn || FAILED(btn->LoadBuffer(params, false)))
            {
                SAFE_DELETE(btn);
                cmd = PARSERR_GENERIC;
            }
            else
            {
                btn->m_Parent = this;
                m_Widgets.Add(btn);
            }
        }
        break;

        case TOKEN_STATIC:
        {
            CUIText* text = new CUIText(Game);
            if(!text || FAILED(text->LoadBuffer(params, false)))
            {
                SAFE_DELETE(text);
                cmd = PARSERR_GENERIC;
            }
            else
            {
                text->m_Parent = this;
                m_Widgets.Add(text);
            }
        }
        break;

        case TOKEN_EDIT:
        {
            CUIEdit* edit = new CUIEdit(Game);
            if(!edit || FAILED(edit->LoadBuffer(params, false)))
            {
                SAFE_DELETE(edit);
                cmd = PARSERR_GENERIC;
            }
            else
            {
                edit->m_Parent = this;
                m_Widgets.Add(edit);
            }
        }
        break;

        case TOKEN_WINDOW:
        {
            CUIWindow* win = new CUIWindow(Game);
            if(!win || FAILED(win->LoadBuffer(params, false)))
            {
                SAFE_DELETE(win);
                cmd = PARSERR_GENERIC;
            }
            else
            {
                win->m_Parent = this;
                m_Widgets.Add(win);
            }
        }
        break;


        case TOKEN_TRANSPARENT:
            parser.ScanStr((char*)params, "%b", &m_Transparent);
            break;

        case TOKEN_SCRIPT:
            AddScript((char*)params);
            break;

        case TOKEN_PARENT_NOTIFY:
            parser.ScanStr((char*)params, "%b", &m_ParentNotify);
            break;

        case TOKEN_PAUSE_MUSIC:
            parser.ScanStr((char*)params, "%b", &m_PauseMusic);
            break;

        case TOKEN_DISABLED:
            parser.ScanStr((char*)params, "%b", &m_Disable);
            break;

        case TOKEN_VISIBLE:
            parser.ScanStr((char*)params, "%b", &m_Visible);
            break;

        case TOKEN_MENU:
            parser.ScanStr((char*)params, "%b", &m_IsMenu);
            break;

        case TOKEN_IN_GAME:
            parser.ScanStr((char*)params, "%b", &m_InGame);
            break;

        case TOKEN_CLIP_CONTENTS:
            parser.ScanStr((char*)params, "%b", &m_ClipContents);
            break;

        case TOKEN_FADE_COLOR:
            parser.ScanStr((char*)params, "%d,%d,%d", &FadeR, &FadeG, &FadeB);
            m_FadeBackground = true;
            break;

        case TOKEN_FADE_ALPHA:
            parser.ScanStr((char*)params, "%d", &FadeA);
            m_FadeBackground = true;
            break;

        case TOKEN_EDITOR_PROPERTY:
            ParseEditorProperty(params, false);
            break;

        case TOKEN_ALPHA_COLOR:
            parser.ScanStr((char*)params, "%d,%d,%d", &ar, &ag, &ab);
            break;

        case TOKEN_ALPHA:
            parser.ScanStr((char*)params, "%d", &alpha);
            break;


        default:
            if(FAILED(Game->WindowLoadHook(this, (char**)&Buffer, (char**)params)))
            {
                cmd = PARSERR_GENERIC;
            }
        }
    }
    if (cmd == PARSERR_TOKENNOTFOUND)
    {
        Game->LOG(0, "Syntax error in WINDOW definition");
        return E_FAIL;
    }
    if (cmd == PARSERR_GENERIC)
    {
        Game->LOG(0, "Error loading WINDOW definition");
        return E_FAIL;
    }

    CorrectSize();

    if(alpha != 0 && ar==0 && ag == 0 && ab == 0)
    {
        ar = ag = ab = 255;
    }
    m_AlphaColor = DRGBA(ar, ag, ab, alpha);

    if(m_FadeBackground) m_FadeColor = DRGBA(FadeR, FadeG, FadeB, FadeA);

    m_FocusedWidget = NULL;

    return S_OK;
}
Ejemplo n.º 3
0
TOKEN_DEF_END
//////////////////////////////////////////////////////////////////////////
HRESULT CUIEntity::LoadBuffer(byte  *Buffer, bool Complete) {
	TOKEN_TABLE_START(commands)
	TOKEN_TABLE(ENTITY_CONTAINER)
	TOKEN_TABLE(TEMPLATE)
	TOKEN_TABLE(DISABLED)
	TOKEN_TABLE(VISIBLE)
	TOKEN_TABLE(X)
	TOKEN_TABLE(Y)
	TOKEN_TABLE(NAME)
	TOKEN_TABLE(ENTITY)
	TOKEN_TABLE(SCRIPT)
	TOKEN_TABLE(EDITOR_PROPERTY)
	TOKEN_TABLE_END

	byte *params;
	int cmd = 2;
	CBParser parser(Game);

	if (Complete) {
		if (parser.GetCommand((char **)&Buffer, commands, (char **)&params) != TOKEN_ENTITY_CONTAINER) {
			Game->LOG(0, "'ENTITY_CONTAINER' keyword expected.");
			return E_FAIL;
		}
		Buffer = params;
	}

	while (cmd > 0 && (cmd = parser.GetCommand((char **)&Buffer, commands, (char **)&params)) > 0) {
		switch (cmd) {
		case TOKEN_TEMPLATE:
			if (FAILED(LoadFile((char *)params))) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_NAME:
			SetName((char *)params);
			break;

		case TOKEN_X:
			parser.ScanStr((char *)params, "%d", &m_PosX);
			break;

		case TOKEN_Y:
			parser.ScanStr((char *)params, "%d", &m_PosY);
			break;

		case TOKEN_DISABLED:
			parser.ScanStr((char *)params, "%b", &m_Disable);
			break;

		case TOKEN_VISIBLE:
			parser.ScanStr((char *)params, "%b", &m_Visible);
			break;

		case TOKEN_ENTITY:
			if (FAILED(SetEntity((char *)params))) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_SCRIPT:
			AddScript((char *)params);
			break;

		case TOKEN_EDITOR_PROPERTY:
			ParseEditorProperty(params, false);
			break;
		}
	}
	if (cmd == PARSERR_TOKENNOTFOUND) {
		Game->LOG(0, "Syntax error in ENTITY_CONTAINER definition");
		return E_FAIL;
	}
	if (cmd == PARSERR_GENERIC) {
		Game->LOG(0, "Error loading ENTITY_CONTAINER definition");
		return E_FAIL;
	}

	CorrectSize();

	if (Game->m_EditorMode) {
		m_Width = 50;
		m_Height = 50;
	}

	return S_OK;
}
Ejemplo n.º 4
0
TOKEN_DEF_END
//////////////////////////////////////////////////////////////////////////
HRESULT CUIEdit::LoadBuffer(byte  *Buffer, bool Complete) {
	TOKEN_TABLE_START(commands)
	TOKEN_TABLE(TEMPLATE)
	TOKEN_TABLE(DISABLED)
	TOKEN_TABLE(VISIBLE)
	TOKEN_TABLE(BACK)
	TOKEN_TABLE(IMAGE)
	TOKEN_TABLE(FONT_SELECTED)
	TOKEN_TABLE(FONT)
	TOKEN_TABLE(TEXT)
	TOKEN_TABLE(X)
	TOKEN_TABLE(Y)
	TOKEN_TABLE(WIDTH)
	TOKEN_TABLE(HEIGHT)
	TOKEN_TABLE(CURSOR_BLINK_RATE)
	TOKEN_TABLE(CURSOR)
	TOKEN_TABLE(FRAME_WIDTH)
	TOKEN_TABLE(NAME)
	TOKEN_TABLE(SCRIPT)
	TOKEN_TABLE(PARENT_NOTIFY)
	TOKEN_TABLE(MAX_LENGTH)
	TOKEN_TABLE(EDITOR_PROPERTY)
	TOKEN_TABLE(EDIT)
	TOKEN_TABLE(CAPTION)
	TOKEN_TABLE_END

	byte *params;
	int cmd = 2;
	CBParser parser(Game);

	if (Complete) {
		if (parser.GetCommand((char **)&Buffer, commands, (char **)&params) != TOKEN_EDIT) {
			Game->LOG(0, "'EDIT' keyword expected.");
			return E_FAIL;
		}
		Buffer = params;
	}

	while (cmd > 0 && (cmd = parser.GetCommand((char **)&Buffer, commands, (char **)&params)) > 0) {
		switch (cmd) {
		case TOKEN_TEMPLATE:
			if (FAILED(LoadFile((char *)params))) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_NAME:
			SetName((char *)params);
			break;

		case TOKEN_BACK:
			delete m_Back;
			m_Back = new CUITiledImage(Game);
			if (!m_Back || FAILED(m_Back->LoadFile((char *)params))) {
				delete m_Back;
				m_Back = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_IMAGE:
			delete m_Image;
			m_Image = new CBSprite(Game);
			if (!m_Image || FAILED(m_Image->LoadFile((char *)params))) {
				delete m_Image;
				m_Image = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_FONT:
			if (m_Font) Game->m_FontStorage->RemoveFont(m_Font);
			m_Font = Game->m_FontStorage->AddFont((char *)params);
			if (!m_Font) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_FONT_SELECTED:
			if (m_FontSelected) Game->m_FontStorage->RemoveFont(m_FontSelected);
			m_FontSelected = Game->m_FontStorage->AddFont((char *)params);
			if (!m_FontSelected) cmd = PARSERR_GENERIC;
			break;

		case TOKEN_TEXT:
			SetText((char *)params);
			Game->m_StringTable->Expand(&m_Text);
			break;

		case TOKEN_X:
			parser.ScanStr((char *)params, "%d", &m_PosX);
			break;

		case TOKEN_Y:
			parser.ScanStr((char *)params, "%d", &m_PosY);
			break;

		case TOKEN_WIDTH:
			parser.ScanStr((char *)params, "%d", &m_Width);
			break;

		case TOKEN_HEIGHT:
			parser.ScanStr((char *)params, "%d", &m_Height);
			break;

		case TOKEN_MAX_LENGTH:
			parser.ScanStr((char *)params, "%d", &m_MaxLength);
			break;

		case TOKEN_CAPTION:
			SetCaption((char *)params);
			break;

		case TOKEN_CURSOR:
			delete m_Cursor;
			m_Cursor = new CBSprite(Game);
			if (!m_Cursor || FAILED(m_Cursor->LoadFile((char *)params))) {
				delete m_Cursor;
				m_Cursor = NULL;
				cmd = PARSERR_GENERIC;
			}
			break;

		case TOKEN_CURSOR_BLINK_RATE:
			parser.ScanStr((char *)params, "%d", &m_CursorBlinkRate);
			break;

		case TOKEN_FRAME_WIDTH:
			parser.ScanStr((char *)params, "%d", &m_FrameWidth);
			break;

		case TOKEN_SCRIPT:
			AddScript((char *)params);
			break;

		case TOKEN_PARENT_NOTIFY:
			parser.ScanStr((char *)params, "%b", &m_ParentNotify);
			break;

		case TOKEN_DISABLED:
			parser.ScanStr((char *)params, "%b", &m_Disable);
			break;

		case TOKEN_VISIBLE:
			parser.ScanStr((char *)params, "%b", &m_Visible);
			break;

		case TOKEN_EDITOR_PROPERTY:
			ParseEditorProperty(params, false);
			break;
		}
	}
	if (cmd == PARSERR_TOKENNOTFOUND) {
		Game->LOG(0, "Syntax error in EDIT definition");
		return E_FAIL;
	}
	if (cmd == PARSERR_GENERIC) {
		Game->LOG(0, "Error loading EDIT definition");
		return E_FAIL;
	}

	CorrectSize();

	return S_OK;
}