public override void initAnim(Navi navi, ChipLogic c) { c.chip_sprite = effectAnim; c.chip_anim_frame = 0; c.frametimer = c.chipFR; current_row = navi.row; target_column = (navi.myNavi()) ? navi.column + 3 : navi.column - 3; // moves right if my navi, moves left if opponents target_column = (target_column < 0) ? 0 : target_column; target_column = (target_column > 5) ? 5 : target_column; target_top = navi.field.grid[0][target_column].gameObject.transform; target_bottom = navi.field.grid[2][target_column].gameObject.transform; //create the render object and set its position forward 3 rows c.chip_renderObj = new GameObject(); c.chip_renderObj.transform.position = navi.field.grid[current_row][target_column].gameObject.transform.position; c.chip_renderObj.AddComponent <SpriteRenderer>(); c.chip_renderObj.GetComponent <SpriteRenderer>().sortingOrder = 3; //!!!!!! NEED TO FIND SOME WAY OF ORGANIZING THESE SORTING LAYERS!!!!!! c.chip_renderObj.GetComponent <SpriteRenderer>().sprite = c.chip_sprite[c.chip_anim_frame]; // initialize values move_up = false; loop_up = true; move_speed = 1.5f; // MOVE SPEED HARD CODED duration = c.power / 2.0f; // Duration hard coded based on chip power hit_row = false; }
public override void initAnim(Navi navi, ChipLogic c) { List <Sprite> subarray = new List <Sprite>(); int start; // index of first frame in sheet switch (c.sword_size) { case 1: // sword (1x1) start = 4; break; case 2: // longsword (1x2) start = 0; break; case -1: // widesword (3x1) start = 8; break; default: // unlisted sword size: NOT A SWORD start = 0; break; } int i = 0; while (i < 4) // animation is 4 frames long { subarray.Add(effectAnim[start + i]); i++; } slash_eff = subarray.ToArray(); // load only corresponding cannon frames // prepare renderer for slash effect then deactivate until time to render slash_renderer = new GameObject(); slash_renderer.AddComponent <SpriteRenderer>(); slash_frame = 0; slash_renderer.GetComponent <SpriteRenderer>().sprite = slash_eff[slash_frame]; slash_renderer.GetComponent <SpriteRenderer>().sortingOrder = 6; //top layer, hit effect shows above auras if (!navi.myNavi()) // flip slash effect horizontally when created by opponent { slash_renderer.GetComponent <SpriteRenderer>().flipX = true; } slash_renderer.SetActive(false); hit = true; // reset hit check boolean to true until active frame of attack // take control of navi sword animation to sync animations c.chip_anim_frame = 0; c.frametimer = 2 * c.chipFR; // first frame is longer navi.rate_controlled = true; navi.swordAnim = true; navi.controlledSpriteSet(0); //sound navi.GetComponent <AudioSource>().PlayOneShot(Resources.Load <AudioClip>("Audio/s_sword")); c.interrupt = true; //sword attacks can be interrupted at any time }
public override void deactivate(Navi navi) { // !!! PLACEHOLDER FOR HANDLING PANEL CRACKING BEFORE ARCING CODE IN WRITTEN !!! int col_offset = (navi.myNavi()) ? 3 : -3; if (col + col_offset >= 0 && col + col_offset <= 5) { navi.shot_handler.check_position(power, navi.ownerIndex, stun, row, col + col_offset, elem); navi.field.grid[row][col + col_offset].state = (navi.field.grid[row][col + col_offset].occupied) ? 1 : -1; } effect.deactivate(navi, this); }
public override void OnSyncedUpdate(Navi navi, ChipLogic c) { c.frametimer -= Time.deltaTime; if (!hit) // try hit { hit = navi.shot_handler.check_sword(c.power, navi.playerNumber, c.stun , System.Math.Abs(c.sword_size), (c.sword_size < 0), c.elem); } if (c.frametimer <= 0) { c.frametimer = c.chipFR; if (c.chip_anim_frame < navi.swordSprite.Length - 1) // advance to next frame if not at end { c.chip_anim_frame++; if (c.chip_renderObj != null) // chip has a sword overlay to display { c.chip_renderObj.GetComponent <SpriteRenderer>().sprite = c.chip_sprite[c.chip_anim_frame]; } navi.controlledSpriteSet(c.chip_anim_frame); // sword effects and sword anim have same number of frames if (slash_renderer.activeInHierarchy) // animate slash effect when active { if (slash_frame < slash_eff.Length - 1) { slash_frame++; slash_renderer.GetComponent <SpriteRenderer>().sprite = slash_eff[slash_frame]; } else { slash_renderer.SetActive(false); // deactivate when animation finishes } } if (c.chip_anim_frame == 2) // attack takes place on 3rd frame { hit = false; // flag hit as false to start checking for hits // place slash effect 1 space in front of navi int target_space = (navi.myNavi()) ? navi.field_space + 1 : navi.field_space - 1; slash_renderer.transform.position = navi.field.spaces[target_space].transform.position; slash_renderer.SetActive(true); } } else // animation finished { c.deactivate(navi); } } }
public override void OnSyncedUpdate(Navi navi, ChipLogic c) { c.frametimer -= TrueSyncManager.DeltaTime.AsFloat(); if (c.frametimer <= 0) // advance frame //TODO: may need 2 frame variables for animated throw objs { c.chip_anim_frame++; c.frametimer = c.chipFR; if (c.chip_anim_frame < navi.throw_offset.Length) // throw obj still following throw anim { c.chip_renderObj.transform.position = navi.transform.position + (navi.throw_offset[c.chip_anim_frame] * navi.transform.localScale.x); } if (c.chip_anim_frame < navi.throwSprite.Length) { navi.controlledSpriteSet(c.chip_anim_frame); } else // throw animation finished { navi.throwAnim = false; navi.rate_controlled = false; } } if (c.chip_anim_frame >= navi.throw_offset.Length) // trajectory calculation { c.interrupt = false; // object has left the hand, can no longer be interrupted c.chip_renderObj.transform.SetParent(navi.field.grid[row][col].transform); //!!! WARNING BAD MATH AHEAD !!! float x = c.chip_renderObj.transform.position.x; x += (5.7f * TrueSyncManager.DeltaTime.AsFloat()) * ((navi.myNavi())?2:-2); //float x = (-0.18f + (5.5f * TrueSyncManager.DeltaTime.AsFloat())); float y = c.chip_renderObj.transform.position.y; y += (4.6f * TrueSyncManager.DeltaTime.AsFloat()) - 0.027f * Math.Abs(navi.field.grid[0][col].transform.position.x - c.chip_renderObj.transform.position.x); //c.chip_renderObj.transform.position = new Vector3(x, ((-0.112f * (x * x)) + (0.399f * x) + (navi.field.grid[navi.row][0].transform.position.y))); c.chip_renderObj.transform.position = new Vector3(x, y); if ((Math.Abs(c.chip_renderObj.transform.position.x - c.chip_renderObj.transform.parent.position.x)) >= 12) { c.deactivate(navi); } } }
public bool nextTower(Navi navi, ChipLogic c, int row, int col) { if (navi.field.grid[row][col].state < 0) // towers cannot appear on broken tiles { return(false); } GameObject tower = new GameObject(); tower.transform.position = navi.field.grid[row][col].transform.position; // position new tower on target tile //tower.transform.localScale = new Vector3(10.0f, 10.0f, 1.0f); tower.AddComponent <SpriteRenderer>(); tower.GetComponent <SpriteRenderer>().sprite = c.chip_sprite[0]; tower.GetComponent <SpriteRenderer>().sortingOrder = 1; // low sorting order !!!!! finalize later tower_renderers.Add(tower); tower_data.Add(new Tower(row, col, 0, false)); // next tower will appear above/below/in line with this tower based on opponent's position if (row > navi.shot_handler.opponent_ref(navi).row) { next_row = row - 1; } else if (row < navi.shot_handler.opponent_ref(navi).row) { next_row = row + 1; } else { next_row = row; } next_col = (navi.myNavi()) ? col + 1 : col - 1; // moves right if my navi, moves left if opponents // audio currently only available for thunder if (c.elem == ChipData.ELEC) { //navi.GetComponent<AudioSource>().PlayOneShot(Resources.Load<AudioClip>("Audio/Thunder HQ")); } return(true); // tower could be made }
public override void OnSyncedUpdate(Navi navi, ChipLogic c) { if (tower_renderers.Count == 0) // first update: add first tower { int target_column = (navi.myNavi()) ? navi.column + 1 : navi.column - 1; // moves right if my navi, moves left if opponents nextTower(navi, c, navi.row, target_column); // generate first tower in navi's row } List <int> trim = new List <int>(); // flag towers in list for destroying bool add_tower = false; // set to true when a tower hits its trigger frame and needs to create a new tower c.frametimer -= Time.deltaTime; for (int i = 0; i < tower_renderers.Count; i++) // iterate through all towers on field { Tower tower = tower_data[i]; if (!tower.hit) // no hit from tower yet, so check for hit // tests for hit and set to true if there is one so it won't check again { tower.hit = (navi.shot_handler.check_position(c.power, navi.playerNumber, c.stun, tower.row, tower.col, c.elem)); } if (c.frametimer <= 0) { if (tower.frame < c.chip_sprite.Length - 1) // advance to next frame if not at end { tower.frame++; tower_renderers[i].GetComponent <SpriteRenderer>().sprite = c.chip_sprite[tower.frame]; // next tower to be made if (tower.frame == trigger_frame) { add_tower = true; } } else // reached end of animation { trim.Add(i); // adjust later for reverse animations } } } // done iterating through towers if (c.frametimer <= 0) // frame timer needs to be reset after all towers have been iterated through to allow simultaneous animation { c.frametimer = c.chipFR; } // destroy finished towers and remove from lists foreach (int t in trim) { UnityEngine.Object.Destroy(tower_renderers[t]); tower_renderers.RemoveAt(t); tower_data.RemoveAt(t); } if (add_tower) // trigger frame hit while iterating, so a new tower must be made { if ((next_col >= 0) && (next_col <= 5)) // tower hasn't reached field's edge { nextTower(navi, c, next_row, next_col); } } if (tower_renderers.Count == 0) // all towers are finished { c.deactivate(navi); } }