/
mount.c
393 lines (351 loc) · 12.3 KB
/
mount.c
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
/***********************************************************************
* *
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans-Henrik Stćfeldt, Tom Madsen and Katja Nyboe *
* *
* Merc Diku Mud improvements copyright (C) 1992, 1993 by *
* Michael Chastain, Michael Quan, and Mitchell Tse *
* *
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
* *
***********************************************************************
* *
* KILLER MUD is copyright 1999-2011 Killer MUD Staff (alphabetical) *
* *
* Andrzejczak Dominik (kainti@go2.pl ) [Kainti ] *
* Jaron Krzysztof (chris.jaron@gmail.com ) [Razor ] *
* Koper Tadeusz (jediloop@go2.pl ) [Garloop ] *
* Pietrzak Marcin (marcin@iworks.pl ) [Gurthg ] *
* Sawicki Tomasz (furgas@killer-mud.net ) [Furgas ] *
* Trebicki Marek (maro@killer.radom.net ) [Maro ] *
* Zdziech Tomasz (t.zdziech@elka.pw.edu.pl ) [Agron ] *
* *
***********************************************************************
*
* $Id: mount.c 110 2013-07-18 08:34:31Z gurthg $
* $HeadURL: svn+ssh://svn@killer.mud.pl/killer/branches/current/src/mount.c $
*
*/
#if defined(macintosh)
#include <types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
#include "interp.h"
#include "act_obj.h"
void do_mount_on( CHAR_DATA *ch, CHAR_DATA *horse );
void one_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt, bool second ) );
// http://forum.mud.pl/viewtopic.php?t=6849
/**
Wierzchowce i wszystkie moby z mountable.
W dzisiejszych czasach używa się ich jako przenośne stoiska z floatem, dlatego
chciałbym poruszyć pare spraw, które być może zaprocentują kiedyś zmianami
w systemie wierzchowców. Żeby nie przeciążać systemu, zmiany można by wprowadzać po kolei:
I. Zmęczenie
Konie powinny mieć swoją pule mv, które traciły by przy przechodzeniu
z lokacji do lokacji. Gracz niewprawiony w jeździe konnej ( i nie tylko konnej )
oczywiście też by się męczył, ale doświadczony jeździeć traciłby mv bardzo wolno.
Mając mistrza w Ridingu, stosunek byłby 10:1 - czyli 10 mv wierzchowca na 1 mv jeźdzca.
Koń który straciłby całe mv, musiałby odpocząć, tak samo jak człowiek ( chociaż siły regenerował by szybciej ).
Żeby nie bawić się w dodatkowe pola, mv moba były by naliczane na podstawie jego kondycji, rasy i size'u.
Komendy: mount <nazwa> rest, mount <nazwa> stand
Zmiany: Riding, Mount.
II. Opieka nad Wierzchowcem
Oprócz oczywistych rzeczy, takich jak odpoczynek, koń ( czy ichnia bestia )
potrzebuje jedzenia i picia. Z piciem jest łatwo, starczy trafić na jakąś
rzeczke przepływającą przez trakt czy zaprowadzić konia do koryta w stajni
( nie radze poić z bukłaków ). Jednak z jedzeniem są już pewne komplikacje.
Wyróźniamy podział na pare typów:
1. herbivorous - roślinożerne, pare sektorów naturalnych lub pasza.
2. carnivorous - miesożerne, trup animala lub surowe mięso.
3. omnivorous - wszystkożerne, sektory naturalne, pasza, mięso lub trup zwierzecia.
4. unfeedable - Nie potrzebuje jeść i pić, dotyczy istot pozasferowych, nieożywionych czy przywołanych.
Oprócz tego w zależności od size moba, jedzenie czy picie będzie uzupełniać
pewien procent paska. Np. koń o size normal jedząc pasze uzupełni 50% paska głodu,
inny koń o size large uzupełni już tylko 40%. Gdyby był jakiś koń o size gigant,
pasza uzupełniła by mu tylko 10%. Działa też w drugą strone. Tak więc trzeba
by było dbać o wieszchowca, by on był zdatny do życia. Oczywiście nie musze dodawać,
że głodny i spragniony wierzchowiec wolniej regenerował by mv?
Komendy: mount <nazwa> feed, mount <nazwa> feed <item>, mount <nazwa> water, mount <nazwa> water <item>
Zmiany: Mount, Otype food ( dodać podział na rodzaj pożywienia,
np. mięso, pasza, zielenina, racja podróźna ), naliczanie głodu i pragnienia, size.
*/
void do_mount( CHAR_DATA *ch, char *argument ){
char horsename [ MAX_STRING_LENGTH ];
char order [ MAX_STRING_LENGTH ];
char item [ MAX_STRING_LENGTH ];
CHAR_DATA *horse = NULL;
argument = one_argument( argument, horsename );
argument = one_argument( argument, order );
argument = one_argument( argument, item );
horse = get_char_room( ch, horsename );
if(!horse){
print_char(ch, "Nie ma tu nikogo takiego!\n\r");
return;
}
if ( !IS_NPC(horse) || !EXT_IS_SET(horse->act, ACT_MOUNTABLE ) )
{
print_char(ch, "Czy %s wygląda jak coś, na czym można jeździć?!\n\r", horse->short_descr );
return;
}
//jesli tylko jeden argument, to normalny mount
if(!strcmp(order, "")){
//V. Stajnie
// if(str_prefix(horsename, "list"))
// do_mount_list(ch);
// if(str_prefix(horsename, "offer"))
// do_mount_offer(ch);
// else
do_mount_on(ch, horse);
}
else {
//I. Zmęczenie
if(!str_prefix(order, "stand")){
if(horse->mounting){
print_char(ch, "Przecież %s ma jeźdźca!\n\r", horse->name2 );
return;
}
do_stand(horse, "");
horse->default_pos = POS_STANDING;
}
else if(!str_prefix(order, "rest")){
if(ch->mount){
print_char(ch, "Zsiądź najpierw z %s!\n\r", horse->name2 );
return;
}
if(horse->mounting){
print_char(ch, "Przecież %s ma jeźdźca!\n\r", horse->name2 );
return;
}
do_rest(horse, "");
horse->default_pos = POS_RESTING;
}
//II. Opieka nad Wierzchowcem
else if(!str_prefix(order, "feed")){
do_feed_body(ch, horse->name, item);
}
else if(!str_prefix(order, "water"))
do_water_body(ch, horse->name, item);
//III. Prowadzenie wierzchowca
// else if(str_prefix(order, "follow"))
// do_rest(horse, "");
// else if(str_prefix(order, "nofollow"))
// do_rest(horse, "");
// else if(str_prefix(order, "stay"))
// do_rest(horse, "");
//IV. Przedmioty
// else if(str_prefix(order, "check"))
// do_rest(horse, "");
// else if(str_prefix(order, "put"))
// do_rest(horse, "");
// else if(str_prefix(order, "get"))
// do_rest(horse, "");
// else if(str_prefix(order, "equip"))
// do_rest(horse, "");
// else if(str_prefix(order, "remove"))
// do_rest(horse, "");
//V. Stajnie
// else if(str_prefix(order, "rent"))
// do_rest(horse, "");
// else if(str_prefix(order, "bring"))
// do_rest(horse, "");
else
print_char(ch, "Co?!\n\r" );
}
}
void do_mount_on( CHAR_DATA *ch, CHAR_DATA *horse )
{
bool show;
int skill = get_skill( ch, gsn_riding );
if ( ch->mount )
{
print_char(ch, "Przecież dosiadasz już %s!\n\r", ch->mount->name4);
return;
}
if ( horse == ch )
{
send_to_char( "Czego chcesz dosiąść?\n\r", ch );
return;
}
if ( !IS_NPC(horse) || !EXT_IS_SET(horse->act, ACT_MOUNTABLE ) )
{
print_char(ch, "Nie możesz dosiąść %s!\n\r", horse->name2 );
return;
}
if ( horse->mounting )
{
print_char(ch, "%s już ma jeźdzca.\n\r", horse->short_descr );
return;
}
if ( horse->master && horse->master != ch )
{
act("$N nie pozwala ci na to.", ch, NULL, horse->master, TO_CHAR );
return;
}
if ( horse->position < POS_STANDING )
{
send_to_char( "Wierzchowiec musi stać, aby można było na niego wsiąść.\n\r", ch );
return;
}
if ( horse->fighting )
{
print_char(ch, "%s teraz walczy, nie dasz rady wsiąść.\n\r", horse->short_descr );
return;
}
if ( is_fearing( horse, ch ) )
{
print_char(ch, "%s zbyt się ciebie boi, nie dasz rady wsiąść.\n\r", horse->short_descr );
if ( number_percent() < 5 ) {
one_hit( horse, ch, TYPE_UNDEFINED, FALSE );
}
return;
}
if ( ch->move <= 0 )
{
act( "Jesteś zbyt zmęczon<&y/a/e> by dosiąść wierzchowca.", ch, NULL, horse, TO_CHAR );
return;
}
if (IS_AFFECTED(ch, AFF_SNEAK) || IS_AFFECTED(ch, AFF_HIDE)) {
switch (horse->sex) {
case SEX_NEUTRAL:
act( "Próbujesz dosiąść $C, ale robisz to tak niespodziewanie, że $N umyka przestraszone.", ch, NULL, horse, TO_CHAR );
break;
case SEX_MALE:
act( "Próbujesz dosiąść $C, ale robisz to tak niespodziewanie, że $N umyka przestraszony.", ch, NULL, horse, TO_CHAR );
break;
case SEX_FEMALE:
default :
act( "Próbujesz dosiąść $C, ale robisz to tak niespodziewanie, że $N umyka przestraszona.", ch, NULL, horse, TO_CHAR );
break;
}
ch->move -= number_range(1,4);
if ( ch->move < 0 )
{
ch->move = 0;
}
return;
}
if(IS_AFFECTED(ch, AFF_FLYING))
{
affect_strip(ch, gsn_fly);
}
if(IS_AFFECTED(ch, AFF_FLOAT))
{
affect_strip(ch, gsn_float);
}
if ( skill == 0 || number_percent() > skill + 5 )
{
act( "Nieudolnie próbujesz dosiąść $C i po chwili lądujesz na ziemi.", ch, NULL, horse, TO_CHAR );
act( "$n nieudolnie próbuje dosiąść $C i po chwili ląduje na ziemi.", ch, NULL, horse, TO_NOTVICT );
ch->position = POS_SITTING;
ch->move -= number_range(0,4);
if ( ch->weight > 900 )
{
ch->move -= number_range(0,2);
}
ch->move = UMAX(0,ch->move);
check_improve( ch, NULL, gsn_riding, TRUE, 70 );
return;
}
ch->mount = horse;
horse->mounting = ch;
horse->default_pos = POS_STANDING;
horse->position = POS_STANDING;
show = TRUE;
if ( IS_NPC( horse ) && HAS_TRIGGER( horse, TRIG_MOUNT ) )
{
show = !mp_percent_trigger( horse, ch, NULL, NULL, &TRIG_MOUNT );
}
if ( IS_NPC( horse ) && HAS_TRIGGER( horse, TRIG_DISMOUNT ) )
{
show = FALSE;
}
if ( show )
{
act( "Umiejętnie dosiadasz $C.", ch, NULL, horse, TO_CHAR );
act( "$n umiejętnie dosiada $C.", ch, NULL, horse, TO_NOTVICT );
check_improve( ch, NULL, gsn_riding, TRUE, 10 );
}
return;
}
void do_dismount_body( CHAR_DATA *ch )
{
if ( ch->mount )
{
ch->mount->mounting = NULL;
ch->mount = NULL;
}
else if ( ch->mounting )
{
ch->mounting->mount = NULL;
ch->mounting = NULL;
}
else
{
bug( "Cos nie tak z do_dismount_body (%d).", 1 );
}
}
void do_dismount( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
bool show;
int skill = get_skill( ch, gsn_riding );
if ( (victim = ch->mount) == NULL )
{
send_to_char( "Przecież nie dosiadasz teraz żadnego wierzchowca.\n\r", ch );
return;
}
if ( ch->position == POS_SLEEPING )
{
send_to_char( "Śnisz o zsiadaniu z konia.\n\r", ch );
return;
}
do_dismount_body(ch);
ch->position = POS_STANDING;
show = TRUE;
if ( IS_NPC( victim ) && HAS_TRIGGER( victim, TRIG_DISMOUNT ) )
{
show = !mp_percent_trigger( victim, ch, NULL, NULL, &TRIG_DISMOUNT );
}
if ( IS_NPC( victim ) && HAS_TRIGGER( victim, TRIG_MOUNT ) )
{
show = FALSE;
}
if ( show )
{
if ( skill == 0 || number_percent() > skill + 5 )
{
act( "Nieudolnie próbujesz zsiąść z grzbietu $Z i po chwili lądujesz na ziemi.", ch, NULL, victim, TO_CHAR );
act( "$n nieudolnie próbuje zsiąść z grzbietu $Z i po chwili ląduje na ziemi.", ch, NULL, victim, TO_NOTVICT );
ch->position = POS_SITTING;
ch->move -= number_range(0,4);
if ( ch->weight > 900 )
{
ch->move -= number_range(0,2);
}
if ( ch->move < 0 )
{
ch->move = 0;
}
check_improve( ch, NULL, gsn_riding, TRUE, 80 );
}
else
{
act("Zręcznie zeskakujesz z grzbietu $Z.", ch, NULL, victim, TO_CHAR );
act("$n zręcznie zeskakuje z grzbietu $Z.", ch, NULL, victim, TO_NOTVICT );
check_improve( ch, NULL, gsn_riding, TRUE, 70 );
}
}
return;
}