/*
* Copyright (C) 2010 Medo <smaxein@googlemail.com>
* Copyright (C) 2006, 2007 Clam <clamisgood@gmail.com>
* Copyright (C) 2008, 2010 IsmAvatar <IsmAvatar@gmail.com>
* Copyright (C) 2008 Quadduc <quadduc@gmail.com>
*
* This file is part of GmkSplitter.
* GmkSplitter is free software and comes with ABSOLUTELY NO WARRANTY.
* See LICENSE for details.
*/
package com.ganggarrison.gmdec;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.lateralgm.file.GmFile;
import org.lateralgm.resources.sub.Event;
import org.lateralgm.resources.sub.MainEvent;
public class EventNamer {
/**
* Creates a nice, human-readable and consistent (i.e. independent of
* locale) name for a given event.
*
* The event should be complete, that is, the reference to its collision
* object should exist if it is a collision event, otherwise the name will
* not be optimal.
*
* The reason why this function is needed and Gmk splitter can't just rely
* on Event.toString() is that the resulting string is used as the filename
* for storing the event data, and the files are supposed to be good for
* version control. Therefore it would be bad if different collaborators in
* different countries got different filenames.
*/
public static String createName(Event event, GmFile gmf) {
switch (event.mainId) {
case MainEvent.EV_CREATE:
return "Create";
case MainEvent.EV_DESTROY:
return "Destroy";
case MainEvent.EV_ALARM:
return "Alarm " + event.id;
case MainEvent.EV_STEP:
return stepEventNames.get(event.id);
case MainEvent.EV_COLLISION:
if (event.other == null || event.other.get() == null) {
return "Collision with Object " + event.id;
} else {
return "Collision with " + event.other.get().getName();
}
case MainEvent.EV_KEYBOARD:
String keyname = KEY_NAMES.get(event.id);
if (keyname != null) {
return "Key " + keyname;
} else {
return "Key code " + event.id;
}
case MainEvent.EV_MOUSE:
String eventName = MOUSE_EVENT_NAMES.get(event.id);
if (eventName != null) {
return eventName;
} else {
return "Mouse unknown " + event.id;
}
case MainEvent.EV_OTHER:
if (OTHER_EVENT_NAMES.containsKey(event.id)) {
return OTHER_EVENT_NAMES.get(event.id);
} else if (event.id >= 10 && event.id <= 25) {
return "User Event " + (event.id - 10);
} else if (event.id >= 40 && event.id <= 47) {
return "Outside View " + (event.id - 40);
} else if (event.id >= 50 && event.id <= 57) {
return "Boundary View " + (event.id - 50);
} else {
return "Other Event " + event.id;
}
case MainEvent.EV_DRAW:
return "Draw";
case MainEvent.EV_KEYPRESS:
keyname = KEY_NAMES.get(event.id);
if (keyname != null) {
return "Key " + keyname + " pressed";
} else {
return "Key code " + event.id + " pressed";
}
case MainEvent.EV_KEYRELEASE:
keyname = KEY_NAMES.get(event.id);
if (keyname != null) {
return "Key " + keyname + " released";
} else {
return "Key code " + event.id + " released";
}
case MainEvent.EV_TRIGGER:
if (event.id >= 0 && event.id < gmf.triggers.size() && gmf.triggers.get(event.id) != null) {
return "Trigger " + gmf.triggers.get(event.id).name;
} else {
return "Trigger id " + event.id;
}
default:
System.err.println("Warning: Unknown event category " + event.mainId + " encountered.");
return Integer.toString(event.mainId);
}
}
private static List<String> stepEventNames = Arrays.asList(new String[] {
"Step",
"Begin Step",
"End Step"
});
private static final Map<Integer, String> OTHER_EVENT_NAMES = createOtherEventNames();
private static Map<Integer, String> createOtherEventNames() {
Map<Integer, String> result = new HashMap<Integer, String>();
result.put(0, "Outside Room");
result.put(1, "Intersect Boundary");
result.put(2, "Game Start");
result.put(3, "Game End");
result.put(4, "Room Start");
result.put(5, "Room End");
result.put(6, "No more lives");
result.put(7, "Animation end");
result.put(8, "End of Path");
result.put(9, "No more health");
result.put(30, "Close Button");
return Collections.unmodifiableMap(result);
}
private static final Map<Integer, String> MOUSE_EVENT_NAMES = createMouseEventNames();
private static Map<Integer, String> createMouseEventNames() {
Map<Integer, String> result = new HashMap<Integer, String>();
result.put(0, "Mouse left button");
result.put(1, "Mouse right button");
result.put(2, "Mouse middle button");
result.put(3, "Mouse no button");
result.put(4, "Mouse left button pressed");
result.put(5, "Mouse right button pressed");
result.put(6, "Mouse middle button pressed");
result.put(7, "Mouse left button released");
result.put(8, "Mouse right button released");
result.put(9, "Mouse middle button released");
result.put(10, "Mouse enter");
result.put(11, "Mouse leave");
result.put(16, "Joystick 1 left");
result.put(17, "Joystick 1 right");
result.put(18, "Joystick 1 up");
result.put(19, "Joystick 1 down");
result.put(21, "Joystick 1 button 1");
result.put(22, "Joystick 1 button 2");
result.put(23, "Joystick 1 button 3");
result.put(24, "Joystick 1 button 4");
result.put(25, "Joystick 1 button 5");
result.put(26, "Joystick 1 button 6");
result.put(27, "Joystick 1 button 7");
result.put(28, "Joystick 1 button 8");
result.put(31, "Joystick 2 left");
result.put(32, "Joystick 2 right");
result.put(33, "Joystick 2 up");
result.put(34, "Joystick 2 down");
result.put(36, "Joystick 2 button 1");
result.put(37, "Joystick 2 button 2");
result.put(38, "Joystick 2 button 3");
result.put(39, "Joystick 2 button 4");
result.put(40, "Joystick 2 button 5");
result.put(41, "Joystick 2 button 6");
result.put(42, "Joystick 2 button 7");
result.put(43, "Joystick 2 button 8");
result.put(50, "Mouse global left button");
result.put(51, "Mouse global right button");
result.put(52, "Mouse global middle button");
result.put(53, "Mouse global left pressed");
result.put(54, "Mouse global right pressed");
result.put(55, "Mouse global middle pressed");
result.put(56, "Mouse global left released");
result.put(57, "Mouse global right released");
result.put(58, "Mouse global middle released");
result.put(60, "Mouse wheel up");
result.put(61, "Mouse wheel down");
return Collections.unmodifiableMap(result);
}
private static final Map<Integer, String> KEY_NAMES = createKeyNames();
private static Map<Integer, String> createKeyNames() {
Map<Integer, String> result = new HashMap<Integer, String>();
result.put(37, "left");
result.put(39, "right");
result.put(38, "up");
result.put(40, "down");
result.put(17, "control");
result.put(18, "alt");
result.put(16, "shift");
result.put(32, "space");
result.put(13, "enter");
result.put(96, "numpad 0");
result.put(97, "numpad 1");
result.put(98, "numpad 2");
result.put(99, "numpad 3");
result.put(100, "numpad 4");
result.put(101, "numpad 5");
result.put(102, "numpad 6");
result.put(103, "numpad 7");
result.put(104, "numpad 8");
result.put(105, "numpad 9");
result.put(111, "numpad divide");
result.put(106, "numpad multiply");
result.put(109, "numpad subtract");
result.put(107, "numpad add");
result.put(110, "numpad decimal");
result.put(48, "0");
result.put(49, "1");
result.put(50, "2");
result.put(51, "3");
result.put(52, "4");
result.put(53, "5");
result.put(54, "6");
result.put(55, "7");
result.put(56, "8");
result.put(57, "9");
result.put(65, "A");
result.put(66, "B");
result.put(67, "C");
result.put(68, "D");
result.put(69, "E");
result.put(70, "F");
result.put(71, "G");
result.put(72, "H");
result.put(73, "I");
result.put(74, "J");
result.put(75, "K");
result.put(76, "L");
result.put(77, "M");
result.put(78, "N");
result.put(79, "O");
result.put(80, "P");
result.put(81, "Q");
result.put(82, "R");
result.put(83, "S");
result.put(84, "T");
result.put(85, "U");
result.put(86, "V");
result.put(87, "W");
result.put(88, "X");
result.put(89, "Y");
result.put(90, "Z");
result.put(112, "f1");
result.put(113, "f2");
result.put(114, "f3");
result.put(115, "f4");
result.put(116, "f5");
result.put(117, "f6");
result.put(118, "f7");
result.put(119, "f8");
result.put(120, "f9");
result.put(121, "f10");
result.put(122, "f11");
result.put(123, "f12");
result.put(8, "backspace");
result.put(27, "escape");
result.put(36, "home");
result.put(35, "end");
result.put(33, "pageup");
result.put(34, "pagedown");
result.put(46, "delete");
result.put(45, "insert");
result.put(0, "no key");
result.put(1, "any key");
return Collections.unmodifiableMap(result);
}
}