Anonymous | Login | 2023-03-28 20:43 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 | ![]() ![]() [email protected] /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
| ||||||||||||
![]() |
|
(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. |
![]() |
|||
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 - 2023 MantisBT Team |