From e8a5f5410a0e876d889a2a8137c34bb925f65408 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 8 Apr 2022 01:29:54 +0200 Subject: Assets. --- .gitignore | 3 + about.html | 2 +- card_dummy.svg | 3 + card_real.svg | 5 + cover.1x.jpg | Bin 0 -> 28757 bytes cover.2x.jpg | Bin 0 -> 95621 bytes cover.jpg | Bin 0 -> 46775 bytes cover.png | Bin 0 -> 388901 bytes data.js | 8 + favicon.png | Bin 0 -> 26445 bytes icons/armor.svg | 4 + icons/armor_elite.svg | 4 + icons/armor_itank.svg | 5 + icons/armor_itank_elite.svg | 5 + icons/artillery.svg | 4 + icons/infantry.svg | 4 + icons/mechanized_infantry.svg | 4 + icons/mobile_antitank.svg | 5 + icons/motorized_antitank_new.svg | 5 + icons/motorized_antitank_old.svg | 4 + icons/motorized_infantry.svg | 5 + icons/paratroopers.svg | 4 + icons/recon.svg | 4 + icons/self_propelled_artillery.svg | 5 + info/rules.html | 3822 ++++++++++++++++++++++++++++++++++++ info/rules1.jpg | Bin 0 -> 112246 bytes info/rules10.jpg | Bin 0 -> 24035 bytes info/rules11.jpg | Bin 0 -> 17944 bytes info/rules12.jpg | Bin 0 -> 17973 bytes info/rules13.jpg | Bin 0 -> 17975 bytes info/rules14.jpg | Bin 0 -> 17965 bytes info/rules15.jpg | Bin 0 -> 18005 bytes info/rules16.jpg | Bin 0 -> 41724 bytes info/rules17.jpg | Bin 0 -> 18896 bytes info/rules18.jpg | Bin 0 -> 18783 bytes info/rules19.jpg | Bin 0 -> 17970 bytes info/rules2.jpg | Bin 0 -> 22672 bytes info/rules20.jpg | Bin 0 -> 17973 bytes info/rules21.jpg | Bin 0 -> 63506 bytes info/rules22.jpg | Bin 0 -> 48946 bytes info/rules23.jpg | Bin 0 -> 23379 bytes info/rules24.jpg | Bin 0 -> 62343 bytes info/rules25.jpg | Bin 0 -> 89387 bytes info/rules26.jpg | Bin 0 -> 99088 bytes info/rules27.jpg | Bin 0 -> 87150 bytes info/rules28.jpg | Bin 0 -> 86917 bytes info/rules29.jpg | Bin 0 -> 88153 bytes info/rules3.jpg | Bin 0 -> 18045 bytes info/rules30.jpg | Bin 0 -> 59226 bytes info/rules31.jpg | Bin 0 -> 16133 bytes info/rules32.jpg | Bin 0 -> 16146 bytes info/rules33.jpg | Bin 0 -> 16140 bytes info/rules34.jpg | Bin 0 -> 16132 bytes info/rules4.jpg | Bin 0 -> 27446 bytes info/rules5.jpg | Bin 0 -> 46674 bytes info/rules6.jpg | Bin 0 -> 18041 bytes info/rules7.jpg | Bin 0 -> 26002 bytes info/rules8.jpg | Bin 0 -> 38592 bytes info/rules9.jpg | Bin 0 -> 63771 bytes info/units.html | 244 +++ play.html | 854 ++++++++ play.js | 356 ++++ rules.js | 1592 ++++++++++++++- texture_clear.png | Bin 0 -> 27547 bytes texture_depression.png | Bin 0 -> 27408 bytes texture_marsh.png | Bin 0 -> 1493 bytes texture_mountain.png | Bin 0 -> 27713 bytes texture_scree.png | Bin 0 -> 14600 bytes thumbnail.jpg | Bin 0 -> 16338 bytes tools/gencss.js | 7 + tools/gendata.js | 576 ++++++ tools/gentextures.sh | 36 + tools/genunits.js | 227 +++ tools/rock_overlay.png | Bin 0 -> 44367 bytes tools/rock_overlay@2x.png | Bin 0 -> 160515 bytes tools/scree_overlay.png | Bin 0 -> 21813 bytes tools/scree_overlay@2x.png | Bin 0 -> 72197 bytes tools/wetland.pbm | Bin 0 -> 8203 bytes units.svg | 1025 ++++++++++ 79 files changed, 8740 insertions(+), 82 deletions(-) create mode 100644 .gitignore create mode 100644 card_dummy.svg create mode 100644 card_real.svg create mode 100644 cover.1x.jpg create mode 100644 cover.2x.jpg create mode 100644 cover.jpg create mode 100644 cover.png create mode 100644 data.js create mode 100644 favicon.png create mode 100644 icons/armor.svg create mode 100644 icons/armor_elite.svg create mode 100644 icons/armor_itank.svg create mode 100644 icons/armor_itank_elite.svg create mode 100644 icons/artillery.svg create mode 100644 icons/infantry.svg create mode 100644 icons/mechanized_infantry.svg create mode 100644 icons/mobile_antitank.svg create mode 100644 icons/motorized_antitank_new.svg create mode 100644 icons/motorized_antitank_old.svg create mode 100644 icons/motorized_infantry.svg create mode 100644 icons/paratroopers.svg create mode 100644 icons/recon.svg create mode 100644 icons/self_propelled_artillery.svg create mode 100644 info/rules.html create mode 100644 info/rules1.jpg create mode 100644 info/rules10.jpg create mode 100644 info/rules11.jpg create mode 100644 info/rules12.jpg create mode 100644 info/rules13.jpg create mode 100644 info/rules14.jpg create mode 100644 info/rules15.jpg create mode 100644 info/rules16.jpg create mode 100644 info/rules17.jpg create mode 100644 info/rules18.jpg create mode 100644 info/rules19.jpg create mode 100644 info/rules2.jpg create mode 100644 info/rules20.jpg create mode 100644 info/rules21.jpg create mode 100644 info/rules22.jpg create mode 100644 info/rules23.jpg create mode 100644 info/rules24.jpg create mode 100644 info/rules25.jpg create mode 100644 info/rules26.jpg create mode 100644 info/rules27.jpg create mode 100644 info/rules28.jpg create mode 100644 info/rules29.jpg create mode 100644 info/rules3.jpg create mode 100644 info/rules30.jpg create mode 100644 info/rules31.jpg create mode 100644 info/rules32.jpg create mode 100644 info/rules33.jpg create mode 100644 info/rules34.jpg create mode 100644 info/rules4.jpg create mode 100644 info/rules5.jpg create mode 100644 info/rules6.jpg create mode 100644 info/rules7.jpg create mode 100644 info/rules8.jpg create mode 100644 info/rules9.jpg create mode 100644 info/units.html create mode 100644 play.html create mode 100644 play.js create mode 100644 texture_clear.png create mode 100644 texture_depression.png create mode 100644 texture_marsh.png create mode 100644 texture_mountain.png create mode 100644 texture_scree.png create mode 100644 thumbnail.jpg create mode 100644 tools/gencss.js create mode 100644 tools/gendata.js create mode 100644 tools/gentextures.sh create mode 100644 tools/genunits.js create mode 100644 tools/rock_overlay.png create mode 100644 tools/rock_overlay@2x.png create mode 100644 tools/scree_overlay.png create mode 100644 tools/scree_overlay@2x.png create mode 100644 tools/wetland.pbm create mode 100644 units.svg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62fc544 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +HIRES +WORK +svgo.config.js diff --git a/about.html b/about.html index f2b8595..bec14ce 100644 --- a/about.html +++ b/about.html @@ -13,5 +13,5 @@ Copyright © 1984-2022 diff --git a/card_dummy.svg b/card_dummy.svg new file mode 100644 index 0000000..f14e5fb --- /dev/null +++ b/card_dummy.svg @@ -0,0 +1,3 @@ + + + diff --git a/card_real.svg b/card_real.svg new file mode 100644 index 0000000..8b7d787 --- /dev/null +++ b/card_real.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/cover.1x.jpg b/cover.1x.jpg new file mode 100644 index 0000000..0da9e75 Binary files /dev/null and b/cover.1x.jpg differ diff --git a/cover.2x.jpg b/cover.2x.jpg new file mode 100644 index 0000000..af9978a Binary files /dev/null and b/cover.2x.jpg differ diff --git a/cover.jpg b/cover.jpg new file mode 100644 index 0000000..d1ee405 Binary files /dev/null and b/cover.jpg differ diff --git a/cover.png b/cover.png new file mode 100644 index 0000000..88b1162 Binary files /dev/null and b/cover.png differ diff --git a/data.js b/data.js new file mode 100644 index 0000000..eba7cbc --- /dev/null +++ b/data.js @@ -0,0 +1,8 @@ +const hex_exists = [0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0] +const hex_road = [0,0,0,0,0,0,0,4,4,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,1,1,4,2,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1,1,1,1,2,1,1,2,2,1,1,4,1,4,2,4,4,2,4,4,0,0,0,2,1,2,2,2,1,0,1,1,1,1,1,0,1,0,2,0,0,0,2,0,0,0,0,0,1,1,0,1,1,0,1,0,0,1,1,1,1,0,2,0,0,0,2,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,1,1,1,1,2,0,0,0,0,0,0,0,0,0,4,1,1,0,0,0,1,0,0,0,0,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0] +const side_road = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,4,0,0,4,0,4,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,4,0,4,4,0,0,0,0,0,0,0,1,4,1,2,4,4,0,4,2,0,4,0,4,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,1,0,1,1,0,0,1,0,0,2,1,2,2,0,2,2,1,0,4,2,1,2,2,0,2,0,0,4,2,1,4,0,1,4,0,0,4,0,1,4,0,0,4,0,2,4,0,0,4,0,0,4,2,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,0,2,0,0,2,0,2,2,0,0,0,0,0,0,0,1,0,0,0,1,0,1,2,0,0,2,1,0,2,1,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,1,2,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] +const side_limit = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,1,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,1,0,1,1,0,0,0,0,0,0,0,1,2,2,2,1,1,0,1,2,2,2,2,2,2,2,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,1,0,2,1,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,0,1,2,0,0,2,0,2,2,0,0,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,0,0,0,0,0,0,0,0,0,1,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,2,0,1,0,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,2,2,2,2,2,0,0,2,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] +const hex_name = {"7":"El Garib","8":"Cyrene","9":"El Gubba","10":"Derna","30":"Tocra","31":"Barce","32":"Marawa","33":"Wadi Cuff","34":"Wadi Cuff E","35":"Gazala","36":"Acroma","37":"Tobruk","38":"Belhamed","39":"Gambut","40":"Bardia","54":"Benghazi","55":"Er Regima","56":"Charruba","57":"Charruba E","58":"Mechili","59":"Rotonda Segnali","60":"Sidi Mufta","61":"Bir Harmat","62":"El Adem","63":"Sidi Rezegh","64":"Ft. Capuzzo","65":"Sollum","66":"Buq Buq","67":"Sidi Barrani","68":"Sidi Barrani E","69":"Mersa Matruh","70":"Fuka","71":"El Daba","72":"El Alamein","73":"El Hamam","74":"Alexandria","78":"Ghemines","79":"Skeleidima","80":"Msus","81":"Msus E","82":"Tengeder W","83":"Tengeder","84":"Tengeder E","85":"Bir Hacheim","86":"Retma","87":"Bir Gubi","88":"Gabr Saleh","89":"Sidi Omar","90":"Bir Habata","91":"Sofafi","92":"Sofafi E","93":"Bir el Kenayis","94":"Bir Khalda","95":"Bir Khalda E","96":"Alam Halfa W","97":"Alam Halfa","98":"Alam Halfa E","103":"Beda Fomm","104":"Antelat","105":"Antelat E","106":"Ben Gania","107":"Ben Gania E","108":"Tengeder SE","109":"Bir Hacheim SW","110":"Bir Hacheim SE","111":"Retma SE","112":"Ft. Maddalena W","113":"Ft. Maddalena","114":"Ft. Maddalena E","115":"Bir Khamsa","116":"Bir el Qatrani","117":"Bir el Qatrani E","118":"Bir el Kenayis SE","119":"Bir Khalda SE","120":"El Himeimat W","121":"El Himeimat","122":"El Himeimat E","128":"Agedabia","129":"Jebel el Matar","130":"Haraga","131":"Haraga E","137":"Ft. Maddalena SW","138":"Ft. Maddalena SE","139":"Bir Khamsa SW","140":"Bir Fuad W","141":"Bir Fuad","142":"Bir Fuad E","151":"El Agheila","152":"Mersa Brega","153":"El Haseiat","154":"El Haseiat E","155":"Haraga SE","162":"Jarabub Oasis NW","163":"Jarabub Oasis NE","165":"Bir Fuad SW","166":"Bir Fuad SE","176":"Maaten Giofer","177":"Maaten Giofer E","178":"Sahaba","179":"Sahaba E","180":"Jalo Oasis NE","186":"Jarabub Oasis W","187":"Jarabub Oasis","188":"Jarabub Oasis E","189":"Siwa Oasis NE","200":"Maaten Giofer SW","201":"Maaten Giofer SE","202":"Sahaba SW","203":"Jalo Oasis W","204":"Jalo Oasis","205":"Jalo Oasis E","211":"Jarabub Oasis SW","212":"Siwa Oasis W","213":"Siwa Oasis","214":"Siwa Oasis E"} +const regions = {"Libya":[7,8,9,10,30,31,32,33,34,35,36,37,38,39,40,54,55,56,57,58,59,60,61,62,63,64,78,79,80,81,82,83,84,85,86,87,88,103,104,105,106,107,108,109,110,111,112,113,128,129,130,131,132,133,134,135,136,137,138,151,152,153,154,155,156,157,158,159,160,161,162,176,177,178,179,180,181,182,183,184,185,186,187,200,201,202,203,204,205,206,207,208,209,210,211],"Egypt":[65,66,67,68,69,70,71,72,73,74,89,90,91,92,93,94,95,96,97,98,114,115,116,117,118,119,120,121,122,123,139,140,141,142,143,144,163,164,165,166,167,188,189,190,191,212,213,214,215],"Sidi Omar":[89],"Tobruk":[37],"Sollum":[65],"El Agheila":[151],"Mersa Brega":[152],"East Line":[36,37,38,39,40,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,85,86,87,88,89,90,91,92,93,94,95,96,97,98,112,113,114,115,116,117,118,119,120,121,122,123,137,138,139,140,141,142,143,144,162,163,164,165,166,167,187,188,189,190,191],"West Line":[7,8,9,10,30,31,32,33,34,35,54,55,56,57,58,59,78,79,80,81,82,83,103,104,105,106,107,128,129,130],"Jebel el Akhdar":[7,8,9,32,33,34,56,57],"Sebkha el Segira":[152,176],"Sebket el Jeneinen":[179,203],"Qattara Depression":[144,145,146,168,169,192,193,216,217]} +const units = [{"nationality":"italian","type":"infantry","class":"infantry","speed":1,"appearance":"S","steps":4,"elite":0,"label":12,"name":"Tre"},{"nationality":"italian","type":"infantry","class":"infantry","speed":1,"appearance":"S","steps":4,"elite":0,"label":13,"name":"Pav"},{"nationality":"italian","type":"infantry","class":"infantry","speed":1,"appearance":"S","steps":4,"elite":0,"label":14,"name":"Bre"},{"nationality":"italian","type":"infantry","class":"infantry","speed":1,"appearance":"S","steps":3,"elite":0,"label":15,"name":"Bol"},{"nationality":"italian","type":"infantry","class":"infantry","speed":1,"appearance":"S","steps":3,"elite":0,"label":16,"name":"Sav"},{"nationality":"italian","type":"mech. inf.","class":"infantry","speed":3,"appearance":7,"steps":4,"elite":0,"label":21,"name":"Tri"},{"nationality":"italian","type":"infantry","class":"infantry","speed":1,"appearance":7,"steps":2,"elite":0,"label":22,"name":"Sab"},{"nationality":"italian","type":"armor","class":"armor","speed":3,"appearance":11,"steps":3,"elite":0,"label":23,"name":"Lit"},{"nationality":"italian","type":"mot. inf.","class":"infantry","speed":2,"appearance":17,"steps":3,"elite":0,"label":24,"name":"Fas"},{"nationality":"italian","type":"mot. inf.","class":"infantry","speed":2,"appearance":19,"steps":3,"elite":0,"label":25,"name":"Cen"},{"nationality":"italian","type":"infantry","class":"infantry","speed":1,"appearance":19,"steps":2,"elite":0,"label":26,"name":"Pis"},{"nationality":"italian","type":"para","class":"infantry","speed":1,"appearance":"M","steps":4,"elite":0,"label":27,"name":"Fol"},{"nationality":"italian","type":"artillery","class":"artillery","speed":1,"appearance":"S","steps":2,"elite":0,"label":28,"name":"Ita"},{"nationality":"italian","type":"armor","class":"armor","speed":3,"appearance":"S","steps":4,"elite":0,"label":29,"name":"Ari"},{"nationality":"german","type":"armor","class":"armor","speed":3,"appearance":"S","steps":3,"elite":1,"label":14,"name":"21/5"},{"nationality":"german","type":"recon","class":"armor","speed":4,"appearance":"S","steps":1,"elite":1,"label":15,"name":"21/3"},{"nationality":"german","type":"mech. inf.","class":"infantry","speed":3,"appearance":"S","steps":3,"elite":1,"label":16,"name":"21/104"},{"nationality":"german","type":"recon","class":"armor","speed":4,"appearance":3,"steps":1,"elite":1,"label":17,"name":"15/33"},{"nationality":"german","type":"mob. a/t","class":"antitank","speed":3,"appearance":3,"steps":2,"elite":1,"label":18,"name":"88mm/A"},{"nationality":"german","type":"mech. inf.","class":"infantry","speed":3,"appearance":3,"steps":3,"elite":1,"label":19,"name":"15/115"},{"nationality":"german","type":"armor","class":"armor","speed":3,"appearance":5,"steps":3,"elite":1,"label":21,"name":"15/8"},{"nationality":"german","type":"recon","class":"armor","speed":4,"appearance":5,"steps":1,"elite":1,"label":22,"name":"90/580"},{"nationality":"german","type":"mot. inf.","class":"infantry","speed":2,"appearance":5,"steps":2,"elite":1,"label":23,"name":"90/361"},{"nationality":"german","type":"mot. a/t","class":"antitank","speed":2,"appearance":5,"steps":2,"elite":1,"label":24,"name":"50mm"},{"nationality":"german","type":"artillery","class":"artillery","speed":1,"appearance":7,"steps":2,"elite":1,"label":25,"name":"/104"},{"nationality":"german","type":"mot. inf.","class":"infantry","speed":2,"appearance":7,"steps":2,"elite":1,"label":26,"name":"90/200"},{"nationality":"german","type":"mob. a/t","class":"antitank","speed":3,"appearance":11,"steps":2,"elite":1,"label":27,"name":"88mm/B"},{"nationality":"german","type":"mech. inf.","class":"infantry","speed":3,"appearance":11,"steps":2,"elite":1,"label":28,"name":"90/sv288"},{"nationality":"german","type":"mech. inf.","class":"infantry","speed":3,"appearance":11,"steps":2,"elite":1,"label":29,"name":"90/346"},{"nationality":"german","type":"para","class":"infantry","speed":1,"appearance":"M","steps":3,"elite":1,"label":31,"name":"Ram"},{"nationality":"german","type":"infantry","class":"infantry","speed":1,"appearance":"M","steps":3,"elite":1,"label":32,"name":"164/382+433"},{"nationality":"german","type":"infantry","class":"infantry","speed":1,"appearance":"M","steps":2,"elite":1,"label":33,"name":"164/125"},{"nationality":"german","type":"mech. inf.","class":"infantry","speed":3,"appearance":3,"steps":3,"elite":1,"label":34,"name":"90/155"},{"nationality":"german","type":"mot. a/t","class":"antitank","speed":2,"appearance":17,"steps":2,"elite":1,"label":35,"name":"76mm"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":"S","steps":2,"elite":0,"label":14,"name":"2/3"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":"S","steps":2,"elite":0,"label":15,"name":"2/SG"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":"S","steps":2,"elite":0,"label":16,"name":"4IN/3m"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":"S","steps":4,"elite":0,"label":17,"name":"9AU/20"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":"S","steps":4,"elite":0,"label":18,"name":"70/14+16"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":"S","steps":3,"elite":0,"label":19,"name":"70/23"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":"T","steps":1,"elite":1,"label":21,"name":"Matilda/A"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":"T","steps":3,"elite":0,"label":22,"name":"7/SG"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":"T","steps":3,"elite":0,"label":23,"name":"7/22G"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":"T","steps":3,"elite":0,"label":24,"name":"/Pol"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":"T","steps":3,"elite":0,"label":25,"name":"7AU/18"},{"nationality":"allied","type":"artillery","class":"artillery","speed":1,"appearance":"T","steps":2,"elite":0,"label":26,"name":"/Tob"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":18,"steps":4,"elite":0,"label":27,"name":"51H/152"},{"nationality":"allied","type":"self prop. arty","class":"artillery","speed":3,"appearance":18,"steps":2,"elite":0,"label":28,"name":"Priest"},{"nationality":"allied","type":"artillery","class":"artillery","speed":1,"appearance":18,"steps":4,"elite":0,"label":29,"name":"/C"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":2,"steps":4,"elite":0,"label":31,"name":"7/7"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":2,"steps":3,"elite":0,"label":32,"name":"4IN/7m"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":2,"steps":3,"elite":0,"label":33,"name":"4IN/5"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":2,"steps":3,"elite":0,"label":34,"name":"4IN/11"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":4,"steps":1,"elite":1,"label":35,"name":"Matilda/B"},{"nationality":"allied","type":"i-tank","class":"armor","speed":3,"appearance":4,"steps":4,"elite":0,"label":36,"name":"/1AT"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":4,"steps":3,"elite":0,"label":37,"name":"7/4"},{"nationality":"allied","type":"recon","class":"armor","speed":4,"appearance":4,"steps":2,"elite":0,"label":38,"name":"7"},{"nationality":"allied","type":"artillery","class":"artillery","speed":1,"appearance":20,"steps":3,"elite":0,"label":39,"name":"/D"},{"nationality":"allied","type":"mot. a/t","class":"antitank","speed":2,"appearance":6,"steps":3,"elite":0,"label":41,"name":"2#"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":6,"steps":4,"elite":0,"label":42,"name":"2NZ/4"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":6,"steps":4,"elite":0,"label":43,"name":"2NZ/5"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":6,"steps":4,"elite":0,"label":44,"name":"2NZ/6"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":6,"steps":4,"elite":0,"label":45,"name":"1SA/2+5"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":6,"steps":3,"elite":0,"label":46,"name":"1SA/1"},{"nationality":"allied","type":"recon","class":"armor","speed":4,"appearance":8,"steps":2,"elite":0,"label":47,"name":"1SA"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":8,"steps":3,"elite":0,"label":48,"name":"1SA/3"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":8,"steps":3,"elite":0,"label":49,"name":"2SA/4+6"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":8,"steps":4,"elite":0,"label":51,"name":"1/22"},{"nationality":"allied","type":"i-tank","class":"armor","speed":3,"appearance":8,"steps":3,"elite":0,"label":52,"name":"/32AT"},{"nationality":"allied","type":"artillery","class":"artillery","speed":1,"appearance":8,"steps":2,"elite":0,"label":53,"name":"/A"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":10,"steps":4,"elite":0,"label":54,"name":"1/2"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":10,"steps":3,"elite":0,"label":55,"name":"1/201G"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":10,"steps":2,"elite":0,"label":56,"name":"1/SG"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":10,"steps":3,"elite":0,"label":57,"name":"5IN/29"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":12,"steps":2,"elite":1,"label":58,"name":"Grant"},{"nationality":"allied","type":"mot. a/t","class":"antitank","speed":2,"appearance":12,"steps":3,"elite":0,"label":59,"name":"6#/A"},{"nationality":"allied","type":"mech. inf.","class":"infantry","speed":3,"appearance":14,"steps":2,"elite":0,"label":61,"name":"10IN/161m"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":14,"steps":4,"elite":0,"label":62,"name":"5IN/9+10"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":14,"steps":4,"elite":0,"label":63,"name":"10IN/21+25"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":14,"steps":2,"elite":0,"label":64,"name":"8IN/18"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":14,"steps":4,"elite":0,"label":65,"name":"FF/2"},{"nationality":"allied","type":"artillery","class":"artillery","speed":1,"appearance":14,"steps":4,"elite":0,"label":66,"name":"/B"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":20,"steps":3,"elite":1,"label":67,"name":"Sher/B"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":20,"steps":3,"elite":0,"label":68,"name":"8/9"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":20,"steps":3,"elite":0,"label":69,"name":"8/24"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":16,"steps":4,"elite":0,"label":71,"name":"10/8"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":16,"steps":3,"elite":0,"label":72,"name":"10/23"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":16,"steps":4,"elite":0,"label":73,"name":"9AU/26"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":16,"steps":4,"elite":0,"label":74,"name":"9AU/24"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":16,"steps":4,"elite":0,"label":75,"name":"44/131+133"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":16,"steps":2,"elite":0,"label":76,"name":"44/132"},{"nationality":"allied","type":"armor","class":"armor","speed":3,"appearance":18,"steps":3,"elite":1,"label":77,"name":"Sher/A"},{"nationality":"allied","type":"mot. a/t","class":"antitank","speed":2,"appearance":18,"steps":4,"elite":0,"label":78,"name":"6#/B"},{"nationality":"allied","type":"mot. inf.","class":"infantry","speed":2,"appearance":18,"steps":4,"elite":0,"label":79,"name":"51H/154"}] +if (typeof module !== 'undefined') module.exports = { hex_name, hex_road, side_road, side_limit, regions, units } diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000..b639dc8 Binary files /dev/null and b/favicon.png differ diff --git a/icons/armor.svg b/icons/armor.svg new file mode 100644 index 0000000..c5bdf7b --- /dev/null +++ b/icons/armor.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/armor_elite.svg b/icons/armor_elite.svg new file mode 100644 index 0000000..b96927e --- /dev/null +++ b/icons/armor_elite.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/armor_itank.svg b/icons/armor_itank.svg new file mode 100644 index 0000000..aeefc25 --- /dev/null +++ b/icons/armor_itank.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/icons/armor_itank_elite.svg b/icons/armor_itank_elite.svg new file mode 100644 index 0000000..28c57c9 --- /dev/null +++ b/icons/armor_itank_elite.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/icons/artillery.svg b/icons/artillery.svg new file mode 100644 index 0000000..e1bd0c3 --- /dev/null +++ b/icons/artillery.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/infantry.svg b/icons/infantry.svg new file mode 100644 index 0000000..c5b876d --- /dev/null +++ b/icons/infantry.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/mechanized_infantry.svg b/icons/mechanized_infantry.svg new file mode 100644 index 0000000..3a29187 --- /dev/null +++ b/icons/mechanized_infantry.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/mobile_antitank.svg b/icons/mobile_antitank.svg new file mode 100644 index 0000000..5be776a --- /dev/null +++ b/icons/mobile_antitank.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/icons/motorized_antitank_new.svg b/icons/motorized_antitank_new.svg new file mode 100644 index 0000000..00be21f --- /dev/null +++ b/icons/motorized_antitank_new.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/icons/motorized_antitank_old.svg b/icons/motorized_antitank_old.svg new file mode 100644 index 0000000..f554f4f --- /dev/null +++ b/icons/motorized_antitank_old.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/motorized_infantry.svg b/icons/motorized_infantry.svg new file mode 100644 index 0000000..750c432 --- /dev/null +++ b/icons/motorized_infantry.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/icons/paratroopers.svg b/icons/paratroopers.svg new file mode 100644 index 0000000..9e745a7 --- /dev/null +++ b/icons/paratroopers.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/recon.svg b/icons/recon.svg new file mode 100644 index 0000000..c863893 --- /dev/null +++ b/icons/recon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/self_propelled_artillery.svg b/icons/self_propelled_artillery.svg new file mode 100644 index 0000000..d57bdca --- /dev/null +++ b/icons/self_propelled_artillery.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/info/rules.html b/info/rules.html new file mode 100644 index 0000000..e87deaa --- /dev/null +++ b/info/rules.html @@ -0,0 +1,3822 @@ + + + +RitD-2.0 + + + + + +
+
+ +
+

TABLE OF CONTENTS

+

1.0 THE MAP

+

2.0 UNITS

+

3.0 SEQUENCE OF PLAY

+

4.0 TURN OPTIONS

+

5.0 GROUP MOVEMENT

+

6.0 UNIT MOVEMENT

+

7.0 ENGAGEMENT

+

8.0 BATTLES

+

9.0 COMBAT

+

10.0 RETREATS

+

11.0 DISRUPTION

+

12.0 SUPPLY

+

13.0 FORTRESSES

+

14.0 MINEFIELDS

+

15.0 OASES

+

16.0 BUILDUP

+

17.0 VICTORY

+

18.0 SCENARIOS

+

19.0 DEMO GAME

+

20.0 STRATEGY NOTES

+

21.0 DESIGN NOTES

+

GAME DESIGN

+

Craig Besinque

+

CO-DEVELOPER

+

Ron Hodwitz

+

ASSISTANCE

+

Gary Chappell

+

Dave Blizzard

+

Grant Dalgliesh

+

Tom Dalgliesh

+

Brion Emde

+

Mike Hoyt

+

Dieter Schlaepfer

+

GRAPHICS

+

Grant Dalgliesh

+

Tom Dalgliesh

+

Chris Moeller

+

©1984-2021 Columbia Games Inc.

+

Visit www.columbiagames.com for

+

updates on this game.

+
+ +
+

Rulebook Conventions

+

This rulebook is formatted so that the

+

sidebar (this column) contains definitions,

+

examples, suggestions, and historical

+

commentary to help you understand and

+

enjoy this game.

+

Terms specifically defined for gameplay

+

purposes are Capitalized and are defined

+

where shown in italics. Bold text is

+

generally used for emphasis.

+

The Arena

+

The map depicts an area of North Africa

+

stretching some six hundred miles

+

from Alexandria to El Agheila. This

+

region is primarily a rocky and barren

+

plateau (roughly 300-500' high) which

+

drops sharply to sea-level in a series of

+

rugged escarpments near the coastline.

+

The narrow coastal shelf contains most

+

settlements and roads, notably the towns

+

of Benghazi, Tobruk, and Bardia. There is

+

a hilly, wooded, cultivable area between

+

Benghazi and Derna (Jebel el Akhdar)

+

with peaks up to 3000'. Southward lies

+

a desert wasteland, largely waterless

+

except for the oases of Jalo, Jarabub, and

+

Siwa. The eastern desert boundary is the

+

Qattara Depression, a below sea-level

+

salt marsh impassable to modern vehicles

+

and armies; the narrow gap between the

+

depression and the sea at El Alamein is

+

the sole gateway east to Alexandria, Cairo,

+

and the Suez Canal. Within this isolated,

+

but well defined arena, the dramatic desert

+

campaign was fought.

+

Interpreting the map

+

Borders and terrain features are meant

+

to follow hexsides though they are drawn

+

with some artistic license.

+

INTRODUCTION

+

Rommel in the Desert is a game

+

of strategy for two players based on

+

the North African Campaign of World

+

War II. One player commands the

+

Allied (British and Commonwealth)

+

forces, and the other commands the

+

Axis (German and Italian) forces.

+

Game Scenarios provided include:

+

the 1941 and 1942 Campaigns, the

+

1940 "Italian" Campaign, and several

+

shorter scenarios. The 1941 and 1942

+

campaigns can also be combined into

+

the full “campaign game”.

+

The game is played in alternating

+

Player Turns, with monthly Buildup

+

interludes (for Reinforcements,

+

Resupply, etc.).

+

The object of the game is to hold

+

Tobruk and its environs, or preserve

+

a superior army if this area remains

+

contested. Capturing the enemy Base

+

wins the game immediately.

+

THE MAPBOARD

+

The mapboard depicts the area of

+

Libya and Egypt where the historical

+

campaign was mainly fought. The map

+

is divided into hexagons, or "hexes", to

+

determine position and movement.

+

Except at Gaps, Ridges and

+

Marshes are impassable. Mountain

+

Hexsides are passable only on roads.

+

Fortress symbols have numbers inside

+

showing their Port Capacities.

+

THE UNITS

+

Wooden block units represent

+

Allied brigades, German regiments/

+

battalions, and Italian divisions, plus

+

some composite support units.

+

A die-cut, adhesive label showing

+

the unit’s type and strength must be

+

attached to each block. Put green

+

(German) and beige/gray (Italians)

+

labels on the gray blocks, and the tan

+

labels (Allies) on the tan blocks.

+

Units in play normally stand

+

upright, with labels facing the owning

+

player. This provides simple yet

+

elegant “fog of war” in that players

+

cannot see the type or strength of

+

opposing units.

+

Unit type (armor, recon, etc.) is

+

shown by its central symbol. A unit’s

+

type determines its firepower and

+

movement rate.

+

The large numbers surrounding

+

the unit symbol show unit strength,

+

called Combat Value ("CV"). A unit’s

+

current strength is the number along

+

the top edge when standing upright.

+

Units generally begin a Scenario at

+

their maximum CV level, but can be

+

reduced by combat and also rebuilt.

+

A unit reduced below its lowest CV is

+

permanently eliminated from play.

+

SUPPLY CARDS

+

Players start a game with a given

+

number of Supply Cards and receive

+

additional cards every month. Two-

+

thirds of the cards provided are "real"

+

Supply Cards; 1/3rd are "dummy"

+

Supply Cards. Real Supply Cards are

+

expended to "buy" various defined

+

combinations of movement and

+

combat, called Turn Options. Dummies

+

have no value beyond creating doubt.

+

SEQUENCE OF PLAY

+

A Month of play consists of

+

Buildup, Initiative, and a variable

+

number of alternating Player-Turns.

+

During Buildup, players strengthen

+

and rearrange existing units and

+

receive Reinforcements and Supply

+

Cards.

+

Then players take alternating

+

Player-Turns, the Axis player generally

+

going first. The Active Player secretly

+

selects a Turn Option by playing one

+

or more real Supply Cards face down

+

(and dummy Supply can be included

+

for bluffing reasons). He then executes

+

one or more Movement and Combat

+

phases as that Turn Option allows.

+

Players may elect to Pass on their turn

+

in order to conserve Supply.

+

The number of Player-Turns in a

+

Month is variable: play continues as

+

long as players continue to expend

+

Supply Cards. When both players Pass

+

consecutively, that Month of play

+

ends, and a new Month begins.

+
+ +
+

1.0 THE MAP

+

The Axis player sits on the South

+

edge of the map while the Allied

+

player sits on the North edge.

+

1.1 HEXES

+

The mapboard is divided into

+

hexagons or hexes to determine unit

+

location and movement. A Hexside is

+

the boundary between two hexes.

+

Hexes can be identified by the

+

towns or fortresses they contain, or by

+

a direction and distance from one (see

+

the compass rose printed on the map).

+

For example, "Msus E1" is one hex

+

east of Msus.

+

1.2 HEX CONTROL

+

• Friendly hexes are hexes solely

+

occupied by friendly units.

+

• Enemy hexes are hexes solely

+

occupied by enemy units.

+

• Empty hexes are unoccupied.

+

• Battle hexes are hexes occupied by

+

units of both sides.

+

Battle hexes are controlled by the

+

side that occupied the hex when the

+

battle began (the defender). Fortresses

+

are controlled by the last occupant.

+

1.3 STACKING

+

Stacking refers to the number

+

of units that are allowed to occupy

+

one hex. In Rommel in the Desert, any

+

number of units may occupy a hex.

+

1.4 TERRAIN

+

Terrain applies to Hexsides, not

+

hexes. The terrain of a hex itself has

+

no effect on play, and is shown only to

+

help define Hexside terrain.

+

Rough terrain Hexsides are

+

impassable, unless a Gap is shown

+

and/or a road passes through the

+

Hexside. In these cases entry into

+

battles is constricted (see 7.1). Rough

+

terrain on the map includes:

+

Mountains (Jebel el Akhdar),

+

Ridges, and

+

Salt Marshes.

+

All other Hexsides are Clear

+

terrain. Only the land portion of

+

coastal hexes is playable.

+

1.5 ROADS

+

Three types of Road are shown on

+

the map: highway, tracks, and trails.

+

Units can move faster along Roads

+

(regardless of terrain), Highway is

+

fastest, then tracks, and finally trails.

+

Supply Lines (12.2) are also more

+

efficiently formed along Roads.

+

1.6 BASES

+

Each player has one Base. The

+

Axis Base is El Agheila at the western

+

map edge. Alexandria, the Allied Base

+

is located at the eastern map edge.

+

New units (Reinforcements) arrive

+

in Base, and damaged units can be

+

rebuilt there. Bases are the main

+

Supply Source for each side and are

+

ports for Sea Redeployment.

+

Players must be careful to protect

+

their Bases, as losing them to the

+

enemy results in immediate defeat.

+

1.7 FORTRESSES

+

Benghazi, Tobruk, and Bardia

+

are Fortresses. Fortresses provide a

+

considerable combat advantage to

+

defending units, and can serve as a

+

Supply Source for a limited number of

+

units isolated from their Base.

+

Fortresses also act as ports: the

+

numbers shown are Port Capacity,

+

which govern its Sea Redeployment

+

and independent Supply capabilities.

+

Capturing an enemy Fortress gains

+

a player additional ‘bonus’ Supply

+

Cards in the next Buildup.

+

See 13.0 for details.

+

1.8 OASES

+

Jalo, Siwa, and Jarabub are Oases.

+

An Oasis can automatically Supply

+

one unit in that hex (no external

+

Supply Line is necessary).

+

Hexside Control

+

Control of Hexsides in Battle hexes is also

+

be important for establishing supply lines

+

into battles and enabling movement out

+

of them.

+

See 8.1 for details.

+

TERRAIN TYPES

+

RIDGE

+

MARSH

+

GAP/PASS

+

CLEAR

+

BASE

+

FORTRESS

+

OASIS

+

TOWN

+

HIGHWAY

+

TRACK

+

TRAIL

+

MOUNTAIN

+

Passable only

+

along roads.

+

Hexside Limit: 1

+

Impassable

+

Impassable

+

Hexside Limit: 1

+

Hexside Limit: 2

+
+ +
+

2.0 UNITS

+

The colored wooden blocks are the

+

playing pieces, or units in the game. A die-

+

cut adhesive label showing unit type and

+

strength must be attached to the face of

+

each block.

+

2.1 NATIONALITY

+

German units are gray blocks with

+

green labels. Italian units are gray blocks

+

with beige/gray labels.

+

Allied units are tan blocks with

+

tan labels. Central colors denote

+

Commonwealth forces.

+

The 12 Status marker labels go on the

+

white blocks.

+

2.2 UNIT TYPE

+

Unit Type is shown by the central

+

symbol on its label.

+

Units are categorized into one of four

+

[arms] Classes (armor/ infantry/ anti-

+

tank/ artillery) and Speeds (1-4 hexes).

+

Each Unit Type is a combination of class

+

and speed. See: Unit Types Chart.

+

All units of a given Unit Type have

+

identical speed and combat firepower, so

+

these are not shown on the label.

+

2.3 COMBAT VALUE (CV)

+

The large numbers surrounding the

+

unit symbol show the unit’s strength,

+

called Combat Value ("CV").

+

Units gain and lose strength in steps

+

of 1 CV (2 CV for elite units). A unit’s

+

current CV is the number along the top

+

edge when standing upright.

+

Units generally begin a scenario at

+

maximum CV, and are reduced by combat

+

but can be rebuilt. Losses and rebuilds

+

are handled by rotating the unit until the

+

new CV level is on the top edge. A unit

+

reduced below its lowest CV is eliminated

+

from the game and cannot be rebuilt.

+

2.4 ELITE UNITS

+

All German units (not Italians) and

+

some Allied tank units (center symbol

+

filled-in) are elite, having two CV per step

+

instead of one.

+

Two hits are necessary to reduce an

+

elite unit by a step (see 9.5).

+

Recon

+

Weak, high-speed units

+

composed of light tanks and

+

armored cars (some mounted

+

with light cannon.)

+

Armor

+

Tank units with strong

+

offensive punch.

+

Mechanized Infantry

+

Infantry mounted in armored

+

personnel carriers (APCs),

+

which could carry them into

+

the battlefield at speed.

+

Motorized Infantry

+

Infantry riding in trucks, able

+

to move quickly, but forced

+

to dismount and walk as they

+

approached the enemy.

+

Unmotorized Infantry/

+

Paratroopers

+

Leg infantry, with reduced

+

usefulness in a war of

+

movement.

+

Mobile Anti-Tank

+

Anti-tank guns with intrinsic

+

towing units having good cross

+

country mobility.

+

Motorized Anti-Tank

+

Anti-tank guns dependent on

+

truck pools for transport.

+

Self-Propelled Artillery

+

Artillery mounted in tank

+

chassis with excellent cross-

+

country mobility.

+

Artillery

+

Field artillery also dependent

+

on truck "pools", but

+

effectively slowed by greater

+

size and weight.

+

Battle Marker

+

Place the Battle Marker of the

+

Defender’s color in the battle

+

hex and the corresponding

+

Battle Marker of the Attacker’s

+

color with the Battle array.

+

UNIT SYMBOLS

+

Center Color

+

AU

+

Australian

+

Red

+

IN

+

Indian

+

Green

+

NZ

+

New Zealand

+

Light Blue

+

SA

+

South African

+

Orange

+

FF

+

Free French

+

Dark Blue

+

Pol

+

Polish

+

White

+

H

+

Highland

+

Tob

+

Tobruk

+

AT

+

Army Tank Brigade

+

G

+

Guards

+

m

+

Motor

+

SG

+

Support Group

+

MONTH OF APPEARANCE

+

S

+

Starts 1941 scenario or campaign.

+

T

+

Starts 1941 scenario or campaign in Tobruk.

+

M

+

Malta Group (see 1942 scenario).

+

Month of

+

Appearance

+

Division

+

Brigade or

+

Regiment

+

UNIT TYPES CHART

+

SPEED

+

ARMOR

+

CLASS

+

INFANTRY

+

CLASS

+

ANTI-TANK

+

CLASS

+

ARTILLERY

+

CLASS

+

RECON

+

4

+

RECON

+

MECHANIZED

+

3

+

ARMOR

+

MECH. INF.

+

MOB. A/T

+

SELF PROP. ARTY

+

MOTORIZED

+

2

+

MOT. INF.

+

MOT. A/T

+

UNMOTORIZED

+

1

+

INFANTRY

+

PARA

+

ARTILLERY

+
+ +
+

3.0 SEQUENCE OF PLAY

+

Begin by dealing Supply Cards and

+

deploying Starting Forces as specified

+

for the Scenario (18.0).

+

3.1 GAME MONTHS

+

Each Month of play consists of

+

Buildup, Initiative, and a variable

+

number of alternating Player-Turns. A

+

Month of play ends when both players

+

Pass (4.5) in succession.

+

3.2 BUILDUP

+

Each Month begins with a Buildup

+

phase for each player (however, no

+

Buildup occurs before the first Month

+

of a scenario). See section 16.0.

+

3.3 INITIATIVE

+

The Axis normally has the first

+

Player Turn of a Month (the Initiative).

+

Initiative Challenge: The Allied

+

player may challenge for the Initiative

+

by playing a (real or dummy) Supply

+

Card face down. The Axis player may

+

then play a card of his own (or not).

+

If the Allied card is real and the

+

Axis has not matched it with a real one,

+

the Allies seize the Initiative. Otherwise,

+

the Axis retain the Initiative.

+

Supply cards committed to an

+

initiative challenge are expended

+

regardless of the outcome.

+

Important: In the first Month of all

+

scenarios no challenge is allowed. Also

+

note the Crusader Scenario begins with

+

an Allied Player-Turn.

+

3.4 PLAYER TURNS

+

Each Player Turn is a sequence of

+

phases which must be performed in

+

order. The Active Player is the player

+

taking his turn; his opponent is the

+

Passive Player.

+

3.41 INITIAL SUPPLY CHECK

+

The Active Player checks Supply

+

status of all friendly units and recovers

+

Disrupted units according to 12.7.

+

3.42 SELECT TURN OPTION

+

A Turn Option (4.0) is a combination

+

of Movement and Combat phases

+

costing a defined number of real Supply

+

cards.

+

Each Player Turn, the Active Player

+

secretly selects one Turn Option by

+

playing the required number of real

+

Supply cards face-down (dummy

+

cards may also be played to deceive

+

the opponent).

+

3.43 MOVEMENT

+

During a Movement phase, the

+

Active Player can make Group (5.1)

+

and/or Regroup (5.2) moves according

+

to the Turn Option selected. Forced

+

Marches (6.4) are resolved after all

+

other movement.

+

Refusing Battle: When Attacked

+

(see 8.2), the Passive Player may

+

choose to Refuse Battle (10.2).

+

All Movement (including Forced

+

Marches and Refusing Battle) must be

+

done before the Combat phase begins.

+

3.44 COMBAT

+

During a Combat phase, the Active

+

Player may initiate one Combat Round

+

in any or all current Battles.

+

See Battles (8.0) and Combat (9.0).

+

3.45 BLITZ MOVEMENT

+

In Blitz Turns, the Active Player

+

has a second pair of Movement and

+

Combat phases following the normal

+

Movement and Combat phases (but a

+

unit cannot move twice in a Turn).

+

All Blitz Movement must be done

+

before the Blitz Combat phase begins.

+

3.46 BLITZ COMBAT

+

In Blitz Turns, the Active Player

+

gets another Combat phase following

+

Blitz Movement. A unit can fire in both

+

Combat phases.

+

3.47 FINAL SUPPLY CHECK

+

The Supply status and Disruption

+

of the Active Player’s units is checked

+

according to 12.7.

+

3.48 SUPPLY REVEALED

+

The Active Player reveals the

+

Supply Cards played. All Cards played

+

are now discarded.

+ +

BUILDUP SEQUENCE

+

Advance Month

+

Buildup Supply check

+

BP Determination

+

First Player Buildup

+

Reinforcements

+

BP Expenditure

+

Replacements & Redeployments

+

Minefield Construction

+

Allocate BPs for Extra Supply

+

Resupply (draw all cards at once)

+

Monthly Resupply

+

Extra Supply (allocated above)

+

Bonus Supply (Fortress Capture)

+

Second Player Buildup

+

(repeat player 1 procedure)

+

INITIATIVE

+

Initiative Challenge [optional]

+

PLAYER-TURN SEQUENCE

+

Initial Supply Check

+

Determine Unit Supply

+

Disruption Recovery

+

Turn Option Selection

+

Supply Commitment (hidden)

+

Movement

+

Group/Regroup Move(s) [R*]

+

Retreats (Full and Partial)

+

Probe Combat (if partial)

+

Pursuit Fire (Retreating units)

+

Move/Disrupt Retreating Units [R*]

+

Forced Marches

+

Refuse Battle (Passive Player)

+

Pursuit Fire

+

Withdrawal [R*]

+

Combat (not Pass Turn)

+

Active Battles

+

Defensive Fire [R*]

+

Offensive Fire [R*]

+

Blitz Movement (Blitz Turn)

+

(as Movement)

+

Blitz Combat (Blitz Turn)

+

(as Combat)

+

Final Supply Check

+

Disrupt Unsupplied units [R*]

+

Supply Cards Revealed

+

+

[R*] ROUT POSSIBLE (Interrupts Play)

+

Rout Attrition

+

Pursuit Fire

+

Withdrawal Move

+

Continue Play

+ +

Blitz Movement and Combat

+

These phases occur only during Blitz

+

Turns.

+

A unit cannot move in both Movement

+

phases of a Blitz Turn, but can fire in both

+

Combat phases.

+
+ +
+

4.0 TURN OPTIONS

+

Each Player Turn, the Active

+

Player secretly selects (and commits

+

Supply for) one of the following Turn

+

Options (dummy Supply Cards may be

+

played to confuse the opponent).

+

In the Turn Option descriptions

+

given below, a Move means one

+

Group or Regroup Move during the

+

Movement phase; a Combat Round

+

means the option to initiate combat in

+

any or all Battles during the Combat

+

phase.

+

4.1 THE BASIC TURN

+

The Basic Turn costs one (1) real

+

Supply Card and allows the player one

+

Move and one Combat Round.

+

4.2 THE OFFENSIVE TURN

+

An Offensive Turn costs two (2)

+

real Supply Cards, and allows the

+

Active Player to make two Moves

+

(during the same Movement phase),

+

and one Combat Round. Remember: a

+

unit can only move once per turn.

+

4.3 THE ASSAULT TURN

+

An Assault Turn also costs two

+

(2) Supply Cards. It allows the Active

+

Player to make one Move, plus an

+

Assault Combat Round.

+

In an Assault Combat Round,

+

the Active Player has the option to

+

designate any or all current battles as

+

Assaults, in which units of both sides

+

fire Double Dice (see 9.21). Other

+

Battles may be fought normally or not

+

at all, as desired by the Active Player.

+

4.4 THE BLITZ TURN

+

A Blitz Turn costs three (3) real

+

Supply Cards. Blitz Turns allow the

+

Active Player two Basic Turns in

+

succession (except that units cannot

+

move twice).

+

The Active Player has one Move

+

and Combat Round during the regular

+

Movement and Combat phases, then

+

makes a second Move (with different

+

units) and Combat Round during Blitz

+

Movement and Blitz Combat. Units

+

are allowed to fire in both Combat

+

phases of a Blitz Turn

+

Hexside limits (7.1) are reset for

+

the Blitz Movement phase, so that

+

additional units may enter a battle hex

+

via hexsides already traversed in the

+

initial Movement phase.

+

4.5 THE PASS TURN

+

A Pass turn costs no Supply

+

Cards, allowing players to conserve

+

Supply while awaiting events.

+

In a Pass Turn, the Active Player is

+

allowed to make one free Withdrawal

+

Move (5.3) if he desires, but no other

+

movement or combat can occur.

+

If both players Pass in succession

+

the current Month of play ends.

+

TURN OPTIONS

+

+

BASIC

+

MC

+

+

OFFENSIVE

+

MMC

+

+

ASSAULT

+

MC*

+

BLITZ

+

MC + MC

+

No Cost

+

PASS

+

W

+

M = Move Phase C = Combat Phase

+

* = Any/All battles can be Assaults.

+

W = 1 optional Withdrawal Move

+

Turn Option Deception

+

The Active Player could play 1 real Supply

+

Card for a Basic Turn and add a dummy

+

Supply Card to bluff his opponent into

+

thinking that an Assault Turn is underway.

+

This might convince the Passive Player to

+

Refuse Battle rather than accept battle and

+

risk possible double dice combat.

+

Two Supply Cards Committed:

+

Assault or Offensive Turn?

+

When 2 real Supply are committed to a

+

Turn Option, it might seem at first glance

+

that the Active Player may be able change

+

his Turn Option in mid-turn.

+

However, the Active Player taking an

+

Offensive Turn must make two Group

+

or Regroup Moves in the Movement

+

phase. Doing so reveals that he is taking

+

an Offensive Turn before any opponent

+

decisions (e.g., Refuse Battle) are made.

+

If a player commits 2 real Supply Cards

+

and does not take 2 Moves in the

+

Movement phase, he is committed to an

+

Assault Turn.

+

Assault Turns

+

In an Assault combat, both sides fire

+

Double Dice, which might seem of no

+

advantage to the Active Player. However,

+

the ability to win a battle rapidly (even at

+

the cost of higher casualties) can prove

+

crucial at times. Bluffing an Assault Turn

+

with 1 real and 1 dummy Supply might

+

convince the opponent to Refuse Battle.

+

The Pass Turn

+

Passing in a Player Turn in no way limits

+

the future options of that player. A Player

+

that Passes on one Player-Turn may play

+

a different Turn Option on his next Player-

+

Turn (provided the opponent doesn't also

+

Pass, ending the Month).

+

Dummy Supply Card

+

Real Supply Card

+
+ +
+

5.0 GROUP MOVEMENT

+

A Group consists of all friendly

+

units occupying a hex. There is no

+

limit to Group size: any number of

+

units may occupy a single hex.

+

All movement during Player Turns

+

is made in terms of Group Movement.

+

A Move involves the movement of

+

one specific Group (either dispersing

+

an existing group or concentrating

+

forces into a new one). Depending on

+

the Turn Option (4.0) selected, players

+

make 1 or 2 Moves per Player Turn.

+

There are two types of Move:

+

Group Moves and Regroup Moves.

+

When moving Groups, rules for

+

individual unit movement (6.0) must

+

also be observed. There is a limit to

+

the number of units that can enter a

+

Battle Hex via a single Hexside (7.1),

+

but no Hexside Limit otherwise.

+

5.1 THE GROUP MOVE

+

In a Group Move, any or all units

+

from one hex may be moved to one

+

or more destination hexes. Units that

+

begin their movement together are not

+

required to remain as a Group, and

+

may disperse to separate locations.

+

To make a Group Move, the Active

+

Player indicates the desired group and

+

then moves units individually to one

+

or more hexes of his choice, observing

+

the movement speed of each unit.

+

5.2 THE REGROUP MOVE

+

In a Regroup Move, any or all

+

units in or adjacent to a designated

+

Command Point hex (regardless of

+

intervening terrain) may move to a

+

common destination hex, uniting into a

+

new Group.

+

The Command Point may be a

+

friendly, empty, or battle hex, but not

+

an enemy hex. The destination hex

+

can be Friendly, Enemy, Empty or

+

Battle (thus, Regroup Moves can be

+

used to Attack as well as Retreat).

+

To make a Regroup Move, the

+

Active Player indicates the Command

+

Point and the destination hex, then

+

moves regrouping units individually.

+

Again, the movement speeds of

+

individual units must be observed.

+

Units unable to reach the destination

+

hex of a Regroup may not move at

+

all.

+

Regroup Moves

+

The distance a unit can move is measured

+

from its original location, not from the

+

Command Point.

+

Regrouping Forced Marches

+

Units may attempt a Forced March (6.4)

+

to the destination hex of a Regroup Move,

+

but if unsuccessful they are Disrupted at

+

their original location.

+

REGROUP EXAMPLE

+

The five Allied units in hexes [1], [2], and [3] Regroup

+

to hex [D], using hex [C] as the Command Point. The

+

artillery unit on hex [3] cannot Regroup because it does

+

not have the speed to reach [D]. Units in hex [4] are

+

not adjacent to the Command Point [C] and therefore

+

cannot be part of the Regrouping Move.

+
+ +
+

5.3 WITHDRAWAL MOVES

+

A Withdrawal Move is a strictly

+

defined kind of Group/Regroup Move

+

that is made without Supply Card

+

expenditure. Withdrawals are Moves

+

where each unit moves back along one

+

of its own Supply Lines and territory is

+

conceded.

+

Withdrawal Moves are the only

+

type of Move possible without spending

+

a Supply Card. They can occur in three

+

different ways:

+

• The one Withdrawal Move allowed

+

in a Pass Turn.

+

• Withdrawal Moves made by the

+

Passive Player to Refuse Battle.

+

• Withdrawal Moves made to Retreat

+

groups that are Routed (11.3).

+

A Group or Regroup Move must

+

satisfy all of the following conditions

+

to qualify as a Withdrawal Move:

+

1) Each moving unit must have a

+

valid Supply Line (12.2) as the

+

Withdrawal Move begins.

+

2) Each unit can only move along

+

one of its own Supply Lines and

+

each hex entered must shorten that

+

Supply Line.

+

3) The friendly Supply Network

