From: Martin F. <mar...@us...> - 2007-11-17 23:33:31
|
Update of /cvsroot/arianne/stendhal/src/games/stendhal/server/entity/npc/fsm In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv25006/src/games/stendhal/server/entity/npc/fsm Modified Files: MatchType.java Transition.java Engine.java Log Message: fix for bug report 1833612: NPC's are unwilling to say "bye" Now it is possible to issue some additional text after the "bye" phrase, for example "bye Margaret" or "buy bye", the NPC will recognise it as last resort if nothing else, (that is no exact or similar match with correct state and no exact match for state transitions of type "ANY") matches. Index: MatchType.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/server/entity/npc/fsm/MatchType.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** MatchType.java 5 Nov 2007 23:20:51 -0000 1.4 --- MatchType.java 17 Nov 2007 23:33:24 -0000 1.5 *************** *** 6,16 **** public enum MatchType { - /** a transition that can happen from any state */ - ABSOLUTE_JUMP, - /** a transition whose expected input matches exactly to the actual input */ EXACT_MATCH, /** a transition whose expected input is very similar to the actual input */ ! SIMILAR_MATCH; } --- 6,20 ---- public enum MatchType { /** a transition whose expected input matches exactly to the actual input */ EXACT_MATCH, /** a transition whose expected input is very similar to the actual input */ ! SIMILAR_MATCH, ! ! /** a transition that can happen from any state with exact text match */ ! ABSOLUTE_JUMP, ! ! /** a transition that can happen from any state with similar text match */ ! SIMILAR_JUMP ! } Index: Transition.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/server/entity/npc/fsm/Transition.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Transition.java 15 Aug 2007 11:35:11 -0000 1.7 --- Transition.java 17 Nov 2007 23:33:25 -0000 1.8 *************** *** 63,71 **** * text has been said */ ! public boolean isAbsoluteJump(String text) { return (state == ConversationStates.ANY) && trigger.equalsIgnoreCase(text); } /** * checks whether this transition is possible now. * --- 63,83 ---- * text has been said */ ! public boolean matchesWild(String text) { return (state == ConversationStates.ANY) && trigger.equalsIgnoreCase(text); } /** + * Checks whether this is a "wildcard" transition (see class comment + * of SpeakerNPC) and the text beginning matches the trigger. + * + * @param text trigger (possibly with additional text) + * @return if the transition matches, false otherwise + */ + public boolean matchesWildBeginning(String text) { + String temp = text.toLowerCase(); + return (state == ConversationStates.ANY) && temp.startsWith(trigger); + } + + /** * checks whether this transition is possible now. * Index: Engine.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/server/entity/npc/fsm/Engine.java,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** Engine.java 17 Nov 2007 11:00:40 -0000 1.24 --- Engine.java 17 Nov 2007 23:33:25 -0000 1.25 *************** *** 141,150 **** */ public boolean step(Player player, String text) { ! if (matchTransition(MatchType.ABSOLUTE_JUMP, player, text)) { ! return true; ! } else if (matchTransition(MatchType.EXACT_MATCH, player, text)) { return true; } else if (matchTransition(MatchType.SIMILAR_MATCH, player, text)) { return true; } else { // Couldn't match the text with the current FSM state --- 141,152 ---- */ public boolean step(Player player, String text) { ! if (matchTransition(MatchType.EXACT_MATCH, player, text)) { return true; } else if (matchTransition(MatchType.SIMILAR_MATCH, player, text)) { return true; + } else if (matchTransition(MatchType.ABSOLUTE_JUMP, player, text)) { + return true; + } else if (matchTransition(MatchType.SIMILAR_JUMP, player, text)) { + return true; } else { // Couldn't match the text with the current FSM state *************** *** 174,177 **** --- 176,180 ---- List<Transition> listCondition = new LinkedList<Transition>(); List<Transition> listConditionLess = new LinkedList<Transition>(); + int i; // First we try to match with stateless transitions. *************** *** 189,205 **** if (listCondition.size() > 0) { ! if (listCondition.size() > 1) logger.warn("Chosing random action because of "+listCondition.size()+" entries in listCondition: " + listCondition); - int i = Rand.rand(listCondition.size()); executeTransition(player, text, listCondition.get(i)); return true; } if (listConditionLess.size() > 0) { ! if (listConditionLess.size() > 1) logger.warn("Chosing random action because of "+listConditionLess.size()+" entries in listConditionLess: " + listConditionLess); - int i = Rand.rand(listConditionLess.size()); executeTransition(player, text, listConditionLess.get(i)); return true; --- 192,215 ---- if (listCondition.size() > 0) { ! if (listCondition.size() > 1) { logger.warn("Chosing random action because of "+listCondition.size()+" entries in listCondition: " + listCondition); + i = Rand.rand(listCondition.size()); + } else { + i = 0; + } executeTransition(player, text, listCondition.get(i)); return true; } + // Then look for transitions without conditions. if (listConditionLess.size() > 0) { ! if (listConditionLess.size() > 1) { logger.warn("Chosing random action because of "+listConditionLess.size()+" entries in listConditionLess: " + listConditionLess); + i = Rand.rand(listConditionLess.size()); + } else { + i = 0; + } executeTransition(player, text, listConditionLess.get(i)); return true; *************** *** 210,229 **** private boolean matchesTransition(MatchType type, String text, Transition transition) { ! return isAbsoluteMatch(type, text, transition) ! || isExactMatch(type, text, transition) ! || isSimilarMatch(type, text, transition); ! } ! ! private boolean isSimilarMatch(MatchType type, String text, Transition transition) { ! return ((type == MatchType.SIMILAR_MATCH) && transition.matchesBeginning(currentState, text)); ! } ! ! private boolean isExactMatch(MatchType type, String text, Transition transition) { ! return ((type == MatchType.EXACT_MATCH) && transition.matches(currentState, text)); ! } ! ! private boolean isAbsoluteMatch(MatchType type, String text, Transition transition) { ! return ((type == MatchType.ABSOLUTE_JUMP) && (currentState != ConversationStates.IDLE) && transition ! .isAbsoluteJump(text)); } --- 220,234 ---- private boolean matchesTransition(MatchType type, String text, Transition transition) { ! if (type == MatchType.EXACT_MATCH) { ! return transition.matches(currentState, text); ! } else if (type == MatchType.SIMILAR_MATCH) { ! return transition.matchesBeginning(currentState, text); ! } else if (type == MatchType.ABSOLUTE_JUMP) { ! return (currentState != ConversationStates.IDLE) && transition.matchesWild(text); ! } else if (type == MatchType.SIMILAR_JUMP) { ! return (currentState != ConversationStates.IDLE) && transition.matchesWildBeginning(text); ! } else { ! return false; ! } } |