// ==UserScript==
// @name AWBW Map Analyzer - V5.1
// @namespace awbw
// @match https://awbw.amarriner.com/prevmaps.php*
// @match https://awbw.amarriner.com/editmap.php*
// @icon https://awbw.amarriner.com/terrain/followlist.gif
// @version 0.5.1
// @description Analyze unit movement in the map editor and map preview.
// @author steve, vesper
// @license MIT
// @grant none
// @inject-into page
// ==/UserScript==
var BaseInfo = {};
function loadScript(e) {
return new Promise(((t, n) => {
let i = document.createElement("script");
document.head.append(i), i.onload = () => {
t()
}, i.onerror = () => {
n()
}, i.src = e
}))
}
function loadImage(e) {
return new Promise(((t, n) => {
const i = new Image;
i.onload = () => {
t(i)
}, i.onerror = e => {
n(e)
}, i.src = e
}))
}
function indexToCoords(e, t) {
return {
x: (e = parseInt(e)) % t,
y: e / t | 0
}
}
BaseInfo.countries = {
os: {
id: 1,
name: "Orange Star",
color: "181, 39, 68"
},
bm: {
id: 2,
name: "Blue Moon",
color: "70,110,254"
},
ge: {
id: 3,
name: "Green Earth",
color: "61, 194, 45"
},
yc: {
id: 4,
name: "Yellow Comet",
color: "201, 189, 2"
},
bh: {
id: 5,
name: "Black Hole",
color: "116, 89, 138"
},
rf: {
id: 6,
name: "Red Fire",
color: "146, 50, 67"
},
gs: {
id: 7,
name: "Grey Sky",
color: "114, 114, 114"
},
bd: {
id: 8,
name: "Brown Desert",
color: "152, 83, 51"
},
ab: {
id: 9,
name: "Amber Blaze",
color: "252, 163, 57"
},
js: {
id: 10,
name: "Jade Sun",
color: "166, 182, 153"
},
ci: {
id: 16,
name: "Cobalt Ice",
color: "11, 32, 112"
},
pc: {
id: 17,
name: "Pink Cosmos",
color: "255, 102, 204"
},
tg: {
id: 19,
name: "Teal Galaxy",
color: "60, 205, 193"
},
pl: {
id: 20,
name: "Purple Lightning",
color: "111, 26, 155"
},
ar: {
id: 21,
name: "Acid Rain",
color: "97, 124, 14"
},
wn: {
id: 22,
name: "White Nova",
color: "205, 155, 154"
},
aa: {
id: 23,
name: "Azure Asteroid",
color: "130, 220, 232"
},
ne: {
id: 24,
name: "Noir Eclipse",
color: "3, 3, 3"
},
sc: {
id: 25,
name: "Silver Claw",
color: "137, 168, 188"
}
}
BaseInfo.terrain = {
1: {
name: "Plain",
defense: 1,
country: "",
build_type: null
},
2: {
name: "Mountain",
defense: 4,
country: "",
build_type: ""
},
3: {
name: "Wood",
defense: 2,
country: "",
build_type: null
},
4: {
name: "HRiver",
defense: 0,
country: "",
build_type: null
},
5: {
name: "VRiver",
defense: 0,
country: "",
build_type: null
},
6: {
name: "CRiver",
defense: 0,
country: "",
build_type: null
},
7: {
name: "ESRiver",
defense: 0,
country: "",
build_type: null
},
8: {
name: "SWRiver",
defense: 0,
country: "",
build_type: null
},
9: {
name: "WNRiver",
defense: 0,
country: "",
build_type: ""
},
10: {
name: "NERiver",
defense: 0,
country: "",
build_type: null
},
11: {
name: "ESWRiver",
defense: 0,
country: "",
build_type: null
},
12: {
name: "SWNRiver",
defense: 0,
country: "",
build_type: null
},
13: {
name: "WNERiver",
defense: 0,
country: "",
build_type: null
},
14: {
name: "NESRiver",
defense: 0,
country: "",
build_type: null
},
15: {
name: "HRoad",
defense: 0,
country: "",
build_type: null
},
16: {
name: "VRoad",
defense: 0,
country: "",
build_type: null
},
17: {
name: "CRoad",
defense: 0,
country: "",
build_type: null
},
18: {
name: "ESRoad",
defense: 0,
country: "",
build_type: null
},
19: {
name: "SWRoad",
defense: 0,
country: "",
build_type: null
},
20: {
name: "WNRoad",
defense: 0,
country: "",
build_type: null
},
21: {
name: "NERoad",
defense: 0,
country: "",
build_type: null
},
22: {
name: "ESWRoad",
defense: 0,
country: "",
build_type: null
},
23: {
name: "SWNRoad",
defense: 0,
country: "",
build_type: null
},
24: {
name: "WNERoad",
defense: 0,
country: "",
build_type: null
},
25: {
name: "NESRoad",
defense: 0,
country: "",
build_type: null
},
26: {
name: "HBridge",
defense: 0,
country: "",
build_type: null
},
27: {
name: "VBridge",
defense: 0,
country: "",
build_type: null
},
28: {
name: "Sea",
defense: 0,
country: "",
build_type: null
},
29: {
name: "HShoal",
defense: 0,
country: "",
build_type: null
},
30: {
name: "HShoalN",
defense: 0,
country: "",
build_type: null
},
31: {
name: "VShoal",
defense: 0,
country: "",
build_type: null
},
32: {
name: "VShoalE",
defense: 0,
country: "",
build_type: null
},
33: {
name: "Reef",
defense: 1,
country: "",
build_type: null
},
34: {
name: "Neutral City",
defense: 3,
country: "",
build_type: null
},
35: {
name: "Neutral Base",
defense: 3,
country: "",
build_type: ""
},
36: {
name: "Neutral Airport",
defense: 3,
country: "",
build_type: null
},
37: {
name: "Neutral Port",
defense: 3,
country: "",
build_type: null
},
38: {
name: "Orange Star City",
defense: 3,
country: "os",
build_type: null
},
39: {
name: "Orange Star Base",
defense: 3,
country: "os",
build_type: "L"
},
40: {
name: "Orange Star Airport",
defense: 3,
country: "os",
build_type: "A"
},
41: {
name: "Orange Star Port",
defense: 3,
country: "os",
build_type: "S"
},
42: {
name: "Orange Star HQ",
defense: 4,
country: "os",
build_type: null
},
43: {
name: "Blue Moon City",
defense: 3,
country: "bm",
build_type: null
},
44: {
name: "Blue Moon Base",
defense: 3,
country: "bm",
build_type: "L"
},
45: {
name: "Blue Moon Airport",
defense: 3,
country: "bm",
build_type: "A"
},
46: {
name: "Blue Moon Port",
defense: 3,
country: "bm",
build_type: "S"
},
47: {
name: "Blue Moon HQ",
defense: 4,
country: "bm",
build_type: null
},
48: {
name: "Green Earth City",
defense: 3,
country: "ge",
build_type: null
},
49: {
name: "Green Earth Base",
defense: 3,
country: "ge",
build_type: "L"
},
50: {
name: "Green Earth Airport",
defense: 3,
country: "ge",
build_type: "A"
},
51: {
name: "Green Earth Port",
defense: 3,
country: "ge",
build_type: "S"
},
52: {
name: "Green Earth HQ",
defense: 4,
country: "ge",
build_type: null
},
53: {
name: "Yellow Comet City",
defense: 3,
country: "yc",
build_type: null
},
54: {
name: "Yellow Comet Base",
defense: 3,
country: "yc",
build_type: "L"
},
55: {
name: "Yellow Comet Airport",
defense: 3,
country: "yc",
build_type: "A"
},
56: {
name: "Yellow Comet Port",
defense: 3,
country: "yc",
build_type: "S"
},
57: {
name: "Yellow Comet HQ",
defense: 4,
country: "yc",
build_type: null
},
81: {
name: "Red Fire City",
defense: 3,
country: "rf",
build_type: null
},
82: {
name: "Red Fire Base",
defense: 3,
country: "rf",
build_type: "L"
},
83: {
name: "Red Fire Airport",
defense: 3,
country: "rf",
build_type: "A"
},
84: {
name: "Red Fire Port",
defense: 3,
country: "rf",
build_type: "S"
},
85: {
name: "Red Fire HQ",
defense: 4,
country: "rf",
build_type: null
},
86: {
name: "Grey Sky City",
defense: 3,
country: "gs",
build_type: null
},
87: {
name: "Grey Sky Base",
defense: 3,
country: "gs",
build_type: "L"
},
88: {
name: "Grey Sky Airport",
defense: 3,
country: "gs",
build_type: "A"
},
89: {
name: "Grey Sky Port",
defense: 3,
country: "gs",
build_type: "S"
},
90: {
name: "Grey Sky HQ",
defense: 4,
country: "gs",
build_type: null
},
91: {
name: "Black Hole City",
defense: 3,
country: "bh",
build_type: null
},
92: {
name: "Black Hole Base",
defense: 3,
country: "bh",
build_type: "L"
},
93: {
name: "Black Hole Airport",
defense: 3,
country: "bh",
build_type: "A"
},
94: {
name: "Black Hole Port",
defense: 3,
country: "bh",
build_type: "S"
},
95: {
name: "Black Hole HQ",
defense: 4,
country: "bh",
build_type: ""
},
96: {
name: "Brown Desert City",
defense: 3,
country: "bd",
build_type: null
},
97: {
name: "Brown Desert Base",
defense: 3,
country: "bd",
build_type: "L"
},
98: {
name: "Brown Desert Airport",
defense: 3,
country: "bd",
build_type: "A"
},
99: {
name: "Brown Desert Port",
defense: 3,
country: "bd",
build_type: "S"
},
100: {
name: "Brown Desert HQ",
defense: 4,
country: "bd",
build_type: null
},
101: {
name: "VPipe",
defense: 0,
country: "",
build_type: ""
},
102: {
name: "HPipe",
defense: 0,
country: "",
build_type: ""
},
103: {
name: "NEPipe",
defense: 0,
country: "",
build_type: ""
},
104: {
name: "ESPipe",
defense: 0,
country: "",
build_type: ""
},
105: {
name: "SWPipe",
defense: 0,
country: "",
build_type: ""
},
106: {
name: "WNPipe",
defense: 0,
country: "",
build_type: ""
},
107: {
name: "NPipe End",
defense: 0,
country: "",
build_type: ""
},
108: {
name: "EPipe End",
defense: 0,
country: "",
build_type: ""
},
109: {
name: "SPipe End",
defense: 0,
country: "",
build_type: ""
},
110: {
name: "WPipe End",
defense: 0,
country: "",
build_type: ""
},
111: {
name: "Missile Silo",
defense: 3,
country: "",
build_type: ""
},
112: {
name: "Missile Silo Empty",
defense: 3,
country: "",
build_type: ""
},
113: {
name: "HPipe Seam",
defense: 0,
country: "",
build_type: ""
},
114: {
name: "VPipe Seam",
defense: 0,
country: "",
build_type: ""
},
115: {
name: "HPipe Rubble",
defense: 1,
country: "",
build_type: ""
},
116: {
name: "VPipe Rubble",
defense: 1,
country: "",
build_type: ""
},
117: {
name: "Amber Blaze Airport",
defense: 3,
country: "ab",
build_type: "A"
},
118: {
name: "Amber Blaze Base",
defense: 3,
country: "ab",
build_type: "L"
},
119: {
name: "Amber Blaze City",
defense: 3,
country: "ab",
build_type: ""
},
120: {
name: "Amber Blaze HQ",
defense: 4,
country: "ab",
build_type: ""
},
121: {
name: "Amber Blaze Port",
defense: 3,
country: "ab",
build_type: "S"
},
122: {
name: "Jade Sun Airport",
defense: 3,
country: "js",
build_type: "A"
},
123: {
name: "Jade Sun Base",
defense: 3,
country: "js",
build_type: "L"
},
124: {
name: "Jade Sun City",
defense: 3,
country: "js",
build_type: ""
},
125: {
name: "Jade Sun HQ",
defense: 4,
country: "js",
build_type: ""
},
126: {
name: "Jade Sun Port",
defense: 3,
country: "js",
build_type: "S"
},
127: {
name: "Amber Blaze Com Tower",
defense: 3,
country: "ab",
build_type: ""
},
128: {
name: "Black Hole Com Tower",
defense: 3,
country: "bh",
build_type: ""
},
129: {
name: "Blue Moon Com Tower",
defense: 3,
country: "bm",
build_type: ""
},
130: {
name: "Brown Desert Com Tower",
defense: 3,
country: "bd",
build_type: ""
},
131: {
name: "Green Earth Com Tower",
defense: 3,
country: "ge",
build_type: ""
},
132: {
name: "Jade Sun Com Tower",
defense: 3,
country: "js",
build_type: ""
},
133: {
name: "Neutral Com Tower",
defense: 3,
country: "",
build_type: ""
},
134: {
name: "Orange Star Com Tower",
defense: 3,
country: "os",
build_type: ""
},
135: {
name: "Red Fire Com Tower",
defense: 3,
country: "rf",
build_type: ""
},
136: {
name: "Yellow Comet Com Tower",
defense: 3,
country: "yc",
build_type: ""
},
137: {
name: "Grey Sky Com Tower",
defense: 3,
country: "gs",
build_type: ""
},
138: {
name: "Amber Blaze Lab",
defense: 3,
country: "ab",
build_type: ""
},
139: {
name: "Black Hole Lab",
defense: 3,
country: "bh",
build_type: ""
},
140: {
name: "Blue Moon Lab",
defense: 3,
country: "bm",
build_type: ""
},
141: {
name: "Brown Desert Lab",
defense: 3,
country: "bd",
build_type: ""
},
142: {
name: "Green Earth Lab",
defense: 3,
country: "ge",
build_type: ""
},
143: {
name: "Grey Sky Lab",
defense: 3,
country: "gs",
build_type: ""
},
144: {
name: "Jade Sun Lab",
defense: 3,
country: "js",
build_type: ""
},
145: {
name: "Neutral Lab",
defense: 3,
country: "",
build_type: ""
},
146: {
name: "Orange Star Lab",
defense: 3,
country: "os",
build_type: ""
},
147: {
name: "Red Fire Lab",
defense: 3,
country: "rf",
build_type: ""
},
148: {
name: "Yellow Comet Lab",
defense: 3,
country: "yc",
build_type: ""
},
149: {
name: "Cobalt Ice Airport",
defense: 3,
country: "ci",
build_type: "A"
},
150: {
name: "Cobalt Ice Base",
defense: 3,
country: "ci",
build_type: "L"
},
151: {
name: "Cobalt Ice City",
defense: 3,
country: "ci",
build_type: ""
},
152: {
name: "Cobalt Ice Com Tower",
defense: 3,
country: "ci",
build_type: ""
},
153: {
name: "Cobalt Ice HQ",
defense: 4,
country: "ci",
build_type: ""
},
154: {
name: "Cobalt Ice Lab",
defense: 3,
country: "ci",
build_type: ""
},
155: {
name: "Cobalt Ice Port",
defense: 3,
country: "ci",
build_type: "S"
},
156: {
name: "Pink Cosmos Airport",
defense: 3,
country: "pc",
build_type: "A"
},
157: {
name: "Pink Cosmos Base",
defense: 3,
country: "pc",
build_type: "L"
},
158: {
name: "Pink Cosmos City",
defense: 3,
country: "pc",
build_type: ""
},
159: {
name: "Pink Cosmos Com Tower",
defense: 3,
country: "pc",
build_type: ""
},
160: {
name: "Pink Cosmos HQ",
defense: 4,
country: "pc",
build_type: ""
},
161: {
name: "Pink Cosmos Lab",
defense: 3,
country: "pc",
build_type: ""
},
162: {
name: "Pink Cosmos Port",
defense: 3,
country: "pc",
build_type: "S"
},
163: {
name: "Teal Galaxy Airport",
defense: 3,
country: "tg",
build_type: "A"
},
164: {
name: "Teal Galaxy Base",
defense: 3,
country: "tg",
build_type: "L"
},
165: {
name: "Teal Galaxy City",
defense: 3,
country: "tg",
build_type: ""
},
166: {
name: "Teal Galaxy Com Tower",
defense: 3,
country: "tg",
build_type: ""
},
167: {
name: "Teal Galaxy HQ",
defense: 4,
country: "tg",
build_type: ""
},
168: {
name: "Teal Galaxy Lab",
defense: 3,
country: "tg",
build_type: ""
},
169: {
name: "Teal Galaxy Port",
defense: 3,
country: "tg",
build_type: "S"
},
170: {
name: "Purple Lightning Airport",
defense: 3,
country: "pl",
build_type: "A"
},
171: {
name: "Purple Lightning Base",
defense: 3,
country: "pl",
build_type: "L"
},
172: {
name: "Purple Lightning City",
defense: 3,
country: "pl",
build_type: ""
},
173: {
name: "Purple Lightning Com Tower",
defense: 3,
country: "pl",
build_type: ""
},
174: {
name: "Purple Lightning HQ",
defense: 4,
country: "pl",
build_type: ""
},
175: {
name: "Purple Lightning Lab",
defense: 3,
country: "pl",
build_type: ""
},
176: {
name: "Purple Lightning Port",
defense: 3,
country: "pl",
build_type: "S"
},
181: {
name: "Acid Rain Airport",
defense: 3,
country: "ar",
build_type: "A"
},
182: {
name: "Acid Rain Base",
defense: 3,
country: "ar",
build_type: "L"
},
183: {
name: "Acid Rain City",
defense: 3,
country: "ar",
build_type: ""
},
184: {
name: "Acid Rain Com Tower",
defense: 3,
country: "ar",
build_type: ""
},
185: {
name: "Acid Rain HQ",
defense: 4,
country: "ar",
build_type: ""
},
186: {
name: "Acid Rain Lab",
defense: 3,
country: "ar",
build_type: ""
},
187: {
name: "Acid Rain Port",
defense: 3,
country: "ar",
build_type: "S"
},
188: {
name: "White Nova Airport",
defense: 3,
country: "wn",
build_type: "A"
},
189: {
name: "White Nova Base",
defense: 3,
country: "wn",
build_type: "L"
},
190: {
name: "White Nova City",
defense: 3,
country: "wn",
build_type: ""
},
191: {
name: "White Nova Com Tower",
defense: 3,
country: "wn",
build_type: ""
},
192: {
name: "White Nova HQ",
defense: 4,
country: "wn",
build_type: ""
},
193: {
name: "White Nova Lab",
defense: 3,
country: "wn",
build_type: ""
},
194: {
name: "White Nova Port",
defense: 3,
country: "wn",
build_type: "S"
},
195: {
name: "Teleporter",
defense: 0,
country: "",
build_type: ""
},
196: {
name: "Azure Asteroid Airport",
defense: 3,
country: "aa",
build_type: "A"
},
197: {
name: "Azure Asteroid Base",
defense: 3,
country: "aa",
build_type: "L"
},
198: {
name: "Azure Asteroid City",
defense: 3,
country: "aa",
build_type: ""
},
199: {
name: "Azure Asteroid Com Tower",
defense: 3,
country: "aa",
build_type: ""
},
200: {
name: "Azure Asteroid HQ",
defense: 4,
country: "aa",
build_type: ""
},
201: {
name: "Azure Asteroid Lab",
defense: 3,
country: "aa",
build_type: ""
},
202: {
name: "Azure Asteroid Port",
defense: 3,
country: "aa",
build_type: "S"
},
203: {
name: "Noir Eclipse Airport",
defense: 3,
country: "ne",
build_type: "A"
},
204: {
name: "Noir Eclipse Base",
defense: 3,
country: "ne",
build_type: "L"
},
205: {
name: "Noir Eclipse City",
defense: 3,
country: "ne",
build_type: ""
},
206: {
name: "Noir Eclipse Com Tower",
defense: 3,
country: "ne",
build_type: ""
},
207: {
name: "Noir Eclipse HQ",
defense: 4,
country: "ne",
build_type: ""
},
208: {
name: "Noir Eclipse Lab",
defense: 3,
country: "ne",
build_type: ""
},
209: {
name: "Noir Eclipse Port",
defense: 3,
country: "ne",
build_type: "S"
},
210: {
name: "Silver Claw Airport",
defense: 3,
country: "sc",
build_type: "A"
},
211: {
name: "Silver Claw Base",
defense: 3,
country: "sc",
build_type: "L"
},
212: {
name: "Silver Claw City",
defense: 3,
country: "sc",
build_type: ""
},
213: {
name: "Silver Claw Com Tower",
defense: 3,
country: "sc",
build_type: ""
},
214: {
name: "Silver Claw HQ",
defense: 4,
country: "sc",
build_type: ""
},
215: {
name: "Silver Claw Lab",
defense: 3,
country: "sc",
build_type: ""
},
216: {
name: "Silver Claw Port",
defense: 3,
country: "sc",
build_type: "S"
}
}
BaseInfo.units = {
1: {
name: "Infantry",
cost: 1e3,
move_points: 3,
move_type: "F",
fuel: 99,
fuel_per_turn: 0,
ammo: 0,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
2: {
name: "Mech",
cost: 3e3,
move_points: 2,
move_type: "B",
fuel: 70,
fuel_per_turn: 0,
ammo: 3,
short_range: 0,
long_range: 0,
second_weapon: "Y"
},
3: {
name: "Md.Tank",
cost: 16e3,
move_points: 5,
move_type: "T",
fuel: 50,
fuel_per_turn: 0,
ammo: 8,
short_range: 0,
long_range: 0,
second_weapon: "Y"
},
4: {
name: "Tank",
cost: 7e3,
move_points: 6,
move_type: "T",
fuel: 70,
fuel_per_turn: 0,
ammo: 9,
short_range: 0,
long_range: 0,
second_weapon: "Y"
},
5: {
name: "Recon",
cost: 4e3,
move_points: 8,
move_type: "W",
fuel: 80,
fuel_per_turn: 0,
ammo: 0,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
6: {
name: "APC",
cost: 5e3,
move_points: 6,
move_type: "T",
fuel: 70,
fuel_per_turn: 0,
ammo: 0,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
7: {
name: "Artillery",
cost: 6e3,
move_points: 5,
move_type: "T",
fuel: 50,
fuel_per_turn: 0,
ammo: 9,
short_range: 2,
long_range: 3,
second_weapon: "N"
},
8: {
name: "Rocket",
cost: 15e3,
move_points: 5,
move_type: "W",
fuel: 50,
fuel_per_turn: 0,
ammo: 6,
short_range: 3,
long_range: 5,
second_weapon: "N"
},
9: {
name: "Anti-Air",
cost: 8e3,
move_points: 6,
move_type: "T",
fuel: 60,
fuel_per_turn: 0,
ammo: 9,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
10: {
name: "Missile",
cost: 12e3,
move_points: 4,
move_type: "W",
fuel: 50,
fuel_per_turn: 0,
ammo: 6,
short_range: 3,
long_range: 5,
second_weapon: "N"
},
11: {
name: "Fighter",
cost: 2e4,
move_points: 9,
move_type: "A",
fuel: 99,
fuel_per_turn: 5,
ammo: 9,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
12: {
name: "Bomber",
cost: 22e3,
move_points: 7,
move_type: "A",
fuel: 99,
fuel_per_turn: 5,
ammo: 9,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
13: {
name: "B-Copter",
cost: 9e3,
move_points: 6,
move_type: "A",
fuel: 99,
fuel_per_turn: 2,
ammo: 6,
short_range: 0,
long_range: 0,
second_weapon: "Y"
},
14: {
name: "T-Copter",
cost: 5e3,
move_points: 6,
move_type: "A",
fuel: 99,
fuel_per_turn: 2,
ammo: 0,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
15: {
name: "Battleship",
cost: 28e3,
move_points: 5,
move_type: "S",
fuel: 99,
fuel_per_turn: 1,
ammo: 9,
short_range: 2,
long_range: 6,
second_weapon: "N"
},
16: {
name: "Cruiser",
cost: 18e3,
move_points: 6,
move_type: "S",
fuel: 99,
fuel_per_turn: 1,
ammo: 9,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
17: {
name: "Lander",
cost: 12e3,
move_points: 6,
move_type: "L",
fuel: 99,
fuel_per_turn: 1,
ammo: 0,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
18: {
name: "Sub",
cost: 2e4,
move_points: 5,
move_type: "S",
fuel: 60,
fuel_per_turn: 1,
ammo: 6,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
46: {
name: "Neotank",
cost: 22e3,
move_points: 6,
move_type: "T",
fuel: 99,
fuel_per_turn: 1,
ammo: 9,
short_range: 0,
long_range: 0,
second_weapon: "Y"
},
960900: {
name: "Piperunner",
cost: 2e4,
move_points: 9,
move_type: "P",
fuel: 99,
fuel_per_turn: 0,
ammo: 9,
short_range: 2,
long_range: 5,
second_weapon: "Y"
},
968731: {
name: "Black Bomb",
cost: 25e3,
move_points: 9,
move_type: "A",
fuel: 45,
fuel_per_turn: 5,
ammo: 0,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
1141438: {
name: "Mega Tank",
cost: 28e3,
move_points: 4,
move_type: "T",
fuel: 50,
fuel_per_turn: 0,
ammo: 3,
short_range: 0,
long_range: 0,
second_weapon: "Y"
},
28: {
name: "Black Boat",
cost: 7500,
move_points: 7,
move_type: "L",
fuel: 60,
fuel_per_turn: 1,
ammo: 0,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
30: {
name: "Stealth",
cost: 24e3,
move_points: 6,
move_type: "A",
fuel: 60,
fuel_per_turn: 5,
ammo: 6,
short_range: 0,
long_range: 0,
second_weapon: "N"
},
29: {
name: "Carrier",
cost: 3e4,
move_points: 5,
move_type: "S",
fuel: 99,
fuel_per_turn: 1,
ammo: 9,
short_range: 3,
long_range: 8,
second_weapon: "N"
}
}
BaseInfo.moveCosts = {
C: {
F: {
1: 1,
2: 2,
3: 1,
4: 2,
5: 2,
6: 2,
7: 2,
8: 2,
9: 2,
10: 2,
11: 2,
12: 2,
13: 2,
14: 2,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 1,
116: 1,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
B: {
1: 1,
2: 1,
3: 1,
4: 1,
5: 1,
6: 1,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
12: 1,
13: 1,
14: 1,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 1,
116: 1,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
T: {
1: 1,
2: 0,
3: 2,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 1,
116: 1,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
W: {
1: 2,
2: 0,
3: 3,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 2,
116: 2,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
A: {
1: 1,
2: 1,
3: 1,
4: 1,
5: 1,
6: 1,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
12: 1,
13: 1,
14: 1,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 1,
29: 1,
30: 1,
31: 1,
32: 1,
33: 1,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 1,
116: 1,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
S: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 1,
29: 0,
30: 0,
31: 0,
32: 0,
33: 2,
34: 0,
35: 0,
36: 0,
37: 1,
38: 0,
39: 0,
40: 0,
41: 1,
42: 0,
43: 0,
44: 0,
45: 0,
46: 1,
47: 0,
48: 0,
49: 0,
50: 0,
51: 1,
52: 0,
53: 0,
54: 0,
55: 0,
56: 1,
57: 0,
81: 0,
86: 0,
82: 0,
87: 0,
83: 0,
88: 0,
84: 1,
89: 1,
85: 0,
90: 0,
91: 0,
92: 0,
93: 0,
94: 1,
95: 0,
96: 0,
97: 0,
98: 0,
99: 1,
100: 0,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 0,
112: 0,
113: 0,
114: 0,
115: 0,
116: 0,
117: 0,
118: 0,
119: 0,
120: 0,
121: 1,
122: 0,
123: 0,
124: 0,
125: 0,
126: 1,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 0,
151: 0,
152: 0,
153: 0,
154: 0,
155: 1,
156: 0,
157: 0,
158: 0,
159: 0,
160: 0,
161: 0,
162: 1,
163: 0,
164: 0,
165: 0,
166: 0,
167: 0,
168: 0,
169: 1,
170: 0,
171: 0,
172: 0,
173: 0,
174: 0,
175: 0,
176: 1,
"": 0,
181: 0,
182: 0,
183: 0,
184: 0,
185: 0,
186: 0,
187: 1,
188: 0,
189: 0,
190: 0,
191: 0,
192: 0,
193: 0,
194: 1,
195: 0
},
L: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 1,
29: 1,
30: 1,
31: 1,
32: 1,
33: 2,
34: 0,
35: 0,
36: 0,
37: 1,
38: 0,
39: 0,
40: 0,
41: 1,
42: 0,
43: 0,
44: 0,
45: 0,
46: 1,
47: 0,
48: 0,
49: 0,
50: 0,
51: 1,
52: 0,
53: 0,
54: 0,
55: 0,
56: 1,
57: 0,
81: 0,
86: 0,
82: 0,
87: 0,
83: 0,
88: 0,
84: 1,
89: 1,
85: 0,
90: 0,
91: 0,
92: 0,
93: 0,
94: 1,
95: 0,
96: 0,
97: 0,
98: 0,
99: 1,
100: 0,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 0,
112: 0,
113: 0,
114: 0,
115: 0,
116: 0,
117: 0,
118: 0,
119: 0,
120: 0,
121: 1,
122: 0,
123: 0,
124: 0,
125: 0,
126: 1,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 0,
151: 0,
152: 0,
153: 0,
154: 0,
155: 1,
156: 0,
157: 0,
158: 0,
159: 0,
160: 0,
161: 0,
162: 1,
163: 0,
164: 0,
165: 0,
166: 0,
167: 0,
168: 0,
169: 1,
170: 0,
171: 0,
172: 0,
173: 0,
174: 0,
175: 0,
176: 1,
"": 0,
181: 0,
182: 0,
183: 0,
184: 0,
185: 0,
186: 0,
187: 1,
188: 0,
189: 0,
190: 0,
191: 0,
192: 0,
193: 0,
194: 1,
195: 0
},
P: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 0,
29: 0,
30: 0,
31: 0,
32: 0,
33: 0,
34: 0,
35: 1,
36: 0,
37: 0,
38: 0,
39: 1,
40: 0,
41: 0,
42: 0,
43: 0,
44: 1,
45: 0,
46: 0,
47: 0,
48: 0,
49: 1,
50: 0,
51: 0,
52: 0,
53: 0,
54: 1,
55: 0,
56: 0,
57: 0,
85: 0,
90: 0,
84: 0,
89: 0,
83: 0,
88: 0,
82: 1,
87: 1,
81: 0,
86: 0,
91: 0,
92: 1,
93: 0,
94: 0,
95: 0,
96: 0,
97: 1,
98: 0,
99: 0,
100: 0,
101: 1,
102: 1,
103: 1,
104: 1,
105: 1,
106: 1,
107: 1,
108: 1,
109: 1,
110: 1,
111: 0,
112: 0,
113: 1,
114: 1,
115: 0,
116: 0,
117: 0,
118: 1,
119: 0,
120: 0,
121: 0,
122: 0,
123: 1,
124: 0,
125: 0,
126: 0,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 1,
151: 0,
152: 0,
153: 0,
154: 0,
155: 0,
156: 0,
157: 1,
158: 0,
159: 0,
160: 0,
161: 0,
162: 0,
163: 0,
164: 1,
165: 0,
166: 0,
167: 0,
168: 0,
169: 0,
170: 0,
171: 1,
172: 0,
173: 0,
174: 0,
175: 0,
176: 0,
"": 0,
181: 0,
182: 1,
183: 0,
184: 0,
185: 0,
186: 0,
187: 0,
188: 0,
189: 1,
190: 0,
191: 0,
192: 0,
193: 0,
194: 0,
195: 0
}
},
S: {
F: {
1: 2,
2: 4,
3: 2,
4: 2,
5: 2,
6: 2,
7: 2,
8: 2,
9: 2,
10: 2,
11: 2,
12: 2,
13: 2,
14: 2,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 2,
116: 2,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
B: {
1: 1,
2: 2,
3: 1,
4: 1,
5: 1,
6: 1,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
12: 1,
13: 1,
14: 1,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 1,
116: 1,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
T: {
1: 2,
2: 0,
3: 2,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 2,
116: 2,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
W: {
1: 3,
2: 0,
3: 3,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 3,
116: 3,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
A: {
1: 2,
2: 2,
3: 2,
4: 2,
5: 2,
6: 2,
7: 2,
8: 2,
9: 2,
10: 2,
11: 2,
12: 2,
13: 2,
14: 2,
15: 2,
16: 2,
17: 2,
18: 2,
19: 2,
20: 2,
21: 2,
22: 2,
23: 2,
24: 2,
25: 2,
26: 2,
27: 2,
28: 2,
29: 2,
30: 2,
31: 2,
32: 2,
33: 2,
34: 2,
35: 2,
36: 2,
37: 2,
38: 2,
39: 2,
40: 2,
41: 2,
42: 2,
43: 2,
44: 2,
45: 2,
46: 2,
47: 2,
48: 2,
49: 2,
50: 2,
51: 2,
52: 2,
53: 2,
54: 2,
55: 2,
56: 2,
57: 2,
81: 2,
86: 2,
82: 2,
87: 2,
83: 2,
88: 2,
84: 2,
89: 2,
85: 2,
90: 2,
91: 2,
92: 2,
93: 2,
94: 2,
95: 2,
96: 2,
97: 2,
98: 2,
99: 2,
100: 2,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 2,
112: 2,
113: 0,
114: 0,
115: 2,
116: 2,
117: 2,
118: 2,
119: 2,
120: 2,
121: 2,
122: 2,
123: 2,
124: 2,
125: 2,
126: 2,
127: 2,
128: 2,
129: 2,
130: 2,
131: 2,
132: 2,
133: 2,
134: 2,
135: 2,
136: 2,
137: 2,
138: 2,
139: 2,
140: 2,
141: 2,
142: 2,
143: 2,
144: 2,
145: 2,
146: 2,
147: 2,
148: 2,
149: 2,
150: 2,
151: 2,
152: 2,
153: 2,
154: 2,
155: 2,
156: 2,
157: 2,
158: 2,
159: 2,
160: 2,
161: 2,
162: 2,
163: 2,
164: 2,
165: 2,
166: 2,
167: 2,
168: 2,
169: 2,
170: 2,
171: 2,
172: 2,
173: 2,
174: 2,
175: 2,
176: 2,
"": 2,
181: 2,
182: 2,
183: 2,
184: 2,
185: 2,
186: 2,
187: 2,
188: 2,
189: 2,
190: 2,
191: 2,
192: 2,
193: 2,
194: 2,
195: 0
},
S: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 2,
29: 0,
30: 0,
31: 0,
32: 0,
33: 2,
34: 0,
35: 0,
36: 0,
37: 2,
38: 0,
39: 0,
40: 0,
41: 2,
42: 0,
43: 0,
44: 0,
45: 0,
46: 2,
47: 0,
48: 0,
49: 0,
50: 0,
51: 2,
52: 0,
53: 0,
54: 0,
55: 0,
56: 2,
57: 0,
81: 0,
86: 0,
82: 0,
87: 0,
83: 0,
88: 0,
84: 2,
89: 2,
85: 0,
90: 0,
91: 0,
92: 0,
93: 0,
94: 2,
95: 0,
96: 0,
97: 0,
98: 0,
99: 2,
100: 0,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 0,
112: 0,
113: 0,
114: 0,
115: 0,
116: 0,
117: 0,
118: 0,
119: 0,
120: 0,
121: 2,
122: 0,
123: 0,
124: 0,
125: 0,
126: 2,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 0,
151: 0,
152: 0,
153: 0,
154: 0,
155: 2,
156: 0,
157: 0,
158: 0,
159: 0,
160: 0,
161: 0,
162: 2,
163: 0,
164: 0,
165: 0,
166: 0,
167: 0,
168: 0,
169: 2,
170: 0,
171: 0,
172: 0,
173: 0,
174: 0,
175: 0,
176: 2,
"": 0,
181: 0,
182: 0,
183: 0,
184: 0,
185: 0,
186: 0,
187: 2,
188: 0,
189: 0,
190: 0,
191: 0,
192: 0,
193: 0,
194: 2,
195: 0
},
L: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 2,
29: 1,
30: 1,
31: 1,
32: 1,
33: 2,
34: 0,
35: 0,
36: 0,
37: 2,
38: 0,
39: 0,
40: 0,
41: 2,
42: 0,
43: 0,
44: 0,
45: 0,
46: 2,
47: 0,
48: 0,
49: 0,
50: 0,
51: 2,
52: 0,
53: 0,
54: 0,
55: 0,
56: 2,
57: 0,
81: 0,
86: 0,
82: 0,
87: 0,
83: 0,
88: 0,
84: 2,
89: 2,
85: 0,
90: 0,
91: 0,
92: 0,
93: 0,
94: 2,
95: 0,
96: 0,
97: 0,
98: 0,
99: 2,
100: 0,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 0,
112: 0,
113: 0,
114: 0,
115: 0,
116: 0,
117: 0,
118: 0,
119: 0,
120: 0,
121: 2,
122: 0,
123: 0,
124: 0,
125: 0,
126: 2,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 0,
151: 0,
152: 0,
153: 0,
154: 0,
155: 2,
156: 0,
157: 0,
158: 0,
159: 0,
160: 0,
161: 0,
162: 2,
163: 0,
164: 0,
165: 0,
166: 0,
167: 0,
168: 0,
169: 2,
170: 0,
171: 0,
172: 0,
173: 0,
174: 0,
175: 0,
176: 2,
"": 0,
181: 0,
182: 0,
183: 0,
184: 0,
185: 0,
186: 0,
187: 2,
188: 0,
189: 0,
190: 0,
191: 0,
192: 0,
193: 0,
194: 2,
195: 0
},
P: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 0,
29: 0,
30: 0,
31: 0,
32: 0,
33: 0,
34: 0,
35: 1,
36: 0,
37: 0,
38: 0,
39: 1,
40: 0,
41: 0,
42: 0,
43: 0,
44: 1,
45: 0,
46: 0,
47: 0,
48: 0,
49: 1,
50: 0,
51: 0,
52: 0,
53: 0,
54: 1,
55: 0,
56: 0,
57: 0,
85: 0,
90: 0,
84: 0,
89: 0,
83: 0,
88: 0,
82: 1,
87: 1,
81: 0,
86: 0,
91: 0,
92: 1,
93: 0,
94: 0,
95: 0,
96: 0,
97: 1,
98: 0,
99: 0,
100: 0,
101: 1,
102: 1,
103: 1,
104: 1,
105: 1,
106: 1,
107: 1,
108: 1,
109: 1,
110: 1,
111: 0,
112: 0,
113: 1,
114: 1,
115: 0,
116: 0,
117: 0,
118: 1,
119: 0,
120: 0,
121: 0,
122: 0,
123: 1,
124: 0,
125: 0,
126: 0,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 1,
151: 0,
152: 0,
153: 0,
154: 0,
155: 0,
156: 0,
157: 1,
158: 0,
159: 0,
160: 0,
161: 0,
162: 0,
163: 0,
164: 1,
165: 0,
166: 0,
167: 0,
168: 0,
169: 0,
170: 0,
171: 1,
172: 0,
173: 0,
174: 0,
175: 0,
176: 0,
"": 0,
181: 0,
182: 1,
183: 0,
184: 0,
185: 0,
186: 0,
187: 0,
188: 0,
189: 1,
190: 0,
191: 0,
192: 0,
193: 0,
194: 0,
195: 0
}
},
R: {
F: {
1: 1,
2: 2,
3: 1,
4: 2,
5: 2,
6: 2,
7: 2,
8: 2,
9: 2,
10: 2,
11: 2,
12: 2,
13: 2,
14: 2,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 1,
116: 1,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
B: {
1: 1,
2: 1,
3: 1,
4: 1,
5: 1,
6: 1,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
12: 1,
13: 1,
14: 1,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 1,
116: 1,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
T: {
1: 2,
2: 0,
3: 3,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 2,
116: 2,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
W: {
1: 3,
2: 0,
3: 4,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 0,
29: 1,
30: 1,
31: 1,
32: 1,
33: 0,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 3,
116: 3,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
A: {
1: 1,
2: 1,
3: 1,
4: 1,
5: 1,
6: 1,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
12: 1,
13: 1,
14: 1,
15: 1,
16: 1,
17: 1,
18: 1,
19: 1,
20: 1,
21: 1,
22: 1,
23: 1,
24: 1,
25: 1,
26: 1,
27: 1,
28: 1,
29: 1,
30: 1,
31: 1,
32: 1,
33: 1,
34: 1,
35: 1,
36: 1,
37: 1,
38: 1,
39: 1,
40: 1,
41: 1,
42: 1,
43: 1,
44: 1,
45: 1,
46: 1,
47: 1,
48: 1,
49: 1,
50: 1,
51: 1,
52: 1,
53: 1,
54: 1,
55: 1,
56: 1,
57: 1,
81: 1,
86: 1,
82: 1,
87: 1,
83: 1,
88: 1,
84: 1,
89: 1,
85: 1,
90: 1,
91: 1,
92: 1,
93: 1,
94: 1,
95: 1,
96: 1,
97: 1,
98: 1,
99: 1,
100: 1,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 1,
112: 1,
113: 0,
114: 0,
115: 1,
116: 1,
117: 1,
118: 1,
119: 1,
120: 1,
121: 1,
122: 1,
123: 1,
124: 1,
125: 1,
126: 1,
127: 1,
128: 1,
129: 1,
130: 1,
131: 1,
132: 1,
133: 1,
134: 1,
135: 1,
136: 1,
137: 1,
138: 1,
139: 1,
140: 1,
141: 1,
142: 1,
143: 1,
144: 1,
145: 1,
146: 1,
147: 1,
148: 1,
149: 1,
150: 1,
151: 1,
152: 1,
153: 1,
154: 1,
155: 1,
156: 1,
157: 1,
158: 1,
159: 1,
160: 1,
161: 1,
162: 1,
163: 1,
164: 1,
165: 1,
166: 1,
167: 1,
168: 1,
169: 1,
170: 1,
171: 1,
172: 1,
173: 1,
174: 1,
175: 1,
176: 1,
"": 1,
181: 1,
182: 1,
183: 1,
184: 1,
185: 1,
186: 1,
187: 1,
188: 1,
189: 1,
190: 1,
191: 1,
192: 1,
193: 1,
194: 1,
195: 0
},
S: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 1,
29: 0,
30: 0,
31: 0,
32: 0,
33: 2,
34: 0,
35: 0,
36: 0,
37: 1,
38: 0,
39: 0,
40: 0,
41: 1,
42: 0,
43: 0,
44: 0,
45: 0,
46: 1,
47: 0,
48: 0,
49: 0,
50: 0,
51: 1,
52: 0,
53: 0,
54: 0,
55: 0,
56: 1,
57: 0,
81: 0,
86: 0,
82: 0,
87: 0,
83: 0,
88: 0,
84: 1,
89: 1,
85: 0,
90: 0,
91: 0,
92: 0,
93: 0,
94: 1,
95: 0,
96: 0,
97: 0,
98: 0,
99: 1,
100: 0,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 0,
112: 0,
113: 0,
114: 0,
115: 0,
116: 0,
117: 0,
118: 0,
119: 0,
120: 0,
121: 1,
122: 0,
123: 0,
124: 0,
125: 0,
126: 1,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 0,
151: 0,
152: 0,
153: 0,
154: 0,
155: 1,
156: 0,
157: 0,
158: 0,
159: 0,
160: 0,
161: 0,
162: 1,
163: 0,
164: 0,
165: 0,
166: 0,
167: 0,
168: 0,
169: 1,
170: 0,
171: 0,
172: 0,
173: 0,
174: 0,
175: 0,
176: 1,
"": 0,
181: 0,
182: 0,
183: 0,
184: 0,
185: 0,
186: 0,
187: 1,
188: 0,
189: 0,
190: 0,
191: 0,
192: 0,
193: 0,
194: 1,
195: 0
},
L: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 1,
29: 1,
30: 1,
31: 1,
32: 1,
33: 2,
34: 0,
35: 0,
36: 0,
37: 1,
38: 0,
39: 0,
40: 0,
41: 1,
42: 0,
43: 0,
44: 0,
45: 0,
46: 1,
47: 0,
48: 0,
49: 0,
50: 0,
51: 1,
52: 0,
53: 0,
54: 0,
55: 0,
56: 1,
57: 0,
81: 0,
86: 0,
82: 0,
87: 0,
83: 0,
88: 0,
84: 1,
89: 1,
85: 0,
90: 0,
91: 0,
92: 0,
93: 0,
94: 1,
95: 0,
96: 0,
97: 0,
98: 0,
99: 1,
100: 0,
101: 0,
102: 0,
103: 0,
104: 0,
105: 0,
106: 0,
107: 0,
108: 0,
109: 0,
110: 0,
111: 0,
112: 0,
113: 0,
114: 0,
115: 0,
116: 0,
117: 0,
118: 0,
119: 0,
120: 0,
121: 1,
122: 0,
123: 0,
124: 0,
125: 0,
126: 1,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 0,
151: 0,
152: 0,
153: 0,
154: 0,
155: 1,
156: 0,
157: 0,
158: 0,
159: 0,
160: 0,
161: 0,
162: 1,
163: 0,
164: 0,
165: 0,
166: 0,
167: 0,
168: 0,
169: 1,
170: 0,
171: 0,
172: 0,
173: 0,
174: 0,
175: 0,
176: 1,
"": 0,
181: 0,
182: 0,
183: 0,
184: 0,
185: 0,
186: 0,
187: 1,
188: 0,
189: 0,
190: 0,
191: 0,
192: 0,
193: 0,
194: 1,
195: 0
},
P: {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
7: 0,
8: 0,
9: 0,
10: 0,
11: 0,
12: 0,
13: 0,
14: 0,
15: 0,
16: 0,
17: 0,
18: 0,
19: 0,
20: 0,
21: 0,
22: 0,
23: 0,
24: 0,
25: 0,
26: 0,
27: 0,
28: 0,
29: 0,
30: 0,
31: 0,
32: 0,
33: 0,
34: 0,
35: 1,
36: 0,
37: 0,
38: 0,
39: 1,
40: 0,
41: 0,
42: 0,
43: 0,
44: 1,
45: 0,
46: 0,
47: 0,
48: 0,
49: 1,
50: 0,
51: 0,
52: 0,
53: 0,
54: 1,
55: 0,
56: 0,
57: 0,
85: 0,
90: 0,
84: 0,
89: 0,
83: 0,
88: 0,
82: 1,
87: 1,
81: 0,
86: 0,
91: 0,
92: 1,
93: 0,
94: 0,
95: 0,
96: 0,
97: 1,
98: 0,
99: 0,
100: 0,
101: 1,
102: 1,
103: 1,
104: 1,
105: 1,
106: 1,
107: 1,
108: 1,
109: 1,
110: 1,
111: 0,
112: 0,
113: 1,
114: 1,
115: 0,
116: 0,
117: 0,
118: 1,
119: 0,
120: 0,
121: 0,
122: 0,
123: 1,
124: 0,
125: 0,
126: 0,
127: 0,
128: 0,
129: 0,
130: 0,
131: 0,
132: 0,
133: 0,
134: 0,
135: 0,
136: 0,
137: 0,
138: 0,
139: 0,
140: 0,
141: 0,
142: 0,
143: 0,
144: 0,
145: 0,
146: 0,
147: 0,
148: 0,
149: 0,
150: 1,
151: 0,
152: 0,
153: 0,
154: 0,
155: 0,
156: 0,
157: 1,
158: 0,
159: 0,
160: 0,
161: 0,
162: 0,
163: 0,
164: 1,
165: 0,
166: 0,
167: 0,
168: 0,
169: 0,
170: 0,
171: 1,
172: 0,
173: 0,
174: 0,
175: 0,
176: 0,
"": 0,
181: 0,
182: 1,
183: 0,
184: 0,
185: 0,
186: 0,
187: 0,
188: 0,
189: 1,
190: 0,
191: 0,
192: 0,
193: 0,
194: 0,
195: 0
}
}
}
Object.freeze(BaseInfo);
class MapAnalyzer {
width;
height;
terrain;
bases;
properties;
//Array of Vector2i
blockers = [];
units;
canvas;
ctx;
dirty;
constructor(e = 0, t = 0) {
this.canvas = document.createElement("canvas"), this.resize(e, t), this.dirty = !0
}
resize(e, t) {
return this.width = e, this.height = t, this.canvas.width = 16 * this.width, this.canvas.height = 16 * this.height, this.ctx = this.canvas.getContext("2d"), this.ctx.textAlign = "center", this.terrain = new Array(e * t), this.bases = {}, this.properties = new Array(e * t).fill(null), this.units = {}, this
}
init(e) {
this.canvas.style = "\n pointer-events: none;\n z-index: 200;\n position: absolute;\n top: 0;\n left: 0;";
e = e ?? document.getElementById("gamemap");
if (e) {
e.append(this.canvas);
}
this.ctx = this.canvas.getContext("2d");
this.ctx.font = "12px monospace";
this.ctx.textAlign = "center";
}
idToCountry(e) {
return BaseInfo.terrain[e].country
}
isNeutral(e) {
return e >= 34 && e <= 37
}
getTile(e, t) {
return this.terrain[e + t * this.width]
}
setTile(e, t, n) {
let i = e + t * this.width;
return this.terrain[i] = n, this.dirty = !0, this
}
setBlocker(e, t) {
let exists = this.blockers.find(b => {
return b.x == e && b.y == t;
});
if (exists) {
let index = this.blockers.indexOf(exists);
this.blockers.splice(index, 1);
} else {
let v = new Vector2i();
v.x = e;
v.y = t;
this.blockers.push(v);
}
this.dirty = !0;
}
setUnit(e, t, n, i) {
this.units[e + t * this.width] = {
x: e,
y: t,
id: n,
country: i
}, this.dirty = !0
}
setUnits(e) {
this.deleteAllUnits();
for (let t = 0; t < e.length; t++) {
let n = e[t].units_x,
i = e[t].units_y,
o = e[t].units_id,
r = e[t].units_code;
this.setUnit(n, i, o, r)
}
}
deleteUnit(e, t) {
this.units[e + t * this.width] && (delete this.units[e + t * this.width], this.dirty = !0)
}
deleteAllUnits() {
this.units = {}, this.dirty = !0
}
swapSide() {
let e = {};
for (let t of Object.keys(this.units)) {
let n = this.units[t],
i = this.width - 1 - n.x,
o = this.height - 1 - n.y;
e[i + o * this.width] = Object.assign(n, {
x: i,
y: o
})
}
this.dirty = !0, this.units = e
}
setTerrain({
terrainInfo: e,
tiles: t
} = {}) {
if (this.dirty = !0, e) {
for (let t in e) {
t = parseInt(t);
for (let n in e[t]) n = parseInt(n), this.terrain[t + n * this.width] = e[t][n].terrain_id
}
for (let e in buildingsInfo) {
e = parseInt(e);
for (let t in buildingsInfo[e]) t = parseInt(t), this.terrain[e + t * this.width] = buildingsInfo[e][t].terrain_id
}
} else {
if (!t) throw new Error("give me some tiles bro");
for (let e = 0; e < this.width; e++) {
for (let n = 0; n < this.height; n++) {
const index = n + e * this.height; // Calculate index
let is_prop = t[index] == null;
if (is_prop) {
continue;
}
const i = t[index].terrain_id;
this.terrain[e + n * this.width] = i;
}
}
}
return this
}
getMoveCostGraph(e, j, c, t = "C") {
let n = new Array(this.width * this.height);
const i = BaseInfo.moveCosts[t][e];
for (let t = 0; t < this.height; t++) {
for (let o = 0; o < this.width; o++) {
// Vesper: Added code for the Bust Pipe Seam Function.
// Should return move cost value like it was broken if bustPipes (j) is on.
let r = this.terrain[o + t * this.width],
a = i[r],
bp = i[115];
let v = new Vector2i(o, t);
let b = "S" === e || "L" === e;
let s = 113 === r || 114 === r;
void 0 === a && (a = b ? -1 : 1)
if (0 === a && 195 !== r) {
a = -1;
}
if (j && s && !b) {
a = bp;
}
n[o + t * this.width] = a;
if (c) {
for (let vector of this.blockers) {
if (vector.x == v.x && vector.y == v.y) n[o + t * this.width] = -1;
}
}
}
}
return new WeightedDirectedGraph(n, this.width, this.height)
}
drawDistanceMap(e, t = 1 / 0, {
showCost: n = !1,
bgColor: i,
bustPipes: j = !0,
} = {}) {
let o = Math.min(t, e.reduce(((e, t) => Math.max(e, t || 0)), 1)),
r = this.ctx;
for (let t = 0; t < this.height; t++)
for (let a = 0; a < this.width; a++) {
let s = e[a + t * this.width];
if (s >= 0 && s <= o) {
if (i) {
r.fillStyle = `rgba(${i}, 0.15)`, r.strokeStyle = `rgba(${i}, 0.7)`;
} else {
let e = Math.round(255 * s / o),
t = Math.round(255 * (o - s) / o);
r.fillStyle = `rgba(${e}, ${t}, 0, 0.15)`, r.strokeStyle = `rgba(${e}, ${t}, 0, 0.7)`
}
let id = this.terrain[a + t * this.width];
if ((id == 113 || id == 114) && j) {
r.fillStyle = `rgba(255, 25, 25, 0.4)`, r.strokeStyle = `rgba(255, 25, 25, 0.8)`;
}
r.fillRect(16 * a, 16 * t, 16, 16), r.lineWidth = 1, r.strokeRect(16 * a, 16 * t, 16, 16), n && (this.setFont(), this.drawText(s, 16 * a + 8, 16 * t + 12))
}
}
return this.dirty = !1, this
}
async drawUnitTurns(e, t = 3, {
showAllTurns: n = !0,
showBg: i = !1,
bustPipes: j = !0,
blockers: b = !0,
colorMode: o = "Heatmap"
} = {}) {
this.dirty = !1, t = Math.min(t, 20);
const r = e[0].id,
a = BaseInfo.units[r].move_type,
s = parseInt(BaseInfo.units[r].move_points),
l = BaseInfo.units[r].name,
d = this.getMoveCostGraph(a, j, b),
u = e,
p = await loadImage(`terrain/aw1/${e[0].country}${l.toLowerCase().replace(" ","")}.gif`);
let c = new Dijkstra(d, u, this.width, this.height).iterate(s);
const y = this.ctx;
if (i) {
let n = !1;
if ("Country" === o) {
n = BaseInfo.countries[e[0].country].color
}
this.drawDistanceMap(c, t * s, {
bustPipes: j,
bgColor: n,
blockers: b,
})
}
this.setFont();
for (let e = 0; e < this.height; e++) {
for (let i = 0; i < this.width; i++) {
let o = n ? 1 : t;
for (; o <= t; o++) {
let t = s * o;
c[i + e * this.width] === t && (y.drawImage(p, 16 * i, 16 * e), n && this.drawText(`${o}`, 16 * i + 8, 16 * e + 12))
}
}
}
}
async drawBlockers() {
let blockerImage = await loadImage("terrain/moveplanner.gif");
for (let position of this.blockers) {
let imageX = position.x;
let imageY = position.y;
this.ctx.drawImage(blockerImage, 16 * imageX, 16 * imageY);
}
}
clear() {
return this.ctx.clearRect(0, 0, 16 * this.width, 16 * this.height), this
}
setFont() {
return this.ctx.font = "12px monospace", this.ctx.textAlign = "center", this.ctx.strokeStyle = "black", this.ctx.lineWidth = 3, this.ctx.fillStyle = "white", this
}
drawText(e, t, n) {
return this.ctx.strokeText(e, t, n), this.ctx.fillText(e, t, n), this
}
async drawFlow({
turns: e = 1,
showAllTurns: t = !1,
showBg: n = !0,
bustPipes: j = !0,
blockers: b = !0,
enableBlockers: z = !0,
colorMode: i = "Heatmap"
} = {}) {
this.dirty = !1;
let o = Object.values(this.units);
if (this.clear(), !o.length) return;
let r = {};
for (let e = 0; e < o.length; e++) {
let {
id: t,
country: n
} = o[e];
r[n] || (r[n] = {}), r[n][t] || (r[n][t] = []), r[n][t].push(o[e])
}
for (const o in r)
for (const a in r[o]) await this.drawUnitTurns(r[o][a], e, {
showAllTurns: t,
showBg: n,
bustPipes: j,
blockers: b && z,
colorMode: i
})
}
}
class WeightedDirectedGraph {
constructor(e, t, n) {
this.data = e, this.width = t, this.height = n
}
get length() {
return this.data.length
}
getWeight(e) {
return this.data[e]
}
getXY(e, t) {
return this.data[e + t * this.width]
}
getNeighbors(e, t) {
if (!(e >= 0 && e < this.width && t >= 0 && t < this.height)) throw new Error(`Graph node {x: ${e}, y: ${t}} not in bounds ${this.width},${this.height}`);
let n = [];
return e - 1 >= 0 && n.push({
x: e - 1,
y: t
}), t - 1 >= 0 && n.push({
x: e,
y: t - 1
}), e + 1 < this.width && n.push({
x: e + 1,
y: t
}), t + 1 < this.height && n.push({
x: e,
y: t + 1
}), n
}
}
class Dijkstra {
constructor(e, t, n, i) {
this.width = n, this.height = i, this.graph = e, this.start = [], this.distance = new Array(n * i).fill(void 0), t.forEach((e => {
this.start.push({
x: e.x,
y: e.y,
dist: 0
})
}))
}
makeQueue() {
return new TinyQueue([], ((e, t) => e.dist - t.dist))
}
iterate(e) {
let t = this.makeQueue(),
n = new Array(this.width * this.height).fill(!1);
this.start.forEach((e => {
t.push(e), n[e.x + e.y * this.width] = !0
}));
let i = 0,
o = 1;
for (; t.length > 0;) {
let r = e * o,
a = t;
for (t = this.makeQueue(); a.length > 0;) {
if (i++ > 2e6) return alert("@steve on discord, dijkstra got stuck.");
let {
x: e,
y: o,
dist: s
} = a.pop(), l = e + o * this.width;
this.distance[l] = s;
let d = this.graph.getNeighbors(e, o);
for (let i of d) {
let s = i.x + i.y * this.width;
const d = this.graph.getWeight(s);
if (d >= 0) {
let u = this.distance[l] + d;
!n[s] && u > r ? t.push({
x: e,
y: o,
dist: r
}) : (void 0 === this.distance[s] || u < this.distance[s]) && (a.push({
x: i.x,
y: i.y,
dist: u
}), this.distance[s] = u, n[s] = !0)
} else this.distance[s] = -1, n[s] = !0
}
}
o++
}
return this.distance
}
}
class Vector2i {
constructor(x = 0, y = 0) {
this.x = x;
this.y = y;
}
x = 0;
y = 0;
}
function initPrevmaps() {
Vue.component("PrevMapAnalyzer", {
template:
`<div id='replay-misc-controls'>
<div ref='openBtn' class='flex v-center' style='padding: 0px 5px; cursor: pointer; user-select: none;' @click='open = !open'>
<img src='terrain/followlist.gif'/><b>Analyze</b>
</div>
<div v-show='open' class='flex col' style='position: absolute; z-index:210; top: 100px; right: 0px;'>
<div class='bordertitle flex' style='color: #fff; background: #06c; border: 1px black solid; padding: 4px; justify-content: space-between;'>
<div style="font-weight: bold; display: block; float: left;">Map Analyzer - V5.1</div>
<div style="cursor: pointer" @click="open = false">
<img width='16' src="terrain/close.png"/>
</div>
</div>
<div style='background: #fff; border: 1px black solid; padding: 4px;'>
<div>
<button @click='toggleRendering("unitFlow")'>
{{ activeMode == 'unitFlow' ? 'Hide' : 'Show' }}
</button>
Unit Flow
</div>
<div>
<label>
Turns: <input v-model.number='mode.unitFlow.turns' type='number' max='10' min='1' style='width:80px'/>
</label>
<button v-if='false' @click='swapSide()'>Swap</button>
<br>
<label>
<input type='checkbox' v-model='mode.unitFlow.showAllTurns'/>
<span> Show All Turns</span>
</label>
<br>
<label>
<input type='checkbox' v-model='mode.unitFlow.bustPipes'/>
<span> Bust Pipe Seams</span>
</label>
<br>
<label>
<input type='checkbox' v-model='mode.unitFlow.enableBlockers'/>
<span> Enable Blockers</span>
</label>
<div v-show='markingBlockers' @click='cancelNextPress()' style="margin-bottom: -10px; font-weight: bold; padding: 8px; background: #ff972b; border: 2px solid black">
Mark Blocker
</div>
<div v-show='!markingBlockers' @click='markNextPress()' style="margin-bottom: -10px; font-weight: bold; padding: 8px; background: #7ebeff;">
Mark Blocker
</div>
<br>
<label>
<input type='checkbox' v-model='mode.unitFlow.showBg'/>
<span> Backdrop: </span>
</label>
<select v-model='mode.unitFlow.colorMode'>
<option v-for='opt in colorModeOptions' :value='opt'>{{opt}}</option>
</select>
</div>
<hr>
<div style='width: 220px;'>
<img
v-for='cc in countries'
style='width: 24px; margin: 1px; cursor: pointer;'
@click='selectCountry(cc)'
:src='"terrain/aw1/"+ cc +"logo.gif"'
>
</div>
<div style='width: 210px;'>
<img
v-for='unit, id in BaseInfo.units'
style='width:24px; cursor: pointer; margin: 4px;'
:style='{border: id == selectedUnit ? "2px #2cf dashed" : "2px #ddd solid"}'
@click='selectUnit(id)'
:src='"terrain/aw1/"+ selectedCountry +unit.name.toLowerCase().replace(" ","") + ".gif"'
>
</div>
<div>
<button @click='deleteAllUnits()'>Clear</button>
</div>
</div>
</div>
</div>`,
props: {
countries: Array
},
data: function() {
return {
loaded: !1,
open: !1,
drawing: !1,
dirty: !0,
selectedUnit: 1,
selectedCountry: this.countries[0],
activeMode: "",
markingBlockers: false,
mode: {
unitFlow: {
turns: 1,
showAllTurns: !1,
showBg: !0,
bustPipes: !0,
enableBlockers: false,
colorMode: "Country",
},
capRoute: {
turns: 1
},
},
colorModeOptions: ["Country", "Heatmap"]
}
},
created() {
this.BaseInfo = BaseInfo;
let e = sessionStorage.analyzerSettings;
e && (e = JSON.parse(e), this.mode = e), window.gameMap.addEventListener("click", (e => {
if (!this.open) return;
let {
x: t,
y: n
} = function(e) {
let t = window.gameMap.getBoundingClientRect(),
n = Math.floor((e.clientX - t.left) / (16 * scale)),
i = Math.floor((e.clientY - t.top) / (16 * scale));
return n = Math.max(0, Math.min(window.mapWidth - 1, n)), i = Math.max(0, Math.min(window.mapHeight - 1, i)), {
x: n,
y: i
}
}(e);
if (!this.markingBlockers) this.setUnit(t, n);
else this.setBlocker(t, n);
})), window.addEventListener("keydown", (e => {
e.repeat || ("ArrowRight" === e.key ? (e.preventDefault(), this.mode.unitFlow.turns = Math.min(10, Math.max(1, this.mode.unitFlow.turns + 1))) : "ArrowLeft" === e.key && (e.preventDefault(), this.mode.unitFlow.turns = Math.min(10, Math.max(1, this.mode.unitFlow.turns - 1))))
})), this.saveSettings = _.debounce((() => {
sessionStorage.analyzerSettings = JSON.stringify(this.mode)
}), 1500), this.$nextTick((() => this.loaded = !0))
},
computed: {
unitNames() {
return Object.values(this.BaseInfo.units).map((e => e.name.toLowerCase().replace(" ", "")))
},
predeployedUnits() {
return Array.from(window.gameMap.querySelectorAll("span > img")).filter((e => {
const t = e.src;
for (const e of this.unitNames)
if (t.includes(e + ".gif")) return !0;
return !1
}))
}
},
watch: {
open(e) {
e ? (this.predeployedUnits.forEach((e => e.style.display = "none")), window.gameMap.style.cursor = "pointer") : (this.predeployedUnits.forEach((e => e.style.display = "")), window.gameMap.style.cursor = "default")
},
mode: {
handler() {
this.dirty = !0, this.loaded && this.saveSettings()
},
deep: !0
}
},
methods: {
markNextPress() {
this.markingBlockers = true;
},
cancelNextPress() {
this.markingBlockers = false;
},
setBlocker(e, t) {
window.mapAnalyzer.setBlocker(e, t);
},
setUnit(e, t) {
window.mapAnalyzer.units[e + t * window.mapAnalyzer.width] ? window.mapAnalyzer.deleteUnit(e, t) : window.mapAnalyzer.setUnit(e, t, this.selectedUnit, this.selectedCountry), this.updateUnits()
},
deleteAllUnits() {
window.mapAnalyzer.deleteAllUnits(), this.updateUnits()
},
updateUnits() {
window.gameMap.querySelectorAll('[data-analyzer="unit"]').forEach((e => {
e.remove()
}));
let e = window.mapAnalyzer.units;
for (const t in e) {
if (!e[t]) continue;
let {
x: n,
y: i,
id: o,
country: r
} = e[t], a = this.BaseInfo.units[o].name.toLowerCase().replace(" ", ""), s = document.createElement("img");
s.src = `terrain/aw1/${r}${a}.gif`, s.style.position = "absolute", s.style.left = 16 * n + "px", s.style.top = 16 * i + "px", s.style.zIndex = "120", s.dataset.analyzer = "unit", window.gameMap.append(s)
}
window.mapAnalyzer.drawBlockers();
},
selectUnit(e) {
this.selectedUnit = e
},
selectCountry(e) {
this.selectedCountry = e
},
async render(e) {
window.mapAnalyzer.drawBlockers();
let t = this.activeMode;
if (t) {
if (window.mapAnalyzer.dirty || this.dirty) {
this.dirty = !1
try {
this.mode[t];
"unitFlow" === t ? await window.mapAnalyzer.drawFlow(this.mode[t]) : "capRoute" === t && window.mapAnalyzer.clear()
} catch (e) {
return console.log(e), cancelAnimationFrame(this.drawing), this.drawing = !1, window.mapAnalyzer.clear(), void alert("map analyzer broke")
}
}
this.drawing = requestAnimationFrame(this.render)
}
},
toggleRendering(e) {
cancelAnimationFrame(this.drawing), e === this.activeMode ? (this.drawing = !1, this.activeMode = "", window.mapAnalyzer.clear()) : (this.dirty = !0, this.activeMode = e, this.drawing = requestAnimationFrame(this.render))
},
swapSide() {
window.mapAnalyzer.swapSide()
}
}
});
let gameContainer = document.querySelector("#gamecontainer");
if (gameContainer == undefined) return;
let extensionPanel = document.querySelector("#vesper-extensions");
if (extensionPanel == undefined) {
extensionPanel = document.createElement("div");
extensionPanel.id = "vesper-extensions";
extensionPanel.style.background = '#98a0b8';
extensionPanel.style.border = '2px solid #768a96';
extensionPanel.style.display = 'flex';
extensionPanel.style.flexDirection = 'row';
extensionPanel.style.padding = '4px';
extensionPanel.style.margin = '0px';
extensionPanel.style.marginBottom = '8px';
gameContainer.children[1].after(extensionPanel);
}
let e = document.createElement("div");
e.id = "map-analyzer-component";
extensionPanel.append(e);
let t = [],
n = window.mapWidth,
i = window.mapHeight;
for (let e = 0; e < n; e++)
for (let n = 0; n < i; n++) terrainInfo[e] && terrainInfo[e][n] ? t.push(terrainInfo[e][n]) : t.push(buildingsInfo[e][n]);
let o = Object.keys(BaseInfo.countries).map((e => e)).sort(((e, t) => BaseInfo.countries[e].id - BaseInfo.countries[t].id));
window.mapAnalyzer = new MapAnalyzer, mapAnalyzer.init(), mapAnalyzer.resize(n, i), mapAnalyzer.setTerrain({
tiles: t
}), window.analyzerComponent = new Vue({
el: "#map-analyzer-component",
template: '<PrevMapAnalyzer :countries="countries"/>',
data: function() {
return {
countries: o
}
}
})
}
function initEditmap() {
Vue.component("EditMapAnalyzer", {
template:
`<div id='replay-misc-controls'>
<div ref='openBtn' class='flex v-center' style='padding: 0px 5px; cursor: pointer; user-select: none;' @click='open = !open'>
<img src='terrain/followlist.gif'/>
<b>Analyze</b>
</div>
<div v-show='open' class='flex col' style='position: absolute; z-index:210; right: 212px;'>
<div class='bordertitle flex' style='color: #fff; background: #06c; border: 1px black solid; padding: 4px; justify-content: space-between;'>
<div style="font-weight: bold; display: block; float: left;">Map Analyzer - V5.1</div>
<div style="cursor: pointer" @click="open = false">
<img width='16' src="terrain/close.png"/>
</div>
</div>
<div style='background: #fff; border: 1px black solid; padding: 4px;'>
<div>
<button @click='toggleRendering("unitFlow")'>
{{ activeMode == 'unitFlow' ? 'Hide' : 'Show' }}
</button>
Unit Flow
</div>
<div>
<label>
Turns <input v-model.number='mode.unitFlow.turns' type='number' max='10' min='1' style='width:80px'/>
</label>
<button v-if='false' @click='swapSide()'>Swap</button>
<br>
<label>
<input type='checkbox' v-model='mode.unitFlow.showAllTurns'/>
<span> Show All Turns</span>
</label>
<br>
<label>
<input type='checkbox' v-model='mode.unitFlow.bustPipes'/>
<span> Bust Pipe Seams</span>
</label>
<br>
<label>
<input type='checkbox' v-model='mode.unitFlow.showBg'/>
<span> Backdrop</span>
</label>
<select v-model='mode.unitFlow.colorMode'>
<option v-for='opt in colorModeOptions' :value='opt'>{{opt}}</option>
</select>
</div>
</div>
</div>
</div>`,
props: {},
data: function() {
return {
loaded: !1,
open: !1,
drawing: !1,
dirty: !0,
activeMode: "",
mode: {
unitFlow: {
turns: 1,
showAllTurns: !1,
showBg: !0,
colorMode: "Country"
},
capRoute: {
turns: 1
}
},
colorModeOptions: ["Country", "Heatmap"]
}
},
created() {
let e = sessionStorage.analyzerSettings;
e && (e = JSON.parse(e), this.mode = e), window.addEventListener("keydown", (e => {
e.repeat || ("ArrowRight" === e.key ? (e.preventDefault(), this.mode.unitFlow.turns = Math.min(10, Math.max(1, this.mode.unitFlow.turns + 1))) : "ArrowLeft" === e.key && (e.preventDefault(), this.mode.unitFlow.turns = Math.min(10, Math.max(1, this.mode.unitFlow.turns - 1))))
})), this.saveSettings = _.debounce((() => {
sessionStorage.analyzerSettings = JSON.stringify(this.mode)
}), 1500), this.$nextTick((() => this.loaded = !0))
},
computed: {},
watch: {
mode: {
handler() {
this.dirty = !0, this.loaded && this.saveSettings()
},
deep: !0
}
},
methods: {
setUnit(e, t) {
window.mapAnalyzer.units[e + t * window.mapAnalyzer.width] ? window.mapAnalyzer.deleteUnit(e, t) : window.mapAnalyzer.setUnit(e, t, this.selectedUnit, this.selectedCountry)
},
deleteAllUnits() {
window.mapAnalyzer.deleteAllUnits()
},
async render(e) {
let t = this.activeMode;
if (t) {
if (window.mapAnalyzer.dirty || this.dirty) {
this.dirty = !1;
try {
let e = this.mode[t];
"unitFlow" === t ? await window.mapAnalyzer.drawFlow(e) : "capRoute" === t && window.mapAnalyzer.clear()
} catch (e) {
return console.log(e), cancelAnimationFrame(this.drawing), this.drawing = !1, window.mapAnalyzer.clear(), void alert("map analyzer broke")
}
}
this.drawing = requestAnimationFrame(this.render)
}
},
toggleRendering(e) {
cancelAnimationFrame(this.drawing), e === this.activeMode ? (this.drawing = !1, this.activeMode = "", window.mapAnalyzer.clear()) : (this.dirty = !0, this.activeMode = e, this.drawing = requestAnimationFrame(this.render))
},
swapSide() {
window.mapAnalyzer.swapSide()
}
}
});
let e = setInterval((() => {
if (!designMapEditor.loaded) return;
clearInterval(e), window.mapAnalyzer = new MapAnalyzer, mapAnalyzer.init(), mapAnalyzer.resize(designMapEditor.map.maxX, designMapEditor.map.maxY), mapAnalyzer.setTerrain({
tiles: designMapEditor.tiles
}), mapAnalyzer.setUnits(designMapEditor.units);
let t = designMapEditor.updateTile;
designMapEditor.updateTile = function(e, n, i) {
t.call(designMapEditor, e, n, i), "terrain" === designMapEditor.currentType || "building" === designMapEditor.currentType ? mapAnalyzer.setTile(n, i, e) : "unit" === designMapEditor.currentType ? mapAnalyzer.setUnit(n, i, e, designMapEditor.countryCode) : "delete" === designMapEditor.currentType && mapAnalyzer.deleteUnit(n, i)
};
let n = designMapEditor.updateTerrainInfo;
designMapEditor.updateTerrainInfo = function() {
n.call(designMapEditor), mapAnalyzer.resize(designMapEditor.map.maxX, designMapEditor.map.maxY), mapAnalyzer.setTerrain({
tiles: designMapEditor.tiles
})
};
let i = designMapEditor.fillMap;
designMapEditor.fillMap = function(e) {
i.call(designMapEditor, e), "unit" === designMapEditor.currentType ? mapAnalyzer.setUnits(designMapEditor.units) : "delete" === designMapEditor.currentType && mapAnalyzer.deleteAllUnits()
};
let o = designMapEditor.resizeMap;
designMapEditor.resizeMap = function(e, t) {
o.call(designMapEditor, e, t), mapAnalyzer.setUnits(designMapEditor.units)
};
let r = document.createElement("div");
r.id = "map-analyzer-component", document.getElementById("design-map-controls-container").children[0].append(r), window.analyzerComponent = new Vue({
el: "#map-analyzer-component",
template: "<EditMapAnalyzer/>"
})
}), 100)
}
async function loadThisShit() {
"undefined" == typeof Vue && await loadScript("js/vue.js"), await loadScript("js/tinyqueue.js"), "undefined" == typeof _ && await loadScript("js/lodash.min.js"), window.location.pathname.match("prevmaps.php") ? initPrevmaps() : window.location.pathname.match("editmap.php") && initEditmap()
}
window.gameMap = document.getElementById("gamemap"), loadThisShit();