/* 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 3 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, see . * */ #include "chewy/cursor.h" #include "chewy/defines.h" #include "chewy/events.h" #include "chewy/font.h" #include "chewy/globals.h" #include "chewy/main.h" #include "chewy/room.h" #include "chewy/rooms/room00.h" #include "chewy/sound.h" namespace Chewy { namespace Rooms { #define FLAP_SPRITE 5 #define CH_FLASH 8 #define FLAP_DETAIL 10 #define HOSE_DETAIL 11 #define CH_THROWS_SLIME 12 #define CH_TO_FEEDER 13 #define CH_THROWS_PILLOW 14 #define FEEDER_HOSE 15 #define STERNE_STEHEN 16 #define HOSE1 11 #define HOSE2 38 #define HOSE3 59 #define HEAD1 39 #define HEAD2 46 #define HEAD3 48 void Room0::entry() { if (isCurInventory(0) || _G(gameState).R0PillowThrow || _G(obj)->checkInventory(0)) _G(det)->hideStaticSpr(6); if (!_G(flags).LoadGame) { setPersonPos(150, 100, P_CHEWY, P_RIGHT); hideCur(); _G(timer_nr)[0] = _G(room)->set_timer(255, 3); while (!_G(ani_timer)[_G(timer_nr)[0]]._timeFlag && !SHOULD_QUIT) { setupScreen(DO_SETUP); } start_spz(CH_TALK5, 255, ANI_FRONT, P_CHEWY); startAadWait(2); showCur(); } } bool Room0::timer(int16 timerNr, int16 aniNr) { bool retval = false; if (aniNr == 1) { if (_G(timer_action_ctr) > 0) { _G(uhr)->resetTimer(timerNr, 0); --_G(timer_action_ctr); } else if (!is_chewy_busy() && _G(flags).AutoAniPlay == 0) { if (!_G(gameState).R0FueterLab) _G(timer_action_ctr) = 2; _G(flags).AutoAniPlay = true; if (!_G(gameState).R0SlimeUsed) { startAadWait(42); autoMove(5, P_CHEWY); setPersonSpr(P_LEFT, P_CHEWY); if (_G(gameState).R0FueterLab < 3) { start_spz(CH_TALK3, 255, false, P_CHEWY); if (_G(gameState).R0FueterLab) startAadWait(618); else startAadWait(43); ++_G(gameState).R0FueterLab; } eyeAnim(); } else if (!_G(gameState).R0PillowThrow) { startAadWait(42); start_spz(CH_TALK3, 255, false, P_CHEWY); if (_G(gameState).R0FueterLab < 3) { startAadWait(43); ++_G(gameState).R0FueterLab; } autoMove(3, P_CHEWY); setPersonPos(191, 120, P_CHEWY, P_LEFT); } if (!_G(gameState).R0PillowThrow) feederAni(); _G(uhr)->resetTimer(timerNr, 0); _G(flags).AutoAniPlay = false; } } else if (timerNr != 3) { retval = true; } return retval; } bool Room0::getPillow() { bool retval = false; if (!_G(cur)->usingInventoryCursor()) { hideCur(); _G(flags).AutoAniPlay = true; autoMove(1, P_CHEWY); start_spz_wait(CH_LGET_O, 1, false, P_CHEWY); invent_2_slot(0); _G(menu_item) = CUR_WALK; cursorChoice(CUR_WALK); _G(atds)->setControlBit(174, ATS_ACTIVE_BIT); _G(det)->hideStaticSpr(6); _G(flags).AutoAniPlay = false; showCur(); retval = true; } return retval; } bool Room0::pullSlime() { bool retval = false; if (!_G(cur)->usingInventoryCursor()) { hideCur(); _G(flags).AutoAniPlay = true; autoMove(2, P_CHEWY); _G(gameState)._personHide[P_CHEWY] = true; startSetAILWait(3, 1, ANI_FRONT); startSetAILWait(17, 2, ANI_FRONT); setPersonPos(222, 106, P_CHEWY, P_LEFT); _G(gameState)._personHide[P_CHEWY] = false; invent_2_slot(1); _G(menu_item) = CUR_WALK; cursorChoice(CUR_WALK); _G(atds)->setControlBit(175, ATS_ACTIVE_BIT); _G(flags).AutoAniPlay = false; showCur(); retval = true; } return retval; } void Room0::eyeAnim() { if (!_G(gameState).R0SlimeUsed) { // Start the eye animation eyeStart(EYE_START); if (!_G(gameState).R0SlimeUsed) eyeWait(); if (_G(gameState).R0SlimeUsed) { start_aad(124); checkSlimeEye(); eyeSlimeBack(); autoMove(FUETTER_POS, P_CHEWY); setPersonPos(199 - CH_HOT_MOV_X, 145 - CH_HOT_MOV_Y, P_CHEWY, P_LEFT); } else { eyeShoot(); setPersonPos(199 - CH_HOT_MOV_X, 145 - CH_HOT_MOV_Y, P_CHEWY, P_LEFT); eyeStart(EYE_END); } } } void Room0::eyeStart(EyeMode mode) { AniDetailInfo *adi = _G(det)->getAniDetail(HOSE_DETAIL); if (mode == EYE_START) adi->ani_count = adi->start_ani; else adi->ani_count = 38; if (mode == EYE_START) { trapDoorOpen(); } bool ende = false; _G(flags).AniUserAction = true; if (mode == EYE_START) { _G(det)->playSound(FLAP_DETAIL, 0); _G(det)->stopSound(1); _G(det)->playSound(HOSE_DETAIL, 0); _G(det)->stopSound(2); } else { _G(det)->stopSound(0); _G(det)->playSound(FLAP_DETAIL, 1); _G(det)->stopSound(0); _G(det)->playSound(HOSE_DETAIL, 2); } while (!ende) { clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; if ((adi->ani_count > 11) && (adi->ani_count < 19)) { _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HOSE1, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; } if (adi->ani_count == 38) { _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HEAD1, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; } _G(spr_info)[3] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, adi->ani_count, ANI_HIDE); _G(spr_info)[3]._zLevel = 193; get_user_key(NO_SETUP); setupScreen(NO_SETUP); SHOULD_QUIT_RETURN; _G(cur)->updateCursor(); calcEyeClick(3); _G(out)->copyToScreen(); if (adi->delay_count > 0) --adi->delay_count; else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; if (mode == EYE_START) { ++adi->ani_count; if (adi->ani_count > 38) ende = true; } else { --adi->ani_count; if (adi->ani_count == adi->start_ani - 1) ende = true; } } } clear_prog_ani(); _G(flags).AniUserAction = false; if (mode == EYE_END) { trapDoorClose(); } } void Room0::eyeWait() { AniDetailInfo *adi = _G(det)->getAniDetail(HOSE_DETAIL); adi->ani_count = 39; adi->delay_count = 15; _G(flags).AniUserAction = true; while (adi->ani_count < 46) { clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HOSE2, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, adi->ani_count, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; get_user_key(NO_SETUP); setupScreen(NO_SETUP); _G(cur)->updateCursor(); calcEyeClick(2); _G(out)->copyToScreen(); if (adi->delay_count > 0) { --adi->delay_count; } else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; ++adi->ani_count; } EVENTS_UPDATE; SHOULD_QUIT_RETURN; } _G(flags).AniUserAction = false; clear_prog_ani(); } void Room0::calcEyeClick(int16 aniNr) { if (mouse_on_prog_ani() == aniNr) { if (_G(minfo).button != 1 && g_events->_kbInfo._keyCode != Common::KEYCODE_RETURN) { const uint8 roomNum = _G(room)->_roomInfo->_roomNr; Common::StringArray desc = _G(atds)->getTextArray(roomNum, 172, ATS_DATA); if (desc.size() > 0) { _G(fontMgr)->setFont(_G(font8)); int16 x = g_events->_mousePos.x; int16 y = g_events->_mousePos.y; calcTxtXy(&x, &y, desc); for (int16 i = 0; i < (int16)desc.size(); i++) printShadowed(x, y + i * 10, 255, 300, 0, _G(scr_width), desc[i].c_str()); } } else if (_G(minfo).button == 1 || g_events->_kbInfo._keyCode == Common::KEYCODE_RETURN) { if (isCurInventory(SLIME_INV)) { delInventory(_G(cur)->getInventoryCursor()); _G(gameState).R0SlimeUsed = true; } else if (isCurInventory(PILLOW_INV)) { startAtsWait(172, TXT_MARK_WALK, 14, ATS_DATA); } } } } void Room0::eyeShoot() { AniDetailInfo *adi = _G(det)->getAniDetail(HOSE_DETAIL); adi->ani_count = 47; bool endLoopFl = false; _G(det)->startDetail(CH_FLASH, 1, ANI_FRONT); while (!endLoopFl) { clear_prog_ani(); _G(gameState)._personHide[P_CHEWY] = true; _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HOSE2, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; if (adi->ani_count < 53) { _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, adi->ani_count, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; } else { _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, 47, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; if (!_G(det)->get_ani_status(CH_FLASH)) endLoopFl = true; } setupScreen(DO_SETUP); SHOULD_QUIT_RETURN; if (adi->delay_count > 0) --adi->delay_count; else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; ++adi->ani_count; } } _G(det)->startDetail(STERNE_STEHEN, 255, ANI_FRONT); clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HOSE2, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HEAD2, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; waitShowScreen(30); clear_prog_ani(); setPersonPos(199 - CH_HOT_MOV_X, 145 - CH_HOT_MOV_Y, P_CHEWY, P_LEFT); _G(gameState)._personHide[P_CHEWY] = false; } void Room0::eyeSlimeBack() { AniDetailInfo *adi = _G(det)->getAniDetail(HOSE_DETAIL); adi->ani_count = 53; bool endLoopFl = false; _G(flags).AniUserAction = true; while (!endLoopFl) { clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; if ((adi->ani_count > 52) && (adi->ani_count < 59)) { _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HOSE2, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; } if (adi->ani_count == 61) { _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HOSE3, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; } _G(spr_info)[3] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, adi->ani_count, ANI_HIDE); _G(spr_info)[3]._zLevel = 193; set_ani_screen(); SHOULD_QUIT_RETURN; if (adi->delay_count > 0) --adi->delay_count; else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; ++adi->ani_count; if (adi->ani_count == 77) endLoopFl = true; } } _G(flags).AniUserAction = false; clear_prog_ani(); } void Room0::checkSlimeEye() { AniDetailInfo *adi = _G(det)->getAniDetail(CH_THROWS_SLIME); adi->ani_count = adi->start_ani; if (adi->load_flag) { _G(det)->load_taf_seq(adi->start_ani, (adi->end_ani - adi->start_ani) + 1, nullptr); } while (adi->ani_count < adi->end_ani && !SHOULD_QUIT) { clear_prog_ani(); _G(gameState)._personHide[P_CHEWY] = true; _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HOSE2, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, HOSE_DETAIL, HEAD2, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; _G(spr_info)[3] = _G(det)->plot_detail_sprite(0, 0, CH_THROWS_SLIME, adi->ani_count, ANI_HIDE); _G(spr_info)[3]._zLevel = 193; setupScreen(DO_SETUP); if (adi->delay_count > 0) --adi->delay_count; else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; ++adi->ani_count; } } if (adi->load_flag) { _G(det)->del_taf_tbl(adi->start_ani, (adi->end_ani - adi->start_ani) + 1, nullptr); } clear_prog_ani(); _G(gameState)._personHide[P_CHEWY] = false; } void Room0::feederStart(int16 mode) { AniDetailInfo *adi = _G(det)->getAniDetail(FEEDER_HOSE); if (!mode) adi->ani_count = adi->start_ani; else adi->ani_count = 135; if (!mode) { trapDoorOpen(); _G(det)->playSound(FLAP_DETAIL, 0); _G(det)->stopSound(1); _G(det)->playSound(FEEDER_HOSE, 0); _G(det)->stopSound(2); } else { _G(det)->stopSound(0); _G(det)->playSound(FLAP_DETAIL, 1); _G(det)->stopSound(0); _G(det)->playSound(FEEDER_HOSE, 2); } bool endLoopFl = false; if (_G(gameState).R0SlimeUsed) _G(flags).AniUserAction = true; while (!endLoopFl) { clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, adi->ani_count, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; if (_G(flags).AniUserAction) get_user_key(NO_SETUP); EVENTS_UPDATE; SHOULD_QUIT_RETURN; setupScreen(NO_SETUP); _G(cur)->updateCursor(); if (!mode) calcPillowClick(1); _G(out)->copyToScreen(); if (adi->delay_count > 0) --adi->delay_count; else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; if (!mode) { ++adi->ani_count; if (adi->ani_count > 135) endLoopFl = true; } else { --adi->ani_count; if (adi->ani_count == adi->start_ani - 1) endLoopFl = true; } } } clear_prog_ani(); _G(flags).AniUserAction = false; if (mode) { _G(det)->startDetail(FLAP_DETAIL, 1, ANI_BACK); while (_G(det)->get_ani_status(FLAP_DETAIL)) set_ani_screen(); } } void Room0::feederExtend() { for (int16 i = 0; i < 30 && !_G(gameState).R0PillowThrow; i++) { clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, 136, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; get_user_key(NO_SETUP); setupScreen(NO_SETUP); _G(cur)->updateCursor(); calcPillowClick(1); _G(out)->copyToScreen(); } clear_prog_ani(); } void Room0::calcPillowClick(int16 aniNr) { if (mouse_on_prog_ani() == aniNr) { if (_G(minfo).button != 1 && g_events->_kbInfo._keyCode != Common::KEYCODE_RETURN) { const uint8 roomNum = _G(room)->_roomInfo->_roomNr; Common::StringArray desc = _G(atds)->getTextArray(roomNum, 173, ATS_DATA); if (desc.size() > 0) { _G(fontMgr)->setFont(_G(font8)); int16 x = g_events->_mousePos.x; int16 y = g_events->_mousePos.y; calcTxtXy(&x, &y, desc); for (int16 i = 0; i < (int16)desc.size(); i++) printShadowed(x, y + i * 10, 255, 300, 0, _G(scr_width), desc[i].c_str()); } } else if (_G(minfo).button == 1 || g_events->_kbInfo._keyCode == Common::KEYCODE_RETURN) { if (isCurInventory(PILLOW_INV) && _G(gameState).R0SlimeUsed) { delInventory(_G(cur)->getInventoryCursor()); _G(gameState).R0PillowThrow = true; } else if (isCurInventory(SLIME_INV)) { startAtsWait(173, TXT_MARK_WALK, 14, ATS_DATA); } } } } void Room0::checkFeed() { AniDetailInfo *adi = _G(det)->getAniDetail(FEEDER_HOSE); adi->ani_count = 136; int16 i = 152; bool endLoopFl = false; if (_G(gameState).R0SlimeUsed) _G(flags).AniUserAction = true; while (!endLoopFl) { clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; if (adi->ani_count == 136) { _G(gameState)._personHide[P_CHEWY] = true; if (!_G(gameState).R0SlimeUsed) _G(det)->stopDetail(16); } if (adi->ani_count > 138) { _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, 138, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; } if (adi->ani_count > 141) { _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, i, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; } if (adi->ani_count == 138) { _G(spr_info)[3] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, 139, ANI_HIDE); _G(spr_info)[3]._zLevel = 193; } _G(spr_info)[4] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, adi->ani_count, ANI_HIDE); _G(spr_info)[4]._zLevel = 194; set_ani_screen(); SHOULD_QUIT_RETURN; if (adi->delay_count > 0) --adi->delay_count; else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; if (adi->ani_count > 141) ++i; ++adi->ani_count; if (adi->ani_count == 152) endLoopFl = true; } } adi->ani_count = 138; _G(det)->startDetail(CH_TO_FEEDER, 2, ANI_FRONT); endLoopFl = false; while (!endLoopFl) { clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; if (adi->ani_count > 138) { _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, 138, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; } if (adi->ani_count == 138) { _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, 139, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; } _G(spr_info)[3] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, adi->ani_count, ANI_HIDE); _G(spr_info)[3]._zLevel = 193; set_ani_screen(); SHOULD_QUIT_RETURN; if (!_G(det)->get_ani_status(CH_TO_FEEDER)) endLoopFl = true; if (adi->delay_count > 0) --adi->delay_count; else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; if (adi->ani_count > 135) --adi->ani_count; } } _G(gameState)._personHide[P_CHEWY] = false; _G(flags).AniUserAction = false; clear_prog_ani(); } void Room0::checkPillow() { AniDetailInfo *adi = _G(det)->getAniDetail(FEEDER_HOSE); adi->ani_count = 161; bool endLoopFl = false; _G(gameState)._personHide[P_CHEWY] = true; _G(det)->startDetail(CH_THROWS_PILLOW, 1, ANI_FRONT); bool mode = false; while (!endLoopFl) { clear_prog_ani(); if (!_G(det)->get_ani_status(CH_THROWS_PILLOW)) { mode = true; _G(gameState)._personHide[P_CHEWY] = false; setPersonPos(228 - CH_HOT_MOV_X, 143 - CH_HOT_MOV_Y, P_CHEWY, P_LEFT); } _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; _G(spr_info)[1] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, 138, ANI_HIDE); _G(spr_info)[1]._zLevel = 191; if (mode) { _G(spr_info)[2] = _G(det)->plot_detail_sprite(0, 0, FEEDER_HOSE, adi->ani_count, ANI_HIDE); _G(spr_info)[2]._zLevel = 192; } setupScreen(DO_SETUP); SHOULD_QUIT_RETURN; if (mode) { if (adi->delay_count > 0) --adi->delay_count; else { adi->delay_count = adi->delay + _G(gameState).DelaySpeed; --adi->ani_count; if (adi->ani_count == 151) endLoopFl = true; } } } clear_prog_ani(); } void Room0::trapDoorOpen() { _G(det)->startDetail(FLAP_DETAIL, 1, ANI_FRONT); while (_G(det)->get_ani_status(FLAP_DETAIL)) { set_ani_screen(); SHOULD_QUIT_RETURN; } _G(flags).AniUserAction = true; for (int16 i = 0; i < 25; i++) { clear_prog_ani(); _G(spr_info)[0] = _G(det)->plot_detail_sprite(0, 0, FLAP_DETAIL, FLAP_SPRITE, ANI_HIDE); _G(spr_info)[0]._zLevel = 190; set_ani_screen(); SHOULD_QUIT_RETURN; } _G(flags).AniUserAction = false; clear_prog_ani(); } void Room0::trapDoorClose() { _G(det)->startDetail(FLAP_DETAIL, 1, ANI_BACK); while (_G(det)->get_ani_status(FLAP_DETAIL)) { set_ani_screen(); EVENTS_UPDATE; SHOULD_QUIT_RETURN; } } void Room0::feederAni() { int16 action = false; feederStart(0); if (_G(gameState).R0SlimeUsed) { feederExtend(); if (_G(gameState).R0PillowThrow) { checkPillow(); feederStart(1); autoMove(VERSTECK_POS, P_CHEWY); setupScreen(DO_SETUP); _G(out)->cls(); flic_cut(FCUT_000); register_cutscene(1); _G(gameState)._personRoomNr[P_CHEWY] = 1; _G(room)->loadRoom(&_G(room_blk), _G(gameState)._personRoomNr[P_CHEWY], &_G(gameState)); setPersonPos(_G(Rdi)->autoMove[4]._x - CH_HOT_MOV_X, _G(Rdi)->autoMove[4]._y - CH_HOT_MOV_Y, P_CHEWY, P_RIGHT); _G(moveState)[P_CHEWY]._delayCount = 0; setShadowPalette(4, false); _G(fx_blend) = BLEND1; setupScreen(DO_SETUP); } else { action = true; } } else { action = true; } if (action) { checkFeed(); start_spz(CH_EKEL, 3, ANI_FRONT, P_CHEWY); start_aad(55); feederStart(1); } } } // namespace Rooms } // namespace Chewy