package com.pixelutilitys.arcade.emulators.AEPgb; /** * this source file released under the GNU Public Licence. * see the accompanying copyright.txt for more information. * Copyright (C) 2000-2001 Ben Mazur * modified by retroK 2004 http://aep-emu.de/ */ import java.awt.Button; import java.awt.Dialog; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Label; import java.awt.LayoutManager; import java.awt.Point; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import java.io.StreamTokenizer; import java.io.Writer; /** * PgbSettings is a static class containing all the settings * that the various components need to operate. * * Remember to recompile all dependent classes if you change * DEBUG for it to take effect. */ public class PgbSettings { public static final boolean DEBUG = false; public static final String emulator = "Pgb"; public static final String version = "0.89.2"; public static final int SYS_GB = 00; /* gameboy classic */ public static final int SYS_GBP = 01; /* gameboy pocket */ public static final int SYS_SGB = 10; /* super gameboy */ public static final int SYS_GBC = 11; /* gameboy color */ public static final int VIDOUT_DEFAULT = 00; public static final int VIDOUT_DIRECTX = 01; public static final int VIDOUT_INDEXED = 02; public static final int VIDOUT_DIRECT = 03; public volatile static boolean paused = false; public volatile static boolean active = false; public static int priority = Thread.NORM_PRIORITY; public static boolean usedirectx = false; public static int debuglevel = 0; public static int debugstop = -1; public static int videooutput = VIDOUT_DIRECT; public static int desiredsystem = SYS_GBC; public static int system; public static int lcdsize = 2; public static boolean autowait = true; public static int frameskip = 0; public static double clockspeed = 4.194304; public static int key_up = KeyEvent.VK_UP; public static int key_down = KeyEvent.VK_DOWN; public static int key_left = KeyEvent.VK_LEFT; public static int key_right = KeyEvent.VK_RIGHT; public static int key_a = KeyEvent.VK_A; public static int key_b = KeyEvent.VK_S; public static int key_select = KeyEvent.VK_SPACE; public static int key_start = KeyEvent.VK_ENTER; public static int key_screen = KeyEvent.VK_F5; public static int[] bgcolors = {0xFFFFFFFF, 0xFFDAA5AE, 0xFFA24051, 0xFF000000}; public static int[] obj0colors = {0xFFFFFFFF, 0xFF95D5A4, 0xFF579629, 0xFF000000}; public static int[] obj1colors = {0xFFFFFFFF, 0xFF92C0E7, 0xFF2F7ED0, 0xFF000000}; public static boolean sgbborder = false; public static boolean colormute = false; // by retroK public static boolean usesound = true; public static String gamestring = "NONE "; public static String lastnetaddress = ""; public static int netlistentimeout = 10000; public static int netport = 2907; public static Point winloc = new Point(); public static void popKeysDialog(Frame frame) { PgbKeyDialog kd; kd = new PgbKeyDialog(frame); kd.setVisible(true); } public static void load() { File cfgfile; Reader cr; StreamTokenizer st; String key; // read, read, read! try { cfgfile = new File("Pgb.cfg"); if(!cfgfile.exists()) { return; } cr = new FileReader(cfgfile); st = new StreamTokenizer(cr); st.lowerCaseMode(true); st.quoteChar('"'); st.commentChar('#'); scan: while(true) { switch(st.nextToken()) { case StreamTokenizer.TT_EOF: break scan; case StreamTokenizer.TT_EOL: break scan; case StreamTokenizer.TT_WORD: // read in key = st.sval; if(key.equals("winloc")) { winloc = new Point(); st.nextToken(); winloc.x = (int)st.nval; st.nextToken(); winloc.y = (int)st.nval; } if(key.equals("lcdsize")) { st.nextToken(); lcdsize = (int)st.nval; } if(key.equals("frameskip")) { st.nextToken(); frameskip = (int)st.nval; } if(key.equals("colormute")) { st.nextToken(); colormute = st.sval.equalsIgnoreCase("true"); } if(key.equals("sgbborder")) { st.nextToken(); sgbborder = st.sval.equalsIgnoreCase("true"); } if(key.equals("debuglevel")) { st.nextToken(); debuglevel = (int)st.nval; } if(key.equals("keys")) { st.nextToken(); key_up = (int)st.nval; st.nextToken(); key_down = (int)st.nval; st.nextToken(); key_left = (int)st.nval; st.nextToken(); key_right = (int)st.nval; st.nextToken(); key_a = (int)st.nval; st.nextToken(); key_b = (int)st.nval; st.nextToken(); key_select = (int)st.nval; st.nextToken(); key_start = (int)st.nval; } if(key.equals("lastnetaddress")) { st.nextToken(); lastnetaddress = st.sval; } if(key.equals("netlistentimeout")) { st.nextToken(); netlistentimeout = (int)st.nval; } if(key.equals("netport")) { st.nextToken(); netport = (int)st.nval; } if(key.equals("lastnetaddress")) { st.nextToken(); lastnetaddress = st.sval; } if(key.equals("systemtype")) { st.nextToken(); desiredsystem = (int)st.nval; } if(key.equals("cpupriority")) { st.nextToken(); priority = (int)st.nval; } if(key.equals("videooutput")) { st.nextToken(); videooutput = (int)st.nval; } if(key.equals("autowait")) { st.nextToken(); autowait = st.sval.equalsIgnoreCase("true"); } // by retroK if(key.equals("usesound")) { st.nextToken(); usesound = st.sval.equals("true"); } } } cr.close(); } catch(Exception e) { System.err.println("error reading settings file:"); System.err.println(e.getClass()); System.err.println(e.getMessage()); } } public static void save(Frame tosave) { File cfgfile; Writer cw; winloc = tosave.getLocation(); // yay! file stuff! try { cfgfile = new File("Pgb.cfg"); cw = new FileWriter(cfgfile); cw.write("# Pgb config file" + "\r\n"); cw.write("# Edit at your own risk" + "\r\n"); cw.write("\r\n"); cw.write("debuglevel " + debuglevel + "\r\n"); cw.write("frameskip " + frameskip + "\r\n"); cw.write("keys " + key_up + " " + key_down + " " + key_left + " " + key_right + " " + key_a + " " + key_b + " " + key_select + " " + key_start + "\r\n"); cw.write("winloc " + winloc.x + " " + winloc.y + "\r\n"); cw.write("lcdsize " + lcdsize + "\r\n"); cw.write("colormute " + colormute + "\r\n"); cw.write("sgbborder " + sgbborder + "\r\n"); cw.write("lastnetaddress " + '"' + lastnetaddress + '"' + "\r\n"); cw.write("netlistentimeout " + netlistentimeout + "\r\n"); cw.write("netport " + netport + "\r\n"); cw.write("systemtype " + desiredsystem + "\r\n"); cw.write("cpupriority " + priority + "\r\n"); cw.write("videooutput " + videooutput + "\r\n"); cw.write("autowait " + autowait + "\r\n"); cw.write("usesound " + usesound + "\r\n"); cw.close(); } catch(Exception e) { System.err.println(e.getMessage()); } } } /** * KeyDialog is the box that pops up to set the keys */ class PgbKeyDialog extends Dialog implements ActionListener, KeyListener{ public int key_up, key_down, key_left, key_right, key_a, key_b, key_select, key_start, key_screen; private TextField upF, downF, leftF, rightF, aF, bF, selectF, startF, screenF; private Button okayB; public PgbKeyDialog(Frame frame) { super(frame, "Key Assignment", true); // modal LayoutManager layout; key_up = PgbSettings.key_up; key_down = PgbSettings.key_down; key_left = PgbSettings.key_left; key_right = PgbSettings.key_right; key_a = PgbSettings.key_a; key_b = PgbSettings.key_b; key_select = PgbSettings.key_select; key_start = PgbSettings.key_start; key_screen = PgbSettings.key_screen; Label upL = new Label("Up", Label.RIGHT); Label downL = new Label("Down", Label.RIGHT); Label leftL = new Label("Left", Label.RIGHT); Label rightL = new Label("Right", Label.RIGHT); Label aL = new Label("A", Label.RIGHT); Label bL = new Label("B", Label.RIGHT); Label selectL = new Label("Select", Label.RIGHT); Label startL = new Label("Start", Label.RIGHT); Label screenL = new Label("Screenshot", Label.RIGHT); upF = new TextField(KeyEvent.getKeyText(key_up), 5); upF.addKeyListener(this); upF.setEditable(false); downF = new TextField(KeyEvent.getKeyText(key_down), 5); downF.addKeyListener(this); downF.setEditable(false); leftF = new TextField(KeyEvent.getKeyText(key_left), 5); leftF.addKeyListener(this); leftF.setEditable(false); rightF = new TextField(KeyEvent.getKeyText(key_right), 5); rightF.addKeyListener(this); rightF.setEditable(false); aF = new TextField(KeyEvent.getKeyText(key_a), 5); aF.addKeyListener(this); aF.setEditable(false); bF = new TextField(KeyEvent.getKeyText(key_b), 5); bF.addKeyListener(this); bF.setEditable(false); selectF = new TextField(KeyEvent.getKeyText(key_select), 5); selectF.addKeyListener(this); selectF.setEditable(false); startF = new TextField(KeyEvent.getKeyText(key_start), 5); startF.addKeyListener(this); startF.setEditable(false); screenF = new TextField(KeyEvent.getKeyText(key_screen), 5); screenF.addKeyListener(this); screenF.setEditable(false); okayB = new Button("Okay"); okayB.setActionCommand("okay"); okayB.addActionListener(this); Button cancelB = new Button("Cancel"); cancelB.setActionCommand("cancel"); cancelB.addActionListener(this); setSize(180, 250); setLocation(frame.getLocation().x + 25, frame.getLocation().y + 25); layout = new GridLayout(10,2,15,5); setLayout(layout); add(upL); add(upF); add(downL); add(downF); add(leftL); add(leftF); add(rightL); add(rightF); add(aL); add(aF); add(bL); add(bF); add(selectL); add(selectF); add(startL); add(startF); add(screenL); add(screenF); add(okayB); add(cancelB); } // ActionListener public void actionPerformed(ActionEvent ev) { if(ev.getActionCommand().equals("okay")) { this.setVisible(false); PgbSettings.key_up = key_up; PgbSettings.key_down = key_down; PgbSettings.key_left = key_left; PgbSettings.key_right = key_right; PgbSettings.key_a = key_a; PgbSettings.key_b = key_b; PgbSettings.key_select = key_select; PgbSettings.key_start = key_start; PgbSettings.key_screen = key_screen; } if(ev.getActionCommand().equals("cancel")) { this.setVisible(false); } } // KeyListener public void keyReleased(KeyEvent ev) { } public void keyPressed(KeyEvent ev) { if(ev.getComponent() == upF) { key_up = ev.getKeyCode(); upF.setText(KeyEvent.getKeyText(key_up)); downF.requestFocus(); ev.consume(); } if(ev.getComponent() == downF) { key_down = ev.getKeyCode(); downF.setText(KeyEvent.getKeyText(key_down)); leftF.requestFocus(); ev.consume(); } if(ev.getComponent() == leftF) { key_left = ev.getKeyCode(); leftF.setText(KeyEvent.getKeyText(key_left)); rightF.requestFocus(); ev.consume(); } if(ev.getComponent() == rightF) { key_right = ev.getKeyCode(); rightF.setText(KeyEvent.getKeyText(key_right)); aF.requestFocus(); ev.consume(); } if(ev.getComponent() == aF) { key_a = ev.getKeyCode(); aF.setText(KeyEvent.getKeyText(key_a)); bF.requestFocus(); ev.consume(); } if(ev.getComponent() == bF) { key_b = ev.getKeyCode(); bF.setText(KeyEvent.getKeyText(key_b)); selectF.requestFocus(); ev.consume(); } if(ev.getComponent() == selectF) { key_select = ev.getKeyCode(); selectF.setText(KeyEvent.getKeyText(key_select)); downF.requestFocus(); startF.requestFocus(); ev.consume(); } if(ev.getComponent() == startF) { key_start = ev.getKeyCode(); startF.setText(KeyEvent.getKeyText(key_start)); okayB.requestFocus(); ev.consume(); } if(ev.getComponent() == screenF) { key_screen = ev.getKeyCode(); screenF.setText(KeyEvent.getKeyText(key_screen)); okayB.requestFocus(); ev.consume(); } } public void keyTyped(KeyEvent ev) { } }