diff options
-rw-r--r-- | engines/sci/engine/kernel.cpp | 5 | ||||
-rw-r--r-- | engines/sci/engine/kernel.h | 24 | ||||
-rw-r--r-- | engines/sci/engine/kgraphics.cpp | 52 | ||||
-rw-r--r-- | engines/sci/engine/kmovement.cpp | 5 | ||||
-rw-r--r-- | engines/sci/engine/vm.cpp | 22 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_gui.cpp | 17 | ||||
-rw-r--r-- | engines/sci/gfx/gfx_gui.h | 8 | ||||
-rw-r--r-- | engines/sci/gfx/operations.cpp | 40 | ||||
-rw-r--r-- | engines/sci/gfx/operations.h | 17 | ||||
-rw-r--r-- | engines/sci/gui/gui.cpp | 2 | ||||
-rw-r--r-- | engines/sci/gui/gui_animate.cpp | 72 | ||||
-rw-r--r-- | engines/sci/gui/gui_animate.h | 37 | ||||
-rw-r--r-- | engines/sci/gui/gui_gfx.cpp | 2 | ||||
-rw-r--r-- | engines/sci/gui/gui_helpers.h | 8 | ||||
-rw-r--r-- | engines/sci/gui32/gui32.cpp | 115 |
15 files changed, 172 insertions, 254 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index ee795454b0..a7c6527bc4 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -44,7 +44,7 @@ static const char *sci_default_knames[SCI_KNAMES_DEFAULT_ENTRIES_NR] = { /*0x06*/ "IsObject", /*0x07*/ "RespondsTo", /*0x08*/ "DrawPic", - /*0x09*/ "Show", + /*0x09*/ "Dummy", // Show /*0x0a*/ "PicNotValid", /*0x0b*/ "Animate", /*0x0c*/ "SetNowSeen", @@ -192,7 +192,7 @@ SciKernelFunction kfunct_mappers[] = { /*06*/ DEFUN("IsObject", kIsObject, "."), /*07*/ DEFUN("RespondsTo", kRespondsTo, ".i"), /*08*/ DEFUN("DrawPic", kDrawPic, "i*"), - /*09*/ DEFUN("Show", kShow, "i"), + /*0a*/ DEFUN("PicNotValid", kPicNotValid, "i*"), /*0b*/ DEFUN("Animate", kAnimate, "LI*"), // More like (li?)? /*0c*/ DEFUN("SetNowSeen", kSetNowSeen, "oi*"), // The second parameter is ignored @@ -341,6 +341,7 @@ SciKernelFunction kfunct_mappers[] = { #if 0 // Stub functions + /*09*/ DEFUN("Show", kShow, "i"), DEFUN("ShiftScreen", kShiftScreen, ".*"), DEFUN("MemorySegment", kMemorySegment, ".*"), DEFUN("ListOps", kListOps, ".*"), diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 7cf3bcd4e3..d43581e117 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -268,29 +268,6 @@ void process_sound_events(EngineState *s); /* Maximum length of a savegame name (including terminator character) */ #define SCI_MAX_SAVENAME_LENGTH 0x24 -/* Flags for the signal selector */ -enum { - _K_VIEW_SIG_FLAG_STOP_UPDATE = 0x0001, - _K_VIEW_SIG_FLAG_UPDATED = 0x0002, - _K_VIEW_SIG_FLAG_NO_UPDATE = 0x0004, - _K_VIEW_SIG_FLAG_HIDDEN = 0x0008, - _K_VIEW_SIG_FLAG_FIX_PRI_ON = 0x0010, - _K_VIEW_SIG_FLAG_ALWAYS_UPDATE = 0x0020, - _K_VIEW_SIG_FLAG_FORCE_UPDATE = 0x0040, - _K_VIEW_SIG_FLAG_REMOVE = 0x0080, - _K_VIEW_SIG_FLAG_FROZEN = 0x0100, - _K_VIEW_SIG_FLAG_IS_EXTRA = 0x0200, - _K_VIEW_SIG_FLAG_HIT_OBSTACLE = 0x0400, - _K_VIEW_SIG_FLAG_DOESNT_TURN = 0x0800, - _K_VIEW_SIG_FLAG_NO_CYCLER = 0x1000, - _K_VIEW_SIG_FLAG_IGNORE_HORIZON = 0x2000, - _K_VIEW_SIG_FLAG_IGNORE_ACTOR = 0x4000, - _K_VIEW_SIG_FLAG_DISPOSE_ME = 0x8000, - - _K_VIEW_SIG_FLAG_STOPUPD = 0x20000000 /* View has been stop-updated */ -}; - - /******************** Kernel functions ********************/ // New kernel functions @@ -312,7 +289,6 @@ reg_t kPriCoord(EngineState *s, int argc, reg_t *argv); reg_t kShakeScreen(EngineState *s, int argc, reg_t *argv); reg_t kSetCursor(EngineState *s, int argc, reg_t *argv); reg_t kMoveCursor(EngineState *s, int argc, reg_t *argv); -reg_t kShow(EngineState *s, int argc, reg_t *argv); reg_t kPicNotValid(EngineState *s, int argc, reg_t *argv); reg_t kOnControl(EngineState *s, int argc, reg_t *argv); reg_t kDrawPic(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 002a7ce841..29f3e632d3 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -33,10 +33,10 @@ #include "sci/seq_decoder.h" #include "sci/engine/state.h" #include "sci/engine/kernel.h" -#include "sci/gfx/gfx_gui.h" #include "sci/gfx/gfx_widgets.h" -#include "sci/gfx/gfx_state_internal.h" // required for GfxContainer, GfxPort, GfxVisual +//#include "sci/gfx/gfx_state_internal.h" // required for GfxContainer, GfxPort, GfxVisual #include "sci/gui/gui.h" +#include "sci/gui/gui_animate.h" #include "sci/gui/gui_cursor.h" #include "sci/gui/gui_screen.h" @@ -67,7 +67,7 @@ void _k_dirloop(reg_t obj, uint16 angle, EngineState *s, int argc, reg_t *argv) int maxloops; bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); - if (signal & _K_VIEW_SIG_FLAG_DOESNT_TURN) + if (signal & kSignalDoesntTurn) return; angle %= 360; @@ -188,36 +188,6 @@ reg_t kMoveCursor(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -reg_t kShow(EngineState *s, int argc, reg_t *argv) { - int old_map = s->pic_visible_map; - - s->pic_visible_map = (argc > 0) ? (gfx_map_mask_t) argv[0].toUint16() : GFX_MASK_VISUAL; - - switch (s->pic_visible_map) { - - case GFX_MASK_VISUAL: - case GFX_MASK_PRIORITY: - case GFX_MASK_CONTROL: - gfxop_set_visible_map(s->gfx_state, s->pic_visible_map); - if (old_map != s->pic_visible_map) { - - if (s->pic_visible_map == GFX_MASK_VISUAL) // Full widget redraw - s->visual->draw(Common::Point(0, 0)); - - gfxop_update(s->gfx_state); - debugC(2, kDebugLevelGraphics, "Switching visible map to %x\n", s->pic_visible_map); - } - break; - - default: - warning("Show(%x) selects unknown map", s->pic_visible_map); - - } - - s->pic_not_valid = 2; - return s->r_acc; -} - reg_t kPicNotValid(EngineState *s, int argc, reg_t *argv) { int16 newPicNotValid = (argc > 0) ? argv[0].toUint16() : -1; @@ -862,22 +832,6 @@ reg_t kEditControl(EngineState *s, int argc, reg_t *argv) { return s->r_acc; } -void _k_view_list_mark_free(EngineState *s, reg_t off) { - if (s->dyn_views) { - - GfxDynView *w = (GfxDynView *)s->dyn_views->_contents; - - while (w) { - if (w->_ID == off.segment - && w->_subID == off.offset) { - w->under_bitsp.obj = NULL_REG; - } - - w = (GfxDynView *)w->_next; - } - } -} - reg_t kAddToPic(EngineState *s, int argc, reg_t *argv) { GuiResourceId viewId; GuiViewLoopNo loopNo; diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 62a8bc88b0..7c8d070d10 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -27,6 +27,7 @@ #include "sci/resource.h" #include "sci/engine/state.h" #include "sci/engine/kernel.h" +#include "sci/gui/gui_animate.h" namespace Sci { @@ -247,7 +248,7 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { int max_movcnt = GET_SEL32V(segMan, client, moveSpeed); if (getSciVersion() > SCI_VERSION_01) - signal &= ~_K_VIEW_SIG_FLAG_HIT_OBSTACLE; + signal &= ~kSignalHitObstacle; PUT_SEL32(segMan, client, signal, make_reg(0, signal)); // This is a NOP for SCI0 oldx = x; @@ -324,7 +325,7 @@ reg_t kDoBresen(EngineState *s, int argc, reg_t *argv) { PUT_SEL32V(segMan, client, x, oldx); PUT_SEL32V(segMan, client, y, oldy); - PUT_SEL32V(segMan, client, signal, (signal | _K_VIEW_SIG_FLAG_HIT_OBSTACLE)); + PUT_SEL32V(segMan, client, signal, (signal | kSignalHitObstacle)); debugC(2, kDebugLevelBresen, "Finished mover %04x:%04x by collision\n", PRINT_REG(mover)); completed = 1; diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index eb154b1ad7..bf526e284f 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -1608,6 +1608,7 @@ int script_instantiate_sci0(ResourceManager *resMan, SegManager *segMan, int scr objlength = 0; reg.offset = magic_pos_adder; // Reset counter + reg_t egoClass = segMan->findObjectByName("Ego"); do { reg_t addr; @@ -1634,10 +1635,29 @@ int script_instantiate_sci0(ResourceManager *resMan, SegManager *segMan, int scr Object *baseObj = segMan->getObject(obj->getSpeciesSelector()); obj->setVarCount(baseObj->getVarCount()); - obj->_baseObj = baseObj->_baseObj; // Copy base from species class, as we need its selector IDs + obj->_baseObj = baseObj->_baseObj; obj->setSuperClassSelector(INST_LOOKUP_CLASS(obj->getSuperClassSelector().offset)); + + // Check if the game is trying to change an object that has Ego as its superclass + if (!egoClass.isNull() && obj->getSuperClassSelector() == egoClass) { + reg_t stopGroopPos = segMan->findObjectByName("stopGroop"); + debugC(2, "ego changed, updating stopGroop"); + + // Notify the stopGroop object that Ego changed + if (!stopGroopPos.isNull()) { + Object *stopGroopObj = segMan->getObject(stopGroopPos); + + // Find the client member variable, and update it + ObjVarRef varp; + if (lookup_selector(segMan, stopGroopPos, ((SciEngine*)g_engine)->getKernel()->_selectorCache.client, &varp, NULL) == kSelectorVariable) { + reg_t *clientVar = varp.getPointer(segMan); + *clientVar = addr; + } + } + + } } // if object or class break; case SCI_OBJ_POINTERS: // A relocation table diff --git a/engines/sci/gfx/gfx_gui.cpp b/engines/sci/gfx/gfx_gui.cpp index 4e2e90bbc4..49ba3f24c3 100644 --- a/engines/sci/gfx/gfx_gui.cpp +++ b/engines/sci/gfx/gfx_gui.cpp @@ -31,6 +31,7 @@ #include "sci/gfx/gfx_gui.h" #include "sci/gfx/gfx_state_internal.h" #include "sci/gui32/font.h" +#include "sci/gui/gui_animate.h" #include "common/system.h" @@ -642,4 +643,20 @@ GfxPort *sciw_toggle_item(GfxPort *menu_port, Menu *menu, int selection, bool se return menu_port; } +void _k_view_list_mark_free(EngineState *s, reg_t off) { + if (s->dyn_views) { + + GfxDynView *w = (GfxDynView *)s->dyn_views->_contents; + + while (w) { + if (w->_ID == off.segment + && w->_subID == off.offset) { + w->under_bitsp.obj = NULL_REG; + } + + w = (GfxDynView *)w->_next; + } + } +} + } // End of namespace Sci diff --git a/engines/sci/gfx/gfx_gui.h b/engines/sci/gfx/gfx_gui.h index fe7eb1bb50..c8cb8650b0 100644 --- a/engines/sci/gfx/gfx_gui.h +++ b/engines/sci/gfx/gfx_gui.h @@ -52,14 +52,6 @@ enum windowFlags { kWindowAutoRestore = 0x2000000 }; -/** Button and frame control flags. */ -enum controlStateFlags { - kControlStateEnabled = 0x0001, ///< 0001 - enabled buttons (used by the interpreter) - kControlStateDisabled = 0x0004, ///< 0010 - grayed out buttons (used by the interpreter) - kControlStateFramed = 0x0008, ///< 1000 - widgets surrounded by a frame (used by the interpreter) - kControlStateDitherFramed = 0x1000 ///< 0001 0000 0000 0000 - widgets surrounded by a dithered frame (used in kgraphics) -}; - /** * Sets the contents of a port used as status bar. * diff --git a/engines/sci/gfx/operations.cpp b/engines/sci/gfx/operations.cpp index 9d212a93c3..1c5f6a32bc 100644 --- a/engines/sci/gfx/operations.cpp +++ b/engines/sci/gfx/operations.cpp @@ -340,8 +340,7 @@ static void _gfxop_clear_dirty_rec(GfxState *state, DirtyRectList &dirtyRects) { #ifdef GFXOP_DEBUG_DIRTY fprintf(stderr, "\tClearing dirty (%d %d %d %d)\n", GFX_PRINT_RECT(*dirty)); #endif - if (!state->fullscreen_override) - _gfxop_update_box(state, *dirty); + _gfxop_update_box(state, *dirty); ++dirty; } dirtyRects.clear(); @@ -360,7 +359,6 @@ void gfxop_init(GfxState *state, SciGuiScreen *screen, SciGuiPalette *palette, int scaleFactor) { state->options = options; state->visible_map = GFX_MASK_VISUAL; - state->fullscreen_override = NULL; // No magical override state->options = options; state->disable_dirty = 0; state->_events.clear(); @@ -881,45 +879,9 @@ void gfxop_clear_box(GfxState *state, rect_t box) { _gfxop_buffer_propagate_box(state, box, GFX_BUFFER_BACK); } -void gfxop_set_visible_map(GfxState *state, gfx_map_mask_t visible_map) { - switch (visible_map) { - - case GFX_MASK_VISUAL: - state->fullscreen_override = NULL; - if (visible_map != state->visible_map) { - rect_t rect = gfx_rect(0, 0, 320, 200); - gfxop_clear_box(state, rect); - gfxop_update_box(state, rect); - } - break; - - case GFX_MASK_PRIORITY: - state->fullscreen_override = state->priority_map; - break; - - case GFX_MASK_CONTROL: - state->fullscreen_override = state->control_map; - break; - - default: - warning("Invalid display map %d selected", visible_map); - return; - } - - state->visible_map = visible_map; -} - void gfxop_update(GfxState *state) { _gfxop_clear_dirty_rec(state, state->_dirtyRects); - if (state->fullscreen_override) { - // We've been asked to re-draw the active full-screen image, essentially. - rect_t rect = gfx_rect(0, 0, 320, 200); - gfx_xlate_pixmap(state->fullscreen_override, state->driver->getMode()); - gfxop_draw_pixmap(state, state->fullscreen_override, rect, Common::Point(0, 0)); - _gfxop_update_box(state, rect); - } - if (state->tag_mode) { // This usually happens after a pic and all resources have been drawn state->gfxResMan->freeTaggedResources(); diff --git a/engines/sci/gfx/operations.h b/engines/sci/gfx/operations.h index e620fc9833..2ae5bf80d6 100644 --- a/engines/sci/gfx/operations.h +++ b/engines/sci/gfx/operations.h @@ -114,8 +114,6 @@ struct GfxState { Common::List<sci_event_t> _events; - gfx_pixmap_t *fullscreen_override; /**< An optional override picture which must have unscaled full-screen size, which overrides all other visibility, and which is generally slow */ - gfxr_pic_t *pic, *pic_unscaled; /**< The background picture and its unscaled equivalent */ rect_t pic_port_bounds; /**< Picture port bounds */ @@ -164,21 +162,6 @@ void gfxop_exit(GfxState *state); int gfxop_scan_bitmask(GfxState *state, rect_t area, gfx_map_mask_t map); /** - * Sets the currently visible map. - * - * 'visible_map' can be any of GFX_MASK_VISUAL, GFX_MASK_PRIORITY and - * GFX_MASK_CONTROL; the appropriate map (as far as its contents are known to - * the graphics subsystem) is then subsequently drawn to the screen at each - * update. If this is set to anything other than GFX_MASK_VISUAL, slow - * full-screen updates are performed. Mostly useful for debugging. The screen - * needs to be updated for the changes to take effect. - * - * @param[in] state The state to modify - * @param[in] map The GFX_MASK to set - */ -void gfxop_set_visible_map(GfxState *state, gfx_map_mask_t map); - -/** * Sets a new clipping zone. * * @param[in] state The affected state diff --git a/engines/sci/gui/gui.cpp b/engines/sci/gui/gui.cpp index f93901b5fe..1ad267f05d 100644 --- a/engines/sci/gui/gui.cpp +++ b/engines/sci/gui/gui.cpp @@ -598,7 +598,7 @@ bool SciGui::canBeHere(reg_t curObject, reg_t listReference) { signal = GET_SEL32V(segMan, curObject, signal); controlMask = GET_SEL32V(segMan, curObject, illegalBits); result = (_gfx->onControl(SCI_SCREEN_MASK_CONTROL, checkRect) & controlMask) ? false : true; - if ((result) && (signal & (SCI_ANIMATE_SIGNAL_IGNOREACTOR | SCI_ANIMATE_SIGNAL_REMOVEVIEW)) == 0) { + if ((result) && (signal & (kSignalIgnoreActor | kSignalRemoveView)) == 0) { List *list = _s->_segMan->lookupList(listReference); if (!list) error("kCanBeHere called with non-list as parameter"); diff --git a/engines/sci/gui/gui_animate.cpp b/engines/sci/gui/gui_animate.cpp index cab34a2a21..23af6f5796 100644 --- a/engines/sci/gui/gui_animate.cpp +++ b/engines/sci/gui/gui_animate.cpp @@ -75,7 +75,7 @@ bool SciGuiAnimate::invoke(List *list, int argc, reg_t *argv) { return false; signal = GET_SEL32V(segMan, curObject, signal); - if (!(signal & SCI_ANIMATE_SIGNAL_FROZEN)) { + if (!(signal & kSignalFrozen)) { // Call .doit method of that object invoke_selector(_s, curObject, _s->_kernel->_selectorCache.doit, kContinueOnInvalidSelector, argv, argc, __FILE__, __LINE__, 0); // Lookup node again, since the nodetable it was in may have been reallocated @@ -194,22 +194,22 @@ void SciGuiAnimate::fill(byte &old_picNotValid) { signal = listEntry->signal; // Calculate current priority according to y-coordinate - if (!(signal & SCI_ANIMATE_SIGNAL_FIXEDPRIORITY)) { + if (!(signal & kSignalFixedPriority)) { listEntry->priority = _gfx->CoordinateToPriority(listEntry->y); PUT_SEL32V(segMan, curObject, priority, listEntry->priority); } - if (signal & SCI_ANIMATE_SIGNAL_NOUPDATE) { - if (signal & (SCI_ANIMATE_SIGNAL_FORCEUPDATE | SCI_ANIMATE_SIGNAL_VIEWUPDATED) - || (signal & SCI_ANIMATE_SIGNAL_HIDDEN && !(signal & SCI_ANIMATE_SIGNAL_REMOVEVIEW)) - || (!(signal & SCI_ANIMATE_SIGNAL_HIDDEN) && signal & SCI_ANIMATE_SIGNAL_REMOVEVIEW) - || (signal & SCI_ANIMATE_SIGNAL_ALWAYSUPDATE)) + if (signal & kSignalNoUpdate) { + if (signal & (kSignalForceUpdate | kSignalViewUpdated) + || (signal & kSignalHidden && !(signal & kSignalRemoveView)) + || (!(signal & kSignalHidden) && signal & kSignalRemoveView) + || (signal & kSignalAlwaysUpdate)) old_picNotValid++; - signal &= 0xFFFF ^ SCI_ANIMATE_SIGNAL_STOPUPDATE; + signal &= 0xFFFF ^ kSignalStopUpdate; } else { - if (signal & SCI_ANIMATE_SIGNAL_STOPUPDATE || signal & SCI_ANIMATE_SIGNAL_ALWAYSUPDATE) + if (signal & kSignalStopUpdate || signal & kSignalAlwaysUpdate) old_picNotValid++; - signal &= 0xFFFF ^ SCI_ANIMATE_SIGNAL_FORCEUPDATE; + signal &= 0xFFFF ^ kSignalForceUpdate; } listEntry->signal = signal; @@ -237,8 +237,8 @@ void SciGuiAnimate::update() { curObject = listEntry->object; signal = listEntry->signal; - if (signal & SCI_ANIMATE_SIGNAL_NOUPDATE) { - if (!(signal & SCI_ANIMATE_SIGNAL_REMOVEVIEW)) { + if (signal & kSignalNoUpdate) { + if (!(signal & kSignalRemoveView)) { bitsHandle = GET_SEL32(segMan, curObject, underBits); if (_screen->_picNotValid != 1) { _gfx->BitsRestore(bitsHandle); @@ -248,10 +248,10 @@ void SciGuiAnimate::update() { } PUT_SEL32V(segMan, curObject, underBits, 0); } - signal &= 0xFFFF ^ SCI_ANIMATE_SIGNAL_FORCEUPDATE; - signal &= signal & SCI_ANIMATE_SIGNAL_VIEWUPDATED ? 0xFFFF ^ (SCI_ANIMATE_SIGNAL_VIEWUPDATED | SCI_ANIMATE_SIGNAL_NOUPDATE) : 0xFFFF; - } else if (signal & SCI_ANIMATE_SIGNAL_STOPUPDATE) { - signal = (signal & (0xFFFF ^ SCI_ANIMATE_SIGNAL_STOPUPDATE)) | SCI_ANIMATE_SIGNAL_NOUPDATE; + signal &= 0xFFFF ^ kSignalForceUpdate; + signal &= signal & kSignalViewUpdated ? 0xFFFF ^ (kSignalViewUpdated | kSignalNoUpdate) : 0xFFFF; + } else if (signal & kSignalStopUpdate) { + signal = (signal & (0xFFFF ^ kSignalStopUpdate)) | kSignalNoUpdate; } listEntry->signal = signal; listIterator--; @@ -264,13 +264,13 @@ void SciGuiAnimate::update() { curObject = listEntry->object; signal = listEntry->signal; - if (signal & SCI_ANIMATE_SIGNAL_ALWAYSUPDATE) { + if (signal & kSignalAlwaysUpdate) { // draw corresponding cel _gfx->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo); listEntry->showBitsFlag = true; - signal &= 0xFFFF ^ (SCI_ANIMATE_SIGNAL_STOPUPDATE | SCI_ANIMATE_SIGNAL_VIEWUPDATED | SCI_ANIMATE_SIGNAL_NOUPDATE | SCI_ANIMATE_SIGNAL_FORCEUPDATE); - if ((signal & SCI_ANIMATE_SIGNAL_IGNOREACTOR) == 0) { + signal &= 0xFFFF ^ (kSignalStopUpdate | kSignalViewUpdated | kSignalNoUpdate | kSignalForceUpdate); + if ((signal & kSignalIgnoreActor) == 0) { rect = listEntry->celRect; rect.top = CLIP<int16>(_gfx->PriorityToCoordinate(listEntry->priority) - 1, rect.top, rect.bottom - 1); _gfx->FillRect(rect, SCI_SCREEN_MASK_CONTROL, 0, 0, 15); @@ -287,12 +287,12 @@ void SciGuiAnimate::update() { curObject = listEntry->object; signal = listEntry->signal; - if (signal & SCI_ANIMATE_SIGNAL_NOUPDATE) { - if (signal & SCI_ANIMATE_SIGNAL_HIDDEN) { - signal |= SCI_ANIMATE_SIGNAL_REMOVEVIEW; + if (signal & kSignalNoUpdate) { + if (signal & kSignalHidden) { + signal |= kSignalRemoveView; } else { - signal &= 0xFFFF ^ SCI_ANIMATE_SIGNAL_REMOVEVIEW; - if (signal & SCI_ANIMATE_SIGNAL_IGNOREACTOR) + signal &= 0xFFFF ^ kSignalRemoveView; + if (signal & kSignalIgnoreActor) bitsHandle = _gfx->BitsSave(listEntry->celRect, SCI_SCREEN_MASK_VISUAL|SCI_SCREEN_MASK_PRIORITY); else bitsHandle = _gfx->BitsSave(listEntry->celRect, SCI_SCREEN_MASK_ALL); @@ -310,12 +310,12 @@ void SciGuiAnimate::update() { curObject = listEntry->object; signal = listEntry->signal; - if (signal & SCI_ANIMATE_SIGNAL_NOUPDATE && !(signal & SCI_ANIMATE_SIGNAL_HIDDEN)) { + if (signal & kSignalNoUpdate && !(signal & kSignalHidden)) { // draw corresponding cel _gfx->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo); listEntry->showBitsFlag = true; - if ((signal & SCI_ANIMATE_SIGNAL_IGNOREACTOR) == 0) { + if ((signal & kSignalIgnoreActor) == 0) { rect = listEntry->celRect; rect.top = CLIP<int16>(_gfx->PriorityToCoordinate(listEntry->priority) - 1, rect.top, rect.bottom - 1); _gfx->FillRect(rect, SCI_SCREEN_MASK_CONTROL, 0, 0, 15); @@ -340,7 +340,7 @@ void SciGuiAnimate::drawCels() { curObject = listEntry->object; signal = listEntry->signal; - if (!(signal & (SCI_ANIMATE_SIGNAL_NOUPDATE | SCI_ANIMATE_SIGNAL_HIDDEN | SCI_ANIMATE_SIGNAL_ALWAYSUPDATE))) { + if (!(signal & (kSignalNoUpdate | kSignalHidden | kSignalAlwaysUpdate))) { // Save background bitsHandle = _gfx->BitsSave(listEntry->celRect, SCI_SCREEN_MASK_ALL); PUT_SEL32(segMan, curObject, underBits, bitsHandle); @@ -349,8 +349,8 @@ void SciGuiAnimate::drawCels() { _gfx->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo); listEntry->showBitsFlag = true; - if (signal & SCI_ANIMATE_SIGNAL_REMOVEVIEW) { - signal &= 0xFFFF ^ SCI_ANIMATE_SIGNAL_REMOVEVIEW; + if (signal & kSignalRemoveView) { + signal &= 0xFFFF ^ kSignalRemoveView; } listEntry->signal = signal; @@ -385,8 +385,8 @@ void SciGuiAnimate::updateScreen(byte oldPicNotValid) { curObject = listEntry->object; signal = listEntry->signal; - if (listEntry->showBitsFlag || !(signal & (SCI_ANIMATE_SIGNAL_REMOVEVIEW | SCI_ANIMATE_SIGNAL_NOUPDATE) || - (!(signal & SCI_ANIMATE_SIGNAL_REMOVEVIEW) && (signal & SCI_ANIMATE_SIGNAL_NOUPDATE) && oldPicNotValid))) { + if (listEntry->showBitsFlag || !(signal & (kSignalRemoveView | kSignalNoUpdate) || + (!(signal & kSignalRemoveView) && (signal & kSignalNoUpdate) && oldPicNotValid))) { lsRect.left = GET_SEL32V(segMan, curObject, lsLeft); lsRect.top = GET_SEL32V(segMan, curObject, lsTop); lsRect.right = GET_SEL32V(segMan, curObject, lsRight); @@ -408,8 +408,8 @@ void SciGuiAnimate::updateScreen(byte oldPicNotValid) { PUT_SEL32V(segMan, curObject, lsBottom, workerRect.bottom); _gfx->BitsShow(workerRect); - if (signal & SCI_ANIMATE_SIGNAL_HIDDEN) { - listEntry->signal |= SCI_ANIMATE_SIGNAL_REMOVEVIEW; + if (signal & kSignalHidden) { + listEntry->signal |= kSignalRemoveView; } } @@ -448,12 +448,12 @@ void SciGuiAnimate::restoreAndDelete(int argc, reg_t *argv) { // We read out signal here again, this is not by accident but to ensure that we got an up-to-date signal signal = GET_SEL32V(segMan, curObject, signal); - if ((signal & (SCI_ANIMATE_SIGNAL_NOUPDATE | SCI_ANIMATE_SIGNAL_REMOVEVIEW)) == 0) { + if ((signal & (kSignalNoUpdate | kSignalRemoveView)) == 0) { _gfx->BitsRestore(GET_SEL32(segMan, curObject, underBits)); PUT_SEL32V(segMan, curObject, underBits, 0); } - if (signal & SCI_ANIMATE_SIGNAL_DISPOSEME) { + if (signal & kSignalDisposeMe) { // Call .delete_ method of that object invoke_selector(_s, curObject, _s->_kernel->_selectorCache.delete_, kContinueOnInvalidSelector, argv, argc, __FILE__, __LINE__, 0); } @@ -489,7 +489,7 @@ void SciGuiAnimate::addToPicDrawCels(List *list) { // draw corresponding cel _gfx->drawCel(listEntry->viewId, listEntry->loopNo, listEntry->celNo, listEntry->celRect, listEntry->priority, listEntry->paletteNo); - if ((listEntry->signal & SCI_ANIMATE_SIGNAL_IGNOREACTOR) == 0) { + if ((listEntry->signal & kSignalIgnoreActor) == 0) { listEntry->celRect.top = CLIP<int16>(_gfx->PriorityToCoordinate(listEntry->priority) - 1, listEntry->celRect.top, listEntry->celRect.bottom - 1); _gfx->FillRect(listEntry->celRect, SCI_SCREEN_MASK_CONTROL, 0, 0, 15); } diff --git a/engines/sci/gui/gui_animate.h b/engines/sci/gui/gui_animate.h index 19bee34597..92230b7ebc 100644 --- a/engines/sci/gui/gui_animate.h +++ b/engines/sci/gui/gui_animate.h @@ -30,23 +30,26 @@ namespace Sci { -enum { - SCI_ANIMATE_SIGNAL_STOPUPDATE = 0x0001, - SCI_ANIMATE_SIGNAL_VIEWUPDATED = 0x0002, - SCI_ANIMATE_SIGNAL_NOUPDATE = 0x0004, - SCI_ANIMATE_SIGNAL_HIDDEN = 0x0008, - SCI_ANIMATE_SIGNAL_FIXEDPRIORITY = 0x0010, - SCI_ANIMATE_SIGNAL_ALWAYSUPDATE = 0x0020, - SCI_ANIMATE_SIGNAL_FORCEUPDATE = 0x0040, - SCI_ANIMATE_SIGNAL_REMOVEVIEW = 0x0080, - SCI_ANIMATE_SIGNAL_FROZEN = 0x0100, - SCI_ANIMATE_SIGNAL_EXTRAACTOR = 0x0200, // unused by us, defines all actors that may be included into the background if speed to slow - SCI_ANIMATE_SIGNAL_BLOCKED = 0x0400, // unused by us, defines an actor that tried to move but was blocked - SCI_ANIMATE_SIGNAL_FIXEDLOOP = 0x0800, // unused by us - SCI_ANIMATE_SIGNAL_FIXEDCEL = 0x1000, // unused by us - SCI_ANIMATE_SIGNAL_IGNOREHORIZON = 0x2000, // unused by us, defines actor that can ignore horizon - SCI_ANIMATE_SIGNAL_IGNOREACTOR = 0x4000, - SCI_ANIMATE_SIGNAL_DISPOSEME = 0x8000 +// Flags for the signal selector +enum ViewSignals { + kSignalStopUpdate = 0x0001, + kSignalViewUpdated = 0x0002, + kSignalNoUpdate = 0x0004, + kSignalHidden = 0x0008, + kSignalFixedPriority = 0x0010, + kSignalAlwaysUpdate = 0x0020, + kSignalForceUpdate = 0x0040, + kSignalRemoveView = 0x0080, + kSignalFrozen = 0x0100, + kSignalExtraActor = 0x0200, // unused by us, defines all actors that may be included into the background if speed to slow + kSignalHitObstacle = 0x0400, // used in the actor movement code by kDoBresen() + kSignalDoesntTurn = 0x0800, // used by _k_dirloop() to determine if an actor can turn or not + kSignalNoCycler = 0x1000, // unused by us + kSignalIgnoreHorizon = 0x2000, // unused by us, defines actor that can ignore horizon + kSignalIgnoreActor = 0x4000, + kSignalDisposeMe = 0x8000, + + kSignalStopUpdHack = 0x20000000 // View has been stop-updated (again???) - a hack used by the old GUI code only, for dynamic views }; class SciGuiGfx; diff --git a/engines/sci/gui/gui_gfx.cpp b/engines/sci/gui/gui_gfx.cpp index 7e5e6147e7..f2de19f9b1 100644 --- a/engines/sci/gui/gui_gfx.cpp +++ b/engines/sci/gui/gui_gfx.cpp @@ -1012,7 +1012,7 @@ bool SciGuiGfx::CanBeHereCheckRectList(reg_t checkObject, Common::Rect checkRect curObject = curNode->value; if (curObject != checkObject) { signal = GET_SEL32V(segMan, curObject, signal); - if ((signal & (SCI_ANIMATE_SIGNAL_IGNOREACTOR | SCI_ANIMATE_SIGNAL_REMOVEVIEW | SCI_ANIMATE_SIGNAL_NOUPDATE)) == 0) { + if ((signal & (kSignalIgnoreActor | kSignalRemoveView | kSignalNoUpdate)) == 0) { curRect.left = GET_SEL32V(segMan, curObject, brLeft); curRect.top = GET_SEL32V(segMan, curObject, brTop); curRect.right = GET_SEL32V(segMan, curObject, brRight); diff --git a/engines/sci/gui/gui_helpers.h b/engines/sci/gui/gui_helpers.h index 65ba397f23..efc9548dcb 100644 --- a/engines/sci/gui/gui_helpers.h +++ b/engines/sci/gui/gui_helpers.h @@ -116,6 +116,14 @@ struct GuiPalSchedule { uint32 schedule; }; +/** Button and frame control flags. */ +enum controlStateFlags { + kControlStateEnabled = 0x0001, ///< 0001 - enabled buttons (used by the interpreter) + kControlStateDisabled = 0x0004, ///< 0010 - grayed out buttons (used by the interpreter) + kControlStateFramed = 0x0008, ///< 1000 - widgets surrounded by a frame (used by the interpreter) + kControlStateDitherFramed = 0x1000 ///< 0001 0000 0000 0000 - widgets surrounded by a dithered frame (used in kgraphics) +}; + } // End of namespace Sci #endif diff --git a/engines/sci/gui32/gui32.cpp b/engines/sci/gui32/gui32.cpp index cc590dc4b9..790a43c9f9 100644 --- a/engines/sci/gui32/gui32.cpp +++ b/engines/sci/gui32/gui32.cpp @@ -36,6 +36,7 @@ #include "sci/gfx/gfx_widgets.h" #include "sci/gfx/gfx_state_internal.h" // required for GfxContainer, GfxPort, GfxVisual #include "sci/gui32/gui32.h" +#include "sci/gui/gui_animate.h" #include "sci/gui/gui_cursor.h" // This is the real width of a text with a specified width of 0 @@ -1562,7 +1563,7 @@ void SciGui32::_k_make_view_list(GfxList **widget_list, List *list, int options, if (options & _K_MAKE_VIEW_LIST_CYCLE) { unsigned int signal = GET_SEL32V(segMan, obj, signal); - if (!(signal & _K_VIEW_SIG_FLAG_FROZEN)) { + if (!(signal & kSignalFrozen)) { debugC(2, kDebugLevelGraphics, " invoking %04x:%04x::doit()\n", PRINT_REG(obj)); invoke_selector(INV_SEL(obj, doit, kContinueOnInvalidSelector), 0); // Call obj::doit() if neccessary @@ -1620,7 +1621,7 @@ void SciGui32::draw_obj_to_control_map(GfxDynView *view) { warning("View %d does not contain valid object reference %04x:%04x", view->_ID, PRINT_REG(obj)); reg_t* sp = view->signalp.getPointer(_s->_segMan); - if (!(sp && (sp->offset & _K_VIEW_SIG_FLAG_IGNORE_ACTOR))) { + if (!(sp && (sp->offset & kSignalIgnoreActor))) { Common::Rect abs_zone = get_nsrect32(_s, make_reg(view->_ID, view->_subID), 1); draw_rect_to_control_map(abs_zone); } @@ -1646,7 +1647,7 @@ int SciGui32::_k_view_list_dispose_loop(List *list, GfxDynView *widget, int argc if (GFXW_IS_DYN_VIEW(widget) && (widget->_ID != GFXW_NO_ID)) { signal = widget->signalp.getPointer(segMan)->offset; - if (signal & _K_VIEW_SIG_FLAG_DISPOSE_ME) { + if (signal & kSignalDisposeMe) { reg_t obj = make_reg(widget->_ID, widget->_subID); reg_t under_bits = NULL_REG; @@ -1687,7 +1688,7 @@ int SciGui32::_k_view_list_dispose_loop(List *list, GfxDynView *widget, int argc debugC(2, kDebugLevelGraphics, "Freeing %04x:%04x with signal=%04x\n", PRINT_REG(obj), signal); - if (!(signal & _K_VIEW_SIG_FLAG_HIDDEN)) { + if (!(signal & kSignalHidden)) { debugC(2, kDebugLevelGraphics, "Adding view at %04x:%04x to background\n", PRINT_REG(obj)); if (!(gfxw_remove_id(widget->_parent, widget->_ID, widget->_subID) == widget)) { error("Attempt to remove view with ID %x:%x from list failed", widget->_ID, widget->_subID); @@ -1746,7 +1747,7 @@ void SciGui32::_k_prepare_view_list(GfxList *list, int options) { if (priority < 0) priority = _priority; // Always for picviews } else { // Dynview - if (has_nsrect && !(view->signal & _K_VIEW_SIG_FLAG_FIX_PRI_ON)) { // Calculate priority + if (has_nsrect && !(view->signal & kSignalFixedPriority)) { // Calculate priority if (options & _K_MAKE_VIEW_LIST_CALC_PRIORITY) PUT_SEL32V(segMan, obj, priority, _priority); @@ -1765,8 +1766,8 @@ void SciGui32::_k_prepare_view_list(GfxList *list, int options) { // CR (from :Bob Heitman:) stopupdated views (like pic views) have // their clipped nsRect drawn to the control map - if (view->signal & _K_VIEW_SIG_FLAG_STOP_UPDATE) { - view->signal |= _K_VIEW_SIG_FLAG_STOPUPD; + if (view->signal & kSignalStopUpdate) { + view->signal |= kSignalStopUpdHack; debugC(2, kDebugLevelGraphics, "Setting magic STOP_UPD for %04x:%04x\n", PRINT_REG(obj)); } @@ -1774,30 +1775,30 @@ void SciGui32::_k_prepare_view_list(GfxList *list, int options) { draw_obj_to_control_map(view); // Extreme Pattern Matching ugliness ahead... - if (view->signal & _K_VIEW_SIG_FLAG_NO_UPDATE) { - if (((view->signal & (_K_VIEW_SIG_FLAG_UPDATED | _K_VIEW_SIG_FLAG_FORCE_UPDATE))) // 9.1.1.1 - || ((view->signal & (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_REMOVE)) == _K_VIEW_SIG_FLAG_HIDDEN) - || ((view->signal & (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_REMOVE)) == _K_VIEW_SIG_FLAG_REMOVE) // 9.1.1.2 - || ((view->signal & (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE)) == _K_VIEW_SIG_FLAG_ALWAYS_UPDATE) // 9.1.1.3 - || ((view->signal & (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE)) == (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE))) { // 9.1.1.4 + if (view->signal & kSignalNoUpdate) { + if (((view->signal & (kSignalViewUpdated | kSignalForceUpdate))) // 9.1.1.1 + || ((view->signal & (kSignalHidden | kSignalRemoveView)) == kSignalHidden) + || ((view->signal & (kSignalHidden | kSignalRemoveView)) == kSignalRemoveView) // 9.1.1.2 + || ((view->signal & (kSignalHidden | kSignalRemoveView | kSignalAlwaysUpdate)) == kSignalAlwaysUpdate) // 9.1.1.3 + || ((view->signal & (kSignalHidden | kSignalAlwaysUpdate)) == (kSignalHidden | kSignalAlwaysUpdate))) { // 9.1.1.4 _s->pic_not_valid++; - view->signal &= ~_K_VIEW_SIG_FLAG_STOP_UPDATE; + view->signal &= ~kSignalStopUpdate; } - else if (((view->signal & (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE)) == 0) - || ((view->signal & (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE)) == (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_REMOVE)) - || ((view->signal & (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE)) == (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE)) - || ((view->signal & (_K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE)) == _K_VIEW_SIG_FLAG_HIDDEN)) { - view->signal &= ~_K_VIEW_SIG_FLAG_STOP_UPDATE; + else if (((view->signal & (kSignalHidden | kSignalRemoveView | kSignalAlwaysUpdate)) == 0) + || ((view->signal & (kSignalHidden | kSignalRemoveView | kSignalAlwaysUpdate)) == (kSignalHidden | kSignalRemoveView)) + || ((view->signal & (kSignalHidden | kSignalAlwaysUpdate)) == (kSignalHidden | kSignalAlwaysUpdate)) + || ((view->signal & (kSignalHidden | kSignalAlwaysUpdate)) == kSignalHidden)) { + view->signal &= ~kSignalStopUpdate; } } else { - if (view->signal & _K_VIEW_SIG_FLAG_STOP_UPDATE) { + if (view->signal & kSignalStopUpdate) { _s->pic_not_valid++; - view->signal &= ~_K_VIEW_SIG_FLAG_FORCE_UPDATE; + view->signal &= ~kSignalForceUpdate; } else { // if not STOP_UPDATE - if (view->signal & _K_VIEW_SIG_FLAG_ALWAYS_UPDATE) + if (view->signal & kSignalAlwaysUpdate) _s->pic_not_valid++; - view->signal &= ~_K_VIEW_SIG_FLAG_FORCE_UPDATE; + view->signal &= ~kSignalForceUpdate; } } @@ -1805,7 +1806,7 @@ void SciGui32::_k_prepare_view_list(GfxList *list, int options) { // Never happens /* if (view->signal & 0) { - view->signal &= ~_K_VIEW_SIG_FLAG_STOPUPD; + view->signal &= ~kSignalStopUpdHack; fprintf(_stderr, "Unsetting magic StopUpd for view %04x:%04x\n", PRINT_REG(obj)); } */ @@ -1832,7 +1833,7 @@ void SciGui32::_k_update_signals_in_view_list(GfxList *old_list, GfxList *new_li new_widget = (GfxDynView *)new_widget->_next; if (new_widget) { - int carry = old_widget->signal & _K_VIEW_SIG_FLAG_STOPUPD; + int carry = old_widget->signal & kSignalStopUpdHack; // Transfer 'stopupd' flag if ((new_widget->_pos.x != old_widget->_pos.x) @@ -1864,18 +1865,18 @@ void SciGui32::_k_raise_topmost_in_view_list(GfxList *list, GfxDynView *view) { GfxDynView *next = (GfxDynView *)view->_next; // step 11 - if ((view->signal & (_K_VIEW_SIG_FLAG_NO_UPDATE | _K_VIEW_SIG_FLAG_HIDDEN | _K_VIEW_SIG_FLAG_ALWAYS_UPDATE)) == 0) { + if ((view->signal & (kSignalNoUpdate | kSignalHidden | kSignalAlwaysUpdate)) == 0) { debugC(2, kDebugLevelGraphics, "Forcing precedence 2 at [%04x:%04x] with %04x\n", PRINT_REG(make_reg(view->_ID, view->_subID)), view->signal); view->force_precedence = 2; - if ((view->signal & (_K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_HIDDEN)) == _K_VIEW_SIG_FLAG_REMOVE) { - view->signal &= ~_K_VIEW_SIG_FLAG_REMOVE; + if ((view->signal & (kSignalRemoveView | kSignalHidden)) == kSignalRemoveView) { + view->signal &= ~kSignalRemoveView; } } gfxw_remove_widget_from_container(view->_parent, view); - if (view->signal & _K_VIEW_SIG_FLAG_HIDDEN) + if (view->signal & kSignalHidden) gfxw_hide_widget(view); else gfxw_show_widget(view); @@ -1893,32 +1894,32 @@ void SciGui32::_k_redraw_view_list(GfxList *list) { debugC(2, kDebugLevelGraphics, " dv[%04x:%04x]: signal %04x\n", PRINT_REG(make_reg(view->_ID, view->_subID)), view->signal); // step 1 of subalgorithm - if (view->signal & _K_VIEW_SIG_FLAG_NO_UPDATE) { - if (view->signal & _K_VIEW_SIG_FLAG_FORCE_UPDATE) - view->signal &= ~_K_VIEW_SIG_FLAG_FORCE_UPDATE; + if (view->signal & kSignalNoUpdate) { + if (view->signal & kSignalForceUpdate) + view->signal &= ~kSignalForceUpdate; - if (view->signal & _K_VIEW_SIG_FLAG_UPDATED) - view->signal &= ~(_K_VIEW_SIG_FLAG_UPDATED | _K_VIEW_SIG_FLAG_NO_UPDATE); + if (view->signal & kSignalViewUpdated) + view->signal &= ~(kSignalViewUpdated | kSignalNoUpdate); } else { // NO_UPD is not set - if (view->signal & _K_VIEW_SIG_FLAG_STOP_UPDATE) { - view->signal &= ~_K_VIEW_SIG_FLAG_STOP_UPDATE; - view->signal |= _K_VIEW_SIG_FLAG_NO_UPDATE; + if (view->signal & kSignalStopUpdate) { + view->signal &= ~kSignalStopUpdate; + view->signal |= kSignalNoUpdate; } } debugC(2, kDebugLevelGraphics, " at substep 6: signal %04x\n", view->signal); - if (view->signal & _K_VIEW_SIG_FLAG_ALWAYS_UPDATE) - view->signal &= ~(_K_VIEW_SIG_FLAG_STOP_UPDATE | _K_VIEW_SIG_FLAG_UPDATED | _K_VIEW_SIG_FLAG_NO_UPDATE | _K_VIEW_SIG_FLAG_FORCE_UPDATE); + if (view->signal & kSignalAlwaysUpdate) + view->signal &= ~(kSignalStopUpdate | kSignalViewUpdated | kSignalNoUpdate | kSignalForceUpdate); debugC(2, kDebugLevelGraphics, " at substep 11/14: signal %04x\n", view->signal); - if (view->signal & _K_VIEW_SIG_FLAG_NO_UPDATE) { - if (view->signal & _K_VIEW_SIG_FLAG_HIDDEN) - view->signal |= _K_VIEW_SIG_FLAG_REMOVE; + if (view->signal & kSignalNoUpdate) { + if (view->signal & kSignalHidden) + view->signal |= kSignalRemoveView; else - view->signal &= ~_K_VIEW_SIG_FLAG_REMOVE; - } else if (!(view->signal & _K_VIEW_SIG_FLAG_HIDDEN)) + view->signal &= ~kSignalRemoveView; + } else if (!(view->signal & kSignalHidden)) view->force_precedence = 1; debugC(2, kDebugLevelGraphics, " -> signal %04x\n", view->signal); @@ -1951,20 +1952,20 @@ void SciGui32::_k_draw_view_list(GfxList *list, int flags) { if (GFXW_IS_DYN_VIEW(widget) && widget->_ID) { uint16 signal = (flags & _K_DRAW_VIEW_LIST_USE_SIGNAL) ? widget->signalp.getPointer(_s->_segMan)->offset : 0; - if (signal & _K_VIEW_SIG_FLAG_HIDDEN) + if (signal & kSignalHidden) gfxw_hide_widget(widget); else gfxw_show_widget(widget); if (!(flags & _K_DRAW_VIEW_LIST_USE_SIGNAL) - || ((flags & _K_DRAW_VIEW_LIST_DISPOSEABLE) && (signal & _K_VIEW_SIG_FLAG_DISPOSE_ME)) - || ((flags & _K_DRAW_VIEW_LIST_NONDISPOSEABLE) && !(signal & _K_VIEW_SIG_FLAG_DISPOSE_ME))) { + || ((flags & _K_DRAW_VIEW_LIST_DISPOSEABLE) && (signal & kSignalDisposeMe)) + || ((flags & _K_DRAW_VIEW_LIST_NONDISPOSEABLE) && !(signal & kSignalDisposeMe))) { if (flags & _K_DRAW_VIEW_LIST_USE_SIGNAL) { - signal &= ~(_K_VIEW_SIG_FLAG_STOP_UPDATE | _K_VIEW_SIG_FLAG_UPDATED | _K_VIEW_SIG_FLAG_NO_UPDATE | _K_VIEW_SIG_FLAG_FORCE_UPDATE); + signal &= ~(kSignalStopUpdate | kSignalViewUpdated | kSignalNoUpdate | kSignalForceUpdate); // Clear all of those flags - if (signal & _K_VIEW_SIG_FLAG_HIDDEN) + if (signal & kSignalHidden) gfxw_hide_widget(widget); else gfxw_show_widget(widget); @@ -1991,9 +1992,9 @@ void SciGui32::_k_view_list_do_postdraw(GfxList *list) { * this fixes a few problems, but doesn't match SSCI's logic. * The semantics of the private flag need to be verified before this can be uncommented. * Fixes bug #326 (CB1, ego falls down stairs) - * if ((widget->signal & (_K_VIEW_SIG_FLAG_PRIVATE | _K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_NO_UPDATE)) == _K_VIEW_SIG_FLAG_PRIVATE) { + * if ((widget->signal & (_K_VIEW_SIG_FLAG_PRIVATE | kSignalRemoveView | kSignalNoUpdate)) == _K_VIEW_SIG_FLAG_PRIVATE) { */ - if ((widget->signal & (_K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_NO_UPDATE)) == 0) { + if ((widget->signal & (kSignalRemoveView | kSignalNoUpdate)) == 0) { int has_nsrect = lookup_selector(_s->_segMan, obj, _s->_kernel->_selectorCache.nsBottom, NULL, NULL) == kSelectorVariable; if (has_nsrect) { @@ -2019,11 +2020,11 @@ void SciGui32::_k_view_list_do_postdraw(GfxList *list) { fprintf(_stderr, "Not lsRecting %04x:%04x because %d\n", PRINT_REG(obj), lookup_selector(_s->_segMan, obj, _s->_kernel->_selectorCache.nsBottom, NULL, NULL)); #endif - if (widget->signal & _K_VIEW_SIG_FLAG_HIDDEN) - widget->signal |= _K_VIEW_SIG_FLAG_REMOVE; + if (widget->signal & kSignalHidden) + widget->signal |= kSignalRemoveView; } #ifdef DEBUG_LSRECT - fprintf(_stderr, "obj %04x:%04x has pflags %x\n", PRINT_REG(obj), (widget->signal & (_K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_NO_UPDATE))); + fprintf(_stderr, "obj %04x:%04x has pflags %x\n", PRINT_REG(obj), (widget->signal & (kSignalRemoveView | kSignalNoUpdate))); #endif reg_t* sp = widget->signalp.getPointer(_s->_segMan); @@ -2651,8 +2652,8 @@ static int collides_with(EngineState *s, Common::Rect area, reg_t other_obj, int return 0; } -#define GASEOUS_VIEW_MASK_ACTIVE (_K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_IGNORE_ACTOR) -#define GASEOUS_VIEW_MASK_PASSIVE (_K_VIEW_SIG_FLAG_NO_UPDATE | _K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_IGNORE_ACTOR) +#define GASEOUS_VIEW_MASK_ACTIVE (kSignalRemoveView | kSignalIgnoreActor) +#define GASEOUS_VIEW_MASK_PASSIVE (kSignalNoUpdate | kSignalRemoveView | kSignalIgnoreActor) bool SciGui32::canBeHere(reg_t curObject, reg_t listReference) { SegManager *segMan = _s->_segMan; @@ -2697,7 +2698,7 @@ bool SciGui32::canBeHere(reg_t curObject, reg_t listReference) { debugC(2, kDebugLevelBresen, "Checking vs dynviews:\n"); while (widget) { - if (widget->_ID && (widget->signal & _K_VIEW_SIG_FLAG_STOPUPD) + if (widget->_ID && (widget->signal & kSignalStopUpdHack) && ((widget->_ID != curObject.segment) || (widget->_subID != curObject.offset)) && _s->_segMan->isObject(make_reg(widget->_ID, widget->_subID))) if (collides_with(_s, abs_zone, make_reg(widget->_ID, widget->_subID), 1, GASEOUS_VIEW_MASK_ACTIVE)) |