package jp.sfjp.jindolf.data;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.RandomAccess;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
import jp.sourceforge.jindolf.corelib.PreDefAvatar;
/**
* Avatar またの名をキャラクター。
+ *
+ * <p>ゲルトもAvatarである。
+ * 墓石は「Avatarの状態」であってAvatarそのものではない。
+ *
+ * <p>プロローグが終わり参加プレイヤーが固定されるまでの間、
+ * 複数のプレイヤーが同一Avatarを担当しうる。
+ *
+ * <p>Avatar同士は通し番号により一意に順序づけられる。
+ *
+ * <p>設計メモ: 未知のAvatar出現に備え、
+ * {@link PreDefAvatar}と分離したクラスとして設計された。
+ *
+ * <p>2020-03現在、既知のAvatarは最大20種類で固定。
+ * Z国含め未知のAvatarが追加されるケースは今後考慮しない。
*/
public class Avatar implements Comparable<Avatar> {
public static final Avatar AVATAR_GERD;
private static final List<Avatar> AVATAR_LIST;
- private static final Map<String, Avatar> AVATAR_MAP;
+ private static final Map<String, Avatar> AVATAR_FN_MAP;
+ private static final Map<String, Avatar> AVATAR_ID_MAP;
private static final Pattern AVATAR_PATTERN;
List<PreDefAvatar> predefs = CoreData.getPreDefAvatarList();
AVATAR_LIST = buildAvatarList(predefs);
- AVATAR_MAP = new HashMap<>();
- AVATAR_LIST.forEach((avatar) -> {
+ AVATAR_FN_MAP = new HashMap<>();
+ AVATAR_ID_MAP = new HashMap<>();
+ AVATAR_LIST.forEach(avatar -> {
String fullName = avatar.getFullName();
- AVATAR_MAP.put(fullName, avatar);
+ String avatarId = avatar.getIdentifier();
+ AVATAR_FN_MAP.put(fullName, avatar);
+ AVATAR_ID_MAP.put(avatarId, avatar);
});
StringBuilder avatarGroupRegex = new StringBuilder();
});
AVATAR_PATTERN = Pattern.compile(avatarGroupRegex.toString());
- AVATAR_GERD = getPredefinedAvatar("楽天家 ゲルト");
+ AVATAR_GERD = getAvatarByFullname("楽天家 ゲルト");
assert AVATAR_LIST instanceof RandomAccess;
assert AVATAR_GERD != null;
/**
- * Avatarを生成する。
+ * constructor.
+ *
* @param name 名前
* @param jobTitle 職業名
* @param idNum 通し番号
* @param identifier 識別文字列
*/
private Avatar(String name,
- String jobTitle,
- int idNum,
- String identifier ){
+ String jobTitle,
+ int idNum,
+ String identifier ){
this.name = name.intern();
this.jobTitle = jobTitle.intern();
this.idNum = idNum;
}
/**
- * Avatarを生成する。
+ * constructor.
+ *
* @param fullName フルネーム
*/
// TODO 当面は呼ばれないはず。Z国とか向け。
/**
- * 定義済みAvatar群の生成。
+ * 定義済みAvatarのAvatarリストを生成する。
+ *
* @param predefs 定義済みAvatar元データ群
* @return ソートされた定義済みAvatarのリスト
*/
private static List<Avatar> buildAvatarList(List<PreDefAvatar> predefs){
- List<Avatar> result = new ArrayList<>(predefs.size());
-
- for(PreDefAvatar preDefAvatar : predefs){
- String shortName = preDefAvatar.getShortName();
- String jobTitle = preDefAvatar.getJobTitle();
- int serialNo = preDefAvatar.getSerialNo();
- String avatarId = preDefAvatar.getAvatarId();
- Avatar avatar = new Avatar(shortName,
- jobTitle,
- serialNo,
- avatarId );
- result.add(avatar);
- }
+ List<Avatar> result;
+
+ result = predefs.stream()
+ .map(preDefAvatar -> toAvatar(preDefAvatar))
+ .sorted()
+ .collect(Collectors.toList());
- Collections.sort(result);
result = Collections.unmodifiableList(result);
return result;
}
/**
+ * 定義済みAvatarからAvatarへの変換を行う。
+ *
+ * @param pre 定義済みAvatar
+ * @return Avatar
+ */
+ private static Avatar toAvatar(PreDefAvatar pre){
+ String shortName = pre.getShortName();
+ String jobTitle = pre.getJobTitle();
+ int serialNo = pre.getSerialNo();
+ String avatarId = pre.getAvatarId();
+ Avatar result = new Avatar(shortName, jobTitle, serialNo, avatarId);
+ return result;
+ }
+
+ /**
* 定義済みAvatar群のリストを返す。
+ *
* @return Avatarのリスト
*/
public static List<Avatar> getPredefinedAvatarList(){
}
/**
- * 定義済みAvatarを返す。
- * @param fullName Avatarのフルネーム
+ * フルネームに合致するAvatarを返す。
+ *
+ * @param fullNameArg Avatarのフルネーム
* @return Avatar。フルネームが一致するAvatarが無ければnull
*/
// TODO 20キャラ程度ならListをなめる方が早いか?
- public static Avatar getPredefinedAvatar(String fullName){
- return AVATAR_MAP.get(fullName);
+ public static Avatar getAvatarByFullname(String fullNameArg){
+ return AVATAR_FN_MAP.get(fullNameArg);
}
/**
- * 定義済みAvatarを返す。
- * @param fullName Avatarのフルネーム
+ * フルネームに合致するAvatarを返す。
+ *
+ * @param fullNameArg Avatarのフルネーム
* @return Avatar。フルネームが一致するAvatarが無ければnull
*/
- public static Avatar getPredefinedAvatar(CharSequence fullName){
+ public static Avatar getAvatarByFullname(CharSequence fullNameArg){
for(Avatar avatar : AVATAR_LIST){
String avatarName = avatar.getFullName();
- if(avatarName.contentEquals(fullName)){
+ if(avatarName.contentEquals(fullNameArg)){
return avatar;
}
}
}
/**
+ * IDに合致するAvatarを返す。
+ *
+ * @param avatarId AvatarのID
+ * @return Avatar。IDが一致するAvatarが無ければnull
+ */
+ // TODO 20キャラ程度ならListをなめる方が早いか?
+ public static Avatar getAvatarById(String avatarId){
+ return AVATAR_ID_MAP.get(avatarId);
+ }
+
+ /**
* 定義済みAvatar名に一致しないか調べる。
+ *
* @param matcher マッチャ
* @return 一致したAvatar。一致しなければnull。
*/
/**
* フルネームを取得する。
+ *
* @return フルネーム
*/
public String getFullName(){
/**
* 職業名を取得する。
+ *
* @return 職業名
*/
public String getJobTitle(){
/**
* 通常名を取得する。
+ *
* @return 通常名
*/
public String getName(){
/**
* 通し番号を返す。
+ *
* @return 通し番号
*/
public int getIdNum(){
/**
* 識別文字列を返す。
+ *
* @return 識別文字列
*/
public String getIdentifier(){
/**
* {@inheritDoc}
+ *
* @param obj {@inheritDoc}
* @return {@inheritDoc}
*/
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* 通し番号順に順序づける。
* @param avatar {@inheritDoc}
* @return {@inheritDoc}
}
/**
- * Test of getPredefinedAvatar method, of class Avatar.
+ * Test of getAvatarByFullname method, of class Avatar.
*/
@Test
- public void testGetPredefinedAvatar(){
+ public void testGetAvatarByFullname(){
System.out.println("getPredefinedAvatar");
Avatar result;
- result = Avatar.getPredefinedAvatar("農夫 ヤコブ");
+ result = Avatar.getAvatarByFullname("農夫 ヤコブ");
assertNotNull(result);
assertTrue(result.equals(result));
- result = Avatar.getPredefinedAvatar((CharSequence)"農夫 ヤコブ");
+ result = Avatar.getAvatarByFullname((CharSequence)"農夫 ヤコブ");
assertNotNull(result);
assertTrue(result.equals(result));
return;
@Test
public void testGetFullName(){
System.out.println("getFullName");
- Avatar result = Avatar.getPredefinedAvatar("農夫 ヤコブ");
+ Avatar result = Avatar.getAvatarByFullname("農夫 ヤコブ");
assertNotNull(result);
assertEquals("農夫 ヤコブ", result.getFullName());
return;
@Test
public void testGetJobTitle(){
System.out.println("getJobTitle");
- Avatar result = Avatar.getPredefinedAvatar("農夫 ヤコブ");
+ Avatar result = Avatar.getAvatarByFullname("農夫 ヤコブ");
assertNotNull(result);
assertEquals("農夫", result.getJobTitle());
return;
@Test
public void testGetName(){
System.out.println("getName");
- Avatar result = Avatar.getPredefinedAvatar("農夫 ヤコブ");
+ Avatar result = Avatar.getAvatarByFullname("農夫 ヤコブ");
assertNotNull(result);
assertEquals("ヤコブ", result.getName());
return;
@Test
public void testGetIdNum(){
System.out.println("getIdNum");
- Avatar result = Avatar.getPredefinedAvatar("農夫 ヤコブ");
+ Avatar result = Avatar.getAvatarByFullname("農夫 ヤコブ");
assertNotNull(result);
assertEquals(15, result.getIdNum());
return;
@Test
public void testEquals(){
System.out.println("equals");
- Avatar result = Avatar.getPredefinedAvatar("農夫 ヤコブ");
+ Avatar result = Avatar.getAvatarByFullname("農夫 ヤコブ");
assertTrue(result.equals(result));
return;
}
@Test
public void testCompareTo(){
System.out.println("compareTo");
- Avatar avatar1 = Avatar.getPredefinedAvatar("農夫 ヤコブ");
- Avatar avatar2 = Avatar.getPredefinedAvatar("シスター フリーデル");
- Avatar avatar3 = Avatar.getPredefinedAvatar("羊飼い カタリナ");
+ Avatar avatar1 = Avatar.getAvatarByFullname("農夫 ヤコブ");
+ Avatar avatar2 = Avatar.getAvatarByFullname("シスター フリーデル");
+ Avatar avatar3 = Avatar.getAvatarByFullname("羊飼い カタリナ");
assertTrue(avatar1.compareTo(avatar2) < 0);
assertTrue(avatar2.compareTo(avatar3) > 0);
assertTrue(avatar2.compareTo(avatar2) == 0);