I decided to go back to this problem because I am sick of the garbage work around I had to do in my custom AI to avoid it. I thought let me use map:checkLineOfSight() on top of "brain:seesParty" to make sure the monster is really supposed to see the party. And I found that checkLineOfSight() is bugged too!! And its bugged in the exact same way. This tells me that the AI must be calling the same bugged code to calculate "seesParty". So the scope of the bug is much larger than a brain issue, it is in the map object itself. It is EASILY repeatable and clearly broken.
Below is a Dungeon.lua for the most simple dungeon you can get. A room, split in half by "castle_door_wood" objects. NOTE: castle_door_wood is not sparse. Just call door:getSparse() on one of them if you want to be sure. It returns false.
The party starts at (15, 19), against the line of doors and this is KEY. It seems to happen with squares next to doors. I set another square, (16, 13) as my target for the test. All you have to do is follow the row of pressure plates going north. Each calls map:checkLineOfSight(x, y, 16, 13, 0), where x and y is the current plate you just stepped on. You will see the following:
15, 18: true
15, 17: false
15, 16: true
15, 15: false
..... etc... all the way to 15,10
Why on earth would a call to determine whether you can "see" a square alternate true and false as you walk along the exact same line of doors. If this not the definition of bugged than I don't what is.
I feel a level of frustration for having reported this bug numerous times and have gotten no confirmation of it. Granted I did not realize it was actually on such a core object as "map". Perhaps now it will get the attention it needs.
Can I ask a favor of members of the modding community? Please download the below dungeon and confirm this. The more people that do, the better chance it will get fixed. For anybody doing custom AI or even anything where you have to check line of sight, it is an awful bug.
Can Pretri or someone at AH please look into this? Trying out the dungeon below should certainly show the problem.
Code: Select all
-- This file has been generated by Dungeon Editor 2.2.4
--- level 1 ---
newMap{
name = "Unnamed",
width = 32,
height = 32,
levelCoord = {0,0,0},
ambientTrack = "dungeon",
tiles = {
"dungeon_floor",
"dungeon_wall",
}
}
loadLayer("tiles", {
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
})
spawn("starting_location",15,19,0,0,"starting_location")
spawn("torch_holder",11,15,3,0,"torch_holder_1")
torch_holder_1.controller:setHasTorch(true)
spawn("torch_holder",19,15,1,0,"torch_holder_2")
torch_holder_2.controller:setHasTorch(true)
spawn("torch_holder",12,20,2,0,"torch_holder_3")
torch_holder_3.controller:setHasTorch(true)
spawn("torch_holder",17,20,2,0,"torch_holder_4")
torch_holder_4.controller:setHasTorch(true)
spawn("torch_holder",12,10,0,0,"torch_holder_5")
torch_holder_5.controller:setHasTorch(true)
spawn("torch_holder",17,10,0,0,"torch_holder_6")
torch_holder_6.controller:setHasTorch(true)
spawn("castle_door_wood",16,20,3,0,"castle_door_wood_1")
spawn("castle_door_wood",16,19,3,0,"castle_door_wood_2")
spawn("castle_door_wood",16,18,3,0,"castle_door_wood_3")
spawn("castle_door_wood",16,17,3,0,"castle_door_wood_4")
spawn("castle_door_wood",16,16,3,0,"castle_door_wood_5")
spawn("castle_door_wood",16,15,3,0,"castle_door_wood_6")
spawn("castle_door_wood",16,14,3,0,"castle_door_wood_7")
spawn("castle_door_wood",15,13,1,0,"castle_door_wood_8")
spawn("castle_door_wood",15,12,1,0,"castle_door_wood_9")
spawn("castle_door_wood",15,11,1,0,"castle_door_wood_10")
spawn("castle_door_wood",16,10,3,0,"castle_door_wood_11")
spawn("spider_eggs_broken",16,13,0,0,"spider_eggs_broken_1")
spawn("dungeon_pressure_plate",15,18,3,0,"dungeon_pressure_plate_1")
dungeon_pressure_plate_1.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_1.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_1.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_1.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_1.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_1.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")
spawn("dungeon_pressure_plate",15,17,3,0,"dungeon_pressure_plate_2")
dungeon_pressure_plate_2.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_2.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_2.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_2.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_2.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_2.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")
spawn("dungeon_pressure_plate",15,16,3,0,"dungeon_pressure_plate_3")
dungeon_pressure_plate_3.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_3.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_3.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_3.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_3.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_3.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")
spawn("dungeon_pressure_plate",15,15,2,0,"dungeon_pressure_plate_4")
dungeon_pressure_plate_4.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_4.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_4.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_4.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_4.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_4.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")
spawn("script_entity",0,0,0,0,"script_entity_1")
script_entity_1.script:setSource("function plateActivate(ft)\
\9local b = party.map:checkLineOfSight(ft.go.x, ft.go.y, 16, 13, 0)\
\9print(\"Plate: (\"..ft.go.x..\", \"..ft.go.y..\"), to (16,13), lineOfSight=\"..tostring(b))\9\
end")
spawn("dungeon_pressure_plate",15,14,2,0,"dungeon_pressure_plate_5")
dungeon_pressure_plate_5.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_5.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_5.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_5.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_5.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_5.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")
spawn("dungeon_pressure_plate",15,13,1,0,"dungeon_pressure_plate_6")
dungeon_pressure_plate_6.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_6.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_6.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_6.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_6.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_6.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")
spawn("dungeon_pressure_plate",15,12,3,0,"dungeon_pressure_plate_7")
dungeon_pressure_plate_7.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_7.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_7.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_7.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_7.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_7.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")
spawn("dungeon_pressure_plate",15,11,2,0,"dungeon_pressure_plate_8")
dungeon_pressure_plate_8.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_8.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_8.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_8.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_8.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_8.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")
spawn("dungeon_pressure_plate",15,10,2,0,"dungeon_pressure_plate_9")
dungeon_pressure_plate_9.floortrigger:setTriggeredByParty(true)
dungeon_pressure_plate_9.floortrigger:setTriggeredByMonster(true)
dungeon_pressure_plate_9.floortrigger:setTriggeredByItem(true)
dungeon_pressure_plate_9.floortrigger:setTriggeredByDigging(false)
dungeon_pressure_plate_9.floortrigger:setDisableSelf(false)
dungeon_pressure_plate_9.floortrigger:addConnector("onActivate", "script_entity_1", "plateActivate")