public void charge_attack(Floor fl, Weapon lance, gridCoordinate charge_coordinate, int monsterID, int DoodadID) { bool attacked_Doodad = false; bool rolled_max = false; gridCoordinate my_original_position = new gridCoordinate(my_grid_coord); Weapon c_lance = lance; VisionRay attack_ray = null; if(fl.badguy_by_monster_id(monsterID) == null) { attack_ray = new VisionRay(my_grid_coord, fl.Doodad_by_index(DoodadID).get_g_coord()); } else attack_ray = new VisionRay(my_grid_coord, charge_coordinate); gridCoordinate monster_coord = new gridCoordinate(-1, -1); gridCoordinate Doodad_coord = new gridCoordinate(-1, -1); bool done = false; while (!done) { int old_xPosition = (int)attack_ray.my_current_position.X / 32; int old_yPosition = (int)attack_ray.my_current_position.Y / 32; gridCoordinate previous_ray_position = new gridCoordinate(old_xPosition, old_yPosition); attack_ray.update(); int new_xPosition = (int)attack_ray.my_current_position.X / 32; int new_yPosition = (int)attack_ray.my_current_position.Y / 32; gridCoordinate next_ray_position = new gridCoordinate(new_xPosition, new_yPosition); int mon_ID; int dood_ID; fl.is_monster_here(next_ray_position, out mon_ID); fl.is_destroyable_Doodad_here(next_ray_position, out dood_ID); if (mon_ID == monsterID && monsterID > -1) { monster_coord = new gridCoordinate(charge_coordinate); teleport(previous_ray_position); attack_monster_in_grid(fl, lance, monsterID, charge_coordinate, 1.0, out rolled_max, true); done = true; } if (dood_ID == DoodadID && DoodadID > -1) { attacked_Doodad = true; Doodad_coord = new gridCoordinate(fl.Doodad_by_index(DoodadID).get_g_coord()); teleport(previous_ray_position); attack_Doodad_in_grid(fl, lance, DoodadID, fl.Doodad_by_index(DoodadID).get_g_coord(), 1.0, out rolled_max, true); done = true; } } gridCoordinate opposition_coord = new gridCoordinate(-1, -1); if (attacked_Doodad) opposition_coord = Doodad_coord; else opposition_coord = monster_coord; if (!is_spot_free(fl, my_grid_coord)) { int xdif = my_original_position.x - opposition_coord.x; int ydif = my_original_position.y - opposition_coord.y; int whocares = -1; if (fl.is_monster_here(my_grid_coord, out whocares) || fl.is_destroyable_Doodad_here(my_grid_coord, out whocares)) { if (xdif == 0) if (my_original_position.x < my_grid_coord.x) my_grid_coord.x--; else my_grid_coord.x++; if (ydif == 0) if (my_original_position.y < my_grid_coord.y) my_grid_coord.y--; else my_grid_coord.y++; } else if (!fl.is_monster_here(my_grid_coord, out whocares) && !fl.isWalkable(my_grid_coord)) { int xshift = 0; int yshift = 0; if (xdif < 0) xshift = -1; else xshift = 1; if (ydif < 0) yshift = -1; else yshift = 1; gridCoordinate x_shifted = new gridCoordinate(my_grid_coord.x + xshift, my_grid_coord.y); gridCoordinate y_shifted = new gridCoordinate(my_grid_coord.x, my_grid_coord.y + yshift); bool x_ok = fl.isWalkable(x_shifted); bool y_ok = fl.isWalkable(y_shifted); if (x_ok && !y_ok) my_grid_coord = x_shifted; else if (!x_ok && y_ok) my_grid_coord = y_shifted; else { int go_x = rGen.Next(2); if (go_x == 0) my_grid_coord = x_shifted; else my_grid_coord = y_shifted; } } } reset_my_drawing_position(); loot(fl); total_sound += my_sound_value() + (my_sound_value() / 2); total_scent += my_scent_value(); if (my_class == Chara_Class.Warrior) { c_energy += 5 + rGen.Next(3); if (rolled_max) c_energy += 2; } }
// Cast the vision rays that determine what is being seen. private void CastVisionRays(float rotation) { // generate array if necessary if (_visionRays == null || _visionRays.Length != visionRayCount) { _visionRays = new VisionRay[visionRayCount]; for (int i = 0; i < visionRayCount; ++i) { _visionRays[i] = new VisionRay(); } } // generate look rays float angle = rotation - fov / 2.0f; for (int i = 0; i < visionRayCount; ++i) { // create ray Vector2 dir = new Vector2(Mathf.Cos(Mathf.Deg2Rad * angle), Mathf.Sin(Mathf.Deg2Rad * angle)); Vector3 transPos = transform.position; _visionRays[i].ray.origin = new Vector2(transPos.x, transPos.y); _visionRays[i].ray.direction = dir; // cast ray _visionRays[i].hit = Physics2D.Raycast(_visionRays[i].ray.origin, _visionRays[i].ray.direction, maxDistance); // prepare for next angle += fov / visionRayCount; } }