Browse Source

Look in the right places for configs, start on board generation

Josh Bicking 4 years ago
parent
commit
46e33737a2
10 changed files with 801 additions and 64 deletions
  1. 79 5
      Cargo.lock
  2. 1 0
      Cargo.toml
  3. 42 0
      example_confs/average.yaml
  4. 35 0
      example_confs/easy.yaml
  5. 23 0
      example_confs/hard.yaml
  6. 31 0
      example_confs/very_easy.yaml
  7. 480 0
      example_confs/very_hard.yaml
  8. 69 6
      src/board.rs
  9. 34 32
      src/config.rs
  10. 7 21
      src/main.rs

+ 79 - 5
Cargo.lock

@@ -5,6 +5,14 @@ name = "argparse"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "c2-chacha"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "cc"
 version = "1.0.45"
@@ -26,13 +34,24 @@ version = "0.1.0"
 dependencies = [
  "argparse 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "pancurses 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "getrandom"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "libc"
-version = "0.2.62"
+version = "0.2.65"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -54,7 +73,7 @@ version = "5.99.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -63,7 +82,7 @@ name = "pancurses"
 version = "0.16.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "ncurses 5.99.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pdcurses-sys 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -76,7 +95,7 @@ version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -84,6 +103,11 @@ name = "pkg-config"
 version = "0.3.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "ppv-lite86"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "proc-macro2"
 version = "1.0.5"
@@ -100,6 +124,43 @@ dependencies = [
  "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "rand"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "serde"
 version = "1.0.101"
@@ -144,6 +205,11 @@ name = "unicode-xid"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "wasi"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "winapi"
 version = "0.3.8"
@@ -181,23 +247,31 @@ dependencies = [
 
 [metadata]
 "checksum argparse 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3f8ebf5827e4ac4fd5946560e6a99776ea73b596d80898f357007317a7141e47"
+"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb"
 "checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be"
 "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
 "checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
-"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
+"checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407"
+"checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8"
 "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
 "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
 "checksum ncurses 5.99.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15699bee2f37e9f8828c7b35b2bc70d13846db453f2d507713b758fabe536b82"
 "checksum pancurses 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d3058bc37c433096b2ac7afef1c5cdfae49ede0a4ffec3dfc1df1df0959d0ff0"
 "checksum pdcurses-sys 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "084dd22796ff60f1225d4eb6329f33afaf4c85419d51d440ab6b8c6f4529166b"
 "checksum pkg-config 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "72d5370d90f49f70bd033c3d75e87fc529fbfff9d6f7cccef07d6170079d91ea"
+"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b"
 "checksum proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0"
 "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412"
+"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853"
+"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
 "checksum serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd"
 "checksum serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e"
 "checksum serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35"
 "checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
 "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
 "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
 "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

+ 1 - 0
Cargo.toml

@@ -8,3 +8,4 @@ pancurses = "0.16.0"
 argparse = "0.2.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_yaml = "0.8"
+rand = "0.7.2"

+ 42 - 0
example_confs/average.yaml

@@ -0,0 +1,42 @@
+words:
+  - "CONQUEROR"
+  - "CONSISTED"
+  - "WONDERFUL"
+  - "COMMITTEE"
+  - "SURRENDER"
+  - "SUBJECTED"
+  - "CONVICTED"
+  - "FORBIDDEN"
+  - "FORTIFIED"
+  - "COLLECTED"
+  - "CONTINUED"
+  - "PERIMETER"
+  - "SOUTHEAST"
+  - "RELEASING"
+  - "SOMETHING"
+  - "ACCEPTING"
+  - "MUTATIONS"
+  - "GATHERING"
+  - "LITERALLY"
+  - "REPAIRING"
+  - "INCESSANT"
+  - "INTERIORS"
+  - "REGARDING"
+  - "TELEPHONE"
+  - "OBTAINING"
+  - "EXTENSIVE"
+  - "DEFEATING"
+  - "REQUIRING"
+  - "UNLOCKING"
+  - "RECYCLING"
+  - "INSTINCTS"
+  - "BARTERING"
+  - "COMMUNITY"
+  - "BATTERIES"
+  - "RECEIVING"
+  - "INCLUDING"
+  - "INITIALLY"
+  - "INVOLVING"
+  - "MOUNTAINS"
+
+choose: 14

+ 35 - 0
example_confs/easy.yaml

@@ -0,0 +1,35 @@
+words:
+  - "STATING"
+  - "HEALING"
+  - "COSTING"
+  - "REASONS"
+  - "SEASIDE"
+  - "SPARING"
+  - "CAUSING"
+  - "CRAFTED"
+  - "PRISONS"
+  - "PRESENT"
+  - "DEALING"
+  - "SETTING"
+  - "LEAVING"
+  - "VERSION"
+  - "DEATHLY"
+  - "BLAZING"
+  - "GRANITE"
+  - "TESTING"
+  - "TRAITOR"
+  - "STAMINA"
+  - "TRINITY"
+  - "CALLING"
+  - "TALKING"
+  - "ACQUIRE"
+  - "WELCOME"
+  - "DECRIES"
+  - "FALLING"
+  - "PACKING"
+  - "ALLOWED"
+  - "SELLING"
+  - "AFFRONT"
+  - "WALKING"
+
+choose: 11

+ 23 - 0
example_confs/hard.yaml

@@ -0,0 +1,23 @@
+words:
+  - "DISCOVERING"
+  - "ELIMINATING"
+  - "UNIMPORTANT"
+  - "MISTRUSTING"
+  - "MANUFACTURE"
+  - "RADIOACTIVE"
+  - "EXCLUSIVELY"
+  - "BOMBARDMENT"
+  - "DECEPTIVELY"
+  - "INDEPENDENT"
+  - "UNBELIEVERS"
+  - "EFFECTIVELY"
+  - "IMMEDIATELY"
+  - "INFESTATION"
+  - "DESCRIPTION"
+  - "INFORMATION"
+  - "REMEMBERING"
+  - "NIGHTVISION"
+  - "DESTRUCTION"
+  - "OVERLOOKING"
+
+choose: 7

+ 31 - 0
example_confs/very_easy.yaml

@@ -0,0 +1,31 @@
+words:
+  - "FRIED"
+  - "TREES"
+  - "RIGID"
+  - "HIRED"
+  - "TRIES"
+  - "WRITE"
+  - "TRIED"
+  - "GREED"
+  - "DRIED"
+  - "BRAIN"
+  - "SKIES"
+  - "LAWNS"
+  - "GHOST"
+  - "CAUSE"
+  - "PAINT"
+  - "SHINY"
+  - "MAKES"
+  - "GAINS"
+  - "THIEF"
+  - "BASES"
+  - "RAISE"
+  - "REFER"
+  - "CARES"
+  - "TAKEN"
+  - "WAKES"
+  - "WAVES"
+  - "WARNS"
+  - "SAVES"
+
+choose: 7

+ 480 - 0
example_confs/very_hard.yaml

@@ -0,0 +1,480 @@
+words:
+  - "INFILTRATION"
+  - "ORGANIZATION"
+  - "AUTHENTICITY"
+  - "APPRECIATION"
+  - "SPOKESPERSON"
+  - "LABORATORIES"
+  - "INITIATEHOOD"
+  - "SUBTERRANEAN"
+  - "PURIFICATION"
+  - "TRANSMISSION"
+  - "CIVILIZATION"
+  - "CONSTRUCTION"
+  - "RESURRECTION"
+  - "REPRIMANDING"
+  - "ACCOMPANYING"
+  - "OVERWHELMING"
+  - "CONVERSATION"
+  - "NORTHERNMOST"
+  - "TRANSCRIBING"
+  - "ANNOUNCEMENT"
+  - "SECLUTIONIST"
+
+choose: 13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# ................................................................'',,,,,,'''''''''''............................................................
+# ..............................................................'''''','''..''..................................................................
+# ..........................................................,clodoc:;,,''''''''.................................................................
+# ........................................................;dk00OOOkkxdoc:;,'......................',,;:;;;,'....................................
+# ........................................................o000000OOOOOOkkkxdlllc:;::::;;:lccloooddxxxkkkkkxdl;..................................
+# .......................................................ckOOO00000000OOOOO0OOOOOkOOOOOkOOOOOOOOOOOOOkkkkkkxxxl'................................
+# .......................................................o0kkOOOOOO00OOO000000OOOOOOOOOOOOOOOOOOOOOOkkkxxxxdddxl................................
+# ......................................................;k0kxddxkkkOOOkOOOOOOOOOOOOOOOOOOOOOOOOOOkkkxxdddooooddd:...............................
+# ......................................................c00kxl,;:clodxxddxxxxxxxxxxkkxxxkkxxxxxxxxddoolllcoddxxx:...............................
+# ..........................;oddxoc:,...............;:;'cO0kxc...;dO0000OOOkkxl::coodxkxxxdddol:::;:;;;,',oxxxxx:...............................
+# .........................lk00OOkOkkd;............;xOx::k0kxc.'o0KKKXX0xodddOO:'o00KKXK0OOO00Odc'.......:xxxxxx:...............................
+# ........................;k0OOkkkkxxxxl'..........,xOxc,d0Oxc'oKXXKKXXk;.''.;OdcOXKKXXk:,;;;o0K0x;.....;oxxxxxo,.......'.......................
+# .......................'dOOkkkkxxxdddkd'..........;kkc':k0Ol:OXKKK0000kxdlcoOxoOK00KKx,....,kK00k;...,oxxxxxd;.......;looc,...................
+# .......................'x0kkkkxxxdoodkd,',,,'''''.'lOl''lO0xoOK0Okxxk00000000OOOOkkkkkdc::lxO00O0l..:oddddxo;......'cxkxdxo'..................
+# .......................,x0kkxxxxdolodkd,',,,,,,,,,'lOx:,cx00O000OkxxxO0000000OkxdllodxkOkkOOOOkkkl,cxxddddl,.......:xkxocoo,..................
+# ....................''.:kOkkxxddolloddc''''''',,,''lkOkxO00000000000000000000OOOkkkkkOOOOOkkkkkxoloxxxdoc;........:dxdl::od,..................
+# ..................',,,;lkOkkxxddolooxo;.''''''''',:d000000000000000000000000000000000OOOOOOOOkkkkkkxxo;.........':dxlc:::lo,..................
+# ................',,,,;lxOOkkxxxddooxd:''''''',''cxO000000000000000000000000000000000000OOOOOOOOOkkkkkdl:'.....':oxdc::c::oc'..'''.............
+# .............'''''',cxOOOOkkkxxxdooxd;.''''''';oO0000000000000000000000000000000000000OOOOOOOOOOkkkkkkkkxdc;';lxdl::cllclo;...................
+# .............';ccclxO00000000OOkkxdxd;.''''',ck0000000OOOOO000000OOOOOO0OOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkxxxdl:::ccllll:...............''...
+# ...........';lk000000K0000000OOOkkxkd,.'''',oO000O00OO00000000000O00OOO0OOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkxxxxxdoc::cccc:,...............''''.
+# .........,cdO0KK0000000000OOOkkkxxxkkc'''',lOOkkkkkxxxxkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOkkkkkkkkxxxxxxxxxxxxdc:::::;'..............'..'.
+# .......:dO0K00000000000OOkxddddddddxkkl''';dxodddkOdoxxkOkllxOOOOkdlccodxxxddddddxxxxxkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxoc::::,...................
+# ','...:kKK00000000OOOOkxdollllllloodxko,'':xxlx0OKX0k0XXXXkkKXXXXX0OdokKKKK0Okl:okkddollcllooooddxxxxxxxxdddddddxxxxxxoc:;,...................
+# '....;kKK0000000OOOOkkxxddddxxddddddxxc''':kOxO0O0K0kOKKKKOOKXXKXXK0kx0XXXXKK0xoOKKK00ko:lxxxoolcclllooodddddddddxxxxxxo;,'...................
+# ....,d0K0000000000000000000000OOOOkkkx:'';d0Ok0K0KX0O0KKXKO0KXKKXXKKOkKKKKKKK0xdOK00OOkdcdOOOkkd:cddddccoolooooddddxxdxd:'....................
+# ...,dKK000000000000000000000000OOOkkkOd,':k0kk0OKXXOOKXXXKOKXXXXXXKKOOKXXXXXKKkx0XKK0OkdlxOOkkxo:cddxdc:ddloo:coddddxxdxo'....................
+# ..;d0K000000000000000000000000OOOkkxxxkd,:kKOOOxk0kod0KK0xlxKXXXXXOxdd0XXXXXXKxdKXXXK00xoxKK00Oxlokxxdccdocol:ldxxdddxxxc.....................
+# .;x0K0000000000000000000000OOkkkxxxxxxkOd:o00000OOOkkkOOkdodkOOOOxolllokOOOOkdc:dO000Okd:lOK00OxclOkxxl:dxoodxxxxxxxxxxo,.....................
+# ;x0K00000000000000000OOOOkkxxdddoodddxkOd;;x0OOOO0O00000000000OOOOOOOOkkkkxxxdddddxkxxdlccoxxdxdccxxxxooxkxxxxxddddxxxx:......................
+# ;OK0000000000000OOOOkkxxdddooodooooddxkd:,,:xOkkkkxxxxxxxxxxxkkkkkkkkkkkkkOOOOOOOOkkkkkkkkkkxxxkxxxkkxxxxxdddddddxxxxxl.......................
+# :OK000000000000OOOOkkkkkkkkkkkkxxxxxxxo:;;,,lkOkkkkkxxxxddddddddddddddddooddddddddddddddddddddxxdddddddddddddddxxxxxxl'.......................
+# :0K0000000000000000000000000000OOOOkkko;,;;;;oOOkkkkkkkkkkkkxxxxxxxxxxxxddddddoooooooooooooooooooooodddddddxxxxxxxkdc'........................
+# c0K000000000000000000000000000000OOkxkOd:,;;,;dOOkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddddxxxxddxxxxxxxxxd;...............,'.........
+# d0K0000000000000000000000000000OOOkxxxkOx:,;;cxOOOkkkxxxxxxxxxdxddddddddddddddddddddddddddddddxOOO00000Okxxxdxxxdxdlcc::;,........cxxddol;,c:,
+# k0000000O00000000000000000OOOkkkxxxddxkOxc;;,ck0OOkkxxxxxxddddddddddddddddddddddddddddddoooodk0XXKKKKKXXXOdollddxOKK000OOxl;.....;dOKKK0kllk0x
+# OO0000000000OOOOOOOOOOOkkxxddddooooddxkd:;;;:oO0OOOOkkxxxxdddxddddddddddddddddddddddddddooookKXXXK0kddk00dlccoxOKXXKKKKKXKOxl;..;dkKXKKXOdx0X0
+# OOO00O000000OOOOOkkkxddddddxxkkkkxxxxdl;;;;,ck0OOOOOOOOkkxxxxxxdxxdddddddddddddddddddddddoooOXXXXKdccloddollldOXXXKkxdokKXXKko:,lk0KKKKKK00KKO
+# lkOOOOO000000OOOOOOOOOOOOkkkOOOOOOOOkd:;;;:,,d0OOOOOOOOOOOOkkkxxxxddddxxddddddddddddddddddolo0XXXKkdlldxOkdlookXXX0oclcoOKXXkc:cd0KKX0xkXX0OK0
+# ':dOOOO0000OO00OOOOOOO00000OOO0OOOOkkOkl;,'..;x0OOOOOOOOOOOOOOOOkkkxxxddxddxxxddxddddddddddoldKXXXKK0O0KXXOolldKXXKOkxxOKKXKxccd0XKKXOcckOolO0
+# ,;:lxOOOOOkxkO000Okxxk000OOkxkOOOOkdodko;'',;,;lkOOkkxxkOOOkkxxkkkkkkxocllllodooodddddooollllldxkkOKKXX0OxxolllxOO0KXXKKK00kollokO0XKd;,cc;l00
+# ccccldkkxxxdddxkxxddddxkkxxddddxxdooddo:',;;;;;,:oxxxddxxkxxddddxkkxxdddoccccccccccccccccc:::ccclclodxdl::lllloolclodkkxocccc::::clddl;.,,,lOO
+# 0OOOOOO0OOOOOOOOkkOkkkkkkkkkxxxxxdddxxoccccccccc::codddddddddddddddddddddlccccccccccccccccc::codddoolllclloddddooollccc::::cccclc:;,;:,';,:ll:
+# KKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKK00K0000000000OOOOOO0OOOOOOOOOkkOkkkkkkxxxxddddddooooollllldxxddddddddddddoooooooooolllllllllcc:;;;;;;;;;;,'
+# K0KKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0000000O000000OOOOOOOOOOOkkkkkkkkkxxxxxxxddddollllllllccc:
+# KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000KK00KKK0000000000000000000000000000000000000000000OO0k
+# KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK00KKKKKK00000KK00000000000000000000000000000000000000000k
+# KKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXo;dXXKXXklxKXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK0OKKKKKK00KKKKKK0KKKKKK00KK000K00000K000000000000000000000000000O
+# KXXXXKKKKKKKKKKKKKKKKKKKKKKKKXN0;,kNNN0ccOXXXK000KXXXKKXXKKKKKXKKXKKKXKKKKKXXd;dXXKXXo:kXKKKKKKKKKKKKKKKKK0KKKKX0dx0K0KK000000000000000000000O
+# XXXXXKXXXXXXXXKXKKKKKKKKKKKKKKXNO;:0WXdlONNKkdkkxoxKNOcoxxOKxlkXXX0xxOXXXKKXXd'oXNXNXl'dNXKOOkkOKXXK00K00KKKKK0XK:;0XKKK000KKK00K00KK00000000O
+# XXXXXXXXXXXXXXXXKKXXXXXXXKKXXKXXNk,oKkoOXNXdlk0K0o,dNO:l0KKN0;;ONXd:o0XXXKXXXd':kOkkk:'dNXkxkOxccONKo:dxx0X0ddxkd;;OXKKK00KKKKKKKKKKK00KKK000O
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXNNd;coOXNNXo:xK00OxON0:oXNXXN0cc0xloONXXXXXXNx,l00O0O:'xNX0kkO0o'oNXo;kXKXKlc0XX0:;OXKKKKKKKKKKKKKKKKKKKKKKKKO
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXNXxcxXNXXNKxoxkkkOKW0cdXNXXXN0c;ckXNNXXXXXXNO;lXNXNNo,xNO:cOKKd'oXNd:ONXNKc:KNNKl:OXXKKKKKKKKKKKKKKKKKKKKKKKO
+# NNNXXXXXXXNXXXXXXNNXXXXNNXXXXNNNNXNNXXNNNXXNNXK00KXNNX00NNNXXXKd:xXNNNXXXXXXNKdxXNXNNxlONXdldkkxlo0NkcONXXNOllxkko:kXXKKKKKKKKKKKKKKKKKKKKKKK0
+# NNNNNNXXXXNXNNXXNNNNNNNXNXNNNNNNNNNNNXNXNXXNNNNNNNNXXXNNXNNNKkxx0XNNNXXNXXNXXXXXNNXXNXXXXXNXKKXXXKXXX0KXXXXXX0kOKKO0XXXXXXXKKXKKXKKKKKKKKKKKK0
+# NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXNNNNNNNNNXNNXNNNNNXXXNNNNNNNNNNNXXNNXXXNNNXXXXXXNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKXXXXKKKKK0
+# dddxxxxxxkkkkkOOOOO000000KKKKKKXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXNNNXXXNNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKXXKKKKKKX0
+# ddddoooooooollllllllllllllllllllllllllllllllooooooooooodddxxxxxxxkkkkkOOOO0O0000000KKKKKKKKXXXXXXXXXXXXXXNNNNNXXNXXNXXXXXXXXXXXXXXXXXXXXXXXKX0
+# KKKKKKKKKKKKKKKKKKK0K00000000OOOOOOOkkkkkkkxxxxxxdddddoooooooooooooooooooooooooooooooolollllloooooooooooooollooooooooodddddxxxxxxxxxxkkkkkkOOk
+# KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK000000000OOOOOOOOOOkkkkkxxxdddddooooooollllllllccccccccccc:
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXKXXXXXXXKKKKKKKXXKKKKKKKKXXXKKKKXXXKKKKKKKKKXXKKKKKXKXXXXXKKXXXXKXXKKXKKKKKXKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKKKK0

+ 69 - 6
src/board.rs

@@ -4,21 +4,32 @@ use self::pancurses::{
     Window,
     COLOR_GREEN, COLOR_BLACK
 };
+
+extern crate rand;
+use self::rand::Rng;
+use self::rand::prelude::SliceRandom;
+
 use std::{thread, time};
 
-// Board control and interaction. The view & controller for the game.
+use config::{Config};
+
+// Board control and interaction. The view & controller.
 
 mod board {}
 
+const ROWS: usize = 17;
+const COLS: usize = 24;
+
 pub struct Board {
-    pub w: Window
+    pub w: Window,
+    attempts_left: u8
 }
 
 pub fn init_board() -> Board {
     let window = initscr();
     noecho();
     window_enable_colors();
-    Board{w: window}
+    Board{w: window, attempts_left: 4}
 }
 
 // Different actions are printed to the console at different speeds (the terminal displaying output, vs the player "typing")
@@ -37,12 +48,23 @@ impl Board {
 
     }
 
-    pub fn initialize_game(&self) {
+    pub fn initialize_game(&self, conf: Config) {
         self.print_with_delay(0, String::from("ROBCO INDUSTRIES (TM) TERMLINK PROTOCOL"), false, TERMINAL_PRINTING_SPEED);
         self.print_with_delay(1, String::from("ENTER PASSWORD NOW"), false, TERMINAL_PRINTING_SPEED);
-        // TODO ATTEMPTS LEFT should be a mapping or generator
+        self.print_with_delay(
+            3,
+            self.attempts_display(),
+            false,
+            TERMINAL_PRINTING_SPEED
+        );
+
+        let border_hex = *border_hex_gen();
+        let mut b = *garbage_board();
+
+        let shuffled_words = copy_shuffle(&conf.words);
+
+        // TODO: insert each word, of size N, into the array, with at least 1 character between each
 
-        // Start at some hex value
     }
 
     pub fn end_window(&self) {
@@ -65,6 +87,11 @@ impl Board {
             thread::sleep(delay);
         }
     }
+
+    fn attempts_display(&self) -> String {
+        format!("{} ATTEMPT(S) LEFT:{}", self.attempts_left, " *".repeat(self.attempts_left as usize))
+    }
+
 }
 
 fn window_enable_colors() {
@@ -73,3 +100,39 @@ fn window_enable_colors() {
         init_pair(1, COLOR_GREEN, COLOR_BLACK);
     }
 }
+
+fn border_hex_gen() -> Box<[u32; ROWS * 2]> {
+    // Build the hex values, printed alongside the text and garbage.
+    // TODO: this would make a nice generator, once those are stable.
+    let mut rng = rand::thread_rng();
+    let mut hex = rng.gen_range(0,200) + 63744;
+
+    let mut ls: [u32; ROWS * 2] = [0; ROWS * 2];
+    for i in 0..ROWS * 2 {
+        ls[i] = hex;
+        hex += 12;
+    }
+
+    Box::new(ls)
+}
+
+fn garbage_board() -> Box<[[char; COLS]; ROWS]> {
+    let g: Vec<char> = "!@#$%^*()_-=+\\|/[]{}?\"\':;,.<>".chars().collect();
+    let mut b: [[char; COLS]; ROWS] = [['\0'; COLS]; ROWS];
+    let mut rng = rand::thread_rng();
+
+    for i in 0..ROWS {
+        for j in 0..COLS {
+            b[i][j] = *g.choose(&mut rng).unwrap();
+        }
+    }
+
+    Box::new(b)
+}
+
+fn copy_shuffle<T: Clone>(vec: &Vec<T>) -> Vec<T> {
+    let mut rng = rand::thread_rng();
+    let mut vec = vec.clone();
+    vec.shuffle(&mut rng);
+    vec
+}

+ 34 - 32
src/config.rs

@@ -13,18 +13,24 @@ mod config {}
 
 #[derive(Debug, PartialEq, Deserialize)]
 pub struct Config {
-    foo: String
+    pub words: Vec<String>,
+    pub choose: u32
 }
 
-const CONFIG_FOLDERS: &'static [&'static str] = &["XDG_CONFIG_HOME", "HOME"];
+// const CONFIG_FOLDERS: &'static [&'static str] = &["XDG_CONFIG_HOME", "HOME"];
 
 pub fn default_config_file() -> String {
-    // TODO cycle through to find config file
-    for f in CONFIG_FOLDERS {
-        match env::var(f) {
+    let config_folders = [
+        env::var("XDG_CONFIG_HOME"),
+        env::var("HOME").and_then(|s| Ok(String::from(Path::new(&s).join(".config").to_str().unwrap()))),
+        Ok(String::from("./"))
+    ];
+
+    for f in config_folders.iter() {
+        match f {
             Err(_) => continue,
             Ok(dir) => {
-                let config_file_location = Path::new(&dir).join("/fallout-terminal.yaml");
+                let config_file_location = Path::new(dir).join("fallout-terminal.yaml");
                 if Path::is_file(&config_file_location) {
                     return config_file_location.into_os_string().into_string().unwrap()
                 }
@@ -32,24 +38,7 @@ pub fn default_config_file() -> String {
         }
     }
 
-    // TODO fallback to HOME/.config
-    let config_dir = match env::var("XDG_CONFIG_HOME") {
-        Ok(dir) => dir,
-        // This will usually be $HOME/.config
-        Err(_) => match env::var("HOME") {
-            Ok(home) => [home, "/.config".into()].concat(),
-            Err(_) => {
-                println!("Could not determine config directory");
-                exit(1);
-            }
-        }
-    };
-
-    // Throw fallout-terminal.yaml onto that
-    let mut config_location = String::from(&config_dir);
-    config_location.push_str("/fallout-terminal.yaml");
-
-    config_location
+    String::from("")
 }
 
 pub fn load_config_file(config_file_path: String) -> Config {
@@ -62,16 +51,16 @@ pub fn load_config_file(config_file_path: String) -> Config {
     };
 
     let mut config_str = String::new();
+    let config: Config;
     match config_file.read_to_string(&mut config_str) {
         Ok(_) => {
-            let config: Config = match serde_yaml::from_str(&config_str) {
+            config = match serde_yaml::from_str(&config_str) {
                 Ok(conf) => conf,
                 Err(e) => {
                     println!("Could not parse YAML in {}: {}", config_file_path, e);
                     exit(1);
                 }
             };
-            return config
         }
         Err(e) => {
             println!("Could not read {}: {}", config_file_path, e);
@@ -79,10 +68,23 @@ pub fn load_config_file(config_file_path: String) -> Config {
         }
     };
 
-    // DEBUG: seeing yaml values
-    // let mut out_str = String::new();
-    // let mut emitter = YamlEmitter::new(&mut out_str);
-    // for x in &config {
-    //     println!("{:?}", emitter.dump(x).unwrap());
-    // }
+    validate(&config);
+    config
+
+}
+
+
+fn validate(config: &Config) {
+    if config.words.is_empty() {
+        println!("Config file validation error: word list must not be empty");
+        exit(1)
+    }
+
+    let first_len = config.words[0].len();
+    for s in &config.words[1..] {
+        if s.len() != first_len {
+            println!("Config file validation error: All words must be the same length [len({}) != len({})]", config.words[0], s);
+            exit(1)
+        }
+    }
 }

+ 7 - 21
src/main.rs

@@ -4,21 +4,16 @@ mod config;
 mod board;
 
 use self::argparse::{ArgumentParser, Store};
-use std::process::{exit};
 
 fn main() {
 
     // Argument handling
     let mut config_location = config::default_config_file();
     let config_help = format!("Config file location, default {}", config_location);
-    let mut difficulty = String::from("");
 
     {
         let mut ap = ArgumentParser::new();
         ap.set_description("A Fallout terminal minigame inspired game.");
-        ap.refer(&mut difficulty)
-            .add_option(&["--difficulty"], Store, "The game's difficulty (veryEasy [default], \
-                                                   easy, average, hard, or veryHard)");
 
         ap.refer(&mut config_location)
             .add_option(
@@ -29,26 +24,17 @@ fn main() {
         ap.parse_args_or_exit();
     }
 
-    match difficulty.as_str() {
-        "" | "veryEasy" => {
-            println!("veryEasy");
-        },
-        _ => {
-            println!("Invalid difficulty, see --help");
-            exit(1)
-        }
-    }
     // Config file handling
-    let mut config = config::load_config_file(config_location);
-    println!("{:?}", config);
+    if config_location == "" {
+        panic!("No default config file found, and no config file path specified")
+    }
 
-    // TODO config overrides
+    let config = config::load_config_file(config_location);
 
     let board = board::init_board();
     board.intro();
 
-    // Lower-level stuff
-    board.w.refresh();
-    board.w.getch();
-    board.end_window();
+    board.w.clear();
+
+    board.initialize_game(config);
 }