// Modified by Zunath #include "rhs_include" #include "zzdlg_main_inc" const string RESPONSE_PAGE = "rhs_house_menu_responses"; const string PAGE_MAIN = "main_page"; const string PAGE_ENTER_FRIEND_HOUSE = "enter_friend_house_page"; const string PAGE_ENTER_PUBLIC_HOUSE = "enter_public_house_page"; const string PAGE_PAY_RENT = "pay_rent_page"; const string PAGE_MANAGE_FRIENDS = "manage_friends_page"; const string PAGE_MANAGE_PRIVACY = "manage_privacy_page"; const string PAGE_CHANGE_HOUSE_NAME = "change_house_name_page"; ///////////////////////// // TEMPORARY VARIABLES // ///////////////////////// // Tracks the amount of money rent costs const string PAGE_TEMP_RENT_COST = "PAGE_TEMP_RENT_COST"; void ClearTemporaryVariables() { object oPC = dlgGetSpeakingPC(); DeleteLocalInt(oPC, RHS_PAGE_TEMP_LISTENING); DeleteLocalInt(oPC, PAGE_TEMP_RENT_COST); DeleteLocalString(oPC, RHS_PAGE_TEMP_NEW_HOUSE_NAME); } // Prototypes void MainPageInit(); void MainPageSelect(); void EnterFriendHouseInit(); void EnterFriendHouseSelect(); void EnterPublicHouseInit(); void EnterPublicHouseSelect(); void PayRentInit(); void PayRentSelect(); void ManageFriendsInit(); void ManageFriendsSelect(); void ManagePrivacyInit(); void ManagePrivacySelect(); void ChangeHouseNameInit(); void ChangeHouseNameSelect(); void OnInit() { dlgChangeLabelNext("Next page"); dlgChangeLabelPrevious("Previous page"); dlgChangePage(PAGE_MAIN); dlgActivatePreservePageNumberOnSelection(); dlgActivateResetResponse(); } // Create the page void OnPageInit( string sPage ) { DeleteList( RESPONSE_PAGE, dlgGetSpeakingPC() ); if( sPage == PAGE_MAIN ) MainPageInit( ); else if(sPage == PAGE_ENTER_FRIEND_HOUSE) EnterFriendHouseInit(); else if(sPage == PAGE_ENTER_PUBLIC_HOUSE) EnterPublicHouseInit(); else if(sPage == PAGE_PAY_RENT) PayRentInit(); else if(sPage == PAGE_MANAGE_FRIENDS) ManageFriendsInit(); else if(sPage == PAGE_MANAGE_PRIVACY) ManagePrivacyInit(); else if(sPage == PAGE_CHANGE_HOUSE_NAME) ChangeHouseNameInit(); dlgSetActiveResponseList( RESPONSE_PAGE ); } // Handles any selection. void OnSelection( string sPage ) { if ( sPage == PAGE_MAIN ) MainPageSelect( ); else if(sPage == PAGE_ENTER_FRIEND_HOUSE) EnterFriendHouseSelect(); else if(sPage == PAGE_ENTER_PUBLIC_HOUSE) EnterPublicHouseSelect(); else if(sPage == PAGE_PAY_RENT) PayRentSelect(); else if(sPage == PAGE_MANAGE_FRIENDS) ManageFriendsSelect(); else if(sPage == PAGE_MANAGE_PRIVACY) ManagePrivacySelect(); else if(sPage == PAGE_CHANGE_HOUSE_NAME) ChangeHouseNameSelect(); } void OnReset( string sPage ) { ClearTemporaryVariables(); dlgChangePage( PAGE_MAIN ); dlgResetPageNumber( ); } void OnAbort( string sPage ) { ClearTemporaryVariables(); DeleteList( RESPONSE_PAGE, dlgGetSpeakingPC() ); } void OnEnd( string sPage ) { ClearTemporaryVariables(); DeleteList( RESPONSE_PAGE, dlgGetSpeakingPC() ); } void OnContinue( string sPage, int iContinuePage ) { } // Message handler void main() { dlgOnMessage(); } // Specific scripting starts here // MAIN PAGE START void MainPageInit( ) { object oPC = dlgGetSpeakingPC(); object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); int iPCID = GetLocalInt(oDatabase, PC_ID_NUMBER); int bHouseRented = GetLocalInt(oDatabase, RHS_PLAYER_HOUSE_RENTED); string sPrompt = ColorTokenGreen() + RHS_HOUSE_TERM_PROPER + " Menu\n\n" + ColorTokenEnd(); // PC doesn't have a house currently if(!bHouseRented) { sPrompt += "You do not currently have a " + RHS_HOUSE_TERM_LOWER + " rented."; dlgAddResponseAction(RESPONSE_PAGE, "Enter a Public " + RHS_HOUSE_TERM_PROPER); } else { string sDate = GetMySQLData(RHS_TABLE_HOUSES, "Accessible_Until", iPCID, "Player_ID", RHS_SCHEMA); sPrompt += ColorTokenGreen() + "Rent Due: " + ColorTokenEnd() + sDate + "\n\n";; sPrompt += "What would you like to do?"; dlgAddResponseAction(RESPONSE_PAGE, "Enter Your " + RHS_HOUSE_TERM_PROPER); //dlgAddResponseAction(RESPONSE_PAGE, "Enter a Friend's " + RHS_HOUSE_TERM_PROPER); dlgAddResponseAction(RESPONSE_PAGE, "Enter a Public " + RHS_HOUSE_TERM_PROPER); dlgAddResponseAction(RESPONSE_PAGE, "Pay Rent"); //dlgAddResponseAction(RESPONSE_PAGE, "Manage Friends"); dlgAddResponseAction(RESPONSE_PAGE, "Manage Privacy"); dlgAddResponseAction(RESPONSE_PAGE, "Change " + RHS_HOUSE_TERM_PROPER + " Name"); } dlgSetPrompt(sPrompt); dlgDeactivateResetResponse(); dlgActivateEndResponse( "End" ); } void MainPageSelect( ) { object oPC = dlgGetSpeakingPC(); object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); // Enter Your House if(dlgIsSelectionEqualToName("Enter Your " + RHS_HOUSE_TERM_PROPER)) { int bRentPaid = RHS_IsRentPaid(oPC); // Check if rent is paid - if it is, fire RHS_EnterHouse. if(bRentPaid) { RHS_EnterHouse(oPC, oPC); } else { FloatingTextStringOnCreature(ColorTokenRed() + "You must pay your rent before you can enter your " + RHS_HOUSE_TERM_LOWER + "." + ColorTokenEnd(), oPC, FALSE); } dlgEndDialog(); } // Enter a Friend's House else if(dlgIsSelectionEqualToName("Enter a Friend's " + RHS_HOUSE_TERM_PROPER)) { dlgChangePage(PAGE_ENTER_FRIEND_HOUSE); } // Enter a Public House else if(dlgIsSelectionEqualToName("Enter a Public " + RHS_HOUSE_TERM_PROPER)) { dlgChangePage(PAGE_ENTER_PUBLIC_HOUSE); } // Pay Rent else if(dlgIsSelectionEqualToName("Pay Rent")) { dlgChangePage(PAGE_PAY_RENT); } // Manage Friends else if(dlgIsSelectionEqualToName("Manage Friends")) { dlgChangePage(PAGE_MANAGE_FRIENDS); } // Manage Privacy else if(dlgIsSelectionEqualToName("Manage Privacy")) { dlgChangePage(PAGE_MANAGE_PRIVACY); } // Change House Name else if(dlgIsSelectionEqualToName("Change " + RHS_HOUSE_TERM_PROPER + " Name")) { dlgChangePage(PAGE_CHANGE_HOUSE_NAME); } } void EnterFriendHouseInit() { object oPC = dlgGetSpeakingPC(); object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); string sSQL = "SELECT"; dlgActivateResetResponse("Back", ColorTokenBlue()); } void EnterFriendHouseSelect() { } void EnterPublicHouseInit() { object oPC = dlgGetSpeakingPC(); dlgSetPrompt(ColorTokenGreen() + RHS_HOUSE_TERM_PROPER + " Menu\n\n" + ColorTokenEnd() + "Please select a " + RHS_HOUSE_TERM_LOWER + " you wish to enter."); // Display all people's houses that are set to public entry and are accessible (I.E: Rent has been paid) string sSQL = "SELECT Player_ID, House_Name FROM " + RHS_SCHEMA + "." + RHS_TABLE_HOUSES + " WHERE Publicity='P' AND UNIX_TIMESTAMP(Accessible_Until) > UNIX_TIMESTAMP();"; SQLExecDirect(sSQL); while(SQLFetch() == SQL_SUCCESS) { string sPCID = SQLGetData(1); string sHouseName = SQLDecodeSpecialChars(SQLGetData(2)); dlgAddResponseAction(RESPONSE_PAGE, "(" + sPCID + ") " + sHouseName); } dlgActivateResetResponse("Back", ColorTokenBlue()); } void EnterPublicHouseSelect() { object oPC = dlgGetSpeakingPC(); string sSelection = dlgGetSelectionName(); int iOwnerID; // Find the owner's ID number, starting from the right string sOwnerID = GetStringLeft(sSelection, 1); int iCurChar; int iLength = GetStringLength(sSelection); for(iCurChar = 0; iCurChar < iLength; iCurChar++) { string sCharacter = GetSubString(sSelection, iCurChar, 1); if(sCharacter == ")") break; else { sOwnerID += sCharacter; } } // Knock off the parenthases from sOwnerID sOwnerID = GetSubString(sOwnerID, 2, GetStringLength(sOwnerID)); iOwnerID = StringToInt(sOwnerID); // Check if rent is paid once more to be safe if(!RHS_IsRentPaid(OBJECT_INVALID, iOwnerID)) { FloatingTextStringOnCreature(ColorTokenRed() + "The owner of that " + RHS_HOUSE_TERM_LOWER + " has not paid his or her rent.", oPC, FALSE); } else { // We've got the owner ID number now. Port player into his/her house RHS_EnterHouse(oPC, OBJECT_INVALID, iOwnerID); dlgEndDialog(); } } void PayRentInit() { object oPC = dlgGetSpeakingPC(); object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); int iPCID = GetLocalInt(oDatabase, PC_ID_NUMBER); string sMessage = ColorTokenGreen() + RHS_HOUSE_TERM_PROPER + " Menu\n\n" + ColorTokenEnd(); int iRent; string sDate; int iGold = GetGold(oPC); string sSQL = "SELECT Rent, Accessible_Until FROM " + RHS_SCHEMA + "." + RHS_TABLE_HOUSES + ", " + RHS_SCHEMA + "." + RHS_TABLE_HOUSE_TYPES + " WHERE Player_ID=" + IntToString(iPCID) + ";"; SQLExecDirect(sSQL); while(SQLFetch() == SQL_SUCCESS) { iRent = StringToInt(SQLGetData(1)); sDate = SQLGetData(2); } sMessage += ColorTokenGreen() + "Rent Cost: " + ColorTokenEnd() + IntToString(iRent) + " GP Per Week \n"; sMessage += ColorTokenGreen() + "Rent Due: " + ColorTokenEnd() + sDate + "\n\n"; sMessage += "You may pay your rent in advance. Each purchase you make extends the date by " + IntToString(RHS_RENT_LENGTH) + " or " + IntToString(RHS_RENT_LENGTH * 4) + " days.\n\n"; sMessage += ColorTokenRed() + "Warning: " + ColorTokenEnd() + "Rent is non-refundable. If you move out of your " + RHS_HOUSE_TERM_LOWER + " with time remaining you will lose the time you purchased!\n"; dlgSetPrompt(sMessage); // Safety check if(iRent > 0) { SetLocalInt(oPC, PAGE_TEMP_RENT_COST, iRent); // 1 Week if(iGold >= iRent) { dlgAddResponseAction(RESPONSE_PAGE, "Extend Lease By 1 Week (" + IntToString(iRent) + " GP)"); } // 4 Weeks if(iGold >= iRent * 4) { dlgAddResponseAction(RESPONSE_PAGE, "Extend Lease By 4 Weeks (" + IntToString(iRent * 4) + " GP)"); } } dlgActivateResetResponse("Back", ColorTokenBlue()); } void PayRentSelect() { object oPC = dlgGetSpeakingPC(); int iRent = GetLocalInt(oPC, PAGE_TEMP_RENT_COST); int iGold = GetGold(oPC); int iNumberOfIncreases = 1; string sSelection = dlgGetSelectionName(); if(GetStringLeft(sSelection, 23) == "Extend Lease By 4 Weeks") { iNumberOfIncreases = 4; } // Not enough money if(iRent * iNumberOfIncreases > iGold) { FloatingTextStringOnCreature(ColorTokenRed() + "You do not have enough money to make that purchase." + ColorTokenEnd(), oPC, FALSE); return; } // Got enough - make the extension AssignCommand(oPC, TakeGoldFromCreature(iRent * iNumberOfIncreases, oPC, TRUE)); RHS_ExtendHouseRent(oPC, RHS_RENT_LENGTH * iNumberOfIncreases); } void ManageFriendsInit() { dlgActivateResetResponse("Back", ColorTokenBlue()); } void ManageFriendsSelect() { } void ManagePrivacyInit() { object oPC = dlgGetSpeakingPC(); object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); int iPCID = GetLocalInt(oDatabase, PC_ID_NUMBER); string sMessage = ColorTokenGreen() + RHS_HOUSE_TERM_PROPER + " Menu\n\n" + ColorTokenEnd(); string sPrivacyCode = GetMySQLData(RHS_TABLE_HOUSES, "Publicity", iPCID, "Player_ID", RHS_SCHEMA); string sPrivacy; // Convert privacy type to the full meaning if(sPrivacyCode == "P") sPrivacy = "Public"; else if(sPrivacyCode == "F") sPrivacy = "Friends Only"; else if(sPrivacyCode == "T") sPrivacy = "Trustees Only"; else sPrivacy = "Private"; sMessage += ColorTokenGreen() + "Privacy Setting: " + ColorTokenEnd() + sPrivacy + "\n\n"; sMessage += "You can modify your privacy settings here. This controls who has access to your " + RHS_HOUSE_TERM_LOWER + ".\n\n"; sMessage += ColorTokenYellow() + "'Private'" + ColorTokenEnd() + " means only you, the owner, will be able to enter.\n"; sMessage += ColorTokenYellow() + "'Friends Only'" + ColorTokenEnd() + " means only those you designate as your friends and/or trustees may enter.\n"; sMessage += ColorTokenYellow() + "'Trustees Only'" + ColorTokenEnd() + " means only those you designate as trustees may enter.\n"; sMessage += ColorTokenYellow() + "'Public'" + ColorTokenEnd() + " means everyone may enter.\n"; dlgSetPrompt(sMessage); if(sPrivacyCode != "O") dlgAddResponseAction(RESPONSE_PAGE, "Change Privacy Setting to 'Private'"); // Friends and Trustee settings disabled until the friend management portion of the system is complete /* if(sPrivacyCode != "F") dlgAddResponseAction(RESPONSE_PAGE, "Change Privacy Setting to 'Friends Only'"); if(sPrivacyCode != "T") dlgAddResponseAction(RESPONSE_PAGE, "Change Privacy Setting to 'Trustees Only'"); */ if(sPrivacyCode != "P") dlgAddResponseAction(RESPONSE_PAGE, "Change Privacy Setting to 'Public'"); dlgActivateResetResponse("Back", ColorTokenBlue()); } void ManagePrivacySelect() { object oPC = dlgGetSpeakingPC(); object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); int iPCID = GetLocalInt(oDatabase, PC_ID_NUMBER); if(dlgIsSelectionEqualToName("Change Privacy Setting to 'Private'")) { SetMySQLData(RHS_TABLE_HOUSES, "Publicity", iPCID, "O", "Player_ID", RHS_SCHEMA); } else if(dlgIsSelectionEqualToName("Change Privacy Setting to 'Friends Only'")) { SetMySQLData(RHS_TABLE_HOUSES, "Publicity", iPCID, "F", "Player_ID", RHS_SCHEMA); } else if(dlgIsSelectionEqualToName("Change Privacy Setting to 'Trustees Only'")) { SetMySQLData(RHS_TABLE_HOUSES, "Publicity", iPCID, "T", "Player_ID", RHS_SCHEMA); } else if(dlgIsSelectionEqualToName("Change Privacy Setting to 'Public'")) { SetMySQLData(RHS_TABLE_HOUSES, "Publicity", iPCID, "P", "Player_ID", RHS_SCHEMA); } } void ChangeHouseNameInit() { object oPC = dlgGetSpeakingPC(); object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); int iPCID = GetLocalInt(oDatabase, PC_ID_NUMBER); string sMessage = ColorTokenGreen() + RHS_HOUSE_TERM_PROPER + " Menu\n\n" + ColorTokenEnd(); int bListening = GetLocalInt(oPC, RHS_PAGE_TEMP_LISTENING); string sHouseName; string sSQL = "SELECT House_Name FROM " + RHS_SCHEMA + "." + RHS_TABLE_HOUSES + " WHERE Player_ID=" + IntToString(iPCID) + ";"; SQLExecDirect(sSQL); while(SQLFetch() == SQL_SUCCESS) { sHouseName = SQLDecodeSpecialChars(SQLGetData(1)); } // House name wasn't put in for some reason - set to default if(sHouseName == "") { sHouseName = GetName(oPC) + "'s " + RHS_HOUSE_TERM_PROPER; } sMessage += ColorTokenGreen() + "Current " + RHS_HOUSE_TERM_PROPER + " Name: " + ColorTokenEnd() + sHouseName + "\n\n"; // Is the system listening for PC's text input? if(bListening) { dlgAddResponseAction(RESPONSE_PAGE, "Finish Entering New " + RHS_HOUSE_TERM_PROPER + " Name"); } // Not listening - add the option to listen else { dlgAddResponseAction(RESPONSE_PAGE, "Enter New " + RHS_HOUSE_TERM_PROPER + " Name"); } sMessage += "You can change the name of your " + RHS_HOUSE_TERM_LOWER + " here. This will display as the name of the area and it will display in searches made for public " + RHS_HOUSE_TERM_LOWER_PLURAL + "."; dlgSetPrompt(sMessage); dlgActivateResetResponse("Back", ColorTokenBlue()); } void ChangeHouseNameSelect() { object oPC = dlgGetSpeakingPC(); object oDatabase = GetItemPossessedBy(oPC, PC_DATABASE); int iPCID = GetLocalInt(oDatabase, PC_ID_NUMBER); if(dlgIsSelectionEqualToName("Enter New " + RHS_HOUSE_TERM_PROPER + " Name")) { SetLocalInt(oPC, RHS_PAGE_TEMP_LISTENING, TRUE); FloatingTextStringOnCreature(ColorTokenGreen() + "Please type in the name you wish to call your " + RHS_HOUSE_TERM_LOWER + " and press enter." + ColorTokenEnd(), oPC, FALSE); } else if(dlgIsSelectionEqualToName("Finish Entering New " + RHS_HOUSE_TERM_PROPER + " Name")) { string sNewName = GetLocalString(oPC, RHS_PAGE_TEMP_NEW_HOUSE_NAME); int iLength = GetStringLength(sNewName); // Put in too many characters if(iLength > RHS_MAX_HOUSE_NAME_LENGTH) { FloatingTextStringOnCreature(ColorTokenRed() + "ERROR: " + RHS_HOUSE_TERM_PROPER + " names cannot be longer than " + IntToString(RHS_MAX_HOUSE_NAME_LENGTH) + " characters." + ColorTokenEnd(), oPC, FALSE); return; } else if(iLength < RHS_MIN_HOUSE_NAME_LENGTH && iLength > 0) { FloatingTextStringOnCreature(ColorTokenRed() + "ERROR: " + RHS_HOUSE_TERM_PROPER + " names cannot be shorter than " + IntToString(RHS_MIN_HOUSE_NAME_LENGTH) + " characters." + ColorTokenEnd(), oPC, FALSE); return; } // Default to Player Name's House under any of these conditions else if(sNewName == "") { sNewName = GetName(oPC) + "'s " + RHS_HOUSE_TERM_PROPER; ClearTemporaryVariables(); } // Encode the name sNewName = SQLEncodeSpecialChars(sNewName); // Update the database SetMySQLData(RHS_SCHEMA + "." + RHS_TABLE_HOUSES, "House_Name", iPCID, sNewName, "Player_ID"); } }