+

(12.6) must be reduced by at least

+

one hex.

+

4) No unit movement is made

+

physically away from the Supply

+

Source (in hexes).

+

Exception: See sidebar regarding

+

Bardia-Ft. Capuzzo.

+

Withdrawing units cannot Engage

+

enemy forces (unless the latter are

+

Disrupted - see sidebar).

+

Withdrawals into/through hexes

+

containing Disrupted Enemy Units

+

Withdrawing units that are not Retreating

+

can Engage & Rout Disrupted enemy units.

+

Withdrawing units that are Retreating

+

(hence becoming Disrupted themselves)

+

can pass through (or co-exist in the same

+

hex with) enemy Disrupted units, with no

+

effect on either force. If Disrupted units of

+

both sides occupy the same hex, the first

+

Group to recover will Rout the other.

+

Withdrawals into Fortress Supply

+

Units assigned Fortress Supply (13.3) may

+

withdraw along a Supply Line leading to

+

the Fortress. Units theoretically capable

+

of tracing Supply to a Fortress but not

+

assigned Fortress Supply cannot do so.

+

Supply Lines for Withdrawal

+

Supply Lines for Withdrawal Moves are

+

defined at the moment of the Withdrawal.

+

Bardia-Ft Capuzzo Withdrawals

+

The Coast Highway ‘jogs’ backwards

+

slightly at Bardia/ Ft. Capuzzo. To allow

+

for this, the Axis player may consider

+

these two hexes to be equally distant from

+

the friendly Base. Withdrawals following

+

the highway in the direction of the

+

Axis Base are allowable in this special

+

case [only], even when the hex entered is

+

further from Base in absolute hexes.

+

Withdrawal Example

+

An Axis recon unit is in Mechili with two other Axis units in Msus and Charruba forming

+

Supply Chains to the highway (Benghazi friendly). No Allied units are west of Tobruk.

+

The Mechili unit has 8 valid supply lines to the highway:

+

1) Mechili-Msus-Agedabia

+

5) Mechili-Msus-Er Regima

+

2) Mechili-Msus-Beda Fomm

+

6) Mechili-Derna

+

3) Mechili-Msus-Ghemines

+

7) Mechili-Gazala

+

4) Mechili-Charruba-Er Regima

+

8) Mechili-Bir Harmat

+

The recon unit can Withdraw along any of the first 4 routes (none move physically away

+

from Base). The other 4 Supply Lines are not valid for Withdrawal Moves as they involve

+

movement physically away from Base.

+
+ +
+

6.0 UNIT MOVEMENT

+

The Unit Speed of a unit is the

+

number of hexes the unit can move.

+

Units can move freely through

+

friendly or empty hexes, but must

+

STOP upon Engaging (i.e., entering a

+

hex containing enemy units).

+

Units can never move more than

+

once per Player-Turn (except to Rout).

+

6.1 UNIT SPEED

+

The basic movement speed of all

+

units is shown on the UNIT SPEED

+

TABLE (sidebar). A unit may move 1-4

+

hexes (depending on its speed) plus

+

any applicable movement bonuses.

+

6.2 ROAD BONUSES

+

Roads include highways, tracks and

+

trails. Units moving entirely along

+

Roads receive movement bonuses:

+

• Highway

+

+4 hexes

+

• Tracks

+

+2 hexes

+

• Trails

+

+1 hex

+

To receive a Road Bonus, a unit

+

must start, remain on, and end its

+

move on some type of Road. When

+

two types of Road are used, the lesser

+

bonus applies.

+

6.3 ROMMEL BONUS

+

During every Axis Player-Turn

+

(except in 1940), the Axis player can

+

designate any one Group or Regroup

+

Move as a Rommel Move. All Axis

+

units involved in that move receive a

+

movement bonus of +1 hex (plus any

+

applicable Road Bonus).

+

6.4 FORCED MARCHES

+

The Active Player may attempt to

+

Force March units one hex past their

+

normal maximum range, at the risk of

+

Disruption (11.0).

+

After all Moves are complete, the

+

Active Player announces all Forced

+

March attempts (units and desired

+

destinations), and rolls one die each.

+

On a roll of 4, 5 or 6, the attempt

+

succeeds, and the unit moves the extra

+

hex. On a roll of 1, 2, or 3, the attempt

+

fails and the unit is Disrupted (in its

+

current hex if this was a Group Move

+

or in its original hex if a Regroup).

+

7.0 ENGAGEMENT

+

Entering a hex containing enemy

+

units is Engaging.

+

Entering a hex containing only

+

enemy units is Attacking (as well as

+

Engaging). See 8.2.

+

7.1 HEXSIDE LIMITS

+

There is a limit to the number of

+

units able to Engage enemy forces

+

across the same Hexside in a single

+

Movement phase.

+

For Clear terrain Hexsides, the

+

limit is two units per Movement phase

+

(i.e., six units could enter a battle hex

+

via three clear Hexsides).

+

For Gap or Mountain Road

+

Hexsides, the limit is one unit per

+

Movement phase.

+

Remember: Units can only cross

+

Mountain hexsides where a Road exists

+

and Ridges/Marshes through a Gap.

+

During the Blitz Movement Phase,

+

Hexside limits are reset: additional

+

units can Engage via Hexsides already

+

traversed.

+

7.2 DISENGAGEMENT

+

Units that leave a hex containing

+

enemy units are Disengaging (except

+

during Buildup, see 16.51). Units can

+

only Disengage through Friendly

+

Hexsides (8.1). Units that Disengage

+

are always Disrupted (11.0). Hexside

+

limits do not apply when Disengaging.

+

Disengaging units are turned

+

upright before moving out of a Battle

+

Hex and turned face-down (Disrupted)

+

after they finish movement. They

+

cannot re-engage this Player Turn.

+

When all friendly units Disengage

+

from a hex, it is a Full Retreat (10.3).

+

If some but not all friendly units

+

Disengage from a battle hex, it is

+

termed a Partial Retreat (10.4).

+

7.3 REVEALING UNITS

+

Units engaging into a Battle are

+

not revealed until all Movement is

+

complete. Once revealed, units remain

+

face-up until they Disengage or until

+

the battle ends.

+

UNIT SPEED

+

RECON

+

4

+

+

ARMOR

+

MOB. A/T

+

MECH. INF.

+

SELF PROP. ARTY

+

3

+

MOT. INF.

+

MOT. A/T

+

2

+

INFANTRY

+

PARA

+

ARTILLERY

+

1

+

Road Bonus Example

+

A Recon unit (speed 4) can move up to 8

+

hexes along the highway, 6 hexes along

+

tracks, and 5 hexes on trails.

+

The unit could move up to 5 hexes along a

+

combination of tracks and trails.

+

Road bonuses cannot be applied to

+

Retreats or Redeployments.

+

The Rommel Bonus

+

The Rommel Bonus can only be used by

+

an active Axis player during Movement or

+

Blitz Movement (not both).

+

It cannot be used by a passive Axis player

+

for Withdrawal Moves to Refuse Battle or

+

Rout, or to Redeploy in Buildup.

