aboutsummaryrefslogtreecommitdiff
path: root/engines/fullpipe/behavior.cpp
diff options
context:
space:
mode:
authorEugene Sandulenko2013-08-15 00:46:19 +0300
committerEugene Sandulenko2013-09-06 14:51:14 +0300
commit9f52e9f65068e136680e5fbd4a55eb4ff69720c2 (patch)
tree7b3415da15cfa1b468fc97de3738b4e8b9830167 /engines/fullpipe/behavior.cpp
parent4db2d7e21b6729b04e1760af302a1acdd3bd4ae4 (diff)
downloadscummvm-rg350-9f52e9f65068e136680e5fbd4a55eb4ff69720c2.tar.gz
scummvm-rg350-9f52e9f65068e136680e5fbd4a55eb4ff69720c2.tar.bz2
scummvm-rg350-9f52e9f65068e136680e5fbd4a55eb4ff69720c2.zip
FULLPIPE: More work on behaviors. Animations start to (buggy) work.
Diffstat (limited to 'engines/fullpipe/behavior.cpp')
-rw-r--r--engines/fullpipe/behavior.cpp92
1 files changed, 78 insertions, 14 deletions
diff --git a/engines/fullpipe/behavior.cpp b/engines/fullpipe/behavior.cpp
index 5f26efabe4..2551133675 100644
--- a/engines/fullpipe/behavior.cpp
+++ b/engines/fullpipe/behavior.cpp
@@ -61,7 +61,7 @@ void BehaviorManager::initBehavior(Scene *sc, CGameVar *var) {
for (CGameVar *subvar = behvar->_subVars; subvar; subvar = subvar->_nextVarObj) {
if (!strcmp(subvar->_varName, "AMBIENT")) {
behinfo = new BehaviorInfo;
- behinfo->initAmbientBehavior(subvar);
+ behinfo->initAmbientBehavior(subvar, sc);
_behaviors.push_back(behinfo);
} else {
@@ -83,6 +83,7 @@ void BehaviorManager::updateBehaviors() {
if (!_isActive)
return;
+ debug(0, "BehaviorManager::updateBehaviors()");
for (uint i = 0; i < _behaviors.size(); i++) {
BehaviorInfo *beh = _behaviors[i];
@@ -121,17 +122,18 @@ void BehaviorManager::updateBehaviors() {
}
void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *entry) {
+ debug(0, "BehaviorManager::updateBehavior() %d", entry->_itemsCount);
for (int i = 0; i < entry->_itemsCount; i++) {
BehaviorEntryInfo *bhi = entry->_items[i];
if (!(bhi->_flags & 1)) {
if (bhi->_flags & 2) {
- MessageQueue *mq = new MessageQueue(entry->_items[i]->_messageQueue, 0, 1);
+ MessageQueue *mq = new MessageQueue(bhi->_messageQueue, 0, 1);
mq->sendNextCommand();
- entry->_items[i]->_flags &= 0xFFFFFFFD;
+ bhi->_flags &= 0xFFFFFFFD;
} else if (behaviorInfo->_counter >= bhi->_delay && bhi->_percent && g_fullpipe->_rnd->getRandomNumber(32767) <= entry->_items[i]->_percent) {
- MessageQueue *mq = new MessageQueue(entry->_items[i]->_messageQueue, 0, 1);
+ MessageQueue *mq = new MessageQueue(bhi->_messageQueue, 0, 1);
mq->sendNextCommand();
@@ -141,8 +143,40 @@ void BehaviorManager::updateBehavior(BehaviorInfo *behaviorInfo, BehaviorEntry *
}
}
-void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, unsigned int delay, BehaviorEntry *behaviorEntry) {
- warning("STUB: BehaviorManager::updateStaticAniBehavior()");
+void BehaviorManager::updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *bhe) {
+ debug(0, "BehaviorManager::updateStaticAniBehavior(%s)", transCyrillic((byte *)ani->_objectName));
+
+ MessageQueue *mq = 0;
+
+ if (bhe->_flags & 1) {
+ uint rnd = g_fullpipe->_rnd->getRandomNumber(32767);
+ uint runPercent = 0;
+ for (int i = 0; i < bhe->_itemsCount; i++) {
+ if (!(bhe->_items[i]->_flags & 1) && bhe->_items[i]->_percent) {
+ if (rnd >= runPercent && rnd <= runPercent + bhe->_items[i]->_percent || i == bhe->_itemsCount - 1) {
+ mq = new MessageQueue(bhe->_items[i]->_messageQueue, 0, 1);
+ break;
+ }
+ runPercent += bhe->_items[i]->_percent;
+ }
+ }
+ } else {
+ for (int i = 0; i < bhe->_itemsCount; i++) {
+ if (!(bhe->_items[i]->_flags & 1) && delay >= bhe->_items[i]->_delay) {
+ if (bhe->_items[i]->_percent) {
+ if (g_fullpipe->_rnd->getRandomNumber(32767) <= bhe->_items[i]->_percent) {
+ mq = new MessageQueue(bhe->_items[i]->_messageQueue, 0, 1);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (mq) {
+ mq->replaceKeyCode(-1, ani->_okeyCode);
+ mq->chain(ani);
+ }
}
void BehaviorInfo::clear() {
@@ -157,8 +191,28 @@ void BehaviorInfo::clear() {
_bheItems.clear();
}
-void BehaviorInfo::initAmbientBehavior(CGameVar *var) {
- warning("STUB: BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
+void BehaviorInfo::initAmbientBehavior(CGameVar *var, Scene *sc) {
+ debug(0, "BehaviorInfo::initAmbientBehavior(%s)", transCyrillic((byte *)var->_varName));
+
+ clear();
+ _itemsCount = 1;
+ _counterMax = -1;
+
+ BehaviorEntry *bi = new BehaviorEntry();
+
+ _bheItems.push_back(bi);
+
+ bi->_itemsCount = var->getSubVarsCount();
+
+ bi->_items = (BehaviorEntryInfo**)calloc(bi->_itemsCount, sizeof(BehaviorEntryInfo *));
+
+ for (int i = 0; i < bi->_itemsCount; i++) {
+ int delay;
+ bi->_items[i] = new BehaviorEntryInfo(var->getSubVarByIndex(i), sc, &delay);
+
+ if (bi->_items[i]->_delay <_counterMax)
+ _counterMax = bi->_items[i]->_delay;
+ }
}
void BehaviorInfo::initObjectBehavior(CGameVar *var, Scene *sc, StaticANIObject *ani) {
@@ -189,16 +243,23 @@ void BehaviorInfo::initObjectBehavior(CGameVar *var, Scene *sc, StaticANIObject
_bheItems.push_back(new BehaviorEntry(var->getSubVarByIndex(i), sc, ani, &maxDelay));
- if (maxDelay < _counterMax )
+ if (maxDelay < _counterMax)
_counterMax = maxDelay;
}
}
+BehaviorEntry::BehaviorEntry() {
+ _staticsId = 0;
+ _itemsCount = 0;
+ _flags = 0;
+ _items = 0;
+}
+
BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int *minDelay) {
_staticsId = 0;
_itemsCount = 0;
- *minDelay = -1;
+ *minDelay = 100000000;
int totalPercent = 0;
_flags = 0;
@@ -214,9 +275,10 @@ BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int
for (int i = 0; i < _itemsCount; i++) {
CGameVar *subvar = var->getSubVarByIndex(i);
+ int delay;
- _items[i] = new BehaviorEntryInfo(subvar, sc);
- totalPercent += _items[i]->_percent;
+ _items[i] = new BehaviorEntryInfo(subvar, sc, &delay);
+ totalPercent += delay;
if (_items[i]->_delay < *minDelay)
*minDelay = _items[i]->_delay;
@@ -227,7 +289,7 @@ BehaviorEntry::BehaviorEntry(CGameVar *var, Scene *sc, StaticANIObject *ani, int
}
}
-BehaviorEntryInfo::BehaviorEntryInfo(CGameVar *subvar, Scene *sc) {
+BehaviorEntryInfo::BehaviorEntryInfo(CGameVar *subvar, Scene *sc, int *delay) {
_messageQueue = 0;
_delay = 0;
_percent = 0;
@@ -241,7 +303,9 @@ BehaviorEntryInfo::BehaviorEntryInfo(CGameVar *subvar, Scene *sc) {
vart = subvar->getSubVarByName("dwPercent");
if (vart)
_percent = 0x7FFF * vart->_value.intValue / 1000;
-
+
+ *delay = vart->_value.intValue;
+
vart = subvar->getSubVarByName("dwFlags");
if (vart && vart->_varType == 2 && strstr(vart->_value.stringValue, "QDESC_AUTOSTART"))
_flags |= 2;