Anonymous | Login | 2024-10-05 15:01 UTC |
My View | View Issues | Change Log | Roadmap |
View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | ||||||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | ||||||||
0003117 | VCMI | AI - Adventure Map | public | 2020-04-26 13:43 | 2020-05-01 03:35 | ||||||||
Reporter | moog | ||||||||||||
Assigned To | Shalthrea | ||||||||||||
Priority | normal | Severity | crash | Reproducibility | always | ||||||||
Status | resolved | Resolution | fixed | ||||||||||
Platform | amd64 | OS | Linux | OS Version | Gentoo Linux | ||||||||
Product Version | 0.99 | ||||||||||||
Target Version | Fixed in Version | 1.next | |||||||||||
Summary | 0003117: Game crashes during AI turn | ||||||||||||
Description | Game may randomly crash during AI turn for no apparent reason. I have managed to get a save state where it is always possible to reproduce this issue. | ||||||||||||
Steps To Reproduce | 1. Load the included savestate. 2. Have Solmyr collect the sulphur, treasure chest, recruit gargoyles and collect crystals - in that particular order. 3. Have the other hero build a ship in the nearby stockyard and board the new ship. 4. Build sculptor's wings in the first city. 5. End turn. | ||||||||||||
Additional Information | This issue is reproducible in git commits: - dca5d86e7a6d18d2ddac7258f98a0ce08c691a6e (branch develop, March 14 2020) - 55b54024a82aaad3b4572d674d424c2247a47930 (branch develop, March 18 2020) | ||||||||||||
Tags | No tags attached. | ||||||||||||
Attached Files | bad_save.tar.xz [^] (368,568 bytes) 2020-04-26 13:43 gdb.txt [^] (461,549 bytes) 2020-04-26 13:45 [Show Content] [Hide Content] mdec@Leela /tmp/gentoo/dev-lang/rust $ gdb vcmiclient GNU gdb (Gentoo 9.1 vanilla) 9.1 Copyright (C) 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <https://bugs.gentoo.org/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from vcmiclient... Reading symbols from /usr/lib64/debug//usr/bin/vcmiclient.debug... (gdb) set environment LD_LIBRARY_PATH=/usr/lib/vcmi (gdb) start Temporary breakpoint 1 at 0xed400: file /usr/src/debug/games-strategy/vcmi-0.99_p202003180006070300/vcmi-0.99_p202003180006070300/client/CMT.cpp, line 164. Starting program: /usr/bin/vcmiclient [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib64/libthread_db.so.1". Temporary breakpoint 1, main (argc=1, argv=0x7fffffffd9e8) at /usr/src/debug/games-strategy/vcmi-0.99_p202003180006070300/vcmi-0.99_p202003180006070300/client/CMT.cpp:164 164 { (gdb) continue Continuing. Starting... [New Thread 0x7fffee97d700 (LWP 26706)] VCMI 0.99 GITDIR-NOTFOUND (client) Creating console and configuring logger: 3 ms The log file will be saved to "/home/mdec/.cache/vcmi/VCMI_Client_log.txt" Initialization: 1 ms Data loading: 33 ms Mod handler: 0 ms Mod filesystems: 10 ms Basic initialization: 44 ms Initialized logging system based on settings successfully. [log level] ai => not set [log level] animation => not set [log level] bonus => not set [log level] global => trace [log level] mod => not set [log level] network => not set Error: campaign movies was not found! Error: campaign music was not found! Loading settings: 46 ms Called SDL_Init(100031) Called SDL_InitSubSystem(100031) [New Thread 0x7fffedaaa700 (LWP 26707)] Called SDL_InitSubSystem(4000) [New Thread 0x7fffe46fc700 (LWP 26736)] [New Thread 0x7fffe3dba700 (LWP 26737)] [New Thread 0x7fffe35b9700 (LWP 26738)] [New Thread 0x7fffe2db8700 (LWP 26739)] [New Thread 0x7fffe25b7700 (LWP 26740)] [New Thread 0x7fffe1db6700 (LWP 26741)] [New Thread 0x7fffe15b5700 (LWP 26742)] [New Thread 0x7fffe0db4700 (LWP 26743)] [New Thread 0x7fffc3fff700 (LWP 26744)] [New Thread 0x7fffc37fe700 (LWP 26745)] [New Thread 0x7fffc2ffd700 (LWP 26746)] [New Thread 0x7fffc27fc700 (LWP 26747)] [New Thread 0x7fffc1ffb700 (LWP 26748)] [New Thread 0x7fffc17fa700 (LWP 26749)] [New Thread 0x7fffc0ff9700 (LWP 26750)] [New Thread 0x7fff9ffff700 (LWP 26751)] [New Thread 0x7fff97fff700 (LWP 26752)] [New Thread 0x7fff9f7fe700 (LWP 26753)] [New Thread 0x7fff9effd700 (LWP 26754)] [New Thread 0x7fff9e7fc700 (LWP 26755)] [New Thread 0x7fff9dffb700 (LWP 26756)] [New Thread 0x7fff9d7fa700 (LWP 26757)] [New Thread 0x7fff9cff9700 (LWP 26758)] [Thread 0x7fff9cff9700 (LWP 26758) exited] [New Thread 0x7fff9cff9700 (LWP 26759)] [Thread 0x7fff9cff9700 (LWP 26759) exited] [New Thread 0x7fffed2a6700 (LWP 26760)] Found 3 render drivers opengl (active) opengles2 software Check display mode: requested 800 x 600; available up to 1920 x 1080 [New Thread 0x7fff9cff9700 (LWP 26761)] [Thread 0x7fff9cff9700 (LWP 26761) exited] [New Thread 0x7fff9cff9700 (LWP 26762)] Created renderer opengl Initializing screen: 129 ms Initializing video: 0 ms [New Thread 0x7fff977fe700 (LWP 26763)] Initializing screen and sound handling: 2 ms [New Thread 0x7fff96ffd700 (LWP 26764)] Bonus type handler: 2 ms General text handler: 10 ms Hero handler: 2 ms Artifact handler: 0 ms Creature handler: 0 ms Town handler: 0 ms Object handler: 0 ms Object types information handler: 0 ms Spell handler: 0 ms Skill handler: 0 ms Terrain view pattern handler: 0 ms Template handler: 0 ms Initializing handlers: 16 ms Initializing content handler: 0 ms [2a962868]Original game files [3b0870a8]VCMI essential files Parsing mod data: 89 ms no original data in loadMod(neutral) at index 9 [SKIP] Original game files [SKIP] VCMI essential files Loading mod data: 57 ms Resolving identifiers: 7 ms No templates found for 38:1 No templates found for 49:1 No templates found for 79:7 No templates found for 90:1 No templates found for 100:1 No templates found for 103:1 No templates found for 113:1 No templates found for 172:0 No templates found for 186:0 No templates found for 189:0 Handlers post-load finalization: 10 ms All game content loaded in 166 ms Initializing VCMI_Lib: 183 ms [Thread 0x7fff96ffd700 (LWP 26764) exited] Screen handler: 3 ms Main graphics: 81 ms Message handler: 0 ms Initialization of VCMI (together): 477 ms [New Thread 0x7fff96ffd700 (LWP 26765)] [New Thread 0x7fff965fc700 (LWP 26766)] [Detaching after vfork from child process 26767] no original data in loadMod(neutral) at index 9 No templates found for 38:1 No templates found for 49:1 No templates found for 79:7 No templates found for 90:1 No templates found for 100:1 No templates found for 103:1 No templates found for 113:1 No templates found for 172:0 No templates found for 186:0 No templates found for 189:0 Establishing connection... Found endpoints: 0:127.0.0.1:35959 Trying connection to 127.0.0.1:35959(0) Established connection with VCMI 0.99 GITDIR-NOTFOUND (server). UUID: 1f861192-f9a7-48c2-980a-237b240af804 [New Thread 0x7fff95dfb700 (LWP 26771)] [Thread 0x7fff96ffd700 (LWP 26765) exited] [New Thread 0x7fff96ffd700 (LWP 26772)] Loading procedure started! Loading lib part of game... Reading header Reading options Reading handlers Desync found! Position: 114641 Reading gamestate Preparing FoW, terrain, roads, rivers, borders: 31 ms Making object rects: 109 ms Opening VCAI Loaded VCAI Engine: InputVariable: OurShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurSpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: EnemySpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: CastleWalls enabled: true range: 0.000 3.000 lock-range: false term: NONE Rectangle 0.000 0.500 term: MEDIUM Trapezoid 0.500 1.000 2.000 2.500 term: HIGH Ramp 1.900 3.000 InputVariable: Bank enabled: true range: 0.000 1.000 lock-range: false term: FALSE Rectangle 0.000 0.500 term: TRUE Rectangle 0.500 1.000 OutputVariable: Threat enabled: true range: 0.500 1.500 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 1.000 0.500 term: MEDIUM Triangle 0.800 1.000 1.200 term: HIGH Ramp 1.000 1.500 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if OurShooters is MANY and EnemySpeed is LOW then Threat is LOW rule: if OurShooters is MANY and EnemyShooters is FEW then Threat is LOW rule: if OurSpeed is LOW and EnemyShooters is MANY then Threat is HIGH rule: if OurSpeed is HIGH and EnemyShooters is MANY then Threat is LOW rule: if OurWalkers is FEW and EnemyShooters is MANY then Threat is LOW rule: if OurShooters is MANY and EnemySpeed is HIGH then Threat is HIGH rule: if OurShooters is FEW and EnemySpeed is HIGH then Threat is MEDIUM rule: if EnemySpeed is MEDIUM then Threat is MEDIUM rule: if EnemySpeed is LOW and OurShooters is FEW then Threat is MEDIUM rule: if Bank is TRUE and OurShooters is MANY then Threat is HIGH rule: if Bank is TRUE and EnemyShooters is MANY then Threat is LOW rule: if CastleWalls is HIGH and OurWalkers is MANY then Threat is HIGH rule: if CastleWalls is HIGH and OurFlyers is MANY and OurShooters is MANY then Threat is MEDIUM rule: if CastleWalls is MEDIUM and OurShooters is MANY and EnemyWalkers is MANY then Threat is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 InputVariable: objectValue enabled: true range: 0.000 20000.000 lock-range: false term: LOW Ramp 3500.000 0.000 term: MEDIUM Triangle 0.000 4250.000 8500.000 term: HIGH Discrete 5000.000 0.000 10000.000 0.750 20000.000 1.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW rule: if objectValue is HIGH then Value is HIGH rule: if objectValue is MEDIUM then Value is MEDIUM rule: if objectValue is LOW then Value is LOW Opening VCAI Loaded VCAI Opening VCAI Loaded VCAI Opening StupidAI Loaded Stupid AI 0.1 [Thread 0x7fff96ffd700 (LWP 26772) exited] [New Thread 0x7fff96ffd700 (LWP 26774)] [Thread 0x7fff96ffd700 (LWP 26774) exited] [New Thread 0x7fff96ffd700 (LWP 26775)] [Thread 0x7fff96ffd700 (LWP 26775) exited] [New Thread 0x7fff96ffd700 (LWP 26780)] [Thread 0x7fff96ffd700 (LWP 26780) exited] [New Thread 0x7fff96ffd700 (LWP 26784)] [Thread 0x7fff96ffd700 (LWP 26784) exited] [New Thread 0x7fff96ffd700 (LWP 26786)] [Thread 0x7fff96ffd700 (LWP 26786) exited] [New Thread 0x7fff96ffd700 (LWP 26788)] [Thread 0x7fff96ffd700 (LWP 26788) exited] [New Thread 0x7fff96ffd700 (LWP 26790)] [Thread 0x7fff96ffd700 (LWP 26790) exited] [New Thread 0x7fff96ffd700 (LWP 26795)] Player 2 (tan) starting turn, day 15 Engine: InputVariable: OurShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurSpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: EnemySpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: CastleWalls enabled: true range: 0.000 3.000 lock-range: false term: NONE Rectangle 0.000 0.500 term: MEDIUM Trapezoid 0.500 1.000 2.000 2.500 term: HIGH Ramp 1.900 3.000 InputVariable: Bank enabled: true range: 0.000 1.000 lock-range: false term: FALSE Rectangle 0.000 0.500 term: TRUE Rectangle 0.500 1.000 OutputVariable: Threat enabled: true range: 0.500 1.500 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 1.000 0.500 term: MEDIUM Triangle 0.800 1.000 1.200 term: HIGH Ramp 1.000 1.500 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if OurShooters is MANY and EnemySpeed is LOW then Threat is LOW rule: if OurShooters is MANY and EnemyShooters is FEW then Threat is LOW rule: if OurSpeed is LOW and EnemyShooters is MANY then Threat is HIGH rule: if OurSpeed is HIGH and EnemyShooters is MANY then Threat is LOW rule: if OurWalkers is FEW and EnemyShooters is MANY then Threat is LOW rule: if OurShooters is MANY and EnemySpeed is HIGH then Threat is HIGH rule: if OurShooters is FEW and EnemySpeed is HIGH then Threat is MEDIUM rule: if EnemySpeed is MEDIUM then Threat is MEDIUM rule: if EnemySpeed is LOW and OurShooters is FEW then Threat is MEDIUM rule: if Bank is TRUE and OurShooters is MANY then Threat is HIGH rule: if Bank is TRUE and EnemyShooters is MANY then Threat is LOW rule: if CastleWalls is HIGH and OurWalkers is MANY then Threat is HIGH rule: if CastleWalls is HIGH and OurFlyers is MANY and OurShooters is MANY then Threat is MEDIUM rule: if CastleWalls is MEDIUM and OurShooters is MANY and EnemyWalkers is MANY then Threat is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 InputVariable: objectValue enabled: true range: 0.000 20000.000 lock-range: false term: LOW Ramp 3500.000 0.000 term: MEDIUM Triangle 0.000 4250.000 8500.000 term: HIGH Discrete 5000.000 0.000 10000.000 0.750 20000.000 1.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW rule: if objectValue is HIGH then Value is HIGH rule: if objectValue is MEDIUM then Value is MEDIUM rule: if objectValue is LOW then Value is LOW Engine: InputVariable: OurShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurSpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: EnemySpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: CastleWalls enabled: true range: 0.000 3.000 lock-range: false term: NONE Rectangle 0.000 0.500 term: MEDIUM Trapezoid 0.500 1.000 2.000 2.500 term: HIGH Ramp 1.900 3.000 InputVariable: Bank enabled: true range: 0.000 1.000 lock-range: false term: FALSE Rectangle 0.000 0.500 term: TRUE Rectangle 0.500 1.000 OutputVariable: Threat enabled: true range: 0.500 1.500 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 1.000 0.500 term: MEDIUM Triangle 0.800 1.000 1.200 term: HIGH Ramp 1.000 1.500 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if OurShooters is MANY and EnemySpeed is LOW then Threat is LOW rule: if OurShooters is MANY and EnemyShooters is FEW then Threat is LOW rule: if OurSpeed is LOW and EnemyShooters is MANY then Threat is HIGH rule: if OurSpeed is HIGH and EnemyShooters is MANY then Threat is LOW rule: if OurWalkers is FEW and EnemyShooters is MANY then Threat is LOW rule: if OurShooters is MANY and EnemySpeed is HIGH then Threat is HIGH rule: if OurShooters is FEW and EnemySpeed is HIGH then Threat is MEDIUM rule: if EnemySpeed is MEDIUM then Threat is MEDIUM rule: if EnemySpeed is LOW and OurShooters is FEW then Threat is MEDIUM rule: if Bank is TRUE and OurShooters is MANY then Threat is HIGH rule: if Bank is TRUE and EnemyShooters is MANY then Threat is LOW rule: if CastleWalls is HIGH and OurWalkers is MANY then Threat is HIGH rule: if CastleWalls is HIGH and OurFlyers is MANY and OurShooters is MANY then Threat is MEDIUM rule: if CastleWalls is MEDIUM and OurShooters is MANY and EnemyWalkers is MANY then Threat is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 InputVariable: objectValue enabled: true range: 0.000 20000.000 lock-range: false term: LOW Ramp 3500.000 0.000 term: MEDIUM Triangle 0.000 4250.000 8500.000 term: HIGH Discrete 5000.000 0.000 10000.000 0.750 20000.000 1.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW rule: if objectValue is HIGH then Value is HIGH rule: if objectValue is MEDIUM then Value is MEDIUM rule: if objectValue is LOW then Value is LOW Engine: InputVariable: OurShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurSpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: EnemySpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: CastleWalls enabled: true range: 0.000 3.000 lock-range: false term: NONE Rectangle 0.000 0.500 term: MEDIUM Trapezoid 0.500 1.000 2.000 2.500 term: HIGH Ramp 1.900 3.000 InputVariable: Bank enabled: true range: 0.000 1.000 lock-range: false term: FALSE Rectangle 0.000 0.500 term: TRUE Rectangle 0.500 1.000 OutputVariable: Threat enabled: true range: 0.500 1.500 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 1.000 0.500 term: MEDIUM Triangle 0.800 1.000 1.200 term: HIGH Ramp 1.000 1.500 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if OurShooters is MANY and EnemySpeed is LOW then Threat is LOW rule: if OurShooters is MANY and EnemyShooters is FEW then Threat is LOW rule: if OurSpeed is LOW and EnemyShooters is MANY then Threat is HIGH rule: if OurSpeed is HIGH and EnemyShooters is MANY then Threat is LOW rule: if OurWalkers is FEW and EnemyShooters is MANY then Threat is LOW rule: if OurShooters is MANY and EnemySpeed is HIGH then Threat is HIGH rule: if OurShooters is FEW and EnemySpeed is HIGH then Threat is MEDIUM rule: if EnemySpeed is MEDIUM then Threat is MEDIUM rule: if EnemySpeed is LOW and OurShooters is FEW then Threat is MEDIUM rule: if Bank is TRUE and OurShooters is MANY then Threat is HIGH rule: if Bank is TRUE and EnemyShooters is MANY then Threat is LOW rule: if CastleWalls is HIGH and OurWalkers is MANY then Threat is HIGH rule: if CastleWalls is HIGH and OurFlyers is MANY and OurShooters is MANY then Threat is MEDIUM rule: if CastleWalls is MEDIUM and OurShooters is MANY and EnemyWalkers is MANY then Threat is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 InputVariable: objectValue enabled: true range: 0.000 20000.000 lock-range: false term: LOW Ramp 3500.000 0.000 term: MEDIUM Triangle 0.000 4250.000 8500.000 term: HIGH Discrete 5000.000 0.000 10000.000 0.750 20000.000 1.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW rule: if objectValue is HIGH then Value is HIGH rule: if objectValue is MEDIUM then Value is MEDIUM rule: if objectValue is LOW then Value is LOW Engine: InputVariable: OurShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurSpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: EnemySpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: CastleWalls enabled: true range: 0.000 3.000 lock-range: false term: NONE Rectangle 0.000 0.500 term: MEDIUM Trapezoid 0.500 1.000 2.000 2.500 term: HIGH Ramp 1.900 3.000 InputVariable: Bank enabled: true range: 0.000 1.000 lock-range: false term: FALSE Rectangle 0.000 0.500 term: TRUE Rectangle 0.500 1.000 OutputVariable: Threat enabled: true range: 0.500 1.500 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 1.000 0.500 term: MEDIUM Triangle 0.800 1.000 1.200 term: HIGH Ramp 1.000 1.500 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if OurShooters is MANY and EnemySpeed is LOW then Threat is LOW rule: if OurShooters is MANY and EnemyShooters is FEW then Threat is LOW rule: if OurSpeed is LOW and EnemyShooters is MANY then Threat is HIGH rule: if OurSpeed is HIGH and EnemyShooters is MANY then Threat is LOW rule: if OurWalkers is FEW and EnemyShooters is MANY then Threat is LOW rule: if OurShooters is MANY and EnemySpeed is HIGH then Threat is HIGH rule: if OurShooters is FEW and EnemySpeed is HIGH then Threat is MEDIUM rule: if EnemySpeed is MEDIUM then Threat is MEDIUM rule: if EnemySpeed is LOW and OurShooters is FEW then Threat is MEDIUM rule: if Bank is TRUE and OurShooters is MANY then Threat is HIGH rule: if Bank is TRUE and EnemyShooters is MANY then Threat is LOW rule: if CastleWalls is HIGH and OurWalkers is MANY then Threat is HIGH rule: if CastleWalls is HIGH and OurFlyers is MANY and OurShooters is MANY then Threat is MEDIUM rule: if CastleWalls is MEDIUM and OurShooters is MANY and EnemyWalkers is MANY then Threat is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 InputVariable: objectValue enabled: true range: 0.000 20000.000 lock-range: false term: LOW Ramp 3500.000 0.000 term: MEDIUM Triangle 0.000 4250.000 8500.000 term: HIGH Discrete 5000.000 0.000 10000.000 0.750 20000.000 1.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW rule: if objectValue is HIGH then Value is HIGH rule: if objectValue is MEDIUM then Value is MEDIUM rule: if objectValue is LOW then Value is LOW Engine: InputVariable: OurShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurSpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: EnemySpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: CastleWalls enabled: true range: 0.000 3.000 lock-range: false term: NONE Rectangle 0.000 0.500 term: MEDIUM Trapezoid 0.500 1.000 2.000 2.500 term: HIGH Ramp 1.900 3.000 InputVariable: Bank enabled: true range: 0.000 1.000 lock-range: false term: FALSE Rectangle 0.000 0.500 term: TRUE Rectangle 0.500 1.000 OutputVariable: Threat enabled: true range: 0.500 1.500 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 1.000 0.500 term: MEDIUM Triangle 0.800 1.000 1.200 term: HIGH Ramp 1.000 1.500 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if OurShooters is MANY and EnemySpeed is LOW then Threat is LOW rule: if OurShooters is MANY and EnemyShooters is FEW then Threat is LOW rule: if OurSpeed is LOW and EnemyShooters is MANY then Threat is HIGH rule: if OurSpeed is HIGH and EnemyShooters is MANY then Threat is LOW rule: if OurWalkers is FEW and EnemyShooters is MANY then Threat is LOW rule: if OurShooters is MANY and EnemySpeed is HIGH then Threat is HIGH rule: if OurShooters is FEW and EnemySpeed is HIGH then Threat is MEDIUM rule: if EnemySpeed is MEDIUM then Threat is MEDIUM rule: if EnemySpeed is LOW and OurShooters is FEW then Threat is MEDIUM rule: if Bank is TRUE and OurShooters is MANY then Threat is HIGH rule: if Bank is TRUE and EnemyShooters is MANY then Threat is LOW rule: if CastleWalls is HIGH and OurWalkers is MANY then Threat is HIGH rule: if CastleWalls is HIGH and OurFlyers is MANY and OurShooters is MANY then Threat is MEDIUM rule: if CastleWalls is MEDIUM and OurShooters is MANY and EnemyWalkers is MANY then Threat is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 InputVariable: objectValue enabled: true range: 0.000 20000.000 lock-range: false term: LOW Ramp 3500.000 0.000 term: MEDIUM Triangle 0.000 4250.000 8500.000 term: HIGH Discrete 5000.000 0.000 10000.000 0.750 20000.000 1.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW rule: if objectValue is HIGH then Value is HIGH rule: if objectValue is MEDIUM then Value is MEDIUM rule: if objectValue is LOW then Value is LOW Engine: InputVariable: OurShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurSpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: EnemySpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: CastleWalls enabled: true range: 0.000 3.000 lock-range: false term: NONE Rectangle 0.000 0.500 term: MEDIUM Trapezoid 0.500 1.000 2.000 2.500 term: HIGH Ramp 1.900 3.000 InputVariable: Bank enabled: true range: 0.000 1.000 lock-range: false term: FALSE Rectangle 0.000 0.500 term: TRUE Rectangle 0.500 1.000 OutputVariable: Threat enabled: true range: 0.500 1.500 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 1.000 0.500 term: MEDIUM Triangle 0.800 1.000 1.200 term: HIGH Ramp 1.000 1.500 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if OurShooters is MANY and EnemySpeed is LOW then Threat is LOW rule: if OurShooters is MANY and EnemyShooters is FEW then Threat is LOW rule: if OurSpeed is LOW and EnemyShooters is MANY then Threat is HIGH rule: if OurSpeed is HIGH and EnemyShooters is MANY then Threat is LOW rule: if OurWalkers is FEW and EnemyShooters is MANY then Threat is LOW rule: if OurShooters is MANY and EnemySpeed is HIGH then Threat is HIGH rule: if OurShooters is FEW and EnemySpeed is HIGH then Threat is MEDIUM rule: if EnemySpeed is MEDIUM then Threat is MEDIUM rule: if EnemySpeed is LOW and OurShooters is FEW then Threat is MEDIUM rule: if Bank is TRUE and OurShooters is MANY then Threat is HIGH rule: if Bank is TRUE and EnemyShooters is MANY then Threat is LOW rule: if CastleWalls is HIGH and OurWalkers is MANY then Threat is HIGH rule: if CastleWalls is HIGH and OurFlyers is MANY and OurShooters is MANY then Threat is MEDIUM rule: if CastleWalls is MEDIUM and OurShooters is MANY and EnemyWalkers is MANY then Threat is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 InputVariable: objectValue enabled: true range: 0.000 20000.000 lock-range: false term: LOW Ramp 3500.000 0.000 term: MEDIUM Triangle 0.000 4250.000 8500.000 term: HIGH Discrete 5000.000 0.000 10000.000 0.750 20000.000 1.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW rule: if objectValue is HIGH then Value is HIGH rule: if objectValue is MEDIUM then Value is MEDIUM rule: if objectValue is LOW then Value is LOW Engine: InputVariable: OurShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyShooters enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyWalkers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: EnemyFlyers enabled: true range: 0.000 1.000 lock-range: false term: FEW Ramp 0.600 0.000 term: MANY Ramp 0.400 1.000 InputVariable: OurSpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: EnemySpeed enabled: true range: 0.000 25.000 lock-range: false term: LOW Ramp 6.500 3.000 term: MEDIUM Triangle 5.500 8.000 10.500 term: HIGH Ramp 8.500 16.000 InputVariable: CastleWalls enabled: true range: 0.000 3.000 lock-range: false term: NONE Rectangle 0.000 0.500 term: MEDIUM Trapezoid 0.500 1.000 2.000 2.500 term: HIGH Ramp 1.900 3.000 InputVariable: Bank enabled: true range: 0.000 1.000 lock-range: false term: FALSE Rectangle 0.000 0.500 term: TRUE Rectangle 0.500 1.000 OutputVariable: Threat enabled: true range: 0.500 1.500 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 1.000 0.500 term: MEDIUM Triangle 0.800 1.000 1.200 term: HIGH Ramp 1.000 1.500 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if OurShooters is MANY and EnemySpeed is LOW then Threat is LOW rule: if OurShooters is MANY and EnemyShooters is FEW then Threat is LOW rule: if OurSpeed is LOW and EnemyShooters is MANY then Threat is HIGH rule: if OurSpeed is HIGH and EnemyShooters is MANY then Threat is LOW rule: if OurWalkers is FEW and EnemyShooters is MANY then Threat is LOW rule: if OurShooters is MANY and EnemySpeed is HIGH then Threat is HIGH rule: if OurShooters is FEW and EnemySpeed is HIGH then Threat is MEDIUM rule: if EnemySpeed is MEDIUM then Threat is MEDIUM rule: if EnemySpeed is LOW and OurShooters is FEW then Threat is MEDIUM rule: if Bank is TRUE and OurShooters is MANY then Threat is HIGH rule: if Bank is TRUE and EnemyShooters is MANY then Threat is LOW rule: if CastleWalls is HIGH and OurWalkers is MANY then Threat is HIGH rule: if CastleWalls is HIGH and OurFlyers is MANY and OurShooters is MANY then Threat is MEDIUM rule: if CastleWalls is MEDIUM and OurShooters is MANY and EnemyWalkers is MANY then Threat is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW Engine: InputVariable: strengthRatio enabled: true range: 0.000 4.500 lock-range: false term: LOW Ramp 1.500 0.000 term: HIGH Ramp 1.500 4.500 InputVariable: heroStrength enabled: true range: 0.000 1.000 lock-range: false term: LOW Ramp 0.500 0.000 term: MEDIUM Triangle 0.200 0.500 0.800 term: HIGH Ramp 0.500 1.000 InputVariable: turnDistance enabled: true range: 0.000 10.000 lock-range: false term: SHORT Ramp 0.500 0.000 term: MEDIUM Triangle 0.100 0.450 0.800 term: LONG Ramp 0.500 10.000 InputVariable: lockedMissionImportance enabled: true range: 0.000 5.000 lock-range: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 InputVariable: objectValue enabled: true range: 0.000 20000.000 lock-range: false term: LOW Ramp 3500.000 0.000 term: MEDIUM Triangle 0.000 4250.000 8500.000 term: HIGH Discrete 5000.000 0.000 10000.000 0.750 20000.000 1.000 OutputVariable: Value enabled: true range: 0.000 5.000 lock-range: false aggregation: AlgebraicSum defuzzifier: Centroid 100 default: nan lock-previous: false term: LOW Ramp 2.500 0.000 term: MEDIUM Triangle 2.000 2.500 3.000 term: HIGH Ramp 2.500 5.000 RuleBlock: enabled: true conjunction: Minimum disjunction: Maximum implication: Minimum activation: Proportional rule: if strengthRatio is HIGH and heroStrength is LOW then Value is HIGH rule: if strengthRatio is HIGH and heroStrength is MEDIUM then Value is MEDIUM rule: if strengthRatio is HIGH and heroStrength is HIGH then Value is LOW rule: if strengthRatio is LOW and heroStrength is LOW then Value is LOW rule: if strengthRatio is LOW and heroStrength is MEDIUM then Value is HIGH rule: if strengthRatio is LOW and heroStrength is HIGH then Value is LOW rule: if lockedMissionImportance is HIGH then Value is LOW rule: if lockedMissionImportance is MEDIUM then Value is MEDIUM rule: if lockedMissionImportance is LOW then Value is HIGH rule: if turnDistance is SHORT then Value is HIGH rule: if turnDistance is MEDIUM then Value is MEDIUM rule: if turnDistance is LONG then Value is LOW rule: if objectValue is HIGH then Value is HIGH rule: if objectValue is MEDIUM then Value is MEDIUM rule: if objectValue is LOW then Value is LOW [New Thread 0x7fff94c74700 (LWP 26796)] [New Thread 0x7fff3085e700 (LWP 26797)] [New Thread 0x7fff3885e700 (LWP 26798)] [New Thread 0x7fff33fff700 (LWP 26799)] [New Thread 0x7fff337fe700 (LWP 26800)] [New Thread 0x7fff32ffd700 (LWP 26801)] [New Thread 0x7fff327fc700 (LWP 26802)] [Thread 0x7fff337fe700 (LWP 26800) exited] [Thread 0x7fff33fff700 (LWP 26799) exited] [Thread 0x7fff3085e700 (LWP 26797) exited] [Thread 0x7fff3885e700 (LWP 26798) exited] [Thread 0x7fff94c74700 (LWP 26796) exited] [Thread 0x7fff32ffd700 (LWP 26801) exited] [Thread 0x7fff327fc700 (LWP 26802) exited] Cannot get object with id 3879. Object is not visible. virtual const TerrainTile* CGameInfoCallback::getTile(int3, bool) const: (65 119 0) is not visible! virtual std::vector<const CGObjectInstance*> CGameInfoCallback::getVisitableObjs(int3, bool) const: (65 119 0) is not visible! virtual const TerrainTile* CGameInfoCallback::getTile(int3, bool) const: (65 119 0) is not visible! virtual std::vector<const CGObjectInstance*> CGameInfoCallback::getVisitableObjs(int3, bool) const: (65 119 0) is not visible! virtual const TerrainTile* CGameInfoCallback::getTile(int3, bool) const: (65 119 0) is not visible! virtual std::vector<const CGObjectInstance*> CGameInfoCallback::getVisitableObjs(int3, bool) const: (65 119 0) is not visible! virtual const TerrainTile* CGameInfoCallback::getTile(int3, bool) const: (65 119 0) is not visible! virtual std::vector<const CGObjectInstance*> CGameInfoCallback::getVisitableObjs(int3, bool) const: (65 119 0) is not visible! virtual const TerrainTile* CGameInfoCallback::getTile(int3, bool) const: (65 119 0) is not visible! virtual std::vector<const CGObjectInstance*> CGameInfoCallback::getVisitableObjs(int3, bool) const: (65 119 0) is not visible! virtual const TerrainTile* CGameInfoCallback::getTile(int3, bool) const: (65 119 0) is not visible! virtual std::vector<const CGObjectInstance*> CGameInfoCallback::getVisitableObjs(int3, bool) const: (65 119 0) is not visible! virtual const TerrainTile* CGameInfoCallback::getTile(int3, bool) const: (65 119 0) is not visible! virtual std::vector<const CGObjectInstance*> CGameInfoCallback::getVisitableObjs(int3, bool) const: (65 119 0) is not visible! Clear way should be used with visible tiles! [New Thread 0x7fff327fc700 (LWP 26803)] [New Thread 0x7fff32ffd700 (LWP 26804)] [New Thread 0x7fff337fe700 (LWP 26805)] [New Thread 0x7fff33fff700 (LWP 26806)] [New Thread 0x7fff94c74700 (LWP 26807)] [New Thread 0x7fff3885e700 (LWP 26808)] [New Thread 0x7fff31ffb700 (LWP 26809)] [Thread 0x7fff33fff700 (LWP 26806) exited] [Thread 0x7fff337fe700 (LWP 26805) exited] [Thread 0x7fff94c74700 (LWP 26807) exited] [Thread 0x7fff32ffd700 (LWP 26804) exited] [Thread 0x7fff3885e700 (LWP 26808) exited] [Thread 0x7fff327fc700 (LWP 26803) exited] [Thread 0x7fff31ffb700 (LWP 26809) exited] [New Thread 0x7fff31ffb700 (LWP 26810)] [New Thread 0x7fff3885e700 (LWP 26811)] [New Thread 0x7fff94c74700 (LWP 26812)] [New Thread 0x7fff33fff700 (LWP 26813)] [New Thread 0x7fff337fe700 (LWP 26814)] [New Thread 0x7fff32ffd700 (LWP 26815)] [New Thread 0x7fff327fc700 (LWP 26816)] [Thread 0x7fff337fe700 (LWP 26814) exited] [Thread 0x7fff33fff700 (LWP 26813) exited] [Thread 0x7fff94c74700 (LWP 26812) exited] [Thread 0x7fff3885e700 (LWP 26811) exited] [Thread 0x7fff31ffb700 (LWP 26810) exited] [Thread 0x7fff32ffd700 (LWP 26815) exited] [Thread 0x7fff327fc700 (LWP 26816) exited] [New Thread 0x7fff327fc700 (LWP 26817)] [New Thread 0x7fff32ffd700 (LWP 26818)] [New Thread 0x7fff337fe700 (LWP 26819)] [New Thread 0x7fff33fff700 (LWP 26820)] [New Thread 0x7fff94c74700 (LWP 26821)] [New Thread 0x7fff3885e700 (LWP 26822)] [New Thread 0x7fff31ffb700 (LWP 26823)] [Thread 0x7fff94c74700 (LWP 26821) exited] [Thread 0x7fff33fff700 (LWP 26820) exited] [Thread 0x7fff337fe700 (LWP 26819) exited] [Thread 0x7fff32ffd700 (LWP 26818) exited] [Thread 0x7fff327fc700 (LWP 26817) exited] [Thread 0x7fff31ffb700 (LWP 26823) exited] [Thread 0x7fff3885e700 (LWP 26822) exited] [New Thread 0x7fff31ffb700 (LWP 26824)] [Thread 0x7fff31ffb700 (LWP 26824) exited] [New Thread 0x7fff31ffb700 (LWP 26825)] [New Thread 0x7fff3885e700 (LWP 26826)] [New Thread 0x7fff94c74700 (LWP 26827)] [New Thread 0x7fff33fff700 (LWP 26828)] [New Thread 0x7fff337fe700 (LWP 26829)] [New Thread 0x7fff32ffd700 (LWP 26830)] [New Thread 0x7fff327fc700 (LWP 26831)] [Thread 0x7fff33fff700 (LWP 26828) exited] [Thread 0x7fff337fe700 (LWP 26829) exited] [Thread 0x7fff3885e700 (LWP 26826) exited] [Thread 0x7fff94c74700 (LWP 26827) exited] [Thread 0x7fff31ffb700 (LWP 26825) exited] [Thread 0x7fff32ffd700 (LWP 26830) exited] [Thread 0x7fff327fc700 (LWP 26831) exited] [New Thread 0x7fff327fc700 (LWP 26832)] [New Thread 0x7fff32ffd700 (LWP 26833)] [New Thread 0x7fff337fe700 (LWP 26834)] [New Thread 0x7fff33fff700 (LWP 26835)] [New Thread 0x7fff94c74700 (LWP 26836)] [New Thread 0x7fff3885e700 (LWP 26837)] [New Thread 0x7fff31ffb700 (LWP 26838)] [Thread 0x7fff94c74700 (LWP 26836) exited] [Thread 0x7fff337fe700 (LWP 26834) exited] [Thread 0x7fff33fff700 (LWP 26835) exited] [Thread 0x7fff32ffd700 (LWP 26833) exited] [Thread 0x7fff31ffb700 (LWP 26838) exited] [Thread 0x7fff327fc700 (LWP 26832) exited] [Thread 0x7fff3885e700 (LWP 26837) exited] [New Thread 0x7fff31ffb700 (LWP 26839)] [New Thread 0x7fff3885e700 (LWP 26840)] [New Thread 0x7fff94c74700 (LWP 26841)] [New Thread 0x7fff33fff700 (LWP 26842)] [New Thread 0x7fff337fe700 (LWP 26843)] [New Thread 0x7fff32ffd700 (LWP 26844)] [New Thread 0x7fff327fc700 (LWP 26845)] [Thread 0x7fff33fff700 (LWP 26842) exited] [Thread 0x7fff94c74700 (LWP 26841) exited] [Thread 0x7fff337fe700 (LWP 26843) exited] [Thread 0x7fff3885e700 (LWP 26840) exited] [Thread 0x7fff32ffd700 (LWP 26844) exited] [Thread 0x7fff31ffb700 (LWP 26839) exited] [Thread 0x7fff327fc700 (LWP 26845) exited] [New Thread 0x7fff327fc700 (LWP 26846)] [New Thread 0x7fff32ffd700 (LWP 26847)] [New Thread 0x7fff337fe700 (LWP 26848)] [New Thread 0x7fff33fff700 (LWP 26849)] [New Thread 0x7fff94c74700 (LWP 26850)] [New Thread 0x7fff3885e700 (LWP 26851)] [New Thread 0x7fff31ffb700 (LWP 26852)] [Thread 0x7fff33fff700 (LWP 26849) exited] [Thread 0x7fff337fe700 (LWP 26848) exited] [Thread 0x7fff32ffd700 (LWP 26847) exited] [Thread 0x7fff94c74700 (LWP 26850) exited] [Thread 0x7fff327fc700 (LWP 26846) exited] [Thread 0x7fff3885e700 (LWP 26851) exited] [Thread 0x7fff31ffb700 (LWP 26852) exited] Hero Vidomina has 1560 MP left Hero Septienna has 1500 MP left Hero Ciele has 1760 MP left Hero Straker has 1560 MP left Hero Sorsha has 1560 MP left Hero Malcom has 1500 MP left Hero Gerwulf has 1560 MP left Player 2 (tan) ends turn Player 2 (tan) ended turn [Thread 0x7fff96ffd700 (LWP 26795) exited] [New Thread 0x7fff31ffb700 (LWP 26853)] Player 4 (orange) starting turn, day 15 [New Thread 0x7fff3885e700 (LWP 26854)] [New Thread 0x7fff94c74700 (LWP 26855)] [New Thread 0x7fff33fff700 (LWP 26856)] [New Thread 0x7fff337fe700 (LWP 26857)] [New Thread 0x7fff32ffd700 (LWP 26858)] [New Thread 0x7fff327fc700 (LWP 26859)] [New Thread 0x7fff317fa700 (LWP 26860)] [Thread 0x7fff3885e700 (LWP 26854) exited] [Thread 0x7fff337fe700 (LWP 26857) exited] [Thread 0x7fff94c74700 (LWP 26855) exited] [Thread 0x7fff327fc700 (LWP 26859) exited] [Thread 0x7fff33fff700 (LWP 26856) exited] [Thread 0x7fff32ffd700 (LWP 26858) exited] [Thread 0x7fff317fa700 (LWP 26860) exited] [New Thread 0x7fff317fa700 (LWP 26861)] [New Thread 0x7fff327fc700 (LWP 26862)] [New Thread 0x7fff32ffd700 (LWP 26863)] [New Thread 0x7fff337fe700 (LWP 26864)] [New Thread 0x7fff94c74700 (LWP 26865)] [New Thread 0x7fff3885e700 (LWP 26866)] [New Thread 0x7fff33fff700 (LWP 26867)] [Thread 0x7fff337fe700 (LWP 26864) exited] [Thread 0x7fff327fc700 (LWP 26862) exited] [Thread 0x7fff317fa700 (LWP 26861) exited] [Thread 0x7fff3885e700 (LWP 26866) exited] [Thread 0x7fff94c74700 (LWP 26865) exited] [Thread 0x7fff32ffd700 (LWP 26863) exited] [Thread 0x7fff33fff700 (LWP 26867) exited] [New Thread 0x7fff33fff700 (LWP 26868)] [New Thread 0x7fff3885e700 (LWP 26869)] [New Thread 0x7fff94c74700 (LWP 26870)] [New Thread 0x7fff337fe700 (LWP 26871)] [New Thread 0x7fff32ffd700 (LWP 26872)] [New Thread 0x7fff327fc700 (LWP 26873)] [New Thread 0x7fff317fa700 (LWP 26874)] [Thread 0x7fff337fe700 (LWP 26871) exited] [Thread 0x7fff33fff700 (LWP 26868) exited] [Thread 0x7fff3885e700 (LWP 26869) exited] [Thread 0x7fff327fc700 (LWP 26873) exited] [Thread 0x7fff94c74700 (LWP 26870) exited] [Thread 0x7fff317fa700 (LWP 26874) exited] [Thread 0x7fff32ffd700 (LWP 26872) exited] [New Thread 0x7fff317fa700 (LWP 26875)] [New Thread 0x7fff327fc700 (LWP 26876)] [New Thread 0x7fff32ffd700 (LWP 26877)] [New Thread 0x7fff337fe700 (LWP 26878)] [New Thread 0x7fff94c74700 (LWP 26879)] [New Thread 0x7fff3885e700 (LWP 26880)] [New Thread 0x7fff33fff700 (LWP 26881)] [Thread 0x7fff327fc700 (LWP 26876) exited] [Thread 0x7fff337fe700 (LWP 26878) exited] [Thread 0x7fff317fa700 (LWP 26875) exited] [Thread 0x7fff3885e700 (LWP 26880) exited] [Thread 0x7fff33fff700 (LWP 26881) exited] [Thread 0x7fff94c74700 (LWP 26879) exited] [Thread 0x7fff32ffd700 (LWP 26877) exited] [New Thread 0x7fff33fff700 (LWP 26882)] [New Thread 0x7fff3885e700 (LWP 26883)] [New Thread 0x7fff94c74700 (LWP 26884)] [New Thread 0x7fff337fe700 (LWP 26885)] [New Thread 0x7fff32ffd700 (LWP 26886)] [New Thread 0x7fff327fc700 (LWP 26887)] [New Thread 0x7fff317fa700 (LWP 26888)] [Thread 0x7fff337fe700 (LWP 26885) exited] [Thread 0x7fff3885e700 (LWP 26883) exited] [Thread 0x7fff33fff700 (LWP 26882) exited] [Thread 0x7fff327fc700 (LWP 26887) exited] [Thread 0x7fff94c74700 (LWP 26884) exited] [Thread 0x7fff32ffd700 (LWP 26886) exited] [Thread 0x7fff317fa700 (LWP 26888) exited] [New Thread 0x7fff317fa700 (LWP 26889)] [Thread 0x7fff317fa700 (LWP 26889) exited] [New Thread 0x7fff317fa700 (LWP 26890)] [New Thread 0x7fff327fc700 (LWP 26891)] [New Thread 0x7fff32ffd700 (LWP 26892)] [New Thread 0x7fff337fe700 (LWP 26893)] [New Thread 0x7fff94c74700 (LWP 26894)] [New Thread 0x7fff3885e700 (LWP 26895)] [New Thread 0x7fff33fff700 (LWP 26896)] [Thread 0x7fff337fe700 (LWP 26893) exited] [Thread 0x7fff317fa700 (LWP 26890) exited] [Thread 0x7fff327fc700 (LWP 26891) exited] [Thread 0x7fff3885e700 (LWP 26895) exited] [Thread 0x7fff32ffd700 (LWP 26892) exited] [Thread 0x7fff94c74700 (LWP 26894) exited] [Thread 0x7fff33fff700 (LWP 26896) exited] [New Thread 0x7fff33fff700 (LWP 26897)] [Thread 0x7fff33fff700 (LWP 26897) exited] [New Thread 0x7fff33fff700 (LWP 26898)] [New Thread 0x7fff3885e700 (LWP 26899)] [New Thread 0x7fff94c74700 (LWP 26900)] [New Thread 0x7fff337fe700 (LWP 26901)] [New Thread 0x7fff32ffd700 (LWP 26902)] [New Thread 0x7fff327fc700 (LWP 26903)] [New Thread 0x7fff317fa700 (LWP 26904)] [Thread 0x7fff3885e700 (LWP 26899) exited] [Thread 0x7fff33fff700 (LWP 26898) exited] [Thread 0x7fff337fe700 (LWP 26901) exited] [Thread 0x7fff327fc700 (LWP 26903) exited] [Thread 0x7fff32ffd700 (LWP 26902) exited] [Thread 0x7fff94c74700 (LWP 26900) exited] [Thread 0x7fff317fa700 (LWP 26904) exited] [New Thread 0x7fff317fa700 (LWP 26905)] [Thread 0x7fff317fa700 (LWP 26905) exited] [New Thread 0x7fff317fa700 (LWP 26906)] [New Thread 0x7fff327fc700 (LWP 26907)] [New Thread 0x7fff32ffd700 (LWP 26908)] [New Thread 0x7fff337fe700 (LWP 26909)] [New Thread 0x7fff94c74700 (LWP 26910)] [New Thread 0x7fff3885e700 (LWP 26911)] [New Thread 0x7fff33fff700 (LWP 26912)] [Thread 0x7fff327fc700 (LWP 26907) exited] [Thread 0x7fff337fe700 (LWP 26909) exited] [Thread 0x7fff317fa700 (LWP 26906) exited] [Thread 0x7fff3885e700 (LWP 26911) exited] [Thread 0x7fff32ffd700 (LWP 26908) exited] [Thread 0x7fff94c74700 (LWP 26910) exited] [Thread 0x7fff33fff700 (LWP 26912) exited] [New Thread 0x7fff33fff700 (LWP 26913)] [Thread 0x7fff33fff700 (LWP 26913) exited] [New Thread 0x7fff33fff700 (LWP 26914)] [New Thread 0x7fff3885e700 (LWP 26915)] [New Thread 0x7fff94c74700 (LWP 26916)] [New Thread 0x7fff337fe700 (LWP 26917)] [New Thread 0x7fff32ffd700 (LWP 26918)] [New Thread 0x7fff327fc700 (LWP 26919)] [New Thread 0x7fff317fa700 (LWP 26921)] [Thread 0x7fff337fe700 (LWP 26917) exited] [Thread 0x7fff3885e700 (LWP 26915) exited] [Thread 0x7fff33fff700 (LWP 26914) exited] [Thread 0x7fff327fc700 (LWP 26919) exited] [Thread 0x7fff32ffd700 (LWP 26918) exited] [Thread 0x7fff94c74700 (LWP 26916) exited] [Thread 0x7fff317fa700 (LWP 26921) exited] [New Thread 0x7fff317fa700 (LWP 26922)] [Thread 0x7fff317fa700 (LWP 26922) exited] [New Thread 0x7fff317fa700 (LWP 26923)] [New Thread 0x7fff327fc700 (LWP 26924)] [New Thread 0x7fff32ffd700 (LWP 26925)] [New Thread 0x7fff337fe700 (LWP 26926)] [New Thread 0x7fff94c74700 (LWP 26927)] [New Thread 0x7fff3885e700 (LWP 26928)] [New Thread 0x7fff33fff700 (LWP 26929)] [Thread 0x7fff337fe700 (LWP 26926) exited] [Thread 0x7fff317fa700 (LWP 26923) exited] [Thread 0x7fff327fc700 (LWP 26924) exited] [Thread 0x7fff3885e700 (LWP 26928) exited] [Thread 0x7fff32ffd700 (LWP 26925) exited] [Thread 0x7fff94c74700 (LWP 26927) exited] [Thread 0x7fff33fff700 (LWP 26929) exited] --Type <RET> for more, q to quit, c to continue without paging-- Thread 102 "VCAI::makeTurn" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7fff31ffb700 (LWP 26853)] VCAI::<lambda()>::operator()(void) const (__closure=0x7fff31ffa2c0) at /usr/src/debug/games-strategy/vcmi-0.99_p202003180006070300/vcmi-0.99_p202003180006070300/AI/VCAI/VCAI.cpp:1876 1876 auto currentExit = getObj(currentPos, true)->id; (gdb) bt #0 VCAI::<lambda()>::operator()(void) const (__closure=0x7fff31ffa2c0) at /usr/src/debug/games-strategy/vcmi-0.99_p202003180006070300/vcmi-0.99_p202003180006070300/AI/VCAI/VCAI.cpp:1876 #1 0x00007fff9555964d in VCAI::moveHeroToTile (this=0x7fff4590d490, dst=..., h=...) at /usr/src/debug/games-strategy/vcmi-0.99_p202003180006070300/vcmi-0.99_p202003180006070300/AI/VCAI/VCAI.cpp:1943 #2 0x00007fff9555a8cf in VCAI::tryRealize (this=<optimized out>, g=...) at /usr/src/debug/games-strategy/vcmi-0.99_p202003180006070300/vcmi-0.99_p202003180006070300/AI/VCAI/../../lib/int3.h:24 #3 0x00007fff9555c699 in VCAI::wander (this=0x7fff4590d490, h=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/g++-v9/bits/shared_ptr_base.h:1020 #4 0x00007fff9555dc5a in VCAI::performTypicalActions (this=0x7fff4590d490) at /usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/include/g++-v9/bits/basic_string.h:936 #5 0x00007fff95560626 in VCAI::makeTurn (this=0x7fff4590d490) at /usr/src/debug/games-strategy/vcmi-0.99_p202003180006070300/vcmi-0.99_p202003180006070300/AI/VCAI/VCAI.cpp:804 #6 0x00007ffff5859fde in boost::(anonymous namespace)::thread_proxy (param=<optimized out>) at libs/thread/src/pthread/thread.cpp:179 #7 0x00007ffff74c0f60 in start_thread (arg=<optimized out>) at pthread_create.c:479 #8 0x00007ffff53a942f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95 | ||||||||||||
Notes | |
(0007891) moog (reporter) 2020-04-26 13:46 |
gdb.txt is the GDB backtrace that I got when successfully reproducing the issue. It was made on the binaries from 55b54024a82aaad3b4572d674d424c2247a47930 commit. |
(0007893) Shalthrea (developer) 2020-04-27 00:51 |
Can confirm that it reproduces. Looks like we're getting a call to the `doChannelProbing` lambda inside `VCAI::moveHeroToTile(int3, HeroPtr)`, which expects the hero's location to contain some object other than the hero itself. When it doesn't, we get a `nullptr` dereference. |
(0007896) Shalthrea (developer) 2020-04-30 23:37 |
Alright, to be a bit more specific about what is going on here: there is a Cyra in a whirlpool, and the AI decides to have her revisit the whirlpool a number of times until she is down to a single gremlin. Once this occurs, the hero is considered "protected" from the ill effects of the whirlpool, and is allowed to choose freely from the whirlpool exits when revisiting (`CGWhirlpool::onHeroVisit`). It just so happens that once Cyra is down to only a single gremlin, the AI no longer is actively pushing her to revisit the whirlpool. Instead, the AI is just finding no actions for her to take overall, and is nearing the end of `VCAI::wander`. However, the fix for https://bugs.vcmi.eu/view.php?id=1126 [^] steps in and forces her to do one last revisit of the whirlpool. When `VCAI::showTeleportDialog` is triggered with this last revisit, and the message is thus filled with all the exit alternative, a routine begins to store these exits for later exploration, keeping them in `teleportChannelProbingList`. In most cases, this list would be filled by the main logic in `VCAI::moveHeroToTile`, and then immediately each entry would be visited and the list cleared. Unfortunately, since this is a case of revisiting, there is special case logic in `VCAI::moveHeroToTile` that kicks in. This special case logic never performs the probing, and never clears out the list. Cyra's actions end, and Piquedram attempts to visit a campfire. Unfortunately, since `teleportChannelProbingList` is persisted between heroes, he then attempts to perform probing for the whirlpools of interest that remain in the list, but he is not standing on anything visitable. This leads to the scenario that I described in my previous comment, and we get a `nullptr` dereference. While I'm not 100% comfortable with the design, I believe that the most appropriate action here is to clear `teleportChannelProbingList` at the end of the revisiting special case logic of `VCAI::moveHeroToTile`, and will prepare a pull request doing exactly this. |
Issue History | |||
Date Modified | Username | Field | Change |
2020-04-26 13:43 | moog | New Issue | |
2020-04-26 13:43 | moog | File Added: bad_save.tar.xz | |
2020-04-26 13:45 | moog | File Added: gdb.txt | |
2020-04-26 13:46 | moog | Note Added: 0007891 | |
2020-04-27 00:51 | Shalthrea | Note Added: 0007893 | |
2020-04-30 23:37 | Shalthrea | Note Added: 0007896 | |
2020-05-01 03:35 | SXX | Status | new => resolved |
2020-05-01 03:35 | SXX | Fixed in Version | => 1.next |
2020-05-01 03:35 | SXX | Resolution | open => fixed |
2020-05-01 03:35 | SXX | Assigned To | => Shalthrea |
Copyright © 2000 - 2024 MantisBT Team |