/* Snippet for Rom2.4b6 This code was written by Michael J. Wyatt (Tsudanosh) of Some Nameless Mud - telnet://mud.houseofszat.com:3500. It is in a working and finished state as of this release, however the Poobah (Top Combatants) function is not yet implemented. The next release will have it up and running, probably via a mySQL interface. It's a pretty indepth installation and should be done only by an experienced implementor. BACK UP ALL YOUR FILES BEFORE INSTALLING THIS CODE! The code comes as-is and offers no guarantee that it will work properly on your mud. Please install it at your own risk. It has been tested on a stand-alone Rom2.4b6 install and works fine. I will offer simple technical assistance on this installation. Please send me an email with any errors you get and a gdb core dump if possible. Also send me a detailed description of what was going on when the error occurred. Features: - Customizable battlegrounds, add to it as you like! Prizes and Areas! - Records the hp/mana/moves/location of all players prior to entering the battleground. - Upon winning/losing/quitting, players are returned to their original location. - Immortals w/ trust level to utilize the "load" command can set the prize as any item in their inventory. If an immortal does not have sufficient trust, a random item from the prize database will be used. - Immortals have the options to issue the following commands: 1. start <minlevel> <maxlevel> <prize> <area> (I just now realized that you can't select an area without specifying an item-prize. I'll fix this later!) 2. cancel (this cancels a battleground that is about to begin) 3. change (this changes the settings for a battleground that is about to begin) 4. purge (this cancels and kicks all players out of a battleground in progress) - Pretty stable(TM). Don't take my word for it, but no segmentation faults for me! Hope you enjoy the code -- stay tuned for the next version! Contact: Michael J. Wyatt (Tsudanosh) Mud: mud.houseofszat.com port 3500 Email: tsudanosh@houseofszat.com AIM: Tsudanosh */ // In your /area directory, add: bgrounds.are to the area.lst file // act_comm.c In do_quit function, find: if ( ch->position < POS_STUNNED ) { send_to_char( "You're not DEAD yet.\n\r", ch ); return; } After it, add: if ( IS_SET(ch->act, PLR_BATTLEGROUND )) { if(IS_SET(ch->in_room->room_flags, ROOM_BATTLEGROUND)) { do_function(ch, &do_battleground, "leave"); REMOVE_BIT(ch->act, PLR_BATTLEGROUND); /* REMOVE_BIT is in "battleground leave", just another 'just in case' scenario */ } else REMOVE_BIT(ch->act, PLR_BATTLEGROUND); } else if(IS_SET(ch->in_room->room_flags, ROOM_BATTLEGROUND)) /* Just in case someone gets stuck in there... */ { ROOM_INDEX_DATA *pRoomIndex = get_room_index(ROOM_VNUM_TEMPLE); char_from_room(ch); char_to_room(ch, pRoomIndex); send_to_char("Unsure how you got here without joining the battleground. Moving you to the temple.\n\r", ch); do_look(ch,"auto"); } // const.c At the end of the file, add: /* * Battleground Areas * You will need to create a single area as the battleground area. This table basically creates areas * within the overall area to use for the battlegrounds. I have it setup in my mud so the overall area * is just called Battle Grounds (bgrounds.are) and it includes vnums 400 - 499. */ const struct battleground_type battleground_area_table [] = { { "Annihilation", 400, 400 }, { "Tower", 401, 420 }, { "Chessboard", 421, 484 }, { NULL, 0, 0 } }; // db.c Somewhere in the Globals. section, add: BATTLEGROUND_DATA battleground_info; In the boot_db() function: Find: /* * Init random number generator. */ { init_mm( ); } After it, add: battleground_info.ticks = 0; battleground_info.min_lvl = 0; battleground_info.max_lvl = 0; battleground_info.prize = NULL; battleground_info.area = 0; battleground_info.in_progress = FALSE; battleground_info.about_to_start = FALSE; // fight.c In the is_safe function: Find: if (!is_clan(ch)) Before it, add: if (IS_SET(ch->act, PLR_BATTLEGROUND) && IS_SET(victim->act, PLR_BATTLEGROUND) \ && IS_SET(ch->in_room->room_flags, ROOM_BATTLEGROUND) && IS_SET(victim->in_room->room_flags, ROOM_BATTLEGROUND)) return FALSE; In the bool damage function: Find: /* * Payoff for killing things. */ if ( victim->position == POS_DEAD ) { group_gain( ch, victim ); if ( !IS_NPC(victim) ) { Replace with: /* * Payoff for killing things. */ if ( victim->position == POS_DEAD ) { group_gain( ch, victim ); if ( !IS_NPC(victim) && !IS_SET(ch->act, PLR_BATTLEGROUND) && !IS_SET(victim->act, PLR_BATTLEGROUND) \ && !IS_SET(ch->in_room->room_flags, ROOM_BATTLEGROUND) && !IS_SET(victim->in_room->room_flags, ROOM_BATTLEGROUND)) { Find: { sprintf( log_buf, "%s got toasted by %s at %s [room %d]", (IS_NPC(victim) ? victim->short_descr : victim->name), (IS_NPC(ch) ? ch->short_descr : ch->name), ch->in_room->name, ch->in_room->vnum); if (IS_NPC(victim)) wiznet(log_buf,NULL,NULL,WIZ_MOBDEATHS,0,0); else wiznet(log_buf,NULL,NULL,WIZ_DEATHS,0,0); } Replace with: if(!IS_SET(ch->act, PLR_BATTLEGROUND) && !IS_SET(victim->act, PLR_BATTLEGROUND) \ && !IS_SET(ch->in_room->room_flags, ROOM_BATTLEGROUND) && !IS_SET(ch->in_room->room_flags, ROOM_BATTLEGROUND)) { sprintf( log_buf, "%s got toasted by %s at %s [room %d]", (IS_NPC(victim) ? victim->short_descr : victim->name), (IS_NPC(ch) ? ch->short_descr : ch->name), ch->in_room->name, ch->in_room->vnum); if (IS_NPC(victim)) wiznet(log_buf,NULL,NULL,WIZ_MOBDEATHS,0,0); else wiznet(log_buf,NULL,NULL,WIZ_DEATHS,0,0); } else { char buf[MAX_STRING_LENGTH]; sprintf(buf,"%s just defeated %s in the battleground.\n\r", ch->name, victim->name); info_channel(buf); --battleground_info.players; } In the raw_kill function: Find: death_cry( victim ); After it, add: if ( !IS_NPC(victim) && IS_SET(victim->act, PLR_BATTLEGROUND) && IS_SET(victim->in_room->room_flags, ROOM_BATTLEGROUND)) { REMOVE_BIT(victim->act, PLR_BATTLEGROUND); victim->hit = victim->pcdata->bg_hp_store; victim->mana = victim->pcdata->bg_mn_store; victim->move = victim->pcdata->bg_mv_store; update_pos(victim); char_from_room(victim); char_to_room(victim, victim->pcdata->bg_room_store); do_look(victim,"auto"); return; } // handler.c In the *act_bit_name function: Find: if (act_flags & PLR_KILLER ) strcat(buf, " killer"); After it, add: if (act_flags & PLR_BATTLEGROUND) strcat(buf, " battleground"); // interp.c In the command table: Find: /* * Miscellaneous commands. */ Somewhere in there, add: { "battleground", do_battleground,POS_DEAD, 1, LOG_NORMAL, 1 }, // interp.h Find: DECLARE_DO_FUN( do_bash ); After it, add: DECLARE_DO_FUN( do_battleground ); // Makefile O_FILES = act_comm.o act_enter.o act_info.o act_move.o act_obj.o act_wiz.o \ alias.o ban.o comm.o const.o db.o db2.o effects.o fight.o flags.o \ handler.o healer.o interp.o note.o lookup.o magic.o magic2.o \ music.o recycle.o save.o scan.o skills.o special.o tables.o \ update.o battleground.o <-- Add that at the end! // merc.h Find: /* * Structure types. */ typedef struct affect_data AFFECT_DATA; typedef struct area_data AREA_DATA; typedef struct ban_data BAN_DATA; After it, add: typedef struct battleground_data BATTLEGROUND_DATA; Find: struct class_type { char * name; /* the full name of the class */ Before it, add: struct battleground_type { char * name; sh_int first_vnum; sh_int last_vnum; }; Find: #define PULSE_AREA (120 * PULSE_PER_SECOND) After it, add: #define PULSE_BATTLEGROUND (10 * PULSE_PER_SECOND ) Find: /* * Room flags. * Used in #ROOMS. */ At the end of that section, add: #define ROOM_BATTLEGROUND (B) /* Where B is the next available bit. It is important to use Ivan's OLC Editor and login after installing the area and set each room as ROOM_BATTLEGROUND if you use a bit other than B. Otherwise you can change the values by hand in the bgrounds.are file. Ex. #ROOMS #400 You are in room of total annihilation.~ ~ 0 B 0 <--- this is the bit that needs to be set. Change B to whatever bit you set it as. S */ Find: /* * Data which only PC's have. */ At the end of the struct, add: sh_int bg_hp_store; sh_int bg_mn_store; sh_int bg_mv_store; ROOM_INDEX_DATA * bg_room_store; Find: #define OBJ_VNUM_WHISTLE 2116 After it, add: #define OBJ_VNUM_BG_FIRST_PRIZE 400 /* Where 400 is the first prize item vnum available for bgrounds */ #define OBJ_VNUM_BG_LAST_PRIZE 410 /* Where 410 is the final prize item vnum available for bgrounds */ Find: /* * ACT bits for players. */ At the end of that section, add: #define PLR_BATTLEGROUND (ee) /* Where ee is the next available bit */ Find: /* memory settings */ #define MEM_CUSTOMER A #define MEM_SELLER B #define MEM_HOSTILE C #define MEM_AFRAID D After it, add: /* Battleground Information */ struct battleground_data { sh_int ticks; sh_int min_lvl; sh_int max_lvl; OBJ_DATA * prize; sh_int area; bool in_progress; bool about_to_start; sh_int players; }; Find: extern const struct weapon_type weapon_table []; Before it, add: extern const struct battleground_type battleground_area_table []; Find: extern WEATHER_DATA weather_info; After it, add: extern BATTLEGROUND_DATA battleground_info; Find: /* ban.c */ bool check_ban args( ( char *site, int type) ); After it, add: /* battleground.c */ void info_channel args( ( char *argument ) ); int command_lookup args(( const char *name )); int battleground_lookup args(( const char *name )); void do_bgstart args((CHAR_DATA *ch, char *argument)); void update_battleground args( ( void ) ); // tables.c ** This change is only needed if you're running Ivan's OLC ** In const struct flag_type room_flags[] Find: { NULL, 0, 0 } Before it, add: { "battleground", ROOM_BATTLEGROUND, TRUE }, // update.c In update_handler function: Find: static int pulse_area; Before it, add: static int pulse_battleground; Find: if ( --pulse_area <= 0 ) { pulse_area = PULSE_AREA; /* number_range( PULSE_AREA / 2, 3 * PULSE_AREA / 2 ); */ area_update ( ); } Before it, add: if ( --pulse_battleground <= 0 ) { pulse_battleground = PULSE_BATTLEGROUND; update_battleground( ); } ------------------------------------------- Begin battleground.c ---------------------------------------- /*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1996 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@efn.org) * * Gabrielle Taylor * * 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 * ***************************************************************************/ /*************************************************************************** * Battleground v1.0 Created by Michael Wyatt (tsudanosh@houseofszat.com) * * of Some Nameless Mud (telnet://mud.houseofszat.com:3500) * * * * In order to use this code or any derivatives in your mud, you must keep * * this header intact and leave mention of me in the coinciding help file. * * * * Please feel free to email me if you find any bugs or have comments on * * the program. I will offer simple technical support regarding install- * * ation of this code. Please send me the error information, gdb core * * dump, and/or any other relevant information about the error. * * * * * * Enjoy! * * Michael Wyatt - Tsudanosh, Implementor of Some Nameless Mud * **************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "interp.h" #include "recycle.h" #include "tables.h" #include "lookup.h" /* Uncomment this portion if you are running Maestro Note System #include "act_note.h" */ void info_channel( char *argument ); /* * Lookup a command by name. */ int command_lookup( const char *name ) { int cmd; for(cmd = 0; cmd_table[cmd].name[0] != '\0'; cmd++ ) { if(cmd_table[cmd].name == NULL ) break; if(LOWER(name[0]) == LOWER(cmd_table[cmd].name[0]) && !str_prefix( name, cmd_table[cmd].name ) ) return cmd; } return -1; } /* * Lookup a battleground area by name. */ int battleground_lookup( const char *name ) { int area; for(area = 0; battleground_area_table[area].name != '\0'; area++ ) { if(battleground_area_table[area].name == NULL) break; if(LOWER(name[0]) == LOWER(battleground_area_table[area].name[0]) && !str_prefix( name, battleground_area_table[area].name)) return area; } return -1; } void info_channel( char *argument ) { char buf[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; sprintf(buf, "[INFO]: %s", argument); for ( d = descriptor_list; d != NULL; d = d->next ) { CHAR_DATA *victim; victim = d->original ? d->original : d->character; /* Uncomment this portion if you are running Maestro Note System if (IS_SET( victim->note_config, NOTE_CONFIG_CURRENTLY_NOTING) && !IS_NPC(victim)) { sprintf( buf, "[INFO]: %s\n\r", argument); add_buf( victim->pcdata->buffer, buf ); } */ if ( d->connected == CON_PLAYING ) send_to_char(buf, victim); } } void do_battleground(CHAR_DATA *ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH], arg4[MAX_INPUT_LENGTH]; char arg5[MAX_INPUT_LENGTH]; DESCRIPTOR_DATA *d; CHAR_DATA *victim; int plr_count = 0, bg_prize = 0, i = 0, vnum = 0; OBJ_DATA * obj; OBJ_INDEX_DATA *pObjIndex; bool found = FALSE; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); argument = one_argument(argument, arg3); argument = one_argument(argument, arg4); argument = one_argument(argument, arg5); if(arg1[0] == '\0' && IS_IMMORTAL(ch)) { send_to_char("+================================================================+\n\r", ch); send_to_char(" BATTLEGROUND OPTIONS \n\r", ch); send_to_char("+================================================================+\n\r", ch); send_to_char("Start : battleground start <min lvl> <max lvl> <prize> <area> \n\r", ch); send_to_char("Change: battleground change <min lvl> <max lvl> <prize> <area> \n\r", ch); send_to_char("Cancel: battleground cancel \n\r", ch); send_to_char("Purge : battleground purge \n\r\n\r", ch); send_to_char("Show Prizes : battleground show prizes \n\r", ch); send_to_char("Show Areas : battleground show areas \n\r\n\r", ch); send_to_char("Poobah List : battleground poobah \n\r", ch); send_to_char("NOTE: If <prize> or <area> isn't stated. Random values apply. \n\r", ch); send_to_char("+================================================================+\n\r", ch); if(battleground_info.in_progress == TRUE) send_to_char("There is a battleground in progress. \n\r", ch); else if(battleground_info.about_to_start == TRUE) { sprintf(buf, "There is a battleground about to start in %d ticks. \n\r", battleground_info.ticks); send_to_char(buf, ch); } else send_to_char("There is no battleground in progress or about to start. \n\r", ch); send_to_char("+================================================================+\n\r", ch); return; } else if(arg1[0] == '\0') { send_to_char("+================================================================+\n\r", ch); send_to_char(" BATTLEGROUND OPTIONS \n\r", ch); send_to_char("+================================================================+\n\r", ch); send_to_char("Join : battleground join (join the current battleground) \n\r", ch); send_to_char("Leave : battleground leave (cancel your join or leave, if inside) \n\r", ch); send_to_char("Poobah: battleground poobah (view the top battleground records \n\r", ch); send_to_char("+================================================================+\n\r", ch); if(battleground_info.in_progress == TRUE) send_to_char("There is a battleground in progress. \n\r", ch); else if(battleground_info.about_to_start == TRUE) { sprintf(buf, "There is a battleground about to start for levels %d - %d. \n\r", battleground_info.min_lvl, battleground_info.max_lvl); send_to_char(buf, ch); } else send_to_char("There is no battleground in progress or about to start. \n\r", ch); send_to_char("+================================================================+\n\r", ch); return; } if(!IS_IMMORTAL(ch) && (!str_cmp(arg1,"join"))) { if(IS_SET(ch->act, PLR_BATTLEGROUND) && battleground_info.in_progress == TRUE) { send_to_char("You're in a world of hurt if you don't even realize you're in the battleground...\n\r", ch); return; } else if(IS_SET(ch->act, PLR_BATTLEGROUND) && battleground_info.about_to_start == TRUE) { send_to_char("You've already sent your request to join the battleground. To cancel, type: battleground leave.\n\r", ch); return; } if(battleground_info.in_progress == TRUE) { send_to_char("There is a battleground underway. You'll just have to wait for the next one.\n\r", ch); return; } if(battleground_info.about_to_start == FALSE) { send_to_char("There is no battleground going on at the moment.\n\r", ch); return; } if(ch->level < battleground_info.min_lvl || ch->level > battleground_info.max_lvl) { sprintf(buf, "You are not able to participate in this battleground. It is for levels %d through %d only.\n\r", battleground_info.min_lvl, battleground_info.max_lvl); send_to_char(buf, ch); return; } SET_BIT(ch->act, PLR_BATTLEGROUND); send_to_char("You have joined in on the battleground. To cancel your invitation or leave the battlegrounds at any time, type: battleground leave.\n\r", ch); return; } if(!str_cmp(arg1,"poobah")) { send_to_char("+==============================================================================+\n\r", ch); send_to_char(" The Battleground Poobah Listing \n\r", ch); send_to_char("+==============================================================================+\n\r", ch); send_to_char(" Rank Name Class Religion Kills Deaths Wins Total Points \n\r", ch); send_to_char("--------------------------------------------------------------------------------\n\r", ch); send_to_char(" The Poobah List has not been created yet! -- HANG TIGHT! \n\r", ch); send_to_char("+==============================================================================+\n\r", ch); return; } if(!IS_IMMORTAL(ch) && (!str_cmp(arg1,"leave"))) { if(IS_SET(ch->act, PLR_BATTLEGROUND) && battleground_info.in_progress == TRUE) { send_to_char("Awwwww coward! You probably would have lost anyway. Cowards never get very far in anything.\n\r", ch); REMOVE_BIT(ch->act, PLR_BATTLEGROUND); battleground_info.players--; /* Restore pre-bg position in the world and their hp/mana/mv and affects */ ch->hit = ch->pcdata->bg_hp_store; ch->mana = ch->pcdata->bg_mn_store; ch->move = ch->pcdata->bg_mv_store; char_from_room(ch); char_to_room(ch, ch->pcdata->bg_room_store); sprintf(buf,"%s the coward has fled from the battleground like a cowardly dog!\n\r", ch->name); info_channel( buf ); act("Two bulky arena guardians throw $n onto the ground in front of you.", ch, NULL, NULL, TO_ROOM); return; } if(IS_SET(ch->act, PLR_BATTLEGROUND) && battleground_info.about_to_start == TRUE) { send_to_char("You will no longer be participating in the battleground.\n\r", ch); REMOVE_BIT(ch->act, PLR_BATTLEGROUND); return; } if(battleground_info.in_progress == TRUE) { send_to_char("There is a battleground underway. You'll just have to wait for the next one.\n\r", ch); return; } if(battleground_info.about_to_start == FALSE) { send_to_char("There is no battleground going on at the moment.\n\r", ch); return; } } if(IS_IMMORTAL(ch) && (!str_cmp(arg1,"purge"))) { if(battleground_info.in_progress == FALSE) { send_to_char("There isn't a battleground to purge.\n\r", ch); return; } if(battleground_info.about_to_start == TRUE) { send_to_char("There is a battleground about to start. If you wish to cancel it, use: battleground cancel - (type: 'battleground' for more information.)\n\r", ch); return; } for(d = descriptor_list; d != NULL; d = d->next) { victim = d->character; if(IS_NPC(victim) || IS_IMMORTAL(victim) || !IS_SET(victim->act, PLR_BATTLEGROUND)) continue; send_to_char("A powerful gust of wind blows you out of the arena and back to where you came from.\n\r", victim); REMOVE_BIT(victim->act, PLR_BATTLEGROUND); /* Restore pre-bg position in the world and their hp/mana/mv and affects */ victim->hit = ch->pcdata->bg_hp_store; victim->mana = ch->pcdata->bg_mn_store; victim->move = ch->pcdata->bg_mv_store; char_from_room(victim); char_to_room(victim, victim->pcdata->bg_room_store); act("$n has just arrived with a confused look on $s face.", victim, NULL, NULL, TO_ROOM); } battleground_info.ticks = 0; /* The number of ticks until the battleground begins */ battleground_info.min_lvl = 0; battleground_info.max_lvl = 0; battleground_info.prize = NULL; battleground_info.area = 0; battleground_info.about_to_start = FALSE; battleground_info.in_progress = FALSE; battleground_info.players = 0; sprintf(buf, "The battleground has been shut down by The Immortals, all contestants were sent home.\n\r"); info_channel( buf ); return; } if(IS_IMMORTAL(ch) && (!str_cmp(arg1,"cancel"))) { if(battleground_info.in_progress == TRUE) { send_to_char("There is a battleground underway. To halt it and purge the battleground area of players, use: battleground purge - (type: 'battleground' for more information.)\n\r", ch); return; } if(battleground_info.about_to_start == FALSE) { send_to_char("There is no battleground beginning, to start one, use: battleground start - (type: 'battleground' for more information.)\n\r", ch); return; } for(d = descriptor_list; d != NULL; d = d->next) { victim = d->character; if(IS_NPC(victim) || IS_IMMORTAL(victim)) continue; if(IS_SET(victim->act, PLR_BATTLEGROUND)) REMOVE_BIT(victim->act, PLR_BATTLEGROUND); } battleground_info.ticks = 0; /* The number of ticks until the battleground begins */ battleground_info.min_lvl = 0; battleground_info.max_lvl = 0; battleground_info.prize = NULL; battleground_info.area = 0; battleground_info.about_to_start = FALSE; battleground_info.in_progress = FALSE; battleground_info.players = 0; sprintf(buf, "The battleground has been cancelled by The Immortals. ** cry **"); info_channel( buf ); return; } if(IS_IMMORTAL(ch) && (!str_cmp(arg1,"show"))) { if(arg2[0] == '\0') { send_to_char("Please specify what you would like to show. Syntax: battleground show <prizes|areas>\n\r", ch); return; } if(!str_cmp(arg2,"prizes")) { for(vnum = OBJ_VNUM_BG_FIRST_PRIZE; vnum <= OBJ_VNUM_BG_LAST_PRIZE; vnum++) { if( ( pObjIndex = get_obj_index( vnum ) ) != NULL) { found = TRUE; sprintf(buf, "[%5d] %s\n\r", pObjIndex->vnum, pObjIndex->short_descr ); send_to_char(buf, ch); } } if(!found) { sprintf(buf,"There are currently no battleground prizes created. Please create items %d through %d.", OBJ_VNUM_BG_FIRST_PRIZE, OBJ_VNUM_BG_LAST_PRIZE); send_to_char(buf, ch); } return; } if(!str_cmp(arg2,"areas")) { for(i = 0; battleground_area_table[i].name != '\0'; i++) { if(battleground_area_table[i].name != '\0') { found = TRUE; sprintf(buf, "[%3d - %3d] %s\n\r", battleground_area_table[i].first_vnum, battleground_area_table[i].last_vnum, battleground_area_table[i].name); send_to_char(buf, ch); } } if(!found) { send_to_char("There are currently no battleground areas created.\n\r", ch); send_to_char("Please create one and add it to the table in const.c to utilize it.\n\r", ch); } return; } } if(IS_IMMORTAL(ch) && (!str_cmp(arg1,"start") || !str_cmp(arg1,"change"))) { if(battleground_info.about_to_start == FALSE && !str_cmp(arg1,"change")) { send_to_char("There is no battleground beginning, to start one, use: battleground start - (type: 'battleground' for more information.)\n\r", ch); return; } if(battleground_info.about_to_start == TRUE && !str_cmp(arg1,"start")) { send_to_char("There is currently a countdown to begin a battleground.\n\r", ch); send_to_char("To change the current battleground, use: battleground change - (type: 'battleground' for more information.)\n\r", ch); return; } if(atoi(arg2) <= 0 || atoi(arg3) >= LEVEL_IMMORTAL) { sprintf(buf, "Levels must be between 1 and %d\n\r", LEVEL_IMMORTAL - 1); send_to_char(buf, ch); return; } /* Some crude error checking - Make Sure <min lvl> is less than or equal too <max lvl>*/ if(atoi(arg2) > atoi(arg3)) { send_to_char("The minimum level must be less than or equal to the maximum level.\n\r", ch); return; } for(d = descriptor_list; d != NULL; d = d->next) { victim = d->character; if(IS_NPC(victim) || IS_IMMORTAL(victim)) continue; plr_count++; /* Just to be safe in case someone was disconnected in a previous battleground */ if(IS_SET(victim->act, PLR_BATTLEGROUND)) REMOVE_BIT(victim->act, PLR_BATTLEGROUND); } if(plr_count <= 1) { if(!str_cmp(arg1,"start")) send_to_char("There are not enough players online to start a battleground.\n\r", ch); else if(!str_cmp(arg1,"change")) { send_to_char("There are not enough players online now to run a battleground.\n\r", ch); do_function(ch, &do_battleground,"cancel"); } return; } if(arg4[0] == '\0') { /* Lazy Battleground Prize Select */ for(vnum = OBJ_VNUM_BG_FIRST_PRIZE; vnum <= OBJ_VNUM_BG_LAST_PRIZE; vnum++) { if( ( pObjIndex = get_obj_index( vnum ) ) != NULL) found = TRUE; if( ( pObjIndex = get_obj_index( vnum )) == NULL) found = FALSE; } if(!found) /* Protect from segmentation fault if item gets deleted for whatever reason */ { sprintf(buf,"There are missing items in the prize definitions. Please make sure items %d through %d exist.\n\r", OBJ_VNUM_BG_FIRST_PRIZE, OBJ_VNUM_BG_LAST_PRIZE); send_to_char(buf, ch); return; } bg_prize = number_range(OBJ_VNUM_BG_FIRST_PRIZE, OBJ_VNUM_BG_LAST_PRIZE); obj = create_object( get_obj_index(bg_prize), 0 ); } /* Make sure Immortals without "load" access can't reward held items */ else if( get_trust(ch) < cmd_table[command_lookup("load")].level) { send_to_char("You do not have the required trust to reward held items. Default values used.\n\r", ch); for(vnum = OBJ_VNUM_BG_FIRST_PRIZE; vnum <= OBJ_VNUM_BG_LAST_PRIZE; vnum++) { if( ( pObjIndex = get_obj_index( vnum ) ) != NULL) found = TRUE; if( ( pObjIndex = get_obj_index( vnum )) == NULL) found = FALSE; } if(!found) /* Protect from segmentation fault if item gets deleted for whatever reason */ { sprintf(buf,"There are missing items in the prize definitions. Please make sure items %d through %d exist.", OBJ_VNUM_BG_FIRST_PRIZE, OBJ_VNUM_BG_LAST_PRIZE); send_to_char(buf, ch); return; } bg_prize = number_range(OBJ_VNUM_BG_FIRST_PRIZE, OBJ_VNUM_BG_LAST_PRIZE); obj = create_object( get_obj_index(bg_prize), 1 ); } else if( (obj = get_obj_carry( ch, arg4, ch )) == NULL ) { send_to_char("You aren't carrying that item.\n\r", ch); return; } else { send_to_char("Item extracted from your inventory and set as the battleground prize.\n\r", ch); obj_from_char( obj ); } if(arg5[0] == '\0') { /* Lazy Battleground Area Select */ for(i = 0; battleground_area_table[i].name != '\0'; i++) { if(battleground_area_table[i].name == NULL) break; found = TRUE; } if(!found) { send_to_char("There are currently no battleground areas created. Please create one and add it the table in const.c to utilize it.\n\r", ch); return; } battleground_info.area = number_range(0,i-1); } else if(battleground_lookup(arg5) < 0) { for(i = 0; battleground_area_table[i].name != '\0'; i++) { if(battleground_area_table[i].name == NULL) break; found = TRUE; sprintf(buf, "| %s |", battleground_area_table[i].name); send_to_char(buf, ch); } if(!found) send_to_char("There are currently no battleground areas created. Please create one and add it the table in const.c to utilize it.\n\r", ch); else send_to_char("\n\rThat is not a valid battleground area. Select an area from this list above or leave blank to use a random one.\n\r", ch); return; } else battleground_info.area = battleground_lookup(arg5); battleground_info.ticks = 3; /* The number of ticks until the battleground begins */ battleground_info.min_lvl = atoi(arg2); battleground_info.max_lvl = atoi(arg3); battleground_info.prize = obj; battleground_info.about_to_start = TRUE; battleground_info.in_progress = FALSE; battleground_info.players = 0; if(!str_cmp(arg1,"start")) sprintf(buf, "A battleground for levels: %d - %d will begin shortly. The winner shall receive %s. To join, type 'battleground join'!\n\r", battleground_info.min_lvl, battleground_info.max_lvl, battleground_info.prize->short_descr); else { sprintf(buf, "The battleground has been CHANGED - Levels: %d - %d. The winner shall receive %s. Please REJOIN!\n\r", battleground_info.min_lvl, battleground_info.max_lvl, battleground_info.prize->short_descr); } info_channel( buf ); sprintf(buf, "COUNT: %d AREA: %s (%d - %d)\n\r", i, battleground_area_table[battleground_info.area].name, battleground_area_table[battleground_info.area].first_vnum, battleground_area_table[battleground_info.area].last_vnum); send_to_char(buf, ch); } else { send_to_char("Invalid battleground command.\n\r", ch); return; } } void update_battleground(void) { char buf[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; CHAR_DATA *victim; ROOM_INDEX_DATA *pRoomIndex; OBJ_DATA *obj; int drop_room = 0; if(battleground_info.about_to_start == TRUE) { if(--battleground_info.ticks == 0) { battleground_info.about_to_start = FALSE; battleground_info.in_progress = TRUE; for(d = descriptor_list; d != NULL; d = d->next) { victim = d->character; if(IS_NPC(victim) || IS_IMMORTAL(victim)) continue; if(IS_SET(victim->act, PLR_BATTLEGROUND)) { battleground_info.players++; victim->pcdata->bg_hp_store = victim->hit; victim->pcdata->bg_mn_store = victim->mana; victim->pcdata->bg_mv_store = victim->move; victim->pcdata->bg_room_store = victim->in_room; send_to_char("You have enter the battleground. Defend yourself!\n\r", victim); act("$n has been escorted to the battleground.", victim, NULL, NULL, TO_ROOM); char_from_room(victim); drop_room = number_range(battleground_area_table[battleground_info.area].first_vnum, battleground_area_table[battleground_info.area].last_vnum); pRoomIndex = get_room_index( drop_room ); char_to_room(victim, pRoomIndex); act("$n has entered the battleground.\n\r", victim, NULL, NULL, TO_ROOM); do_look(victim,"auto"); } } if(battleground_info.players == 0) { sprintf(buf, "No one joined the battleground, %s has been lost.\n\r", battleground_info.prize->short_descr); info_channel( buf ); battleground_info.ticks = 0; /* The number of ticks until the battleground begins */ battleground_info.min_lvl = 0; battleground_info.max_lvl = 0; battleground_info.prize = NULL; battleground_info.area = 0; battleground_info.about_to_start = FALSE; battleground_info.in_progress = FALSE; battleground_info.players = 0; return; } else { sprintf(buf, "Time is up to join the battleground. Let the contest begin!\n\r"); info_channel( buf ); } } else { sprintf(buf, "A battleground for levels: %d - %d will begin shortly. The winner shall receive %s. To join, type 'battleground join'!\n\r", battleground_info.min_lvl, battleground_info.max_lvl, battleground_info.prize->short_descr); info_channel( buf ); } return; } if(battleground_info.in_progress == TRUE) { if(battleground_info.players == 1) { for(d = descriptor_list; d != NULL; d = d->next) { victim = d->character; if(IS_NPC(victim) || IS_IMMORTAL(victim)) continue; if(IS_SET(victim->act, PLR_BATTLEGROUND)) { sprintf(buf, "%s is the sole survivor of the battleground and has been awarded %s. Congratulations %s!\n\r", victim->name, battleground_info.prize->short_descr, victim->name); info_channel( buf ); sprintf(buf, "%s suddenly appears in your inventory!\n\r", battleground_info.prize->short_descr); send_to_char(buf, victim); obj = battleground_info.prize; obj_to_char(obj,victim); REMOVE_BIT(victim->act, PLR_BATTLEGROUND); victim->hit = victim->pcdata->bg_hp_store; victim->mana = victim->pcdata->bg_mn_store; victim->move = victim->pcdata->bg_mv_store; char_from_room(victim); char_to_room(victim, victim->pcdata->bg_room_store); do_look(victim,"auto"); act("$n arrives with a proud look on $s face.\n\r", victim, NULL, NULL, TO_ROOM); battleground_info.ticks = 0; /* The number of ticks until the battleground begins */ battleground_info.min_lvl = 0; battleground_info.max_lvl = 0; battleground_info.prize = NULL; battleground_info.area = 0; battleground_info.about_to_start = FALSE; battleground_info.in_progress = FALSE; battleground_info.players = 0; } } return; } if(battleground_info.players == 0) { sprintf(buf, "There was no survivor in the battleground. The prize, %s, was lost.\n\r", battleground_info.prize->short_descr); info_channel( buf ); battleground_info.ticks = 0; /* The number of ticks until the battleground begins */ battleground_info.min_lvl = 0; battleground_info.max_lvl = 0; battleground_info.prize = NULL; battleground_info.area = 0; battleground_info.about_to_start = FALSE; battleground_info.in_progress = FALSE; battleground_info.players = 0; return; } } } --------------------------------------------- End battleground.c ---------------------------------------- --------------------------------------------- Begin bgrounds.are ---------------------------------------- #AREA bground.are~ Battle Grounds~ { 5 10} Tsudanosh Battle Grounds~ 300 399 #MOBILES #0 #OBJECTS #400 water flask~ a water flask~ A water flask is lying on the ground.~ unknown~ drink 0 A0 10 10 'water' 0 0 0 0 150 P #401 giant ration~ a giant ration~ A giant ration is molding on the ground.~ unknown~ food 0 A0 DF EG 0 0 0 0 0 500 P #402 yarrow potion~ a yarrow potion~ A yarrow potion is lying on the ground.~ unknown~ potion 0 AG 1 'restore mana' 'reserved' 'reserved' 'reserved' 0 0 1000 P #403 zarynithium potion~ a zarynithium potion~ A zarynithium potion is lying on the ground.~ unknown~ potion 0 A0 30 'kusamotu' 'reserved' 'reserved' 'reserved' 0 1 10000 P #404 glow stone glowstone~ a glowstone~ A glowstone is illuminating the room here.~ unknown~ light A AQG 0 0 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef 0 0 0 0 500 P #405 500 gold coins~ 500 gold coins~ 500 gold coins is sitting on the ground.~ unknown~ money 0 A0 CEFGHI 0 0 0 0 0 0 0 P #406 1000 gold coins~ 1,000 gold coins~ 1,000 gold coins are sitting on the ground.~ unknown~ money 0 A0 DFGHIJ 0 0 0 0 0 0 0 P #407 Robe~ some robes~ Some robes are piled up in the corner.~ unknown~ armor S AD ABCDEF B B B ABCD0 1 1 500 P #408 Leather Cuirass~ a leather cuirass~ A leather cuirass is lying on the ground.~ unknown~ armor S ADBCDE AC AC AC BD 0 5 1 1500 P #409 scroll gimotu~ scroll of gimotu~ A scroll of gimotu is lying on the ground.~ unknown~ scroll 0 A0 40 'gimotu' 'gimotu' 'gimotu' 'gimotu' 0 0 0 P #410 scroll modoki small~ a scroll of modoki~ A small scroll is rolled up on the ground.~ unknown~ scroll P A0 16 'modoki' 'reserved' 'reserved' 'reserved' 0 0 0 P #0 #ROOMS #400 You are in room of total annihilation.~ ~ 0 B 0 S #401 You are on the first floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 402 D1 ~ ~ 0 0 408 D4 ~ ~ 0 0 412 S #402 You are on the first floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 403 D1 ~ ~ 0 0 409 D2 ~ ~ 0 0 401 S #403 You are on the first floor of the tower.~ ~ 0 B 0 D1 ~ ~ 0 0 404 D2 ~ ~ 0 0 402 D4 ~ ~ 0 0 410 S #404 You are on the first floor of the tower.~ ~ 0 B 0 D1 ~ ~ 0 0 405 D2 ~ ~ 0 0 409 D3 ~ ~ 0 0 403 S #405 You are on the first floor of the tower.~ ~ 0 B 0 D2 ~ ~ 0 0 406 D3 ~ ~ 0 0 404 D4 ~ ~ 0 0 416 S #406 You are on the first floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 405 D2 ~ ~ 0 0 407 D3 ~ ~ 0 0 409 S #407 You are on the first floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 406 D3 ~ ~ 0 0 408 D4 ~ ~ 0 0 414 S #408 You are on the first floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 409 D1 ~ ~ 0 0 407 D3 ~ ~ 0 0 401 S #409 You are on the first floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 404 D1 ~ ~ 0 0 406 D2 ~ ~ 0 0 408 D3 ~ ~ 0 0 402 S #410 You are on the second floor of the tower.~ ~ 0 B 0 D1 ~ ~ 0 0 417 D2 ~ ~ 0 0 411 D5 ~ ~ 0 0 403 S #411 You are on the second floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 410 D1 ~ ~ 0 0 418 D2 ~ ~ 0 0 412 S #412 You are on the second floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 411 D1 ~ ~ 0 0 413 D5 ~ ~ 0 0 401 S #413 You are on the second floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 418 D1 ~ ~ 0 0 414 D3 ~ ~ 0 0 412 S #414 You are on the second floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 415 D3 ~ ~ 0 0 413 D5 ~ ~ 0 0 407 S #415 You are on the second floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 416 D2 ~ ~ 0 0 414 D3 ~ ~ 0 0 418 S #416 You are on the second floor of the tower.~ ~ 0 B 0 D2 ~ ~ 0 0 415 D3 ~ ~ 0 0 417 D5 ~ ~ 0 0 405 S #417 You are on the second floor of the tower.~ ~ 0 B 0 D1 ~ ~ 0 0 416 D2 ~ ~ 0 0 418 D3 ~ ~ 0 0 410 S #418 You are on the second floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 417 D1 ~ ~ 0 0 415 D2 ~ ~ 0 0 413 D3 ~ ~ 0 0 411 D4 ~ ~ 0 0 419 S #419 You are on the top floor of the tower.~ ~ 0 B 0 D2 ~ ~ 0 0 420 D5 ~ ~ 0 0 418 S #420 You are on the top floor of the tower.~ ~ 0 B 0 D0 ~ ~ 0 0 419 S #421 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 429 D1 ~ ~ 0 0 422 S #422 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 430 D1 ~ ~ 0 0 423 D3 ~ ~ 0 0 421 S #423 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 431 D1 ~ ~ 0 0 424 D3 ~ ~ 0 0 422 S #424 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 432 D1 ~ ~ 0 0 425 D3 ~ ~ 0 0 423 S #425 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 433 D1 ~ ~ 0 0 426 D3 ~ ~ 0 0 424 S #426 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 434 D1 ~ ~ 0 0 427 D3 ~ ~ 0 0 425 S #427 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 435 D1 ~ ~ 0 0 428 D3 ~ ~ 0 0 426 S #428 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 436 D3 ~ ~ 0 0 427 S #429 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 437 D1 ~ ~ 0 0 430 D2 ~ ~ 0 0 421 S #430 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 438 D1 ~ ~ 0 0 431 D2 ~ ~ 0 0 422 D3 ~ ~ 0 0 429 S #431 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 439 D1 ~ ~ 0 0 432 D2 ~ ~ 0 0 423 D3 ~ ~ 0 0 430 S #432 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 440 D1 ~ ~ 0 0 433 D2 ~ ~ 0 0 424 D3 ~ ~ 0 0 431 S #433 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 441 D1 ~ ~ 0 0 434 D2 ~ ~ 0 0 425 D3 ~ ~ 0 0 432 S #434 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 442 D1 ~ ~ 0 0 435 D2 ~ ~ 0 0 426 D3 ~ ~ 0 0 433 S #435 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 443 D1 ~ ~ 0 0 436 D2 ~ ~ 0 0 427 D3 ~ ~ 0 0 434 S #436 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 444 D2 ~ ~ 0 0 428 D3 ~ ~ 0 0 435 S #437 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 445 D1 ~ ~ 0 0 438 D2 ~ ~ 0 0 429 S #438 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 446 D1 ~ ~ 0 0 439 D2 ~ ~ 0 0 430 D3 ~ ~ 0 0 437 S #439 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 447 D1 ~ ~ 0 0 440 D2 ~ ~ 0 0 431 D3 ~ ~ 0 0 438 S #440 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 448 D1 ~ ~ 0 0 441 D2 ~ ~ 0 0 432 D3 ~ ~ 0 0 439 S #441 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 449 D1 ~ ~ 0 0 442 D2 ~ ~ 0 0 433 D3 ~ ~ 0 0 440 S #442 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 450 D1 ~ ~ 0 0 443 D2 ~ ~ 0 0 434 D3 ~ ~ 0 0 441 S #443 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 451 D1 ~ ~ 0 0 444 D2 ~ ~ 0 0 435 D3 ~ ~ 0 0 442 S #444 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 452 D2 ~ ~ 0 0 436 D3 ~ ~ 0 0 443 S #445 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 453 D1 ~ ~ 0 0 446 D2 ~ ~ 0 0 437 S #446 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 454 D1 ~ ~ 0 0 447 D2 ~ ~ 0 0 438 D3 ~ ~ 0 0 445 S #447 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 455 D1 ~ ~ 0 0 448 D2 ~ ~ 0 0 439 D3 ~ ~ 0 0 446 S #448 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 456 D1 ~ ~ 0 0 449 D2 ~ ~ 0 0 440 D3 ~ ~ 0 0 447 S #449 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 457 D1 ~ ~ 0 0 450 D2 ~ ~ 0 0 441 D3 ~ ~ 0 0 448 S #450 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 458 D1 ~ ~ 0 0 451 D2 ~ ~ 0 0 442 D3 ~ ~ 0 0 449 S #451 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 459 D1 ~ ~ 0 0 452 D2 ~ ~ 0 0 443 D3 ~ ~ 0 0 450 S #452 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 460 D2 ~ ~ 0 0 444 D3 ~ ~ 0 0 451 S #453 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 461 D1 ~ ~ 0 0 454 D2 ~ ~ 0 0 445 S #454 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 462 D1 ~ ~ 0 0 455 D2 ~ ~ 0 0 446 D3 ~ ~ 0 0 453 S #455 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 463 D1 ~ ~ 0 0 456 D2 ~ ~ 0 0 447 D3 ~ ~ 0 0 454 S #456 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 464 D1 ~ ~ 0 0 457 D2 ~ ~ 0 0 448 D3 ~ ~ 0 0 455 S #457 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 465 D1 ~ ~ 0 0 458 D2 ~ ~ 0 0 449 D3 ~ ~ 0 0 456 S #458 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 466 D1 ~ ~ 0 0 459 D2 ~ ~ 0 0 450 D3 ~ ~ 0 0 457 S #459 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 467 D1 ~ ~ 0 0 460 D2 ~ ~ 0 0 451 D3 ~ ~ 0 0 458 S #460 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 468 D2 ~ ~ 0 0 452 D3 ~ ~ 0 0 459 S #461 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 469 D1 ~ ~ 0 0 462 D2 ~ ~ 0 0 453 S #462 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 470 D1 ~ ~ 0 0 463 D2 ~ ~ 0 0 454 D3 ~ ~ 0 0 461 S #463 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 471 D1 ~ ~ 0 0 464 D2 ~ ~ 0 0 455 D3 ~ ~ 0 0 462 S #464 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 472 D1 ~ ~ 0 0 465 D2 ~ ~ 0 0 456 D3 ~ ~ 0 0 463 S #465 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 473 D1 ~ ~ 0 0 466 D2 ~ ~ 0 0 457 D3 ~ ~ 0 0 464 S #466 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 474 D1 ~ ~ 0 0 467 D2 ~ ~ 0 0 458 D3 ~ ~ 0 0 465 S #467 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 475 D1 ~ ~ 0 0 468 D2 ~ ~ 0 0 459 D3 ~ ~ 0 0 466 S #468 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 476 D2 ~ ~ 0 0 460 D3 ~ ~ 0 0 467 S #469 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 477 D1 ~ ~ 0 0 470 D2 ~ ~ 0 0 461 S #470 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 478 D1 ~ ~ 0 0 471 D2 ~ ~ 0 0 462 D3 ~ ~ 0 0 469 S #471 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 479 D1 ~ ~ 0 0 472 D2 ~ ~ 0 0 463 D3 ~ ~ 0 0 470 S #472 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 480 D1 ~ ~ 0 0 473 D2 ~ ~ 0 0 464 D3 ~ ~ 0 0 471 S #473 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 481 D1 ~ ~ 0 0 474 D2 ~ ~ 0 0 465 D3 ~ ~ 0 0 472 S #474 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 482 D1 ~ ~ 0 0 475 D2 ~ ~ 0 0 466 D3 ~ ~ 0 0 473 S #475 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 483 D1 ~ ~ 0 0 476 D2 ~ ~ 0 0 467 D3 ~ ~ 0 0 474 S #476 You are on a life-sized chessboard.~ ~ 0 B 0 D0 ~ ~ 0 0 484 D2 ~ ~ 0 0 468 D3 ~ ~ 0 0 475 S #477 You are on a life-sized chessboard.~ ~ 0 B 0 D1 ~ ~ 0 0 478 D2 ~ ~ 0 0 469 S #478 You are on a life-sized chessboard.~ ~ 0 B 0 D1 ~ ~ 0 0 479 D2 ~ ~ 0 0 470 D3 ~ ~ 0 0 477 S #479 You are on a life-sized chessboard.~ ~ 0 B 0 D1 ~ ~ 0 0 480 D2 ~ ~ 0 0 471 D3 ~ ~ 0 0 478 S #480 You are on a life-sized chessboard.~ ~ 0 B 0 D1 ~ ~ 0 0 481 D2 ~ ~ 0 0 472 D3 ~ ~ 0 0 479 S #481 You are on a life-sized chessboard.~ ~ 0 B 0 D1 ~ ~ 0 0 482 D2 ~ ~ 0 0 473 D3 ~ ~ 0 0 480 S #482 You are on a life-sized chessboard.~ ~ 0 B 0 D1 ~ ~ 0 0 483 D2 ~ ~ 0 0 474 D3 ~ ~ 0 0 481 S #483 You are on a life-sized chessboard.~ ~ 0 B 0 D1 ~ ~ 0 0 484 D2 ~ ~ 0 0 475 D3 ~ ~ 0 0 482 S #484 You are on a life-sized chessboard.~ ~ 0 B 0 D2 ~ ~ 0 0 476 D3 ~ ~ 0 0 483 S #0 #SPECIALS S #RESETS S #SHOPS 0 #$ -------------------------------------------------- End bgrounds.are -------------------------------------