First Working Version :checkered_flag:

Code is DRY but needs a lot of refinement. Possible rules changes.