The Source for Java Technology Collaboration
User: Password:



Kirill Grouchnikov

Kirill Grouchnikov's Blog

Hit series powered by Java, studio execs deny

Posted by kirillcool on April 23, 2006 at 03:45 AM | Comments (2)

Now that major drama series are about to be available for legal downloads, rumors about the behind-the-scenes engines start spreading. Here is a sample class behind Fox megahit, "24". Note that the code below may change from time to time and does not represent the quality of the final product.

package javax.ctu;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.*;

import javax.swing.Timer;

/**
 * CTU agent. 
 */
public class Agent implements PropertyChangeListener {
  /**
   * Name of <code>this</code> agent.
   */
  protected String name;

  /**
   * Property support.
   */
  protected List<PropertyChangeListener> propertySupport;

  /**
   * Can contain a single entity.
   */
  public static interface BodyBag<T> extends Wrapper<T> {
  }

  /**
   * Enum for the available bodily operations.
   */
  public enum BasicBodilyOperation {
    EAT, DRINK, WASH_HANDS, SLEEP, PEE, YAWN, BLINK, PERSPIRATE
  }

  /**
   * Sets new value for the agent name.
   
   @param name
   *            New value for the agent name.
   */
  public void setName(String name) {
    String oldName = this.name;
    this.name = name;
    PropertyChangeEvent event = new PropertyChangeEvent(this, "name",
        oldName, name);
    for (PropertyChangeListener pcl : propertySupport)
      pcl.propertyChange(event);
  }

  /*
   * (non-Javadoc)
   
   * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
   */
  public void propertyChange(final PropertyChangeEvent evt) {
    if ("name".equals(evt.getPropertyName())) {
      if (evt.getOldValue() == null) {
        // This is the first time the agent name becomes known
        if ("Curtis".equals(evt.getNewValue())) {
          // defer to later stage
        else {
          // choose random time in next five minutes
          Timer timer = new Timer((int) (60 1000 * Math
              .random())new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              Agent agent = (Agentevt.getSource();
              agent.dispose();
            }
          });
          timer.setRepeats(false);
          timer.start();
        }
      }
    }
  }

  /**
   * Disposes of this agent. See Bloch's Effective Java chapter 6 on why we
   * don't use finalizers.
   */
  public void dispose() {
    if ("Jack".equals(name|| "Kim".equals(name)
    // || "Tony".equals(name) || "Michelle".equals(name)
        || "Chloe".equals(name)) {
      throw new UnsupportedOperationException("Agent '" this.name
          "' can not be killed due to rating concerns");
    }

    if (this.name != null) {
      // How long this agent has been known by name - take a small
      // pause accordingly letting the female audience weep a little.
      Thread.currentThread().sleep(1000 * Production.getStatus(this));
    }

    BodyBag<Agent> bb = this.getBodyBag();
    bb.add(this);
  }

  /**
   * Tests if <code>this</code> agent is loyal to CTU.
   
   @return <code>true</code> if <code>this</code> agent is loyal to CTU,
   *         <code>false</code> otherwise.
   @deprecated As of the latest release, use {@link #isLoyalToJack()}
   *             instead.
   */
  @Deprecated
  public boolean isLoyalToCTU() {
    // Commented when Nina got too old for the target 24-39 male audience.
    // return true;

    throw new IrrelevantOperationException("Call isLoyalToJack() instead");
  }

  /**
   * Tests if <code>this</code> agent is loyal to Jack.
   
   @return <code>true</code> if <code>this</code> agent is loyal to
   *         Jack, <code>false</code> otherwise.
   */
  public boolean isLoyalToJack() {
    if ("Jack".equals(this.name)) {
      // may revise later when we run out of plausible ideas.
      return true;
    }
    if ("Curtis".equals(this.name)) {
      // the least loveable by the target audience
      return false;
    }
    if ("Chloe".equals(this.name)) {
      // not a real agent and has some imaginary computer skills
      return true;
    }

    double random = Math.random();
    int hoursTillSeasonEnd = Integer.parseInt(Production.getTitle())
        - Production.getEpisodeNumber();
    // Make more twists towards season end
    return (random / hoursTillSeasonEnd0.1;
  }

  /**
   * Checks whether the specified bodily operation is supported.
   
   @param operation
   *            Bodily operation.
   @return <code>true</code> if the specified operation is supported,
   *         <code>false</code> otherwise.
   */
  public boolean supports(BasicBodilyOperation operation) {
    if (operation == BasicBodilyOperation.BLINK)
      return !"Jack".equals(this.name);

    return false;
  }

  /**
   * Returns the name of the love interest of <code>this</code> agent.
   
   @return The name of the love interest of <code>this</code> agent.
   @throws IrrelevantOperationException
   *             if irrelevant.
   */
  public String getLoveInterestName() {
    if ("Jack".equals(this.name)) {
      // return "Nina";
      // return "Teri";
      // return "Kate";
      // return "Audrey";
      return "Work";
    }
    if ("Tony".equals(this.name)) {
      // TODO - remove this piece of dead code
      return "Michelle";
    }
    if ("Michelle".equals(this.name)) {
      // TODO - remove this piece of dead code
      return "Tony";
    }

    throw new IrrelevantOperationException("No time for this");
  }

  /**
   * Returns the locale of the current foe. Serves up as an excuse for proper
   * lack of internationalization.
   
   @return The locale of the current foe.
   */
  public Locale getCurrentFoeLocale() {
    // Locale result = new Locale("sr", "CS");
    // Locale result = new Locale("es", "MX");
    // Locale result = new Locale("fa", "IR");
    // Locale result = new Locale("zh", "CN");
    // Locale result = new Locale("ru", "RU");
    return this.getCountry().getLeader().getLocale();
  }

  /**
   * To be implemented in native code. What this really means is that we are
   * not going to go into such insignificant details. OS-specific
   * implementation may borrow details from division implementation of
   {@link Nikita}.
   
   @return Division of <code>this</code> agent.
   */
  public native Division getDivision();
}

Bookmark blog post: del.icio.us del.icio.us Digg Digg DZone DZone Furl Furl Reddit Reddit
Comments
Comments are listed in date ascending order (oldest first) | Post Comment

  • Surely Jack would have used PropertyChangeSupport instead of rolling his own! :)

    Posted by: joshy on April 23, 2006 at 11:07 AM

  • You don't know Jack - he can trust nobody. He needs his own PropertyChangeSupport :)

    Posted by: kirillcool on April 23, 2006 at 11:13 AM



Only logged in users may post comments. Login Here.


Powered by
Movable Type 3.01D
 Feed java.net RSS Feeds