void LocationParser_ns::parseGetData(ZonePtr z) { TypeData *data = &z->u; if (!scumm_stricmp(_tokens[0], "file")) { GfxObj *obj = _vm->_gfx->loadGet(_tokens[1]); obj->frame = 0; obj->x = z->getX(); obj->y = z->getY(); obj->_prog = _zoneProg; // WORKAROUND for script bug #2969913 // The katana object has the same default z index (kGfxObjGetZ or -100) // as the cripta object (the safe) - a script bug. // Game scripts do not set an explicit z for the katana (as it isn't an // animation), but rather rely on the draw order to draw it over the // safe. In this particular case, the safe is added to the scene after // the katana, thus it is drawn over the katana. We explicitly set the // z index of the katana to be higher than the safe, so that the katana // is drawn correctly over it. // This is a regression from the graphics rewrite (commits be2c5d3, // 3c2c16c and 44906f5). if (!scumm_stricmp(obj->getName(), "katana")) obj->z = 0; bool visible = (z->_flags & kFlagsRemove) == 0; _vm->_gfx->showGfxObj(obj, visible); data->_gfxobj = obj; } else if (!scumm_stricmp(_tokens[0], "icon")) { data->_getIcon = 4 + _vm->_objectsNames->lookup(_tokens[1]); } }
bool Parallaction::checkZoneBox(ZonePtr z, uint32 type, uint x, uint y) { if (z->_flags & kFlagsRemove) return false; debugC(5, kDebugExec, "checkZoneBox for %s (type = %x, x = %i, y = %i)", z->_name, type, x, y); if (!z->hitRect(x, y)) { // check for special zones (items defined in common.loc) if (checkSpecialZoneBox(z, type, x, y)) return true; // check if self-use zone (nothing to do with kFlagsSelfuse) if (_gameType == GType_Nippon) { if (z->getX() != -1) { // no explicit self-use flag in NS return false; } } if (_gameType == GType_BRA) { if (!(z->_flags & kFlagsYourself)) { return false; } } if (!_char._ani->hitFrameRect(x, y)) { return false; } // we get here only if (x,y) hits the character and the zone is marked as self-use } return checkZoneType(z, type); }
void LocationParser_br::parseDoorData(ZonePtr z) { TypeData *data = &z->u; if (!scumm_stricmp(_tokens[0], "slidetext")) { _vm->_location._slideText[0] = _tokens[1]; _vm->_location._slideText[1] = _tokens[2]; } else if (!scumm_stricmp(_tokens[0], "location")) { data->_doorLocation = _tokens[1]; } else if (!scumm_stricmp(_tokens[0], "file")) { GfxObj *obj = _vm->_gfx->loadDoor(_tokens[1]); obj->frame = z->_flags & kFlagsClosed ? 0 : 1; obj->x = z->getX(); obj->y = z->getY(); _vm->_gfx->showGfxObj(obj, true); data->_gfxobj = obj; } else if (!scumm_stricmp(_tokens[0], "startpos")) { data->_doorStartPos.x = atoi(_tokens[1]); data->_doorStartPos.y = atoi(_tokens[2]); data->_doorStartFrame = atoi(_tokens[3]); } else if (!scumm_stricmp(_tokens[0], "startpos2")) { data->_doorStartPos2_br.x = atoi(_tokens[1]); data->_doorStartPos2_br.y = atoi(_tokens[2]); data->_doorStartFrame2_br = atoi(_tokens[3]); } }
bool Debugger::Cmd_Zones(int argc, const char **argv) { ZoneList::iterator b = _vm->_location._zones.begin(); ZoneList::iterator e = _vm->_location._zones.end(); Common::Rect r; DebugPrintf("+--------------------+---+---+---+---+--------+--------+\n" "| name | l | t | r | b | type | flag |\n" "+--------------------+---+---+---+---+--------+--------+\n"); for ( ; b != e; ++b) { ZonePtr z = *b; z->getRect(r); DebugPrintf("|%-20s|%3i|%3i|%3i|%3i|%8x|%8x|\n", z->_name, r.left, r.top, r.right, r.bottom, z->_type, z->_flags ); } DebugPrintf("+--------------------+---+---+---+---+--------+--------+\n"); return true; }
void LocationParser_br::parseGetData(ZonePtr z) { TypeData *data = &z->u; if (!scumm_stricmp(_tokens[0], "file")) { GfxObj *obj = _vm->_gfx->loadGet(_tokens[1]); obj->frame = 0; obj->x = z->getX(); obj->y = z->getY(); obj->_prog = _zoneProg; data->_gfxobj = obj; } else if (!scumm_stricmp(_tokens[0], "mask")) { _out->_info->loadGfxObjMask(_tokens[1], data->_gfxobj); } else if (!scumm_stricmp(_tokens[0], "path")) { _out->_info->loadGfxObjPath(_tokens[1], data->_gfxobj); } else if (!scumm_stricmp(_tokens[0], "icon")) { data->_getIcon = 4 + _vm->_objectsNames->lookup(_tokens[1]); } }
void Parallaction::drawZone(ZonePtr zone) { if (!zone) { return; } GfxObj *obj = 0; if (ACTIONTYPE(zone) == kZoneGet) { obj = zone->u._gfxobj; } else if (ACTIONTYPE(zone) == kZoneDoor) { obj = zone->u._gfxobj; } if (!obj) { return; } obj->x = zone->getX(); obj->y = zone->getY(); _gfx->addObjectToScene(obj); }
bool Parallaction::checkSpecialZoneBox(ZonePtr z, uint32 type, uint x, uint y) { // check if really a special zone if (_gameType == GType_Nippon) { // so-called special zones in NS have special x coordinates if ((z->getX() != -2) && (z->getX() != -3)) { return false; } } if (_gameType == GType_BRA) { // so far, special zones in BRA are only merge zones if (ACTIONTYPE(z) != kZoneMerge) { return false; } } // WORKAROUND: this huge condition is needed because we made TypeData a collection of structs // instead of an union. So, merge->_obj1 and get->_icon were just aliases in the original engine, // but we need to check it separately here. The same workaround is applied in freeZones. if (((ACTIONTYPE(z) == kZoneMerge) && (((x == z->u._mergeObj1) && (y == z->u._mergeObj2)) || ((x == z->u._mergeObj2) && (y == z->u._mergeObj1)))) || ((ACTIONTYPE(z) == kZoneGet) && ((x == z->u._getIcon) || (y == z->u._getIcon)))) { // WORKAROUND for bug 2070751: special zones are only used in NS, to allow the // the EXAMINE/USE action to be applied on some particular item in the inventory. // The usage a verb requires at least an item match, so type can't be 0, as it // was in the original code. This bug has been here since the beginning, and was // hidden by label code, which filtered the bogus matches produced here. // look for action + item match if (z->_type == type) return true; // look for item match, but don't accept 0 types if ((ITEMTYPE(z) == type) && (type)) return true; } return false; }
bool Location::keepZone_ns(ZonePtr z) { return (z->getY() == -1) || (z->getX() == -2); }