// Constructor that takes one argument. public command(int gvn_action, bool gvn_onUnit, Vector2 gvn_mousePosition, unitController gvn_unit) { action = gvn_action; onUnit = gvn_onUnit; mousePosition = gvn_mousePosition; unit = gvn_unit; }
public override void perform(int action, bool onUnit, Vector2 mousePosition, unitController unit){ if(action == 1){ aggroOn = false; holdingPos = false; idle = false; isMoving = true; attackTarget = null; isDuringAttack = false; if(onUnit == true){ aggroOn = true; followUnit = unit.transform; } else { followUnit = null; targetLocation = mousePosition; } } else if(action == 2){ aggroOn = true; holdingPos = false; idle = false; isMoving = true; if(onUnit == true){ followUnit = unit.transform; } else { followUnit = null; targetLocation = mousePosition; } } }
//initialization void Start () { isCasting = false; units = new unitController[sizeLimit]; castingUnits = new unitController[sizeLimit]; unitsSize = 0; castingUnitsSize = 0; draggingActive = false; actionSelected = 1; }
//performs an action public override void perform(int action, bool onUnit, Vector2 mousePosition, unitController unit){ if(action == 1){ if(onUnit){ targetUnit = unit.transform; } else { targetUnit = null; } targetLocation = mousePosition; } }
private void saveCommand(int index, int action, bool onUnit, Vector2 mousePosition, unitController unit){ if(index < commandQueueSize) commandQueue[index] = new command(action, onUnit, mousePosition, unit); }
public virtual void perform(int action, bool onUnit, Vector2 mousePosition, unitController unit){ }
void Update() { //dragging the map if(Input.GetKeyDown(Drag)){ mouseInitialPosisiton = Input.mousePosition; oldCamPostion = transform.position; return; } else if(Input.GetKey(Drag)){ Vector2 difference = (Vector2)Input.mousePosition - mouseInitialPosisiton; transform.position = Vector3.Lerp(transform.position, oldCamPostion - (Vector3)difference * dragSpeed * getScaledDraggingSpeed(), Time.deltaTime * 50f); return; } else if(Input.GetKeyUp(Drag)){ return; } //moving map using screen edges if(Input.mousePosition.y > Camera.main.pixelHeight - 4){ transform.position += Vector3.up * Time.deltaTime * scrollSpeed * getScaledDraggingSpeed(); } else if(Input.mousePosition.y < 4){ transform.position -= Vector3.up * Time.deltaTime * scrollSpeed * getScaledDraggingSpeed(); } if(Input.mousePosition.x > Camera.main.pixelWidth - 4){ transform.position += Vector3.right * Time.deltaTime * scrollSpeed * getScaledDraggingSpeed(); } else if(Input.mousePosition.x < 4){ transform.position -= Vector3.right * Time.deltaTime * scrollSpeed * getScaledDraggingSpeed(); } //Scroll Wheel Operations (needs updateing to redefinable keys) transform.position = transform.position + Vector3.forward * transform.position.z * (Input.GetAxis("Mouse ScrollWheel")); if(transform.position.z < -120){ transform.position = transform.position - Vector3.forward * (transform.position.z + 120); } else if(transform.position.z > -15){ transform.position = transform.position - Vector3.forward * (transform.position.z + 15); } //converts mouse position into map position Ray test = Camera.main.ScreenPointToRay(Input.mousePosition); float zDistance = transform.position.z/test.direction.z * -1; Debug.DrawRay(test.origin, test.direction * zDistance, Color.red); Vector3 point = test.origin + test.direction * zDistance; Vector2 mousePosition = new Vector2(); mousePosition.x = point.x; mousePosition.y = point.y; //performs dragging selection if(determineDragging(mousePosition)) return; //Highlights units below the mouse Collider2D unitBelowCollider = Physics2D.OverlapPoint(mousePosition, unitsLayer); if(unitBelowCollider != null) unitBelowCollider.gameObject.GetComponent<unitController>().highlightUnit(); //Waits to cast an action if(isCasting == true && !Input.GetKeyUp(Cancel)){ if(Input.GetKeyUp(Activate)){ //Uses special moving algorithm to avoid collisions (if the distance moving is big move units keeping their relative position to eachother) if(actionSelected == 2){ if(unitBelowCollider == null){ Instantiate(attackActionOnMap, (Vector3)mousePosition, Quaternion.Euler(0,0,0)); if(unitsSize != 0){ float max_x = units[0].gameObject.transform.position.x; float max_y = units[0].gameObject.transform.position.y; float min_x = units[0].gameObject.transform.position.x; float min_y = units[0].gameObject.transform.position.y; for(int i = 1; i < unitsSize; i++){ if(max_x < units[i].gameObject.transform.position.x){ max_x = units[i].gameObject.transform.position.x; } if(min_x > units[i].gameObject.transform.position.x){ min_x = units[i].gameObject.transform.position.x; } if(max_y < units[i].gameObject.transform.position.y){ max_y = units[i].gameObject.transform.position.y; } if(min_y > units[i].gameObject.transform.position.y){ min_y = units[i].gameObject.transform.position.y; } } Vector2 groupPos = new Vector2((max_x + min_x)/2, (max_y + min_y)/2); Vector2 moveVec = mousePosition - groupPos; float sizeOfGroup = new Vector2(max_x - min_x, max_y - min_y).magnitude; //moves normally if((mousePosition - groupPos).magnitude < sizeOfGroup){ for(int i = 0; i < unitsSize; i++){ units[i].perform(2, false, mousePosition, null); } //moves parallel } else { for(int i = 0; i < unitsSize; i++){ units[i].perform(2, false, (Vector2)units[i].gameObject.transform.position + moveVec, null); } } } } else { unitBelowCollider.gameObject.GetComponent<unitController>().activate(); for(int i = 0; i < unitsSize; i++){ units[i].perform(2, true, mousePosition, unitBelowCollider.gameObject.GetComponent<unitController>()); } } } else { unitController unitBelow = null; bool onUnit = false; if(unitBelowCollider != null){ unitBelow = unitBelowCollider.gameObject.GetComponent<unitController>(); unitBelow.activate(); onUnit = true; } Instantiate(attackActionOnMap, (Vector3)mousePosition, Quaternion.Euler(0,0,0)); for(int i = 0; i < castingUnitsSize; i++){ castingUnits[i].perform(actionSelected, onUnit, mousePosition, unitBelow); } } isCasting = false; } //General Actions } else { //Pressing Select if(Input.GetKeyUp(Select)){ if(unitBelowCollider != null){ if(Input.GetKey(Shift)){ if(Input.GetKey(Control)){ //todo } else { unitController unit = unitBelowCollider.gameObject.GetComponent<unitController>(); if(unitAlreadyHeld(unit)){ removeUnit(unit); } else { addUnit(unit); } } } else { removeUnits(); addUnit(unitBelowCollider.gameObject.GetComponent<unitController>()); } } //Pressing Move } else if(Input.GetKeyUp(Move)){ if(unitBelowCollider == null){ Instantiate(actionOnMap, (Vector3)mousePosition, Quaternion.Euler(0,0,0)); //Uses special moving algorithm to avoid collisions (if the distance moving is big move units keeping their relative position to eachother) //determines if distance is big if(unitsSize != 0){ float max_x = units[0].gameObject.transform.position.x; float max_y = units[0].gameObject.transform.position.y; float min_x = units[0].gameObject.transform.position.x; float min_y = units[0].gameObject.transform.position.y; for(int i = 1; i < unitsSize; i++){ if(max_x < units[i].gameObject.transform.position.x){ max_x = units[i].gameObject.transform.position.x; } if(min_x > units[i].gameObject.transform.position.x){ min_x = units[i].gameObject.transform.position.x; } if(max_y < units[i].gameObject.transform.position.y){ max_y = units[i].gameObject.transform.position.y; } if(min_y > units[i].gameObject.transform.position.y){ min_y = units[i].gameObject.transform.position.y; } } Vector2 groupPos = new Vector2((max_x + min_x)/2, (max_y + min_y)/2); Vector2 moveVec = mousePosition - groupPos; float sizeOfGroup = new Vector2(max_x - min_x, max_y - min_y).magnitude; //moves normally if((mousePosition - groupPos).magnitude < sizeOfGroup){ for(int i = 0; i < unitsSize; i++){ units[i].perform(1, false, mousePosition, null); } //moves parallel } else { for(int i = 0; i < unitsSize; i++){ units[i].perform(1, false, (Vector2)units[i].gameObject.transform.position + moveVec, null); } } } } else { unitBelowCollider.gameObject.GetComponent<unitController>().activate(); for(int i = 0; i < unitsSize; i++){ units[i].perform(1, true, mousePosition, unitBelowCollider.gameObject.GetComponent<unitController>()); } } //Pressing Attack } else if(Input.GetKeyUp(Attack)){ setAction(2); } else if(Input.GetKeyUp(Function1)){ setAction(3); } else if(Input.GetKeyUp(Function2)){ setAction(4); } else if(Input.GetKeyUp(Function3)){ setAction(5); } else if(Input.GetKeyUp(Function4)){ setAction(6); } else if(Input.GetKeyUp(Function5)){ setAction(7); } else if(Input.GetKeyUp(Function6)){ setAction(8); } else if(Input.GetKeyUp(Function7)){ setAction(9); } else if(Input.GetKeyUp(Function8)){ setAction(10); } else if(Input.GetKeyUp(HoldPosition)){ setAction(11); } } }
//removes a unit from control public void removeUnit(unitController unit){ for(int i = 0; i < unitsSize; i++){ if(units[i] == unit){ units[i].deselect(); for(int j = i + 1; j < unitsSize; j++) units[j - 1] = units[j]; unitsSize--; break; } } }
//checks if unit is already under control bool unitAlreadyHeld(unitController unit){ for(int i = 0; i < unitsSize; i++){ if(units[i] == unit){ return true; } } return false; }
//adds a unit to controlled units bool addUnit(unitController unit){ if(unitsSize == sizeLimit) return true; if(unitAlreadyHeld(unit)) return false; unit.showSelected(); units[unitsSize] = unit; unitsSize++; return false; }