summaryrefslogtreecommitdiff
path: root/run.lua
blob: 357f350d467c5816b05d9e5e4a1e0becdea91f5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
--
--------------------------------------------------------------------------------
--         FILE:  run.lua
--        USAGE:  ./run.lua 
--  DESCRIPTION:  Game of Life CLI frontend
--      OPTIONS:  ---
-- REQUIREMENTS:  ---
--         BUGS:  ---
--        NOTES:  ---
--       AUTHOR:  Philipp Gesang (Phg), <megas.kapaneus@gmail.com>
--      COMPANY:  
--      VERSION:  1.0
--      CREATED:  05/08/10 13:09:52 CEST
--     REVISION:  ---
--------------------------------------------------------------------------------
--

-- check for a capable interpreter
if not (arg[-1] == "texlua" or 
        context ~= nil)     then
    print ([[

···············································································
Please use the LuaTeX interpreter or modify the sources to fit your
Lua machine of choice!
GOTO http://www.luatex.org/
···············································································
]])
    return 1
end

require "life"

local C, Cs, Ct, P, R, S, match = lpeg.C, lpeg.Cs, lpeg.Ct, lpeg.P, lpeg.R, lpeg.S, lpeg.match

local help = gol.helpers

debug = 1

function get_args ()
    gol.arg = arg
    if gol.arg[-1] == "texlua" then
        gol.machine = gol.arg[-1]
        gol.self_name = gol.arg[0]
        gol.arg[-1], gol.arg[0] = nil, nil
    elseif context ~= nil then
        -- TODO
    end

    local kv_args = function ()
        local tmp = {}
        local so = help.split_once
        for _, a  in ipairs(gol.arg) do
            local lr = so(a, "=") 
            tmp[help.strip(lr[1], "-")] = lr[2]
        end
        return tmp
    end

    return kv_args()
end

function life (current)
    -- how many frames should we draw?
    current.n       = current.kv_args.n       or 40

    -- sustaining dead cells
    current.sustain = current.kv_args.sustain or 0 -- TODO
    current.fadeout = current.kv_args.fadeout or false 

    -- check for debug flag
    if tonumber(current.kv_args.debug) == 0 then
        debug = false
    else
        debug = current.kv_args.debug or debug
    end


    -- prepare the rule
    if current.kv_args.rule then
        current.rule = gol.parse_rule (current.kv_args.rule)
    else
        current.rule = gol.parse_rule ("B3/S23") -- Conway's rule
    end

    if debug then for n, a in pairs(current.kv_args) do print(n, a)  end end
    if debug then for i, j in pairs(current.rule)    do print(i, #j) end end

    -- read the initial state (get an array of strings)
    if current.file then
        current.init = gol.parse_file (current.file)
    else
        return 1
    end

    if current.init then
        if debug then 
            gol.pre_frame(current.init)
        end
        local many = gol.frames( current.init, current.rule, current.n )
        gol.pre_movie (many, true)
    else
        io.write"\nCheck your input file for consistency, please.\n"
        return 1
    end
    return 0
end

function eca(current)
    local eca = require "eca"
    -- how many lines to draw
    current.n = tonumber(current.kv_args.n) or 30
    current.aspect = tonumber(current.kv_args.aspect) or 3/4
    current.rule = eca.gen_rule(tonumber(current.kv_args.rule) or 110)
    current.from = eca.parse_file(current.kv_args.file)
    current.framesize = math.floor(current.aspect * current.from:len())

    for n=1,current.n,1 do
        gol.pre_section(current.from:len(), n)
        eca.successive(current)
    end
    return 0
end

function main ()
    local current = {}
    current.kv_args = get_args()
    current.file = current.kv_args.file or "10x10_glider.gol"

    local p_suf = P"." * (1-P".")^3 * -P(1)
    local p_fn  = (1-p_suf)^1 * C(p_suf)
    local suffix = p_fn:match(current.file) or ".gol" -- assume .gol format as default

    if suffix == ".eca" then
        return eca(current)
    else
        return life(current)
    end
end

if not context then
    return main()
end