filler/0040775000076400007640000000000007224552024011031 5ustar johnjohnfiller/src/0040775000076400007640000000000007224552024011620 5ustar johnjohnfiller/src/friendless/0040775000076400007640000000000007224552024013756 5ustar johnjohnfiller/src/friendless/games/0040775000076400007640000000000007224552024015052 5ustar johnjohnfiller/src/friendless/games/filler/0040775000076400007640000000000007224552024016327 5ustar johnjohnfiller/src/friendless/games/filler/AbstractFillerPlayer.java0100640000076400007640000000677707224552024023260 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import java.util.*; /** * A base class for implementing robot players, which provides some useful * operations, but no strategy. * * @author John Farrell */ public abstract class AbstractFillerPlayer implements FillerPlayer { /** Get the the X coordinate of piece i. */ protected static final int getX(int i) { return FillerModel.getX(i); } /** Get the the Y coordinate of piece i. */ protected static final int getY(int i) { return FillerModel.getY(i); } /** Make a piece index from a given x and y. */ protected static final int makeIndex(int x, int y) { return FillerModel.makeIndex(x, y); } protected static Random rng = new Random(); /** origins[0] is this player's origin, origins[1] is the opponents. */ protected int[] origins; /** same as origins but with the order swapped. */ protected int[] reverseOrigins; public void setOrigin(int origin, int otherOrigin) { origins = new int[] { origin, otherOrigin }; reverseOrigins = new int[] { otherOrigin, origin }; } /** To be overridden by each player. */ public abstract int turn(); protected static BitSet allColours() { BitSet b = new BitSet(FillerSettings.NUM_COLOURS); for (int i=0; i 1) { a1 = (a1 + a2)/2; a2 = x/a1; } return a1; } protected static final int sideDistance(int p1, int p2) { return Math.abs(getX(p1)-getX(p2)) + Math.abs(getY(p1)-getY(p2)); } protected static final int diagDistance(int p1, int p2) { int x = getX(p1)-getX(p2); int y = (getY(p1)-getY(p2)) * 3; return intRoot(x*x + y*y); } public String getIcon() { return null; } } filler/src/friendless/games/filler/ChoosePlayerList.java0100640000076400007640000000535707224552024022424 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; import javax.swing.table.*; import friendless.games.filler.player.*; /** * A list of all players, from which you can choose a subset. * * @author John Farrell */ public final class ChoosePlayerList extends JList { PlayerRenderer renderer; PlayerWrappers players; public ChoosePlayerList(PlayerWrappers players, int selectionModel) { super(); this.players = players; renderer = new PlayerRenderer(getForeground(), getBackground()); setCellRenderer(renderer); setSelectionMode(selectionModel); setModel(players.getListModel()); if (selectionModel == ListSelectionModel.MULTIPLE_INTERVAL_SELECTION) { setSelected(); addListSelectionListener(new ChoosePlayersListSelectionListener(players)); } } void setSelected() { PlayerWrappers selected = players.getSelected(); for (int i=0; i= 0) b.clear(colour); if (otherPlayerColour >= 0) b.clear(otherPlayerColour); return b; } /** Choose colours one after another. */ public int cycle_turn() { int favourite = (colour + 1) % FillerSettings.NUM_COLOURS; if (favourite == otherPlayerColour) { favourite = (favourite + 1) % FillerSettings.NUM_COLOURS; } return favourite; } /** Choose a random colour. */ public int random_turn() { return chooseRandom(allUsefulColours()); } public String getFullName() { return getClass().getName(); } public int takeTurn(FillerModel model, int otherPlayerColour) { this.otherPlayerColour = otherPlayerColour; turn++; colour = turn(); if (colour < 0) { colour = random_turn(); System.out.println(getName() + " chooses randomly"); } return colour; } /** * The robot player has always chosen a colour. */ public boolean colourChosen(int c) { return true; } /** The robot player does not require buttons. */ public boolean requiresButtons() { return false; } public String getIcon() { return "robot.png"; } } filler/src/friendless/games/filler/EditTournamentPanel.java0100664000076400007640000001730607224552024023120 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import java.awt.event.*; import java.text.*; import java.util.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; import friendless.awt.*; import friendless.games.filler.player.*; /** * The panel which lets you choose tournament rules. * * @author John Farrell */ class EditTournamentPanel extends JPanel { /** Radio buttons to let you choose the tournament type. */ private JRadioButton robin, knock, basho, challenge; /** Whether the tournament is continuous or not. */ private JCheckBox continuous; /** ButtonGroup for the radio buttons. */ private ButtonGroup ruleGroup; private ChoosePlayerList playerList; /** All the players that can be chosen. */ private PlayerWrappers players; /** Reference to resources file. */ private ResourceBundle resources; /** Command to play tournament. */ private JButton playTournament; /** Description of last selected player. */ private JTextArea description; /** Description of current tournament. */ private JTextArea tournDesc; /** The MainPanel*/ private MainPanel mainPanel; private SetTournamentDescriptionListener std = new SetTournamentDescriptionListener(); public EditTournamentPanel(PlayerWrappers players, final ResourceBundle resources, MainPanel mainPanel) { this.resources = resources; this.players = players; players.sortByRatings(); this.mainPanel = mainPanel; setBorder(new EmptyBorder(4,4,4,4)); setLayout(new GridLayout(1,3)); JPanel p; JScrollPane scroll; add(p = new JPanel(new VCodeLayout("f",4))); JPanel rulesPanel = new JPanel(new VCodeLayout("l", 4)); rulesPanel.setBorder(BorderFactory.createTitledBorder(resources.getString("filler.label.tournrules"))); ruleGroup = new ButtonGroup(); rulesPanel.add("",robin = new JRadioButton(resources.getString("filler.label.roundrobin"))); ruleGroup.add(robin); robin.setSelected(true); robin.addActionListener(std); rulesPanel.add("",knock = new JRadioButton(resources.getString("filler.label.knockout"))); ruleGroup.add(knock); knock.addActionListener(std); rulesPanel.add("",basho = new JRadioButton(resources.getString("filler.label.basho"))); ruleGroup.add(basho); basho.addActionListener(std); rulesPanel.add("",challenge = new JRadioButton(resources.getString("filler.label.challenge"))); ruleGroup.add(challenge); challenge.addActionListener(std); p.add("", rulesPanel); p.add(continuous = new JCheckBox(resources.getString("filler.label.continuous"))); p.add("x", tournDesc = new JTextArea("")); tournDesc.setBorder(BorderFactory.createTitledBorder(resources.getString("filler.label.description"))); tournDesc.setEditable(false); tournDesc.setLineWrap(true); tournDesc.setWrapStyleWord(true); tournDesc.setToolTipText(resources.getString("filler.string.tourndescription")); tournDesc.setBackground(getBackground()); // playerList = new ChoosePlayerList(players, ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); add(scroll = new JScrollPane(playerList)); playerList.setToolTipText(resources.getString("filler.string.choose2edit")); playerList.setBackground(getBackground()); playerList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { if (evt.getValueIsAdjusting()) return; JList list = (JList) evt.getSource(); int index = list.getAnchorSelectionIndex(); PlayerWrapper player = (PlayerWrapper) list.getModel().getElementAt(index); Object[] args = { player.getName() }; String text = MessageFormat.format(player.getDescription(), args); description.setText(text); } }); scroll.setBorder(BorderFactory.createTitledBorder(resources.getString("filler.label.players"))); add(p = new JPanel(new VCodeLayout("",4))); p.add("x", description = new JTextArea()); description.setEditable(false); description.setLineWrap(true); description.setWrapStyleWord(true); description.setToolTipText(resources.getString("filler.string.playerdescription")); description.setBorder(BorderFactory.createTitledBorder(resources.getString("filler.label.description"))); description.setBackground(getBackground()); p.add("x", new JPanel()); p.add("", playTournament = new JButton(resources.getString("filler.label.playtournament"))); playTournament.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { EditTournamentPanel.this.mainPanel.playTournament(getRules(), getSelectedPlayers()); } }); setTournamentDescription("roundrobin"); } PlayerWrappers getSelectedPlayers() { return players.getSelected(); } /** Look at the control settings to determine the rules of the tournament. */ TournamentRules getRules() { TournamentRules rules = null; if (robin.isSelected()) { rules = new TournamentRules(TournamentRules.ROUND_ROBIN); } else if (knock.isSelected()) { rules = new TournamentRules(TournamentRules.KNOCKOUT); } else if (basho.isSelected()) { rules = new TournamentRules(TournamentRules.BASHO); rules.bashoRounds = players.size() * 3 / 8; } else if (challenge.isSelected()) { rules = new TournamentRules(TournamentRules.CHALLENGE); } rules.setContinuous(continuous.isSelected()); return rules; } /** Set the description field for the given type of tournament. */ void setTournamentDescription(String key) { try { String desc = resources.getString("description." + key); tournDesc.setText(desc); } catch (MissingResourceException ex) { tournDesc.setText(""); } } /** * A class which listents to the tournament buttons and sets the correct * description. */ class SetTournamentDescriptionListener implements ActionListener { public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); String key = null; if (source == basho) { key = "basho"; } else if (source == knock) { key = "knockout"; } else if (source == challenge) { key = "challenge"; } else if (source == robin) { key = "roundrobin"; } setTournamentDescription(key); } } } filler/src/friendless/games/filler/EloRating.java0100664000076400007640000001014507224552024021054 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.util.*; /** * Miscellaneous support for the ELO Rating system. * I have fiddled with the ranking cutoffs because not enough robot players * were getting high enough. * * @author John Farrell */ public class EloRating { public static String NOVICE, CLASSA, CLASSB, CLASSC, CLASSD, EXPERT, MASTER, INTLMASTER, GRANDMASTER, SUPERGRANDMASTER, WORLDCHAMPION; public static String[] TITLES; public static final int[] RATINGS = { 0, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600 }; public static final int INITIAL = 1600; public static final int PROVISIONAL = 20; /** This is the maximum number of points up for grabs in a game. */ public static int K = 32; static ResourceBundle resources; static void setResources(ResourceBundle resources) { EloRating.resources = resources; NOVICE = resources.getString("filler.ranking.NOVICE"); CLASSA = resources.getString("filler.ranking.CLASSA"); CLASSB = resources.getString("filler.ranking.CLASSB"); CLASSC = resources.getString("filler.ranking.CLASSC"); CLASSD = resources.getString("filler.ranking.CLASSD"); EXPERT = resources.getString("filler.ranking.EXPERT"); MASTER = resources.getString("filler.ranking.MASTER"); INTLMASTER = resources.getString("filler.ranking.INTLMASTER"); GRANDMASTER = resources.getString("filler.ranking.GRANDMASTER"); SUPERGRANDMASTER = resources.getString("filler.ranking.SUPERGRANDMASTER"); WORLDCHAMPION = resources.getString("filler.ranking.WORLDCHAMPION"); TITLES = new String[] { NOVICE, CLASSA, CLASSB, CLASSC, CLASSD, EXPERT, MASTER, INTLMASTER, GRANDMASTER, SUPERGRANDMASTER, WORLDCHAMPION }; } /** * P(ratings[1]-ratings[0]) * Expected chance player[1] will beat player[0] */ public static double expectancy(int[] ratings) { int diff = ratings[0] - ratings[1]; return 1.0 / (1.0 + Math.pow(10.0,diff/400.0)); } /** * Expected number of points won by { player[0], player[1] } if they were * to win a match between the 2. */ public static int[] expectedWinnings(int[] ratings) { double ex = expectancy(ratings); int[] result = { (int) (K * ex), (int) (K * (1.0 - ex)) }; return result; } /** * Adjust a pair of ratings given that the winner was that indicated by * winner, which must be 0 or 1. * @return the number of points which were won or lost */ public static int adjust(int[] ratings, int winner) { double ex = expectancy(ratings); int delta = 0; if (winner == 0) { delta = (int) (K * ex); ratings[0] += delta; ratings[1] -= delta; } else { delta = (int) (K * (1.0 - ex)); ratings[0] -= delta; ratings[1] += delta; } return delta; } /** @return the title for a particular rating. */ public static String getLabel(int rating) { String label = null; for (int i=0; i RATINGS[i]) { label = TITLES[i]; } else { break; } } return label; } } filler/src/friendless/games/filler/Evaluator.java0100640000076400007640000000224707224552024021130 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; /** * An interface to be implemented by something which can evaluate the * goodness of a particular board position. * * @author John Farrell */ public interface Evaluator { /** * @param model the board position to be evaluated * @param counted the analysis of the board position telling who owns * what. */ public int eval(FillerModel model, int[] counted); } filler/src/friendless/games/filler/Filler.java0100664000076400007640000000644707224552024020417 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import friendless.awt.*; /** * Main class for the game. * * @author John Farrell */ public final class Filler implements Runnable { JPanel panel; static ResourceBundle resources; public void run() { // create a frame to run in JFrame frame = new JFrame(resources.getString("filler.title")); panel = new MainPanel(resources); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { close(); } }); frame.getContentPane().add("Center", panel); frame.pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); frame.setLocation((screenSize.width - frameSize.width)/2, (screenSize.height - frameSize.height)/2); frame.setVisible(true); } /** User clicked on the kill window button. */ void close() { System.exit(0); } public static void main(String[] argv) { // This code copied from the Locale static initialiser, because it // doesn't seem to be executed in Sun's JDK1.3 on Linux. String language = System.getProperty("user.language","en"); String country = System.getProperty("user.region",""); // language can be en_US if set from $LANG on Linux int i = language.indexOf('_'); if (i >= 0) { if (country.equals("")) { country = language.substring(i+1); } language = language.substring(0, i); } String variant = ""; i = country.indexOf('_'); if (i >= 0) { variant = country.substring(i+1); country = country.substring(0, i); } Locale defaultLocale = new Locale(language, country, variant); Locale.setDefault(defaultLocale); System.out.println("default locale is " + Locale.getDefault()); // load resources resources = ResourceBundle.getBundle("friendless.games.filler.resources", defaultLocale); ImageIcon splashIcon = new ImageIcon(Filler.class.getResource(resources.getString("filler.filename.splash"))); SplashScreen splash = SplashScreen.show(splashIcon); EloRating.setResources(resources); Tournaments.setResources(resources); Filler f = new Filler(); f.run(); splash.close(); splash = null; } } filler/src/friendless/games/filler/FillerBoard.java0100640000076400007640000002200107224552024021341 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import java.awt.event.*; import java.util.*; import friendless.awt.*; import javax.swing.*; /** * A graphical component which is the array of hexagons. * * @author John Farrell */ public class FillerBoard extends JComponent { /** the pixel coordinates of the hexes */ static Point[] topLefts, botRights; static { int size = FillerSettings.SIZE; topLefts = new Point[size]; botRights = new Point[size]; for (int i=0; i= numColours) { int overflow = ci - numColours; int shade = (overflow * 16) % 192 + 32; c = new Color(shade, shade, shade); } else { c = FillerSettings.colours[ci]; } drawHex(goff, c, i); } goff.dispose(); off = img; return img; } public void addNotify() { super.addNotify(); off = null; } public void setBounds(int x, int y, int w, int h) { super.setBounds(x,y,w,h); off = null; } /** * @param fast whether to try to speed things up by skipping painting. * Useful in robot tournaments. */ public int changeColourCountScore(FillerSpace space, int newColour, int origin, boolean fast) { Image img = off; if (img == null) img = resetOffscreenImage(); boolean[] captured = space.captured; Graphics goff = img.getGraphics(); // only have to change colour of pieces already belonging to us int[] pieces = model.pieces; for (int i=0; i 0) { int p = border[--idx]; if (counted[p] != FillerModel.VACANT) { continue; } else if (pieces[p] == colour) { counted[p] = FillerModel.MINE; score++; captured[p] = true; ns = FillerModel.neighbours(p); for (i=0; ic. */ static Color contrastingColour(Color c) { if (c.equals(Color.black) || c.equals(Color.blue) || c.equals(Color.darkGray)) { return Color.white; } else { return Color.black; } } /** Draw the letter 'R' at the physical coordinate n. */ void drawRight(Graphics g, Color c, Point n) { int x = n.x; int y = n.y; g.setColor(c); // teensy weensy 'R' g.drawLine(x-1,y+4,x-1,y+9); g.drawLine(x-1,y+4,x+1,y+4); g.drawLine(x+2,y+5,x+2,y+6); g.drawLine(x-1,y+7,x+1,y+7); g.drawLine(x+1,y+8,x+2,y+9); } /** Draw the letter 'L' at the physical coordinate n. */ void drawLeft(Graphics g, Color c, Point n) { int x = n.x; int y = n.y; g.setColor(c); // teensy weensy 'L' g.drawLine(x-1,y+4,x-1,y+9); g.drawLine(x-1,y+9,x+2,y+9); } /** * Draw hex number i in colour c. * This method draws the outline and lets drawHexCentre fill in the * coloured part. */ void drawHex(Graphics g, Color c, int i) { Point n = topLeft(i); int x = n.x; int y = n.y; g.setColor(Color.white); g.drawLine(x,y,x-4,y+4); g.drawLine(x-4,y+4,x-4,y+9); g.drawLine(x-4,y+9,x,y+13); g.setColor(Color.darkGray); g.drawLine(x+1,y,x+5,y+4); g.drawLine(x+5,y+4,x+5,y+9); g.drawLine(x+5,y+9,x+1,y+13); drawHexCentre(g,c,i); } public Dimension getMinimumSize() { return getPreferredSize(); } public Dimension getPreferredSize() { Point p1 = bottomRight(FillerModel.makeIndex(FillerSettings.COLUMNS-1,FillerSettings.ROWS-1)); Point p2 = bottomRight(FillerModel.makeIndex(FillerSettings.COLUMNS-2,FillerSettings.ROWS-1)); Dimension dim = new Dimension((p1.x < p2.x) ? p2.x : p1.x, (p1.y < p2.y) ? p2.y : p1.y); dim.width += 5; dim.height += 5; return dim; } public void paintComponent(Graphics g) { if (off == null) resetOffscreenImage(); g.drawImage(off,0,0,this); } } filler/src/friendless/games/filler/FillerModel.java0100664000076400007640000003741107224552024021373 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.io.IOException; import java.util.*; import friendless.games.filler.remote.RemoteConnection; import friendless.games.filler.remote.IsMessage; import friendless.games.filler.remote.IsMessageID; import friendless.games.filler.remote.messages.NewGameMessage; /** * A class which represents what colour the hexagons are. * This class has been extended to cater for the needs of robot players. * * @author John Farrell */ public class FillerModel { /* Constants used in calculations. */ /** We have not looked at this piece yet, we don't know. */ public static final int VACANT = 0; /** It's on his border, and I could get it. */ public static final int HIS_BORDER = 1; /** It's on both of our borders. */ public static final int SHARED_BORDER = 2; /** He owns it. */ public static final int HIS = 3; /** I do not own it, but only I can ever own it. */ public static final int REACHABLE = 4; /** He does not own it, but only he can ever own it. */ public static final int HIS_REACHABLE = 5; /** It's on my border, and he could get it. */ public static final int BORDER = 6; /** I own it. */ public static final int MINE = 7; /** Either of us can get to this piece and it's not on our borders. */ public static final int FREE = 8; /** It's on my border, and he can't get it. */ public static final int INTERNAL_BORDER = 9; /** It's on his border, and I can't get it. */ public static final int HIS_INTERNAL_BORDER = 10; /** Number of types things can be classified to be. */ public static final int NUM_TYPES = 11; /** Distance to cells we already own. */ public static final int NO_DISTANCE = 0; /** Distance to unreachable cells. */ public static final int UNREACHABLE_DISTANCE = -1; /** Uncalculated distance. */ public static final int UNKNOWN_DISTANCE = -2; /** Maximum neighbours that a cell could have. */ private static final int MAX_NEIGHBOURS = 6; /** Indicator that a cell has no neighbour. */ public static final int NO_NEIGHBOUR = -1; private static int count = 0; private static int[] x, y; private static int[][] neighs; private static final Random rng = new Random(); public static final BitSet MUST_BE_MINE = new BitSet(NUM_TYPES); public static final BitSet MUST_BE_HIS = new BitSet(NUM_TYPES); public static final BitSet MUST_BE_FREE = new BitSet(NUM_TYPES); static { MUST_BE_FREE.set(HIS_BORDER); MUST_BE_FREE.set(SHARED_BORDER); MUST_BE_HIS.set(HIS); MUST_BE_MINE.set(REACHABLE); MUST_BE_HIS.set(HIS_REACHABLE); MUST_BE_FREE.set(BORDER); MUST_BE_MINE.set(MINE); MUST_BE_FREE.set(FREE); MUST_BE_MINE.set(INTERNAL_BORDER); MUST_BE_HIS.set(HIS_INTERNAL_BORDER); final int size = FillerSettings.SIZE; final int rows = FillerSettings.ROWS; x = new int[size]; y = new int[size]; for (int i=0; i= 0) calcNeighbours(i, neighs[i]); } } /** * Calculate what the neighbours of cell i are. * Put them into the first elements of the array ps. * Fill the remaining spaces with the value NO_NEIGHBOUR. */ private static final int[] calcNeighbours(int i, int[] ps) { final int columns = FillerSettings.COLUMNS; final int rows = FillerSettings.ROWS; int xi = x[i]; int yi = y[i]; int idx = 0; // to the right if (xi < columns-2) ps[idx++] = makeIndex(xi+2, yi); // to the left if (xi > 1) ps[idx++] = makeIndex(xi-2, yi); if (xi % 2 == 0) { if (xi > 0) { // above and below to the left ps[idx++] = makeIndex(xi-1, yi-1); ps[idx++] = makeIndex(xi-1, yi); } if (xi < columns-1) { // above and below to the right ps[idx++] = makeIndex(xi+1, yi-1); ps[idx++] = makeIndex(xi+1, yi); } } else { if (yi > 0) { // two above ps[idx++] = makeIndex(xi-1, yi); ps[idx++] = makeIndex(xi+1, yi); } if (yi < rows-1) { // two below ps[idx++] = makeIndex(xi-1, yi+1); ps[idx++] = makeIndex(xi+1, yi+1); } } while (idx < ps.length) ps[idx++] = NO_NEIGHBOUR; return ps; } public static final int makeIndex(int x, int y) { return (int)(x * FillerSettings.ROWS + y); } public static final int getX(int i) { return x[i]; } public static final int getY(int i) { return y[i]; } public static final boolean valid(int i) { return (x[i] >= 0); } public static final int[] neighbours(int i) { return neighs[i]; } public static final boolean isPerimeter(int i) { int[] ns = neighs[i]; return ns[ns.length-1] == NO_NEIGHBOUR; } /** * Update the reachable array to determine whether each * piece can ever be reached by me. */ static void allocateFree(FillerModel model, FillerPlayerSpace space, int myBorder, boolean[] reachable) { //int hisBorder = BORDER + HIS_BORDER - myBorder; space.resetListed(); int[] counted = space.counted; boolean[] listed = space.listed; int[] border = space.border; // build up the list of positions on the border int idx = 0; for (int i=0; i 0) { // take a point which is currently on the border int p = border[--idx]; switch (counted[p]) { case VACANT: case BORDER: case SHARED_BORDER: case HIS_BORDER: reachable[p] = true; ns = neighs[p]; for (int i=0; iorigin, * fill in details in space to mark where my pieces and my * border are. As this filling may have already been done for the other player, * it's possible that locations on my border may already be marked as being * on his border. In those cases, change them to SHARED_BORDER. */ protected static void allocate(FillerModel model, int origin, FillerPlayerSpace space, int mine, int myBorder) { int hisBorder = BORDER + HIS_BORDER - myBorder; int his = MINE + HIS - mine; space.resetListed(); int[] counted = space.counted; boolean[] listed = space.listed; int[] border = space.border; int colour = model.pieces[origin]; // origin is mine, its neighbours are the original border counted[origin] = mine; listed[origin] = true; int idx = 0; int[] ns = neighs[origin]; for (int i=0; i 0) { // take a point which is currently on the border int p = border[--idx]; int thisPiece = counted[p]; if ((thisPiece == VACANT) || (thisPiece == hisBorder)) { if (model.pieces[p] == colour) { // on the border and my colour must be mine counted[p] = mine; ns = neighs[p]; for (int i=0; ispace accurately reflects * the state of the model. */ static void allocateDistance(FillerModel model, FillerPlayerSpace space) { int[] counted = space.counted; int[] distance = space.distance; int[] border = space.border; int[] pieces = model.pieces; space.resetListed(); boolean[] listed = space.listed; int idx = 0; // allocate the distances we know immediately for (int i=0; i 0) { // take a point which is currently on the border int p = border[--idx]; listed[p] = false; int distp = distance[p]; int[] ns = neighs[p]; for (int i=0; i scores[1]) ? opponents[0].getName() : opponents[1].getName(); String h2h = resources.getString("filler.string.h2h") + ": " + PlayerRatings.getHeadToHead(opponents); String mesg = resources.getString("filler.string.winner"); mesg = MessageFormat.format(mesg, new Object[] { winner }); showMessage(mesg, h2h); finish(); } /** * Play a tournament match between the given pair of players. * @return the scores of the players in the same order as they are in * players. * This method sets up the combo boxes before the game, and displays * the victory details afterwards. */ public int[] tournamentMatch(PlayerWrapper[] players) { if (players[0] == null) { return new int[] { -1, 0 }; } else if (players[1] == null) { return new int[] { 0, -1 }; } playerNames[0].setSelectedItem(players[0]); playerNames[1].setSelectedItem(players[1]); playerNames[0].repaint(); playerNames[1].repaint(); int[] scores = play(players); int winner = (scores[0] > scores[1]) ? 0 : 1; int loser = 1 - winner; String h2h = resources.getString("filler.string.h2h") + ": " + PlayerRatings.getHeadToHead(players); String mesg = resources.getString("filler.string.winner"); mesg = MessageFormat.format(mesg, new Object[] { players[winner].getName() }); showMessage(mesg, h2h); String template = resources.getString("filler.string.matchresult"); Object[] args = { players[winner].getName(), players[loser].getName(), new Integer(scores[winner]), new Integer(scores[loser]) }; mesg = MessageFormat.format(template, args); TournamentResultsPanel.getInstance(resources).addText(mesg + SEP); PlayerRatings.save(); return scores; } public int[] play(PlayerWrapper[] players) { int turn = 0; int[] score = new int[2]; int[] colours = new int[] {-1, -1}; Thread.currentThread().setPriority(3); FillerSpace space[] = new FillerSpace[] { new FillerSpace(), new FillerSpace() }; FillerPlayer[] opponents = new FillerPlayer[] { players[0].getInstance(), players[1].getInstance() }; // isRemote == -1: if it's not a remote game // isRemote == 0: if player 0 is the remote player // isRemote == 1: if player 1 is the remote player int isRemote = -1; if (opponents[0] instanceof RemotePlayer) { isRemote = 0; } else if (opponents[1] instanceof RemotePlayer) { isRemote = 1; } board.restart(isRemote != -1); colours[0] = board.model.pieces[FillerSettings.ORIGINS[0]]; colours[1] = board.model.pieces[FillerSettings.ORIGINS[1]]; board.repaint(); // initialise players for (int i=0; i<2; i++) { opponents[i].setOrigin(FillerSettings.ORIGINS[i],FillerSettings.ORIGINS[1-i]); score[i] = board.countScore(FillerSettings.ORIGINS[i],space[i]); scoreLabels[i].setText(Integer.toString(score[i])); } int[] rs = PlayerRatings.getRatings(players[0], players[1]); boolean[] requiresButtons = { opponents[0].requiresButtons(), opponents[1].requiresButtons() }; boolean fast = !requiresButtons[0] && !requiresButtons[1]; int i = 0; showButtons(); while (true) { currentPlayer = opponents[i]; buttonPanels[i].requestFocus(); for (int k=0; k= FillerSettings.NUM_COLOURS)) { // player chose an invalid colour System.out.println(opponents[i].getName() + " chose " + colours[i]); colours[i] = oldColour; } score[i] = board.changeColourCountScore(space[i],colours[i],FillerSettings.ORIGINS[i], fast); // currentPlayer may now be null scoreLabels[i].setText(Integer.toString(score[i])); if (score[i] >= FillerSettings.POINTS_TO_WIN) break; turn += (i % 2); i = 1-i; } if (score[0] >= FillerSettings.POINTS_TO_WIN || score[1] >= FillerSettings.POINTS_TO_WIN) { PlayerRatings.setRatings(players, rs, (score[0] > score[1]) ? 0 : 1); } return score; } /** * This method notifies that a key was typed. This implements the use * of the keyboard to choose one of the colour buttons. */ public void keyTyped(KeyEvent e) { // only '0' to '8' are valid char c = e.getKeyChar(); if (!Character.isDigit(c) || (c == '0')) return; // must be someone's turn if (currentPlayer == null) return; FillerPlayer fp = currentPlayer; currentPlayer = null; boolean ok = fp.colourChosen(c - '1'); if (!ok) currentPlayer = fp; } /** Null implementation for the KeyListener interface. */ public void keyPressed(KeyEvent e) { } /** Null implementation for the KeyListener interface. */ public void keyReleased(KeyEvent e) { } } filler/src/friendless/games/filler/FillerPlayer.java0100664000076400007640000000352207224552024021563 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; /** * An interface to be implemented by something which can play Filler. * * @author John Farrell */ public interface FillerPlayer { /** Short string name of player. */ public String getName(); /** Fully qualified name of player. */ public String getFullName(); /** * Tell player where they are starting from. * @param origin player's origin * @param otherOrigin other player's origin */ public void setOrigin(int origin, int otherOrigin); /** Whether this player requires the GUI interface */ public boolean requiresButtons(); /** * Ask the player to make a move. * @param model the board position * @param otherPlayerColour the colour the other player has chosen */ public int takeTurn(FillerModel model, int otherPlayerColour); /** * Inform the player that a colour was chosen using the GUI interface. */ public boolean colourChosen(int c); /** * @return the name of an icon for this player. */ public String getIcon(); } filler/src/friendless/games/filler/HelpPanel.java0100664000076400007640000000570207224552024021043 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import javax.swing.*; import javax.swing.event.*; import java.net.*; import java.util.*; import friendless.awt.*; import friendless.games.filler.player.*; import java.util.List; /** * A panel that displays a HTML page, initially "index.html". * * @author John Farrell */ class HelpPanel extends JEditorPane { PlayerWrappers players; String[] directories; public HelpPanel() { setLayout(new BorderLayout(4,4)); Locale loc = Locale.getDefault(); List dirs = new ArrayList(); String dirName = loc.toString(); while (true) { dirs.add(dirName); if (dirName.indexOf('_') < 0) break; dirName = dirName.substring(0, dirName.indexOf('_')); } if (!dirs.contains("en")) dirs.add("en"); directories = new String[dirs.size()]; directories = (String[]) dirs.toArray(directories); setEditable(false); addHyperlinkListener(new LinkListener()); gotoPage("index.html"); } /** Go to the named page, or else a not found page, or else the index. */ void gotoPage(String filename) { try { URL url = findUrl(filename); if (url == null) url = findUrl("notfound.html"); if (url == null) url = findUrl("index.html"); if (url != null) { setPage(url); } } catch (Exception ex) { ex.printStackTrace(); } } URL findUrl(String filename) { for (int i=0; i highest) { results = (BitSet) NO_COLOURS.clone(); results.set(c); highest = score; } } int choice = chooseRandom(results); return choice; } public class ExpandEvaluator implements Evaluator { public int eval(FillerModel model, int[] counted) { int furthest = Integer.MIN_VALUE; for (int i=0; i furthest) furthest = dist; } } return furthest; } } protected BitSet maximise(Evaluator evaluator, int level) { int[] counted = space.counted; return maximise(evaluator,allUsefulColours(),model,counted); } public String getIcon() { return "badrock.png"; } } filler/src/friendless/games/filler/MainPanel.java0100664000076400007640000000763007224552024021041 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import javax.swing.*; import javax.swing.event.*; import java.io.*; import java.util.*; import friendless.games.filler.remote.NetworkPanel; /** * The panel which contains the whole application. * * @author John Farrell */ public class MainPanel extends JPanel { JTabbedPane tabPane; EditTournamentPanel editTourn; PlayerRatings ratings; PlayerWrappers players; RankingsPanel rankings; HeadToHeadPanel h2h; ResourceBundle resources; FillerPanel fillerPanel; HelpPanel help; public MainPanel(ResourceBundle resources) { super(new BorderLayout()); this.resources = resources; // load ratings PlayerRatings.retrieve(); players = new PlayerWrappers(resources); PlayerWrappers displayPlayers = new PlayerWrappers(resources); tabPane = new JTabbedPane(JTabbedPane.BOTTOM); add(tabPane, BorderLayout.CENTER); fillerPanel = new FillerPanel(players, resources); tabPane.add(resources.getString("filler.mainpanel.name"), fillerPanel); tabPane.addTab(resources.getString("filler.label.tournament"),null, editTourn = new EditTournamentPanel(displayPlayers, resources, this), resources.getString("filler.string.cfgtourn")); tabPane.addTab(resources.getString("filler.label.rankings"),null, new JScrollPane(rankings = new RankingsPanel(displayPlayers)), resources.getString("filler.string.rankings")); tabPane.addTab(resources.getString("filler.string.h2h"),null, new JScrollPane(h2h = new HeadToHeadPanel(displayPlayers)), resources.getString("filler.string.h2hrec")); tabPane.addTab(resources.getString("filler.label.network"), null, new NetworkPanel(resources), resources.getString("filler.string.network")); tabPane.addTab(resources.getString("filler.label.tournamentresults"), null, TournamentResultsPanel.getInstance(resources), resources.getString("filler.string.tournamentresults")); tabPane.addTab(resources.getString("filler.label.help"),null, new JScrollPane(help = new HelpPanel(), JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), resources.getString("filler.string.help")); tabPane.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { refreshTabs(); } }); } /** * Make sure that the current tab is displaying up to date information. */ void refreshTabs() { int index = tabPane.getSelectedIndex(); String name = tabPane.getTitleAt(index); if (name.equals(resources.getString("filler.label.rankings"))) { rankings.refresh(); } else if (name.equals(resources.getString("filler.string.h2h"))) { h2h.refresh(); } } public Dimension getPreferredSize() { return new Dimension(500,430); } public void playTournament(TournamentRules rules, PlayerWrappers tournPlayers) { tabPane.setSelectedComponent(fillerPanel); fillerPanel.playTournament(rules, tournPlayers); } } filler/src/friendless/games/filler/PlayerComboBox.java0100640000076400007640000000264207224552024022052 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import java.util.*; import javax.swing.*; /** * A combo box from which you can choose a player. * * @author John Farrell */ class PlayerComboBox extends JComboBox { public PlayerComboBox(PlayerWrappers players, ResourceBundle resources) { super(players.getComboBoxModel()); setRenderer(new PlayerRenderer(Color.black, Color.white)); setSelectedIndex(0); setEditable(false); getAccessibleContext().setAccessibleName(resources.getString("filler.label.players")); getAccessibleContext().setAccessibleDescription(resources.getString("filler.string.choose")); } } filler/src/friendless/games/filler/PlayerRating.java0100664000076400007640000000604207224552024021572 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.io.*; import java.util.*; /** * Rating information for a player. * Includes the player's ELO rating and their head to head record. * * @author John Farrell */ public class PlayerRating implements Serializable { static final long serialVersionUID = 734940228562653290L; public String name; public int rating; public int games; public Map headToHead; // for serialisation public PlayerRating() { } public PlayerRating(String fullName) { this.name = fullName; this.rating = EloRating.INITIAL; this.games = 0; this.headToHead = new HashMap(); } /** @return the head to head record of this player against player. */ public int[] getRecordAgainst(PlayerWrapper player) { int[] rec = (int[]) headToHead.get(player.getFullName()); if (rec == null) { rec = new int[] { 0, 0 }; } else { rec = (int[]) rec.clone(); } return rec; } public String getShortHeadToHead(PlayerWrapper player) { String oppName = player.getFullName(); int[] record = (int[])headToHead.get(oppName); if (record == null) record = new int[] { 0, 0 }; return (record[0] + "-" + record[1]); } public String getHeadToHead(String name, PlayerWrapper player) { String oppName = player.getFullName(); int[] record = (int[])headToHead.get(oppName); if (record == null) record = new int[] { 0, 0 }; return name + " " + record[0] + " " + player.getName() + " " + record[1]; } public String toString() { return name + " games: " + games + " rating: " + rating; } /** * Add a result to the head to head record. */ public void result(PlayerWrapper opponent, boolean won) { games++; String oppName = opponent.getFullName(); int[] record = (int[]) headToHead.get(oppName); if (record == null) { headToHead.put(oppName,won ? new int[] { 1, 0 } : new int[] { 0, 1 }); } else { if (won) { record[0]++; } else { record[1]++; } headToHead.put(oppName,record); } } } filler/src/friendless/games/filler/PlayerRatings.java0100664000076400007640000001346007224552024021757 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.io.*; import java.util.*; /** * Rating information for a set of players. * This is a singleton. * * @see PlayerRating * @author John Farrell */ public class PlayerRatings implements Serializable { /** * Filename of the file we store the ratings in. * This file contains a Java-serialised instance of this class. */ public static final String RATINGS_FILENAME = "ratings.ser"; static final long serialVersionUID = -5410208778282312709L; /** The singleton instance. */ static PlayerRatings theInstance; /** A list of PlayerRating objects. */ List ratings; public PlayerRatings() { ratings = new ArrayList(); } /** Get the rating for a particular player. If they don't have one, return null. */ static PlayerRating search(PlayerWrapper pw) { String name = pw.getFullName(); for (int i=0; i wRating)) { prs[loser].rating = (lgames * lRating + (EloRating.PROVISIONAL - lgames) * wRating) / EloRating.PROVISIONAL; } } public void printRatings() { for (int i=0; iopponent. * The array has two values, the first is the number of games won by this player * and the second is the number won by the opponent. */ int[] getRecordAgainst(PlayerWrapper opponent) { return rating.getRecordAgainst(opponent); } String getShortHeadToHead(PlayerWrapper opponent) { return rating.getShortHeadToHead(opponent); } int getRating() { return rating.rating; } public String toString() { return getName() + " (" + getRating() + ")"; } public String getDescription() { if (name == null) getDetailsFromClass(); try { return resources.getString("description." + name); } catch (MissingResourceException ex) { ex.printStackTrace(); return "{0}"; } } } filler/src/friendless/games/filler/PlayerWrappers.java0100664000076400007640000001410007224552024022143 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import javax.swing.*; import java.text.*; import java.util.*; /** * A set of players. * It remembers whether each player is selected or not. * * @author John Farrell */ public class PlayerWrappers { /** * This is the list of class names of players which are available. * If you create a new player, to enable them you will have to add them * to this list. */ public static final String[] PLAYER_CLASS_NAMES = { "HumanFillerPlayer", "RemotePlayer", "Sachin", "Dieter", "Isadora", "Margaret", "Rosita", "Luigi", "Makhaya", "Claudius", "Basil", "Wanda", "Mainoumi", "Omar", "Shirley", "Hugo", "Eldine", "Aleksandr", "Manuelito", "Che", "Cochise", "Jefferson" }; public static final String PLAYER_PACKAGE = "friendless.games.filler.player"; private static Random rng = new Random(); private PlayerWrapper[] wrappers; private boolean[] selected; private ResourceBundle resources; /** Create a new set of players representing all of the players available. */ public PlayerWrappers(ResourceBundle resources) { this.resources = resources; this.wrappers = getPlayerList(resources); selected = new boolean[wrappers.length]; for (int i=0; iplayers. */ public PlayerWrappers(ResourceBundle resources, List players) { this.wrappers = new PlayerWrapper[players.size()]; wrappers = (PlayerWrapper[]) players.toArray(wrappers); selected = new boolean[wrappers.length]; for (int i=0; i pj.getRating()) { PlayerWrapper temp = wrappers[i]; wrappers[i] = wrappers[j]; wrappers[j] = temp; } } } } /** * "Sort" the players into a random order. */ public void sortByRandom() { for (int i=wrappers.length-1; i>1; i--) { int j = rng.nextInt(i); PlayerWrapper pi = wrappers[i]; wrappers[i] = wrappers[j]; wrappers[j] = pi; } } public boolean contains(PlayerWrapper player) { if (player == null) return false; for (int i=0; iplayer is selected. */ public void setSelection(PlayerWrapper player, boolean isSelected) { if (player == null) return; for (int i=0; i=0; i--) { low = EloRating.RATINGS[i]; String range = Integer.toString(low); if (high == Integer.MAX_VALUE) { range += "+"; } else { range += "-" + Integer.toString(high-1); } doc.insertString(doc.getLength(), EloRating.TITLES[i] + " (" + range + ")", styles.getStyle("heading")); doc.insertString(doc.getLength(), "\n", null); for (int j=0; j= low)) { doc.insertString(doc.getLength(),Integer.toString(rating),styles.getStyle("number")); doc.insertString(doc.getLength()," " + players.get(j).getName(),styles.getStyle("normal")); doc.insertString(doc.getLength(), "\n", null); } } doc.insertString(doc.getLength(), "\n", null); high = low; } text.setDocument(doc); //revalidate(); } catch (BadLocationException ex) { ex.printStackTrace(); } } void createStyles() { // default style Style def = styles.getStyle(StyleContext.DEFAULT_STYLE); // heading style Style heading = styles.addStyle("heading", def); //StyleConstants.setForeground(heading, FillerContainer.FILLER_COLOUR); StyleConstants.setFontFamily(heading, "SansSerif"); StyleConstants.setBold(heading, true); StyleConstants.setAlignment(heading, StyleConstants.ALIGN_CENTER); StyleConstants.setSpaceAbove(heading, 10); StyleConstants.setSpaceBelow(heading, 16); StyleConstants.setFontSize(heading, 18); // normal Style sty = styles.addStyle("normal", def); //StyleConstants.setForeground(sty, FillerContainer.FILLER_COLOUR_DARKER); StyleConstants.setBold(sty, true); StyleConstants.setLeftIndent(sty, 10); StyleConstants.setRightIndent(sty, 10); StyleConstants.setFontFamily(sty, "SansSerif"); StyleConstants.setFontSize(sty, 14); StyleConstants.setSpaceAbove(sty, 4); StyleConstants.setSpaceBelow(sty, 4); // numbers Style number = styles.addStyle("number",sty); StyleConstants.setFontFamily(number, "monospaced"); } } filler/src/friendless/games/filler/RobotPlayer.java0100664000076400007640000002631507224552024021440 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.util.*; /** * A computer player. * Most of the basic strategic moves for medium skill robots are implemented here. * * @author John Farrell */ public abstract class RobotPlayer extends DumbRobotPlayer { protected final BitSet NO_COLOURS = new BitSet(FillerSettings.NUM_COLOURS); protected final BitSet ALL_COLOURS = allColours(); protected FillerPlayerSpace space; protected FillerModel model; protected int score; protected int turn, realScore; protected Random rng; protected RobotPlayer() { space = new FillerPlayerSpace(); score = 0; } /** * This method is part of the implementation of the FillerPlayer interface. * It does some calculations to help the strategies defined in this class, * and delegates the actual choice of move to the abstract method * turn(). */ public int takeTurn(FillerModel model, int otherPlayerColour) { turn++; this.model = model; this.otherPlayerColour = otherPlayerColour; // System.out.println(getName()); calculate(model); setScores(); colour = turn(); if (colour < 0) { colour = random_turn(); // a debugging message - this suggests that your algorithm doesn't // cover enough bizarre cases. System.out.println(getName() + " chooses randomly"); } return colour; } /** * Figure out who has what influence over each hex. */ protected void calculate(FillerModel model) { FillerModel.allocateTypes(model, origins, space); //PopupFillerBoard.popup(new FillerModel(space.counted), "calculated"); } /** Figure out the score given the current counting in space */ protected void setScores() { int[] counted = space.counted; score = 0; realScore = 0; for (int i=0; iallowed. */ int mostInSetTurn(BitSet allowed) { int[] count = countSet(allowed); // choose any of the best colours BitSet favourites = null; int best = 0; for (int i=0; i best) { favourites = (BitSet) NO_COLOURS.clone(); favourites.set(i); best = count[i]; } else if (count[i] == best) { favourites.set(i); } } return chooseRandom(favourites); } /** Chooses a colour to get the most points immediately **/ public int mostTurn() { BitSet b = (BitSet) NO_COLOURS.clone(); b.set(FillerModel.BORDER); b.set(FillerModel.SHARED_BORDER); b.set(FillerModel.INTERNAL_BORDER); return mostInSetTurn(b); } /** * Chooses a colour to get the most points in this turn from free space, * i.e. that which is available to this player and to the opponent. */ public int mostFreeTurn() { BitSet b = (BitSet) NO_COLOURS.clone(); b.set(FillerModel.BORDER); b.set(FillerModel.SHARED_BORDER); return mostInSetTurn(b); } /** * Chooses the colour that would get the opponent the most free space in * his next turn. */ public int opponentMostTurn() { BitSet b = (BitSet) NO_COLOURS.clone(); b.set(FillerModel.HIS_BORDER); b.set(FillerModel.SHARED_BORDER); return mostInSetTurn(b); } /** * Aims to achieve a nominated target. * If the target is occupied, get as close as possible. */ public int targetTurn(int target) { if (target < 0) return -1; int[] counted = space.counted; int closest = 1000; int favourite = -1; for (int i=0; i furthest) && (model.pieces[i] != otherPlayerColour)) { favourite = model.pieces[i]; furthest = dist; } break; } } return favourite; } public int furthest_border_turn() { int[] counted = space.counted; int furthest = -1; int favourite = -1; int o = origins[0]; for (int i=0; i furthest) { favourite = model.pieces[i]; furthest = dist; } } } } return favourite; } public int borderTurn() { int[] counted = space.counted; for (int i=0; i best) { favourite = i; best = count[i]; } } if (best + score >= FillerSettings.POINTS_TO_WIN) { return favourite; } else { return -1; } } protected BitSet maximise(Evaluator evaluator, BitSet colours, FillerModel model, int[] counted) { int most = Integer.MIN_VALUE; BitSet answers = (BitSet)NO_COLOURS.clone(); for (int i=0; i most) { answers.and(NO_COLOURS); answers.set(i); most = val; } } } return answers; } public String getIcon() { return "redAlien.gif"; } } filler/src/friendless/games/filler/TournamentRules.java0100640000076400007640000000306007224552024022327 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; /** * A specification of how a tournament is to be run. * * @author John Farrell */ class TournamentRules { public static final int ROUND_ROBIN = 0; public static final int KNOCKOUT = 1; public static final int BASHO = 2; public static final int CHALLENGE = 3; int rules; int bashoRounds; FillerPlayer pepperTarget; /** Whether the tournament is played once, or until cancelled. */ boolean continuous; TournamentRules(int rules) { this.rules = rules; this.bashoRounds = 4; } public void setContinuous(boolean continuous) { this.continuous = continuous; } public boolean isContinuous() { return continuous; } public String toString() { return "" + continuous + " " + rules; } } filler/src/friendless/games/filler/Tournaments.java0100664000076400007640000004417107224552024021515 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.text.*; import java.util.*; /** * A class which knows how to run tournaments. * The tournament types are: *
*
Round Robin *
Each players plays every other player. *
Knockout *
Once a player loses a game, they are eliminated. * The last player eliminated wins. *
Basho *
Each player plays the same number of games. * The player with the highest number of wins wins the tournament. *
Pepper *
One player plays against every other opponent. *
Challenge *
Players issue challenges to other players. *
* * @author John Farrell * @author Lang Sharpe */ public class Tournaments { private static final String SEP = System.getProperty("line.separator"); static Random rng = new Random(); private static boolean cancelled; private static ResourceBundle resources; static void setResources(ResourceBundle resources) { Tournaments.resources = resources; } static void cancel() { cancelled = true; } static void tournament(TournamentRules rules, FillerPanel panel, PlayerWrappers players) { cancelled = false; boolean onceOnly = true; TournamentResultsPanel.getInstance(resources).newTournament(rules, players); while (rules.isContinuous() || onceOnly) { onceOnly = false; switch (rules.rules) { case TournamentRules.ROUND_ROBIN: roundRobin(panel, players); break; case TournamentRules.BASHO: basho(rules.bashoRounds, panel, players); break; case TournamentRules.KNOCKOUT: knockout(panel, players); break; case TournamentRules.CHALLENGE: challenge(panel, players); break; default: ; } if (cancelled) break; } } static void challenge(FillerPanel panel, PlayerWrappers players) { for (int i=0; i best) { best = value; bestOpponent = opponent; points = expectedWinnings[0]; } else if (value == best) { // usually expect no chance, choose lower ranked opponent if (bestOpponent.getRating() > opponent.getRating()) { bestOpponent = opponent; points = expectedWinnings[0]; } } } String template = resources.getString("filler.string.challenges"); String mesg = MessageFormat.format(template, new Object[] { challenger.getName(), bestOpponent.getName(), new Integer(points) }); TournamentResultsPanel.getInstance(resources).addText(mesg + SEP); return bestOpponent; } static void knockout(FillerPanel panel, PlayerWrappers players) { players.sortByRandom(); int numRealPlayers = players.size(); int numPlayers = numRealPlayers + (numRealPlayers % 2); int[] pis = new int[numPlayers]; for (int i=0; i 1) { // build matches int effectiveLength = pis.length + (pis.length % 2); int[][] matches = new int[effectiveLength/2][2]; for (int j=0; j0; i--) pis[i] = pis[i-1]; pis[0] = last; } TournamentResultsPanel.getInstance(resources).addText(resources.getString("filler.string.endofround") + SEP); } String template = resources.getString("filler.string.knockoutwinner"); String mesg = MessageFormat.format(template, new Object[] { players.get(pis[0]) }); panel.showMessage(mesg, ""); TournamentResultsPanel.getInstance(resources).addText(mesg + SEP); } static PlayerWrappers checkEvenNumberOfPlayers(PlayerWrappers players) { if (players.size() % 2 == 1) { players.sortByRatings(); PlayerWrapper eliminated = players.get(players.size() - 1); TournamentResultsPanel.getInstance(resources).addText(eliminated + " can not participate in the basho." + SEP); for (int i=0; i * We approximate this sort of tournament by, for the first half of the * basho, matching players against those of approximately equal skill. * In the second half, we allocate the players with the most wins against * each other. If, after the number of scheduled rounds, we still have * players with equal numbers of wins, they play a series of round robins * until there is a clear winner. */ static void basho(int rounds, FillerPanel panel, PlayerWrappers players) { players = checkEvenNumberOfPlayers(players); if (players.size() == 0) { TournamentResultsPanel.getInstance(resources).addText("There are no players to participate in the basho." + SEP); return; } /* The played array records who has played whom. Because we sort the * array ps and the array wins, we have to record the indexes of the * players in the played array in the index map. */ boolean[][] played = new boolean[players.size()][players.size()]; Map index = new HashMap(players.size()); for (int i=0; i wins[1]) { winner = players.get(0); break; } else { tieBreaker(panel, ps, wins); } } if (winner != null) { String mesg = resources.getString("filler.string.bashowinner"); mesg = MessageFormat.format(mesg, new Object[] { winner.getName() }); panel.showMessage(mesg, ""); TournamentResultsPanel.getInstance(resources).addText(mesg + SEP); } } /** Play the given list of matches. */ private static void playBashoMatches(FillerPanel panel, List pairs, PlayerWrapper[] players, int[] wins) { for (int i=0; i scores[1]) ? 0 : 1; for (int j=0; j scores[1]) { winners[i] = opps[0]; } else { winners[i] = opps[1]; } if (recordResult) TournamentResultsPanel.getInstance(resources).addMatch(ps,scores); if (cancelled) break; } return winners; } } filler/src/friendless/games/filler/OptimalRobotPlayer.java0100664000076400007640000001306207224552024022761 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.util.*; /** * A robot player which uses distance calculations to find the shortest path to * a given free location. * * @author John Farrell */ public abstract class OptimalRobotPlayer extends RobotPlayer { /** * Calculate types as per RobotPlayer, but then additionally calculate the * shortest distance from our territory to all of the free space. */ protected void calculate(FillerModel model) { FillerModel.allocateTypes(model, origins, space); FillerModel.allocateDistance(model, space); //PopupFillerBoard.popup(new FillerModel(space.combineCountedAndDistance()), "combined"); } /** * @return the colour which will get us to the goal quickest. */ protected BitSet getBestGoalColours(int goal) { int[] distance = space.distance; int distanceToGoal = distance[goal]; if (distanceToGoal <= 0) new BitSet(FillerSettings.NUM_COLOURS); /* We now know the distance to the goal. * We have to find a sequence of locations with ever-decreasing distances * until we get to locations which are distance 0, i.e. on the border. * We then choose any colour from those distance 0 locations. */ space.resetListed(); boolean[] listed = space.listed; int[] pieces = model.pieces; int[] thisDistance = new int[distance.length]; int thisDistanceIndex = 0; int[] lowerDistance = new int[distance.length]; int lowerDistanceIndex = 0; thisDistance[thisDistanceIndex++] = goal; // find all the pieces of the same colour joined to the goal while (thisDistanceIndex > 0) { int p = thisDistance[--thisDistanceIndex]; if (listed[p]) continue; lowerDistance[lowerDistanceIndex++] = p; listed[p] = true; int[] ns = FillerModel.neighbours(p); for (int i=0; i 1) { while (thisDistanceIndex > 0) { int p = thisDistance[--thisDistanceIndex]; int[] ns = FillerModel.neighbours(p); for (int i=0; i= 0 && distq < distanceToGoal) { lowerDistance[lowerDistanceIndex++] = q; listed[q] = true; } } } // add neighbours of same colour attached to pieces at the lower distance (yuk) tempArray = lowerDistance; lowerDistance = thisDistance; thisDistance = tempArray; thisDistanceIndex = lowerDistanceIndex; lowerDistanceIndex = 0; while (thisDistanceIndex > 0) { int p = thisDistance[--thisDistanceIndex]; lowerDistance[lowerDistanceIndex++] = p; int[] ns = FillerModel.neighbours(p); for (int i=0; i> 4; int lo = i & 0x0F; hi = (hi == 0x0F ? -1 : hi); lo = (lo == 0x0F ? -1 : lo); System.out.println("Decode "+b+" into "+hi+" and "+lo); return new int[] {hi, lo}; } /** * Initialize the data by decoding it into a pieces array. * @param payload The received bytes. */ public void init(byte[] payload) { int hilo[]; _data = (byte[])payload.clone(); _pieces = new int[1425]; for (int i=0; i<_data.length-1; i++) { hilo = decode(payload[i]); _pieces[2*i] = hilo[0]; _pieces[2*i+1] = hilo[1]; } hilo = decode(payload[712]); _pieces[1424] = hilo[0]; } /** * The only data in this message is the color of this move. */ public byte[] getPayload() { return _data; } /** * Returns the array of pieces encoded by this message. */ public int[] getPieces() { return _pieces; } /** * Returns a nice representation of a move message. */ public String toString() { return "New game"; } } filler/src/friendless/games/filler/remote/RemotePlayer.java0100664000076400007640000000177707224552024023106 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.remote; import friendless.games.filler.FillerPlayer; /** * The interface of a remote player. * * @author Kris Verbeeck */ public interface RemotePlayer extends FillerPlayer { public boolean makeMove(int color); public int waitForMove(); } filler/src/friendless/games/filler/remote/RemoteConnection.java0100664000076400007640000001636007224552024023743 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.remote; import java.net.*; import java.io.*; /** * An abstract class for playing against remote opponents. * * @author Kris Verbeeck */ public class RemoteConnection implements IsRemoteConnection { // Singleton reference to the connection private static IsRemoteConnection _connection = null; /** * The message classes. Make sure that the message are order * correctly; msgs[msg_id] should point to the correct message. * Every string in this array is prepended with the package name * friendless.games.filler.remote.messages and also * the string Message is appended to it. * E.g.: Move points to the class * friendless.games.filler.remote.messages.MoveMessage. */ private static String[] _msgNames = {"NewGame", "Move"}; // The sockets used for communication. private ServerSocket _server; private Socket _client; // The streams used for communicating private InputStream _in; private OutputStream _out; /** * Private constructor because this is a singleton class. */ private RemoteConnection() { _server = null; _client = null; _in = null; _out = null; } /** * Get a reference to the RemoteConnection singleton. */ public static IsRemoteConnection getInstance() { if (_connection == null) { _connection = new RemoteConnection(); } return _connection; } /** * Returns true/false depending on whether this is the server * or client side of the connection. */ public boolean isServer() { return (_server != null); } /** * Setup a connection. Depending on the parameters that are passed * to this method, a server or client side connection will be created. *
    *
  • Server:   If no connection has been established * yet, a new server connection will be created and * the listening for incomming client connections * will be started. If there is already a server * connection then any previous client that might be * connected will get disconnected before we start * listening again for a new client. If there * is already a client connection then we will first * terminate that before setting up a server * connection.
  • *
  • Client:   If there is not yet a connection * then a new connection will be created. If there * is already a connection then that connection will * first be closed before establishing a new one.
  • *
* @param server True if this is the server side, false for the client * side. * @param hostname The hostname to connect to, only used on client side. * @param port The port to listen on for the server or to connect to * for the client */ public void setup(boolean server, String hostname, int port) throws IOException { disconnect(); if (server) { // Setup server connection System.out.println("Server on port "+port); if (_server == null) { _server = new ServerSocket(port, 1); } System.out.println("Waiting for connection..."); _client = _server.accept(); System.out.println("Connection arrived..."); } else { // Setup client connection System.out.println("Client, connecting to "+hostname+":"+port); _client = new Socket(hostname, port); System.out.println("Connection made..."); } _in = _client.getInputStream(); _out = _client.getOutputStream(); } /** * A method that will disconnect any clients connected to the server if * this is the server side, or disconnect from the remote server if this * is the client side. */ public void disconnect() throws IOException { if (_client != null) _client.close(); _client = null; } /** * Can be used to check whether a connection has been established. * @return True if a remote connection is present, false otherwise. */ public boolean connected() { return (_in != null); } /** * Sends a message to the remote party. * @param msg The message to be transmitted. */ public void sendMessage(IsMessage msg) throws IOException { System.out.println("Sending message: "+msg); _out.write(msg.getMessageId()); _out.write(msg.getPayload()); _out.flush(); } /** * Retrieves a message from the remote party. Waits until a complete * message has arrived. * @return The message that has been received. */ public IsMessage receiveMessage() throws IOException { byte id = (byte)_in.read(); try { Class clazz = Class.forName("friendless.games.filler.remote.messages."+ _msgNames[id]+"Message"); IsMessage msg = (IsMessage)clazz.newInstance(); int size = msg.getPayloadSize(); if (size != -1) { // fixed size byte[] payload = new byte[size]; int offset = 0, read = 0; while ((read != -1) && (size > 0)) { read = _in.read(payload, offset, size); size -= read; System.out.println("Read "+read+"/"+payload.length+ " of payload"); } if (size == 0) { // only if we were able to read to complete payload msg.init(payload); } } else { // use sentinel } System.out.println("Received message: "+msg); return msg; } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } } filler/src/friendless/games/filler/remote/IsRemoteConnection.java0100664000076400007640000000502207224552024024230 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.remote; import java.io.IOException; /** * The interface of for a remote connection. * * @author Kris Verbeeck */ public interface IsRemoteConnection { /** * This method can be used to check whether this Filler is the client * or the server in a remote connection. * @return True if this Filler instance is the server, false if it is * the client. */ public boolean isServer(); /** * Setup a connection. Depending on the parameters that are passed * to this method, a server or client side connection will be created. * @param server True if this is the server side, false for the client * side. * @param hostname The hostname to connect to, only used on client side. * @param port The port to listen on for the server or to connect to * for the client */ public void setup(boolean server, String hostname, int port) throws IOException; /** * A method that will disconnect any clients connected to the server if * this is the server side, or disconnect from the remote server if this * is the client side. */ public void disconnect() throws IOException; /** * Can be used to check whether a connection has been established. * @return True if a remote connection is present, false otherwise. */ public boolean connected(); /** * Sends a message to the remote party. * @param msg The message to be transmitted. */ public void sendMessage(IsMessage msg) throws IOException; /** * Retrieves a message from the remote party. Waits until a complete * message has arrived. * @return The message that has been received. */ public IsMessage receiveMessage() throws IOException; } filler/src/friendless/games/filler/remote/NetworkPanel.java0100664000076400007640000000771207224552024023102 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.remote; import java.awt.*; import java.awt.event.*; import java.io.IOException; import java.util.ResourceBundle; import javax.swing.*; import friendless.awt.HCodeLayout; /** * The panel which lets you configure the options for network play. * * @author Kris Verbeeck */ public class NetworkPanel extends JPanel { /** Reference to resources file. */ private ResourceBundle _resources; /** Configuration panel. */ private JPanel _pConfig; /** The Server/Client combo box. */ private JComboBox _cConType; /** Hostname text field. */ private JTextField _tfHost; /** Port text field. */ private JTextField _tfPort; /** Listen/Connect button. */ private JButton _bConnect; /** Chat panel. */ private JPanel _pChat; public NetworkPanel(final ResourceBundle resources) { super(new BorderLayout()); _resources = resources; // ===[ Config panel ]=== _pConfig = new JPanel(new HCodeLayout()); _pConfig.setBorder(BorderFactory.createTitledBorder("Configuration")); _cConType = new JComboBox(new Object[] {"Server", "Client"}); _cConType.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { String s = (String)e.getItem(); if (s.equals("Server")) { _tfHost.setEditable(false); _bConnect.setText("Listen"); } else { _tfHost.setEditable(true); _bConnect.setText("Connect"); } } } }); _pConfig.add("", _cConType); _pConfig.add("x", new JPanel()); _pConfig.add(new JLabel("Host:")); _pConfig.add(_tfHost = new JTextField("localhost",10)); _tfHost.setEditable(false); _pConfig.add(new JLabel("Port:")); _pConfig.add(_tfPort = new JTextField("4000",5)); _pConfig.add("x", new JPanel()); _pConfig.add("", _bConnect = new JButton("Listen")); _bConnect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String item = (String)_cConType.getSelectedItem(); boolean server = item.equals("Server"); String hostname = _tfHost.getText(); int port = -1; try { port = Integer.parseInt(_tfPort.getText()); RemoteConnection.getInstance().setup(server, hostname, port); } catch (NumberFormatException exc) { exc.printStackTrace(); } catch (IOException exc) { exc.printStackTrace(); } } }); this.add(_pConfig, BorderLayout.NORTH); // ===[ Chat panel ]=== _pChat = new JPanel(); _pChat.setBorder(BorderFactory.createTitledBorder("Chat")); this.add(_pChat, BorderLayout.CENTER); } } filler/src/friendless/games/filler/remote/IsMessage.java0100664000076400007640000000540207224552024022343 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.remote; /** * This interface will have to be implemented by every message that * is send to a remote instance of Filler. *

* A message will be send from a client to a server (or vice versa) * through the use of TCP sockets. Every raw message will consist * of a series of bytes of which the first byte identifies the type * of the message (see the getMessageId method). * * @author Kris Verbeeck */ public interface IsMessage { /** * This method can be used to initialize a message instance through * the use of a payload that has been received over a connecton. * @param payload The received bytes. */ public void init(byte[] payload); /** * Returns a unique message id for this type of message. This * is the first byte that will be send over the connection making * it possible for the remote party to identify the type of * message and the size of its payload before having read the * complete message. * @return The unique message ID. */ public byte getMessageId(); /** * This method is used by the sending party to get all the payload * data from a message before sending it. The message ID will * be prepended automatically. * @return A byte array containing the message's payload. */ public byte[] getPayload(); /** * This method is called when the receiving party needs to know * how big the message's payload is. If the size is unknown then * a sentinel will be used. * @see #getSentinel() * @return The size of the message payload (in bytes) or -1 if * it is unknown. */ public int getPayloadSize(); /** * This method will have to return the byte that acts as a sentinel * for messages that dont' have a fixed length. This method is * only called by the receiving party when the getPayLoadSize method * returns -1. * @see #getPayloadSize() * @return The byte that acts as a sentinel. */ public byte getSentinel(); } filler/src/friendless/games/filler/remote/IsMessageID.java0100664000076400007640000000173707224552024022567 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.remote; /** * This interface defines the constants that will be used as message IDs. * * @author Kris Verbeeck */ public interface IsMessageID { static byte MSGID_GAME_NEW = 0; static byte MSGID_GAME_MOVE = 1; } filler/src/friendless/games/filler/remote/FixedSizeMessage.java0100664000076400007640000000303107224552024023656 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.remote; /** * An abstract class for fixed length messages. * * @author Kris Verbeeck */ public abstract class FixedSizeMessage implements IsMessage { private byte _id; private int _size; /** * Create a message with given size. */ public FixedSizeMessage(byte id, int size) { _id = id; _size = size; } /** * Returns a unique message id for the move message. */ public byte getMessageId() { return _id; } /** * Return the size of this message. */ public int getPayloadSize() { return _size; } /** * This is a fixed size message so no sentinel is used. We * return a dummy -1. */ public byte getSentinel() { return -1; } } filler/src/friendless/games/filler/TournamentPointsTable.java0100664000076400007640000001130007224552024023463 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import javax.swing.table.*; import java.util.*; /** * This class represents a points table from a Round Robin Turnament * it implements TableModel, so it can be viewed with a jTable * Points table can be sorted manually, by calling the sort() method . * * @author Lang Sharpe */ public class TournamentPointsTable extends AbstractTableModel { private TournamentPointsTableRow rows[]; private ResourceBundle resources; /** Constructor * pre: true; post: Object created, matches in matchesdata added. */ public TournamentPointsTable(ResourceBundle resources, PlayerWrappers wrappers) { this.resources = resources; PlayerWrapper players[] = wrappers.toArray(); rows = new TournamentPointsTableRow[players.length]; for (int j=0; j < players.length; j++) { rows[j] = new TournamentPointsTableRow(players[j].getName()); } } /** Add a match to the table Pre: true; Post: table is updated with new match. */ public void addMatch(PlayerWrapper[] players, int[] scores) { int player0 = indexOf(players[0].getName()); int player1 = indexOf(players[1].getName()); if (scores[0] > scores[1]) { rows[player0].addWin(); scores[0] = 689; rows[player1].addLoss(); } else { rows[player1].addWin(); scores[1] = 689; rows[player0].addLoss(); } rows[player0].addFor(scores[0]); rows[player0].addAgainst(scores[1]); rows[player1].addFor(scores[1]); rows[player1].addAgainst(scores[0]); sort(); fireTableDataChanged(); } /** Part of AbstractTableModel * Pre: true; post: returned no of players in table */ public int getRowCount() { return rows.length; } /** Part of AbstractTableModel * Pre: true; post: returned no of columns in table */ public int getColumnCount() { return 7; } /** Part of AbstractTableModel * Pre: true; post: returned what should be in the specified cell */ public Object getValueAt(int row, int column) { switch (column) { case 0: return rows[row].getTeam(); case 1: return new Integer(rows[row].getPlayed()); case 2: return new Integer(rows[row].getWon()); case 3: return new Integer(rows[row].getLost()); case 4: return new Integer(rows[row].getFor()); case 5: return new Integer(rows[row].getAgainst()); case 6: return new Integer(rows[row].getDiff()); default: return "error"; } } /** Part of AbstractTableModel * Pre: true; post: returned name of column for columnIndex */ public String getColumnName(int columnIndex) { switch (columnIndex) { case 0: return null; case 1: return resources.getString("filler.label.played"); case 2: return resources.getString("filler.label.won"); case 3: return resources.getString("filler.label.lost"); case 4: return resources.getString("filler.label.for"); case 5: return resources.getString("filler.label.against"); case 6: return "+/-"; default: return "error"; } } /** Sorts the table * pre: true; post pointstable is sorted by points, then by (F-A) then by wins */ public void sort() { Arrays.sort(rows); fireTableDataChanged(); } private int indexOf(String teamin) { for (int j=0; j < rows.length; j++) { if ((rows[j].getTeam()).equals(teamin)) { return j; } } System.out.println("TournamentPointsTable.indexOf - Player Not Found"); return 0; } }filler/src/friendless/games/filler/TournamentPointsTableRow.java0100664000076400007640000000640507224552024024165 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import javax.swing.table.*; /** * This class summarizes the matches of a single player * * @author Lang Sharpe */ public class TournamentPointsTableRow implements Comparable { private String teamname; private int won; private int lost; private int pointsFor; private int pointsAgainst; /** Constructor. * @param team Name of the team. */ public TournamentPointsTableRow(String team) { teamname = new String(team); // the rest aren't really needed won = 0; lost = 0; pointsFor = 0; pointsAgainst = 0; } /* The next group of methods hopefully speak for themselves. * the provide accesors and mutators for the internal private variables */ public void addWin() { won += 1;} public void addLoss() { lost += 1;} public void addFor(int score) { pointsFor += score;} public void addAgainst(int score) { pointsAgainst += score;} public String getTeam() { return teamname;} public int getPlayed() { return (won + lost);} public int getWon() {return won;} public int getLost() {return lost;} public int getFor() {return pointsFor;} public int getAgainst() {return pointsAgainst;} public int getDiff() {return (pointsFor - pointsAgainst);} /** * Compares the object to any other object. * From comparable interface. * pre: other is a result * post: returns a negative integer, zero, or a positive integer as this * object is less than, equal to, or greater than the specified object */ public int compareTo(Object other) { return compareTo((TournamentPointsTableRow) other); } /** * Compares the object to any other object. * From comparable interface. * pre: other is a result * post: returns a negative integer, zero, or a positive integer as this * object is less than, equal to, or greater than the specified object */ public int compareTo(TournamentPointsTableRow other) { if (this.getWon() != other.getWon()) { // wins aren't equal return (other.getWon() - this.getWon());; // use wins to seperate teams } else { return (other.getDiff() - this.getDiff()); //else use goal difference to seperate teams } } /** * Used for debugging only * Pre: true; Post: sends object to standard output */ public void display() { System.out.println(teamname + "\t" + won + " " + lost + " " + pointsFor + " " + pointsAgainst ); } } filler/src/friendless/games/filler/player/0040750000076400007640000000000007224552024017614 5ustar johnjohnfiller/src/friendless/games/filler/player/Aleksandr.java0100664000076400007640000000654607224552024022402 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Aleksandr uses a quite sophisticated algorithm. * He starts by expanding as fast as possible, then when he reaches the other * player he chooses the emptiest corner of the board and tries to occupy that. * When he thinks he is going to win, he does so as fast as possible. * * @author John Farrell */ public final class Aleksandr extends RobotPlayer { int phase = 0; int target; int attempt; public String getName() { return "Aleksandr"; } public int turn() { int attempt = -1; int[] counted = space.counted; int[] typeCount = new int[FillerModel.NUM_TYPES]; for (int i=0; i 0)) { phase = 1; } if ((phase == 1) && ((realScore >= FillerSettings.POINTS_TO_WIN) || (typeCount[FillerModel.SHARED_BORDER] == 0))) { phase = 2; } switch (phase) { case 0: attempt = expandTurn(); break; case 1: target = calcTarget(counted); attempt = targetTurn(target); break; case 2: attempt = mostFreeTurn(); break; } if (attempt < 0) attempt = mostTurn(); return attempt; } int calcTarget(int[] counted) { int[] corners = new int[4]; int[] targets = { FillerModel.makeIndex(FillerSettings.COLUMNS/4,FillerSettings.ROWS/4), FillerModel.makeIndex(FillerSettings.COLUMNS/4,FillerSettings.ROWS*3/4), FillerModel.makeIndex(FillerSettings.COLUMNS*3/4,FillerSettings.ROWS/4), FillerModel.makeIndex(FillerSettings.COLUMNS*3/4,FillerSettings.ROWS*3/4) }; for (int i=0; i highest) { highest = corners[i]; fave = i; } } return targets[fave]; } public String getIcon() { return "blueAlien.gif"; } } filler/src/friendless/games/filler/player/Basil.java0100664000076400007640000000221307224552024021513 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; /** * Basil expands his territory as fast as possible. * * @author John Farrell */ public class Basil extends RobotPlayer { public String getName() { return "Basil"; } public int turn() { int attempt = expandTurn(); if (attempt < 0) attempt = smartMostTurn(); return attempt; } } filler/src/friendless/games/filler/player/Claudius.java0100664000076400007640000000233007224552024022232 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Claudius expands aggressively towards the opponent's origin. * * @author John Farrell */ public class Claudius extends RobotPlayer { private Point target; public String getName() { return "Claudius"; } public int turn() { int attempt = targetTurn(origins[1]); if (attempt < 0) attempt = smartMostTurn(); return attempt; } } filler/src/friendless/games/filler/player/Wanda.java0100664000076400007640000000400507224552024021514 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Wanda chooses three strategic locations on the board - the centre, and * completely across the board in 2 directions. She attempts to take those * locations. If she achieves that, she expands as much as possible. This has * the effect of stretching her across the board, then expanding explosively. * * @author John Farrell */ public final class Wanda extends RobotPlayer { public static final int centre = FillerModel.makeIndex(FillerSettings.COLUMNS / 2, FillerSettings.ROWS / 2); protected int[] goals; public String getName() { return "Wanda"; } public int turn() { if (goals == null) { goals = new int[3]; goals[0] = centre; goals[1] = makeIndex((getX(origins[0]) * 2 + getX(origins[1]))/3,getY(origins[1])); goals[2] = makeIndex(getX(origins[1]),(getY(origins[0]) + getY(origins[1]))/3); } int attempt = goalTurn(goals[0]); if (attempt < 0) attempt = goalTurn(goals[1]); if (attempt < 0) attempt = goalTurn(goals[2]); if (attempt < 0) attempt = expandTurn(); if (attempt < 0) attempt = smartMostTurn(); return attempt; } } filler/src/friendless/games/filler/player/Eldine.java0100664000076400007640000000260007224552024021661 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Eldine alternately expands and fills in. * * @author John Farrell */ public final class Eldine extends RobotPlayer { boolean toggle; public String getName() { return "Eldine"; } public int turn() { toggle = !toggle; int attempt = -1; if (toggle) { attempt = dontExpandTurn(); } else { attempt = expandTurn(); } if (attempt < 0) attempt = mostTurn(); return attempt; } public String getIcon() { return "greenAlien.gif"; } } filler/src/friendless/games/filler/player/Hugo.java0100640000076400007640000000204507224552024021360 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; /** * Hugo cycles through the colours one by one. * * @author John Farrell */ public class Hugo extends DumbRobotPlayer { public String getName() { return "Hugo"; } public int turn() { return cycle_turn(); } } filler/src/friendless/games/filler/player/HumanFillerPlayer.java0100640000076400007640000000355107224552024024044 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; /** * A player controlled from the GUI. * * @author John Farrell */ public class HumanFillerPlayer extends AbstractFillerPlayer { protected int otherPlayerColour; protected int chosenColour; public String getName() { return "Human"; } public String getFullName() { return getName(); } public boolean requiresButtons() { return true; } public int turn() { while (true) { synchronized (this) { try { wait(); break; } catch (InterruptedException ie) { continue; } } } return chosenColour; } public boolean colourChosen(int c) { if (c == otherPlayerColour) return false; chosenColour = c; synchronized (this) { notifyAll(); } return true; } public final int takeTurn(FillerModel model, int otherPlayerColour) { this.otherPlayerColour = otherPlayerColour; return turn(); } } filler/src/friendless/games/filler/player/Isadora.java0100640000076400007640000000210007224552024022030 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; /** * Isadora chooses the colour which gets her the most points immediately. * * @author John Farrell */ public class Isadora extends RobotPlayer { public String getName() { return "Isadora"; } public int turn() { return mostTurn(); } } filler/src/friendless/games/filler/player/Luigi.java0100664000076400007640000000246007224552024021536 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Expands to reach the centre of the board, then occupies all the space in the * centre. * * @author John Farrell */ public class Luigi extends RobotPlayer { public static final int target = makeIndex(FillerSettings.COLUMNS / 2, FillerSettings.ROWS / 2); public String getName() { return "Luigi"; } public int turn() { int attempt = targetTurn(target); if (attempt < 0) attempt = mostTurn(); return attempt; } } filler/src/friendless/games/filler/player/Mainoumi.java0100640000076400007640000000272607224552024022242 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; /** * Mainoumi is deliberately obstructive. He chooses the colour which will stop * his opponent from scoring the most. * Named for the sumo wrestler known as the Mighty Mite. * * @author John Farrell */ public class Mainoumi extends RobotPlayer { public String getName() { return "Mainoumi"; } public int turn() { int attempt = mostIfWinTurn(); if (attempt < 0) { attempt = opponentMostTurn(); if (attempt == colour) attempt = expandTurn(); } if (attempt < 0) attempt = mostTurn(); return attempt; } public String getIcon() { return "greenAlien.gif"; } } filler/src/friendless/games/filler/player/Makhaya.java0100664000076400007640000000254407224552024022043 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; /** * Makhaya is an experimental strategy. He chooses the colour which will most * stop him from expanding. * Named for South African cricketer Makhaya Ntini. * * @author John Farrell */ public class Makhaya extends RobotPlayer { public String getName() { return "Makhaya"; } public int turn() { int attempt = dontExpandTurn(); if (attempt == colour) attempt = -1; if (attempt < 0) attempt = mostTurn(); return attempt; } public String getIcon() { return "greenAlien.gif"; } } filler/src/friendless/games/filler/player/Margaret.java0100664000076400007640000000250207224552024022224 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Margaret plays like Luigi till she gets 400 points, then plays like Isadora. * * @author John Farrell */ public class Margaret extends RobotPlayer { public static final int target = FillerModel.makeIndex(FillerSettings.COLUMNS / 2,FillerSettings.ROWS / 2); public String getName() { return "Margaret"; } public int turn() { if (score < 400) { return targetTurn(target); } else { return mostTurn(); } } } filler/src/friendless/games/filler/player/Omar.java0100640000076400007640000000243707224552024021361 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; /** * Omar tries to maximise the distance from the origin of the pieces he * takes. * * @author John Farrell */ public class Omar extends LookaheadRobotPlayer { Evaluator eval = new ExpandEvaluator(); public String getName() { return "Omar"; } /** Chooses a colour to get the most points immediately **/ public int turn() { int attempt = lookahead(eval); if (attempt < 0) attempt = mostTurn(); return attempt; } } filler/src/friendless/games/filler/player/Rosita.java0100664000076400007640000000307107224552024021725 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Rosita aims to occupy the two spare corners of the board, then fill in the * remaining spaces. * * @author John Farrell */ public final class Rosita extends RobotPlayer { protected int[] goals; public String getName() { return "Rosita"; } public int turn() { if (goals == null) { goals = new int[2]; goals[0] = makeIndex(getX(origins[1]),getY(origins[0])); goals[1] = makeIndex(getX(origins[0]),getY(origins[1])); } int attempt = mostIfWinTurn(); if (attempt < 0) attempt = goalTurn(goals[0]); if (attempt < 0) attempt = goalTurn(goals[1]); if (attempt < 0) attempt = mostTurn(); return attempt; } } filler/src/friendless/games/filler/player/Shirley.java0100640000076400007640000000204307224552024022073 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; /** * Shirley chooses a colour randomly. * * @author John Farrell */ public class Shirley extends DumbRobotPlayer { public String getName() { return "Shirley"; } public int turn() { return random_turn(); } } filler/src/friendless/games/filler/player/Dieter.java0100664000076400007640000000300307224552024021673 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; import java.util.*; /** * An OptimalFillerPlayer which takes the shortest route to the centre of the * board. * If the centre of the board is taken, just occupies as much space as possible. * Named for Dieter Dengler. * * @author John Farrell */ public class Dieter extends OptimalRobotPlayer { public static final int GOAL = makeIndex(FillerSettings.COLUMNS / 2, FillerSettings.ROWS / 2); public String getName() { return "Dieter"; } public int turn() { BitSet colours = getBestGoalColours(GOAL); colours.clear(colour); colours.clear(otherPlayerColour); int attempt = chooseRandom(colours); if (attempt < 0) attempt = smartMostTurn(); return attempt; } } filler/src/friendless/games/filler/player/Manuelito.java0100664000076400007640000000240307224552024022417 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Manuelito always prefers to take the border. * * @author John Farrell */ public final class Manuelito extends RobotPlayer { boolean toggle; public String getName() { return "Manuelito"; } public int turn() { int attempt = borderTurn(); if (attempt < 0) attempt = expandTurn(); if (attempt < 0) attempt = mostTurn(); return attempt; } public String getIcon() { return "greenAlien.gif"; } } filler/src/friendless/games/filler/player/Cochise.java0100640000076400007640000000261607224552024022037 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Cochise expands aggressively towards the opponent's origin. * When he gets to 400 points, he starts playing like Che. * * @author John Farrell */ public class Cochise extends RobotPlayer { private Point target; public String getName() { return "Cochise"; } public int turn() { int attempt; if (score < 400) { attempt = expandTurn(); } else { attempt = furthest_border_turn(); if (attempt < 0) attempt = mostFreeTurn(); } if (attempt < 0) attempt = mostTurn(); return attempt; } } filler/src/friendless/games/filler/player/Che.java0100640000076400007640000000247207224552024021161 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Che always prefers to take the border, but he is a little bit smarter than * Manuelito in that he takes the border position furthest from his origin. * * @author John Farrell */ public final class Che extends RobotPlayer { boolean toggle; public String getName() { return "Che"; } public int turn() { int attempt = furthest_border_turn(); if (attempt < 0) attempt = mostTurn(); return attempt; } public String getIcon() { return "greenAlien.gif"; } } filler/src/friendless/games/filler/player/Jefferson.java0100664000076400007640000000377507224552024022420 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.awt.*; import friendless.games.filler.*; /** * Jefferson tries multiple stratgies, and takes the one which gets the most votes. * Named for Thomas Jefferson and William Jefferson Clinton. * * @author John Farrell */ public final class Jefferson extends RobotPlayer { public static final int target = FillerModel.makeIndex(FillerSettings.COLUMNS / 2, FillerSettings.ROWS / 2); public String getName() { return "Jefferson"; } public int turn() { int attempt = mostIfWinTurn(); if (attempt >= 0) return attempt; int[] votes = new int[FillerSettings.NUM_COLOURS]; addVote(votes, furthest_border_turn()); addVote(votes, mostTurn()); addVote(votes, expandTurn()); addVote(votes, targetTurn(origins[1])); addVote(votes, targetTurn(target)); int best = -1; int bestVotes = -1; votes[colour] = -1; for (int i=0; i bestVotes) { bestVotes = votes[i]; best = i; } } return best; } void addVote(int[] votes, int vote) { if (vote < 0) return; votes[vote]++; } public String getIcon() { return "blueAlien.gif"; } } filler/src/friendless/games/filler/player/Sachin.java0100664000076400007640000000504407224552024021673 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import friendless.games.filler.*; import java.util.*; /** * An OptimalFillerPlayer which combines the strategies of Dieter and Wanda. * Named for Sachin Tendulkar. * * @author John Farrell */ public class Sachin extends OptimalRobotPlayer { public static final int CENTRE = FillerModel.makeIndex(FillerSettings.COLUMNS / 2, FillerSettings.ROWS / 2); protected int[] goals; public String getName() { return "Sachin"; } public int turn() { if (goals == null) { goals = new int[3]; goals[0] = CENTRE; goals[1] = makeIndex((getX(origins[0]) * 2 + getX(origins[1]))/3,getY(origins[1])); goals[2] = makeIndex(getX(origins[1]),(getY(origins[0]) + getY(origins[1]))/3); } int attempt = mostIfWinTurn(); if (attempt < 0) attempt = anyBestGoalColour(goals[0]); if (attempt < 0) { int d1 = space.distance[goals[1]]; int d2 = space.distance[goals[2]]; if (d1 > 0 || d2 > 0) { boolean swap = (d1 <= 0) || (d2 >= 0 && d2 < d1); if (swap) { int temp = goals[1]; goals[1] = goals[2]; goals[2] = temp; } attempt = anyBestGoalColour(goals[1]); if (attempt < 0) attempt = anyBestGoalColour(goals[2]); } } if (attempt < 0) attempt = expandTurn(); if (attempt < 0) attempt = mostFreeTurn(); if (attempt < 0) attempt = mostTurn(); return attempt; } protected int anyBestGoalColour(int goal) { BitSet colours = getBestGoalColours(goal); colours.clear(colour); colours.clear(otherPlayerColour); int attempt = chooseRandom(colours); return attempt; } } filler/src/friendless/games/filler/player/RemotePlayer.java0100664000076400007640000000371607224552024023102 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler.player; import java.io.IOException; import friendless.games.filler.AbstractFillerPlayer; import friendless.games.filler.FillerModel; import friendless.games.filler.remote.RemoteConnection; import friendless.games.filler.remote.IsMessage; import friendless.games.filler.remote.IsMessageID; /** * A player controlled from the GUI. * * @author John Farrell */ public class RemotePlayer extends AbstractFillerPlayer { public String getName() { return "Remote"; } public String getFullName() { return getName(); } public boolean colourChosen(int c) { return true; } public boolean requiresButtons() { return false; } public int takeTurn(FillerModel model, int otherPlayerColour) { return turn(); } public int turn() { try { IsMessage msg = RemoteConnection.getInstance().receiveMessage(); if (msg.getMessageId() == IsMessageID.MSGID_GAME_MOVE) { System.out.println("Remote player selecting: "+msg.getPayload()[0]); return msg.getPayload()[0]; } else { return 0; } } catch (IOException e) { e.printStackTrace(); return 0; } } } filler/src/friendless/games/filler/TournamentResultsPanel.java0100664000076400007640000000764107224552024023675 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.games.filler; import java.awt.*; import java.util.*; import javax.swing.*; import javax.swing.table.*; import friendless.games.filler.player.*; /** * A Panel to show results of a running tournament *

* TournamentResultsPanel uses the Singleton Design Pattern. This means that instead of constructing using new, * you call the getInstance method to access the single instance. e.g. TournamentResultsPanel.getInstance(resources).clearText() * @author Lang Sharpe */ public class TournamentResultsPanel extends JPanel { private JTextArea textArea; private JScrollPane textScroll; private JTable pointsTable; private TournamentPointsTable tableModel; private JScrollPane tableScroll; private static TournamentResultsPanel instance; private ResourceBundle resources; private TournamentResultsPanel(ResourceBundle resources) { super(); this.resources = resources; textArea = new JTextArea("Results from any Tournaments will be displayed here"); textArea.setEditable(false); textScroll = new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); tableScroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); add("Center", textScroll); } /** * @return the Singleton instance */ public static TournamentResultsPanel getInstance(ResourceBundle resources) { if (instance == null) { instance = new TournamentResultsPanel(resources); } return instance; } /** Add text to text area of panel */ public void addText(String str) { String temp = textArea.getText(); textArea.setText(temp+str); } /** Remove text from text area of panel */ public void clearText() { textArea.setText(""); } /** Add match to round robin table. Call must be preceded by newTournament with round robin as rules */ public void addMatch(PlayerWrapper[] players, int[] scores){ tableModel.addMatch(players, scores); } /** Call when a tournament is about to begin. The panel will be adjusted to get ready to display results */ public void newTournament(TournamentRules rules,PlayerWrappers players){ switch (rules.rules) { case TournamentRules.ROUND_ROBIN: this.removeAll(); tableModel = new TournamentPointsTable(resources, players); pointsTable = new JTable(tableModel); tableScroll.setViewportView(pointsTable); tableScroll.setPreferredSize(new Dimension(1, pointsTable.getRowHeight() * (pointsTable.getRowCount() +1))); setLayout(new BorderLayout(4,4)); add("Center", new JSplitPane(JSplitPane.VERTICAL_SPLIT, tableScroll, textScroll )); break; case TournamentRules.BASHO: case TournamentRules.KNOCKOUT: case TournamentRules.CHALLENGE: default: this.removeAll(); setLayout(new BorderLayout(4,4)); add("Center", textScroll); break; } this.clearText(); } } filler/src/friendless/awt/0040775000076400007640000000000007224552024014551 5ustar johnjohnfiller/src/friendless/awt/HCodeLayout.java0100600000076400007640000002201607224552024017560 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.awt; import java.awt.*; import java.util.*; /** * A layout which allows components to be horizontally arrayed and take up * all available space in a sensible fashion. * Like Boxlayout only better and written earlier. * See VCodeLayout for documentation of codes. * * @see VCodeLayout * @author John Farrell */ public final class HCodeLayout implements LayoutManager { private int hgap; private String usual; private Hashtable codes; private boolean debug; /** By default, components are centred vertically within the row. */ public HCodeLayout() { this("",4,false); } /** @param hgap specifies the vertical distance between components. * Horizontal distance is always decided by the layout. */ public HCodeLayout(String usual, int hgap) { this(usual,hgap,false); } public HCodeLayout(String usual, int hgap, boolean debug) { if (usual == null) usual = ""; this.usual = usual; this.hgap = hgap; this.codes = new Hashtable(); this.debug = debug; } public void addLayoutComponent(String code, Component comp) { codes.put(comp,code); } private boolean hasCode(StringBuffer code, char c) { for (int i=0; i 0) { exCount += ex; } else { width += d.width; } width += hgap; } width -= hgap; // calculate size to expand zero height components to if (width >= actualWidth) { // preferred size is too big, so try minimum size min = true; width = 0; for (int i=0; i 0) { exCount += ex; } else { width += d.width; } width += hgap; } width -= hgap; expansion = 0; if ((exCount > 0) && (width < actualWidth)) { expansion = (actualWidth - width) / exCount; } } else if (exCount == 0) { // no expandable components min = false; expansion = 0; } else { min = false; expansion = (actualWidth-width)/exCount; } // layout width = insets.left; for (int i=0; i 0) { h = expansion * ex; v = 0; } else { h = d.width; v = d.height; } // figure out vertical placement int top = insets.top; if (hasCode(code,'f')) { v = actualHeight; } else if ((v == 0) || (v > actualHeight)) { v = actualHeight; } if (hasCode(code,'b')) { top = actualHeight + insets.top - v; } else if (hasCode(code,'t')) { top = insets.top; } else { top = insets.top + (actualHeight - v)/2; } // place it cs[i].setBounds(width,top,h,v); width += h; width += hgap; } } /** Returns the minimum size on which this component may be drawn. **/ public Dimension minimumLayoutSize(Container parent) { int height = 0, width = 0; Component[] cs = parent.getComponents(); for (int i=0; i height) { height = d.height; if (debug) System.out.println("HCodeLayout: calc min: " + cs[i]); } } Dimension sz = new Dimension(width - hgap,height); Insets insets = parent.getInsets(); if (insets == null) insets = new Insets(0,0,0,0); sz.width += insets.left + insets.right; sz.height += insets.top + insets.bottom; if (debug) { System.out.println("HCodeLayout: Minimum = " + sz); } return sz; } /** * Returns the preferred size that this container would be if all * components told the truth about their size. Canvases are notorious * liars. */ public Dimension preferredLayoutSize(Container parent) { int height = 0, width = 0; Component[] cs = parent.getComponents(); for (int i=0; i height) { height = d.height; if (debug) System.out.println("HCodeLayout: calc pref: " + cs[i]); } } Dimension sz = new Dimension(width - hgap,height); Insets insets = parent.getInsets(); if (insets == null) insets = new Insets(0,0,0,0); sz.width += insets.left + insets.right; sz.height += insets.top + insets.bottom; return sz; } /** This method is empty. **/ public void removeLayoutComponent(Component comp) { } /** Returns a summary of this object as a string. **/ public String toString() { return getClass().getName(); } } filler/src/friendless/awt/VCodeLayout.java0100600000076400007640000002207107224552024017577 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.awt; import java.awt.*; import java.util.*; /** * A layout which allows components to be vertically stacked. * Each component has constraints which are a cryptic string. * "x" means expand the component along the mainm axis. * Multiple instances of "x" mean to expand a proportionately larger amount, * e.g. a component with "xx" will expand twice as much as one with "x". * "+x" means this component's constraints are the layout's usual, with an * additional "x". * "-x" means this component's constraints are the layout's usual but with * one less "x". * "+" and "-" can be used for all codes. * "f" means fill along the minor axis. * "l" ("t") means left (top) justify the component. * "r" ("b") mean right (bottom) justify the component. * * @see HCodeLayout * @author John Farrell */ public final class VCodeLayout implements LayoutManager { private int vgap; private String usual; private Hashtable codes; private boolean debug; /** By default, components expand horizontally to fill the entire column. */ public VCodeLayout() { this("",4,false); } /** @param vgap specifies the vertical distance between components. */ public VCodeLayout(String usual, int vgap) { this(usual,vgap,false); } public VCodeLayout(String usual, int vgap, boolean debug) { if (usual == null) usual = ""; this.usual = usual; this.vgap = vgap; this.codes = new Hashtable(); this.debug = debug; } public void addLayoutComponent(String code, Component comp) { codes.put(comp,code); } private boolean hasCode(StringBuffer code, char c) { for (int i=0; i 0) { exCount += ex; } else { height += d.height; } height += vgap; } height -= vgap; // calculate size to expand zero height components to if (height >= actualHeight) { // preferred size is too big, so try minimum size min = true; height = 0; for (int i=0; i 0) { exCount += ex; } else { height += d.height; } height += vgap; } height -= vgap; expansion = 0; if ((exCount != 0) && (height < actualHeight)) { expansion = (actualHeight - height) / exCount; } } else if (exCount == 0) { // no expandable components min = false; expansion = 0; } else { min = false; expansion = (actualHeight-height)/exCount; } // layout height = insets.top; for (int i=0; i 0) { h = expansion * ex; v = 0; } else { h = d.height; v = d.width; } // figure out horizontal placement int left = 0; if (hasCode(code,'f')) { v = actualWidth; } else if ((v == 0) || (v > actualWidth)) { v = actualWidth; } if (hasCode(code,'l')) { left = insets.left; } else if (hasCode(code,'r')) { left = actualWidth + insets.left - v; } else { left = insets.left + (actualWidth - v)/2; } // place it cs[i].setBounds(left,height,v,h); height += h; height += vgap; } } /** Returns the minimum size on which this component may be drawn. **/ public Dimension minimumLayoutSize(Container parent) { int height = 0, width = 0; Component[] cs = parent.getComponents(); for (int i=0; i width) width = d.width; } Dimension sz = new Dimension(width,height-vgap); Insets insets = parent.getInsets(); if (insets == null) insets = new Insets(0,0,0,0); sz.width += insets.left + insets.right; sz.height += insets.top + insets.bottom; return sz; } /** * Returns the preferred size that this container would be if all * components told the truth about their size. Canvases are notorious * liars. */ public Dimension preferredLayoutSize(Container parent) { int height = 0, width = 0; Component[] cs = parent.getComponents(); for (int i=0; i width) width = d.width; } Dimension sz = new Dimension(width,height-vgap); Insets insets = parent.getInsets(); if (insets == null) insets = new Insets(0,0,0,0); sz.width += insets.left + insets.right; sz.height += insets.top + insets.bottom; return sz; } public void removeLayoutComponent(Component comp) { codes.remove(comp); } /** Returns a summary of this object as a string. **/ public String toString() { return getClass().getName(); } } filler/src/friendless/awt/SplashScreen.java0100600000076400007640000000314207224552024017771 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. package friendless.awt; import java.awt.*; import javax.swing.*; /** * A splash screen. * This is just a Window with an ImageIcon in it. * * @author John Farrell */ public class SplashScreen extends Window { Frame frame; private SplashScreen(Frame frame, ImageIcon img) { super(frame); this.frame = frame; add("Center",new JLabel(img)); pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setLocation((screenSize.width-img.getIconWidth())/2,(screenSize.height-img.getIconHeight())/2); } public void close() { setVisible(false); dispose(); frame.dispose(); } public static SplashScreen show(ImageIcon img) { SplashScreen ss = new SplashScreen(new Frame("dummy"),img); ss.show(); return ss; } } filler/res/0040775000076400007640000000000007224552024011622 5ustar johnjohnfiller/res/friendless/0040775000076400007640000000000007224552024013760 5ustar johnjohnfiller/res/friendless/games/0040775000076400007640000000000007224552024015054 5ustar johnjohnfiller/res/friendless/games/filler/0040775000076400007640000000000007224552024016331 5ustar johnjohnfiller/res/friendless/games/filler/defaultAlien.gif0100640000076400007640000000171307224552024021406 0ustar johnjohnGIF89a{{{{!,@ ApaCHH3"LX!G+N1ˆ!-Q FPHp1I9'K+m`@Ø&Q Zr'W6paNTYBp^O * ԤՂDMr\:ji۽j|TkeԪTq׏.;filler/res/friendless/games/filler/defaultHuman.gif0100640000076400007640000000201007224552024021415 0ustar johnjohnGIF89a{{cΔ!,@ *" Q"R, `GtH‚+F4˗0_bR \ $UFS'ˁ3cL&FɐП*R,ihG@~"ДB4 iE۞ wnK3-˶I:<4pP/Uy1@B#u;kEYy 7;YHa9&.GC x`ډ.x/)kυӷ]Z;filler/res/friendless/games/filler/resources_pl.properties0100644000076400007640000001177107224552024023156 0ustar johnjohnfiller.title=Filler w Javie filler.title.settings=Ustawienia Fillera filler.filename.splash=splash.gif filler.string.choose=Wybierz gracza filler.string.h2h=Twarz\u0105 w twarz filler.string.wins=wygrywa filler.string.cfgplayers=Konfiguruj dost\u0119pne postacie filler.string.cfgtourn=Konfiguruj gr\u0119 turniejow\u0105 filler.string.rankings=Ranking graczy filler.string.h2hrec=Zapiski gry twarz\u0105 w twarz filler.string.choose2edit=Wybierz posta\u0107 do edycji filler.string.addhumanplayer=Dodaj posta\u0107 filler.string.editplayer=Edytuj posta\u0107 filler.string.playerdescription=Kr\u00f3tki opis stategii i mo\u017cliwo\u015bci gracza komputerowego. filler.string.tourndescription=Kr\u00f3tki opis przepis\u00f3w turnieju. filler.string.tournrules filler.string.help=Jak gra\u0107 i takie tam. filler.label.continuous=Ci\u0105g\u0142a gra filler.label.description=Opis filler.label.players=Postacie filler.label.settings=Ustawienia filler.label.play=Nowa gra filler.label.ok=OK filler.label.cancel=Przerwij filler.label.tournament=Turniej filler.label.playtournament=Rozegraj turniej filler.label.rankings=Ranking filler.label.tournrules=Przepisy filler.label.roundrobin=Ka\u017cdy z ka\u017cdym filler.label.knockout=Eliminacja filler.label.basho=Basho filler.label.challenge=Turniej filler.label.enable=Ustaw filler.label.addplayer=Dodaj filler.label.help=Pomoc filler.ranking.NOVICE=Maezumo filler.ranking.CLASSA=Jonokuchi filler.ranking.CLASSB=Jonidan filler.ranking.CLASSC=Sandanme filler.ranking.CLASSD=Makushta filler.ranking.EXPERT=Juryo filler.ranking.MASTER=Maegashira filler.ranking.INTLMASTER=Komosubi filler.ranking.GRANDMASTER=Sekiwake filler.ranking.SUPERGRANDMASTER=Ozeki filler.ranking.WORLDCHAMPION=Yokozuna filler.mainpanel.name=Nowa gra filler.settings.name=Ustawienia filler.string.matchresult={0} wygra\u0142 z {1}, {2} do {3}. filler.string.cantload=Nie mo\u017cna uruchomi\u0107 postaci: {0}. filler.string.challenges={0} wyzywa {1}, m\u00f3wi\u0105c, \u017ce zdob\u0119dzie {2} punkt\u00f3w. filler.string.knockoutwinner=Niepodwa\u017calnym zwyci\u0119zc\u0105 jest {0}. filler.string.bashowinner=Zwyci\u0119zc\u0105 pojedynku jest {0}. filler.string.basholeader={0} wygra\u0142 ju\u017c {1} pojedynk\u00f3w. filler.string.winner={0} wygra\u0142! description.Human={0} jest bardzo przebieg\u0142ym graczem i na dodatek nie znosi przegrywa\u0107. description.Dieter={0} b\u0142yskawicznie przenosi punkt centralny, a potem eksploduje. description.Sachin={0} szybko zajmuje dwa strategiczne punkty planszy. description.Aleksandr={0} jest sprytnym graczem, kt\u00f3ry zajmuje najlepszy r\u00f3g planszy. description.Wanda={0} stara si\u0119 zaj\u0105\u0107 strategiczne pola na planszy. description.Margaret={0} gra strategicznie dopuki nie zbierze 400 punkt\u00f3w, a p\u00f3\u017aniej zbiera naj\u0142atwiejsze pola. description.Basil={0} po prostu rozszerza sw\u00f3j obszar najszybciej jak potrafi. description.Che={0} zajmuje pola wzd\u0142u\u017c brzegu planszy. description.Claudius={0} przesuwa si\u0119 do twojego punktu startowego. description.Cochise={0} agresywnie zajmuje pola, po czym ataku wzd\u0142u\u017c brzegu planszy. description.Eldine={0} gra mieszaj\u0105c strategie defensywne i ofensywne. description.Hugo={0} wybiera kolory po kolei. description.Isadora={0} stara si\u0119 zebra\u0107 maksymaln\u0105 liczb\u0119 punkt\u00f3w w ka\u017cdej rundzie. description.Jefferson={0} miesza r\u00f3\u017cne strategie w demokratyczny spos\u00f3b. description.Luigi={0} zajmuje centrum planszy i rozprasza si\u0119 z niego. description.Mainoumi={0} wybiera najlepszy dla przeciwnika kolor frustruj\u0105c go. description.Makhaya={0} gra bardzo defensywnie. description.Manuelito={0} zajmuje powoli pola wzd\u0142u\u017c brzegu planszy. description.Omar={0} u\u017cywa technik sztucznej inteligencji aby znale\u017a\u0107 najlepszy ruch. description.Rosita={0} stara si\u0119 zaj\u0105\u0107 przeciwleg\u0142y r\u00f3g planszy. description.Shirley={0} wybiera losowo kolory. description.roundrobin=Wszyscy graj\u0105 ze wszystkimi. Nie ma tutaj zwyci\u0119zcy. description.knockout=Przegrywaj\u0105cy odpada. Zwyci\u0119zc\u0105 jest ostatni niepokonany gracz. description.basho=Dobierani s\u0105 przeciwnicy o podobnej sile. Graj\u0105 tyle razy a\u017c jeden z nich ma niepodwa\u017caln\u0105 przewag\u0119. description.challenge=Gracze wybieraj\u0105 z kim chc\u0105 walczy\u0107. W tej grze nie ma zwyci\u0119zcy. W tym turnieju mog\u0105 uczestniczy\u0107 tylko gracze komputerowi. player.name.Human=Cz\u0142owiek player.name.Dieter=Dieter player.name.Sachin=Sachin player.name.Aleksandr=Aleksander player.name.Wanda=Wanda player.name.Margaret=Marysia player.name.Basil=Bazyli player.name.Che=Che player.name.Claudius=Klaudiusz player.name.Cochise=Koczis player.name.Eldine=Eldine player.name.Hugo=Hugo player.name.Isadora=Izydora player.name.Jefferson=Jefferson player.name.Luigi=Ludwik player.name.Mainoumi=Mainoumi player.name.Makhaya=Makhaya player.name.Manuelito=Manuel player.name.Omar=Omar player.name.Rosita=R\u00f3\u017ca player.name.Shirley=Shirley filler/res/friendless/games/filler/grayAlien.gif0100640000076400007640000000170607224552024020726 0ustar johnjohnGIF89a!!!JJJ{{{!, A ,(C `E1:8aȇ7vYl!3_r σ=``O<+ jԧΛ&65qË@ZTV]a~mX\ݙڳV wܗ^; 9-LvE>L_ MЧĀ;filler/res/friendless/games/filler/grayHuman.gif0100640000076400007640000000200207224552024020734 0ustar johnjohnGIF89a!!!"(mg"K"L|H" h$" r/@Dc\r@L! `@D hBrl hr@Dp@@rr@@/@;r@+rrA}rrArA]%@LXr@ALXhrr*XW"KL"K%$xK_H@@I(@;$ LL$ pp@@h44 @5Ňq brrI@ArrH@1#r rx@pDrccEqJLLLLݗ(<@@@!, *$hpÇ\E VQb7z!"?>< @˖.]&n)ăvʳOD %Φ:wB5P*ӧU*ӨjuV@֦ `ڵmlZ@kmSv  xW  p^wrJs Лt)O3 EZR֭-PcTk M[۹}ۆ; ;filler/res/friendless/games/filler/splash.gif0100640000076400007640000001477207224552024020314 0ustar johnjohnGIF89a&!)!11111999BJBJJ!JZJcJsJ{JJJcc1{{9JZcs{ތ19JRZ)11ck!)!)!!B!J!J!!k!s!)k))s)111111R!1c1c1B9B99Bc)B{B{9JBJBJJs1JJJZJZJZZ9ZZZcJcJccBcBcccsJsJssJsssJJ{R{JJZcތJJZk眥JJcss掠BBk{99s11ν{ν,&@) H*\ȰÇ#JHŋhȱǏ CIɓ(S\ɲ˗(œI͛8sQ&ϟ@ JTϢ5KXbd9*9eHAQߏ\=0Y"KYld9D+q׆ $zL3mSOruWo5HDM3VRQtX1Fýd|JdA#2jjÕv˪F@ $[4qpo T=E…Fx z$) (aͽ FJ s#OdQ7R5gMCe}b"ƕ`@eb @ÔsDI$Df z4yO1@1A W"G诃=! _'U҄J% gLм\9NHDDm(ҢY;M3%{d $YTq>(4 i ^e$8 |~Dz@%BIңɮek#sŗH1OP W%#HA}T#)0" H(@̰(C"8 WsTbgHȔM j J!AA&uh|6]w_޷~L `.>́#LLσ3m ҇CLL ux,_"'h N+:{S:T $CB Zwht (%wNoFM+ $'ILW&EkFB@3;pD$(Lm4CAa4 ܜQ](4; v=!rԑ%(uӫQrj SuZf x YBi1N  Eg%Vb+rdACI@ȱUb5H=\$Yl&K'`%2t#Kf3$"F'~ibHS)c  Ll~ ө\@e'KF%c*SOJOZF4u@@0! SCݍ>;d # 1ضʹ ayԙ`y5dI`ٝC@IYE=繞W֞{Qӡ Qn9p3$!PcJ"6RwI5rd@:6ucHdÑnpBd2DF4@6P#>DdC! pA1OP"ڣlX%`AFp3ZAfV`v`8TKC``Y Dv$/uq4"~f@*{g,a{wjuB7 Ȧ&q/զDK 8v8yd7j@@KP_Uu)q1u:!"eBAGo"i2P0#9i+Xp6Fq"WvT[xdZ0u92Ec!"J 8!puI"^/NR&1`8~"|gQQ#a& Q8ik$s;Vk~ysS(!ov.wVnPm5!QMPsHdX&c1;K^U@1xtl+17qEpm$1pm b!H=Y2FVaaiQl1{*Ak+!EGo&z QekV $ "b#`w"a7Jx!)#O'NLq"A,%]VE$c]UvBPk鴸z6m+JC=3>Q4$ g$ zVmcJ9vX(}Ecx#9'I@=Z+F!7t4 tfx }' DWl*if''ak-AdpMPI;iFܨTA8ʣ%1wHU(!u<;c ]WU˔&, j=G ${"PM6{^ 5 =&lr*c % tU{2%iUa2%uK"3±ӛ; O1bÛ~8#"}:Ei"2K,e"%zQx6hf$' !1[bLWe 6y{G{ y2l XzUQM;ztv6IX5Br@a;2V+O.bd lU#z, ק \% X\-ɜ \2R%a $}Z"78  LV6iv9~UMw͖J8[T A8jcq`g^!Y,a[hQbyyպf1u25qbx ;2 }>K懺(qԏ`vPO&|(Y-4au*'Qb˳!mUQQY{p tO&)}BUpp[ OMPelSQwAkV{=E24Qyxŕ-nܬlFZ`E狃\T6Wm, *< qwFL)!]2Clԭ+P1!Aw|;qWc ~`SG XY Lׁ чY}0̑0ʵg"Q,%|A51)C!b݁B$q;˲'at`V|F-!Udg;DGFC.."(M2;70::|̕X `q%oXu}8Hdq9@i2_'AV;<LdCTΜJ1"10im(f!^#ޕ/Xksŀtfzj P#w|%qw41h&~)ΏvCUL%Ahl*f^Ξ+"VI썵YtO JZ=4@X@ 8y)s`unx79o,RVᵽj R KK p' !Q*E{Pd2W$x10Mb/"gSYoSv 3z8UqHqjfJE%7hH"÷i+J!7Y8" ?dB"WFL1/}Z[d[6`}?VBȺ$Zi5eE ACWpktaC,Av7J58_uCI7?8`ߤ{-O֯x5 9HpOMx!!0x$aHDRd!E$Y)UdK1e΄$ AH"]!!Ɉ#EBE8 M'NZU4TNE)" {(4 I^f])]y%HH"HK$B$RI d !3I hc|g\pѝHoGnxi'O41#)$gΡ'&8d) !!D $3 $'_|zDZB ) $CPlY(h?γ3z誥^( F@$&  E*CCQG4D*1E[tcqFVF'1G{nGR/ 4HDrI&[RI(ܬB)r'r,.s042TDJ;filler/res/friendless/games/filler/resources.properties0100664000076400007640000001171307224552024022461 0ustar johnjohnfiller.title=Filler in Java filler.title.settings=Filler Settings filler.filename.splash=splash.gif filler.string.choose=Choose a player filler.string.h2h=Head to Head filler.string.wins=wins filler.string.cfgplayers=Configure available players filler.string.cfgtourn=Configure tournament play filler.string.rankings=Player rankings filler.string.h2hrec=Head to head records filler.string.choose2edit=Choose a player to edit filler.string.addhumanplayer=Add Player filler.string.editplayer=Edit Player filler.string.playerdescription=A brief description of the computer player's strategy and ability. filler.string.tourndescription=A brief description of the tournament rules. filler.string.help=How to play, and other stuff. filler.string.tournamentresults=Results of most recent tournaments. filler.string.endofround=End of round filler.string.network=Configure Network Settings filler.string.matchresult={0} defeats {1}, {2} points to {3}. filler.string.cantload="Can''t load player {0}. filler.string.challenges={0} challenges {1}, hoping for {2} points. filler.string.knockoutwinner=Knockout winner is {0}. filler.string.bashowinner=Winner of basho is {0}. filler.string.basholeader={0} leads the basho with {1} wins. filler.string.winner={0} wins! filler.label.continuous=Continuous filler.label.description=Description filler.label.players=Players filler.label.settings=Settings filler.label.play=Play filler.label.ok=OK filler.label.cancel=Cancel filler.label.tournament=Tournament filler.label.playtournament=Play Tournament filler.label.rankings=Rankings filler.label.tournrules=Rules filler.label.roundrobin=Round robin filler.label.knockout=Knockout filler.label.basho=Basho filler.label.challenge=Challenge filler.label.enable=Enable filler.label.addplayer=Add filler.label.help=Help filler.label.network=Network filler.label.tournamentresults=Results filler.label.played=Played filler.label.won=Won filler.label.lost=Lost filler.label.for=For filler.label.against=Against filler.ranking.NOVICE=Maezumo filler.ranking.CLASSA=Jonokuchi filler.ranking.CLASSB=Jonidan filler.ranking.CLASSC=Sandanme filler.ranking.CLASSD=Makushita filler.ranking.EXPERT=Juryo filler.ranking.MASTER=Maegashira filler.ranking.INTLMASTER=Komosubi filler.ranking.GRANDMASTER=Sekiwake filler.ranking.SUPERGRANDMASTER=Ozeki filler.ranking.WORLDCHAMPION=Yokozuna filler.mainpanel.name=Play filler.settings.name=Settings description.Human={0} is a player of great cunning, who doesn''t like losing. description.Dieter={0} moves to the centre with lightning speed, then explodes. description.Sachin={0} quickly occupies two strategic positions on the board. description.Aleksandr={0} is a clever player who occupies the best corner of the board. description.Wanda={0} attempts to occupy strategic locations on the board. description.Margaret={0} plays strategically until she has 400 points, then goes for easy points. description.Basil={0} simply expands as fast as possible. description.Che={0} expands along the edge of the board. description.Claudius={0} moves towards your origin. description.Cochise={0} expands aggressively, then attacks along the edge of the board. description.Eldine={0} plays a mixed-up defensive and aggressive strategy. description.Hugo={0} chooses the colours in order. description.Isadora={0} goes for the most points every turn. description.Jefferson={0} combines various strategies in a democratic process. description.Luigi={0} occupies the centre of the board and expands from there. description.Mainoumi={0} chooses the best colour for his opponent, to frustrate them. description.Makhaya={0} plays very defensively. description.Manuelito={0} expands slowly along the edge of the board. description.Omar={0} uses artificial intelligence techniques to find the best move. description.Rosita={0} attempts to take over the far corners of the board. description.Shirley={0} chooses colours randomly. description.Remote={0} is a player on another computer. description.roundrobin=All players play all other players. There is no winner. description.knockout=Once a player is defeated, they drop out. The winner is the last player undefeated. description.basho=Matches are against opponents of equal strength, until a clear winner is found. description.challenge=Players choose who they would like to play. There is no winner. Only robots may participate. player.name.Human=Human player.name.Dieter=Dieter player.name.Sachin=Sachin player.name.Aleksandr=Aleksandr player.name.Wanda=Wanda player.name.Margaret=Margaret player.name.Basil=Basil player.name.Che=Che player.name.Claudius=Claudius player.name.Cochise=Cochise player.name.Eldine=Eldine player.name.Hugo=Hugo player.name.Isadora=Isadora player.name.Jefferson=Jefferson player.name.Luigi=Luigi player.name.Mainoumi=Mainoumi player.name.Makhaya=Makhaya player.name.Manuelito=Manuelito player.name.Omar=Omar player.name.Rosita=Rosita player.name.Shirley=Shirley player.name.Remote=Remotefiller/res/friendless/games/filler/resources_nl.properties0100664000076400007640000001153607224552024023155 0ustar johnjohnfiller.title=Filler in Java filler.title.settings=Filler Instellingen filler.filename.splash=splash.gif filler.string.choose=Kies een speler filler.string.h2h=En tegen n filler.string.wins=wint filler.string.cfgplayers=Stel beschikbare spelers in filler.string.cfgtourn=Zet een toernooi op filler.string.rankings=Scorelijst spelers filler.string.h2hrec=En tegen n geschiedenis filler.string.choose2edit=Welke speler wil je veranderen? filler.string.addhumanplayer=Speler toevoegen filler.string.editplayer=Speler veranderen filler.string.playerdescription=Een korte omschrijving van de mogelijkheden en strategie van de computer. filler.string.tourndescription=Een korte omschrijving van de regels van een toernooi. filler.string.help=Hoe je moet spelen (en andere dingen). filler.label.continuous=Doorgaand filler.label.description=Omschrijving filler.label.players=Spelers filler.label.settings=Instellingen filler.label.play=Speel filler.label.ok=OK filler.label.cancel=Annuleren filler.label.tournament=Tournooi filler.label.playtournament=Speel een tournooi filler.label.rankings=Score filler.label.tournrules=Regels filler.label.roundrobin=Round Robin filler.label.knockout=Knockout filler.label.basho=Basho filler.label.challenge=Uitdaging filler.label.enable=Aan filler.label.addplayer=Toevoegen filler.label.help=Help filler.ranking.NOVICE=Maezumo filler.ranking.CLASSA=Jonokuchi filler.ranking.CLASSB=Jonidan filler.ranking.CLASSC=Sandanme filler.ranking.CLASSD=Makushita filler.ranking.EXPERT=Juryo filler.ranking.MASTER=Maegashira filler.ranking.INTLMASTER=Komosubi filler.ranking.GRANDMASTER=Sekiwake filler.ranking.SUPERGRANDMASTER=Ozeki filler.ranking.WORLDCHAMPION=Yokozuna filler.mainpanel.name=Spelbord filler.settings.name=Instellingen filler.string.matchresult={0} verslaat {1}, {2} punten naar {3}. filler.string.cantload="Kan speler {0} niet laden. filler.string.challenges={0} daagt {1} uit en hoopt op {2} punten. filler.string.knockoutwinner=Knockout winnaar is {0}. filler.string.bashowinner=Winnaar van Basho is {0}. filler.string.basholeader={0} leidt de Basho met {1} overwinningen. filler.string.winner={0} wint! description.Human={0} is een uitstekende speler die niet van verliezen houdt! description.Dieter={0} raast naar het midden, en ontploft. description.Sachin={0} bezet snel twee strategische posities op het bord. description.Aleksandr={0} is een slimme speler die snel de beste hoek op het bord bezet. description.Wanda={0} probeert strategische posities op het bord te bezetten. description.Margaret={0} speelt stratigisch totdat ze 400 punten heeft, maar gaat daarna door voor de makkelijke punten. description.Basil={0} groeit gewoon zo snel mogelijk description.Che={0} groeit over de zijkanten van het bord. description.Claudius={0} beweegt naar jouw punt van oorsprong. description.Cochise={0} breidt agressief uit en valt vervolgens aan via de zijkanten van het bord. description.Eldine={0} speelt met zowel een defensiefe als een offensieve strategie. description.Hugo={0} kiest de kleuren volgens een volgorde. description.Isadora={0} probeert elke beurt zoveel mogelijk punten te winnen description.Jefferson={0} combineert verschillende strategieen in een democratische manier. description.Luigi={0} bezet het midden van het bord en gaat van daar uit verder. description.Mainoumi={0} kiest de beste kleur van z'n tegenstander om die te ergeren. description.Makhaya={0} speelt erg defensief. description.Manuelito={0} breidt langzaam langs de zijkanten van het bord uit. description.Omar={0} gebruikt kunstmatige intelligentie-technieken om de beste zet te kiezen. description.Rosita={0} probeert de verste hoeken van het bord te veroveren. description.Shirley={0} probeert de kleuren op goed geluk. description.roundrobin=Alle spelers spelen tegen alle andere spelers. Er is geen winnaar. description.knockout=Wanneer een speler verliest, valt hij weg. Diegene die als laatste overblijft, wint. description.basho=Wedstrijden worden tegen gelijkwaardige tegenstanders gespeeld, totdat daaruit een winnaar naar voren komt. description.challenge=Spelers kiezien tegen wie zij willen spelen. Er is geen winnaar. Alleen robots mogen meedoen. player.name.Human=Menselijk player.name.Dieter=Dieter player.name.Sachin=Sachin player.name.Aleksandr=Aleksandr player.name.Wanda=Wanda player.name.Margaret=Margaret player.name.Basil=Basil player.name.Che=Che player.name.Claudius=Claudius player.name.Cochise=Cochise player.name.Eldine=Eldine player.name.Hugo=Hugo player.name.Isadora=Isadora player.name.Jefferson=Jefferson player.name.Luigi=Luigi player.name.Mainoumi=Mainoumi player.name.Makhaya=Makhaya player.name.Manuelito=Manuelito player.name.Omar=Omar player.name.Rosita=Rosita player.name.Shirley=Shirleyfiller/res/friendless/games/filler/.thumbnails/0040775000076400007640000000000007224552024020555 5ustar johnjohnfiller/res/friendless/games/filler/.thumbnails/filler-screenshot.aa.gif.png0100664000076400007640000004151107224552024026036 0ustar johnjohnPNG  IHDRiV̮BjtEXtTitle/home/john/projects/filler/dist/res/friendless/games/filler/.thumbnails/filler-screenshot.aa.gif.pngyptEXtSoftwareNautilus ThumbnailHհ IDATxwW?UĞ< (KQ$ ؀-l IŰ˒9,V<I3ӹXv{NoW^ݺ@9+}濌Ο} gرK./bAwL|s ?_MK g~'4@~EQoT<(]]]L&rrr(EX,=Xnh4N$r`4WQɤ=6Et=;[O$I^TzL+WR9{6vv;&@ @ffeur ~NF}= 7XxwB4K{nHKKctt!JKK3gEEz(Do~TWWhѢ 9r;ɉ "D1H$lV8knx_O$ 0)L$I8NI>;ڻboߎj%`6r*++/={x :Ԅ Hidg3{d/iV.9Y'Zz={6GFFL>p8|od{`ddS< TUehȇa 04c ޟNi ^L>vOgu: .6+r. A2UV]555{\&/ \pwaw0eʔn\ng$O]&*j=P9+*xmӭ?tC S0w܋5k*|)++`Μe~E5ɑŤ?Fc^`S ϲ eX6]OȔ>MPqAvu}!UEQn޿Ww FX/[Luu|cŢHżK7]9#爪F.VLF1E );IViL E/ :o,< 4-ȈMKAfc:cN[i,L&#A3,lVډFc8vn7| l6STK(C"(L{{'v`لہǓAO Ӧc n=qz|4-AVV:Hii.ҜtwPPh4b4hllcٲۧB&uv7(PJWW]C)(ȡ&M0VZ[O`4('288owh4NVV:@蒍k<Ȉ3&ΌPP(Z"LXB[[|@==dfE_yX,fz{bz v,ѣL^ٴ֓IRq;v=D"B4'-96=!L&d2I"2 @8!PRO4'Lb40ܦ:qDfADl`6S#ŰZ-D"1l6 H$1MD1t]0RcMKTp8i f3"B<100ĉ%Qt)yOXP}I@ά^γŒ:nwȀtf~AEQZ+=ϗs>gp.yiz.4'Y]DY?qWzp0. 34mģcyh$-YFTF%E,ѤQɄ455H^.Hc]C"b׷D?_'""=iS ""|_Z]DUƽKg{SD QҼI,Y8}2F:$PudKr&e W$iYHH1NW׉XEKqNDi^^G7geǎgG_.s>wi#L4ꠡ1H~)>:$xrQ8L ZJq0UibppIrHy)?mud;"}eV썍HsQQ1ON}Ki-LNFhwJTHaS; 5w?"80a^=}QJKw#δ9J&qCSK}N;͕h ]Θ.zjN& 4 È2F*ÅHReh%OH${.AguFo{@se$HW4K2'K.vY߸>>,ssω*"_|mZiӟRƵA/^[+KUU۰A4U/uTWW'{NzzH .rwe6K&)/OJnk,fY&1D|1ũ1ť"JS\~[t];%Ȯgi㪬n[-VUNWo .'% ,h4i"4_,z.W5EkE"E"kSZ1UKe5oݺ='#ao*uy`fvv[-*T^B1%%|$ٙC< Tv&(!O&譏3E+"Gq# yySf "Np | ILFLfzqNYʰٖF^f9vMիYtDO<݆uUXJBDEb:۞kP\3H )LPҗ w fؿ @aw FҖ$f$b$I(Y'CWtEэ)Ԍ163Kadz!׀vRkhO'{<*S$eVe֭.reZD g:o"WJ>OJUU\:QDg]嶖DI*u(IE֭(244$wy\R&ĕZ,SSdjTыti".jnlnn !A~]AD~fDWgW=#˫+oH}TmJ8 ɲ>qvu_^2VINIJ-".fHsuAYDi^,4:!/K٤+F@NIfHO%RX:'`v -q-:f[m8> vO26hr[ڇ(Ffd%lL|)64-N44eSUEFѦ-`6SsgD{DE^(?"~CDD|AOhxA65/Adۧ\RUU%7}T; 򙧽c[!"ȧ>1e2bbx]^"H+/]\g4|M:X7vBZOyWA^{ GbljP|w+$h^H0> MjʊNZ&8QEŷ҇RS[ov1[QxQ;7ae}zWŒÄK&Q tz()"ey|$i|DŽ غu |t~GTd^(2n`st} ߄Eo#"wa=N'~s >%Mg|i>/LJ" B CvF衻|&/'͘!RZI3fxEĻx(RUU%_DjkVyoɏE@ +-|7OZzRvf L^-!;{"2CR)Rᝑlq W|L=;䏼?JRUU%/lxaRZbg*3"~U0gdȈ8::D7{&٤^t2/צW|It&% N9plQ~#kl&M~##%TW=<94bO AگMr8=8\b1Md/:<_fas~ c">{Dr1;+߅3߉ǂ;ңO0tma褊# Ych\ԢE\N.cn!F!F! #C%CFvNm'|iO_ݵÀv… 24ssG)z#<ڴߚdW_NqtwmKtͳGi~g qkho,LWVg,[eO`=\ʯc:.D\Kwa˃x<.\o6no':c1J7m]v1)T?Q^a*_潈(-ESِ{=}ZJًAOggkѷjOr\oNeϬh&IiSt}H=SZ_n)}wVfEd O",dsh£JH8G-4Oǯ*s=|9Y0z.KN3CwX}{t!lĤ~ᅡ93{ y| a"-z#RLMcXCn1[eu0 /?*%姈v.S 3Ђ |+mX~ұl ݖ/>#82?L8zNa}^3X,[,gcIZЏ%dKc~ Ld#zvK/M_+p$~ר/o3ZeBb^I˧xsw)o2D-+͔VŎq*`o}wP1QaimBݓu,}4- ղňH 7n䥵'xQrU V-gwJx12ۯL{WP:e7JD wR}.rZ7~ڥE('3yG4-<8 b_(+FBI{ ԗ+:%Gp SrݠSr=|gީ9_ lҌ9!ZZrpzQ'N ]]S:S?{nK>qIR\;=qxFlf`ƌn]|tfW8@#U<V=`g?އo*~mުϣS}~}zynٷ1uDm31ݹcjbk+ˏg8lqo2y)]͸;ft~>CN,~K~ v<0-A$P;bOc]MҋՋSq]Ѝ+{R7a]Spօ{M׌.nffIC@\=ctTˣg###dei^Q`J+NqO\: ph!*R~V 0tYB~C>#/3F96Eu/NmB޽ٓs v' NG tPR$S*FvQpo )8tyx  2ݘ*ȟϟyoyg/G`73]c9n!]{:˅>!B^_ ' )h)@Q 4Hta6^`is4I{^Lt23F3IOwt=S}\ZeBd.N|c&'~Q_ɉ urD,KEOwe2FZ|勴gt4@I2C%[L!˹0S?;:'zF<6#;mo,Ðŗd}Scua"Ԥuܽefַi؋n/&|7c3ջ3,${ ix=tsCxNz踲 S>)n'pM:1Iyw¡CϗE$"g3<<(puו+hj*hǍk`:mmTUh{6UȪeO}YTWC*0ytAWMK㍁Yat)No,$ё pSME46fꐗ(4ppcMLJKAܸu <޼ㅴkE6ҾBZ:~ lH9}mR^0H~7éqt*BnO==@Q,LGU4TU8}: eF#s[%/υјurb28h$340SkⰟHqNߘ7\ɉ 3:#_w|YSx(_lJÕ*VVLx ws/E+rJAEnf1|of&p,)(،c+;Kic)[)?RZdϒ5k7= 'fLy$hԆQH؆֨|v@"!8G" ;QrU!.tWbg'!qw8v0(8G|#8w!:ʲ^v횆rmB L܆[W0[ؿ6rewWzu ;wN꫽F9W_Ʈ]eMFBx㍩WܹZ[MLJ_,W`~N,2H$R;9'1D>{c 1އ-+gZ?ꗦwв-?~j=߲Xtl2yrK$o/Kv5mlV6S]uwSutPz)m{i y{M37WI֟NaKo噕CNT{ٚ*ywsFlɤd\4x<:45ѨHHĊW -(N8lFUPȄ UMa @BZ$.ʲXLTb1#q%X$rIeL8)`tI41lLR%:X(ݓ-]C!$d 1$Fdk,r-XEҙK$ pCRց#3%63Hp&D )-2Փ9j9jf#F݂5be7%& v^6o+7>U3˚5A5YfM2mbP/o\Y'99QYdedݺÒɵ+!63.7=*]wTl\}l!ٲA\΀|.֭o۲n5vWrsd),<%+Vt˄ eiz?_`ALn!Aٺy&'XLO4-]~wJݛ)GEn&G<)HDx B[ϼ)ii>y}^k߽VNJʕrB>/˦MdN_*FyIiACR^aD}^v9ɎDK%JȡM/HYZ~{D")8? r3@7 ,S(S LSAE;uQ cWg (*Y *q-bd<`M&'!&YY5[ݠSO7 3vRׂ 7}ȬYAf ōR\zΎG%#Ck۝k9(vƍjeӦCb$d˖#b2huՋMnɖ- ƍ%=}DV>!OTWwIAA|㟗 7l+eʔ 8FfɎg^ M^kJ]n?&DB/x\~;^K8,tvy{ ucdd Klnv\B&L~{E|E+I}Sώ> &8,IWR^sP.rp͇%aN_b_# v?Q3Fc* lN`BNV 5X1DTl3GDnup8Rh'I]i.V%B2iCeČ\%hͪ1`3r5FLTbjdx $/hLP a rW5M65l#-G$ WIzu?ڵUWIqWFU,iy("lMwI"-!{#)/}t]nsX"r_Hh.8-zN\nw*<-- (QHK *1 !!t23:deEuHJ\q@UEIbɔʣ\.bqN6iDyn2ed"33Dqp&։Df3 ,-*|J0 /HvΎˌ_\yeR&On53I lY8"+W֋*zu"W_]/GEeݺFQՄ[,k[`ڵ^F洸=|deERT*g/b9]p N )yqu]jRˌ^#ѨA֬imDNH-˗ɬ,YZ(EE=[Z&OMӤIҰbS~eU~uIamA~}a^_%1?#\|8VlV0L&p:# rzHKK٫?J4&==褥QPU3ј1l:fs UZLgBNnwƎEQL);#BdkCx 6K-ѤB_2mZxKf.Mb64$jU "W7Y$pqhKVZ%JVwS")N&eQNzj &Y$?M"HWDDiNZy~/e46X422FXq -ݮaxhi8GM+;1v{-#'(nnsZcqGnnQ^GCK[59G0mFN8q:mIialI+ηa4ŦlY8##eeq24,pRCide`SQ1`0<cA@C7܋6Xg'Z2F bNIϓrz sB_fҥUt5U<%KZljAET5"RS"pyE䉱{oTUUɍ7G}|K x%$bx^93)孢:U$SeӺ"{'D@Z>iZieA^~K.86bpVk+٬bIᙴ٬lNOX0fs8FzzJCӓXQ$N(nr0t22.0 9BU-j a4V`28I*Bv!Ό[,;|+!Fus[P?y!-^#~;>_5[r)tЗj\-yD/K,&sx[n믿~ycRUU%[mGNdžjKywڤC_D/"Ey/enZeѢq8:d޼dg{/iٲs98F߈UW_әЗ3΄_Ӟsq8>1e'WżqM`suQPO|o3%[(儮pwac"=$/ܧNZAWG2EكoH0 oP &,idh$eI0w-BU :G-$9 X 8՝[}ecJ߈$OCI(# ~`O[ɔd25%w2N;ft]OS(X;v ?[j$&fX,z$B#VN4`*bmӌFbшFD"SABq:b``*G20pbnQ6XL_;ض;M'~IԎ4iڦ *%+-UW$@o04!M1mJiCl4it b+4I4!/ǵڱu?q줭8?s>lo2OBI9APTQTzuwWnDQedb1 \+ss*IU3m=$BUlQ-1E8o_n7,-]iU`n.V6hO Kn 6M:dJZSb*zSiVVte*:4Xj &J2b0ԒJ)}Fr444T0קIttv (헙;PK,С350K}ah5O'uwKȲxA'٬\2>^ұ6A6D2:Z]7T'DQ`|h4Q(虙GQ d2A*OY飏2QIQJL':L$E]qpK ` VRݓ EοCCiTՄF 1c4Ƒe+vL8lU&p6\.߆-U~+oZ7r%  8)zuQM$c2ՓJj 2&)ʝ3v NgPHssd2ͮRSc)ce;--w4=ʓ~ŗQ3wrdfN'25Q ֘\( g>wO3?+sR+!>:t ܞ'8R)+6yH4%hDTFD55*>_ɖݴ‚mö" I֍1&TUK(Pq)Uevg,/Ƒ$+& 59$Ɋ![ࠋ׮98r$H3G~FooI=]] ".H0ܬ#OX_1~wSoLɠsɫ>D_"eN]<G6'pz+WqAGU^yΞw}g=K Ђk~f_'9_ϓ+LWqyV|;.9mW@!ԣ @ --ǼbTQ\zo @8l(Hcyٰ%[)k4ZqBAG2 b 1&!l6yh VC㲁:mt\LebQT\d#)ѵ@G8\cc(}@&4Q&5ҹILѨHl' v>"0,Ean^^gbYFGʕ.rrǏ{ti?ŋ<9ŋ{9yrws"{8z4`3}}Q1=]Ggg"mmZB5mRh4vD&S(dGL=97.]rsocqpۿk<ۼq1G+,\hMK$y^kz3g^=y{^`YǑ S.C<;G:hTH0tL D&S~cŊ'[IDATlD݆d*L`6ښXK&`#͡(h4z&S>L2:]Ad j^ۼHM$L4 kAFS&EߙhGtNF:3f}SZGΨd&rl1IV퇶Ie$JQhEdFtIfLnwI(HgIxT$ \j 347YYI`XH&ctbZ^rL{H0y "y*d9yod,ۢcu5G&ӆ((J91n#cƴITW'5Ѕ(o/Ms~ǫ8`;Чy8zTl7cm鳑f,jvJF6"o| wz@eyTnA@Rۨ%o2-~Sޚ;neݩ̭noM]nkoE[Cϲ\2>>Н*Pjۭv/2ՎV6olEUU AUUUj_];]ɻ ư>{u+ϰ\j8IENDB`filler/res/friendless/games/filler/.thumbnails/filler-screenshot.gif.png0100664000076400007640000004074207224552024025463 0ustar johnjohnPNG  IHDRiV̮BgtEXtTitle/home/john/projects/filler/dist/res/friendless/games/filler/.thumbnails/filler-screenshot.gif.pngltEXtSoftwareNautilus ThumbnailHհ IDATxwŝꞜ6٠ ZI(g I(b08altgӝ6q6`E`0I0JjN1ϾyyOwUW>UgM( m?v?W"wUxa- BB[}%kp*JSn3w^oaL?>_4.W/:h PXř3#y_ck8׏3?0fǻN;@W&hL;[=!vu2:;{9v͔)%,]:?hNeޖhvN(I1:BIAUӸ ql6n `0 "Dqm (Enn:>$vmf2`?n߁l&3ѭR\षo+qQ%ee[pa2Ήt.rKv @%V^i>jVFBxEn7/vpMzFùmM+튦iI}-l1H$HSp%E P~1p^TIfUdd^;1TuSZ%/O=&r#.oѨfMNۍ?Sb%ݝ0/G\o'h4ժ`X^Z׀(;q x$}3Ϣyox8n@^^@EQlWL\DFzӧlf'Gp8l *cjF _6GinB;uħAADf V1ylzzzZXV ~;i&钰>_Jff5Blh_='iaN45޷oVOzz:cccx<ʘ3gŗP7aŗ74!--ɓa"(%%$I,3Xk7\SF4 QdR!u`0(lג~l|ke~h4gΝf0F\EQQQɓ/9}xw{Iؑ#mx~h fϞBaᵹVRО83Rٳgc2zdffÌ3B{ $|rTOnn&x,x~</ӦUrm;Jt:c0uV?LttX, p8l$IZZZXze_[[Kmm-aeeE| Wͽ.[I|]{Q&sSN}ۉˮ$WBv%P$5qm^Y_6G~=r4Ν{fͺtnE̙3o:dfo@a6_ݩS B+e_hhv_w}?HU|vI5m#7ݿEAq-=݀Hܶ^gs ܾ f2$WGm~I%jQ˒I4L=.6]q$_d49ӴK0w>H~~6 FG} rr2JرnB(z:~Up`36 ''ńbH$n%-~~B::N`4).' cY9C"8HWWV3@ h&773g>H(᭷YLJ'OA8alOzt;}}C8zzY.3 xP! cq:ị4&M(N:;O먬,3&2<<wlH$Fvv~9|QUUhoj 9|իpp`K9~^? ph3gJW"??%%LF((ךTںXt̘Qɉl\KgȮ]H熫DUUQUH$Fz}`0H&SdD"J!P`0Lii!Hd2^`_6uCsXL3iѨ'K=Ph4l"bPD"h i9:H(FSFDX,' EZ+/aaFXz5<缔8gyl6ۭs*e/Rraz^1e&,Kz8:ن#1 F Ǒ7d(=s6R̫Y<3TrFFS)/r_hj*d> IdTӘ>D9Velz/("~쯚L15/!<zUG7(*##HBehI d<4=t^/koI;yXsc$Lu׵K2Y *VYߺ>u=*}}"7֗^J" k-H^^IuuذA*_.%^WzoG%Ty睲~z%:.`*(ZZ1QVU 5oM1XZ+"CG(iv(IElP۶Ig&T;^'fY{{/ˇT) - tLDeBگk-O[E""Fխ"z5V5Uo?#WmI+ld,f!+kZ[ؽE*q:P /1Ύ> D5eLo/{pOʞ^zz6E1w.99rCc 'ӿhə|>b$IEU$$P($xdn-+% )ԤtNL1-qWEkEt""HvE}Y?s1>Tu:~1n4wޤ#O1&8:cL^9Z~+/,/gt})euFh,a͑5c\7L<,>T%?? mt;qYsgg +䒋͋^dM1,7* nqv?Nϡ귋Xq7Nssvf R86^ N3=TbԘr3(З n{w* :ˍ)gŌE]'͜)R^23]#dI^Z>O("+((?"tv~]DD~KuulyIADNQ6W(ȑ GDS4q7H_r4b˂HDr]ck"۷KOH E'AEL"R_/Kuu{e(ȇ!G^K2h6QwKl~L\.*WKL5%)ҹS ҹsƵR}ˏ_%or~o'ÒfepPn`6'IOb0$bxt%iV=̛s<*b?x05yطm#_h5\GpA ڪW9Yɮj& وO'qt#Uz.5vOf?zVr2xẺ ~Csk"}GZw˨qT €.".KdkKPĵ%b _ר;?_I$-pLX ^\/78U  3b S؈ޏ-x[6Ls|FQtl(/>`+A*/Jm%lEHF v1A_S&<߀7D-tqP2ZLvx h:ӇG~VN{,)1Oԭ#– ?wBbCCL'"7gv| U ^%]kX^7ϋ" "/ צf󙇥J,哪\"ZDD/}"Wj{~G" JA_x\@V>.u%ʕ.1ҷO̓-]"R%.WITRL˗HA}+E@^XQ~J~[Z8GShk퇷K׋`gGţbr}RٸOrdD5;I1˅ӧm81Pi{ 5LE |Q2i~/'|_/&V IRjj:X}vjl3ad=%tmL2tOob }~>h&zzlY7h.ė<آ6>V;ɇ? p>z}=== x˽,$&LS*S1-A׺>P/fkVrn}z<zÃިǓA)_L"tK/}WnI<`] G2ym 2ɞbg%?oeKYve sjsseL/w\/'}(ĭڭd7Z4JY&Jgq*5O֢W/i:v?#.Z?c?U9UTDS~(y -~ʞGYD?/+*pƚss5I"eh=e24FYwZB MQfڴqiWyOص{1#X,&F92q,} WRZzl&JN s|gR8g~1Ti>bi~޵IL<1 쬥` {DT?ACXvzf?1L5-oΙ?4}v0i'we0 TJ+NY*7]SaYd _d L;?/ea(UTfhi5Y2b=9)Ġy` &'b umY1ȿ|>#=v_ytwQKR?y@ Xռ\Jdß8R:)7v5^RN'9}EGJ QBزHXnlII "MړRV^ܹo2rG=;BvJD뺑RhC3)/?bƧl^id\w"/+FQ=mϘHa=(SP+A/vFis)Q0GKT#h:EMQt[R22F՜ y8(݂xnT_ҏ#y*e%!~]LT־)rۀb7UU} :30dݭVwHHe;Q{ye:(k~Jg{18D==e{{vvu}ݿ wvx}?mB?Ȯ><`ϐqJb1cS&,&$+5XW9l;+v}8&q&m$ t7iiܤ y^gH#<: }'߁O<1a`3g3::Jv~::( m3- Ωm}փNMGsP>ZZtVPEޞv಻^'LgP_?<,}`/Qry?4ISN"GJ=88PJ0#ȣKq8٣xP8~Fƞ;Ub:a"#!?P-@Ƅ$.8O:pv8Ep9mu":ْ'1߁O?lat!,7Hԩ,ff8Pw2{g@ɟ|z8y2 9y2{8y2{yd&KJ1y@!0eN{)-5Z}l7CkrPvCEW(~_94'sq.x5'? ur⿾}=o˦Mu'Bm*hZ=J)ݹ~bl: w5w/|p-otS7rrMn_.3ͥnrO=ܓt/H[ܗRׅZ}‘#כM8, 02REWDE8u*uN4c:Jci: cr/PsQUƮݔϾڵ!2~?/4|Oߤ+C%-jh4ׅ IDATÍyc)bc6O{{~ΨPXMt<GW%J}W י~Z5!Oo&''o?D(*tSSMщ"ܓu,7EME^x{΃7^>zB4a҈ad$?!L&gdb@DQ@U7Uz{QZ9w$.Gu]S1G'2_A} 30f1Q(%duHq1<̌TOS/h&-NN @3Pb+*=pw7u:%zI+@4Z%~=F]iHRHN c233ҘA#ӝɐʻPի½'=:~7OFF>_')ǎ1wme.;_q[˩rjk]fV7K9_nGSYگ^(-]DG3#twkLN6nOh(1/s瑧Äy1I7?51-w*(pӳ) M-i|Kh &?V :ſMƎ;X*ҊӘU?oI-[t袴cU(;Vk2:tRPk7wp*6dS!{,n}|'&qѝ™3v"D,Y5 ^f]`8Hq|;m\*x<FL훌E3g-Y3"4~J2i*"'D,0b,{Y3eǛ>85FGlG9`ۑ l b!=CC6:z qD, ؆zXIØL200e@^<<FYA, X"vM94FvGF( Q/_Y-W/'3gTk1yqiTVYRW(AF 7?/aƣM$33$77JFFPlil,>yxcxsGc!w{I] ).vKMi)+;%+VZ̩9%c򞥭&6֊X7n'O7F<$;۟bLH&7.fF"s(B$b"."6R4B! QU!4A0h@US!`ğf3HD(D**)QĔ$'!x)Oh@шbaa6)MlFD(drc !HX S'h2Qo,*|ӹ$B! Q+$#4?I1$`?Պ d12+&s$WS(DPu _Ê [Ҏmɚ55]|~aL+Z ɪUM5k$;;*lxXl|DlrTֈtSX,ay׻b ֭-OYn{イnݍvKdժn)*:-+WɄ 'd2?…m2qb@nu?ɖ͛;DQ9rwgϟ8 g$fK g}OI8W_}Ujӻ%=+l/#Y#R|:_WcEя~I6o,+VȂɝ26Lڗ6oWI"(+% I y9vɉC;H<#.7#!G6?/1{L~d͚:y{g-B4̅ !>Q+g}&si*7,FcX6on5([/6Q;)g-Ng|c 7oE+eԎK"RArb9%̸G!~X"_tX4&G/H$Ab>f1B*o:$~_n)RwQ)M5RT%=+WJӄh'stH`V@گkҲlD?/ͿrbIf<.uTU8-G%aLȓ_yHĈNG> hLM3RKN8" fs P1X,g5GfK՚@$u|2 ff&++HƉ\B,l OarHL ˟EϩrEpĈFs1#٧eٲ)(8. ӭ&aMHmm[N>{ʴuaQUM$IMG$&٣ǥg$/^jkk՝2zqK(XZ['KhFDgK<& K[$7f4m<*sK׋$5ȡEt"M_}Uzy?zӌ3X*| c(xQiaӋ)8ch8m"B?q //$͍(BNN"+K0Nw)H$l`1(*SL8ctkiT-OrL>Cs~Q|'1H2- tb:85;QJIAKT0D8mcaC4 Rz:T^ clz ݎgy2eJL9sL-bZ,fH]]"7,:WWEdݺVQՄ[.k;Eڵ.XFWȊC}J/Kqq̞i3]rAh~B4MֻZ%&_4%ɚ5bZ9&C+VȩlY\$ŝ=[:Lx<.mmmϗ+E"ͫE"u"-":"ז"R_//җ,MjjhmAd6DDQD֬i WM֬iEIJ]]j\\ׇXòbŀʒ%cu\Ϗ˄ JJ`A?"+2 9U#au]zjYdL]tttHI2)25K]]|nk|MDiJH}?yӌim5`2tLGӊ0clq,(Vk56۵fKbX,ja$X56ڰZcXe>fgcEZTT (fέȚOz"2kM=$D3X5S>F|d߾2}wɓQ~?įͤC=@޾nħ>sxhկ| DT'dʾ6'XO(PPCU@KA`Fii`F`4c0 g/)|94#//rEd2l.lf1z2NZfM Fy*t~ <^M;)ȵ`çS~>K_E,q^~!SҗelŋGf#,32䅿w]җLgdd\iq)'wEe#?OdJW9קz()UUAzg5u(UY@ Lύ3ݎpB]INZNS*dgrS.m)I]N,!Ɂ}bTUǑ#8hl4H,D$/ajj8!NL:/t_K/`'ɣ$c{+0=Pγ$SOaRxqlna\fKxe`@U$8h?J٬&}6M7iL8?)A8{LNC fhh6[_14t3fð,q8_54\[KRۧ00 ON@2)=:ETUU8xz6ޥZ 9hf;xmmN| 0\´+L\)q]l[9IԯiҴMD]*vv7Hc6uL+4m`@c@ M` [)M& y3y9>v8مCڐک .stslyMM~tN4z hh8JS|<%jj.?mÚJ@ >G.'a6gI lY($eDBZ"aH&ZUk052 lV]==GM1ihh`ϑJtt@ mmh%4oߙ|6ϣN3xvפ.EqJA8PИuccռzՍ hj t!02D 3岁zŤ@>$f]&צ?l4;˦&UO,._^h ` oe]' 43:]|ނɔBQl8 ѨVp؎ө xA;^B 1?xVyǟ z"<#ᣏ67MMp\n.}ow.WlF6 RI#ne `QfMF PvYa~޾:! ˶խ1f4MO$\6 JVR)m)oj 7ɍoGQSȲ yTjښ"lb `l%H_57A_vC9I47իwoyk_ ~(XX&33cn 2>|GoА>3ࠇ/;9p ʕ+gtNOO *ss"H8,J$;++u&#D0`>8}.0{/X|~VѨw'{1>NO ##sb'pÇ?ܹg9wn'ÇQ3C=}׌1` @,!I*P$0TL&k$fttCcbtX\!bk4LZFcBA\.Ri+:S0@R1ttYEZ؈Ii_3 i+EL9A"rN7|,-X E9I%}fKS,ۓ ؑٶ6&lւ&EP*5"I 2;B*enO[q8D8i̸GmIDATnw`PHxdYϧ":|dYӐexjX\,ڪ'l HcZdHLKKVZZnѴ\^Tщ+0۷(i,;+dV"QTP&SNޞ$ S"ɰjW]'{HCgߤ\[ٙ ~WE>౭;?T-iɓ's6N:sp[ N}%hڝE;u;뿷/g<IENDB`filler/res/friendless/games/filler/help/0040775000076400007640000000000007224552024017261 5ustar johnjohnfiller/res/friendless/games/filler/help/en/0040775000076400007640000000000007224552024017663 5ustar johnjohnfiller/res/friendless/games/filler/help/en/credits.html0100664000076400007640000000163207224552024022205 0ustar johnjohn Credits

Credits

  • Firstly I'd like to thank Alexander Vikulin who wrote the original Windows version of Filler. Check out his new site at http://www.vog.ru, or the Windows Filler site at http://www.rinet.ru:8083/filler/.
  • I would like to give credit for whoever drew the icons that I poached and hacked, but I downloaded them years ago and have no idea where I got them from. The icon for Hugo and Shirley came from GnobotsII.
  • Tognon Stefano wrote the first version of the spec file used to make the RPM package, and gave me very good instructions on how to do it myself.
  • Sini Ruohomaa did the Finnish translation, and provided lots of feedback on bugs and things I could do to make translated versions work properly.
Index filler/res/friendless/games/filler/help/en/index.html0100664000076400007640000000067107224552024021661 0ustar johnjohn Filler in Java

Filler in Java

filler/res/friendless/games/filler/help/en/robots.html0100664000076400007640000000324207224552024022057 0ustar johnjohn Robot Players

Robot Players

Each robot player is represented by an icon which represents the amount of calculation that it does and hence roughly how smart it is. Some robots come with their own icons, in which case you'll have to look at its rating to see how good it is.
Very Stupid Robots
These robots make their move without even looking at the board, so they're pretty poor players.
Stupid Robots
These robots employ a variety of strategies which don't really work very well.
Normal Robots
These robots are all fairly similar, with their main goal being to spread their influence a long way across the board. This is a surprisingly good strategy. They use the same basic information as Stupid and Clever Robots.
Clever Robots
These robots use successful strategies based on the information provided to Normal Robots.
Thinking Robots
These robots use classical artificial intelligence techniques such as lookahead and board evaluation to try to choose good moves. However, their computational needs are excessive compared to their ability.
Smart Robots
These robots do much more computation than any other type of robot, and are correspondingly more successful. This type will put a good human player under pressure.
Index filler/res/friendless/games/filler/help/en/howtoplay.html0100664000076400007640000000174007224552024022576 0ustar johnjohn How To Play

How To Play

If you are wondering how to work the user interface, please see Controls. This page tells you what you are supposed to be achieving to win.

Filler is quite a simple game. There are two players, one of whom starts at the hex marked 'L' and the other of whom starts at the hex marked 'R'. Each take turns to choose a colour. When you choose a colour, all of your hexes change to that colour. "Your hexes" are those which are the same colour, and joined to, your starting hex. When you change colour, some of the neighbouring hexes, which are of the new colour, will become the same colour as, and joined to, your starting hex, so your score will increase. Your score is the number of hexes you control.

The winner is the first player to control more than half the hexes. As there are 1377 hexes, you need a score of 689 to win.

Index filler/res/friendless/games/filler/help/en/ratings.html0100664000076400007640000000364507224552024022225 0ustar johnjohn Ratings

Ratings

The ratings system used in Filler is a variant of the Elo rating system which was invented by Dr Arpad Elo. When a player starts, they have a nominal rating of 1600 points. When a player loses a game, they lose points, and when they win a game, they gain the points the other player lost. In Filler, a player can lose or gain at most 32 points in one game. The number of points gained or lost depends on the difference in the players ratings. A win over a player ranked equal will gain 16 points (half of 32). A win over a player ranked higher will gain more than 16 points, and a win over a player ranked lower will gain fewer than 16 points.

The Filler rating system assumes that a player will never be able to defeat a player ranked 400 points or more higher. Consequently, defeating a player ranked 400 points lower will result in no points being transferred. Defeating a player ranked 400 points higher will result in a full gain of 32 points.

For the first 20 games a player plays, their rating is considered to be provisional. This means that wins over higher ranked opponents will gain them bonus points, and losses to lower ranked opponents will cost them penalty points. This allows a player to reach their approximately correct ranking faster than the usual system would allow. The bonus and penalty points do not affect the opponent's rating.

The benefit of the rating system for players of Filler is that it allows them to match their skills against the robot players, and to easily choose robot players with sufficiently challenging skills.

The game keeps track of rankings, which are your categorisation into skill levels according to your rating, and head to head results, which are the historical number of wins and losses for each pair of players. See also Rankings.

Index filler/res/friendless/games/filler/help/en/about.html0100664000076400007640000000056507224552024021666 0ustar johnjohn About Filler in Java

About Filler in Java

Filler in Java is (originally) written by John Farrell and is now an open-source project at SourceForge.

This is version 1.01.

Index filler/res/friendless/games/filler/help/en/notfound.html0100664000076400007640000000021307224552024022376 0ustar johnjohn Not Found

Not Found

404 Not Found

Index filler/res/friendless/games/filler/help/en/controls.html0100664000076400007640000000367107224552024022420 0ustar johnjohn Controls

Controls

If you need to know what you are supposed to achieve in the game, please see How To Play. This page tells you how to work the user interface. Note: clicking on the hexes does nothing, click on the coloured buttons.

Starting A Game

To start a game, choose a player from the left hand list, e.g. Human. Choose a player from the right hand list, e.g. Shirley or Hugo. If you have a human opponent, choose Human from the right hand list as well. Click on the 'Play' button to start the game. The playing board is filled with random colours. When it's your turn, you can choose a colour by clicking on one of the coloured buttons, or by typing the corresponding number.

Cancelling A Tournament

The Cancel button cancels a tournament. It does not cancel a game. This is to stop cheating where you run away from a game you are about to lose! If you really want to do that, kil the program and start again, that's your punishment for being a coward! For more details on tournaments, see Tournaments.

Tabs

You don't need to use the tabs down the bottom to play, except if you need to read the help.
Play
This is where you go to play a game.
Tournament
This is where you go to configure and start a tournament. See also Tournaments.
Rankings
This tells you what your rating (a number) is, and what your ranking (a title) is. Use it to locate computer players with similar skill to you.
Head to Head
This tells you the win-loss records of all players against each other. The first number is the number of games won by the player on the left, and the second number is the number of games won by the player above.
Help
This is where you go to read the help.

Index filler/res/friendless/games/filler/help/en/tournaments.html0100664000076400007640000000365707224552024023140 0ustar johnjohn Tournaments

Tournaments

Filler supports a tournament mode. You can play tournaments when you want the robot players to play amongst themselves, or if you simply want to assert your authority over them. The forms of tournament are:
Round robin
There is no winner in this form of tournament. All players play all other players.
Knockout
Once a player loses a match, they are eliminated from the tournament. The last player not eliminated wins. Players play a roughly equal number of matches.
Basho
This form of tournament is based on sumo tournaments. There are a fixed number of rounds. Each player plays against other players of similar ability. The player with the most wins at the end wins the tournament. If multiple players have the same number of wins, round robin elimination rounds are played as well.
Challenge
Human players may not participate in this form of tournament. The computer players challenge each other attempting to improve their rankings. There is no winner.
To configure and run a tournament, go to the Tournament Panel. The first column lets you choose the rules for the tournament, which are restricted to the form of the tournament. The Continuous checkbox lets you choose that once a tournament has finished, a new one starts immediately. The Description panel gives you a brief summary of the tournament rules.

The second column is the list of players selected to play in the tournament. The players are ordered in descending order of rating. Initially, all players are selected.

The third column contains a Description panel, describing the player last selected or deselected in the Players list. At the bottom of the third column is the "Play Tournament" button. Clicking this button will switch the game to the Play panel and start the tournament.

Index filler/res/friendless/games/filler/help/en/rankings.html0100664000076400007640000000244407224552024022366 0ustar johnjohn Ratings

Ratings

For the sumo-impaired, here is a translation of the ranking levels used. The rankings will probably be changed when there are more human and robot players, and someone can suggest a better set of names. The levels for the rankings do not match those suggested by Arpad Elo. They will eventually be set so that there are roughly equal numbers of players in the jonidan to juryo ranks.
Yokozuna - Grand Champion
Yokozuna are the most esteemed champions of all. There are usually only 2 in the whole world.
Ozeki - Champion
Ozeki are champions who are challenging to become yokozuna.
Sekiwake
Sekiwake is an elite rank for those maegashira who are challenging to become ozeki.
Komosubi
Komozubi is a rank for those at the top of maegashira.
Maegashira
Maegashira is the usual rank held by the world's elite.
Juryo
A very good rank.
Makushita
A good rank.
Sandanme
An average rank.
Jonidan
A poor rank.
Jonokuchi - Novice
Jonokuchi have just learnt how to play.
Maezumo - Amateur
Maezumo are beginners who are just learning.
Index filler/res/friendless/games/filler/help/fi/0040775000076400007640000000000007224552024017657 5ustar johnjohnfiller/res/friendless/games/filler/help/fi/about.html0100664000076400007640000000110007224552024021644 0ustar johnjohn Tietoja Java-pohjaisesta Fillerist

Tietoja Java-pohjaisesta Fillerist

Java-pohjaisen Fillerin kirjoitti (alunperin) John Farrell, ja peli on nykyn SourceForgen isnnim open source -projekti.

Tmnhetkinen versio on 1.0.

Suomennoksesta vastaa Sini Ruohomaa. Korjaukset ja kommentit ovat tervetulleita.

Hakemisto filler/res/friendless/games/filler/help/fi/controls.html0100664000076400007640000000366707224552024022421 0ustar johnjohn Hallinta

Hallinta

Jos et viel tied mitk tavoitteesi ovat tss peliss, vilkaise peliohjeita. Tm sivu selostaa kyttliittymn toimintaa. Huom: kuusikulmioiden naputtamisella ei ole mitn vaikutusta, klikkaa mielummin niit vrillisi nappuloita.

Pelin aloittaminen

Valitse pelaaja vasemmasta (esim. Ihminen) ja oikeasta listasta (esim. Urpo tai Turpo). Jos haluat pelata toista ihmist vastaan, valitse oikeallekin puolelle pelaajaksi ihminen. Paina 'Pelaa'-nappia aloittaaksesi pelin. Laudan ruutujen vrit vaihtuvat satunnaisiksi. Kun on sinun vuorosi, voit valita vrin joko klikkaamalla haluamasivrist (nelikulmaista) nappulaa tai painamalla sen numeroa.

Turnajaisten keskeyttminen

Peruuta-nappi keskeytt turnajaiset. Se ei peruuta yksitist peli; et siis voi huijata keskeyttmll pelin heti kun olet hvill... Jos tosiaan haluat keskeytt pelin, pysyt ohjelma ja kynnist se uudelleen. Lis-hellys on rangaistuksesi pelkuruudesta. ;) Jos haluat lis tietoja turnajaisista, ks. turnajaiset.

Vlilehdet

Sinun ei vlttmtt tarvitse kyt vlilehti pelataksesi, paitsi jos haluat lukea ohjeen.
Peli
Tll vlilehdell itse pelaaminen tapahtuu.
Turnajaiset
Tll vlilehdell voit muuttaa turnajaisten asetuksia ja aloittaa turnajaiset. Ks. mys turnajaiset.
Sijoittuminen
Tm vlilehti kertoo sijoituksesi (numero) ja arvonimesi. Kyt sit lytksesi omantasoisiasi tietokonepelaajia.
Tilanne pareittain
Tm vlilehti kertoo kunkin pelaajan voitot ja hvit muita pelaajia vastaan. Ensimminen numero kertoo vasemmanpuoleisen pelaajan voitot, toinen ylpuolisen pelaajan voitot.
Ohje
Ohjeisto lytyy tlt.

Hakemisto filler/res/friendless/games/filler/help/fi/credits.html0100664000076400007640000000124407224552024022200 0ustar johnjohn Kiitokset

Kiitokset

  • Ensinnkin, haluaisin kiitt Alexander Vikulinia, joka kirjoiti alkuperisen Windows-version Fillerist. Kvise hnen uudella sivustollaan osoitteessa http://www.vog.ru, tai Windows-Fillerin sivustolla osoitteessa http://www.rinet.ru:8083/filler/.
  • Haluaisin kiitt kaappaamieni ja hkkmieni kuvakkeien piirtji, mutta kaivoin ne jostain vuosia sitten eik minulla ole en hajuakaan mist ne tulivat. Urpon ja Turon kuvake on GnobotsII:sta.
Hakemisto filler/res/friendless/games/filler/help/fi/howtoplay.html0100664000076400007640000000162707224552024022576 0ustar johnjohn Peliohjeet

Peliohjeet

Jos pohdit miten ohjelmaa kytetn, katso hallinta. Tm sivu selostaa pelin snnt.

Filler on varsin yksinkertainen peli. Pelaajia on kaksi, joista yksi aloitaa kuusikulmiolta joka on merkitty 'L' ja toinen kuusikulmiolta 'R'. Pelaajat valitsevat vuorotellen vrin. Kun valitset vrin, kaikki kuusikulmiosi muuttuvat senvrisiksi. "Sinun kuusikulmioitasi" ovat ruudut jotka ovat samanvrisi ja yhteydess aloitusruutuusi. Kun vaihdat vri, ruudut jotka ovat sen vrisi ja yhteydess sinun hallitsemiisi ruutuihin siirtyvt hallintaasi ja pisteesi lisntyvt. Kukin hallitsemasi ruutu on yhden pisteen arvoinen.

Voittaja on pelaaja joka saa valtaansa yli puolet ruuduista. Koska kuusikulmioita on 1377, tarvitset 689 pistett voittaaksesi.

Hakemisto filler/res/friendless/games/filler/help/fi/index.html0100664000076400007640000000075207224552024021655 0ustar johnjohn Java-pohjainen Filler

Java-pohjainen FILLER

filler/res/friendless/games/filler/help/fi/notfound.html0100664000076400007640000000026507224552024022401 0ustar johnjohn Tiedostoa ei lytynyt

Tiedostoa ei lytynyt

404 - Tiedostoa ei lytynyt

Hakemisto filler/res/friendless/games/filler/help/fi/rankings.html0100664000076400007640000000311507224552024022356 0ustar johnjohn Arvonimet

Arvonimet

Kytetyt arvonimet on tss selitetty* sumo-rajoitteisten pelaajien hyvksi. Arvonimi todennkisesti muutetaan ihmis- ja robottipelaajien lisntyess, ja ehdotuksia paremmaksi nimemisjrjestelmksi otetaan vastaan. Arvonimien tasot eivt vastaa Arpad Elon ehdotuksia. Tasoja sdetn joskus tulevaisuudessa niin ett jonidan-juryo -vlill on suunnilleen sama mr pelaajia.
Yokozuna - Suurmestari
Yokozuna on kaikkein kunnioitetuin mestari. Tavallisesti nit on vain kaksi koko maailmassa.
Ozeki - Mestari
Ozeki on mestari joka uhkaa pst yokozuna-tasolle.
Sekiwake
Sekiwake on eliittiarvonimi ozeki-tasolle pyrkiville maegashiroille.
Komosubi
Komozubi on maegashira-tason huippujen arvonimi.
Maegashira
Maegashira on maailman eliitin yleinen arvonimi.
Juryo
Erittin korkea taso.
Makushita
Korkea taso.
Sandanme
Keskivertotaso.
Jonidan
Heikko taso.
Jonokuchi - Noviisi
Jonokuchi on vasta oppinut pelaamaan.
Maezumo - Aloittelija
Maezumo on aloittelija joka vasta opettelee sntj.
*) Suomentajan kommentti: Arvonimet ovat mahdollisesti todellisuudessa monikkomuotoisia. Pahoittelen jos knns pist kielitaitoiseen silmnne. Itse pistetilastoissa tittelien pern on suomenkieliseen versioon listty kieli poskessa -knns termej selkeyttmn, mutten niit tss toista.

Hakemisto filler/res/friendless/games/filler/help/fi/ratings.html0100664000076400007640000000354307224552024022216 0ustar johnjohn Pelaajien luokittelu

Pelaajien luokittelu

Filleriss kytettv pelaajien luokittelujrjestelm on muunnelma Elo-luokittelujrjestelmst, jonka kehitti Dr Arpad Elo. Kullakin pelaajalla on alunperin 1600 pistett. Pelaajan pisteet laskevat kun hn hvi pelin ja kun hn voitaa, hn saa toisen pelaajan menettmt pisteet. Filleriss pelaaja voi saada tai menett enintn 32 pistett peli kohti. Saatujen tai menetettyjen pisteiden mr riippuu pelaajien tasoerosta, jonka pisteet mrittvt. Samantaisoisen pelaajan voittamisesta saa 16 pistett (puolet 32:sta). Korkeammantasoisen pelaajan voittamisesta saa enemmn ja heikommantasoisen voittamisesta vhemmn kuin 16 pistett.

Fillerin luokittelujrjestelm olettaa, ettei pelaajalla joka on 400 pistett toista pelaajaa alempana ole mitn mahdollisuutta voittaa tt. Tmn seurauksena 400 pistett alempana olevan pelaajan voittamisesta ei saa lainkaan pisteit. 400 pistett korkeammalla olevan pelaajan voittamisesta saa tydet 32 pistett.

Pelaajan ensimmisten 20 pelin ajan tmn arvojrjestyksen katsotaan olevan provisionaalinen. Tm tarkoittaa ett korkeammalla olevien vastustajien voittamisesta saa bonuspisteit, ja heikommille pelaajille hvimisest menett ylimrisi rangaistuspisteit. Tm nopeuttaa pelaajien keskinist jrjestytymist suurin piirtein oikeaan jrjestykseen. Bonus- ja rangaistuspisteet eivt vaikuta vastustajan luokitteluun.

Luokittelun etuna on se ett pelaajat voivat helposti verrata taitojaan muiden pelaajien kanssa, ja valita sopivan hankalia vastustajia.

Peli pit kirjaa arvonimist (pisteisiin perustuva luokittelu) ja kunkin pelaajaparin keskinisest voitot-hvit -tilanteesta. Ks. mys Arvonimet.

Hakemisto filler/res/friendless/games/filler/help/fi/robots.html0100664000076400007640000000362707224552024022062 0ustar johnjohn Robottipelaajat

Robottipelaajat

Jokaisella robottipelaajalla on kuvake joka kertoo sen laskutoimitusten mrn suuruusluokan ja tten kuvastaa sen lykkyystasoa. Joillakin roboteilla saattaa olla oma kuvakkeensa; tss tapauksessa tittelisivun vilkaiseminen auttaa pttelemn miten kovatasoinen robotti on.
Hyvin vh-lyiset robotit
Nm robotit pttvt siirtonsa ilman vilkaisuakaan pelilaudan suuntaan, joten ne ovat suhteellisen heikkoja pelaajia.
Vh-lyiset robotit
Nm robotit kyttvt erilaisia mutta varsin huonosti toimivia strategioita.
Tavalliset robotit
Nm robotit ovat suhteellisen samankaltaisia. Niiden ptavoite on levitt vaikutusaluettaan mahdollisimman pitklle laudalla - tm on yllttvn hyv lhestymistapa. Tavalliset robotit kyttvt samoja perustietoja kuin typert ja fiksut robotit.
Fiksut robotit
Nm robotit kyttvt hyvksitodettuja strategioita jotka perustuvat tavallisten robottien kytss olevaan tietoon.
Ajattelevat robotit
Nm robotit kytvt klassisia tekolytekniikoita, kuten ennakointi ja laudan tilanteen arviointi, ja yrittvt valita hyvi siirtoja arvionsa perusteella. Ne kuitenkin kyttvt varsin paljon aikaa laskelmointiin suhteessa varsinaiseen kyvykkyyteens voittaa.
Pirullisen ovelat robotit
Nm robotit kyvt lpi enemmn laskutoimituksia kuin mikn muu robottityyppi, ja ovat vastaavasti parempia pelaajia. Tss tyypiss on haastetta hyvllekin ihmispelaajalle.
Hakemisto filler/res/friendless/games/filler/help/fi/tournaments.html0100664000076400007640000000361107224552024023122 0ustar johnjohn Turnajaiset

Turnajaiset

Filleriss on tuki turnajaisten pitoa varten. Voit pit turnajaiset kun haluat robottipelaajien pelaavan keskenn tai kun haluat osoittaa paremmuuttasi. Eri turnajaismuodot:
Kaikki vastaan kaikki
Niss turnajaisissa ei ole voittajaa. Kaikki pelajaat pelaavat kaikkia vastaan.
Tyrmys
Kun pelaaja hvi pelin, hn putoaa pois pelisarjasta. Viimeinen jljelle jnyt pelaaja voittaa. Pelaajat pelaavat suurin piirtein saman mrn pelej.
Mtkijiset
Tm turnajaismuoto perustuu sumoturnajaisten sntihin. Pelikierroksia on tietty mr. Kukin pelaaja pelaa muita samantasoisia vastaan. Pelaaja joka on voittanut eniten pelej kierrosten pttyess voittaa. Jos usealla pelaajalla on yht suuri mr voittoja, kaikki vastaan kaikki -eliminaatiokierros pelataan lopuksi.
Haaste
Ihmispelaajat eivt voi ottaa osaa tss turnajaismuodossa. Robottipelaajat haastavat toisiaan, yritten parantaa sijoitustaan. Voittajaa ei ole.
Muuttaaksesi turnajaisten asetuksia ja kynnistksesi turnajaiset, valitse Turnajaiset-vlilehti. Ylvasemmalta voit valita turnajaisten snnt (rajoittuu turnajaistyypin valitsemiseen). Jatkuva-asetusnapista voit valita josko yksien turnajaisten ptytty toinen alkaa vlittmsti. Kuvaus-taulusta voit lukea lyhyen kuvauksen turnajaissnnist.

Keskell on lista pelaajista jotka on valittu pelaamaan turnajaisissa. Pelaajat ovat paremmuusjrjestyksess pisteiden mukaan (paras ensin). Oletuksena kaikki pelaajat on valittu.

Oikealla ylhll on toinen kuvaustaulu josta voit lukea viimeksi valitun tai poistetun pelaajan kuvauksen. Oikealla alhaalla on Pid turnajaiset -nappi. Tt nappia painamalla siirryt Peli-vlilehdelle, jossa turnajaiset ovat juuri alkamassa.

Hakemisto filler/res/friendless/games/filler/help/pl/0040755000076400007640000000000007224552024017672 5ustar johnjohnfiller/res/friendless/games/filler/help/pl/credits.html0100644000076400007640000000134507224552024022215 0ustar johnjohn Podzikowania

Podzikowania

  • Przede wszystkim chciabym podzikowa Aleksandrowi Vikulinowi za napisanie Fillera pod Windows. Sprawd jego now stron pod adresem http://www.vog.ru, lub stron Fillera dla Windows pod adresem http://www.rinet.ru:8083/filler/.
  • Chciabym take podzikowa kademu, kto narysowa ikony, ktre sobie wydubaem z rnych programw. Niestety scignem je lata temu i nie mam pojcia skd. Ikony Hugo i Shirley wziem z GnobotsII.
Spis treci filler/res/friendless/games/filler/help/pl/index.html0100644000076400007640000000102207224552024021657 0ustar johnjohn Filler w Javie

Filler w Javie

filler/res/friendless/games/filler/help/pl/robots.html0100644000076400007640000000346107224552024022071 0ustar johnjohn Gracze komputerowi

Gracze komputerowi

Kady gracz komputerowy jest reprezentowany przez ikon, ktra opisuje ilo wykonywanych przez niego operacji, co daje mniej wicej jak jest on dobry. Niektrzy gracze maj swoje wasne ikony, w takim wypadku bdziesz musia zajrze do jego rankingu aby zobaczy jak jest dobry.
Bardzo gupi gracze
Ci gracze podejmuj decyzje kompletnie nie zwracajc uwagi na plansz, wic s to bardzo sabi gracze.
Gupi gracze
Ci gracze wykorzystuj rne strategie, ktre w rzeczywistoci nie s zbyt dobre.
Normalni gracze
Ci gracze s z reguy podobni do siebie. Gwnym ich celem jest maksymalne rozszerzenie swoich wpyww na caej planszy. Jest to zaskakujco dobra strategia. Uywaj oni tego samego zasobu informacji jak Gupi i Sprytni gracze.
Sprytni gracze
Ci gracze uywaj najlepszych strategii dostarczonych przez Normalnych Graczy.
Mylcy gracze
Ci gracze uywaj klasycznych technik sztucznej inteligencji, jak przewidywanie kilku ruchw naprzd i wybieranie najlepszego ruchu. Jednake ich wymagania obliczeniowe s bardzo due w stosunku do moliwoci.
Sprytni gracze
Ci gracze wykonuj najwicej ze wszystkich typw graczy oblicze i dziki temu uzyskuj najlepsze wyniki. Ten typ wymaga najwicej od dobrego ludzkiego gracza.
Spis treci filler/res/friendless/games/filler/help/pl/howtoplay.html0100644000076400007640000000205607224552024022606 0ustar johnjohn Jak gra

Jak gra

Jeli chcesz wiedzie jak uywa gry, zajrzyj do kontroli gry. Ta strona opisuje co naley zrobi aby wygra.

Filler jest cakiem prost gr. Graj tutaj ze sob dwaj gracze. Jeden z nich zaczyna gre z pola oznaczonego 'L' a drugi z pola oznaczonego 'P'. W kadej turze naley wybra jaki kolor. Kiedy to zrobisz, wszystkie twoje zmieniaj kolor na taki jak wybrae. "Twoje pola" to te, ktre maj taki sam kolor, jak pole z twoj liter (L lub P). Jeli dookoa twoich pl znajd sie pola o kolorze, ktry wybrae, s one doczane do twoich pl, dziki temu zwiksza si ilo posiadanych przez ciebie punktw. Ilo punktw odpowiada iloci posiadanych przez ciebie pl.

Zwycizc zostaje gracz, ktry pierwszy zdobdzie wicej ni poow pl. Poniewa na planszy jest 1377 pl, aby wygra trzeba zdoby 689 punktw.

Spis treci filler/res/friendless/games/filler/help/pl/ratings.html0100644000076400007640000000403207224552024022223 0ustar johnjohn Punktacja

Punktacja

System punktacji uyty w Fillerze jest wariantem systemu Elo, ktry zosta wymylony przez dr Arpada Elo. Gdy gracz rozpoczyna gr, ma on standardowo 1600 punktw. Gdy przegrywa gr, traci punkty, a kiedy wygrywa, zyskuje punkty utracone przez przeciwnika. W Fillerze, gracz moe utraci lub zyska 32 punkty w jednej grze. Liczba zyskanych lub utraconych punktw zaley od rnicy pomidzy punktacj obu graczy. Zwycistwo nad graczem o takiej samej liczbie punktw przynosi 16 punktw (poowa z 32). Zwycistwo nad graczem, ktry ma wiksz liczb punktw przynosi wicej ni 16 punktw, natomiast wygrana z graczem, ktry ma mniej punktw przynosi mniej ni 16 punktw.

System punktacji Fillera zakada, e gracz nie moe wygra z graczem, ktry ma przewag wiksz ni 400 punktw. W konsekwencji, zwycistwo z graczem, ktry jest sabszy o co najmniej 400 punktw nie przynosi adnych punktw zwycizcy. Pokonanie gracza, ktry ma przewag 400 punktw przynosi 32 punkty zysku.

Przez pierwsze 20 gier, ktre gra nowy gracz jego punktacja jest zmieniana w trybie prowizyjnym. Znaczy to, e gdy wygrywa on z graczem o wyszej pozycji zyskuje on dodatkowe punkty, natomiast gdy przegrywa ze sabszym traci dodatkowe punkty. Pozwala to graczowi szybciej osign waciwy dla siebie poziom gry. Dodatkowe punkty nie powoduj zmian w punktacji przeciwnikw.

Taki sposb punktacji i rankingu w Fillerze pozwala na porwnywanie umiejtnoci graczy a take pozwala na atwe wybranie do turnieju graczy komputerowych, o odpowiednim poziomie umiejtnoci.

Gra pozwala na zapamitanie rankingu i punktacji, co pozwala na zaklasyfikowanie twoich umiejtnoci. Zapisuje ona take wyniki w tabeli Twarz w Twarz. Jest to historyczny zapis wszelkich zwycistw i poraek kadej pary graczy. Zajrzyj take do rankingu.

Spis treci filler/res/friendless/games/filler/help/pl/about.html0100644000076400007640000000074207224552024021672 0ustar johnjohn O Fillerze w Javie

O Fillerze w Javie

Filler w Javie jest (od podstaw) napisany przez Johna Farrella i jest projektem typu open-source. Strona gwna znajduje si na serwerze SourceForge.

Wersja 1.0.

Spis treci filler/res/friendless/games/filler/help/pl/notfound.html0100644000076400007640000000036007224552024022410 0ustar johnjohn Nie znaleziono

Nie znaleziono

404 Nie ma takiego pliku!

Spis treci filler/res/friendless/games/filler/help/pl/controls.html0100644000076400007640000000401107224552024022414 0ustar johnjohn Kontrola gry

Kontrola gry

Jeli chcesz wiedzie co naley osign w grze, zajrzyj do rozdziau jak gra. Na tej stronie dowiesz si jak obsugiwa gr.
UWAGA! klikanie na pola na planszy nic nie daje. Klikaj na kolorowe przyciski na pasku narzdziowym.

Rozpoczcie gry

Aby rozpocz gr, wybierz gracza z listy po lewej, np.: Czowieka. Nastpnie wybierz gracza z listy po prawej stronie, np.: Shirley lub Hugo. Jeli masz kogo z kim chcesz gra, moesz te wybra Czowieka. Kliknij na przycisk Nowa gra aby rozpocz gr. Plansza wypeni si rnymi kolorami. Kiedy nadejdzie twoja kolej wybierz jaki kolor klikajc na jednym z kolorowych przyciskw na pasku narzdziowym lub nacinij na klawiaturze odpowiedni numer.

Przerwanie turnieju

Przycisk Przerwij przerywa turniej. Nie przerywa on aktualnej gry. Chodzi o to, eby nie oszukiwa, gdy przegrywasz! Jeli koniecznie chcesz przerwa gr musisz wyj z programu i uruchomi go jeszcze raz. Taka jest kara za tchrzostwo! Wicej szczegw o turnieju znajduje si w Turnieju.

Zakadki

Nie musisz uywa zakadek znajdujcych si na dole planszy, chyba, ze chcesz poczyta sobie pomoc.
Gra
Tutaj trzeba klikn, aby sobie zagra.
Turniej
Tutaj mona skonfigurowa i rozpocz turniej. Zajrzyj take do Turnieju.
Ranking
Mwi ci jak pozycj zajmujesz w rankingu, i jaki uzyskae tytu. Moesz tego uy, aby zorientowa sie jacy gracze komputerowi maj zbliony poziom umiejtnoci.
Twarz w Twarz
Zapisana tabela zwycistw wszystkich graczy. Pierwsza liczba mwi o iloci zwycistw gracza w poziomie, druga - ile razy wygra gracz w pionie.
Pomoc
Zakadka z pomoc.

Spis treci filler/res/friendless/games/filler/help/pl/tournaments.html0100644000076400007640000000353507224552024023142 0ustar johnjohn Turniej

Turniej

Filler pozwala na rozgrywanie turniejw. Moesz rozegra turniej pomidzy graczami komputerowymi. Istniej rne rodzaje turniejw:
Wszyscy ze wszystkimi
Nie ma tutaj zwycizcy. Wszyscy gracze graj przeciwko wszystkim.
Eliminacje
Przegrywajcy odpada - kady gracz, ktry przegra, jest eliminowany. Zwycizc zostaje ten, ktry nie przegra adnego meczu. Gracze rozgrywaj zblion liczb meczw.
Basho
Ten typ turnieju jest wzorowany na turniejach sumo. Okrelona jest z gry liczba rund. Kady gracz gra przeciwko innym graczom o podobnych moliwociach. Gracz z najwiksz liczb wygranych wygrywa turniej. Jeli jest wiksza ilo graczy o tej samej liczbie zwycistw rozgrywana jest dodatkowa runda eliminacji.
Zawody
Ludzcy gracze nie mog uczestniczy w tej formie turnieju. Grace komputerowi rozgrywaj zawody pomidzy sob starajc si polepszy swj ranking. W tym typie turnieju nie ma zwycizcy.
Aby ustawi i uruchomi turniej, kliknij panel Turniej. Pierwsza kolumna pozwala na wybr typu turnieju. Zaznaczenie pola Kontynuacja powoduje, e po zakoczeniu jednego turnieju natychmiast rozpoczyna si kolejny. Panel Opis podaje skrcony opis przepisw turnieju.

Druga kolumna zawiera list graczy wyznaczonych do gry w turnieju. Gracze s posortowani od najlepszego do najsabszego. Domylnie wszyscy gracze s wybrani.

Trzecia kolumna zawiera panel Opisu - opisuje graczy ostatnio wybranych lub usunitych z listy graczy. Na dole trzeciej kolumny znajduje si przycisk "Rozegraj turniej". Kliknicie na ten przycisk spowoduje przejcie do panelu Gra i rozpoczcie turnieju.

Spis treci filler/res/friendless/games/filler/help/pl/rankings.html0100644000076400007640000000254307224552024022375 0ustar johnjohn Ranking

Ranking

W grze uywa si rankingu wzitego z sumo. Ten sposb zostanie prawdopodobnie zmieniony, gdy zwikszy si ilo ludzkich i komputerowych graczy oraz kto zaproponuje co lepszego. Poziomy w rankingu nie odpowiadaj zaproponowanym przez Arpada Elo. Bd one ewentualnie odpowiednio ustawione, jeli bdzie mniej wicej rwna ilo graczy od poziomu jonidan do juryo.
Yokozuna - Wielki mistrz
Yokozuna jest najwikszym mistrzem ze wszystkich. Zwykle jest tylko dwch mistrzw na caym wiecie.
Ozeki - Mistrz
Ozeki jest mistrzem, ktry walczy aby zosta yokozuna.
Sekiwake
Sekiwake naley do elity z grupy maegashira i walczy aby zosta ozeki.
Komosubi
Komozubi to grupa najlepszych zawodnikw z grupy maegashira.
Maegashira
Maegashira jest redni grup najlepszych zawodnikw na wiecie.
Juryo
Bardzo dobry zawodnik.
Makushita
Dobry zawodnik.
Sandanme
redni zawodnik.
Jonidan
Saby zawodnik.
Jonokuchi - Nowicjusz
Jonokuchi musi si nauczy jak gra.
Maezumo - Amator
Maezumo zaczyna si si uczy.
Spis treci filler/res/friendless/games/filler/help/nl/0040775000076400007640000000000007224552024017672 5ustar johnjohnfiller/res/friendless/games/filler/help/nl/about.html0100664000076400007640000000060707224552024021672 0ustar johnjohn Over Filler in Java

Over Filler in Java

De Originele Filler in Java is geschreven door John Farrell en is nu een open-source project op SourceForge.

Dit is versie 1.01.

Index filler/res/friendless/games/filler/help/nl/controls.html0100664000076400007640000000440607224552024022424 0ustar johnjohn Besturing

Besturing

Als je wilt weten wat je moet doen om het spel te winnen, bekijk dan Hoe werkt het spel. Deze pagina legt je uit hoe je met de user interface moet werken. Hint: op de zeshoeken klikken werkt niet, je moet op de gekleurde knoppen klikken.

Een spel starten

Om een spel te starten kies je eerst twee spelers: eentje links, en eentje rechts. De linkerspeler is meestal een menselijke speler, de rechter een robot. Wil je tegen een andere menselijke speler spelen, kies dan ook aan de rechterkant een menselijke speler. Klik op de 'Speel'-knop om het spel te starten. Het speelbord bestaat uit zeshoeken met willekeurige kleuren. Wanneer het jouw beurt is, mag je een kleur kiezen door op een van de gekleurde knoppen te klikken of door op een van de corresponderende getallen te drukken.

Een toernooi annuleren

De annuleerknop annuleert een toernooi. Dit stopt echter niet het spel. Dit om ervoor te zorgen dat je niet kunt valsspelen door een spel wat je aan 't verliezen bent stop te zetten. Als je dit echt wilt doen, zul je het programma opnieuw moeten opstarten. Dat is de straf die je krijgt voor lafhartig gedrag! Voor meer detail van toernooien, zie Toernooien.

Tabbladen

Je hebt de tabbladen onder aan 't scherm niet nodig om te spelen. Je gebruikt ze alleen om hulp te krijgen bij het spelen van Filler.
Speel
Hier ga je naartoe om het spel te spelen.
Toernooi
Hier ga je naar toe om een toernooi in te stellen en te starten. Zie ook Toernooien.
Rankering
Dit vertelt je wat je puntenaantal (een getal) en wat je rang (een titel) is. Je kunt 't gebruiken om spelers te vinden die ongeveer even goed zijn als jezelf.
Een tegen een
Hier zie je de win-verlies geschiedenis van alle spelers tegen alle andere spelers. Het eerste getal is het aantal spellen dat de speler links heeft gewonnen, het tweede is het aantal gewonnen spellen door de speler daarboven.
Help
Hier ga je naartoe om de help-files te lezen.

Index filler/res/friendless/games/filler/help/nl/credits.html0100664000076400007640000000205707224552024022216 0ustar johnjohn Krediet (applaus voor ...)

Krediet (applaus voor ...)

  • Allereerst wil ik Alexander Vikulin bedanken. Hij schreef de eerste Windows-versie van Filler. Bekijk z'n site op http://www.vog.ru, of de Windows Filler site op http://www.rinet.ru:8083/filler/.
  • Ere wie ere toekomt, maar ik heb geen flauw idee wie de ikonen getekend heeft die ik heb gebruikt. Ik heb ze jaren geleden gedownload, maar ik heb geen idee waar vandaan. De ikonen voor Hugo en Shirley komen van GnobotsII.
  • Tognon Stefano schreef de eerste versie van de spec file die je gebruikt om de RPM package te maken. Bovendien heeft hij me prima geleerd hoe ik dat zelf kan doen.
  • Sini Ruohomaa heeft 't spel in het Fins vertaald en heeft me een berg feedback gegeven over bugs in het spel en over dingen die ik kon toepassen om de vertaalde versies van dit spel te kunnen laten werken.
Index filler/res/friendless/games/filler/help/nl/filler.html0100664000076400007640000000074007224552024022033 0ustar johnjohn JBuilder Project filler.jpr

Project Notes


Project:
Author:
Company:
Description:

Things to do...
  • Item 1
  • Item 2
filler/res/friendless/games/filler/help/nl/howtoplay.html0100664000076400007640000000213507224552024022604 0ustar johnjohn Hoe werkt het spel

Hoe werkt het spel

Als je je afvraagt hoe je moet werken met de user interface, bekijk dan Bedieningen. Deze pagina vertelt je wat je moet doen om het spel te winnen.

Filler is een behoorlijk simpel spelletje. Er zijn twee spelers, eentje die begint vanuit het zeshoek gemerkt met een 'L' en de andere die begint vanuit het zeshoek met de 'R'. Om de beurt kiezen de spelers een kleur. Wanneer je een kleur kiest veranderen al jouw zeshoekjes naar die kleur. "Jouw zeshoekjes" zijn alle zeshoeken met dezelfde kleur die aan jouw beginpunt liggen. Wanneer je de kleur verandert, zullen sommige aangrenzende zeshoeken die dezelfde kleur hebben binnen jouw gebied vallen. Op die manier gaat je score omhoog. Je score hangt af van het aantal zeshoeken dat je bezit.

De winnaar is de speler die als eerste meer dan de helft van de zeshoeken in z'n bezit heeft. Er zijn 1377 zeshoeken, dus je hebt een score van 689 nodig om te winnen.

Index filler/res/friendless/games/filler/help/nl/index.html0100664000076400007640000000075707224552024021675 0ustar johnjohn Filler in Java

Filler in Java

filler/res/friendless/games/filler/help/nl/notfound.html0100664000076400007640000000024307224552024022410 0ustar johnjohn Niet gevonden

Niet gevonden

404 Niet gevonden

Index filler/res/friendless/games/filler/help/nl/rankings.html0100664000076400007640000000264707224552024022402 0ustar johnjohn Rankering

Rankering

Voor de sumo-nitwits volgt hier een vertaling van de rankering. Deze rankering zal waarschijnlijk veranderd worden wanneer er meer menselijke en computergestuurde spelers zijn, of als iemand een betere set namen kan verzinnen. Deze rankering is niet dezelfde als datgene wat is voorgesteld door Arpad Elo. Uiteindelijk zal deze rankering aangepast worden zodat er grofweg evenveel jonidan- als juryo-spelers zijn
Yokozuna - Heersende Kampioen
Yokozuna zijn de aller- allerbesten. Meestal zijn er hier maar twee van in de hele wereld.
Ozeki - Kampioen
Ozeki zijn de kampioenen de uitdaging aangaan Yokozuna te worden.
Sekiwake
Sekiwake is een rang voor de elite van de maegashira die de mogelijkheid hebben ozeki te worden.
Komosubi
Komozubi is een rang voor de beste van de maegashira.
Maegashira
Maegashira is de gebruikelijke rang voor de elite van de wereld.
Juryo
Een erg goede rang.
Makushita
Een goede rang.
Sandanme
Een middel-hoge rang.
Jonidan
Een lage rang.
Jonokuchi - Novice
Jonokuchi hebben net geleerd hoe ze moeten spelen.
Maezumo - Amateur
Maezumo zijn beginners die nog aan 't leren zijn.
Index filler/res/friendless/games/filler/help/nl/ratings.html0100664000076400007640000000402107224552024022221 0ustar johnjohn Puntensysteem

Puntensysteem

Het in Filler gebruikte puntensysteem is een variant van het Elo ranking system, uitgevonden door Dr. Arpad Elo. Wanneer een speler start heeft hij een nominale beoordeling van 1600 punten. Wanner een speler een spel verliest, verliest hij punten. Wanneer hij wint, wint hij de punten die de andere speler heeft verloren. In Filler kan een speler maximaal 32 punten per spel winnen of verliezen. Het aantal punten dat men verliest of wint, hangt af van het verschil in rang van de spelers. Een winst op een speler met eenzelfde rang dan jezelf staat gelijk aan 16 punten (de helft van 32). Een winst op een speler met een hogere rang staat gelijk aan een hoger aantal punten, een lagere rang aan een lager aantal.

Het puntensysteem in Filler gaat ervan uit dat een speler nooit wint van iemand die meer dan 400 punten hoger staat in rang. Win je van iemand die 400 punten lager staat dan jezelf (of lager), krijg je geen punten. Win je van iemand die 400 punten hoger staat dan jezelf (of hoger), dan krijg je de volle 32 punten.

De score van een speler wordt in de eerste 20 spellen van deze speler 'tijdelijk' geacht. Dit houdt in dat een winst bonuspunten geeft, verlies een penalty. Dit zorgt ervoor dat een nieuwe speler sneller juist in rang gewaardeerd wordt dan dat het gebruikelijke systeem toelaat. De bonus of penalty heeft geen invloed op het puntenaantal van de tegenstander.

Het voordeel van het puntensysteem in Filler is dat het de spelers makkelijk maakt hun kunnen te vergelijken tegen dat van de robot spelers. Spelers kunnen zo makkelijk een voldoende uitdagende tegenstander kiezen.

Het spel houdt een lijst van rangen bij, welke verdeeld zijn in niveau's van kunnen aan de hand van je puntenaantal en een-tegen-een-resultaten (een historisch aantal winsten en verliezen voor elk paar spelers). Zie ook Rankering.

Index filler/res/friendless/games/filler/help/nl/robots.html0100664000076400007640000000343007224552024022065 0ustar johnjohn Robot spelers

Robot spelers

Elke robot speler wordt gerepresenteerd door een ikoon wat de hoeveelheid berekeningen representeerd die de robot uitvoerd, dus grofweg hoe slim de robot is. Sommige robots hebben hun eigen ikonen. Je zult dan naar hun rang moeten kijken om erachter de komen hoe goed ze zijn.
Erg Domme Robots
Deze robots doen maar wat, het zijn erg makkelijke tegenstanders.
Domme Robots
Deze robots volgens allerlei strategieen die allemaal niet echt goed werken.
Normale Robots
Deze robots lijken allemaal op elkaar, vooral in het opzicht dat ze zo snel mogelijk proberen het bord over te steken. Dit is een verrassend goede tactiek. Ze gebruiken dezelfde primaire informatie als domme en slimme robots.
Slimme Robots
Deze robots gebruiken succesvolle strategieen welke zijn gebaseerd op de ervaring van de normale robots.
Denkende Robots
Deze robots gebruiken klassieke kunstmatige intelligentie-technieken zoals vooruitrekenen en bordevaluatie in een poging goede zetten te kiezen. Het rekenkundige vermogen wat ze nodig hebben staan echter niet in verhouding tot hun mogelijkheid tot het kiezen van zetten.
Wijze Robots
Deze robots berekenen meer dan elke andere robot. Ze spelen dan ook beter dan elke andere. Dit type robot zal een goede menselijke speler onder druk zetten.
Index filler/res/friendless/games/filler/help/nl/tournaments.html0100664000076400007640000000460007224552024023134 0ustar johnjohn Toernooien

Toernooien

Het is mogelijk in Filler om toernooien te organiseren. Je kunt toernooien onder robots onderling organiseren, maar je kunt zelf ook meedoen. De volgende soorten van toernooien zijn beschikbaar:
Round Robin
In dit soort toernooien komt geen winnaar naar voren. Alle spelers spelen tegen alle andere spelers.
Knockout
Wanneer een speler een spel verliest, doet hij niet meer mee aan 't toernooi. Diegene die als laatste overblijft, wint. Alle spelers spelen grofweg eenzelfde aantal wedstrijden.
Basho
Deze toernooivorm is gebaseerd op sumo-worstel toernooien. Er is een vast aantal ronden. Elke speler speelt tegen elke andere speler van vergelijkbare sterkte. De speler met de meeste overwinningen aan 't eind van 't toernooi wint. Als meerdere spelers hetzelfde aantal overwinningen hebben behaald, zullen er Round Robin eliminatieronden gespeeld worden.
Uitdagingen
Menselijke spelers mogen in deze toernooien niet meedoen. De computerspelers dagen elkaar uit in een poging hun rang te verhogen. Er is geen uiteindelijke winnaar.
Ga naar het Toernooipaneel om een toernooi in te stellen en te beginnnen. In de eerste kolom kun je de regels van het toernooi kiezen. Door de checkbox Doorlopend te markeren stel je in dat zodra het toernooi is afgelopen een nieuwe begint. Het omschrijving-paneel geeft je een kort overzicht van de regels van het toernooi To configure and run a tournament, go to the Tournament Panel. The first column lets you choose the rules for the tournament, which are restricted to the form of the tournament. The Continuous checkbox lets you choose that once a tournament has finished, a new one starts immediately. The Description panel gives you a brief summary of the tournament rules.

The second column is the list of players selected to play in the tournament. The players are ordered in descending order of rating. Initially, all players are selected.

The third column contains a Description panel, describing the player last selected or deselected in the Players list. At the bottom of the third column is the "Play Tournament" button. Clicking this button will switch the game to the Play panel and start the tournament.

Index filler/res/friendless/games/filler/robot.png0100664000076400007640000000216007224552024020160 0ustar johnjohnPNG  IHDR%X)gAMA abKGD pHYs  ~tIME )#7IDATxVMK#I~2xDED@5aΟ<2 AA<,2=ALWڙ9 Eu~<E׷cX[[ZCJ 0L#O)$3J1+ qrr❝mlnnn ! >5/XDN )ZVu҃(ʉ(9HM\eDՊy H&8 R~dkNnpG `uueya[n,fww75{b[nVL?Lzm”a# |)r۪] XE)l*Fg7aHJº| Dz,u2{"D~X%{1@ku]pA "z.rmM1& Wkr^U&9u`Xu za}ovpYū`pH}}jvRY7ؙPstv_#s~e/J{kuI q΅,|)\AwLyQp<G pG|>86k$Ak!+dSjwj8B)ue(W4MV_k "NDa;[1F_8 OSK\1D6M<4ARaT8R10,%9b @[@؏;OoBXʔxnXq"7pi[( {snSe[UիW2+ G`.y zIO$#oƃ$tk35w.`*ߏ#7s"CuMM nM8,?zBKJ7IENDB`filler/res/friendless/games/filler/armorine.png0100664000076400007640000000134507224552024020653 0ustar johnjohnPNG  IHDRO|vgAMA abKGD pHYs  ~tIME 6g@bIDATxn1@.Gt2f[|i"%"I]׷wβ<Rm^6Q`&/`5SERSۜ3krP>䍑q_+a9n~̶a)57ZɈz<z4^5QOBچ|DE bנM J{EpSe6i/3V\ s\3f ,U`*%` һUB93'ThE` #%⑧+QwA"I=x2A%F=ccǶUɲpd%,{eP PwtcXMϋ9V($ӊU;U!ߙ+[:DͻpWAF5^N *W hSe0.7=\t`nNӮs`\nyv g&韪mTiJKwo}*ǪTVثx@F"]C6{\ޚsžb a;?N#8,81vCȴ'+G1d&]DgIENDB`filler/res/friendless/games/filler/blueAlien.gif0100640000076400007640000000026107224552024020706 0ustar johnjohnGIF89a{{{{!,vx+6M0Ahe^XrW=$m1)yJC`94 i!^>Ȯ]eܹdzBߛz'of% @{u8~*W 4$}F ;filler/res/friendless/games/filler/greenAlien.gif0100640000076400007640000000026107224552024021057 0ustar johnjohnGIF89a{{{{!,vx+6M0Ahe^XrW=$m1)yJC`94 i!^>Ȯ]eܹdzBߛz'of% @{u8~*W 4$}F ;filler/res/friendless/games/filler/resources_ru.properties0100664000076400007640000003353707224552024023177 0ustar johnjohnfiller.title=Java Filler filler.title.settings=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 filler.filename.splash=splash.gif filler.string.choose=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 filler.string.h2h=\u041e\u0434\u0438\u043d \u043d\u0430 \u043e\u0434\u0438\u043d filler.string.wins=\u041f\u043e\u0431\u0435\u0434\u044b filler.string.cfgplayers=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 filler.string.cfgtourn=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0443\u0440\u043d\u0438\u0440\u0430 filler.string.rankings=\u0420\u0435\u0439\u0442\u0438\u043d\u0433\u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 filler.string.h2hrec=\u0421\u0447\u0435\u0442 \u0438\u0433\u0440 \u043e\u0434\u0438\u043d \u043d\u0430 \u043e\u0434\u0438\u043d filler.string.choose2edit=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f filler.string.addhumanplayer=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 filler.string.editplayer=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 filler.string.playerdescription=\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430. filler.string.tourndescription=\u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b \u0442\u0443\u0440\u043d\u0438\u0440\u0430. filler.string.tournrules filler.string.help=\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0433\u0440\u044b \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. filler.label.continuous=\u0411\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 filler.label.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 filler.label.players=\u0418\u0433\u0440\u043e\u043a\u0438 filler.label.settings=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 filler.label.play=\u0418\u0433\u0440\u0430\u0442\u044c filler.label.ok=OK filler.label.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 filler.label.tournament=\u0422\u0443\u0440\u043d\u0438\u0440 filler.label.playtournament=\u0418\u0433\u0440\u0430\u0442\u044c \u0442\u0443\u0440\u043d\u0438\u0440 filler.label.rankings=\u0420\u0435\u0439\u0442\u0438\u043d\u0433\u0438 filler.label.tournrules=\u041f\u0440\u0430\u0432\u0438\u043b\u0430 filler.label.roundrobin=\u041a\u0430\u0436\u0434\u044b\u0439 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c filler.label.knockout=\u041f\u0440\u043e\u0438\u0433\u0440\u0430\u0432\u0448\u0438\u0439 \u0432\u044b\u0431\u044b\u0432\u0430\u0435\u0442 filler.label.basho=Basho filler.label.challenge=\u0412\u044b\u0437\u043e\u0432 filler.label.enable=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c filler.label.addplayer=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c filler.label.help=\u041f\u043e\u043c\u043e\u0449\u044c filler.ranking.NOVICE=\u041c\u0430\u0435\u0446\u0443\u043c\u043e filler.ranking.CLASSA=\u0414\u0436\u043e\u043d\u043e\u043a\u0443\u0447\u0438 filler.ranking.CLASSB=\u0414\u0436\u043e\u043d\u0438\u0434\u0430\u043d filler.ranking.CLASSC=\u0421\u0430\u043d\u0434\u0430\u043d\u0435 filler.ranking.CLASSD=\u041c\u0430\u043a\u0443\u0448\u0438\u0442\u0430 filler.ranking.EXPERT=\u0414\u0436\u0443\u0440\u0438\u043e filler.ranking.MASTER=\u041c\u0430\u0435\u0433\u0430\u0448\u0438\u0440\u0430 filler.ranking.INTLMASTER=\u041a\u043e\u043c\u043e\u0441\u0443\u0431\u0438 filler.ranking.GRANDMASTER=\u0421\u0435\u043a\u0438\u0432\u0430\u043a\u0435 filler.ranking.SUPERGRANDMASTER=\u041e\u0437\u0435\u043a\u0438 filler.ranking.WORLDCHAMPION=\u0415\u043a\u043e\u0434\u0437\u0443\u043d\u0430 filler.mainpanel.name=\u0418\u0433\u0440\u0430 filler.settings.name=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 filler.string.matchresult={0} \u043f\u043e\u0431\u0435\u0434\u0438\u043b {1}, {2} points to {3}. filler.string.cantload=\u041d\u0435 \u043c\u043e\u0433\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 {0}. filler.string.challenges={0} \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 {1}, \u043d\u0430\u0434\u0435\u044f\u0441\u044c {2} \u043e\u0447\u043a\u043e\u0432. filler.string.knockoutwinner=\u041f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c \u0442\u0443\u0440\u043d\u0438\u0440\u0430 \u0441 \u0432\u044b\u0431\u044b\u0432\u0430\u043d\u0438\u0435\u043c {0}. filler.string.bashowinner=\u041f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c \u0442\u0443\u0440\u043d\u0438\u0440\u0430 {0}. filler.string.basholeader={0} \u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0432 \u0442\u0443\u0440\u043d\u0438\u0440\u0435 \u0441 {1} \u043f\u043e\u0431\u0435\u0434\u0430\u043c\u0438. filler.string.winner={0} \u043f\u043e\u0431\u0435\u0434! description.Human={0} \u043e\u0447\u0435\u043d\u044c \u0445\u0438\u0442\u0440\u044b\u0439 \u0438\u0433\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043b\u044e\u0431\u0438\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c. description.Dieter={0} \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043a \u0446\u0435\u043d\u0442\u0440\u0443 \u0441 \u043c\u043e\u043b\u043d\u0438\u0435\u043d\u043e\u0441\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e, \u0437\u0430\u0442\u0435\u043c \u0432\u0437\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f. description.Sachin={0} \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0430 \u0434\u043e\u0441\u043a\u0435. description.Aleksandr={0} \u0443\u043c\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 \u0443\u0433\u043e\u043b \u043d\u0430 \u0434\u043e\u0441\u043a\u0435. description.Wanda={0} \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u044f\u0442\u044c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u0434\u043e\u0441\u043a\u0435. description.Margaret={0} \u0438\u0433\u0440\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0431\u0435\u0440\u0435\u0442 400 \u0442\u043e\u0447\u0435\u043a, \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0442\u043e\u0447\u043a\u0438. description.Basil={0} \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0442\u0435\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. description.Che={0} \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0432\u0434\u043e\u043b\u044c \u043a\u0440\u0430\u044f \u0434\u043e\u0441\u043a\u0438. description.Claudius={0} \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0443\u0433\u043b\u0443. description.Cochise={0} \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u0442\u0435\u0442, \u0437\u0430\u0442\u0435\u043c \u0430\u0442\u0430\u043a\u0443\u0435\u0442 \u0432\u0434\u043e\u043b\u044c \u043a\u0440\u0430\u044f \u0434\u043e\u0441\u043a\u0438. description.Eldine={0} \u0438\u0433\u0440\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u0443\u044e \u043e\u0431\u043e\u0440\u043e\u043d\u043d\u043e-\u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0440\u0438\u044e. description.Hugo={0} \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0446\u0432\u0435\u0442\u0430 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. description.Isadora={0} \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u0437\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0445\u043e\u0434. description.Jefferson={0} \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043f\u043e \u0434\u0435\u043c\u043e\u043a\u0440\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443. description.Luigi={0} \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0446\u0435\u043d\u0442\u0440 \u0434\u043e\u0441\u043a\u0438 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0442\u0443\u0434\u0430. description.Mainoumi={0} \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0446\u0432\u0435\u0442, \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0440\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043b\u0430\u043d\u044b. description.Makhaya={0} \u0438\u0433\u0440\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0431\u043e\u0440\u043e\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e. description.Manuelito={0} \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0434\u043e\u043b\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043e\u0441\u043a\u0438. description.Omar={0} \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0439 \u0445\u043e\u0434. description.Rosita={0} \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0434\u0430\u043b\u044c\u043d\u0438\u0435 \u0443\u0433\u043b\u044b \u0434\u043e\u0441\u043a\u0438. description.Shirley={0} \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0446\u0432\u0435\u0442\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. description.roundrobin=\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0433\u0440\u043e\u043a \u0438\u0433\u0440\u0430\u0435\u0442 \u0441 \u043a\u0430\u0436\u0434\u044b\u043c. \u0412 \u044d\u0442\u043e\u043c \u0442\u0443\u0440\u043d\u0438\u0440\u0435 \u043d\u0435\u0442 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044f. description.knockout=\u041f\u043e\u0431\u0435\u0436\u0434\u0435\u043d\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0431\u044b\u0432\u0430\u0435\u0442. \u041f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044b\u0439 \u043d\u0435\u043f\u043e\u0431\u0435\u0436\u0434\u0435\u043d\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u043a. description.basho=\u041f\u0440\u043e\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043c\u0430\u0442\u0447\u0438 \u0441\u0440\u0435\u0434\u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0441\u0438\u043b\u044b, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0435\u0441\u0441\u043f\u043e\u0440\u043d\u044b\u0439 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c. description.challenge=\u0418\u0433\u0440\u043e\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442, \u0441 \u043a\u0435\u043c \u043e\u043d\u0438 \u0445\u043e\u0442\u044f\u0442 \u0438\u0433\u0440\u0430\u0442\u044c. \u041f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u043d\u0435\u0442. \u041c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u043e\u0431\u043e\u0442\u044b. player.name.Human=\u0427\u0435\u043b\u043e\u0432\u0435\u043a player.name.Dieter=\u0414\u0438\u0442\u0435\u0440 player.name.Sachin=\u0421\u0430\u0448\u0438\u043d player.name.Aleksandr=\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 player.name.Wanda=\u0412\u0430\u043d\u0434\u0430 player.name.Margaret=\u041c\u0430\u0440\u0433\u0430\u0440\u0435\u0442 player.name.Basil=\u0411\u0430\u0437\u0438\u043b\u044c player.name.Che=\u0427\u0435 player.name.Claudius=\u041a\u043b\u0430\u0432\u0434\u0438\u0439 player.name.Cochise=\u0413\u043e\u0447\u0438\u0437 player.name.Eldine=\u0415\u043b\u0434\u0438\u043d player.name.Hugo=\u0425\u044c\u044e\u0433\u043e player.name.Isadora=\u0410\u0439\u0441\u0435\u0434\u043e\u0440\u0430 player.name.Jefferson=\u0414\u0436\u0435\u0444\u0444\u0435\u0440\u0441\u043e\u043d player.name.Luigi=\u041b\u0443\u0438\u0434\u0436\u0438 player.name.Mainoumi=\u041c\u0430\u0439\u043d\u043e\u0443\u043c\u0438 player.name.Makhaya=\u041c\u0430\u043a\u0430\u044f player.name.Manuelito=\u041c\u0430\u043d\u0443\u044d\u043b\u0438\u0442\u043e player.name.Omar=\u041e\u043c\u0430\u0440 player.name.Rosita=\u0420\u043e\u0437\u0438\u0442\u0430 player.name.Shirley=\u0428\u0438\u0440\u043b\u0438filler/res/friendless/games/filler/resources_fi.properties0100664000076400007640000001122507224552024023135 0ustar johnjohnfiller.title=Java-pohjainen Filler filler.title.settings=Filler-asetukset filler.filename.splash=splash_fi.png filler.string.choose=Valitse pelaaja filler.string.h2h=Tilanne pareittain filler.string.wins=voittaa filler.string.cfgplayers=Pelaajien asetukset filler.string.cfgtourn=Turnajaisten asetukset filler.string.rankings=Pelaajien sijoittuminen filler.string.h2hrec=Tulokset pareittain filler.string.choose2edit=Valitse muunneltava pelaaja filler.string.addhumanplayer=Lis pelaaja filler.string.editplayer=Muuta pelaajan tietoja filler.string.playerdescription=Lyhyt kuvaus tietokonepelaajan strategiasta ja kyvyist. filler.string.tourndescription=Lyhyt turnajaissntjen kuvaus. filler.string.help=Pelin juoni ja muuta jyn. filler.label.continuous=Jatkuva filler.label.description=Kuvaus filler.label.players=Pelaajat filler.label.settings=Asetukset filler.label.play=Aloita filler.label.ok=OK filler.label.cancel=Peruuta filler.label.tournament=Turnajaiset filler.label.playtournament=Pid turnajaiset filler.label.rankings=Sijoittuminen filler.label.tournrules=Snnt filler.label.roundrobin=Kaikki vs. kaikki filler.label.knockout=Tyrmys filler.label.basho=Mtkijiset filler.label.challenge=Haaste filler.label.enable=Aseta kyttn filler.label.addplayer=Lis filler.label.help=Ohje filler.ranking.NOVICE=Maezumo - aloittelija filler.ranking.CLASSA=Jonokuchi - harrastelija filler.ranking.CLASSB=Jonidan - keskivertoharrastaja filler.ranking.CLASSC=Sandanme - varsin kokenut filler.ranking.CLASSD=Makushita - taitaja filler.ranking.EXPERT=Juryo - ammattilainen filler.ranking.MASTER=Maegashira - mestari filler.ranking.INTLMASTER=Komosubi - suurmestari filler.ranking.GRANDMASTER=Sekiwake - guru filler.ranking.SUPERGRANDMASTER=Ozeki - gurumpi filler.ranking.WORLDCHAMPION=Yokozuna - superguru filler.mainpanel.name=Peli filler.settings.name=Asetukset filler.string.matchresult={0} voittaa (vs. {1}), {2} - {3} pistett. filler.string.cantload="Pelaajan {0} lataaminen eponnistui. filler.string.challenges={0}: {1} haastettu, {2} pisteen toivossa. filler.string.knockoutwinner=Tyrmys-turnajaisten voittaja on {0}. filler.string.bashowinner={0} voittaa mtkijiset. filler.string.basholeader={0} johtaa mtkijisi, {1} voittoa. filler.string.winner={0} voittaa! description.Human={0} on ovela epeli joka ei pid hvimisest. description.Dieter={0} rynt kohti keskustaa ja kasvaa sitten rjhdysmisesti. description.Sachin={0} valtaa nopeasti kaksi strategista paikkaa laudalla. description.Aleksandr={0} on terv pelaaja joka pyrkii valtaamaan laudan parhaan nurkan. description.Wanda={0} yritt varmistaa itselleen strategisia pisteit laudalla. description.Margaret={0} on strategi 400 pisteeseen asti ja pyrkii sitten kermn helppoja pisteit. description.Basil={0} yksinkertaisesti laajenee mahdollisimman nopeasti. description.Che={0} laajenee laudan reunoja pitkin. description.Claudius={0} juoksee kohti sinun nurkkaasi. description.Cochise={0} laajenee aggressiivisesti, sitten hykk laudan reunoja myten. description.Eldine={0} on sekoitus puolustajaa ja hykkj. description.Hugo={0} valitsee vrit jrjestyksess. description.Isadora={0} pyrkii saamaan mahdollisimman paljon pisteit joka vuorolla. description.Jefferson={0} yhdist eri strategiat demokraattisesti. description.Luigi={0} kaappaa laudan keskustan ja laajenee sielt ksin. description.Mainoumi={0} harjoittaa psykologista sodankynti ja valitsee vastustajansa kannalta parhaan vrin. description.Makhaya={0} pelaa hyvin puolustuspainotteisesti. description.Manuelito={0} laajenee hitaasti laudan reunoja pitkin. description.Omar={0} kytt tekolyn lytkseen parhaan siirron. description.Rosita={0} yritt kaapata kauimmaiset nurkat. description.Shirley={0} valitsee vrins sattumanvaraisesti. description.roundrobin=Kaikki pelaavat kaikkia vastaan, ei voittajia. description.knockout=Kun pelaaja on voitettu, hn putoaa pelist. Voittaja on pisimpn selviytynyt pelaaja. description.basho=Tasavkiset pelaajat pelaavat toisiaan vastaan kunnes selv voittaja lytyy. description.challenge=Pelaajat valitsevat vastustajansa, ei voittajia. Vain robotit ottavat osaa. player.name.Human=Ihminen player.name.Dieter=Pietari player.name.Sachin=Saana player.name.Aleksandr=Aleksanteri player.name.Wanda=Laina player.name.Margaret=Margaret player.name.Basil=Taavetti player.name.Che=Che player.name.Claudius=Claudius player.name.Cochise=Cochise player.name.Eldine=Eldine player.name.Hugo=Urpo player.name.Isadora=Isadora player.name.Jefferson=Koivisto player.name.Luigi=Luigi player.name.Mainoumi=Samperi player.name.Makhaya=Makhaya player.name.Manuelito=Manuelito player.name.Omar=Samuli player.name.Rosita=Jaska player.name.Shirley=Turpo filler/res/friendless/games/filler/splash_fi.png0100664000076400007640000002154707224552024021015 0ustar johnjohnPNG  IHDR,RUgAMA abKGD pHYs  #utIME  IDATx]hٝEI"c#O0Z yur%Cw_- H!0K`s(Y4fC A!Fۊ/KaHx'h715aũꮏs?NkRW>SOSC B CCyA  ")$XAh A@E6` $XAh A@E6` $XAh A@E6` $XAh A@E6` $XAh A@E6`$ @5&i,|UCt>cH0=Ġ3UɗMNº~o~ӷT*e i2嬬׿{4;Zd1؂+D|}+sڹo%4EE,繄Zi fJRku:kkMN1nY/˜sY tynX8>$1nYVhyT.o'ӳ$b<>b[ūU϶s𑑑>[9@bO4~5Ϧ0>}Zv,! [9ԟʕVWbE1{;J2`Ri'샧`eeeJov(oR benےV x8\.YPuL ,o+\.Z9me1|RsΥ-Vkkn $i4M_Nv}ZjN ds_ ίlP4 L Ky n_G?Q~:֗!Z/< \n 04xwgaCD>M=CR/";u?~d8q{{{.Aʯ[jxahlĖAQ `=:8 Dɓ\ *( 0;+n(cW{yG?..W|M.MLB\w/AewYu_Ade gH p&>l-r;'$4WԾ7矋6D ױ{pv!/0جt&)JNJpsmsp[-a#ۢ[YΞ'+0/\ q3vZˣ7'1M&'#?? hs5o_Z`kP0_|n{[_w.K`˓ Ҡ`Yׯ?FBçO ^|v:/eܜoV!O~wPYh]mn?Ө J_[]d9=|Z:ߍOn8;As)AxN\N8̽廧F Ӓyq߉1q-,[FL޴ eayYիQ ߎb⇸d-$BѯX{)U~9o)zog5`Dm _L (Wx饗|;Z7/lr{{{w67mXGR}eK;e;l>he;^0oϽ[U7M4 T*HuLOuT*%޾#7vvv z&pyZ!AģkddıEirƍQ׺cAx|nxdS\{1g1Hz=p\T+˼^ޛ.a[oݶmskWbVo{rj5pnY΢>2 >vI<[4e%J nCl5}K$>h7JzD5cccs2EVՔJo>Qw(N`FS-Tl+⮀qu 8ؘX!Xᖡ^ϿP3i+Xٞ֓=Aض-Nˁu\sV9]iT%mr,4[-!sBaYg}tm:,K>vD—wgtF0L|y޲[&7l7|V!<;2 ;\wr`@>j* ~m;=pmk04Ԋ~ [fT* ܛ.zuO-)Ad@Kr1}2uN By,:&ĂU Dك.7YXXjxu{SGiR1 ’gOF7GC9q)qݛmem"~x7Mܿ`cCu|u}r>=zE.*ڦGf%{c§$tPC^Lo&&YO8NeT2Yeþ{D111n߿8 Kɝݳꦘzr(QJ8|E!J;ΎrttK$`Lz(~8<<y= O?4Jf.FIdsp(KS\s8.{EpT*wTɒe`Ԫ/@\.sXXc0 $ Jל$[Bi]Zj1S.4!ujǏwŗ%4#ӓ *ꅗJE[aum?'H˯]":y'?kh`ssG6Q0ڍKbC5Ƥe9;o_X!fgErYZ45$t'`g?j c їZ',˒޲ömT\+iʿ  TPƨƻ$)ΥpyeY4Ieamfno p?ҡSMq/`E@%Z*Z-렢Y2rkkąspHGPZ9$zWr> )fXT{+7RlWd2vExEcvK&ZWbl}s67Nkil6& )g/ =k`]XwՇuta|Agnj ~=Ya36K[[AxSM|̶D:{[؂ťh+Xϟ?sssͯK Xo~ "ϱk׮2hi+Xi`k :C;/wy0cbb"Uqc$XAC߿7n[ee8Žyt!t(ay 47zj&ѪЊEz zBz{jǩ ߫ !^81[C^~!69kkw0!MrG+$5Ȧ1 ۶!+/iz gkpuKĊsId%Vs^rCCk "XVky˅/&xb\R` OЂ%-A+`;9[:ArSC_\ +gy.g+К)$pYOTU^(| R)hRsurʇ|o>Pƫrv^ rkjjS>ࠛ,..K;>Ffgg'x䍷>GVXn>| Dl 6 j~\.gUOoFOIbdq ć+wCG8 M'm*AM>[>jUUVIwERVJ:Q94')%~i~DbmTsӃ3w*` c[MC`/-R\t!+gϑ`m]_1e"/[|%-1\_w )X7%nB3Qc3jPpE%o t㺂!*`y[IeT]Lp?!bY^^;O"_pŋC$L pˑ䵦p .]d;Q){tYw7"R$sua7*Eٳ֖P4[o3Z->>,^,Iis50$((!q&ezzmxTVͣaEyƖdL ᐋR541("V(Xy[,KBXIE7E?$SW&Oy3]_^sū.tu̡QNלQb<ҍ`[VU0%]G\ ,Y|y[VXfYI'OTc+Zy|8/}i)0wDW7 ff)`hVVϕǟ|SQG 'K7=,AOO<5{{}]_M![Xmg~hWgчkr-3gh(XaDNj.|J9a't… yG7N|zч~أH 1X,1NK(:{ s w$OjxMj  0Cq=ڷnI&B4nE{.z]a&OS9c/ 3*_}C%V 0ϜQN.+9揭/`1lccc9vmwQK%Y*ߵ |o9u &s{Ū2c||'VnRͱ|GSa˽,u:.D<"_88gϘ)kQ˳N'nGJ}b;‚8~>w, r,/eK/z$-U" W%՟чAbZSbhQN<8/XSii_پoj-} 4T*a!u_7@!(@")ITP}asX|QȱQ~NMPa9OeVt N![Xq,]^WWWu%aK֣ԑ!i_^=:ah"\2ud‘CRam @.eu*E0>9Uw%/U}QKiT8 1XP"X*;C5'cqSw{zqYU)oR$ DC_b/c$;1o+X?U>E[Xh˥$H<"9'xҗU;;}YOvww ~Tb`X V-pɒrF*K~z=zzah^(KǏw^` HymڵCa{ =>řS֐qn%xqRw~"Ki^K^N"ǹh[KIrc }!VD4? *oz˝?[xDr#XC=`F<޲g07Y}V]!jNӜ}(z 77 B nܸivV̝eYbc6Ս zty!N4{TF|?yD<$@))ȉN&ZƋ>w,fXk?+KX; { pC9L1uw}.\Bc+.]T#?1OOO㗿% x ]d?=~_ggڭmE_  yi1 /^ omIDATp!}%`irGG~FK?.Yyx|W')kֻA)v/a#GZ) c֐H-/XJ[CT2 CJ `y okhM G( s۶m۹rS874 [Z %MDzb^ VcTxkW0̍Z{1 SuT*eYdf&w+h='97zC8iZO}BM$O|Rb7"u2\TwFAS%fǦ[ǗDn$&y+n4B'D#H8D28B, T%>H2 Ah6p_ߪ;7,A$"ͦVVBD?lcHA6ubbb"T =SS8y$ngs싧qA+(qG  |92{Cޱ4aQWw%钐 IL5pch(4)ЫC(6"-C{f!($  "BH,  m "BH,  m "BH,  m "BH,  m "BH,  m2 FAQt5xIENDB`filler/Makefile0100664000076400007640000000206507224552024012471 0ustar johnjohnJAR=filler.jar # where Filler keeps its files DEST=/usr/local/filler # where the executable should go FILLERPATH=/usr/local/bin RM=/bin/rm DIR=src/friendless/games/filler $(JAR): mkdir classes || $(RM) -rf classes/* javac -d classes src/friendless/awt/*.java javac -classpath classes -d classes $(DIR)/*.java $(DIR)/player/*.java $(DIR)/remote/*.java $(DIR)/remote/messages/*.java cp -R res/* classes cd classes && jar cmf ../other/metainfo.txt $(JAR) friendless mv classes/$(JAR) . clean: $(RM) -rf classes # existing tars $(RM) -f *.tgz # JBuilder backup files find . -name "*~" -print | xargs $(RM) -f # xv rubbish? $(RM) -rf res/friendless/games/filler/.xvpics install: clean install -m644 -D $(JAR) $(DEST)/$(JAR) install -m666 -D other/ratings.ser $(DEST)/ratings.ser install -m755 -D other/filler $(FILLERPATH)/filler uninstall: $(RM) -rf $(DEST) $(RM) $(FILLERPATH)/filler windows: $(JAR) mkdir windows || $(RM) -rf windows/* cp -f $(JAR) windows cp -f other/filler.bat windows cp -f other/ratings.ser windows cp -f other/filler.ico windows filler/TODO0100664000076400007640000000077007224552024011522 0ustar johnjohn * Development release FOR RELEASE 1.02 * Remove System.out.printlns which are replaced by tournament results. * Remove use of "\n" * Badcode FOR RELEASE 1.1 (or later point release) * Web page. * Write developer guide. * Modify I18N to say how to run in different locale. * Add RPM to Makefile. * Cancel button disabled for interactive games, works immediately for non-interactive. * Tooltip for Play tab. FOR RELEASE 2.0 (or later major release) * Run as an applet * Multi-player filler/CHANGES0100664000076400007640000000225207224552024012022 0ustar johnjohnSince 1.01 ---------- * Added 'inc' to 'other' directory. This is the code header you include to say that the code is released under GPL. * Removed resources_de.properties, resources_fr.properties, as I wrote them and they were pretty bad. * Added sortByRandom() to PlayerWrappers. * Added 'build.xml' to 'other'. This is for use with ant. * Cleaned up some access privileges on some fields, cleaned up some bad identifiers. * Added Kris Verbeeck's RemotePlayer. Since 1.0 --------- * Added INTERNATIONALISATION file. * Added 'filler.spec' to 'other' directory. * Removed erroneous line from resources.properties * Changed filler script to pass extra parameters through to Java * Changed filler script to pass LANG variable as user language. * Modified Filler.java to work around a bug in Sun's JDK1.3 for Linux, where the default locale was always en_US no matter what the user.language setting was. Filler now uses a method similar to that in the Locale class to figure out what the locale should be. * Fixed bug where player descriptions were not i18ned correctly. * Added Finnish translation by Sini Ruohomaa. * Added Russian translation by Alexei Sinitsyn.filler/doc/0040775000076400007640000000000007224552024011576 5ustar johnjohnfiller/doc/devguide.html0100664000076400007640000001152607224552024014262 0ustar johnjohn Filler in Java Developer Guide

Filler in Java Developer Guide

Introduction

This document describes how the robot players in Filler are implemented, gives some ideas on how to go about writing your own.

The first rule is that all player classes must go in the package "friendless.games.filler.player". After you have written a new player class, add its class name to the String[] PLAYER_CLASS_NAMES in PlayerWrappers. That will cause the game to try to load the class and present it as a computer opponent.

All players must implement the interface FillerPlayer. However, it is most convenient if they subclass AbstractFillerPlayer, as that class provides some methods which help the player to look at the board and do some basic calculations. The only class which directly subclasses AbstractFillerPlayer is HumanFillerPlayer, which allows a player to play from the GUI console.

There are various types of robot player, varying in levels of intelligence. Each class implements some algorithms, and the player classes simply choose which algorithm to invoke. In order of increasing intelligence, the robot classes are DumbRobotPlayer, RobotPlayer, LookaheadRobotPlayer, and OptimalRobotPlayer. Each is described in detail in a following section.

FillerModel

The FillerModel class implements the model which is displayed by the GUI and given to the robot players to explain what the state of the board is. Each hexagon on the board is given a unique integer index, numbered from 0 to FillerSettings.SIZE. There are 95 columns of hexes (numbered 0 to 94), with 14 or 15 hexes in each column (numbered from 0 or 1 to 14). The even numbered columns (48 of them) start numbering at 1, odd-numbered start at 0. There are, in total, 95 * 15 - 48 = 1377 hexes. However, the 0 numbered rows of the even columns are still used in the numbering scheme, they are just invalid. A player needs at least half of the hexes to win, i.e. 689. These numbers are defined in FillerSettings, and should not be assumed to be immutable for all time. FillerModel provides the following methods to assist in using this numbering scheme:
int makeIndex(int x, int y)
Returns the index (from 0 to 1424) of the piece with column x and row y.
int getX(int i)
Returns the column number of piece i.
int getY(int i)
Returns the row number of piece i.
boolean valid(int i)
Returns whether i is a valid piece number, i.e. returns false only for row 0 of even numbered columns.
int[] neighbours(int i)
Returns an array of indexes of neighbours of piece i. The array is a number of valid entries, optionally filled with a number of invalid entries equal to FillerModel.NO_NEIGHBOUR.
boolean isPerimeter(int i)
Returns whether piece i is on the edge of the board.
I know that using integers in this manner is not the most object-oriented way of coding, but these methods are used thousands of times in each turn, and must be fast. FillerModel also defines methods called allocate, allocateDistance, allocateFree and allocateTypes which implement the core functionality for the player algorithms. These shall be described as required later.

FillerPlayerSpace

FillerPlayerSpace is a data structure in which the allocate* methods in FillerModel do calculations. It contains the following arrays, each with one entry for each piece on the board.
boolean[] listed
When pieces on the board are being traversed, initially false and set to true when a piece has been visited.
int[] counted
The data that is built up during calculation. This data structure is deliberately similar to the array which keeps the colours of pieces on a board.
int[] border
A list of pieces on the frontier during board traversal.
boolean[] reachable
True if and only if this player can reach this piece.
boolean[] hisReachable
True if and only if the other player can reach this piece.
int[] distance
The minimum number of turns that it will take to reach this piece.
The space has the following methods:
reset()
resetListed() and resetCounted()
resetCounted()
Zero the counted and distance arrays.
resetListed()
Set the listed array to false.
resetReachable()
Reset the reachable and hisReachable arrays.

Very Stupid Robots

Very stupid robot players (in Version 1.0, Hugo and Shirley) extend the class DumbRobotPlayer. The DumbRobotPlayer class implements strategies which do not look at the FillerModel at all, and hence can't be very good.

Normal Robots

Thinking Robots

Smart Robots

filler/doc/blueAlien.gif0100640000076400007640000000026107224552024014153 0ustar johnjohnGIF89a{{{{!,vx+6M0Ahe^XrW=$m1)yJC`94 i!^>Ȯ]eܹdzBߛz'of% @{u8~*W 4$}F ;filler/doc/optimalrobotplayer.png0100664000076400007640000002746407224552024016246 0ustar johnjohnPNG  IHDRI֙jgAMA abKGD pHYs  ~tIME Y^ IDATxͯ\yޫA`e;e{$ '4R``.l\nd^*c˲@ 5ɬi׷7H8(션 0YnuU:o9U }>ԩg6o)mR꥗_{9==}A?޻ߚw*F`$}-JZnB=|G{ {;OA|&Uh\ߋ/8\e:ka+;GLk􋿿Å^fpq\$/<%_s8 ro#=W-^_?Z,v_n/~Rg c.Ưwm;8*ru:E2 kf xn<|I+͐;]+odOu> Ǯ|:$eDN1>n}a7?~?xP]bq{ثũ߭%m+Ɍ#{w[bx7oǺvm\?4t]-[;'Rdw&gZ+~?6?oTJ={}_/| mJkJ_{~?4?ȧ@? Bo|ݮ_,NS@L}0}}s?os/NRo~~_PJ x ~˿E/_UJ_UJ}/W[V)o~E)?PƸc>@8e]L;qs?? Ǽ 70Mܼݶz?rlWH ؟۟8bhmYf CMv%wN/{?6?wމ}O~??l~GqG>̗ͯ60x 5C>'*>0RK7J}cv MsW>EkO}"f^N) &}&&3>_J38><t]WV7y{u1qzd2CO0 {&cK=FԈ07?OJ@a`0 &~7 *T&~fwW>zdzzΝzzz\.C[\RoܸqzK.T+O>O< 8ֹ|[I:=P|J58u/ίOܖ!׏>׻T?{uP~Lw1zt齤~Lw-13fhRW^yE?N=1q1uAֹ|[I:=iq Pu?ԋ˵6q{k}nRWU5NNK{G{Ic({h=Mj\N3kg/?~^dxzvvӧS5цK. ._^6 ַJz.wI_^vz5qarvk޾};Գ|7p:`n 0qh| މ@ڷ&3q}tڵkTG{ר :Uᄮn޼IU}8S]H!7ߤ>$uݻw t]cQRI>TPUM_>|2[:Wo+]''oєбOkdikކmAàz٫xIH!=񲣣#rI9"UgGC`W\;J%{tw zSÅO> :I}.<;;Nm2j]|7˯>HzuuU]#BtPê`Ѷ>7q'gsmU瀰ϝNv;;9 7琯1^ǍowRT9s?bxxѶ{>ހz틇*xߠ׾ zxߠ׾ =wPA {0}Q 7Y^Ug/4c>?Y>/c>!T˭qpò[Nj%*H|~bڂL5$W.7WS3)Y_sE4%ι"ëhj8pa`00qh84kʅ pJtuF4%UX\MIs&*"8qsL;xuDHϨސeItA;lpz#& a pzWW#k7NջFQ˫|S, +D4XeC?N}9 WM 9s"|v(]RoTND p:!L^u jRqgmY}GuQU>)h "2l`Bz\"* p8R%!:hr`byukQl\8g8\$YgVQc84 L& Yb5688R%!:h*#||Ds*|Dҕ uDSTp.m3츑u7iNCӛA:q[__;ێ#||Ds*|Dҕ 9jRSTL8w/Π&Ij%N'8gޟPEc}ScSœƦ$,'Q pY0Ir)eGD4%xN?QtdmBMIsD+Y>gf YX "?'ŸӨ5Ǚ L& @xjlJBsؔ$\r9 F4}BsLP "?'ŸӨwڦؔіhFؔ t ]\ӫ7iވQMz;9>,U9"#V_Ć'pfJԘ@cpa:ImfRMIX)iA^n(ND p:F'NDQuAݭw|9o/$67i"|D3{x!Ls%yUhD32YUӨ޶|25xI1$陏h&L)Q%N'G43֫Lwt$J"%8"8iˌ4:feuV,0E%ˍ;*H9.vSD̲Pc\̲\:+p BŢƝk$Z?ˀjې?k,˩ L& @xjlYYgΒ1$u)yDD3n܉<"9y ph*yY :fƘd5638%9%@KII͔q'\d*?;g ∦>1BuA,ќ+)wHp= pt:WUɜ&T[-X-^c\Ds$Ywj~9\,Y\W%ssD4j*jl@a`0"s8%rC^{b2|ςq˅0)ϙYw#UEU4I*s'%=Sɽǩ8Q$=PfjB$Y.) ”,˩};Y!̹T:qu⚢jl aJ"f$X8[S, pzP3Y!̹ЄCU:KMQC& @akl aJ"f$X8[S, pĨz|s.;ad5E3| qyNhF!L>XhT>?*)ٟ_ qJgutZ.Hɏ˷C^U6Ru&ۢ:eM 56=zu|\^ a&E4*I56T> hJ*a;OMW8J傔|[>(ImTfPc8l$NI:klb3ի'&ϸUsUr=nƅj 56kK:u,gW9sP7qTfɫzur%B5*jl@a`056_{5*#Nf56E1˙UMqTfɫzvŵ-7.TJkln6祐k0ypF^c3O*﫛* pz,q=')G>'j* {n=~ocݞ[,vÇڏܻw޽{c'ggggggc'}}''''''cz|||||2_O=dږ<{^)6j̥kutttttd?a??n2N&g|ۼ*?aI6Avovx\9+ub͹brqr!L-\UHI\}\S>g.[9Z,Y.X.ɷK L& @xjl^v>1,;YihΥ pwUmRǭBo ,( HWȆyi;Y>O|Pj39HZ)Rjl klp7MVUtjlJJs:*_Ѽt-d&M9mF5cr u*=ג<|[g\-3Ca&E[kjm̽a-^cs uV4YeNlZ.H9׸|:UhVDklUꝕ8 C֩zR3 R5.߶N:ƩF?jRDM8`00qh84 LFZcs uV49ʿ*Qw1)o[}M1+s56MMo͹*pZ٫wfQh/9Uo;Fϯ陭iz7n\|9Z^պպ\N㪸#ږS‰īgY߳R>7qx7i8>=,]RԜNGۦNg6 i*%9>n\SgboRv5 K Cmuzvƕ-1ˤqxsvg6ްU56\8zg9fOMW+5nxQ%.묓I*o[Nc0 56\8zg9fP7ҞW+>.uYgР=ugJ޽KUsPR:A{ۖSe!Lƭoo{މSw"k& p!L>{.NŒT}u3ܖƭp8>nxAꈶF>=H%f9fV9bc0y:\6od]+ٮ}L&ǡʴ ]7v:l["subo JUT[x]#eBZWoZG~~q Z)&ϊJ-7灶qK$ۅ&}|IN-v5!qt'*=kG}˵WiZ]yU2k1aPDL^px5/$r—SbW#WD#x,6UUkA׈__nO3m&Tɸ<ըS\ IDS\*e<0"`w{o}zzTr*ܜuAy8!J-7Y\}2nS%+^h84 L& Cu#y`V'1dS%+3}BT3Oޢz.sNSFLz记XHoKwi|ϒ(~"J= _xչۓ4vqsyz.Ǘ%Pl{}|pHvW}kmS<0+dU~SUs{Q-ђ~K|xj@lm 4*Uǚq"#|sOs_f7Ir=iT~G!M8 `00qh84 LZG U~·ֹ yz.7+Ө V1vQO ? %Lh*~\k$pzS4Pr=iT~SUxo{:BmY+Qk)k%tg>wr=B;3U\nVPQWOO3Nw݇Թƅk+W_8ujͪ{7|Iw{%^ Թƅk+軫/zHjn&>&0qh84 L&-#P[# !G<26cl\By3G ={IH5;g-uVktVaݳkRk\ֈv S>3Y:&W:+ޠ*Q&Ji ;Et/;tU+mĬ{QC6pa`00qh8 B-}8b8Za:g5voojjZϤn t/m3jJc5Yg%cL|[#@mQ`[K}3کƫzNU+ g:r^M3n KPV}_- DǕJ3i^5o{*ԀK VJf%smx$6Ѐ@a`00qh1z*U1:F-wx*>PJXU0‘Z-Kc3CmJ txU$>juچW*TW+]kQmgҶ垒W$oObχrRTD֖|R)Ө-ιNUIDATUrK1cM%y-gPT5M9UɵR_>GK؄U] z.iC%5:UɵեHDM<M^ x\ϒqUZףmfT^Gb84 L& C G #r=KƝkVukū'1!>Pj|D́qǴq=}Gw ϏQS{.7nY yJ9zxqdǣ#bP$90LږG~;sqj`7s^5Z*e^ؽq]PW??!DmYu'~ϔYܸf50gIs+aT'$1m_^~{~K)7?}ի[P]fnY-@]\JuUܸfū><*]ׅ:_ׯ_JO>۷o~ot 4 L& @!!=)ЖC17"5F]v{ԅk˪=Iw=ҞqmHU%W6[69/Qcj&u5>IS-ҖUS_y5k_īY~GMeT ZR.}DY*YA:d!&6ф:^c~aHITRչuF47'O'pa`00qh84kvy>~uTAUyd}bl:tJfuxd*'ݻwMaUK2N5dG|^AB^ gP{@gū(U*^H }*UYW8I{=ʻ'&gcsYIVaؽ%٥^ u@%z E|K|ūƥīWTnV^dF8%6[:^)ڠ,;Jl'[& @a8zj@#G)CYw,:#WTnV*pnm&{9^_U9SsQoݺuڣyƍ/_|K.y[QU{۳.:Z=KT*p/i|̯u[^uCꪻcڎS;ý[SgTsxq[zEU5l:ՌQTgʼvY V52Nm;iv[=&N>fz#P^Aހvܫ:㎃kl+zmß Yu"-%G|U jw^P7mJ2>P󩂈цǏ7ڡD T%Y1CpTs5 p" L& @à&| oRU>TڡD ~q} xqܢNr{.F-y'N}/1xj~~mqMrjzF4yu׳ڣy52*T^ͥ?o[zC`cz^XǺm޶*y`~5mSlw<@ߩ& R&NNDW{6NmQNW]f#|`JU'Vҳi˫uݖqpE> 7hY՞)%1E 3K?ӕ/c>]Ti-NT'3^̫.Z\j0jM56Q); fYgz&>\:ȢgI̒W pVQc84 L& Azާn+Y+Yg4TY,Y\*jl֣F0}u#72 R޿8츧rpNIJk3uA,e:qWkNѶߩI! dtINIJk:%٥DfbIdN^NJ x> 1<0ݻg^5n8??l8%N>*YTwJT:.S &6̪uSv\A:F(ɪ5Yή׋@a`0S1;YuZQ1>gbC5xghgf%hf_ۦ#vgzӨkۚ&,W629q4Kӫͮ.r8G]D͉~q}o2nqmBj|88 ar9Ibhdьj'?.PcڈDe-”CUќ>'߶\\$jlNu#Vq0%mDD4ɷ-+-gdD\4{},GGەpJ"Fejl΢;ux\QSM a1KI;wo6ΨIN')QLhfϙhҸTѤ$̵By՞hU0nJj)h~E9ucԎTc* pS;%:csb{H"眭v; YT=`[IDYN8˩❒fҹrҁ=sFM8p`00qh84/ @[L;qs`|RJ-۷x>uu v`@R:PDs^5QCAJ"1m%JfUDIˮQGۧ)*Q}uctKJdN҈f * pƫ4Hi4V2dVuLdQ}iu*9tzJ~njtjہq %U:SvDpvvd1d\ɬTȢP؃KTGϙg cޡB j9!6 BC& \NTo#e<IENDB`filler/doc/.xvpics/0040755000076400007640000000000007224552024013166 5ustar johnjohnfiller/doc/.xvpics/optimalrobotplayer.png0100664000076400007640000001032507224552024017624 0ustar johnjohnP7 332 #IMGINFO:492x329 RGB (12084 bytes) #END_OF_COMMENTS 80 53 255 ۖ&I)))&)*)*J)*J-JJ.INNNJNNMsMOnRnrNrsmsrrsrsrrvַnqJrr֗)*%*I*.)J*MJ.JNMJNNNNnNRnNrnSqorrsrrsvrssڲ֖mے %*%*)&)*)*J)*I.JN)NJNNNISIsMOmSnrNrrsnrrsvsrrvqnnmr׺ڷ۶ڷ۶ڷ۶׺۶۶۶۶۶۶ֺ۶ڶ۶ڶ۶ڶֻڶڷڶڷڶڷֻڷ۶ڷIۑnHIIֻڒڒmmmnm-Iַ׺יQڷۑmIm%%mm%H%ڷڒۑmnqmjLEMm%_Q זڶוrnMInH$Ii)ڷuUmMmqmIqnH_׺ڶrmnJlnI%ImI۶YvnqmqqImM_;ֺڻ۶ڶqiqnmm%n$I$n۵U]ummmrmiqIIi׺׺ڲmmirmImir$ImIIIڶxV&KqYiqirrNqE?ۚ 0ڒmiqnmJEMmImI$zU'K&uVڻ:[[VmInIKJKKK&KJ''n'yYrirHmIrhNmDnmImI[Z_Z7Z[?DqeM%mojJ'Knj+JKnJ'K#rJK&Kn<9YkM]YrmMiqiNlJImnHnHIr;mEHwZ?Vv6HnMm۶#n'j+'J'KJ'jKJ&o!+JJK&۶۶׺ֲֶշw^ֺֺղ6ڻۺֻҶҶyXױֲ[ڻۺڻp߶۶ղ<Ҷ[ڒҶֲ=9v[0ڷֲֶҲҶֲYUzQֻֻ<ZX78]Y5֖uۺ׺}v]XvyuGK8#]RY[_PڶYGy8zYY4]nK8ztYuU'EO_z;[ 00 ڷU=GyY8y[;q001IK'nYG\YCRJKJJJKJ''X_6[0Q 0ڒmIoIn&u20_=?(6j66J)z?:ܡqϟ觽AL&dиO8a^ m^'w?ǯpC:\\K0^g0cp×?z#=tXow/I~F5M{i.~Ro`iEyp!TW?y۝z=Ϟ>aXw}$'`58yW=?UX;8﹧RÎ[q[?(]R)Jv֫tQ??g޿'Ã\T'`?w&򽻷n?͕o6WuQiU_&?BQ RWc!~rǯ} J=J{U)w_֟;Ov{__B)?3~}}f0MF7~Qwy\'vŚJ❏0{UZR(m_?RJ͏|oExR7Io}?oO!?Fm%Fr>r_iIqx8q ߿'Jabg0J?ˏ=yy( O 'q^*]Xwgz@2 ޯ=xƟ>mwcחW>g|}}[_xٿ3> dzx=~_-[?}3*]bDu}P+qkeohl{(~?ޜv5ο7>Do~QKz=<߯2td8@ z~Hs*5>?A k@~`r\*68?n4J@n^r1, 9P78@ݐu'''/_bXւkO{8 nqz:VSBo/ȰX v7m.Ύ2u6val+:(#-vAօͽ{}Fձ{S,}v;==jvߴ4Mg^:ԶzWnܸz"hi [RuAI`BnS<"Ukt,;5~Hk m fֺ>wV4޺wmikךk׶mXڭj4Vi m5``ohCp8l[s7MAo,^+7c0†X{ꀌ?kX6gw3$?^M^q 8(^"JVr99P78@ݐuCM?ܹSfI[a&YJ"6Z: ,v: Z_+)_Tm N.eI=cu}2;P,eaR`;t;V{*Xl[X8@ݐuC 9P7ω/4I??lٟ-ºWZlٟie0ޮsq3XbV]eN,vnK!%6eNeB 9P78@ݐuXlK!%6eN,v>+~.ز?';9?';eLltX|}2-srnq!b(़;?*jjTiZu[Jմlڲ?m2KfrCKyèY-?2F+KmY*īs;ø5j19feQ^朗gshʸ<65ja9 9P78@ݐuC sVie(9\%꟯K7nZeeZYRIiϹJU{):D9leO+4\:%h ,̲?ZlHy'%pL!-sņwRnpL!-srnq!\ )4ݦ+ B[\K4Cږy6汦jtPaC*ʩFϹdk_{fH2ƜV k7~"C\F`[ )ksi.\56գVԶ̳EX>ǯB{["G]>UX{f:[fծ=W#Lxy'v9 9P78@ݐuC sViElg#5]wF(إZ*Lg}\¹Jh Y}popsT\.˶Gƥl5ٸE9W q.o]{pK+yd=5Eۉu]˷~ActEΕGG$8ViGB\Q1G9{w](*Ѭ Tans&=˶ q!rn؟D21ȳ*vkyd܃۳9euF ed88{[kU[x\_,pnptX4\ kONs*lH+B|2ćz+w7Me9Y=lBaY)e) pm\e#W!٨3p4eNeB 9P78@ݐuSJn5nЙÆ\kt6BWahϑqGmafu999 )[ޏ,&+,3Wb[bXf9 9^*+ lu&xVUCV>u@zXح ".ۦe*R[?"wL='2Q"E>S>e\{[_[f}VsM|sڣ*ĆĜ{YY7yz6nue={h!yx[V>S>Z[w[f]}V^sͦ[d{\*ҽKrrHIwERBۑsYM%7޺{/_trrwҷۛc|~ʬ5nȬ0`_t='3_7SOeݨjHχ6tu@s6eg@[m\Qc>+s5yoȷWQu@g {9L7dVi뀌ucz6eg@[Ϸ="2$PgU0F=th[~] 9V[_^/g2nȬwQn 񖋩$, h+nlmG؄fzr3p]*ې*eu999_r(ҳ[s&,ѴÀMX[dygRɀ*Ė9+`9uC 9P78@r]2T"=5tOc^π# `_\*L\W 8Mҹ(1t eb/_l}rۑY?|Gq&g߶bI8Ww=S$)2 UsgUBӛS}"3Ȃb}HtVw=.7"ېY=Wю"6QovdV_MW3n%bCfUcynSY㹪UTz!*wdNeB 9P78@ݐuI 8&[Ut2B`qҗGmNJ%#V<#=Wgu~&={%X1_%pwڭ\lo;OYiYڊQl#:go[<[37%nD} {&oX1keiήd2.ǵ,CM$ŬXf~Dqau]7]j3H6nșڱmg˦W2Ϭjju999)8̲ld9n%eaY9RXdYi{Z,srnq!9Ơʠgٟ`3&7LZmHfEewme5ejQX,}FBcX>S>?ƬY{]LHY9W>>Y[:-S4+:&gdd 2hQЬǞUq܀Ad!mgeŲƜ Qge}V{[QC7[K6٬ڬ\YVߐZ <&UQ֣3qaf3D3ayvĺ\]YX&8@ݐuC 9P79 ϛtnJkfH۵Y2K%tiQ5?g p:?.hks%ط[˥:ʶ>nܶ;q_72S܈pڬ\Q^rTav$暦IS2+Zlоnd+t?l[Qf1wtj¨5tm-vv^?K2t=c+w.ڦ4airnq!e΃T,*s1⻖;f+:MbϹOVfg7jyXC5tm-67zXƵ"K #lns*][4nVDvRɠlEXlWdL?'n?d̢D,vf˄rnq!f9Xeq#Mf,Jb紱,zfZqch+)+tRrWؙm9 5}0F{1- Ŧ/(qu 8=SfŖjciD]@{7C{-ղ?'* rnqqٟӠ%LfASfŖ`Yf]L%Vxؐ: q>fbcYdDoeD[C6sxc˶ϙՆWk\ 8,sf!UN,T˄rnq!9iƵ ްؕ5\5mzٳ=U!,v=^d*-Xq`pnh޶noaٞ/߾qzг=[zc[bSX'qR ޟ YX0X]{3qK&= q!rn?doo`)bqoW\ZUteñmW zu= [8lVmzU?Uׯj ZNX,pחVe,ϭKfH۞iRI&D;ٟ w坛vzkʠmaz*2`Nqqۻk]p?ǓL)< bKA^X,^;HN[94bP s,rnq9!p8@\RJ]r%4`"W?”{mnIENDB`filler/doc/greenAlien.gif0100640000076400007640000000026107224552024014324 0ustar johnjohnGIF89a{{{{!,vx+6M0Ahe^XrW=$m1)yJC`94 i!^>Ȯ]eܹdzBߛz'of% @{u8~*W 4$}F ;filler/doc/redAlien.gif0100640000076400007640000000171307224552024014001 0ustar johnjohnGIF89a{{{{!,@ ApaCHH3"LX!G+N1ˆ!-Q FPHp1I9'K+m`@Ø&Q Zr'W6paNTYBp^O * ԤՂDMr\:ji۽j|TkeԪTq׏.;filler/doc/splash.gif0100640000076400007640000001477207224552024013561 0ustar johnjohnGIF89a&!)!11111999BJBJJ!JZJcJsJ{JJJcc1{{9JZcs{ތ19JRZ)11ck!)!)!!B!J!J!!k!s!)k))s)111111R!1c1c1B9B99Bc)B{B{9JBJBJJs1JJJZJZJZZ9ZZZcJcJccBcBcccsJsJssJsssJJ{R{JJZcތJJZk眥JJcss掠BBk{99s11ν{ν,&@) H*\ȰÇ#JHŋhȱǏ CIɓ(S\ɲ˗(œI͛8sQ&ϟ@ JTϢ5KXbd9*9eHAQߏ\=0Y"KYld9D+q׆ $zL3mSOruWo5HDM3VRQtX1Fýd|JdA#2jjÕv˪F@ $[4qpo T=E…Fx z$) (aͽ FJ s#OdQ7R5gMCe}b"ƕ`@eb @ÔsDI$Df z4yO1@1A W"G诃=! _'U҄J% gLм\9NHDDm(ҢY;M3%{d $YTq>(4 i ^e$8 |~Dz@%BIңɮek#sŗH1OP W%#HA}T#)0" H(@̰(C"8 WsTbgHȔM j J!AA&uh|6]w_޷~L `.>́#LLσ3m ҇CLL ux,_"'h N+:{S:T $CB Zwht (%wNoFM+ $'ILW&EkFB@3;pD$(Lm4CAa4 ܜQ](4; v=!rԑ%(uӫQrj SuZf x YBi1N  Eg%Vb+rdACI@ȱUb5H=\$Yl&K'`%2t#Kf3$"F'~ibHS)c  Ll~ ө\@e'KF%c*SOJOZF4u@@0! SCݍ>;d # 1ضʹ ayԙ`y5dI`ٝC@IYE=繞W֞{Qӡ Qn9p3$!PcJ"6RwI5rd@:6ucHdÑnpBd2DF4@6P#>DdC! pA1OP"ڣlX%`AFp3ZAfV`v`8TKC``Y Dv$/uq4"~f@*{g,a{wjuB7 Ȧ&q/զDK 8v8yd7j@@KP_Uu)q1u:!"eBAGo"i2P0#9i+Xp6Fq"WvT[xdZ0u92Ec!"J 8!puI"^/NR&1`8~"|gQQ#a& Q8ik$s;Vk~ysS(!ov.wVnPm5!QMPsHdX&c1;K^U@1xtl+17qEpm$1pm b!H=Y2FVaaiQl1{*Ak+!EGo&z QekV $ "b#`w"a7Jx!)#O'NLq"A,%]VE$c]UvBPk鴸z6m+JC=3>Q4$ g$ zVmcJ9vX(}Ecx#9'I@=Z+F!7t4 tfx }' DWl*if''ak-AdpMPI;iFܨTA8ʣ%1wHU(!u<;c ]WU˔&, j=G ${"PM6{^ 5 =&lr*c % tU{2%iUa2%uK"3±ӛ; O1bÛ~8#"}:Ei"2K,e"%zQx6hf$' !1[bLWe 6y{G{ y2l XzUQM;ztv6IX5Br@a;2V+O.bd lU#z, ק \% X\-ɜ \2R%a $}Z"78  LV6iv9~UMw͖J8[T A8jcq`g^!Y,a[hQbyyպf1u25qbx ;2 }>K懺(qԏ`vPO&|(Y-4au*'Qb˳!mUQQY{p tO&)}BUpp[ OMPelSQwAkV{=E24Qyxŕ-nܬlFZ`E狃\T6Wm, *< qwFL)!]2Clԭ+P1!Aw|;qWc ~`SG XY Lׁ чY}0̑0ʵg"Q,%|A51)C!b݁B$q;˲'at`V|F-!Udg;DGFC.."(M2;70::|̕X `q%oXu}8Hdq9@i2_'AV;<LdCTΜJ1"10im(f!^#ޕ/Xksŀtfzj P#w|%qw41h&~)ΏvCUL%Ahl*f^Ξ+"VI썵YtO JZ=4@X@ 8y)s`unx79o,RVᵽj R KK p' !Q*E{Pd2W$x10Mb/"gSYoSv 3z8UqHqjfJE%7hH"÷i+J!7Y8" ?dB"WFL1/}Z[d[6`}?VBȺ$Zi5eE ACWpktaC,Av7J58_uCI7?8`ߤ{-O֯x5 9HpOMx!!0x$aHDRd!E$Y)UdK1e΄$ AH"]!!Ɉ#EBE8 M'NZU4TNE)" {(4 I^f])]y%HH"HK$B$RI d !3I hc|g\pѝHoGnxi'O41#)$gΡ'&8d) !!D $3 $'_|zDZB ) $CPlY(h?γ3z誥^( F@$&  E*CCQG4D*1E[tcqFVF'1G{nGR/ 4HDrI&[RI(ܬB)r'r,.s042TDJ;filler/doc/armorine.png0100664000076400007640000000134507224552024014120 0ustar johnjohnPNG  IHDRO|vgAMA abKGD pHYs  ~tIME 6g@bIDATxn1@.Gt2f[|i"%"I]׷wβ<Rm^6Q`&/`5SERSۜ3krP>䍑q_+a9n~̶a)57ZɈz<z4^5QOBچ|DE bנM J{EpSe6i/3V\ s\3f ,U`*%` һUB93'ThE` #%⑧+QwA"I=x2A%F=ccǶUɲpd%,{eP PwtcXMϋ9V($ӊU;U!ߙ+[:DͻpWAF5^N *W hSe0.7=\t`nNӮs`\nyv g&韪mTiJKwo}*ǪTVثx@F"]C6{\ޚsžb a;?N#8,81vCȴ'+G1d&]DgIENDB`filler/doc/badrock.png0100664000076400007640000000130707224552024013707 0ustar johnjohnPNG  IHDRgAMA abKGD pHYs  ~tIME 9"!aADIDATx10 E&^ nRN+ >”a# |)r۪] XE)l*Fg7aHJº| Dz,u2{"D~X%{1@ku]pA "z.rmM1& Wkr^U&9u`Xu za}ovpYū`pH}}jvRY7ؙPstv_#s~e/J{kuI q΅,|)\AwLyQp<G pG|>86k$Ak!+dSjwj8B)ue(W4MV_k "NDa;[1F_8 OSK\1D6M<4ARaT8R10,%9b @[@؏;OoBXʔxnXq"7pi[( {snSe[UիW2+ G`.y zIO$#oƃ$tk35w.`*ߏ#7s"CuMM nM8,?zBKJ7IENDB`filler/doc/robot.png0100664000076400007640000000216007224552024013425 0ustar johnjohnPNG  IHDR%X)gAMA abKGD pHYs  ~tIME )#7IDATxVMK#I~2xDED@5aΟ<2 AA<,2=ALWڙ9 Eu~<E׷cX[[ZCJ 0L#O)$3J1+ qrr❝mlnnn ! >5/XDN )ZVu҃(ʉ(9HM\eDՊy H&8 R~dkNnpG `uueya[n,fww75{b[nVL?LzmSOSC B CCyA  ")$XAh A@E6` $XAh A@E6` $XAh A@E6` $XAh A@E6` $XAh A@E6`$ @5&i,|UCt>cH0=Ġ3UɗMNº~o~ӷT*e i2嬬׿{4;Zd1؂+D|}+sڹo%4EE,繄Zi fJRku:kkMN1nY/˜sY tynX8>$1nYVhyT.o'ӳ$b<>b[ūU϶s𑑑>[9@bO4~5Ϧ0>}Zv,! [9ԟʕVWbE1{;J2`Ri'샧`eeeJov(oR benےV x8\.YPuL ,o+\.Z9me1|RsΥ-Vkkn $i4M_Nv}ZjN ds_ ίlP4 L Ky n_G?Q~:֗!Z/< \n 04xwgaCD>M=CR/";u?~d8q{{{.Aʯ[jxahlĖAQ `=:8 Dɓ\ *( 0;+n(cW{yG?..W|M.MLB\w/AewYu_Ade gH p&>l-r;'$4WԾ7矋6D ױ{pv!/0جt&)JNJpsmsp[-a#ۢ[YΞ'+0/\ q3vZˣ7'1M&'#?? hs5o_Z`kP0_|n{[_w.K`˓ Ҡ`Yׯ?FBçO ^|v:/eܜoV!O~wPYh]mn?Ө J_[]d9=|Z:ߍOn8;As)AxN\N8̽廧F Ӓyq߉1q-,[FL޴ eayYիQ ߎb⇸d-$BѯX{)U~9o)zog5`Dm _L (Wx饗|;Z7/lr{{{w67mXGR}eK;e;l>he;^0oϽ[U7M4 T*HuLOuT*%޾#7vvv z&pyZ!AģkddıEirƍQ׺cAx|nxdS\{1g1Hz=p\T+˼^ޛ.a[oݶmskWbVo{rj5pnY΢>2 >vI<[4e%J nCl5}K$>h7JzD5cccs2EVՔJo>Qw(N`FS-Tl+⮀qu 8ؘX!Xᖡ^ϿP3i+Xٞ֓=Aض-Nˁu\sV9]iT%mr,4[-!sBaYg}tm:,K>vD—wgtF0L|y޲[&7l7|V!<;2 ;\wr`@>j* ~m;=pmk04Ԋ~ [fT* ܛ.zuO-)Ad@Kr1}2uN By,:&ĂU Dك.7YXXjxu{SGiR1 ’gOF7GC9q)qݛmem"~x7Mܿ`cCu|u}r>=zE.*ڦGf%{c§$tPC^Lo&&YO8NeT2Yeþ{D111n߿8 Kɝݳꦘzr(QJ8|E!J;ΎrttK$`Lz(~8<<y= O?4Jf.FIdsp(KS\s8.{EpT*wTɒe`Ԫ/@\.sXXc0 $ Jל$[Bi]Zj1S.4!ujǏwŗ%4#ӓ *ꅗJE[aum?'H˯]":y'?kh`ssG6Q0ڍKbC5Ƥe9;o_X!fgErYZ45$t'`g?j c їZ',˒޲ömT\+iʿ  TPƨƻ$)ΥpyeY4Ieamfno p?ҡSMq/`E@%Z*Z-렢Y2rkkąspHGPZ9$zWr> )fXT{+7RlWd2vExEcvK&ZWbl}s67Nkil6& )g/ =k`]XwՇuta|Agnj ~=Ya36K[[AxSM|̶D:{[؂ťh+Xϟ?sssͯK Xo~ "ϱk׮2hi+Xi`k :C;/wy0cbb"Uqc$XAC߿7n[ee8Žyt!t(ay 47zj&ѪЊEz zBz{jǩ ߫ !^81[C^~!69kkw0!MrG+$5Ȧ1 ۶!+/iz gkpuKĊsId%Vs^rCCk "XVky˅/&xb\R` OЂ%-A+`;9[:ArSC_\ +gy.g+К)$pYOTU^(| R)hRsurʇ|o>Pƫrv^ rkjjS>ࠛ,..K;>Ffgg'x䍷>GVXn>| Dl 6 j~\.gUOoFOIbdq ć+wCG8 M'm*AM>[>jUUVIwERVJ:Q94')%~i~DbmTsӃ3w*` c[MC`/-R\t!+gϑ`m]_1e"/[|%-1\_w )X7%nB3Qc3jPpE%o t㺂!*`y[IeT]Lp?!bY^^;O"_pŋC$L pˑ䵦p .]d;Q){tYw7"R$sua7*Eٳ֖P4[o3Z->>,^,Iis50$((!q&ezzmxTVͣaEyƖdL ᐋR541("V(Xy[,KBXIE7E?$SW&Oy3]_^sū.tu̡QNלQb<ҍ`[VU0%]G\ ,Y|y[VXfYI'OTc+Zy|8/}i)0wDW7 ff)`hVVϕǟ|SQG 'K7=,AOO<5{{}]_M![Xmg~hWgчkr-3gh(XaDNj.|J9a't… yG7N|zч~أH 1X,1NK(:{ s w$OjxMj  0Cq=ڷnI&B4nE{.z]a&OS9c/ 3*_}C%V 0ϜQN.+9揭/`1lccc9vmwQK%Y*ߵ |o9u &s{Ū2c||'VnRͱ|GSa˽,u:.D<"_88gϘ)kQ˳N'nGJ}b;‚8~>w, r,/eK/z$-U" W%՟чAbZSbhQN<8/XSii_پoj-} 4T*a!u_7@!(@")ITP}asX|QȱQ~NMPa9OeVt N![Xq,]^WWWu%aK֣ԑ!i_^=:ah"\2ud‘CRam @.eu*E0>9Uw%/U}QKiT8 1XP"X*;C5'cqSw{zqYU)oR$ DC_b/c$;1o+X?U>E[Xh˥$H<"9'xҗU;;}YOvww ~Tb`X V-pɒrF*K~z=zzah^(KǏw^` HymڵCa{ =>řS֐qn%xqRw~"Ki^K^N"ǹh[KIrc }!VD4? *oz˝?[xDr#XC=`F<޲g07Y}V]!jNӜ}(z 77 B nܸivV̝eYbc6Ս zty!N4{TF|?yD<$@))ȉN&ZƋ>w,fXk?+KX; { pC9L1uw}.\Bc+.]T#?1OOO㗿% x ]d?=~_ggڭmE_  yi1 /^ omIDATp!}%`irGG~FK?.Yyx|W')kֻA)v/a#GZ) c֐H-/XJ[CT2 CJ `y okhM G( s۶m۹rS874 [Z %MDzb^ VcTxkW0̍Z{1 SuT*eYdf&w+h='97zC8iZO}BM$O|Rb7"u2\TwFAS%fǦ[ǗDn$&y+n4B'D#H8D28B, T%>H2 Ah6p_ߪ;7,A$"ͦVVBD?lcHA6ubbb"T =SS8y$ngs싧qA+(qG  |92{Cޱ4aQWw%钐 IL5pch(4)ЫC(6"-C{f!($  "BH,  m "BH,  m "BH,  m "BH,  m "BH,  m2 FAQt5xIENDB`filler/windows/0040775000076400007640000000000007224552024012523 5ustar johnjohnfiller/windows/filler.jar0100664000076400007640000060703507224552024014506 0ustar johnjohnPK"* META-INF/PKPK"*META-INF/MANIFEST.MF˱ 0=w9Z:Z2 G{ зV=i1,iToU~ˮbjuK<8e[ہ]wWPK8ipPK "* friendless/PK "*friendless/awt/PK"* friendless/awt/HCodeLayout.classWkt\Uμ&LzCHd4ԡLh ER(E$sL̄yÊPPڌ4P *(AED˥ k)}4I)k<=>{?{fʋ.?ۏqd Y=+$!?*5!Ia44 rאya Y'dl%zq9J\aSp_ǀ~|yq >.(&a7f!b6[B60d2An;^ܡawzqc+ѰMv *z{b ]cI5d,Ӳ,IzZ؝Y^ɖb\+izJiT"7Oи.ڨP82P0ShUjac؆t>זOTN=[klZo,kS;QkA~j3$3p},MS (H4 Vg4|$e’,Pf4{Dq l%.pi3}UgL͘&ٗ^kNҹ0o.m0abr_g3с Vv,HG1 `ұg"qvă:ô>=+4:N"qCfw.9ĺs׎Gu|xt^g]ssDkRp/7u):0SZƨgwNR9*~ј3l:g'NUusӆ|LzsVV~ik~0DG`&r|.L}ֹ4JÖgsl!μKg-Yd޴`if'6 !v}KӞΣ^"ִs=I5?V!3UTV"rc1b3:nJlԪKX~ᒩ Ū5= ™KUJri%Rj-UnKe 7*Շ-%9V~c;eGՖeG7`Xv,v'Clt~-8ӡfn='8+i_"7|!*Yq2 I= w 7. MҢrʻ.tZnWvax: bFKK5҅(C  cdJs>N,MCXS8b-*''9 nevp:зs爙%%ɘKlEsEsSs`e0~<5jϵ&kh +){5Wyefթ4KMGŒKQ!Bt!X@aLu9#ng3E͆!E4C 4oqb&2Na 8*5[PrC8z 04Q qc ՜ B.bQo^ex-퟾`%AkEnVs?grNFdE\+S#U^/ĵ ]؆n<]04C+a|M7 ܢjpTlV-]M wآƝjR[6:ܧ6u&G;jcuxޱ/8VEG k0ʑ灗-]:6.UFSHΫp'hs]?ܞ".2!wj0tXXB itiHc- iCV&g ($,<35~5 |Ѽc:o&z 7,q3 `5@F` a|00a(G'WQQ;Q(}D'J J$JOҿi|Y#ZwZSYw!6vvZbPK][) PK"*!friendless/awt/SplashScreen.class}TmS@~Bx o"*((!Ab@·4&&lZ+޳wD1=kE7qMdL@IL 1݊nʸB#2f0+=<'ᾄ-HP1/Ca_;(9e5ߙ $V%»Z۫g2fPMRY۶oܤ d~>sȝU0hIF&%yѿ , FOд;YA +ZhЧ!OfRRI-s2+B0dA*2a X 7\K>CºhK?F?pjX8ih :#Z#ODݻ'Pw՞ z xOu9qS1~z:; PKk PK"* friendless/awt/VCodeLayout.classWit[g϶,X rC2vIfH%rl+Ȓ% [(4a_CY66@@XJXRRm9==m7)c N9{gwgΝwzN42tpb>J!q [#W>J 5$5 -$%$-d@W}EӐ&'$/d謑ZY]'E>\K|iXL\pEAp/)ddvk:A^Aȍ^ "IfDvhGm풀>܁oiS]Vp (w>%VVǚTo\&mt*b>H6bISfw@+<%R\ahBբD\63g´;uVJ /KstLJےؚ\bh}OT3 ^3wځX*HvSQFW_r2fZpRކ(-|aDij2&͘FO6ұБ\C~jpɷ4Ϭ4OJAIrly'cSt,B_tDuh :NI:[qp 'o*nCxHy8_6>Ske\:˴/̉bGe]cءqa #: xBÓ:(Ow,ˊvx20Oų[s:'Wq34E{B^GB^*^}c)e aO:ӼOSD\|K𠎷C ?cp`O&aI3,&!޽wi+-bR8f⍲mZJ`VdUN>izs}Vmt6*R4Zl`q)-G>ԥշPaߪfuR>_I0MxyM[eQ2*hY,7K khS:AI*[Oh*grX?0ؖvJM4;'L9[EU$g=6c-N  .XX>3G'4?t.{M".J=\ugl PL\Vzgù'ڰ݀K~]IvϷ5q؅Ʈ,>$cى)[uqZ7q8 Ph G6fkdF`HVҷI;ͤ9Ҝ8#p*ZhO+ϦcYnm70߲XTXF}C8PpY6L0x 8G2p fXAZǡC*DOvcglEımՍm۵mЩBзȹm &`)/IsΤ:+:p3XcngС!P79`I8hQR`&!߆UG%4BTFVSksj F匸Nm2{(dEl0=9#eC]vcZԂ0 -,SFuAmX V0 `:F k0,rdWP\F4Z{ 8j3|.*5F@CD#iiTXB3-qR ;2jCDF Zk8j4XY׫ְce[^jI\ڽW2f\y p% t;+{WYlp#~W=j}[܀߱OOp3[ ܦ]5wFܤ"؊{آNVO8R=|Mڀjv j(P;S9>=_.&vW ^T%{^+xqp,ě>LK𰣓S}Ns~Lq]:u5\V;fjSHeYioZA2AOQX] j.t24uu |E8?VQTÖ6wx⧘?]~l>O_r7D#n?#F1##̈?ee|cg`$ vo;YgW|;ߤiWԟQYDGв}^ GW PKɤ ,PK "*friendless/games/PK "*friendless/games/filler/PK"*2friendless/games/filler/AbstractFillerPlayer.classU]sU~6IK+leBB!6JJ!Yf=?[R7@KG;gsMbDu=gDpV{1K a:7pQ%8t\pE02+_ы\]#ǹ:/ႄ`R5u,)nEA랕ܲ6@|b5my]'(lj₂8ce+PP]1W_[pGE6?ohE53w>fXM,=5nqq<ǫ,7;Jv VX\v9? 7JUϫe$C{^@]Z`%Vom,?_W;[-VFd*STQ3}[eGj&j۶?7Y ;uzxluѻQSc>ZrXEI0$O* WeM7 G%[0 d`*H6L ܔ |#eS[Vr Gbքו!lua(#m 8n xhG*Hw rյk3kUX57o/샊;Wlk(3'{EvO-CPjϠ|υChj5MmmkM#iJڛߥ[P[mhڞ# j?ŋtX{TT ͇@N 1 8z1{+ut 7{(d웗 >n zqAc7`2X&⿠qyFIIݴQЯ6"cute6a|6aD/̯t:򴶎P&>kD )}>`L7vL}@*YE^K~,3;;qIN1GWZ'񟠿Jٿ?f5laF %[}d7¥sݦ[la@>-rRK۹}_w }Oљ앳,'G v>ɨ%C5%%tH0$tJ蒐 z$ Oh! =J3a/PKw%u-PK"**friendless/games/filler/FillerPlayer.class}MN0i?h E;*Y*; Aj,zp$vxOg< Ƙ8![ʄ$]̴,l*aJV4tV$![,{S:B7I /_A&U\n5;!e;5llY/D*hSg8XDauO0ڄߜ/;-?^ j߲=O tP8 K {#n85lngdsY9ln"mM~](w]K*vaăiv|;؉]UfR=* yP巯K$Aߐl*H'耊⠊U|S^.* Byh"vO,Ui^,9b-0mvɡ]PhY]}cd( Utt [_T47Xc@~(ḵ"5OZ5uv,o#]C-uE S+gOO@o ,Y>\TwyW!tY}E@qZ?Hчlt%XAzSD@aэT,^M֮ͧ.郓ec3E 73CzbfISh;,J:CeҾǤ?c 3<ԷLFqE4CwBeRL]ήtǍx']ɼHDˊ76L̔2xw4e.I^ڸ.3=qsp7gVfz5q <b&[PʲvטӶ0FBFޘ-mgXv1;cߤ!X"Z,ڧ'i#CmXM1 {pZ0MdNkhC1NPqHalpD<&oy\6Џ OH+pO`'hmyUFh:uFuޡ>3jmb ItfnJ'zgDojmhU{x^#y$96b&7JhWZ^6cKtV"JOWq᮳DDz_?C['7eB?@ZR+[V> s3}(yio\i#)G;;Sx ?~ xSPD$}QQrZs/Ρ$t]]OzQtCzP}Ѝ&?CGH/ϡ?7OZOI2$Wd{1 {M_{PAݼ*>1=Ta: E_S* Sc8{Pp{ƸQN3M7G~d{u4V3Yd9á$k& f8ix3L[pVs⽊}֍m3M#!E_mD)63{0b?E^87n;p<${$F}4e=g(w#xú]ekMruPzStVՕjtR]0EYjQI*RZs:V5#/>w>E׸WxNU#}iLóMsIDgҥ5C Tn& "ú0t i ekRoʁ:4IYՁ쒬 %]0Ǫsq?LHyYsBk8@ ~9x+_RojbK!mțw9'#]ݟf cWfΫ?h=j7g_ PD!GE) U,.&r#V q~a6Z+*uUwB T:9ԝ~+?A:G u<HtqI NF@e2rwe_?8`iQ=48L?wu(B(GE .gav1 ]b6֋1 beYcNMG? O+}D&6z+Ef+e~UnuV.wC)4܇0eb氤TpBfrD,yi׏g@=Q@7*னڃZ <#/S J|"oT2y6nVװ}]VI<řF\OUYuX#:\6qecj&.t3%#P&EH,%%hKJ,)BHF\/p0vu-!ڐxPAfQс'J<':^XD# )b#zE1OĹZ>I^`T-? co='b؀0fIJF~q3d3IGlxr[d&Guy3:$}sôP>b3\Em|Ba5fή"n$({q-0&nb`oa`bG  KAll-a/'NN׌>Nυ҃b/\+(mؚQzeQ~gEE=ʃ(OW@rv괺B5C2,WW+K3bo!MFb=?.~Wlg+bHRX)bEԺ.=Vw>jA^q&KxW+!V+݄62;J{tTlC ט0>m|u;o!r[Ffn[v}{yչRy^y}z?iO:tPKx C PK"*/friendless/games/filler/FillerPlayerSpace.classmTRQ=7{&# ,!*BHd@1<ȋ 5īeQ~}'cR9>=v aFBa/ 0$ . !7" x,bhuc܍ Z6ί.36^1xײZ" .TEZMUEnWmqyT]8z*dI/2ÑuGR$֟)<_.pcd*/$2lRpGNR.P*bN/7hT5)_7TXhXҔ7;[EFB2:"S@Zev5ōISx"`EPi$"FEW-̫MS-qM! do%r]5@RS+5h8s5f:}wZE'p#TvPyAY&5munlwZ6hnhtw6/`whיNgtO#3=~x 8*6#q<b)z~C8'y@'xϰp^ &iI z1Klw#aJbŻL/QSbzn*FaŘӄYdT3b{ #dEBo>WÞӰ^а^GCmP6!Oq;2CcxX(s63<|XuYSe?Z'$#W~8GX阚>LM y@H`voiV@Ow6 PK˚PK"*Qfriendless/games/filler/ChoosePlayerList$ChoosePlayersListSelectionListener.classTRA= ,YV"H `ARbo  UK,Fل *3=Q,/vܒCD5 hƐNa!dF0c 5Ljm[{2re],X[57mʇ-[ۄL1xEFgr2R5fNB{WX')on`|)SspN8Eek_[k6YˮLr <6kt `xm3'M5Mwϡ) rR^B:<˘T0Ѝ.@:5<0:/J ihxl`i@9@O53 jXdX qph^f2r]N}wQִ˵M3 $GZjL:KT77L qJAWyWVqM:,ZpC'nb\&T$n@mhWpgK88o9%p0#09y,H1PN%Vp_ZNڸ50_f:!e(-3'ӞP"dv,4f.GJ1kNY1.m{fvb9S&sR9).jrfk[ASJŴ-Y5`;G1]r=aR4t^'6wRmits $S6Iiq[vi9>ەi}Hu..ً!–#4R$wu '# ԕD~& > @u;GS#!&&JMT<&m(zl +zTnj E΢FeeQ|F2-mʢ#EM@RF@ :/$BE1H+%MGK{4H,hgH8AlpzQE-~?O} y‘D5QNPKy95PK"*,friendless/games/filler/PlayerRenderer.classVWF ClCmB 7I4vCP"c ;H3ȣQl{tֽNڤKIl)9TO;#@=w?Ќhdz*9 FW5| *VEZ fBʰ!2 % ˲ԑ!!K\9-CQŋB,+\үE!oF-QxY_*~!.H ~'*^UI0139<3uxHXML{n#Өc<VѬN%(ԒKA@Ĥdxq3t%QLD@M-罫#MY㲗u,ǧ/X vVa<2L_J[FлL;c\feeno2r(.O:StT:*kj{KK+,LWsvRp(ZkD"Ш1g9ۜ*./9c"%5=6'U&'GiwTiJ7%Lu|RzrOP+ZصWQӲ֝3,۴=C=Zi酋f;/TZY:#-.8QsdrN+ uny97jNMXzGu 7tV ܔ;E;3v%m潜~&˔32&u\?3\de'O''pRq`6I+$#[S ⱏtc6=]Ty▔oxjN%r(n?otf^֬jKؓH#ZMR2YwTܒ\ž~wky VA_U$UIJJyE] s73lwnauI)A"+;P82J@7#s19L+"KY9M"t&zDC==zS¶UG1KnU$4igx43h ~nQ%"X8 +\BlWhViR2Ce5x [ _LAWN:cw<0RS7Usj<3ZC2pKB$!ēQi<#+Q|9|-(P{AoW'h7EߊxzRK N)8e(xUk { ଂ7@[ )8 VpIƘp%h;ۛ]{Zڛ=M %qKO iL n0/Pr}MNi=ѭ಄jgҦS0>2b8zwc~p>lӲ 'G WVa}i_B] õ3NA7Kᕆ͔,j5=-v!a~2:3{ [kq6޴nsT8hhkkvH4~:%P=TdzZL{xl +sgu)Ir̽4a|i U״QCman 1䮠 gҺr9!O;U ՝i$hHNMz%?F0ON(фW]Lz S *@`t؁2,t + W1Ep&aܨ+Lz%TLgc@XStVqEgQUbL5g GBTH^H~H#^H*~wU`~4yFS>c/~i`z8,[c?O`Sf;#gdL_%ޗ_2~ⷢ,`G?*k*'`[fXOm"3KvvژL4bGns~aɕy]kiϘ&:CjLa EuĈ|f S?cXCcd{x[fЦV2VABeoaBo! dݾ{fV(&bNݴǘ9ز!]z312TJt/7쓔gQVoJqTY58bo/mJ;d}j;ú@~_x6Y< 4dgD&}mӎ浪Ž_262"~Y LgFv9AR?{w;zw;DdAs&,h;*8-}-(=s0gYT3]A'Yɘ921T 9ʽ[9S7nK'mːjcW%kkFxZ"MgPğpAPk\5'.b8Z86\Ī.|9wxו?PKLrPK"*+friendless/games/filler/PlayerWrapper.classVWW &*( ,P!hHpf"V{kO~#ѶO=TOofC}ϿR~48-A^,Ή*cq?GR'$qAFJ쌌)?8%E/ `\2.{qŏ&7x]M?-AY/-xx_<>ՑRMSyMdfTKc)-!AI"AIJB(7T\ bㆮ)4Iq=Ҍ艔zE3l9mhf&k5ޣցZz*:۳=I!=[m'/~0:2 ޱ2f %Mr.KO7@Ψ#gyBB;*zx;bVMeV@ $5;J9Zj*QE өY2̤G99'v=v*sB U/9nqi8CY.@RZLqN(:53nS.bK^"`@OA;n()- Bٗ3,qͶcDL 9/ᨌtSBVЅn[q j oώ {7`G bb+~f%,+AopWM;,+{?G [WR<2~R0ACxEDg % !o} )cK+l.uA&ĀN;4k"]P9#kR Ut"CWLKdkuKщOI[~T69l +NҪB9D,.B[n:5mEK*mhL;c7֦fY)޳R8Iꘑ|B? ǞWvqW6uB<8HʷJ ?nCI3pdpP~JߎGRu $fxIe+|hvT#D0aiQ ?,_(?@gtE xUU~^f%=vW<\G7f drJ .7êBSAr(+y^lW.Wؒ 9#].&:S7dQM'5$K53iGNH'fڪ s<>Wv#ajzOl\ LU2cQx#y˻vn =\u/a_9lErxVf@];ZIoX*.- i"/RN3:LJ_WT94<&΢[#_ݒKk$Q ‰Ao}\h2[ ŧ )h?‚J:`[[/FQ}Dr؞C(TXuW@gܴZ&iFKMro{IÓ`?PKxZQ PK"**friendless/games/filler/PlayerRating.classT]OG=]{Y8@B|qBLgB!6HY`E5ZۑZ?O}䱭TTUߐu0!PQU+ݹ;9k毿 i<p#JS"k`4p}?/1֌qLTSc01ă(uFUsQoamG@]{`sUM9N޿-M7gV[̺Svɦ#<]I}t8n0 zmhGN\s$.%3u qU!|DSC]ՠLO +_}>ʈ뻦9!הkT{dbZJۇzp"00 dn"T롕7uezh\S?@5B!c%M+tC}/G<]c2!iй+"xǒOK-LҒКh;@<+ ҄7L\=9KK ]UbѼ"L#!(z n=`W:.4 et+=I /u=)6N54U'a0!AA]W<F!>]Z%Ui9F~KWDg֣ktiXmz2s43S_1\)()shC,P[W3ϛO|_/PKTPK"**friendless/games/filler/ColourButton.classuU[g$ٰ!AKVE K4Z ZA ^,nv"ﻵ׷~->O~ӧ3%$@?䝝y͙/~ ⬈ad#aX_. O)f&aYrt̉Kh<5X"=ˬ f- 6}.=9'}q]WG5[jAtlhpY"Y۴* ?aXwJ@cr1I2vNgԆ,fug r3Ij}fX-*)5٠-Y[}%V!WrZ(yS|艬)>`0Dwl ;эd<2>mbD(%,>nຌ)U&Aqx=2"-uoMox"=GqD2>2NWG2>F&Fq9.QUK'2>g2ሌ ze|RFJFƷN%?23bUQsfy6}K@cVΤJ終 ԝte쨄wfLUKYszwuvrW/ 'Ke^e>;7R-+:\n#a*aPRm m%鷂O͏J`:MAԳKD5HXƶ%}aԲuQdq3:w8ey y]5O[TU;6}ZB|Mn5?B/4 K6%;̋pM jSO},4$JҢ'{+|kkQKmF{c. CÆM[f)7Cscvi F~LK0ʀ,F%IuhE$n RX6ovP@i!р (%" :Ow a_QFYآEt1޸blD)BTZUZfhj!)˨Mfsjl'{kvPfBd')^ޒ 7 E*NHEB3asq%[FBQR F ۊhVT kJP7O vqOz I[*To["9z:~ysdtvQrSbOOiPb(t+F"DS]mJgz/$K~q%ص:T3){ %Jgkb~G#!Q <<"3ML<gD] IOpJ/ۈ D=kY= `I9醽}cu?PKC9k PK"*-friendless/games/filler/DumbRobotPlayer.classuTVWݓ dJXK! BX4mDJ$܄CGxG?KbWCuuߙpι̹I^K$1t 4 o4:n nkXq We"O4j)VҸឆT۱U08;]}y*V$ MfkζP0Ұzb5m wldM~N`G3bY|.W-)z{m#xam;pW+mmZ.QҾ닅FǵDoWWX-JP/Q۵Gl?+jN y1IPoV[ORםGK~.]9cmi>C^oL o`460-oM¤6񥂳A#\_ah8l <´ |od\Io~U0&ubm(fۏ\ZlʛRzXxve:z"Js5k& #T4h5=_u<)0w 2(ܼ &\I'ʐ ӞQ!oy3P }.(rh/2OHRR?R(/'As~p ?6Jϑó1D)Oci1b&KԜDRg3{yL=7A꛴3!_Y3N-]8@ lW` oS[/(x>N1YzD"4 p #XTM˨ƪ"J\ 5ZvWl"kJ%GݯKPK^vPK"*3friendless/games/filler/EditTournamentPanel$1.classTkS@=Wh+TE0(XhK ̔QK&L"|w3ъx7 pnvs={7_}/&Cp=.c2n`LM~D-LHJ".LB$dLCČY wNC#I⦥sfpV6M0jlY&-Κfrc!X7w*, 6|f3tu+Z*(نfy!-niڞjͺw E-S:z̉%S.S*_9*C{ cNBJ<zUi<@ZCdP"fIuO)0T!ȖmBs2Yz6-؁7R߽#[S?e@ t3so_9̛ũzp(Θxg5N119㸠1e m`@!"LrZ z< C&<RUUHZq$R5.\R T[.G ]~3- K͍ VU—+<2kΦc;[b߈B923˔巅69$60i }7`[㢁 2tW[$.}wo* 4O unojWpWک?Y[t¿Tʗ mGf9MFz:P^Y yFրAkCć4A\+f+X&1=F<8FZ(AvXi*е@wiӂADKk!ABK08R$ k? ,_/a]5$v-Kx;|KJ;.z译~PK9ivPK"*1friendless/games/filler/EditTournamentPanel.classW x~fg2 BB @I "H $,ĝY ږRjZk/[jUZAc=i{mnvngyX+ȧ/I&|U5_ 8|SƷoK*+ᤌ(t!G,~?JSLt1_K^~bZ~#0C:T2 knF+f$B1zR@mMLS7Fw,!P:Ҏ4cZ4f4,H#飽[3{ H]@ +H)6KW5GDI2׷&Ԁ@b"8e IW6t Ѹn =p F -a껲)9$EMA4+ -n"l  )+ohwSL0Q zUjRtS?bmLsZ,KKqoviEv 41k@mXhPd8%n=٩u%أ[z\XztWƷ5K](S^ Lf[k9J_m5-BQd.ZbuK GI`խXdJ>Q㉪ F?- «p:ƾt%/e9P[K(/)Rbf8"CE~fUx2k>3$QşgvhX4 )A"*)=tBeBAyyQ?=,Gqlg.æx!|Y"ELBˆQ8HQċ_ŪI(D`%yw;N1m8ceQ*sd,j&TXzQϩPT1Py,ȈU.i9(cib*bv62 xi{G$i SJ}+FĦԨS ,H>D*fr;d[]M@Kj5bVL"Jɦ5ʓK5$ʼf {*&8ʀP*|)q寅rzc3L)Wqڴ)}mEZ4A(+ۚ<-BaS'k?Qyj-bAR;B;cV\f 1vE#FMy&<6vSnfcVN9:V17Fi,q~x7x!lVrYYTJf̏ Ɠ"G4]d͈w7D'H_]<cvlzfԌa =*ہ:+ =TNvcpynt,֦>'mJPuǞ󛱣JHvmg&V&-9X76Nĩ<[F&fM'I|x&)G'}uwݩ;M-Nmi`w:hi4Ѯ3^=~{vR0JaRmԺ4&.B1}gSӘFa`4fefx`}5Z]J}m"PƜ3됩 cWt].Xo" j|bވOI&oi(+:6 ρ;x^'z[f-' A/+a4*ڪQНD_;t_]Lpi\bmbSxa=]6a\^[\Vܘ[-il(njg: c ip5\Y΁1j\I&`tg~6vbec!,^ܙC+i}kh~4\R\JEa!ЈKa/6R25SB86>l؂؊'Yl!hsS\F!{.)^K<19\)U9\-^~MA_|߷ ZuHn;0R8; Wz'uP]&[iz$}~^׸gPD%DIwcEB&W$b~suz!\q eN P 4ԍJב$z,XKo o܌NBV*zQ)iv(}%Q4. p(/q%Ii\u s.m,b"N`6׻@&юpjkbϱOLߘ0M7E(*pK^_a["B>^o+h$k 'lPK,8 TPK"*)friendless/games/filler/MainPanel$1.classQJ1=imnZZԊ>+E^{N6&>K>~8Yd2gI Il`G  a=x0/=e[+NHC2&>X*}&5;ƽ=]Xv!0Tj@4\fșR'uJRȻ* 膴 n]7WQk0C9(aB(j,o iMQ-Ɛs Ƀ%@/uue,1X Yqr d#DdzEQ5&~`u8*9T_ OH= 0gp ]a#L;1;4fxAD-~TZ$\dbFgb6θg9Pc1B!PciOa֕v h)`3#=KyVDq.Ƃ*vdatti1+gHe]=bm]ؒ}$ SDt'>6 ʯF CI9jY}Dg[nqw[kF:YP3MZn<`D"k*{ՈnǠ%6c[w3G=[ p/)+4T,,󩂭l5fL|NI,"\ pc^vKė \7dI CrB^T6JnJi]{hxĖ[\X~DBFTӜ\Vn3v6ٰ B)" ʒtfGc3`cQy8TgH/(jf"Sp F ^ F?nB8L!ZV J%ki2- {1(ↂ_xԯ ~ gdj,Esg"{U]a}Q,çPT?5-2t#0͇X,Sv|MSɶCGYȲ ^Ț^TK#.;tsp$]e:2)=/ +h͒tLHh8zI"&ӺtRga]̑MY< {jz"otzE' y _04jav~Hhhc0bil+MZf;W57j08Zcfm TЫ|Dȳa4Ӽwz1;Mf{R U@=t1#%wNB&1'VJa.ʂ$ H韽D,%!O**\J2H_aM3<\*J Q0 iIxœ(2L5R* ɲ%Wnz<zb{zyߒ1Kݺ$xywZݩݑ ڞoGayCL~-qaڵ .:h=;Z0Mnko|?s{!qd ;dlp_1JLpT杴mClHύ֐>j_0t+=!?9OZao@l.m3{-A7%UWU#qj =3HNHඪFqru0e8Ϙ{ ؔ|JYUm֨8JnZ>%xY+8(Uu IK*[*U1bژٹTm[ʘWqKH6h/"i+Вܖ}F[/M.%AgdݦW˅(_z$vճR2_ZDvo E1(fA~VL1G_+kK -ala$|^6@| mC1?\qs^$"jR ܂$zjp2ZAB\0`>0@q.:#yc_K[%;P[[As?Dôf`,#v.t.v8<ꮯ QȴhQqID;zqATޖL7Ѽ6ǸGZ:J.%C2W!l $:p zx #8 _&tS9Ç80:K-qO(Z=ݳh-VAS%l-$5G*#ce0w"-1&Fsyw _/rƥ ؑXTtȽ;voo {>F# ̡uX[xƈ-"L62AESr.oOP,|]ِct9=_`4Ϯ]"f(ϳ.0YSOSI)gx sx~.AfGζ g ;K}}yDŽW.R]pFO/;{ɇ^$!*5vzy mJ 9#PKWsePK"*+friendless/games/filler/RankingsPanel.classWwU&LaK Z@0MF*-m%lXp&/@2g&oVw%7ړmϹ߽.;3oNÇ(~SЎlN ]I )\/vnPHq<۫&ܬ*6MLL`i!2 8r z!dO~yd2LEqBeɰOGA d 8(#2;EwI[=8$㰰W} !AG V;{xDGx̿6d<. O2~aXاaŶHK3xTk#ܲ‰s#inDzz>ϭ.ҊEBQvFp XRlm5 q#tCw{ JAn#27?G%3}H1hs7aXQfY'ndܸ}T>҂xAսҋa!y-@5EN*r Ij A: 9RFM$fi='1#_a 6<鳨>"kZ4j*:BƱ݋IH`IrUUƢSX<@Ky Dv.8ϴGيDZ.XNa)ųlyu˃(cEk(Vب#QϐI _!p,."`C+XW3ZZ(C2.)cM@H? It`4g/9O;# xxtN#ViJ9/zJmc;^sXNr=$ X6j&\Fj! $DcDO8'4?mml1] ւ^l vI):cTQn l9x8.o !l^5qlh^F$@\֨k]p`YrW(وR7,C(uFbG Ls Vm&MsJ ^biT{`BPKb PK"*-friendless/games/filler/HeadToHeadPanel.classSn@=$ĸB[ {HC#!RTUxM0rhPYH4QY'jZ̙3߾64n0[  ,b)e|\uXE&l+qlpl2dbqK{A|t/h:/k-3/RE V<")Z2rK'#%mbRx3҅ҕ%%SU/:cjm\Ɇ;aQos/B u_}E0j'*W膝X38wp$WdKŐs &.#os<05RQK5g3?0iw%C0cϛA,hb=xüU= =TɨSu_PXQrĭvXſ k;[(TN@T,Lðhr&Gb@xtl0=YZuL±>]:Ř}T>=d8ټG)r=Gp9=42+(bQJ^F{.і;Yf=LMs,zhE`:PK^%B#PK"*+friendless/games/filler/FillerPanel$1.classR]kA=l~R[۴$gEР ,ZϓM:dv'-,%+{g{93?~^~CO"R5,x`UfU|* E,Q T$oٕsgcɪ/Q@Ont> 4Rexԣiw"3rK /FX#y"yj:!cW>}p/q N07Qj#DXPGqul4볛kzlmn4#lbUVwPղ,n|ZawDX/T)Pe5J't}H7]fcn ]c'v'e\p 7*<#myNDs8a*shEsw̜_P8{ "V F~PKZnʬPK"*+friendless/games/filler/FillerPanel$2.classQJ@}Qĸ/ xU!0'S-[OsQbu aj^]_` z1VEL`ǔ}Zm](ҭdLVYFE|\s)6&R)@u^9[$0(M&L9PK`1Jn䝌彍鎴ʖ#ÂF~[<`Ֆ0G53й#Dk*3i _jɤϚ7Zڿe,1R9+]P_Ra}lcN;* 8e- /TwX83WTv{)YF1]2J^|PK)<~YHPK"*+friendless/games/filler/FillerPanel$3.classQJBA]㥣'K ] Q'B*)}ԭN8g4%=}TCPk5ϯı5IH`,8Xr,0a*:خESz٣k+ߧ;BMj6]2c9(B $* dJՠנF6|[MFA%^ɡhHxQ˙ͣan?< j3pQAJ(7йu(̥T|H/uǻnQ+BC1(R]3$Ozics1iqR~( {집/r3b!`1bmEPKQ]JPK"*+friendless/games/filler/FillerPanel$4.classS]OA=Ck+o1hpy0A QDeJ %"i1g>PM޹w̙?Q:V}Lq8ԙg>ㅏXCÒ@TʹJ[+ JNqf &q홴Ҹ-Pq=RWeOYjmuUʓVS)I}C`i,mKM~荟2Ƚ_J`z+6svRvO43چ+w9H*#^S`Өq?LyXf5c7>즖I⎳DZKPSMj'3^GU>iK%IX͟6eU' :G"u4w9Yp}s%z!jo9e>Q<= xO i<"*oH PK PK"*+friendless/games/filler/FillerPanel$5.classPJ1=>G>hƕ EŊM۔4Ɍg >[oFAM79{N顀jy,xXĒe.P!NK{J X/qt+:f(u2Dj2T[|s AKjq;"EH.N56yIwqP3`%>6)G `ϵqSqcvdD& _: <[B@REUkrv9=Xtڢ{4^{Op`-R\epc%S"G.PK88 PK"*)friendless/games/filler/FillerPanel.classZ xT~{gNnn@F&EC$R&023 nVbm][Vc]Z@`D[mf7jk[[kf[ۿ߹w& Iso;~|qXL?7| ϋ_k^2˲;{yWM4'z-LP7L1eD&'<&M搏 #Ӥ\dgP *4iAE&*4]>38"J@>3'IMlYc\?4XM ddN1Ѡd~:Ut xàM.SPfraPbb٫4Tm2[i-B>5ab33,AeQ].Bl9k/GjA\+?iALj|4 l#jSAL6S0kd|.4"'($OIgG.aҥ"]X6v .kf#vBDe2A8Ǩ30ˤ)C)J 9~s5i=BI+LzO1Ϡ+ zM{Up5;ޝpiW2jcv*USUZzcHw2iӛb;I8m<t")c)B`fUj RuZgT$;DžRե6 ?B p7$:w&t8W0e6GX̕}}2f~xQ NXD,ѝ̲30N$'0bHFqdl=ƙS{)aZ@T#lTFU}^i $d 2I)>DD,0!ӝƪ6r ԓ9 x{|+hz5a>1ҭOC&4EvswN;6:gӔ 'AW1^"k;]%S c.B3p,?IOy8gX5B5F>F7=J/go>-\Y. 飢"y+bWN[R]^F\Z{R*; v5ph{+$$+ƇX0¿'ލrb'WN9owkdNr݆Qen_25RKsUח`.,ŧ (lYȻέ{ѫY5ޏ R8#8ƇkARc8Y<ڙ` Nܤ.T^1Q2> Vz̑B"BUݏsp.RR?q5S AOuY.!lFF r0OwTwˢ((݈=tb0:YEt_|HiEavi_=Z;hqSۏ+xvޣ=!\}hŵN{nOÇQo-I^ܬ_[[pދø]wv3Nc'nXޏMθq~\)ny'C(N+cjc~(|Tlj5|+Qt8 S1odY`:ӇgDX)EB.\i q]*g6ՌS!la7*pp5s s<5.E~.D\fs!:KQ):.9gsC$Y6RmeۙS8'SKi\W=4osX"]z'_fxl6 X~>M!S2qT=a {Xg9"2Î 1\aumKM1O|ϳ9_|!9VG%9;^ڤE|>K Fs̼Z\w6/+{*?\S9咈"L9،+ES>(֫6f/G,=}Ao?,Kb(5|W_#/q[3I9~D*{p>?3t 2,3(>ft%[WÎ ue*噌~ BapxV{k(/Eц%0F<-wPEqҭ!_AC ەL:ӏ}Yc+{;I[XkIC3h#k/h'7sJr0xr ʧT@$=3FF)}9k3,`{XwjjsB.QGMj}Z_ĻoEj YoƐ0;axZ ztY|};+ʖ3jk6k\}?wjWWu,H ԏ-iWf pO?GEյ9< ,1\Ch yDng^kM}mkrK¶:J zV^"4y.ƙz,8 XЏnVy;}7Dz,& 7˯@~%rj V*3bYd6M;r|>7`y.]%XoS" UI'/ ŇAqc 8Cn4 ttSMTGnNg!MFZ{4Wv?QS4Ӈ~@?]D% ۙ={v^c2\Sq7MvU*1b̩ⶂ_nNdaذ aM8ZS0LSڊ0uKY@В[B5 ]0,C.2Dc爍W|V]0 Kw.Uӵl 4ͽ.2+n|0&%ceWTK] 7I14(d84QpsCVh wcGm4j>PK?1m9PK"*)friendless/games/filler/FillerBoard.classW{|S^޶)pv )mfP*dI6&5I)~?W}mCDmM_{9}Mڔk?=s;߯o|8P?8 Rz<ȃrZhb>^؃Kp`yp9pNt|j ` ur"tnqnټUHyyp!Nwڻesqxzl/<{E xXvU AN:zD{N4&O Z*5xscu"j`678OAwb`!ijۆg5l7Cv ؅jxn6 >>b<1͢`]}u\xT=H2Vh5YhnͲ2 J<Dz] 6ʵE'K$kGDN )ÅmHHtMgZ3{I=/>k'nE- [IfaYY"2 s $1á<*?CX<ӓXG̸=hg4ғey+DbQs6Tv]x&1{*eL=DKCBM-djO0]z# ;Uk}5C :bo,^ܫ5_QzT%>,( :}DM," Wl5K -5Ks󘥳7aa+JGY pBXtkXUײcXnd߄)=dV婸fdndlB7g2`d7l*ތ x"z O$_DOa?r/nWT5W UAϹUUÜ9E8T͢eTalr˞mg55N\",܆-8_3sj/:ATʦG6B-duϱNw33//2/_|CUk챽l}Hy^g `8l+0߆p& llbV2loO4N ]\/h:k%錙έ^=l@ ˚ubszY^[i!j38wǯ]0I{w{s}=ކ==yÛ0VǐgqD>3鱑j-F6@eZtuؠ4;"p؎huDC#ǟ-x`!'g(?Qq&[awجו\USƼ7ٮr[]8{0d7NkQͩZdVs ~~sT{ڶ;AڭNAqaaFc!G+%gL&>i;ly|8,s*%0RLVl#wem S^g`q9h%1o.+ߍm.w;BzN·+\;L0+J f{x*|bp:*XSy^.ooPK Kw" PK"*,friendless/games/filler/PlayerComboBox.classSkOA=-[ʣB -BSon;Y$Q;[*MsckI a8>4p#ՐN;2&4L&p;)L'qVY10б <֬v W< g}T< OǮ)!M+5WȾc g) ojcuilES@1d9!оJ 2tVnIҡBaf ϖAKC͡U*{G/aO8@8Rnvw8BctaHhՑMuaqatGFHw0 p b40I#ELPup7PKT dPK"*)friendless/games/filler/FillerSpace.classmRn@='viJG6qK,@6HQpgZrqVB> M U>3sk׷14܅mc59IX! hb[6 J,; iHt^2?edxkķè#"sCը6[ ~Ϗ2h!Cv|ưс@"\EI ƾ3py/ d9}q WX"Ǽrһ]N۩p,IfE^cp ``]1TbTMVwl7'‹Х%Q䎼?bJ˚ V>:c{eies,.8E'46uZH/`b1ϠMI}Po" ZءXP+U}YT0 "ImgiR)}@ڇܜjd6c}Vy!<#'ݚ:m5)t5){N}ɦLv3ធ)уG'ݸ;s8X6*׷`uxX̔NҘ \2L dyzx0aóH"b8x3{9/BD!"S5@19=:Fշ^a}30BMx[u =¿oS!AU 9FHѧ*1*aǐUEqC2U9GTc {w7L_a;f^:3L K& !rF!u0dlad EM0MdI)\ ,1Dx8C|*=.?JU_4;00ёgDΖn3 W"I+7XSf6g3esg^xgsS 4|'iE 2}*'骏aI1ghy7ZkzΞ*5,R[B{GP ,k+mRIynsyt:+;4対Dd`d|n<S S1fXFFdպO/H0ý7 ߺ}tSOtSs:DDA"eG\#ɡ^w=F MSc9JPK PK"*'friendless/games/filler/Evaluator.class;o>f]NvvvFԲF- Լbb̜"}70囟c_Z HedsPX_XȠ BFRļt}6FF&`da:b`L lPKPK"*&friendless/games/filler/Filler$1.classPJ@=>Ҥժhh 5ѵ"HQfڎɤ-~\~x'Ssf>>ޑ>j6rXE"L,Xe'C v?\!W#C{i:f:2Dw"HNwo( 嶐j<4)M i+fΟ?M<>2nSUv'=Nˉ^80M9XG^5[ ΥG'qO$O޽*> jsIS ''O&άnįanz[:VNIG&_$wu#>Zdʹ!I=e$}%sh9Jb!CCX;e)u{uSwD;( Xi1r8xr N7a9&uzq1צPzL]KUёd!pT'9VкLkrZƁ̹El) [~9ٶep@0RA0x)^@HvkH_`kx<$~i8HN$ؾSAӔtXAgCi(aG0bA+8k_7o o[4qa|?ikX2 qVB܈2뒹Ԓ DR-={EV6v,e&o̒ŹoE+ՇiYU0?< J#y(G~dTMN'Ϯh=BG\@5JMŸ 축TILNQНa?ݱ aOʣ;azky=v"Z3/!:R!g{ѐ\`j#S\[@lytEvx. vz5>ӉLP%*DgUE v(PK qoPK"*,friendless/games/filler/FillerSettings.class}T[WUNn3 SUAj@H hH*ååqHt`t%/|ѧ>ڦkj?g?C@ikZ|{}>?w$1;9K.>!+]{ iO,>( *9 9EsśװcQǒ::VtXqKCU× Z4wZmҦ[tw4$W+s֌U+BOya:])UH)2Ǧa;rh v$,km6vÆ(SfalˑBj}mkԿQvuR]$2S~GEn=zu5a{|#3Zv"?(^#.MtQS EΦBͻM`['䠁xKDZ(i:jnÆQih _h ,bMG`Y`K`U`ME^i B4 YfZ^]!hy^yAe93bmxahrڞ}~?R8xv!-n(mʑ*^-zJuum/!Q`$xn8^(=?)}zmmW,+Nqo1˧(d- lXbO߱=7Pc9OtE_OEBwɜUGP(G8xl]Q?F}#JKw14:7Af/X.kޡuygY,, ?߽|N:jt=cwk;yR}44$ix[j2!c ` [I?ㅊʯ%y$͗|IA4|aIh|櫒4dq;%k%wI]l&ដ-е? 0Z#+Zz= ̺@93EJQjo{ z2JA`-mظh%K6`2j&0t2Am t$9۱{q,ҕgʅ/{o g^՘Ty%$SWeܱ32y?z76m"aY],cV P< lxB^ edEhQ,ԟ U[,5Y6`Xo1Aك6+0ZcG&s$E?my3hE7)ejW>B&20 `PKCPK"*2friendless/games/filler/LookaheadRobotPlayer.classU[oE&z)uC 4/ 6jp76@Yo&ɶ]˻Z^Z>T(UHH<;3vҴfr|33#0JiHD*42r;A Зt^0%a7)%!#hT䏷#8 g4e88yf 7La^\WϠٮf%Sނ XvLZf!xusY 'ź-G~nɬ ?h; yӮ>O)fNE0ʠ-`y.䆂cKrP%RFS 4^ t֫xǼ%Y01I S帊80:+Bݳgk~nSڡ57JU&зoq@EQkduيM+h7c [^HR)]/Kse'5b9+vHrMXw~'wt 7,F!FAQQi3i*Ke $ն255@Љ-ӱ4I^bGfHgR'.Ble,We0{#11q|pZjvvߋ '] [c;F3YI? /Ѩ6q*=Jҿ5t!4-u@áo @]Cd܈8GVq4lL[JnGk>qBnW hP뗡÷f(1: Q)ݔiIw2?WE 'Ms~|Wdp޽{Gz~&Ÿ&dE0Ϥ3u;pG&P^TPK:PK"*)friendless/games/filler/RobotPlayer.classVWpTݪ+X ,T# r H6V3L1FW+xl`%1..q(6 Q\I{Rgf2y62!JΞs};{.h #Xx0e4`>d4 iIsOAIɡȆEG C.蕵q8@<(Z(hLxTdqit?t%Y43}ҏ|xڇg]{uwmܣPپo4sdḒR([^qS!>I6 Cfi LVם4LtTX!:dޢ\>RdL#cݙDTz'D{j:jTޞH>3KR[,uW`q#'U^9Ț9 {7VaVkʇ\[sbJ/-K.ӡJSf*QqZ*hḿ|&3ffm=LOrJFgLɅ6;)gq 1҂S[p~#7r̪˙_w])}O ZgCH 62 7{Lܤ* mNsv,7f` 5:nrX4ьu*nemĭ:nY=N<3&Y03:^n_ytX<(vpLq|M E#xI8Eyti6xx]vKso4ge%M`1s:3cI"SY Kڵ=a3ӭ~kϕ.7u$- qSfN8'콬5qgPfɔP3fs3gmʼntS7}LcȉN¤Fcxɠؼ<\m/j% 3pYLLҙ`"E M陒cnr8ᖃR۶^]I8f4{P y'50r'd]}̸8ϝCSi\挔V9܉yϖy!B^^c[x,ΏCQCsGoz'i"Ij|g]vT?=Ge#A"UI> xTrE\p2_[Uuް8'OrAЬASasqL}]ф]o0 Ayb q9<2IjqJc &Oǜ'!9aE"EAkb}f2~oٻM÷XP49|}RM}SrY}eQ,N?o"N'Gcr)#g؉Hq~[ | :)H8^.ת!pD, 5Ĉà0?=^-/hZv ~@ܿ 'WIn7fJ1fsebEX {"NjMVXTpVbF!g G%ֿx꿰 ݔUrBDC31Gd=*V6%W Uo׌Bzj;Wwヽ39]sj@jDj,u="j)e4 X +Ьq7sަVbZLv6SxeC}땱*ha:+k G0W'0korVf! ΅*oAR\#6F\nET݆ &UvՎͪ7Wwa|T+/*Hma{{ PK6 nPK"*0friendless/games/filler/OptimalRobotPlayer.classT_L[emCGKa-qq(RƜmt/-k/LL6cl'OjL8-sa&̨hLh|䃉\Z`I};Eر}"DKx%!QK<;%< %=z(㠄CSgǧ\]8yFeI2@jzچ 6P;uRJtB_): 8 C֜y58@ITVj+GۄEe;T征{/=e36%oIQ3rEPTy[t PKǔOGPK"*.friendless/games/filler/PopupFillerBoard.classTkO`~:Ja0D \7fH4Ӑ` B]-$y)ð%+Yz0Qc(DŽIIo֤"Zq\'|&=߱zss 7עWҦ@ʣ@Ão4(Q^q]6rzDn6,Ro>#-_6dέKѪgFCn`H XTayrH VX톶੆gx42 "׮kՆv ݿ԰*ml!kv/[hZǡYˌX7?Rf d'NBnn ?t)3.P]M0'b $w;0Ϙ~FaѽyACB/!g$%7yC eO D[\Hz%(8 g|E,B\-$ 3,"3 $5zId"Mۮlhg}SvmZ } U)%h|H(3)"WI'b'ṛw;%>bRwI?Xb@EcH#EPKC H PK"*3friendless/games/filler/TournamentPointsTable.classV{SW-YDD/BB+bDjuCX]vaw#wGvi3qکةS>@@mw7I 3=sǽc$&tW`?)x=!B8@FB_79-&Rb!0(C 2,Ȉ 198doq!w¸TiLU -i3 Aٶ &SӶCs:9i04;9bem tuFԴ;$Tؚ)Rիj2FlN}<+0ة-dt}u ff;cke4 S dҚV33;5+!]?g2^+k~ UZFv̩*T#Po2Ts&9MwC~wP-vmݜXfF68-̟5ha/_}daZZp4fB9 ^hfDž^CG"UA^ 0/a~f4;% /4~Wp !$km6Z 5V>c|"`v2_ʰlZRRgTd"OECM|­nW:Ϲb5&^j>6 ލs,_(]K:,xdOqmu,ΰ MwPQcꒄXyeHrDKw>fyHu-D&e95aT(u5/'TW흥;-?l r8jES B97U̟Чy޶w'}{pJ]˿#g/ huzou5K1+ːj}{Jѕj&`^H|rxy3'MPZ@vCk''r2!Krb> {^P{Q}"m $ ImOXK@k\nTW(+А*ꤰU|>QeO\26pTEt4U6nAF9>##QM۰_= ?Jž+=ICym:Tl"}3~l_0G8,]i 'VMQS\R-Vl-VlA4;a(7S7&wS=hA530]. R81qQz@ e5/-\Cۑv fW Wu'e]YtNēUkXSU^/&+[9AI&]],o5jYo߿Q&y sϯSwkQ6.[6LWPK\| PK"*6friendless/games/filler/TournamentPointsTableRow.classTmSW~.Ivey)ذb PRf:vY'fmdž:gTM!?s=9sϹ߿Fg`+:n X%m;:1( X+`ulĊ<[{tl)C>CWa.7l^ [__Uȼ|mP ea经VoТَ1S$ b™l`SV ||P9Xd"y+ǻr"CeI `:ޠoo?9M@Nq:q Ĵ_2p 1K4ebEoF.qOiV8tX ^bS1:IEb)!/qVaR95%9wS,VTk^%WOsI5T^'SzB\Ht;IM'ɗ{.XsЁG.N~߯!K5ٓs}?Dϟē)rS 1y |B`dLk=ޣwp!L˵m]PK

<rnNZ3e OMغ0p6-nŽm`BY>oMH7W3IݞNp6 Ya[8t7. =kyW7ܛgqDX{H7uѧKI_S)DŽnR[Sz?d-|Ih|ȵ)]qChOSe$D<;>%+:T6+[3dֵYEB:t۳2=g2RnV!8 Es"/LtD3g# ؐldJ؂&TıGƻ*%O~@ŋ˻*`/M [MW%VnKظ< aU|؏U2>WT(٫j8';oQ/4qmƍI[qG#Gwq/HGkYaY+ ?-F7g|p8HBR5LFeuƚ[ؚڞWkڸt5kZG¡ VI`{%FߑM'%Qp3RW?Cؽ%mބct׵A(Џ8K 7/lqqøQxK(2FNyzPKXybG PK"*)friendless/games/filler/Tournaments.classX `TNܙM Q&L bI :QCAR$ Ʌ 3qfG}ᳫU|*i-b>>j]պݵۮݭ;yqw>{ TJ؋A3; w7\OW԰] ;\{ЋH>NKn/j ǵ5ty-|ۍ'xJ-t{tbP3JYRثGx΍J1|KjsE|WWPkWjZ 5H_z1_onX_g[yS}KmT o53ou)wjŸ[^?(э~Wj$p4.^!($vYlN"41'7V:i`#Oi%[S[i%[DlZL#bf%Ck: ] xghRฺx\ޱenmHpȘنAc3U|\>o[3tmLME̜qj4@c.+bI316ъDLIt^rY1[m25f&[ޞJZn[Ȱ3N~desZLni3[6/LY&6SqKP<Θ+_7$7\bd篫U*ȤٚΆXqME*I<>Y5${b|ukX* [%UēVsrٵt6>˚5L[JpF!uLVI$?s/=iڹfeY,Da8m'4 lܬIfsp/&aB:E0nHm'Ls^!wzU9iT$r%h "& +؀EX?6/W|l$ ] f5;~? '~} 34q)O H!.!Nq^SU5&n[<4l$|^zm2kn2ӴX ] )Ǐlj:6n$kΐb7dL2ćp^[qgֵ ÷kdR#<^N0)j`FyY2-kx;,,˶eVz K!S$` Z_JTC)oW[ t C Wk(3t:֩r@;.fͲTY]ʲuӥ 2SN2dP\cz`2t=cKVu5pߔqc0ق)!Lla"l&l\hHQ,!p!S gL"Mu0r0֋iGff:ٌ|6>LV{ ?/O77}T4/o@6} (uq2e5JO![ߠ+F<(dGӑX4Cp 9(?c:Aҙc6/ˡ#Mj̘<^>&h3mR_-t9blx,G1zK-Ni̭e eH],䱢c2kGyh9L*@+ Vܚ6KR-1µ179s4ݣJq)wZP1.£>,~Xkkc112g SnCF >TV`fV}s23>:!1ڹ%4̮%:]%3N~VDWܒL%Nԛ7 8uг)Z6^n7dԤTeib5tJže;1(qdÙ[DL'E>Oc+Jd_gd?'ZM&)G:} Ix %J-bkI~O'yȿ׀K$ת Z.49bW?SoPE/.L#[=].g~W =0v}tG_נjK0'UŞ_T뎰_#nȻӸrAs:7䭨Uѷ JD<:zRϨ |ǟO|-1|Fq~WTSռF.߯uqۜsY@)u%)ﬧͥP؋Qݎ#|e~`؃~{i8^@>~^ha3dFz={&eb1bH ~rف aK60(;GuLuy4$e@پ9o>g`7 swfywڱ]}t'#.˙pYyQqwaͭ8DvpɫhYv׃!G/NM(NWS5Xlm>5S?>s Ǵٹլ GjeЯCs}< y? Kpufı[ww3a~K<&>7{/>xOr| xcO{ď.oY6o_k98 CNGP"̓X,8EgI9A,5,q,}r.,Pϵ#r^:.cYw J% r'QiJΖR+k{f kŔ d brnr=˦݄ G~g^iq¦3gTO׺kuۖ $Aa}AX[ώjR*,dħ,`Ƞɐ8\r H3e "Iac\F_HAePᨶHXW8;QĪ`IU?Wx=X^\?JYMVD*c2r( Lt\<,pQ 6  ҽyrJUq>MurΗmHnUrn.VBMll (()Zۜ%%bZiStDW UuU9JZk\\sci]e_ T9H䦡;k{Kv^ѬUm6.y[:\SɊ IY*UơWY Kw+@܉rf({p܋jk>X%033q%Pn;5MP;zYE0Dt9yE?NOEmǟ`Sl l=HR`̉s`ɡv =hܮ~G8hsЫP[n*ԦF5A[Ev(ASXAiP_ ˬ| 'ӘB{ǙryFw^FaF(GENy Ĵ-#L<ۇ7U:kXba #n͢@[̧PKS<$PK "*friendless/games/filler/player/PK"*.friendless/games/filler/player/Aleksandr.classToUt`Rv&åkldNKfgM}7/ !M @ECG|?3,ݜ}~ߞC@t #8bJ#%a6RܗɗY8yS:io-NgUpAjp;+2ȡԼAqkIf=e2 */כjQ5EUAҁ'nw\) eݠWv7En%V7x:<4{7;ndyYpX ZebU|MX}5B%G17j\'PK&EPK"**friendless/games/filler/player/Basil.classuOJA=kfVD=P{CADJc8+cԿ =KA}@Yy894cu 5.6=9apڝY4 bEkzѓ33Emsw{S31NDkMx#Ց*)ֱ2r i[p]c1T,Az 0l\HD /"'m̈́@s1M@IIz(ѰB'M{ûD52&d0ZZX|ev"0Lj7(4f*M #XsDNCPKDcPK"*-friendless/games/filler/player/Claudius.classuPJ@=&TmZ.l6;7APq5mcILOp .?JI[ssιs'4b3%(c!)X2Pe*.=W1̶owrNC}zk@VdЏ¾0ۉ]W^O :|@YV>{Uk[X[hXxjo҆0 K{xGJe .~fH`(@ΧONT]*RZ]nMWsk}alFmelImF!׻jX adT0 kQ֨B{M_z%C_5uẾ8N' 8 1=Y8tz4+&V0$+A6M$ys'  $o`* ]BاeӘ_"F{T/WoH BZ>@H>^ "uҎ,a%zUܼ]92_&t6K:PKy-PK"*+friendless/games/filler/player/Eldine.classu]K@l&?ꪫ@ ^ EQ» )ىd)- ^g(C}gΜ9?xvxUy=,h44m,YX(i%R@sc3s' y2y+y8udvt֊d~ͮo| >^;ɳXEۼ2U)I:.^MjIHM}݁q?rPE V5Z LDCK]n>LdELq̻L/,C3s㴓Gaϗ OU`{i?-?+?$MONpZbgcB8Iyr #ic$5fJ׏ #a?a|e^4~(z+jol1h~ǽ2,Wh$-5pyxKǹ\k /PKCdkPK"*)friendless/games/filler/player/Hugo.classuJ1Eo:LVkE\ [A7("VJf4#r~% ]Uޗy7/?_p 6`=@?Z3׿gcH-4':A&OGcu:;I[]\34ntc7G@kD@abc%"('R)a'gde8o$7N/T PべIt%g7*hGRjnX;s^m?^PB^CPK0ePK"*6friendless/games/filler/player/HumanFillerPlayer.classuS]OA=öRV(P+(B~=h0&H46)OnP]ΪxAM_/P F ޙ;g=__< `* 25ظͬsRgE%ePmh985vdpRJO= gpC ս@6❦ݦϊݖp5Z(ַnwvuME^^ qǠHHvJA?'l#bY!i徔V,7#Otm2w˨ؤk,FdǞ;np9`AKv0@Ҝ:8QT xWɍGo[rWy!у8aY$p,yi?,5;*r[_x'k-[>q= Tޒc Jh6q̂9Y Ɣ)3ґ.t Fޟ/8?: 3b:х%Nih9Jw2'G\aQ>V9\I1>'y_ W4g"eN6OԄPw[5=INAiJEwNW9ݨ'ekr|N7-|oIsM>Kr9S&]o πyWPKKNWePK"*,friendless/games/filler/player/Isadora.classuJ@E4mcjVQą4B)bI"?Ѝ ?߄*7S`ǖmB\28CHCo*s1XuTϨ G#4-&M:f̋JߋkiGIɓB3;…GqM/ 'K-E(QQJ[h):zTo075gEiMI}3 5RnXoЃup4DO;ԦlPK6PK"*.friendless/games/filler/player/Jefferson.class}S]OQ=G[J+*UVʇ&.|_苉/<4|o/Թ݂pgܙC1[2:1߇сF28%Bt a &epICU2"9jP6P% XteϠ C/+3uhTj%]: }{ dH59q 8J[Dt9 )51ab&Pбn _ l>.ߺv%f;^xtghRN^O9{jղ~%Zn_u^`X*I5Iq%ʌr jX8| PxTQHgh#${d#1q~JֈN86UUt /Z̔('0 PKokPK"*-friendless/games/filler/player/Mainoumi.classuQjA=ƭm׶l6iQ@[J[M2Y΄ͦ(gT]3g{_(9UTlXC E6lt`[VZ/+kӗ JqڕeM8Ohyx|Da832gzbә;=úzaYOUd$RڌSud <<'ޑv{؅a,Ӏ/8Τԯ%QAFOhlT,&;[Cs5DR3;wJ_N&Y4áR'ԃ|UcV附 n*#ݟz̎2S`g,˭_ 8a8PK`:xqBPK"*-friendless/games/filler/player/Margaret.classuRN@M8q OO |PK%H7} 3 <@5aoGηOc2JPfQ|,$ha M4L, c*v䝍oװ&@]Od'cr@M;{gt} X{3'Rvz~k#S^2ϫVV`/TlX ic 56>%:՞ "w${/4S0>Ljf?Ip:iae̻fi{K{!1b\ K\||#ig)Lc[Z*\SkcnX_A3Dk'[.1 , 'w 4fΣĠz n5LZ'P Ԝ^{m!\uz:hڈsHCL?1U.PK]TPK"*+friendless/games/filler/player/Sachin.classT[oUN{͍!uB1vCKzs\\z嶱7z7nP*#h*!^xP>#} bfM0?2srast2nao-?D+/Ч< Lg$62sx5B'E(I%t&yREVhl}GH(P|B^~bb(?i? V;HH$XyU u7ð&1&46w~=,͞Ɣٙ;PG4rURlZ>ܴ܆K"Dm*E'@JO['mM*7D,Q1>$ }, qa Oq$)Bы4hzZ3+$lo9C89ZLgFuz\ \dY˻ј8L}PKv|PK"*,friendless/games/filler/player/Shirley.classuOJ@mڤZE^4xQ1U6fW$BɃ^<~6Tq3o3?_pp -jaÀ=Z pt<K-&,NJ6^* 4Ə4 #uzL΢4d4BZk=HȺ(XGaojЉyJNR„Oωj5s*{YqU9:$ZE>mfC̈[`o40,rGnRx]n| ) ~PKPK"**friendless/games/filler/player/Wanda.classuSjQ]'sdZ/MZ[M&i`E(*x't̔GW'*~,eά{?!aW L4Xp:3(%ܵġ¡je uI0↶3P^%J|+mr ~D[vۧu GlR]{j?-\k3F7~6Uova_c3Gg]vеaĉ#21 .,5qy\0qKț+ sıhY;Pt@>咥GRy2,1RsTU #ㄪ8%A͉LH}NeNkЅQ CYx !2zmƈdMD-e\Tѿx:^:2J(29+G!̒=+dPK9ǫAPK "*friendless/games/filler/remote/PK"*5friendless/games/filler/remote/FixedSizeMessage.classMKQ댚:}؇ZimtjY0p"Fʕq7 E?3-b=w{s=_pRQБv;q h# {_=KSr^i ʕWAKzvˡcRݓur%73;ItGd8$˕;A۠]5l ^[T)[S2M@ Eq,H )`u=%ݎgouH`8F. YH 7Y\o \}I(u93?&Xa KJ3҆^7\"?m0/jqUc$,DWqlXnoJ +듾jB~ }^ܩϭg',5{ByFG&a>r1xiPK4xPK"*0friendless/games/filler/remote/IsMessageID.classM1@EgDAQ+A R`IVdgU4HWlx>t\ PK0₡PK"*7friendless/games/filler/remote/IsRemoteConnection.classJ@ƿmӤV.{@`Co1-iRvy|(qC\ta~13ob+}e%iz^`殗۰ ef d{׈3X(2ڄ%&X`d(ɘ0!h$e"pGFnTvyA7xQ95EJ:\ ?Tʵ3<ՒxjF?-ۅ^\lc[ XlSc5~8MNPKi~tPK"*3friendless/games/filler/remote/NetworkPanel$1.classTKSPҖȣ" VL €)]J0M4\;ܹsVDžxnʌu18|+EQ..aR)Ѓ+RY:,r ̨UW1 . W0[mrkQ{o$8lZCI*uQ,Ue*gmtɗ[;t,mrjrS#XV^$5[K9A3'ѬBSe(c۫@VUnF!jgvLbL}`> \,o#>dzi^- J6<:2#rN_uG(3x Ld? h kAMCs5N#r*/pR9k:_ lXX8 =òPKaAQPK"*3friendless/games/filler/remote/NetworkPanel$2.classT[oHM.Rn[8b[(Cz[s;kO/yFRx@<g@I(’=3Μ߾C'&q[G?uuQǐp 't$qR3:0f:NaRi=⌆)gs5aF %7(,.Ȭ5u(4CeAdɛ.>Ia 9l-;\P!}קZ’]va*2mҤ-9,y Сii`1ႁpe ОW͢ ]ʲnQh rbAC"⺁(hX2 nlA5Y-v+J"đn`Z+_m0=%} sE}#f)0Hg tfT'5vLOem};f͵6Z9pQ~,jbI f(_+ei{\̏[K#.yHv4ܬ\s%(7bvV1kXڦFd)o5,rnC.q ô,?9~aE߃03m' $#uڏb,Ց-si# C#dQΓRh;|+A_pC=GxvʢxP S<wn?C]<=t"ɥS]hs c.gRz{0FGC7#Ip־gg/J%6@7KG? Lm2*e+:%²_P&U+ZccUKXmɀd9X/~UP.mQcwjl |o{s/uFkT8LYh=[Jt+D;]jp t{\ē>E ;L %hK) l[ȶ3+PkslDt>#]%n-x ER>=^I\¾a3ѶqPP&z(ȝ%ԇH8]^Ƴy]$Jd2% e|E+ܣEK [G4^: =K(7~ )Lj!;H+(R: =OF 77#X#Y3lS8YCC}Bb{RWB7*c.At\F WpC5Sb9ZF(=k/oPK  PK"*5friendless/games/filler/remote/RemoteConnection.classW{g~'L6CBCVnBRR$B] dPð;vw3 z-jUKpې -Vǟ_njgw;||zuß@ )A҂ 2Ah! т*1+HN|  GIS щi _Q [ЋU5': '1YÎFrhM+BsDBpKX>Gz~"tm3?Ae1IÖp7hJZ#񤲴Jgqܤ!Ĵ|Rx*[E ft栗H^[iCBۈ7Aޣrepy)D/Zt£) gNN91ķ<3С;;>A"7w<(̴F0'&% l+s#LZE;e0nzE> ءA|JC>!!zJ5<? ٮr|V>\l7WxQ oVKxnxۯH|H7]j g,;\-~ )],6aM~ {"D [f%iór4 1²H,,#V0K 5 u1[["U=}}:݆!Vc9 2,Ssˢ]%l"(oʄ tb/e UͶx>meUfb>TE4/ WE$,w୰.c5uqrF6gReu#\ cA޲Ӛ4eOP/8tXQ"P`lҋezeQtV ljK nĚ gh0PL m܀ác. tY &U/C{(Uej_{ xP[G{ ˫S̟XX rNsүZ^X׷ p>P1Dqfʦkh(pE:ltIWJ57vև/Ў&w \+,,ћz_>Uc(Ikgh'E"qպ^]jC111g)kPK ]@PK"*<friendless/games/filler/remote/messages/NewGameMessage.classTsU6ݦ&)Q4 L6%Q (HT8ө&a$[F}Ggx𠎴3a|D}?QI[:29swww6TBQdp{x @9嚗CL\KᲉ "WM L4pMR][oXpDEt[R4@M?WMBЌs5ѾaSK%͊J4W^7jBP@Mzˮ,dB2ւv5S[Wvn7knt-61H:si!fEcDVTDI20ݯV\_mgCy%ץ!ݬ&Y\i-Y be"&:-:H,Y#3#:)d[wuεE\˽;\KSmQ]p J^jiʓ2鸢!hmRhN+7n왰Tool#zQnJs:|cM9kDE\j ꞎ(81R:&&g: NDƃك| `vbq5ço!n _Yi|wL_r=2a*=Q>{ag yp E|aŌۅk@{ }q 3H rjl#W<>_E~3d1xcP=`,`Urw wy-zh=bvlGhbTۧDyQjzuft:ٽy{U1Le-VfC!D~7a3V&1, 뉛#jj#Z|OUI|)?KeߗmRReLc+<qh&ʁK`6T&Wzjd?8/PK?>PK"*(friendless/games/filler/defaultAlien.gifstLbd@T] ߿` A@yc7 ǂ ̬LVMϴ_{Mә&h ޮ>Mw3Gdl=-gj"D}6P5˜< Fip \0jR>bKLE k+_;H'\=(>X*h8 K**jS,~k{]_}>%twgFX1OѢ؛ JZLحz]|4  $#8Y9ᤕVyw6!mg4Sr`$j\2SտiX&5]vKkkN''֜]4t˚M.ZHgܧ?Q{>f^c\I!zꉞ;>=^YgOwTɞ+5*&Рy|Ux^ĠC3]pB˂A҈B-Gb$6>P -4hlD2l)DN{ <]c jP1ѕӳle><>:{l2L٭6t^PqzRbN6^Ӕ|뗷֨Ȯ׷kurut>0llrxx^YZ+lX3>MLޟ^.xxyz~XLj)Ȃ-գ{S+BKuM߈179 ogos-4n$-Gnjz x„7G" mψWTȭRΈZk0DvBF-1^䔇T^2Xs0Dm/a4v,ı`D"/VXŎDRULLO4@ tf5NIȞ;~|n"W`6k[>YaSDrA?#id56(Yr_)O㶖dU 6a*7qy#R b.(VCNZ>#s`CZ58pyZ!o |I>- >)򁪒*[Ti!;Gx~wD-{n s=~6`zAf=m?Qee$VMUtc{$!vA[3W9ˆz3B>Dm+$Q\7@qp\Yvf=Ro^7lI`YCd;&rޓ&R. e#Q0w, MO NW$.{_K~lщW@ը/rtclz'}z_ S|u+k<((J^b|v9b nHy)Mˣ@z@%z9!&;e`Yv,ӑ.i$5 5\ˤ ZQ-0٩YLm,T %f"t aB1;V5\acFF}.CV66[|+|CJh=e~gܜȢݐSc hᠸ~&LuJ:ϫ\pV& 67=6(N W)ҥfa=6IM9K@ "I@aX; ud?QA4ƫOdpKlXe.'_\ :=_"J$%.9ꧻ/#7ccG;G]brTw2Y&/I01Ov 7h]DP|oI 7 d& ]Dtf^֣%:cJ~PKY2}9PK"*%friendless/games/filler/grayAlien.gifstLbd^^^ϟ?Q02OFVPN  2 820 sh,X**Ơ(0!YЪbvi%?6,m"+g$ņ^Ώ 7J$$fRȺlf+ vXW*uĺѕ+b$\sk0wYsܮ볷Վg>!{.,?` PKPK"*%friendless/games/filler/grayHuman.gif=SiLQE-QixŨoQ1/b4io#XbTEŃXmݒx"uvW||oo̾?uz0O˲F~AѨɞKJ(>R;IȗIT*.$=|l:VZS{*#taoGw$%RCbpy/ ErNP HE0:XGk)N:s1*7$JLUӄ$4IN/\XJ;7sK (p~fDbY 0JH!aW3L>e$ 3IXpy[T uRDCuO2X`">$r(Ib#y߇@2Mv2?moQ>CM>b%h2 ؛&caL Tr,C"qdu P?/)69֌ǢZ. ` 0r%wL>^H<c'RO8ְBJ+藼IpVhZu~6>3զɓ&jqW^?5 >,vgQGSׄS:^^W&6~9*ƻfs|w>&%x_[DAU4Q-1Y絍;b 9Ǒj7:i+ z˰aCv1#-Qa`”\067 >CxZպ}ff|] ΟˣR?3fr<|G<3%*A/Ҥ` (Gv}NCjʵgrim,厌2 'ɹ;;-943\/.<륞WEl&OvI&WohՆ̐&$%+}DCqKo8i?u5>[tͫ<ܥbZjI5[Akh^-!m2L-f➦tXv,AFRxћۖ=3OF5'F#^7U%>:v_nP4,K_6FW q~~Q-2jPOo,@ۿ~>~z|=jrà~Q 8FK4lw?w]N|pӍBILx/`ŵd~-Y} M|zE,9e(KtPk 98bjRv8vcU5fSۊz 6 aGu$/ IҙY7V"eăg(cOlº6d'>?LN2\,b˓ߘ{߰_OO/Z/ώ"aMIW\g kyS˷E[=6j6>wsTA, I 0uXqE݊U- 9X}Ewfٛ!\ڃwdܓ_WL 2q In;؂D|5TXcOJA|>VH;ZAKfu9Gᛍp]+HBQfuxzX/vx^>+:cN J%%x6d Bnf͜jC2XVG# m7ѝ~9? u.[oW;;cvl|ywkFX. }m,[*˟5?بG-7'>13A*yvA($r57/ nF'|h@ ^ot߇FoK F)ᛱ뇚lV0vQq7?er4/?BOΕ)c R=݆gr*s$Qg(dLP.}e{zC2[sg=`]m5Yli-[,z/Krwnu}D{ݕ\Z2/պ5n!:zh-\CJ]d%~wNVg2KmG -7^~vb}I޹|l:Fg!P̚n;Yn32҇l롙W{:{)yNnnɨU;i ss2Hi-9g=@l^󥖎].ϝWo%qosZc ^o/WyNRȇF'_ؤ zޫoP󳤲kCFӭN?i4P,?o6dw'9kN+$dL LB[d1*&Nx|.,n[5}o Z.]F 5>g^.o,b(qZ+8+6=C۾ Fum QP&@B^:G'ӅS3%NYzi/"s{w#Nd_Spf@4_NAM2S bH<9iȔdLUc2): Bcv|VZ\IEV)D+H>2^iŸ: XLVs0b^o; ٕdwbRMW(M1q n㺨]ӈn_ſC0mYUjQl!c0ر̵9Ϫz0UOfGU۪ L)8sPX9$#k[ȇ ɵVr]+C0{u7Pp Ez&mR0h wyA V[oz[of=v_{ %9DUA3H2΋ )T¢i^_=b9׾)EǾboEt֊kL يM}AxÍȿkˇwΤ`LH9vI| 3Nj3o *]*Je4oԄg*1gB9:Z\OEt*k#z) Tm|_:]l"W{Έy6 i֫ eJ6I[-[?4X3X[G+ew.o}ueg1^9~#E8֥DT" R\)rѺ2o܈2җx). K(C *i#\ 5ڪhZ|&b LE˭\D " VB τdlDQcD$r>8Cbc Aef\ w>mfķ{vQKKzì}-O8-f}k2^{ւ}T훢+h/M"f6+cZ.m X: /v/QgAUWC ~EʢC1h9եo>#Ax4쿬ZgCh vLqZ8ح3YŸiv!Eۗ^UXl۶]l힯hs#Һtl|]1DoSAgX@IYmhHL04a} 6xɣzM՝&Q1Vx՞0ki#bܽQrU`%a3̪VP7W 2}Oy䶌,m7c52Co |Ѡ=i^ei`R0v+EKz/1h:G! NT/~#͟-Y4OTrK$RX^oE'c)H]M׿rNzLrYޔq(| _ONmojlMK 7Y[an(Ě6۔Zi4s\UgUU`4Hv/tIM}@+u[wءsMiH|nwи9ul>1t\K-6@d Fo_i_[:nZ0B/h뤧t5S7cԌm{~RnNn뒯l<ɲ-2 EQuȀJ~,95Tf$Mۑ) ?W# FǍXjCquadC X]+||FWټf,y\6yaxsOfpNPZʯGLQa[)p=~׮z+ JӋKPKiwx,4\tg}3j9Љ@%|Hc#AO x1QN`{ZNSHyhah׭W:Qj*ϧvܽc{\MX"͏L}4 hSG.cˍeU,zx푐MD*zZ4 c𕥿C5'̪s u*rޝS݉?tDlvOk P!O½6}^GSb<dQje2Ϣ;|DyTcwIp)VpN]/m6Po]揻i{w/7Uxߝ`#5zwїah՚ifR yvۯ|i/p>2JhH.2ѣS5} v YQU6MLf Qa妿i=&vb"󷛚TR*ɹRJs)l]ӝ'Asp%`R '̘Y` WV . [wim"SL{NpYDp\fYJiHǓ. MXi{7ekXPl>8liL]2Ϸ5<pUǧk?`yæjwYDPKM:PK"*,friendless/games/filler/resources.propertiesWKs6w%WNĶ<[GI AÊ.@9M$@ŷ˒ r+X.GDWYeez}`` j, DVya`<2rтXEpL.M MQ`rANIY崜oؑ^(T6>"w^#OlD|K#,(],!y n("(jRuQDtWGLygٚO 7'M?>(8!~"n85>Q؁GK7-DOU$SG&<Ӵ= W?w hl)ʜl㇄6ov?LOؚU*x&5vNhe)O!?=P g 'paqHh#&1JOpT!WRHEz ^:* nuj\o?Q_j:*1{ 7׼@a:K,"pP'H3r4,3A%0\9g6Bb+ x*xU[JLXq /PS{ 9xވ#Qy:xp++DZ@q˹`OC9@- *8tW+ֲ %k:N* ,lˌA5ĀxM XHc(+8'_b5DZNMqv;x$5- BQ^XQoh#+38!G74L$ILVǸg:͛ͅ(dS/uK?4!]R.vV Asq.sehtșP-< ȟHde W:g(}j]Ɛ/̛V射Dvv{kNCҟ-t%7Kʵ|x04~pDu` L]ۅڦG:95Dz27T: j@F$'˶2jKs* @4 ,%5l=QCZjAb TG1rpJ,}B))Tr²%C%k-DGKqyE1=ЄTO =88o%8f:^o"$Kۻ"`-t1C >[ENc[b cx]E'dVBB8Bh;Lw/K{,='r9)0IcfsP{N*W?C9k tɵ}#hPoDrZiMnTT;~e;}hw)e?HkEDف|T5kDéjcNDF-awBynׯfBWWxujeŒjڥty{X3)DՂ%gUn'N6eza}GssDHNzC 3v[/$v592u;i E:[v΂Y98ݩmPT7.,reBF$:۰s *8I8A@ݶ0E9X}owCz[Ď,7ݢY-g+kP }umk$K#=KcYwN<rǶD}iV1>oڏGP=$qDeg_>p^(%:hqۛ٥2#/#KUkPEIg~Nw_Tes!T%r.'QlvHRq>}xꦺt;;ݿz?_,;kl-A3SzU@J7B rJqߏ7Oջ}|t&4pr~xzlg}`3ՂZm@1SWoo>T=fZ'Jp\Z7*pɀ'P}~k)/7_Ķ7bt_ ʺ:`^Fv^84䭏bk)(S*0ҢlZH)pG x(߬\|92 S`:kRu`N:JXyGOd̀ a-7҄ |-?ѷ3iE貾]DnpS5"󊝍vfD&m^aOt$֫#Ŭ9K^sMG!q^;+Jz)71ӤF!k\c0$f9%zT{Df"C4 m?~=džh^p!gDN+vBm(hcH%YB)4ֈM&ՆƇ8Y2jǙ\iת9Έnh<<.XO,] SP; 'B( /$^!;}5IHˮ_SRmȴEjn5ɚR^C[/k܋LX6 r/€)ؽ#hM%Bdɨ 3b#cJl}gW1!*ͤc{礼O pxVL8rpw<7OXޣپSL~Wℊ8:5 s9vaQw14,}m#&@.vO }\ hs⛌bp/'WE-~gI22xoPKF^PK "*$friendless/games/filler/.thumbnails/PK"*@friendless/games/filler/.thumbnails/filler-screenshot.aa.gif.pngJ{fdy$ihdoɧVUUjFP2"-)V{_;[!J4#X/937zv0>u*ת5\k}o-o+(z"reNh5mTu0`D @v;` 4C~x{I4 0QFmKWrHA獁r@zf@n 6w`c* ˳Yt h׼C)Xߖ=$MzXqaRZõ3 `^5!S{ά_wjT Pa0]nwHY+YNw|((shjQ㯜:%$k$ԯ\H)kmo?l6Zѐ+y5Jcc\;W`6|T<[_@J4fc* ^#)8KRTˬX( ЍMvP5OĨ$k9<|\ϪU( n;7#3?̒\+J|LOy+8;; 3.V^+p]E` Pa:suj Cۄ:I?mK¹ ݂Zr.:e _OT|OOh@ɾ[Xω݈[JfRa~Be<ځўf j20W1[|N1e\](tAיZZ V|pÑ%Q2TI[?= hчT <7z*hl&osJLaa2@vPXz-_q6ܙ卍WW s|<7Cq^'B&qeТ-K8}̯Y5Y[fuf_h>z|NƉɝBp#o̒CͰVgcskς9H@^}D69~udwٕvfp{ OTt~$\XƚvI44^Q0$??PB۷osssbs|7aIiXϓW.?{n_'쒘y@G, TCJi~><3LbO*12xVAD\II_ȰJyF~ޗx",`)m81!"Zmdh<6Y8 $N6 ~TJnVHWv_yzp'/a%Sps4+, ./Ho%cprGQ.r .9zD/p /@3ZQrš%wu;\C ٢řfpfxYE=낊r 4 KLJX2v_y/ll$VSOެ^ZHF+к}A6kX YX *MեTnu~y,ɟ(<=ښef&UY_)R}JɻXOH]\2tۚAsxx=P~+F1-XSWOɘ,p!> ~Hpo("fzuu"L[۔5.B!K[LOnG]l [_'efJm{i3Yx|5ݟEL*\풥ƲAXN xB[skb\|BK{4琥H$( @KDQa!6pLj1^WɸĀm17a%NTu%(m d>Be\ fyG`Gޠk1 N 1jv6H^mWzcpmeSlW/U&* sO&:<.Ɔ~nY4$0%Uju7DŽ&\!/9ێ,^?gIYh@HL8Mky;WtޡG#sraunTyYmR1O& bgsȤ>Nj>ґFiZX=iOlxeN" w掬cKDIs"I6¥V jNRR8c4g _Yydo,;xgE壬Bk &Y*bwHLi+w0bh-DjKԔ;H`[>>vJ<>Y-`> {XQ*pn6cwFn Stƫ&PUG&Ħ1պ4tq cQsOլH~ny@ EmP$6vLEE=2bR$P7'o]ɬ@A'^O&DN u雇&:/[xLavu NNg Q]@oB%LNuG)ܬڴ_ @`<Ŋ.>Dz T7  ) %6 7_ 7WF ozg&OYʇLԲM M 8CUV*3%gq-| K*tru2@alk2p0ԅ) m~u[#rR+ʥºD/cNҖIeRY@1 |lc`*& cv_:KTՀEr9jzigXeCgا`KHuavyfF9 Gˡ0OKNƴƪ S-2zhNJȕh9%)rҤW8R zyj ޠ`A/)AOC G1{@z-(*`tA dGԓ.xRQ둇;"- [5ersJB)X- e\"D!-:3\b`t /y(kaqpY;UW&o1+tN,S~#3;1[ ?!on)qLq;q뀉]O\JUJiQxeN`L8 jMki%IH=Ob2pǏvxR}K] :{]dKŢ8K*2`6Vћ x^ʌj"#)ө#+vJ#%iXTJ5$һM_\BB11L5xLv'4jUaer{X")qS ŕD/{ t:@Q1,J xO;:X*;jh444o6%kR᡿t؂o8$1rqqk9/'n#Y~`G6V[WW#5ۨrpGەtu"6#pP; @ڿV&oNsp\ztv|ys*L,:֔I[C=ta`Ky11; sDTeVwa*y}} 2d|ahׂ(`SjK =!O B(g׌]ߍxVh]BzJpoV V^t#Cl]#>*\>" ;Cu( + :6D[`^d$A 'ruzN+ͬ+fyqUbUwhyb0[jAIK>x銔g];8 YGoi0Kun'O\)@bbS@\ÄAy|+{ݼ^K'=LQoոeU笹+%AI5\qNH+pIY֯zC%·I8HaJez|ђab Gl)haLb2]{y9z ʲ{ȯso͈Wކ"5 '뽃k7mh}v3HL~*P]!^HM7JEy&\UmHϡĝ]Eړ8IE  W[?i77<5"W|o:z;`ت׋/Uluoǿ'V7_(Wi+è*LCa{kW?iů{&BZWBTjnEl_ka p N1Rs*qws~trU݌zYN O6Ϻib/!7pҗM/xAd?}ytA5  _oLO wPpҧ7mD$-N Z oOvEvwcIn%Ny 60yɲ=?|z(_"$g&%n o~QqɺP+OC]X_sl b۷O${}h|re[sd+ITI4(B+8cӖf7Z% ӟZ]&UD/z 9N`T/\[Ƌ.%w`U?/E_bdrtey͌m:ӴO3;IƮP΍Ț_0uq3xJl1v&J$3+?ͩWs-;̵M3DY4D4,xJqjqmuRwuѿ&ޟݟ{BǑS8 ..'ˍ3s-#RSxGݲx^K]8K"bVG[{kL Z`-&=X҅Hs cH~vIUVh`2~DCA -1O҃]A;nJ Cn뽎jB:5I CpPpAR(TѼR[̌fܤ6oJWd /YFR,?B,|5](9zZMB{I\8T=%[EV|3]VÖ4;vH$9iz$eGmr a*)]@L;Z p])oGc"wg!v=Ӎs"Ӎ孙ATN1;5oѽ//%8ք@NR#,?=Zj~ \2Ywn^>YX5G ŮmRJsBj73~D}k Ʀƹ ${׌Iehi8do_<^&>Sg}fcGntcc+wȔ:bUtJY=|іlhj7C" ڮkb)wp߷!A{}vLe5 ioPcgg~j8fn&_( 5GՎӕǪcfih]!";)E˘w {#::tv=to^8ku}c~%j_7f{8+}=2 |~/kvl2/<e7N bJsBBSG#Uv56o5xR.qzxԬ}nGVTFN.ڏ\d'@`b-NFz^Ovp%'#WU";u?9 :~R nj 6/ CT4(^zy*!sqqKA `L) a~ř? "m֟ jA Ӡ@:LWVZwNrnGOI3iЂ #a'~tmWŢ&."+ x.n)ϣeWEK~YP]KC%;l"Ԉu.q(#r)dmpGn{SSy4*3!Ы @?(At6zY?AiQ;Sy}E7nw?g+כ"ǫOUDj?NSsԣӅ6B2:5rA㢫ws_ }-hKϙGW6c̒I諢ET'&uo6'zBP($;ʀLnSZͅ,-}u~H4GXBA^?+C*GOONU3Ru.&"jAbA 0w¬$ڸ(,Y9Č7CowALo8+<8UCW]^u EPL()XXFWtͨ$㢦oa|`HZZ4L!M#k~ &b7Zmr Cӌ~ Duxհ lƙ)kŮϰŵ@6zo7DQEG@P(imӱvlɊVjg]=Ei19,&-c] mm*( }{=ɼyi.RrV\wZ2DR^tD1U?6|_{w[F-Nzk[ќ k҄|Ŋ;fX;[Mn7{Y We_v>)Ș^>{HFگH 'H{n#Ç^a9l5ğ JѡؕIqc-V4 d ֢w=EH : _zSn(_Uf?t RӠ[tx=*AA>[4)J|vyx'㼃i_mV -q^h+ L('<7yd00fZ- /t`2'ߦ 'uƊ4uI1;h^|[q-/KMl!sҽ[ua!1xrRGe+ʢit?VU(1#{x"nh^R5z%;G5{@~ylih*)GqṴh(Q13u8 B~5$JZ/۹i< OTD^l"y8ۀVF$E[r;gXm;фQS"]4bq'X%Lm!'^>᡿ԻU#w7Vڧ׉($}J%f|%BKd{gn1`o0&FWH3hxdTQ ]Xcf7éMCFFMQ2wBNORf HOu1@&2:L7R*v'-m0ȫjL&kPc͒M' }\Z< >XO4q:cU|RP7gc) Wut2ψ3Q;D>5#m:c… $oVSWS@C͖$4) ;ٌQ8PnTR\6mTsRa;u"cYu)D5mPc$z]g3d kkhf4E,ڶ.:jY$b`g,Dv'$gG| AdSni`oEn'x13;8K>q봺~NdMdiVU2)uð_r Ev=Y&kzg0|ro9쬵ۨWo)TxH#ZͲOyn "CM CZNZR_a!M{Lpë[BGq@h"+KLLg;Xt5_vhF>v1J}%eijgv ]~r7з`dfF#~ffG"sp%܆dR@9$ rmNwh`Hʚ6'W5:a/J%PJ9ScON4q#%-8#7mG01gAdLQifUh"6 h#eT^6eBPJB,-a/ðg30wy 5Fw=b귛6P9T5茌l;@ Umi5՘ђO\QQGMD&Tg[0ԣ-/mZ]NC3S;?2-)vfҗz=KgzhË Y lGhI.I:3+,o;NW\7 5cdq yTReG^g͋-)>)pgRt%aOP,|)$۬B]ar(8䴺eurf )Wu_qa&fN_R6BiV^@U%Ho`Yz[`l F YlG8+l4iiZ|HS9AZ,7-IA >4f'KFQUchdhWe@Y{džjsv3 8IHhU7.[ii'X_aMdӥӥQQ&ԚFAY]p(߯ܤw*mh][߷W%р&KƑsѝR͍H|^Bb\IQPX_{wFY3p:;- RFnah DRZPB*OY.ZYnwfVqX!DʛA1;'޶>/NcD4]'cV5lxFrYiN0}e8q]_pܱ9qsӐ{1#P1y oQ2?h=79LUoC,ԙrtt1Tqi(j*nҊhXm~9fs# lCIyyOJ *b>BE Jk;k׬ҥƍLRHLHMšUܰy\$AיEiRʔXusߖg`Y׀\\R%ǡUND(șak&%SV̓OּDe(Dq>D̑8tpG]tpwoc{U ߤ%J羰Ix dOMle'SMZ#luy)) @'#-AGUvO. b~Y Ҷj\i ɭ-;{בջYk~L4IulqmЃE!B(Tf)AJ*ee5tr66+g-H iA8|jw2]r'a*Y]Cc8g=Dz7Kuޓ ˴.ݳI[Uv8_A̶RT,=|͠+jߢG -~;j-kMFcR%c* n8Mt*kY$DKy{ˉ̂T&k& -/terp$M \Ef`i0c pis2ԋ Eޱ΂xdƓ(ː;qnȨawU(D jb Nv co/KWr XJaokązSi]_mS$pXI2qfh\mV2U|79ӗg vC/n=vMbfͲ~Q RXWK6iZ9$o~:Բ!;|j UDyMe6*ϧ"&m>Rn f1 d"Bif* :maDlu?ઙǗ|05J)pP\䌎܎WoDt7l~ɑl X\>7*A`_O6Eq*`PaЌYj35zS]݋QjVʍL/fc0[{M#s0$(ºD_CĮ7kLP#zz68M;gTcVߗ )fŝrY/3P32khQ}v`:%U\c ȓ%!{ =e튁mX( "g 6e?/m/d5:@ A3 ".gD-/q1\KHL>*JEIlJ jhEWQe|Juo712{ 9$Ҵ.=4EŅ!2$HVN NLJ13d!/Q;Op0 AAI t㇋^r%MnJ%y{V*nE^s9:]>]QoBʓbkMMW (_:m(#dG)\=ai?tg...u"WW7s4p@dH9eN7fH|BAHVt rMGId-nd9IŔ]'_S-indRBkrk\csP_ x h7$&FX&*ʸgus$Wћ%=&F@2T9c=OWj@1eeȾOesKTn #t] Z]n^z(]igsQe$&&~?{㊸?JP>zC7] o+E•Bf%&!oS!kC=Av(dƖ@kA0#vq5Wij2$R1"]>`4}ZhQvuWsNqv=z}M[jvzC"9rξbMh%hxM~~L,Viٷ]};!"> ӌN|rW`yѝxƆd8Q[פe )XdJV+)IfSٗN?{9L(l= 煻W KmP(--ޏ7{ZN祢0Ҡy CݒWWL @\!yFuK|&A$oˌc( ZՍNg^,|v:Nje|O>'~'#`fl7V/P ʫoNƊs(%kK7+mTOzL# +Zw)QLT>: }'mb&X_|>0.εU>@j2oޙG n.=ۢefuD+ZηXYBbv3­{N0E"x)U! IiAH K3`O5htv `s7?cN??𪛻jv!iKP ;;]ovQ+.wK52s%3 !ARtg ˧'kەVڝإ; 婒1C ~n4,z zwq0Zp}0X%qtH~W\jH@yT/9ή"Gt*ڜ!,ĬeuMW@QkVWZMr[IDATlD݆d*L`6ښXK&`#͡(h4z&S>L2:]Ad j^ۼHM$L4 kAFS&EߙhGtNF:3f}SZGΨd&rl1IV퇶Ie$JQhEdFtIfLnwI(HgIxT$ \j 347YYI`XH&ctbZ^rL{H0y "y*d9yod,ۢcu5G&ӆ((J91n#cƴITW'5Ѕ(o/Ms~ǫ8`;Чy8zTl7cm鳑f,jvJF6"o| wz@eyTnA@Rۨ%o2-~Sޚ;neݩ̭noM]nkoE[Cϲ\2>>Н*Pjۭv/2ՎV6olEUU AUUUj_];]ɻ ư>{u+ϰ\j8IENDB`PK1v=;CICPK"*=friendless/games/filler/.thumbnails/filler-screenshot.gif.pngUMڰB(T%H YZ‡TAfj&&;z0u55?U&^W6HxD &ߥfWEor+Q X8*KLJmFTka,{h=whC:MsMߪ5'./J̧)ouD#:eO}\̅{y Rnu +> ,M*8Rzk-G % Y0`^q?hQMt|5Eҁf+]qܫ#Ɨ)}.ߖ%vgb}E9QfHe꬞6^^^Hp0~]eY89øꚚB֤̖9wwl -- 98֛I˰6=GFFRQ17KJ /9;>Ch`)1@ 85 :*@\(e2 E܅8?ڒC5kSwoOdl.t$wy:}<^ܻA [L[ddd Mfn6$+Oeu&+\37fKabf6F#E%{#l}#"9uRSn]x,1 f9IBY2F]#2We\]4Pp^ۿMxf׍2 C ;Uɿ`a5;֘~Zc|tOΨT}W33b=P(Q^q:Fi s onJNUwYMk]sXP|ӼFRVТ:#J9#W5vt}95c+ĸԐVI*SWqB"3vC_"t)L8Bʒ_xeMA2,BR~~\--}_g'';5>?56)v.Rjj̈~Š)5;*q`1t>>yZ j<$:Cfa) T2"dҠi?GnxvTOi6+ҴjwN~.S+ffڌ)x^~l9"||=2ge#!y(bmHslo>,&<+;.ilW]8..gy>>;M@`ݦ?L/<+ק9jZDM-< #< )n\Yý÷n0 _{zx8F0)jõE]?A.,#;\SdO44C{ iӇ˭.(QQc)J`u70ܡJ6ț28ZZ}oэ'P6'ɐZ b"kiI4aUL_q^}_)ɞk0]L##XNK6F5)X~;7zﵴ=*" &^PB/u =<%o=U6\10+EE+_WL77Ve81 C# bXhװFX)<ˀZ\E.R>Sepג,xV8ii'oDEuqRx|*^μ33a`vK=<l(c –Cq9 )QGR1a|)LzK8lp [[ jT:ul(g| HRن,T^nA;I0ٜ",*~4Pw<WNSїuK ri7VV)s*:HADU 8w]].a6Xy/'Esgg*ʧ$(ZLq DF)qq4q s\N0g9rP.{Cf.q;>~b+1=`@t܈q#Vע>o9s 3ף f8u/KڦI;aQkSF855 ql5Ngq*_2r]0Rd7CBFp Pn>0kl,۰OOzZiI pm1|r *bE~@kG,Y_HEIlUl,; 퐐$e N 77 $8P%kC`+I.hk!@RjN 4p'5?1A+Pä\$Ldsc.E>?WK@&ãeB Ȅ  >Kx7Klp){>F=AwWIe׍5GB/L;0MIk5M N(ULKJLKs{@]eߋ·q{;{j|83Sn;T.j $ , `w;X:@j+F_HgQXT"3I_Lম ~|HHFi)1D!\ٽJ zyx 8}yJT؄H~*͕w(xpRɯZ6ѴZfHk= d>/E^ 'Y=7>m=?~!w:V#}DžE_r}0Zk&%g}GDļ/0>_`Y44BB$rZ7 V|I-9]\:W"ydAkvkhj24OfB&H 9SImuLb_QB1[ h*֫Yxxw6= ܰx53nֿp=_y.MLTg %#f!XTzQls:fi[G*3l)`6jA 7[SM$*ܩ.[wlڲn/3|Ї+~Oޡ% [%O g+(2=I79bCF߿Q֓s "uRv[jbaepOF#3#.$OL77&_J3Ɨ/-mi׊W%fۺ2I+X#IN+-#r~$TJ<6Ċ\0ҙ6-WiRRfZ5j/jwf\H.Ge2p.ȓ&m-`#ݝjuYwL ']r)~4c,|'~ݻ.n55_$c,&EokWRR籉%o혨Jޞ-?M^h ߢ6?]z^#|_E#^ & >dy'x@6\|׺p\yD wۮ- U u N:dIgϜleMgyOYPͫ^kz _gG&߬=-% eesj>rf9Ş//45Ie̓ڲ]\2"NؖFg6GbԄIa9(=~8p!.Wϩ.@CQM+1om۔+jٓhsE.a'[j߶&f%ӌgn,G~( A%C>a3}W~_,+ZvB{O^v%>/̳Q (߆o~+? qa}ǁ~E;") k]NimtIawF*}5ŅY0GjrB/Fx"82B Ƃ8+HRMT"ĿLv$*mPJ9vt tČEBUb+U˜-yy"u{Ft[)u|T^ H1gmG?A`rXRJYDԸ=-h=5,n&E93=>Ҷ8W6G-/߳wx*^P@}pH[Pz7^hkߣ}ػG@Ma)hIn'+k32uqn}-I+O zۋ4⒡.ֲY3$g;V,6Giړ##aF3;Czvl %b'ɥPSssK6q?mfRS<==% ܻvQAk_hd-i3 `̘~훴^Cˬ-,$|xS&]IjW`@@%?aRJvlyydj f2)8VڂM)־0˧g+-pmQ Ib=C?B 5F  G5ceK |v^@PWt@"8 c&u8c*gniOal6^,6v!p\\2.Ӛx(12fC0:fG6fI|>lE%Os-|Vn:ɛV]yGZT[\-#pjRO=lF"v wn[ߓb!Z\%%T4DFZ q(,WG1E~ f7Iק$c|E?-z~dnlavA>%CCx\7.g"=4_lҷ{n!Dǽ64䲷,DնƜETROb_8(osbm+Aoz4-N*d{YNu1.9CvWYAQ|a+ 7 $O7c ݏ ?ҷۘM]UvR;MKJt5 Xʭ*ȏ#9#)k2sHBɔ̥PV6fm29OI H3mPLܑEB".7BTH6KbH {sa ,E9SyS" Tr<$>`X0f'@-/~Ai_A=`2o9?8`dfӜ *#r8(n`ڻr=|}=[39fJso> fnD\)0eDNp5K՛xQ߸EDH\.d4lШ9/ }:Gwl/qZ NNN/70[.ɦ!*{c_zL3RM Ɋ4O{!/<e'uqS9jyNȷh@r(Gf $$Neid# !xCJ^}|tL< Wcz^'_E-Ϳxcfy^ޑ"bAHVqPUbFE,&N&(Plb7`b ;14cI')b^V+a PK hi1ʰBT n;4IV-< wo}13K url21(b$8KɒfKL;Htf(P~B@?Fr1KxnJ&qTKzQTsn Ir?TƊ Jt&-'?D01mGꑨھF}t?Ie_)hD4HYY-j9{k|=VIopPF1x-]B-Ѹűbk87pRkv.3^Rbit+NP~m6!iдj8<.'ekWI^bڻr޵PIMlc2t%'IY(xX{GUŃ95r_ze/?3ē([#6 Mj yLY%7$5l$VnyrXn!brx3$50RlH #>NL.G7Qx7,Jxl FI"a9¿*_x%|jfYqϷiSvϞg9QaLw?FڼIC%'6ZX:? e!LqcI'eicpFr>8yBRUSq)E@̵_JK¤BjVuuqnԺJN ]cΪE%@}N{p"A.zHT wyޮ*MP  ! K-tF?0I^I.gZ* }8;ŕ-1۳5/q%@ҺEV:GG: { F? nF⨌]u&cFdHKnL\ /8igGX«F1oXີ^7VZ&u) )m$nU6n`X5ffOi8tzXX}moÝ;۞F,m9 \0ptEG$uk29f2/MKF VQ55;qI\c{Bf3QƵ5y_hz"&*ζz:bv ٬#(ђG5;@՞OTnl3$6v^pVf\:}e;rYBU%q+kϕ۴ဆ#VD57q\ECtWjMG"R˛VXcvZvs"RIbjhҶMÁy[N-&{c.ꕠry$ڱuNR…oǕÛi<9)Qs{\oE|.& \Yܼx}ӈqIg!䇐 i߫ii %k:)ufŲ؊E-PJ0H-v0 4{BZj[|#P2rY z1ܴh >D dݼS*+)OOmaN[ akݼm8nl} %aeg0c.$!C) _]nsaA !!S%8N`ma M.00>Fd@]~usx(,giiP7(4neA6\Fg7n#<I"Ʉ-&eg?i&5! m3 ĬVIRذ050P~ڡÊ"c?xS:$G҆ {[gC!ovpE:ಯuFwaBouOfd͓;MLt-7GߚiwI%M)[JZM5 E4jjWkD9ǂNB)W-l7Bm(h1[$=ʳ|Lv}' ƾn߶NJ+N*IL۴۠5]y@_0oxFj0 *x5%U+O C'0ɛ,<*󨋾L\#z8om2>ٸt;r/DPq.RVP#EP: Qǿ#/RDdd^=3 8[[Oh>_Y:Y=o:Ik6?v/y;k*˙zzq]/7n)c(,l)mf2Zq\<\)ڂ4''o#fW)RX$Ǯi;gC,99?9Կ.^ԼhaV##@efu7)$Qֶ7 Kl/]$:K$!9iF+n[%Ɗivr8aݮ[ZR5K:'>r^M`\5,+ŢAi$d\9B/-nJE9U*GFjZYC-6Su R΂}׍.u"k ;nzp !tqzb4 q+@_JU8#s@i(;BPh"a&1nr NǺxK9[ %Fߞ>kL]2wE'Dk҈wD]%64q:zpB/pѧO<ľ2 /[P4ɜf?> wuAbJN| j&):f24,c^i!E+P'ds_ ޺-lE4ک%d:7v/rap|ٙ@.OE6:D ;|P1zbZv.n42>7|S,AB:ICei}6.(eb9--(\4XI%%5II?/ϯ7q{"S3l qY揺D]r_'67} ?y f?~"hY'̋zxSioI#f$!SDSfg%sA5R\ThMo tqsNH?enZėiueZ@Z{+ύQJIS*CuiV4Z^T "?TmREm-3x+ܢna xk@ }seWI3~o၏4(ii8wv/$kklyyB(->KUcS1B@:H?~Ab2+ILN#S>.P_B)Y !KיB٨~ǟ܉&X&((No/CQZr{C_2"7W[Py_^ﲒ{CqOl TT\]\TS+-uŊI ay#7o :66vg/4<UJ ~ٛlul3·H6 I^q܂}|\78]iz ceV<-bxpS{1 dϾ{Dd@/![H1Y "ύðϨ$1 Qɨ0ԬCO!K\!_6to8A_q"L0b~8$x2-qpƚIv~6/w`PHxdYϧ":|dYӐexjX\,ڪ'l HcZdHLKKVZZnѴ\^Tщ+0۷(i,;+dV"QTP&SNޞ$ S"ɰjW]'{HCgߤ\[ٙ ~WE>౭;?T-iɓ's6N:sp[ N}%hڝE;u;뿷/g<IENDB`PKAAPK "*friendless/games/filler/help/PK "* friendless/games/filler/help/en/PK"*,friendless/games/filler/help/en/credits.htmlmSn0 +\v  k@ iaGբ-²Hr([;({T?=YnTGM17+_ "(zG>D{K-BdF6%a;vd-Uvgj8 O 6χaX]Y~SoKuMLozrǼ D$՘N %.$GAi֒9؅`2; jE'ɢiYVZ.+*@5;~{\M2-Bq\"H(4dgÝRi E+J4RtVKVkDҢ9ɷ ECN%TEP~ٷ^U˒.e:IPKG PK"**friendless/games/filler/help/en/index.htmlm {ԦVst%KraOlW}$lQ$q KYM-DP-і?9zLr"G,$@IoV~E: > )T\qMsL~3 #3aafVIޔrl`̛TyG4eV;%x(vSPKPK"*+friendless/games/filler/help/en/robots.htmln0z/6zW 8H"1 HKkUIʪ޾CZFI ,췳Ty*ʻz~]=^"}jdeQ.I7_6ӒOěتJ] s9\~$Th&M>IһXȁ*eުh05jDפU@}HZ y YZ>TD7d8s2g LW֒VG(dE^@k5"9ZQnnUDO׳b+KXtv>VTެ9)śf`rΠU/0mPKKPK"*.friendless/games/filler/help/en/howtoplay.htmlSn1+F\EV"$FR,kS {C 3﫩}j>]^ bnKv;aG??J^ǥR@Q'$vu?臛1Cw1P<%GlDym.)ܡb^ig!M mwiFZd UЍy McHzN`%➞f@b9Z;$i[{6\)6rA"m~r:. RZP4PY*u< fHAk+iކX^Za?'yPK˝PK"*,friendless/games/filler/help/en/ratings.htmlUM6W G.v-)idK.I r,iͼ7aw˧*j۫|+W?%;ғ icVj+1RɣZ(]'#2+Y%Iz2d# 과rJ|`!*ÆβWG+mQ<8mc@^ T`QHe[y+҃UO~~$f(K9aT TJ"q J%˅dKm@V]GlC2)r0V%.rGέye_Js7鱗tƻ_Azb,NFA;0:5H58n,B3~5k86hIRGafމHW˚F| Rh35q~D^zj+q3g\<ۍz"JG_:a丰K2= nZ0X˲pwG_2dq!o4{_NQ;; <(o'!!`kjI$_'X|ӃdMLu`'/X1hڌ53ם0g(N&K؝VMe&u.Tk^X,F_0 4;WH{ƮӍNGjݧ.S K{y型(`2y ʹ ( f;op>mS8T2fYX`(嚬za89Yt޾|% Nnwo&6U|eHm[Vž?{[>W/PK_PK"**friendless/games/filler/help/en/about.htmluPN0 +@CSHV4^8feNd{Єd{OML4]J;D,Q 8&|O?`/&fgH[{71" L(h^!kcmA,ops˜ɥ j=Z+LS7;&p]ZDbB00按~t>G JY7?>m&| 7*ӯxPKBuPK"*-friendless/games/filler/help/en/notfound.htmlputR!!>v~% ny)6.}'HrCdE@\&Q#V)3/%B/$7GĶw 5LPKd`PK"*-friendless/games/filler/help/en/controls.htmlUn8}WL-}\x$q/}%J"BIER.@p82nc)6->w孳;6t~eBNn TMѣu#iWzEa{:iKSʣZQo JhsMowz۹1Sţy[u+v6Ne(*cBz ǔ~㩨|#+U.?2zԶ%Գ T;.v8Y9r CΆBC>rk8@R$'pUKr)QMNښqEh Gi q%::Hкb֤O䠂U6.%^MM2fQ%Wb.*U5AFF;xOfR忝US]+Tpz!kuH+fsp{B;v8ج,8i9`]U@]qqq1lW%\`J&B0^?X{%9(-uPQ dVjaC9S\3>B7%*J I5xFߊo/N=r&2߁v*.#mјwpl/8R}$b0RO]mBlFoց{^^Jf(R fnWnF{fd7C)4.sw% ^ .љk|-ͣm'wVo:bPKvzt}PK"*0friendless/games/filler/help/en/tournaments.html}UMo8 W= hZ,2GŦmG%%qŜJ#]?_ߟGJi .zWz7<8?nƀW!#VqQZV(F;5}Yu ߞ5>plі\r `!l* Ў2AJ>ʍW:Ł<Ƌw)u:6(`?>6~Z=aH9~'ޘN@|yR?\gSVf@V`ТZyY5ktUeq D56%{DfkR">@,V~pصp̓nfVJIa7n|?1YK*̕.W N&h`2wȁVhM\L̼ph~e389(47Rro{0oȎ)$j" DԢ2A-ЖT%iG-pmtu~az VuϊlrMl5+{fny}sL$ҵkdw:%q`Vpʧy&x4e2Kbl|Q΢ӷе5wWww?PKwPK"*-friendless/games/filler/help/en/rankings.htmlMS0;\z2͌iBBp2>H_]۱S8^}Co6,Y+n'W|1|fb\z\=م߳_x%TC$xM^4qYWg!9Kߴ-W>_\jµ4r&ѿWlF) u5~7Qw k}XG1j N-wQń<isC&JZxp$X?f%~dh+Z)r=L 8)*hROaHo"$LwPU=$.qN\?zQΕ-P1Q0' }hZ'5;/i4TEдfVw s >}iigI'G-fBIpzָ \hVE!x-/PKA Jer$PK "* friendless/games/filler/help/fi/PK"**friendless/games/filler/help/fi/about.htmln0 w=pS $v;$EKGajiHѼsҠEr]cqW7-Jf8&{ 1RիԸr./=G/l*w'Ku[kM*O=tdIuH#zmsf=Yakyx^.ȕةu'p(.KiaEa2ffͰcʸip:gь1n\T\kV$eX4C>թz)eZ(1Ys?I'X)4?Hȵ j:剓o]GYu9€!L 3z8PKSKEN[@PK"*-friendless/games/filler/help/fi/controls.htmlUn6){^ ۤXq葀j,"VgȹP-^ɜ3˶vwr|y1ڬj~nbRU?@:dO,jց*R!da_!ôj@~G5MVb}s,5Ul3m|JQ hJM)pe'ȩ.Ũ,jH=A!4&ܼpۢBe.YJe2 g8e]2r)Ij8@mM@ LJ mB!E/M 'znu9CxTw2ke $q_n%_90>Pۍ-:yi\`0B?Ʉ I|THjtD ᴮ2i$AE~J1`2؀ĹҌhIu_8D^߄tMăԚ>W7V/sQBOj urhaXOR|ˆnN0ZVl IAxX>$y6i}%G@8j8`6;Y~vXFv~Xf:hS0u mdP&.ֹ赌U3H[_ YL/-a>zJ쁻i\Nޱ2dr̛H1{zc>'iRF9ZU-W[- >J_eFXK!Wӓ洹H7Yw+;e;4%q4Y)? s]` $#>qk^9l>v'Ǭ^Z=yOPKxPK"*,friendless/games/filler/help/fi/credits.htmlRn0 +3.Et anؑCؙL!`;{b=|ڷUݬ8M ss|| Үj ~n$H,K%d*: kG(G+X{zϑBgHS@X4Mb<tYґC<(rFf /.qetgҢ}u՘u{@"}@QV7әODρn_hq`տ9_Zfy缄jH1jȳW"!<79%45!@l3 ,l^}B[⬆|yf5cVVLِ4Tz8ZT}q떙rPKԃшPK"*.friendless/games/filler/help/fi/howtoplay.htmlmS0+\r KۂH,i76zRF_}Cϝ%7oޛ7O?Oݣqڋ1To/Έ _"\C Ad<ȩG2߀zǧ.V-unksIRe8$ƅHLu"sTq9C0>hך4z!%bZ_P jFl9  (66K3E֧5 |^:ib9)AS*sR/tZu)%a ";Z}AI`Wۧ$b$J\--11fP~\DBöѓ_X'1Pر{L…ʉ%1~KF2.ut?`ʦuJeJ4r<{n#v&[QzW n5e۩?Q22Eg7ǼGmy*l:_^m PK|oPK"**friendless/games/filler/help/fi/index.htmlmN0 {jU*Z@U9p ZݦqC/BXNQ[f哊W2K?ʼTigtTՀVh'\IQRiṭU$ʊ[W5E,E}'ˎLthOoJ}+fBmH;6Ԇ#+ c7Հ48 Wp+A8j žgIL3~ļPKl7PK"*-friendless/games/filler/help/fi/notfound.htmlputR!!>v!)% 9*K**Kl!\6PN. 4eL Lt wTruUKI(QHNwJZPK0̃tPK"*-friendless/games/filler/help/fi/rankings.htmlmUM6W rkp xal 8jDQġZos%r K7o>=??xt7n7A\_3{ފ) jtP@!M!$ uxO!:j$i55s%x*ʡO6ȚH4MoLP!#IXQo^Uj )5:!xfj31)L`RW.'Pâ+d kYȊ (|1,! 1T.&pb7xZN9M7 KKsx]C>z_cô;ณ!#̖Z6;Po+9&zE 6rR;Fmbi6U*gA8_poF6d>JLAYs !š=w>o|Q|gPmczoD7j9l]%#C 7cS.BJQ_ 7h1dt}z;1?\}/-]Pim+Mԩi]b3f_܍Vbff6J(?a 3r9w.?BeY( yyN ,rW/rc& [-%7K-!fM̈3*5>tn\]g#Hb5:eeW f@dD5o^,ڴvoO?Ng]N4KECW9L_PK+n.MPK"*,friendless/games/filler/help/fi/ratings.htmlUKo7 ϯrJ{HC]`;p _zdB+4A7\qjJ||}xqlwx~z#`|/۫^MSD$ })bKf.IUoLvG`pv WATӸnW*GN8I՚I}_ʪ A6L03:3 .m#&+t8A:)C|8}ۗ9۟7&&gXk麪t]|<j;=wwW(1:O,f)LI';`eٮt=D1BSyު{6ے84Ò`pWYb0w~Q3IH8`ن:Nn"e22w_1ya@Q hFbv!kYE)C9xLH4-:v8RI,1PrG%ljv"i?T߽\U~7o/WjaAdm~@V ů$nsTsTbAC"CxBYR:o EX8oF-YTn5QLY:$Z֮g9lL6z\T'꫑eg*āg>?#ThL! Z2,etAe  @6i1DK2j=GժKnI3Y;WBLcV6:ĩ V#R)g=:ʓI5NXC r~$yE0<.8Ԉs[N:~HS{h-Ҋg)i̋mńV/ʣ0i6jaw8f#,.[ҏNwp0ry}!^$aJq^KRR8PKUq2/ ԓ}`C2ʑ\8[-#P2q#[ú略CZzǏ- g觻.?>H^lܱ)9%%OSj֝of(1GNkX `iS4-ZEZ}lnr P:7ܬ˕PKn>mPK"*0friendless/games/filler/help/fi/tournaments.htmleUMo8 W=u z]`RM A-[2W!}^lKGjtx3ۧ=^oC;f2|u[ ژ9lCg%5|H\gO,@=k+VΗSNl:[O$>9OT:Я:۸ظ.gD!&D"{޵mJXD^_iS8l>잉 (!ry߹uY6xg&ZىZ2zz69id<0;'A8H}sIξvA(gwL}6Ŕz1jH-(0m}.x\ϐ_4\3Cn `֧(){nL޹nm pîCA*hKtP ]8)o&P`9=[Xױ%;3":’MёDO8+e&t7Y!ǖ;(,|8F5:DvgjU-R2C hCyxHfQ76?;֕.BAWcYI^\#4iKyzЍy)EMtCJ9Q&]?trg@%:{5NVC]% L^& bA~I.-s(0IZކCl>2fd5`Rێ|{WBɧoG֏+O(_ mguy_f/ BE%MZͨ:w&}@RMz٫/u->kb}ݲBO!˷˶DS'ҢN;We h[*4k{_;וQIn>/tPK6>mPK "* friendless/games/filler/help/pl/PK"*,friendless/games/filler/help/pl/credits.htmlmRMo@W|nl>c))hE]WQ$NH7r`6i l?ϼ7%q$AtƣF0Gpf[PŤͬ~h #d#LES+RĿd Z',q`Vrw(FIW[pιV#݄P3(ىꤜ Okh2v=YţwVYQlaX5gPXZ0*l=F5f&6< ~+lVs-c?z.׾rP e WŸl< F^ N0Y.#I5S֌FMl!E>ea:##:'+>7PKJFPK"**friendless/games/filler/help/pl/index.htmlmN@} whbRB6 J4K^#dYZN_پPw*v Ք  R]@m츶o+$Ӧv KIqH%*~A]@DK8ӧbPQ (dGF V=v{(VXQ[ފQhlI`ayT(&j.J ,dF I.|<{X秛t:4NX߭If4Cz=fʝ=]Lq:Y`Zj܇jACD 8 saB"?~#!ˎɧ'Q Q,bZ/'?%AaOht\󾗄ԞܣT-kb2miw>+3 &5njֻṈve13&Jj1u;.uP!Zx$L׬&RC/-~Ӎ $1~Cdf/1 8|7cEyΈ'9 V5QW{N d!Sş %-y/s ny ̷נDbp /Q%Dq 5oh$(o{ iPΓ%Tq콟 g$l!X*QR$My4tƫW}=][Ar7EfV*.,=TvnqUYGwqi6K}g d]Y jl~u;S3IpjE_PS\QHE|j?PK1PK"*.friendless/games/filler/help/pl/howtoplay.html}Tn@S|)Hp"҆ "බGήqwʊk&\ڡqg=8]|MXt{}yEbv=G>f 18Ai [bIf2$+^i4cU@@#/W?<32 TvL=dTlkxV9AEpfx*tF-8h:T)t!  Ypxl^OȢ݈ 26-!|xւ !h6D0)( CK TIqĥ pHz)y~]Vxؘ4>-PU{i7F; (ZBWCh`wmzgpy ν`{AWMޢi^̠cmל* Y=Cd7K[xl@ꎜQt Bٴ34\Cv4P=kS./ ג>R5H~~66hj8fJp~i ];ߨЁ+);IeYoizwvo/MuF+ւ*u=MPK. .PK"*,friendless/games/filler/help/pl/ratings.htmluVMo6W |jɦآNnZ5PtocuhI*Q%U``Oor5,9E7f =]vwooeywshUn84$R{cO+?\L~eNJĈޔŏss!}w?OtGBW;QR"9Y61de9tS)vucxKuTh娂⌃,y9ZלztbT2iEQי^}vz3 r];ۻ$H2)1RʺfJ5y\+gJ<ρO;}#GhQL ѝL)K;>jxBLALry7jc&n.Ơ*x>h2 jij H1Ct#QJo5 >4=r7!b_BQ2̀٠Bė ٿI1g_jl9BfSBbe@4XxFU#r+BVc^@vlyՠBl"#@Mtw=GhB#6.>d~ <`* o/EmL=bvHi{ЍXR %C7-ubm+!'JF6fֺ2@wQY36'{%]0:G_o傑Tt 44zXG[m(i#EGM{KxןwꪰÊ>e9nrUj*<$a8rQJOVmآQRӖ _՝[EAIUkMёDgd3,`H+2]N?I4c1fhl!Np %Ui׭pс ~޽o ۯPK]DPK"*-friendless/games/filler/help/pl/notfound.htmlen0 {˽!@ uR71*j&`{*,:5Y$tě%!<-IyT B\xO(1:̣F ЅeUpU.!/A|>[R/nۜzEBLSouIn-lCIdtoNZ=2PKPK"*-friendless/games/filler/help/pl/controls.htmlVnF+>b $x8cx [Hͭv3_ t m DTӛOhzs}~/O׳[SL˺NwѴPi\ujgǗS;w::;vꛛ\DɊkܙÇ89=Fⷫ?wEFDYOV Pɹud^/HjDw)E CMCsyxeZgv4ī7~J:B δt{h|fTԦAyWvBV$PX\kҠCr($ʦDIQ\^f|n]MTr,Vk`[2Jp/0oou 8|M/F F*y@?;^ߚ8s %pX>o@ya|IU4 Zrrrx(V~C:N״&󹨛% tXDmPԲe/ދqL,+98jx*# . & ?PKEa PK"*0friendless/games/filler/help/pl/tournaments.htmleUn6+.N@iHL3GA%֡*He & @ϥ$E7zsϽZܯ?~X :FlqտEgKW_~+/mfo3g_?S,kv͛~~@WCۇ)xBTٮ$#ݶnMfN^WնNv- |N:YjmYj۴wǽQv2;KZ//k]RGR/nyj J^f5m]i<A(!aUw*MnH1]F&:~g;Di%SI}:6Ƈ ʔb( D< vY#Seƃ,p25jkTIk|E)ޚ:6)JlOʐoQck:[Gd\aI&Bi!Kawwe1L:}i~ŖdIT6"|inKlFf>(iq>'Ao$]ؗ>%*e3r5%o&DjSsɡlp>)$'I?<ŵ+vGoi`x&/C5yegg!®M U9NcF(f;_P|G&}%n6-m+i uHԼpesҨ0Z "Pl>4X30O3,RP PmysO&EaRK U2#-4*CR1GLE"~Gq?6gKv"*w?jFO[: CbSb=wƴ`sǚ1ī&7Vl_ ֧rXױ:qJLZE#aC"`E1!-O0 (&Xwpi( !\7t~7=V#{M%S |zM7[Y 7{kW__PK {]PK"*-friendless/games/filler/help/pl/rankings.htmluTn1S8P+UJU@BI[%HQz3x<[Y?P(׼ @ǻMz@ogp1ExJltd&roѠʘZkpiӰcLxŔf(4v߽Pgmzic(Sh\[p^ _"xж̹]/6L b.\c @Y2;˴jdf M|&Ȱ( ]Eb1yb2c"liSNo Ĩw \7ǤD'X5_c*ƪ[dKրw$ey ,e(~)ēOA)Pn1}IQ1ʚH!^ `2 %. g $L[kI#/ȢMеpUTy= @ aCƂdyNp7\cQgyȗ-'P@oc? #OUPg ƗLb$/#`sj'`d5 խ3Tیdxz}2`[SFY 24 uT@ 1,4-뎷LRƿkv//nlkX f6^fJVVz%T-, 3}A8T/|qy? I4Ӱ#dzauF`TqXrovPKcPK "* friendless/games/filler/help/nl/PK"**friendless/games/filler/help/nl/about.htmlmMO0$ w\7ݬ(fےKN4wy7Qo wJ+ZRCm%/sіo(JIjTn-a4/楪s/7G=:s0q0,y!Rfw[,ּI6b~1z lτ/|:I^,8+~Xzďtg}ȷ }{PK2NHPK"*-friendless/games/filler/help/nl/controls.htmlVM6`sh#`@(RFF2-(nfHnK"zYXL'nLJ8"-`g1Z}߮5L'wW{RGc:R$:J)cj#":Gn6Ԙ}*N޾y;bk_&C,w|:YщTk㴲TK c1!DwlxXW5 ?SVg(I55#ԟȲ|U< : p}j;@"oƐHHL#qM?S0 w dLÃ&m%WK' ǘ3>xØ-@_"")Ү@#QKF827vD斡|Zu*h{3~I-> 0Ojhs0hiK|>*tgs`V\}}w^t[n7 ztZ%6W+ңXfM@AE'*u78 xs370`fSr>gDeREiXh Vt"C#h nݛ`| evsS* , CajE?!\4XCm?l ldqK #TB vB`"TY0=Rl'r2f4-kkZBlUQTSk!Z'˧mj91Tr-CL$Z'cCo<5'橠ϚBcEiDYDL4˓{.TЮN[%5"X#2` Hᩂu})ɹ[6U CH3ѬZ8,剝wijʭS!aC:wk`F[>ѧj駓(%%^las l_lw5sCoz; 0PK# PK"*,friendless/games/filler/help/nl/credits.html}TQo0~p@ i*Z@]ԗĵcGӌ Q'}9>Nb]_g_,rްUsp4B$oA)gu+b|o"SHwg "Z '9Z!d9uq)~ MS ;pdR$<_ipbMK lwfm}Mn5O57Ɉ)Ǵ_#]2XHPz4lp*D %܃8J! =iB@ WNH@>l<#9 y\N KNs4]ic7]e>ka1)wy>36d\hҦkqdzxLCl/YE!s4GrBAhhX,-dCy2D A=*}Z3!GF+`Os]SlM(&D# I2 EWH<p+zGIhs! T|;9DN(٣CIin 7>%o,{xxPK(7/PK"*+friendless/games/filler/help/nl/filler.htmluQj0}+:lvh47iMI0~Vs=>¢-3#p>'s~N ~lIqA} EF` " kS>eG|u)4̵ڊa#Zhwj%|%‹:S(^·eÂ[E_#iJG&j߮=z,LeR5#zW5 Jۺ@R"`% w;!Z@.v6pT}6boiv6F+B !)R,@C@$8kUPC<+ؾmg 2bZβ; ]Eh KBse /g5ci,ƫ*$A*)HIL0JuɆ$676& UKfSfmB: sl]Z obZ!E~T+Gm%fBCekOV#Ld sݡSq$B *: \JJru>@k:- &&>k(|P @?t$Y!vXc4 ( ޡ_C͸37s'bE}@j$0rKzz7PKu5PK"*-friendless/games/filler/help/nl/notfound.htmlput!!>v~% ey)y6A>LK$X!Z// PqHGR&PB/$7GĶw[3Z4PK!IfPK"*-friendless/games/filler/help/nl/rankings.htmluTMo@#FRzw"4RB+8.Zֿ3 Ɛ؞}gڬfQZo9ycu2=dCoʷsGo<(.ĚКPA  3BC>`A+`܎G a-3r"u^1_֒p{()يJ@v Y]:@X>1۶ Q;gB;v&JE,b3Kfo.w]m&U2˽qd]D.@ 9'G*qI^o,?X],yrx;cEr u{QnXgu~&|QSk}Ńt$0\G^ˀkW0%]"K''̗\^~a8;rH6H:#O={K TDǣؓ)i ]|K>JVL|БJnEI{ّwS4n<[HθaoN!OgctRӎKZkjhڂ}]r V}9bSp>3()$(WR9"2@G&j(*_}H^z f2Oϗ=>\b/)Whv{su>\/)M.P"# sR\ Vyb x ȨixPК5`4Ozk<[o%) X6ƠHۥVyXqG֧P+/о !;pb\74(!vMO/ag}5֘@;=42280U {"!iwหmS/jdr6~"/E df䩴w:uHb< 0P<0hdth3?%{C?~~1HTW ({Ax>+-v]$gLZ)*P=!ePٟRZ2GHщ˘}-sC2&rd|ZUQŅ[(v|:I 7\՘ƨA]3b?vi u, $ۋ084YFé4"=8e2=l5=wZ02՜Yv[sQJ6ƕ9`&DF$}`0g\+v MK9 0me}\NKQM=tk{hVwh˃h\;O$"Z-fn(TBܙoo,G0:q.w|`,nV3*-֠boC ` Se2T{VG}u.28/GPx5p$[(C׵,11('LnAw*| _edqsb;jx=q#/9lMgpVdk{@(:2S^w@ @np*:hvvPp_PAdFgW} r_z#NW˻ 5~:-PKzp PK"*!friendless/games/filler/robot.pngpPNG  IHDR%X)gAMA abKGD pHYs  ~tIME )#7IDATxVMK#I~2xDED@5aΟ<2 AA<,2=ALWڙ9 Eu~<E׷cX[[ZCJ 0L#O)$3J1+ qrr❝mlnnn ! >5/XDN )ZVu҃(ʉ(9HM\eDՊy H&8 R~dkNnpG `uueya[n,fww75{b[nVL?Lzm”a# |)r۪] XE)l*Fg7aHJº| Dz,u2{"D~X%{1@ku]pA "z.rmM1& Wkr^U&9u`Xu za}ovpYū`pH}}jvRY7ؙPstv_#s~e/J{kuI q΅,|)\AwLyQp<G pG|>86k$Ak!+dSjwj8B)ue(W4MV_k "NDa;[1F_8 OSK\1D6M<4ARaT8R10,%9b @[@؏;OoBXʔxnXq"7pi[( {snSe[UիW2+ G`.y zIO$#oƃ$tk35w.`*ߏ#7s"CuMM nM8,?zBKJ7IENDB`PKPK"*$friendless/games/filler/armorine.pngPNG  IHDRO|vgAMA abKGD pHYs  ~tIME 6g@bIDATxn1@.Gt2f[|i"%"I]׷wβ<Rm^6Q`&/`5SERSۜ3krP>䍑q_+a9n~̶a)57ZɈz<z4^5QOBچ|DE bנM J{EpSe6i/3V\ s\3f ,U`*%` һUB93'ThE` #%⑧+QwA"I=x2A%F=ccǶUɲpd%,{eP PwtcXMϋ9V($ӊU;U!ߙ+[:DͻpWAF5^N *W hSe0.7=\t`nNӮs`\nyv g&韪mTiJKwo}*ǪTVثx@F"]C6{\ޚsžb a;?N#8,81vCȴ'+G1d&]DgIENDB`PK\bPK"*%friendless/games/filler/blueAlien.gifstLbd8@??OFv$^Rj~8BiM~k}Ɣb3j#V4"EPKZ-$XŰxW˃);U}s-!V&j 7y`a̗=jz[qmНM %me+ |#ȁh3-%xZ*5u6:7QE͗O"Sd;ֲy@d ½<"78XăQDsڥ0v:DOD ,.; i@pr9MY(jD [s e$DH`Rv½o_ǯhI]2]2}^}2@RJQa^*2yVU|Il516`A;)7[[L-#..H1叧w*Y(SF*4ڴ-Sg@-2Im l~Ϙ,ZC^£:&cLtk*1|Yr^ݍQ` L cY?G`eZӴf~m,Zik46:C*JU_YZ0JҖbfb&ٿR '7볇3x)iFj7SL;s(Ih 7C; JFF/_D$xޜ=|whG qb& ۯH8|C?n/9ꇿ*LXlOg7_nb\-d33ʓHgUl0:'U]=2ڹb/+4}]^<ʢWcU-\DȰ.TV"=Pgbqnm]% g E+?P@Rր폘 MbdY;tS[UM2qTHH_+urɲ8H*>֪IHt 4+h8ɘ~Մ]2_@-~wzf)iBߡfD>E"%:J_~ZR ka:MH k\p=bY&Lmx>pA%.^8Y&"gd39ntShUߴ0~iˠLi}4V#اi]:dY4a:|LˍXBBuQoo' 2I'A$>o <υא?x.pw$'6E($5Mu`$boklKPnǙ\nʚ'1 ;ϟ͞a{e,X)6&cQd(`&,Gs f\`#}gu]Qgǜb,`Պ/e9A L̗Eǃhds%tO7Ynwvfp&`]m`%W$7|΅2I6xzԠLgD. 6hzdYƱ\9|(U(`z9+%\:\ /@B jd-1&-Mn?: 4 $t!E,_>%o],#68t{XnrX,, 0Վ[Ow³]:ajvODĐ~dNi9!vb1؍Ȗ2MJHex j's-%* ANp:IwOba轻JGMP<ƀ! \%]bC'G؇>/ !@pkTcGy'Tx/n݄,X YZ28Rc]B;4s`Q%"Y M[p ^r>u*< ]1!ps-`5Yj!5}+?i7"ӡ~vgrCZ/t߉$ M8a M{yz6nm97M,ᎌHǒM[>;۹筃ӕϼ'S`,9yE5SXҪyOL;f-A\*"=7R{Q&pģ.}Q '|R d̠kpo\71qNƟ?k$^c jh33rr.ht ]vHF3}dlS5A%Ju艎iGzxaZO[f77kU^wU [6) hz؎=k;`ٯ#v݀>RPy`~d{xUnj}ɟG&WP^{bw0p~>/$rӱ7N2ipEy{ԆI82!Y -T/:~Bu)<=pjd¥ G ֮ _Bwď` ]N}"OXP\l~ yQs}"tac9VlFfyyC싯uqRPF›ze=>]OKC"cBsRfoq:+JgtjE-E_x[yKog]ZaE 7M0[3lRuҵ1b7(vCX3&y㗢(d927w?\_N̡i7]>D3Pntrotwߊ<Bs|_?}+0m1I Դ-5ؒKS Z){~<4 )z{ +NV[KKCb*Mnw8"Sb`_[]q>QE2ffQξ{s@𢡊aTcD[[ ^9PeV}u3/7rؽކH#P}lG|npMQK2Pa($a8SHmBD~inT2aA f γPTј kIvI!kNcaM i[N_ k"T{ Ӳ8sQo\t E) QԈY|Y+fW=sYަ2acZOH6җFE؅?'6vꞅe@uӹsm3x-}7x}LÝQ ظ`ķй&Up7$j,XF%{z6St6l}+-0 ]wG}\@ ->V}˱{ )gkl'ԩmi%B`wBW6ІR-V u׸ @Do*㥬oHyp ע)K\C (;"b)b #;p 7 dHLt}CQ[a%r?^V#-%moq 7qBܪ,LӵÅ`:/T|>M&@ly:lj,dED%)v pPn<>0m4O#:\OO{m3׃\@R|FS;*.ޫ7iӎ+RU8<ɣ塸F24;F\~jUn9Nev (P?}xfYX~4z9;J檉T7K~@dD;ig`f\Vn6 -,w`EҰ7fdD+pF5G]Dڷ_| z;AIgזʿhj~՝Ah05zZfuy(__aw]~G"+0f0v*UV5Wp:JZOϛ_iy.2GXȇDfXk7NC%$66ѮZvv2~,qfiqb' 48-ImOn3t]eF#ɖE4N|E\ott"5 '/'~󮾦rl|o%E{(n@u Inf =jڡ,FUMsa9Ñr-OO➾N8$hGb v6 ͌,vAێ k:Uֹ˹Pl~s/wEJ 2vZJ%8i7@@>zLxFB<[n,pnX9088(u/Ԏ;8tRvغ~,.kxn 5vPi9xu׮yE>E%tz7]WHy6he.PyW&t/YӂgܒBGGw9<;yN}uhc+ .%_ d𸪐 d6r\BPK#՛Fq_ ZafRo #涆P cgy",ap.A%wT D#I0 *vbec&aciUP [WW{S,`<3WH8uUg2NVWRhƏd; c_Y } g n()37QUߴ?$) j37 <<<=&i*uc8u.ŧ&Y4)ty=L76:!0䃺^4 ]?VESzou .X,he4Z::&\:@HPi;^ОyaLn1`T6(߯8RFx]U"Ǐ}7w5b30Ñ/+4!(eq rYLRou1"b'[ 0) q/uчU \j:-F1)ER]W.p5YcL`]ػ|cHc,|=6#Q힇mѭO~>nOjtzff(D;(XJ =*誯L`ZZO`1ƛ  OSU5cA Ìg@q(ë?InXFsʠ Y#7Lyf M¦7)ZB?&Ԩ-nW@:[x-hon/z]HW;!Z#nyNNJ#́66sB1j&kQdݠuL/NΣD͇.2S4:iu+`;vClg,ڰg? 3T!9aY(Glr;`@J3Ћq6ý{?[:-T9ɫt؛h5#^L{CGVV<Eǟpj>S5~ >/eۿT+ĺ+雚xGxag T1(aBT+)5AW.|;f2#8Xܽ.jPh$g>d~#+T1"麩Cv©eDW[@J2.Loȶ5mL#߫%fn@4s&3 MK#`y-wrpF輎$N$'U,.w]WS@\;?/٥{\ 02Ӈwylj}lxLsccuh"t*M& ʵ'mj<:ZF")O? W!=MnL#ė3:?3bj$ |<$?t qX+W_oFkli4WȾ6Evzm7+]fs:|.}YhT(]aw?z]EZ2z/ZK\s;j?}h@ٝ- %v]ty|ΫD/۸ -8#H4<)EQ ?\{ڸ:ܽfp" :3l`T:Z0/ll -MAbEٝ^i1ZƽjOeGݙ:} giI4قbKڭu?K~ [N c1 |Ѻ]g3QsZtZ Ra wZap5I-bfm!$Uy|nEG m!a.42:ތvQP( eLdbe=1ɸfkCy]WAð 2fl|4Rx)毅"0V{JJsV +yv2*+TU <0MS\c0~1 uj4䗖>>3;Rz-[Ո-ٰ@ f8~~MZYcc6W l?MLFfvpc3?8ؖ xda/@寊0t 'Q-Q;|G% G`h,qmA/{u2j{ H(sYB7{Ra+'T8JG~v7F ;)}?7ErhZ极/'_lH0Mb3jiP <P)Xa&\TQx:FyiQSDL=[k('we?=< !R_VY/s>QX9|vQ@!N4LLfh"Av^OOFtRZۚ`! K FtwQ Ze#'Y [fs&#eV6,. uҷ-ƒm4%2K΅]Yѩbsgƌe1g2E¶߱`sNeViXTT4`z/ Cjj,CΈ+5CQIj*o 4ӕYEZIOp<오Gjs3I,vߟ02 m+Ys+7^{ZA{Iu X{F( Igdy N\ha0LJ1 ?&X ?1y$_sZb~vq;iEt PoՖlQ0n^Lr\E݉tbVI*'^HuFT%a2%+1i[ UrS3IS?L՛T` W#phWXk܉^Q)u!l"Zՙ1+ꎜ9Wy6|;i]gI D˳4aza4C/IFW^Ęu_]] ɬݒ} >A!ⶩ"ޝs'nq##7! {Bm⃠3#ytqxK؇ SR|W^ 5aM?ɋٓBuX(Dq l:N#0iߦHWJšs.J[0$z ֵh4Gaц\h||}ؚsau<V/zƴ cO#6ys?< )?k:3s!Oȉ{U+u Kqmaz~{IU+`F&@AM٦h ŷXz\s!NʡQzWYS,J]1ղ=BbU صDc70bpRuf˕of'xN&>?.YEgOÎ&G]ߕldĆYx/$"b Y;N<>.Nү~4|@H;O .^hݲKoFVCCt.i]m5USܭVeR߶"B3D^>ZaY-kJ ~_B(pgGHD@$Hj&ItǁwQmh;5TRb-g&'/`)2#"zUbX @ CFK;!^E%tT~3UfUrXݝX3g\"G#%]rڔ9 vcc#B%E1q׋7N4Y~G}d T5Q, q"2Hr: &&ߢ xLCB[q`wy?=6I_6#هjľ1236ȖGζc ]&*@WJItˁ"GCgϕBW &ٞB cKisJXޣaݑ{aAHC؃ rtJ0CKw0r$PUzOV˻mwڜ1BwV7VU~ Š^ҋe4Mz8')jWE8etl# lx3kjge[B&qj !W87oҜGX#zw IU$؍Wq9\\ME .KD !Y4#z._BQ Qr3YhEĔe7e\w=Ic@ıٗ/[g5EtC~?9Sl`{WqB=>:aXW׽8+]PKŗ ^uUK 2~xi.;iu=^jK^4{#/hhid„555Һ٫Ljws~H>"Wmڂf1kLsT<4נ&Ġ4!D<:N9 paY `NNbƔG܌͔ckMI)&;}ZNf'0&w`JSм-fRaweb\IҊ2 PH^%j Y>ͨz R5 hqeЍ^gIyŰ~cw"_&ħ5Sc0#O5B߾};5 1,l!XN"rK{ĿWV^\(?[T }"V>7::ڝ%Efmcϼ %QzG%k;z̴IV&%ʇ`Ȳ&V^b1ʭVGPVeY*DȾy<@d%JZ{#sƶ@{ds:-vR+K\" i_ɯADN̵ >%GfR*Zaɉ̭CS*^Xrp~*wpS7P/\04$3WNAc?r}:/囗eI1Q8H)OBPKB `*"g#PK"* META-INF/PK"*8ip=META-INF/MANIFEST.MFPK "* friendless/PK "*friendless/awt/PK"*][)  >friendless/awt/HCodeLayout.classPK"*k ! friendless/awt/SplashScreen.classPK"*ɤ , friendless/awt/VCodeLayout.classPK "*friendless/games/PK "*friendless/games/filler/PK"*w%u-2Efriendless/games/filler/AbstractFillerPlayer.classPK"*%7k*Kfriendless/games/filler/FillerPlayer.classPK"*x C )friendless/games/filler/FillerModel.classPK"*˚/;-friendless/games/filler/FillerPlayerSpace.classPK"*pfQ0friendless/games/filler/ChoosePlayerList$ChoosePlayersListSelectionListener.classPK"*y95.3friendless/games/filler/ChoosePlayerList.classPK"*!Q ,H7friendless/games/filler/PlayerRenderer.classPK"*Lr,E>friendless/games/filler/PlayerWrappers.classPK"*xZQ +tGfriendless/games/filler/PlayerWrapper.classPK"*T*Mfriendless/games/filler/PlayerRating.classPK"*C9k *Qfriendless/games/filler/ColourButton.classPK"*^v-Wfriendless/games/filler/DumbRobotPlayer.classPK"*̩`!3[friendless/games/filler/EditTournamentPanel$1.classPK"*2E3_friendless/games/filler/EditTournamentPanel$2.classPK"*9ivRYafriendless/games/filler/EditTournamentPanel$SetTournamentDescriptionListener.classPK"*,8 T1Bdfriendless/games/filler/EditTournamentPanel.classPK"*ʹ\F)nfriendless/games/filler/MainPanel$1.classPK"*΂f'fpfriendless/games/filler/MainPanel.classPK"* xO-!wfriendless/games/filler/TournamentRules.classPK"*Wse+yfriendless/games/filler/PlayerRatings.classPK"*b +friendless/games/filler/RankingsPanel.classPK"*^%B#-friendless/games/filler/HeadToHeadPanel.classPK"*Znʬ+!friendless/games/filler/FillerPanel$1.classPK"*)<~YH+&friendless/games/filler/FillerPanel$2.classPK"*Q]J+؎friendless/games/filler/FillerPanel$3.classPK"* +friendless/games/filler/FillerPanel$4.classPK"*88 +friendless/games/filler/FillerPanel$5.classPK"* Zt*)Afriendless/games/filler/FillerPanel.classPK"*03+b4 friendless/games/filler/HelpPanel$LinkListener.classPK"*?1m9'Ыfriendless/games/filler/HelpPanel.classPK"* Kw" )friendless/games/filler/FillerBoard.classPK"*T d,mfriendless/games/filler/PlayerComboBox.classPK"*Tu)+friendless/games/filler/FillerSpace.classPK"* 'friendless/games/filler/EloRating.classPK"*'friendless/games/filler/Evaluator.classPK"*}JC&friendless/games/filler/Filler$1.classPK"* qo$\friendless/games/filler/Filler.classPK"*k}[Ֆ,friendless/games/filler/FillerSettings.classPK"*j2friendless/games/filler/HeadToHeadTableModel.classPK"*CBnfriendless/games/filler/LookaheadRobotPlayer$ExpandEvaluator.classPK"*:2friendless/games/filler/LookaheadRobotPlayer.classPK"*6 n)friendless/games/filler/RobotPlayer.classPK"*+@,0friendless/games/filler/OptimalRobotPlayer.classPK"*ǔOG0~friendless/games/filler/PopupFillerBoard$1.classPK"*C H .+friendless/games/filler/PopupFillerBoard.classPK"*\| 3$friendless/games/filler/TournamentPointsTable.classPK"*

<bfriendless/games/filler/remote/messages/NewGameMessage.classPK"*u+ (ffriendless/games/filler/defaultAlien.gifPK"*[SZ,( hfriendless/games/filler/defaultHuman.gifPK"*Y2}9/ifriendless/games/filler/resources_pl.propertiesPK"*%$qfriendless/games/filler/grayAlien.gifPK"*=%]rfriendless/games/filler/grayHuman.gifPK"*M:"ufriendless/games/filler/splash.gifPK"*<,Ɏfriendless/games/filler/resources.propertiesPK"*F^/ȕfriendless/games/filler/resources_nl.propertiesPK "*$friendless/games/filler/.thumbnails/PK"*1v=;CIC@;friendless/games/filler/.thumbnails/filler-screenshot.aa.gif.pngPK"*AA=friendless/games/filler/.thumbnails/filler-screenshot.gif.pngPK "*#friendless/games/filler/help/PK "* Z#friendless/games/filler/help/en/PK"*G ,#friendless/games/filler/help/en/credits.htmlPK"**%friendless/games/filler/help/en/index.htmlPK"*K+'friendless/games/filler/help/en/robots.htmlPK"*˝.*friendless/games/filler/help/en/howtoplay.htmlPK"*_,,friendless/games/filler/help/en/ratings.htmlPK"*Bu*0friendless/games/filler/help/en/about.htmlPK"*d`-1friendless/games/filler/help/en/notfound.htmlPK"*vzt}-2friendless/games/filler/help/en/controls.htmlPK"*w0k6friendless/games/filler/help/en/tournaments.htmlPK"*A Jer$-@:friendless/games/filler/help/en/rankings.htmlPK "* =friendless/games/filler/help/fi/PK"*SKEN[@*K=friendless/games/filler/help/fi/about.htmlPK"*x->friendless/games/filler/help/fi/controls.htmlPK"*ԃш,&Cfriendless/games/filler/help/fi/credits.htmlPK"*|o.Efriendless/games/filler/help/fi/howtoplay.htmlPK"*l7*\Gfriendless/games/filler/help/fi/index.htmlPK"*0̃t-Hfriendless/games/filler/help/fi/notfound.htmlPK"*+n.M-rIfriendless/games/filler/help/fi/rankings.htmlPK"*,۸oLc,Lfriendless/games/filler/help/fi/ratings.htmlPK"*n>m+Pfriendless/games/filler/help/fi/robots.htmlPK"*6>m0gTfriendless/games/filler/help/fi/tournaments.htmlPK "* bXfriendless/games/filler/help/pl/PK"*JF,Xfriendless/games/filler/help/pl/credits.htmlPK"*SL*Zfriendless/games/filler/help/pl/index.htmlPK"*1+=\friendless/games/filler/help/pl/robots.htmlPK"*. ...`friendless/games/filler/help/pl/howtoplay.htmlPK"*'s,cfriendless/games/filler/help/pl/ratings.htmlPK"*]D*mgfriendless/games/filler/help/pl/about.htmlPK"*- ifriendless/games/filler/help/pl/notfound.htmlPK"*Ea -jfriendless/games/filler/help/pl/controls.htmlPK"* {]0nfriendless/games/filler/help/pl/tournaments.htmlPK"*c-%sfriendless/games/filler/help/pl/rankings.htmlPK "* Yvfriendless/games/filler/help/nl/PK"*2NH*vfriendless/games/filler/help/nl/about.htmlPK"*# -wfriendless/games/filler/help/nl/controls.htmlPK"*(7/,S|friendless/games/filler/help/nl/credits.htmlPK"*-3!+~friendless/games/filler/help/nl/filler.htmlPK"*|D9].^friendless/games/filler/help/nl/howtoplay.htmlPK"*u5*friendless/games/filler/help/nl/index.htmlPK"*!If-9friendless/games/filler/help/nl/notfound.htmlPK"*S -friendless/games/filler/help/nl/rankings.htmlPK"*9,friendless/games/filler/help/nl/ratings.htmlPK"*@V6+friendless/games/filler/help/nl/robots.htmlPK"*zp 0ofriendless/games/filler/help/nl/tournaments.htmlPK"*o/gup!=friendless/games/filler/robot.pngPK"*u+ $friendless/games/filler/redAlien.gifPK"*#:friendless/games/filler/badrock.pngPK"*\b$Wfriendless/games/filler/armorine.pngPK"*%friendless/games/filler/blueAlien.gifPK"*d|N&friendless/games/filler/greenAlien.gifPK"*zAk _7/friendless/games/filler/resources_ru.propertiesPK"*H/[friendless/games/filler/resources_fi.propertiesPK"*B `*"g#%friendless/games/filler/splash_fi.pngPK7;filler/windows/filler.bat0100664000076400007640000000002507224552024014462 0ustar johnjohnjava -jar filler.jar filler/windows/ratings.ser0100664000076400007640000006510607224552024014712 0ustar johnjohnsr%friendless.games.filler.PlayerRatings[LratingstLjava/util/List;xpsrjava.util.ArrayListxaIsizexpwsr$friendless.games.filler.PlayerRating 3>vjIgamesIratingL headToHeadtLjava/util/Map;LnametLjava/lang/String;xp@srjava.util.HashMap`F loadFactorI thresholdxp?@w xt6friendless.games.filler.player.HumanFillerPlayer/Humansq~ -sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitour[IM`&v겥xp t.friendless.games.filler.player.Makhaya/Makhayauq~2t,friendless.games.filler.player.Rosita/Rositauq~e t.friendless.games.filler.player.Shirley/Shirleyuq~t(friendless.games.filler.player.Hugo/Hugouq~t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~&?t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~)t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~At0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~Tt*friendless.games.filler.player.Wanda/Wandauq~Et*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~)t,friendless.games.filler.player.Dieter/Dieteruq~t*friendless.games.filler.player.Basil/Basiluq~+xt,friendless.games.filler.player.Sachin/Sachinsq~ sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~~Bt0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~Kt0friendless.games.filler.player.Margaret/Margaretuq~%t2friendless.games.filler.player.Jefferson/Jeffersonuq~qt*friendless.games.filler.player.Wanda/Wandauq~j-t*friendless.games.filler.player.Luigi/Luigiuq~>t(friendless.games.filler.player.Omar/Omaruq~t*friendless.games.filler.player.Basil/Basiluq~Zxt,friendless.games.filler.player.Dieter/Dietersq~qsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t,friendless.games.filler.player.Eldine/Eldineuq~t.friendless.games.filler.player.Cochise/Cochiseuq~?t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~&t2friendless.games.filler.player.Aleksandr/Aleksandruq~t0friendless.games.filler.player.Mainoumi/Mainoumiuq~nt0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~t2friendless.games.filler.player.Jefferson/Jeffersonuq~t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~xt.friendless.games.filler.player.Isadora/Isadorasq~O.sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~*6t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~+t.friendless.games.filler.player.Cochise/Cochiseuq~#t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~69t0friendless.games.filler.player.Mainoumi/Mainoumiuq~#t0friendless.games.filler.player.Claudius/Claudiusuq~-t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~$2t,friendless.games.filler.player.Dieter/Dieteruq~%t*friendless.games.filler.player.Basil/Basiluq~ xt0friendless.games.filler.player.Margaret/Margaretsq~sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~?t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~ et&friendless.games.filler.player.Che/Cheuq~0t2friendless.games.filler.player.Aleksandr/Aleksandruq~:dt0friendless.games.filler.player.Mainoumi/Mainoumiuq~m t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~6*t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~)t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~t*friendless.games.filler.player.Basil/Basiluq~ xt,friendless.games.filler.player.Rosita/Rositasq~Wsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~)t0friendless.games.filler.player.Mainoumi/Mainoumiuq~(t0friendless.games.filler.player.Claudius/Claudiusuq~t0friendless.games.filler.player.Margaret/Margaretuq~t2friendless.games.filler.player.Jefferson/Jeffersonuq~&t*friendless.games.filler.player.Wanda/Wandauq~t(friendless.games.filler.player.Omar/Omaruq~9t,friendless.games.filler.player.Dieter/Dieteruq~>t*friendless.games.filler.player.Basil/Basiluq~xt*friendless.games.filler.player.Luigi/Luigisq~qsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~2t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt.friendless.games.filler.player.Makhaya/Makhayasq~sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~t,friendless.games.filler.player.Sachin/Sachinuq~At&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~#t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Margaret/Margaretuq~-t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~Kt*friendless.games.filler.player.Basil/Basiluq~xt0friendless.games.filler.player.Claudius/Claudiussq~msq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~t,friendless.games.filler.player.Sachin/Sachinuq~+t&friendless.games.filler.player.Che/Cheuq~$t2friendless.games.filler.player.Aleksandr/Aleksandruq~t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~Zxt*friendless.games.filler.player.Basil/Basilsq~sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~)t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~Et&friendless.games.filler.player.Che/Cheuq~t2friendless.games.filler.player.Aleksandr/Aleksandruq~t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~t2friendless.games.filler.player.Jefferson/Jeffersonuq~$!t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~t,friendless.games.filler.player.Dieter/Dieteruq~-jt*friendless.games.filler.player.Basil/Basiluq~xt*friendless.games.filler.player.Wanda/Wandasq~Hsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~XJt.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ mt.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~nt,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~&\t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~#t2friendless.games.filler.player.Jefferson/Jeffersonuq~%t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~(t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt0friendless.games.filler.player.Mainoumi/Mainoumisq~sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~t,friendless.games.filler.player.Sachin/Sachinuq~)t&friendless.games.filler.player.Che/Cheuq~At2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~2$t2friendless.games.filler.player.Jefferson/Jeffersonuq~t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~9t,friendless.games.filler.player.Dieter/Dieteruq~t*friendless.games.filler.player.Basil/Basiluq~ xt(friendless.games.filler.player.Omar/Omarsq~D^sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t(friendless.games.filler.player.Hugo/Hugouq~t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt.friendless.games.filler.player.Shirley/Shirleysq~Rsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt(friendless.games.filler.player.Hugo/Hugosq~}+sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~?t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t.friendless.games.filler.player.Cochise/Cochiseuq~It,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~+t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt,friendless.games.filler.player.Eldine/Eldinesq~xsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~d:t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~t,friendless.games.filler.player.Sachin/Sachinuq~)t&friendless.games.filler.player.Che/Cheuq~t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~#t0friendless.games.filler.player.Margaret/Margaretuq~96t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~)t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~B~t*friendless.games.filler.player.Basil/Basiluq~xt2friendless.games.filler.player.Aleksandr/Aleksandrsq~]Msq~ ?@#w/t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~JXt0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt2friendless.games.filler.player.Manuelito/Manuelitosq~j Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. filler/HACKER0100664000076400007640000001024607224552024011711 0ustar johnjohnHackers Only ------------ You're welcome to hack on any part of Filler, but these are the areas that I am most interested in seeing advanced. * Better robot players. I believe it's possible to write a robot player which can beat almost all humans, even in Java. Note that all robot players should be tested to ensure that they terminate. I have had many instances where a robot player was in a position to win but insisted on choosing the wrong colour and hence the game could not finish. * Worse robot players. Bad robot players are needed as cannon fodder for the good robot players to help the ratings system work. They are also useful to pit against bad human players. * Better user interface. My GUI design skills are somewhat lacking, and someone with some artistic talent could do a nice job I'm sure. * Support for network play, i.e. a player at the other end of a TCP connection. It would be cool if the other end of the connection could be a robot player, and we could do some sort of Turing test :-). * Support for cyborg players, i.e. human players assisted by the robot algorithms. * Better support for human players, so that they could have names other than 'Human' and they could have different rankings. * Support for new players, who may not know what the heck is going on with all these computer players. It would be nice if the program could automatically choose a computer player to match or challenge their skill level. * Better configurability, so maybe you could change the 9 colours, and the game can remember the x,y location of the window and the current tournament rules. I would suggest keeping all this info in a Map and serialising it out to a file. At the very least, the game needs to be able to run in an alternate colours mode so that colour-blind people can play it. * Internationalisation. The code and Java support internationalisation, and all (hopefully) of the strings used in the game are in the file resources.properties, so internationalising will hopefully be a simple matter of producing new versions of the resource file. See the file INTERNATIONALISATION for more details. * A Windows installation. Although the code will run perfectly well on Windows, some Windows users who have Java will not know how to build the jar and run it, as 'make' doesn't come standard with Windows. It would be good to have the game packaged as an EXE which will install itself. I have added a windows target to the Makefile, which will at least make a batch file for Windows. * Put forward and back buttons on the help panel. * Make sure that all the right buttons and tabs are disabled. I think At the moment you can start a tournament while a tournament is already in progress, and I don't know what will happen if you do that. * The tournament results are not well presented (e.g. if you are lucky, you get told who the winner was). It would be nice to have another panel where the tournament results are presented. (This idea came from Lang Sharpe.) Coding Rules ------------ If you want your code to get into my code base, you'll need to follow these rules, because I am very fussy. If I really like your ideas I will code them myself, but that will take longer. * Follow the coding style (brackets, spaces, NO TABS). It is Sun's standard, so it is not too onerous. * Any strings which appear on the GUI must come from the resource file. I hope you'll find the source code easy to understand and well documented. I also hope you'll keep it that way if you add to it, because if you don't I will, and I won't be happy about that. Please send changes back to me (friendless@users.sourceforge.net), and I'll include the ones I like. Organisation ------------ The organisation of the source distribution is as follows: * src - the Java source code. * res - Java resources. Must go in your CLASSPATH if you are not running from the jar. * classes - created by the make command. Must go in your CLASSPATH if you are not running from the jar. * windows - the prebuilt Windows distribution. * other - an assortment of other files which are used in the build process, or are useful to developers. filler/README0100664000076400007640000000057107224552024011711 0ustar johnjohnThanks to Alexander Vikulin for writing the original (Windows) version of Filler. I wrote this version to study the robot algorithms, and to try to find a worthy opponent. I also wrote it to prove that Java is fast enough for complex algorithms and complex games. Please look at the INSTALL file for installation tips. Please look at the HACKER file for ideas for developers. filler/INSTALL0100664000076400007640000000063507224552024012063 0ustar johnjohnIn the top directory (same directory as this file), run 'make'. That will build a jar file for you. You then need to be super-user (root), and run 'make install'. If you can't be super-user, just do 'java -jar filler.jar' instead. The executable program is called 'filler', and will be installed in /usr/local/bin. Since release 1.01, filler will use your shell variable LANG to set the language that it runs in.filler/NEWS0100664000076400007640000000026107224552024011524 0ustar johnjohn16 December 2000 Version 1.01 released. This version includes bug fixes for internationalisation, and Finnish and Russian translations. 27 November 2000 Version 1.0 released!filler/other/0040775000076400007640000000000007224552024012152 5ustar johnjohnfiller/other/metainfo.txt0100664000076400007640000000005307224552024014510 0ustar johnjohnMain-Class: friendless.games.filler.Filler filler/other/filler0100764000076400007640000000013707224552024013351 0ustar johnjohn#!/bin/sh cd /usr/local/filler java -Duser.language=$LANG -jar /usr/local/filler/filler.jar $* filler/other/ratings.ser0100664000076400007640000006510607224552024014341 0ustar johnjohnsr%friendless.games.filler.PlayerRatings[LratingstLjava/util/List;xpsrjava.util.ArrayListxaIsizexpwsr$friendless.games.filler.PlayerRating 3>vjIgamesIratingL headToHeadtLjava/util/Map;LnametLjava/lang/String;xp@srjava.util.HashMap`F loadFactorI thresholdxp?@w xt6friendless.games.filler.player.HumanFillerPlayer/Humansq~ -sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitour[IM`&v겥xp t.friendless.games.filler.player.Makhaya/Makhayauq~2t,friendless.games.filler.player.Rosita/Rositauq~e t.friendless.games.filler.player.Shirley/Shirleyuq~t(friendless.games.filler.player.Hugo/Hugouq~t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~&?t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~)t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~At0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~Tt*friendless.games.filler.player.Wanda/Wandauq~Et*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~)t,friendless.games.filler.player.Dieter/Dieteruq~t*friendless.games.filler.player.Basil/Basiluq~+xt,friendless.games.filler.player.Sachin/Sachinsq~ sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~~Bt0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~Kt0friendless.games.filler.player.Margaret/Margaretuq~%t2friendless.games.filler.player.Jefferson/Jeffersonuq~qt*friendless.games.filler.player.Wanda/Wandauq~j-t*friendless.games.filler.player.Luigi/Luigiuq~>t(friendless.games.filler.player.Omar/Omaruq~t*friendless.games.filler.player.Basil/Basiluq~Zxt,friendless.games.filler.player.Dieter/Dietersq~qsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t,friendless.games.filler.player.Eldine/Eldineuq~t.friendless.games.filler.player.Cochise/Cochiseuq~?t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~&t2friendless.games.filler.player.Aleksandr/Aleksandruq~t0friendless.games.filler.player.Mainoumi/Mainoumiuq~nt0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~t2friendless.games.filler.player.Jefferson/Jeffersonuq~t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~xt.friendless.games.filler.player.Isadora/Isadorasq~O.sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~*6t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~+t.friendless.games.filler.player.Cochise/Cochiseuq~#t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~69t0friendless.games.filler.player.Mainoumi/Mainoumiuq~#t0friendless.games.filler.player.Claudius/Claudiusuq~-t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~$2t,friendless.games.filler.player.Dieter/Dieteruq~%t*friendless.games.filler.player.Basil/Basiluq~ xt0friendless.games.filler.player.Margaret/Margaretsq~sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~?t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~ et&friendless.games.filler.player.Che/Cheuq~0t2friendless.games.filler.player.Aleksandr/Aleksandruq~:dt0friendless.games.filler.player.Mainoumi/Mainoumiuq~m t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~6*t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~)t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~t*friendless.games.filler.player.Basil/Basiluq~ xt,friendless.games.filler.player.Rosita/Rositasq~Wsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~)t0friendless.games.filler.player.Mainoumi/Mainoumiuq~(t0friendless.games.filler.player.Claudius/Claudiusuq~t0friendless.games.filler.player.Margaret/Margaretuq~t2friendless.games.filler.player.Jefferson/Jeffersonuq~&t*friendless.games.filler.player.Wanda/Wandauq~t(friendless.games.filler.player.Omar/Omaruq~9t,friendless.games.filler.player.Dieter/Dieteruq~>t*friendless.games.filler.player.Basil/Basiluq~xt*friendless.games.filler.player.Luigi/Luigisq~qsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~2t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt.friendless.games.filler.player.Makhaya/Makhayasq~sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~t,friendless.games.filler.player.Sachin/Sachinuq~At&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~#t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Margaret/Margaretuq~-t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~Kt*friendless.games.filler.player.Basil/Basiluq~xt0friendless.games.filler.player.Claudius/Claudiussq~msq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~t,friendless.games.filler.player.Sachin/Sachinuq~+t&friendless.games.filler.player.Che/Cheuq~$t2friendless.games.filler.player.Aleksandr/Aleksandruq~t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~Zxt*friendless.games.filler.player.Basil/Basilsq~sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~)t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~Et&friendless.games.filler.player.Che/Cheuq~t2friendless.games.filler.player.Aleksandr/Aleksandruq~t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~t2friendless.games.filler.player.Jefferson/Jeffersonuq~$!t*friendless.games.filler.player.Luigi/Luigiuq~t(friendless.games.filler.player.Omar/Omaruq~t,friendless.games.filler.player.Dieter/Dieteruq~-jt*friendless.games.filler.player.Basil/Basiluq~xt*friendless.games.filler.player.Wanda/Wandasq~Hsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~XJt.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ mt.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~nt,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~&\t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~#t2friendless.games.filler.player.Jefferson/Jeffersonuq~%t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~(t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt0friendless.games.filler.player.Mainoumi/Mainoumisq~sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~t,friendless.games.filler.player.Sachin/Sachinuq~)t&friendless.games.filler.player.Che/Cheuq~At2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~2$t2friendless.games.filler.player.Jefferson/Jeffersonuq~t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~9t,friendless.games.filler.player.Dieter/Dieteruq~t*friendless.games.filler.player.Basil/Basiluq~ xt(friendless.games.filler.player.Omar/Omarsq~D^sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t(friendless.games.filler.player.Hugo/Hugouq~t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt.friendless.games.filler.player.Shirley/Shirleysq~Rsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt(friendless.games.filler.player.Hugo/Hugosq~}+sq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~?t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t.friendless.games.filler.player.Cochise/Cochiseuq~It,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~+t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt,friendless.games.filler.player.Eldine/Eldinesq~xsq~ ?@#w/t2friendless.games.filler.player.Manuelito/Manuelitouq~ t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~d:t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~t,friendless.games.filler.player.Eldine/Eldineuq~ t.friendless.games.filler.player.Cochise/Cochiseuq~t,friendless.games.filler.player.Sachin/Sachinuq~)t&friendless.games.filler.player.Che/Cheuq~t0friendless.games.filler.player.Mainoumi/Mainoumiuq~ t0friendless.games.filler.player.Claudius/Claudiusuq~#t0friendless.games.filler.player.Margaret/Margaretuq~96t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~t*friendless.games.filler.player.Luigi/Luigiuq~)t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~B~t*friendless.games.filler.player.Basil/Basiluq~xt2friendless.games.filler.player.Aleksandr/Aleksandrsq~]Msq~ ?@#w/t.friendless.games.filler.player.Makhaya/Makhayauq~ t,friendless.games.filler.player.Rosita/Rositauq~ t.friendless.games.filler.player.Shirley/Shirleyuq~ t(friendless.games.filler.player.Hugo/Hugouq~ t.friendless.games.filler.player.Isadora/Isadorauq~ t,friendless.games.filler.player.Eldine/Eldineuq~t.friendless.games.filler.player.Cochise/Cochiseuq~ t,friendless.games.filler.player.Sachin/Sachinuq~ t&friendless.games.filler.player.Che/Cheuq~ t2friendless.games.filler.player.Aleksandr/Aleksandruq~ t0friendless.games.filler.player.Mainoumi/Mainoumiuq~JXt0friendless.games.filler.player.Claudius/Claudiusuq~ t0friendless.games.filler.player.Margaret/Margaretuq~ t2friendless.games.filler.player.Jefferson/Jeffersonuq~ t*friendless.games.filler.player.Wanda/Wandauq~ t*friendless.games.filler.player.Luigi/Luigiuq~ t(friendless.games.filler.player.Omar/Omaruq~ t,friendless.games.filler.player.Dieter/Dieteruq~ t*friendless.games.filler.player.Basil/Basiluq~ xt2friendless.games.filler.player.Manuelito/Manuelitosq~j Packager: John Farrell Prefix: %{prefix} #BuildRoot: /var/tmp/filler-build %description Filler is a graphical games where you occupy coloured hexes by changing colours. %prep %setup -n %{name} #[ "$RPM_BUILD_ROOT" != "/" ] && [ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT; %build make %install #[ "$RPM_BUILD_ROOT" != "/" ] && [ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT; make install FILLERPATH=%{prefix}/bin DEST=%{prefix}/filler %clean #[ "$RPM_BUILD_ROOT" != "/" ] && [ -d $RPM_BUILD_ROOT ] && rm -rf $RPM_BUILD_ROOT; %files %{prefix}/filler/* %{prefix}/bin/filler %changelog * Wed Dec 06 2000 John Farrell - Passed FILLERPATH and DEST parameters to Makefile * Sat Dec 02 2000 Tognon Stefano - Wrote first version of spec file. filler/other/inc0100664000076400007640000000133507224552024012645 0ustar johnjohn// This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. filler/other/build.xml0100664000076400007640000000164607224552024013777 0ustar johnjohn filler/INTERNATIONALISATION0100664000076400007640000000421307224552024014007 0ustar johnjohnTASKS ----- If you would like to help with the internationalisation of Filler, here is what is needed. Please forgive me if this document tells you things you already know, but I am writing for people who have never encountered Java internationalisation before. * translate res/friendless/games/filler/resources.properties The string to be translated is the right hand side of the = sign. These strings appear in the user interface, so you can test your translation by running the game and seeing whether it looks right. If you can't figure out where a string is used, please ask me and I will find it in the source code. I have intentionally put the names of the robot players in that file so they can be translated to localised names. Note that many of the names are not English names anyway, as I have tried to give them an international flavour. * translate res/friendless/games/filler/help/en/*.html. The 'en' in the path name is a Java locale specifier, so 'en' means English. Similarly 'fr' is French and 'de' is German. The game looks up the current locale, looks for a directory of the same name, and uses files in that directory if they exist. If you don't know the correct code, ask me or just make something up and I will fix it when I package the game. It is best to retain the same names for the files, as they are referred to from the code. If you don't have time to translate the HTML documentation, I will get Babelfish to do it, which could be quite funny. HISTORY ------- Version 1.1 will be available in: Danish Jacob Kjeldahl Swedish Anders Oquist (oquist.anders@telia.com) French trexmaster@caramail.com Spanish Fabian Rodriguez (Fabian.Rodriguez@toxik.com) German Martin Heintze (MTHeintze@gmx.net) Italian Fabio Restano (fares@users.sourceforge.net) Dutch Guus der Kinderen (guus@ch.twi.tudelft.nl) Polish Wojciech Jeczmien (jeczmien@panda.bg.univ.gda.pl) Version 1.01 was available in: Russian Alexei Sinitsyn (sinitsin@softhome.net) Finnish Sini Ruohomaa (siruohom@earthling.net) Version 1.0 was available in: English John Farrell (friendless@users.sourceforge.net)