+

Regrouping Forced Marches

+

Units may attempt a Forced March to the

+

destination hex of a Regroup Move, but

+

if unsuccessful they are Disrupted at their

+

original location (units that cannot Regroup

+

to the destination hex cannot move at all).

+

Forced Marches into Battle

+

Players cannot attempt to Force March into

+

engagements in excess of Hexside Limits

+

(anticipating that some units will fail to

+

arrive).

+

Retreat Forced Marches

+

Units failing a Forced March when making

+

a Retreat lose one step in addition to the

+

usual Disruption that always happens to

+

Disengaging units.

+

Retreat vs. Disengagement

+

Units Disengage; Groups Retreat.

+
+ +
+

8.0 BATTLES

+

A Battle is a hex containing units of

+

both sides, where combat can occur.

+

Battles are not necessarily resolved

+

immediately: they last until one side

+

Retreats [10.0] or is eliminated. Battles

+

can last through several Player Turns,

+

sometimes even lasting for Months.

+

8.1 BATTLE HEXSIDES

+

Each Hexside of a battle hex is

+

termed a Battle Hexside. Control of

+

Battle Hexsides determines Supply

+

Lines into battles and Disengagement

+

routes out of them.

+

A Battle Hexside is friendly to the

+

side whose units last engaged across it

+

(and this takes effect instantly).

+

A Hexside that neither side has

+

crossed is friendly to the Defender (8.3).

+

8.2 ATTACKS

+

Moving units into an enemy hex

+

(one containing solely enemy units) is

+

termed Attacking. Adding units to an

+

existing battle hex is not an Attack.

+

The Passive Player can respond to

+

an Attack either by accepting battle

+

or by Refusing Battle (8.4). If battle is

+

accepted, combat is mandatory that

+

turn (8.5).

+

Disrupted units that are Attacked

+

without friendly Undisrupted Shielding

+

units present are Routed (11.3).

+

8.3 ATTACKER & DEFENDER

+

The player who initiates a battle is

+

termed the Attacker in that Battle for as

+

long as it lasts. The other player is the

+

Defender. This distinction is important

+

because the Defender maintains

+

control of Battle Hexes for Supply

+

Line tracing purposes.

+

8.4 REFUSING BATTLE

+

Immediately upon the completion

+

of all enemy Moves (including Forced

+

Marches), the Passive Player has the

+

option to Refuse Combat and Retreat

+

Attacked Groups by Withdrawal Move

+

if possible (see 10.2).

+

The option to Refuse Combat is

+

not open to Groups already engaged

+

in Battles when Movement began.

+

8.5 BATTLE ARRAY

+

If battle is accepted, mark the

+

hex with a Battle Marker of the

+

Defender’s color and move the units

+

involved to a convenient location.

+

Small battles may be fought in the hex.

+

Players then arrange their units

+

in opposing Battle Lines (placing the

+

corresponding Battle Marker of the

+

Attacker’s color nearby).

+

Players now reveal their units by

+

turning them face-up, tipping forward

+

toward the enemy line, so that their

+

current CVs are oriented toward the

+

enemy line.

+

8.6 ACTIVE BATTLES

+

In a Combat phase, the Active

+

Player has the option to wage Combat

+

in any or all current battles. Battles

+

selected for Combat are termed Active

+

Battles.

+

Combat is mandatory in two

+

cases: these Battles must be fought in

+

that Combat phase:

+

New Battles: combat is required

+

in the first Combat phase of a new

+

Battle.

+

Fortress Battles: the Attacker

+

(but not the Defender) must wage

+

combat every Combat round when

+

engaged in a Fortress hex (except

+

during Blitz Combat).

+

Select Active Battles: Before

+

Combat begins, the Active Player

+

must indicate all the Battles in which

+

Combat is to occur by moving those

+

Battle Lines closer together, and

+

leaving other Battle Lines more

+

separated.

+

Select Assault Battles: During

+

Assault Turns, selected Battles may

+

be fought as Assault Battles. Before

+

Combat begins, the Active Player must

+

pre-indicate all Assault Battles by

+

placing one or more friendly units on

+

top of the defending line.

+

In Assault Battles, all units (both

+

Attacker and Defender) fire Double

+

Dice (9.21).

+

Refusing Battle: Disrupted Units

+

in the Group

+

When a Group containing Disrupted units

+

Refuses Battle, the Disrupted units are, of

+

course, unable to Withdraw, being unable

+

to move except to Rout.

+

First, the Undisrupted units suffer Pursuit

+

Fire and then execute a Withdrawal

+

Group Move. The Disrupted units are

+

now Unshielded and are therefore Routed,

+

suffering Rout Attrition and Pursuit Fire

+

from unfired Pursuing units (if any). If

+

they survive, they can then Withdraw as a

+

separate group.

+

Refusing Battle: Units in the

+

Group without a Supply Line

+

Since units without a Supply Line cannot

+

Withdraw, and Partial Retreat is not

+

allowed when Refusing Battle, a mixed

+

Group of units of which only some have a

+

Supply Line may not Refuse Battle.

+

This situation can arise when a group

+

is composed of units assigned Fortress

+

Supply and other units with no Supply Line

+

to Base.

+

Battle Arrays

+

The position of units in the line is

+

immaterial (though it helps to group units

+

by arms class).

+

Artillery units can be placed behind the

+

battle line to remind players that they can

+

only be targeted by enemy artillery (unless

+

unsupported).

+

Fortress Combat in Pass Turns

+

The Original Attacker must have combat

+

when Engaged in a Fortress. Yet no

+

Combat is allowed during a PASS TURN.

+

Therefore, if the original Attacker Passes

+

while engaged in a Fortress hex, he must

+

Retreat his forces from the Fortress hex by

+

Withdrawal Move. If this is not possible,

+

the active player's forces are Routed (see

+

13.2).

+
+ +
+

9.0 COMBAT

+

Once Active Battles are designated,

+

they are resolved one by one, in any

+

order chosen by the Active Player.

+

Each Combat phase involves one

+

Combat Round in each Active Battle, in

+

which each unit fires once. All firing in

+

one Battle must be completed before

+

proceeding to the next battle.

+

9.1 COMBAT ROUNDS

+

A Combat Round is executed in

+

each Active Battle as follows:

+

1) The Passive Player fires Defensive

+

Fire and losses are applied.

+

2) The Active Player fires Offensive

+

Fire and losses are applied.

+

9.2 UNIT FIRE

+

In Defensive or Offensive Fire, each

+

unit fires once in any desired order,

+

except that artillery must fire first.

+

To fire a unit, the firing player

+

indicates the unit firing and the Class

+

(armor/infantry/anti-tank/artillery)

+

being targeted, and rolls one die per

+

firing unit CV (3 dice for 3 CV units).

+

Depending on the unit’s Firepower

+

(9.4) versus the selected target Class,

+

certain numbers rolled score hits,

+

reducing the CV of enemy units in the

+

target Class.

+

9.21 DOUBLE DICE

+

In Assault Combat and Fortress

+

defense, units fire Double Dice, meaning

+

they roll twice the normal number of

+

dice (at normal Firepower).

+

9.3 TARGETING

+

Some unit classes must fire at their

+

enemy counterparts if present: Armor-

+

class units must fire at armor-class

+

units, if present. Similarly, infantry-

+

class units must fire at infantry-class

+

units, if present. Artillery and anti-tank

+

class units are not restricted in this

+

way. Only artillery can target enemy

+

artillery, unless no other class of target

+

unit is present. Target class must be

+

announced before firing a unit.

+

If all units of a required target

+

class are eliminated, unfired units may

+

fire at other target Classes.

+

9.4 FIREPOWER

+

The effectiveness of fire depends

+

on the Class of unit firing and its target.

+

Cross-referencing the firing unit's Class

+

and the target Class on the Fire Table

+

(see Map) shows fire effectiveness.

+

• "SF" stands for "single fire" and

+

scores one hit for every "6" rolled.

+

• "DF" (double fire) scores a hit for

+

every "5" or "6" rolled.

+

• "TF" (triple fire) scores a hit for

+

every "4", "5", or "6" rolled.

+

9.5 APPLYING LOSSES

+

For each hit scored by enemy fire, a

+

unit of the targeted Class is reduced by

+

1 CV (owner’s choice of exact unit).

+

Elite Units: All German units and

+

some Allied armor units are elite, with

+

2 CV per step. Two hits are necessary

+

to reduce them by a step. All hits on a

+

given arms Class must be applied if

+

possible but leftover hits at the end of

+

a combat round are wasted.

+

Within an arms class, the owning

+

player may allocate hits to individual

+

units as desired (except hits may only

+

be wasted if there is no alternative).

+

As hits are received, the owning

+

player provisionally allocates them to

+

units of the target class, only finalizing

+

this when all enemy fire is complete.

+

Single hits allocated to elite units are

+

indicated by rotating the unit 45º.

+

If sufficient hits are inflicted within

+

a combat round to eliminate all units

+

of a target Class, they are removed

+

from play which may affect subsequent

+

targeting and opponent fire.

+

9.52 DOUBLE DEFENSE

+

Double Defense applies to the

+

Defenders in a Minefield (14.2). Hits

+

scored on Minefield Defenders are

+

considered half-hits, and it requires two

+

half-hits to inflict a 1 CV loss.

+

Exception: Artillery fire is unaffected

+

by Minefields and scores full hits.

+

As for elite units, half-hits are

+

provisionally allocated to units within

+

the target class. At the end of a

+

Combat Round, leftover half-hits on a

+

given target class are wasted.

+

Unit Fire

+

A unit must fire all its CV simultaneously

+

at a single Target Class, and cannot switch

+

targets in a Combat Round, even if all

+

units of the Target Class are eliminated.

+

Unit Fire Example

+

Since no enemy armor is present, a 6 CV

+

armor unit fires on enemy infantry at fire

+

effectiveness of double fire (DF).

+

A dieroll of 4, 5, 1, 6, 3, 3 scores two hits.

+

Double Dice Unit Fire Example

+

A 3 CV Infantry unit defending a Fortress

+

rolls 6 dice (3 CV, doubled) for defensive

+

fire. Firepower remains the same (e.g., SF

+

when targeting enemy infantry).

+

Targeting Artillery

+

Artillery can only be targeted by enemy

+

artillery, unless no other Class of friendly

+

unit is present in the battle (Disrupted

+

units are ignored for targeting purposes).

+

Artillery unsupported by any other arms

+

Class is extremely vulnerable. All units

+

except artillery fire on unsupported enemy

+

artillery at Triple Fire.

+

Firepower Example

+

If enemy armor is present in a Battle, an

+

armor unit must target it at SF.

+

However, when no enemy armor is

+

present, the same armor unit can fire on

+

enemy infantry at DF.

+

Applying “Half Losses”

+

When all units of a given target class are

+

elite, leftover “odd” hits at the end of a

+

Combat Round will be wasted.

+

For example, if all Axis armor in a battle is

+

elite, and the Allies score 3 hits on enemy

+

armor in a combat round. Two hits are

+

applied to reduce a German armor unit by

+

one step and the leftover hit is wasted.

+

The same principle applies to units with

+

Double Defense in a Minefield.

+

Applying Losses to Mixed Groups

+

When a target class is a mix of elite and

+

normal units, all hits must be applied.

+

Example: Three armor hits are scored in

+

a combat round where there are both elite

+

and normal armor targets. Either 2 hits are

+

applied to elite armor and 1 hit to normal,

+

or all 3 hits are applied to normal armor.

+

Players should apply hits provisionally.

+

For instance, a 1 CV unit hit by enemy fire

+

should not be removed from play until the

+

end of the combat round since an ensuing

+

2nd hit may have to be applied to an elite

+

double-step unit instead.

+
+ +
+

10.0 RETREATS

+

Disengaging (7.2) all units from a

+

Battle Hex is a Full Retreat (10.3). If

+

some, but not all, units Disengage it

+

is a Partial Retreat (10.4). Units that

+

Disengage are always Disrupted (11.0).

+

Voluntary Retreats can occur

+

when Refusing Battle (10.2) by Group

+

Withdrawal Move, or by a Group or

+

Regroup Move during a Player Turn

+

(including by Withdrawal Move during a

+

PASS TURN).

+

Involuntary Retreats occur when

+

Disrupted units are Routed (11.3). A

+

routed unit makes a Withdrawal Move.

+

Important: Disrupted (11.0) units

+

cannot move except to Rout (11.3).

+

10.1 RETREAT ROUTES

+

Units can only Disengage through

+

friendly Battle Hexsides (8.1) into

+

friendly or empty hexes, never directly

+

into an enemy or battle hex. They may

+

then continue to move as normal, but

+

may not re-engage this Player Turn.

+

Units forced to Disengage but

+

unable to do so are eliminated.

+

10.2 REFUSING BATTLE

+

Immediately following all enemy

+

Movement, the Passive Player may

+

Refuse Battle by Retreating all units of

+

any Groups just Attacked (8.2) by

+

Withdrawal Move (5.3). Regroup Moves

+

or Partial Retreats to Refuse Battle are

+

not allowed. As usual, the retreating

+

units are subject to Pursuit Fire and

+

become Disrupted. When Refusing

+

Battle, units are not revealed.

+

10.3 FULL RETREATS

+

The Active Player may voluntarily

+

Retreat all units from existing battles

+

by Group or Regroup Move (including

+

by Withdrawal Move 5.3). Retreating

+

Groups are subject to Pursuit Fire (10.5)

+

and become Disrupted (11.0).

+

Refuse Battle Procedure

+

1) The Passive Player announces his intent

+

to Refuse Battle, leaving units upright in

+

the Battle Hex (not revealed).

+

2) The Active Player conducts Pursuit Fire

+

against Retreating units, saving fire for

+

Routs as desired. Pursuing units are not

+

revealed either.

+

3) The Passive Player moves surviving

+

units by Withdrawal Group Move.

+

4) Any Disrupted units remaining are

+

Routed (11.3) and subject to Pursuit Fire

+

by unfired units.

+

Full Retreat Procedure

+

1) The Active Player moves all other

+

units, announces the Retreat and turns

+

Retreating units upright in the battle hex.

+

2) The Passive Player conducts Pursuit Fire

+

against Retreating units.

+

3) The Active Player moves surviving

+

Retreating units according to the Group or

+

Regroup Moves underway.

+

4) Any Disrupted units remaining in the

+

Retreat hex are Routed (11.3) and subject

+

to Pursuit Fire by unfired units.

+

Partial Retreat Procedure

+

1) The Active Player moves all other units,

+

announces the Partial Retreat and turns

+

Disengaging units upright in the Battle

+

Hex.

+

2) The Passive Player may initiate Probe

+

Combat. If the Rearguard is eliminated by

+

Probe Combat, the Partial Retreat becomes

+

a full Retreat. Continue with Retreat

+

Procedure above, starting with 2).

+

Reversed Roles in Probe Combat

+

If Rearguard units are Original Defenders,

+

they receive any Fortress and Minefield

+

defensive benefits (Probing units do not).

+

Pursuit Deception

+

Pursuit Fire for some units may be

+

withheld to disguise the nature of the

+

Group. Or, because each unit can only fire

+

once, a player may reserve the fire from

+

some Pursuing units for enemy Disrupted

+

units about to be Routed.

+

Pursuit Fire in a Combat Phase

+

Pursuit Fire can occur during a Combat

+

phase when Disrupted units in a Battle

+

Hex are Routed after elimination of all

+

friendly Shielding units (11.11). Only units

+

that have not yet fired in combat may

+

conduct Pursuit Fire.

+

10.4 PARTIAL RETREATS

+

Partial Retreats involve Disengaging

+

some but not all units from a battle.

+

Partial Retreats can never be made

+

by Withdrawal Move: they require the

+

expenditure of a Supply Card. Partial

+

Retreats may avoid Pursuit Fire.

+

After completing all other

+

Movement, turn the Disengaging

+

units upright. All Undisrupted

+

units remaining in the Battle are the

+

Rearguard. The Rearguard must survive

+

a round of Probe Combat to protect the

+

Disengaging units from Pursuit Fire.

+

Important: When making a Partial

+

Retreat you cannot initiate Combat in

+

that Battle during the same Player Turn.

+

10.41 PROBE COMBAT

+

Before units making a Partial

+

Retreat actually move, the Passive

+

Player may provoke a round of Probe

+

Combat (no Supply Card expenditure

+

required).

+

In Probe Combat the Offensive/

+

Defensive roles are reversed: first the

+

Active Player’s Rearguard unit(s) fire

+

Defensive Fire, then the Passive Player

+

returns Offensive Fire (see sidebar).

+

If all enemy Rearguard units are

+

eliminated, unfired Probing units may

+

immediately conduct Pursuit Fire (10.5)

+

against the upright Disengaging

+

units (treated as a Group). Surviving

+

units then resume their Disengage

+

move. If the Passive Player declines

+

Probe Combat or the Rearguard is not

+

eliminated by it, the Disengaging units

+

are not exposed to Pursuit Fire (10.5).

+

10.5 PURSUIT FIRE

+

Groups that Retreat for any reason

+

must take Pursuit Fire. Pursuit Firepower

+

is based on Unit Speed.

+

The Retreating player announces the

+

speed of his slowest Retreating unit.

+

The pursuing player then rolls one die

+

for each equally-fast unit in the [former]

+

battle hex, and two dice for each faster

+

unit. Slower units cannot pursue.

+

One hit is scored for each dieroll

+

of 4, 5, or 6. The Retreating player

+

must immediately apply losses to any

+

Retreating units as desired as per 9.5.

+
+ +
+

11.0 DISRUPTION

+

Units become Disrupted if they:

+

• Disengage from a battle (7.2),

+

• Refuse battle (10.2),

+

• Are Unsupplied (12.1) during both

+

the Initial & Final Supply Checks, or

+

• Fail a Forced March (6.4).

+

To indicate Disrupted status, turn

+

units face-down on the map (tip back

+

toward the owner to preserve CV).

+

Units can remain Disrupted

+

indefinitely, but are eliminated if

+

Unsupplied (12.1) at the end of a

+

month.

+

11.1 DISRUPTION EFFECTS

+

Disruption has temporary, but

+

severe effects. Disrupted units cannot:

+

• Move (except to Rout)

+

• Impede enemy movement (they

+

Rout immediately if Attacked)

+

• Fire or absorb hits in Combat

+

• Form part of friendly Supply Chains

+

• Block enemy Supply Lines

+

• Redeploy or Return to Base during

+

Buildup (see 16.5)

+

11.11 DISRUPTED UNITS IN BATTLE

+

Disrupted units that are Engaged

+

are immediately Routed (11.3) unless

+

Shielded by friendly Undisrupted units

+

in the same hex.

+

Even if Shielded, Disrupted units

+

take no part in battles (place them

+

face-down behind the battle lines),

+

Disrupted units cannot recover

+

while enemy units remain in the hex,

+

but may do so once the battle is won

+

(no enemy units remain in the hex).

+

Disrupted units Rout immediately once

+

no Shielding units remain.

+

11.2 DISRUPTION RECOVERY

+

Disrupted units Recover during

+

the Initial Supply Check of a friendly

+

Player-Turn, provided that they:

+

• Are not in a Battle Hex,

+

• Have a Supply Line, and

+

• Have spent one complete enemy

+

Player-Turn Disrupted (i.e., they do

+

not recover if they Refused Battle or

+

Routed in the previous enemy turn).

+

11.3 ROUT

+

Disrupted units in a battle hex

+

without Undisrupted friendly Shielding

+

units are Routed. This can occur if:

+

• Disrupted units are Attacked alone

+

(i.e., not Shielded).

+

• Disrupted units become alone in a

+

battle hex after all friendly Shielding

+

units Disengage or are eliminated.

+

When a Rout occurs, its effects

+

(below) are resolved immediately,

+

interrupting the normal flow of play.

+

All Routed units must (in order):

+

• Lose one step of Rout Attrition

+

• Suffer Pursuit Fire (10.5)

+

• Retreat by Withdrawal Group

+

Move, and they are eliminated if

+

unable to do so)

+

• Become Disrupted again

+

11.4 OVERRUN

+

An Overrun occurs when one or

+

more units enter a hex containing

+

Unshielded enemy Disrupted units

+

(hexside limits apply), Routing the

+

Disrupted units. All Overrunning units

+

must stop in the attacked hex, moving

+

no further that turn.

+

Although a single Attacking unit

+

can Rout a Disrupted enemy group,

+

the Active Player may elect to Attack

+

with multiple units to increase his

+

Pursuit Fire during Rout resolution.

+

Once all Attacking units have

+

entered the hex, movement is

+

interrupted to resolve the Rout.

+

After resolving the Rout, the

+

Active Player may still have other

+

units qualified to move (as part of

+

Group or Regrouping Moves already

+

underway), but as yet unmoved.

+

These units may then complete their

+

Movement, including passing through

+

the Overrun hex now vacated of

+

enemy units.

+

Multiple overruns can occur in the

+

same Player Turn.

+

Units Disrupted in Enemy Turns

+

Units that have become Disrupted are

+

only able recover after spending an entire

+

enemy Player Turn Disrupted.

+

This means units that become Disrupted

+

during an enemy Player Turn (by Refusing

+

Battle or being Routed) remain Disrupted

+

through the upcoming friendly Player-

+

Turn and the next enemy Player-Turn,

+

becoming able to recover only in the

+

second friendly Player-Turn following

+

Disruption.

+

Routs

+

When Unshielded (11.11) Disrupted units

+

are Attacked, they are Routed.

+

Routs also occur when the Rearguard in a

+

Partial Retreat is eliminated while Shielding

+

friendly Disrupted units.

+

Combat Phase Routs

+

When Disrupted units are Routed in a

+

Combat phase due to elimination of all

+

friendly Shielding units in that Battle Hex,

+

only enemy units that have not yet fired in

+

that combat round may conduct Pursuit

+

Fire.

+

Final Supply Check Routs

+

If units Engaged in battle become

+

Disrupted due to lack of a Supply Line,

+

they are immediately eliminated, since

+

units without a Supply Line cannot

+

Withdraw.

+

Overruns

+

In an OFFENSIVE TURN, units from both

+

moving Groups may participate in the

+

same Rout and/or Overrun (as they share

+

the same MOVEMENT phase).

+

Overrun Procedure

+

1) The Active Player moves one or more

+

units into a hex containing solely enemy

+

Disrupted units, and announces the Rout.

+

2) All Disrupted units in the Attacked hex

+

lose one step of Rout Attrition.

+

3) The Active Player executes Pursuit Fire

+

(10.5) against the Disrupted units.

+

4) The Passive Player must now Retreat

+

surviving units by Withdrawal Group

+

Move, if possible. If not, they are

+

eliminated.

+

5) The Active Player now moves all

+

unmoved units that are eligible to move as

+

part of the Group/Regroup Moves already

+

underway. These units my move into or

+

through the Overrun hex just vacated by

+

Routed enemy units.

+
+ +
+

12.0 SUPPLY

+

Units in play are either Supplied or

+

Unsupplied, depending on whether or

+

not they had a Supply Line during the

+

latest friendly Supply Check.

+

To be Supplied, a unit must be able

+

to trace a Supply Line to a friendly

+

Supply Source. This is normally the

+

friendly Base, but a limited number of

+

units may also trace Supply Lines to a

+

Fortress (13.0). Oases also have very

+

limited Supply capability (see 15.1).

+

12.1 UNSUPPLIED UNITS

+

Units that cannot trace a Supply

+

Line during friendly Supply Checks

+

are Unsupplied. Being Unsupplied

+

causes no immediate harm (unlike

+

Disruption). Unsupplied units can

+

move, impede enemy moves, Engage

+

or Attack, form or cut Supply Lines,

+

capture Fortresses and Bases, etc.

+

However, units judged Unsupplied

+

during the Initial Supply Check and

+

still Unsupplied at the Final Supply

+

Check become Disrupted (11.0).

+

12.2 SUPPLY LINES

+

A Supply Line is a continuous line

+

of hexes leading from a unit to a

+

friendly Supply Source.

+

Supply Sources: The main Supply

+

Source for each side is its Base (El

+

Agheila or Alexandria), which can

+

Supply any number of friendly units.

+

Fortresses can also act as Supply

+

Sources for a limited number of

+

units (13.3). Oases can Supply one

+

unit, see 15.1.

+

Supply Lines are determined by

+

the position of friendly units on

+

the board at the time of the Supply

+

Check. They can be any length and

+

are composed of sections of Highway

+

and/or Supply Chains of friendly units.

+

Units can have multiple Supply Lines.

+

Supply Lines can pass through

+

friendly hexes, empty hexes, and

+

Battle Hexes where the friendly side

+

is the Defender (Friendly Battles). They

+

cannot pass through enemy hexes,

+

enemy Battles (enemy Defender), or

+

through impassable Hexsides.

+

12.3 HIGHWAY SUPPLY

+

The coastal Highway normally forms

+

a Supply Line for either side. Any stretch

+

of Highway that is not blocked by enemy

+

units automatically forms a valid Supply

+

Line. A Supply Line may be composed of

+

several stretches of highway connected

+

by one or more Supply Chains.

+

12.4 SUPPLY CHAINS

+

Off highway, Supply Lines are

+

composed of Supply Chains which are a

+

series of spaced friendly units, each within

+

a specified distance (Supply Range) of

+

another member of the Supply Chain, and

+

with at least one unit of the chain within

+

Supply Range of a Supplied Highway or

+

Fortress. Supply Range varies with Road

+

quality as follows:

+

Tracks: 3 hexes (2 hexes intervening)

+

Trails: 2 hexes (1 hex intervening)

+

No Road: every hex (units must be

+

adjacent via passable terrain)

+

• If different types of Road are used, the

+

lesser Supply Range applies.

+

A single unit can contribute to several

+

Supply Chains. Engaged units can form

+

Supply Chains but Disrupted units cannot.

+

12.5 SUPPLY INTO BATTLES

+

Both sides can trace Supply Lines into

+

a Battle Hex. Supply Lines into Battle

+

Hexes must pass through friendly Battle

+

Hexsides. Battle Hexsides are friendly to

+

the side that last crossed them (but see

+

below), and control changes instantly.

+

Hexsides not crossed by either player are

+

friendly to the Original Defender.

+

The Original Defender can trace

+

Supply Lines through a Battle Hex. The

+

Attacker can only trace Supply Lines into

+

Battle Hexes (through friendly hexsides).

+

Raiders: Unsupplied units cannot

+

regain a Supply Line or make a Hexside

+

friendly by entering a Battle via an Enemy

+

Hexside. If the Hexside of entry remains

+

enemy after all movement, mark the

+

unit with a Raider marker. Raiders are

+

considered to remain behind enemy lines

+

isolated from friendly Supply.

+

Raiders fight normally but become

+

Disrupted (Final Supply Check) if supply is

+

not re-established (e.g., the Battle is won).

+

Supply Chains

+

Supply Chains do not "project" from a

+

unit into the surrounding area, they can

+

only connect to a friendly unit to the next

+

unit in the chain or to the Highway.

+

Disrupted units cannot help form Supply

+

Chains or block Supply Lines.

+

A Supply Chain cannot be traced from

+

a unit back to itself (e.g., in a loop along

+

Roads). Hexes containing only Disrupted

+

units are considered empty hexes for

+

Supply Chain purposes..

+

Disrupted Unit Supply

+

Although Disrupted units cannot be used

+

to form Supply Chains, they themselves

+

can trace supply to any Supply Lines

+

within Supply Range.

+

Supply Check Timing Implications

+

Unsupplied units suffer no immediate

+

penalty, but must have a Supply Line

+

(or Fortress/Oasis Supply) at the Final

+

Supply Check to avoid Disruption

+

(11.0). Establishing a temporary Supply

+

Line during the turn will not save an

+

Unsupplied unit from Disruption, it must

+

have a Supply Line at the Final Supply

+

Check.

+

Therefore, Supplied units can interdict

+

enemy Supply Lines by moving to an

+

Unsupplied location deep in the enemy

+

rear without immediate ill effect (having

+

been Supplied at the Initial Supply

+

Check). Even if they remain Unsupplied,

+

these units will not become Disrupted

+

until the end of their next friendly

+

Player-Turn.

+

But in the meantime, enemy units that

+

become Unsupplied as a result are more

+

immediately threatened with Disruption.

+

To avoid Disruption, they must recover

+

a Supply Line by the end of their Player

+

Turn, which comes first.

+

Note that units can move to Unsupplied

+

locations on one Player Turn, and

+

return to a Supplied location in the next,

+

without becoming Disrupted.

+

Disrupted Unsupplied units that fail a

+

Final Supply check suffer no additional

+

effect. Units that are still Unsupplied

+

when a Month of play ends are

+

eliminated and removed from play.

+
+ +
+

12.6 SUPPLY NETWORK

+

The sum of all current friendly

+

Supply Lines is termed the Supply

+

Network. When a unit has several valid

+

Supply Lines, all of them contribute

+

to the friendly Supply Network.

+

It is entirely possible for a hex to

+

be in the Supply Networks of both

+

players simultaneously. Opposing

+

Supply Networks may overlap without

+

affecting either side.

+

12.7 SUPPLY CHECKS

+

• INITIAL SUPPLY CHECK:

+

• Check for valid Supply Lines.

+

Determine friendly Battle Hexes

+

and Battle Hexsides. Check for

+

Supply Status of friendly units.

+

• Place Unsupplied markers on

+

Unsupplied units and remove

+

markers from Supplied units.

+

• Mark Fortress Supplied units with

+

a Fortress Supply marker.

+

• Disruption Recovery:

+

• Friendly units that have spent

+

a complete enemy turn

+

Disrupted but are now Supplied

+

and unengaged revert to their

+

normal, Undisrupted state (turn

+

upright).

+

FINAL SUPPLY CHECK:

+

• Check for valid Supply Lines.

+

Determine friendly Battle Hexes and

+

Battle Hexsides. Check for Supply

+

Status of friendly units.

+

• Remove Unsupplied markers from

+

any units now in Supply.

+

• Disrupt all units marked Unsupplied

+

that still have no Supply Line.

+

• Immediately Rout newly Disrupted

+

units in Battle Hexes without

+

friendly Shielding units.

+

Note: Temporarily re-establishing a

+

Supply Line to an Unsupplied unit

+

during the turn will not save it from

+

Disruption if it is Unsupplied in the

+

Final Supply Check.

+

• BUILDUP SUPPLY CHECK:

+

• Check for valid Supply Lines.

+

Determine the Supply Network of

+

each player: these remain in effect

+

without change throughout Buildup.

+

• Determine the Supply Status of all

+

units of both sides.

+

• Eliminate any Unsupplied units.

+

• Remove markers for those units now

+

Supplied.

+

• Recover all Supplied, Unengaged

+

Disrupted units (turn upright).

+

Two More Supply Examples:

+

A) An Allied recon unit moves behind the

+

Axis line and cuts the Highway at Gazala,

+

isolating all Axis forces to the east. During

+

his next turn, the Axis player moves units

+

to Mechili and to Bir Harmat.

+

These moves re-establish the Highway east

+

from Bir Harmat as an Axis Supply Source

+

because a Supply Chain exists around the

+

blocking unit at Gazala.

+

The unit at Bir Harmat chains three hexes

+

along the track to the unit at Mechili which

+

chains two hexes along the trail to the

+

Supplied Highway at Derna. No chaining

+

unit is required at Derna.

+

B) Allied units are holding out in Benghazi

