/**
* eAdventure (formerly <e-Adventure> and <e-Game>) is a research project of the
* <e-UCM> research group.
*
* Copyright 2005-2010 <e-UCM> research group.
*
* You can access a list of all the contributors to eAdventure at:
* http://e-adventure.e-ucm.es/contributors
*
* <e-UCM> is a research group of the Department of Software Engineering
* and Artificial Intelligence at the Complutense University of Madrid
* (School of Computer Science).
*
* C Profesor Jose Garcia Santesmases sn,
* 28040 Madrid (Madrid), Spain.
*
* For more info please visit: <http://e-adventure.e-ucm.es> or
* <http://www.e-ucm.es>
*
* ****************************************************************************
*
* This file is part of eAdventure, version 2.0
*
* eAdventure is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* eAdventure is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with eAdventure. If not, see <http://www.gnu.org/licenses/>.
*/
package es.eucm.ead.techdemo.elementfactories.scenes.normalguy;
import es.eucm.ead.model.assets.drawable.basics.Image;
import es.eucm.ead.model.elements.effects.ChangeSceneEf;
import es.eucm.ead.model.elements.effects.sceneelements.MoveSceneElementEf;
import es.eucm.ead.model.elements.effects.variables.ChangeFieldEf;
import es.eucm.ead.model.elements.operations.SystemFields;
import es.eucm.ead.model.elements.operations.ValueOp;
import es.eucm.ead.model.elements.predef.effects.SpeakSceneElementEf;
import es.eucm.ead.model.elements.scenes.Scene;
import es.eucm.ead.model.elements.scenes.SceneElement;
import es.eucm.ead.model.elements.trajectories.NodeTrajectory;
import es.eucm.ead.model.elements.transitions.FadeInTransition;
import es.eucm.ead.model.params.guievents.MouseGEv;
import es.eucm.ead.model.params.text.EAdString;
import es.eucm.ead.model.params.util.Position.Corner;
import es.eucm.ead.techdemo.elementfactories.scenes.scenes.EmptyScene;
public class NgCorridor extends EmptyScene {
private SceneElement ng;
private SceneElement window; // Displays a video
private SceneElement door1;
private SceneElement door2;
private SceneElement door3;
private SceneElement door4;
private SceneElement doorClosed;
public NgCorridor() {
// Set up room's variables
initVariables();
// Set the scene background
setBackground(new SceneElement(
new Image("@drawable/ng_corridor_bg.png")));
// Puts main character into the scene
ng = new SceneElement(NgCommon.getMainCharacter());
ng.setPosition(Corner.BOTTOM_CENTER, 650, 495);
ng.setScale(0.8f);
// Star form node trajectory
ChangeFieldEf changeSide = new ChangeFieldEf(ng,
NodeTrajectory.VAR_CURRENT_SIDE, new ValueOp(null));
createNodeTrajectory(changeSide);
restOfTheRoom();
addSceneElements();
ngMovement();
}
private void initVariables() {
}
/**
* Creates the rest of the scene elements
*/
public void restOfTheRoom() {
setDoors();
setWindow();
}
/**
* Star form node trajectory for this room
*
* @param changeSide
*/
private void createNodeTrajectory(ChangeFieldEf changeSide) {
NodeTrajectory trajectory = new NodeTrajectory();
// 5 nodes
trajectory.addNode("0", 175, 495, 0.8f);
trajectory.addNode("1", 255, 360, 0.8f);
trajectory.addNode("2", 410, 265, 0.8f);
trajectory.addNode("3", 565, 360, 0.8f);
trajectory.addNode("4", 650, 495, 0.8f);
trajectory.addNode("5", 410, 405, 0.8f);
// 11 connections between nodes
trajectory.addSide("0", "1", 157);
trajectory.addSide("1", "2", 182);
trajectory.addSide("2", "3", 182);
trajectory.addSide("3", "4", 160);
trajectory.addSide("4", "0", 475);
trajectory.addSide("5", "0", 252);
trajectory.addSide("5", "1", 182);
trajectory.addSide("5", "2", 140);
trajectory.addSide("5", "3", 162);
trajectory.addSide("5", "4", 257);
trajectory.addSide("1", "3", 110);
setTrajectoryDefinition(trajectory);
}
/**
* Sets the window's position & image
*/
private void setWindow() {
window = new SceneElement(new Image("@drawable/ng_corridor_window.png"));
window.setPosition(Corner.TOP_LEFT, 345, 39);
}
/**
* Sets the doors' position & image
*/
private void setDoors() {
door1 = new SceneElement(new Image("@drawable/ng_corridor_door1.png"));
door1.setPosition(Corner.TOP_LEFT, 692, 125);
door2 = new SceneElement(new Image("@drawable/ng_corridor_door2.png"));
door2.setPosition(Corner.TOP_LEFT, 48, 148);
door3 = new SceneElement(new Image("@drawable/ng_corridor_door3.png"));
door3.setPosition(Corner.TOP_LEFT, 145, 8);
door4 = new SceneElement(new Image("@drawable/ng_corridor_door4.png"));
door4.setPosition(Corner.TOP_LEFT, 597, 8);
doorClosed = new SceneElement(new Image(
"@drawable/ng_corridor_closed.png"));
doorClosed.setPosition(Corner.TOP_LEFT, 570, 72);
}
/**
* Adds the others scene elements to the room
*/
private void addSceneElements() {
getSceneElements().add(door1);
getSceneElements().add(door2);
getSceneElements().add(door3);
getSceneElements().add(door4);
getSceneElements().add(doorClosed);
getSceneElements().add(window);
getSceneElements().add(ng);
}
/**
* Defines main character's movement effect
*/
private void ngMovement() {
MoveSceneElementEf move = new MoveSceneElementEf();
move.setTargetCoordiantes(SystemFields.MOUSE_SCENE_X,
SystemFields.MOUSE_SCENE_Y);
move.setSceneElement(ng);
move.setUseTrajectory(true);
getBackground().addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, move);
}
/**
* Moves principal character thought the room
*
* @param x
* @param y
* @return MoveSceneElementEf with the movement
*/
private MoveSceneElementEf moveNg(int x, int y) {
MoveSceneElementEf move = new MoveSceneElementEf();
move.setSceneElement(ng);
move.setTargetCoordiantes(x, y);
return move;
}
/**
* Configures the element's behavior in this scene
*
* @param window
* @param room1
* @param room2
* @param room3
* @param finalRoom
*/
public void setUpSceneElements(Scene window, Scene room1, Scene room2,
Scene room3, Scene finalRoom) {
windowBehavior(window);
doorsBehavior(room1, room2, room3, finalRoom);
}
/**
* Specifies the window's behavior: NgWindow with 'eAdventure.webm' video
* displayed
*/
private void windowBehavior(Scene windowScene) {
// Principal character moving to the window
MoveSceneElementEf move = moveNg(345, 39);
window.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, move);
// Changing the scene: play the video
ChangeSceneEf toWindowScene = new ChangeSceneEf();
toWindowScene.setNextScene(windowScene);
move.addNextEffect(toWindowScene);
this.getSceneElements().add(window);
}
/**
* Establish door's behavior
*/
private void doorsBehavior(Scene room1, Scene room2, Scene room3,
Scene finalRoom) {
setMovementAndChangeRoomBehavior(room1, door1, NgSceneCreator
.getRoom1_x(), NgSceneCreator.getRoom1_y());
setMovementAndChangeRoomBehavior(room2, door2, NgSceneCreator
.getRoom2_x(), NgSceneCreator.getRoom2_y());
setMovementAndChangeRoomBehavior(room3, door3, NgSceneCreator
.getRoom3_x(), NgSceneCreator.getRoom3_y());
setMovementAndChangeRoomBehavior(finalRoom, door4, NgSceneCreator
.getRoomf_x(), NgSceneCreator.getRoomf_y());
doorClosed();
}
/**
* Configures the movement & change room effects
*
* @param room
* -> where to go through that door
* @param element
* -> door selected
*/
private void setMovementAndChangeRoomBehavior(Scene room,
SceneElement element, int x, int y) {
// Movement
MoveSceneElementEf move = new MoveSceneElementEf();
move.setTargetCoordiantes(x, y);
move.setSceneElement(ng);
element.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, move);
// Changing the scene
ChangeSceneEf goToRoom = new ChangeSceneEf(room, new FadeInTransition(
1000));
move.addNextEffect(goToRoom);
}
private void doorClosed() {
// Message when the main character tries to open the door
MoveSceneElementEf move = moveNg(565, 360);
doorClosed.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, move);
move.addNextEffect(NgCommon.getLookEastEffect());
SpeakSceneElementEf speak = new SpeakSceneElementEf(ng, new EAdString(
"ng.1"));
move.addNextEffect(speak);
}
public SceneElement getNg() {
return ng;
}
}