… | |
… | |
13 | |
13 | |
14 | use Crossfire; |
14 | use Crossfire; |
15 | use Crossfire::Client; |
15 | use Crossfire::Client; |
16 | use Crossfire::Protocol; |
16 | use Crossfire::Protocol; |
17 | |
17 | |
18 | use Client::Util; |
18 | use Crossfire::Client::Util; |
19 | use Client::Widget; |
19 | use Crossfire::Client::Widget; |
|
|
20 | |
|
|
21 | our $FACECACHE; |
20 | |
22 | |
21 | our $VERSION = '0.1'; |
23 | our $VERSION = '0.1'; |
22 | |
24 | |
23 | our $CFG; |
25 | our $CFG; |
24 | our $CONN; |
26 | our $CONN; |
25 | |
27 | |
26 | our $SDL_TIMER; |
28 | our $SDL_TIMER; |
27 | our $SDL_APP; |
29 | our $SDL_APP; |
28 | our $SDL_EV = new SDL::Event; |
30 | our $SDL_EV = new SDL::Event; |
29 | our %SDL_CB; |
31 | our %SDL_CB; |
30 | our @GL_INIT; |
32 | |
|
|
33 | our @GL_INIT; # hooks called on every gl init |
31 | |
34 | |
32 | sub init_screen { |
35 | sub init_screen { |
33 | $SDL_APP = new SDL::App |
36 | $SDL_APP = new SDL::App |
34 | -flags => SDL_ANYFORMAT | SDL_HWSURFACE, |
37 | -flags => SDL_ANYFORMAT | SDL_HWSURFACE, |
35 | -title => "Crossfire+ Client", |
38 | -title => "Crossfire+ Client", |
… | |
… | |
41 | -blue_size => 8, |
44 | -blue_size => 8, |
42 | -double_buffer => 1, |
45 | -double_buffer => 1, |
43 | -fullscreen => $CFG->{fullscreen}, |
46 | -fullscreen => $CFG->{fullscreen}, |
44 | -resizeable => 0; |
47 | -resizeable => 0; |
45 | |
48 | |
|
|
49 | glClearColor 0, 0, 0, 0; |
|
|
50 | |
46 | glEnable GL_TEXTURE_2D; |
51 | glEnable GL_TEXTURE_2D; |
47 | glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE; |
52 | glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE; |
48 | glShadeModel GL_FLAT; |
53 | glShadeModel GL_FLAT; |
49 | glDisable GL_DEPTH_TEST; |
54 | glDisable GL_DEPTH_TEST; |
50 | glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; |
55 | glBlendFunc GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA; |
51 | glEnable GL_BLEND; |
56 | glEnable GL_BLEND; |
52 | |
57 | |
53 | glMatrixMode GL_PROJECTION; |
58 | glMatrixMode GL_PROJECTION; |
54 | glLoadIdentity; |
59 | glLoadIdentity; |
55 | glOrtho 0, $CFG->{width} / 32, $CFG->{height} / 32, 0, -1 , 1; |
60 | glOrtho 0, $CFG->{width} / 32, $CFG->{height} / 32, 0, -100 , 100; |
|
|
61 | |
|
|
62 | glMatrixMode GL_MODELVIEW; |
56 | |
63 | |
57 | $_->() for @GL_INIT; |
64 | $_->() for @GL_INIT; |
58 | } |
65 | } |
59 | |
66 | |
60 | sub start_game { |
67 | sub start_game { |
… | |
… | |
79 | undef $SDL_APP; |
86 | undef $SDL_APP; |
80 | SDL::Quit; |
87 | SDL::Quit; |
81 | } |
88 | } |
82 | |
89 | |
83 | sub refresh { |
90 | sub refresh { |
84 | glClearColor 0, 0, 0, 0; |
|
|
85 | glClear GL_COLOR_BUFFER_BIT; |
91 | glClear GL_COLOR_BUFFER_BIT; |
86 | |
92 | |
87 | for (values %Client::Widget::ACTIVE_WIDGETS) { |
93 | for (values %Client::Widget::ACTIVE_WIDGETS) { |
88 | $_->draw |
94 | $_->draw |
89 | } |
95 | } |
… | |
… | |
91 | SDL::GLSwapBuffers; |
97 | SDL::GLSwapBuffers; |
92 | } |
98 | } |
93 | |
99 | |
94 | %SDL_CB = ( |
100 | %SDL_CB = ( |
95 | SDL_QUIT() => sub { |
101 | SDL_QUIT() => sub { |
96 | warn "sdl quit\n";#d# |
102 | main_quit Gtk2; |
97 | exit; |
|
|
98 | }, |
103 | }, |
99 | SDL_VIDEORESIZE() => sub { |
104 | SDL_VIDEORESIZE() => sub { |
100 | }, |
105 | }, |
101 | SDL_VIDEOEXPOSE() => sub { |
106 | SDL_VIDEOEXPOSE() => sub { |
102 | refresh; |
107 | refresh; |
103 | }, |
108 | }, |
104 | SDL_KEYDOWN() => sub { |
109 | SDL_KEYDOWN() => sub { |
|
|
110 | if ($SDL_EV->key_mod & KMOD_ALT && $SDL_EV->key_sym == SDLK_RETURN) { |
|
|
111 | # alt-enter |
|
|
112 | $CFG->{fullscreen} = !$CFG->{fullscreen}; |
|
|
113 | init_screen; |
|
|
114 | } else { |
105 | Client::Widget::feed_sdl_key_down_event ($SDL_EV); |
115 | Client::Widget::feed_sdl_key_down_event ($SDL_EV); |
|
|
116 | } |
106 | }, |
117 | }, |
107 | SDL_KEYUP() => sub { |
118 | SDL_KEYUP() => sub { |
108 | Client::Widget::feed_sdl_key_up_event ($SDL_EV); |
119 | Client::Widget::feed_sdl_key_up_event ($SDL_EV); |
109 | }, |
120 | }, |
110 | SDL_MOUSEMOTION() => sub { |
121 | SDL_MOUSEMOTION() => sub { |
… | |
… | |
139 | my ($self) = @_; |
150 | my ($self) = @_; |
140 | |
151 | |
141 | refresh; |
152 | refresh; |
142 | } |
153 | } |
143 | |
154 | |
|
|
155 | sub conn::face_find { |
|
|
156 | my ($self, $face) = @_; |
|
|
157 | |
|
|
158 | $FACECACHE->{"$face->{chksum},$face->{name}"} |
|
|
159 | } |
|
|
160 | |
144 | sub conn::face_update { |
161 | sub conn::face_update { |
145 | my ($self, $num, $face) = @_; |
162 | my ($self, $face) = @_; |
146 | |
163 | |
|
|
164 | $FACECACHE->{"$face->{chksum},$face->{name}"} = $face->{image}; |
|
|
165 | |
|
|
166 | $face->{texture} = new_from_image Crossfire::Client::Texture delete $face->{image}; |
147 | } |
167 | } |
148 | |
168 | |
149 | ############################################################################# |
169 | ############################################################################# |
150 | |
170 | |
|
|
171 | SDL::Init(SDL_INIT_EVERYTHING()); |
|
|
172 | |
151 | my $mapwidget = Client::MapWidget->new; |
173 | my $mapwidget = Crossfire::Client::Widget::MapWidget->new; |
|
|
174 | |
|
|
175 | #find_rcfile "uifont.ttf"; |
152 | |
176 | |
153 | $mapwidget->activate; |
177 | $mapwidget->activate; |
154 | $mapwidget->focus_in; |
178 | $mapwidget->focus_in; |
155 | |
179 | |
156 | Client::Util::read_cfg "$Crossfire::VARDIR/pclientrc"; |
180 | read_cfg "$Crossfire::VARDIR/pclientrc"; |
|
|
181 | |
|
|
182 | $FACECACHE = eval { Crossfire::load_ref "$Crossfire::VARDIR/pclient.faces" } || {}; |
157 | |
183 | |
158 | $CFG ||= { |
184 | $CFG ||= { |
159 | width => 640, |
185 | width => 640, |
160 | height => 480, |
186 | height => 480, |
161 | fullscreen => 0, |
187 | fullscreen => 0, |
162 | host => "crossfire.schmorp.de", |
188 | host => "crossfire.schmorp.de", |
163 | port => 13327, |
189 | port => 13327, |
164 | }; |
190 | }; |
165 | |
191 | |
166 | Client::Util::run_config_dialog |
192 | Crossfire::Client::Util::run_config_dialog |
167 | login => sub { start_game }, |
193 | login => sub { start_game }, |
168 | logout => sub { stop_game }; |
194 | logout => sub { stop_game }; |
169 | |
195 | |
170 | main Gtk2; |
196 | main Gtk2; |
|
|
197 | |
|
|
198 | Crossfire::save_ref $FACECACHE, "$Crossfire::VARDIR/pclient.faces"; |