aboutsummaryrefslogtreecommitdiff
path: root/engines/wintermute/BObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/wintermute/BObject.cpp')
-rw-r--r--engines/wintermute/BObject.cpp1122
1 files changed, 1122 insertions, 0 deletions
diff --git a/engines/wintermute/BObject.cpp b/engines/wintermute/BObject.cpp
new file mode 100644
index 0000000000..3bb94046a4
--- /dev/null
+++ b/engines/wintermute/BObject.cpp
@@ -0,0 +1,1122 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+/*
+ * This file is based on WME Lite.
+ * http://dead-code.org/redir.php?target=wmelite
+ * Copyright (c) 2011 Jan Nedoma
+ */
+
+#include "dcgf.h"
+#include "BObject.h"
+#include "BParser.h"
+#include "ScValue.h"
+#include "ScStack.h"
+#include "BSound.h"
+#include "BSoundMgr.h"
+#include "BGame.h"
+#include "BStringTable.h"
+#include "BSprite.h"
+#include "PlatformSDL.h"
+
+namespace WinterMute {
+
+IMPLEMENT_PERSISTENT(CBObject, false)
+
+//////////////////////////////////////////////////////////////////////
+CBObject::CBObject(CBGame *inGame): CBScriptHolder(inGame) {
+ m_PosX = m_PosY = 0;
+ m_Movable = true;
+ m_Zoomable = true;
+ m_Registrable = true;
+ m_Shadowable = true;
+ m_Rotatable = false;
+ m_Is3D = false;
+
+ m_AlphaColor = 0;
+ m_Scale = -1;
+ m_RelativeScale = 0;
+
+ m_ScaleX = -1;
+ m_ScaleY = -1;
+
+ m_Ready = true;
+
+ m_SoundEvent = NULL;
+
+ m_ID = Game->GetSequence();
+
+ CBPlatform::SetRectEmpty(&m_Rect);
+ m_RectSet = false;
+
+ m_Cursor = NULL;
+ m_ActiveCursor = NULL;
+ m_SharedCursors = false;
+
+ m_SFX = NULL;
+ m_SFXStart = 0;
+ m_SFXVolume = 100;
+ m_AutoSoundPanning = true;
+
+ m_EditorAlwaysRegister = false;
+ m_EditorSelected = false;
+
+ m_EditorOnly = false;
+
+ m_Rotate = 0.0f;
+ m_RotateValid = false;
+ m_RelativeRotate = 0.0f;
+
+ for (int i = 0; i < 7; i++) m_Caption[i] = NULL;
+ m_SaveState = true;
+
+ m_NonIntMouseEvents = false;
+
+ // sound FX
+ m_SFXType = SFX_NONE;
+ m_SFXParam1 = m_SFXParam2 = m_SFXParam3 = m_SFXParam4 = 0;
+
+ m_BlendMode = BLEND_NORMAL;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+CBObject::~CBObject() {
+ Cleanup();
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::Cleanup() {
+ if (Game && Game->m_ActiveObject == this) Game->m_ActiveObject = NULL;
+
+ CBScriptHolder::Cleanup();
+ delete[] m_SoundEvent;
+ m_SoundEvent = NULL;
+
+ if (!m_SharedCursors) {
+ delete m_Cursor;
+ delete m_ActiveCursor;
+ m_Cursor = NULL;
+ m_ActiveCursor = NULL;
+ }
+ delete m_SFX;
+ m_SFX = NULL;
+
+ for (int i = 0; i < 7; i++) {
+ delete[] m_Caption[i];
+ m_Caption[i] = NULL;
+ }
+
+ m_SFXType = SFX_NONE;
+ m_SFXParam1 = m_SFXParam2 = m_SFXParam3 = m_SFXParam4 = 0;
+
+ return S_OK;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+void CBObject::SetCaption(char *Caption, int Case) {
+ if (Case == 0) Case = 1;
+ if (Case < 1 || Case > 7) return;
+
+ delete[] m_Caption[Case - 1];
+ m_Caption[Case - 1] = new char[strlen(Caption) + 1];
+ if (m_Caption[Case - 1]) {
+ strcpy(m_Caption[Case - 1], Caption);
+ Game->m_StringTable->Expand(&m_Caption[Case - 1]);
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+char *CBObject::GetCaption(int Case) {
+ if (Case == 0) Case = 1;
+ if (Case < 1 || Case > 7 || m_Caption[Case - 1] == NULL) return "";
+ else return m_Caption[Case - 1];
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::Listen(CBScriptHolder *param1, uint32 param2) {
+ return E_FAIL;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+// high level scripting interface
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::ScCallMethod(CScScript *Script, CScStack *Stack, CScStack *ThisStack, char *Name) {
+
+ //////////////////////////////////////////////////////////////////////////
+ // SkipTo
+ //////////////////////////////////////////////////////////////////////////
+ if (strcmp(Name, "SkipTo") == 0) {
+ Stack->CorrectParams(2);
+ m_PosX = Stack->Pop()->GetInt();
+ m_PosY = Stack->Pop()->GetInt();
+ AfterMove();
+ Stack->PushNULL();
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Caption
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Caption") == 0) {
+ Stack->CorrectParams(1);
+ Stack->PushString(GetCaption(Stack->Pop()->GetInt()));
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SetCursor
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SetCursor") == 0) {
+ Stack->CorrectParams(1);
+ if (SUCCEEDED(SetCursor(Stack->Pop()->GetString()))) Stack->PushBool(true);
+ else Stack->PushBool(false);
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // RemoveCursor
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "RemoveCursor") == 0) {
+ Stack->CorrectParams(0);
+ if (!m_SharedCursors) {
+ delete m_Cursor;
+ m_Cursor = NULL;
+ } else {
+ m_Cursor = NULL;
+
+ }
+ Stack->PushNULL();
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // GetCursor
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "GetCursor") == 0) {
+ Stack->CorrectParams(0);
+ if (!m_Cursor || !m_Cursor->m_Filename) Stack->PushNULL();
+ else Stack->PushString(m_Cursor->m_Filename);
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // GetCursorObject
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "GetCursorObject") == 0) {
+ Stack->CorrectParams(0);
+ if (!m_Cursor) Stack->PushNULL();
+ else Stack->PushNative(m_Cursor, true);
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // HasCursor
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "HasCursor") == 0) {
+ Stack->CorrectParams(0);
+
+ if (m_Cursor) Stack->PushBool(true);
+ else Stack->PushBool(false);
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SetCaption
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SetCaption") == 0) {
+ Stack->CorrectParams(2);
+ SetCaption(Stack->Pop()->GetString(), Stack->Pop()->GetInt());
+ Stack->PushNULL();
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // LoadSound
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "LoadSound") == 0) {
+ Stack->CorrectParams(1);
+ char *Filename = Stack->Pop()->GetString();
+ if (SUCCEEDED(PlaySFX(Filename, false, false)))
+ Stack->PushBool(true);
+ else
+ Stack->PushBool(false);
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // PlaySound
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "PlaySound") == 0) {
+ Stack->CorrectParams(3);
+
+ char *Filename;
+ bool Looping;
+ uint32 LoopStart;
+
+ CScValue *val1 = Stack->Pop();
+ CScValue *val2 = Stack->Pop();
+ CScValue *val3 = Stack->Pop();
+
+ if (val1->m_Type == VAL_BOOL) {
+ Filename = NULL;
+ Looping = val1->GetBool();
+ LoopStart = val2->GetInt();
+ } else {
+ if (val1->IsNULL()) Filename = NULL;
+ else Filename = val1->GetString();
+ Looping = val2->IsNULL() ? false : val2->GetBool();
+ LoopStart = val3->GetInt();
+ }
+
+ if (FAILED(PlaySFX(Filename, Looping, true, NULL, LoopStart))) Stack->PushBool(false);
+ else Stack->PushBool(true);
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // PlaySoundEvent
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "PlaySoundEvent") == 0) {
+ Stack->CorrectParams(2);
+
+ char *Filename;
+ char *EventName;
+
+ CScValue *val1 = Stack->Pop();
+ CScValue *val2 = Stack->Pop();
+
+ if (val2->IsNULL()) {
+ Filename = NULL;
+ EventName = val1->GetString();
+ } else {
+ Filename = val1->GetString();
+ EventName = val2->GetString();
+ }
+
+ if (FAILED(PlaySFX(Filename, false, true, EventName))) Stack->PushBool(false);
+ else Stack->PushBool(true);
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // StopSound
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "StopSound") == 0) {
+ Stack->CorrectParams(0);
+
+ if (FAILED(StopSFX())) Stack->PushBool(false);
+ else Stack->PushBool(true);
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // PauseSound
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "PauseSound") == 0) {
+ Stack->CorrectParams(0);
+
+ if (FAILED(PauseSFX())) Stack->PushBool(false);
+ else Stack->PushBool(true);
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // ResumeSound
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "ResumeSound") == 0) {
+ Stack->CorrectParams(0);
+
+ if (FAILED(ResumeSFX())) Stack->PushBool(false);
+ else Stack->PushBool(true);
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // IsSoundPlaying
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "IsSoundPlaying") == 0) {
+ Stack->CorrectParams(0);
+
+ if (m_SFX && m_SFX->IsPlaying()) Stack->PushBool(true);
+ else Stack->PushBool(false);
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SetSoundPosition
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SetSoundPosition") == 0) {
+ Stack->CorrectParams(1);
+
+ uint32 Time = Stack->Pop()->GetInt();
+ if (FAILED(SetSFXTime(Time))) Stack->PushBool(false);
+ else Stack->PushBool(true);
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // GetSoundPosition
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "GetSoundPosition") == 0) {
+ Stack->CorrectParams(0);
+
+ if (!m_SFX) Stack->PushInt(0);
+ else Stack->PushInt(m_SFX->GetPositionTime());
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SetSoundVolume
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SetSoundVolume") == 0) {
+ Stack->CorrectParams(1);
+
+ int Volume = Stack->Pop()->GetInt();
+ if (FAILED(SetSFXVolume(Volume))) Stack->PushBool(false);
+ else Stack->PushBool(true);
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // GetSoundVolume
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "GetSoundVolume") == 0) {
+ Stack->CorrectParams(0);
+
+ if (!m_SFX) Stack->PushInt(m_SFXVolume);
+ else Stack->PushInt(m_SFX->GetVolume());
+ return S_OK;
+ }
+
+
+ //////////////////////////////////////////////////////////////////////////
+ // SoundFXNone
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SoundFXNone") == 0) {
+ Stack->CorrectParams(0);
+ m_SFXType = SFX_NONE;
+ m_SFXParam1 = 0;
+ m_SFXParam2 = 0;
+ m_SFXParam3 = 0;
+ m_SFXParam4 = 0;
+ Stack->PushNULL();
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SoundFXEcho
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SoundFXEcho") == 0) {
+ Stack->CorrectParams(4);
+ m_SFXType = SFX_ECHO;
+ m_SFXParam1 = (float)Stack->Pop()->GetFloat(0); // Wet/Dry Mix [%] (0-100)
+ m_SFXParam2 = (float)Stack->Pop()->GetFloat(0); // Feedback [%] (0-100)
+ m_SFXParam3 = (float)Stack->Pop()->GetFloat(333.0f); // Left Delay [ms] (1-2000)
+ m_SFXParam4 = (float)Stack->Pop()->GetFloat(333.0f); // Right Delay [ms] (1-2000)
+ Stack->PushNULL();
+
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SoundFXReverb
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SoundFXReverb") == 0) {
+ Stack->CorrectParams(4);
+ m_SFXType = SFX_REVERB;
+ m_SFXParam1 = (float)Stack->Pop()->GetFloat(0); // In Gain [dB] (-96 - 0)
+ m_SFXParam2 = (float)Stack->Pop()->GetFloat(0); // Reverb Mix [dB] (-96 - 0)
+ m_SFXParam3 = (float)Stack->Pop()->GetFloat(1000.0f); // Reverb Time [ms] (0.001 - 3000)
+ m_SFXParam4 = (float)Stack->Pop()->GetFloat(0.001f); // HighFreq RT Ratio (0.001 - 0.999)
+ Stack->PushNULL();
+
+ return S_OK;
+ }
+
+ else return CBScriptHolder::ScCallMethod(Script, Stack, ThisStack, Name);
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+CScValue *CBObject::ScGetProperty(char *Name) {
+ m_ScValue->SetNULL();
+
+ //////////////////////////////////////////////////////////////////////////
+ // Type
+ //////////////////////////////////////////////////////////////////////////
+ if (strcmp(Name, "Type") == 0) {
+ m_ScValue->SetString("object");
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Caption
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Caption") == 0) {
+ m_ScValue->SetString(GetCaption(1));
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // X
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "X") == 0) {
+ m_ScValue->SetInt(m_PosX);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Y
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Y") == 0) {
+ m_ScValue->SetInt(m_PosY);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Height (RO)
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Height") == 0) {
+ m_ScValue->SetInt(GetHeight());
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Ready (RO)
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Ready") == 0) {
+ m_ScValue->SetBool(m_Ready);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Movable
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Movable") == 0) {
+ m_ScValue->SetBool(m_Movable);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Registrable/Interactive
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Registrable") == 0 || strcmp(Name, "Interactive") == 0) {
+ m_ScValue->SetBool(m_Registrable);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Zoomable/Scalable
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Zoomable") == 0 || strcmp(Name, "Scalable") == 0) {
+ m_ScValue->SetBool(m_Zoomable);
+ return m_ScValue;
+ }
+ //////////////////////////////////////////////////////////////////////////
+ // Rotatable
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Rotatable") == 0) {
+ m_ScValue->SetBool(m_Rotatable);
+ return m_ScValue;
+ }
+ //////////////////////////////////////////////////////////////////////////
+ // AlphaColor
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "AlphaColor") == 0) {
+ m_ScValue->SetInt((int)m_AlphaColor);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // BlendMode
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "BlendMode") == 0) {
+ m_ScValue->SetInt((int)m_BlendMode);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Scale
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Scale") == 0) {
+ if (m_Scale < 0) m_ScValue->SetNULL();
+ else m_ScValue->SetFloat((double)m_Scale);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // ScaleX
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "ScaleX") == 0) {
+ if (m_ScaleX < 0) m_ScValue->SetNULL();
+ else m_ScValue->SetFloat((double)m_ScaleX);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // ScaleY
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "ScaleY") == 0) {
+ if (m_ScaleY < 0) m_ScValue->SetNULL();
+ else m_ScValue->SetFloat((double)m_ScaleY);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // RelativeScale
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "RelativeScale") == 0) {
+ m_ScValue->SetFloat((double)m_RelativeScale);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Rotate
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Rotate") == 0) {
+ if (!m_RotateValid) m_ScValue->SetNULL();
+ else m_ScValue->SetFloat((double)m_Rotate);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // RelativeRotate
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "RelativeRotate") == 0) {
+ m_ScValue->SetFloat((double)m_RelativeRotate);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Colorable
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Colorable") == 0) {
+ m_ScValue->SetBool(m_Shadowable);
+ return m_ScValue;
+ }
+ //////////////////////////////////////////////////////////////////////////
+ // SoundPanning
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SoundPanning") == 0) {
+ m_ScValue->SetBool(m_AutoSoundPanning);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SaveState
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SaveState") == 0) {
+ m_ScValue->SetBool(m_SaveState);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // NonIntMouseEvents
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "NonIntMouseEvents") == 0) {
+ m_ScValue->SetBool(m_NonIntMouseEvents);
+ return m_ScValue;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // AccCaption
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "AccCaption") == 0) {
+ m_ScValue->SetNULL();
+ return m_ScValue;
+ }
+
+ else return CBScriptHolder::ScGetProperty(Name);
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::ScSetProperty(char *Name, CScValue *Value) {
+ //////////////////////////////////////////////////////////////////////////
+ // Caption
+ //////////////////////////////////////////////////////////////////////////
+ if (strcmp(Name, "Caption") == 0) {
+ SetCaption(Value->GetString());
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // X
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "X") == 0) {
+ m_PosX = Value->GetInt();
+ AfterMove();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Y
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Y") == 0) {
+ m_PosY = Value->GetInt();
+ AfterMove();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Movable
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Movable") == 0) {
+ m_Movable = Value->GetBool();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Registrable/Interactive
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Registrable") == 0 || strcmp(Name, "Interactive") == 0) {
+ m_Registrable = Value->GetBool();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Zoomable/Scalable
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Zoomable") == 0 || strcmp(Name, "Scalable") == 0) {
+ m_Zoomable = Value->GetBool();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Rotatable
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Rotatable") == 0) {
+ m_Rotatable = Value->GetBool();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // AlphaColor
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "AlphaColor") == 0) {
+ m_AlphaColor = (uint32)Value->GetInt();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // BlendMode
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "BlendMode") == 0) {
+ int i = Value->GetInt();
+ if (i < BLEND_NORMAL || i >= NUM_BLEND_MODES) i = BLEND_NORMAL;
+ m_BlendMode = (TSpriteBlendMode)i;
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Scale
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Scale") == 0) {
+ if (Value->IsNULL()) m_Scale = -1;
+ else m_Scale = (float)Value->GetFloat();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // ScaleX
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "ScaleX") == 0) {
+ if (Value->IsNULL()) m_ScaleX = -1;
+ else m_ScaleX = (float)Value->GetFloat();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // ScaleY
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "ScaleY") == 0) {
+ if (Value->IsNULL()) m_ScaleY = -1;
+ else m_ScaleY = (float)Value->GetFloat();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // RelativeScale
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "RelativeScale") == 0) {
+ m_RelativeScale = (float)Value->GetFloat();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Rotate
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Rotate") == 0) {
+ if (Value->IsNULL()) {
+ m_Rotate = 0.0f;
+ m_RotateValid = false;
+ } else {
+ m_Rotate = (float)Value->GetFloat();
+ m_RotateValid = true;
+ }
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // RelativeRotate
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "RelativeRotate") == 0) {
+ m_RelativeRotate = (float)Value->GetFloat();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // Colorable
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "Colorable") == 0) {
+ m_Shadowable = Value->GetBool();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SoundPanning
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SoundPanning") == 0) {
+ m_AutoSoundPanning = Value->GetBool();
+ if (!m_AutoSoundPanning) ResetSoundPan();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // SaveState
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "SaveState") == 0) {
+ m_SaveState = Value->GetBool();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // NonIntMouseEvents
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "NonIntMouseEvents") == 0) {
+ m_NonIntMouseEvents = Value->GetBool();
+ return S_OK;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // AccCaption
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(Name, "AccCaption") == 0) {
+ return S_OK;
+ }
+
+ else return CBScriptHolder::ScSetProperty(Name, Value);
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+char *CBObject::ScToString() {
+ return "[object]";
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::ShowCursor() {
+ if (m_Cursor) return Game->DrawCursor(m_Cursor);
+ else return E_FAIL;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::SaveAsText(CBDynBuffer *Buffer, int Indent) {
+ return S_OK;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::Persist(CBPersistMgr *PersistMgr) {
+ CBScriptHolder::Persist(PersistMgr);
+
+ for (int i = 0; i < 7; i++) PersistMgr->Transfer(TMEMBER(m_Caption[i]));
+ PersistMgr->Transfer(TMEMBER(m_ActiveCursor));
+ PersistMgr->Transfer(TMEMBER(m_AlphaColor));
+ PersistMgr->Transfer(TMEMBER(m_AutoSoundPanning));
+ PersistMgr->Transfer(TMEMBER(m_Cursor));
+ PersistMgr->Transfer(TMEMBER(m_SharedCursors));
+ PersistMgr->Transfer(TMEMBER(m_EditorAlwaysRegister));
+ PersistMgr->Transfer(TMEMBER(m_EditorOnly));
+ PersistMgr->Transfer(TMEMBER(m_EditorSelected));
+ PersistMgr->Transfer(TMEMBER(m_ID));
+ PersistMgr->Transfer(TMEMBER(m_Is3D));
+ PersistMgr->Transfer(TMEMBER(m_Movable));
+ PersistMgr->Transfer(TMEMBER(m_PosX));
+ PersistMgr->Transfer(TMEMBER(m_PosY));
+ PersistMgr->Transfer(TMEMBER(m_RelativeScale));
+ PersistMgr->Transfer(TMEMBER(m_Rotatable));
+ PersistMgr->Transfer(TMEMBER(m_Scale));
+ PersistMgr->Transfer(TMEMBER(m_SFX));
+ PersistMgr->Transfer(TMEMBER(m_SFXStart));
+ PersistMgr->Transfer(TMEMBER(m_SFXVolume));
+ PersistMgr->Transfer(TMEMBER(m_Ready));
+ PersistMgr->Transfer(TMEMBER(m_Rect));
+ PersistMgr->Transfer(TMEMBER(m_RectSet));
+ PersistMgr->Transfer(TMEMBER(m_Registrable));
+ PersistMgr->Transfer(TMEMBER(m_Shadowable));
+ PersistMgr->Transfer(TMEMBER(m_SoundEvent));
+ PersistMgr->Transfer(TMEMBER(m_Zoomable));
+
+ PersistMgr->Transfer(TMEMBER(m_ScaleX));
+ PersistMgr->Transfer(TMEMBER(m_ScaleY));
+
+ PersistMgr->Transfer(TMEMBER(m_Rotate));
+ PersistMgr->Transfer(TMEMBER(m_RotateValid));
+ PersistMgr->Transfer(TMEMBER(m_RelativeRotate));
+
+ PersistMgr->Transfer(TMEMBER(m_SaveState));
+ PersistMgr->Transfer(TMEMBER(m_NonIntMouseEvents));
+
+ PersistMgr->Transfer(TMEMBER_INT(m_SFXType));
+ PersistMgr->Transfer(TMEMBER(m_SFXParam1));
+ PersistMgr->Transfer(TMEMBER(m_SFXParam2));
+ PersistMgr->Transfer(TMEMBER(m_SFXParam3));
+ PersistMgr->Transfer(TMEMBER(m_SFXParam4));
+
+
+ PersistMgr->Transfer(TMEMBER_INT(m_BlendMode));
+
+ return S_OK;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::SetCursor(char *Filename) {
+ if (!m_SharedCursors) {
+ delete m_Cursor;
+ m_Cursor = NULL;
+ }
+
+ m_SharedCursors = false;
+ m_Cursor = new CBSprite(Game);
+ if (!m_Cursor || FAILED(m_Cursor->LoadFile(Filename))) {
+ delete m_Cursor;
+ m_Cursor = NULL;
+ return E_FAIL;
+ } else return S_OK;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::SetActiveCursor(char *Filename) {
+ delete m_ActiveCursor;
+ m_ActiveCursor = new CBSprite(Game);
+ if (!m_ActiveCursor || FAILED(m_ActiveCursor->LoadFile(Filename))) {
+ delete m_ActiveCursor;
+ m_ActiveCursor = NULL;
+ return E_FAIL;
+ } else return S_OK;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+int CBObject::GetHeight() {
+ return 0;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::HandleMouse(TMouseEvent Event, TMouseButton Button) {
+ return S_OK;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+bool CBObject::HandleKeypress(SDL_Event *event) {
+ return false;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+bool CBObject::HandleMouseWheel(int Delta) {
+ return false;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::PlaySFX(char *Filename, bool Looping, bool PlayNow, char *EventName, uint32 LoopStart) {
+ // just play loaded sound
+ if (Filename == NULL && m_SFX) {
+ if (Game->m_EditorMode || m_SFXStart) {
+ m_SFX->SetVolume(m_SFXVolume);
+ m_SFX->SetPositionTime(m_SFXStart);
+ if (!Game->m_EditorMode) m_SFXStart = 0;
+ }
+ if (PlayNow) {
+ SetSoundEvent(EventName);
+ if (LoopStart) m_SFX->SetLoopStart(LoopStart);
+ return m_SFX->Play(Looping);
+ } else return S_OK;
+ }
+
+ if (Filename == NULL) return E_FAIL;
+
+ // create new sound
+ delete m_SFX;
+
+ m_SFX = new CBSound(Game);
+ if (m_SFX && SUCCEEDED(m_SFX->SetSound(Filename, SOUND_SFX, true))) {
+ m_SFX->SetVolume(m_SFXVolume);
+ if (m_SFXStart) {
+ m_SFX->SetPositionTime(m_SFXStart);
+ m_SFXStart = 0;
+ }
+ m_SFX->ApplyFX(m_SFXType, m_SFXParam1, m_SFXParam2, m_SFXParam3, m_SFXParam4);
+ if (PlayNow) {
+ SetSoundEvent(EventName);
+ if (LoopStart) m_SFX->SetLoopStart(LoopStart);
+ return m_SFX->Play(Looping);
+ } else return S_OK;
+ } else {
+ delete m_SFX;
+ m_SFX = NULL;
+ return E_FAIL;
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::StopSFX(bool DeleteSound) {
+ if (m_SFX) {
+ m_SFX->Stop();
+ if (DeleteSound) {
+ delete m_SFX;
+ m_SFX = NULL;
+ }
+ return S_OK;
+ } else return E_FAIL;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::PauseSFX() {
+ if (m_SFX) return m_SFX->Pause();
+ else return E_FAIL;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::ResumeSFX() {
+ if (m_SFX) return m_SFX->Resume();
+ else return E_FAIL;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::SetSFXTime(uint32 Time) {
+ m_SFXStart = Time;
+ if (m_SFX && m_SFX->IsPlaying()) return m_SFX->SetPositionTime(Time);
+ else return S_OK;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::SetSFXVolume(int Volume) {
+ m_SFXVolume = Volume;
+ if (m_SFX) return m_SFX->SetVolume(Volume);
+ else return S_OK;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::UpdateSounds() {
+ if (m_SoundEvent) {
+ if (m_SFX && !m_SFX->IsPlaying()) {
+ ApplyEvent(m_SoundEvent);
+ SetSoundEvent(NULL);
+ }
+ }
+
+ if (m_SFX) UpdateOneSound(m_SFX);
+
+ return S_OK;
+}
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::UpdateOneSound(CBSound *Sound) {
+ HRESULT Ret = S_OK;
+
+ if (Sound) {
+ if (m_AutoSoundPanning)
+ Ret = Sound->SetPan(Game->m_SoundMgr->PosToPan(m_PosX - Game->m_OffsetX, m_PosY - Game->m_OffsetY));
+
+ Ret = Sound->ApplyFX(m_SFXType, m_SFXParam1, m_SFXParam2, m_SFXParam3, m_SFXParam4);
+ }
+ return Ret;
+}
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::ResetSoundPan() {
+ if (!m_SFX) return S_OK;
+ else {
+ return m_SFX->SetPan(0.0f);
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+bool CBObject::GetExtendedFlag(char *FlagName) {
+ return false;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+bool CBObject::IsReady() {
+ return m_Ready;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+void CBObject::SetSoundEvent(char *EventName) {
+ delete[] m_SoundEvent;
+ m_SoundEvent = NULL;
+ if (EventName) {
+ m_SoundEvent = new char[strlen(EventName) + 1];
+ if (m_SoundEvent) strcpy(m_SoundEvent, EventName);
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+HRESULT CBObject::AfterMove() {
+ return S_OK;
+}
+
+} // end of namespace WinterMute