1#!/usr/bin/wish
2wm title . "Koules 1.4"
3# This is simple user (anti)friendly dialog for starting koules
4# Only reason why I did it is that I wanted to try tcl/tk
5#files - configure here if paths are differ
6set xkoules "/usr/bin/X11/xkoules"
7set koulessvga "/usr/local/bin/koules.svga"
8set koulessound "/usr/local/lib/koules/creator1.raw"
9set config "~/.xkoules.opt"
10set revision 1.1
11# Set default
12set GameMode Single
13set Shm 1
14set private 0
15set Fullscreen 0
16set ScreenSize "-l"
17set Sound 1
18set Monochrome 0
19set blackwhite 0
20set Cursor 0
21set Level 1
22set Host localhost
23set Deatmatch 0
24set SPort 12345
25set CPort 12345
26set Difficulty 2
27set SScreenSize -l
28if {[file exists $config] == 1} {
29  set FileId [open $config "r"]
30  if {[gets $FileId] == $revision } {
31  set GameMode [gets $FileId]
32  set ScreenSize [gets $FileId ]
33  set private [gets $FileId ]
34  set blackwhite [gets $FileId ]
35  set Cursor [gets $FileId ]
36  set Shm [gets $FileId ]
37  set Monochrome [gets $FileId ]
38  set Sound [gets $FileId ]
39  set Fullscreen [gets $FileId ]
40  set CPort [gets $FileId ]
41  set Host [gets $FileId ]
42  set SPort [gets $FileId ]
43  set Level [gets $FileId ]
44  set Difficulty [gets $FileId ]
45  set Deathmatch [gets $FileId ]
46  set SScreenSize [gets $FileId ]
47  } else {puts "Ignoring config file...another version"}
48  close $FileId
49}
50
51frame .gamemode -relief raised -borderwidth 3
52radiobutton .gamemode.single \
53   -value "Single"\
54   -variable GameMode\
55   -text "Single"\
56   -command "SetMode"
57radiobutton .gamemode.client \
58   -value "Client"\
59   -variable GameMode\
60   -command "SetMode" \
61   -text "Client"
62radiobutton .gamemode.server \
63   -value "Server"\
64   -variable GameMode\
65   -command "SetMode"\
66   -text "Server"
67
68pack .gamemode.single\
69     .gamemode.client\
70     .gamemode.server\
71   -side left -expand yes
72frame .buttons -relief raised
73frame .single -relief raised
74frame .single.size -relief raised
75frame .single.gameopt -relief raised
76frame .server -relief raised
77frame .server.left -relief raised
78frame .server.left.size -relief raised
79frame .server.left.data -relief raised
80frame .server.text -relief raised
81frame .server.difficulty -relief raised
82
83radiobutton .server.difficulty.0 \
84   -value "0"\
85   -variable Difficulty\
86   -text "Nightmare"
87radiobutton .server.difficulty.1 \
88   -value "1"\
89   -variable Difficulty\
90   -text "Hard"
91radiobutton .server.difficulty.2 \
92   -value "2"\
93   -variable Difficulty\
94   -text "Medium"
95radiobutton .server.difficulty.3 \
96   -value "3"\
97   -variable Difficulty\
98   -text "Easy"
99radiobutton .server.difficulty.4 \
100   -value "4"\
101   -variable Difficulty\
102   -text "Very easy"
103radiobutton .server.left.size.s \
104   -value "-l"\
105   -variable SScreenSize\
106   -text "350x200 and 640x480"
107radiobutton .server.left.size.m \
108   -value "-W"\
109   -variable SScreenSize\
110   -text "320x200 and 640x380"
111radiobutton .server.left.size.l \
112   -value "-E"\
113   -variable SScreenSize\
114   -text "900x600"
115checkbutton .server.left.size.deathmatch \
116   -variable Deathmatch\
117   -text "Deathmatch"\
118   -command "SetDeath"
119frame .server.left.data.level
120frame .server.left.data.port
121label .server.left.data.level.label -text Level
122label .server.left.data.port.label -text Port
123entry .server.left.data.level.entry -relief sunken -width 3 -textvariable Level
124#.server.left.data.level.entry insert 0 $Level
125entry .server.left.data.port.entry -relief sunken -width 6 -textvariable SPort
126#.server.left.data.port.entry insert 0 $SPort
127frame .client
128label .client.hostlabel -text Host
129label .client.portlabel -text Port
130entry .client.host -relief sunken -textvariable Host
131entry .client.port -relief sunken -width 6 -textvariable CPort
132#.client.host insert 0 $Host
133#.client.port insert 0 $CPort
134pack .client.hostlabel\
135     .client.host\
136     .client.portlabel\
137     .client.port -side left -fill x
138#server.gameopt.level insert $Level
139pack .server.left.data.level.label\
140     .server.left.data.level.entry -side left -fill x
141pack .server.left.data.port.label\
142     .server.left.data.port.entry -side left -fill x
143pack .server.left.data.port\
144     .server.left.data.level -side top -fill x
145pack .server.difficulty.0\
146     .server.difficulty.1\
147     .server.difficulty.2\
148     .server.difficulty.3\
149     .server.difficulty.4\
150     -padx 10 -expand 1 -anchor w
151pack .server.left.size.s\
152     .server.left.size.m\
153     .server.left.size.l \
154     .server.left.size.deathmatch -padx 10 -expand 1 -anchor w
155pack .server.left.data\
156     .server.left.size
157#normal game options
158radiobutton .single.size.s \
159   -value "-s"\
160   -variable ScreenSize\
161   -text "320x250"
162radiobutton .single.size.m \
163   -value "-l"\
164   -variable ScreenSize\
165   -text "640x480"
166radiobutton .single.size.l \
167   -value "-E"\
168   -variable ScreenSize\
169   -text "900x600"
170checkbutton .single.size.mode \
171   -variable Fullscreen\
172   -text "Fullscreen"\
173   -command "SetExtra"
174checkbutton .single.gameopt.sound\
175   -variable Sound\
176   -text "sound"
177checkbutton .single.gameopt.shm\
178   -variable Shm\
179   -text "Use Shared memory"
180checkbutton .single.gameopt.monochrome\
181   -variable Monochrome\
182   -text "Monochrome"
183checkbutton .single.gameopt.blackwhite\
184   -variable blackwhite\
185   -text "Black and white"
186checkbutton .single.gameopt.private\
187   -variable private\
188   -text "Private colormap"
189checkbutton .single.gameopt.cursor\
190   -variable Cursor\
191   -text "Game own mouse cursor"
192button .buttons.start -text Start -command "Start"
193button .buttons.quit -text Quit -command exit
194pack .buttons.start\
195     .buttons.quit\
196     -expand 1 -fill x -side left
197pack .single.size.s\
198     .single.size.m\
199     .single.size.l\
200     .single.size.mode -padx 10 -fill x -expand y -anchor w
201pack .single.gameopt.sound \
202     .single.gameopt.shm \
203     .single.gameopt.private \
204     .single.gameopt.monochrome \
205     .single.gameopt.blackwhite \
206     .single.gameopt.cursor  -side top  -anchor w
207pack .single.size\
208     .single.gameopt -side left
209pack .server.left .server.difficulty -side left -fill x
210pack .gamemode -side top -expand y -fill x -pady 2m
211pack .single  -expand y -fill x -pady 2m
212pack .buttons -side bottom -expand y -fill x -pady 2m
213if {[file exists $xkoules] == 1} {
214  set Koulesexe $xkoules
215} else {
216   if {[file exists $koulessvga] == 1} {
217     set Fullscreen 1
218     .single.size.mode configure -state disabled
219   } else {
220     puts "Koules executable not found"
221     exit
222   }
223}
224if {[file exists $koulessound] == 0} {
225  set Sound 0
226  .single.gameopt.sound configure -state disabled
227}
228if {[file exists $koulessvga] == 1} {
229  set Koulesexe $koulessvga
230} else {
231  set Fullscreen 0
232  .single.size.mode configure -state disabled
233}
234proc SetDeath {} {
235  global Deathmatch
236  if {$Deathmatch == "1" } {
237    .server.left.data.level.entry configure -state disabled
238  } else {
239    .server.left.data.level.entry configure -state normal
240  }
241}
242SetDeath
243proc SetExtra {} {
244  global Fullscreen
245  global ScreenSize
246  if {$Fullscreen == "1" } {
247     .single.size.l configure -state disabled
248     .single.size.s configure -text 320x200
249     .single.gameopt.shm configure -state disabled
250     .single.gameopt.private configure -state disabled
251     .single.gameopt.monochrome configure -state disabled
252     .single.gameopt.blackwhite configure -state disabled
253     .single.gameopt.cursor configure -state disabled
254     if {$ScreenSize == "-E"} {
255       set ScreenSize "-l"
256       #.single.size.m configure -state active
257     }
258  } else {
259     .single.size.l configure -state normal
260     .single.size.s configure -text 320x250
261     .single.gameopt.shm configure -state normal
262     .single.gameopt.private configure -state normal
263     .single.gameopt.monochrome configure -state normal
264     .single.gameopt.blackwhite configure -state normal
265     .single.gameopt.cursor configure -state normal
266  }
267}
268SetExtra
269proc Start {} {
270  global GameMode
271  global ScreenSize
272  global private
273  global blackwhite
274  global Cursor
275  global Shm
276  global Monochrome
277  global Sound
278  global Fullscreen
279  global config
280  global revision
281  #client options
282  global CPort
283  global Host
284  #server options
285  global SPort
286  global Level
287  global Difficulty
288  global Deathmatch
289  global SScreenSize
290  global xkoules
291  global koulessvga
292  global Koulesexe
293  set FileId [open $config "w"]
294  puts $FileId $revision
295  puts $FileId $GameMode
296  puts $FileId $ScreenSize
297  puts $FileId $private
298  puts $FileId $blackwhite
299  puts $FileId $Cursor
300  puts $FileId $Shm
301  puts $FileId $Monochrome
302  puts $FileId $Sound
303  puts $FileId $Fullscreen
304  puts $FileId $CPort
305  puts $FileId $Host
306  puts $FileId $SPort
307  puts $FileId $Level
308  puts $FileId $Difficulty
309  puts $FileId $Deathmatch
310  puts $FileId $SScreenSize
311  close $FileId
312  if {$GameMode != "Server" } {
313    set opt $ScreenSize
314    if {$Sound == "0"} {
315      set opt "$opt -d"
316    }
317    if {$Fullscreen == "0"} {
318    set exec $xkoules
319    if {$private == "1"} {
320      set opt "$opt -p"
321    }
322    if {$Monochrome == "1"} {
323      set opt "$opt -m"
324    }
325    if {$blackwhite == "1"} {
326      set opt "$opt -b"
327    }
328    if {$Cursor == "1"} {
329      set opt "$opt -x"
330    }
331    if {$Shm == "0"} {
332      set opt "$opt -M"
333    }
334    } else {
335      set exec $koulessvga
336    }
337    if {$GameMode=="Client"} {
338      set opt "$opt -C $Host -P $CPort"
339    }
340    #puts "$exec $opt"
341    destroy .
342    exec /bin/sh "-c" "$exec $opt"
343  } else {
344    set exec  $Koulesexe
345    set opt "-S -P $SPort $SScreenSize -D $Difficulty"
346    if {$Deathmatch == "1"} {
347      set opt "$opt -K"
348    }
349    #puts "$exec $opt"
350    destroy .
351    exec xterm "-iconic" "-title" "Koules server" "-e" "/bin/sh" "-c" "$exec $opt"
352  }
353}
354pack .gamemode\
355     .buttons -expand 1 -side top -pady 2 -anchor w
356proc SetMode {} {
357  global GameMode
358  if {$GameMode == "Single" } {
359    pack forget .server
360    pack forget .client
361    pack .single\
362         -before .buttons -expand 1 -side top -pady 2 -anchor w
363  }
364  if {$GameMode == "Server"} {
365    pack forget .single
366    pack forget .client
367    pack .server -before .buttons -expand 1 -side top -pady 2 -anchor w
368  }
369  if {$GameMode == "Client"} {
370    pack forget .server
371    pack .single\
372         -before .buttons -expand 1 -side top -pady 2 -anchor w
373    pack .client\
374         -before .buttons -expand 1 -side top -pady 2 -anchor w
375  }
376}
377puts $GameMode
378bind . <Return> Start
379bind . <Escape> exit
380bind . <Control-c> exit
381SetMode
382