/*
* Copyright (C) 2006, 2007 Clam <clamisgood@gmail.com>
* Copyright (C) 2008, 2010 IsmAvatar <IsmAvatar@gmail.com>
* Copyright (C) 2008 Quadduc <quadduc@gmail.com>
* Copyright (C) 2013 Robert B. Colton
*
* This file is part of LateralGM.
* LateralGM is free software and comes with ABSOLUTELY NO WARRANTY.
* See LICENSE for details.
*/
package org.lateralgm.resources.sub;
import static org.lateralgm.main.Util.deRef;
import java.awt.event.KeyEvent;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.lateralgm.main.Util;
import org.lateralgm.main.Util.InherentlyUnique;
import org.lateralgm.messages.Messages;
import org.lateralgm.resources.GmObject;
import org.lateralgm.resources.ResourceReference;
public class Event extends ActionContainer implements Comparable<Event>,InherentlyUnique<Event>
{
// mouse event types
public static final byte EV_LEFT_BUTTON = 0;
public static final byte EV_RIGHT_BUTTON = 1;
public static final byte EV_MIDDLE_BUTTON = 2;
public static final byte EV_NO_BUTTON = 3;
public static final byte EV_LEFT_PRESS = 4;
public static final byte EV_RIGHT_PRESS = 5;
public static final byte EV_MIDDLE_PRESS = 6;
public static final byte EV_LEFT_RELEASE = 7;
public static final byte EV_RIGHT_RELEASE = 8;
public static final byte EV_MIDDLE_RELEASE = 9;
public static final byte EV_MOUSE_ENTER = 10;
public static final byte EV_MOUSE_LEAVE = 11;
public static final byte EV_MOUSE_WHEEL_UP = 60;
public static final byte EV_MOUSE_WHEEL_DOWN = 61;
public static final byte EV_GLOBAL_LEFT_BUTTON = 50;
public static final byte EV_GLOBAL_RIGHT_BUTTON = 51;
public static final byte EV_GLOBAL_MIDDLE_BUTTON = 52;
public static final byte EV_GLOBAL_LEFT_PRESS = 53;
public static final byte EV_GLOBAL_RIGHT_PRESS = 54;
public static final byte EV_GLOBAL_MIDDLE_PRESS = 55;
public static final byte EV_GLOBAL_LEFT_RELEASE = 56;
public static final byte EV_GLOBAL_RIGHT_RELEASE = 57;
public static final byte EV_GLOBAL_MIDDLE_RELEASE = 58;
public static final byte EV_JOYSTICK1_LEFT = 16;
public static final byte EV_JOYSTICK1_RIGHT = 17;
public static final byte EV_JOYSTICK1_UP = 18;
public static final byte EV_JOYSTICK1_DOWN = 19;
public static final byte EV_JOYSTICK1_BUTTON1 = 21;
public static final byte EV_JOYSTICK1_BUTTON2 = 22;
public static final byte EV_JOYSTICK1_BUTTON3 = 23;
public static final byte EV_JOYSTICK1_BUTTON4 = 24;
public static final byte EV_JOYSTICK1_BUTTON5 = 25;
public static final byte EV_JOYSTICK1_BUTTON6 = 26;
public static final byte EV_JOYSTICK1_BUTTON7 = 27;
public static final byte EV_JOYSTICK1_BUTTON8 = 28;
public static final byte EV_JOYSTICK2_LEFT = 31;
public static final byte EV_JOYSTICK2_RIGHT = 32;
public static final byte EV_JOYSTICK2_UP = 33;
public static final byte EV_JOYSTICK2_DOWN = 34;
public static final byte EV_JOYSTICK2_BUTTON1 = 36;
public static final byte EV_JOYSTICK2_BUTTON2 = 37;
public static final byte EV_JOYSTICK2_BUTTON3 = 38;
public static final byte EV_JOYSTICK2_BUTTON4 = 39;
public static final byte EV_JOYSTICK2_BUTTON5 = 40;
public static final byte EV_JOYSTICK2_BUTTON6 = 41;
public static final byte EV_JOYSTICK2_BUTTON7 = 42;
public static final byte EV_JOYSTICK2_BUTTON8 = 43;
// keyboard events
public static final byte EV_NO_KEY = 0;
public static final byte EV_ANY_KEY = 1;
public static final byte EV_ENTER_KEY = 13;
public static final byte EV_DELETE_KEY = 46;
public static final byte EV_INSERT_KEY = 45;
// other event types
public static final byte EV_OUTSIDE = 0;
public static final byte EV_BOUNDARY = 1;
public static final byte EV_GAME_START = 2;
public static final byte EV_GAME_END = 3;
public static final byte EV_ROOM_START = 4;
public static final byte EV_ROOM_END = 5;
public static final byte EV_NO_MORE_LIVES = 6;
public static final byte EV_NO_MORE_HEALTH = 9;
public static final byte EV_ANIMATION_END = 7;
public static final byte EV_END_OF_PATH = 8;
public static final byte EV_USER0 = 10;
public static final byte EV_USER1 = 11;
public static final byte EV_USER2 = 12;
public static final byte EV_USER3 = 13;
public static final byte EV_USER4 = 14;
public static final byte EV_USER5 = 15;
public static final byte EV_USER6 = 16;
public static final byte EV_USER7 = 17;
public static final byte EV_USER8 = 18;
public static final byte EV_USER9 = 19;
public static final byte EV_USER10 = 20;
public static final byte EV_USER11 = 21;
public static final byte EV_USER12 = 22;
public static final byte EV_USER13 = 23;
public static final byte EV_USER14 = 24;
public static final byte EV_USER15 = 25;
public static final byte EV_OUTSIDEVIEW0 = 40;
public static final byte EV_OUTSIDEVIEW1 = 41;
public static final byte EV_OUTSIDEVIEW2 = 42;
public static final byte EV_OUTSIDEVIEW3 = 43;
public static final byte EV_OUTSIDEVIEW4 = 44;
public static final byte EV_OUTSIDEVIEW5 = 45;
public static final byte EV_OUTSIDEVIEW6 = 46;
public static final byte EV_OUTSIDEVIEW7 = 47;
public static final byte EV_BOUNDARYVIEW0 = 50;
public static final byte EV_BOUNDARYVIEW1 = 51;
public static final byte EV_BOUNDARYVIEW2 = 52;
public static final byte EV_BOUNDARYVIEW3 = 53;
public static final byte EV_BOUNDARYVIEW4 = 54;
public static final byte EV_BOUNDARYVIEW5 = 55;
public static final byte EV_BOUNDARYVIEW6 = 56;
public static final byte EV_BOUNDARYVIEW7 = 57;
public static final byte EV_CLOSEWINDOW = 30;
public static final byte EV_IMAGELOADED = 60;
public static final byte EV_SOUNDLOADED = 61;
public static final byte EV_HTTP = 62;
public static final byte EV_DIALOG = 63;
public static final byte EV_IAP = 66;
public static final byte EV_CLOUD = 67;
public static final byte EV_NETWORKING = 68;
public static final byte EV_STEAM = 69;
public static final byte EV_SOCIAL = 70;
// step event types
public static final byte EV_STEP_NORMAL = 0;
public static final byte EV_STEP_BEGIN = 1;
public static final byte EV_STEP_END = 2;
//alarm event types
public static final byte EV_ALARM0 = 0;
public static final byte EV_ALARM1 = 1;
public static final byte EV_ALARM2 = 2;
public static final byte EV_ALARM3 = 3;
public static final byte EV_ALARM4 = 4;
public static final byte EV_ALARM5 = 5;
public static final byte EV_ALARM6 = 6;
public static final byte EV_ALARM7 = 7;
public static final byte EV_ALARM8 = 8;
public static final byte EV_ALARM9 = 9;
public static final byte EV_ALARM10 = 10;
public static final byte EV_ALARM11 = 11;
// draw event types
public static final byte EV_DRAW_NORMAL = 0;
// for whatever dumbfuck reason the number jumps to 64 with GMX
public static final byte EV_DRAW_GUI = 64;
/*
* I seriously can not believe that they make this a fucking draw event
* especially when the dumbasses seriously, I am so sick of their shit
* they had fucking game window closed event, why didn't they just stick
* it with that in a new group under 7_30X for other events. Stupid
* dumbasses removing functionality and replacing it with... just, somebody,
* please shoot me.
*/
public static final byte EV_DRAW_RESIZE = 65;
/*
* note: The constant definitions were generated by a small GM program, which parses
* the clipboard (with parts of the gm manual on it) and generates the Java definitions.
*/
public int id = 0;
public ResourceReference<GmObject> other = null; // For collision Events
public int mainId = 0;
/** Left index shall be Java Key, right index shall be GM Key. */
public static final Map<Integer,Integer> KEYS;
public Event()
{
}
public Event(int mainId, int id)
{
this.mainId = mainId;
this.id = id;
}
public Event(int mainId, ResourceReference<GmObject> other)
{
this.mainId = mainId;
this.other = other;
}
public Event(int mainId, int id, ResourceReference<GmObject> other)
{
this.mainId = mainId;
this.id = id;
this.other = other;
}
public String toString()
{
switch (mainId)
{
case MainEvent.EV_COLLISION:
GmObject obj = deRef(other);
String name;
if (obj == null)
name = "<undefined>";
else
name = obj.getName();
return Messages.format("Event.EVENT4_X",name); //$NON-NLS-1$
default:
return eventName(mainId,id);
}
}
public int compareTo(Event e)
{
if (e.mainId != mainId) return e.mainId > mainId ? -1 : 1;
return e.id > id ? -1 : e.id == id ? 0 : 1;
}
public boolean matchesType(Event e)
{
if (e.mainId != mainId) return false;
if (mainId != MainEvent.EV_COLLISION) return e.id == id;
return e.other == other;
}
//TODO: Move all of these keys to the new keyboard properties map.
public static String getGmKeyName(int keyCode)
{
switch (keyCode)
{
case 0:
return Messages.getString("Event.NO_KEY");
case 1:
return Messages.getString("Event.ANY_KEY");
case 13:
keyCode = KeyEvent.VK_ENTER;
break;
case 46:
keyCode = KeyEvent.VK_DELETE;
break;
case 45:
keyCode = KeyEvent.VK_INSERT;
break;
default:
break;
}
return KeyEvent.getKeyText(keyCode);
}
/* public static int getGmKeyCode(int keyCode)
{
switch (keyCode)
{
case KeyEvent.VK_ENTER:
return 13;
case KeyEvent.VK_DELETE:
return 46;
case KeyEvent.VK_INSERT:
return 45;
default:
return keyCode;
}
}*/
public static String eventName(int mainId, int eventId)
{
switch (mainId)
{
case MainEvent.EV_ALARM:
case MainEvent.EV_TRIGGER:
return Messages.format("Event.EVENT" + mainId + "_X",eventId); //$NON-NLS-1$
case MainEvent.EV_MOUSE:
if ((eventId <= 9) || (eventId >= 50 && eventId <= 58))
{
int i = eventId % 10;
int b;
boolean g = eventId >= 50;
if (g || i < 3)
b = i % 3;
else if (i > 3)
b = --i % 3;
else
{
b = -1;
i = 0;
}
return Messages.format("Event.EVENT6_BUTTON",b,i / 3,g ? 1 : 0);
}
else if ((eventId >= 16 && eventId <= 28) || (eventId >= 31 && eventId <= 43))
{
int j = eventId < 31 ? 1 : 2;
int i = eventId - (j == 1 ? 16 : 31);
return Messages.format("Event.EVENT6_JOYSTICK",j,i < 4 ? i : 4,i - 4);
}
return Messages.getString("Event.EVENT" + mainId + "_" + eventId); //$NON-NLS-1$
case MainEvent.EV_KEYBOARD:
case MainEvent.EV_KEYPRESS:
case MainEvent.EV_KEYRELEASE:
return Messages.format("Event.EVENT" + mainId + "_X",getGmKeyName(eventId)); //$NON-NLS-1$
case MainEvent.EV_OTHER:
if (eventId >= EV_USER0 && eventId <= EV_USER15)
return Messages.format("Event.EVENT" + mainId + "_X",eventId - EV_USER0); //$NON-NLS-1$
if (eventId >= EV_OUTSIDEVIEW0 && eventId <= EV_OUTSIDEVIEW7)
return Messages.format("Event.EVENT" + mainId + "_40X",eventId - EV_OUTSIDEVIEW0); //$NON-NLS-1$
if (eventId >= EV_BOUNDARYVIEW0 && eventId <= EV_BOUNDARYVIEW7)
return Messages.format("Event.EVENT" + mainId + "_50X",eventId - EV_BOUNDARYVIEW0); //$NON-NLS-1$
return Messages.getString("Event.EVENT" + mainId + "_" + eventId); //$NON-NLS-1$
default:
return Messages.getString("Event.EVENT" + mainId + "_" + eventId); //$NON-NLS-1$
}
}
public Event copy()
{
Event ev = new Event();
ev.mainId = mainId;
ev.id = id;
ev.other = other;
for (Action act : actions)
ev.actions.add(act.copy());
return ev;
}
static
{
Map<Integer,Integer> keys = new HashMap<Integer,Integer>();
keys.put(KeyEvent.VK_LEFT,37);
keys.put(KeyEvent.VK_RIGHT,39);
keys.put(KeyEvent.VK_UP,38);
keys.put(KeyEvent.VK_DOWN,40);
keys.put(KeyEvent.VK_CONTROL,17); //vk_control
keys.put(KeyEvent.VK_ALT,18); //vk_alt
keys.put(KeyEvent.VK_SHIFT,16); //vk_shift
keys.put(KeyEvent.VK_SPACE,32); //vk_space
keys.put((int) Event.EV_ENTER_KEY,13); //vk_enter
//Numpad happens to map 1:1 (96..105)
for (int c = KeyEvent.VK_NUMPAD0; c <= KeyEvent.VK_NUMPAD9; c++)
keys.put(c,c);
/* keys.put(KeyEvent.VK_NUMPAD0,96); //vk_numpad0
keys.put(KeyEvent.VK_97); //vk_numpad1
keys.put(KeyEvent.VK_98); //vk_numpad2
keys.put(KeyEvent.VK_99); //vk_numpad3
keys.put(KeyEvent.VK_100); //vk_numpad4
keys.put(KeyEvent.VK_101); //vk_numpad5
keys.put(KeyEvent.VK_102); //vk_numpad6
keys.put(KeyEvent.VK_103); //vk_numpad7
keys.put(KeyEvent.VK_104); //vk_numpad8
keys.put(KeyEvent.VK_105); //vk_numpad9
*/
keys.put(KeyEvent.VK_DIVIDE,111); //vk_divide
keys.put(KeyEvent.VK_MULTIPLY,106); //vk_multiply
keys.put(KeyEvent.VK_SUBTRACT,109); //vk_subtract
keys.put(KeyEvent.VK_ADD,107); //vk_add
keys.put(KeyEvent.VK_DECIMAL,110); //vk_decimal
//VK_0-9 and VK_A-Z are the same as ASCII
for (int c = '0'; c <= '9'; c++)
keys.put(c,c);
for (int c = 'A'; c <= 'Z'; c++)
keys.put(c,c);
//F1-12 happen to map 1:1 (112..123)
for (int c = KeyEvent.VK_F1; c <= KeyEvent.VK_F12; c++)
keys.put(c,c);
/* keys.put(KeyEvent.VK_F1,112); //vk_f1
keys.put(KeyEvent.VK_113); //vk_f2
keys.put(KeyEvent.VK_114); //vk_f3
keys.put(KeyEvent.VK_115); //vk_f4
keys.put(KeyEvent.VK_116); //vk_f5
keys.put(KeyEvent.VK_117); //vk_f6
keys.put(KeyEvent.VK_118); //vk_f7
keys.put(KeyEvent.VK_119); //vk_f8
keys.put(KeyEvent.VK_120); //vk_f9
keys.put(KeyEvent.VK_121); //vk_f10
keys.put(KeyEvent.VK_122); //vk_f11
keys.put(KeyEvent.VK_123); //vk_f12
*/
keys.put(KeyEvent.VK_BACK_SPACE,8); //vk_backspace
keys.put(KeyEvent.VK_ESCAPE,27); //vk_escape
keys.put(KeyEvent.VK_HOME,36); //vk_home
keys.put(KeyEvent.VK_END,35); //vk_end
keys.put(KeyEvent.VK_PAGE_UP,33); //vk_pageup
keys.put(KeyEvent.VK_PAGE_DOWN,34); //vk_pagedown
keys.put((int) Event.EV_DELETE_KEY,46); //vk_delete
keys.put((int) Event.EV_INSERT_KEY,45); //vk_insert
keys.put((int) Event.EV_NO_KEY,0); //vk_nokey
keys.put((int) Event.EV_ANY_KEY,1); //vk_anykey
KEYS = Collections.unmodifiableMap((keys));
}
public boolean isEqual(Event evt)
{
if (this == evt) return true;
if (evt == null || id != evt.id || mainId != evt.mainId) return false;
if (!Util.areInherentlyUniquesEqual(actions,evt.actions)) return false;
if (other == null) return evt.other == null;
return other.equals(evt.other);
}
}