+

after main Axis forces have advanced far

+

to the east to Gazala. The Axis player has

+

some units in the Benghazi hex, attacking

+

the Fortress. As the Attacker, the Axis

+

player cannot trace supply through the

+

Benghazi hex so the Highway is blocked at

+

that point for the units at Gazala.

+

However, an Axis unit at Er Regima would

+

re-establish the Highway as an Axis Supply

+

Source for the units at Gazala by creating a

+

Supply Chain around Benghazi.

+

This is because the unit at Er Regima can

+

chain two hexes along the trail/track to

+

the Supplied Highway at Ghemines. No

+

chaining unit is necessary at Ghemines.

+

SUPPLY EXAMPLE

+

Alexandria lies off the map to the east. Allied unit [A] is Supplied

+

along the Coast Highway. Unit [B] is Supplied along the track (3

+

hexes) to Mersa Matruh on the coast highway. Other units (not

+

shown on the map) located a further three hexes south at Siwa

+

Oasis would trace a supply line through [B], although one of them

+

would be in supply from the Oasis anyway. Unit [C] is Supplied

+

along a trail (2 hexes) to Sidi Barrani on the Coast Highway. Unit

+

[D] is Supplied because it is adjacent to [C].

+

Unit [E] is Unsupplied. It is located in the open desert and it is not

+

adjacent to a Supplied unit. Although it is adjacent to the Coast

+

Highway (which is usually sufficient to trace a supply line), it is not

+

allowed to trace a supply line through the impassable ridge to the

+

north.

+

If Axis unit [1] were to move east two hexes and occupy Sofafi,

+

Allied units [C] and [D] would be Unsupplied at the beginning of

+

the next Allied Player-Turn. Axis unit [2] must remain at Sidi Omar

+

to keep Allied unit [D] from being Supplied via Sollum. Allied units

+

[C] and [D] would have to establish new supply lines in that turn to

+

avoid Disruption.

+
+ +
+

13.0 FORTRESSES

+

Benghazi, Tobruk,

+

and Bardia are Fortresses.

+

Special Combat and Supply

+

rules apply to Fortresses.

+

Fortresses also act as a ports and

+

Fortress Supply Sources for the side

+

that controls them.

+

13.1 FORTRESS CONTROL

+

Fortresses are initially controlled

+

according to the Initial Deployment

+

areas given at the Scenario start.

+

Fortress control changes only

+

by Fortress Capture (see 13.4). An

+

unoccupied Fortress is friendly to the

+

last owner. It is still an empty hex and

+

cannot block Supply Lines.

+

13.2 FORTRESS BATTLES

+

Defensive Double Dice: In a

+

Fortress, Defending units (except for

+

armor-class units) fire Double Dice on

+

Defensive Fire. This advantage is lost

+

if the Defender initiates combat.

+

Mandatory Combat: In Fortress

+

battles, the Attacker must initiate

+

combat during his own Player-Turn.

+

(Combat is optional for the defender).

+

Exception: Fortress combat is not

+

mandatory during Blitz Combat

+

13.3 FORTRESS SUPPLY

+

Fortress Supply Capacity. A

+

Fortress with no land Supply Line to

+

Base is Isolated. An Isolated Fortress

+

can be used as a Supply Source for a

+

limited number of friendly units based

+

on its Port Capacity (the numbers

+

inside hexagons).

+

The Port Capacity for the Axis is

+

the first number and the Allied Port

+

Capacity is the second. For example:

+

The Port Capacity of Tobruk is 5

+

Allied or 2 Axis units.

+

During each Initial Supply Check,

+

the Active Player may assign available

+

Fortress Supply capacity. Units inside

+

the Fortress must receive first priority

+

on Fortress Supply. Other units that

+

can trace a Supply Line to the Fortress

+

may be assigned any remaining

+

available capacity, but units nearest

+

the Fortress must receive first

+

priority for Fortress Supply. Mark units

+

assigned Fortress Supply with markers.

+

Fortress Supply assignments last

+

throughout that entire Player Turn:

+

and cannot be negated or switched

+

to another unit. Units using Fortress

+

Supply must trace Supply Lines (and

+

Withdrawal routes) back towards the

+

Fortress.

+

Similarly, friendly forces not

+

assigned Fortress Supply cannot trace

+

Supply Lines or Withdraw towards the

+

Fortress (even if located in the same

+

hex as Fortress Supplied units).

+

If the full Supply Capacity of a

+

Fortress is not utilized in the Initial

+

Supply Check, additional units may be

+

assigned Fortress Supply in the Final

+

Supply Check (within its capacity).

+

13.4 FORTRESS CAPTURE

+

Fortress control changes only

+

when Undisrupted enemy units have

+

sole occupation at the end of a Player-

+

Turn. Passing through a Fortress

+

during Movement is not sufficient.

+

Captured Supply: If a Fortress

+

is captured, the new owner receives

+

bonus Supply Cards in the following

+

Buildup. The number of cards awarded

+

is equal to enemy Port Capacity.

+

Example: The Axis player would

+

receive two (2) bonus Supply Cards

+

for capturing Benghazi, but the Allied

+

player would receive only one (1).

+

Captured Supply is never awarded

+

more than once per month for each

+

Fortress.

+

13.5 BESIEGED FORTRESSES

+

A Fortress is besieged if any hex

+

adjacent to it contains enemy units (is

+

an enemy hex or battle hex).

+

Besieging a Fortress affects Sea

+

Redeployment cost (16.53).

+

Besieging Tobruk can be important

+

to Victory (17.0).

+

Fortress Combat in Pass Turns

+

If the Attacker in a Fortress Battle takes

+

a Pass Turn (e.g., due to lack of supply),

+

Fortress Attackers must Disengage by

+

Withdrawal Move (5.3), subject to all

+

Disengagement and Retreat rules. If

+

unable to Withdraw during a Pass Turn,

+

the Fortress Attackers are Routed (11.3).

+

Captured Supply

+

If a Fortress is captured but recaptured by

+

the original owner in the same month, no

+

bonus supply is awarded.

+

If captured, recaptured and then captured

+

again, all in the same month, the capturer

+

receives bonus supply just once.

+

Fortress Supply Assignment in

+

Final Supply Check Example

+

The Allied player starts his Player-Turn

+

with two units tracing supply to Tobruk

+

(capacity 5), and has four other units

+

unable to trace a Supply Line to Base. If

+

those four units move so that, at the end of

+

the turn, they can trace Supply to Tobruk,

+

then three of those units will be Supplied,

+

and only the unit with the longest Supply

+

Line from the Fortress will become

+

Disrupted (owner's choice among equally

+

distant units).

+

However, players may not deliberately

+

withhold Supply from units inside the

+

Fortress. In the example above, the Allies

+

can not leave one of their two units

+

in Tobruk Unsupplied in the INITIAL

+

SUPPLY CHECK, in order to Supply all

+

four of the other units in the final check.

+

Port Capacity

+

Axis

+

Allies

+

El Agheila

+

no limit

+

n/a

+

Alexandria

+

n/a

+

no limit

+

Tobruk

+

2

+

5

+

Bardia

+

1

+

2

+

Benghazi

+

1

+

2

+

Older Maps: In previous editions, the

+

map showed only Allied Port Capacity;

+

Axis Port Capacity is one-half this

+

number, rounded down.

+

Fortress Assault Battles

+

Most units attacked in a Fortress with an

+

Assault Battle fire defensively at Quadruple

+

Dice. The exception is armor-Class units

+

which fire defensively at Double Dice.

+
+ +
+

14.0 MINEFIELDS

+

During Buildup, Minefields can

+

be secretly built in unengaged hexes

+

within the friendly Supply Network

+

(12.6).

+

Minefields are impartial and may

+

be used by enemy forces if captured.

+

14.1 BUILDING MINEFIELDS

+

To build a Minefield during

+

Buildup, secretly note the desired

+

location on the Game Record Sheet

+

(use a named location or a direction

+

and distance from one, e.g., “El

+

Alamein SW1”).

+

Building a Minefield costs 15 BPs

+

(16.3), so it may be necessary to save

+

BPs to afford one. Also, two existing

+

Minefields can be dismantled to build

+

a new one (see 15.55).

+

14.2 MINEFIELD EFFECTS

+

Undefended Minefields have no

+

movement or combat effect. If entered

+

by enemy units, they must be revealed

+

at the end of the Movement phase.

+

Defended Minefields do not affect

+

Movement but have a major effect on

+

Combat. Minefields are not revealed

+

until the end of the Movement phase.

+

In Minefield hexes, the Defender

+

has Double Defense (9.52), meaning

+

that Offensive Fire by Attacking units

+

only scores half-hits.

+

Exception: Artillery fire is unaffected

+

by Minefields and scores full hits on

+

defenders.

+

It takes two half-hits to reduce a

+

defending unit by 1 CV. As for elite

+

units, leftover half-hits may be wasted.

+

Example: Four (4) half-hits are

+

required to reduce an elite unit

+

defending a Minefield by one step.

+

The defensive advantage of a

+

Minefield is lost if the Defender

+

initiates combat (defending units are

+

considered to have moved out of their

+

"prepared positions" to counterattack).

+

In this case, both sides take normal

+

losses in Combat.

+

15.0 OASES

+

Jalo, Jarabub and Siwa

+

are Oases.

+

+

15.1 OASIS SUPPLY

+

Oases cannot act as Supply

+

Sources: units outside Oases cannot

+

trace Supply to them (as Fortresses).

+

A single unit in a friendly Oasis hex,

+

however, is Supplied.

+

During the Initial Supply Check,

+

one unit occupying each Oasis

+

must be assigned Oasis Supply. As

+

for Fortress Supply, this cannot be

+

canceled or switched to a different

+

unit during that Player Turn (unless

+

this unit is eliminated).

+

Units actually in the Oasis

+

must receive first priority on Oasis

+

Supply. Players cannot, for example,

+

deliberately withhold Oasis Supply

+

from a unit in an Oasis in the Initial

+

Supply Check in order to apply it to a

+

unit arriving at the Oasis later in the

+

same Player-Turn.

+

If no unit was assigned Oasis

+

Supply in the Initial Supply Check,

+

Oasis Supply may be assigned to a

+

unit in the Oasis at the Final Supply

+

Check.

+

In Oasis battles only the defending

+

unit receives Oasis Supply; Enemy

+

units need an external supply line.

+

Units occupying Oases can form

+

part of a Supply Chain as normal.

+

Elite Units in Minefields

+

Example: An elite unit defending in a

+

Minefield hex loses 1 step after it has taken

+

a total of 4 hits.

+

Example 2: Because artillery is not

+

affected by a minefield, the defending

+

elite unit in the first example would lose

+

1 step if it takes 1 hit from artillery and

+

2 hits from other unit classes in the same

+

Combat Phase.

+
+ +
+

16.0 BUILDUP

+

Each game Month begins with

+

Buildup (except the first, which is

+

factored into starting conditions).

+

Exception: The Gazala Scenario

+

does begin with a modified Buildup.

+

Buildup consists of the following

+

phases, taken in the order shown:

+

Advance Month

+

Buildup Supply check

+

BP Determination

+

First Player Buildup

+

Reinforcements

+

BP Expenditure

+

Replacements & Redeployments

+

Minefield Construction

+

Allocate BPs for Extra Supply

+

Resupply (draw all cards at once)

+

Monthly Resupply

+

Extra Supply (allocated above)

+

Bonus Supply (Fortress Capture)

+

Second Player Buildup

+

(repeat player 1 procedure)

+

16.1 ADVANCE MONTH

+

During this Phase, advance the

+

turn marker to the next game month.

+

16.2 SUPPLY CHECK

+

• Check for valid Supply Lines.

+

Determine the Supply Network

+

of each player: these apply

+

unchanged throughout Buildup.

+

• Determine the Supply status of all

+

units of both sides.

+

• Eliminate any Unsupplied units.

+

• Remove "Unsupplied" markers for

+

those units currently Supplied.

+

• Recover all Supplied, unengaged

+

Disrupted units (turn upright).

+

16.3 BUILDUP POINT

+

DETERMINATION (BPs)

+

Each player rolls two dice (2d6).

+

(Exception: in the 1940 Campaign,

+

each player rolls one die). The total of

+

all four dice is the number of Buildup

+

Points received by each player.

+

Example: if one player’s dice roll is

+

"9" and the other player’s is "7", each

+

player receives 16 BPs.

+

The player that rolled the lower

+

total is Player 1 for Buildup. If tied, the

+

Allied player is Player 1.

+

Each player determines current

+

Total BPs available (new BPs for this

+

month plus those previously Saved)

+

and records this on his Game Record

+

Sheet.

+

16.4 REINFORCEMENTS

+

Reinforcements are new units that

+

arrive in play during a game. They

+

arrive in the friendly Base during

+

Buildup at no cost in BPs.

+

All Reinforcement units have an

+

expected Month of arrival, as noted

+

on their labels, but may arrive one

+

month earlier (see below).

+

16.41 EARLY ARRIVAL

+

Reinforcement units either arrive

+

in the game month indicated on their

+

counter label (2/3rds chance) or one

+

month early (1/3rd chance).

+

All Reinforcement units scheduled

+

for the current month that have not

+

already arrived early arrive on time

+

and are deployed in the friendly Base.

+

Any Reinforcements scheduled for

+

the next game Month are checked for

+

Early Arrival. The owner rolls one die

+

for each such unit in turn, keeping its

+

identity hidden.

+

1-2: Early Arrival. Unit arrives in

+

Base immediately.

+

3-6: Scheduled Arrival. Unit

+

arrives next Buildup on schedule.

+

16.5 SPENDING BPS

+

Buildup Points can be spent on

+

the following in any order:

+

• Redeployments (16.51)

+

• Replacements (16.54)

+

• Minefields (14.1)

+

• Extra Supply Cards (10 BPs each)

+

Players can also Save a maximum

+

of 20 BPs for future expenditure.

+

Excess unspent BPs are lost.

+

Note: Use the Game Record Sheet

+

to record your own BP expenditures.

+

If both players agree, opponent

+

expenditures may also be tracked (see

+

sidebar).

+

Early Arrival: First & Last Months

+

Units can never arrive early in the first or

+

last month of a Scenario.

+

No Buildup occurs in first Month of play.

+

Units cannot arrive early in the last Month

+

of a Scenario as that would affect Victory

+

unit counts.

+

Early Arrival Example

+

During Month 2 Buildup (May 1941), all

+

four (4) Allied Month 2 Reinforcements

+

arrive (none can have arrived early in the

+

first month of the Scenario).

+

The four (4) Axis Month 3 Reinforcements

+

are then each checked for early arrival.

+

Reinforcements to an Engaged Base

+

If a Base is engaged, Reinforcements

+

cannot arrive there, but must wait off

+

board near Base. They are considered a

+

single Group located one hex directly east

+

/ west of the friendly Base.

+

In a subsequent Player Turn, they can only

+

enter the Base by normal Group Move.

+

There are no Hexside limits to enter the

+

Base from this offboard area.

+

Game Record Sheet

+

During Buildup, players note BPs Received,

+

Available, Spent, and Saved, and how BPs

+

are spent on Redeployments, Rebuilds, and

+

Extra Supply cards.

+

Divulging BP Expenditures

+

Upon request, you must divulge to

+

your opponent the number of:

+

• BPs Saved (from previous Months),

+

• Redeployments/ BPs spent,

+

• Steps Rebuilt/ BPs spent,

+

• BPs spent for Extra Supply,

+

• BPs spent for Minefields (location is

+

not divulged).

+

Players can also record enemy steps

+

rebuilt on their Game Record Sheet.

+

If enemy losses have been noted

+

during play, the two can be reconciled

+

to help prevent errors in unit strength

+

and/or disputes.

+
+ +
+

16.51 REDEPLOYMENT

+

During Buildup, units can be moved

+

individually using Redeployments.

+

One Redeployment consists of

+

moving a unit two hexes plus all

+

applicable Road Bonuses (the Rommel

+

Bonus is not applicable). Each

+

Redeployment costs 1 BP.

+

Example: For 1 BP, any unit can

+

Redeploy 6 hexes along the Coast

+

Highway.

+

A unit can be Redeployed as many

+

times as desired during Buildup, as long

+

as there are sufficient BPs.

+

Units being Redeployed must

+

remain at all times within the friendly

+

Supply Network (and may not enter the

+

enemy Supply Network where Supply

+

Networks overlap).

+

Units may never Redeploy into

+

or through Battle Hexes. Units may

+

Redeploy out of Battle Hexes provided

+

at least one friendly unit remains

+

behind. (This is not considered

+

Disengagement or Partial Retreat and

+

none of their adverse effects apply).

+

16.52 RETURN FOR REFIT

+

Instead of Redeploying to Base,

+

undisrupted units can Return for

+

Refit at no cost but then become

+

unavailable to receive Replacements or

+

for any other use for one Month until

+

the next Buildup.

+

Units being returned to Base for

+

Refit must follow an overland (not

+

sea) route within the friendly Supply

+

Network. The Active Player should

+

indicate the route.

+

Place such units off-board near the

+

Base, face-down (tip backwards to

+

maintain current CV). At the start of

+

the next Buildup, Refitted units recover

+

(turn upright and place in Base),

+

and may then receive Replacements

+

and Redeploy normally. (If Base is

+

engaged at this point, treat as for

+

Reinforcements).

+

16.53 SEA REDEPLOYMENT

+

Fortresses and Bases are also Ports.

+

Units can Redeploy by sea between

+

controlled Ports (13.1).

+

Sea Redeployment costs 1 BP per

+

unit, regardless of distance, provided

+

that neither the departing or arrival

+

Port is besieged (13.5).

+

If either Port is besieged, Sea

+

Redeployment costs the Allies 4 BPs

+

and is prohibited for the Axis. Sea

+

Redeployment between two besieged

+

ports is never allowed.

+

The maximum number of unit

+

embarkations/debarkations allowed

+

per Fortress during a single BUILDUP

+

is limited to its Port Capacity (13.3).

+

Bases have unlimited Port Capacity.

+

Sea Redeployments and land

+

Redeployments can be combined.

+

16.54 REPLACEMENTS

+

Eliminated units are permanently

+

lost, but damaged units can regain CV

+

by receiving Replacements in Base.

+

Replacement costs: The sidebar

+

table shows BP costs to increase a unit

+

by 1 CV. Elite units cost twice this

+

amount for a 2 CV step. Units may

+

receive multiple Replacement steps if

+

there are sufficient BPs.

+

16.55 BUILDING MINEFIELDS

+

During Buildup, players may spend

+

15 BPs to build a hidden Minefield

+

in any hex within the friendly Supply

+

Network (not in battle hexes).

+

The desired location is secretly

+

noted on the Game Record Sheet. (For

+

hexes with no named location, use a

+

direction and distance in hexes from

+

one, such as "Alamein SW2".)

+

Two Minefields within the friendly

+

Supply Network may be secretly

+

dismantled, to enable a one new one

+

to be built immediately at no cost.

+

16.6 RESUPPLY

+

Collect all Supply Cards spent

+

during the previous month (plus any

+

dummy cards players may wish to

+

discard) and return them to the deck.

+

Shuffle the deck and deal the

+

monthly allotment of Supply Cards

+

to each player (as per Scenario

+

instructions, adding any Bonus Supply

+

(13.4) and Extra Supply purchased

+

during Buildup. A player can never

+

have more than 16 Supply Cards.

+

Redeployment

+

Units can Redeploy to Base, receive

+

Replacements (16.54) and then Redeploy

+

again back to the front (but Redeploying

+

units cannot enter battle hexes).

+

Newly arrived Reinforcements can be

+

immediately Redeployed.

+

Units can be Redeployed to any hex within

+

the friendly supply network (as determined

+

at the start of Buildup), even if this has

+

the result of incidentally expanding the

+

Supply Network by creating additional

+

Supply Lines. This expansion of the Supply

+

Network cannot be applied during the

+

current Buildup.

+

Redeployment Example

+

In a single Buildup, the Axis can

+

Redeploy a unit out of a battle by road to

+

Tobruk, Redeploy it by sea to Base, add

+

Replacements there, Redeploy it by sea

+

back to Tobruk and then by road again

+

toward the front (but it could not enter a

+

Battle Hex).

+

Port Capacity Example

+

Assuming Tobruk is not besieged, the

+

Allies could move two units into and three

+

units out of it in a single Buildup, at a cost

+

of 5 BPs. The Axis could only move one

+

unit in and one unit out at a cost of 2 BPs.

+

Supply Cards

+

Players are obliged to reveal the total

+

number of Supply Cards [real plus dummy]

+

in their hands. However, the number of

+

real vs. dummy cards should remain a

+

carefully guarded secret.

+

BP COSTS PER CV

+

Armor & Recon

+

3

+

Anti-Tank (all)

+

3

+

Artillery (all)

+

3

+

Mech & Motor Infantry

+

2

+

Leg Infantry & Para

+

1

+

Elite Units cost double to increase one

+

step of 2 CV.

+

Minefields

+

15

+

Extra Supply Card

+

10

+
+ +
+

17.0 VICTORY CONDITIONS

+

The game ends when the stated

+

number of Months for that Scenario

+

(18.0) have been completed.

+

Listed below in descending order

+

are Levels of Victory that apply to all

+

Scenarios. Higher Levels of Victory

+

overrule lower ones.

+

Victory Points (VPs) are assigned to

+

each level for tournament purposes.

+

17.1 STRATEGIC VICTORY

+

A "sudden-death" Strategic Victory

+

is achieved by exiting the enemy map-

+

end with three or more Supplied units,

+

or by controlling (1.2) the enemy Base.

+

If either of these conditions occurs, the

+

game ends immediately. 10 VPs.

+

17.2 DECISIVE VICTORY

+

Decisive Victory is achieved by

+

having twice as many units remaining

+

in play at the end of the game as the

+

opponent. German units (not Italians

+

or Allied Elites) count as 1.5 units each.

+

5 VPs.

+

17.3 POSITIONAL VICTORY

+

Positional Victory is achieved by

+

holding Tobruk at the game’s end,

+

provided it is not besieged. 2 VPs.

+

17.4 ATTRITION VICTORY

+

Attrition Victory is achieved by

+

having the larger number of units

+

remaining in play at game’s end.

+

German units (not Italians or Allied

+

Elites) count as 1.5 units each. 1 VP.

+

OPTIONAL RULES

+

ALLIED I-TANKS

+

The Allied “Army

+

Tank” brigades (1AT

+

and 32AT) consist

+

largely of slow, heavy

+

“Infantry Tanks”.

+

If both players

+

agree to adopt this optional rule, all

+

four I-tanks in the game become elite

+

units (2 hits required to reduce them 1

+

step) but have reduced Unit Speed of

+

2, instead of 3.

+

Victory Hierarchy Example

+

A player having twice the unit count of

+

his opponent at the end of the game wins

+

a Decisive Victory even if his opponent

+

is holding Tobruk and it is not besieged

+

(which qualifies for Positional Victory).

+

Exiting Units

+

To exit a unit just move into a mapedge

+

hex and continue moving offboard.

+

You should only exit units if it leads to

+

immediate victory because exited units

+

cannot return.

+
+ +
+

18.1 1940 SCENARIO

+

+

Start: Sep. 1940 (Month 1)

+

Length: 6 months

+

+

End: Feb. 1941 (Month 6)

+

+

Time: 2 hours

+

AXIS STARTING FORCES:

+

8 Italian units. Free Deployment in

+

Libya and Sidi Omar.

+

AXIS INITIAL SUPPLY: 6 Cards

+

AXIS RESUPPLY: 2 Cards

+

AXIS REINFORCEMENTS:

+

MONTH 3:

+

MONTH 5:

+

ALLIED STARTING FORCES

+

The following 4 units are deployed

+

using Free Deployment in Egypt:

+

ALLIED INITIAL SUPPLY: 3 Cards

+

ALLIED RESUPPLY: 3 Cards

+

ALLIED REINFORCEMENTS:

+

MONTH 2:

+

MONTH 4:

+

SPECIAL SCENARIO RULES

+

1. The Axis cannot apply the

+

Rommel Bonus in this scenario.

+

2. Each player rolls only one die

+

(instead of two) for Buildup

+

Points each Month.

+

1940 Historical Commentary

+

In September 1940, Britain stood alone:

+

France had fallen, and Russia and America

+

were not yet involved. The Battle of Britain

+

was raging, and Italy had assembled a

+

large army in North Africa to invade

+

Egypt, capture the canal, and turn the

+

British out of the Mediterranean. Britain

+

could not spare forces for Egypt, and the

+

heavily outnumbered British covering

+

force harassed the invaders but fell back

+

under superior pressure. The Italian Army,

+

under Graziani, advanced to Sidi Barrani,

+

and there stopped and fortified. The

+

Italian buildup was slow, and in November

+

the British hazarded a spoiling raid to

+

disrupt the Italian buildup. Graziani's

+

army disintegrated under the shock: half

+

was captured outright and half routed

+

back to the Libyan coastal fortresses. The

+

much more mobile British isolated the

+

two fortresses of Bardia and Tobruk and

+

after a delay, stormed them and captured

+

most of the rest of Graziani's force. The

+

final remnants of the Italians attempted

+

to withdraw to Agheila, but were cut off

+

at Beda Fomm by a daring British move,

+

and annihilated. An entire Italian army

+

of over 150,000 had been wiped out by

+

a British force of 30,000 in less than 4

+

months. Though the way was clear for

+

a British advance to Tripoli, Churchill

+

instead stripped the front of forces for a

+

pet project: the disastrous expedition to

+

Greece. The stage was set for Rommel.

+

1940 Strategy Overview

+

The Italians begin with an advantage in

+

strength and supply, but greatly inferior

+

mobility. The British have an infantry

+

shortage, but gain an armor and supply

+

advantage late in the game. They must

+

put it to good use to regain lost ground,

+

besiege Tobruk, and attrition the Italian

+

Army enough to win.

+

Month of Appearance

+

Month of appearance codes on the blocks

+

do not apply to the 1940 scenario.

+

18.0 SCENARIOS

+

Once players agree on a Scenario to play, select the units listed Starting Forces

+

and Reinforcements for that Scenario. Deploy starting forces as directed and

+

arrange Reinforcements in their Month of appearance. Unless otherwise noted, all

+

units begin a Scenario at their maximum CV.

+

The Axis player always deploys first. Free Deployment units may be placed in

+

any Supplied location in the specified area and not occupied by the enemy.

+

Then deal the initial allotment of Supply Cards. Players may discard their entire

+

initial hand and redraw a new one (Axis first, then Allies). This may be done only

+

once: a redrawn hand must be played.

+

The Axis player has the first turn in all Scenarios and no Initiative Challenge is

+

allowed in the first Month.

+
+ +
+

18.2 1941 SCENARIO

+

+

Start: Apr. 1941 (Month 1)

+

Length: 10 months

+

+

End: Jan. 1942 (Month 10)

+

+

Time: 3-4 hours

+

AXIS STARTING FORCES:

+

El Agheila: all "S" units (10 total).

+

AXIS INITIAL SUPPLY: 6 Cards

+

AXIS RESUPPLY: 2 Cards/Month

+

AXIS REINFORCEMENTS:

+

Months 3, 5, 7 (12 units)

+

––––––––––––––––––––

+

ALLIED STARTING FORCES

+

Free Deployment in Libya and

+

Egypt: all "S" units (6 units).

+

Tobruk: all "T" units (6 units).

+

ALLIED INITIAL SUPPLY: 6 Cards

+

ALLIED RESUPPLY: 3 Cards/Month

+

ALLIED REINFORCEMENTS:

+

Months 2, 4, 6, 8, and 10 (24 units)

+

18.3 1941-42 CAMPAIGN

+

This Scenario combines the 1941

+

and 1942 Campaigns. Starting forces

+

and Initial Supply as well as Resupply

+

are outlined in the 1941 scenario.

+

Standard victory conditions apply.

+

+

Start: Apr. 1941 (Month 1)

+

Length: 20 months

+

+

End: Dec. 1942 (Month 20)

+

+

Time: 6-8 hours

+

After Month 10, continue playing

+

Months 11-20, making the following

+

changes beginning Month 11:

+

• Return the Month marker to "1"

+

• Both players execute a normal

+

Buildup in Month 11. Ignore 1942

+

Campaign starting deployments:

+

continue playing with the surviving

+

units "as is" until the end of 1942.

+

• Axis Resupply increases to 3

+

Cards/Month.

+

• Axis "M" (Malta Group) units

+

become available as optional Axis

+

Reinforcements (as per the 1942

+

Scenario rules).

+

18.4 CRUSADER

+

+

Start: Nov. 1941 (Month 8)

+

Length: 3 months

+

+

End: Jan. 1942 (Month 10)

+

+

Time: 1-2 hours

+

AXIS STARTING FORCES:

+

Free Deployment in Libya, Sidi

+

Omar and Sollum: 22 units total: All

+

Month 3, 5, and 7 units plus all "S"

+

units.

+

AXIS INITIAL SUPPLY: 10 Cards

+

AXIS RESUPPLY: 2 Cards/Month

+

AXIS REINFORCEMENTS: None

+

––––––––––––––––––––

+

ALLIED STARTING FORCES:

+

Free Deployment in Egypt and up

+

to 5 units in Tobruk (28 total): All

+

Month 2, 4, 6 and 8 units, plus all "S"

+

and "T" units except:

+

ALLIED INITIAL SUPPLY: 12 Cards

+

ALLIED RESUPPLY: 3 Cards/

+

Month

+

ALLIED REINFORCEMENTS

+

Month 10 (4 units)

+

SPECIAL SCENARIO RULES

+

1. Allies have the first Player Turn

+

(no challenge).

+

2. Tobruk has a Minefield.

+

1941 Historical Commentary

+

After the disastrous Italian defeat of

+

the winter of 1940-41, the Axis High

+

Command dispatched Rommel and

+

advance elements of the Afrika Korps

+

to North Africa to stiffen the faltering

+

Italians. Meanwhile the British front had

+

been stripped of forces for the ill-fated

+

expedition to Greece.

+

Rommel probed aggressively with his

+

meagre force, sensed weakness, and went

+

on the offensive (against orders) out of

+

El Agheila around the beginning of April.

+

Skillfully blending bluff, deception, and

+

bold maneuver, Rommel advanced to the

+

Egyptian frontier in less than a fortnight,

+

bypassing Tobruk. Then a hastily-prepared

+

assault on the fortress was sharply rebuffed

+

by the 12,000 Australian defenders.

+

In the following months, Rommel attacked

+

Tobruk without success, and two British

+

attacks across the frontier failed to relieve

+

the fortress. Both sides dug in and built up

+

strength, the British more rapidly as Africa

+

had become an Axis sideshow during the

+

invasion of Russia.

+

In November, when Rommel was almost

+

ready for his planned setpiece attack on

+

Tobruk, he was forestalled by "Crusader",

+

the strongest Allied offensive to date. After

+

two weeks of incredibly confused fighting,

+

both sides were exhausted, but it was

+

Rommel who was forced to withdraw due

+

to insufficient strength. He fell back all the

+

way to El Agheila, inflicting some stinging

+

blows on pursuing Allied spearheads.

+

Rommel's first offensive had narrowly

+

failed.

+

1941 Strategy Overview

+

The Axis has superior quality units, and

+

better mobility, but is short of supply,

+

and must contend with the burden of the

+

attack. The Allies start with a territorial

+

advantage and have a superior flow

+

of reinforcements and supply. Using

+

withdrawals to advantage, the Allies can

+

often accumulate a dominant supply

+

quantity.

+
+ +
+

18.5 BATTLEAXE

+

+

Start: Jul. 1941 (Month 4)

+

Length: 7 months

+

+

End: Jan. 1942 (Month 10)

+

+

Time: 2-3 hours

+

AXIS STARTING FORCES

+

Free deployment in Libya except

+

Tobruk (14 units):

+

AXIS INITIAL SUPPLY: 4 Cards

+

AXIS RESUPPLY: 2 Cards/Month

+

AXIS REINFORCEMENTS:

+

Months 5 and 7 (8 units)

+

ALLIED STARTING FORCES

+

Free Deployment in Egypt and up to

+

5 units in Tobruk (18 units).

+

ALLIED INITIAL SUPPLY: 8 Cards

+

ALLIED RESUPPLY: 3 Cards/Month

+

ALLIED REINFORCEMENTS:

+

Months 6, 8, 10 (16 units)

+

Battleaxe

+

This scenario picks up the 1941 Campaign

+

in the 4th Month with Rommel investing

+

Tobruk and holding the frontier. The

+

British have escaped major losses by giving

+

ground, and have accumulated a supply

+

advantage. [This scenario was introduced

+

in a tournament at ‘Origins 1987’.]

+
+ +
+

18.6 1942 SCENARIO

+

+

Start: Feb. 1942 (Month 11)

+

Length: 10 months

+

+

End: Dec. 1942 (Month 20)

+

+

Time: 4-5 hours

+

AXIS STARTING FORCES

+

El Agheila: 14 of the following units

+

below (Axis player’s choice).

+

Mersa Brega: 10 of the following

+

units (Axis player’s choice):

+

AXIS INITIAL SUPPLY: 5 Cards

+

AXIS RESUPPLY: 3 Cards/Month

+

AXIS REINFORCEMENTS:

+

Months 17, 19 and "M" Units

+

(8 units)

+

Malta Group: Axis "M" units are

+

optional Reinforcements. They may

+

arrive during any Buildup, but Axis

+

Resupply immediately drops to 2

+

Supply Cards per month.

+

ALLIED STARTING FORCES

+

Free Deployment in Libya and/or

+

Egypt (10 units):

+

Tobruk (10 units):

+

Alexandria (8 units):

+

ALLIED INITIAL SUPPLY: 5 Cards

+

ALLIED RESUPPLY: 3 Cards/Month

+

ALLIED REINFORCEMENTS:

+

Months 12, 14, 16, 18 and 20 (24 units)

+

1942 Historical Commentary

+

After pursuing Rommel back to El

+

Agheila, the British again diverted forces

+

to other MidEast areas. Rommel struck

+

unexpectedly and chased the British back

+

to the fortified "Gazala Line" where he

+

paused. The British were preparing a new

+

offensive but Rommel beat them to the

+

punch, swinging south around the line and

+

driving toward the coast to cut it off.

+

He was stopped short and trapped behind

+

enemy lines, but the British were slow to

+

take advantage, and he pushed a supply

+

line back through the minefields. British

+

armor finally attacked, but was defeated

+

and then routed by a counterattack.

+

Rommel once again deceived the Allies by

+

driving past Tobruk in pursuit of British

+

forces, then doubling back at night and

+

taking the fortress. Resupplied with the

+

vast amount of stores in Tobruk, Rommel

+

advanced into Egypt.

+

After outmaneuvering a British stand at

+

Mersa Matruh, Rommel came up to the

+

partially-prepared Alamein Line, the last

+

(and best) defensive position before Suez.

+

He attacked, but Allied C-in-C (Near East)

+

Auckenleck took direct command and

+

skillfully parried his thrusts.

+

After weeks of inconclusive skirmishing,

+

both sides dug in and built up. Seeing that

+

the Allied buildup was outpacing his own,

+

Rommel attempted to break through at

+

Alam Halfa in late August, but was foiled

+

by minefields and short supply.

+

Montgomery completed the massive

+

British buildup before attacking. In late

+

October he opened a relentless battle of

+

attrition against a heavily outnumbered

+

opponent. Rommel returned from sick-

+

leave in time to order a withdrawal, but

+

was countermanded by Hitler.

+

The British broke through, the Italian

+

forces disintegrated, and the Afrika Korps

+

was shattered. Rommel skillfully extricated

+

the remnants of his mobile forces and

+

escaped but meanwhile the Allies landed

+

in Morocco and Algeria. The Axis was

+

finished in North Africa.

+

1942 Strategy Overview

+

The Axis has better supply but its strength

+

position deteriorates seriously in time.

+

Again, the burden of the attack is costly in

+

supply. The desirability of rebuilding the

+

depleted Axis force is counter-balanced by

+

the time factor, Allied rebuilding, and the

+

appearance of minefields.

+
+ +
+

18.7 GAZALA

+

+

Start: May 1942 (Month 14)

+

Length: 2 months

+

+

End: Jun. 1942 (Month 15)

+

+

Time: 1-2 hours

+

AXIS STARTING FORCES:

+

Free deployment on or west of

+

the line: Gazala- Segnali Rotunda-

+

Tengeder- Trigh el Abd- trail

+

southwest to Agedabia (24 units):

+

AXIS INITIAL SUPPLY: 10 Cards

+

AXIS RESUPPLY: 3 Cards/Month

+

AXIS REINFORCEMENTS: None

+

––––––––––––––––––––

+

ALLIED STARTING FORCES:

+

Free deployment on or east of

+

the line: Acroma- Sidi Mufta- Bir

+

Hacheim- Retma- Bir Guba- the trail

+

to Jarabub Oasis (20 units):

+

Alexandria (16 units):

+

ALLIED INITIAL SUPPLY: 12 Cards

+

ALLIED RESUPPLY: 3 Cards/Month

+

ALLIED REINFORCEMENTS: None

+

SPECIAL GAZALA RULE

+

Before initial deployments, players do a

+

special PreGame Buildup, the Allied player

+

going first. Each player receives 30 BPs (no

+

dice are rolled). These BPs may be spent

+

on Replacements, Redeployments, extra

+

Supply Cards or Minefields as usual.

+

Other Buildups in the game proceed

+

normally.

+

Gazala

+

This scenario begins with the stage set

+

for perhaps Rommel’s most remarkable

+

comeback victory of the campaign. His

+

second push towards Tobruk has met a

+

strong Allied perimeter based on minefield

+

boxes, quickly thrown together by the

+

British by transplanting mines from the old

+

Italian Tobruk defenses.

+

Though the Allies were preparing a

+

counteroffensive, Rommel struck first

+

with the trusty ‘right hook’ plan. The

+

Afrika Korps outflanked Bir Hacheim and

+

defeated British mobile forces at Retma,

+

but the minefield boxes of the Gazala Line

+

and especially Koenig’s stolid Free French

+

at Bir Hacheim held firm. Rommel was

+

trapped behind British lines with no supply.

+

After British bumbling saved him from

+

utter defeat, Rommel turned the tables,

+

routed the British, and took Tobruk. The

+

British missed a great opportunity here.

+
+ +
+

18.8 PURSUIT TO ALAMEIN

+

+

Start: Jun. 1942 (Month 15)

+

Length: 6 months

+

+

End: Nov. 1942 (Month 20)

+

+

Time: 2-3 hours

+

AXIS STARTING FORCES

+

Free deployment in Libya (22 units):

+

AXIS INITIAL SUPPLY: 8 Cards

+

AXIS RESUPPLY: 3 Cards/Month

+

AXIS REINFORCEMENTS:

+

17, 19 and "M" unit (8 units)

+

Malta Group: Axis "M" units are

+

optional Reinforcements. They may be

+

added during any Buildup, but Axis

+

Resupply immediately drops to 2 cards

+

per month beginning that Buildup.

+

ALLIED STARTING FORCES

+

Free deployment in Egypt (16 units):

+

Alexandria (12 units):

+

ALLIED INITIAL SUPPLY: 8 Cards

+

ALLIED RESUPPLY: 3 Cards/Month

+

ALLIED REINFORCEMENTS:

+

16, 18 and 20 (16 units)

+

Pursuit to Alamein

+

Beginning one month after Gazala,

+

Rommel has decimated the British army

+

and captured Tobruk with its immense

+

supplies. In the process the Afrika Korps

+

has also taken heavy losses from which it

+

will never completely recover.

+

Rommel has convinced Axis High

+

Command to abandon the assault on Malta

+

and instead devote airpower and supplies

+

to supporting a lightning pursuit into

+

Egypt. His forces were to prove slightly

+

inadequate to the task but it was “a close

+

run thing.” Failure to clear Malta meant

+

increasing Axis supply problems while the

+

British could rebuild rapidly so near their

+

base and hold at El Alamein.

+
+ +
+

19.0 DEMO: 1940

+

DEPLOYMENT

+

The Axis player has initially

+

deployed one unit in Bardia, four units

+

in Ft. Capuzzo and three units in Sidi

+

Omar. The Allies have one unit in

+

Sollum, two units in Buq Buq and one

+

unit in Sofafi. Note that units on the

+

movement diagrams are shown with

+

their current CV on the top. The Battle

+

Array diagram shows units facing each

+

other in battle array. The Axis have six

+

Supply Cards, the Allies three.

+

GAME MONTH 1:

+

FIRST AXIS PLAYER-TURN

+

Since this is the first month of

+

the game, the Buildup Sequence is

+

skipped. The Axis spends one Supply

+

Card (a Basic Turn) and makes on

+

regrouping move into Sollum (the

+

Command Point, marked "C", is at Ft.

+

Capuzzo). A maximum of three Axis

+

units can move into Sollum: they are

+

entering an Enemy Hex via the three

+

gaps through the ridge. No other Axis

+

units can move, as no additional units

+

can enter Sollum, the destination hex

+

for the regroup move.

+

The Allied player now has

+

the option to Refuse Battle and

+

immediately Retreats his Attacked

+

group (only one unit in this case) using

+

a Withdrawal Move. The Allied player

+

chooses to Withdraw to Sidi Barrani.

+

The move is a legal Withdrawal Move

+

because 1) the unit moved back

