/* * Copyright (C) 2010 Medo <smaxein@googlemail.com> * Copyright (C) 2006 Clam <clamisgood@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.xml; import org.lateralgm.file.GmFile; import org.lateralgm.resources.GmObject; import org.lateralgm.resources.sub.Action; import org.lateralgm.resources.sub.Event; import org.lateralgm.resources.sub.MainEvent; import com.ganggarrison.easyxml.XmlReader; import com.ganggarrison.easyxml.XmlWriter; import com.ganggarrison.gmdec.DeferredReferenceCreator; import com.ganggarrison.gmdec.DeferredReferenceCreatorNotifier; import com.ganggarrison.gmdec.LgmConst; public class EventXmlFormat extends XmlFormat<Event> { @Override public void write(Event event, XmlWriter out) { out.startElement("event"); { out.putAttribute("category", LgmConst.toString((byte) event.mainId, MainEventType.class)); // TODO: Trigger events need special attention too. if (event.mainId == MainEvent.EV_COLLISION) { out.putAttribute("with", getRefStr(event.other)); } else { out.putAttribute("id", event.id); } out.startElement("actions"); for (Action act : event.actions) { new ActionXmlFormat().write(act, out); } out.endElement(); } out.endElement(); } @Override public Event read(XmlReader reader, DeferredReferenceCreatorNotifier notifier) { Event event = new Event(); reader.enterElement("event"); { int category = LgmConst.fromString(reader.getStringAttribute("category"), MainEventType.class); event.mainId = category; if (event.mainId == MainEvent.EV_COLLISION) { ReferenceCreator rc = new ReferenceCreator(event); rc.setRef(reader.getStringAttribute("with")); notifier.addDeferredReferenceCreator(rc); } else { event.id = reader.getIntAttribute("id"); } reader.enterElement("actions"); while (reader.hasNextElement()) { event.actions.add(new ActionXmlFormat().read(reader, notifier)); } reader.leaveElement(); } reader.leaveElement(); return event; } private static enum MainEventType implements LgmConst.Provider { CREATE(MainEvent.EV_CREATE), DESTROY(MainEvent.EV_DESTROY), ALARM(MainEvent.EV_ALARM), STEP(MainEvent.EV_STEP), COLLISION(MainEvent.EV_COLLISION), KEYBOARD(MainEvent.EV_KEYBOARD), MOUSE(MainEvent.EV_MOUSE), OTHER(MainEvent.EV_OTHER), DRAW(MainEvent.EV_DRAW), KEYPRESS(MainEvent.EV_KEYPRESS), KEYRELEASE(MainEvent.EV_KEYRELEASE), TRIGGER(MainEvent.EV_TRIGGER); public final byte lgmconst; private MainEventType(byte lgmconst) { this.lgmconst = lgmconst; } @Override public byte getLgmConst() { return lgmconst; } } private static class ReferenceCreator implements DeferredReferenceCreator { private Event event; private String name; public ReferenceCreator(Event event) { this.event = event; } public void setRef(String name) { this.name = name; } @Override public void createReferences(GmFile gmf) { GmObject collisionObject = gmf.resMap.getList(GmObject.class).get(name); if (collisionObject != null) { event.other = collisionObject.reference; event.id = collisionObject.getId(); } else { System.err.println("Warning: GM-Event references unknown " + "collision object " + name); } } } }