// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.resource.are.viewer;
import java.awt.Image;
import java.awt.Point;
import org.infinity.datatype.DecNumber;
import org.infinity.datatype.Flag;
import org.infinity.datatype.IdsBitmap;
import org.infinity.datatype.ResourceRef;
import org.infinity.datatype.StringRef;
import org.infinity.datatype.TextString;
import org.infinity.gui.layeritem.AbstractLayerItem;
import org.infinity.gui.layeritem.IconLayerItem;
import org.infinity.icon.Icons;
import org.infinity.resource.ResourceFactory;
import org.infinity.resource.StructEntry;
import org.infinity.resource.Viewable;
import org.infinity.resource.are.Actor;
import org.infinity.resource.are.AreResource;
import org.infinity.resource.are.viewer.icon.ViewerIcons;
import org.infinity.resource.cre.CreResource;
/**
* Handles specific layer type: ARE/Actor
*/
public class LayerObjectAreActor extends LayerObjectActor
{
private static final Image[] IconGood = {Icons.getImage(ViewerIcons.class, ViewerIcons.ICON_ITM_ARE_ACTOR_G_1),
Icons.getImage(ViewerIcons.class, ViewerIcons.ICON_ITM_ARE_ACTOR_G_2)};
private static final Image[] IconNeutral = {Icons.getImage(ViewerIcons.class, ViewerIcons.ICON_ITM_ARE_ACTOR_B_1),
Icons.getImage(ViewerIcons.class, ViewerIcons.ICON_ITM_ARE_ACTOR_B_2)};
private static final Image[] IconEvil = {Icons.getImage(ViewerIcons.class, ViewerIcons.ICON_ITM_ARE_ACTOR_R_1),
Icons.getImage(ViewerIcons.class, ViewerIcons.ICON_ITM_ARE_ACTOR_R_2)};
private static final Point Center = new Point(12, 40);
private final Actor actor;
private Flag scheduleFlags;
public LayerObjectAreActor(AreResource parent, Actor actor)
{
super(Actor.class, parent);
this.actor = actor;
init();
}
@Override
public void reload()
{
init();
}
@Override
public Viewable getViewable()
{
return actor;
}
@Override
public Viewable[] getViewables()
{
return new Viewable[]{actor};
}
@Override
public boolean isScheduled(int schedule)
{
if (schedule >= ViewerConstants.TIME_0 && schedule <= ViewerConstants.TIME_23) {
return (scheduleFlags.isFlagSet(schedule));
} else {
return false;
}
}
private void init()
{
if (actor != null) {
String msg = "";
Image[] icon = IconNeutral;
int ea = 128; // default: neutral
try {
location.x = ((DecNumber)actor.getAttribute(Actor.ARE_ACTOR_POS_X)).getValue();
location.y = ((DecNumber)actor.getAttribute(Actor.ARE_ACTOR_POS_Y)).getValue();
scheduleFlags = ((Flag)actor.getAttribute(Actor.ARE_ACTOR_PRESENT_AT));
StructEntry obj = actor.getAttribute(Actor.ARE_ACTOR_CHARACTER);
CreResource cre = null;
if (obj instanceof TextString) {
// ARE in saved game
cre = (CreResource)actor.getAttribute(Actor.ARE_ACTOR_CRE_FILE);
} else if (obj instanceof ResourceRef) {
String creName = ((ResourceRef)obj).getResourceName();
if (creName.lastIndexOf('.') > 0) {
cre = new CreResource(ResourceFactory.getResourceEntry(creName));
}
}
if (cre != null) {
msg = ((StringRef)cre.getAttribute(Actor.ARE_ACTOR_NAME)).toString();
ea = (int)((IdsBitmap)cre.getAttribute(CreResource.CRE_ALLEGIANCE)).getValue();
}
if (ea >= 2 && ea <= 30) {
icon = IconGood;
} else if (ea >= 200) {
icon = IconEvil;
} else {
icon = IconNeutral;
}
} catch (Exception e) {
e.printStackTrace();
}
// Using cached icons
String keyIcon = String.format("%1$s%2$s", SharedResourceCache.createKey(icon[0]),
SharedResourceCache.createKey(icon[1]));
if (SharedResourceCache.contains(SharedResourceCache.Type.ICON, keyIcon)) {
icon = ((ResourceIcon)SharedResourceCache.get(SharedResourceCache.Type.ICON, keyIcon)).getData();
SharedResourceCache.add(SharedResourceCache.Type.ICON, keyIcon);
} else {
SharedResourceCache.add(SharedResourceCache.Type.ICON, keyIcon, new ResourceIcon(keyIcon, icon));
}
item = new IconLayerItem(location, actor, msg, icon[0], Center);
item.setName(getCategory());
item.setToolTipText(msg);
item.setImage(AbstractLayerItem.ItemState.HIGHLIGHTED, icon[1]);
item.setVisible(isVisible());
}
}
}