/// <summary> /// Returns true if the current State is a Goal State. /// </summary> public override bool isAGoalState (ref DefaultState currentStates, ref DefaultState idealGoalState) { bool finished = true; List<Transition> endTransitions = manager.endTransitions; foreach (Transition trans in endTransitions) { Transition tran = new Transition(trans.eventSig, trans.parameterIDs); finished = tran.populate(currentStates.worldstate); if(!finished) return false; } long cS, gS, cSR, gSR; int nrRelevantPrototypes = relevanceMasks.Length; for(int i = 0; i<nrRelevantPrototypes;i++) { if (relevanceMasks[i].stateRelevant) { cS = (currentStates.worldstate.GetPrototypeById(relevanceMasks[i].id)).State.GetStateBits() & relevanceMasks[i].stateMask; gS = (idealGoalState.worldstate.GetPrototypeById(relevanceMasks[i].id)).State.GetStateBits() & relevanceMasks[i].stateMask; finished = finished && (countSetBits(cS ^ gS)==0); if(!finished) return false; } if(relevanceMasks[i].relationsRelevant) { for(uint j=0; j<noStatesInGS; j++) { cSR = currentStates.worldstate.GetPrototypeById(relevanceMasks[i].id).State.GetRelationBits(j) & relevanceMasks[i].GetRelationBits(j); gSR = idealGoalState.worldstate.GetPrototypeById(relevanceMasks[i].id).State.GetRelationBits(j)& relevanceMasks[i].GetRelationBits(j); finished = finished && (countSetBits(cSR ^ gSR)==0); if(!finished) return false; } } } return finished; }
/// <summary> /// Simulate the state of the StateSpaceManager up to a certain Beat (specified by level) /// </summary> public void SimulateUpTo(StateSpaceManager stateSpaceManager, int startLevel, StoryArc story) { stateSpaceManager.resetGlobalState (); for(int i=0; i< startLevel; i++) { foreach(StoryEvent ev in story.Beats[i].Events) { Rules.ClearCache(); Transition implicitPopulated = new Transition(ev); implicitPopulated.populate(stateSpaceManager.globalState.worldstate); stateSpaceManager.changeStateToPostconditionsOf(implicitPopulated); } } }