/**
* 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.conditions.ANDCond;
import es.eucm.ead.model.elements.conditions.Condition;
import es.eucm.ead.model.elements.conditions.NOTCond;
import es.eucm.ead.model.elements.conditions.OperationCond;
import es.eucm.ead.model.elements.conditions.enums.Comparator;
import es.eucm.ead.model.elements.effects.*;
import es.eucm.ead.model.elements.effects.enums.InterpolationLoopType;
import es.eucm.ead.model.elements.effects.enums.InterpolationType;
import es.eucm.ead.model.elements.effects.sceneelements.MoveSceneElementEf;
import es.eucm.ead.model.elements.effects.timedevents.WaitEf;
import es.eucm.ead.model.elements.effects.variables.ChangeFieldEf;
import es.eucm.ead.model.elements.events.SceneElementEv;
import es.eucm.ead.model.elements.events.TimedEv;
import es.eucm.ead.model.elements.events.enums.SceneElementEvType;
import es.eucm.ead.model.elements.events.enums.TimedEvType;
import es.eucm.ead.model.elements.extra.EAdList;
import es.eucm.ead.model.elements.operations.ElementField;
import es.eucm.ead.model.elements.operations.MathOp;
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.SimpleTrajectory;
import es.eucm.ead.model.params.guievents.DragGEv;
import es.eucm.ead.model.params.guievents.MouseGEv;
import es.eucm.ead.model.params.guievents.enums.DragGEvType;
import es.eucm.ead.model.params.text.EAdString;
import es.eucm.ead.model.params.util.Position.Corner;
import es.eucm.ead.techdemo.elementfactories.EAdElementsFactory;
import es.eucm.ead.techdemo.elementfactories.StringFactory;
import es.eucm.ead.techdemo.elementfactories.scenes.scenes.EmptyScene;
/**
* First scene. Main character does not know where he is. Everything is dark in
* here. Where will be the light?
*/
public class NgRoom1 extends EmptyScene {
private SceneElement ng;
private SceneElement darkness;
private OperationCond isDark;
private NOTCond isNotDark;
private ElementField darknessAlpha;
private SceneElement table;
private SceneElement lamp;
private SceneElement carpet;
private SceneElement door;
private SceneElement portrait;
private SceneElement key;
private ElementField timesField;
// private Scene initScene;
public NgRoom1() {
// this.initScene = initScene;
// NgCommon.init();
initConditions();
setBackground(new SceneElement(new Image("@drawable/ng_room1_bg.png")));
ng = new SceneElement(NgCommon.getMainCharacter());
ng.setPosition(Corner.BOTTOM_CENTER, 200, 400);
ng.setScale(0.8f);
SimpleTrajectory d = new SimpleTrajectory(false);
d.setLimits(150, 380, 800, 600);
setTrajectoryDefinition(d);
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);
createElements();
initConditions();
addElementsInOrder();
}
private void initConditions() {
darknessAlpha = new ElementField(darkness, SceneElement.VAR_ALPHA);
isDark = new OperationCond(darknessAlpha, new ValueOp(0.9f),
Comparator.GREATER_EQUAL);
isNotDark = new NOTCond(isDark);
}
private void createElements() {
darkness = new SceneElement(new Image("@drawable/ng_lights_off.png"));
darkness.setPosition(Corner.CENTER, 0, 0);
darkness.setEnable(false);
table = new SceneElement(new Image("@drawable/ng_table.png"));
table.setPosition(Corner.CENTER, 576, 550);
lamp = new SceneElement(new Image("@drawable/ng_lamp.png"));
lamp.setPosition(Corner.CENTER, 617, 470);
carpet = new SceneElement(new Image("@drawable/ng_carpet.png"));
carpet.setPosition(Corner.CENTER, 350, 470);
door = new SceneElement(new Image("@drawable/ng_door.png"));
door.setPosition(Corner.CENTER, 662, 235);
portrait = new SceneElement(new Image("@drawable/ng_portrait.png"));
portrait.setPosition(Corner.CENTER, 430, 230);
key = new SceneElement(new Image("@drawable/ng_key.png"));
key.setPosition(Corner.CENTER, 430, 230);
}
private void addElementsInOrder() {
getSceneElements().add(door);
getSceneElements().add(key);
getSceneElements().add(portrait);
getSceneElements().add(carpet);
getSceneElements().add(ng);
getSceneElements().add(table);
getSceneElements().add(lamp);
getSceneElements().add(darkness);
}
public void setUpSceneElements(Scene corridor) {
setDarkness(ng);
setMainCharactersSpeech();
setLamp();
setPortrait();
setDoor(corridor);
setKey();
addLightBlink();
setCarpet();
setTable();
this.getSceneElements().add(darkness);
}
/**
* Lets main character's move over the carpet
*/
private void setCarpet() {
MoveSceneElementEf move = new MoveSceneElementEf();
move.setTargetCoordiantes(SystemFields.MOUSE_SCENE_X,
SystemFields.MOUSE_SCENE_Y);
move.setSceneElement(ng);
carpet.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, move);
}
/**
* Lets main character's move to the door
*/
private void setTable() {
MoveSceneElementEf move = new MoveSceneElementEf();
move.setTargetCoordiantes(SystemFields.MOUSE_SCENE_X,
SystemFields.MOUSE_SCENE_Y);
move.setSceneElement(ng);
table.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, move);
}
/**
* When the user clicks on the main character, it looks to the user and a
* text appears
*/
private void setMainCharactersSpeech() {
SpeakSceneElementEf speech = new SpeakSceneElementEf(ng, new EAdString(
"n.1"));
speech.getNextEffects().add(NgCommon.getLookSouthEffect());
speech.setElement(ng);
ng.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, speech);
}
/**
* Puts the darkness in the room
*
* @param ng
*/
private void setDarkness(SceneElement ng) {
SceneElementEv event = new SceneElementEv();
ChangeFieldEf changeX = new ChangeFieldEf(new ElementField(darkness,
SceneElement.VAR_X), new ElementField(ng,
SceneElement.VAR_CENTER_X));
ChangeFieldEf changeY = new ChangeFieldEf(new ElementField(darkness,
SceneElement.VAR_Y), new ElementField(ng,
SceneElement.VAR_CENTER_Y));
event.addEffect(SceneElementEvType.ALWAYS, changeX);
event.addEffect(SceneElementEvType.ALWAYS, changeY);
darkness.addEvent(event);
}
private void setLamp() {
ChangeFieldEf switchLights = new ChangeFieldEf(darknessAlpha,
new ValueOp(0.0f));
MoveSceneElementEf move = moveNg(617, 510);
move.getNextEffects().add(switchLights);
lamp.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, move);
}
private void setDoor(Scene corridor) {
// Principal character moving to the door
MoveSceneElementEf move = moveNg(662, 235);
door.addBehavior(new DragGEv(key.getDefinition().getId(),
DragGEvType.DROP), move);
// Define next scene, add next behavior
ChangeSceneEf corridorScene = new ChangeSceneEf();
corridorScene.setNextScene(corridor);
move.getNextEffects().add(corridorScene);
}
private void setPortrait() {
addText(portrait);
}
private void addText(SceneElement portrait) {
timesField = new ElementField(portrait, "timesClicked");
ChangeFieldEf addTimes = new ChangeFieldEf(timesField, new MathOp(
"[0] + 1 ", timesField));
// ORCondition orConditon = new ORCondition( getTextCondition(0),
// getTextCondition())
Condition moveCondition = new ANDCond(isNotDark, null);
MoveSceneElementEf move = moveNg(430, 260);
move.setCondition(moveCondition);
portrait.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, move);
move.getNextEffects().add(NgCommon.getLookNorthEffect());
TriggerMacroEf triggerMacro = new TriggerMacroEf();
for (int i = 0; i < 4; i++) {
EAdList<Effect> macro = new EAdList<Effect>();
macro.add(getSpeakEffect(i));
OperationCond cond1 = new OperationCond(timesField, i,
Comparator.EQUAL);
triggerMacro.putEffects(cond1, macro);
}
OperationCond cond = new OperationCond(timesField, 4, Comparator.EQUAL);
InterpolationEf portraitGoDown = new InterpolationEf(new ElementField(
portrait, SceneElement.VAR_Y), 0, 80, 200,
InterpolationLoopType.NO_LOOP, InterpolationType.BOUNCE_END);
Effect e1 = getSpeakEffect(4);
Effect e3 = getSpeakEffect(5);
e1.getNextEffects().add(portraitGoDown);
portraitGoDown.getNextEffects().add(e3);
EAdList<Effect> macro2 = new EAdList<Effect>();
macro2.add(e1);
triggerMacro.putEffects(cond, macro2);
move.getNextEffects().add(triggerMacro);
triggerMacro.getNextEffects().add(addTimes);
}
private void setKey() {
DragEf e = new DragEf();
e.setCondition(new OperationCond(timesField, 4, Comparator.GREATER));
key.addBehavior(MouseGEv.MOUSE_LEFT_PRESSED, e);
}
protected Condition getTextCondition(ElementField timesField, int value) {
OperationCond op = new OperationCond(timesField, new ValueOp(value),
Comparator.EQUAL);
return op;
}
private String strings[] = new String[] {
"Hmm. That's me. It's kind of weird. This is not my house. It's a nice photo, anyway.",
"Yeah, I know. My photo. We talked about it just a moment ago.",
"Yeah...", "You know, I'm not coming back...",
"OK. You know what, YOU KNOW WHAT?",
"There you go. Are you happy now?" };
private Effect getSpeakEffect(int i) {
StringFactory sf = EAdElementsFactory.getInstance().getStringFactory();
SpeakSceneElementEf speak = new SpeakSceneElementEf(ng, new EAdString(
"n.23"));
sf.setString(speak.getString(), strings[i]);
return speak;
}
private MoveSceneElementEf moveNg(int x, int y) {
MoveSceneElementEf move = new MoveSceneElementEf();
move.setSceneElement(ng);
move.setTargetCoordiantes(x, y);
return move;
}
private void addLightBlink() {
float blink = 0.02f;
TimedEv blinkEvent = new TimedEv();
blinkEvent.setTime(500);
blinkEvent.setRepeats(-1);
MathOp op1 = new MathOp("[0] + " + blink, darknessAlpha);
MathOp op2 = new MathOp("[0] - " + blink, darknessAlpha);
ChangeFieldEf up = new ChangeFieldEf(darknessAlpha, op1);
ChangeFieldEf down = new ChangeFieldEf(darknessAlpha, op2);
WaitEf wait = new WaitEf();
wait.setTime(50);
up.addNextEffect(wait);
wait.addNextEffect(down);
up.setCondition(isNotDark);
blinkEvent.addEffect(TimedEvType.END_TIME, up);
lamp.addEvent(blinkEvent);
}
}