//inc_quests //Modular Quests System //Stephen Jackson / losl //blade2k.losl@gmail.com //Uses a system of modules to implement quests. #include "inc_bitflags" //CONSTANTS const string QUEST_VARIABLE_PREFIX = "QUEST_"; const string QUEST_2DA = "quests"; const string QUEST_VARIABLE_ID = "QUEST_id"; const string QUEST_VARIABLE_FIRST_CONFLICT = "QUEST_FirstConflict"; const string QUEST_VARIABLE_CONFLICT = "QUEST_Conflict"; const string QUEST_SUFFIX_PCSUCCESSFAIL = "_PCSuccessFail"; const string QUEST_SUFFIX_PCCONFLICTOPEN = "_PCConflictOpen"; const string QUEST_2DA_SUCCESSSCOLUMN = "success"; const string QUEST_2DA_FAILURECOLUMN = "failure"; const int QUEST_SUCCESS_FIELDS = 4; const int QUEST_FAIL_FIELDS = 4; //Change FROM Morikhans Idea //Directions are given with 4 letters, then any other directions //The Following are Valid const int QUEST_DIRECTION_LENGTH = 4; const string QUEST_DIRECTION_ENABLE = "enbl"; //Enables the specified Conflict const string QUEST_DIRECTION_DISABLE = "dsbl"; //Disables the specified Conflict const string QUEST_DIRECTION_GIVEREWARD = "rwrd"; //Gives reward by number const string QUEST_DIRECTION_EXECUTE = "exec"; //Executes a Script const string QUEST_DIRECTION_END = "qend"; //Ends a quest //FOR YOUR INFORMATION: //Index 31 is the status of a quest. //SuccessFail,ConflictOpen Notation //Quest Not Attempted: 0,0 //Quest Ended Failure: 1,0 //Quest Started: 0,1 //Quest Ended Success: 1,1 const int QUEST_STATUS_INDEX = 31; //PROTOTYPES: //DoStartQuest //Starts A Quest. Sets Index 31 to record quest Progress //Needs the quest ID int QUEST_DoStartQuest(int nQuestID, object oPC); //DoEndQuest //Ends A Quest. Sets Index 31 based on bSuccess int QUEST_DoEndQuest(int nQuestID, object oPC, int bSuccess=TRUE); //GetConflictOpen //Checks to see if a Conflict is open //Code is identical to GetConflict Success //And its bad. int QUEST_GetConflictOpen(int nConflict, int nBitArray, int nFirstConflict); //GetConflictSuccess //Checks to see if a Conflict is a success //Code is identical to GetConflictOpen //And its bad. int QUEST_GetConflictSuccess(int nConflict, int nBitArray, int nFirstConflict); //DoConflictSuccess //Perform what happens when a conflict is successfully passed void QUEST_DoConflictSuccess(int nQuestID, int nConflict, object oPC, int nFirstConflict); //DoConflictFailure //Perform what happens when a conflict is not successfully passed void QUEST_DoConflictFailure(int nQuestID, int nConflict, object oPC, int nFirstConflict); //DoDirections //A function to follow the directions of the successfailure columns on the 2da //also useable by othoer means void QUEST_DoDirections(int nQuestID, string sDirections, object oPC); //DoGiveReward //Gives a reward to oPC //Can we just do tokens? void QUEST_DoGiveReward(int rewardTokenID, object oPC); int QUEST_DoStartQuest(int nQuestID, object oPC) { int nPCSuccessFail = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCSUCCESSFAIL); int nPCPaths = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCCONFLICTOPEN); int bSFStatus = BITFLAG_GetStatus(QUEST_STATUS_INDEX, nPCSuccessFail); int bCNStatus = BITFLAG_GetStatus(QUEST_STATUS_INDEX, nPCPaths); if(bSFStatus == 0 && bCNStatus == 0) { nPCPaths = BITFLAGS_Switch(nConflict-nFirstConflict, TRUE, nPCPaths); SetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCCONFLICTOPEN,nPCPaths); return TRUE; } return FALSE; } int QUEST_DoEndQuest(int nQuestID, object oPC, int bSuccess=TRUE) { int nPCSuccessFail = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCSUCCESSFAIL); int nPCPaths = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCCONFLICTOPEN); int bSFStatus = BITFLAG_GetStatus(QUEST_STATUS_INDEX, nPCSuccessFail); int bCNStatus = BITFLAG_GetStatus(QUEST_STATUS_INDEX, nPCPaths); nPCSuccessFail = BITFLAGS_Switch(nConflict-nFirstConflict, TRUE, nPCSuccessFail); SetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCSUCCESSFAIL,nPCSuccessFail); if(bSuccess==TRUE) { nPCPaths = BITFLAGS_Switch(nConflict-nFirstConflict, FALSE, nPCPaths); SetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCCONFLICTOPEN,nPCPaths); return TRUE; } return FALSE; } int QUEST_GetConflictOpen(int nConflict, int nBitArray, int nFirstConflict) { return BITFLAG_GetStatus(nConflict-nFirstConflict, nBitArray); } int QUEST_GetConflictSuccess(int nConflict, int nBitArray, int nFirstConflict) { return BITFLAG_GetStatus(nConflict-nFirstConflict, nBitArray); } void QUEST_DoConflictSuccess(int nQuestID, int nConflict, object oPC, int nFirstConflict) { int nSuccessFail, nConflictOpen, i; string sDirections; int nPCSuccessFail = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCSUCCESSFAIL); int nPCPaths = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCCONFLICTOPEN); for(i=1; i <= QUEST_SUCCESS_FIELDS; i++) { sDirections = Get2DAString(QUEST_2DA,QUEST_2DA_SUCCESSSCOLUMN+IntToString(i),nConflict); QUEST_DoDirections(sDirections, oPC); } nPCSuccessFail = BITFLAGS_Switch(nConflict-nFirstConflict, TRUE, nPCSuccessFail); SetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCSUCCESSFAIL,nPCSuccessFail); } void QUEST_DoConflictFailure(int nQuestID, int nConflict, object oPC, int nFirstConflict) { int nSuccessFail, nConflictOpen, i; string sDirections; int nPCSuccessFail = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCSUCCESSFAIL); int nPCPaths = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCCONFLICTOPEN); for(i=1; i <= QUEST_FAIL_FIELDS; i++) { sDirections = Get2DAString(QUEST_2DA,QUEST_2DA_FAILURECOLUMN+IntToString(i),nConflict); QUEST_DoDirections(sDirections, oPC); } nPCSuccessFail = BITFLAGS_Switch(nConflict-nFirstConflict, FALSE, nPCSuccessFail); SetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCSUCCESSFAIL,nPCSuccessFail); } void QUEST_DoDirections(int nQuestID, string sDirections, object oPC) { int nPCSuccessFail = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCSUCCESSFAIL); int nPCPaths = GetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+QUEST_SUFFIX_PCCONFLICTOPEN); string sSubDirection; sSubDirection = GetSubString(sDirection,0,QUEST_DIRECTION_LENGTH); sDirection = GetSubString(sDirection,QUEST_DIRECTION_LENGTH,GetStringLength(sDirection)-QUEST_DIRECTION_LENGTH); if(sSubDirection == QUEST_DIRECTION_ENABLE) { nPCPaths = BITFLAGS_Switch(StringToInt(sDirection), TRUE, nPCPaths); SetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+PCCONFLICTOPEN,nPCPaths); } else if(sSubDirection == QUEST_DIRECTION_DISABLE) { nPCPaths = BITFLAGS_Switch(StringToInt(sDirection), FALSE, nPCPaths); SetLocalInt(oPC,QUEST_VARIABLE_PREFIX+IntToString(nQuestID)+PCCONFLICTOPEN,nPCPaths); } else if(sSubDirection == QUEST_DIRECTION_GIVEREWARD) { QUEST_DoGiveReward(StringToInt(sDirection), oPC); } else if(sSubDirection == QUEST_DIRECTION_EXECUTE) { ExecuteScript(sDirection, oPC); } else if(sSubDirection == QUEST_DIRECTION_END) { QUEST_DoEndQuest(nQuestID, oPC,StringToInt(sDirection)); } else { //Excuse me WTF r u doin? return; } } void QUEST_DoGiveReward(int rewardTokenID, object oPC) { //No Fuxing Clue how to do this yet //TOKENS!?!?!?!?!?!?! }