private ItemUseResult UseWand(bool targets_enemies,bool visible_line,Actor user,List<Tile> line,WandTargetingDelegate wand_effect) { ItemUseResult result = new ItemUseResult(true,true); if(charges == 0){ B.Add(TheName(true) + " is empty. Nothing happens. ",user); other_data = -1; result.IDed = false; return result; } TargetInfo info = null; if(user != player && line != null){ info = new TargetInfo(); info.extended_line = line; info.targeted = player.tile(); } if(!identified[type]){ targets_enemies = true; visible_line = false; } if(info == null){ info = user.GetTarget(false,12,0,!visible_line,false,targets_enemies,""); } if(info != null){ if(user != null && !user.HasLOE(info.targeted)){ foreach(Tile t in info.extended_line){ if(!t.passable){ info.targeted = t; break; } } } if(user == null || user.HasLOE(info.targeted)){ Tile LOE_tile = null; if(user != null){ LOE_tile = user.tile(); } else{ LOE_tile = info.extended_line[0]; } Tile prev = null; foreach(Tile t in info.extended_line){ if(!t.passable){ if(prev != null){ LOE_tile = prev; } break; } else{ if(t == info.targeted){ LOE_tile = t; break; } } prev = t; } wand_effect(LOE_tile,info,result); } } else{ result.used = false; } return result; }
private ItemUseResult UseOrb(int radius,bool never_target_enemies,Actor user,List<Tile> line,OrbTargetingDelegate orb_effect) { ItemUseResult result = new ItemUseResult(true,true); if(line == null){ if(!identified[type]){ radius = 0; } line = user.GetTargetTile(12,radius,false,!(never_target_enemies && identified[type])); } if(line != null){ Tile t = line.LastOrDefault(); Tile prev = line.LastBeforeSolidTile(); Actor first = null; bool trigger_trap = true; Screen.CursorVisible = false; if(user != null){ first = user.FirstActorInLine(line); B.Add(user.You("fling") + " the " + SingularName() + ". ",user); if(first != null && first != user){ trigger_trap = false; t = first.tile(); if(player.CanSee(user)){ B.Add("It shatters on " + first.the_name + "! ",first); } else{ B.Add("Something shatters on " + first.the_name + "! ",first); } first.player_visibility_duration = -1; first.attrs[AttrType.PLAYER_NOTICED]++; } else{ if(player.CanSee(user)){ B.Add("It shatters on " + t.the_name + "! ",t); } else{ B.Add("Something shatters on " + t.the_name + "! ",t); } } user.AnimateProjectile(line.ToFirstSolidTileOrActor(),'*',color); Screen.CursorVisible = false; } else{ trigger_trap = false; } Tile LOE_tile = t; if(!t.passable && prev != null){ LOE_tile = prev; } orb_effect(t,LOE_tile,result); t.MakeNoise(2); if(trigger_trap && t.IsTrap()){ t.TriggerTrap(); } if(!revealed_by_light){ result.IDed = false; } } else{ result.used = false; } return result; }