aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Kiehl2003-05-25 20:32:29 +0000
committerOliver Kiehl2003-05-25 20:32:29 +0000
commit829c666a8ade1df1db67db4e869ff6eb52b0aefd (patch)
treefe307c7b251c7aa8fd8d31020f711f70009d38d1
parentb797a34526d3bb021b07b74b5881b7279cec8dca (diff)
downloadscummvm-rg350-829c666a8ade1df1db67db4e869ff6eb52b0aefd.tar.gz
scummvm-rg350-829c666a8ade1df1db67db4e869ff6eb52b0aefd.tar.bz2
scummvm-rg350-829c666a8ade1df1db67db4e869ff6eb52b0aefd.zip
implement some random functions
svn-id: r7968
-rw-r--r--sky/logic.cpp53
1 files changed, 40 insertions, 13 deletions
diff --git a/sky/logic.cpp b/sky/logic.cpp
index dc9480b9a6..cf613a1971 100644
--- a/sky/logic.cpp
+++ b/sky/logic.cpp
@@ -1130,16 +1130,32 @@ uint32 SkyLogic::fnInteract(uint32 targetId, uint32 b, uint32 c) {
return 0;
}
-uint32 SkyLogic::fnStartSub(uint32 a, uint32 b, uint32 c) {
- error("Stub: fnStartSub");
+uint32 SkyLogic::fnStartSub(uint32 scr, uint32 b, uint32 c) {
+ _compact->mode += 4;
+ uint16 *scriptNo = (uint16 *)SkyCompact::getCompactElem(_compact, C_BASE_SUB + _compact->mode);
+ uint16 *offset = (uint16 *)SkyCompact::getCompactElem(_compact, C_BASE_SUB + _compact->mode + 2);
+ *scriptNo = (uint16)(scr & 0xffff);
+ *offset = (uint16)(scr >> 16);
+ return 0;
}
-uint32 SkyLogic::fnTheyStartSub(uint32 a, uint32 b, uint32 c) {
- error("Stub: fnTheyStartSub");
+uint32 SkyLogic::fnTheyStartSub(uint32 mega, uint32 scr, uint32 c) {
+ Compact *cpt = SkyState::fetchCompact(mega);
+ cpt->mode += 4;
+ uint16 *scriptNo = (uint16 *)SkyCompact::getCompactElem(cpt, C_BASE_SUB + _compact->mode);
+ uint16 *offset = (uint16 *)SkyCompact::getCompactElem(cpt, C_BASE_SUB + _compact->mode + 2);
+ *scriptNo = (uint16)(scr & 0xffff);
+ *offset = (uint16)(scr >> 16);
+ return 1;
}
-uint32 SkyLogic::fnAssignBase(uint32 a, uint32 b, uint32 c) {
- error("Stub: fnAssignBase");
+uint32 SkyLogic::fnAssignBase(uint32 id, uint32 scr, uint32 c) {
+ Compact *cpt = SkyState::fetchCompact(id);
+ cpt->mode = C_BASE_MODE;
+ cpt->logic = L_SCRIPT;
+ cpt->baseSub = (uint16)(scr & 0xffff);
+ cpt->baseSub_off = (uint16)(scr >> 16);
+ return 1;
}
uint32 SkyLogic::fnDiskMouse(uint32 a, uint32 b, uint32 c) {
@@ -1229,15 +1245,17 @@ uint32 SkyLogic::fnTurnTo(uint32 dir, uint32 b, uint32 c) {
return 0; // drop out of script
}
-uint32 SkyLogic::fnArrived(uint32 a, uint32 b, uint32 c) {
- error("Stub: fnArrived");
+uint32 SkyLogic::fnArrived(uint32 scriptVar, uint32 b, uint32 c) {
+ _compact->extCompact->leaving = (uint16)(scriptVar & 0xffff);
+ _scriptVariables[scriptVar]++;
+ return 1;
}
uint32 SkyLogic::fnLeaving(uint32 a, uint32 b, uint32 c) {
_compact->extCompact->atWatch = 0;
if (_compact->extCompact->leaving) {
- _scriptVariables[_compact->extCompact->leaving/4] -= 1; // decrement the script variable
+ _scriptVariables[_compact->extCompact->leaving/4]--;
_compact->extCompact->leaving = 0; // I shall do this only once
}
@@ -1250,12 +1268,21 @@ uint32 SkyLogic::fnSetAlternate(uint32 scr, uint32 b, uint32 c) {
return 0;
}
-uint32 SkyLogic::fnAltSetAlternate(uint32 a, uint32 b, uint32 c) {
- error("Stub: fnAltSetAlternate");
+uint32 SkyLogic::fnAltSetAlternate(uint32 target, uint32 scr, uint32 c) {
+ Compact *cpt = SkyState::fetchCompact(target);
+ cpt->extCompact->alt = (uint16)(scr & 0xffff);
+ cpt->logic = L_ALT;
+ return 0;
}
-uint32 SkyLogic::fnKillId(uint32 a, uint32 b, uint32 c) {
- error("Stub: fnKillId");
+uint32 SkyLogic::fnKillId(uint32 id, uint32 b, uint32 c) {
+ if (id) {
+ Compact *cpt = SkyState::fetchCompact(id);
+ if (cpt->status & (1 << 7))
+ _skyGrid->removeObjectFromWalk(cpt);
+ cpt->status = 0;
+ }
+ return 1;
}
uint32 SkyLogic::fnNoHuman(uint32 a, uint32 b, uint32 c) {