1 | #! perl |
1 | #! perl # mandatory |
2 | |
2 | |
3 | # wizard commands |
3 | # wizard commands |
4 | |
4 | |
|
|
5 | sub dm($) { |
|
|
6 | my ($ob) = @_; |
|
|
7 | |
|
|
8 | if ($ob->flag (cf::FLAG_WIZ)) { |
|
|
9 | $ob->reply (undef, "You are already the Dungeon Master!"); |
|
|
10 | return 0; |
|
|
11 | |
|
|
12 | } else { |
|
|
13 | $ob->flag (cf::FLAG_WIZ , 1); |
|
|
14 | $ob->flag (cf::FLAG_WIZPASS, 1); |
|
|
15 | $ob->flag (cf::FLAG_WIZCAST, 1); |
|
|
16 | $ob->flag (cf::FLAG_WIZLOOK, 1); |
|
|
17 | |
|
|
18 | $ob->contr->do_los (1); |
|
|
19 | $ob->contr->ns->update_command_faces; |
|
|
20 | |
|
|
21 | $ob->reply (undef, "Ok, you are the Dungeon Master!"); |
|
|
22 | |
|
|
23 | return 1; |
|
|
24 | } |
|
|
25 | } |
|
|
26 | |
|
|
27 | sub hide($) { |
|
|
28 | my ($ob) = @_; |
|
|
29 | |
|
|
30 | if ($ob->contr->hidden) { |
|
|
31 | $ob->contr->hidden (0); |
|
|
32 | # $ob->invisible (1); |
|
|
33 | |
|
|
34 | $ob->reply (undef, "You are no longer hidden!"); |
|
|
35 | } else { |
|
|
36 | $ob->contr->hidden (1); |
|
|
37 | |
|
|
38 | $ob->reply (undef, "You are now hidden!"); |
|
|
39 | } |
|
|
40 | } |
|
|
41 | |
|
|
42 | cf::register_command dm => sub { |
|
|
43 | my ($ob, $arg) = @_; |
|
|
44 | |
|
|
45 | return unless $ob->may ("command_dm"); |
|
|
46 | |
|
|
47 | dm $ob |
|
|
48 | and $ob->reply (undef, "The Dungeon Master has arrived!", cf::NDI_UNIQUE | cf::NDI_ALL | cf::NDI_LT_GREEN); |
|
|
49 | |
|
|
50 | 1 |
|
|
51 | }; |
|
|
52 | |
|
|
53 | cf::register_command dmhide => sub { |
|
|
54 | my ($ob, $arg) = @_; |
|
|
55 | |
|
|
56 | return unless $ob->may ("command_dm"); |
|
|
57 | |
|
|
58 | dm $ob |
|
|
59 | and hide $ob; |
|
|
60 | |
|
|
61 | 1 |
|
|
62 | }; |
|
|
63 | |
|
|
64 | cf::register_command hide => sub { |
|
|
65 | my ($ob, $arg) = @_; |
|
|
66 | return $ob->reply (undef, "Sorry, you are not the DM!") |
|
|
67 | unless $ob->flag (cf::FLAG_WIZ); |
|
|
68 | |
|
|
69 | hide $ob; |
|
|
70 | |
|
|
71 | 1 |
|
|
72 | }; |
|
|
73 | |
|
|
74 | cf::register_command nodm => sub { |
|
|
75 | my ($ob, $arg) = @_; |
|
|
76 | return $ob->reply (undef, "Sorry, you are not the DM!") |
|
|
77 | unless $ob->flag (cf::FLAG_WIZ); |
|
|
78 | |
|
|
79 | $ob->contr->hidden |
|
|
80 | and hide $ob; |
|
|
81 | |
|
|
82 | $ob->flag (cf::FLAG_WIZ , 0); |
|
|
83 | $ob->flag (cf::FLAG_WIZPASS, 0); |
|
|
84 | $ob->flag (cf::FLAG_WIZCAST, 0); |
|
|
85 | $ob->flag (cf::FLAG_WIZLOOK, 0); |
|
|
86 | |
|
|
87 | $ob->contr->do_los (1); |
|
|
88 | $ob->contr->ns->update_command_faces; |
|
|
89 | |
|
|
90 | 1 |
|
|
91 | }; |
|
|
92 | |
|
|
93 | cf::register_command shutdown => sub { |
|
|
94 | my ($ob, $arg) = @_; |
|
|
95 | return $ob->reply (undef, "Sorry, you can't shutdown the server.") |
|
|
96 | unless $ob->flag (cf::FLAG_WIZ); |
|
|
97 | |
|
|
98 | my $name = $ob->name; |
|
|
99 | cf::cleanup ("dm '$name' initiated shutdown" . ($arg ? " with reason: $arg" : "."), 0); |
|
|
100 | |
|
|
101 | 1 |
|
|
102 | }; |
|
|
103 | |
|
|
104 | cf::register_command kick => sub { |
|
|
105 | my ($ob, $arg) = @_; |
|
|
106 | return unless $ob->flag (cf::FLAG_WIZ); |
|
|
107 | |
|
|
108 | my $other = cf::player::find_active $arg |
|
|
109 | or return 0; |
|
|
110 | $other->kick ($ob); |
|
|
111 | $ob->reply (undef, "$arg is kicked out of the game.", cf::NDI_UNIQUE | cf::NDI_ALL | cf::NDI_RED); |
|
|
112 | |
|
|
113 | 1 |
|
|
114 | }; |
|
|
115 | |
5 | cf::register_command goto => sub { |
116 | cf::register_command goto => sub { |
6 | my ($ob, $arg) = @_; |
117 | my ($ob, $arg) = @_; |
7 | |
118 | |
8 | return unless $ob->may ("command_goto"); |
119 | return unless $ob->may ("command_goto"); |
9 | |
120 | |
10 | my $portal = cf::object::new "exit"; |
121 | my ($path, $x, $y) = split /\s+/, $arg, 3; |
11 | |
122 | |
12 | $portal->slaying ($arg); |
123 | $ob->goto ($path, $x, $y); |
13 | $portal->stats->hp (0); |
|
|
14 | $portal->stats->sp (0); |
|
|
15 | |
124 | |
16 | $portal->apply ($ob); |
125 | 1 |
|
|
126 | }; |
17 | |
127 | |
18 | $portal->destroy; |
128 | cf::register_command teleport => sub { |
|
|
129 | my ($ob, $arg) = @_; |
|
|
130 | |
|
|
131 | return unless $ob->may ("command_teleport"); |
|
|
132 | |
|
|
133 | cf::async { |
|
|
134 | $Coro::current->{desc} = "teleport $arg"; |
|
|
135 | |
|
|
136 | my $other = cf::player::find $arg |
|
|
137 | or return $ob->reply (undef, "$arg: no such player."); |
|
|
138 | |
|
|
139 | $ob->goto ($other->maplevel, $other->ob->x, $other->ob->y); |
|
|
140 | }; |
19 | |
141 | |
20 | 1 |
142 | 1 |
21 | }; |
143 | }; |
22 | |
144 | |
23 | cf::register_command wizpass => sub { |
145 | cf::register_command wizpass => sub { |
… | |
… | |
59 | cf::register_command wizlook => sub { |
181 | cf::register_command wizlook => sub { |
60 | my ($ob, $arg) = @_; |
182 | my ($ob, $arg) = @_; |
61 | |
183 | |
62 | return unless $ob->may ("command_wizlook"); |
184 | return unless $ob->may ("command_wizlook"); |
63 | |
185 | |
64 | $ob->clear_los; |
186 | my $new_val = length $arg ? $arg * 1 : !$ob->flag (cf::FLAG_WIZLOOK); |
65 | |
187 | |
66 | $ob->reply (undef, "You can temporarily see through walls."); |
188 | $ob->flag (cf::FLAG_WIZLOOK, $new_val); |
|
|
189 | |
|
|
190 | $ob->contr->do_los (1); |
|
|
191 | |
|
|
192 | $ob->reply (undef, |
|
|
193 | $new_val |
|
|
194 | ? "You can now look through walls." |
|
|
195 | : "You will now see the same thing as you would normally.", |
|
|
196 | ); |
67 | |
197 | |
68 | 1 |
198 | 1 |
69 | }; |
199 | }; |
70 | |
200 | |
71 | cf::register_command reset => sub { |
201 | cf::register_command reset => sub { |
… | |
… | |
76 | my $map = $ob->map; |
206 | my $map = $ob->map; |
77 | |
207 | |
78 | my @pl = $map->players; |
208 | my @pl = $map->players; |
79 | $_->enter_link for @pl; |
209 | $_->enter_link for @pl; |
80 | cf::async { |
210 | cf::async { |
81 | my $name = $map->{path}->as_string; |
211 | my $name = $map->visible_name; |
|
|
212 | $Coro::current->{desc} = "reset $name"; |
82 | |
213 | |
83 | $map->reset; |
214 | $map->reset; |
84 | $_->leave_link for @pl; |
215 | $_->leave_link for @pl; |
85 | |
216 | |
86 | $ob->reply (undef, "$name was reset."); |
217 | $ob->reply (undef, "$name was reset."); |
87 | }; |
218 | }; |
88 | |
219 | |
89 | 1 |
220 | 1 |
90 | }; |
221 | }; |
91 | |
222 | |
|
|
223 | cf::register_command observe => sub { |
|
|
224 | my ($ob, $arg) = @_; |
|
|
225 | |
|
|
226 | return unless $ob->may ("command_observe"); |
|
|
227 | |
|
|
228 | my $other = cf::player::find_active $arg; |
|
|
229 | $ob->contr->set_observe ($other ? $other->ob : undef); |
|
|
230 | |
|
|
231 | 1 |
|
|
232 | }; |
|
|
233 | |
92 | for my $command (qw(teleport summon arrest kick banish)) { |
234 | for my $command (qw(summon arrest banish)) { |
93 | my $method = "command_$command"; |
235 | my $method = "command_$command"; |
94 | |
236 | |
95 | cf::register_command $command => sub { |
237 | cf::register_command $command => sub { |
96 | my ($ob, $arg) = @_; |
238 | my ($ob, $arg) = @_; |
97 | |
239 | |