package net.sourceforge.pain.logic.fn;
import net.sourceforge.pain.data.type.*;
public final class SpaceFindFn {
private SpaceFindFn() {
}
public static Interactive findByPrefix(Located actor, String namePrefix) {
if (namePrefix == null || namePrefix.length() == 0) {
return null;
}
String prefix = namePrefix.toLowerCase();
if (namePrefix.equals("self")) {
Interactive interactive = (Interactive) actor.getRole(Interactive.class);
if (interactive != null) {
return interactive;
}
// else we will look for this obj;
}
String mostSimilarName = null;
Interactive result = null;
for (Located obj = actor.getLocation().getFirstInSpace(); obj != null; obj = obj.getNextInSpace()) { // backstep lists are chained
Interactive interactive = (Interactive) obj.getRole(Interactive.class);
if (interactive == null) {
continue;
}
String[] inames = interactive.getTargetList();
for (int i = 0; i < inames.length; i++) {
String iname = inames[i];
if (iname.startsWith(prefix)) {
if (iname.length() == prefix.length()) {
return interactive; // found exact
}
if (mostSimilarName == null) {
mostSimilarName = iname;
result = interactive;
continue;
} else {
if (isCloserTo(prefix, iname, mostSimilarName)) {
mostSimilarName = iname;
result = interactive;
}
}
}
}
}
return result;
}
/** starts check starting from target.length() character
* @return IF name IS CLOSER TO target THAN thanName
* */
public static boolean isCloserTo(String target, String name, String thenName) {
for (int i = target.length(); true; i++) {
if (name.length() == i) {
return true;
}
if (thenName.length() == i) {
return false;
}
char nc = name.charAt(i);
char tnc = thenName.charAt(i);
if (nc != tnc) {
return nc < tnc;
}
}
}
}