summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data.js2
-rw-r--r--events.txt313
-rw-r--r--rules.js288
-rw-r--r--tools/gendata.js4
4 files changed, 434 insertions, 173 deletions
diff --git a/data.js b/data.js
index 3962c0f..df89b98 100644
--- a/data.js
+++ b/data.js
@@ -1,2 +1,2 @@
-const data = {"first_space":0,"first_pop":0,"first_city":0,"last_city":10,"first_dept":11,"last_pop":22,"last_dept":28,"first_loc":29,"last_loc":46,"last_space":46,"card_order":[null,[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,3,2],[0,1,3,2],[0,1,3,2],[0,2,1,3],[0,2,1,3],[0,2,1,3],[0,2,3,1],[0,2,3,1],[0,2,3,1],[0,3,1,2],[0,3,1,2],[0,3,1,2],[0,3,2,1],[0,3,2,1],[0,3,2,1],[1,0,2,3],[1,0,2,3],[1,0,2,3],[1,0,3,2],[1,0,3,2],[1,0,3,2],[1,2,0,3],[1,2,0,3],[1,2,0,3],[1,2,3,0],[1,2,3,0],[1,2,3,0],[1,3,0,2],[1,3,0,2],[1,3,0,2],[1,3,2,0],[1,3,2,0],[1,3,2,0],[2,0,1,3],[2,0,1,3],[2,0,1,3],[2,0,3,1],[2,0,3,1],[2,0,3,1],[2,1,0,3],[2,1,0,3],[2,1,0,3],[2,1,3,0],[2,1,3,0],[2,1,3,0],[2,3,0,1],[2,3,0,1],[2,3,0,1],[2,3,1,0],[2,3,1,0],[2,3,1,0],[3,0,1,2],[3,0,1,2],[3,0,1,2],[3,0,2,1],[3,0,2,1],[3,0,2,1],[3,1,0,2],[3,1,0,2],[3,1,0,2],[3,1,2,0],[3,1,2,0],[3,1,2,0],[3,2,0,1],[3,2,0,1],[3,2,0,1],[3,2,1,0],[3,2,1,0],[3,2,1,0],[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,2,3]],"card_title":[null,"1st Division","Ospina & Mora","Tapias","Caño Limón - Coveñas","Occidental & Ecopetrol","Oil Spill","7th Special Forces","Fuerza Aérea Colombiana","High Mountain Battalions","Blackhawks","National Defense & Security Council","Plan Colombia","Plan Meteoro","Tres Esquinas","War Tax","Coffee Prices","Madrid Donors","NSPD-18","General Offensive","Mono Jojoy","Raúl Reyes","Alfonso Cano","DoD Contractors","Operación Jaque","Ejército de Liberación Nacional","Gramaje","Misil Antiaéreo","Hugo Chávez","Kill Zone","Peace Commission","Betancourt","Secuestrados","Sucumbíos","Airdropped AKs","Crop Substitution","Zona de Convivencia","Former Military","National Coordination Center","Soldados Campesinos","Demobilization","Mancuso","Senado & Cámara","Calima Front","Colombia Nueva","Los Derechos Humanos","Limpieza","Pinto & del Rosario","Unión Sindical Obrera","Bloques","Carabineros","Pipeline Repairs","Castaño","Criminal Air Force","Deserters & Defectors","DEA Agents","Drogas La Rebaja","Op Millennium","General Serrano","Salcedo","The Chess Player","Air Bridge","Amazonía","Narco-War","Cocaine Labs","Poppies","Tingo María","Mexican Traffickers","Narco-Subs","Riverines & Fast Boats","Ayahuasca Tourism","Darién","Sicarios","Propaganda!","Propaganda!","Propaganda!","Propaganda!"],"card_flavor":[null,"Jointness","COIN experts take charge","CO tightens civil-military bonds","Profitable pipeline","Oil company security","Rebels blamed","Infrastructure protection training","COIN strike aircraft","Elites guard high-altitude corridors","US helos delivered","Military-police jointness","US \"War on Drugs\"","Transport protection units","Forward base","Defense budget shot in the arm","They're up","Aid conference generous","US \"War on Terror\" takes on FARC",null,"KIA puts FARC in disarray","FARC Deputy killed","FARC leader killed in military strike","US provides aircrew","Dramatic hostage rescue","ELN and FARC jockey","FARC protection rejected","FARC MANPADs deemed a myth","Caracas controls border","Army sniffs out FARC trap","FARC accused in Commissioner's killing","Sympathy for famous hostage","Fed up with hostage-taking","Ecuadoran buffer zone","Insurgents scammed by Russian criminals","Government initiative","ELN gets its DMZ","Ties that bind","New command fights paramilitaries","Local forces platoons","Negotiated reintegration","AUC No.2 extradited","Unity behind Presidential war policy","Suspect leftists massacred","Anti-corruption campaign","Officers disciplined","Ruthless elimination","Human rights investigators","AUC targets oil labor organizers","Militias defy Castaño","National police field forces","Speedy patching","AUC leader's memoir a best seller","Insurgent access to small aircraft",null,"Law enforcement assistance","Cali cartel's drugstore chain seized","Colombian-US strike at Bernal syndicate","National Police hammer cartels","Cartel informant","Kingpin strategy scores","Peruvian coca supply controlled","Brasília's Op Cobra blocks border","Rival syndicates go for the throat","FARC taps suppliers","Growers and Government eradication focus on heroin source","Coca crop fails","Major shipment busted en route","Submersibles seized",null,"Eco-tourism helps trade balance","Arms traffic interdicted","Hired drug guns unreliable"],"card_flavor_shaded":[null,"Service parochialism","COIN strategy eludes Army","Civil-military rivalries fester","Pipeline draws attacks","Industry thought exploitative","Multinationals make mess","US training ineffective","Budget diverted to expensive jets","Equipment not delivered","Delivery of US helos delayed","Military-police rivalry","US aid focuses on drug war","Transport security deemphasized","Base overrun","Middle class resents cost of war","They're down","EU aid focuses on reconstruction","US focused on Mid-East and South Asia",null,"Military strategist","FARC Deputy channels foreign support","Ideologue","Plane down - hostage search and evasion","Hostage rescue goes awry","ELN and FARC coordinate ops","Schedule of fees","MANPADs feared","Caracas aids rebels","Tactics lure enemy in","Peace bid","Hostage negotiations forum for FARC","Ransoming highly profitable","Cross-border war","Covert weapons delivery","FARC proposals lauded",null,"Ex-officers advise paramilitaries","Sympathizers alert AUC","Local forces augment autodefensas","Talks a ruse, fighters recycled","AUC drug lord","Insurgent sympathies","Brutality blamed on Army","Political campaign divisive","International human rights cartel",null,"Prosecutors killed","Labor backs FARC","Independent militias join AUC","National police corruption","Security concerns hinder maintenance","Charismatic AUC political leader",null,null,"Más Yanquis","Retail empire","Investigation penetrated","Officials on cartel payroll","Cali cartel security chief","Cali's Gilberto Rodríguez Orejuela expands empire","Colombian coca growers fill Peruvian void","Jungle landing strips",null,"Well-oiled industry",null,"Hearty coca variety","New routes to US market","Littoral stealth",null,"Eco-tourists taken","Border sanctuary","Unemployed ready to work for syndicates"],"card_unshaded_lines":[0,3,2,3,3,3,3,3,2,2,2,2,3,3,3,3,4,3,3,0,3,3,3,3,3,2,3,3,3,3,4,3,4,3,3,3,0,4,4,2,3,3,3,4,4,3,0,3,3,3,3,3,3,0,4,3,3,3,3,3,3,3,3,0,4,0,3,2,3,0,3,3,3],"card_shaded_lines":[0,3,3,3,3,4,4,3,2,3,4,3,4,3,3,3,2,4,4,0,4,4,4,4,4,4,4,4,4,4,3,3,2,4,4,4,0,4,3,3,4,3,4,3,3,4,0,4,4,3,4,4,4,0,0,4,4,4,3,4,4,4,3,0,3,0,4,4,3,0,4,4,4],"space_name":["Bogotá","Cali","Medellín","Bucaramanga","Ibagué","Santa Marta","Cartagena","Cúcuta","Neiva","Pasto","Sincelejo","Atlántico","Chocó","Nariño","Meta West","Guaviare","Putumayo","Cesar","Antioquia","Santander","Huila","Arauca","Meta East","Vichada","Guainía","Vaupés","Amazonas","Ecuador","Panamá","Santa Marta / Cartagena","Cali / Pasto","Neiva / Pasto","Bogotá / San José","Pasto / Tumaco","Cali / Buenaventura","Cartagena / Sincelejo","Sincelejo / Medellín","Medellín / Ibagué","Ibagué / Cali","Bucaramanga / Ibagué / Bogotá","Bogotá / Neiva","Cúcuta / Arauca","Bogotá / Yopal","Santa Marta / Ayacucho","Bucaramanga / Ayacucho","Sincelejo / Ayacucho","Cúcuta / Ayacucho"],"spaces":[{"type":"city","id":"Bogota","pop":8,"adjacent":[14,19,20,22,32,39,40,42]},{"type":"city","id":"Cali","pop":3,"adjacent":[12,13,20,30,34,38]},{"type":"city","id":"Medellin","pop":3,"adjacent":[12,18,36,37]},{"type":"city","id":"Bucaramanga","pop":2,"adjacent":[18,19,39,44]},{"type":"city","id":"Ibague","pop":2,"adjacent":[12,18,20,37,38,39]},{"type":"city","id":"Santa Marta","pop":2,"adjacent":[11,17,29,43]},{"type":"city","id":"Cartagena","pop":1,"adjacent":[11,29,35]},{"type":"city","id":"Cucuta","pop":1,"adjacent":[19,41,46]},{"type":"city","id":"Neiva","pop":1,"adjacent":[14,16,20,31,40]},{"type":"city","id":"Pasto","pop":1,"adjacent":[13,16,20,27,30,31,33]},{"type":"city","id":"Sincelejo","pop":1,"adjacent":[11,12,18,35,36,45]},{"type":"forest","id":"Atlantico","pop":1,"adjacent":[5,6,10,17,18,19,29,35,43,44,45,46]},{"type":"forest","id":"Choco","pop":1,"adjacent":[1,2,4,10,13,18,20,28,34,36,37,38]},{"type":"forest","id":"Narino","pop":1,"adjacent":[1,9,12,20,27,30,33,34]},{"type":"forest","id":"Meta West","pop":1,"adjacent":[0,8,15,16,20,22,32,40]},{"type":"forest","id":"Guaviare","pop":1,"adjacent":[14,16,22,23,24,25,32]},{"type":"forest","id":"Putumayo","pop":1,"adjacent":[8,9,14,15,20,25,26,27,31]},{"type":"mountain","id":"Cesar","pop":1,"adjacent":[5,11,18,19,43,44,45,46]},{"type":"mountain","id":"Antioquia","pop":2,"adjacent":[2,3,4,10,11,12,17,19,20,36,37,39,43,44,45,46]},{"type":"mountain","id":"Santander","pop":2,"adjacent":[0,3,7,11,17,18,20,21,22,39,41,42,43,44,45,46]},{"type":"mountain","id":"Huila","pop":2,"adjacent":[0,1,4,8,9,12,13,14,16,18,19,30,31,38,39,40]},{"type":"grassland","id":"Arauca","pop":1,"adjacent":[19,22,23,41,42]},{"type":"grassland","id":"Meta East","pop":1,"adjacent":[0,14,15,19,21,23,32,42]},{"type":"grassland","id":"Vichada","pop":0,"adjacent":[15,21,22,24]},{"type":"forest","id":"Guainia","pop":0,"adjacent":[15,23,25]},{"type":"forest","id":"Vaupes","pop":0,"adjacent":[15,16,24,26]},{"type":"forest","id":"Amazonas","pop":0,"adjacent":[16,25]},{"type":"foreign","id":"Ecuador","pop":0,"adjacent":[9,13,16,33]},{"type":"foreign","id":"Panama","pop":0,"adjacent":[12]},{"type":"road","id":"Santa Marta / Cartagena","econ":1,"adjacent":[5,6,11]},{"type":"road","id":"Cali / Pasto","econ":1,"adjacent":[1,9,13,20]},{"type":"road","id":"Neiva / Pasto","econ":1,"adjacent":[8,9,16,20]},{"type":"road","id":"Bogota / San Jose","econ":1,"adjacent":[0,14,15,22]},{"type":"road","id":"Pasto / Tumaco","econ":1,"adjacent":[9,13,27]},{"type":"pipeline","id":"Cali / Buenaventura","econ":1,"adjacent":[1,12,13]},{"type":"pipeline","id":"Cartagena / Sincelejo","econ":1,"adjacent":[6,10,11]},{"type":"pipeline","id":"Sincelejo / Medellin","econ":2,"adjacent":[2,10,12,18]},{"type":"pipeline","id":"Medellin / Ibague","econ":1,"adjacent":[2,4,12,18]},{"type":"pipeline","id":"Ibague / Cali","econ":1,"adjacent":[1,4,12,20]},{"type":"pipeline","id":"Bucaramanga / Ibague / Bogota","econ":2,"adjacent":[0,3,4,18,19,20]},{"type":"pipeline","id":"Bogota / Neiva","econ":2,"adjacent":[0,8,14,20]},{"type":"pipeline","id":"Cucuta / Arauca","econ":3,"adjacent":[7,19,21,21]},{"type":"pipeline","id":"Bogota / Yopal","econ":2,"adjacent":[0,19,21,22]},{"type":"pipeline","id":"Santa Marta / Ayacucho","econ":2,"adjacent":[5,11,17,18,19,44,45,46]},{"type":"pipeline","id":"Bucaramanga / Ayacucho","econ":2,"adjacent":[3,11,17,18,19,43,45,46]},{"type":"pipeline","id":"Sincelejo / Ayacucho","econ":3,"adjacent":[10,11,17,18,19,43,44,46]},{"type":"pipeline","id":"Cucuta / Ayacucho","econ":3,"adjacent":[7,11,17,18,19,43,44,45]}],"adjacent_patrol":[[32,39,40,42],[30,34,38],[36,37],[39,44],[37,38,39],[29,43],[29,35],[41,46],[31,40],[30,31,33],[35,36,45],[5,6,10,29,35,43,44,45,46],[1,2,4,10,34,36,37,38],[1,9,30,33,34],[0,8,32,40],[32],[8,9,31],[5,43,44,45,46],[2,3,4,10,36,37,39,43,44,45,46],[0,3,7,39,41,42,43,44,45,46],[0,1,4,8,9,30,31,38,39,40],[41,42],[0,32,42],[],[],[],[],[9,33],[],[5,6],[1,9],[8,9],[0],[9],[1],[6,10],[2,10],[2,4],[1,4],[0,3,4],[0,8],[7],[0],[5,44,45,46],[3,43,45,46],[10,43,44,46],[7,43,44,45]],"first_piece":[[0,3,3,33,0],[63,72],[102,108],[126,141]],"last_piece":[[2,2,32,62,-1],[71,101],[107,125],[140,152]]}
+const data = {"first_space":0,"first_pop":0,"first_city":0,"last_city":10,"first_dept":11,"last_pop":22,"last_dept":28,"first_loc":29,"last_loc":46,"last_space":46,"card_order":[null,[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,3,2],[0,1,3,2],[0,1,3,2],[0,2,1,3],[0,2,1,3],[0,2,1,3],[0,2,3,1],[0,2,3,1],[0,2,3,1],[0,3,1,2],[0,3,1,2],[0,3,1,2],[0,3,2,1],[0,3,2,1],[0,3,2,1],[1,0,2,3],[1,0,2,3],[1,0,2,3],[1,0,3,2],[1,0,3,2],[1,0,3,2],[1,2,0,3],[1,2,0,3],[1,2,0,3],[1,2,3,0],[1,2,3,0],[1,2,3,0],[1,3,0,2],[1,3,0,2],[1,3,0,2],[1,3,2,0],[1,3,2,0],[1,3,2,0],[2,0,1,3],[2,0,1,3],[2,0,1,3],[2,0,3,1],[2,0,3,1],[2,0,3,1],[2,1,0,3],[2,1,0,3],[2,1,0,3],[2,1,3,0],[2,1,3,0],[2,1,3,0],[2,3,0,1],[2,3,0,1],[2,3,0,1],[2,3,1,0],[2,3,1,0],[2,3,1,0],[3,0,1,2],[3,0,1,2],[3,0,1,2],[3,0,2,1],[3,0,2,1],[3,0,2,1],[3,1,0,2],[3,1,0,2],[3,1,0,2],[3,1,2,0],[3,1,2,0],[3,1,2,0],[3,2,0,1],[3,2,0,1],[3,2,0,1],[3,2,1,0],[3,2,1,0],[3,2,1,0],[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,2,3]],"card_title":[null,"1st Division","Ospina & Mora","Tapias","Caño Limón - Coveñas","Occidental & Ecopetrol","Oil Spill","7th Special Forces","Fuerza Aérea Colombiana","High Mountain Battalions","Blackhawks","National Defense & Security Council","Plan Colombia","Plan Meteoro","Tres Esquinas","War Tax","Coffee Prices","Madrid Donors","NSPD-18","General Offensive","Mono Jojoy","Raúl Reyes","Alfonso Cano","DoD Contractors","Operación Jaque","Ejército de Liberación Nacional","Gramaje","Misil Antiaéreo","Hugo Chávez","Kill Zone","Peace Commission","Betancourt","Secuestrados","Sucumbíos","Airdropped AKs","Crop Substitution","Zona de Convivencia","Former Military","National Coordination Center","Soldados Campesinos","Demobilization","Mancuso","Senado & Cámara","Calima Front","Colombia Nueva","Los Derechos Humanos","Limpieza","Pinto & del Rosario","Unión Sindical Obrera","Bloques","Carabineros","Pipeline Repairs","Castaño","Criminal Air Force","Deserters & Defectors","DEA Agents","Drogas La Rebaja","Op Millennium","General Serrano","Salcedo","The Chess Player","Air Bridge","Amazonía","Narco-War","Cocaine Labs","Poppies","Tingo María","Mexican Traffickers","Narco-Subs","Riverines & Fast Boats","Ayahuasca Tourism","Darién","Sicarios","Propaganda!","Propaganda!","Propaganda!","Propaganda!"],"card_flavor":[null,"Jointness","COIN experts take charge","CO tightens civil-military bonds","Profitable pipeline","Oil company security","Rebels blamed","Infrastructure protection training","COIN strike aircraft","Elites guard high-altitude corridors","US helos delivered","Military-police jointness","US \"War on Drugs\"","Transport protection units","Forward base","Defense budget shot in the arm","They're up","Aid conference generous","US \"War on Terror\" takes on FARC",null,"KIA puts FARC in disarray","FARC Deputy killed","FARC leader killed in military strike","US provides aircrew","Dramatic hostage rescue","ELN and FARC jockey","FARC protection rejected","FARC MANPADs deemed a myth","Caracas controls border","Army sniffs out FARC trap","FARC accused in Commissioner's killing","Sympathy for famous hostage","Fed up with hostage-taking","Ecuadoran buffer zone","Insurgents scammed by Russian criminals","Government initiative","ELN gets its DMZ","Ties that bind","New command fights paramilitaries","Local forces platoons","Negotiated reintegration","AUC No.2 extradited","Unity behind Presidential war policy","Suspect leftists massacred","Anti-corruption campaign","Officers disciplined","Ruthless elimination","Human rights investigators","AUC targets oil labor organizers","Militias defy Castaño","National police field forces","Speedy patching","AUC leader's memoir a best seller","Insurgent access to small aircraft",null,"Law enforcement assistance","Cali cartel's drugstore chain seized","Colombian-US strike at Bernal syndicate","National Police hammer cartels","Cartel informant","Kingpin strategy scores","Peruvian coca supply controlled","Brasília's Op Cobra blocks border","Rival syndicates go for the throat","FARC taps suppliers","Growers and Government eradication focus on heroin source","Coca crop fails","Major shipment busted en route","Submersibles seized",null,"Eco-tourism helps trade balance","Arms traffic interdicted","Hired drug guns unreliable"],"card_flavor_shaded":[null,"Service parochialism","COIN strategy eludes Army","Civil-military rivalries fester","Pipeline draws attacks","Industry thought exploitative","Multinationals make mess","US training ineffective","Budget diverted to expensive jets","Equipment not delivered","Delivery of US helos delayed","Military-police rivalry","US aid focuses on drug war","Transport security deemphasized","Base overrun","Middle class resents cost of war","They're down","EU aid focuses on reconstruction","US focused on Mid-East and South Asia",null,"Military strategist","FARC Deputy channels foreign support","Ideologue","Plane down - hostage search and evasion","Hostage rescue goes awry","ELN and FARC coordinate ops","Schedule of fees","MANPADs feared","Caracas aids rebels","Tactics lure enemy in","Peace bid","Hostage negotiations forum for FARC","Ransoming highly profitable","Cross-border war","Covert weapons delivery","FARC proposals lauded",null,"Ex-officers advise paramilitaries","Sympathizers alert AUC","Local forces augment autodefensas","Talks a ruse, fighters recycled","AUC drug lord","Insurgent sympathies","Brutality blamed on Army","Political campaign divisive","International human rights cartel",null,"Prosecutors killed","Labor backs FARC","Independent militias join AUC","National police corruption","Security concerns hinder maintenance","Charismatic AUC political leader",null,null,"Más Yanquis","Retail empire","Investigation penetrated","Officials on cartel payroll","Cali cartel security chief","Cali's Gilberto Rodríguez Orejuela expands empire","Colombian coca growers fill Peruvian void","Jungle landing strips",null,"Well-oiled industry",null,"Hearty coca variety","New routes to US market","Littoral stealth",null,"Eco-tourists taken","Border sanctuary","Unemployed ready to work for syndicates"],"card_unshaded_lines":[0,3,2,3,3,3,3,3,2,2,2,2,3,3,3,3,4,3,3,0,3,3,3,3,3,2,3,3,3,3,4,3,4,3,3,3,0,4,4,2,3,3,3,4,4,3,0,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,0,4,0,3,2,3,0,3,3,3],"card_shaded_lines":[0,3,3,3,3,4,4,3,2,3,4,3,4,3,3,3,2,4,4,0,4,4,4,4,4,4,4,4,4,4,3,3,2,4,4,4,0,4,3,3,4,3,4,3,3,4,0,4,4,3,4,4,4,0,0,4,4,4,3,4,4,4,3,0,3,0,4,4,3,0,4,4,4],"space_name":["Bogotá","Cali","Medellín","Bucaramanga","Ibagué","Santa Marta","Cartagena","Cúcuta","Neiva","Pasto","Sincelejo","Atlántico","Chocó","Nariño","Meta West","Guaviare","Putumayo","Cesar","Antioquia","Santander","Huila","Arauca","Meta East","Vichada","Guainía","Vaupés","Amazonas","Ecuador","Panamá","Santa Marta / Cartagena","Cali / Pasto","Neiva / Pasto","Bogotá / San José","Pasto / Tumaco","Cali / Buenaventura","Cartagena / Sincelejo","Sincelejo / Medellín","Medellín / Ibagué","Ibagué / Cali","Bucaramanga / Ibagué / Bogotá","Bogotá / Neiva","Cúcuta / Arauca","Bogotá / Yopal","Santa Marta / Ayacucho","Bucaramanga / Ayacucho","Sincelejo / Ayacucho","Cúcuta / Ayacucho"],"spaces":[{"type":"city","id":"Bogota","pop":8,"adjacent":[14,19,20,22,32,39,40,42]},{"type":"city","id":"Cali","pop":3,"adjacent":[12,13,20,30,34,38]},{"type":"city","id":"Medellin","pop":3,"adjacent":[12,18,36,37]},{"type":"city","id":"Bucaramanga","pop":2,"adjacent":[18,19,39,44]},{"type":"city","id":"Ibague","pop":2,"adjacent":[12,18,20,37,38,39]},{"type":"city","id":"Santa Marta","pop":2,"adjacent":[11,17,29,43]},{"type":"city","id":"Cartagena","pop":1,"adjacent":[11,29,35]},{"type":"city","id":"Cucuta","pop":1,"adjacent":[19,41,46]},{"type":"city","id":"Neiva","pop":1,"adjacent":[14,16,20,31,40]},{"type":"city","id":"Pasto","pop":1,"adjacent":[13,16,20,27,30,31,33]},{"type":"city","id":"Sincelejo","pop":1,"adjacent":[11,12,18,35,36,45]},{"type":"forest","id":"Atlantico","pop":1,"adjacent":[5,6,10,17,18,19,29,35,43,44,45,46]},{"type":"forest","id":"Choco","pop":1,"adjacent":[1,2,4,10,13,18,20,28,34,36,37,38]},{"type":"forest","id":"Narino","pop":1,"adjacent":[1,9,12,20,27,30,33,34]},{"type":"forest","id":"Meta West","pop":1,"adjacent":[0,8,15,16,20,22,32,40]},{"type":"forest","id":"Guaviare","pop":1,"adjacent":[14,16,22,23,24,25,32]},{"type":"forest","id":"Putumayo","pop":1,"adjacent":[8,9,14,15,20,25,26,27,31]},{"type":"mountain","id":"Cesar","pop":1,"adjacent":[5,11,18,19,43,44,45,46]},{"type":"mountain","id":"Antioquia","pop":2,"adjacent":[2,3,4,10,11,12,17,19,20,36,37,39,43,44,45,46]},{"type":"mountain","id":"Santander","pop":2,"adjacent":[0,3,7,11,17,18,20,21,22,39,41,42,43,44,45,46]},{"type":"mountain","id":"Huila","pop":2,"adjacent":[0,1,4,8,9,12,13,14,16,18,19,30,31,38,39,40]},{"type":"grassland","id":"Arauca","pop":1,"adjacent":[19,22,23,41,42]},{"type":"grassland","id":"Meta East","pop":1,"adjacent":[0,14,15,19,21,23,32,42]},{"type":"grassland","id":"Vichada","pop":0,"adjacent":[15,21,22,24]},{"type":"forest","id":"Guainia","pop":0,"adjacent":[15,23,25]},{"type":"forest","id":"Vaupes","pop":0,"adjacent":[15,16,24,26]},{"type":"forest","id":"Amazonas","pop":0,"adjacent":[16,25]},{"type":"grassland","id":"Ecuador","pop":0,"adjacent":[9,13,16,33]},{"type":"forest","id":"Panama","pop":0,"adjacent":[12]},{"type":"road","id":"Santa Marta / Cartagena","econ":1,"adjacent":[5,6,11]},{"type":"road","id":"Cali / Pasto","econ":1,"adjacent":[1,9,13,20]},{"type":"road","id":"Neiva / Pasto","econ":1,"adjacent":[8,9,16,20]},{"type":"road","id":"Bogota / San Jose","econ":1,"adjacent":[0,14,15,22]},{"type":"road","id":"Pasto / Tumaco","econ":1,"adjacent":[9,13,27]},{"type":"pipeline","id":"Cali / Buenaventura","econ":1,"adjacent":[1,12,13]},{"type":"pipeline","id":"Cartagena / Sincelejo","econ":1,"adjacent":[6,10,11]},{"type":"pipeline","id":"Sincelejo / Medellin","econ":2,"adjacent":[2,10,12,18]},{"type":"pipeline","id":"Medellin / Ibague","econ":1,"adjacent":[2,4,12,18]},{"type":"pipeline","id":"Ibague / Cali","econ":1,"adjacent":[1,4,12,20]},{"type":"pipeline","id":"Bucaramanga / Ibague / Bogota","econ":2,"adjacent":[0,3,4,18,19,20]},{"type":"pipeline","id":"Bogota / Neiva","econ":2,"adjacent":[0,8,14,20]},{"type":"pipeline","id":"Cucuta / Arauca","econ":3,"adjacent":[7,19,21,21]},{"type":"pipeline","id":"Bogota / Yopal","econ":2,"adjacent":[0,19,21,22]},{"type":"pipeline","id":"Santa Marta / Ayacucho","econ":2,"adjacent":[5,11,17,18,19,44,45,46]},{"type":"pipeline","id":"Bucaramanga / Ayacucho","econ":2,"adjacent":[3,11,17,18,19,43,45,46]},{"type":"pipeline","id":"Sincelejo / Ayacucho","econ":3,"adjacent":[10,11,17,18,19,43,44,46]},{"type":"pipeline","id":"Cucuta / Ayacucho","econ":3,"adjacent":[7,11,17,18,19,43,44,45]}],"adjacent_patrol":[[32,39,40,42],[30,34,38],[36,37],[39,44],[37,38,39],[29,43],[29,35],[41,46],[31,40],[30,31,33],[35,36,45],[5,6,10,29,35,43,44,45,46],[1,2,4,10,34,36,37,38],[1,9,30,33,34],[0,8,32,40],[32],[8,9,31],[5,43,44,45,46],[2,3,4,10,36,37,39,43,44,45,46],[0,3,7,39,41,42,43,44,45,46],[0,1,4,8,9,30,31,38,39,40],[41,42],[0,32,42],[],[],[],[],[9,33],[],[5,6],[1,9],[8,9],[0],[9],[1],[6,10],[2,10],[2,4],[1,4],[0,3,4],[0,8],[7],[0],[5,44,45,46],[3,43,45,46],[10,43,44,46],[7,43,44,45]],"first_piece":[[0,3,3,33,0],[63,72],[102,108],[126,141]],"last_piece":[[2,2,32,62,-1],[71,101],[107,125],[140,152]]}
if (typeof module !== 'undefined') module.exports = data
diff --git a/events.txt b/events.txt
index 5a969f6..d41aa73 100644
--- a/events.txt
+++ b/events.txt
@@ -1,5 +1,20 @@
# Events for Andean Abyss.
+# TODO: format prompt "Remove N Piece(s)"
+# TODO: prompt wording to match card texts
+
+# TODO: piece/space_opt_1 - optional if at least 1
+
+# TODO: 5.1.3 - as much as possible - for doing multiple things in one space
+# 14, 34, 49 (place base + other piece) priority to spaces with room for all available pieces
+# 65 priority to where both (place or remove shipment) and (place or remove insurgent base)
+
+# TODO: replace pieces - must check stacking if replacement piece is available
+# 35, 39, 40, 50, 54, 57, 72
+
+# TODO: allow voluntarily removing pieces before taking event (but disable passing if did so)
+# - needed for 66 shaded (within stacking place base) etc
+
EVENT 1
log "1 Civic Action space each Support Phase requires Government Control and any cube."
capability CAP_1ST_DIV
@@ -132,6 +147,7 @@ SHADED 13
EVENT 14
current GOVT
prompt "Place 1 Base and 3 Troops into any Department."
+ # TODO: 5.1.3 do as much as can!
space 1 is_dept(s) && can_stack_any(s, GOVT)
# TODO: auto or manual ?
auto_place GOVT BASE
@@ -435,6 +451,7 @@ EVENT 34
SHADED 34
current [FARC,AUC,CARTELS]
prompt "Place 2 Guerrillas and 1 Base into a 0 Population Department."
+ # TODO: 5.1.3 do as much as can!
space 1 is_zero_pop_dept(s) && can_stack_any(s, game.current)
# TODO: auto or manual ?
auto_place (game.current) GUERRILLA
@@ -529,13 +546,14 @@ EVENT 40
set_piece_space
remove
auto_place GOVT POLICE
+ set_space -1
endpiece
SHADED 40
prompt "Move all cubes in a Department with AUC to any Cities."
space 1 is_dept(s) && has_auc_piece(s) && has_cube(s)
prompt "Move all cubes to any Cities."
- piece_no_undo 0 is_piece_in_event_space(p) && is_cube(p)
+ piece 0 is_piece_in_event_space(p) && is_cube(p)
save_space
prompt "Move cube to any City."
space_no_undo 1 is_city(s)
@@ -617,7 +635,7 @@ EVENT 45
endspace
SHADED 45
- # TODO: sum and manual aid once?
+ # TODO: aid (-count_spaces_with_faction_piece(AUC))
prompt "Aid -1 for each space with AUC pieces."
space 0 has_auc_piece(s)
auto_aid -1
@@ -657,7 +675,8 @@ EVENT 47
SHADED 47
current AUC
set_space CUCUTA
- prompt "Place AUC Guerrillas in Cúcuta."
+ prompt "Place 2 AUC Guerrillas in Cúcuta."
+ # set_space CUCUTA
space 1 s === CUCUTA
auto_place AUC GUERRILLA
auto_place AUC GUERRILLA
@@ -667,7 +686,7 @@ SHADED 47
terror_aid_cut
endpiece
endspace
- prompt "Flip any AUC Guerrillas Underground."
+ prompt "Flip any 2 AUC Guerrillas Underground."
piece 2 is_auc_guerrilla(p) && is_active(p)
underground
endpiece
@@ -679,45 +698,64 @@ EVENT 48
remove
endif
if game.vm.s >= 0
- shift_support
+ # https://boardgamegeek.com/thread/1132718/article/15062894#15062894
+ set_neutral
endif
SHADED 48
- space 2 s !== BOGOTA && is_city(s)
+ prompt "Shift 2 Cities other than Bogotá 1 level toward Active Opposition."
+ space 2 s !== BOGOTA && is_city(s) && can_shift_opposition(s)
shift_opposition
endspace
EVENT 49
+ prompt "Permanently remove 3 available AUC Guerrillas."
remove_permanently AUC GUERRILLA
remove_permanently AUC GUERRILLA
remove_permanently AUC GUERRILLA
SHADED 49
- space 1 is_dept(s)
+ prompt "Place an AUC Guerrilla and Base in any Department."
+ # TODO: 5.1.3 do as much as can!
+ space 1 is_dept(s) && can_stack_any(s, AUC)
auto_place AUC GUERRILLA
auto_place AUC BASE
endspace
EVENT 50
- # UPTO
current GOVT
- space 1 is_dept(s) && !is_farc_zone(s)
- auto_place GOVT POLICE
- endspace
- space_opt 1 is_dept(s) && !is_farc_zone(s)
- auto_place GOVT POLICE
- endspace
- space_opt 1 is_dept(s) && !is_farc_zone(s)
- auto_place GOVT POLICE
- endspace
+ repeat 3
+ if !game.vm.opt
+ prompt "Place up to 3 Police into any Departments."
+ space_opt 1 is_dept(s) && can_stack_any(s, GOVT)
+ auto_place GOVT POLICE
+ endspace
+ endif
+ endrepeat
SHADED 50
- # TODO: remove 2 / replace 2 / remove 1 + replace 1 ?
- piece 2 is_police(p)
+ # Note: strictly remove 2 or replace 2
+ prompt "Remove any 2 Police or replace them with available AUC Guerrillas."
+ piece_undo 1 is_police(p)
set_piece_space
remove
place_opt AUC GUERRILLA
+ set_space -1
endpiece
+ if game.vm.opt
+ prompt "Remove 1 more Police."
+ piece_undo 1 is_police(p)
+ remove
+ endpiece
+ else
+ prompt "Replace 1 more Police with AUC Guerrilla."
+ piece_undo 1 is_police(p)
+ set_piece_space
+ remove
+ auto_place AUC GUERRILLA
+ set_space -1
+ endpiece
+ endif
EVENT 51
if is_any_pipeline_sabotaged()
@@ -725,35 +763,52 @@ EVENT 51
space 0 is_pipeline(s) && has_sabotage(s)
remove_sabotage
endspace
- return
+ else
+ resources GOVT 12
endif
- resources GOVT 12
SHADED 51
- prompt "Sabotage Pipelines with or adjacent to FARC Guerrillas."
+ prompt "Sabotage 3 Pipelines with or adjacent to FARC Guerrillas."
space 3 is_pipeline(s) && is_with_or_adjacent_to_farc_guerrilla(s)
sabotage
endspace
EVENT 52
- space 2 is_city(s) || is_mountain(s)
+ prompt "Shift 2 City or Mountain each 1 level toward Active Support."
+ space 2 (is_city(s) || is_mountain(s)) && can_shift_support(s)
shift_support
endspace
SHADED 52
+ prompt "Place an AUC Base into a space with AUC."
space 1 has_auc_piece(s) && can_stack_base(s, AUC)
auto_place AUC BASE
endspace
- resources AUC (count_pieces_on_map(AUC,BASE))
+ # TODO: resources AUC (count_pieces_on_map(AUC,BASE))
+ prompt "AUC Resources +1 per AUC Base."
+ piece 0 is_auc_base(p)
+ auto_resources AUC 1
+ endpiece
EVENT 53
current [FARC,AUC,CARTELS]
prompt "Select Departments to move Guerrillas between."
- space 2 is_dept(s)
+ space 1 is_dept(s)
mark_space
endspace
+ if has_piece(game.vm.m[0], game.current, GUERRILLA)
+ prompt "Select Departments to move Guerrillas between."
+ space 1 (s !== game.vm.m[0]) && is_dept(s)
+ mark_space
+ endspace
+ else
+ prompt "Select Departments to move Guerrillas between."
+ space 1 is_dept(s) && has_piece(s, game.current, GUERRILLA)
+ mark_space
+ endspace
+ endif
prompt "Move Guerrillas between Departments."
- piece 2 is_any_guerrilla(p) && (s === game.vm.m[0] || s === game.vm.m[1])
+ piece 2 is_piece(p, game.current, GUERRILLA) && (s === game.vm.m[0] || s === game.vm.m[1])
if piece_space(game.vm.p) === game.vm.m[0]
set_space (game.vm.m[1])
else
@@ -761,29 +816,79 @@ EVENT 53
endif
move
underground
+ set_space -1
endpiece
EVENT 54
- # UPTO
- piece_opt 2 is_any_guerrilla(p)
- set_piece_space
- remove
- if piece_faction(game.vm.p) === FARC
- place_opt [AUC,CARTELS] GUERRILLA
- endif
- if piece_faction(game.vm.p) === AUC
- place_opt [FARC,CARTELS] GUERRILLA
- endif
- if piece_faction(game.vm.p) === CARTELS
- place_opt [FARC,AUC] GUERRILLA
+ if false
+ # Note: may remove one and replace another.
+ prompt "Remove up to 2 Guerrillas or replace them with with another Faction."
+ # TODO: don't remove just placed guerrilla
+ piece_undo_opt 2 is_any_guerrilla(p)
+ set_piece_space
+ remove
+ if piece_faction(game.vm.p) === FARC
+ place_opt [AUC,CARTELS] GUERRILLA
+ endif
+ if piece_faction(game.vm.p) === AUC
+ place_opt [FARC,CARTELS] GUERRILLA
+ endif
+ if piece_faction(game.vm.p) === CARTELS
+ place_opt [FARC,AUC] GUERRILLA
+ endif
+ set_space -1
+ endpiece
+
+ else
+ # Note: strictly remove 2 or replace 2 (see shaded 50)
+ prompt "Remove up to 2 Guerrillas or replace them with with another Faction's."
+ piece_undo 1 is_any_guerrilla(p)
+ set_piece_space
+ remove
+ if piece_faction(game.vm.p) === FARC
+ place_opt [AUC,CARTELS] GUERRILLA
+ endif
+ if piece_faction(game.vm.p) === AUC
+ place_opt [FARC,CARTELS] GUERRILLA
+ endif
+ if piece_faction(game.vm.p) === CARTELS
+ place_opt [FARC,AUC] GUERRILLA
+ endif
+ set_space -1
+ endpiece
+ if game.vm.opt
+ # TODO: don't remove just placed guerrilla!
+ prompt "Remove 1 more Guerrilla."
+ piece_undo_opt 1 is_any_guerrilla(p)
+ remove
+ endpiece
+ else
+ # TODO: don't replace just placed guerrilla!
+ prompt "Replace 1 more Guerrilla."
+ piece_undo_opt 1 is_any_guerrilla(p)
+ set_piece_space
+ remove
+ if piece_faction(game.vm.p) === FARC
+ place [AUC,CARTELS] GUERRILLA
+ endif
+ if piece_faction(game.vm.p) === AUC
+ place [FARC,CARTELS] GUERRILLA
+ endif
+ if piece_faction(game.vm.p) === CARTELS
+ place [FARC,AUC] GUERRILLA
+ endif
+ set_space -1
+ endpiece
endif
- endpiece
+
+ endif
EVENT 55
+ prompt "Remove 2 Shipments."
shipment 2 true
remove_shipment
- endpiece
- prompt "Remove N Cartels Guerrillas."
+ endshipment
+ prompt "Remove 5 Cartels Guerrillas."
piece 5 is_cartels_guerrilla(p)
remove
endpiece
@@ -799,24 +904,29 @@ EVENT 56
transfer CARTELS GOVT 15
SHADED 56
+ prompt "Add twice Cartels pieces in Cities to Cartels Resources."
piece 0 is_cartels_piece(p) && is_city(s)
auto_resources CARTELS 2
endpiece
+ prompt "Place a Cartels Base in each of 2 Cities."
space 2 is_city(s) && can_stack_base(s, CARTELS)
auto_place CARTELS BASE
endspace
EVENT 57
- prompt "Replace Cartels pieces with Police."
- piece_opt 3 is_cartels_piece(p)
+ prompt "Replace up to 3 Cartels pieces with Police."
+ piece_undo_opt 3 is_cartels_piece(p)
set_piece_space
remove
auto_place GOVT POLICE
+ set_space -1
endpiece
SHADED 57
- prompt "In 2 spaces replace 1 Police with any Cartels piece."
+ prompt "In each of 2 spaces replace a Police with any Cartels piece."
+ # TODO: prompt "Replace a Police with any Cartels piece in 2 spaces."
space 2 has_police(s)
+ prompt "Replace a Police with any Cartels piece."
piece 1 is_piece_in_event_space(p) && is_police(p)
remove
place CARTELS [BASE,GUERRILLA]
@@ -825,6 +935,7 @@ SHADED 57
EVENT 58
resources CARTELS -6
+ prompt "Remove all Cartels Guerrillas."
piece 0 is_cartels_guerrilla(p)
remove
endpiece
@@ -832,36 +943,42 @@ EVENT 58
SHADED 58
current CARTELS
prompt "Relocate up to 4 Police to any spaces."
- piece_opt 4 is_police(p)
- space 1 can_stack_piece(s, GOVT, POLICE)
+ piece_undo_opt 4 is_police(p)
+ prompt "Relocate Police to any space."
+ space_no_undo 1 can_stack_piece(s, GOVT, POLICE)
move
endspace
endpiece
EVENT 59
current GOVT
+ prompt "All Cartels Guerrillas to Active."
piece 0 is_cartels_guerrilla(p) && is_underground(p)
activate
endpiece
+ prompt "Free Assault against Cartels in each space."
space 0 can_assault(s, CARTELS)
free_assault_cartels
endspace
SHADED 59
current CARTELS
- prompt "Flip all Cartels Guerrillas underground."
+ prompt "Flip all Cartels Guerrillas Underground."
piece 0 is_cartels_guerrilla(p) && is_active(p)
underground
endpiece
- prompt "Relocate Cartels Guerrillas anywhere."
- piece_opt 3 is_cartels_guerrilla(p)
- space 1 can_stack_piece(s, CARTELS, GUERRILLA)
+ prompt "Relocate up to 3 Cartels Guerrillas anywhere."
+ piece_undo_opt 3 is_cartels_guerrilla(p)
+ prompt "Relocate Cartels Guerrilla anywhere."
+ space_no_undo 1 !is_event_piece_space(s) && can_stack_piece(s, CARTELS, GUERRILLA)
move
endspace
endpiece
EVENT 60
+ prompt "Remove all Cartels pieces from 2 Cities or 1 Department."
space 2 has_cartels_piece(s) && ((is_city(s) && (game.vm.ss.length === 0 || is_city(game.vm.ss[0]))) || (is_dept(s) && game.vm.ss.length === 0))
+ prompt "Remove all Cartels pieces."
piece 0 is_piece_in_event_space(p) && is_cartels_piece(p)
remove
endpiece
@@ -870,46 +987,53 @@ EVENT 60
SHADED 60
current CARTELS
+ prompt "Place a Cartels Base in each of 2 Cities."
space 2 is_city(s) && can_stack_base(s, CARTELS)
auto_place CARTELS BASE
endspace
- # TODO: can_bribe
- space 1 is_space(s)
+ prompt "Free Bribe in 1 space."
+ space 1 !is_empty(s)
free_bribe
endspace
EVENT 61
- space 1 is_city(s)
- piece 0 is_piece_in_event_space(p) && is_cartels_piece(p)
+ prompt "Remove all Cartels pieces from 1 City."
+ space 1 is_city(s) && has_cartels_piece(s)
+ prompt "Remove all Cartels pieces."
+ piece_undo 0 is_piece_in_event_space(p) && is_cartels_piece(p)
remove
endpiece
endspace
resources CARTELS -6
SHADED 61
- space 3 !has_cartels_piece(s) && can_stack_base(s, CARTELS)
+ prompt "Place 1 Cartels Base into each of 3 Departments with no Cartels pieces."
+ space 3 is_dept(s) && !has_cartels_piece(s) && can_stack_base(s, CARTELS)
auto_place CARTELS BASE
endspace
EVENT 62
- piece_opt 3 is_insurgent_piece(p) && is_zero_pop_forest(s)
+ prompt "Remove up to 3 Insurgent pieces for 0 Population Forests."
+ piece_undo_opt 3 is_insurgent_piece(p) && is_zero_pop_forest(s)
remove
endpiece
SHADED 62
- space 3 s === GUAINIA || s === VAUPES || s === AMAZONAS
+ prompt "Place 1 Cartels Base each in Guainia, Vaupés, and Amazonas."
+ space 3 (s === GUAINIA || s === VAUPES || s === AMAZONAS) && can_stack_base(s, CARTELS)
auto_place CARTELS BASE
endspace
EVENT 63
current CARTELS
+ prompt "In each space with Cartels Guerrillas..."
space 0 has_cartels_guerrilla(s)
prompt "Remove all but one Cartels Guerrilla."
- piece_no_undo 0 is_piece_in_event_space(p) && is_cartels_guerrilla(p) && count_pieces(s, CARTELS, GUERRILLA) > 1
+ piece 0 is_piece_in_event_space(p) && is_cartels_guerrilla(p) && count_pieces(s, CARTELS, GUERRILLA) > 1
remove
endpiece
prompt "Free Terror with remaining Cartels Guerrilla."
- piece_no_undo 1 is_piece_in_event_space(p) && is_cartels_guerrilla(p)
+ piece 1 is_piece_in_event_space(p) && is_cartels_guerrilla(p)
free_terror
endpiece
endspace
@@ -917,33 +1041,42 @@ EVENT 63
ineligible CARTELS
EVENT 64
- prompt "Place Shipments with FARC Guerrillas."
- piece 2 is_farc_guerrilla(p) && has_cartels_base(s) && has_available_shipment()
- place_shipment
- endpiece
+ repeat 2
+ prompt "Place 2 Shipments with FARC Guerrillas in the same spaces as Cartels Bases."
+ if has_available_shipment()
+ asm game.vm.shipment = find_available_shipment()
+ piece_undo 1 is_farc_guerrilla(p) && has_cartels_base(s)
+ place_shipment
+ endpiece
+ endif
+ endrepeat
SHADED 64
- prompt "Select each Cartels Base in a City."
+ prompt "Cartels Resources +2 for each Cartels Base in a City."
piece 0 is_cartels_base(p) && is_city(s)
auto_resources CARTELS 2
endpiece
- prompt "Select each Cartels Base in a Department."
+ prompt "Cartels Resources +1 for each Cartels Base in a Department."
piece 0 is_cartels_base(p) && is_dept(s)
auto_resources CARTELS 1
endpiece
EVENT 65
+ prompt "Place or remove 1 Shipment and Insurgent Base in any Mountain Department."
+ # TODO: 5.1.3 do as much as can!
space 1 is_mountain(s)
place_or_remove_shipment
place_or_remove_insurgent_base
endspace
EVENT 66
- piece 3 is_cartels_base(p) && is_forest(s)
+ prompt "Remove 3 Cartels Bases from Forest."
+ piece_undo 3 is_cartels_base(p) && is_forest(s)
remove
endpiece
SHADED 66
+ prompt "Place Cartels Base into each Forest that already has one."
space 0 is_forest(s) && has_cartels_base(s) && can_stack_base(s, CARTELS)
auto_place CARTELS BASE
endspace
@@ -956,23 +1089,25 @@ SHADED 67
momentum MOM_MEXICAN_TRAFFICKERS
EVENT 68
- prompt "Remove 2 Cartels pieces or up to 2 Shipments in coastal spaces."
+ prompt "Remove 2 Cartels pieces or up to 2 Shipments from coastal spaces."
select_shipment_or_cartels_piece_in_coastal_space
if game.vm.p >= 0
remove
+ prompt "Remove 1 more Cartels piece from coastal spaces."
piece 1 is_coastal_space(s) && is_cartels_piece(p)
remove
endpiece
endif
if game.vm.sh >= 0
remove_shipment
+ prompt "Remove up to 1 more Shipment from coastal spaces."
shipment_opt 1 is_coastal_space(s)
remove_shipment
endshipment
endif
SHADED 68
- prompt "Select each Cartels piece in coastal spaces."
+ prompt "Cartels Resources +2 per Cartels piece in coastal spaces."
piece 0 is_cartels_piece(p) && is_coastal_space(s)
auto_resources CARTELS 2
endpiece
@@ -988,35 +1123,34 @@ EVENT 69
mark_space
endspace
endif
- prompt "Select destination space."
- if game.current === GOVT
- space 1 (s !== game.vm.m[0]) && !is_farc_zone(s) && is_within_adjacent_depts(s, game.vm.m[0], 3)
+ prompt "Select destination Department."
+ space 1 (s !== game.vm.m[0]) && is_within_adjacent_depts(s, game.vm.m[0], 3) && can_stack_any(s, game.current)
+ if game.current === GOVT
prompt "Move cubes to destination."
- piece_opt 0 (s === game.vm.m[0]) && is_cube(p)
+ piece_undo_opt 0 (s === game.vm.m[0]) && is_cube(p) && can_stack_any(s, GOVT)
move
endpiece
- # TODO: free sweep move or only flip?
free_train_sweep_assault
- endspace
- else
- space 1 (s !== game.vm.m[0]) && is_within_adjacent_depts(s, game.vm.m[0], 3)
+ else
prompt "Move Guerrillas to destination."
- piece_opt 0 console.log("CHECK",p,s) || ((s === game.vm.m[0]) && is_piece(p, game.current, GUERRILLA))
+ piece_undo_opt 0 (s === game.vm.m[0]) && is_piece(p, game.current, GUERRILLA) && can_stack_any(s, game.current)
move
endpiece
free_rally_attack_terror
- endspace
- endif
+ endif
+ endspace
EVENT 70
- prompt "Select each Forest without Guerrillas."
+ prompt "Government Resources +6 for each Forest without Guerrillas."
space_no_undo 0 is_forest(s) && !has_any_guerrilla(s)
auto_resources GOVT 6
endspace
SHADED 70
current [FARC,AUC,CARTELS]
+ prompt "Free Terror in each Forest and +3 Resources per Terror."
space 0 is_forest(s) && has_piece(s, game.current, GUERRILLA)
+ prompt "Free Terror with any 1 Guerrilla."
piece 1 is_piece_in_event_space(p) && is_piece(p, game.current, GUERRILLA)
free_terror
auto_resources (game.current) 3
@@ -1034,26 +1168,29 @@ EVENT 71
SHADED 71
capability EVT_DARIEN
- # TODO: auto or manual select Ecuador ?
- set_space PANAMA
- # prompt "Place 1-2 Bases in Panamá."
- # space 1 s === PANAMA
- place (game.current) BASE
+ # TODO: auto or manual select Panama ?
+ # set_space PANAMA
+ prompt "Place 1-2 Bases in Panamá."
+ space 1 s === PANAMA
+ auto_place (game.current) BASE
place_opt (game.current) BASE
- # endspace
+ endspace
EVENT 72
+ prompt "Replace all Cartels Guerrillas in 2 spaces with other Guerrillas."
space 2 has_cartels_guerrilla(s)
- piece 0 is_piece_in_event_space(p) && is_cartels_guerrilla(p)
+ prompt "Replace all Cartels Guerrillas with other Guerrillas."
+ piece_undo 0 is_piece_in_event_space(p) && is_cartels_guerrilla(p)
remove
place [FARC,AUC] GUERRILLA
endpiece
endspace
SHADED 72
- prompt "Place all available Cartels Guerrillas into spaces with Cartels Bases."
if count_pieces_on_map(CARTELS, BASE) > 0
while has_piece(AVAILABLE, CARTELS, GUERRILLA)
+ prompt "Place all available Cartels Guerrillas into spaces with Cartels Bases."
+ asm game.vm.p = find_piece(AVAILABLE, CARTELS, GUERRILLA)
space 1 has_cartels_base(s)
auto_place CARTELS GUERRILLA
endspace
diff --git a/rules.js b/rules.js
index 651e36b..7fb78f7 100644
--- a/rules.js
+++ b/rules.js
@@ -302,7 +302,7 @@ exports.setup = function (seed, scenario, options) {
}
game.deck[0] =
- /* TEST */ 47
+ /* TEST */ 72
log("DECK " + game.deck.join(", "))
update_control()
@@ -4678,7 +4678,8 @@ function vm_free_bribe() {
}
function goto_bribe() {
- push_undo()
+ if (!game.vm)
+ push_undo()
move_cylinder_to_special_activity()
log_h3("Bribe")
game.sa = {
@@ -5458,6 +5459,10 @@ function is_piece_in_event_space(p) {
return piece_space(p) === game.vm.s
}
+function is_event_piece_space(s) {
+ return piece_space(game.vm.p) === s
+}
+
function goto_vm(start) {
game.state = "vm"
game.vm = {
@@ -5472,20 +5477,11 @@ function goto_vm(start) {
vm_exec()
}
-function event_prompt(str, n0, n) {
+function event_prompt(str) {
+ if (typeof str === "number")
+ str = CODE[str][1]
if (typeof str === "function")
str = str()
- if (n0 === 0) {
- str = str.replace(/\bN\b/, "each")
- str = str.replace("(s)", "")
- }
- if (n0 > 0) {
- str = str.replace(/\bN\b/, n)
- if (n === 1)
- str = str.replace("(s)", "")
- else
- str = str.replace("(s)", "s")
- }
view.prompt = data.card_title[this_card()] + ": " + str
}
@@ -5922,7 +5918,7 @@ states.vm_remove_permanently = {
prompt() {
let faction = vm_operand(1)
let type = vm_operand(2)
- event_prompt(`Remove ${piece_faction_type_name[faction][type]} permanently.`)
+ event_prompt(game.vm.prompt)
gen_place_piece(OUT_OF_PLAY, faction, type)
},
piece(p) {
@@ -5992,7 +5988,7 @@ states.vm_space = {
let f = CODE[game.vm.pc][4]
view.who = game.vm.p
if (game.vm.prompt)
- event_prompt(CODE[game.vm.prompt][1])
+ event_prompt(game.vm.prompt)
else
event_prompt("Select space.")
for (let s = first_space; s <= last_space; ++s)
@@ -6011,6 +6007,8 @@ states.vm_space = {
skip() {
if (CODE[game.vm.pc][1])
push_undo()
+ if (CODE[game.vm.pc][2])
+ game.vm.opt = 1
vm_goto(vm_endspace, vm_space, 1, 1)
},
}
@@ -6047,9 +6045,12 @@ states.vm_piece = {
prompt() {
let n = CODE[game.vm.pc][3]
let f = CODE[game.vm.pc][4]
- view.where = game.vm.s
+ if (game.vm.shipment !== undefined)
+ view.selected_shipment = game.vm.shipment
+ if (game.vm.s >= 0)
+ view.where = game.vm.s
if (game.vm.prompt)
- event_prompt(CODE[game.vm.prompt][1])
+ event_prompt(game.vm.prompt)
else
event_prompt("Select piece.")
for (let p = all_first_piece; p <= all_last_piece; ++p)
@@ -6068,6 +6069,8 @@ states.vm_piece = {
skip() {
if (CODE[game.vm.pc][1])
push_undo()
+ if (CODE[game.vm.pc][2])
+ game.vm.opt = 1
vm_goto(vm_endpiece, vm_piece, 1, 1)
},
}
@@ -6107,7 +6110,7 @@ states.vm_shipment = {
let n = CODE[game.vm.pc][3]
let f = CODE[game.vm.pc][4]
if (game.vm.prompt)
- event_prompt(CODE[game.vm.prompt][1])
+ event_prompt(game.vm.prompt)
else
event_prompt("Select shipment.")
for (let sh = 0; sh < 4; ++sh) {
@@ -6129,6 +6132,8 @@ states.vm_shipment = {
skip() {
if (CODE[game.vm.pc][1])
push_undo()
+ if (CODE[game.vm.pc][2])
+ game.vm.opt = 1
vm_goto(vm_endshipment, vm_shipment, 1, 1)
},
}
@@ -6230,6 +6235,8 @@ states.vm_place = {
skip() {
if (CODE[game.vm.pc][1])
push_undo()
+ if (CODE[game.vm.pc][2])
+ game.vm.opt = 1
vm_next()
},
}
@@ -6258,8 +6265,9 @@ states.vm_set_passive_support_or_passive_opposition = {
}
function vm_place_or_remove_shipment() {
- if (has_available_shipment() ||
- (is_any_shipment_held_in_space(game.vm.s) && has_any_guerrilla(game.vm.s)))
+ if (has_available_shipment() && has_any_guerrilla(game.vm.s))
+ game.state = "vm_place_or_remove_shipment"
+ else if (is_any_shipment_held_in_space(game.vm.s))
game.state = "vm_place_or_remove_shipment"
else
vm_next()
@@ -6278,10 +6286,12 @@ states.vm_place_or_remove_shipment = {
}
},
shipment(sh) {
+ push_undo()
remove_shipment(sh)
vm_next()
},
piece(p) {
+ push_undo()
let sh = find_available_shipment()
place_shipment(sh, p)
vm_next()
@@ -6309,6 +6319,7 @@ states.vm_place_or_remove_insurgent_base = {
gen_place_piece(game.vm.s, CARTELS, BASE)
},
piece(p) {
+ push_undo()
if (piece_space(p) === AVAILABLE)
place_piece(p, game.vm.s)
else
@@ -6345,7 +6356,7 @@ function vm_select_shipment_or_cartels_piece_in_coastal_space() {
states.vm_select_shipment_or_cartels_piece_in_coastal_space = {
prompt() {
- event_prompt(CODE[game.vm.prompt][1])
+ event_prompt(game.vm.prompt)
for (let s = first_space; s <= last_space; ++s) {
if (is_coastal_space(s)) {
gen_piece_in_space(s, CARTELS, GUERRILLA)
@@ -6394,7 +6405,7 @@ states.vm_select_space_or_piece = {
prompt() {
let sf = CODE[game.vm.pc][1]
let pf = CODE[game.vm.pc][2]
- event_prompt(CODE[game.vm.prompt][1])
+ event_prompt(game.vm.prompt)
for (let s = first_space; s <= last_space; ++s)
if (sf(s))
gen_action_space(s)
@@ -7513,6 +7524,7 @@ const CODE = [
[ vm_set_piece_space ],
[ vm_remove ],
[ vm_auto_place, 0, 0, GOVT, POLICE ],
+ [ vm_set_space, -1 ],
[ vm_endpiece ],
[ vm_return ],
// SHADED 40
@@ -7639,7 +7651,7 @@ const CODE = [
// SHADED 47
[ vm_current, AUC ],
[ vm_set_space, CUCUTA ],
- [ vm_prompt, "Place AUC Guerrillas in Cúcuta." ],
+ [ vm_prompt, "Place 2 AUC Guerrillas in Cúcuta." ],
[ vm_space, 1, 0, 1, (s)=>s === CUCUTA ],
[ vm_auto_place, 0, 0, AUC, GUERRILLA ],
[ vm_auto_place, 0, 0, AUC, GUERRILLA ],
@@ -7649,7 +7661,7 @@ const CODE = [
[ vm_terror_aid_cut ],
[ vm_endpiece ],
[ vm_endspace ],
- [ vm_prompt, "Flip any AUC Guerrillas Underground." ],
+ [ vm_prompt, "Flip any 2 AUC Guerrillas Underground." ],
[ vm_piece, 0, 0, 2, (p,s)=>is_auc_guerrilla(p) && is_active(p) ],
[ vm_underground ],
[ vm_endpiece ],
@@ -7661,43 +7673,61 @@ const CODE = [
[ vm_remove ],
[ vm_endif ],
[ vm_if, ()=>game.vm.s >= 0 ],
- [ vm_shift_support ],
+ [ vm_set_neutral ],
[ vm_endif ],
[ vm_return ],
// SHADED 48
- [ vm_space, 1, 0, 2, (s)=>s !== BOGOTA && is_city(s) ],
+ [ vm_prompt, "Shift 2 Cities other than Bogotá 1 level toward Active Opposition." ],
+ [ vm_space, 1, 0, 2, (s)=>s !== BOGOTA && is_city(s) && can_shift_opposition(s) ],
[ vm_shift_opposition ],
[ vm_endspace ],
[ vm_return ],
// EVENT 49
+ [ vm_prompt, "Permanently remove 3 available AUC Guerrillas." ],
[ vm_remove_permanently, AUC, GUERRILLA ],
[ vm_remove_permanently, AUC, GUERRILLA ],
[ vm_remove_permanently, AUC, GUERRILLA ],
[ vm_return ],
// SHADED 49
- [ vm_space, 1, 0, 1, (s)=>is_dept(s) ],
+ [ vm_prompt, "Place an AUC Guerrilla and Base in any Department." ],
+ [ vm_space, 1, 0, 1, (s)=>is_dept(s) && can_stack_any(s, AUC) ],
[ vm_auto_place, 0, 0, AUC, GUERRILLA ],
[ vm_auto_place, 0, 0, AUC, BASE ],
[ vm_endspace ],
[ vm_return ],
// EVENT 50
[ vm_current, GOVT ],
- [ vm_space, 1, 0, 1, (s)=>is_dept(s) && !is_farc_zone(s) ],
- [ vm_auto_place, 0, 0, GOVT, POLICE ],
- [ vm_endspace ],
- [ vm_space, 1, 1, 1, (s)=>is_dept(s) && !is_farc_zone(s) ],
- [ vm_auto_place, 0, 0, GOVT, POLICE ],
- [ vm_endspace ],
- [ vm_space, 1, 1, 1, (s)=>is_dept(s) && !is_farc_zone(s) ],
+ [ vm_repeat, 3 ],
+ [ vm_if, ()=>!game.vm.opt ],
+ [ vm_prompt, "Place up to 3 Police into any Departments." ],
+ [ vm_space, 1, 1, 1, (s)=>is_dept(s) && can_stack_any(s, GOVT) ],
[ vm_auto_place, 0, 0, GOVT, POLICE ],
[ vm_endspace ],
+ [ vm_endif ],
+ [ vm_endrepeat ],
[ vm_return ],
// SHADED 50
- [ vm_piece, 0, 0, 2, (p,s)=>is_police(p) ],
+ [ vm_prompt, "Remove any 2 Police or replace them with available AUC Guerrillas." ],
+ [ vm_piece, 1, 0, 1, (p,s)=>is_police(p) ],
[ vm_set_piece_space ],
[ vm_remove ],
[ vm_place, 0, 1, AUC, GUERRILLA ],
+ [ vm_set_space, -1 ],
+ [ vm_endpiece ],
+ [ vm_if, ()=>game.vm.opt ],
+ [ vm_prompt, "Remove 1 more Police." ],
+ [ vm_piece, 1, 0, 1, (p,s)=>is_police(p) ],
+ [ vm_remove ],
[ vm_endpiece ],
+ [ vm_else ],
+ [ vm_prompt, "Replace 1 more Police with AUC Guerrilla." ],
+ [ vm_piece, 1, 0, 1, (p,s)=>is_police(p) ],
+ [ vm_set_piece_space ],
+ [ vm_remove ],
+ [ vm_auto_place, 0, 0, AUC, GUERRILLA ],
+ [ vm_set_space, -1 ],
+ [ vm_endpiece ],
+ [ vm_endif ],
[ vm_return ],
// EVENT 51
[ vm_if, ()=>is_any_pipeline_sabotaged() ],
@@ -7705,35 +7735,51 @@ const CODE = [
[ vm_space, 1, 0, 0, (s)=>is_pipeline(s) && has_sabotage(s) ],
[ vm_remove_sabotage ],
[ vm_endspace ],
- [ vm_return ],
- [ vm_endif ],
+ [ vm_else ],
[ vm_resources, GOVT, 12 ],
+ [ vm_endif ],
[ vm_return ],
// SHADED 51
- [ vm_prompt, "Sabotage Pipelines with or adjacent to FARC Guerrillas." ],
+ [ vm_prompt, "Sabotage 3 Pipelines with or adjacent to FARC Guerrillas." ],
[ vm_space, 1, 0, 3, (s)=>is_pipeline(s) && is_with_or_adjacent_to_farc_guerrilla(s) ],
[ vm_sabotage ],
[ vm_endspace ],
[ vm_return ],
// EVENT 52
- [ vm_space, 1, 0, 2, (s)=>is_city(s) || is_mountain(s) ],
+ [ vm_prompt, "Shift 2 City or Mountain each 1 level toward Active Support." ],
+ [ vm_space, 1, 0, 2, (s)=>(is_city(s) || is_mountain(s)) && can_shift_support(s) ],
[ vm_shift_support ],
[ vm_endspace ],
[ vm_return ],
// SHADED 52
+ [ vm_prompt, "Place an AUC Base into a space with AUC." ],
[ vm_space, 1, 0, 1, (s)=>has_auc_piece(s) && can_stack_base(s, AUC) ],
[ vm_auto_place, 0, 0, AUC, BASE ],
[ vm_endspace ],
- [ vm_resources, AUC, ()=>(count_pieces_on_map(AUC,BASE)) ],
+ [ vm_prompt, "AUC Resources +1 per AUC Base." ],
+ [ vm_piece, 0, 0, 0, (p,s)=>is_auc_base(p) ],
+ [ vm_auto_resources, AUC, 1 ],
+ [ vm_endpiece ],
[ vm_return ],
// EVENT 53
[ vm_current, [FARC,AUC,CARTELS] ],
[ vm_prompt, "Select Departments to move Guerrillas between." ],
- [ vm_space, 1, 0, 2, (s)=>is_dept(s) ],
+ [ vm_space, 1, 0, 1, (s)=>is_dept(s) ],
[ vm_mark_space ],
[ vm_endspace ],
+ [ vm_if, ()=>has_piece(game.vm.m[0], game.current, GUERRILLA) ],
+ [ vm_prompt, "Select Departments to move Guerrillas between." ],
+ [ vm_space, 1, 0, 1, (s)=>(s !== game.vm.m[0]) && is_dept(s) ],
+ [ vm_mark_space ],
+ [ vm_endspace ],
+ [ vm_else ],
+ [ vm_prompt, "Select Departments to move Guerrillas between." ],
+ [ vm_space, 1, 0, 1, (s)=>is_dept(s) && has_piece(s, game.current, GUERRILLA) ],
+ [ vm_mark_space ],
+ [ vm_endspace ],
+ [ vm_endif ],
[ vm_prompt, "Move Guerrillas between Departments." ],
- [ vm_piece, 0, 0, 2, (p,s)=>is_any_guerrilla(p) && (s === game.vm.m[0] || s === game.vm.m[1]) ],
+ [ vm_piece, 0, 0, 2, (p,s)=>is_piece(p, game.current, GUERRILLA) && (s === game.vm.m[0] || s === game.vm.m[1]) ],
[ vm_if, ()=>piece_space(game.vm.p) === game.vm.m[0] ],
[ vm_set_space, ()=>(game.vm.m[1]) ],
[ vm_else ],
@@ -7741,10 +7787,29 @@ const CODE = [
[ vm_endif ],
[ vm_move ],
[ vm_underground ],
+ [ vm_set_space, -1 ],
[ vm_endpiece ],
[ vm_return ],
// EVENT 54
- [ vm_piece, 0, 1, 2, (p,s)=>is_any_guerrilla(p) ],
+ [ vm_if, ()=>false ],
+ [ vm_prompt, "Remove up to 2 Guerrillas or replace them with with another Faction." ],
+ [ vm_piece, 1, 1, 2, (p,s)=>is_any_guerrilla(p) ],
+ [ vm_set_piece_space ],
+ [ vm_remove ],
+ [ vm_if, ()=>piece_faction(game.vm.p) === FARC ],
+ [ vm_place, 0, 1, [AUC,CARTELS], GUERRILLA ],
+ [ vm_endif ],
+ [ vm_if, ()=>piece_faction(game.vm.p) === AUC ],
+ [ vm_place, 0, 1, [FARC,CARTELS], GUERRILLA ],
+ [ vm_endif ],
+ [ vm_if, ()=>piece_faction(game.vm.p) === CARTELS ],
+ [ vm_place, 0, 1, [FARC,AUC], GUERRILLA ],
+ [ vm_endif ],
+ [ vm_set_space, -1 ],
+ [ vm_endpiece ],
+ [ vm_else ],
+ [ vm_prompt, "Remove up to 2 Guerrillas or replace them with with another Faction's." ],
+ [ vm_piece, 1, 0, 1, (p,s)=>is_any_guerrilla(p) ],
[ vm_set_piece_space ],
[ vm_remove ],
[ vm_if, ()=>piece_faction(game.vm.p) === FARC ],
@@ -7756,13 +7821,38 @@ const CODE = [
[ vm_if, ()=>piece_faction(game.vm.p) === CARTELS ],
[ vm_place, 0, 1, [FARC,AUC], GUERRILLA ],
[ vm_endif ],
+ [ vm_set_space, -1 ],
+ [ vm_endpiece ],
+ [ vm_if, ()=>game.vm.opt ],
+ [ vm_prompt, "Remove 1 more Guerrilla." ],
+ [ vm_piece, 1, 1, 1, (p,s)=>is_any_guerrilla(p) ],
+ [ vm_remove ],
[ vm_endpiece ],
+ [ vm_else ],
+ [ vm_prompt, "Replace 1 more Guerrilla." ],
+ [ vm_piece, 1, 1, 1, (p,s)=>is_any_guerrilla(p) ],
+ [ vm_set_piece_space ],
+ [ vm_remove ],
+ [ vm_if, ()=>piece_faction(game.vm.p) === FARC ],
+ [ vm_place, 0, 0, [AUC,CARTELS], GUERRILLA ],
+ [ vm_endif ],
+ [ vm_if, ()=>piece_faction(game.vm.p) === AUC ],
+ [ vm_place, 0, 0, [FARC,CARTELS], GUERRILLA ],
+ [ vm_endif ],
+ [ vm_if, ()=>piece_faction(game.vm.p) === CARTELS ],
+ [ vm_place, 0, 0, [FARC,AUC], GUERRILLA ],
+ [ vm_endif ],
+ [ vm_set_space, -1 ],
+ [ vm_endpiece ],
+ [ vm_endif ],
+ [ vm_endif ],
[ vm_return ],
// EVENT 55
+ [ vm_prompt, "Remove 2 Shipments." ],
[ vm_shipment, 0, 0, 2, (p,s)=>true ],
[ vm_remove_shipment ],
- [ vm_endpiece ],
- [ vm_prompt, "Remove N Cartels Guerrillas." ],
+ [ vm_endshipment ],
+ [ vm_prompt, "Remove 5 Cartels Guerrillas." ],
[ vm_piece, 0, 0, 5, (p,s)=>is_cartels_guerrilla(p) ],
[ vm_remove ],
[ vm_endpiece ],
@@ -7778,24 +7868,28 @@ const CODE = [
[ vm_transfer, CARTELS, GOVT, 15 ],
[ vm_return ],
// SHADED 56
+ [ vm_prompt, "Add twice Cartels pieces in Cities to Cartels Resources." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_cartels_piece(p) && is_city(s) ],
[ vm_auto_resources, CARTELS, 2 ],
[ vm_endpiece ],
+ [ vm_prompt, "Place a Cartels Base in each of 2 Cities." ],
[ vm_space, 1, 0, 2, (s)=>is_city(s) && can_stack_base(s, CARTELS) ],
[ vm_auto_place, 0, 0, CARTELS, BASE ],
[ vm_endspace ],
[ vm_return ],
// EVENT 57
- [ vm_prompt, "Replace Cartels pieces with Police." ],
- [ vm_piece, 0, 1, 3, (p,s)=>is_cartels_piece(p) ],
+ [ vm_prompt, "Replace up to 3 Cartels pieces with Police." ],
+ [ vm_piece, 1, 1, 3, (p,s)=>is_cartels_piece(p) ],
[ vm_set_piece_space ],
[ vm_remove ],
[ vm_auto_place, 0, 0, GOVT, POLICE ],
+ [ vm_set_space, -1 ],
[ vm_endpiece ],
[ vm_return ],
// SHADED 57
- [ vm_prompt, "In 2 spaces replace 1 Police with any Cartels piece." ],
+ [ vm_prompt, "In each of 2 spaces replace a Police with any Cartels piece." ],
[ vm_space, 1, 0, 2, (s)=>has_police(s) ],
+ [ vm_prompt, "Replace a Police with any Cartels piece." ],
[ vm_piece, 0, 0, 1, (p,s)=>is_piece_in_event_space(p) && is_police(p) ],
[ vm_remove ],
[ vm_place, 0, 0, CARTELS, [BASE,GUERRILLA] ],
@@ -7804,6 +7898,7 @@ const CODE = [
[ vm_return ],
// EVENT 58
[ vm_resources, CARTELS, -6 ],
+ [ vm_prompt, "Remove all Cartels Guerrillas." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_cartels_guerrilla(p) ],
[ vm_remove ],
[ vm_endpiece ],
@@ -7811,36 +7906,42 @@ const CODE = [
// SHADED 58
[ vm_current, CARTELS ],
[ vm_prompt, "Relocate up to 4 Police to any spaces." ],
- [ vm_piece, 0, 1, 4, (p,s)=>is_police(p) ],
- [ vm_space, 1, 0, 1, (s)=>can_stack_piece(s, GOVT, POLICE) ],
+ [ vm_piece, 1, 1, 4, (p,s)=>is_police(p) ],
+ [ vm_prompt, "Relocate Police to any space." ],
+ [ vm_space, 0, 0, 1, (s)=>can_stack_piece(s, GOVT, POLICE) ],
[ vm_move ],
[ vm_endspace ],
[ vm_endpiece ],
[ vm_return ],
// EVENT 59
[ vm_current, GOVT ],
+ [ vm_prompt, "All Cartels Guerrillas to Active." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_cartels_guerrilla(p) && is_underground(p) ],
[ vm_activate ],
[ vm_endpiece ],
+ [ vm_prompt, "Free Assault against Cartels in each space." ],
[ vm_space, 1, 0, 0, (s)=>can_assault(s, CARTELS) ],
[ vm_free_assault_cartels ],
[ vm_endspace ],
[ vm_return ],
// SHADED 59
[ vm_current, CARTELS ],
- [ vm_prompt, "Flip all Cartels Guerrillas underground." ],
+ [ vm_prompt, "Flip all Cartels Guerrillas Underground." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_cartels_guerrilla(p) && is_active(p) ],
[ vm_underground ],
[ vm_endpiece ],
- [ vm_prompt, "Relocate Cartels Guerrillas anywhere." ],
- [ vm_piece, 0, 1, 3, (p,s)=>is_cartels_guerrilla(p) ],
- [ vm_space, 1, 0, 1, (s)=>can_stack_piece(s, CARTELS, GUERRILLA) ],
+ [ vm_prompt, "Relocate up to 3 Cartels Guerrillas anywhere." ],
+ [ vm_piece, 1, 1, 3, (p,s)=>is_cartels_guerrilla(p) ],
+ [ vm_prompt, "Relocate Cartels Guerrilla anywhere." ],
+ [ vm_space, 0, 0, 1, (s)=>!is_event_piece_space(s) && can_stack_piece(s, CARTELS, GUERRILLA) ],
[ vm_move ],
[ vm_endspace ],
[ vm_endpiece ],
[ vm_return ],
// EVENT 60
+ [ vm_prompt, "Remove all Cartels pieces from 2 Cities or 1 Department." ],
[ vm_space, 1, 0, 2, (s)=>has_cartels_piece(s) && ((is_city(s) && (game.vm.ss.length === 0 || is_city(game.vm.ss[0]))) || (is_dept(s) && game.vm.ss.length === 0)) ],
+ [ vm_prompt, "Remove all Cartels pieces." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_piece_in_event_space(p) && is_cartels_piece(p) ],
[ vm_remove ],
[ vm_endpiece ],
@@ -7849,38 +7950,46 @@ const CODE = [
[ vm_return ],
// SHADED 60
[ vm_current, CARTELS ],
+ [ vm_prompt, "Place a Cartels Base in each of 2 Cities." ],
[ vm_space, 1, 0, 2, (s)=>is_city(s) && can_stack_base(s, CARTELS) ],
[ vm_auto_place, 0, 0, CARTELS, BASE ],
[ vm_endspace ],
- [ vm_space, 1, 0, 1, (s)=>is_space(s) ],
+ [ vm_prompt, "Free Bribe in 1 space." ],
+ [ vm_space, 1, 0, 1, (s)=>!is_empty(s) ],
[ vm_free_bribe ],
[ vm_endspace ],
[ vm_return ],
// EVENT 61
- [ vm_space, 1, 0, 1, (s)=>is_city(s) ],
- [ vm_piece, 0, 0, 0, (p,s)=>is_piece_in_event_space(p) && is_cartels_piece(p) ],
+ [ vm_prompt, "Remove all Cartels pieces from 1 City." ],
+ [ vm_space, 1, 0, 1, (s)=>is_city(s) && has_cartels_piece(s) ],
+ [ vm_prompt, "Remove all Cartels pieces." ],
+ [ vm_piece, 1, 0, 0, (p,s)=>is_piece_in_event_space(p) && is_cartels_piece(p) ],
[ vm_remove ],
[ vm_endpiece ],
[ vm_endspace ],
[ vm_resources, CARTELS, -6 ],
[ vm_return ],
// SHADED 61
- [ vm_space, 1, 0, 3, (s)=>!has_cartels_piece(s) && can_stack_base(s, CARTELS) ],
+ [ vm_prompt, "Place 1 Cartels Base into each of 3 Departments with no Cartels pieces." ],
+ [ vm_space, 1, 0, 3, (s)=>is_dept(s) && !has_cartels_piece(s) && can_stack_base(s, CARTELS) ],
[ vm_auto_place, 0, 0, CARTELS, BASE ],
[ vm_endspace ],
[ vm_return ],
// EVENT 62
- [ vm_piece, 0, 1, 3, (p,s)=>is_insurgent_piece(p) && is_zero_pop_forest(s) ],
+ [ vm_prompt, "Remove up to 3 Insurgent pieces for 0 Population Forests." ],
+ [ vm_piece, 1, 1, 3, (p,s)=>is_insurgent_piece(p) && is_zero_pop_forest(s) ],
[ vm_remove ],
[ vm_endpiece ],
[ vm_return ],
// SHADED 62
- [ vm_space, 1, 0, 3, (s)=>s === GUAINIA || s === VAUPES || s === AMAZONAS ],
+ [ vm_prompt, "Place 1 Cartels Base each in Guainia, Vaupés, and Amazonas." ],
+ [ vm_space, 1, 0, 3, (s)=>(s === GUAINIA || s === VAUPES || s === AMAZONAS) && can_stack_base(s, CARTELS) ],
[ vm_auto_place, 0, 0, CARTELS, BASE ],
[ vm_endspace ],
[ vm_return ],
// EVENT 63
[ vm_current, CARTELS ],
+ [ vm_prompt, "In each space with Cartels Guerrillas..." ],
[ vm_space, 1, 0, 0, (s)=>has_cartels_guerrilla(s) ],
[ vm_prompt, "Remove all but one Cartels Guerrilla." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_piece_in_event_space(p) && is_cartels_guerrilla(p) && count_pieces(s, CARTELS, GUERRILLA) > 1 ],
@@ -7895,33 +8004,41 @@ const CODE = [
[ vm_ineligible, CARTELS ],
[ vm_return ],
// EVENT 64
- [ vm_prompt, "Place Shipments with FARC Guerrillas." ],
- [ vm_piece, 0, 0, 2, (p,s)=>is_farc_guerrilla(p) && has_cartels_base(s) && has_available_shipment() ],
+ [ vm_repeat, 2 ],
+ [ vm_prompt, "Place 2 Shipments with FARC Guerrillas in the same spaces as Cartels Bases." ],
+ [ vm_if, ()=>has_available_shipment() ],
+ [ vm_asm, ()=>game.vm.shipment = find_available_shipment() ],
+ [ vm_piece, 1, 0, 1, (p,s)=>is_farc_guerrilla(p) && has_cartels_base(s) ],
[ vm_place_shipment ],
[ vm_endpiece ],
+ [ vm_endif ],
+ [ vm_endrepeat ],
[ vm_return ],
// SHADED 64
- [ vm_prompt, "Select each Cartels Base in a City." ],
+ [ vm_prompt, "Cartels Resources +2 for each Cartels Base in a City." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_cartels_base(p) && is_city(s) ],
[ vm_auto_resources, CARTELS, 2 ],
[ vm_endpiece ],
- [ vm_prompt, "Select each Cartels Base in a Department." ],
+ [ vm_prompt, "Cartels Resources +1 for each Cartels Base in a Department." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_cartels_base(p) && is_dept(s) ],
[ vm_auto_resources, CARTELS, 1 ],
[ vm_endpiece ],
[ vm_return ],
// EVENT 65
+ [ vm_prompt, "Place or remove 1 Shipment and Insurgent Base in any Mountain Department." ],
[ vm_space, 1, 0, 1, (s)=>is_mountain(s) ],
[ vm_place_or_remove_shipment ],
[ vm_place_or_remove_insurgent_base ],
[ vm_endspace ],
[ vm_return ],
// EVENT 66
- [ vm_piece, 0, 0, 3, (p,s)=>is_cartels_base(p) && is_forest(s) ],
+ [ vm_prompt, "Remove 3 Cartels Bases from Forest." ],
+ [ vm_piece, 1, 0, 3, (p,s)=>is_cartels_base(p) && is_forest(s) ],
[ vm_remove ],
[ vm_endpiece ],
[ vm_return ],
// SHADED 66
+ [ vm_prompt, "Place Cartels Base into each Forest that already has one." ],
[ vm_space, 1, 0, 0, (s)=>is_forest(s) && has_cartels_base(s) && can_stack_base(s, CARTELS) ],
[ vm_auto_place, 0, 0, CARTELS, BASE ],
[ vm_endspace ],
@@ -7934,23 +8051,25 @@ const CODE = [
[ vm_momentum, MOM_MEXICAN_TRAFFICKERS ],
[ vm_return ],
// EVENT 68
- [ vm_prompt, "Remove 2 Cartels pieces or up to 2 Shipments in coastal spaces." ],
+ [ vm_prompt, "Remove 2 Cartels pieces or up to 2 Shipments from coastal spaces." ],
[ vm_select_shipment_or_cartels_piece_in_coastal_space ],
[ vm_if, ()=>game.vm.p >= 0 ],
[ vm_remove ],
+ [ vm_prompt, "Remove 1 more Cartels piece from coastal spaces." ],
[ vm_piece, 0, 0, 1, (p,s)=>is_coastal_space(s) && is_cartels_piece(p) ],
[ vm_remove ],
[ vm_endpiece ],
[ vm_endif ],
[ vm_if, ()=>game.vm.sh >= 0 ],
[ vm_remove_shipment ],
+ [ vm_prompt, "Remove up to 1 more Shipment from coastal spaces." ],
[ vm_shipment, 0, 1, 1, (p,s)=>is_coastal_space(s) ],
[ vm_remove_shipment ],
[ vm_endshipment ],
[ vm_endif ],
[ vm_return ],
// SHADED 68
- [ vm_prompt, "Select each Cartels piece in coastal spaces." ],
+ [ vm_prompt, "Cartels Resources +2 per Cartels piece in coastal spaces." ],
[ vm_piece, 0, 0, 0, (p,s)=>is_cartels_piece(p) && is_coastal_space(s) ],
[ vm_auto_resources, CARTELS, 2 ],
[ vm_endpiece ],
@@ -7966,34 +8085,34 @@ const CODE = [
[ vm_mark_space ],
[ vm_endspace ],
[ vm_endif ],
- [ vm_prompt, "Select destination space." ],
+ [ vm_prompt, "Select destination Department." ],
+ [ vm_space, 1, 0, 1, (s)=>(s !== game.vm.m[0]) && is_within_adjacent_depts(s, game.vm.m[0], 3) && can_stack_any(s, game.current) ],
[ vm_if, ()=>game.current === GOVT ],
- [ vm_space, 1, 0, 1, (s)=>(s !== game.vm.m[0]) && !is_farc_zone(s) && is_within_adjacent_depts(s, game.vm.m[0], 3) ],
[ vm_prompt, "Move cubes to destination." ],
- [ vm_piece, 0, 1, 0, (p,s)=>(s === game.vm.m[0]) && is_cube(p) ],
+ [ vm_piece, 1, 1, 0, (p,s)=>(s === game.vm.m[0]) && is_cube(p) && can_stack_any(s, GOVT) ],
[ vm_move ],
[ vm_endpiece ],
[ vm_free_train_sweep_assault ],
- [ vm_endspace ],
[ vm_else ],
- [ vm_space, 1, 0, 1, (s)=>(s !== game.vm.m[0]) && is_within_adjacent_depts(s, game.vm.m[0], 3) ],
[ vm_prompt, "Move Guerrillas to destination." ],
- [ vm_piece, 0, 1, 0, (p,s)=>console.log("CHECK",p,s) || ((s === game.vm.m[0]) && is_piece(p, game.current, GUERRILLA)) ],
+ [ vm_piece, 1, 1, 0, (p,s)=>(s === game.vm.m[0]) && is_piece(p, game.current, GUERRILLA) && can_stack_any(s, game.current) ],
[ vm_move ],
[ vm_endpiece ],
[ vm_free_rally_attack_terror ],
- [ vm_endspace ],
[ vm_endif ],
+ [ vm_endspace ],
[ vm_return ],
// EVENT 70
- [ vm_prompt, "Select each Forest without Guerrillas." ],
+ [ vm_prompt, "Government Resources +6 for each Forest without Guerrillas." ],
[ vm_space, 0, 0, 0, (s)=>is_forest(s) && !has_any_guerrilla(s) ],
[ vm_auto_resources, GOVT, 6 ],
[ vm_endspace ],
[ vm_return ],
// SHADED 70
[ vm_current, [FARC,AUC,CARTELS] ],
+ [ vm_prompt, "Free Terror in each Forest and +3 Resources per Terror." ],
[ vm_space, 1, 0, 0, (s)=>is_forest(s) && has_piece(s, game.current, GUERRILLA) ],
+ [ vm_prompt, "Free Terror with any 1 Guerrilla." ],
[ vm_piece, 0, 0, 1, (p,s)=>is_piece_in_event_space(p) && is_piece(p, game.current, GUERRILLA) ],
[ vm_free_terror ],
[ vm_auto_resources, ()=>(game.current), 3 ],
@@ -8011,22 +8130,27 @@ const CODE = [
[ vm_return ],
// SHADED 71
[ vm_capability, EVT_DARIEN ],
- [ vm_set_space, PANAMA ],
- [ vm_place, 0, 0, ()=>(game.current), BASE ],
+ [ vm_prompt, "Place 1-2 Bases in Panamá." ],
+ [ vm_space, 1, 0, 1, (s)=>s === PANAMA ],
+ [ vm_auto_place, 0, 0, ()=>(game.current), BASE ],
[ vm_place, 0, 1, ()=>(game.current), BASE ],
+ [ vm_endspace ],
[ vm_return ],
// EVENT 72
+ [ vm_prompt, "Replace all Cartels Guerrillas in 2 spaces with other Guerrillas." ],
[ vm_space, 1, 0, 2, (s)=>has_cartels_guerrilla(s) ],
- [ vm_piece, 0, 0, 0, (p,s)=>is_piece_in_event_space(p) && is_cartels_guerrilla(p) ],
+ [ vm_prompt, "Replace all Cartels Guerrillas with other Guerrillas." ],
+ [ vm_piece, 1, 0, 0, (p,s)=>is_piece_in_event_space(p) && is_cartels_guerrilla(p) ],
[ vm_remove ],
[ vm_place, 0, 0, [FARC,AUC], GUERRILLA ],
[ vm_endpiece ],
[ vm_endspace ],
[ vm_return ],
// SHADED 72
- [ vm_prompt, "Place all available Cartels Guerrillas into spaces with Cartels Bases." ],
[ vm_if, ()=>count_pieces_on_map(CARTELS, BASE) > 0 ],
[ vm_while, ()=>has_piece(AVAILABLE, CARTELS, GUERRILLA) ],
+ [ vm_prompt, "Place all available Cartels Guerrillas into spaces with Cartels Bases." ],
+ [ vm_asm, ()=>game.vm.p = find_piece(AVAILABLE, CARTELS, GUERRILLA) ],
[ vm_space, 1, 0, 1, (s)=>has_cartels_base(s) ],
[ vm_auto_place, 0, 0, CARTELS, GUERRILLA ],
[ vm_endspace ],
@@ -8034,5 +8158,5 @@ const CODE = [
[ vm_endif ],
[ vm_return ],
]
-const UCODE = [0,1,7,13,19,29,47,61,67,74,80,86,92,98,104,125,133,140,146,153,165,181,193,201,221,239,254,265,273,290,311,323,337,344,356,366,382,392,408,424,438,462,476,486,503,515,527,544,570,583,592,609,623,632,648,662,676,685,700,713,733,748,759,767,781,795,800,808,813,833,862,876,888]
-const SCODE = [0,4,10,16,24,41,52,64,72,77,83,89,95,101,113,128,138,143,149,0,174,187,198,213,227,247,260,270,281,300,320,332,342,351,358,376,0,398,416,429,445,471,482,496,509,520,0,553,579,587,603,618,627,0,0,671,678,692,705,721,740,755,763,0,786,0,804,810,828,0,867,883,895]
+const UCODE = [0,1,7,13,19,29,47,61,67,74,80,86,92,98,104,125,133,140,146,153,165,181,193,201,221,239,254,265,273,290,311,323,337,344,356,366,382,392,408,424,438,463,477,487,504,516,528,545,571,585,596,628,642,656,684,740,755,766,783,798,821,840,854,864,879,898,904,914,919,941,968,984,998]
+const SCODE = [0,4,10,16,24,41,52,64,72,77,83,89,95,101,113,128,138,143,149,0,174,187,198,213,227,247,260,270,281,300,320,332,342,351,358,376,0,398,416,429,446,472,483,497,510,521,0,554,580,590,606,637,647,0,0,750,757,774,789,808,830,849,859,0,889,0,909,916,936,0,973,991,1007]
diff --git a/tools/gendata.js b/tools/gendata.js
index f28a134..93a72d5 100644
--- a/tools/gendata.js
+++ b/tools/gendata.js
@@ -454,8 +454,8 @@ def_space("forest", 0, "Amazonas")
// Foreign Countries
-def_space("foreign", 0, "Ecuador")
-def_space("foreign", 0, "Panamá")
+def_space("grassland", 0, "Ecuador")
+def_space("forest", 0, "Panamá")
data.last_dept = spaces.length-1