]>
jfr.im git - irc/gameservirc.git/blob - gameserv/gameserv.cpp
20 #if defined(HAVE_CRYPT_H)
24 #elif defined(HAVE_UNISTD_H)
30 Monster dragon
; // The current dragon
31 Level levels
[ LEVELS
]; // The newest way to store monsters
32 list
< item
*> Items
; // The master list of items
33 list
< tavernItem
> tavern
; // The list of items available at the tavern
34 list
< item
*> store
; // The list of items available at the store
45 item
* findItemByID ( int id
);
46 item
* findStoreItemByID ( int id
);
47 tavernItem
* findTavernItemByID ( int id
);
51 char * strtok ( char * str
, const char * delim
);
54 int stricmp ( const char * s1
, const char * s2
);
55 int strnicmp ( const char * s1
, const char * s2
, size_t len
);
58 /********** Password functions **********/
60 bool passcmp ( const char * encrypted
, char * plaintext
); // Compares an encrypted pass with a plain text one
62 bool check_password ( char * name
, char * plaintext
); // Finds a password for the given name, and checks it with passcmp against the plaintext password given.
64 /********** Password functions **********/
67 /********** GameServ Booleans **********/
70 bool timedOut ( Player
* p
);
71 void updateTS ( Player
* p
);
72 void timeOutEvent ( Player
* p
);
74 bool is_playing ( char * u
); // True if the given nickname in the clients list is playing.
75 bool is_playing ( aClient
* user
);
77 bool is_fighting ( char * u
); // True if the given nick in the clients list is fighting anything.
78 bool is_fighting ( aClient
* user
);
80 bool player_fight ( char * u
); // True if the player is fighting another player.
81 bool player_fight ( aClient
* user
);
83 bool master_fight ( char * u
); // True if the player is fighting their master.
84 bool master_fight ( aClient
* user
);
86 bool dragon_fight ( char * u
); // True if the player is fighting the dragon.
87 bool dragon_fight ( aClient
* user
);
89 bool alphaNumeric ( const char * str
); // Returns true if all of the characters in str are alphanumeric non-special chars
90 /********** GameServ Booleans **********/
92 void display_help ( char * u
, char * file
= NULL
);
93 void display_monster ( char * u
);
94 void display_players ( char * u
);
95 void display_players ( aClient
* user
);
96 long int chartoint ( char ch
);
97 int isstringnum ( char * num
);
98 long int pow ( int x
, int y
);
99 long int stringtoint ( char * number
);
101 char * spaces ( int len
, char * seperator
);
102 void refresh ( Player
* p
);
104 void rollover ( Player
* p
);
107 void updateTS ( Player
* p
);
108 void reset ( Player
* p
);
110 bool load_monsters ();
112 void delete_monsters ();
114 void do_admin ( char * u
);
115 void do_attack ( char * u
);
116 void do_bank ( char * u
);
117 void do_check ( char * u
);
118 void do_equip ( char * u
);
119 void do_fight ( char * u
);
120 void do_heal ( char * u
);
121 void do_help ( char * u
);
122 void do_identify ( char * u
);
123 void do_inventory ( char * u
);
124 void do_refresh ( char * u
);
125 void do_register ( char * u
);
126 void do_list ( char * u
);
127 void do_logout ( char * u
);
128 void do_master ( char * u
);
129 void do_dragon ( char * u
);
130 void do_play ( char * u
);
131 void do_quitg ( char * u
);
132 void do_reset ( char * u
);
133 void do_run ( char * u
);
134 void do_set ( char * u
);
135 void do_stats ( char * u
);
136 void do_store ( char * u
);
137 void do_tavern ( char * u
);
138 void do_use ( char * u
);
139 void see_master ( char * u
);
141 void logout ( aClient
* user
);
142 void showstats ( const char * u
, const char * nick
);
143 void showTavern ( aClient
* user
);
144 void showinventory ( Player
* from
, aClient
* to
);
145 void showBankBalance ( const char * u
);
146 void end_turn ( aClient
* user
);
150 int hpbonus
[ 11 ] = { 10 , 15 , 20 , 30 , 50 , 75 , 125 , 185 , 250 , 350 , 550 };
151 int strbonus
[ 11 ] = { 5 , 7 , 10 , 12 , 20 , 35 , 50 , 75 , 110 , 150 , 200 };
152 int defbonus
[ 11 ] = { 2 , 3 , 5 , 10 , 15 , 22 , 35 , 60 , 80 , 120 , 150 };
154 void gameserv ( char * source
, char * buf
)
157 cmd
= strtok ( buf
, " " );
160 source
++; // Get rid of that : at the beginning of a :Nick privmsg Gameserv :text
165 cmd
++; // Get rid of that : at the beginning of the :text (command)
168 log ( "Source: %s Command: %s " , source
, cmd
);
171 if ( strnicmp ( cmd
, "\1PING" , 6 ) == 0 )
174 ts
= strtok ( NULL
, "\1" );
175 notice ( s_GameServ
, source
, "\1PING %s \1" , ts
);
176 } else if ( stricmp ( cmd
, "\1VERSION\1" ) == 0 ) {
177 notice ( s_GameServ
, source
, "\1VERSION %s %s \1" , PACKAGE
, VERSION
);
178 } else if ( stricmp ( cmd
, "SEARCH" ) == 0 ) {
179 cmd
= strtok ( NULL
, " " );
182 notice ( s_GameServ
, source
, "SYNTAX: /msg %S SEARCH FOREST" );
186 } else if ( stricmp ( cmd
, "ADMIN" ) == 0 ) {
188 } else if ( stricmp ( cmd
, "ATTACK" ) == 0 ) {
190 } else if ( stricmp ( cmd
, "BANK" ) == 0 ) {
192 } else if ( stricmp ( cmd
, "CHECK" ) == 0 ) {
194 } else if ( stricmp ( cmd
, "DRAGON" ) == 0 ) {
196 } else if ( stricmp ( cmd
, "EQUIP" ) == 0 ) {
198 } else if ( stricmp ( cmd
, "FIGHT" ) == 0 ) {
200 } else if ( stricmp ( cmd
, "HEAL" ) == 0 ) {
202 } else if ( stricmp ( cmd
, "HELP" ) == 0 ) {
204 } else if ( stricmp ( cmd
, "IDENTIFY" ) == 0 ) {
206 } else if ( stricmp ( cmd
, "INVENTORY" ) == 0 ) {
207 do_inventory ( source
);
208 } else if ( stricmp ( cmd
, "LIST" ) == 0 ) {
210 } else if ( stricmp ( cmd
, "LOGOUT" ) == 0 ) {
212 } else if ( stricmp ( cmd
, "MASTER" ) == 0 ) {
214 } else if ( stricmp ( cmd
, "NEWS" ) == 0 ) {
216 } else if ( stricmp ( cmd
, "REGISTER" ) == 0 ) {
218 } else if ( stricmp ( cmd
, "REFRESH" ) == 0 ) {
220 } else if ( stricmp ( cmd
, "RESET" ) == 0 ) {
222 } else if ( stricmp ( cmd
, "RUN" ) == 0 ) {
224 } else if ( stricmp ( cmd
, "SET" ) == 0 ) {
226 } else if ( stricmp ( cmd
, "STATS" ) == 0 ) {
228 } else if ( stricmp ( cmd
, "STORE" ) == 0 ) {
230 } else if ( stricmp ( cmd
, "TAVERN" ) == 0 ) {
232 } else if ( stricmp ( cmd
, "USE" ) == 0 ) {
234 } else if ( stricmp ( cmd
, "SHUTDOWN" ) == 0 ) {
237 if (!( user
= find ( source
)))
239 notice ( s_GameServ
, source
, "Error: aClient not found. Contact a %S admin" );
240 log ( "Error: aClient not found: %s " , source
);
242 else if (! isAdmin ( user
))
244 notice ( s_GameServ
, source
, "You must be a %S admin to use this command!" );
250 raw ( "[] SQ %s 0 :leaving: %s used the Shutdown command." , servername
, user
-> getRealNick ());
252 raw ( "SQUIT %s :leaving: %s used the Shutdown command." , servername
, source
);
256 } else if ( stricmp ( cmd
, "SAVE" ) == 0 ) {
259 if (!( user
= find ( source
)))
261 notice ( s_GameServ
, source
, "Error: aClient not found. Contact a %S admin" );
262 log ( "Error: aClient not found: %s " , source
);
264 else if (! isAdmin ( user
))
266 notice ( s_GameServ
, source
, "You must be a %S admin to use this command!" );
272 } else if ( stricmp ( cmd
, "LOAD" ) == 0 ) {
275 if (!( user
= find ( source
)))
277 notice ( s_GameServ
, source
, "Error: aClient not found. Contact a %S admin" );
278 log ( "Error: aClient not found: %s " , source
);
280 else if (! isAdmin ( user
))
282 notice ( s_GameServ
, source
, "You must be a %S admin to use this command!" );
286 char * cmd2
= strtok ( NULL
, " " );
289 notice ( s_GameServ
, source
, "Loading player data from %s " , playerdata
);
292 else if ( stricmp ( cmd2
, "MONSTERS" ) == 0 )
294 notice ( s_GameServ
, source
, "Loading monster data" );
298 display_help ( source
, cmd
);
301 } else if ( stricmp ( cmd
, "RAW" ) == 0 ) {
304 if (!( user
= find ( source
)))
306 notice ( s_GameServ
, source
, "Error: aClient not found. Contact a %S admin" );
307 log ( "Error: aClient not found: %s " , source
);
309 else if (! isAdmin ( user
))
311 notice ( s_GameServ
, source
, "You must be a %S admin to use this command!" );
315 char * rest
= strtok ( NULL
, "" );
318 } else if ( stricmp ( cmd
, "PRINT" ) == 0 ) {
319 for ( int x
= 0 ; x
< LEVELS
; x
++)
320 levels
[ x
]. monsters
. print ();
321 } else if ( stricmp ( cmd
, "RANDOM" ) == 0 ) {
322 char * rstr
= strtok ( NULL
, "" );
324 trange
. setRange ( rstr
);
325 notice ( s_GameServ
, source
, "Random number in that range: %d " , trange
. random ());
329 if (( user
= find ( source
)))
334 log ( "Ignoring %s ." , user
-> getNick ());
339 notice ( s_GameServ
, source
, "Unknown command \002 %s \002 . Type /msg %S \002 HELP \002 to get a list of commands." , cmd
);
345 source
--; // Bring the ':' back so we don't leak memory
348 cmd
--; // Same thing :)
351 int stricmp ( const char * s1
, const char * s2
)
355 while (( c
= tolower (* s1
)) == tolower (* s2
)) {
361 if ( c
< tolower (* s2
))
366 void showstats ( const char * u
, const char * nick
)
368 aClient
* ni
, * sender
= find ( u
);
374 if (!( ni
= findplayer ( nick
)))
376 notice ( s_GameServ
, u
, " %s not found" , nick
);
380 notice ( s_GameServ
, sender
-> getNick (), "Stats for %s :" , ni
-> stats
-> getName (). c_str ());
382 sprintf ( buf
, "Experience: %l d" , ni
-> stats
-> getExp ());
383 space
= spaces ( strlen ( buf
), " " );
384 notice ( s_GameServ
, sender
-> getNick (), " %s%s Level: %d " , buf
, space
,
385 ni
-> stats
-> getLevel ());
388 sprintf ( buf
, "Gold: %l d" , ni
-> stats
-> getGold ());
389 space
= spaces ( strlen ( buf
), " " );
390 notice ( s_GameServ
, sender
-> getNick (), " %s%s Gold in Bank: %l d" , buf
, space
, ni
-> stats
-> getBank ());
393 notice ( s_GameServ
, sender
-> getNick (), "Hit Points: %d of %d " , ni
-> stats
-> getHP (),
394 ni
-> stats
-> getMaxHP ());
396 sprintf ( buf
, "Strength: %d " , ni
-> stats
-> getStrength ());
397 space
= spaces ( strlen ( buf
), " " );
398 notice ( s_GameServ
, sender
-> getNick (), " %s%s Defense: %d " ,
399 buf
, space
, ni
-> stats
-> getDefense ());
402 sprintf ( buf
, "Armor: %s " , ( ni
-> stats
-> getArmor () ? ni
-> stats
-> getArmor ()-> getName (). c_str () : "Nothing" ));
403 space
= spaces ( strlen ( buf
), " " );
405 notice ( s_GameServ
, sender
-> getNick (), " %s%s Weapon: %s " , buf
, space
,
406 ( ni
-> stats
-> getWeapon () ? ni
-> stats
-> getWeapon ()-> getName (). c_str () : "Fists" ));
410 sprintf ( buf
, "Forest Fights: %d " , ni
-> stats
-> getForestFights ());
411 space
= spaces ( strlen ( buf
), " " );
412 notice ( s_GameServ
, sender
-> getNick (), " %s%s Player Fights: %d " , buf
, space
, ni
-> stats
-> getPlayerFights ());
414 if ( ni
== sender
|| isAdmin ( sender
))
416 showinventory ( ni
-> stats
, sender
);
421 notice ( s_GameServ
, u
, " %s is not playing!" , ni
-> stats
-> getName (). c_str ());
426 char * spaces ( int len
, char * seperator
)
429 final
= new char [ 30 ];
431 strcpy ( final
, seperator
);
432 for ( y
= 0 ; y
< 30 - len
; y
++)
433 strcat ( final
, seperator
);
437 void raw ( const char * fmt
, ...)
442 input
= new char [ 1024 ];
444 memset ( input
, 0 , sizeof ( input
)); // Initialize to NULL
450 case 'd' : sprintf ( input
, " %s%d " , input
, va_arg ( args
, int )); break ;
451 case 's' : sprintf ( input
, " %s%s " , input
, va_arg ( args
, char *)); break ;
452 case 'S' : sprintf ( input
, " %s%s " , input
, s_GameServ
); break ;
455 sprintf ( input
, " %s%l d" , input
, va_arg ( args
, long int )); break ;
460 sprintf ( input
, " %s%c " , input
, * t
);
465 log ( "Input: %s " , input
);
468 sprintf ( input
, " %s%s " , input
, " \r\n " );
469 sock_puts ( sock
, input
);
473 /* Send a NOTICE from the given source to the given nick. */
475 void notice ( const char * source
, const char * dest
, const char * fmt
, ...)
481 commanduse
= new char [ 16 ];
485 strcpy ( commanduse
, "P" );
487 strcpy ( commanduse
, "O" );
491 strcpy ( commanduse
, "PRIVMSG" );
493 strcpy ( commanduse
, "NOTICE" );
499 input
= new char [ 1024 ];
506 sprintf ( input
, ": %s %s %s :" , source
, commanduse
, dest
);
508 sprintf ( input
, " %s %s %s :" , gsnum
, commanduse
, dest
);
516 sprintf ( input
, ": %s %s %s :" , source
, commanduse
, dest
);
518 sprintf ( input
, " %s %s %s :" , gsnum
, commanduse
, dest
);
527 case 'd' : sprintf ( input
, " %s%d " , input
, va_arg ( args
, int )); break ;
528 case 's' : sprintf ( input
, " %s%s " , input
, va_arg ( args
, char *)); break ;
529 case 'S' : sprintf ( input
, " %s%s " , input
, s_GameServ
); break ;
530 case 'c' : sprintf ( input
, " %s%c " , input
, va_arg ( args
, int )); break ;
533 sprintf ( input
, " %s%l d" , input
, va_arg ( args
, long int )); break ;
538 sprintf ( input
, " %s%c " , input
, * t
);
543 log ( "Input: %s " , input
);
545 sprintf ( input
, " %s%s " , input
, " \r\n " );
546 sock_puts ( sock
, input
);
547 delete [] commanduse
;
553 int strnicmp ( const char * s1
, const char * s2
, size_t len
)
559 while (( c
= tolower (* s1
)) == tolower (* s2
) && len
> 0 ) {
560 if ( c
== 0 || -- len
== 0 )
565 if ( c
< tolower (* s2
))
571 char * strtok ( char * str
, const char * delim
)
573 static char * current
= NULL
;
580 current
+= strspn ( current
, delim
);
581 ret
= * current
? current
: NULL
;
582 current
+= strcspn ( current
, delim
);
591 void do_check ( char * u
)
593 int days
, hours
, minutes
, seconds
;
595 complete
= ( lastrefresh
+ refreshperiod
) - time ( NULL
);
596 days
= complete
/ 86400 ;
597 hours
= ( complete
% 86400 ) / 3600 ;
598 minutes
= ( complete
% 86400 ) % 3600 / 60 ;
599 seconds
= ( complete
% 86400 ) % 3600 % 60 ;
601 notice ( s_GameServ
, u
, "Time left to next refresh: %d d %d h %d m %d s" ,
602 days
, hours
, minutes
, seconds
);
604 if ( isRolloverForestFights ())
606 complete
= ( lastrollover
+ rolloverperiod
) - time ( NULL
);
608 days
= complete
/ 86400 ;
609 hours
= ( complete
% 86400 ) / 3600 ;
610 minutes
= ( complete
% 86400 ) % 3600 / 60 ;
611 seconds
= ( complete
% 86400 ) % 3600 % 60 ;
613 notice ( s_GameServ
, u
, "Time left to next rollover: %d d %d h %d m %d s" ,
614 days
, hours
, minutes
, seconds
);
618 void do_list ( char * u
)
621 char * cmd
= strtok ( NULL
, " " );
623 if (!( user
= find ( u
)))
625 log ( "Fatal Error: Couldn't find %s in the client list" , u
);
628 else if ( isIgnore ( user
))
631 log ( "Ignoring %s . Command LIST" , user
-> getNick ());
636 ListNode
< aClient
> * temp
;
639 for ( unsigned long x
= 0 ; x
< U_TABLE_SIZE
; x
++)
641 temp
= players
[ x
]. First ();
642 if (! players
[ x
]. isEmpty ())
646 if ( cmd
|| is_playing ( temp
-> getData ()))
650 notice ( s_GameServ
, u
, "Players:" );
654 notice ( s_GameServ
, u
, "IRC: %s Game: %s " , temp
-> getData ()-> getRealNick (),
655 temp
-> getData ()-> stats
-> getName (). c_str ());
657 notice ( s_GameServ
, u
, "IRC: %s Game: %s " , temp
-> getData ()-> getNick (),
658 temp
-> getData ()-> stats
-> getName (). c_str ());
667 notice ( s_GameServ
, u
, "No one is playing" );
669 notice ( s_GameServ
, u
, "End of List" );
674 aClient
* user
, * target
;
675 char * name
= strtok ( NULL
, " " );
676 char * cmd
= strtok ( NULL
, " " );
679 if (!( user
= find ( u
)))
681 notice ( s_GameServ
, u
, "Fatal error. Cannot find aClient. " \
682 "Buf: %s LOGOUT" , u
);
685 else if ( isIgnore ( user
))
688 log ( "Ignoring %s ." , user
-> getNick ());
692 else if (! name
|| ! cmd
)
694 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}" );
697 else if (!( target
= findplayer ( name
)))
699 // Back the pointers up... they didn't send a name probably
704 if (! is_playing ( user
))
706 notice ( s_GameServ
, u
, "You must be playing to set things for yourself!" );
712 cmd2
= strtok ( NULL
, " " );
716 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}" );
720 // Regardless of the previous if/else, if it got here, we know we have the cmd pointer at the right spot.
721 if ( stricmp ( cmd
, "PASSWORD" ) == 0 )
723 // Person is looking to change their password
724 // If they're an admin, or it's theirself, allow it
725 // cmd2 is pointing to the password now
726 if ( isAdmin ( user
) || user
== target
)
728 target
-> stats
-> setPassword ( cmd2
);
729 notice ( s_GameServ
, u
, "Password successfully changed" );
731 else if ( user
!= target
&& ! isAdmin ( user
))
733 notice ( s_GameServ
, u
, "You must be a %S admin to set other peoples' passwords." );
737 else if ( stricmp ( cmd
, "BANK" ) == 0 || stricmp ( cmd
, "BALANCE" ) == 0 )
741 notice ( s_GameServ
, u
, "Admins Only!" );
744 else if ( stricmp ( cmd
, "BANK" ) == 0 )
746 cmd2
= strtok ( NULL
, " " ); // Need an extra parameter for set bank balance
750 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] [BANK] BALANCE <NUMBER>" );
754 target
-> stats
-> setBank ( stringtoint ( cmd2
));
756 notice ( s_GameServ
, u
, "Bank balance changed to %l d!" , target
-> stats
-> getBank ());
758 else if ( stricmp ( cmd
, "PLAYER" ) == 0 )
762 notice ( s_GameServ
, u
, "Admins Only!" );
765 else if ( stricmp ( cmd2
, "FIGHTS" ) != 0 )
767 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>" );
772 cmd2
= strtok ( NULL
, " " );
775 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] PLAYER FIGHTS <NUMBER>" );
778 target
-> stats
-> setPlayerFights ( stringtoint ( cmd2
));
780 notice ( s_GameServ
, u
, "Player fights changed to %d !" , target
-> stats
-> getPlayerFights ());
783 else if ( stricmp ( cmd
, "FOREST" ) == 0 )
787 notice ( s_GameServ
, u
, "Admins Only!" );
790 else if ( stricmp ( cmd2
, "FIGHTS" ) != 0 )
792 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <number>" );
797 cmd2
= strtok ( NULL
, " " );
800 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] FOREST FIGHTS <NUMBER>" );
804 target
-> stats
-> setForestFights ( stringtoint ( cmd2
));
806 notice ( s_GameServ
, u
, "Forest fights changed to %d !" , target
-> stats
-> getForestFights ());
809 else if ( stricmp ( cmd
, "GOLD" ) == 0 )
813 notice ( s_GameServ
, u
, "Admins Only!" );
820 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] GOLD <NUMBER>" );
823 target
-> stats
-> setGold ( stringtoint ( cmd2
));
825 notice ( s_GameServ
, u
, "Gold set to %l d" , target
-> stats
-> getGold ());
829 else if ( stricmp ( cmd
, "STRENGTH" ) == 0 && stricmp ( cmd2
, "POTIONS" ) != 0 )
833 notice ( s_GameServ
, u
, "Admins Only!" );
840 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] STRENGTH <NUMBER>" );
844 target
-> stats
-> setStrength ( stringtoint ( cmd2
));
846 notice ( s_GameServ
, u
, "Strength set to %d " , target
-> stats
-> getStrength ());
850 else if ( stricmp ( cmd
, "DEFENSE" ) == 0 && stricmp ( cmd2
, "POTIONS" ) != 0 )
854 notice ( s_GameServ
, u
, "Admins Only!" );
861 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] DEFENSE <NUMBER>" );
865 target
-> stats
-> setDefense ( stringtoint ( cmd2
));
867 notice ( s_GameServ
, u
, "Defense set to %d " , target
-> stats
-> getDefense ());
871 else if ( stricmp ( cmd
, "HP" ) == 0 && stricmp ( cmd2
, "POTIONS" ) != 0 )
875 notice ( s_GameServ
, u
, "Admins Only!" );
882 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] HP <NUMBER>" );
885 target
-> stats
-> setHP ( stringtoint ( cmd2
));
887 notice ( s_GameServ
, u
, "HP set to %d " , target
-> stats
-> getHP ());
891 else if ( stricmp ( cmd
, "MAXHP" ) == 0 )
895 notice ( s_GameServ
, u
, "Admins Only!" );
902 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] MAXHP <NUMBER>" );
905 target
-> stats
-> setMaxHP ( stringtoint ( cmd2
));
907 notice ( s_GameServ
, u
, "MaxHP set to %d " , target
-> stats
-> getMaxHP ());
911 else if ( stricmp ( cmd
, "EXPERIENCE" ) == 0 || stricmp ( cmd
, "EXP" ) == 0 )
915 notice ( s_GameServ
, u
, "Admins Only!" );
922 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] {EXPERIENCE|EXP} <NUMBER>" );
926 target
-> stats
-> setExp ( stringtoint ( cmd2
));
928 notice ( s_GameServ
, u
, "Exp set to %l d" , target
-> stats
-> getExp ());
932 else if ( stricmp ( cmd
, "LEVEL" ) == 0 )
936 notice ( s_GameServ
, u
, "Admins Only!" );
943 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] LEVEL <NUMBER>" );
946 target
-> stats
-> setLevel ( stringtoint ( cmd2
));
948 notice ( s_GameServ
, u
, "Level set to %d " , target
-> stats
-> getLevel ());
952 else if ( stricmp ( cmd
, "ALIVE" ) == 0 )
956 notice ( s_GameServ
, u
, "Admins Only!" );
963 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] ALIVE TRUE|FALSE" );
966 else if ( stricmp ( cmd2
, "TRUE" ) == 0 )
968 notice ( s_GameServ
, u
, " %s has been Resurrected!" , target
-> stats
-> getName (). c_str ());
969 setAlive ( target
-> stats
);
973 notice ( s_GameServ
, u
, " %s is now dead!" , target
-> stats
-> getName (). c_str ());
974 clearAlive ( target
-> stats
);
978 else if ( stricmp ( cmd
, "SEEN" ) == 0 )
982 notice ( s_GameServ
, u
, "Admins Only!" );
985 else if ( stricmp ( cmd2
, "MASTER" ) != 0 )
987 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] SEEN MASTER {TRUE|FALSE}" );
992 cmd2
= strtok ( NULL
, " " );
995 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NICK] SEEN MASTER {TRUE|FALSE}" );
998 else if ( stricmp ( cmd2
, "TRUE" ) == 0 )
1000 notice ( s_GameServ
, u
, " %s has seen their master now." , target
-> stats
-> getName (). c_str ());
1001 target
-> stats
-> addFlag ( FLAG_MASTER
);
1005 notice ( s_GameServ
, u
, " %s has not seen their master now." , target
-> stats
-> getName (). c_str ());
1006 target
-> stats
-> remFlag ( FLAG_MASTER
);
1012 notice ( s_GameServ
, u
, "Unknown command: SET %s " , cmd
);
1013 notice ( s_GameServ
, u
, "SYNTAX: /msg %S SET [NAME] {PASSWORD|BANK BALANCE|PLAYER FIGHTS|FOREST FIGHTS|GOLD|STRENGTH|DEFENSE|HP|MAXHP|EXP|LEVEL|ALIVE|SEEN MASTER} {STRING|NUMBER|TRUE|FALSE}" );
1018 void do_logout ( char * u
)
1021 char * name
= strtok ( NULL
, " " );
1023 if (!( user
= find ( u
)))
1025 notice ( s_GameServ
, u
, "Fatal error. Cannot find aClient. " \
1026 "Buf: %s LOGOUT" , u
);
1027 log ( "Could not find aClient Buf: %s LOGOUT" ,
1031 else if ( isIgnore ( user
))
1034 log ( "Ignoring %s ." , user
-> getNick ());
1043 notice ( s_GameServ
, u
, "You must be a %S admin to use this command!" );
1045 else if (!( user
= findplayer ( name
)))
1047 notice ( s_GameServ
, u
, "Couldn't find a player named %s " , name
);
1051 notice ( s_GameServ
, u
, "Logging out %s " , user
-> stats
-> getName (). c_str ());
1057 if (! is_playing ( user
))
1059 notice ( s_GameServ
, u
, "You're not logged in!" );
1061 else if ( is_fighting ( user
))
1063 notice ( s_GameServ
, u
, "You can't logout while fighting!" );
1067 notice ( s_GameServ
, u
, "You have left the fields. You have lived to kill another day!" );
1073 void logout ( aClient
* user
)
1075 if ( is_playing ( user
))
1077 ListNode
< aClient
> * it
;
1079 unsigned long hv
= iHASH (( unsigned char *) user
-> stats
-> getName (). c_str ());
1080 it
= players
[ hv
]. Find ( user
);
1084 notice ( s_GameServ
, user
-> getNick (), "Fatal error. Contact " \
1085 " %S Admin. Cannot find you in the players list." );
1086 log ( "Error on logout(). Can't find %s in the players list" ,
1097 temp
-> stats
= new Player
;
1098 temp
-> stats
-> setData ( user
-> stats
);
1099 user
-> stats
-> setClient ( NULL
);
1101 if ( player_fight ( user
))
1102 user
-> stats
-> getBattle ()-> stats
-> delBattle ();
1106 temp
-> stats
-> setClient ( NULL
);
1108 temp
-> setRealNick ( "Not Playing" );
1110 temp
-> setNick ( "Not Playing" );
1112 it
-> setNewPtr ( temp
);
1114 log ( "Logged out player %s " ,
1126 void do_register ( char * u
)
1128 char * password
, * name
;
1130 name
= strtok ( NULL
, " " );
1131 password
= strtok ( NULL
, " " );
1135 notice ( s_GameServ
, u
, "SYNTAX: /msg %S REGISTER NAME PASSWORD" );
1137 else if ( stricmp ( name
, s_GameServ
) == 0 )
1139 notice ( s_GameServ
, u
, "You can't use %S as a name!" );
1143 notice ( s_GameServ
, u
, "SYNTAX: /msg %S REGISTER NAME PASSWORD" );
1145 else if (( user
= findplayer ( name
)))
1147 notice ( s_GameServ
, u
, " %s is already registered!" , name
);
1148 notice ( s_GameServ
, u
, "Choose another name!" );
1150 else if (!( user
= find ( u
)))
1152 log ( "Fatal Error: Couldn't find %s in the clients list" , u
);
1154 else if (! alphaNumeric ( name
))
1156 notice ( s_GameServ
, u
, "That is not a valid name. Please use only AlphaNumeric (A-Z, 0-9) characters!" );
1158 else if ( isIgnore ( user
))
1161 log ( "Ignoring %s ." , user
-> getNick ());
1166 if (! is_playing ( user
))
1168 ListNode
< aClient
> * temp
;
1170 user
-> stats
= new Player ();
1171 user
-> stats
-> setClient ( user
); // Set the backwards pointer
1172 user
-> stats
-> reset (); // set the user up
1173 user
-> stats
-> setPassword ( password
);
1174 user
-> stats
-> setName ( name
);
1175 unsigned long hv
= iHASH (( unsigned char *) name
);
1176 updateTS ( user
-> stats
);
1177 temp
= players
[ hv
]. insertAtBack_RLN ( user
);
1178 temp
-> setPtr ( user
); // This is an extra step, but necessary for now
1180 // Update the last login time
1181 user
-> stats
-> lastlogin
= time ( NULL
);
1183 notice ( s_GameServ
, u
, "Player %s registered with password %s ." , user
-> stats
-> getName (). c_str (), password
);
1184 notice ( s_GameServ
, u
, "Write this password down. If you lose it, there is no way to retrieve it!" );
1185 log ( "Nickname %s registered player %s ." , u
, user
-> stats
-> getName (). c_str ());
1186 setPlaying ( user
); // set the playing flag
1187 tempItem
= findItemByID ( 3001 );
1188 user
-> stats
-> inventory
-> addItem ((* Items
. begin ()))-> use ( user
-> stats
); // Add the stick
1189 user
-> stats
-> inventory
-> addItem ( tempItem
)-> use ( user
-> stats
); // Add Clothes
1193 notice ( s_GameServ
, u
, "Already registered. Contact a %S admin for help." );
1198 void do_identify ( char * u
)
1200 char * password
, * name
;
1202 name
= strtok ( NULL
, " " );
1203 password
= strtok ( NULL
, " " );
1204 if (! password
|| ! name
)
1206 notice ( s_GameServ
, u
, "SYNTAX: /msg %S IDENTIFY NAME PASSWORD" );
1208 else if (!( user
= find ( u
)))
1210 notice ( s_GameServ
, u
, "Fatal error. Cannot find aClient. Buf: %s " , strtok ( NULL
, "" ));
1211 log ( "Error: aClient not found: %s " , u
);
1213 else if ( isIgnore ( user
))
1216 log ( "Ignoring %s ." , user
-> getNick ());
1220 else if (!( p
= findplayer ( name
)) || ! p
-> stats
)
1221 notice ( s_GameServ
, u
, "Player %s not found" , name
);
1222 else if ( is_playing ( user
))
1224 notice ( s_GameServ
, u
, "You are already playing!" );
1226 else if ( p
-> stats
-> getClient () != NULL
&& ! isAdmin ( user
))
1228 notice ( s_GameServ
, u
, "That player has already identified." );
1230 else if (! check_password ( name
, password
) && ! isAdmin ( user
))
1232 notice ( s_GameServ
, u
, "Password incorrect" );
1236 ListNode
< aClient
> * temp
;
1237 unsigned long hv
= iHASH (( unsigned char *) p
-> stats
-> getName (). c_str ());
1238 temp
= players
[ hv
]. Find ( p
);
1241 notice ( s_GameServ
, u
, "Fatal error. Contact %S Admin. Buf: %s " ,
1245 user
-> stats
= new Player ( p
-> stats
-> getName ());
1247 log ( "Setting data for identified" );
1249 user
-> stats
-> setData ( p
-> stats
);
1250 user
-> stats
-> setClient ( user
);
1251 updateTS ( user
-> stats
);
1255 log ( "Player %s IRC: %s Identified" , user
-> stats
-> getName (). c_str (),
1259 setPlaying ( user
); // set the playing flag
1263 // Update the last login time
1264 user
-> stats
-> lastlogin
= time ( NULL
);
1266 notice ( s_GameServ
, u
, "Password Accepted. Identified." );
1267 showNews ( u
, todaysnews
);
1271 void do_stats ( char * u
)
1276 nick
= strtok ( NULL
, " " );
1278 if (!( user
= find ( u
)))
1280 log ( "Fatal Error: %s not found in client list" , u
);
1283 else if ( isIgnore ( user
))
1286 log ( "Ignoring %s ." , user
-> getNick ());
1292 if (! is_playing ( user
))
1294 notice ( s_GameServ
, u
, "You're not playing, so you have no stats!" );
1299 updateTS ( user
-> stats
);
1300 showstats ( u
, user
-> stats
-> getName (). c_str ());
1309 ifstream
infile ( masterdata
);
1312 buf
= new char [ 1024 ];
1316 log ( "Error opening %s " , masterdata
);
1321 log ( "Loading masters from %s " , masterdata
);
1324 for ( l
= 0 ; l
< LEVELS
- 1 ; l
++)
1326 infile
. getline ( buf
, 1024 , ' \n ' );
1329 if ( buf
[ 0 ] == '#' || buf
[ 0 ] == ' \n ' || buf
[ 0 ] == ' \r ' )
1334 else if ( buf
[ 0 ] == '^' )
1337 Monster
* master
= & levels
[ l
]. master
;
1339 char * name
, * weapon
, * strength
, * gold
, * exp
, * maxhp
, * death
;
1342 name
= strtok ( buf
, "~" );
1343 weapon
= strtok ( NULL
, "~" );
1344 strength
= strtok ( NULL
, "~" );
1345 gold
= strtok ( NULL
, "~" );
1346 exp
= strtok ( NULL
, "~" );
1347 maxhp
= strtok ( NULL
, "~" );
1348 death
= strtok ( NULL
, "~" );
1350 master
-> name
= name
;
1351 master
-> weapon
= weapon
;
1352 master
-> strength
= stringtoint ( strength
);
1353 master
-> gold
= stringtoint ( gold
);
1354 master
-> exp
= stringtoint ( exp
);
1355 master
-> maxhp
= stringtoint ( maxhp
);
1356 master
-> hp
= master
-> maxhp
;
1357 master
-> death
= death
;
1362 if ( l
< LEVELS
- 1 ) // We didn't load a master for every level - check data/masters.dat
1368 void delete_monsters ()
1370 for ( int x
= 0 ; x
< LEVELS
; x
++)
1371 levels
[ x
]. monsters
. deleteNodes ();
1374 void display_monster ( char * u
)
1378 aClient
* user
= find ( u
);
1379 Player
* ni
= user
-> stats
;
1381 notice ( s_GameServ
, u
, "Your Hitpoints: \ 2 %d \ 2 ", ni
-> getHP ());
1382 notice ( s_GameServ
, u
, " %s 's Hitpoints: \ 2 %d \ 2 ", ni
-> getMonster ()-> name
. c_str (), ni
-> getMonster ()-> hp
);
1383 notice ( s_GameServ
, u
, "Here are your commands:" );
1384 notice ( s_GameServ
, u
, "/msg %S attack" );
1385 notice ( s_GameServ
, u
, "/msg %S run" );
1386 notice ( s_GameServ
, u
, "What will you do?" );
1390 void display_players ( char * u
)
1393 if (!( user
= find ( u
)))
1395 log ( "Fatal error in display_players(): Couldn't find %s " , u
);
1398 display_players ( user
);
1401 void display_players ( aClient
* user
)
1403 char * u
= user
-> getNick ();
1404 if ( is_playing ( user
) && player_fight ( user
))
1406 aClient
* battle
= user
-> stats
-> getBattle ();
1407 notice ( s_GameServ
, u
, "Your Hitpoints: \ 2 %d \ 2 ", user
-> stats
-> getHP ());
1408 notice ( s_GameServ
, u
, " %s 's Hitpoints: \ 2 %d \ 2 ", battle
-> stats
-> getName (). c_str (), battle
-> stats
-> getHP ());
1409 notice ( s_GameServ
, u
, "Here are your commands:" );
1410 notice ( s_GameServ
, u
, "/msg %S attack" );
1411 notice ( s_GameServ
, u
, "/msg %S run" );
1412 notice ( s_GameServ
, u
, "What will you do?" );
1417 bool is_playing ( char * u
)
1420 if (!( user
= find ( u
)))
1423 return is_playing ( user
);
1426 bool is_playing ( aClient
* user
)
1428 if ( user
-> stats
== NULL
)
1432 else if ( user
-> stats
-> getClient () == NULL
)
1436 else if (! FL_is_playing ( user
))
1444 bool is_fighting ( char * u
)
1448 if (!( user
= find ( u
)))
1451 return is_fighting ( user
);
1454 bool is_fighting ( aClient
* user
)
1456 if (! is_playing ( user
))
1459 return player_fight ( user
) || master_fight ( user
) || user
-> stats
-> getMonster () != NULL
;
1462 bool player_fight ( char * u
)
1466 if (!( user
= find ( u
)))
1469 return player_fight ( user
);
1472 bool player_fight ( aClient
* user
)
1474 if (! is_playing ( user
))
1476 else if ( user
-> stats
-> getBattle () != NULL
&& is_playing ( user
-> stats
-> getBattle ()))
1478 return user
-> stats
-> getBattle ()-> stats
!= NULL
;
1483 bool master_fight ( char * u
)
1487 if (!( user
= find ( u
)))
1490 return master_fight ( user
);
1493 bool master_fight ( aClient
* user
)
1495 if (! is_playing ( user
))
1498 return user
-> stats
-> getMaster () != NULL
;
1501 bool dragon_fight ( char * u
)
1504 if (!( user
= find ( u
)))
1507 return dragon_fight ( user
);
1510 bool dragon_fight ( aClient
* user
)
1512 if (! is_playing ( user
))
1515 return ( isDragonFight ( user
-> stats
));
1518 bool alphaNumeric ( const char * str
)
1520 int len
= strlen ( str
);
1521 for ( int x
= 0 ; x
< len
; x
++)
1523 if (!(( int ( str
[ x
]) >= 65 && int ( str
[ x
]) <= 90 ) || ( int ( str
[ x
]) >= 97 && int ( str
[ x
]) <= 122 ) || ( int ( str
[ x
]) >= 48 && int ( str
[ x
]) <= 57 )))
1529 void do_fight ( char * u
)
1531 aClient
* ni
, * battle
;
1533 char * nick
= strtok ( NULL
, " " );
1537 notice ( s_GameServ
, u
, "SYNTAX: /msg %S FIGHT PLAYER" );
1540 else if (!( ni
= find ( u
)))
1542 notice ( s_GameServ
, u
, "Fatal error. Contact a(n) %S admin. buf: %s " , strtok ( NULL
, "" ));
1545 else if ( isIgnore ( ni
))
1548 log ( "Ignoring %s ." , ni
-> getNick ());
1552 else if (! is_playing ( ni
))
1554 notice ( s_GameServ
, u
, "You are not playing!" );
1558 updateTS ( ni
-> stats
);
1560 if ( ni
-> stats
-> getPlayerFights () <= 0 )
1562 ni
-> stats
-> setPlayerFights ( 0 ); // just to be safe
1563 notice ( s_GameServ
, u
, "You are out of player fights for the " \
1564 "day. You have to wait until tomorrow!" );
1566 else if (!( battle
= findplayer ( nick
)))
1568 notice ( s_GameServ
, u
, "Player %s not found!" , nick
);
1570 else if (! isAlive ( ni
-> stats
))
1572 notice ( s_GameServ
, u
, "You are dead. Wait until tomorrow to fight others!" );
1574 else if (! is_playing ( battle
))
1576 notice ( s_GameServ
, u
, "You can't attack %s while they aren't playing!" , nick
);
1579 /* offline fighting not available yet
1580 else if (!(fight = finduser(nick)))
1582 ni->stats->battle = battle;
1583 battle->battle = ni;
1584 setYourTurn(ni->stats);
1585 clearYourTurn(battle->stats);
1587 notice(s_GameServ, u, "You decide to fight %s while they're "\
1588 "not in the realm!",
1589 battle->stats->name.c_str());
1593 else if ( stricmp ( ni
-> stats
-> getName (). c_str (), battle
-> stats
-> getName (). c_str ()) == 0 )
1595 notice ( s_GameServ
, u
, "Are you trying to commit suicide!?" );
1597 else if (! isAlive ( battle
-> stats
))
1599 notice ( s_GameServ
, u
, "They are dead. Cannot fight dead players!" );
1601 else if ( player_fight ( battle
))
1603 notice ( s_GameServ
, u
, " %s is fighting %s already!" , battle
-> stats
-> getName (). c_str (), battle
-> stats
-> getBattle ()-> stats
-> getName (). c_str ());
1605 else if ( master_fight ( battle
))
1607 notice ( s_GameServ
, u
, " %s is fighting their master!" , battle
-> stats
-> getName (). c_str ());
1609 else if ( is_fighting ( battle
))
1611 notice ( s_GameServ
, u
, " %s is fighting %s already!" , battle
-> stats
-> getName (). c_str (), battle
-> stats
-> getMonster ()-> name
. c_str ());
1613 else if (! isAdmin ( ni
) && isFairFights () && ( ni
-> stats
-> getStrength ()/ 2 - battle
-> stats
-> getDefense ()) > battle
-> stats
-> getHP ())
1615 notice ( s_GameServ
, u
, "Fair fighting is enabled, and you're too strong for %s !" , battle
-> stats
-> getName (). c_str ());
1617 else if ( ni
-> stats
-> getLevel () - battle
-> stats
-> getLevel () > maxbfightdistance
)
1619 // You can't fight someone below you by more than X level(s)
1620 // level 12 can fight level (12 - X) but not < (12 - X)
1621 notice ( s_GameServ
, u
, "You may not fight %s . You're too strong!" ,
1622 battle
-> stats
-> getName (). c_str ());
1624 else if ( battle
-> stats
-> getLevel () - ni
-> stats
-> getLevel () > maxafightdistance
)
1626 // You can't fight someone above you by more than X level(S)
1627 // level 1 can fight level (1 + X), but not > (1 + X)
1628 notice ( s_GameServ
, u
, " %s , do you really have a death wish? Try the forest you " \
1629 "weakling!" , ni
-> stats
-> getName (). c_str ());
1633 // Set your battle pointer to the other player
1634 ni
-> stats
-> setBattle ( battle
);
1636 // Set the other player's battle pointer to you
1637 battle
-> stats
-> setBattle ( ni
);
1639 // The initiator gets the first move (perhaps this should be 50/50)
1640 setYourTurn ( ni
-> stats
);
1641 clearYourTurn ( battle
-> stats
);
1643 // Initiate Battle sequence!
1644 ni
-> stats
-> subtractPlayerFights ( 1 );
1646 notice ( s_GameServ
, u
, "You challenge %s to an online duel!" , battle
-> stats
-> getName (). c_str ());
1647 notice ( s_GameServ
, c_Forest
, " %s walks up and hits %s in the face! Let's see who will bite the dust." ,
1648 ni
-> stats
-> getName (). c_str (), battle
-> stats
-> getName (). c_str ()); /* DrLnet - Modified by Kain*/
1650 notice ( s_GameServ
, battle
-> getNick (), " %s has challenged you to an online duel!" , ni
-> stats
-> getName (). c_str ());
1651 notice ( s_GameServ
, battle
-> getNick (), " %s gets to go first " \
1652 "because they initiated!" , ni
-> stats
-> getName (). c_str ());
1653 notice ( s_GameServ
, battle
-> getNick (), "Please wait while %s decides what to do." , ni
-> stats
-> getName (). c_str ());
1654 display_players ( ni
);
1658 void do_equip ( char * u
)
1662 itemContainer
* equip
;
1665 char * item
= strtok ( NULL
, " " );
1667 if (! item
|| int ( item
[ 0 ]) < 48 || int ( item
[ 0 ] > 57 ))
1669 notice ( s_GameServ
, u
, "SYNTAX: EQUIP ####" );
1670 notice ( s_GameServ
, u
, "Type /msg %S HELP EQUIP for more information." );
1673 else if (!( user
= find ( u
)))
1675 notice ( s_GameServ
, u
, "Fatal error in do_equip. Contact a(n) %S Admin" );
1678 else if ( isIgnore ( user
))
1681 log ( "Ignoring %s ." , user
-> getNick ());
1685 else if (! is_playing ( user
))
1687 notice ( s_GameServ
, u
, "You must be playing to equip weapons and armor!" );
1690 id
= stringtoint ( item
);
1691 updateTS ( user
-> stats
);
1692 p
= user
-> stats
-> inventory
;
1695 if (!( equip
= p
-> Find ( id
)))
1699 notice ( s_GameServ
, u
, "You aren't carrying that item!" );
1701 showinventory ( user
-> stats
, user
);
1703 else if ( equip
-> getItem ()-> getType () != ARMOR
&& equip
-> getItem ()-> getType () != WEAPON
)
1705 notice ( s_GameServ
, u
, "You can't use %s like that. Try /msg %S use" , equip
-> getItem ()-> getName (). c_str ());
1710 notice ( s_GameServ
, u
, "You equip %s ." , equip
-> getItem ()-> getName (). c_str ());
1711 equip
-> use ( user
-> stats
);
1714 void do_use ( char * u
)
1719 char * item
= strtok ( NULL
, " " );
1721 itemContainer
* used
;
1723 if (! item
|| int ( item
[ 0 ]) < 48 || int ( item
[ 0 ]) > 57 )
1725 notice ( s_GameServ
, u
, "SYNTAX: USE ####" );
1726 notice ( s_GameServ
, u
, "Type /msg %S HELP USE for more information." );
1729 else if (!( user
= find ( u
)))
1731 notice ( s_GameServ
, u
, "Fatal Error in do_use. Contact a(n) %S Admin" );
1734 else if ( isIgnore ( user
))
1737 log ( "Ignoring %s ." , user
-> getNick ());
1741 else if (! is_playing ( user
))
1743 notice ( s_GameServ
, u
, "You must be playing to use items!" );
1746 id
= stringtoint ( item
);
1747 updateTS ( user
-> stats
);
1748 p
= user
-> stats
-> inventory
;
1751 if (!( used
= p
-> Find ( id
)))
1755 notice ( s_GameServ
, u
, "You aren't carrying that item!" );
1757 showinventory ( user
-> stats
, user
);
1759 else if ( used
-> getItem ()-> getType () != POTION
)
1761 notice ( s_GameServ
, u
, "You can't use %s like that. Try /msg %S equip" , used
-> getItem ()-> getName (). c_str ());
1766 notice ( s_GameServ
, u
, "You used %s ." , used
-> getItem ()-> getName (). c_str ());
1767 used
-> use ( user
-> stats
);
1768 if ( used
-> getUses () <= 0 )
1770 p
-> deleteItem ( used
-> getItem ());
1775 void do_run ( char * u
)
1778 Player
* p
, * p2
= NULL
;
1780 if (!( user
= find ( u
)))
1782 notice ( s_GameServ
, u
, "Couldn't find you. Error. Contact a %S admin" );
1785 else if ( isIgnore ( user
))
1788 log ( "Ignoring %s ." , user
-> getNick ());
1792 else if (! is_playing ( user
))
1794 notice ( s_GameServ
, u
, "You must be playing to run!" );
1798 updateTS ( user
-> stats
);
1802 p2
= p
-> getBattle ()-> stats
;
1804 if (! is_fighting ( user
))
1805 notice ( s_GameServ
, u
, "You run in place... try fighting next time." );
1806 else if (! player_fight ( user
) && ! master_fight ( user
) && ! dragon_fight ( user
))
1808 notice ( s_GameServ
, u
, "You run away from \ 2 %s \ 2 like a little baby!", p
-> getMonster ()-> name
. c_str ());
1811 else if ( player_fight ( user
) && isYourTurn ( p
))
1813 notice ( s_GameServ
, u
, "You run away from \ 2 %s \ 2 like a little baby!", p2
-> getName (). c_str ());
1814 notice ( s_GameServ
, p
-> getBattle ()-> getNick (), "\ 2 %s \ 2 ran away from you like a little baby!", p
-> getName (). c_str ());
1815 addNews ( todaysnews
, " %s ran away from %s like a little baby!!" , p
-> getName (). c_str (), p2
-> getName (). c_str ()); /* DrLnet - edited by Kain */
1818 else if ( player_fight ( user
) && ! isYourTurn ( p
))
1820 notice ( s_GameServ
, u
, "It is not your turn. Please wait until \ 2 %s \ 2 decides what to do.", p2
-> getName (). c_str ());
1822 else if ( master_fight ( user
))
1824 notice ( s_GameServ
, u
, "You cannot run from \ 2 %s \ 2 ! FIGHT!", p
-> getMaster ()-> name
. c_str ());
1826 else if ( dragon_fight ( user
))
1828 notice ( s_GameServ
, u
, "You cannot run from %s ! FIGHT!" , dragon
. name
. c_str ());
1832 void end_turn ( aClient
* user
)
1834 char * nick
, * u
= user
-> getNick ();
1839 nick
= new char [ strlen ( user
-> getNick ()) + 1 ];
1841 if (! user
|| ! is_playing ( user
) || ! is_fighting ( user
))
1844 if (! player_fight ( user
) && ! master_fight ( user
))
1845 fight
= user
-> stats
-> getMonster ();
1847 fight
= user
-> stats
-> getMaster ();
1848 battle
= user
-> stats
-> getBattle ();
1850 if (! player_fight ( user
))
1853 mhit
= ( fight
-> strength
/ 2 ) + ( rand () % ( fight
-> strength
/ 2 )) - ( user
-> stats
-> getDefense ());
1858 mhit
= ( battle
-> stats
-> getStrength () / 2 ) + ( rand () % ( battle
-> stats
-> getStrength () / 2 )) - user
-> stats
-> getDefense ();
1860 if (! player_fight ( user
))
1865 notice ( s_GameServ
, u
, "\1f %s \1f attacks with their \1f %s \1f for \ 2 %d \ 2 damage!",
1866 fight
-> name
. c_str (), fight
-> weapon
. c_str (), mhit
);
1869 notice ( s_GameServ
, u
, " %s completely misses you!" , fight
-> name
. c_str ());
1871 if ( mhit
>= user
-> stats
-> getHP ())
1873 if (! master_fight ( user
))
1875 notice ( s_GameServ
, u
, "You have been \ 2 \1f killed\1f \ 2 by %s !" , fight
-> name
. c_str ());
1876 notice ( s_GameServ
, u
, "You lose all gold on hand and lose 10 percent " \
1877 "of your experience!" );
1878 user
-> stats
-> setGold ( 0 );
1879 user
-> stats
-> subtractExp (( long int )( user
-> stats
-> getExp () * .10 ));
1880 user
-> stats
-> setHP ( 0 );
1881 user
-> stats
-> delMonster ();
1882 clearAlive ( user
-> stats
);
1887 notice ( s_GameServ
, u
, " %s has bested you! You will have to wait " \
1888 "until tomorrow to try again" , user
-> stats
-> getMaster ()-> name
. c_str ());
1889 user
-> stats
-> delMonster ();
1890 user
-> stats
-> delMaster ();
1897 user
-> stats
-> subtractHP ( mhit
);
1904 clearYourTurn ( user
-> stats
);
1905 setYourTurn ( battle
-> stats
);
1906 display_players ( battle
);
1912 void do_heal ( char * u
)
1915 char * amount
= strtok ( NULL
, " " );
1920 notice ( s_GameServ
, u
, "SYNTAX: /msg %S HEAL {ALL | #}" );
1923 else if (!( ni
= find ( u
)))
1925 notice ( s_GameServ
, u
, "Fatal error. Contact a(n) %S admin. buf: %s " , strtok ( NULL
, "" ));
1928 else if ( isIgnore ( ni
))
1931 log ( "Ignoring %s ." , ni
-> getNick ());
1935 else if (! is_playing ( ni
))
1937 notice ( s_GameServ
, u
, "You aren't playing!" );
1940 else if (! isAlive ( ni
-> stats
))
1942 notice ( s_GameServ
, u
, "You are dead. Wait until tomorrow for healing." );
1945 else if ( is_fighting ( ni
))
1947 notice ( s_GameServ
, u
, "You can't heal in battle!" );
1950 else if ( ni
-> stats
-> getHP () >= ni
-> stats
-> getMaxHP ())
1952 notice ( s_GameServ
, u
, "You don't need healing!" );
1956 updateTS ( ni
-> stats
);
1957 if ( stricmp ( amount
, "ALL" ) == 0 )
1959 price
= ni
-> stats
-> getLevel () * 3 ;
1960 if ( ni
-> stats
-> getGold () < ( ni
-> stats
-> getMaxHP () - ni
-> stats
-> getHP ()) * price
)
1962 notice ( s_GameServ
, u
, "Healing \ 2 %d \ 2 points for \ 2 %d \ 2 gold per point.",
1963 ( long int ) ni
-> stats
-> getGold ()/ price
, price
);
1964 ni
-> stats
-> addHP ( ni
-> stats
-> getGold () / price
);
1965 ni
-> stats
-> setGold ( ni
-> stats
-> getGold () % price
);
1969 notice ( s_GameServ
, u
, "Healing all possible points at \ 2 %d \ 2 gold "\
1970 "per point." , price
);
1971 notice ( s_GameServ
, u
, "\ 2 %d \ 2 points healed for \ 2 %l d\ 2 gold. HP at MAX!" ,
1972 ( ni
-> stats
-> getMaxHP () - ni
-> stats
-> getHP ()),
1973 ( price
* ( ni
-> stats
-> getMaxHP () - ni
-> stats
-> getHP ())) );
1974 ni
-> stats
-> subtractGold ( price
* ( ni
-> stats
-> getMaxHP () - ni
-> stats
-> getHP ()));
1975 ni
-> stats
-> healall ();
1978 else if ( isstringnum ( amount
))
1980 num
= stringtoint ( amount
);
1981 price
= ni
-> stats
-> getLevel () * 3 ;
1982 if ( ni
-> stats
-> getGold () < price
* num
)
1984 notice ( s_GameServ
, u
, "You only have enough gold to heal \ 2 %d \ 2 points!",
1985 ( long int ) ni
-> stats
-> getGold ()/ price
);
1987 else if ( num
<= ni
-> stats
-> getMaxHP () - ni
-> stats
-> getHP ())
1989 notice ( s_GameServ
, u
, "Healing \ 2 %d \ 2 points at \ 2 %d \ 2 gold per point.",
1991 ni
-> stats
-> addHP ( num
);
1992 ni
-> stats
-> subtractGold ( num
* price
);
1994 else if ( num
> ni
-> stats
-> getMaxHP () - ni
-> stats
-> getHP ())
1996 notice ( s_GameServ
, u
, "Healing all possible points at \ 2 %d \ 2 gold "\
1997 "per point." , price
);
1998 notice ( s_GameServ
, u
, "\ 2 %d \ 2 points healed. HP at MAX!",
1999 ( ni
-> stats
-> getMaxHP () - ni
-> stats
-> getHP ()));
2000 ni
-> stats
-> subtractGold ( price
* ( ni
-> stats
-> getMaxHP () - ni
-> stats
-> getHP ()));
2001 ni
-> stats
-> healall ();
2004 else if ( amount
[ 0 ] == '-' )
2005 notice ( s_GameServ
, u
, "You trying to cheat?" );
2007 notice ( s_GameServ
, u
, "SYNTAX: /msg %S HEAL {ALL | #}" );
2010 int isstringnum ( char * num
)
2013 for ( x
= 0 ; x
< strlen ( num
); x
++)
2015 if (( int ) num
[ x
] < 48 || ( int ) num
[ x
] > 57 )
2021 long int stringtoint ( char * number
)
2023 return atol ( number
);
2026 long int pow ( int x
, int y
)
2032 if ( x
!= 0 && y
!= 0 )
2034 for ( count
= 1 ; count
<= y
- 1 ; count
++)
2042 long int chartoint ( char ch
)
2044 if ( int ( ch
) >= 48 && int ( ch
) <= 57 )
2045 return int ( ch
) - 48 ;
2052 ListNode
< aClient
> * ptr
;
2056 outfile
. open ( playerdata
);
2060 log ( "Error opening %s " , playerdata
);
2064 for ( unsigned long x
= 0 ; x
< U_TABLE_SIZE
; x
++)
2066 ptr
= players
[ x
]. First ();
2069 it
= ptr
-> getData ()-> stats
;
2072 w
= it
-> getWeapon ();
2075 outfile
<< it
-> getName (). c_str () << ' ' << it
-> getLevel () << ' ' << it
-> getExp () << ' ' << it
-> getGold () << ' ' << it
-> getBank () << ' ' << it
-> getHP () << ' ' << it
-> getMaxHP () << ' ' << it
-> getStrength () << ' ' << it
-> getDefense () << ' ' << it
-> getForestFights () << ' ' << it
-> getPlayerFights () << ' ' << it
-> getFlags () << ' ' << it
-> getPassword (). c_str () << ' ' << it
-> lastlogin
<< ' ' << ( w
? w
-> getID () : 0 ) << ' ' << ( a
? a
-> getID () : 0 );
2077 // Traverse the list and write out each item ID and how many uses are left
2078 if (! it
-> inventory
-> isEmpty ())
2080 list
< itemContainer
> * myitems
;
2081 list
< itemContainer
>:: iterator item_iter
;
2082 myitems
= it
-> inventory
-> getItems ();
2084 for ( item_iter
= myitems
-> begin (); item_iter
!= myitems
-> end (); item_iter
++)
2086 outfile
<< ' ' << (* item_iter
). getItem ()-> getID () << ' ' << (* item_iter
). getUses ();
2102 infile
. open ( dragondata
);
2107 log ( "Error opening %s . Trying initialdragon.dat" , dragondata
);
2108 infile
. open ( "data/initialdragon.dat" );
2111 log ( "Error opening data/initialdragon.dat" );
2116 buf
= new char [ 1024 ];
2118 infile
. getline ( buf
, 1024 , ' \n ' );
2119 infile
. close (); // Done with the file... we have what we want
2121 dragon
. name
= strtok ( buf
, "~" );
2122 dragon
. weapon
= strtok ( NULL
, "~" );
2125 dragon
. strength
= stringtoint ( strtok ( NULL
, "~" ));
2126 dragon
. hp
= stringtoint ( strtok ( NULL
, "~" ));
2127 dragon
. defense
= stringtoint ( strtok ( NULL
, "~" ));
2128 dragon
. death
= strtok ( NULL
, "" );
2130 log ( "loaded dragon: %s " , dragon
. name
. c_str ());
2134 return save_dragon (); // Save the dragon file and return the status code :)
2141 outfile
. open ( dragondata
);
2145 log ( "Error opening %s . Exiting." , dragondata
);
2149 outfile
<< dragon
. name
. c_str () << '~' << dragon
. weapon
. c_str () << '~'
2150 << dragon
. strength
<< '~' << dragon
. hp
<< '~'
2151 << dragon
. defense
<< '~' << dragon
. death
. c_str () << " \n ^"
2164 buf
= new char [ 1024 ];
2167 infile
. open ( storeitemdata
);
2171 log ( "Error opening %s " , storeitemdata
);
2175 while ( infile
. getline ( buf
, 1024 , ' \n ' ))
2179 if ( buf
[ 0 ] != '#' && buf
[ 0 ] != ' \n ' && buf
[ 0 ] != '\0' )
2182 id
= stringtoint ( strtok ( buf
, "" ));
2183 tempItem2
= findItemByID ( id
);
2184 if ( tempItem2
== NULL
)
2186 log ( "Invalid ID in %s " , storeitemdata
);
2190 tempItem
= tempItem2
;
2191 store
. push_back ( tempItem
);
2196 log ( "Exception loading store: %s " , str
);
2208 tavernItem tempItem
;
2209 buf
= new char [ 1024 ];
2212 infile
. open ( tavernitemdata
);
2215 log ( "Error opening %s " , tavernitemdata
);
2219 while ( infile
. getline ( buf
, 1024 , ' \n ' ))
2223 if ( buf
[ 0 ] != '#' && buf
[ 0 ] != ' \n ' && buf
[ 0 ] != '\0' )
2226 id
= stringtoint ( strtok ( buf
, "~" ));
2227 level
= stringtoint ( strtok ( NULL
, "" ));
2228 tempItem2
= findItemByID ( id
);
2229 if ( tempItem2
== NULL
)
2231 log ( "Invalid ID in %s " , tavernitemdata
);
2234 tempItem
. setItem ( tempItem2
);
2235 tempItem
. setLevel ( level
);
2236 tavern
. push_back ( tempItem
);
2241 log ( "Exception loading tavern: %s " , str
);
2256 buf
= new char [ 1024 ];
2258 infile
. open ( itemdata
);
2262 log ( "Error opening %s " , itemdata
);
2266 while ( infile
. getline ( buf
, 1024 , ' \n ' ))
2272 if ( buf
[ 0 ] != '#' && buf
[ 0 ] != ' \n ' && buf
[ 0 ] != '\0' )
2277 tempItem
= new weapon ();
2280 tempItem
= new armor ();
2283 tempItem
= new potion ();
2286 log ( "Invalid Item Type %c in %s " , buf
[ 0 ], itemdata
);
2291 if ( tempItem
-> setData ( buf
))
2293 Items
. push_back ( tempItem
);
2299 log ( "Exception loading items: %s " , str
);
2313 char * tempname
, * buf
, * password
;
2315 buf
= new char [ 100000 ];
2317 infile
. open ( playerdata
);
2321 log ( "Error opening %s " , playerdata
);
2325 for ( int x
= 0 ; x
< U_TABLE_SIZE
; x
++)
2327 ListNode
< aClient
> * tempNode
;
2328 tempNode
= players
[ x
]. First ();
2331 if ( tempNode
-> getData ()-> stats
-> getClient ())
2333 logout ( tempNode
-> getData ()-> stats
-> getClient ());
2335 tempNode
= tempNode
-> Next ();
2337 players
[ x
]. deleteNodes ();
2340 while ( infile
. getline ( buf
, 100000 , ' \n ' ))
2343 tempname
= strtok ( buf
, " " );
2344 temp
-> stats
= new Player ( tempname
);
2347 p
-> setLevel ( stringtoint ( strtok ( NULL
, " " )));
2348 p
-> setExp ( stringtoint ( strtok ( NULL
, " " )));
2349 p
-> setGold ( stringtoint ( strtok ( NULL
, " " )));
2350 p
-> setBank ( stringtoint ( strtok ( NULL
, " " )));
2351 p
-> setHP ( stringtoint ( strtok ( NULL
, " " )));
2352 p
-> setMaxHP ( stringtoint ( strtok ( NULL
, " " )));
2353 p
-> setStrength ( stringtoint ( strtok ( NULL
, " " )));
2354 p
-> setDefense ( stringtoint ( strtok ( NULL
, " " )));
2355 p
-> setForestFights ( stringtoint ( strtok ( NULL
, " " )));
2356 p
-> setPlayerFights ( stringtoint ( strtok ( NULL
, " " )));
2357 p
-> setFlags ( stringtoint ( strtok ( NULL
, " " )));
2361 password
= strtok ( NULL
, " " );
2362 p
-> setRawPassword ( password
);
2363 temp
-> setNick ( "Not Playing" );
2365 temp
-> setRealNick ( "Not Playing" );
2367 tempname
= strtok ( NULL
, " " );
2369 p
-> lastlogin
= stringtoint ( tempname
);
2371 p
-> lastlogin
= time ( NULL
);
2373 tempname
= strtok ( NULL
, " " );
2374 tempnum
= stringtoint ( tempname
);
2377 p
-> setWeapon (* findItemByID ( tempnum
));
2380 tempname
= strtok ( NULL
, " " );
2381 tempnum
= stringtoint ( tempname
);
2385 p
-> setArmor (* findItemByID ( tempnum
));
2389 for ( tempname
= strtok ( NULL
, " " ); tempname
!= NULL
; tempname
= strtok ( NULL
, " " ))
2392 list
< item
*>:: iterator item_iter
;
2393 id
= stringtoint ( tempname
);
2394 tempname
= strtok ( NULL
, " " );
2395 uses
= stringtoint ( tempname
);
2397 item_iter
= Items
. begin ();
2398 while ( item_iter
!= Items
. end ())
2400 if ((* item_iter
)-> getID () == id
)
2402 // Don't sort every time you add an item or it eats CPU
2403 p
-> inventory
-> addItemNoChecks ((* item_iter
))-> setUses ( uses
);
2408 p
-> inventory
-> sort ();
2410 unsigned long hv
= iHASH (( unsigned char *) temp
-> stats
-> getName (). c_str ());
2412 temp
-> stats
-> setClient ( NULL
);
2413 players
[ hv
]. insertAtBack ( temp
);
2421 bool passcmp ( const char * encrypted
, char * plaintext
)
2424 char * plaintext2
, * plainToencrypt
;
2427 plaintext2
= new char [ strlen ( encrypted
) + strlen ( plaintext
)]; // Extra
2428 strcpy ( plaintext2
, plaintext
);
2430 salt
[ 0 ] = encrypted
[ 0 ];
2431 salt
[ 1 ] = encrypted
[ 1 ];
2434 plainToencrypt
= crypt ( plaintext2
, salt
);
2436 same
= ( strcmp (( const char *) encrypted
, plainToencrypt
) == 0 ? true : false );
2438 delete [] plaintext2
;
2443 bool check_password ( char * name
, char * plaintext
)
2447 if (!( client
= findplayer ( name
)))
2451 return passcmp ( client
-> stats
-> getPassword (). c_str (), plaintext
);
2455 void do_store ( char * u
)
2457 list
< item
*>:: iterator item_iterator
;
2459 char * cmd
= strtok ( NULL
, " " );
2460 char * num
= strtok ( NULL
, " " );
2469 notice ( s_GameServ
, u
, "SYNTAX: STORE LIST {ARMOR | WEAPONS}" );
2470 notice ( s_GameServ
, u
, " \ 2 STORE SELL NUMBER\ 2 " );
2471 notice ( s_GameServ
, u
, " \ 2 STORE BUY \1f NUMBER\1f \ 2 " );
2474 else if (!( user
= find ( u
)))
2476 log ( "Fatal Error: could not find %s in client list" , u
);
2479 else if ( isIgnore ( user
))
2482 log ( "Ignoring %s ." , user
-> getNick ());
2486 else if (! is_playing ( user
))
2488 notice ( s_GameServ
, u
, "You must be playing to use the store!" );
2491 else if ( is_fighting ( user
))
2493 notice ( s_GameServ
, u
, "You can't go to the store while fighting!" );
2496 else if (! isAlive ( user
-> stats
))
2498 notice ( s_GameServ
, u
, "You are dead. Wait until tomorrow to purchase weapons and armor!" );
2501 updateTS ( user
-> stats
);
2503 if ( stricmp ( cmd
, "LIST" ) == 0 )
2505 if ( stricmp ( num
, "WEAPONS" ) == 0 )
2507 notice ( s_GameServ
, u
, "Welcome to Kain's Armory" );
2508 notice ( s_GameServ
, u
, "Here are the weapons we have available for the killing, sire:" );
2509 for ( item_iterator
= store
. begin (); item_iterator
!= store
. end (); ++ item_iterator
)
2511 if ((* item_iterator
)-> getType () == WEAPON
)
2513 space
= spaces ( strlen ((* item_iterator
)-> getName (). c_str ()), "." );
2514 notice ( s_GameServ
, u
, " %s%l d. %s%s%l d" , ((* item_iterator
)-> getID () < 10 ? " " : "" ), (* item_iterator
)-> getID (), (* item_iterator
)-> getName (). c_str (), space
, (* item_iterator
)-> price ());
2518 notice ( s_GameServ
, u
, "To purchase a weapon, type /msg %S STORE BUY \ 2 #\ 2 ." );
2519 notice ( s_GameServ
, u
, "Where # is the weapon number from the menu above." );
2522 else if ( stricmp ( num
, "ARMOR" ) == 0 )
2524 notice ( s_GameServ
, u
, "Welcome to Kain's Armory" );
2525 notice ( s_GameServ
, u
, "I hope you enjoy the fine armor we have available for your protection:" );
2526 for ( item_iterator
= store
. begin (); item_iterator
!= store
. end (); ++ item_iterator
)
2528 if ((* item_iterator
)-> getType () == ARMOR
)
2530 space
= spaces ( strlen ((* item_iterator
)-> getName (). c_str ()), "." );
2531 notice ( s_GameServ
, u
, " %s%l d. %s%s%d " ,((* item_iterator
)-> getID () < 10 ? " " : "" ), (* item_iterator
)-> getID (), (* item_iterator
)-> getName (). c_str (), space
, (* item_iterator
)-> price ());
2536 notice ( s_GameServ
, u
, "To purchase armor, type /msg %S store buy #" );
2537 notice ( s_GameServ
, u
, "Where # is the armor number from the menu above." );
2541 else if ( stricmp ( cmd
, "BUY" ) == 0 )
2546 notice ( s_GameServ
, u
, "SYNTAX: \ 2 STORE BUY \1f #\1f \ 2 " );
2551 id
= stringtoint ( num
);
2554 if (! isstringnum ( num
))
2556 notice ( s_GameServ
, u
, "SYNTAX: \ 2 STORE BUY \1f #\1f \ 2 " );
2559 else if (!( tempItem
= findStoreItemByID ( id
)))
2561 notice ( s_GameServ
, u
, "Sorry, we don't carry that item!" );
2564 else if ( p
-> getGold () < tempItem
-> price ())
2566 notice ( s_GameServ
, u
, "You can't afford to buy %s " , tempItem
-> getName (). c_str ());
2569 else if ( p
-> inventory
-> addItem ( tempItem
))
2571 notice ( s_GameServ
, u
, "You have purchased %s ! Thanks for the gold!" , tempItem
-> getName (). c_str ());
2572 p
-> subtractGold ( tempItem
-> price ());
2573 notice ( s_GameServ
, u
, "Don't forget to type /msg %S equip %l d" , tempItem
-> getID ());
2577 notice ( s_GameServ
, u
, "You can't carry any more!" );
2580 else if ( stricmp ( cmd
, "SELL" ) == 0 )
2582 itemContainer
* tempContainer
;
2584 id
= stringtoint ( num
);
2585 if (! isstringnum ( num
))
2587 notice ( s_GameServ
, u
, "SYNTAX: /msg %S store sell #" );
2590 else if (!( tempContainer
= p
-> inventory
-> Find ( id
)))
2592 notice ( s_GameServ
, u
, "You're not carrying that!" );
2595 else if ( p
-> getGold () >= 2000000000 )
2597 notice ( s_GameServ
, u
, "You have enough gold. Just hang on to it for now." );
2601 tempItem
= tempContainer
-> getItem ();
2603 notice ( s_GameServ
, u
, "Thank you for your business! We gave you %l d gold for %s !" , ( tempItem
-> price () / 2 ), tempItem
-> getName (). c_str ());
2604 p
-> addGold (( tempItem
-> price () / 2 ));
2605 p
-> inventory
-> deleteItem ( tempItem
);
2606 if ( tempItem
== p
-> getWeapon ())
2608 notice ( s_GameServ
, u
, "Since you equipped %s , you're going to have to reequip something" , tempItem
-> getName (). c_str ());
2612 else if ( tempItem
== p
-> getArmor ())
2615 notice ( s_GameServ
, u
, "Since you equipped %s , you're going to have to reequip something" , tempItem
-> getName (). c_str ());
2622 notice ( s_GameServ
, u
, "SYNTAX: STORE LIST {ARMOR | WEAPONS}" );
2623 notice ( s_GameServ
, u
, " \ 2 STORE SELL #\ 2 " );
2624 notice ( s_GameServ
, u
, " \ 2 STORE BUY \1f #\1f \ 2 " );
2628 void do_inventory ( char * u
)
2632 if (!( user
= find ( u
)))
2634 notice ( s_GameServ
, u
, "Fatal Error. Contact a %S admin!" );
2637 else if ( isIgnore ( user
))
2640 log ( "Ignoring %s ." , user
-> getNick ());
2644 else if (! is_playing ( user
))
2646 notice ( s_GameServ
, u
, "You must be playing to check your inventory!" );
2649 updateTS ( user
-> stats
);
2650 showinventory ( user
-> stats
, user
);
2653 void showinventory ( Player
* from
, aClient
* to
)
2661 nick
= to
-> getNick ();
2663 if ( from
-> inventory
-> isEmpty ())
2665 notice ( s_GameServ
, nick
, "You aren't carrying anything" );
2669 list
< itemContainer
> * items
;
2670 items
= from
-> inventory
-> getItems ();
2672 list
< itemContainer
>:: iterator item_iter
, item_iter2
;
2673 item_iter
= items
-> begin ();
2675 notice ( s_GameServ
, nick
, "Inventory for %s :" , from
-> getName (). c_str ());
2677 while ( item_iter
!= items
-> end ())
2679 // Display a list of counted items so as not to show an extra line for duplicate items
2681 item_iter2
= item_iter
;
2682 while ( item_iter
!= items
-> end () && (* item_iter
) == (* item_iter2
))
2684 if ((* item_iter
) == (* item_iter2
))
2694 notice ( s_GameServ
, nick
, " %l d.) %s ( %l d)" , (* item_iter2
). getItem ()-> getID (), (* item_iter2
). getItem ()-> getName (). c_str (), count
);
2698 void do_tavern ( char * u
)
2700 char * cmd
= strtok ( NULL
, " " );
2705 if (!( user
= find ( u
)))
2707 notice ( s_GameServ
, u
, "Fatal Error. See a %S admin for help" );
2710 else if ( isIgnore ( user
))
2713 log ( "Ignoring %s ." , user
-> getNick ());
2717 else if (! is_playing ( user
))
2719 notice ( s_GameServ
, u
, "You must be playing to go to the Tavern" );
2722 else if ( is_fighting ( user
))
2724 notice ( s_GameServ
, u
, "You cannot go to the Tavern during a fight!" );
2728 updateTS ( user
-> stats
);
2733 notice ( s_GameServ
, u
, "Welcome to Boot Liquors Mystic Apothecary and General Store" );
2734 notice ( s_GameServ
, u
, "Your commands:" );
2735 notice ( s_GameServ
, u
, "/msg %S TAVERN {LIST | BUY} [NUMBER]" );
2736 notice ( s_GameServ
, u
, "What'll it be?" );
2738 else if ( stricmp ( cmd
, "LIST" ) == 0 )
2740 notice ( s_GameServ
, u
, "Here is a list of what we have to offer:" );
2742 notice ( s_GameServ
, u
, "To buy an item, type /msg %S TAVERN BUY #" );
2744 else if ( stricmp ( cmd
, "BUY" ) == 0 )
2747 char * chid
= strtok ( NULL
, " " );
2748 char * amount
= strtok ( NULL
, " " );
2751 amt
= stringtoint ( amount
);
2755 notice ( s_GameServ
, u
, "SYNTAX: TAVERN BUY # [#]" );
2756 notice ( s_GameServ
, u
, "Example: /msg %S TAVERN BUY 6001" );
2757 notice ( s_GameServ
, u
, "Example: /msg %S TAVERN BUY 6001 10" );
2760 long id
= stringtoint ( chid
);
2761 tavernItem
* tempItem
;
2763 if (!( tempItem
= findTavernItemByID ( id
)) || user
-> stats
-> getLevel () < tempItem
-> getLevel ())
2765 notice ( s_GameServ
, u
, "Invalid Choice!" );
2766 notice ( s_GameServ
, u
, "Here is a list of what we have to offer:" );
2768 notice ( s_GameServ
, u
, "To buy an item, type /msg %S TAVERN BUY #" );
2771 else if (! amount
&& user
-> stats
-> getGold () < tempItem
-> getItem ()-> price ())
2773 notice ( s_GameServ
, u
, "You don't have enough gold!" );
2774 notice ( s_GameServ
, u
, "Here is a list of what we have to offer:" );
2776 notice ( s_GameServ
, u
, "To buy an item, type /msg %S TAVERN BUY #" );
2778 else if ( user
-> stats
-> getGold () < amt
* tempItem
-> getItem ()-> price ())
2780 notice ( s_GameServ
, u
, "You don't have enough gold!" );
2781 notice ( s_GameServ
, u
, "Here is a list of what we have to offer:" );
2783 notice ( s_GameServ
, u
, "To buy an item, type /msg %S TAVERN BUY # [#]" );
2789 int amt
= stringtoint ( amount
);
2790 if ( amt
< 0 || amount
[ 0 ] == '-' )
2792 notice ( s_GameServ
, u
, "You trying to steal from me?" );
2794 else if ( user
-> stats
-> inventory
-> addItem ( tempItem
-> getItem (), amt
) == NULL
)
2796 notice ( s_GameServ
, u
, "You can't carry that many!" );
2800 notice ( s_GameServ
, u
, " %d %s 's coming right up!" , amt
, tempItem
-> getItem ()-> getName (). c_str ());
2801 user
-> stats
-> subtractGold ( tempItem
-> getItem ()-> price () * amt
);
2806 if ( user
-> stats
-> inventory
-> addItem ( tempItem
-> getItem ()) == NULL
)
2808 notice ( s_GameServ
, u
, "You can't carry any more!" );
2812 notice ( s_GameServ
, u
, "One %s coming right up!" , tempItem
-> getItem ()-> getName (). c_str ());
2813 user
-> stats
-> subtractGold ( tempItem
-> getItem ()-> price ());
2820 notice ( s_GameServ
, u
, "Improper Syntax." );
2821 notice ( s_GameServ
, u
, "Type /msg %S HELP TAVERN for help" );
2826 void do_bank ( char * u
)
2828 char * cmd
= strtok ( NULL
, " " );
2829 char * amount
= strtok ( NULL
, " " );
2830 char * nick
= strtok ( NULL
, " " );
2835 if (! cmd
|| (! amount
&& stricmp ( cmd
, "BALANCE" ) != 0 ) || ( stricmp ( cmd
, "TRANSFER" ) == 0 && ! nick
))
2837 notice ( s_GameServ
, u
, "BANK {WITHDRAW | DEPOSIT} {ALL | AMOUNT}" );
2838 notice ( s_GameServ
, u
, "BANK BALANCE" );
2841 else if (!( user
= find ( u
)))
2843 notice ( s_GameServ
, u
, "Fatal Error. Couldn't find your aClient. Contact a(n) %S " \
2845 log ( "Fatal Error. Couldn't find %s while executing do_bank()" , u
);
2848 else if ( isIgnore ( user
))
2851 log ( "Ignoring %s ." , user
-> getNick ());
2855 else if (! is_playing ( user
))
2857 notice ( s_GameServ
, u
, "You must be playing to use the bank!" );
2860 else if ( is_fighting ( user
))
2862 notice ( s_GameServ
, u
, "You can't go to the bank during a fight!" );
2865 updateTS ( user
-> stats
);
2866 if ( stricmp ( cmd
, "BALANCE" ) == 0 )
2871 else if (! isAlive ( user
-> stats
))
2873 notice ( s_GameServ
, u
, "You are dead. We don't accept gold from dead folk! Wait 'til tomorrow!" );
2876 else if (! isstringnum ( amount
) && stricmp ( amount
, "ALL" ) != 0 )
2878 notice ( s_GameServ
, u
, "I don't know how to convert alphabet letters into currency, sire!" );
2881 if ( stringtoint ( amount
) < 0 )
2883 notice ( s_GameServ
, u
, "Sorry. This bank is not licensed " \
2884 "to handle such sums of cash, noble Lord." );
2889 if ( stricmp ( cmd
, "DEPOSIT" ) == 0 )
2891 if ( p
-> getBank () == 2000000000 )
2893 notice ( s_GameServ
, u
, "Your bank account is full, sire!" );
2896 else if ( stricmp ( amount
, "ALL" ) == 0 )
2898 if ( 2000000000 - p
-> getBank () < p
-> getGold ())
2900 notice ( s_GameServ
, u
, "You don't have enough room for all of your gold." );
2901 notice ( s_GameServ
, u
, "Depositing %l d gold into your account" , ( 2000000000 - p
-> getBank ()));
2902 p
-> subtractGold (( 2000000000 - p
-> getBank ()));
2903 p
-> setBank ( 2000000000 );
2908 notice ( s_GameServ
, u
, "Depositing %l d gold into your account!" , p
-> getGold ());
2909 p
-> addBank ( p
-> getGold ());
2914 else if ( stringtoint ( amount
) > p
-> getGold ())
2916 notice ( s_GameServ
, u
, "Sire, you only have %l d gold!" , p
-> getGold ());
2922 if ( 2000000000 - p
-> getBank () < stringtoint ( amount
))
2924 notice ( s_GameServ
, u
, "You don't have room in your account for that much." );
2925 notice ( s_GameServ
, u
, "Capping off your account with %l d gold!" , ( 2000000000 - p
-> getBank ()));
2926 p
-> subtractGold (( 2000000000 - p
-> getBank ()));
2927 p
-> setBank ( 2000000000 );
2932 notice ( s_GameServ
, u
, "Depositing %d gold into your account!" , stringtoint ( amount
));
2933 p
-> addBank ( stringtoint ( amount
));
2934 p
-> subtractGold ( stringtoint ( amount
));
2939 else if ( stricmp ( cmd
, "WITHDRAW" ) == 0 )
2941 if ( p
-> getGold () == 2000000000 )
2943 notice ( s_GameServ
, u
, "You cannot carry any more gold, sire!" );
2947 else if ( stricmp ( amount
, "ALL" ) == 0 )
2949 if ( 2000000000 - p
-> getGold () < p
-> getBank ())
2951 notice ( s_GameServ
, u
, "You don't have enough room to carry all that gold." );
2952 notice ( s_GameServ
, u
, "Withdrawing %l d gold from your account" , ( 2000000000 - p
-> getGold ()));
2953 p
-> subtractBank (( 2000000000 - p
-> getGold ()));
2954 p
-> setGold ( 2000000000 );
2959 notice ( s_GameServ
, u
, "Withdrawing %l d gold from your account!" , p
-> getBank ());
2960 p
-> addGold ( p
-> getBank ());
2965 else if ( stringtoint ( amount
) > p
-> getBank ())
2967 notice ( s_GameServ
, u
, "Sire, you only have %l d gold in the bank!" , p
-> getBank ());
2973 if ( 2000000000 - p
-> getGold () < stringtoint ( amount
))
2975 notice ( s_GameServ
, u
, "You don't enough have room to carry that much gold!" );
2976 notice ( s_GameServ
, u
, "You fill your pockets with %l d gold!" ,
2977 ( 2000000000 - p
-> getGold ()));
2978 p
-> subtractBank (( 2000000000 - p
-> getGold ()));
2979 p
-> setGold ( 2000000000 );
2984 notice ( s_GameServ
, u
, "Withdrawing %d gold from your account!" , stringtoint ( amount
));
2985 p
-> addGold ( stringtoint ( amount
));
2986 p
-> subtractBank ( stringtoint ( amount
));
2993 void do_dragon ( char * u
)
2997 if (!( user
= find ( u
)))
2999 notice ( s_GameServ
, u
, "Fatal error. Contact a(n) %S admin. buf: %s " , strtok ( NULL
, "" ));
3002 else if ( isIgnore ( user
))
3005 log ( "Ignoring %s ." , user
-> getNick ());
3009 else if (! is_playing ( user
))
3011 notice ( s_GameServ
, u
, "You must be playing to fight the dragon!" );
3014 else if ( is_fighting ( user
))
3016 notice ( s_GameServ
, u
, "You are already in a fight. How will you fight the almighty dragon!?" );
3019 else if (! isAlive ( user
-> stats
))
3021 notice ( s_GameServ
, u
, "You're dead. Wait until tomorrow to see your master!" );
3024 else if ( user
-> stats
-> getLevel () < LEVELS
)
3026 notice ( s_GameServ
, u
, "You fool! Only those strong enough " \
3027 "to vanquish any foe should DARE fight the dragon!" );
3028 notice ( s_GameServ
, u
, "To put it in terms you can understand: " \
3029 "You are too weak. You must be Level %d !" , REALLEVELS
);
3033 updateTS ( user
-> stats
);
3035 Player
* p
= user
-> stats
;
3037 notice ( s_GameServ
, u
, "You approach the dragon's lair cautiously." );
3038 notice ( s_GameServ
, u
, "The stench of sulfer fills the air as a " \
3039 "deep, red fog rolls in. The air is filled with the " \
3040 "heated mist of deadly fire from beyond the cave " \
3042 notice ( s_GameServ
, u
, "You adjust your %s , tighten your grip on " \
3043 "your %s , and venture into the hot, dark cave. " \
3044 "You are surprised at the angle of descent as you climb " \
3045 "lower and lower, deeper into the dragon's den." ,
3046 ( p
-> getArmor () ? p
-> getArmor ()-> getName (). c_str () : "Fists" ), ( p
-> getWeapon () ? p
-> getWeapon ()-> getName (). c_str () : "Birthday Suit" ));
3047 notice ( s_GameServ
, u
, "You come to the end of the cave to find " \
3048 "a tooth. It is a large tooth... bigger than your torso." \
3049 " Suddenly the darkness lifts from the gleam of an eye " \
3050 " staring into your soul! The eye is large... HUGE!" );
3051 notice ( s_GameServ
, u
, "Just then you notice the eye begin to " \
3052 "glare orange! The tooth is moving... but it is still too " \
3053 "dark for you to make out.... THE DRAGON! You see it!" );
3054 p
-> setMonster ( new Monster ( dragon
));
3059 void do_master ( char * u
)
3064 if (!( user
= find ( u
)))
3066 notice ( s_GameServ
, u
, "Fatal error. Contact a(n) %S admin. buf: %s " , strtok ( NULL
, "" ));
3069 else if ( isIgnore ( user
))
3072 log ( "Ignoring %s ." , user
-> getNick ());
3076 else if (! is_playing ( user
))
3078 notice ( s_GameServ
, u
, "You must be playing to see your master!" );
3081 else if ( is_fighting ( user
))
3083 notice ( s_GameServ
, u
, "You're in the middle of a fight! Pay attention!" );
3086 else if (! isAlive ( user
-> stats
))
3088 notice ( s_GameServ
, u
, "You're dead. Wait until tomorrow to see your master!" );
3092 updateTS ( user
-> stats
);
3094 char * cmd
= strtok ( NULL
, " " );
3095 Player
* p
= user
-> stats
;
3100 notice ( s_GameServ
, u
, "You have already seen your master today. Wait until tomorrow to try again" );
3106 switch ( p
-> getLevel ())
3143 need
= p
-> getExp () + 1 ;
3144 notice ( s_GameServ
, u
, "You are at level %d . You are the master. What's left? The DRAGON!" , REALLEVELS
);
3148 need
= p
-> getExp () + 1 ; // Unknown level... don't let them fight a fake master!
3154 notice ( s_GameServ
, u
, "SYNTAX: MASTER {FIGHT | QUESTION}" );
3158 if ( stricmp ( cmd
, "FIGHT" ) == 0 )
3160 if ( p
-> getExp () >= need
)
3166 notice ( s_GameServ
, u
, "You are not worthy of fighting %s ! You need %l d more experience." ,
3167 levels
[ p
-> getLevel () - 1 ]. master
. name
. c_str (), ( need
- p
-> getExp ()));
3170 else if ( stricmp ( cmd
, "QUESTION" ) == 0 )
3172 if ( p
-> getExp () >= need
)
3173 notice ( s_GameServ
, u
, " %s looks you up and down and decides you are more ready than you will ever be." ,
3174 levels
[ p
-> getLevel () - 1 ]. master
. name
. c_str ());
3176 notice ( s_GameServ
, u
, "You pathetic fool! You are no match for %s , %s !" ,
3177 levels
[ p
-> getLevel () - 1 ]. master
. name
. c_str (), p
-> getName (). c_str ());
3183 notice ( s_GameServ
, u
, "SYNTAX: MASTER {FIGHT | QUESTION}" );
3187 void see_master ( char * u
)
3191 if (!( user
= find ( u
)))
3193 notice ( s_GameServ
, u
, "Fatal error. Contact a(n) %S admin. buf: %s " , strtok ( NULL
, "" ));
3197 if (! is_fighting ( user
) && is_playing ( user
))
3200 Player
* p
= user
-> stats
;
3201 temp
= new Monster ( levels
[ p
-> getLevel () - 1 ]. master
);
3202 p
-> setMyMaster ( temp
);
3203 p
-> setMonster ( temp
);
3204 display_monster ( u
); // Since master is the same structure, use this function
3208 void showTavern ( aClient
* user
)
3211 list
< tavernItem
>:: iterator item_iterator
;
3219 item_iterator
= tavern
. begin ();
3222 notice ( s_GameServ
, user
-> getNick (), "Tavern is empty" );
3226 while ( item_iterator
!= tavern
. end ())
3228 if ( p
-> getLevel () < (* item_iterator
). getLevel ())
3233 tempItem
= (* item_iterator
). getItem ();
3234 notice ( s_GameServ
, user
-> getNick (), " %d . %s for %l d gold" , tempItem
-> getID (), tempItem
-> getName (). c_str (), tempItem
-> price ());
3239 void showBankBalance ( const char * u
)
3244 if (!( user
= find ( u
)))
3252 notice ( s_GameServ
, u
, "Account Balance: %l d Gold On hand: %l d" , p
-> getBank (), p
-> getGold ());
3257 ListNode
< aClient
> * it
;
3259 for ( unsigned long x
= 0 ; x
< U_TABLE_SIZE
; x
++)
3261 it
= players
[ x
]. First ();
3264 p
= it
-> getData ()-> stats
;
3272 ListNode
< aClient
> * it
;
3274 for ( unsigned long x
= 0 ; x
< U_TABLE_SIZE
; x
++)
3276 it
= players
[ x
]. First ();
3280 p
= it
-> getData ()-> stats
;
3287 void rollover ( Player
* p
)
3292 p
-> addForestFights ( numrolloverfights
);
3294 if ( p
-> getForestFights () > maxforestfights
)
3295 p
-> setForestFights ( maxforestfights
);
3298 void refresh ( Player
* p
)
3303 if ( p
-> getHP () < p
-> getMaxHP ())
3305 if ( p
-> getForestFights () < forestfights
)
3307 p
-> setForestFights ( forestfights
);
3310 p
-> setPlayerFights ( 3 );
3315 void do_refresh ( char * u
)
3317 char * nick
= strtok ( NULL
, " " );
3320 if (!( user
= find ( u
)))
3322 notice ( s_GameServ
, u
, "Error: aClient not found. Contact a %S admin" );
3323 log ( "Error: aClient not found: %s " , u
);
3326 else if ( isIgnore ( user
))
3329 log ( "Ignoring %s ." , user
-> getNick ());
3333 else if (! isAdmin ( user
))
3335 notice ( s_GameServ
, u
, "You must be a %S admin to use this command!" );
3340 notice ( s_GameServ
, u
, "SYNTAX: REFRESH {ALL | NICK}" );
3343 else if ( stricmp ( nick
, "ALL" ) == 0 )
3345 notice ( s_GameServ
, u
, "Refreshing everyone's stats!" );
3348 else if (( user
= findplayer ( nick
)))
3350 if ( is_playing ( user
))
3353 notice ( s_GameServ
, u
, "Refreshing %s ." , user
-> getRealNick ());
3355 notice ( s_GameServ
, u
, "Refreshing %s ." , user
-> getNick ());
3357 refresh ( user
-> stats
);
3362 notice ( s_GameServ
, u
, " %s is not playing." , user
-> getRealNick ());
3364 notice ( s_GameServ
, u
, " %s is not playing." , user
-> getNick ());
3370 notice ( s_GameServ
, u
, "Nick %s not found." , nick
);
3378 ListNode
< aClient
> * it
;
3381 for ( unsigned long x
= 0 ; x
< U_TABLE_SIZE
; x
++)
3383 it
= players
[ x
]. First ();
3387 p
= it
-> getData ()-> stats
;
3394 void reset ( Player
* p
)
3401 tempItem
= findItemByID ( 3001 );
3404 void updateTS ( Player
* p
)
3410 log ( "Old timestamp for %s : %l d" , p
-> getName (). c_str (), p
-> lastcommand
);
3412 p
-> lastcommand
= time ( NULL
);
3414 log ( "New timestamp for %s : %l d" , p
-> getName (). c_str (), p
-> lastcommand
);
3419 bool timedOut ( Player
* p
)
3423 else if ( p
-> lastcommand
== 0 )
3427 if (( time ( NULL
) - p
-> lastcommand
) >= maxidletime
)
3434 void timeOutEvent ( Player
* p
)
3436 aClient
* user
= findplayer ( p
-> getName (). c_str ());
3438 if (! user
|| ! p
-> getClient ()) // then they're not playing
3441 char * nick
= user
-> getNick ();
3443 if ( player_fight ( user
) && isYourTurn ( p
))
3445 // Check to see if they were the idler or if it was the other
3447 if ( p
-> lastcommand
!= p
-> getBattle ()-> stats
-> lastcommand
)
3449 // This person's last command was given earlier,
3450 // so this person is the idler
3451 notice ( s_GameServ
, nick
, "You timed out " \
3452 "during a fight. You lose your turn!" );
3453 notice ( s_GameServ
, p
-> getBattle ()-> getNick (),
3454 " %s hesitated for too long. Your move." , p
-> getName (). c_str ());
3456 setYourTurn ( p
-> getBattle ()-> stats
);
3458 // Update the TS for both players to give them another
3459 // Chance to wake up, but if the other player doesn't
3460 // Attack now, they both get logged out.
3462 p
-> getBattle ()-> stats
-> lastcommand
= p
-> lastcommand
;
3463 display_players ( p
-> getBattle ());
3468 notice ( s_GameServ
, p
-> getBattle ()-> getNick (),
3469 "You and %s timed out at the same time." \
3470 " Don't fight if you're just going to " \
3471 "sit there!" , p
-> getName (). c_str ());
3472 notice ( s_GameServ
, user
-> getNick (),
3473 "You and %s timed out at the same time." \
3474 " Don't fight if you're just going to " \
3475 "sit there!" , p
-> getBattle ()-> stats
-> getName (). c_str ());
3476 logout ( p
-> getBattle ());
3481 else if (! player_fight ( user
))
3483 if ( isAlive ( user
-> stats
) && user
-> stats
-> getGold () > 0 )
3485 // Place fun stuff here :)
3486 int randnum
= 1 + rand () % 100 ; // 1-100
3487 #define GSN(s) notice(s_GameServ, nick, s)
3488 #define GSN2(s, f) notice(s_GameServ, nick, s, f)
3492 // 35-100% of your gold goes pffft - kain
3493 int stolen
= ( 35 + ( rand () % 66 )) * ( user
-> stats
-> getGold () / 100 );
3495 GSN ( "You stop for a moment to rest on the " \
3496 "street corner. All of a sudden, you " \
3497 "are ambushed from all sides by a hoarde " \
3498 "of knife wielding thugs." );
3499 GSN2 ( "The thugs beat you into utter submission " \
3500 "and steal %l d gold from you!" , stolen
);
3501 user
-> stats
-> subtractGold ( stolen
);
3503 else if ( randnum
>= 50 && randnum
< 75 )
3505 // 25-65% of your gold goes pffft - kain
3506 int stolen
= ( 25 + ( rand () % 41 )) * ( user
-> stats
-> getGold () / 100 );
3507 GSN ( "While dilly dallying around, you lose " \
3508 "your sense of time. Little did you know, " \
3509 "but thieves lifted your gold while you " \
3510 "weren't watching." );
3511 GSN2 ( "Better luck next time... you lose %d gold" , stolen
);
3512 user
-> stats
-> subtractGold ( stolen
);
3514 else if ( randnum
>= 75 )
3516 // 25-75% of your gold goes pffft - kain
3517 int stolen
= ( 25 + ( rand () % 51 )) * ( user
-> stats
-> getGold () / 100 );
3518 GSN ( "Good grief! A gaggle of gooey green ghostlike " \
3519 "goblins grabbed your gold!" );
3520 GSN2 ( "They stole %d gold from you!" , stolen
);
3521 user
-> stats
-> subtractGold ( stolen
);
3525 // Always log out the user
3530 void do_reset ( char * u
)
3532 char * nick
= strtok ( NULL
, " " );
3535 if (!( user
= find ( u
)))
3537 notice ( s_GameServ
, u
, "Error: aClient not found. Contact a %S admin" );
3538 log ( "Error: aClient not found: %s " , u
);
3541 else if (! isAdmin ( user
))
3543 notice ( s_GameServ
, u
, "You must be a %S admin to use this command!" );
3549 notice ( s_GameServ
, u
, "SYNTAX: RESET {ALL | NICK}" );
3552 else if ( stricmp ( nick
, "ALL" ) == 0 )
3554 notice ( s_GameServ
, u
, "Resetting everyone's stats!" );
3557 else if (( user
= findplayer ( nick
)))
3559 if ( is_playing ( user
))
3562 notice ( s_GameServ
, u
, "Resetting %s ." , user
-> getRealNick ());
3564 notice ( s_GameServ
, u
, "Resetting %s ." , user
-> getNick ());
3570 notice ( s_GameServ
, u
, "Resetting %s " , user
-> stats
-> getName (). c_str ());
3576 notice ( s_GameServ
, u
, "Nick %s not found." , nick
);
3581 void do_help ( char * u
)
3583 char * cmd
= strtok ( NULL
, " " );
3585 display_help ( u
, cmd
);
3588 void display_help ( char * u
, char * file
)
3595 infile
. open ( "helpfiles/help" );
3598 log ( "Error opening helpfiles/help" );
3599 notice ( s_GameServ
, u
, "Error opening helpfiles/help" );
3602 buf
= new char [ 1024 ];
3603 while ( infile
. getline ( buf
, 1024 ))
3605 // Written this way, it will process %S in the helpfiles
3606 // Instead of notice(s_GameServ, u, "%s", buf);
3607 notice ( s_GameServ
, u
, buf
);
3611 aClient
* user
= find ( u
);
3612 if ( user
&& isAdmin ( user
))
3613 display_help ( u
, "admin_commands" );
3618 filename
= new char [ strlen ( file
) + 11 ];
3619 strcpy ( filename
, "helpfiles/" );
3620 strcat ( filename
, file
);
3622 for ( unsigned int x
= 10 ; x
< strlen ( filename
); x
++)
3623 filename
[ x
] = tolower ( filename
[ x
]);
3625 infile
. open ( filename
);
3629 notice ( s_GameServ
, u
, "No help for \ 2 %s \ 2 ", file
);
3632 buf
= new char [ 1024 ];
3633 while ( infile
. getline ( buf
, 1024 ))
3635 // Written this way, it will process %S in the helpfiles
3636 // Instead of notice(s_GameServ, u, "%s", buf);
3637 notice ( s_GameServ
, u
, buf
);
3644 void do_admin ( char * u
)
3647 char * pass
= strtok ( NULL
, " " );
3649 if (!( user
= find ( u
)))
3651 log ( "Error: aClient not found: %s " , u
);
3652 notice ( s_GameServ
, u
, "Error: aClient not found. Contact %S admin." );
3658 notice ( s_GameServ
, u
, "SYNTAX: \ 2 ADMIN\ 2 \ 2 \1f password\1f \ 2 " );
3664 notice ( s_GameServ
, u
, "You already have administrator privledges." );
3667 else if ( strcmp ( pass
, adminpass
) == 0 )
3669 notice ( s_GameServ
, u
, "Password accepted. You now have administrator privledges." );
3672 log ( " %s became an administrator." , user
-> getRealNick ());
3674 log ( " %s became an administrator." , user
-> getNick ());
3679 notice ( s_GameServ
, u
, "Invalid password. Remember: case sensitive" );
3687 filename
= new char [ 256 ];
3689 for ( int x
= 1 ; x
<= LEVELS
; x
++)
3691 sprintf ( filename
, "data/levels/level %d .dat" , x
);
3692 if ( levels
[ x
- 1 ]. loadLevel ( filename
) == false )
3699 bool load_monsters ()
3704 buf
= new char [ 2048 ];
3706 for ( int level
= 1 ; level
<= LEVELS
; level
++)
3708 filename
= new char [ 256 ];
3709 sprintf ( filename
, "data/monsters/level %d .dat" , level
);
3710 infile
. open ( filename
);
3714 log ( "Error opening %s " , filename
);
3719 log ( "Loading monsters from %s " , filename
);
3722 while ( infile
. getline ( buf
, 2048 ))
3726 if ( buf
[ 0 ] == ' \n ' || buf
[ 0 ] == '\0' || buf
[ 0 ] == '#' )
3731 temp
-> name
= strtok ( buf
, "~" );
3732 temp
-> weapon
= strtok ( NULL
, "~" );
3733 temp
-> death
= strtok ( NULL
, "~" );
3735 levels
[ level
- 1 ]. monsters
. insertAtBack_RLN ( temp
);
3745 item
* findItemByID ( int id
)
3747 list
< item
*>:: iterator item_iterator
;
3749 item_iterator
= Items
. begin ();
3751 while ( item_iterator
!= Items
. end ())
3753 if ((* item_iterator
)-> getID () == id
)
3755 return (* item_iterator
);
3762 item
* findStoreItemByID ( int id
)
3764 list
< item
*>:: iterator item_iterator
;
3766 item_iterator
= store
. begin ();
3768 while ( item_iterator
!= store
. end ())
3770 if ((* item_iterator
)-> getID () == id
)
3772 return (* item_iterator
);
3779 tavernItem
* findTavernItemByID ( int id
)
3781 list
< tavernItem
>:: iterator item_iterator
;
3783 item_iterator
= tavern
. begin ();
3785 while ( item_iterator
!= tavern
. end ())
3787 if ((* item_iterator
). getItem ()-> getID () == id
)
3789 return &(* item_iterator
);