-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathrun_game.tcl
More file actions
executable file
·155 lines (138 loc) · 4.24 KB
/
run_game.tcl
File metadata and controls
executable file
·155 lines (138 loc) · 4.24 KB
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
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env tclsh
lappend ::auto_path [pwd]
package require client_utils
if {$argc < 3} {
puts "Usage $argv0 <command> <game_dir> <local_dir>"
exit 1
}
# process arguments
set cmd [lindex $argv 0]
set game_path [lindex $argv 1]
set local_path [lindex $argv 2]
puts "Running '$cmd' on '$game_path'"
# pull all turns
set turns [glob [file join $game_path "turn*"]]
### commands
proc atl_check {turn_num} {
set prev_num [expr {$turn_num - 1}]
set prev_dir [file join $::game_path [subst {turn$prev_num}]]
set cur_dir [file join $::game_path [subst {turn$turn_num}]]
# previous game.out to current game.in
set cmd [list diff [file join $prev_dir "game.out"] [file join $cur_dir "game.in"]]
puts $cmd
set out [exec {*}$cmd]
set reports [glob [file join $cur_dir "report.*"]]
foreach r $reports {
set player_num [regsub {report\.} [file tail $r] ""]
if {$player_num == 1} {
# GM report
continue
}
# report
set cmd [list diff $r [file join $::local_path$player_num turn$turn_num.$player_num]]
puts $cmd
set out [exec {*}$cmd]
# orders
if {$turn_num > 1} {
set cmd [list diff [file join $::local_path$player_num orders.$turn_num] [regsub {report} $r "orders"]]
puts $cmd
set out [exec {*}$cmd]
}
}
}
proc atl_regen {turn_num} {
set cur_dir [file join $::game_path [subst {turn$turn_num}]]
set reports [glob [file join $cur_dir "report.*"]]
foreach r $reports {
set player_num [regsub {report\.} [file tail $r] ""]
if {$player_num == 1} {
# GM report
continue
}
set local_dir [format {%s%s} $::local_path $player_num]
if {$turn_num == 1} {
puts "delete [file join $local_dir game.db]"
file delete [file join $local_dir game.db]
set jmp 4
if {$player_num == 4} {
set jmp 0
}
puts "tclsh computer_player.tcl new $local_dir -f ../rules_m.txt jump $jmp"
exec tclsh computer_player.tcl new $local_dir -f ../rules_m.txt jump $jmp
}
puts "tclsh computer_player.tcl add $local_dir turn$turn_num.$player_num"
set res [exec tclsh computer_player.tcl add $local_dir turn$turn_num.$player_num]
if {$res ne ""} { puts $res }
puts "tclsh computer_player.tcl gen $local_dir"
set res [exec tclsh computer_player.tcl gen $local_dir]
if {$res ne ""} { puts $res }
}
}
proc atl_install {turn_num} {
set prev_num [expr {$turn_num - 1}]
set prev_dir [file join $::game_path [subst {turn$prev_num}]]
set cur_dir [file join $::game_path [subst {turn$turn_num}]]
# previous game.out to current game.in
set cmd [list cp [file join $prev_dir "game.out"] [file join $cur_dir "game.in"]]
puts $cmd
file copy -force [file join $prev_dir "game.out"] [file join $cur_dir "game.in"]
set reports [glob [file join $cur_dir "report.*"]]
foreach r $reports {
set player_num [regsub {report\.} [file tail $r] ""]
if {$player_num == 1} {
# GM report
continue
}
# report
set cmd [list cp $r [file join $::local_path$player_num turn$turn_num.$player_num]]
puts $cmd
file copy -force $r [file join $::local_path$player_num turn$turn_num.$player_num]
# orders
if {$turn_num > 1} {
set cmd [list diff [file join $::local_path$player_num orders.$turn_num] [regsub {report} $r "orders"]]
puts $cmd
file copy -force [file join $::local_path$player_num orders.$turn_num] [regsub {report} $r "orders"]
}
}
}
proc atl_status {turn_num} {
set cur_dir [file join $::game_path [subst {turn$turn_num}]]
set reports [glob [file join $cur_dir "report.*"]]
foreach r $reports {
set player_num [regsub {report\.} [file tail $r] ""]
if {$player_num == 1} {
# GM report
continue
}
set local_dir [format {%s%s} $::local_path $player_num]
set errMsg [openDb [file join $local_dir game.db]]
if {$errMsg ne ""} {
puts "Could not open $local_dir game.db"
exit 1
}
set res [::db eval {
SELECT x,y,z,curTax(id,tax) as ct, tax
FROM detail
WHERE turn=$turn_num AND ct > 0
ORDER BY ct DESC
}]
foreach {x y z ct tax} $res {
puts "$player_num $turn_num $x $y $z $ct"
}
}
}
### main
if {$cmd eq "next"} {
set t [lindex [lsort -dictionary $turns] end]
set turn_num [regsub {turn} [file tail $t] ""]
atl_regen $turn_num
exit
}
foreach t [lsort -dictionary $turns] {
set turn_num [regsub {turn} [file tail $t] ""]
if {$turn_num == 0} {
# nothing happening
continue
}
atl_$cmd $turn_num
}