1cfd74d65d832137e20e193c960802afba73b5d38sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project 3cfd74d65d832137e20e193c960802afba73b5d38sm * 4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License"); 5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License. 6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at 7cfd74d65d832137e20e193c960802afba73b5d38sm * 8cfd74d65d832137e20e193c960802afba73b5d38sm * http://www.apache.org/licenses/LICENSE-2.0 9cfd74d65d832137e20e193c960802afba73b5d38sm * 10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software 11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS, 12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and 14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License. 15cfd74d65d832137e20e193c960802afba73b5d38sm */ 16cfd74d65d832137e20e193c960802afba73b5d38sm 17cfd74d65d832137e20e193c960802afba73b5d38sm 18cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland; 19cfd74d65d832137e20e193c960802afba73b5d38sm 20cfd74d65d832137e20e193c960802afba73b5d38smpublic class AttackAtDistanceComponent extends GameComponent { 21cfd74d65d832137e20e193c960802afba73b5d38sm private static final int DEFAULT_ATTACK_DISTANCE = 100; 22cfd74d65d832137e20e193c960802afba73b5d38sm private float mAttackDistance; 23cfd74d65d832137e20e193c960802afba73b5d38sm private float mAttackDelay; 24cfd74d65d832137e20e193c960802afba73b5d38sm private float mAttackLength; 25cfd74d65d832137e20e193c960802afba73b5d38sm private float mAttackStartTime; 26cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mRequireFacing; 27cfd74d65d832137e20e193c960802afba73b5d38sm private Vector2 mDistance; 28cfd74d65d832137e20e193c960802afba73b5d38sm 29cfd74d65d832137e20e193c960802afba73b5d38sm public AttackAtDistanceComponent() { 30cfd74d65d832137e20e193c960802afba73b5d38sm super(); 31cfd74d65d832137e20e193c960802afba73b5d38sm setPhase(GameComponent.ComponentPhases.THINK.ordinal()); 32cfd74d65d832137e20e193c960802afba73b5d38sm mDistance = new Vector2(); 33cfd74d65d832137e20e193c960802afba73b5d38sm reset(); 34cfd74d65d832137e20e193c960802afba73b5d38sm } 35cfd74d65d832137e20e193c960802afba73b5d38sm 36cfd74d65d832137e20e193c960802afba73b5d38sm @Override 37cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 38cfd74d65d832137e20e193c960802afba73b5d38sm mAttackDelay = 0; 39cfd74d65d832137e20e193c960802afba73b5d38sm mAttackLength = 0; 40cfd74d65d832137e20e193c960802afba73b5d38sm mAttackDistance = DEFAULT_ATTACK_DISTANCE; 41cfd74d65d832137e20e193c960802afba73b5d38sm mRequireFacing = false; 42cfd74d65d832137e20e193c960802afba73b5d38sm } 43cfd74d65d832137e20e193c960802afba73b5d38sm 44cfd74d65d832137e20e193c960802afba73b5d38sm @Override 45cfd74d65d832137e20e193c960802afba73b5d38sm public void update(float timeDelta, BaseObject parent) { 46cfd74d65d832137e20e193c960802afba73b5d38sm GameObject parentObject = (GameObject) parent; 47cfd74d65d832137e20e193c960802afba73b5d38sm 48cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectManager manager = sSystemRegistry.gameObjectManager; 49cfd74d65d832137e20e193c960802afba73b5d38sm if (manager != null) { 50cfd74d65d832137e20e193c960802afba73b5d38sm GameObject player = manager.getPlayer(); 51cfd74d65d832137e20e193c960802afba73b5d38sm if (player != null) { 52cfd74d65d832137e20e193c960802afba73b5d38sm mDistance.set(player.getPosition()); 53cfd74d65d832137e20e193c960802afba73b5d38sm mDistance.subtract(parentObject.getPosition()); 54cfd74d65d832137e20e193c960802afba73b5d38sm 55cfd74d65d832137e20e193c960802afba73b5d38sm TimeSystem time = sSystemRegistry.timeSystem; 56cfd74d65d832137e20e193c960802afba73b5d38sm final float currentTime = time.getGameTime(); 57cfd74d65d832137e20e193c960802afba73b5d38sm final boolean facingPlayer = 58cfd74d65d832137e20e193c960802afba73b5d38sm (Utils.sign(player.getPosition().x - parentObject.getPosition().x) 59cfd74d65d832137e20e193c960802afba73b5d38sm == Utils.sign(parentObject.facingDirection.x)); 60cfd74d65d832137e20e193c960802afba73b5d38sm final boolean facingDirectionCorrect = (mRequireFacing && facingPlayer) 61cfd74d65d832137e20e193c960802afba73b5d38sm || !mRequireFacing; 62cfd74d65d832137e20e193c960802afba73b5d38sm if (parentObject.getCurrentAction() == GameObject.ActionType.ATTACK) { 63cfd74d65d832137e20e193c960802afba73b5d38sm if (currentTime > mAttackStartTime + mAttackLength) { 64cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.setCurrentAction(GameObject.ActionType.IDLE); 65cfd74d65d832137e20e193c960802afba73b5d38sm } 66cfd74d65d832137e20e193c960802afba73b5d38sm } else if (mDistance.length2() < (mAttackDistance * mAttackDistance) 67cfd74d65d832137e20e193c960802afba73b5d38sm && currentTime > mAttackStartTime + mAttackLength + mAttackDelay 68cfd74d65d832137e20e193c960802afba73b5d38sm && facingDirectionCorrect) { 69cfd74d65d832137e20e193c960802afba73b5d38sm mAttackStartTime = currentTime; 70cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.setCurrentAction(GameObject.ActionType.ATTACK); 71cfd74d65d832137e20e193c960802afba73b5d38sm } else { 72cfd74d65d832137e20e193c960802afba73b5d38sm parentObject.setCurrentAction(GameObject.ActionType.IDLE); 73cfd74d65d832137e20e193c960802afba73b5d38sm } 74cfd74d65d832137e20e193c960802afba73b5d38sm } 75cfd74d65d832137e20e193c960802afba73b5d38sm } 76cfd74d65d832137e20e193c960802afba73b5d38sm 77cfd74d65d832137e20e193c960802afba73b5d38sm } 78cfd74d65d832137e20e193c960802afba73b5d38sm 79cfd74d65d832137e20e193c960802afba73b5d38sm public void setupAttack(float distance, float delay, float duration, boolean requireFacing) { 80cfd74d65d832137e20e193c960802afba73b5d38sm mAttackDistance = distance; 81cfd74d65d832137e20e193c960802afba73b5d38sm mAttackDelay = delay; 82cfd74d65d832137e20e193c960802afba73b5d38sm mAttackLength = duration; 83cfd74d65d832137e20e193c960802afba73b5d38sm mRequireFacing = requireFacing; 84cfd74d65d832137e20e193c960802afba73b5d38sm } 85cfd74d65d832137e20e193c960802afba73b5d38sm 86cfd74d65d832137e20e193c960802afba73b5d38sm 87cfd74d65d832137e20e193c960802afba73b5d38sm} 88