예제 #1
0
 public int GetDangerRating(Tile t)
 {
     //0 is no danger. 1 is minor danger, often ignored in favor of chasing the player. 2 is major danger, always avoided.
     if(HasAttr(AttrType.MINDLESS) || (type == ActorType.BERSERKER && HasAttr(AttrType.COOLDOWN_2)) || type == ActorType.FINAL_LEVEL_CULTIST){
         return 0;
     }
     int dr = attrs[AttrType.DAMAGE_RESISTANCE];
     int result = 0;
     if(HasAttr(AttrType.HUMANOID_INTELLIGENCE)){
         if(!HasAttr(AttrType.NONLIVING,AttrType.PLANTLIKE)){
             if(t.Is(FeatureType.CONFUSION_GAS) && !HasAttr(AttrType.MENTAL_IMMUNITY)){
                 return 2;
             }
             if(t.Is(FeatureType.SPORES) && (!HasAttr(AttrType.MENTAL_IMMUNITY) || dr < 2)){
                 if(HasAttr(AttrType.MENTAL_IMMUNITY,AttrType.STUNNED) && (HasAttr(AttrType.POISONED) || dr > 0)){
                     result = 1;
                 }
                 else{
                     return 2;
                 }
             }
             if(t.Is(FeatureType.POISON_GAS) && type != ActorType.NOXIOUS_WORM && dr < 2){
                 if(HasAttr(AttrType.POISONED) || dr > 0){
                     result = 1;
                 }
                 else{
                     return 2;
                 }
             }
             /*if(t.Is(TileType.POPPY_FIELD) && !HasAttr(AttrType.MAGICAL_DROWSINESS,AttrType.MENTAL_IMMUNITY)){ //todo
                 int counter = attrs[AttrType.POPPY_COUNTER] + M.poppy_distance_map[t.p]; //todo: check for valid dijkstra int here?
                 if(counter > 3){
                     return 2;
                 }
                 if(counter > 1){
                     result = 1;
                 }
             }*/
             if(t.Is(TileType.POPPY_FIELD) && !HasAttr(AttrType.MENTAL_IMMUNITY)){
                 if(M.poppy_distance_map[t.p] == 1){ //the outermost layer is considered less dangerous
                     if(attrs[AttrType.POPPY_COUNTER] >= 3){
                         return 2;
                     }
                     else{
                         if(this != player){
                             //result = 1;
                         }
                         //result = 1;
                     }
                 }
                 else{
                     if(M.poppy_distance_map[t.p].IsValidDijkstraValue()){
                         if(attrs[AttrType.POPPY_COUNTER] >= 2){
                             return 2;
                         }
                         else{
                             if(this != player){
                                 result = 1;
                             }
                             //result = 1;
                         }
                     }
                 }
             }
         }
         if(t.Is(FeatureType.THICK_DUST) && !HasAttr(AttrType.BLINDSIGHT,AttrType.PLANTLIKE)){
             return 2;
         }
         foreach(Tile neighbor in t.TilesWithinDistance(1)){
             if(neighbor.Is(FeatureType.GRENADE)){
                 return 2;
             }
         }
     }
     if(!HasAttr(AttrType.IMMUNE_FIRE) && dr < 3){
         bool might_catch = false;
         int searing_tiles = 0;
         bool currently_flammable = (t.IsCurrentlyFlammable() || HasAttr(AttrType.OIL_COVERED)) && HasAttr(AttrType.HUMANOID_INTELLIGENCE);
         foreach(Tile neighbor in t.TilesWithinDistance(1)){
             if(neighbor.IsBurning()){
                 searing_tiles++;
                 if(currently_flammable){
                     might_catch = true;
                 }
             }
         }
         if(dr == 0){
             if(searing_tiles > 3){
                 return 2;
             }
             else{
                 if(searing_tiles > 0){
                     if(type == ActorType.ALASI_SCOUT && curhp == maxhp){
                         return 2;
                     }
                     result = 1;
                 }
             }
         }
         if((might_catch || t.IsBurning()) && !HasAttr(AttrType.IMMUNE_BURNING)){
             if(dr == 2){
                 result = 1;
             }
             else{
                 return 2;
             }
         }
     }
     return result;
 }