+

towards its Base along a valid Supply

+

Line (the coast highway) and 2) a

+

forward hex was abandoned, reducing

+

the Supply Network. Neither group has

+

been revealed to the opposing player.

+

The Retreated unit is Disrupted

+

(for Disengaging) and must take

+

pursuit fire. The Allied player informs

+

the Axis player that the unit (the

+

slowest in the Retreating group) is a

+

mechanized unit. Since the Axis player

+

has no mechanized or faster units

+

involved, there is no pursuit fire. The

+

Disrupted unit is placed face down

+

("D" in the diagram). There are no

+

Battles, so the Axis Player-Turn ends.

+

GAME MONTH 1:

+

FIRST ALLIED PLAYER-TURN

+

The Allied player passes his turn,

+

not wishing to spend any Supply. The

+

Disrupted unit at Sidi Barrani does not

+

yet recover (it must spend a full enemy

+

turn Disrupted).

+

GAME MONTH 1:

+

SECOND AXIS PLAYER-TURN

+

The Axis plays one Supply Card

+

(Basic Turn) and moves the group out

+

of Ft. Capuzzo. Two units Attack Buq

+

Buq (the maximum allowed through a

+

single Hexside) and the third unit joins

+

the Sidi Omar group.

+

The Allied player decides to

+

fight this time and has the first fire

+

(Defensive Fire). The armored unit gets

+

two hits with Double Fire (DF) but the

+

mechanized infantry (SF) misses.

+

The Axis player reduces one of his

+

infantry units by 2 CV (alternatively,

+

both units could have been reduced by

+

1 CV each).

+

The Axis player fires both infantry

+

units (4 CV and 2 CV) at single fire

+

(SF), scoring one hit. The Allied player

+

reduces the mechanized infantry unit

+

by 1 CV. The Combat Phase ends.

+

BATTLE ARRAY

+
+ +
+

GAME MONTH 1:

+

SECOND ALLIED PLAYER-TURN

+

The Disrupted unit at Sidi Barrani

+

recovers. The Allied player chooses to

+

Pass to save Supply. One Withdrawal

+

move is permitted on a Pass Turn so

+

the Allied player makes a Regroup

+

Move to the hex east of Sidi Barrani.

+

The Command Point is at Buq Buq

+

(the ridge does not interfere with

+

the Command point). This is a legal

+

Withdrawal Move, since all units

+

involved moved along Supply Lines

+

toward their Base and the Supply

+

Network was reduced.

+

The units from Buq Buq Retreated

+

from a battle, so they are Disrupted.

+

Since they are faster than the pursuing

+

units, no pursuit fire takes place.

+

GAME MONTH 1:

+

THIRD AXIS PLAYER-TURN

+

The Axis player plays two Supply

+

Cards for an Offensive Turn allowing

+

two Group Moves: 1) two units out of

+

Sollum Attack Sidi Barrani while the

+

third moves to Sidi Omar for Supply

+

chain duty and 2) three units move

+

out of Sidi Omar; two units to Sofafi

+

(the non-motorized unit force marched

+

successfully) while the other moves

+

to Bir Habata for Supply chain duty

+

(chaining Sofafi to Sidi Omar).

+

The Allied player Withdraws the

+

mechanized unit to Mersa Matruh.

+

Again it takes no pursuit fire, but is

+

Disrupted.

+

GAME MONTH 1:

+

THIRD ALLIED PLAYER-TURN

+

The two Disrupted units west of

+

Mersa Matruh recover. The Allied

+

player passes his turn, not wishing to

+

improve his position.

+

GAME MONTH 1:

+

FOURTH AXIS PLAYER-TURN

+

Having spent four Supply Cards

+

the Axis player also passes his turn,

+

wishing to save the two remaining

+

Supply Cards for future moves.

+

Since both players have passed in

+

consecutive turns, the Month ends.

+
+ +
+

MONTH 2: BUILDUP

+

The month record marker is

+

advanced to "2". The Disrupted Allied

+

unit in Mersa Matruh is Supplied,

+

so it recovers automatically. Both

+

players roll one die (two dice in other

+

scenarios). The Allied player rolls a "4"

+

and the Axis player rolls a "5"; thus,

+

both players receive 9 Build Points

+

(BPs). The Allied player rolled the

+

lower number, so he spends his BPs

+

first.

+

The Allied player receives two

+

Reinforcement units at his Base and

+

spends 2 BPs to Redeploy them to

+

the front. He also Redeploys the

+

damaged infantry unit back to his Base

+

(1 BP), rebuilds it 1 step (2 BPs) and

+

Redeploys it again to Mersa Matruh

+

(1 BP). The Allied player saves the

+

remaining 3 BPs.

+

The Axis player Redeploys his

+

damaged infantry unit at Buq Buq to

+

Bardia (1 BP), moves it by sea to his

+

Base (1 BP), rebuilds it 2 steps (2 BPs)

+

and moves it by sea Redeployment

+

to Tobruk (1 BP). Sea Redeployment

+

back to Bardia was not possible

+

because its Axis Port Capacity (1)

+

was used when the unit was shipped

+

back to Base. From Tobruk the unit is

+

Redeployed to Sofafi (2 BPs). The Axis

+

player saves his last two BPs.

+

Note that all Redeployments were

+

along Supply Lines only.

+

After making sure that all

+

expended Supply Cards have been

+

returned to the deck (players can

+

also turn in unwanted dummy Supply

+

Cards) the deck is shuffled. The Axis

+

player then draws two cards, and the

+

Allied player draws three cards.

+

The Allied player wishes to

+

challenge for the first Player-Turn and

+

places one Supply Card face down.

+

The Axis player declines the challenge

+

and the Allied card is turned face up.

+

It turns out to be a dummy card, so

+

the Axis player goes first anyway. The

+

Axis would have spent a Supply Card

+

for nothing if he had tried to stop the

+

Allied player from taking the initiative.

+

Buildup for Month 2 is complete,

+

the Axis player takes the first Player

+

Turn.

+
+ +
+

20.0 STRATEGY NOTES

+

SUPPLY LINES

+

Protection of supply lines must

+

be a primary consideration. To allow

+

the enemy freedom of movement in

+

your rear is to invite disaster; units cut

+

off from supply are likely to become

+

disrupted and quickly overrun.

+

Accordingly, defensive fronts must

+

be wide enough to prevent outflanking

+

moves and strong or deep enough to

+

withstand a frontal attack.

+

This implies some dispersion of

+

forces, which is contrary to movement

+

and attack efficiency. Players must

+

constantly strive for an optimum

+

balance between these conflicting

+

demands.

+

RESERVES

+

Because disengaging units are

+

disrupted, it is imperative to maintain

+

a reserve of unengaged units.

+

Units in battles are effectively

+

pinned; they cannot intervene

+

elsewhere without a costly and time-

+

consuming retreat and reorganization.

+

When all units are engaged, flexibility

+

is lost; there is no way to counter an

+

outflanking move or breakthrough, no

+

way to exploit an opportunity, and no

+

way to retreat safely.

+

Since battlefield results can be

+

sensitive to small strength differentials,

+

it is often tempting to commit all

+

available forces. However, losing

+

such a battle often means losing the

+

campaign. Without reserve units to

+

cover a retreat, few units will survive

+

the ensuing rout.

+

BATTLES

+

In Rommel in the Desert, it is

+

common for several battles to be

+

fought simultaneously. Usually when

+

an army loses any one such battle, its

+

entire position is compromised.

+

Therefore, an effective tactic is to

+

concentrate on winning just one battle,

+

while "holding the line" in the others.

+

This tactic usually requires a major

+

effort in one battle plus an attempt to

+

attack and pin other enemy groups

+

with smaller forces.

+

The object is to engage and

+

pin possible enemy reinforcements

+

and generally limit your opponent’s

+

freedom of movement. Even when

+

these pinning engagements are fought

+

at a disadvantage, the neutralization

+

of important enemy forces and the

+

constriction of enemy access to

+

battles can be a decisive factor.

+

Because of the unit-count victory

+

conditions, and the possibility of

+

rebuilding, players should strive to

+

preserve units from elimination: where

+

possible, retire from unfavorable

+

situations early.

+

MOBILE DEFENSE

+

Because of the highly mobile

+

environment and the predominance of

+

offense, counterattack and the threat

+

of it are often more effective that a

+

passive defense.

+

There is little in the way of

+

defensive terrain on the board, and

+

very few positions when an inferior

+

force can make a stand against a well-

+

supplied opponent. The only truly

+

effective defensive positions are the

+

bottlenecks at El Agheila and Qattara,

+

and those based on minefields.

+

Minefields are expensive; the

+

timing and location of minefield

+

construction is a crucial aspect of the

+

defensive game, and the one most

+

requiring foresight.

+

As time and supply are major

+

factors, the player on the strategic

+

defensive must strive to delay enemy

+

advances and extract maximum

+

enemy supply expenditure. Headlong

+

retreats can be easily and efficiently

+

followed up the other player. By

+

maintaining a formidable posture, you

+

can force your opponent to approach

+

cautiously, and well-timed withdrawals

+

can leave the enemy striking at air.

+

However, this mobile defensive

+

strategy is easier to describe than to

+

execute; it requires care in planning. In

+

particular, careful consideration should

+

be given to the preparation of viable

+

"fallback" lines that can be manned

+

with maximum movement efficiency.

+

STATIC DEFENSE

+

When standing on the defense,

+

several philosophies are viable. The

+

best choice depends on considerations

+

of geography, strength, supply balance,

+

and time. Three basic defensive

+

alignments are described below:

+

Linear Defense (a strong front

+

line) is good with regard to attrition,

+

but invites outflanking, which is

+

always possible except at the board-

+

end bottlenecks. This defensive

+

style implies a weak reserve and

+

is inflexible and brittle, with little

+

offensive threat. However, this type of

+

defense becomes more attractive with

+

good strength and defensive position.

+

Defense-In-Depth provides

+

good security against possible Blitzes.

+

However, the resulting dispersion

+

of force has obvious movement and

+

combat disadvantages. This defense is

+

effective in extracting enemy supply

+

expenditure, but is very costly in

+

friendly unit attrition compared to

+

enemy losses.

+

A Strong Central Reserve

+

provides maximum flexibility

+

and offensive threat, at the cost

+

of a weakened forward wall,

+

exposing frontline units to (initially)

+

disadvantageous engagements. The

+

ability to either counterattack strongly

+

or retreat in good order from this

+

alignment is a major advantage.

+

However, the forward line should

+

not be weakened to the point where

+

a successful Blitz could penetrate,

+

allowing engagement of the reserve,

+

which would negate all the advantages

+

of this deployment.

+

OFFENSE

+

In general, the player on the

+

offensive should seek to apply and

+

increase pressure on the opponent

+

through rapid and unexpected

+

maneuvers, multiple threats, high-

+

powered turn options, and pinning

+

engagements. The goal should be to

+

cause the opponent more problems

+

than he can solve in one turn.

+
+ +
+

Maintaining this pressure will

+

force your opponent to react to

+

pressing short-term threats with

+

increasingly inefficient responses,

+

unable to pursue his own objectives

+

or prepare for your next move.

+

Concentration of force is

+

highly desirable for striking power,

+

moderated of course by defensive

+

and supply needs. When planning

+

moves, the future implications of

+

dispersion should be considered. It

+

is advisable (but not always possible)

+

to maintain some concentration of

+

force for immediate use. Apart from

+

the obvious movement and combat

+

advantages of concentration, it takes

+

time to regroup a dispersed army,

+

and in the meantime, pressure on

+

your opponent is relaxed.

+

21.0 DESIGN NOTES

+

Rommel in the Desert includes

+

the all-important psychological

+

factors of strategy, so crucial in the

+

historical campaign and so often

+

overlooked in most wargames.

+

Factors like surprise and deception,

+

bluff and nerve are not merely good

+

gaming features, but ultimately

+

necessary to explain what

+

happened in the Western Desert.

+

This game also reflects

+

command problems more

+

realistically by forcing the necessity

+

for compromise under organizational

+

and time constraints.

+

THE UNITS

+

It should be understood that the

+

CV assigned to units in the game

+

is meant to represent just that,

+

their Combat Value. Numbers of

+

men, and quality and quantities of

+

equipment do not begin to tell the

+

whole story about the effectiveness

+

of a military formation in battle.

+

Such factors as leadership, training

+

and morale have as much or more

+

impact on "combat value" than mere

+

numbers.

+

While some military units

+

have continued to function after

+

sustaining over 80% casualties,

+

others have surrendered or

+

disintegrated before suffering

+

10% losses. Such units must be

+

considered to have been reduced to

+

ZERO combat value, even though

+

their manpower and equipment may

+

be virtually intact.

+

Even a cohesive formation of

+

tough and determined soldiers may

+

have limited combat value due

+

to poor communications, faulty

+

doctrine, inadequate weaponry,

+

insufficient mobility, or bad

+

leadership.

+

Certain 'technological' armor

+

and anti-tank units have been

+

included in the game to reflect

+

the sudden leaps in effectiveness

+

achieved by existing forces with the

+

introduction of new and superior

+

weaponry.

+

The Allied Order of Battle has

+

been modified to eliminate the

+

historical "comings and goings"

+

of units in the game. The correct

+

number and type of brigades

+

is preserved, but the historical

+

designations (which are for interest

+

only) of units in play may at times

+

be incorrect, with one historical

+

unit substituting for another.

+

This eliminates the unproductive

+

shuffling of units in and out of the

+

game.

+

For example, in many cases a

+

historical unit left the campaign at

+

a certain point and was replaced

+

by a similar unit. In this game

+

the original unit remains in play,

+

representing the unit that replaced

+

it in the Allied OB. Note that units

+

arrive in the game on the basis of

+

their historical appearance at the

+

front, as the Allies tended to keep

+

new units in rear areas for months

+

of training and acclimatization.

+

See the table in the next column

+

for details.

+

Unit Substitution

+

Game Unit

+

Period

+

Historical Unit

+

4 Ind/5

+

Mar-Jun ‘40

+

6 Aus/15

+

4 Ind/11

+

Mar-Jun ‘40

+

6 Aus/17

+

4 Ind/7 Mot

+

Mar-Jun ‘40

+

6 Aus/19

+

4 Ind/7 Mot

+

Feb ‘42-

+

5 Ind/10

+

4 Ind/3 Mot

+

Apr ‘42-

+

10 Ind/25*

+

4 Ind/5

+

May ‘41-

+

1 SA/5*

+

70/23

+

Jan-Jun ‘41

+

9 Aus /24

+

70/23

+

Dec ‘41-

+

50/150

+

70/14+16

+

Jan-Jul ‘41

+

9 Aus /26

+

70/14+16

+

Dec ‘41-

+

50/151*

+

7 Aus/18

+

Jun ‘41-

+

2 SA/6*

+

9 Aus/20

+

Jul-Dec ‘41

+

70/16 *

+

9 Aus /20

+

Jan ‘42-

+

50/69

+

Pol

+

Oct ‘41-Jan ‘42

+

1 FF

+

Pol

+

Jan ‘42-

+

(2 FF)

+

7/7 Tk

+

Nov ‘41-

+

(CRUS)

+

2 NZ/4

+

Dec ‘41-Jan ‘42

+

161 Ind Mot

+

2 NZ/5

+

Dec ‘41-Jan’42

+

5 Ind/9

+

2 NZ/6

+

Dec ‘41-Jan’42

+

5 Ind/10*

+

22 Gd

+

Jun ‘42-

+

44/133*

+

* Co-identified units

+

( ) Units not identified in game

+
+ +
+

MOVEMENT

+

Group movement is a simple

+

and effective mechanism to reward

+

foresight and planning in the

+

concentration and organization

+

of forces. Commanders could not

+

ALWAYS execute perfect maneuvers

+

involving far-flung forces. To say that

+

the movement limitations imposed by

+

the system are unrealistic in the era of

+

modern communications is to miss the

+

point. The opponent’s communications

+

are just as fast; he can react before a

+

commander can move all his forces

+

and that is precisely the effect of the

+

group movement system.

+

By limiting the amount that can

+

be done at one time, group movement

+

also emphasizes the "use of time" (or

+

tempo), the idea being to cause the

+

opponent problems which will occupy

+

his time while you are causing further

+

problems. Rommel's natural instinct

+

for this technique was most effective

+

in an environment like the desert,

+

where events develop quickly, and

+

was a key element of his success. The

+

ability to shift gears with high-powered

+

but expensive multiple-move turn

+

options allows further opportunities to

+

upset enemy expectations.

+

COMBAT

+

The combat system in the game

+

is also unique. Unlike most combat

+

systems, it favors the defender only

+

slightly, as did desert warfare. The

+

desert provided little in the way of

+

physical or visual cover, mobility was

+

basically unrestricted, unit density

+

was very low, and the inland flank

+

was always hanging. North Africa was

+

in fact the perfect environment for a

+

counterattacking "mobile defense";

+

fixed infantry defenses were basically

+

useless unless extensively fortified.

+

Realistic combined arms effects

+

are integral to the combat system. The

+

mathematics of combat may seem

+

simple but in fact they produce two

+

sophisticated effects: a skewed bell

+

curve for expected attrition; and the

+

"acceleration effect" of fire superiority,

+

where firepower differentials tend to

+

widen in time.

+

The combat system yields a wide

+

variety of results, in which no level of

+

superiority can guarantee success. In

+

battle, things rarely go as expected.

+

Real commanders cannot assume that

+

what should happen will, or that what

+

shouldn't happen won't. They don't

+

have the security of knowing the true

+

"combat value" of their troops, or of

+

consulting a "combat results table".

+

In Rommel in the Desert players are

+

subject to the same lack of certainty.

+

BATTLES

+

Extended engagements require

+

players to manage battles, rather

+

than simply initiating them and then

+

accepting a given result on a single die

+

roll. As battles develop, the questions

+

of when to retreat, when to hold, and

+

when and where to commit reserves

+

fall upon the commander.

+

The retreat rules are designed to

+

reflect the difficulties of extricating

+

engaged forces in a mobile

+

environment and to emphasize the

+

importance of reserves. A player

+

without unpinned reserves in this

+

game is militarily bankrupt, powerless

+

to react to the moves of his opponent.

+

SUPPLY

+

Supply lines in the game are

+

critical. Players who ignore this will

+

find themselves with an army of

+

disrupted units that will melt before an

+

enemy advance.

+

The chaining of units along tracks

+

and trails reflects the problems of

+

lengthy supply lines through difficult

+

terrain and the need for more and

+

more support units at the expense of

+

combat units.

+

The supply cards represent not

+

only supplies, but also control time

+

and the turn options. The variable

+

length of months and the choices

+

of turn options reflect the "stop-go"

+

nature of the campaign and allow

+

directed supply effort. The Basic Turn

+

is the most efficient use of supply

+

(there are diminishing returns on

+

higher options) but well-executed use

+

of the high-powered options will upset

+

your opponent's best laid plans.

+

A small but well-supplied army

+

is more than a match for a stronger

+

but poorly-supplied one. The secrecy

+

of supply levels provides magnificent

+

opportunities for deception and nerve.

+

Bluff can sometimes carry the battle

+

on shoestring supply, especially against

+

a rattled or demoralized opponent, but

+

the threat must be credible.

+

VICTORY CONDITIONS

+

The victory conditions involve

+

both attrition and position. Their

+

relative values are rated by VPs.

+

Awarding a decisive victory

+

for having a 2:1 advantage in units

+

remaining at the games' end is a

+

recognition of the inevitability of a

+

strategic win with this superiority of

+

strength, given more time and supply.

+

The lesser victory conditions center

+

around Tobruk. Although this fortress

+

had some military value, the essential

+

benefit in holding Tobruk was its

+

status as the best defensible port in a

+

region where everything from fuel to

+

food to ammunition, and even water

+

had to be imported. For this reason

+

the victory conditions recognize no

+

value for possession of Tobruk if the

+

port is besieged and hence not fully

+

active.

+
+ +
+

INDEX

+
+ +

Active Battles8.6

+

Active Player3.4

+

Applying Losses9.5

+

Assault Turn4.3

+

Attacker8.3

+

Attacks8.2

+

Attrition Victory17.4

+

Base1.6

+

Basic Turn4.1

+

Battle8.0

+

Battle Array8.5

+

Battle Hexsides8.1

+

Besieged13.5

+

Blitz Turn4.4

+

BPs / Buildup Points16.3

+

Buildup16.0

+

Buildup Supply Check12.7

+

Combat9.0

+

Combat Rounds9.1

+

Command Point5.2

+

CV / Combat Value2.3

+

Decisive Victory17.2

+

Defender8.3

+

Design Notes21.0

+

Disengagement7.2

+

Disruption11.0

+

Disruption Recovery11.2

+

Double Defense9.52

+

Double Dice9.21

+

Double Fire9.4

+

Elite Unit2.4

+

Final Supply Check12.7

+

Firing Units9.2

+

Firepower9.4

+

Forced Marches6.4

+

Fortresses13.0

+

Fortress Capture13.4

+

Fortress Supply13.3

+

Full Retreats10.3

+

Groups5.0

+

Group Move5.1

+

Hex Control1.2

+

Hexside Limits7.1

+

Highway Supply12.3

+

Initial Supply Check12.7

+

Initiative3.3

+

Minefields14.0

+

Month3.1

+

Movement5.0

+

Nationality2.1

+

Oasis15.0

+

Oasis Supply15.1

+

