implemented fade in/out effects
svn-id: r46653
This commit is contained in:
parent
95f90be7ef
commit
3e915d9ec5
5 changed files with 57 additions and 13 deletions
|
@ -194,6 +194,8 @@ void Scene::init(TeenAgentEngine *engine, OSystem *system) {
|
|||
_engine = engine;
|
||||
_system = system;
|
||||
|
||||
memset(palette, 0, sizeof(palette));
|
||||
|
||||
Resources *res = Resources::instance();
|
||||
Common::SeekableReadStream *s = res->varia.getStream(1);
|
||||
if (s == NULL)
|
||||
|
@ -363,7 +365,6 @@ void Scene::init(int id, const Common::Point &pos) {
|
|||
}
|
||||
}
|
||||
}
|
||||
setPalette(_system, palette, 4);
|
||||
|
||||
Common::SeekableReadStream *stream = res->on.getStream(id);
|
||||
int sub_hack = 0;
|
||||
|
@ -389,6 +390,9 @@ void Scene::init(int id, const Common::Point &pos) {
|
|||
|
||||
if (now_playing != res->dseg.get_byte(0xDB90))
|
||||
_engine->music->load(res->dseg.get_byte(0xDB90));
|
||||
|
||||
_system->copyRectToScreen((const byte *)background.pixels, background.pitch, 0, 0, background.w, background.h);
|
||||
setPalette(0);
|
||||
}
|
||||
|
||||
void Scene::playAnimation(byte idx, uint id, bool loop, bool paused, bool ignore) {
|
||||
|
@ -450,7 +454,7 @@ bool Scene::processEvent(const Common::Event &event) {
|
|||
for (int i = 0; i < 4; ++i)
|
||||
custom_animation[i].free();
|
||||
_engine->playMusic(4);
|
||||
init(10, Common::Point(136, 153));
|
||||
_engine->loadScene(10, Common::Point(136, 153));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -504,7 +508,8 @@ bool Scene::render(OSystem *system) {
|
|||
restart = false;
|
||||
busy = processEventQueue();
|
||||
|
||||
if (current_event.type == SceneEvent::kCredits) {
|
||||
switch(current_event.type) {
|
||||
case SceneEvent::kCredits: {
|
||||
system->fillScreen(0);
|
||||
///\todo: optimize me
|
||||
Graphics::Surface *surface = system->lockScreen();
|
||||
|
@ -513,8 +518,19 @@ bool Scene::render(OSystem *system) {
|
|||
|
||||
if (current_event.dst.y < -(int)current_event.timer)
|
||||
current_event.clear();
|
||||
|
||||
}
|
||||
return true;
|
||||
case SceneEvent::kFade:
|
||||
//debug(0, "fade timer = %d", current_event.timer);
|
||||
setPalette(current_event.orientation? 4 - current_event.timer: current_event.timer);
|
||||
++current_event.timer;
|
||||
if (current_event.timer > 4) {
|
||||
nextEvent();
|
||||
continue;
|
||||
} else
|
||||
busy |= true;
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
if (!message.empty() && message_timer != 0) {
|
||||
|
@ -962,7 +978,10 @@ bool Scene::processEventQueue() {
|
|||
debug(0, "*stub* shaking the screen");
|
||||
current_event.clear();
|
||||
break;
|
||||
|
||||
|
||||
case SceneEvent::kFade:
|
||||
break;
|
||||
|
||||
case SceneEvent::kCredits:
|
||||
debug(0, "showing credits");
|
||||
break;
|
||||
|
@ -983,16 +1002,16 @@ bool Scene::processEventQueue() {
|
|||
return !current_event.empty();
|
||||
}
|
||||
|
||||
void Scene::setPalette(OSystem *system, const byte *buf, unsigned mul) {
|
||||
void Scene::setPalette(unsigned mul) {
|
||||
byte p[1024];
|
||||
|
||||
memset(p, 0, 1024);
|
||||
for (int i = 0; i < 256; ++i) {
|
||||
for (int c = 0; c < 3; ++c)
|
||||
p[i * 4 + c] = buf[i * 3 + c] * mul;
|
||||
p[i * 4 + c] = (unsigned)palette[i * 3 + c] * mul;
|
||||
}
|
||||
|
||||
system->setPalette(p, 0, 256);
|
||||
_system->setPalette(p, 0, 256);
|
||||
}
|
||||
|
||||
Object *Scene::getObject(int id, int scene_id) {
|
||||
|
@ -1003,8 +1022,13 @@ Object *Scene::getObject(int id, int scene_id) {
|
|||
|
||||
if (scene_id == 0)
|
||||
return NULL;
|
||||
|
||||
return &objects[scene_id - 1][id - 1];
|
||||
|
||||
Common::Array<Object> &scene_objects = objects[scene_id - 1];
|
||||
--id;
|
||||
if (id >= (int)scene_objects.size())
|
||||
return NULL;
|
||||
|
||||
return &scene_objects[id];
|
||||
}
|
||||
|
||||
Common::Point Scene::messagePosition(const Common::String &str, Common::Point position) {
|
||||
|
|
|
@ -60,6 +60,7 @@ struct SceneEvent {
|
|||
kCredits,
|
||||
kTimer,
|
||||
kEffect,
|
||||
kFade,
|
||||
kQuit
|
||||
} type;
|
||||
|
||||
|
@ -137,6 +138,7 @@ public:
|
|||
void displayMessage(const Common::String &str, byte color = 0xd1, const Common::Point &pos = Common::Point());
|
||||
void setOrientation(uint8 o) { orientation = o; }
|
||||
void push(const SceneEvent &event);
|
||||
SceneEvent::Type last_event_type() const { return !events.empty()? events.back().type: SceneEvent::kNone; }
|
||||
|
||||
bool processEvent(const Common::Event &event);
|
||||
|
||||
|
@ -155,6 +157,7 @@ public:
|
|||
Animation * getAnimation(byte slot);
|
||||
inline Animation * getActorAnimation() { return &actor_animation; }
|
||||
inline const Common::String& getMessage() const { return message; }
|
||||
void setPalette(unsigned mul);
|
||||
|
||||
private:
|
||||
void loadOns();
|
||||
|
@ -164,7 +167,6 @@ private:
|
|||
void playActorAnimation(uint id, bool loop, bool ignore);
|
||||
|
||||
byte palette[768];
|
||||
void setPalette(OSystem *system, const byte *palette, unsigned mul = 1);
|
||||
static Common::Point messagePosition(const Common::String &str, Common::Point position);
|
||||
static uint messageDuration(const Common::String &str);
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
namespace TeenAgent {
|
||||
|
||||
SurfaceList::SurfaceList() : surfaces(NULL) {}
|
||||
SurfaceList::SurfaceList() : surfaces(NULL), surfaces_n(0) {}
|
||||
|
||||
void SurfaceList::load(Common::SeekableReadStream *stream, Type type, int sub_hack) {
|
||||
free();
|
||||
|
|
|
@ -218,6 +218,7 @@ Common::Error TeenAgentEngine::loadGameState(int slot) {
|
|||
uint16 x = res->dseg.get_word(0x64AF), y = res->dseg.get_word(0x64B1);
|
||||
scene->loadObjectData();
|
||||
scene->init(id, Common::Point(x, y));
|
||||
scene->setPalette(4);
|
||||
return Common::kNoError;
|
||||
}
|
||||
|
||||
|
@ -518,7 +519,6 @@ void TeenAgentEngine::displayCutsceneMessage(uint16 addr, uint16 position) {
|
|||
scene->push(event);
|
||||
}
|
||||
|
||||
|
||||
void TeenAgentEngine::moveTo(const Common::Point &dst, byte o, bool warp) {
|
||||
moveTo(dst.x, dst.y, o, warp);
|
||||
}
|
||||
|
@ -573,12 +573,16 @@ void TeenAgentEngine::loadScene(byte id, const Common::Point &pos, byte o) {
|
|||
}
|
||||
|
||||
void TeenAgentEngine::loadScene(byte id, uint16 x, uint16 y, byte o) {
|
||||
if (scene->last_event_type() != SceneEvent::kCreditsMessage)
|
||||
fadeOut();
|
||||
|
||||
SceneEvent event(SceneEvent::kLoadScene);
|
||||
event.scene = id;
|
||||
event.dst.x = x;
|
||||
event.dst.y = y;
|
||||
event.orientation = o;
|
||||
scene->push(event);
|
||||
fadeIn();
|
||||
}
|
||||
|
||||
void TeenAgentEngine::setOns(byte id, byte value, byte scene_id) {
|
||||
|
@ -676,6 +680,18 @@ void TeenAgentEngine::shakeScreen() {
|
|||
scene->push(event);
|
||||
}
|
||||
|
||||
void TeenAgentEngine::fadeIn() {
|
||||
SceneEvent event(SceneEvent::kFade);
|
||||
event.orientation = 0;
|
||||
scene->push(event);
|
||||
}
|
||||
|
||||
void TeenAgentEngine::fadeOut() {
|
||||
SceneEvent event(SceneEvent::kFade);
|
||||
event.orientation = 1;
|
||||
scene->push(event);
|
||||
}
|
||||
|
||||
void TeenAgentEngine::playSoundNow(byte id) {
|
||||
Resources *res = Resources::instance();
|
||||
Common::SeekableReadStream *in = res->sam_sam.getStream(id);
|
||||
|
|
|
@ -106,6 +106,8 @@ public:
|
|||
void setTimerCallback(uint16 addr, uint16 frames);
|
||||
void shakeScreen();
|
||||
void displayCredits();
|
||||
void fadeIn();
|
||||
void fadeOut();
|
||||
|
||||
Common::RandomSource random;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue