void House::setHouseOwner(uint32_t guid) { if(isLoaded && houseOwner == guid) return; isLoaded = true; if(houseOwner){ cleanHouse(); //clean access lists houseOwner = 0; setAccessList(SUBOWNER_LIST, ""); setAccessList(GUEST_LIST, ""); for(HouseDoorList::iterator it = doorList.begin(); it != doorList.end(); ++it){ (*it)->setAccessList(""); } //reset paid date paidUntil = 0; rentWarnings = 0; } std::string name; if(guid != 0 && IOPlayer::instance()->getNameByGuid(guid, name)){ houseOwner = guid; houseOwnerName = name; } updateDoorDescription(); setLastWarning(std::time(NULL)); //So the new owner has one day before he start the payment }
/* Do any work that should be done before attempting to solve: * * Sort clauses. * Check for empty clause. */ int startSolving() { sortClausesByLength(0,numClauses-1); if(!cleanHouse()) { //clean house got down to an unsat condition return 0; } currentGuess=0; int returnValue=solve(); while(returnValue==0) { returnValue=solve(); } return returnValue; //SAT }
/* Main solving function - iterative. * * This needs to be converted into a variable eliminator with the ability to solve. It needs to focus on a single variable to * attempt to solve with, and if it cannot, that variable should be cleaned and cleanHouse should be ran after. If a * solution is found using that variable, just return 1 as it has to be SAT. */ int solve() { if(clauses[0]->length < 2) { //error: cleanHouse didn't properly run return -1; } int toElim = 0; for(int k = 0; k < numVariables; k++) { if(clauses[0]->variables[k]!=0) { toElim = clauses[0]->variables[k]; //Check tried list to see if this variable has been tried yet if(toElim>0) { //Check if already tried true if(guesses[currentGuess].triedTrue[toElim-1]) { //Check if already tried false if(guesses[currentGuess].triedFalse[toElim-1]) { //if both have been tried we need to go back guesses[currentGuess].triedFalse[abs(guesses[currentGuess].variable)-1]=0; guesses[currentGuess].triedTrue[abs(guesses[currentGuess].variable)-1]=0; currentGuess--; if (DEBUG) printf("%s%d\n", "UNDOING GUESS: ", guesses[currentGuess].variable); if(currentGuess<0) { return -1; } goBack(currentGuess); return 0; } //negate variable toElim=toElim*-1; } } else { int positiveToElim=abs(toElim); //Check if already tried false if(guesses[currentGuess].triedFalse[positiveToElim-1]) { //Check if already tried true if(guesses[currentGuess].triedTrue[positiveToElim-1]) { //if both have been tried we need to go back currentGuess--; if (DEBUG) printf("%s%d\n", "UNDOING GUESS: ", guesses[currentGuess].variable); if(currentGuess<0) { return -1; } goBack(currentGuess); return 0; } //negate variable toElim=positiveToElim; } } break; } } if (DEBUG) printf("%s%d\n", "guessing variable: ",toElim); if(toElim == 0) { //error: no variables found return -1; } else { guesses[currentGuess].variable = toElim; guesses[currentGuess].addCount=0; guesses[currentGuess].cleanUpCount=0; guesses[currentGuess].unsatCount=0; for(int z=0; z<numClauses; z++) { guesses[currentGuess].cleanUps[z].addCount=0; guesses[currentGuess].cleanUps[z].unsatCount=0; guesses[currentGuess].cleanUps[z].cleanUpCount=0; guesses[currentGuess].cleanUps[z].variable=0; } } for(int i = 0; i < numClauses; i++) { if(clauses[i]->isSat) { //End of list break; } if(clauses[i]->variables[abs(toElim)-1]==0 ) { continue; } else if(clauses[i]->variables[abs(toElim)-1]==toElim) { clauses[i]->isSat=1; clauses[i]->length=numVariables+1; guesses[currentGuess].clausesToUnsat[guesses[currentGuess].unsatCount]=clauses[i]; guesses[currentGuess].unsatCount++; } else { clauses[i]->variables[abs(toElim)-1]=0; clauses[i]->length--; guesses[currentGuess].clausesToAddVar[guesses[currentGuess].addCount]=clauses[i]; guesses[currentGuess].addCount++; } } if (DEBUG) printf("%s%d%s%d\n", "Sat clauses:",guesses[currentGuess].unsatCount," var removed clauses:",guesses[currentGuess].addCount); if(guesses[currentGuess].variable>0) { guesses[currentGuess].triedTrue[toElim-1]=toElim; } else { guesses[currentGuess].triedFalse[abs(toElim)-1]=toElim; } //If the variable we are trying doesn't satisfy anything then go back if(!guesses[currentGuess].unsatCount) { goBack(currentGuess); return 0; } sortClausesByLength(0,numClauses-1); if(!cleanHouse()) { if (DEBUG) printf("%s\n", "Current guess is unsat. Going back."); goBack(currentGuess); return 0; } else { //check if sat if(clauses[0]->isSat) return 1; currentGuess++; guesses[currentGuess].addCount=0; guesses[currentGuess].cleanUpCount=0; guesses[currentGuess].unsatCount=0; for(int z=0; z<numClauses; z++) { guesses[currentGuess].cleanUps[z].addCount=0; guesses[currentGuess].cleanUps[z].cleanUpCount=0; guesses[currentGuess].cleanUps[z].variable=0; } for(int x=0; x<numVariables; x++) { guesses[currentGuess].triedTrue[x]=0; guesses[currentGuess].triedFalse[x]=0; } } return 0; }