GAMBLER SNIPPET (Smaug 1.4) Buscar en los siguientes ficheros funciones similares y añadir: MUD.H: DECLARE_DO_FUN( do_bet ); mud.h: DECLARE_DO_FUN( do_uncover ); mud.h: in ' typedef enum { ...PLR_AUTOGOLD, PLR_AUTOMAP, PLR_AFK, PLR_INVISPROMPT, PLR_GAMBLER } player_flags ' SPECIAL.C: DECLARE_SPEC_FUN( spec_gambler ); special.c: if ( !str_cmp( name, "spec_gambler" ) ) return spec_gambler; special.c: if ( special == spec_gambler ) return "spec_gambler"; special.c: bool spec_gambler( CHAR_DATA *ch)/*Aqui puedes añadirle otras caracteristicas*/ { if (!IS_NPC(ch)) return FALSE; else return TRUE; } BUILD.C: Buscar char * const plr_flags[] y añadir un nuevo campo "apostante", que mantenga el mismo orden que el plr_gambler del mud.h ACT_COMM.C: en 'do_quit' (si abandonas el juego elimina el bit de apostador) if(xIS_SET(ch->act, PLR_GAMBLER)) xREMOVE_BIT( ch->act, PLR_GAMBLER); TABLES.C: if ( !str_cmp( name, "do_bet" )) return do_bet; tables.c: if ( skill == do_bet ) return "do_bet"; tables.c: if ( !str_cmp( name, "do_uncover" )) return do_uncover; tables.c: if ( skill == do_uncover ) return "do_uncover"; ACT_INFO.C: si no quieres que te aparezcan estos comandos en la lista de comandos añade: en 'do_commands' (aparece dos veces) if ( command->level < LEVEL_HERO && command->level <= get_trust( ch ) && (command->name[0] != 'm' || command->name[1] != 'p') /* date cuenta que en codigo original aparece '&&', pero esta mal*/ && (strcmp(command->name,"descubrir")) /* Añade esto */ && (strcmp(command->name,"apostar"))) /* Añade esto*/ /SYSTEM/COMMANDS.DAT: #COMMAND Name apostar~ Code do_bet Position 100 Level 1 /* Puedes cambiar el nivel del comando */ Log 0 End #COMMAND Name descubrir~ Code do_uncover Position 100 Level 1 Log 0 End MAKEFILE: Añade chance.o and chance.c en las secciones respectivas. CHANCE.C : (Nuevo fichero que debes incluir) /*********************************************************************** * Codigo para la implementación de juegos de azar en SMAUG (version 1.4) * * Desden ( José Luis Sogorb) - Octubre de 1998 * ***********************************************************************/ #include #include /* Libreria para funciones aleatorias */ #include #include #include "mud.h" #define MAX_APUESTA 10000 /* Limite maximo de dinero apostado */ #define MIN_APUESTA 1000 /* Limite minimo de dinero apostado */ #define PREMIO 2*gold_apuesta /* Valor del premio */ int gold_apuesta; void do_apuesta( CHAR_DATA *ch, char *argument) { CHAR_DATA *gambler; CHAR_DATA *compet; char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; argument=one_argument(argument,arg); gold_apuesta = atoi(arg); /* Se comprueba que se esta ante el mob con spec de las apuestas */ for (gambler = ch->in_room->first_person; gambler != NULL; gambler = gambler->next_in_room) { if (!IS_NPC(gambler))continue; if(gambler->spec_fun == spec_lookup( "spec_gambler")) break; } if (gambler == NULL || gambler->spec_fun != spec_lookup("spec_gambler")) { send_to_char ("No puedes hacer eso aqui!.\n\r",ch); return; } if ( arg[0] == '\0') /* Obliga a apostar alguna cantidad */ { send_to_char("Tienes que apostar alguna cantidad.\n\r",ch); return; } if (gold_apuesta MAX_APUESTA) { sprintf(buf,"Tienes que apostar una cantidad razonable. Minimo: %d, maximo: %d\n\r",MIN_APUESTA, MAX_APUESTA); send_to_char(buf,ch); return; } /* Se comprueba que el mob no esta peleando */ if (gambler->position == POS_FIGHTING) { send_to_char ("Tendras que esperar a que acabe la pelea.\n\r",ch); return; } /* Se comprueba que no haya ningun jugador que ya haya apostado */ for (compet = ch->in_room->first_person; compet != NULL; compet = compet->next_in_room) { if( xIS_SET(compet->act, PLR_GAMBLER)) { act(AT_PLAIN,"Tendras que esperar a que $N termine una apuesta pendiente.",ch,NULL,gambler,TO_CHAR); return; } } /* Se comprueba que el jugador lleve suficiente dinero */ if (ch->gold < gold_apuesta) { sprintf(buf,"Tendras que disponer como minimo de %d monedas para apostar.\n\r",gold_apuesta ); send_to_char(buf,ch); return; } else { xSET_BIT(ch->act, PLR_GAMBLER); /* Activa en el jugador el Bit de "apostador" */ ch->gold -= gold_apuesta; /* Descuenta el dinero de la apuesta al jugador */ sprintf(buf," El %s introduce un trozito de ambar en uno de los cubiletes y comienza a\n\rintercambiarlos de posicion. Lo hace tan rapido que no te da tiempo a seguir \n\rsus movimientos. Cuando termina, parece que estan en el mismo lugar en el que \n\restaban. Pero donde esta ahora el ambar??.\n\r%s, prueba a DESCUBRIR uno de los cubiletes.!",gambler->name,ch->name); act(AT_PLAIN,buf,ch,NULL,NULL,TO_CHAR); act(AT_PLAIN,buf,ch,NULL,NULL,TO_ROOM); return; } } void do_descubrir (CHAR_DATA *ch, char *argument) { CHAR_DATA *gambler; int result; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; argument=one_argument(argument,arg); result = number_range(1,3); /* Elige un cubilete aleatoriamente */ /* Se comprueba que se esta ante el jugador con el spec de las apuestas */ for (gambler = ch->in_room->first_person; gambler != NULL; gambler = gambler->next_in_room) { if (!IS_NPC(gambler))continue; if(gambler->spec_fun == spec_lookup( "spec_gambler")) break; } if (gambler == NULL || gambler->spec_fun != spec_lookup("spec_gambler")) { send_to_char ("No puedes hacer eso aqui!.\n\r",ch); return; } /* Se comprueba que se haya apostado primero */ if (!xIS_SET(ch->act, PLR_GAMBLER)) { send_to_char("Primero tendras que apostar para poder jugar.\n\r",ch); return; } /* Se comprueba que el mob no está peleando */ if (gambler->position == POS_FIGHTING) { send_to_char ("Tendras que esperar a que acabe la pelea.\n\r",ch); return; } if(!strcmp(arg,"rojo") || !strcmp(arg,"verde") || !strcmp(arg,"azul")) { sprintf(buf," Muy bien, %s apuesta %d monedas de oro a que el ambar esta en el cubilete %s.", ch->name, gold_apuesta, arg); act(AT_PLAIN, buf, ch, NULL, NULL, TO_CHAR); act(AT_PLAIN, buf, ch, NULL, NULL, TO_ROOM); /* Compara el cubilete elegido con el resultado aleatorio */ if((!strcmp(arg,"rojo") && result==1) || (!strcmp(arg,"verde") && result==2) || (!strcmp(arg,"azul") && result==3)) { sprintf(buf," El %s levanta el cubilete indicado y grita: PREMIO para %s.!!\n\r%s acaba de ganarse %d monedas de oro. Alguien mas quiere probar suerte?.", gambler->name,ch->sex==SEX_FEMALE?"la dama" : "el caballero", ch->name, PREMIO); act(AT_YELLOW,buf,ch,NULL,NULL,TO_CHAR); act(AT_YELLOW,buf,ch,NULL,NULL,TO_ROOM); ch->gold += PREMIO; /* Paga la apuesta si se ha acertado */ } else { sprintf(buf," Con una sonrisa el %s levanta el cubilete indicado y dice: Vaya, vaya, que\n\rmala suerte. Lo siento %s, no estaba precisamente ahi. Alguien mas quiere\n\rintentarlo?",gambler->name,ch->name); act(AT_YELLOW,buf,ch,NULL,NULL,TO_CHAR); act(AT_YELLOW,buf,ch,NULL,NULL,TO_ROOM); } xREMOVE_BIT(ch->act, PLR_GAMBLER); /* Desactiva el Bit de "apostador" en el jugador */ } else { act(AT_PLAIN,"$n, tienes que descubrir alguno de los cubiletes.",ch,NULL,gambler,TO_CHAR); return; } } /*************************************************************************** * Final del codigo * * * ***************************************************************************/ - Por ultimo haz un 'make clean' y un 'make'. -Funciona diciendo primero "apostar 'cantidad' " y "descubrir 'color' " (donde 'color' es rojo, verde o azul): - Asigna spec_gambler al mob que elijas. - Y no olvides en la descripcion de la habitacion hacer alguna referencia a las copas y sus colores. Por favor, si lo pruebas mandame un Email diciendome si te gusta, errores, o cualquier comentario que quieras. Gracias ;) Desden el Chaman Tibetano - Nov 1998 Email: jose@luisso.net