/*
* Copyright (c) 2017
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
package jsettlers.main.android.core.controls;
import go.graphics.GLDrawContext;
import go.graphics.UIPoint;
import go.graphics.event.mouse.GODrawEvent;
import jsettlers.common.map.shapes.MapRectangle;
import jsettlers.common.menu.action.EActionType;
import jsettlers.common.menu.action.IAction;
import jsettlers.common.position.ShortPoint2D;
import jsettlers.common.selectable.ISelectionSet;
import jsettlers.graphics.action.Action;
import jsettlers.graphics.action.ActionFireable;
import jsettlers.graphics.action.BuildAction;
import jsettlers.graphics.action.PointAction;
import jsettlers.graphics.action.ShowConstructionMarksAction;
import jsettlers.graphics.map.MapDrawContext;
import jsettlers.graphics.map.controls.IControls;
/**
* Created by tompr on 21/11/2016.
*/
public class AndroidControls implements IControls, ActionFireable, TaskControls {
private final ControlsAdapter controlsAdapter;
private ActionFireable actionFireable;
private ISelectionSet selection;
/**
* A task is something that requires multiple steps. E.g. show constructions markers, then choose build location. If an action is part of a task then store it so we know how to react when the next
* action comes in.
*/
private IAction taskAction;
public AndroidControls(ControlsAdapter controlsAdapter) {
this.controlsAdapter = controlsAdapter;
}
/**
* The action is being sent to the game, here we just store it if it's part of a task. Depending on what's active and what's coming in we may need to start a new task, update the current task or
* end the current task.
*/
@Override
public void action(IAction action) {
switch (action.getActionType()) {
case SHOW_CONSTRUCTION_MARK:
ShowConstructionMarksAction showConstructionMarksAction = (ShowConstructionMarksAction) action;
if (showConstructionMarksAction.getBuildingType() != null) { // null means dismissing the construction markers, so is not awaiting further actions
if (taskAction != null && taskAction.getActionType() == EActionType.SHOW_CONSTRUCTION_MARK) {
updateTask(action);
} else {
startTask(action);
}
}
break;
case ASK_SET_WORK_AREA:
startTask(action);
break;
case SET_WORK_AREA:
case BUILD:
case ABORT:
endTask();
break;
}
controlsAdapter.onAction(action);
}
/**
* Replace the action based on the current task/selection. E.g SELECT_POINT may be choosing a build location or moving soldiers depending on what's current
*/
@Override
public IAction replaceAction(IAction action) {
if (action.getActionType() == EActionType.SELECT_POINT) {
PointAction pointAction = (PointAction) action;
if (taskAction != null) {
switch (taskAction.getActionType()) {
case SHOW_CONSTRUCTION_MARK:
ShowConstructionMarksAction showConstructionMarksAction = (ShowConstructionMarksAction) taskAction;
return new BuildAction(showConstructionMarksAction.getBuildingType(), pointAction.getPosition());
case ASK_SET_WORK_AREA:
return new PointAction(EActionType.SET_WORK_AREA, pointAction.getPosition());
}
}
// if (selection != null && selection.getSize() > 0 && (selection.getSelectionType() == ESelectionType.SOLDIERS || selection.getSelectionType() == ESelectionType.SPECIALISTS)) {
// return new PointAction(EActionType.MOVE_TO, pointAction.getPosition());
// }
} else if (action.getActionType() == EActionType.MOVE_TO) {
PointAction pointAction = (PointAction) action;
if (selection == null || selection.getSize() == 0) {
return null;
}
}
return action;
}
@Override
public void displaySelection(ISelectionSet selection) {
this.selection = selection;
endTask();
controlsAdapter.onSelection(selection);
}
@Override
public void drawAt(GLDrawContext gl) {
controlsAdapter.onDraw();
}
@Override
public void resizeTo(float newWidth, float newHeight) {
}
@Override
public boolean containsPoint(UIPoint position) {
return false;
}
@Override
public String getDescriptionFor(UIPoint position) {
return null;
}
@Override
public void setMapViewport(MapRectangle screenArea) {
}
@Override
public Action getActionFor(UIPoint position, boolean selecting) {
return null;
}
@Override
public boolean handleDrawEvent(GODrawEvent event) {
return false;
}
@Override
public void setDrawContext(ActionFireable actionFireable, MapDrawContext context) {
this.actionFireable = actionFireable;
}
@Override
public String getMapTooltip(ShortPoint2D point) {
return null;
}
@Override
public void stop() {
}
/**
* ActionFireable implementation
*/
@Override
public void fireAction(IAction action) {
actionFireable.fireAction(action);
}
/**
* TaskControls implementation
*
* @return
*/
@Override
public boolean isTaskActive() {
return taskAction != null && taskAction.getActionType() != EActionType.MOVE_TO;
}
@Override
public void endTask() {
if (taskAction != null) {
switch (taskAction.getActionType()) {
case SHOW_CONSTRUCTION_MARK:
fireAction(new ShowConstructionMarksAction(null));
break;
default:
fireAction(new Action(EActionType.ABORT));
break;
}
taskAction = null;
}
}
private void startTask(IAction action) {
endTask();
taskAction = action;
}
private void updateTask(IAction action) {
taskAction = action;
}
}