Offensive Turn4.2

+

Overrun11.4

+

Passive Player3.4

+

Partial Retreats10.4

+

Pass Turn4.5

+

Player Turns3.4

+

Port Capacity13.3

+

Positional Victory17.3

+

Probe Combat10.41

+

Pursuit Fire10.5

+

Raider12.5

+

Rearguard10.4

+

Redeployment16.51

+

Refusing Battle8.4, 10.2

+

Regroup Move5.2

+

Reinforcements16.4

+

Replacements16.54

+

Resupply16.6

+

Retreats10.0

+

Retreat Routes10.1

+

Return for Refit16.52

+

Roads1.5

+

Road Bonuses6.2

+

Rommel Bonus6.3

+

Rout11.3

+

Sea Redeployment16.53

+

Sequence of Play3.0

+

Shielding Units11.11

+

Speed6.1

+

Stacking1.3

+

Step2.3

+

Strategic Victory17.1

+

Strategy Notes20.0

+

Supply12.0

+

Supply Checks12.7

+

Supply Chains12.4

+

Supply into Battles12.5

+

Supply Lines12.2

+

Supply Network12.6

+

Supply Source12.0

+

Targeting9.3

+

Terrain1.4

+

Turn Option4.0

+

Unit Type and Class2.2

+

Unsupplied Units12.1

+

Victory Conditions17.0

+

Withdrawal Moves5.3

