package com.planet_ink.coffee_mud.Libraries;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
import com.planet_ink.coffee_mud.core.threads.ServiceEngine;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.DefaultClan;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.util.*;
/**
* <p>Portions Copyright (c) 2003 Jeremy Vyska</p>
* <p>Portions Copyright (c) 2004 Bo Zimmerman</p>
* <p>Licensed under the Apache License, Version 2.0 (the "License");
* <p>you may not use this file except in compliance with the License.
* <p>You may obtain a copy of the License at
*
* <p> http://www.apache.org/licenses/LICENSE-2.0
*
* <p>Unless required by applicable law or agreed to in writing, software
* <p>distributed under the License is distributed on an "AS IS" BASIS,
* <p>WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* <p>See the License for the specific language governing permissions and
* <p>limitations under the License.
*/
public class Clans extends StdLibrary implements ClanManager
{
public Hashtable all=new Hashtable();
public String ID(){return "Clans";}
public void shutdownClans()
{
for(Enumeration e=all.elements();e.hasMoreElements();)
{
Clan C=(Clan)e.nextElement();
CMLib.threads().deleteTick(C,Tickable.TICKID_CLAN);
}
all.clear();
}
public boolean isCommonClanRelations(String id1, String id2, int relation)
{
if((id1.length()==0)||(id2.length()==0)) return relation==Clan.REL_NEUTRAL;
Clan C1=getClan(id1);
Clan C2=getClan(id2);
if((C1==null)||(C2==null)) return relation==Clan.REL_NEUTRAL;
int i1=C1.getClanRelations(id2);
int i2=C2.getClanRelations(id1);
if((i1==i2)
&&((i1==Clan.REL_WAR)
||(i1==Clan.REL_ALLY)))
return i1==relation;
for(Enumeration e=clans();e.hasMoreElements();)
{
Clan C=(Clan)e.nextElement();
if((C!=C1)&&(C!=C2))
{
if((i1!=Clan.REL_WAR)
&&(C1.getClanRelations(C.clanID())==Clan.REL_ALLY)
&&(C.getClanRelations(C2.clanID())==Clan.REL_WAR))
i1=Clan.REL_WAR;
if((i2!=Clan.REL_WAR)
&&(C2.getClanRelations(C.clanID())==Clan.REL_ALLY)
&&(C.getClanRelations(C1.clanID())==Clan.REL_WAR))
i2=Clan.REL_WAR;
}
}
if(i1==i2) return relation==i1;
if(Clan.REL_NEUTRALITYGAUGE[i1]<Clan.REL_NEUTRALITYGAUGE[i2]) return relation==i1;
return relation==i2;
}
public int getClanRelations(String id1, String id2)
{
if((id1.length()==0)||(id2.length()==0)) return Clan.REL_NEUTRAL;
Clan C1=getClan(id1);
Clan C2=getClan(id2);
if((C1==null)||(C2==null)) return Clan.REL_NEUTRAL;
int i1=C1.getClanRelations(id2);
int i2=C2.getClanRelations(id1);
int rel=Clan.RELATIONSHIP_VECTOR[i1][i2];
if(rel==Clan.REL_WAR) return Clan.REL_WAR;
if(rel==Clan.REL_ALLY) return Clan.REL_ALLY;
for(Enumeration e=clans();e.hasMoreElements();)
{
Clan C=(Clan)e.nextElement();
if((C!=C1)
&&(C!=C2)
&&(((C1.getClanRelations(C.clanID())==Clan.REL_ALLY)&&(C.getClanRelations(C2.clanID())==Clan.REL_WAR)))
||((C2.getClanRelations(C.clanID())==Clan.REL_ALLY)&&(C.getClanRelations(C1.clanID())==Clan.REL_WAR)))
return Clan.REL_WAR;
}
return rel;
}
public Clan getClan(String id)
{
if(id.length()==0) return null;
Clan C=(Clan)all.get(id.toUpperCase());
if(C!=null) return C;
for(Enumeration e=all.elements();e.hasMoreElements();)
{
C=(Clan)e.nextElement();
if(CMLib.english().containsString(CMStrings.removeColors(C.name()),id))
return C;
}
return null;
}
public Clan findClan(String id)
{
Clan C=getClan(id);
if(C!=null) return C;
for(Enumeration e=all.elements();e.hasMoreElements();)
{
C=(Clan)e.nextElement();
if(CMLib.english().containsString(CMStrings.removeColors(C.name()),id))
return C;
}
return null;
}
public Clan getClanType(int type)
{
switch(type)
{
case Clan.TYPE_CLAN:
return (Clan)CMClass.getCommon("DefaultClan");
default:
return (Clan)CMClass.getCommon("DefaultClan");
}
}
public int getRoleOrder(int role)
{
for(int i=0;i<Clan.POSORDER.length;i++)
if(Clan.POSORDER[i]==role) return i;
return 1;
}
public String getRoleName(int government, int role, boolean titleCase, boolean plural)
{
StringBuffer roleName=new StringBuffer();
if((government<0)||(government>=Clan.ROL_DESCS.length))
government=0;
String[] roles=Clan.ROL_DESCS[government];
roleName.append(roles[getRoleOrder(role)].toLowerCase());
if(titleCase)
{
String titled=CMStrings.capitalizeAndLower(roleName.toString());
roleName.setLength(0);
roleName.append(titled);
}
if(plural)
{
if(roleName.toString().equalsIgnoreCase("Staff"))
{
// do nothing
}
else
if(new Character(roleName.charAt(roleName.length()-1)).equals(new Character(("y").charAt(0))))
{
roleName.setCharAt(roleName.length()-1,'i');
roleName.append("es");
}
else
if(new Character(roleName.charAt(roleName.length()-1)).equals(new Character(("s").charAt(0))))
{
roleName.append("es");
}
else
{
roleName.append("s");
}
}
return roleName.toString();
}
public Enumeration clans()
{
return all.elements();
}
public int size()
{
return all.size();
}
public void addClan(Clan C)
{
if(!CMSecurity.isDisabled("CLANTICKS"))
CMLib.threads().startTickDown(C,Tickable.TICKID_CLAN,CMProps.getIntVar(CMProps.SYSTEMI_TICKSPERMUDDAY));
all.put(C.clanID().toUpperCase(),C);
}
public void removeClan(Clan C)
{
CMLib.threads().deleteTick(C,Tickable.TICKID_CLAN);
all.remove(C.clanID().toUpperCase());
}
public void tickAllClans()
{
for(Enumeration e=clans();e.hasMoreElements();)
{
Clan C=(Clan)e.nextElement();
C.tick(C,Tickable.TICKID_CLAN);
}
}
public void clanAnnounceAll(String msg)
{
Vector channels=CMLib.channels().getFlaggedChannelNames("CLANINFO");
for(int i=0;i<channels.size();i++)
CMLib.commands().postChannel((String)channels.elementAt(i),"ALL",msg,true);
}
public int numClans(){return all.size();}
public Enumeration allClans(){return ((Hashtable)(all.clone())).elements();}
public String translatePrize(int trophy)
{
String prizeStr="";
switch(trophy)
{
case Clan.TROPHY_AREA: prizeStr=CMProps.getVar(CMProps.SYSTEM_CLANTROPAREA); break;
case Clan.TROPHY_CONTROL: prizeStr=CMProps.getVar(CMProps.SYSTEM_CLANTROPCP); break;
case Clan.TROPHY_EXP: prizeStr=CMProps.getVar(CMProps.SYSTEM_CLANTROPEXP); break;
case Clan.TROPHY_PK: prizeStr=CMProps.getVar(CMProps.SYSTEM_CLANTROPPK); break;
}
if(prizeStr.length()==0) return "None";
if(prizeStr.length()>0)
{
Vector V=CMParms.parse(prizeStr);
if(V.size()>=2)
{
String type=((String)V.lastElement()).toUpperCase();
String amt=(String)V.firstElement();
if("EXPERIENCE".startsWith(type))
return amt+" experience point bonus.";
}
}
return prizeStr;
}
public boolean trophySystemActive()
{
return (CMProps.getVar(CMProps.SYSTEM_CLANTROPAREA).length()>0)
|| (CMProps.getVar(CMProps.SYSTEM_CLANTROPCP).length()>0)
|| (CMProps.getVar(CMProps.SYSTEM_CLANTROPEXP).length()>0)
|| (CMProps.getVar(CMProps.SYSTEM_CLANTROPPK).length()>0);
}
}