/* * The unique portions of SunderMud code as well as the integration efforts * for code from other sources is based on the efforts of: * * Lotherius (elfren@aros.net) * * This code can only be used under the terms of the DikuMud, Merc, * and ROM licenses. The same requirements apply to the changes that * have been made. * * All other copyrights remain in place and in force. */ /* routines related to leasing. Entire file 100% unique coding by Lotherius (elfren@aros.net)*/ #include "everything.h" /* local functions */ void save_leases(); void do_lease( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; /* is room rentable at all? */ if (IS_SET(ch->in_room->room_flags, ROOM_RENT) ) { if (ch->in_room->rented_by) /* if room is currently being rented */ { if (ch->in_room->rented_by != ch->name) /* if room is rented by ch */ { send_to_char("This room is not currently for rent.\n\r",ch); return; /* if not, return with no further action. */ } /* end of currently rented*/ } /* end of rented_by */ sprintf(buf,"{CThe monthly rent on this room is ${Y%ld{x.\n\r", ch->in_room->room_rent); /* how much is the rent per month */ send_to_char( buf , ch ); if (ch->in_room->rented_by) /* if it is being rented (by ch) then when is rent due */ { sprintf(buf,"{CYour rent is paid until Month %d of Year %d.\n\r", /* month/dd/yyyy */ ch->in_room->paid_month, ch->in_room->paid_year ); send_to_char(buf,ch); } if (argument[0] != '\0') /* if there's an argument, we're going to rent for longer */ { int timeleft; /* time left on lease */ int months; if (!is_number(argument)) { send_to_char("{RInvalid argument. Syntax: lease <number>.{x\n\r",ch); return; } months = atoi(argument); if (months < 1 ) /* trying to unrent? */ { send_to_char("{MYou must rent for at least 1 full month.{x\n\r",ch); return; } /* end of unrent */ if (months > 17 ) /* can't rent for longer than 1 mud year */ { send_to_char("{MYou can only rent for a maximum of 1 year.{x\n\r",ch); return; } /* end of too long rent */ timeleft = 0; if (ch->in_room->paid_year < time_info.year) { timeleft = 0; } else if (ch->in_room->paid_year == time_info.year) { timeleft = ch->in_room->paid_month - time_info.month; } else if (ch->in_room->paid_year > time_info.year) { timeleft = ch->in_room->paid_month - time_info.month; timeleft += 17; } if (timeleft >= 17) { send_to_char("{YYou are currently paid for a full year.{x\n\r",ch); return; } if ( (timeleft + months) > 17 ) { send_to_char("{MYou can't rent past 1 year. Try fewer months.{x\n\r",ch); return; } /* now all that's out of the way, we have an almost valid number of months to rent. */ if ( (months * ch->in_room->room_rent) > ch->gold ) { send_to_char("{RYou don't have enough gold.{x\n\r",ch); /* if ( (ch->gold / (months * ch->in_room->room_rent) ) >= 1 ) sprintf(buf,"You have enough gold for {Y%d{x months.\n\r", (ch->gold / (months * ch->in_room->room_rent)) ); */ return; } /* end of gold check, now we know if there's enough gold or not. */ /* rentable room, okay time, enough gold. */ ch->gold -= months * ch->in_room->room_rent; ch->in_room->paid_month = time_info.month; ch->in_room->paid_year = time_info.year; if ( (timeleft + months) > 17 ) { ++ch->in_room->paid_year; } else { if ( ( time_info.month + (months + timeleft) ) > 17 ) { ++ch->in_room->paid_year; ch->in_room->paid_month += ( (months + timeleft) - 17 ); } else { ch->in_room->paid_month += (months + timeleft); } } sprintf(buf,"{CYou have now rented this room for ${Y%ld{C gold coins for a total of %d months.\n\r{x", months * ch->in_room->room_rent, months ); send_to_char(buf,ch); sprintf(buf,"{CThe rent is NOW paid until Month %d of Year %d.{x\n\r", ch->in_room->paid_month, ch->in_room->paid_year ); send_to_char(buf,ch); act( "$n has signed a lease on this room.", ch, NULL, NULL, TO_ROOM ); free_string( ch->in_room->rented_by ); ch->in_room->rented_by = str_dup( ch->name ); save_leases(); return; } /* end of rental code! */ } /* end of able to rent */ send_to_char("This room cannot be rented.\n\r",ch); return; } /* end of do_lease */ void do_checklease ( CHAR_DATA *ch, char *argument ) /* immortal command to show lease info */ { char buf[MAX_STRING_LENGTH]; if (IS_SET(ch->in_room->room_flags, ROOM_RENT) ) /* if rentable */ { if (ch->in_room->rented_by) /* if currently being rented */ { sprintf (buf,"{GRented By: {W%s\n\r", /* who */ ch->in_room->rented_by ); send_to_char(buf,ch); sprintf (buf,"{GMonthly Rent: {W%ld\n\r", /* how much */ ch->in_room->room_rent ); send_to_char(buf,ch); sprintf (buf,"{GLease Expires: {WMonth %d of Year %d.{x\n\r", /* until when */ ch->in_room->paid_month, ch->in_room->paid_year ); send_to_char(buf,ch); return; } /* end of display for currently rented */ else /* not currently being rented */ { send_to_char("{GNot currently being rented.\n\r",ch); sprintf (buf,"Monthly Rent: {W%ld{x\n\r", /* how much */ ch->in_room->room_rent); send_to_char(buf,ch); return; } /* end of not currently rented */ } /* end of rentable */ send_to_char("{GThis is a non-rentable room.{x\n\r",ch); return; } /* end of do_checklease */ void save_leases( ) { FILE *fp = NULL; ROOM_INDEX_DATA *pRoomIndex; int iHash; char buf[MAX_STRING_LENGTH]; #if defined(DEBUGINFO) log_string("DEBUG: do_save_leases: begin"); #endif sprintf (buf, "%sLease.DAT", DATA_DIR); fp = fopen (buf, "w"); if (!fp) { bug ("Could not open Lease.DAT for writing!",0); return; } for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ ) { for ( pRoomIndex = room_index_hash[iHash]; pRoomIndex; pRoomIndex = pRoomIndex->next ) { if (IS_SET(pRoomIndex->room_flags, ROOM_RENT) ) { fprintf (fp, "L %d %ld %d %d %d %s~\n", pRoomIndex->vnum, pRoomIndex->room_rent, pRoomIndex->paid_month, pRoomIndex->paid_day, pRoomIndex->paid_year, pRoomIndex->rented_by); } /* end of is rentable */ } /* end of proomindex for loop */ } /* end of iHash for */ fprintf( fp, "END\n" ); fclose ( fp ); return; } void load_leases( ) { FILE *fp = NULL; char buf[MAX_STRING_LENGTH]; char *word; bool fMatch; bool done=FALSE; ROOM_INDEX_DATA *pRoomIndex; sprintf (buf, "%sLease.DAT", DATA_DIR); fp = fopen (buf, "r"); if (!fp) { bug ("Could not open Lease.DAT for Reading!",0); return; } fMatch = FALSE; while (!done) { word = fread_word( fp ); if (!str_cmp(word,"L")) { pRoomIndex = get_room_index ( fread_number( fp ) ); pRoomIndex->room_rent = fread_number( fp ); pRoomIndex->paid_month = fread_number( fp ); pRoomIndex->paid_day = fread_number( fp ); pRoomIndex->paid_year = fread_number( fp ); free_string(pRoomIndex->rented_by); pRoomIndex->rented_by = fread_string( fp ); } if (!str_cmp(word,"END")) { done = TRUE; break; } } /* end of while !done */ fclose (fp); return; }