All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bladecoder.engine.actions.SayDialogAction Maven / Gradle / Ivy

There is a newer version: 4.3.1
Show newest version
/*******************************************************************************
 * Copyright 2014 Rafael Garcia Moreno.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package com.bladecoder.engine.actions;

import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonValue;
import com.bladecoder.engine.model.AnimationRenderer;
import com.bladecoder.engine.model.BaseActor;
import com.bladecoder.engine.model.CharacterActor;
import com.bladecoder.engine.model.DialogOption;
import com.bladecoder.engine.model.SpriteActor;
import com.bladecoder.engine.model.Text;
import com.bladecoder.engine.model.VerbRunner;
import com.bladecoder.engine.model.World;
import com.bladecoder.engine.util.EngineLogger;

@ActionDescription("Says the selected option from the current dialog. This action does the next steps:\n" +
"\n- Sets the player 'talk' animation and say the player text" +
"\n- Restore the previous player animation and set the target actor 'talk' animation and say the response text" +
"\n- Restore the target actor animation")
public class SayDialogAction extends BaseCallbackAction {
	private boolean characterTurn = false;
	private String characterName;
	private String responseText;
	private String responseVoiceId;

	private String previousAnim;

	@Override
	public boolean run(VerbRunner cb) {
		World w = World.getInstance();
		
		if(w.getCurrentDialog() == null || w.getCurrentDialog().getCurrentOption() == null) {
			EngineLogger.debug("SayDialogAction WARNING: Current dialog doesn't found.");
			
			return false;
		}
		
		setVerbCb(cb);
		DialogOption o = w.getCurrentDialog().getCurrentOption();
		String playerText = o.getText();
		
		responseText = o.getResponseText();
		responseVoiceId = o.getResponseVoiceId();
		characterName = w.getCurrentDialog().getActor();
		
		characterTurn = true;
		previousAnim = null;
		
		// If the player or the character is talking restore to 'stand' pose
		restoreStandPose(w.getCurrentScene().getPlayer());
		
		if(w.getCurrentScene().getActor(characterName, false) instanceof SpriteActor)
			restoreStandPose((CharacterActor)w.getCurrentScene().getActor(characterName, false));

		if (playerText != null) {
			CharacterActor player = w.getCurrentScene().getPlayer();
			
			Rectangle boundingRectangle = player.getBBox().getBoundingRectangle();
			float x = boundingRectangle.getX() + boundingRectangle.getWidth() / 2;
			float y = boundingRectangle.getY() + boundingRectangle.getHeight();

			w.getTextManager().addText(playerText, x, y, false,
					Text.Type.TALK, player.getTextColor(), null, player.getId(), o.getVoiceId(), this);
 
			startTalkAnim(player);

		} else {
			resume();
		}
		
		return getWait();
	}

	@Override
	public void resume() {

		World w = World.getInstance();
		BaseActor actor = w.getCurrentScene().getActor(characterName, false);
		
		if (characterTurn) {
			characterTurn = false;
			
			if(previousAnim!= null){
				SpriteActor player = World.getInstance().getCurrentScene().getPlayer();
				player.startAnimation(previousAnim, null);
			}

			if (responseText != null) {
				Rectangle boundingRectangle = actor.getBBox().getBoundingRectangle();
				float x = boundingRectangle.getX() + boundingRectangle.getWidth() / 2;
				float y = boundingRectangle.getY() + boundingRectangle.getHeight();
				
				World.getInstance().getTextManager().addText(responseText, x,
						y, false, Text.Type.TALK,
						((CharacterActor) actor).getTextColor(), null, actor.getId(), responseVoiceId, this);


				if(actor instanceof CharacterActor) {
					startTalkAnim((CharacterActor)actor);
				}
			} else {
				previousAnim = null;
				super.resume();
			}
		} else {
			if(actor instanceof SpriteActor && previousAnim != null) {
				((SpriteActor)actor).startAnimation(previousAnim, null);
			}
			super.resume();			
		}
	}
	
	private void restoreStandPose(CharacterActor a) {
		if(a == null) return;
		
		String fa = ((AnimationRenderer)a.getRenderer()).getCurrentAnimationId();
		
		// If the actor was already talking we restore the actor to the 'stand' pose	
		if(fa.startsWith(a.getTalkAnim())){ 		
			a.stand();
		}
	}
	
	private void startTalkAnim(CharacterActor a) {
		previousAnim = ((AnimationRenderer)a.getRenderer()).getCurrentAnimationId();
		
		a.talk();
	}

	@Override
	public void write(Json json) {
		json.writeValue("previousFA", previousAnim);
		json.writeValue("responseText", responseText);
		json.writeValue("responseSoundId", responseVoiceId);
		json.writeValue("characterTurn", characterTurn);
		json.writeValue("characterName", characterName);
		super.write(json);
	}

	@Override
	public void read (Json json, JsonValue jsonData) {
		previousAnim = json.readValue("previousFA", String.class, jsonData);
		responseText = json.readValue("responseText", String.class, jsonData);
		responseVoiceId = json.readValue("responseSoundId", String.class, jsonData);
		characterTurn = json.readValue("characterTurn", boolean.class, false, jsonData);
		characterName = json.readValue("characterName", String.class, jsonData);
		super.read(json, jsonData);
	}


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy