DREAMWEB: Clean up 'dodoor'

This commit is contained in:
Willem Jan Palenstijn 2011-11-16 23:27:14 +01:00
parent bcf440aa3f
commit 81c16d12c8
3 changed files with 49 additions and 64 deletions

View file

@ -295,45 +295,27 @@ void DreamGenContext::random(Sprite *sprite, SetObject *objData) {
} }
void DreamGenContext::doorway(Sprite *sprite, SetObject *objData) { void DreamGenContext::doorway(Sprite *sprite, SetObject *objData) {
data.byte(kDoorcheck1) = (uint8)-24; Common::Rect check(-24, -30, 10, 10);
data.byte(kDoorcheck2) = 10; dodoor(sprite, objData, check);
data.byte(kDoorcheck3) = (uint8)-30;
data.byte(kDoorcheck4) = 10;
dodoor(sprite, objData);
} }
void DreamGenContext::widedoor(Sprite *sprite, SetObject *objData) { void DreamGenContext::widedoor(Sprite *sprite, SetObject *objData) {
data.byte(kDoorcheck1) = (uint8)-24; Common::Rect check(-24, -30, 24, 24);
data.byte(kDoorcheck2) = 24; dodoor(sprite, objData, check);
data.byte(kDoorcheck3) = (uint8)-30;
data.byte(kDoorcheck4) = 24;
dodoor(sprite, objData);
} }
void DreamGenContext::dodoor() { void DreamGenContext::dodoor(Sprite *sprite, SetObject *objData, Common::Rect check) {
Sprite *sprite = (Sprite *)es.ptr(bx, sizeof(Sprite));
SetObject *objData = (SetObject *)ds.ptr(di, 0); int ryanx = data.byte(kRyanx);
dodoor(sprite, objData); int ryany = data.byte(kRyany);
}
// Automatically opening doors: check if Ryan is in range
check.translate(sprite->x, sprite->y);
bool openDoor = check.contains(ryanx, ryany);
if (openDoor) {
void DreamGenContext::dodoor(Sprite *sprite, SetObject *objData) {
uint8 ryanx = data.byte(kRyanx);
uint8 ryany = data.byte(kRyany);
if (ryanx < sprite->x) {
if (ryanx < sprite->x + (int8)data.byte(kDoorcheck1))
goto shutdoor;
} else {
if (ryanx >= sprite->x + data.byte(kDoorcheck2))
goto shutdoor;
}
if (ryany < sprite->y) {
if (ryany < sprite->y + (int8)data.byte(kDoorcheck3))
goto shutdoor;
} else {
if (ryany >= sprite->y + data.byte(kDoorcheck4))
goto shutdoor;
}
//opendoor:
if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0)) if ((data.byte(kThroughdoor) == 1) && (sprite->frame == 0))
sprite->frame = 6; sprite->frame = 6;
@ -345,13 +327,15 @@ void DreamGenContext::dodoor(Sprite *sprite, SetObject *objData) {
al = 0; al = 0;
playchannel1(); playchannel1();
} }
if (objData->b18[sprite->frame] == 255) { if (objData->b18[sprite->frame] == 255)
--sprite->frame; --sprite->frame;
}
sprite->b15 = objData->index = objData->b18[sprite->frame]; sprite->b15 = objData->index = objData->b18[sprite->frame];
data.byte(kThroughdoor) = 1; data.byte(kThroughdoor) = 1;
return;
shutdoor: } else {
// shut door
if (sprite->frame == 5) { // doorsound1; if (sprite->frame == 5) { // doorsound1;
if (data.byte(kReallocation) == 5) // hoteldoor1 if (data.byte(kReallocation) == 5) // hoteldoor1
al = 13; al = 13;
@ -359,13 +343,14 @@ shutdoor:
al = 1; al = 1;
playchannel1(); playchannel1();
} }
if (sprite->frame != 0) { if (sprite->frame != 0)
--sprite->frame; --sprite->frame;
}
sprite->b15 = objData->index = objData->b18[sprite->frame]; sprite->b15 = objData->index = objData->b18[sprite->frame];
if (sprite->frame == 5) // nearly if (sprite->frame == 5) // nearly
data.byte(kThroughdoor) = 0; data.byte(kThroughdoor) = 0;
} }
}
void DreamGenContext::steady(Sprite *sprite, SetObject *objData) { void DreamGenContext::steady(Sprite *sprite, SetObject *objData) {
uint8 b18 = objData->b18[0]; uint8 b18 = objData->b18[0];

View file

@ -21,6 +21,7 @@
*/ */
#include "common/endian.h" #include "common/endian.h"
#include "common/rect.h"
struct Sprite { struct Sprite {
uint16 _updateCallback; uint16 _updateCallback;

View file

@ -90,8 +90,7 @@
void constant(Sprite *sprite, SetObject *objData); void constant(Sprite *sprite, SetObject *objData);
void steady(Sprite *sprite, SetObject *objData); void steady(Sprite *sprite, SetObject *objData);
void random(Sprite *sprite, SetObject *objData); void random(Sprite *sprite, SetObject *objData);
void dodoor(); void dodoor(Sprite *sprite, SetObject *objData, Common::Rect check);
void dodoor(Sprite *sprite, SetObject *objData);
void doorway(Sprite *sprite, SetObject *objData); void doorway(Sprite *sprite, SetObject *objData);
void widedoor(Sprite *sprite, SetObject *objData); void widedoor(Sprite *sprite, SetObject *objData);
void lockeddoorway(Sprite *sprite, SetObject *objData); void lockeddoorway(Sprite *sprite, SetObject *objData);