diff --git a/src/main/java/electrosphere/controls/Control.java b/src/main/java/electrosphere/controls/Control.java index df22a535..7d190ec6 100644 --- a/src/main/java/electrosphere/controls/Control.java +++ b/src/main/java/electrosphere/controls/Control.java @@ -16,8 +16,12 @@ public class Control { ControlMethod onPress; ControlMethod onRelease; ControlMethod onRepeat; + ControlMethod onClick; MouseCallback onMove; + float pressFrame = 0; + float repeatTimeout = 0; + public boolean isIsKey() { return type == ControlType.KEY; } @@ -64,6 +68,10 @@ public class Control { onMove = method; } + public void setOnClick(ControlMethod method){ + onClick = method; + } + public void onPress(){ if(onPress != null){ onPress.execute(); @@ -87,6 +95,28 @@ public class Control { onMove.execute(event); } } + + public void onClick(){ + if(onClick != null){ + onClick.execute(); + } + } + + public float getPressFrame(){ + return this.pressFrame; + } + + public void setPressFrame(float frame){ + pressFrame = frame; + } + + public float getRepeatTimeout(){ + return this.repeatTimeout; + } + + public void setRepeatTimeout(float timeout){ + repeatTimeout = timeout; + } public interface ControlMethod { diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index cc1825c9..28ec89d2 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -70,6 +70,7 @@ public class ControlHandler { public static final String INPUT_CODE_INTERACT = "interact"; public static final String INPUT_CODE_DROP = "drop"; public static final String INPUT_CODE_INVENTORY_OPEN = "inventoryOpen"; + public static final String INPUT_CODE_CHARACTER_OPEN = "characterOpen"; public static final String DATA_STRING_INPUT_CODE_MENU_INCREMENT = "menuIncrement"; public static final String DATA_STRING_INPUT_CODE_MENU_DECREMENT = "menuDecrement"; @@ -188,6 +189,7 @@ public class ControlHandler { handler.addControl(INPUT_CODE_INTERACT, new Control(ControlType.KEY,GLFW_KEY_E)); handler.addControl(INPUT_CODE_DROP, new Control(ControlType.KEY,GLFW_KEY_Y)); handler.addControl(INPUT_CODE_INVENTORY_OPEN, new Control(ControlType.KEY,GLFW_KEY_I)); + handler.addControl(INPUT_CODE_CHARACTER_OPEN, new Control(ControlType.KEY,GLFW_KEY_C)); /* Map the menu navigation controls @@ -301,6 +303,7 @@ public class ControlHandler { case INVENTORY: runHandlers(inventoryControlList); + runHandlers(menuNavigationControlList); break; case NO_INPUT: @@ -724,7 +727,7 @@ public class ControlHandler { Main menu dialog toggle */ mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU)); - controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setOnPress(new ControlMethod(){public void execute(){ + controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setOnClick(new ControlMethod(){public void execute(){ // Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, MenuGenerators.createInGameMainMenu()); // Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); @@ -733,6 +736,7 @@ public class ControlHandler { mainMenuWindow.addChild(mainMenuInGame); Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, mainMenuWindow); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), true); + Globals.elementManager.focusFirstElement(); Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); Globals.controlHandler.showMouse(); // Element mainMenu = MenuGenerators.createInGameMainMenu(); @@ -740,20 +744,18 @@ public class ControlHandler { // MenuGenerators.makeMenuDrawable(mainMenu); // Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); }}); + controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setRepeatTimeout(0.5f); /* Open inventory */ mainGameControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN)); - controls.get(INPUT_CODE_INVENTORY_OPEN).setOnPress(new ControlMethod(){public void execute(){ - if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter)){ + inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN)); + controls.get(INPUT_CODE_INVENTORY_OPEN).setOnClick(new ControlMethod(){public void execute(){ + if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter) && Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(InventoryUtils.getNaturalInventory(Globals.playerCharacter).getId())) == null){ //create window - Window mainMenuWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT); UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter); - //create window contents - Element inventoryUI = MenuGenerators.createNaturalInventoryMenu(inventory); - //add contents - mainMenuWindow.addChild(inventoryUI); + Window mainMenuWindow = MenuGenerators.createNaturalInventoryMenu(inventory); //register Globals.elementManager.registerWindow(WindowUtils.getInventoryWindowID(inventory.getId()), mainMenuWindow); //make visible @@ -761,8 +763,33 @@ public class ControlHandler { //controls Globals.controlHandler.setHandlerState(ControlsState.INVENTORY); Globals.controlHandler.showMouse(); + // + Globals.openInventoriesCount++; } }}); + controls.get(INPUT_CODE_INVENTORY_OPEN).setRepeatTimeout(0.5f); + + /* + Open character + */ + mainGameControlList.add(controls.get(INPUT_CODE_CHARACTER_OPEN)); + inventoryControlList.add(controls.get(INPUT_CODE_CHARACTER_OPEN)); + controls.get(INPUT_CODE_CHARACTER_OPEN).setOnClick(new ControlMethod(){public void execute(){ + if(InventoryUtils.hasEquipInventory(Globals.playerCharacter) && Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER) == null){ + //create window + Window mainMenuWindow = MenuGenerators.createCharacterMenu(InventoryUtils.getEquipInventory(Globals.playerCharacter)); + //register + Globals.elementManager.registerWindow(WindowStrings.WINDOW_CHARACTER, mainMenuWindow); + //make visible + WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER), true); + //controls + Globals.controlHandler.setHandlerState(ControlsState.INVENTORY); + Globals.controlHandler.showMouse(); + // + Globals.openInventoriesCount++; + } + }}); + controls.get(INPUT_CODE_CHARACTER_OPEN).setRepeatTimeout(0.5f); } @@ -781,13 +808,13 @@ public class ControlHandler { menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT)); controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){ // Globals.currentMenu.incrementMenuOption(); - Globals.elementManager.focusNextElement(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN)); + Globals.elementManager.focusNextElement(); }}); menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT)); controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){ // Globals.currentMenu.decrementMenuOption(); - Globals.elementManager.focusPreviousElement(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN)); + Globals.elementManager.focusPreviousElement(); }}); menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT)); @@ -806,10 +833,12 @@ public class ControlHandler { // // MenuCallbacks.backout(Globals.currentMenu); // Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); // }}); - controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setOnRelease(new ControlMethod(){public void execute(){ + controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setOnClick(new ControlMethod(){public void execute(){ // MenuCallbacks.backout(Globals.currentMenu); - Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); + Globals.elementManager.navigateBackwards(); + // Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); }}); + controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setRepeatTimeout(0.5f); } @@ -880,16 +909,16 @@ public class ControlHandler { /* Close inventory */ - inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE)); - controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){ - // MenuCallbacks.backout(Globals.currentMenu); - UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter); - Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId())); - WindowUtils.recursiveSetVisible(inventoryWindow, false); - hideMouse(); - Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId())); - Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); - }}); + // inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE)); + // controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){ + // // MenuCallbacks.backout(Globals.currentMenu); + // UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter); + // Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId())); + // WindowUtils.recursiveSetVisible(inventoryWindow, false); + // hideMouse(); + // Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId())); + // Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); + // }}); /* Item manipulation */ @@ -945,15 +974,22 @@ public class ControlHandler { if(!control.isState()){ //on press control.onPress(); + control.setPressFrame(Main.lastFrame); } else { //on repeat - control.onRepeat(); + if(Main.lastFrame - control.getPressFrame() > control.getRepeatTimeout()){ + control.onRepeat(); + } } control.setState(true); } else { if(control.isState()){ //on release control.onRelease(); + //on click + if(Main.lastFrame - control.getPressFrame() < control.getRepeatTimeout()){ + control.onClick(); + } } else { } control.setState(false); diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java index 46a6d500..c17ef342 100644 --- a/src/main/java/electrosphere/engine/LoadingThread.java +++ b/src/main/java/electrosphere/engine/LoadingThread.java @@ -106,6 +106,7 @@ public class LoadingThread extends Thread { case LOAD_TITLE_MENU: WindowUtils.recursiveSetVisible(loadingWindow,false); + WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_MAIN); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), true); break; diff --git a/src/main/java/electrosphere/entity/EntityDataStrings.java b/src/main/java/electrosphere/entity/EntityDataStrings.java index 9c5c0991..fd457427 100644 --- a/src/main/java/electrosphere/entity/EntityDataStrings.java +++ b/src/main/java/electrosphere/entity/EntityDataStrings.java @@ -146,7 +146,9 @@ public class EntityDataStrings { public static final String ITEM_IS_WEAPON = "itemIsWeapon"; public static final String ITEM_IS_ARMOR = "itemIsArmor"; public static final String ITEM_EQUIP_WHITELIST = "itemEquipWhitelist"; + public static final String ITEM_EQUIP_CLASS = "itemEquipClass"; public static final String ITEM_ICON = "itemIcon"; + public static final String ITEM_IN_WORLD_REPRESENTATION = "itemInWorldRepresentation"; /* diff --git a/src/main/java/electrosphere/entity/EntityManager.java b/src/main/java/electrosphere/entity/EntityManager.java index f88db094..6e999061 100644 --- a/src/main/java/electrosphere/entity/EntityManager.java +++ b/src/main/java/electrosphere/entity/EntityManager.java @@ -181,7 +181,6 @@ public class EntityManager { } if(drawableList.contains(e)){ drawableList.remove(e); - EntityUtils.cleanUpDrawableEntity(e); } if(entityList.contains(e)){ entityList.remove(e); diff --git a/src/main/java/electrosphere/entity/state/equip/EquipState.java b/src/main/java/electrosphere/entity/state/equip/EquipState.java index fff9ab5f..36c48c3f 100644 --- a/src/main/java/electrosphere/entity/state/equip/EquipState.java +++ b/src/main/java/electrosphere/entity/state/equip/EquipState.java @@ -48,7 +48,7 @@ public class EquipState { boolean targetIsItem = ItemUtils.isItem(toEquip); boolean targetIsAttached = AttachUtils.isAttached(toEquip); boolean targetHasWhitelist = ItemUtils.hasEquipList(toEquip); - String equipItemClass = "";//somehow resolve from toEquip + String equipItemClass = ItemUtils.getEquipClass(toEquip);//somehow resolve from toEquip List pointEquipClassList = point.getEquipClassWhitelist(); boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass); if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){ @@ -153,7 +153,47 @@ public class EquipState { // } public void unequipPoint(String pointId){ - equipMap.remove(pointId); + Entity equipped = equipMap.remove(pointId); + if(equipped != null){ + boolean targetHasWhitelist = ItemUtils.hasEquipList(equipped); + if(targetHasWhitelist){ + //have to do fancy mesh removal nonsense + //basically the reverse of below + // List whitelist = ItemUtils.getEquipWhitelist(equipped); + // for(EquipWhitelist whitelistItem : whitelist){ + // if(whitelistItem.getCreatureId().equals(parentCreatureId)){ + // //put in map + // equipMap.put(point.getEquipPointId(),toEquip); + // String modelName = whitelistItem.getModel(); + // Globals.assetManager.addModelPathToQueue(modelName); + // Actor parentActor = EntityUtils.getActor(parent); + // //queue meshes from display model to parent actor + // ActorMeshMask meshMask = parentActor.getMeshMask(); + // for(String toBlock : whitelistItem.getMeshMaskList()){ + // meshMask.blockMesh(modelName, toBlock); + // } + // for(String toDraw : whitelistItem.getMeshList()){ + // meshMask.queueMesh(modelName, toDraw); + // } + // //attach to parent bone + // AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone()); + // //make uncollidable + // if(toEquip.getDataKeys().contains(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.getDataKeys().contains(EntityDataStrings.PHYSICS_COLLIDABLE)){ + // CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + // Globals.collisionEngine.deregisterPhysicsObject(rigidBody); + // } + // //hide toEquip actor + // EntityUtils.setDraw(toEquip, false); + // //make untargetable + // Globals.entityManager.setTargetable(toEquip, false); + // break; + // } + // } + } else { + AttachUtils.detatchEntityFromEntityAtBone(parent, equipped); + EntityUtils.cleanUpDrawableEntity(equipped); + } + } } diff --git a/src/main/java/electrosphere/entity/state/inventory/InventoryUtils.java b/src/main/java/electrosphere/entity/state/inventory/InventoryUtils.java index e28afd36..180e7e14 100644 --- a/src/main/java/electrosphere/entity/state/inventory/InventoryUtils.java +++ b/src/main/java/electrosphere/entity/state/inventory/InventoryUtils.java @@ -6,9 +6,11 @@ import org.joml.Vector3f; import electrosphere.entity.Entity; import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityUtils; +import electrosphere.entity.state.equip.EquipState; import electrosphere.entity.state.gravity.GravityUtils; import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.types.item.ItemUtils; +import electrosphere.main.Globals; public class InventoryUtils { @@ -21,6 +23,14 @@ public class InventoryUtils { return (UnrelationalInventoryState)target.getData(EntityDataStrings.NATURAL_INVENTORY); } + public static boolean hasEquipInventory(Entity target){ + return target.getDataKeys().contains(EntityDataStrings.EQUIP_INVENTORY); + } + + public static RelationalInventoryState getEquipInventory(Entity target){ + return (RelationalInventoryState)target.getData(EntityDataStrings.EQUIP_INVENTORY); + } + public static void attemptStoreItem(Entity creature, Entity item){ boolean creatureIsCreature = CreatureUtils.isCreature(creature); boolean itemIsItem = ItemUtils.isItem(item); @@ -45,12 +55,28 @@ public class InventoryUtils { //verify creature is creature, item is item, inventory exists, and item is in inventory boolean creatureIsCreature = CreatureUtils.isCreature(creature); boolean itemIsItem = ItemUtils.isItem(item); - boolean hasInventory = hasNaturalInventory(creature); - if(creatureIsCreature && itemIsItem && hasInventory){ - //get inventory - UnrelationalInventoryState inventory = getNaturalInventory(creature); - //remove item from inventory - inventory.removeItem(item); + boolean hasNaturalInventory = hasNaturalInventory(creature); + boolean hasEquipInventory = hasEquipInventory(creature); + if(creatureIsCreature && itemIsItem){ + if(hasNaturalInventory){ + //get inventory + UnrelationalInventoryState inventory = getNaturalInventory(creature); + //remove item from inventory + inventory.removeItem(item); + } + if(hasEquipInventory){ + //get inventory + RelationalInventoryState inventory = getEquipInventory(creature); + //get real world item + Entity realWorldItem = ItemUtils.getRealWorldEntity(item); + if(realWorldItem != null){ + //drop item + EquipState equipState = (EquipState)creature.getData(EntityDataStrings.EQUIP_STATE); + equipState.unequipPoint(inventory.getItemSlot(item)); + } + //remove item from inventory + inventory.tryRemoveItem(item); + } //compose item into in-world entity Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(item)); //delete in container item @@ -64,4 +90,36 @@ public class InventoryUtils { } } + //need creature so we can figure out where to drop the item + public static void attemptDestroyItem(Entity creature, Entity item){ + //verify creature is creature, item is item, inventory exists, and item is in inventory + boolean creatureIsCreature = CreatureUtils.isCreature(creature); + boolean itemIsItem = ItemUtils.isItem(item); + boolean hasNaturalInventory = hasNaturalInventory(creature); + boolean hasEquipInventory = hasEquipInventory(creature); + if(creatureIsCreature && itemIsItem){ + if(hasNaturalInventory){ + //get inventory + UnrelationalInventoryState inventory = getNaturalInventory(creature); + //remove item from inventory + inventory.removeItem(item); + } + if(hasEquipInventory){ + //get inventory + RelationalInventoryState inventory = getEquipInventory(creature); + //get real world item + Entity realWorldItem = ItemUtils.getRealWorldEntity(item); + if(realWorldItem != null){ + //drop item + EquipState equipState = (EquipState)creature.getData(EntityDataStrings.EQUIP_STATE); + equipState.unequipPoint(inventory.getItemSlot(item)); + } + //remove item from inventory + inventory.tryRemoveItem(item); + } + //delete in container item + ItemUtils.destroyInInventoryItem(item); + } + } + } diff --git a/src/main/java/electrosphere/entity/state/inventory/RelationalInventoryState.java b/src/main/java/electrosphere/entity/state/inventory/RelationalInventoryState.java index 250e2fed..492eaa99 100644 --- a/src/main/java/electrosphere/entity/state/inventory/RelationalInventoryState.java +++ b/src/main/java/electrosphere/entity/state/inventory/RelationalInventoryState.java @@ -6,24 +6,29 @@ import java.util.List; import java.util.Map; import electrosphere.entity.Entity; +import electrosphere.entity.types.item.ItemUtils; import electrosphere.game.data.creature.type.equip.EquipPoint; public class RelationalInventoryState { Map items = new HashMap(); + Map> slotWhitelists = new HashMap>(); + Map equipPoints = new HashMap(); - public static RelationalInventoryState buildRelationalInventoryStateFromStringList(List slots){ - RelationalInventoryState rVal = new RelationalInventoryState(); - for(String slot : slots){ - rVal.items.put(slot,null); - } - return rVal; - } + // public static RelationalInventoryState buildRelationalInventoryStateFromStringList(List slots){ + // RelationalInventoryState rVal = new RelationalInventoryState(); + // for(String slot : slots){ + // rVal.items.put(slot,null); + // } + // return rVal; + // } public static RelationalInventoryState buildRelationalInventoryStateFromEquipList(List points){ RelationalInventoryState rVal = new RelationalInventoryState(); for(EquipPoint point : points){ rVal.items.put(point.getEquipPointId(),null); + rVal.slotWhitelists.put(point.getEquipPointId(),point.getEquipClassWhitelist()); + rVal.equipPoints.put(point.getEquipPointId(),point); } return rVal; } @@ -42,6 +47,17 @@ public class RelationalInventoryState { return items.get(slot); } + public String getItemSlot(Entity item){ + if(items.containsValue(item)){ + for(String slot : items.keySet()){ + if(items.get(slot) == item){ + return slot; + } + } + } + return null; + } + public boolean hasItemInSlot(String slot){ //if the slot is a key return if the value at the key isn't null, otherwise return false return items.containsKey(slot) ? items.get(slot) != null : false; @@ -51,4 +67,29 @@ public class RelationalInventoryState { return new LinkedList(items.keySet()); } + public Entity tryRemoveItem(Entity item){ + if(items.containsValue(item)){ + for(String slot : items.keySet()){ + if(items.get(slot) == item){ + items.remove(slot); + items.put(slot,null); + return item; + } + } + } + return null; + } + + public boolean canEquipItemToSlot(Entity item, String slot){ + String itemClass = ItemUtils.getEquipClass(item); + if(slotWhitelists.get(slot).contains(itemClass)){ + return true; + } + return false; + } + + public EquipPoint getEquipPointFromSlot(String slot){ + return equipPoints.get(slot); + } + } diff --git a/src/main/java/electrosphere/entity/types/attach/AttachUtils.java b/src/main/java/electrosphere/entity/types/attach/AttachUtils.java index b729113f..b3090a2a 100644 --- a/src/main/java/electrosphere/entity/types/attach/AttachUtils.java +++ b/src/main/java/electrosphere/entity/types/attach/AttachUtils.java @@ -29,7 +29,7 @@ public class AttachUtils { if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){ getChildrenList(parent).add(toAttach); } else { - LinkedList childrenEntities = new LinkedList(); + LinkedList childrenEntities = new LinkedList (); childrenEntities.add(toAttach); parent.putData(EntityDataStrings.ATTACH_CHILDREN_LIST, childrenEntities); } diff --git a/src/main/java/electrosphere/entity/types/item/ItemUtils.java b/src/main/java/electrosphere/entity/types/item/ItemUtils.java index 8303f055..224ec2f6 100644 --- a/src/main/java/electrosphere/entity/types/item/ItemUtils.java +++ b/src/main/java/electrosphere/entity/types/item/ItemUtils.java @@ -115,6 +115,9 @@ public class ItemUtils { } else { rVal.putData(EntityDataStrings.ITEM_ICON,genericItemIconPath); } + if(item.getEquipClass() != null){ + rVal.putData(EntityDataStrings.ITEM_EQUIP_CLASS,item.getEquipClass()); + } rVal.putData(EntityDataStrings.DRAW_CAST_SHADOW, true); rVal.putData(EntityDataStrings.ITEM_IS_ITEM, true); rVal.putData(EntityDataStrings.ITEM_TYPE, name); @@ -210,6 +213,7 @@ public class ItemUtils { rVal.putData(EntityDataStrings.ITEM_EQUIP_WHITELIST, getEquipWhitelist(item)); } rVal.putData(EntityDataStrings.ITEM_ICON,ItemUtils.getItemIcon(item)); + rVal.putData(EntityDataStrings.ITEM_EQUIP_CLASS, item.getData(EntityDataStrings.ITEM_EQUIP_CLASS)); rVal.putData(EntityDataStrings.ITEM_IS_ITEM, true); rVal.putData(EntityDataStrings.ITEM_TYPE, item.getData(EntityDataStrings.ITEM_TYPE)); Globals.entityManager.registerEntity(rVal); @@ -248,4 +252,16 @@ public class ItemUtils { return (String)item.getData(EntityDataStrings.ITEM_ICON); } + public static String getEquipClass(Entity item){ + return (String)item.getData(EntityDataStrings.ITEM_EQUIP_CLASS); + } + + public static void setRealWorldEntity(Entity inInventory, Entity inWorld){ + inInventory.putData(EntityDataStrings.ITEM_IN_WORLD_REPRESENTATION, inWorld); + } + + public static Entity getRealWorldEntity(Entity inInventory){ + return (Entity) inInventory.getData(EntityDataStrings.ITEM_IN_WORLD_REPRESENTATION); + } + } diff --git a/src/main/java/electrosphere/game/data/item/type/Item.java b/src/main/java/electrosphere/game/data/item/type/Item.java index 392f49e5..7b9de107 100644 --- a/src/main/java/electrosphere/game/data/item/type/Item.java +++ b/src/main/java/electrosphere/game/data/item/type/Item.java @@ -14,6 +14,7 @@ public class Item { List equipWhitelist; String idleAnim; String iconPath; + String equipClass; public String getItemId() { return itemId; @@ -46,5 +47,9 @@ public class Item { public String getIconPath(){ return iconPath; } + + public String getEquipClass(){ + return equipClass; + } } diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index c0139c8e..ecf6f258 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -277,6 +277,7 @@ public class Globals { //manager for all widgets currently being drawn to screen public static ElementManager elementManager; + public static int openInventoriesCount = 0; //collision world data public static CommonWorldData commonWorldData; @@ -300,7 +301,7 @@ public class Globals { //drag item state public static Entity draggedItem = null; - public static UnrelationalInventoryState dragSourceInventory = null; + public static Object dragSourceInventory = null; diff --git a/src/main/java/electrosphere/menu/MenuGenerators.java b/src/main/java/electrosphere/menu/MenuGenerators.java index 1e2f1e54..0c6586f4 100644 --- a/src/main/java/electrosphere/menu/MenuGenerators.java +++ b/src/main/java/electrosphere/menu/MenuGenerators.java @@ -1,12 +1,17 @@ package electrosphere.menu; +import electrosphere.controls.ControlHandler.ControlsState; import electrosphere.engine.LoadingThread; import electrosphere.entity.Entity; +import electrosphere.entity.EntityDataStrings; +import electrosphere.entity.state.equip.EquipState; import electrosphere.entity.state.inventory.InventoryUtils; +import electrosphere.entity.state.inventory.RelationalInventoryState; import electrosphere.entity.state.inventory.UnrelationalInventoryState; import electrosphere.entity.types.item.ItemUtils; import electrosphere.game.server.saves.SaveUtils; import electrosphere.main.Globals; +import electrosphere.main.Main; import electrosphere.net.NetUtils; import electrosphere.renderer.ui.ClickableElement; import electrosphere.renderer.ui.DrawableElement; @@ -14,7 +19,10 @@ import electrosphere.renderer.ui.Element; import electrosphere.renderer.ui.FocusableElement; import electrosphere.renderer.ui.WidgetUtils; import electrosphere.renderer.ui.Window; +import electrosphere.renderer.ui.ClickableElement.ClickEventCallback; import electrosphere.renderer.ui.DraggableElement.DragEventCallback; +import electrosphere.renderer.ui.FocusableElement.FocusEventCallback; +import electrosphere.renderer.ui.NavigableElement.NavigationEventCallback; import electrosphere.renderer.ui.elements.Button; import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.ImagePanel; @@ -22,10 +30,14 @@ import electrosphere.renderer.ui.elements.Label; import electrosphere.renderer.ui.elements.TextInput; import electrosphere.renderer.ui.events.ClickEvent; import electrosphere.renderer.ui.events.DragEvent; +import electrosphere.renderer.ui.events.FocusEvent; +import electrosphere.renderer.ui.events.NavigationEvent; import electrosphere.renderer.ui.form.FormElement; import java.util.List; +import javax.management.relation.Relation; + /** * * @author amaterasu @@ -379,28 +391,43 @@ public class MenuGenerators { } public static Element worldItemDropCaptureWindow(){ - Div rVal = new Div(); - rVal.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ + Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT); + Div div = new Div(); + div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ if(Globals.draggedItem != null){ - //remove item from inventory - Globals.dragSourceInventory.removeItem(Globals.draggedItem); - //drop item - InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem); - //clear ui - WindowUtils.cleanItemWindow(); - String sourceWindowId = WindowUtils.getInventoryWindowID(Globals.dragSourceInventory.getId()); - WindowUtils.replaceWindowContents(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(Globals.dragSourceInventory)); - //null globals - Globals.dragSourceInventory = null; - Globals.draggedItem = null; - return false; + if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ + UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory; + //drop item + InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem); + //clear ui + WindowUtils.cleanItemDraggingWindow(); + String sourceWindowId = WindowUtils.getInventoryWindowID(inventory.getId()); + WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(inventory)); + //null globals + Globals.dragSourceInventory = null; + Globals.draggedItem = null; + return false; + } else if(Globals.dragSourceInventory instanceof RelationalInventoryState){ + RelationalInventoryState inventory = (RelationalInventoryState) Globals.dragSourceInventory; + //drop item + InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem); + //clear ui + WindowUtils.cleanItemDraggingWindow(); + String sourceWindowId = WindowStrings.WINDOW_CHARACTER; + WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createCharacterMenu(inventory)); + //null globals + Globals.dragSourceInventory = null; + Globals.draggedItem = null; + return false; + } } return true; }}); - rVal.setPositionX(0); - rVal.setPositionY(0); - rVal.setWidth(Globals.WINDOW_WIDTH); - rVal.setHeight(Globals.WINDOW_HEIGHT); + div.setPositionX(0); + div.setPositionY(0); + div.setWidth(Globals.WINDOW_WIDTH); + div.setHeight(Globals.WINDOW_HEIGHT); + rVal.addChild(div); return rVal; } @@ -409,7 +436,14 @@ public class MenuGenerators { int width = 500; int height = 500; // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; - FormElement rVal = new FormElement(); + Div rVal = new Div(); + rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ + WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false); + Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); + Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); + Globals.controlHandler.hideMouse(); + return false; + }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture); @@ -419,65 +453,101 @@ public class MenuGenerators { rVal.addChild(imagePanel); //label 1 (back) + Button backButton = new Button(); Label backLabel = new Label(100,50,1.0f); backLabel.setText("Back"); - rVal.addChild(backLabel); + backButton.addChild(backLabel); + rVal.addChild(backButton); + backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ + WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false); + Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); + Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); + Globals.controlHandler.hideMouse(); + return false; + }}); //label 2 (quit) + Button quitButton = new Button(); Label quitLabel = new Label(100,150,1.0f); - quitLabel.setText("Quit"); - rVal.addChild(quitLabel); + quitLabel.setText("QUIT"); + quitButton.addChild(quitLabel); + rVal.addChild(quitButton); + quitButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){ + Main.running = false; + return false; + }}); return rVal; } - public static Element createNaturalInventoryMenu(UnrelationalInventoryState inventory){ - // int screenTop = Globals.WINDOW_HEIGHT - 150; + public static Window createNaturalInventoryMenu(UnrelationalInventoryState inventory){ int width = 500; int height = 500; - // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; - Div rVal = new Div(); - rVal.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ + Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT); + + Div div = new Div(); + rVal.addChild(div); + + rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ + WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId())), false); + Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId())); + // + Globals.openInventoriesCount--; + if(Globals.openInventoriesCount == 0){ + Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); + Globals.controlHandler.hideMouse(); + } + return false; + }}); + + div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ if(Globals.draggedItem != null){ if(Globals.dragSourceInventory != inventory){ - UnrelationalInventoryState sourceInventory = Globals.dragSourceInventory; - //transfer item - Globals.dragSourceInventory.removeItem(Globals.draggedItem); - inventory.addItem(Globals.draggedItem); - //null out global state - Globals.dragSourceInventory = null; - Globals.draggedItem = null; - //clear item container ui - WindowUtils.cleanItemWindow(); - //rerender both inventories - //re-render inventory - WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); - //re-render inventory - WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory)); + if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ + UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory; + //transfer item + sourceInventory.removeItem(Globals.draggedItem); + inventory.addItem(Globals.draggedItem); + //null out global state + Globals.dragSourceInventory = null; + Globals.draggedItem = null; + //clear item container ui + WindowUtils.cleanItemDraggingWindow(); + //rerender both inventories + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory)); + } } else { //clear ui - WindowUtils.cleanItemWindow(); + WindowUtils.cleanItemDraggingWindow(); //re-render inventory - WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); } return false; } return true; }}); + + div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){ + WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_INVENTORY); + return false; + }}); //black texture background ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture); // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); - rVal.addChild(imagePanel); + div.addChild(imagePanel); //label 1 (inventory) Label inventoryLabel = new Label(10,10,1.0f); inventoryLabel.setText("INVENTORY"); - rVal.addChild(inventoryLabel); + div.addChild(inventoryLabel); int columns = 8; int columnWidth = 60; @@ -506,7 +576,7 @@ public class MenuGenerators { // System.out.println("Drag start"); Globals.dragSourceInventory = inventory; Globals.draggedItem = inventory.getItems().get(itemId); - rVal.removeChild(panel); + div.removeChild(panel); WindowUtils.pushItemIconToItemWindow(panel); return false; }}); @@ -516,28 +586,225 @@ public class MenuGenerators { panel.setPositionY(event.getCurrentY() - panelHeight / 2); return false; }}); - // panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ - // // panel.setPositionX(posX); - // // panel.setPositionY(posY); - // //now the fun begins :) - // //if transfer item - // // remove item from current inventory - // // place item in new inventory - // // trigger recreation of the menu - // //if drop item - // // remove item from current inventory - // // create item in world in front of character - // // trigger recreation of the menu - // //if neither of above - // // replace item icon position to origin - // // System.out.println("Release drag"); - // return false; - // }}); + } else { + panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ + if(Globals.dragSourceInventory instanceof RelationalInventoryState){ + RelationalInventoryState sourceInventory = (RelationalInventoryState) Globals.dragSourceInventory; + Entity item = Globals.draggedItem; + //destroy real world item + if(ItemUtils.getRealWorldEntity(item) != null){ + System.out.println("Destroy real world item"); + ItemUtils.destroyInWorldItem(ItemUtils.getRealWorldEntity(item)); + } + //eject from equip state + InventoryUtils.attemptDestroyItem(Globals.playerCharacter,item); + //add to unrelational + sourceInventory.tryRemoveItem(item); + inventory.addItem(item); + //update ui + Globals.dragSourceInventory = null; + Globals.draggedItem = null; + //clear item container ui + WindowUtils.cleanItemDraggingWindow(); + //rerender both inventories + //re-render inventory + WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(sourceInventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); + } + //now the fun begins :) + //if transfer item + // remove item from current inventory + // place item in new inventory + // trigger recreation of the menu + //if drop item + // remove item from current inventory + // create item in world in front of character + // trigger recreation of the menu + //if neither of above + // replace item icon position to origin + // System.out.println("Release drag"); + return false; + }}); } // imagePanel.setWidth(width); // imagePanel.setHeight(height); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); - rVal.addChild(panel); + div.addChild(panel); + } + + return rVal; + } + + + + public static Window createCharacterMenu(RelationalInventoryState inventory){ + // int screenTop = Globals.WINDOW_HEIGHT - 150; + int width = 500; + int height = 500; + // int screenLeft = (Globals.WINDOW_WIDTH - width)/2; + Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT); + + Div div = new Div(); + div.setPositionX(1000); + rVal.addChild(div); + + rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){ + WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER), false); + Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_CHARACTER); + // + Globals.openInventoriesCount--; + if(Globals.openInventoriesCount == 0){ + Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); + Globals.controlHandler.hideMouse(); + } + return false; + }}); + + div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ + if(Globals.draggedItem != null){ + if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ + UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory; + //null out global state + Globals.dragSourceInventory = null; + Globals.draggedItem = null; + //clear item container ui + WindowUtils.cleanItemDraggingWindow(); + //rerender both inventories + //re-render inventory + WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(inventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory)); + } + return false; + } + return true; + }}); + + div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){ + WindowUtils.focusWindow(WindowStrings.WINDOW_CHARACTER); + return false; + }}); + + //black texture background + ImagePanel imagePanel = new ImagePanel(1000,0,width,height,Globals.blackTexture); + // imagePanel.setWidth(width); + // imagePanel.setHeight(height); + // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); + div.addChild(imagePanel); + + //label 1 (inventory) + Label inventoryLabel = new Label(1010,10,1.0f); + inventoryLabel.setText("CHARACTER"); + div.addChild(inventoryLabel); + + // int columns = 8; + // int columnWidth = 60; + // int rowHeight = 60; + int slotSpacing = 30; + + List slots = inventory.getSlots(); + int numSlots = slots.size(); + int numRows = (numSlots / 2) + (numSlots % 2 == 1 ? 1 : 0); + + int incrementer = 0; + for(int i = 0; i < numSlots; i++){ + String texturePath = "Textures/icons/itemIconEmpty.png"; + boolean hasItem = false; + if(inventory.getItemSlot(slots.get(i)) != null){ + Entity currentItem = inventory.getItemSlot(slots.get(i)); + //get texture path from item + texturePath = ItemUtils.getItemIcon(currentItem); + //flag that this isn't an empty slot + hasItem = true; + } + if(!Globals.assetManager.hasLoadedTexture(texturePath)){ + Globals.assetManager.addTexturePathtoQueue(texturePath); + } + int panelWidth = 50; + int panelHeight = 50; + int posX = 1000 + 20; + if((incrementer % 2) == 1){ + posX = posX + 400; + } + int posY = 60 + (i / 2 * (panelHeight + slotSpacing)); + ImagePanel panel = new ImagePanel(posX,posY,panelWidth,panelHeight,texturePath); + if(hasItem == true){ + int itemId = i; + panel.setOnDragStart(new DragEventCallback() {public boolean execute(DragEvent event){ + // System.out.println("Drag start"); + Globals.dragSourceInventory = inventory; + Globals.draggedItem = inventory.getItemSlot(slots.get(itemId)); + div.removeChild(panel); + WindowUtils.pushItemIconToItemWindow(panel); + return false; + }}); + panel.setOnDrag(new DragEventCallback() {public boolean execute(DragEvent event){ + // System.out.println("Drag"); + panel.setPositionX(event.getCurrentX() - panelWidth / 2); + panel.setPositionY(event.getCurrentY() - panelHeight / 2); + return false; + }}); + } else { + int itemId = i; + panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ + // panel.setPositionX(posX); + // panel.setPositionY(posY); + if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){ + UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState) Globals.dragSourceInventory; + Entity item = Globals.draggedItem; + if(inventory.canEquipItemToSlot(item, slots.get(itemId))){ + //transfer item + sourceInventory.removeItem(item); + inventory.addItem(slots.get(itemId), item); + //hydrate inventory item + Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(item)); + //bind in world with in inventory + ItemUtils.setRealWorldEntity(item, inWorldItem); + //fire equip event to equip state + EquipState equipState = (EquipState)Globals.playerCharacter.getData(EntityDataStrings.EQUIP_STATE); + equipState.attemptEquip(inWorldItem,inventory.getEquipPointFromSlot(slots.get(itemId))); + } + //update ui + Globals.dragSourceInventory = null; + Globals.draggedItem = null; + //clear item container ui + WindowUtils.cleanItemDraggingWindow(); + //rerender both inventories + //re-render inventory + WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(inventory)); + //re-render inventory + WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory)); + } + //now the fun begins :) + //if transfer item + // remove item from current inventory + // place item in new inventory + // trigger recreation of the menu + //if drop item + // remove item from current inventory + // create item in world in front of character + // trigger recreation of the menu + //if neither of above + // replace item icon position to origin + // System.out.println("Release drag"); + //rebuild inventory windows + return false; + }}); + } + div.addChild(panel); + + //create the slot text + posX = 1000 + 80; + if((incrementer % 2) == 1){ + posX = posX + 190; + } + posY = posY + 15; + Label slotText = new Label(posX, posY, 0.4f); + slotText.setText(slots.get(i)); + div.addChild(slotText); + + incrementer++; } return rVal; diff --git a/src/main/java/electrosphere/menu/WindowStrings.java b/src/main/java/electrosphere/menu/WindowStrings.java index a6084adf..8078ccaf 100644 --- a/src/main/java/electrosphere/menu/WindowStrings.java +++ b/src/main/java/electrosphere/menu/WindowStrings.java @@ -9,5 +9,6 @@ public class WindowStrings { public static final String WINDOW_LOADING = "windowLoading"; public static final String WINDDOW_ITEM_DROP = "itemDrop"; public static final String WINDOW_ITEM_DRAG_CONTAINER = "itemDragContainer"; + public static final String WINDOW_CHARACTER = "windowCharacter"; } diff --git a/src/main/java/electrosphere/menu/WindowUtils.java b/src/main/java/electrosphere/menu/WindowUtils.java index f68992e2..283d581b 100644 --- a/src/main/java/electrosphere/menu/WindowUtils.java +++ b/src/main/java/electrosphere/menu/WindowUtils.java @@ -16,7 +16,7 @@ public class WindowUtils { //todo: destroy elements as well mainMenu.getChildren().clear(); mainMenu.addChild(newMenu); - Globals.elementManager.focusFirstElement(mainMenu); + Globals.elementManager.focusFirstElement(); } } @@ -42,7 +42,7 @@ public class WindowUtils { //todo: destroy elements as well mainMenu.getChildren().clear(); mainMenu.addChild(content); - Globals.elementManager.focusFirstElement(mainMenu); + Globals.elementManager.focusFirstElement(); } } @@ -53,12 +53,18 @@ public class WindowUtils { Globals.elementManager.pushWindowToFront(targetWindow); } - public static void cleanItemWindow(){ + public static void cleanItemDraggingWindow(){ Window targetWindow = (Window) Globals.elementManager.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER); targetWindow.getChildren().clear(); recursiveSetVisible(targetWindow, false); } + public static void replaceWindow(String window, Window windowEl){ + Globals.elementManager.unregisterWindow(window); + Globals.elementManager.registerWindow(window, windowEl); + recursiveSetVisible(windowEl, true); + Globals.elementManager.focusFirstElement(); + } @@ -89,9 +95,7 @@ public class WindowUtils { } static void initItemDropWindow(){ - Window itemDropWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT); - Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, itemDropWindow); - WindowUtils.replaceWindowContents(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow()); + Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow()); } static void initItemDragContainerWindow(){ @@ -99,4 +103,10 @@ public class WindowUtils { Globals.elementManager.registerWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER, itemDragContainerWindow); } + public static void focusWindow(String window){ + Element windowEl = Globals.elementManager.getWindow(window); + Globals.elementManager.unregisterWindow(window); + Globals.elementManager.registerWindow(window, windowEl); + } + } diff --git a/src/main/java/electrosphere/renderer/ui/ElementManager.java b/src/main/java/electrosphere/renderer/ui/ElementManager.java index 1bbd5550..61ec26ca 100644 --- a/src/main/java/electrosphere/renderer/ui/ElementManager.java +++ b/src/main/java/electrosphere/renderer/ui/ElementManager.java @@ -14,7 +14,9 @@ import electrosphere.renderer.ui.events.DragEvent; import electrosphere.renderer.ui.events.Event; import electrosphere.renderer.ui.events.FocusEvent; import electrosphere.renderer.ui.events.MouseEvent; +import electrosphere.renderer.ui.events.NavigationEvent; import electrosphere.renderer.ui.events.DragEvent.DragEventType; +import electrosphere.renderer.ui.events.NavigationEvent.NavigationEventType; /** * @@ -34,7 +36,7 @@ public class ElementManager { elementList.add(w); } if(elementList.size() == 1){ - focusFirstElement(w); + focusFirstElement(); } } @@ -51,6 +53,9 @@ public class ElementManager { if(elementList.contains(w)){ elementList.remove(w); } + if(elementList.size() > 0){ + focusFirstElement(); + } } public void pushWindowToFront(Window window){ @@ -75,8 +80,8 @@ public class ElementManager { return currentFocusedElement; } - public void focusFirstElement(Element topLevel){ - List focusables = getFocusableList(topLevel,new LinkedList()); + public void focusFirstElement(){ + List focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList()); if(focusables.size() > 0){ if(currentFocusedElement != null){ currentFocusedElement.handleEvent(new FocusEvent(false)); @@ -86,8 +91,8 @@ public class ElementManager { } } - public void focusNextElement(Element topLevel){ - List focusables = getFocusableList(topLevel,new LinkedList()); + public void focusNextElement(){ + List focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList()); if(focusables.contains(currentFocusedElement)){ int index = focusables.indexOf(currentFocusedElement); if(index + 1 >= focusables.size()){ @@ -103,8 +108,8 @@ public class ElementManager { } } - public void focusPreviousElement(Element topLevel){ - List focusables = getFocusableList(topLevel,new LinkedList()); + public void focusPreviousElement(){ + List focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList()); if(focusables.contains(currentFocusedElement)){ int index = focusables.indexOf(currentFocusedElement); if(index - 1 < 0){ @@ -207,5 +212,10 @@ public class ElementManager { } fireEvent(event,event.getCurrentX(),event.getCurrentY()); } + + public void navigateBackwards(){ + NavigationEvent event = new NavigationEvent(NavigationEventType.BACKWARD); + fireEvent(event,currentFocusedElement.getPositionX(),currentFocusedElement.getPositionY()); + } } diff --git a/src/main/java/electrosphere/renderer/ui/NavigableElement.java b/src/main/java/electrosphere/renderer/ui/NavigableElement.java index 76aed737..dfb463af 100644 --- a/src/main/java/electrosphere/renderer/ui/NavigableElement.java +++ b/src/main/java/electrosphere/renderer/ui/NavigableElement.java @@ -8,7 +8,7 @@ public interface NavigableElement extends Element { public interface NavigationEventCallback { - public void execute(NavigationEvent event); + public boolean execute(NavigationEvent event); } diff --git a/src/main/java/electrosphere/renderer/ui/Window.java b/src/main/java/electrosphere/renderer/ui/Window.java index 508a8746..0bb7cc35 100644 --- a/src/main/java/electrosphere/renderer/ui/Window.java +++ b/src/main/java/electrosphere/renderer/ui/Window.java @@ -6,6 +6,7 @@ import electrosphere.renderer.Model; import electrosphere.renderer.framebuffer.Framebuffer; import electrosphere.renderer.framebuffer.FramebufferUtils; import electrosphere.renderer.ui.events.Event; +import electrosphere.renderer.ui.events.NavigationEvent; import java.util.LinkedList; import java.util.List; @@ -17,7 +18,7 @@ import static org.lwjgl.opengl.GL30.*; * * @author amaterasu */ -public class Window implements DrawableElement, ContainerElement { +public class Window implements DrawableElement, ContainerElement, NavigableElement { List childList = new LinkedList(); Framebuffer widgetBuffer; Material customMat = new Material(); @@ -26,6 +27,8 @@ public class Window implements DrawableElement, ContainerElement { Vector3f boxDimensions = new Vector3f(); Vector3f texPosition = new Vector3f(0,0,0); Vector3f texScale = new Vector3f(1,1,0); + + NavigationEventCallback navCallback; public Window(int positionX, int positionY, int width, int height){ //TODO: figure out why this has to be 1920x1080 @@ -197,7 +200,18 @@ public class Window implements DrawableElement, ContainerElement { } public boolean handleEvent(Event event){ - return true; + boolean propagate = true; + if(event instanceof NavigationEvent && navCallback != null){ + if(!navCallback.execute((NavigationEvent)event)){ + propagate = false; + } + } + return propagate; + } + + @Override + public void setOnNavigationCallback(NavigationEventCallback callback) { + navCallback = callback; } } diff --git a/src/main/java/electrosphere/renderer/ui/elements/Div.java b/src/main/java/electrosphere/renderer/ui/elements/Div.java index 8549d00a..fdc0f6a8 100644 --- a/src/main/java/electrosphere/renderer/ui/elements/Div.java +++ b/src/main/java/electrosphere/renderer/ui/elements/Div.java @@ -9,13 +9,15 @@ import electrosphere.renderer.ui.DraggableElement; import electrosphere.renderer.ui.DrawableElement; import electrosphere.renderer.ui.Element; import electrosphere.renderer.ui.FocusableElement; +import electrosphere.renderer.ui.NavigableElement; import electrosphere.renderer.ui.events.ClickEvent; import electrosphere.renderer.ui.events.DragEvent; import electrosphere.renderer.ui.events.Event; import electrosphere.renderer.ui.events.FocusEvent; +import electrosphere.renderer.ui.events.NavigationEvent; import electrosphere.renderer.ui.events.DragEvent.DragEventType; -public class Div implements ClickableElement,ContainerElement,DraggableElement,FocusableElement,DrawableElement { +public class Div implements ClickableElement,ContainerElement,DraggableElement,FocusableElement,DrawableElement,NavigableElement { ClickEventCallback onClick; FocusEventCallback onFocus; @@ -23,6 +25,7 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F DragEventCallback onDragStart; DragEventCallback onDrag; DragEventCallback onDragRelease; + NavigationEventCallback onNavigate; boolean focused = false; List childList = new LinkedList(); @@ -293,6 +296,13 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F } } } + if(event instanceof NavigationEvent){ + if(onNavigate != null){ + if(onNavigate.execute((NavigationEvent)event)){ + propagate = false; + } + } + } return propagate; } @@ -319,6 +329,12 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F } } + @Override + public void setOnNavigationCallback(NavigationEventCallback callback) { + // TODO Auto-generated method stub + onNavigate = callback; + } + diff --git a/src/main/java/electrosphere/renderer/ui/events/NavigationEvent.java b/src/main/java/electrosphere/renderer/ui/events/NavigationEvent.java index 82e3d99e..dc0ae53c 100644 --- a/src/main/java/electrosphere/renderer/ui/events/NavigationEvent.java +++ b/src/main/java/electrosphere/renderer/ui/events/NavigationEvent.java @@ -1,5 +1,19 @@ package electrosphere.renderer.ui.events; public class NavigationEvent implements Event { + public static enum NavigationEventType { + FORWARD, + BACKWARD, + } + + NavigationEventType type; + + public NavigationEvent(NavigationEventType type){ + this.type = type; + } + + public NavigationEventType getType(){ + return type; + } }