package games.fighter.billMuenstermanJouster.controller.levels;
import java.util.List;
import java.util.ResourceBundle;
import util.Vector;
import util.input.*;
import vooga.fighter.controller.Controller;
import vooga.fighter.controller.gameinformation.GameInfo;
import vooga.fighter.controller.interfaces.ControllerDelegate;
import vooga.fighter.forces.Force;
import vooga.fighter.forces.ForceFactory;
import vooga.fighter.model.objects.AttackObject;
import vooga.fighter.model.objects.CharacterObject;
import vooga.fighter.view.Canvas;
import vooga.fighter.view.FourPlayerMatchGameLayout;
/**
* A 1v1 fighting game instance
*
* @author Jerry Li
* @author by Jack Matteucci
*
* Great class to reference when subclasing level controller
*/
@InputClassTarget
public class OneVOneController extends LevelController {
private static final String INPUT_PATHWAY = "config.leveldefault";
private static final String SCORE_PATHWAY = "config.score";
private static final String SCORE = "ScoreScreen";
private String myInputPathway;
private String myScorePathway;
private List<Force> myForces;
private ResourceBundle myResources;
/**
* Initial constructor
*/
public OneVOneController () {
super();
}
/**
* Concrete constructor
* @param name name of controller
* @param frame frame
* @param manager ControllerManager
* @param gameinfo GameInfo
* @param filepath FilePath
*/
public OneVOneController(String name, Canvas frame, ControllerDelegate manager,
GameInfo gameinfo, String filepath) {
super(name, frame, manager, gameinfo, filepath);
myInputPathway = getHardFilePath() + INPUT_PATHWAY;
myScorePathway = getHardFilePath() + SCORE_PATHWAY;
myResources = ResourceBundle.getBundle(myScorePathway);
ForceFactory forcefactory = new ForceFactory(getHardFilePath());
myForces = forcefactory.getForces();
getMode().setForces(myForces);
frame.setLayout(new FourPlayerMatchGameLayout());
setSumOfForces(myForces);
}
/**
* Set sum of forces acting upon objects
* @param forces
*/
public void setSumOfForces(List<Force> forces) {
Vector sum = new Vector();
for (Force force : forces) {
sum.sum(force.getVector());
}
for(CharacterObject character : getInputObjects()) {
character.setAppliedForces(sum);
}
}
/**
* Return concrete controller
*/
@Override
public Controller getController(String name, Canvas frame, ControllerDelegate manager, GameInfo gameinfo,
String filepath) {
Controller controller = new OneVOneController(name, frame, manager, gameinfo, filepath);
return controller;
}
/**
* notify delegate of condition
*/
@Override
public void notifyEndCondition (String endCondition) {
removeListener();
getManager().notifyEndCondition(myResources.getString(SCORE));
}
/**
* Details movement inputs
* @param alObj
*/
@InputMethodTarget(name = "player1_jump")
public void playerOneJumpInput (AlertObject alObj) {
getInputObjects().get(0).jump();
}
@InputMethodTarget(name = "player1_left")
public void playerOneLeftInput (AlertObject alObj) {
getInputObjects().get(0).move(180);
}
@InputMethodTarget(name = "player1_right")
public void playerOneRightInput(AlertObject alObj) {
getInputObjects().get(0).move(0);
}
@InputMethodTarget(name = "player2_jump")
public void playerTwoJumpInput (AlertObject alObj) {
getInputObjects().get(1).jump();
}
@InputMethodTarget(name = "player2_left")
public void playerTwoLeftInput (AlertObject alObj) {
getInputObjects().get(1).move(180);
}
@InputMethodTarget(name = "player2_right")
public void playerTwoRightInput(AlertObject alObj) {
getInputObjects().get(1).move(0);
}
@InputMethodTarget(name = "player1_attack")
public void playerOneWeakPunchInput(AlertObject alObj) {
AttackObject newAttack = getInputObjects().get(0).attack("weakPunch");
getMode().addObject(newAttack);
}
@InputMethodTarget(name = "player2_attack")
public void playerTwoAttacInput(AlertObject alObj) {
AttackObject newAttack = getInputObjects().get(1).attack("weakPunch");
getMode().addObject(newAttack);
}
@InputMethodTarget(name = "continue")
public void mouseclick(PositionObject pos) {
//This is a test
getInputObjects().get(1).changeHealth(-10);
}
/**
* Removes listener
*/
@Override
public void removeListener(){
super.removeListener();
getInput().removeListener(this);
}
}