4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sfjp.jindolf.data;
10 import java.util.Collections;
11 import java.util.HashMap;
12 import java.util.LinkedList;
13 import java.util.List;
15 import jp.sfjp.jindolf.view.AvatarPics;
16 import jp.sourceforge.jindolf.corelib.LandDef;
17 import jp.sourceforge.jindolf.corelib.VillageState;
24 private static final int GID_MIN = 3;
27 private final Land parentLand;
28 private final String villageID;
29 private final int villageIDNum;
30 private final String villageName;
32 private final boolean isValid;
34 private int limitMonth;
36 private int limitHour;
37 private int limitMinute;
39 private VillageState state = VillageState.UNKNOWN;
41 private final LinkedList<Period> periodList = new LinkedList<>();
42 private final List<Period> unmodList =
43 Collections.unmodifiableList(this.periodList);
45 private final Map<String, Avatar> avatarMap =
48 private final AvatarPics avatarPics;
50 private boolean isLocalArchive = false;
56 * @param parentLand Villageの所属する国
57 * @param villageID 村のID
58 * @param villageName 村の名前
60 public Village(Land parentLand, String villageID, String villageName) {
61 this.parentLand = parentLand;
62 this.villageID = villageID.intern();
63 this.villageIDNum = Integer.parseInt(this.villageID);
64 this.villageName = villageName.intern();
66 this.isValid = this.parentLand.getLandDef()
67 .isValidVillageId(this.villageIDNum);
69 this.avatarPics = new AvatarPics(this.parentLand);
78 * @return 村の所属する国(Land)
80 public Land getParentLand(){
81 return this.parentLand;
89 public String getVillageID(){
90 return this.villageID;
98 public int getVillageIDNum(){
99 return this.villageIDNum;
107 public String getVillageName(){
108 StringBuilder name = new StringBuilder();
110 LandDef landDef = this.parentLand.getLandDef();
111 String prefix = landDef.getLandPrefix();
114 StringBuilder id = new StringBuilder(this.villageID);
115 if(landDef.getLandId().equals("wolfg")){
116 while(id.length() < GID_MIN){
122 String result = name.toString();
131 public String getVillageFullName(){
132 return this.villageName;
140 public VillageState getState(){
149 public void setState(VillageState state){
155 * 日程及び更新時刻を持っているか判定する。
157 * @return 日程が不明ならtrue
159 public boolean hasSchedule(){
160 boolean result = ! this.periodList.isEmpty();
169 public Period getPrologue(){
170 for(Period period : this.periodList){
171 if(period.isPrologue()) return period;
181 public Period getEpilogue(){
182 for(Period period : this.periodList){
183 if(period.isEpilogue()) return period;
194 public Period getProgress(int day){
195 for(Period period : this.periodList){
196 if( period.isProgress()
197 && period.getDay() == day ) return period;
203 * PROGRESS状態のPeriodの総数を返す。
205 * @return PROGRESS状態のPeriod総数
207 public int getProgressDays(){
209 for(Period period : this.periodList){
210 if(period.isProgress()) result++;
216 * 指定されたPeriodインデックスのPeriodを返す。
218 * <p>プロローグやエピローグへのアクセスも可能。
220 * @param day Periodインデックス
223 public Period getPeriod(int day){
224 return this.periodList.get(day);
228 * 指定されたアンカーの対象のPeriodを返す。
233 public Period getPeriod(Anchor anchor){
236 if(anchor.isEpilogueDay()){
237 anchorPeriod = getEpilogue();
241 int anchorDay = anchor.getDay();
242 anchorPeriod = getPeriod(anchorDay);
252 public int getPeriodSize(){
253 return this.periodList.size();
259 * @return Periodのリスト。
261 public List<Period> getPeriodList(){
262 return this.unmodList;
266 * 指定したフルネームで村に登録されているAvatarを返す。
268 * @param fullName Avatarの名前
271 public Avatar getAvatar(String fullName){
272 Avatar avatar = this.avatarMap.get(fullName);
279 * @param avatar Avatar
281 public void addAvatar(Avatar avatar){
282 if(avatar == null) return;
284 String fullName = avatar.getFullName();
285 if(this.avatarMap.get(fullName) != null) return;
287 this.avatarMap.put(fullName, avatar);
296 public AvatarPics getAvatarPics(){
297 return this.avatarPics;
301 * 村にアクセスするためのCGIクエリーを返す。
305 public String getCGIQuery(){
306 StringBuilder result = new StringBuilder();
307 result.append("?vid=").append(getVillageID());
308 return result.toString();
319 public void setLimit(int month, int day, int hour, int minute){
320 this.limitMonth = month;
322 this.limitHour = hour;
323 this.limitMinute = minute;
332 public int getLimitMonth(){
333 return this.limitMonth;
341 public int getLimitDay(){
342 return this.limitDay;
350 public int getLimitHour(){
351 return this.limitHour;
359 public int getLimitMinute(){
360 return this.limitMinute;
366 * @return 無効な村ならfalse
368 public boolean isValid(){
373 * Periodリストの指定したインデックスにPeriodを上書きする。
375 * <p>リストのサイズと同じインデックスを指定する事が許される。
376 * その場合の動作はList.addと同じ。
378 * @param index Periodリストのインデックス。
379 * @param period 上書きするPeriod
380 * @throws java.lang.IndexOutOfBoundsException インデックスの指定がおかしい
382 public void setPeriod(int index, Period period)
383 throws IndexOutOfBoundsException{
384 int listSize = this.periodList.size();
385 if(index == listSize){
386 this.periodList.add(period);
387 }else if(index < listSize){
388 this.periodList.set(index, period);
390 throw new IndexOutOfBoundsException();
396 * アンカーに一致する会話(Talk)のリストを取得する。
401 public List<Talk> getTalkListFromAnchor(Anchor anchor){
402 List<Talk> result = new LinkedList<>();
405 if(anchor.hasTalkNo()){
406 // 事前に全Periodの全会話がロードされているのが前提
407 for(Period period : this.periodList){
408 Talk talk = period.getNumberedTalk(anchor.getTalkNo());
409 if(talk == null) continue;
415 Period anchorPeriod = getPeriod(anchor);
416 if(anchorPeriod == null) return result;
418 // 事前にアンカー対象Periodの全会話がロードされているのが前提
420 for(Topic topic : anchorPeriod.getTopicList()){
421 if( ! (topic instanceof Talk) ) continue;
422 Talk talk = (Talk) topic;
423 if(talk.getHour() != anchor.getHour() ) continue;
424 if(talk.getMinute() != anchor.getMinute()) continue;
431 * 全Periodの発言データをアンロードする。
433 public void unloadPeriods(){
434 for(Period period : this.periodList){
441 * この村がローカルなアーカイブに由来するものであるか判定する。
443 * @return ローカルなアーカイブによる村であればtrue
445 public boolean isLocalArchive(){
446 return this.isLocalArchive;
450 * この村がローカルなアーカイブに由来するものであるか設定する。
452 * @param flag ローカルなアーカイブによる村であればtrue
454 public void setLocalArchive(boolean flag){
455 this.isLocalArchive = flag;
468 public String toString(){
469 return getVillageFullName();