void ConstructionTask::giveUnit(Unit unit) { if(unit->getType() == mType.whatBuilds().first) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Given Builder"); assert(!mBuilder); mBuilder = unit; reserveResources(); } else if(unit == mReservedLocation->getUnitPrediction() || unit->getTilePosition() == mReservedLocation->getTilePosition()) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Given Produced Unit"); assert(!mProducedUnit || !mProducedUnit->exists()); mProducedUnit = unit; if(mProducedUnit->exists()) { freeResources(); freeLocation(); } } else assert(false); }
/* * free_blk - remove a block header and free it */ static void free_blk(const void* p) { BlkHdr* bh_prev = 0; BlkHdr* bh; unsigned long h = hash_ptr(p); for (bh = bhTab[h]; bh; bh = bh->next) { if (p == bh->buf) { if (0 == bh_prev) bhTab[h] = bh->next; else bh_prev->next = bh->next; break; } bh_prev = bh; } /* * if bh is NULL p was not allocated here */ assert(0 != bh); assert(bh->location->count > 0); if (--bh->location->count == 0) freeLocation(bh->location); byteCount -= bh->size; --blockCount; SHRED_MEM(bh, sizeof(BlkHdr)); free(bh); }
bool ConstructionTask::preUpdate() { if(mProducedUnit) { if(mProducedUnit->exists()) { freeResources(); freeLocation(); } if(!isStopped() && !isCanceled() && mProducedUnit->isCompleted()) { complete(); return true; } } if(mReservedLocation) { if(hasEnded()) freeLocation(); else if(isPaused() || isStopped()) { freeResources(); mRequiredSatisfyTime = Requirement::maxTime; mRequiredDelayTime = Requirement::maxTime; mReservedLocation->setStartTime(Requirement::maxTime); } } if(!shouldReturnUnit()) updateRequirements(); if(mBuilder && finishedWithBuilder() && (mType.getRace() == BWAPI::Races::Protoss || !mBuilder->isConstructing())) return true; return false; }
/* * update_blk - update block info, rehash if pointers are different, * update location info if needed */ static void update_blk(void* p, void* np, size_t size, const char* file, int line) { BlkHdr* bh; if (p != np) { BlkHdr* bh_prev = 0; unsigned long h = hash_ptr(p); /* * remove the old entry from the hash table */ for (bh = bhTab[h]; bh; bh = bh->next) { if (p == bh->buf) { if (0 == bh_prev) bhTab[h] = bh->next; else bh_prev->next = bh->next; /* * put it back in the hash table at hash(np) */ h = hash_ptr(np); bh->next = bhTab[h]; bhTab[h] = bh; break; } bh_prev = bh; } } else bh = find_blk(p); /* * invalid ptr? */ assert(0 != bh); byteCount -= bh->size; byteCount += size; bh->buf = np; bh->size = size; /* * update location info */ if (bh->location->file != file || bh->location->line != line) { if (--bh->location->count == 0) freeLocation(bh->location); if ((bh->location = findLocation(file, line)) == 0) { if ((bh->location = addLocation(file, line)) == 0) noMemFn(); } assert(0 != bh->location); ++bh->location->count; } }
bool ConstructionTask::morph(Unit unit, BWAPI::UnitType previousType) { if(unit == mBuilder && unit->getType() == mType) { freeLocation(); freeResources(); mProducedUnit = unit; mBuilder = StaticUnits::nullunit; return false; } return true; }
void Parallaction_br::cleanupGame() { freeLocation(true); freeCharacter(); delete _globalFlagsNames; delete _objectsNames; delete _countersNames; _globalFlagsNames = 0; _objectsNames = 0; _countersNames = 0; _numLocations = 0; _globalFlags = 0; memset(_localFlags, 0, sizeof(_localFlags)); memset(_locationNames, 0, sizeof(_locationNames)); memset(_zoneFlags, 0, sizeof(_zoneFlags)); }
Parallaction_ns::~Parallaction_ns() { freeFonts(); // TODO: we may want to add a ~Character instead freeCharacter(); _char._ani.reset(); destroyInventory(); delete _locationParser; delete _programParser; freeLocation(true); _location._animations.remove(_char._ani); delete _walker; destroyTestResultLabels(); }
void Parallaction_br::changeLocation() { if (_newLocationName.empty()) { return; } if (_nextPart != -1) { cleanupGame(); // more cleanup needed for part changes (see also saveload) _globalFlags = 0; cleanInventory(true); strcpy(_characterName1, "null"); _part = _nextPart; if (getFeatures() & GF_DEMO) { assert(_part == 1); } else { assert(_part >= 0 && _part <= 4); } _disk->selectArchive(_partNames[_part]); memset(_counters, 0, ARRAYSIZE(_counters)); _globalFlagsNames = _disk->loadTable("global"); _objectsNames = _disk->loadTable("objects"); _countersNames = _disk->loadTable("counters"); // TODO: maybe handle this into Disk delete _objects; if (getPlatform() == Common::kPlatformPC) { _objects = _disk->loadObjects("icone.ico"); } else { _objects = _disk->loadObjects("icons.ico", _part); } parseLocation("common.slf"); } freeLocation(false); // load new location strcpy(_location._name, _newLocationName.c_str()); parseLocation(_location._name); if (_location._startPosition.x != -1000) { _char._ani->setFoot(_location._startPosition); _char._ani->setF(_location._startFrame); } // re-link the follower animation setFollower(_followerName); if (_follower) { Common::Point p = _location._followerStartPosition; if (p.x == -1000) { _char._ani->getFoot(p); } _follower->setFoot(p); _follower->setF(_location._followerStartFrame); } _location._startPosition.x = -1000; _location._startPosition.y = -1000; _location._followerStartPosition.x = -1000; _location._followerStartPosition.y = -1000; _gfx->setScrollPosX(0); _gfx->setScrollPosY(0); if (_char._ani->gfxobj) { Common::Point foot; _char._ani->getFoot(foot); if (foot.x > 550) _gfx->setScrollPosX(320); if (foot.y > 350) _gfx->setScrollPosY(foot.y - 350); } // kFlagsRemove is cleared because the character is visible by default. // Commands can hide the character, anyway. _char._ani->_flags &= ~kFlagsRemove; _cmdExec->run(_location._commands); doLocationEnterTransition(); _cmdExec->run(_location._aCommands); // NOTE: music should not started here! // TODO: implement the music commands which control music execution _soundMan->execute(SC_PLAYMUSIC); _engineFlags &= ~kEngineChangeLocation; _newLocationName.clear(); _nextPart = -1; }
// changeLocation handles transitions between locations, and is able to display slides // between one and the other. // void Parallaction_ns::changeLocation() { if (_newLocationName.empty()) { return; } char location[200]; strcpy(location, _newLocationName.c_str()); strcpy(_location._name, _newLocationName.c_str()); debugC(1, kDebugExec, "changeLocation(%s)", location); MouseTriState oldMouseState = _input->getMouseState(); _input->setMouseState(MOUSE_DISABLED); if (!_intro) { // prevent music changes during the introduction _soundManI->playLocationMusic(location); } _input->stopHovering(); // this is still needed to remove the floatingLabel _gfx->freeLabels(); _zoneTrap.reset(); _input->setArrowCursor(); _gfx->showGfxObj(_char._ani->gfxobj, false); LocationName locname; locname.bind(location); freeLocation(false); if (locname.hasSlide()) { showSlide(locname.slide()); GfxObj *label = _gfx->createLabel(_menuFont, _location._slideText[0].c_str(), 1); _gfx->showLabel(label, CENTER_LABEL_HORIZONTAL, 14); _gfx->updateScreen(); _input->waitForButtonEvent(kMouseLeftUp); _gfx->unregisterLabel(label); delete label; } if (locname.hasCharacter()) { changeCharacter(locname.character()); } strcpy(g_saveData1, locname.location()); parseLocation(g_saveData1); if (_location._startPosition.x != -1000) { _char._ani->setX(_location._startPosition.x); _char._ani->setY(_location._startPosition.y); _char._ani->setF(_location._startFrame); _location._startPosition.y = -1000; _location._startPosition.x = -1000; } _gfx->setBlackPalette(); _gfx->updateScreen(); // BUG #1837503: kEngineChangeLocation flag must be cleared *before* commands // and acommands are executed, so that it can be set again if needed. g_engineFlags &= ~kEngineChangeLocation; _cmdExec->run(_location._commands); doLocationEnterTransition(); _cmdExec->run(_location._aCommands); if (_location._hasSound) _soundManI->playSfx(_location._soundFile, 0, true); if (!_intro) { _input->setMouseState(oldMouseState); // WORKAROUND: Fix a script bug in the Multilingual DOS version of // Nippon Safes: the mouse cursor is incorrectly hidden outside the // cave at the end of the game. Fix it here. if (!strcmp(_location._name, "ingressocav")) _input->setMouseState(MOUSE_ENABLED_SHOW); } debugC(1, kDebugExec, "changeLocation() done"); _newLocationName.clear(); }
/* * fda_malloc - allocate size chunk of memory and create debug * records for it. */ void* fda_malloc(size_t size, const char* file, int line) { void* p; size_t blk_size; Location* location; assert(0 < size); assert(0 != file); assert(sizeof(void*) == sizeof(size_t)); /* * memory limiter do not allocate more than byteLimit */ if ((size + byteCount) > byteLimit) return 0; /* * Make sure that there is enough room for prefix/postfix * and we get an aligned buffer */ blk_size = BASE_SIZE(size); if ((p = malloc(blk_size)) == 0) { lowMemFn(); if ((p = malloc(blk_size)) == 0) noMemFn(); } /* * don't allow malloc to fail */ assert(0 != p); /* * shred the memory and set bounds markers */ SHRED_MEM(p, blk_size); *((size_t*) p) = DEADBEEF; *((size_t*) (BYTE_PTR(p) + blk_size - S_SIZE)) = DEADBEEF; /* * find the location or create a new one */ if (0 == (location = findLocation(file, line))) { if (0 == (location = addLocation(file, line))) { free(p); noMemFn(); } } /* * don't allow noMemFn to return */ assert(0 != location); if (!make_blk(BYTE_PTR(p) + S_SIZE, size, location)) { if (0 == location->count) freeLocation(location); free(p); p = 0; noMemFn(); } /* * don't allow noMemFn to return */ assert(0 != p); return (BYTE_PTR(p) + S_SIZE); }