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; }