+ +
+
+ + + diff --git a/info/rules1.jpg b/info/rules1.jpg new file mode 100644 index 0000000..1131a4c Binary files /dev/null and b/info/rules1.jpg differ diff --git a/info/rules10.jpg b/info/rules10.jpg new file mode 100644 index 0000000..a26f173 Binary files /dev/null and b/info/rules10.jpg differ diff --git a/info/rules11.jpg b/info/rules11.jpg new file mode 100644 index 0000000..0d8c252 Binary files /dev/null and b/info/rules11.jpg differ diff --git a/info/rules12.jpg b/info/rules12.jpg new file mode 100644 index 0000000..4ea0346 Binary files /dev/null and b/info/rules12.jpg differ diff --git a/info/rules13.jpg b/info/rules13.jpg new file mode 100644 index 0000000..fb0f273 Binary files /dev/null and b/info/rules13.jpg differ diff --git a/info/rules14.jpg b/info/rules14.jpg new file mode 100644 index 0000000..0f45333 Binary files /dev/null and b/info/rules14.jpg differ diff --git a/info/rules15.jpg b/info/rules15.jpg new file mode 100644 index 0000000..a826d32 Binary files /dev/null and b/info/rules15.jpg differ diff --git a/info/rules16.jpg b/info/rules16.jpg new file mode 100644 index 0000000..773aeb3 Binary files /dev/null and b/info/rules16.jpg differ diff --git a/info/rules17.jpg b/info/rules17.jpg new file mode 100644 index 0000000..0d52211 Binary files /dev/null and b/info/rules17.jpg differ diff --git a/info/rules18.jpg b/info/rules18.jpg new file mode 100644 index 0000000..5dcfbb3 Binary files /dev/null and b/info/rules18.jpg differ diff --git a/info/rules19.jpg b/info/rules19.jpg new file mode 100644 index 0000000..b11c0e4 Binary files /dev/null and b/info/rules19.jpg differ diff --git a/info/rules2.jpg b/info/rules2.jpg new file mode 100644 index 0000000..895a99f Binary files /dev/null and b/info/rules2.jpg differ diff --git a/info/rules20.jpg b/info/rules20.jpg new file mode 100644 index 0000000..6d9db57 Binary files /dev/null and b/info/rules20.jpg differ diff --git a/info/rules21.jpg b/info/rules21.jpg new file mode 100644 index 0000000..82fbfb4 Binary files /dev/null and b/info/rules21.jpg differ diff --git a/info/rules22.jpg b/info/rules22.jpg new file mode 100644 index 0000000..6bb0d7e Binary files /dev/null and b/info/rules22.jpg differ diff --git a/info/rules23.jpg b/info/rules23.jpg new file mode 100644 index 0000000..cd509d3 Binary files /dev/null and b/info/rules23.jpg differ diff --git a/info/rules24.jpg b/info/rules24.jpg new file mode 100644 index 0000000..c1add1c Binary files /dev/null and b/info/rules24.jpg differ diff --git a/info/rules25.jpg b/info/rules25.jpg new file mode 100644 index 0000000..ea93e77 Binary files /dev/null and b/info/rules25.jpg differ diff --git a/info/rules26.jpg b/info/rules26.jpg new file mode 100644 index 0000000..8dbe14e Binary files /dev/null and b/info/rules26.jpg differ diff --git a/info/rules27.jpg b/info/rules27.jpg new file mode 100644 index 0000000..fd6496d Binary files /dev/null and b/info/rules27.jpg differ diff --git a/info/rules28.jpg b/info/rules28.jpg new file mode 100644 index 0000000..e83f99d Binary files /dev/null and b/info/rules28.jpg differ diff --git a/info/rules29.jpg b/info/rules29.jpg new file mode 100644 index 0000000..bead8cd Binary files /dev/null and b/info/rules29.jpg differ diff --git a/info/rules3.jpg b/info/rules3.jpg new file mode 100644 index 0000000..6f7c6b8 Binary files /dev/null and b/info/rules3.jpg differ diff --git a/info/rules30.jpg b/info/rules30.jpg new file mode 100644 index 0000000..abd3141 Binary files /dev/null and b/info/rules30.jpg differ diff --git a/info/rules31.jpg b/info/rules31.jpg new file mode 100644 index 0000000..8b04d50 Binary files /dev/null and b/info/rules31.jpg differ diff --git a/info/rules32.jpg b/info/rules32.jpg new file mode 100644 index 0000000..2ca1bd8 Binary files /dev/null and b/info/rules32.jpg differ diff --git a/info/rules33.jpg b/info/rules33.jpg new file mode 100644 index 0000000..1b06c9c Binary files /dev/null and b/info/rules33.jpg differ diff --git a/info/rules34.jpg b/info/rules34.jpg new file mode 100644 index 0000000..705734f Binary files /dev/null and b/info/rules34.jpg differ diff --git a/info/rules4.jpg b/info/rules4.jpg new file mode 100644 index 0000000..2a17881 Binary files /dev/null and b/info/rules4.jpg differ diff --git a/info/rules5.jpg b/info/rules5.jpg new file mode 100644 index 0000000..0cefc4d Binary files /dev/null and b/info/rules5.jpg differ diff --git a/info/rules6.jpg b/info/rules6.jpg new file mode 100644 index 0000000..ac88cf9 Binary files /dev/null and b/info/rules6.jpg differ diff --git a/info/rules7.jpg b/info/rules7.jpg new file mode 100644 index 0000000..9e32394 Binary files /dev/null and b/info/rules7.jpg differ diff --git a/info/rules8.jpg b/info/rules8.jpg new file mode 100644 index 0000000..92ff758 Binary files /dev/null and b/info/rules8.jpg differ diff --git a/info/rules9.jpg b/info/rules9.jpg new file mode 100644 index 0000000..aad699b Binary files /dev/null and b/info/rules9.jpg differ diff --git a/info/units.html b/info/units.html new file mode 100644 index 0000000..26ec186 --- /dev/null +++ b/info/units.html @@ -0,0 +1,244 @@ + + + + + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/play.html b/play.html new file mode 100644 index 0000000..77f76ab --- /dev/null +++ b/play.html @@ -0,0 +1,854 @@ + + + + + + +ROMMEL + + + + + + + + + + +
+
+ +
+
+
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rommel in the Desert +Copyright © 2022 Columbia Games Inc. + + + +2 +5 +2 + + + + + +LIBYA +EGYPT +Cyrenaica +Western Desert + + + +Jebel el Akhdar + + + +Qattara Depression + + + +Gulf +of +Sirte +Gulf of Bomba +Gulf of Sollum +Mediterranean Sea + + + +Benghazi +Alexandria +Ghemines +Derna +El Agheila +Bardia +Tobruk +Sollum + + + + + + + + + +SABKHA +EL SEGIRA +SABKHA +EL JENEINEN +SABKHA +AL AKHARIYAH + +Gazala + +Jalo Oasis +Jarabub Oasis +Siwa Oasis + +Bir Habata +Bir Khamsa +Bir Sheferzen +Ft. Maddalena +Ft. Capuzzo +Bir Hacheim +Tmimi +Acroma +El Himeimat + +El Alamein +Gabr Saleh +Ben Gania +Bir el Qatrani +Skeleidima +Sahaba +Jebel el +Matar +Mersa +Matruh +Marawa + + +Solluch +Pass +Halfaya +Pass + +Martuba +Maaten Giofer +El Abiar +Saunnu +Retma +Belhamed +Bir Fuad +Bir el Kenayis +Bir Khalda +El Hamam +Haraga +Rotonda +Segnali +Sidi +Mufta +Bir Harmat +El Adem +Bir Gubi +Sidi Rezegh +Gambut +Omar +Sidi +Mersa Brega +Buq Buq +Sofafi +Beda +Fomm +Fuka +El Daba +Alam Halfa +El Haseiat +Er Regima +Tocra +Antelat +Msus +Charruba +El Garib +Wadi +Cuff +El Gubba +Mechili +Tengeder +Sidi Barrani +Agedabia +Barce +Cyrene + + + + + + + + + + + +
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
+
+ +
+ + +
ROAD BONUS +
Highway+4 +
Track+2 +
Trail+1 +
+ + +
UNIT SPEED +
+ +4 +
+ + + + +3 +
+ + +2 +
+ + + +1 +
+ + +
HEXSIDE LIMIT +
Mountain
Ridge
Marsh
0 +
Pass1 +
Clear2 +
+ + +
TURN OPTIONS +
BasicMC +
◐◐OffensiveMMC +
◐◐AssaultMC* +
◐◐◐BlitzMC+MC +
No CostPassW +
+ + +
TARGET UNIT +
+ + + + +
FIRING UNIT + (SF)DFSF[TF] +
SF(SF)SF[TF] +
DFSFSF[TF] +
SF*DF*DF*SF* + +
+ + +
BP COSTS PER CV +
+ + + +3 +
+ + +2 +
+ +1 +
Elite Units cost double +
Minefields15 +
Supply Card10 +
+ +
+ +
+
+ + + + +
+ +
+ + diff --git a/play.js b/play.js new file mode 100644 index 0000000..0c116bf --- /dev/null +++ b/play.js @@ -0,0 +1,356 @@ +"use strict" + +// https://www.redblobgames.com/grids/hexagons/ + +const svgNS = "http://www.w3.org/2000/svg" +const round = Math.round +const sqrt = Math.sqrt + +let ui = { + hexes: [], + sides: [], + hex_x: [], + hex_y: [], + units: [], + onmap: document.getElementById("units"), + focus: null, +} + +function unit_hex(u) { + return view.units[u] >>> 5 +} + +function unit_lost_steps(u) { + return view.units[u] & 3 +} + +function is_unit_supplied(u) { + return (view.units[u] & 4) === 4 +} + +function is_unit_disrupted(u) { + return (view.units[u] & 8) === 8 +} + +function is_unit_moved(u) { + return (view.units[u] & 16) === 16 +} + +function is_unit_action(unit) { + return !!(view.actions && view.actions.unit && view.actions.unit.includes(unit)) +} + +function is_unit_selected(unit) { + return !!(view.selected && view.selected.includes(unit)) +} + +function is_hex_action(hex) { + return !!(view.actions && view.actions.hex && view.actions.hex.includes(hex)) +} + +function is_hex_axis_supply(hex) { + return view.axis_supply[hex] > 0 +} + +function is_side_axis_supply_line(side) { + return view.axis_supply_line[side] > 0 +} + +function is_hex_allied_supply(hex) { + return view.allied_supply[hex] > 0 +} + +function is_side_allied_supply_line(side) { + return view.allied_supply_line[side] > 0 +} + +function focus_stack(stack) { + if (ui.focus !== stack) { + console.log("FOCUS STACK", stack) + ui.focus = stack + update_map() + return stack.length <= 1 + } + return true +} + +function blur_stack() { + if (ui.focus !== null) { + console.log("BLUR STACK") + ui.focus = null + update_map() + } +} + +function on_blur(evt) { + document.getElementById("status").textContent = "" +} + +function on_click_hex(evt) { + if (evt.button === 0) { + send_action('hex', evt.target.hex) + } +} + +function on_click_unit(evt) { + if (evt.button === 0) { + evt.stopPropagation() + if (focus_stack(evt.target.stack)) + send_action('unit', evt.target.unit) + return true + } +} + +document.getElementById("map").addEventListener("mousedown", function (evt) { + if (evt.button === 0) { + blur_stack() + } +}) + +function on_focus_hex(evt) { + let h = evt.target.hex + let text = "(" + h + ") " + hex_name[h] + for (let r in regions) + if (regions[r].includes(h)) + text += " - " + r + document.getElementById("status").textContent = text +} + +function on_focus_unit(evt) { + let u = evt.target.unit + let data = units[u] + document.getElementById("status").textContent = `(${u}) ${data.nationality} ${data.elite ? "elite " : ""}${data.type} - ${data.steps} - ${data.name}` +} + +function toggle_units() { + document.getElementById("units").classList.toggle("hide") +} + +const CLEAR = 2 +const PASS = 1 +const ROUGH = 0 + +const TRAIL = 1 +const TRACK = 2 +const HIGHWAY = 4 + +// visible map width = 22 hexes: el agheila -> alexandria +// visible map height = 9 hexes: oasis to derne + +const map_w = 25 +const map_h = 9 + +let hexnext = [ 1, map_w, map_w-1, -1, -map_w, -(map_w-1) ] + +function build_hexes() { + let yoff = 4 + let xoff = 62 + let hex_w = 121.5 + let hex_r = hex_w / sqrt(3) + let hex_h = hex_r * 2 + + let w = hex_w / 2 + let a = hex_h / 2 + let b = hex_h / 4 + + function add_line(x, y, s, side_id) { + let x1, y1, x2, y2 + switch (s) { + case 0: x1 = (x+w); y1 = (y+b); x2 = (x+w); y2 = (y-b); break; // E + case 1: x1 = (x+0); y1 = (y+a); x2 = (x+w); y2 = (y+b); break; // SE + case 2: x1 = (x-w); y1 = (y+b); x2 = (x+0); y2 = (y+a); break; // SW + case 3: x1 = (x-w); y1 = (y+b); x2 = (x-w); y2 = (y-b); break; // W + case 4: x1 = (x-w); y1 = (y-b); x2 = (x+0); y2 = (y-a); break; // NW + case 5: x1 = (x+0); y1 = (y-a); x2 = (x+w); y2 = (y-b); break; // NE + } + path.push("M", x1, y1, x2, y2) + + let side = ui.sides[side_id] = document.createElementNS(svgNS, "line") + document.getElementById("mapsvg").getElementById("sides").appendChild(side) + + let cn = "side" + if (side_limit[side_id] === 0) cn += " rough" + else if (side_limit[side_id] === 1) cn += " gap" + else if (side_limit[side_id] === 2) cn += " clear" + if (side_road[side_id] === 1) cn += " trail" + else if (side_road[side_id] === 2) cn += " track" + else if (side_road[side_id] === 4) cn += " highway" + + side.setAttribute("class", cn) + side.setAttribute("x1", x1) + side.setAttribute("y1", y1) + side.setAttribute("x2", x2) + side.setAttribute("y2", y2) + side.side = side_id + } + + function add_hex(x, y) { + return [ + [ round(x), round(y-a) ], + [ round(x+w), round(y-b) ], + [ round(x+w), round(y+b) ], + [ round(x), round(y+a) ], + [ round(x-w), round(y+b) ], + [ round(x-w), round(y-b) ] + ].join(" ") + } + + let path = [] + for (let y = 0; y < map_h+1; ++y) { + for (let x = 0; x < map_w+1; ++x) { + let hex_id = y * map_w + x + let xx = x + y/2 - 4.5 + let hex_x = (xoff + hex_w * xx + hex_w/2) + let hex_y = (yoff + hex_h * 3 / 4 * y + hex_h/2) + + ui.hex_x[hex_id] = round(hex_x) + ui.hex_y[hex_id] = round(hex_y) + + // Add hex cell + if (hex_exists[hex_id]) + { + let hex = ui.hexes[hex_id] = document.createElementNS(svgNS, "polygon") + hex.setAttribute("class", "hex") + hex.setAttribute("points", add_hex(hex_x, hex_y)) + hex.addEventListener("mousedown", on_click_hex) + hex.addEventListener("mouseenter", on_focus_hex) + hex.addEventListener("mouseleave", on_blur) + hex.hex = hex_id + document.getElementById("mapsvg").getElementById("hexes").appendChild(hex) + } + + // Add hex sides + // if (hex_exists[hex_id]) + { + for (let s = 0; s < 3; ++s) { + let next_id = hex_id + hexnext[s] + // if (hex_exists[next_id]) + { + let side_id = hex_id * 3 + s + add_line(hex_x, hex_y, s, side_id) + } + } + } + } + } + + for (let month = 1; month <= 20; ++month) { + ui.hex_y[map_w * map_h + month] = 24 + 37 + ui.hex_x[map_w * map_h + month] = 1000 + 37 + (month-1) * 81 + } + + document.getElementById("mapsvg").getElementById("grid").setAttribute("d", path.join(" ")) +} + +function build_units() { + function build_unit(u, data) { + let elt = ui.units[u] = document.createElement("div") + elt.className = `unit ${data.nationality} u${u} r0` + elt.addEventListener("mousedown", on_click_unit) + elt.addEventListener("mouseenter", on_focus_unit) + elt.addEventListener("mouseleave", on_blur) + elt.unit = u + } + for (let u = 0; u < units.length; ++u) { + build_unit(u, units[u]) + } +} + +build_hexes() +build_units() + +let stack = new Array(map_w * map_h + 21) +for (let i = 0; i < stack.length; ++i) + stack[i] = [] + +function update_map() { + for (let i = 0; i < stack.length; ++i) + stack[i].length = 0 + for (let u = 0; u < units.length; ++u) { + let e = ui.units[u] + let hex = unit_hex(u) + if (hex) { + if (!ui.onmap.contains(e)) + ui.onmap.appendChild(e) + stack[hex].push(u) + e.stack = stack[hex] + } else { + e.remove() + } + } + + for (let hex = 0; hex < stack.length; ++hex) { + for (let i = 0; i < stack[hex].length; ++i) { + let u = stack[hex][i] + let e = ui.units[u] + let x, y, z + + if (stack[hex] === ui.focus) { + x = ui.hex_x[hex] - 30 + y = ui.hex_y[hex] - 30 + i * 64 + z = 100 + } else { + if (stack[hex].length <= 4) { + x = ui.hex_x[hex] - 30 + i * 13 + y = ui.hex_y[hex] - 30 + i * 16 + } else if (stack[hex].length <= 8) { + x = ui.hex_x[hex] - 30 + i * 8 + y = ui.hex_y[hex] - 30 + i * 8 + } else { + x = ui.hex_x[hex] - 30 + i * 3 + y = ui.hex_y[hex] - 30 + i * 3 + } + z = 1 + i + } + + e.style.top = y + "px" + e.style.left = x + "px" + e.style.zIndex = z + + let r = unit_lost_steps(u) + e.classList.toggle("r0", r === 0) + e.classList.toggle("r1", r === 1) + e.classList.toggle("r2", r === 2) + e.classList.toggle("r3", r === 3) + + e.classList.toggle("action", is_unit_action(u)) + e.classList.toggle("selected", is_unit_selected(u)) + } + if (ui.hexes[hex]) { + ui.hexes[hex].classList.toggle("action", is_hex_action(hex)) + if (view.axis_supply) { + ui.hexes[hex].classList.toggle("axis_supply", is_hex_axis_supply(hex)) + for (let s = 0; s < 3; ++s) + ui.sides[hex*3+s].classList.toggle("axis_supply", is_side_axis_supply_line(hex*3+s)) + } + if (view.allied_supply) { + ui.hexes[hex].classList.toggle("allied_supply", is_hex_allied_supply(hex)) + for (let s = 0; s < 3; ++s) + ui.sides[hex*3+s].classList.toggle("allied_supply", is_side_allied_supply_line(hex*3+s)) + } + } + } +} + +function on_update() { + update_map() + + action_button("overrun", "Overrun") + action_button("rommel", "Rommel") + action_button("end_move", "End move") + action_button("stop", "Stop") + + action_button("group", "Group") + action_button("regroup", "Regroup") + + action_button("basic", "Basic") + action_button("offensive", "Offensive") + action_button("assault", "Assault") + action_button("blitz", "Blitz") + action_button("pass", "Pass") + + action_button("next", "Next") + action_button("undo", "Undo") +} + +scroll_with_middle_mouse("main") diff --git a/rules.js b/rules.js index 142e0c4..4cbce82 100644 --- a/rules.js +++ b/rules.js @@ -1,138 +1,1568 @@ -"use strict"; +"use strict" -let game = null; -let view = null; +// unit state: location (8 bits), steps (2 bits), supplied, disrupted, moved -exports.roles = [ "Axis", "Allied" ]; +const max = Math.max +const min = Math.min +const abs = Math.abs -exports.scenarios = [ - "1940", - "1941", - "1941-42", - "Crusader", - "Battleaxe", - "1942", - "Gazala", - "Pursuit to Alamein", -]; +function debug_hexes3(n, list) { + console.log("--", n, "--") + for (let y = 0; y < hexh; ++y) + console.log("".padStart(y*2," ") + list.slice(y*hexw, (y+1)*hexw).map(x=>String(x).padStart(3, ' ')).join(" ")) +} + +function debug_hexes2(n, list) { + console.log("--", n, "--") + for (let y = 0; y < hexh; ++y) + console.log("".padStart(y*2," ") + list.slice(y*hexw, (y+1)*hexw).map(x=>String(x).padStart(3, ' ')).join(" ")) +} + +function debug_hexes(n, list) { + console.log("--", n, "--") + for (let y = 0; y < hexh; ++y) + console.log("".padStart(y," ") + list.slice(y*hexw, (y+1)*hexw).join("")) +} + +var states = {} +var game = null +var view = null + +let { hex_road, side_road, side_limit, hex_name, units, regions } = require("./data") + +// Card deck has 42 cards, of which 28 are supply cards, and 14 are dummy cards. +// Represent draw pile and hands as [ dummy_supply_count, real_supply_count ] +const REAL_SUPPLY_COUNT = 28 +const DUMMY_SUPPLY_COUNT = 14 + +const hexw = 25 +const hexh = 9 + +const hexcount = hexw * hexh +const sidecount = hexcount * 3 +const hexdeploy = hexw * hexh +const hexnext = [ 1, hexw, hexw-1, -1, -hexw, -(hexw-1) ] + +const first_hex = 7 +const last_hex = 215 + +const AXIS = 'Axis' +const ALLIED = 'Allied' + +const CLEAR = 2 +const PASS = 1 +const ROUGH = 0 + +const NO_ROAD = 0 +const TRAIL = 1 +const TRACK = 2 +const HIGHWAY = 4 + +const SUPPLY_RANGE = [ 1, 2, 3, -1, 3 ] + +const EL_AGHEILA = 151 +const ALEXANDRIA = 74 +const BENGHAZI = 54 +const TOBRUK = 37 +const BARDIA = 40 +const FT_CAPUZZO = 64 +const MERSA_BREGA = 152 +const BARDIA_FT_CAPUZZO = 122 + +const region_egypt = regions["Egypt"] +const region_el_agheila = regions["El Agheila"] +const region_tobruk = regions["Tobruk"] +const region_egypt_and_libya = regions["Libya"].concat(regions["Egypt"]) +const region_libya_and_sidi_omar = regions["Libya"].concat(regions["Sidi Omar"]) +const region_libya_and_sidi_omar_and_sollum = regions["Libya"].concat(regions["Sidi Omar"]).concat(regions["Sollum"]) +const region_egypt_and_tobruk = regions["Egypt"].concat(regions["Tobruk"]) +const region_libya_except_tobruk = regions["Libya"].filter(r => r !== TOBRUK) + +const region_all = [] +for (let x = first_hex; x <= last_hex; ++x) + region_all.push(x) + +function calc_distance(a, b) { + let ax = a % hexw, ay = (a / hexw)|0, az = -ax - ay + let bx = b % hexw, by = (b / hexw)|0, bz = -bx - by + return max(abs(bx-ax), abs(by-ay), abs(bz-az)) +} + +function calc_distance_map(supply) { + let map = new Array(hexcount) + for (let x = 0; x < hexcount; ++x) + map[x] = calc_distance(supply, x) + debug_hexes2(hex_name[supply], map) + return map +} + +const distance_to = { + [EL_AGHEILA]: calc_distance_map(EL_AGHEILA), + [ALEXANDRIA]: calc_distance_map(ALEXANDRIA), + [BENGHAZI]: calc_distance_map(BENGHAZI), + [TOBRUK]: calc_distance_map(TOBRUK), + [BARDIA]: calc_distance_map(BARDIA), +} + +function draw_supply_card(pile) { + let x = random(pile[0] + pile[1]) + if (x < pile[0]) { + pile[0] -- + return 0 + } else { + pile[1] -- + return 1 + } +} + +function deal_axis_supply_cards(n) { + for (let i = 0; i < n; ++i) + game.axis_hand[draw_supply_card(game.draw_pile)]++ +} + +function deal_allied_supply_cards(n) { + for (let i = 0; i < n; ++i) + game.allied_hand[draw_supply_card(game.draw_pile)]++ +} + +function find_unit(name) { + for (let u = 0; u < units.length; ++u) + if (units[u].name === name) + return u + throw new Error("cannot find named block: " + name) +} + +function find_units(list) { + return list.map(name => find_unit(name)) +} + +function unit_speed(u) { + return units[u].speed +} + +function unit_hex(u) { + return game.units[u] >>> 5 +} + +function set_unit_hex(u, x) { + game.units[u] = (game.units[u] & 31) | (x << 5) +} + +function unit_lost_steps(u) { + return game.units[u] & 3 +} + +function set_unit_lost_steps(u, n) { + game.units[u] = (game.units[u] & ~3) | n +} -exports.ready = function (scenario, options, players) { - return players.length === 2; +function is_unit_supplied(u) { + return (game.units[u] & 4) === 4 } +function set_unit_supplied(u) { + game.units[u] |= 4 +} + +function clear_unit_supplied(u) { + game.units[u] &= ~4 +} + +function is_unit_disrupted(u) { + return (game.units[u] & 8) === 8 +} + +function set_unit_disrupted(u) { + game.units[u] |= 8 +} + +function clear_unit_disrupted(u) { + game.units[u] &= ~8 +} + +function is_unit_moved(u) { + return (game.units[u] & 16) === 16 +} + +function set_unit_moved(u) { + game.units[u] |= 16 +} + +function clear_unit_moved(u) { + game.units[u] &= ~16 +} + +function unit_steps(u) { + return units[u].steps - unit_lost_steps(u) +} + +function set_unit_steps(u, n) { + set_unit_lost_steps(u, units[u].steps - n) +} + +function is_friendly_unit(u) { + if (game.active === AXIS) + return is_axis_unit(u) + return is_allied_unit(u) +} + +function is_enemy_unit(u) { + if (game.active === ALLIED) + return is_axis_unit(u) + return is_allied_unit(u) +} + +function is_friendly_hex(x) { + if (game.active === AXIS) + return is_axis_hex(x) + return is_allied_hex(x) +} + +function is_enemy_hex(x) { + if (game.active === ALLIED) + return is_axis_hex(x) + return is_allied_hex(x) +} + +function is_allied_unit(u) { + return units[u].nationality === 'allied' +} + +function is_axis_unit(u) { + return units[u].nationality !== 'allied' +} + +function is_axis_hex(x) { + let has_axis = false, has_allied = false + for (let u = 0; u < units.length; ++u) { + if (unit_hex(u) === x) { + if (is_axis_unit(u)) + has_axis = true + else + has_allied = true + } + } + return has_axis && !has_allied +} + +function is_allied_hex(x) { + let has_axis = false, has_allied = false + for (let u = 0; u < units.length; ++u) { + if (unit_hex(u) === x) { + if (is_axis_unit(u)) + has_axis = true + else + has_allied = true + } + } + return !has_axis && has_allied +} + +function is_battle_hex(x) { + let has_axis = false, has_allied = false + for (let u = 0; u < units.length; ++u) { + if (unit_hex(u) === x) { + if (is_axis_unit(u)) + has_axis = true + else + has_allied = true + } + } + return has_axis && has_allied +} + +function is_empty_hex(x) { + let has_axis = false, has_allied = false + for (let u = 0; u < units.length; ++u) { + if (unit_hex(u) === x) { + if (is_axis_unit(u)) + has_axis = true + else + has_allied = true + } + } + return !has_axis && !has_allied +} + +function has_axis_unit(x) { + for (let u = 0; u < units.length; ++u) + if (unit_hex(u) === x) + if (is_axis_unit(u)) + return true + return false +} + +function has_allied_unit(x) { + for (let u = 0; u < units.length; ++u) + if (unit_hex(u) === x) + if (is_allied_unit(u)) + return true + return false +} + +function has_friendly_unit(x) { + if (game.active === AXIS) + return has_axis_unit(x) + return has_allied_unit(x) +} + +function has_enemy_unit(x) { + if (game.active === ALLIED) + return has_axis_unit(x) + return has_allied_unit(x) +} + +// === SUPPLY NETWORK === + +function is_side_unit(side, u) { + if (side === AXIS) + return is_axis_unit(u) + return is_allied_unit(u) +} + +function list_control_hexes(side) { + let control = new Array(hexcount).fill(0) + for (let u = 0; u < units.length; ++u) { + if (is_side_unit(side, u)) { + let x = unit_hex(u) + if (x > 0 && x < hexdeploy) + control[x] = 1 + } + } + return control +} + +function to_side(a, b, s) { + if (s < 3) + return a * 3 + s + return b * 3 + s - 3 +} + +function ind(d, msg, here, ...extra) { + console.log(new Array(d).fill("-").join("") + msg, here, "("+hex_name[here]+")", extra.join(" ")) +} + +var supply_visited, supply_friendly, supply_enemy, supply_src, supply_net, supply_line +var trace_total +var trace_highway +var trace_chain + + + +function trace_supply_highway(here, d) { + trace_highway++ + ind(d, "> highway", here) + + // TODO: hoist to call sites to avoid function call overhead + if (supply_src[here]) { + ind(d, "! source highway", here) + return true + } + + let has_supply = false + + supply_visited[here] = true + + for (let s = 0; s < 6; ++s) { + let next = here + hexnext[s] + let side = to_side(here, next, s) + + if (side_limit[side] === 0) + continue + if (supply_visited[next]) + continue + if (supply_enemy[next]) + continue + + let road = side_road[side] + if (road === HIGHWAY) { + if (supply_friendly[next]) { + ind(d, "? highway head", next) + if (trace_supply_chain(next, d+1, 0, 3)) { + ind(d, "< highway chain", here, next) + supply_line[side] = 1 + has_supply = true + } + } else { + if (trace_supply_highway(next, d+1)) { + ind(d, "< highway", here, next) + supply_line[side] = 1 + has_supply = true + } + } + } + } + + supply_visited[here] = false + + if (has_supply) { + supply_net[here] = 1 + supply_src[here] = 1 + } + + return has_supply +} + +function trace_supply_chain(here, d, n, range) { + ind(d, "> chain", here, n, range) + trace_chain++ + + if (supply_src[here]) { + ind(d, "! source chain", here) + return true + } + + let has_supply = false + + supply_visited[here] = true + + for (let s = 0; s < 6; ++s) { + let next = here + hexnext[s] + let side = to_side(here, next, s) + + if (side_limit[side] === 0) + continue + if (supply_visited[next]) + continue + if (supply_enemy[next]) + continue + + let road = side_road[side] + + if (road === HIGHWAY) { + ind(d, "? chain highway", next) + if (supply_friendly[next]) { + ind(d, "? chain highway head", next) + if (trace_supply_chain(next, d+1, 0, 3)) { + ind(d, "< highway chain", here, next) + supply_line[side] = 1 + has_supply = true + } + } else { + if (trace_supply_highway(next, d+1)) { + ind(d, "< chain highway", here, next) + supply_line[side] = 1 + has_supply = true + } + } + } else { + let next_range = min(range, SUPPLY_RANGE[road]) + if (n + 1 <= next_range) { + if (supply_friendly[next]) { + ind(d, "? chain head", next) + if (trace_supply_chain(next, d+1, 0, 3)) { + ind(d, "< highway chain", here, next) + supply_line[side] = 1 + has_supply = true + } + } else { + if (trace_supply_chain(next, d+1, n+1, next_range)) { + ind(d, "< chain trail", here, next_range) + supply_line[side] = 1 + has_supply = true + } + } + } + } + } + + supply_visited[here] = false + + if (has_supply) { + supply_net[here] = 1 + if (supply_friendly[here]) + supply_src[here] = 1 + } + + return has_supply +} + +function trace_supply_network(start) { + supply_visited = new Array(hexcount).fill(false) + supply_net = new Array(hexcount).fill(0) + supply_line = new Array(sidecount).fill(0) + supply_src = new Array(hexcount).fill(0) + + supply_src[start] = 1 + supply_net[start] = 1 + + console.log("=== SUPPLY NETWORK ===") + // debug_hexes("FH", supply_friendly) + // debug_hexes("EH", supply_enemy) + // debug_hexes("SS1", supply_src) + + trace_total = 0 + for (let x = first_hex; x <= last_hex; ++x) { + if (supply_friendly[x]) { + trace_highway = trace_chain = 0 + ind(0, "START", x) + trace_supply_chain(x, 0, 0, 3) + console.log("END", trace_highway, trace_chain) + trace_total += trace_highway + trace_chain + } + } + console.log("VISITS", trace_total) + + debug_hexes("SS", supply_src) + debug_hexes("SN", supply_net) +} + +function update_axis_supply_network() { + supply_friendly = list_control_hexes(AXIS) + supply_enemy = list_control_hexes(ALLIED) + trace_supply_network(EL_AGHEILA) + game.axis_supply = supply_net + game.axis_supply_line = supply_line +} + +function update_allied_supply_network() { + supply_friendly = list_control_hexes(ALLIED) + supply_enemy = list_control_hexes(AXIS) + trace_supply_network(ALEXANDRIA) + game.allied_supply = supply_net + game.allied_supply_line = supply_line +} + +function update_supply_networks() { + update_axis_supply_network() + update_allied_supply_network() +} + +// === TURN === + +// Supply check +// Turn option +// Movement +// Combat +// Blitz Movement +// Blitz Combat +// Final supply check +// Reveal supply cards -> next player + +function end_player_turn() { + // TODO: end when both pass + if (game.phasing === AXIS) + game.phasing = ALLIED + else + game.phasing = AXIS + game.active = game.phasing + goto_player_turn() +} + +function goto_player_turn() { + game.rommel = 0 + game.group_moves = [] + game.regroup_moves = [] + goto_supply_check() +} + +function goto_supply_check() { + goto_turn_option() +} + +function goto_turn_option() { + game.state = 'turn_option' +} + +states.turn_option = { + inactive: "turn option", + prompt() { + view.prompt = "Select Turn Option" + gen_action('basic') + gen_action('offensive') + gen_action('assault') + gen_action('blitz') + gen_action('pass') + }, + basic() { + push_undo() + game.turn_option = 'basic' + goto_move_phase() + }, + offensive() { + push_undo() + game.turn_option = 'offensive' + goto_move_phase() + }, + assault() { + push_undo() + game.turn_option = 'assault' + goto_move_phase() + }, + blitz() { + push_undo() + game.turn_option = 'blitz' + goto_move_phase() + }, + pass() { + push_undo() + game.turn_option = 'pass' + goto_move_phase() + }, +} + +function goto_move_phase() { + game.state = 'select_moves' +} + +states.select_moves = { + inactive: "move phase", + prompt() { + view.prompt = `Make Moves (${game.turn_option})` + gen_action('group') + gen_action('regroup') + }, + group() { + push_undo() + game.state = 'group_move_from' + }, + regroup() { + push_undo() + game.state = 'regroup_move' + }, +} + +states.group_move_from = { + inactive: "group move (from)", + prompt() { + view.prompt = `Group Move: Select hex to move from.` + for (let x = first_hex; x <= last_hex; ++x) + if (has_friendly_unit(x)) + gen_action_hex(x) + if (game.active === AXIS && !game.rommel) + gen_action('rommel') + }, + rommel() { + push_undo() + game.rommel = 1 + }, + hex(x) { + push_undo() + game.group_moves.push(x) + game.state = 'group_move_who' + }, +} + +states.group_move_who = { + inactive: "group move (who)", + prompt() { + view.prompt = `Group Move: Select unit to move.` + for (let i = 0; i < game.group_moves.length; ++i) { + let from = game.group_moves[i] + for (let u = 0; u < units.length; ++u) { + if (unit_hex(u) === from && !is_unit_moved(u)) + gen_action_unit(u) + } + } + gen_action('end_move') + }, + next() { + // TODO: end move + push_undo() + game.state = 'select_moves' + }, + unit(u) { + push_undo() + game.selected = [ u ] + game.state = 'group_move_to' + game.move_used = 0 + game.move_road = 4 // HIGHWAY + }, +} + +states.group_move_to = { + inactive: "group move (to)", + prompt() { + view.prompt = `Group Move: Select where to move.` + let u = game.selected[0] + let from = unit_hex(u) + if (game.move_used > 0) + gen_action('stop') + + var t0, t1 + t0 = Date.now() + //for (let i = 0; i < 100000; ++i) + search_path_move_dfs(u, from, game.move_used, game.move_road) + t1 = Date.now() + console.log("DFS", (t1 - t0) / 1000) + + var a = path_from.toString() + + t0 = Date.now() + //for (let i = 0; i < 100000; ++i) + search_path_move_ucs(u, from, game.move_used, game.move_road) + t1 = Date.now() + console.log("DFS", (t1 - t0) / 1000) + + var b = path_from.toString() + if (a !== b) { + console.log(a) + console.log(b) + } + + for (let x = first_hex; x <= last_hex; ++x) + if (path_from[x] > 0) + gen_action_hex(x) + + view.path_from = path_from + }, + hex(x) { + push_undo() + let u = game.selected[0] + set_unit_hex(u, x) + }, + stop() { + push_undo() + let u = game.selected[0] + set_unit_moved(u) + game.selected = [] + game.state = 'group_move_who' + } +} + +var path_cost = new Array(hexcount) +var path_from = new Array(hexcount) + +function pq_push(queue, hex, used, road) { + for (let i = 0, n = queue.length; i < n; ++i) + if (queue[i][1] > used) + return queue.splice(i, 0, [hex, used, road, hex_name[hex]]) + queue.push([hex, used, road, hex_name[hex]]) +} + +// Uniform Cost Search +function search_path_move_ucs(who, start, start_used, start_road) { + let speed = unit_speed(who) + HIGHWAY + path_cost.fill(100) + path_from.fill(0) + + let queue = [] + pq_push(queue, start, start_used, start_road) + path_cost[start] = start_used + + let n = 0 + while (queue.length > 0) { + //console.log(queue) + let [ here, here_used, here_road ] = queue.shift() + ++n + + // already seen this hex from a shorter path + if (path_cost[here] < here_used) + continue + + for (let s = 0; s < 6; ++s) { + let next = here + hexnext[s] + + // can't go off-map + if (next < first_hex || next > last_hex) + continue + + let side = to_side(here, next, s) + + // can't cross this hexside + if (side_limit[side] === 0) + continue + + let next_road = min(here_road, side_road[side]) + let road_cost = here_road - next_road + let next_used = here_used + road_cost + 1 + + // not enough movement allowance to reach + if (next_used > speed) + continue + + // a shorter path has already been found + if (next_used >= path_cost[next]) + continue + + ind(2, "path", next, next_used, next_road) + + path_from[next] = here + path_cost[next] = next_used + + // must stop + if (has_enemy_unit(next)) + continue + + pq_push(queue, next, next_used, next_road) + } + } + + console.log("UCS VISITED", n) +} + +var search_n +function search_path_move_dfs(who, start, start_used, start_road) { + path_cost.fill(100) + path_from.fill(0) + + ind(0, "?path", start, start_used, unit_speed(who)) + search_n = 1 + path_cost[start] = 0 + path_from[start] = 0 + search_path_move_rec(unit_speed(who) + HIGHWAY, start, start_used, start_road, 2) + console.log("DFS VISITED", search_n) +} + +function search_path_move_rec(speed, here, here_used, here_road, d) { + ++search_n + for (let s = 0; s < 6; ++s) { + let next = here + hexnext[s] + + // can't go off-map + if (next < first_hex || next > last_hex) + continue + + let side = to_side(here, next, s) + + // can't cross this hexside + if (side_limit[side] === 0) + continue + + let next_road = min(here_road, side_road[side]) + let road_cost = here_road - next_road + let next_used = here_used + road_cost + 1 + + // not enough movement allowance to reach + if (next_used > speed) + continue + + // a shorter path has already been found + if (next_used >= path_cost[next]) + continue + + ind(d, "path", next, next_used, speed) + + path_from[next] = here + path_cost[next] = next_used + + // must stop + if (has_enemy_unit(next)) + continue + + search_path_move_rec(speed, next, next_used, next_road, d+1) + } +} + +// === DEPLOYMENT === + +states.free_deployment = { + inactive: "free deployment", + prompt() { + let scenario = SCENARIOS[game.scenario] + let deploy = hexdeploy + scenario.start + let done = true + + if (game.active === AXIS) + view.prompt = "Axis Free Deployment" + else + view.prompt = "Allied Free Deployment" + + // TODO: first/last_axis_unit + for (let u = 0; u < units.length; ++u) { + if (is_friendly_unit(u)) { + if (unit_hex(u) === deploy) { + done = false + gen_action_unit(u) + } + } + } + + if (game.selected.length > 0) { + let list + if (game.active === AXIS) + list = scenario.axis_deployment + else + list = scenario.allied_deployment + // TODO: scenario.deployment_limit + for (let i = 0; i < list.length; ++i) + if (!is_enemy_hex(list[i])) + gen_action_hex(list[i]) + } + + if (done) + gen_action_next() + }, + unit(u) { + if (game.selected.includes(u)) + remove_from_array(game.selected, u) + else + game.selected.push(u) + }, + hex(x) { + push_undo() + for (let i = 0; i < game.selected.length; ++i) { + let u = game.selected[i] + set_unit_hex(u, x) + } + game.selected.length = 0 + }, + next() { + if (game.active === AXIS) + game.active = ALLIED + else + end_free_deployment() + } +} + +function end_free_deployment() { + game.phasing = game.first_player_turn + game.active = game.phasing + + let scenario = SCENARIOS[game.scenario] + deal_axis_supply_cards(scenario.axis_initial_supply) + deal_allied_supply_cards(scenario.allied_initial_supply) + + // TODO: mulligan + + // No buildup first month + // No initiative first month + goto_player_turn() +} + +// === SETUP === + +function find_axis_units(a) { + let list = [] + for (let u = 0; u < units.length; ++u) + if (units[u].nationality !== 'allied' && units[u].appearance === a) + list.push(u) + return list +} + +function find_allied_units(a) { + let list = [] + for (let u = 0; u < units.length; ++u) + if (units[u].nationality === 'allied' && units[u].appearance === a) + list.push(u) + return list +} + +function setup_reinforcements(m) { + for (let u = 0; u < units.length; ++u) { + if (units[u].appearance === m) { + if (m === 'M') + set_unit_hex(u, 4) + else + set_unit_hex(u, hexdeploy + (m > 10 ? m - 10 : m)) + } + } +} + +function setup_units(where, steps, list) { + if (where < 0) + where = hexdeploy - where + for (let u of list) { + if (typeof u === 'string') + u = find_unit(u) + set_unit_hex(u, where) + if (steps < 0) + set_unit_steps(u, units[u].steps + steps) + else if (steps > 0) + set_unit_steps(u, steps) + } +} + +const SCENARIOS = { + 1940: { + year: 1940, + start: 1, + end: 6, + axis_deployment: region_all, // XXX region_libya_and_sidi_omar, + allied_deployment: region_all, // XXX region_egypt, + axis_initial_supply: 6, + allied_initial_supply: 3, + special: { + no_rommel_bonus: true, + only_one_die_for_buildup: true, + } + }, + "1941": { + year: 1941, + start: 1, + end: 10, + axis_deployment: [], + allied_deployment: region_egypt_and_libya, + axis_initial_supply: 6, + allied_initial_supply: 6, + }, + "Crusader": { + year: 1941, + start: 8, + end: 10, + axis_deployment: region_libya_and_sidi_omar_and_sollum, + allied_deployment: region_egypt_and_tobruk, + axis_initial_supply: 10, + allied_initial_supply: 12, + deployment_limit: { + [TOBRUK]: 5, + }, + special: { + allies_first_turn: true, + tobruk_minefield: true, + } + }, + "Battleaxe": { + year: 1941, + start: 4, + end: 10, + axis_deployment: region_libya_except_tobruk, + allied_deployment: region_egypt_and_tobruk, + axis_initial_supply: 4, + allied_initial_supply: 8, + deployment_limit: { + [TOBRUK]: 5, + }, + }, + "1942": { + year: 1942, + start: 11, + end: 20, + axis_deployment: [ EL_AGHEILA, MERSA_BREGA ], + allied_deployment: region_egypt_and_libya, + axis_initial_supply: 5, + allied_initial_supply: 5, + deployment_limit: { + [EL_AGHEILA]: 14, + [MERSA_BREGA]: 10, + }, + }, + "Gazala": { + year: 1942, + start: 14, + end: 15, + axis_deployment: regions["West Line"], + allied_deployment: regions["East Line"], + axis_initial_supply: 10, + allied_initial_supply: 12, + special: { + gazala_pre_build: true, + } + }, + "Pursuit to Alamein": { + year: 1942, + start: 15, + end: 20, + axis_deployment: regions["Libya"], + allied_deployment: regions["Egypt"], + axis_initial_supply: 8, + allied_initial_supply: 8, + }, + "1941-42": { + year: 1941, + start: 1, + end: 20, + axis_deployment: [], + allied_deployment: region_egypt_and_libya, + axis_initial_supply: 6, + allied_initial_supply: 6, + }, +} + +const SETUP = { + "1940" (DEPLOY) { + setup_units(DEPLOY, 0, [ "Pav", "Bre", "Tre", "Bol", "Sav", "Sab", "Fas", "Ita" ]) + setup_units(-3, 0, [ "Ari", "Pis"]) + setup_units(-5, 0, [ "Lit", "Cen"]) + + setup_units(DEPLOY, 0, [ "7/7", "7", "7/SG", "4IN/3m" ]) + setup_units(-2, 0, [ "4IN/5", "4IN/11" ]) + setup_units(-4, 0, [ "Matilda/A", "7/4", "4IN/7m", "/Tob" ]) + }, + + "1941" (DEPLOY) { + setup_units(EL_AGHEILA, 0, find_axis_units('S')) + setup_reinforcements(3) + setup_reinforcements(5) + setup_reinforcements(7) + + setup_units(DEPLOY, 0, find_allied_units('S')) + setup_units(TOBRUK, 0, find_allied_units('T')) + setup_reinforcements(2) + setup_reinforcements(4) + setup_reinforcements(6) + setup_reinforcements(8) + setup_reinforcements(10) + }, + + "Crusader" (DEPLOY) { + setup_units(DEPLOY, 0, find_axis_units('S')) + setup_units(DEPLOY, 0, find_axis_units(3)) + setup_units(DEPLOY, 0, find_axis_units(5)) + setup_units(DEPLOY, 0, find_axis_units(7)) + + setup_units(DEPLOY, 0, find_allied_units('S')) + setup_units(DEPLOY, 0, find_allied_units('T')) + setup_units(DEPLOY, 0, find_allied_units(2)) + setup_units(DEPLOY, 0, find_allied_units(4)) + setup_units(DEPLOY, 0, find_allied_units(6)) + setup_units(DEPLOY, 0, find_allied_units(8)) + setup_units(0, 0, [ "2/3", "2/SG", "9AU/20", "7AU/18" ]) + setup_reinforcements(10) + }, + + "Battleaxe" (DEPLOY) { + setup_units(DEPLOY, 0, [ "21/5", "21/3", "15/33", "90/155", "15/115", "88mm/A" ]) + setup_units(DEPLOY, -1, [ "21/104" ]) + setup_units(DEPLOY, 0, [ "Ari", "Lit", "Pav", "Bre", "Tre", "Bol", "Ita" ]) + setup_reinforcements(5) + setup_reinforcements(7) + + setup_units(DEPLOY, 0, [ "4IN/3m", "9AU/20", "70/14+16", "70/23", + "7/22G", "7/SG", "7AU/18", "Matilda/A", "/Tob", "/Pol", + "7/7", "4IN/5", "4IN/7m", "4IN/11", "Matilda/B", "/1AT", + "7/4", "7" ]) + setup_reinforcements(6) + setup_reinforcements(8) + setup_reinforcements(10) + }, + + "1942" (DEPLOY) { + setup_units(DEPLOY, 0, [ + "21/3", + "15/33", + "90/580", + "90/sv288", + "90/346", + "88mm/A", + ]) + setup_units(DEPLOY, 1, [ + "21/5", + "15/8", + "15/115", + "90/155" + ]) + setup_units(DEPLOY, 1, [ + "90/361", + "90/200", + "88mm/B", + "50mm", + "/104" + ]) + setup_units(DEPLOY, 0, [ "Lit" ]) + setup_units(DEPLOY, -1, [ "Ari", "Tri", "Pav", "Bre", "Tre", "Bol", "Sab", "Ita" ]) + setup_reinforcements(17) + setup_reinforcements(19) + setup_reinforcements('M') + + setup_units(TOBRUK, 0, [ + "1/22", + "/1AT", + "Matilda/B", + "1SA/2+5", + "70/14+16", + "1SA/1", + "1SA/3", + "2SA/4+6", + "70/23", + "/Tob", + ]) + setup_units(ALEXANDRIA, 1, [ + "7/4", + "/32AT", + "2NZ/4", + "2NZ/5", + "2NZ/6", + "7/SG", + "4IN/5", + "/Pol", + ]) + setup_reinforcements(12) + setup_reinforcements(14) + setup_reinforcements(16) + setup_reinforcements(18) + setup_reinforcements(20) + }, + + "Gazala" (DEPLOY) { + setup_units(DEPLOY, -1, [ + "21/5", + "15/8", + "15/115", + "90/155", + "88mm/B", + "50mm", + "/104", + ]) + setup_units(DEPLOY, 0, [ + "21/3", + "15/33", + "90/580", + "90/sv288", + "90/346", + "90/361", + "90/200", + "88mm/A", + ]) + setup_units(DEPLOY, 0, [ "Lit" ]) + setup_units(DEPLOY, -1, [ + "Ari", "Tri", "Pav", "Bre", "Tre", "Bol", "Sab", "Ita" + ]) + + setup_units(DEPLOY, 0, [ + "Grant", + "/1AT", + "1/22", + "Matilda/B", + "1SA", + "1/201G", + "4IN/7m", + "4IN/3m", + "1/SG", + "1SA/2+5", + "70/14+16", + "1SA/1", + "1SA/3", + "2SA/4+6", + "70/23", + "4IN/11", + "5IN/29", + "6#/A", + "2#", + "/Tob", + ]) + setup_units(ALEXANDRIA, 1, [ + "1/2", + "7/4", + "/32AT", + "2NZ/4", + "2NZ/5", + "2NZ/6", + "7/SG", + "7/22G", + "4IN/5", + "/Pol", + ]) + setup_units(ALEXANDRIA, 0, [ + "10IN/161m", + "8IN/18", + "B", + "FF/2", + "5IN/9+10", + "10IN/21+25", + ]) + }, + + "Pursuit to Alamein" (DEPLOY) { + setup_units(DEPLOY, 0, [ + "21/3", + "15/33", + ]) + setup_units(DEPLOY, -1, [ + "21/5", + "15/8", + "15/115", + "90/346", + "90/sv288", + "90/361", + "90/200", + "88mm/A", + "88mm/B", + "50mm", + ]) + setup_units(DEPLOY, 3, [ + "Ari", + "Tri", + "Pav", + "Bre", + "Tre", + ]) + setup_units(DEPLOY, 2, [ + "Lit", + "Bol", + ]) + setup_units(DEPLOY, 1, [ + "Sab", + "Ita", + ]) + setup_reinforcements(17) + setup_reinforcements(19) + setup_reinforcements('M') + + setup_units(DEPLOY, 0, [ + "10IN/161m", + "10IN/21+25", + "70/14+16", + "8IN/18", + "B", + ]) + setup_units(DEPLOY, -1, [ + "1/22", + "7/4", + "2NZ/4", + "2NZ/5", + "2NZ/6", + "1SA/2+5", + "1SA/1", + "1SA/3", + "70/23", + "5IN/29", + "6#/A", + ]) + setup_units(ALEXANDRIA, 1, [ + "Grant", + "1/2", + "/1AT", + "1SA", + "7/SG", + "1/SG", + "FF/2", + "5IN/9+10", + "4IN/5", + "4IN/11", + "/Pol", + "2#", + ]) + setup_reinforcements(16) + setup_reinforcements(18) + setup_reinforcements(20) + }, + + "1941-42" (DEPLOY) { + SETUP["1941"](-1) + + setup_reinforcements(11) + setup_reinforcements(17) + setup_reinforcements(19) + setup_reinforcements('M') + + setup_reinforcements(12) + setup_reinforcements(14) + setup_reinforcements(16) + setup_reinforcements(18) + setup_reinforcements(20) + }, + +} + +function setup(name) { + let scenario = SCENARIOS[name] + game.month = scenario.start + + SETUP[name](-scenario.start) + + game.active = 'Axis' + game.state = 'free_deployment' + game.selected = [] +} + +// === PUBLIC FUNCTIONS === + +exports.roles = [ "Axis", "Allied" ] + +exports.scenarios = Object.keys(SCENARIOS) + +exports.setup = function (seed, scenario, options) { + game = { + seed: seed, + log: [], + undo: [], + + phasing: AXIS, + active: AXIS, + selected: null, + + scenario: scenario, + month: 0, + + draw_pile: [ DUMMY_SUPPLY_COUNT, REAL_SUPPLY_COUNT ], + axis_hand: [ 0, 0 ], + allied_hand: [ 0, 0 ], + + units: new Array(units.length).fill(0), + + axis_minefields: [], + allied_minefields: [], + + first_player_turn: AXIS, + } + + setup(scenario) + + return game +} + +exports.view = function(state, current) { + game = state + + //update_supply_networks() + + view = { + month: game.month, + units: game.units, + selected: game.selected, + axis_supply: game.axis_supply, + axis_supply_line: game.axis_supply_line, + allied_supply: game.allied_supply, + allied_supply_line: game.allied_supply_line, + } + + return common_view(current) +} + +function gen_action_next() { + gen_action('next') +} + +function gen_action_unit(u) { + gen_action('unit', u) +} + +function gen_action_hex(x) { + gen_action('hex', x) +} + +// === COMMON TEMPLATE === + function random(n) { - return ((game.seed = game.seed * 69621 % 0x7fffffff) / 0x7fffffff) * n | 0; + // https://www.ams.org/journals/mcom/1999-68-225/S0025-5718-99-00996-5/S0025-5718-99-00996-5.pdf + return (game.seed = game.seed * 185852 % 34359738337) % n } function shuffle(deck) { for (let i = deck.length - 1; i > 0; --i) { - let j = random(i + 1); - let tmp = deck[j]; - deck[j] = deck[i]; - deck[i] = tmp; + let j = random(i + 1) + let tmp = deck[j] + deck[j] = deck[i] + deck[i] = tmp } } function remove_from_array(array, item) { - let i = array.indexOf(item); + let i = array.indexOf(item) if (i >= 0) - array.splice(i, 1); + array.splice(i, 1) } -function logbr() { - if (game.log.length > 0 && game.log[game.log.length-1] !== "") - game.log.push(""); +function deep_copy(original) { + if (Array.isArray(original)) { + let n = original.length + let copy = new Array(n) + for (let i = 0; i < n; ++i) { + let v = original[i] + if (typeof v === "object" && v !== null) + copy[i] = deep_copy(v) + else + copy[i] = v + } + return copy + } else { + let copy = {} + for (let i in original) { + let v = original[i] + if (typeof v === "object" && v !== null) + copy[i] = deep_copy(v) + else + copy[i] = v + } + return copy + } } -function log(msg) { - game.log.push(msg); +function push_undo() { + let copy = {} + for (let k in game) { + let v = game[k] + if (k === "undo") continue + else if (k === "log") v = v.length + else if (typeof v === "object" && v !== null) v = deep_copy(v) + copy[k] = v + } + game.undo.push(copy) +} + +function pop_undo() { + let save_log = game.log + let save_undo = game.undo + game = save_undo.pop() + save_log.length = game.log + game.log = save_log + game.undo = save_undo } function clear_undo() { - game.undo = []; + game.undo = [] } -function push_undo() { - game.undo.push(JSON.stringify(game, (k,v) => { - if (k === 'undo') return 0; - if (k === 'log') return v.length; - return v; - })); +function logbr() { + if (game.log.length > 0 && game.log[game.log.length-1] !== "") + game.log.push("") } -function pop_undo() { - let save_undo = game.undo; - let save_log = game.log; - game = JSON.parse(save_undo.pop()); - game.undo = save_undo; - save_log.length = game.log; - game.log = save_log; +function log(msg) { + game.log.push(msg) } function gen_action(action, argument) { if (argument !== undefined) { if (!(action in view.actions)) { - view.actions[action] = [ argument ]; + view.actions[action] = [ argument ] } else { if (!view.actions[action].includes(argument)) - view.actions[action].push(argument); + view.actions[action].push(argument) } } else { - view.actions[action] = 1; + view.actions[action] = 1 } } -let states = {}; +function goto_game_over(result, victory) { + game.state = 'game_over' + game.active = "None" + game.result = result + game.victory = victory + logbr() + log(game.victory) +} -exports.setup = function (seed, scenario, options) { - game = { - seed: seed, - log: [], - undo: [], - }; - return game; +states.game_over = { + get inactive() { + return game.victory + }, + prompt() { + view.prompt = game.victory + } +} + +exports.resign = function (state, current) { + game = state + if (game.state !== 'game_over') { + for (let opponent of exports.roles) { + if (opponent !== current) { + goto_game_over(opponent, current + " resigned.") + break + } + } + } + return game } exports.action = function (state, current, action, arg) { - game = state; - update_aliases(); - let S = states[game.state]; + game = state + let S = states[game.state] if (action in S) { - S[action](arg, current); + S[action](arg, current) } else { if (action === 'undo' && game.undo && game.undo.length > 0) - pop_undo(); + pop_undo() else - throw new Error("Invalid action: " + action); + throw new Error("Invalid action: " + action) } - return game; -} - -exports.resign = function (state, current) { - // No resigning allowed. - return state; + return game } -exports.view = function(state, current) { - game = state; - update_aliases(); - - view = { - log: game.log, - active: game.active, - prompt: null, - }; - +function common_view(current) { + view.log = game.log if (current === 'Observer' || game.active !== current) { - view.prompt = `Waiting for ${game.active} \u2014 ${game.state}...`; + let inactive = states[game.state].inactive || game.state + view.prompt = `Waiting for ${game.active} \u2014 ${inactive}...` } else { view.actions = {} - states[game.state].prompt(); + states[game.state].prompt() if (game.undo && game.undo.length > 0) - view.actions.undo = 1; + view.actions.undo = 1 else - view.actions.undo = 0; + view.actions.undo = 0 } - - return view; + return view } diff --git a/texture_clear.png b/texture_clear.png new file mode 100644 index 0000000..f73500a Binary files /dev/null and b/texture_clear.png differ diff --git a/texture_depression.png b/texture_depression.png new file mode 100644 index 0000000..7b6bec1 Binary files /dev/null and b/texture_depression.png differ diff --git a/texture_marsh.png b/texture_marsh.png new file mode 100644 index 0000000..bf5f689 Binary files /dev/null and b/texture_marsh.png differ diff --git a/texture_mountain.png b/texture_mountain.png new file mode 100644 index 0000000..fce9a58 Binary files /dev/null and b/texture_mountain.png differ diff --git a/texture_scree.png b/texture_scree.png new file mode 100644 index 0000000..3da3f98 Binary files /dev/null and b/texture_scree.png differ diff --git a/thumbnail.jpg b/thumbnail.jpg new file mode 100644 index 0000000..9fbcc85 Binary files /dev/null and b/thumbnail.jpg differ diff --git a/tools/gencss.js b/tools/gencss.js new file mode 100644 index 0000000..4981d7c --- /dev/null +++ b/tools/gencss.js @@ -0,0 +1,7 @@ +// let n = 51, u = 'px'; +let n = 100 / 9, u = '%'; +for (let i = 0; i < 94; ++i) { + let x = (i % 10) | 0; + let y = (i / 10) | 0; + console.log(`.unit.u${i}{background-position:${x*n}${u} ${y*n}${u}}`); +} diff --git a/tools/gendata.js b/tools/gendata.js new file mode 100644 index 0000000..fb0348c --- /dev/null +++ b/tools/gendata.js @@ -0,0 +1,576 @@ +// https://www.redblobgames.com/grids/hexagons/ + +// Clear +const CLEAR = 2; + +// Constricted +const GAP = 1; + +// Rough (impassable) +const OFFMAP = 0; +const RIDGE = 0; +const MARSH = 0; +const MOUNTAIN = 0; + +// Road +const TRAIL = 1; +const TRACK = 2; +const HIGHWAY = 4; + +const map_w = 25; +const map_h = 9; + +let next = [ 1, map_w, map_w-1, -1, -map_w, -(map_w-1) ]; + +let nextdir = [ -1, 1, map_w, map_w-1, -map_w, -(map_w-1) ] +let nextname = [ "E", "W", "NW", "NE", "SE", "SW" ]; + +let hex_exists = new Array(map_w*map_h).fill(1); +let side_limit = new Array(map_w*map_h*3).fill(CLEAR); +let side_road = new Array(map_w*map_h*3).fill(0); +let hex_road = new Array(map_w*map_h).fill(0); + +function add_side(s, t) { + if (side_limit[s]) + side_limit[s] += "/" + t; + else + side_limit[s] = t; +} + +function to_side_id(a, b) { + if (a > b) { + let c = b; b = a; a = c; + } + if (a + next[0] === b) + return a * 3 + 0; + else if (a + next[1] === b) + return a * 3 + 1; + else if (a + next[2] === b) + return a * 3 + 2; + throw new Error("not a hexside " + a + " to " + b); +} + +function def_side(t,a,b) { + side_limit[to_side_id(a,b)] = t; +} + +function def_road(t, list) { + for (let i = 0; i < list.length; ++i) + hex_road[list[i]] = t; + for (let i = 1; i < list.length; ++i) { + let s = to_side_id(list[i-1], list[i]); + side_road[s] = t; + if (side_limit[s] === MOUNTAIN) + side_limit[s] = GAP; + } +} + +def_side(MARSH, 176, 152); +def_side(MARSH, 179, 203); + +def_side(RIDGE, 144, 145); +def_side(RIDGE, 120, 145); +def_side(RIDGE, 121, 145); +def_side(RIDGE, 121, 146); +def_side(RIDGE, 122, 146); +def_side(RIDGE, 144, 169); +def_side(RIDGE, 144, 168); +def_side(RIDGE, 143, 168); +def_side(RIDGE, 167, 168); +def_side(RIDGE, 167, 192); +def_side(RIDGE, 191, 192); +def_side(RIDGE, 191, 216); +def_side(RIDGE, 215, 216); +def_side(RIDGE, 217, 218); +def_side(RIDGE, 217, 193); +def_side(RIDGE, 192, 193); +def_side(RIDGE, 168, 193); +def_side(RIDGE, 168, 169); +def_side(RIDGE, 69, 94); +def_side(RIDGE, 67, 92); +def_side(RIDGE, 68, 92); +def_side(RIDGE, 68, 93); +def_side(RIDGE, 65, 40); +def_side(RIDGE, 65, 64); +def_side(RIDGE, 65, 89); +def_side(RIDGE, 65, 90); +def_side(RIDGE, 66, 90); +def_side(RIDGE, 66, 91); +def_side(RIDGE, 39, 63); +def_side(RIDGE, 37, 38); +def_side(RIDGE, 36, 37); +def_side(RIDGE, 36, 61); +def_side(RIDGE, 36, 60); +def_side(RIDGE, 109, 133); +def_side(RIDGE, 108, 133); +def_side(RIDGE, 204, 179); +def_side(RIDGE, 204, 180); +def_side(RIDGE, 205, 180); +def_side(RIDGE, 31, 30); +def_side(RIDGE, 31, 55); +def_side(RIDGE, 55, 54); +def_side(RIDGE, 78, 79); +def_side(RIDGE, 30, 55); +def_side(RIDGE, 54, 79); +def_side(RIDGE, 103, 79); +def_side(RIDGE, 176, 200); +def_side(RIDGE, 176, 201); +def_side(RIDGE, 177, 152); +def_side(RIDGE, 177, 153); +def_side(RIDGE, 178, 153); +def_side(RIDGE, 153, 154); +def_side(RIDGE, 129, 154); + +def_side(MOUNTAIN, 7, 8); +def_side(MOUNTAIN, 7, 31); +def_side(MOUNTAIN, 7, 32); +def_side(MOUNTAIN, 8, 9); +def_side(MOUNTAIN, 8, 32); +def_side(MOUNTAIN, 8, 33); +def_side(MOUNTAIN, 9, 33); +def_side(MOUNTAIN, 9, 34); +def_side(MOUNTAIN, 9, 10); +def_side(MOUNTAIN, 32, 31); +def_side(MOUNTAIN, 32, 33); +def_side(MOUNTAIN, 32, 56); +def_side(MOUNTAIN, 32, 57); +def_side(MOUNTAIN, 33, 34); +def_side(MOUNTAIN, 33, 57); +def_side(MOUNTAIN, 33, 58); +def_side(MOUNTAIN, 34, 10); +def_side(MOUNTAIN, 34, 35); +def_side(MOUNTAIN, 34, 58); +def_side(MOUNTAIN, 34, 59); +def_side(MOUNTAIN, 55, 80); +def_side(MOUNTAIN, 56, 80); +def_side(MOUNTAIN, 56, 55); +def_side(MOUNTAIN, 56, 31); +def_side(MOUNTAIN, 56, 81); +def_side(MOUNTAIN, 56, 57); +def_side(MOUNTAIN, 57, 58); + +def_side(GAP, 176, 152); +def_side(GAP, 65, 40); +def_side(GAP, 65, 64); +def_side(GAP, 65, 89); +def_side(GAP, 37, 38); +def_side(GAP, 36, 37); +def_side(GAP, 36, 61); +def_side(GAP, 109, 133); +def_side(GAP, 31, 30); +def_side(GAP, 31, 55); +def_side(GAP, 55, 54); +def_side(GAP, 78, 79); +def_side(GAP, 177, 153); +def_side(GAP, 178, 153); +def_side(GAP, 129, 154); + +def_road(HIGHWAY, [151,152,128,103,78,54,30,31,7,8,9,10,35,36,37,38,39,40,64,65,66,67,68,69,70,71,72,73,74]); +def_road(HIGHWAY, [54,55,31]); +def_road(HIGHWAY, [31,32,33,9]); +def_road(HIGHWAY, [36,61,62,38]); + +def_road(TRACK, [78,79,80,81,82,58,59,35]); +def_road(TRACK, [128,104,80]); +def_road(TRACK, [83,59,60,61,86,87,88,89]); +def_road(TRACK, [37,62,87]); +def_road(TRACK, [64,89,113]); +def_road(TRACK, [62,63,64]); +def_road(TRACK, [213,189,165,141,117,93,69]); +def_road(TRACK, [72,97,121]); + +def_road(TRAIL, [152,153,178,203,204,205,181,182,183,184,185,186,187]); +def_road(TRAIL, [153,128,129,104,103]); +def_road(TRAIL, [79,55]); +def_road(TRAIL, [55,56,57,58,34,10]); +def_road(TRAIL, [58,83,107,106,130,129]); +def_road(TRAIL, [35,60,85,61]); +def_road(TRAIL, [85,86]); +def_road(TRAIL, [85,109,133,157,181]); +def_road(TRAIL, [64,88]); +def_road(TRAIL, [88,113,138,162,187]); +def_road(TRAIL, [87,112,137,162]); +def_road(TRAIL, [65,89,114,139,163,188,213]); +def_road(TRAIL, [67,91,115,140,164,189]); + +function def_offmap(a, b) { + for (let hex_id = 0; hex_id < map_w * map_h; ++hex_id) { + if (hex_id >= a && hex_id <= b) { + hex_exists[hex_id] = 0; + side_limit[hex_id * 3 + 0] = OFFMAP; + side_limit[hex_id * 3 + 1] = OFFMAP; + side_limit[hex_id * 3 + 2] = OFFMAP; + } + for (let s = 0; s < 3; ++s) { + let next_id = hex_id + next[s]; + if (next_id >= a && next_id <= b) + side_limit[hex_id * 3 + s] = OFFMAP; + } + } +} + +def_offmap(0,6); +def_offmap(11,29); +def_offmap(41,53); +def_offmap(75,77); +def_offmap(99,102); +def_offmap(124,127); +def_offmap(148,150); +def_offmap(173,175); +def_offmap(197,199); +def_offmap(222,224); + +// show spines +def_offmap(175,175, 1); +def_offmap(99,99, 1); +def_offmap(148,148, 1); +def_offmap(197,197, 1); + +// depression +def_offmap(168,168); +def_offmap(168,168); +def_offmap(192,192); +def_offmap(193,193); +def_offmap(216,217); + +// Hexes not in 2004 edition: +// def_offmap(200,202); +// def_offmap(206,212); +// def_offmap(214,221); + +// Terrain chart hexes +// def_offmap(145,146); +// def_offmap(168,172); +// def_offmap(192,196); +// def_offmap(216,221); + +// Qattara Depression and east of it +def_offmap(145,148); +def_offmap(168,172); +def_offmap(192,196); +def_offmap(216,221); + +let regions = {}; +function def_region(name, a, b) { + if (!(name in regions)) + regions[name] = []; + for (let i = a; i <= b; ++i) + regions[name].push(i); +} + +def_region("Libya", 7, 10); +def_region("Libya", 30, 40); +def_region("Libya", 54, 64); +def_region("Libya", 78, 88); +def_region("Libya", 103, 113); +def_region("Libya", 128, 138); +def_region("Libya", 151, 162); +def_region("Libya", 176, 187); +def_region("Libya", 200, 211); + +def_region("Egypt", 65, 74); +def_region("Egypt", 89, 98); +def_region("Egypt", 114, 123); +def_region("Egypt", 139, 144); +def_region("Egypt", 163, 167); +def_region("Egypt", 188, 191); +def_region("Egypt", 212, 215); + +def_region("Sidi Omar", 89, 89); +def_region("Tobruk", 37, 37); +def_region("Sollum", 65, 65); +def_region("El Agheila", 151, 151); +def_region("Mersa Brega", 152, 152); + +def_region("East Line", 36, 40); +def_region("East Line", 60, 74); +def_region("East Line", 85, 98); +def_region("East Line", 112, 123); +def_region("East Line", 137, 144); +def_region("East Line", 162, 167); +def_region("East Line", 187, 191); + +def_region("West Line", 7, 10); +def_region("West Line", 30, 35); +def_region("West Line", 54, 59); +def_region("West Line", 78, 83); +def_region("West Line", 103, 107); +def_region("West Line", 128, 130); + +def_region("Jebel el Akhdar", 7, 9); +def_region("Jebel el Akhdar", 32, 34); +def_region("Jebel el Akhdar", 56, 57); + +def_region("Sebkha el Segira", 152, 152); +def_region("Sebkha el Segira", 176, 176); +def_region("Sebket el Jeneinen", 179, 179); +def_region("Sebket el Jeneinen", 203, 203); + +def_region("Qattara Depression", 144, 146); +def_region("Qattara Depression", 168, 169); +def_region("Qattara Depression", 192, 193); +def_region("Qattara Depression", 216, 217); + +hex_name = { + 7: "El Garib", + 8: "Cyrene", + 9: "El Gubba", + 10: "Derna", + + 30: "Tocra", + 31: "Barce", + 32: "Marawa", + 33: "Wadi Cuff", + 35: "Gazala", + 36: "Acroma", + 37: "Tobruk", + 38: "Belhamed", + 39: "Gambut", + 40: "Bardia", + + 54: "Benghazi", + 55: "Er Regima", + 56: "Charruba", + 58: "Mechili", + 59: "Rotonda Segnali", + 60: "Sidi Mufta", + 61: "Bir Harmat", + 62: "El Adem", + 63: "Sidi Rezegh", + 64: "Ft. Capuzzo", + 65: "Sollum", + 66: "Buq Buq", + 67: "Sidi Barrani", + 69: "Mersa Matruh", + 70: "Fuka", + 71: "El Daba", + 72: "El Alamein", + 73: "El Hamam", + 74: "Alexandria", + + 78: "Ghemines", + 79: "Skeleidima", + 80: "Msus", + 83: "Tengeder", + 85: "Bir Hacheim", + 86: "Retma", + 87: "Bir Gubi", + 88: "Gabr Saleh", + 89: "Sidi Omar", + 90: "Bir Habata", + 91: "Sofafi", + 93: "Bir el Kenayis", + 94: "Bir Khalda", + 97: "Alam Halfa", + + 103: "Beda Fomm", + 104: "Antelat", + 106: "Ben Gania", + 113: "Ft. Maddalena", + 115: "Bir Khamsa", + 116: "Bir el Qatrani", + 121: "El Himeimat", + + 128: "Agedabia", + 129: "Jebel el Matar", + 130: "Haraga", + 141: "Bir Fuad", + + 151: "El Agheila", + 152: "Mersa Brega", + 153: "El Haseiat", + + 176: "Maaten Giofer", + 178: "Sahaba", + 187: "Jarabub Oasis", + + 204: "Jalo Oasis", + 213: "Siwa Oasis", +} + + +function expand_names() { + let hex_name2 = { } + for (let hex_id = 0; hex_id < map_w * map_h; ++hex_id) { + if (hex_exists[hex_id] && !hex_name[hex_id]) { + for (let s = 0; s < 6; ++s) { + let next_id = hex_id + nextdir[s]; + if (hex_name[next_id]) { + hex_name2[hex_id] = hex_name[next_id] + " " + nextname[s]; + break; + } + } + } + } + for (let hex_id in hex_name2) + hex_name[hex_id] = hex_name2[hex_id]; +} + +expand_names(); + +let units = []; + +const class_from_type = { + "recon": "armor", + "armor": "armor", + "i-tank": "armor", + "infantry": "infantry", + "mech. inf.": "infantry", + "mot. inf.": "infantry", + "para": "infantry", + "mob. a/t": "antitank", + "mot. a/t": "antitank", + "self prop. arty": "artillery", + "artillery": "artillery", +} + +const speed_from_type = { + "recon": 4, + "armor": 3, + "i-tank": 3, // optional rule: allied i-tanks set this to 2 + "mech. inf.": 3, + "mob. a/t": 3, + "self prop. arty": 3, + "mot. inf.": 2, + "mot. a/t": 2, + "infantry": 1, + "para": 1, + "artillery": 1, +} + +let unit_map = {}; + +function def_block(nationality, type, appearance, steps, elite, label, name) { + let type_class = class_from_type[type]; + let speed = speed_from_type[type]; + if (name in unit_map) + throw new Error("duplicate block name:", name); + unit_map[name] = units.length; + units.push({nationality, type, class: type_class, speed, appearance, steps, elite, label, name}); +} + +let S = "S"; +let M = "M"; +let T = "T"; + +//def_block("italian", battle block 1); +def_block("italian", "infantry", S, 4, 0, 12, "Tre"); +def_block("italian", "infantry", S, 4, 0, 13, "Pav"); +def_block("italian", "infantry", S, 4, 0, 14, "Bre"); +def_block("italian", "infantry", S, 3, 0, 15, "Bol"); +def_block("italian", "infantry", S, 3, 0, 16, "Sav"); + +def_block("italian", "mech. inf.", 7, 4, 0, 21, "Tri"); +def_block("italian", "infantry", 7, 2, 0, 22, "Sab"); +def_block("italian", "armor", 11, 3, 0, 23, "Lit"); +def_block("italian", "mot. inf.", 17, 3, 0, 24, "Fas"); +def_block("italian", "mot. inf.", 19, 3, 0, 25, "Cen"); +def_block("italian", "infantry", 19, 2, 0, 26, "Pis"); +def_block("italian", "para", M, 4, 0, 27, "Fol"); +def_block("italian", "artillery", S, 2, 0, 28, "Ita"); +def_block("italian", "armor", S, 4, 0, 29, "Ari"); + +//def_block("german", battle block 1); +//def_block("german", battle block 2); +//def_block("german", battle block 3); +def_block("german", "armor", S, 3, 1, 14, "21/5"); +def_block("german", "recon", S, 1, 1, 15, "21/3"); +def_block("german", "mech. inf.", S, 3, 1, 16, "21/104"); +def_block("german", "recon", 3, 1, 1, 17, "15/33"); +def_block("german", "mob. a/t", 3, 2, 1, 18, "88mm/A"); +def_block("german", "mech. inf.", 3, 3, 1, 19, "15/115"); + +def_block("german", "armor", 5, 3, 1, 21, "15/8"); +def_block("german", "recon", 5, 1, 1, 22, "90/580"); +def_block("german", "mot. inf.", 5, 2, 1, 23, "90/361"); +def_block("german", "mot. a/t", 5, 2, 1, 24, "50mm"); +def_block("german", "artillery", 7, 2, 1, 25, "/104"); +def_block("german", "mot. inf.", 7, 2, 1, 26, "90/200"); +def_block("german", "mob. a/t", 11, 2, 1, 27, "88mm/B"); +def_block("german", "mech. inf.", 11, 2, 1, 28, "90/sv288"); +def_block("german", "mech. inf.", 11, 2, 1, 29, "90/346"); + +def_block("german", "para", M, 3, 1, 31, "Ram"); +def_block("german", "infantry", M, 3, 1, 32, "164/382+433"); +def_block("german", "infantry", M, 2, 1, 33, "164/125"); +def_block("german", "mech. inf.", 3, 3, 1, 34, "90/155"); +def_block("german", "mot. a/t", 17, 2, 1, 35, "76mm"); + +// def_block("allied", bb 1 +// def_block("allied", bb 2 +// def_block("allied", bb 3 +def_block("allied", "armor", S, 2, 0, 14, "2/3"); +def_block("allied", "mech. inf.", S, 2, 0, 15, "2/SG"); +def_block("allied", "mech. inf.", S, 2, 0, 16, "4IN/3m"); +def_block("allied", "mot. inf.", S, 4, 0, 17, "9AU/20"); +def_block("allied", "mot. inf.", S, 4, 0, 18, "70/14+16"); +def_block("allied", "mot. inf.", S, 3, 0, 19, "70/23"); + +def_block("allied", "armor", T, 1, 1, 21, "Matilda/A"); +def_block("allied", "mech. inf.", T, 3, 0, 22, "7/SG"); +def_block("allied", "mech. inf.", T, 3, 0, 23, "7/22G"); +def_block("allied", "mot. inf.", T, 3, 0, 24, "/Pol"); +def_block("allied", "mot. inf.", T, 3, 0, 25, "7AU/18"); +def_block("allied", "artillery", T, 2, 0, 26, "/Tob"); +def_block("allied", "mot. inf.", 18, 4, 0, 27, "51H/152"); +def_block("allied", "self prop. arty", 18, 2, 0, 28, "Priest"); +def_block("allied", "artillery", 18, 4, 0, 29, "/C"); + +def_block("allied", "armor", 2, 4, 0, 31, "7/7"); +def_block("allied", "mech. inf.", 2, 3, 0, 32, "4IN/7m"); +def_block("allied", "mot. inf.", 2, 3, 0, 33, "4IN/5"); +def_block("allied", "mot. inf.", 2, 3, 0, 34, "4IN/11"); +def_block("allied", "armor", 4, 1, 1, 35, "Matilda/B"); +def_block("allied", "i-tank", 4, 4, 0, 36, "/1AT"); +def_block("allied", "armor", 4, 3, 0, 37, "7/4"); +def_block("allied", "recon", 4, 2, 0, 38, "7"); +def_block("allied", "artillery", 20, 3, 0, 39, "/D"); + +def_block("allied", "mot. a/t", 6, 3, 0, 41, "2#"); +def_block("allied", "mech. inf.", 6, 4, 0, 42, "2NZ/4"); +def_block("allied", "mech. inf.", 6, 4, 0, 43, "2NZ/5"); +def_block("allied", "mech. inf.", 6, 4, 0, 44, "2NZ/6"); +def_block("allied", "mot. inf.", 6, 4, 0, 45, "1SA/2+5"); +def_block("allied", "mot. inf.", 6, 3, 0, 46, "1SA/1"); +def_block("allied", "recon", 8, 2, 0, 47, "1SA"); +def_block("allied", "mot. inf.", 8, 3, 0, 48, "1SA/3"); +def_block("allied", "mot. inf.", 8, 3, 0, 49, "2SA/4+6"); + +def_block("allied", "armor", 8, 4, 0, 51, "1/22"); +def_block("allied", "i-tank", 8, 3, 0, 52, "/32AT"); +def_block("allied", "artillery", 8, 2, 0, 53, "/A"); +def_block("allied", "armor", 10, 4, 0, 54, "1/2"); +def_block("allied", "mech. inf.", 10, 3, 0, 55, "1/201G"); +def_block("allied", "mech. inf.", 10, 2, 0, 56, "1/SG"); +def_block("allied", "mot. inf.", 10, 3, 0, 57, "5IN/29"); +def_block("allied", "armor", 12, 2, 1, 58, "Grant"); +def_block("allied", "mot. a/t", 12, 3, 0, 59, "6#/A"); + +def_block("allied", "mech. inf.", 14, 2, 0, 61, "10IN/161m"); +def_block("allied", "mot. inf.", 14, 4, 0, 62, "5IN/9+10"); +def_block("allied", "mot. inf.", 14, 4, 0, 63, "10IN/21+25"); +def_block("allied", "mot. inf.", 14, 2, 0, 64, "8IN/18"); +def_block("allied", "mot. inf.", 14, 4, 0, 65, "FF/2"); +def_block("allied", "artillery", 14, 4, 0, 66, "/B"); +def_block("allied", "armor", 20, 3, 1, 67, "Sher/B"); +def_block("allied", "armor", 20, 3, 0, 68, "8/9"); +def_block("allied", "armor", 20, 3, 0, 69, "8/24"); + +def_block("allied", "armor", 16, 4, 0, 71, "10/8"); +def_block("allied", "armor", 16, 3, 0, 72, "10/23"); +def_block("allied", "mot. inf.", 16, 4, 0, 73, "9AU/26"); +def_block("allied", "mot. inf.", 16, 4, 0, 74, "9AU/24"); +def_block("allied", "mot. inf.", 16, 4, 0, 75, "44/131+133"); +def_block("allied", "mot. inf.", 16, 2, 0, 76, "44/132"); +def_block("allied", "armor", 18, 3, 1, 77, "Sher/A"); +def_block("allied", "mot. a/t", 18, 4, 0, 78, "6#/B"); +def_block("allied", "mot. inf.", 18, 4, 0, 79, "51H/154"); + +console.log("const hex_exists = " + JSON.stringify(hex_exists)); +console.log("const hex_road = " + JSON.stringify(hex_road)); +console.log("const side_road = " + JSON.stringify(side_road)); +console.log("const side_limit = " + JSON.stringify(side_limit)); +console.log("const hex_name = " + JSON.stringify(hex_name)); +console.log("const regions = " + JSON.stringify(regions)); +console.log("const units = " + JSON.stringify(units)); +console.log("if (typeof module !== 'undefined') module.exports = { hex_name, hex_road, side_road, side_limit, regions, units }"); diff --git a/tools/gentextures.sh b/tools/gentextures.sh new file mode 100644 index 0000000..cacd968 --- /dev/null +++ b/tools/gentextures.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# 2022 +# depression: c4ab8b b39e83 +# depression (old): c4bd9c +# marsh: 939874 747e5c +# mountain: b3b37d 9a9a6e +# desert: ccbda4 d6c5aa + +cat tools/wetland.pbm | pgmtoppm "#747e5c-#939874" | ppmquant 2 | pnmtopng > texture_marsh.png +#pngtopnm tools/scree_overlay@2x.png | pgmtoppm "black-#c4ab8b" | ppmquant 2 | pnmtopng > texture_scree.png +pngtopnm tools/scree_overlay@2x.png | pgmtoppm "black-#c4bd9c" | ppmquant 2 | pnmtopng > texture_scree.png +#pngtopnm tools/rock_overlay@2x.png | pnmnorm | pgmtoppm "#aaa26f-#bab079" | ppmquant 2 | pnmtopng > texture_mountain.png +pngtopnm tools/rock_overlay@2x.png | pnmnorm | pgmtoppm "#9d9d6a-#aaaa77" | ppmquant 2 | pnmtopng > texture_mountain.png +pngtopnm tools/rock_overlay@2x.png | pnmnorm | pgmtoppm "#ccbda4-#d6c5aa" | ppmquant 2 | pnmtopng > texture_clear.png +pngtopnm tools/rock_overlay@2x.png | pnmnorm | pgmtoppm "#bba487-#c4ab8b" | ppmquant 2 | pnmtopng > texture_depression.png + +for PNG in texture_*.png +do + zopflipng -y $PNG $PNG +done + +exit 0 + +OUT=textures.svg +rm -f $OUT +for PNG in texture_*.png +do +SIZE=$(file $PNG | sed 's/[^0-9]*//;s/ .*//') +echo '' >> $OUT +echo '' >> $OUT +echo '"' >> $OUT +echo >> $OUT +done diff --git a/tools/genunits.js b/tools/genunits.js new file mode 100644 index 0000000..4e0f30e --- /dev/null +++ b/tools/genunits.js @@ -0,0 +1,227 @@ +const { units } = require("../data.js"); +const print = console.log; + +print(` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`); + +SYMBOLS = { + +"armor": ` + + +`, + +"armor_elite": ` + + +`, + +"armor_itank": ` + + + +`, + +"artillery": ` + + +`, + +"infantry": ` + + +`, + +"mechanized_infantry": ` + + +`, + +"mobile_antitank": ` + + + +`, + +"motorized_antitank_new": ` + + + +`, + +"motorized_antitank_old": ` + + +`, + +"motorized_infantry": ` + + + +`, + +"paratroopers": ` + + +`, + +"recon": ` + + +`, + +"self_propelled_artillery": ` + + + +`, + +} + +const TYPEMAP = { + "armor": "armor", + "artillery": "artillery", + "i-tank": "armor_itank", + "infantry": "infantry", + "mech. inf.": "mechanized_infantry", + "mob. a/t": "mobile_antitank", + "mot. a/t": "motorized_antitank_new", + "mot. inf.": "motorized_infantry", + "para": "paratroopers", + "recon": "recon", + "self prop. arty": "self_propelled_artillery", +}; + +// 94 units + +let smcp = /(IN|AU|NZ|SA|AT|H|G)$/; +smcp = /NEVER/; + +const COLORMAP = { + "italian": "#b0c5d4", + "german": "#f9e3b3", + "allied": "#cead78", + "Pol": "#ffffff", + "FF": "#8197cd", + "NZ": "#95c3d6", + "AU": "#f48480", + "SA": "#f9a64a", + "IN": "#84c88b", +} + +const BLACK = { + italian: "#221f1f", + german: "#004e2f", + allied: "#5c3a1e" +} + +let x = 0, y = 0; +for (let u of units) { + let type = TYPEMAP[u.type]; + let black = BLACK[u.nationality]; + let fill = COLORMAP[u.nationality]; + + let [a, b] = u.name.split('/'); + if (b) + b = b.split('+'); + + for (let n in COLORMAP) + if (a.endsWith(n) || (b && b[0] === n)) + fill = COLORMAP[n]; + + print(``); + + if (type === 'armor' && u.elite && u.nationality === 'allied') + type = 'armor_elite'; + + let symbol = SYMBOLS[type]; + print(symbol.replace(/#ccc/g, fill).replace(/#111/g, black).trim()); + + if (u.elite) + print(``); + else + print(``); + + print(``); + print(`${u.appearance}`); + print(`${a}`); + + if (b) { + if (b.length > 1) { + print(`${b[0]}`); + print(`${b[1]}`); + } else { + print(`${b[0]}`); + } + } + + print(``); + print(``); + x += 51; + if (x >= 510) { + y += 51; + x = 0; + } +} +print(``); +print(``); diff --git a/tools/rock_overlay.png b/tools/rock_overlay.png new file mode 100644 index 0000000..d2c6976 Binary files /dev/null and b/tools/rock_overlay.png differ diff --git a/tools/rock_overlay@2x.png b/tools/rock_overlay@2x.png new file mode 100644 index 0000000..8710ab6 Binary files /dev/null and b/tools/rock_overlay@2x.png differ diff --git a/tools/scree_overlay.png b/tools/scree_overlay.png new file mode 100644 index 0000000..cab6b5c Binary files /dev/null and b/tools/scree_overlay.png differ diff --git a/tools/scree_overlay@2x.png b/tools/scree_overlay@2x.png new file mode 100644 index 0000000..5680582 Binary files /dev/null and b/tools/scree_overlay@2x.png differ diff --git a/tools/wetland.pbm b/tools/wetland.pbm new file mode 100644 index 0000000..aa9151c Binary files /dev/null and b/tools/wetland.pbm differ diff --git a/units.svg b/units.svg new file mode 100644 index 0000000..7e3c7cd --- /dev/null +++ b/units.svg @@ -0,0 +1,1025 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S +Tre + + + + + + + +S +Pav + + + + + + + +S +Bre + + + + + + + +S +Bol + + + + + + + +S +Sav + + + + + + + +7 +Tri + + + + + + + +7 +Sab + + + + + + + +11 +Lit + + + + + + + + +17 +Fas + + + + + + + + +19 +Cen + + + + + + + +19 +Pis + + + + + + + +M +Fol + + + + + + + +S +Ita + + + + + + + +S +Ari + + + + + + + +S +21 +5 + + + + + + + +S +21 +3 + + + + + + + +S +21 +104 + + + + + + + +3 +15 +33 + + + + + + + + +3 +88mm +A + + + + + + + +3 +15 +115 + + + + + + + +5 +15 +8 + + + + + + + +5 +90 +580 + + + + + + + + +5 +90 +361 + + + + + + + + +5 +50mm + + + + + + + +7 + +104 + + + + + + + + +7 +90 +200 + + + + + + + + +11 +88mm +B + + + + + + + +11 +90 +sv288 + + + + + + + +11 +90 +346 + + + + + + + +M +Ram + + + + + + + +M +164 +382 +433 + + + + + + + +M +164 +125 + + + + + + + +3 +90 +155 + + + + + + + + +17 +76mm + + + + + + + +S +2 +3 + + + + + + + +S +2 +SG + + + + + + + +S +4IN +3m + + + + + + + + +S +9AU +20 + + + + + + + + +S +70 +14 +16 + + + + + + + + +S +70 +23 + + + + + + + +T +Matilda +A + + + + + + + +T +7 +SG + + + + + + + +T +7 +22G + + + + + + + + +T + +Pol + + + + + + + + +T +7AU +18 + + + + + + + +T + +Tob + + + + + + + + +18 +51H +152 + + + + + + + + +18 +Priest + + + + + + + +18 + +C + + + + + + + +2 +7 +7 + + + + + + + +2 +4IN +7m + + + + + + + + +2 +4IN +5 + + + + + + + + +2 +4IN +11 + + + + + + + +4 +Matilda +B + + + + + + + + +4 + +1AT + + + + + + + +4 +7 +4 + + + + + + + +4 +7 + + + + + + + +20 + +D + + + + + + + + +6 +2# + + + + + + + +6 +2NZ +4 + + + + + + + +6 +2NZ +5 + + + + + + + +6 +2NZ +6 + + + + + + + + +6 +1SA +2 +5 + + + + + + + + +6 +1SA +1 + + + + + + + +8 +1SA + + + + + + + + +8 +1SA +3 + + + + + + + + +8 +2SA +4 +6 + + + + + + + +8 +1 +22 + + + + + + + + +8 + +32AT + + + + + + + +8 + +A + + + + + + + +10 +1 +2 + + + + + + + +10 +1 +201G + + + + + + + +10 +1 +SG + + + + + + + + +10 +5IN +29 + + + + + + + +12 +Grant + + + + + + + + +12 +6# +A + + + + + + + +14 +10IN +161m + + + + + + + + +14 +5IN +9 +10 + + + + + + + + +14 +10IN +21 +25 + + + + + + + + +14 +8IN +18 + + + + + + + + +14 +FF +2 + + + + + + + +14 + +B + + + + + + + +20 +Sher +B + + + + + + + +20 +8 +9 + + + + + + + +20 +8 +24 + + + + + + + +16 +10 +8 + + + + + + + +16 +10 +23 + + + + + + + + +16 +9AU +26 + + + + + + + + +16 +9AU +24 + + + + + + + + +16 +44 +131 +133 + + + + + + + + +16 +44 +132 + + + + + + + +18 +Sher +A + + + + + + + + +18 +6# +B + + + + + + + + +18 +51H +154 + + + + -- cgit v1.2.3