/* Title: systems/veteran_reward/emote_group.script Description: Lets a player modify a harvester to use 0 power. The player selects the harvester they want to change, and then use this item to change its power rate to 0. */ include library.player_structure; include library.sui; include library.target_dummy; include library.utils; include library.veteran_deprecated; /***** CONSTANTS *******************************************************/ const int RESOURCE_AMOUNT = 30000; const string ROOT_RESOURCE_CLASS = "resource"; const string ROOT_ORGANIC_CLASS = "organic"; const string ROOT_INORGANIC_CLASS = "inorganic"; const string OBJVAR_RESOURCE_REWARDED = "rewarded"; const string SCRIPTVAR_INUSE = "inuse"; const string_id SID_RESOURCE_TITLE = new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "resource_title"); const string_id SID_CHOOSE_CLASS = new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "choose_class"); const string_id SID_CHOOSE_SUB_CLASS = new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "choose_sub_class"); const string_id SID_CHOOSE_TYPE = new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "choose_type"); const string_id SID_CONFIRM_RESOURCE_SELECTION = new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "confirm_choose_type"); const string_id SID_RESOURCE_NAME = new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "resource_name"); const string_id SID_USE = new string_id("ui_radial", "item_use"); const string SCRIPTVAR_BASE_CLASS = "resource.base"; const string SCRIPTVAR_SUB_CLASSES = "resource.subclass"; const string SCRIPTVAR_TYPES = "resource.types"; const string SCRIPTVAR_RESOURCECHOSEN = "resource.resoucechosen"; /***** TRIGGERS ********************************************************/ trigger OnInitialize() { if ( hasObjVar(self, OBJVAR_RESOURCE_REWARDED) ) messageTo(self, "handleVeteranHarvestDestroy", null, 5, false); return SCRIPT_CONTINUE; } /* If the player is looking at a harvester they own, add a menu item that will allow them to modify the harvester. */ trigger OnObjectMenuRequest(obj_id player, menu_info item) { // make sure we haven't already been used if ( hasObjVar(self, OBJVAR_RESOURCE_REWARDED) ) return SCRIPT_CONTINUE; // make sure the script is not in the process of being used. // This prevents players using the deed multiple times at once. if( utils.hasScriptVar(self, SCRIPTVAR_INUSE) ) return SCRIPT_CONTINUE; // only allow item to be used while in player's inventory if( utils.getContainingPlayer(self) == player ) { item.addRootMenu(menu_info_types.ITEM_USE, SID_USE); } return SCRIPT_CONTINUE; } trigger OnObjectMenuSelect(obj_id player, int item) { if ( item == menu_info_types.ITEM_USE ) { // make sure the deed isn't currently in use if( utils.hasScriptVar(self, SCRIPTVAR_INUSE) ) return SCRIPT_CONTINUE; // make sure we haven't already been used if ( hasObjVar(self, OBJVAR_RESOURCE_REWARDED) ) return SCRIPT_CONTINUE; // mark deed as in use so they can't bring up multiple windows getSelf().getScriptVars().put(SCRIPTVAR_INUSE, 1); // start with organic and inorganics chooseResourceClass(player, ROOT_RESOURCE_CLASS, true); } return SCRIPT_CONTINUE; } messageHandler handleVeteranHarvestDestroy() { if ( hasObjVar(self, OBJVAR_RESOURCE_REWARDED) ) destroyObject(self); return SCRIPT_CONTINUE; } messageHandler handleChooseResourceClass() { if ( (params == null) || (params.isEmpty()) ) { cleanup(); return SCRIPT_CONTINUE; } // make sure the deed was actually in use if( !utils.hasScriptVar(self, SCRIPTVAR_INUSE) ) { cleanup(); return SCRIPT_CONTINUE; } int bp = sui.getIntButtonPressed(params); switch ( bp ) { case sui.BP_OK : { string[] resourceClasses = self.getScriptVars().getStringArray(SCRIPTVAR_SUB_CLASSES); int rowSelected = sui.getListboxSelectedRow(params); if ( rowSelected >= 0 && rowSelected < resourceClasses.length) { chooseResourceClass(sui.getPlayerId(params), resourceClasses[rowSelected]); } else { // re display UI since they didn't select anything (or we got an invalid selection) string resourceClass = self.getScriptVars().getString(SCRIPTVAR_BASE_CLASS); chooseResourceClass(sui.getPlayerId(params), resourceClass); } } break; case sui.BP_CANCEL : { string resourceClass = self.getScriptVars().getString(SCRIPTVAR_BASE_CLASS); if( !resourceClass.equals(ROOT_ORGANIC_CLASS) && !resourceClass.equals(ROOT_INORGANIC_CLASS)) { chooseResourceClass(sui.getPlayerId(params), getResourceParentClass(resourceClass)); } else { chooseResourceClass(sui.getPlayerId(params), getResourceParentClass(resourceClass), true); } } break; default: cleanup(); break; } return SCRIPT_CONTINUE; } messageHandler handleChooseResourceType() { if ( (params == null) || (params.isEmpty()) ) { cleanup(); return SCRIPT_CONTINUE; } // make sure the deed was actually in use if( !utils.hasScriptVar(self, SCRIPTVAR_INUSE) ) { cleanup(); return SCRIPT_CONTINUE; } int bp = sui.getIntButtonPressed(params); switch ( bp ) { case sui.BP_OK : { obj_id[] resourceTypes = self.getScriptVars().getObjIdArray(SCRIPTVAR_TYPES); int rowSelected = sui.getListboxSelectedRow(params); if ( rowSelected >= 0 && rowSelected < resourceTypes.length) { // display a SUI that shows resource stats showResourceStats(sui.getPlayerId(params), resourceTypes[rowSelected] ); /* obj_id player = sui.getPlayerId(params); obj_id crate = createResourceCrate(resourceTypes[rowSelected], RESOURCE_AMOUNT, utils.getInventoryContainer(player)); if ( isIdValid(crate) ) { setObjVar(self, OBJVAR_RESOURCE_REWARDED, true); messageTo(self, "handleVeteranHarvestDestroy", null, 1, false); CustomerServiceLog("veteran", "Giving player %TU " + RESOURCE_AMOUNT + " of resource type " + resourceTypes[rowSelected], player); } */ cleanup(); } else { // re display UI since they didn't select anything (or we got an invalid selection) string resourceClass = self.getScriptVars().getString(SCRIPTVAR_BASE_CLASS); chooseResourceClass(sui.getPlayerId(params), resourceClass); } } break; case sui.BP_CANCEL : { // go to previous screen unless we are at the first screen. // if it's the first screen, fallthrough to cleanup string resourceClass = self.getScriptVars().getString(SCRIPTVAR_BASE_CLASS); if( resourceClass != ROOT_RESOURCE_CLASS ) { chooseResourceClass(sui.getPlayerId(params), getResourceParentClass(resourceClass)); break; } } default: cleanup(); break; } return SCRIPT_CONTINUE; } messageHandler handleChooseResourceTypeStats() { if ( (params == null) || (params.isEmpty()) ) { cleanup(); return SCRIPT_CONTINUE; } // make sure the deed was actually in use if( !utils.hasScriptVar(self, SCRIPTVAR_INUSE) ) { cleanup(); return SCRIPT_CONTINUE; } int bp = sui.getIntButtonPressed(params); switch ( bp ) { case sui.BP_OK : { obj_id resourceChosen = self.getScriptVars().getObjId(SCRIPTVAR_RESOURCECHOSEN); if ( isIdValid(resourceChosen) ) { // confirm use of the deed to create the chosen resource string title = utils.packStringId(new string_id("veteran", "resource_deed_confirmation_title")); string testMsg = utils.packStringId(new string_id("veteran", "resource_deed_confirmation_prompt")); resource_attribute[] resourceAttribs = getResourceAttributes(resourceChosen); // make sure we have something if( resourceAttribs == null ) { cleanup(); return SCRIPT_CONTINUE; } testMsg += target_dummy.addLineBreaks(2); testMsg += target_dummy.ORANGE + "@"+SID_RESOURCE_NAME + " = " + target_dummy.YELLOW + getResourceName(resourceChosen); testMsg += target_dummy.addLineBreaks(1); // create readable strings that look like name = value pairs to fill listbox to display resource attributes for( int i=0; i= 0 ) { // redefine cancel as back sui.setSUIProperty(pid, sui.LISTBOX_BTN_CANCEL, sui.PROP_TEXT,"@back"); sui.showSUIPage(pid); getSelf().getScriptVars().put(SCRIPTVAR_RESOURCECHOSEN, resource); } else { cleanup(); } } void chooseResourceClass(obj_id player, String parentClass) { chooseResourceClass(player, parentClass, false); } /* Shows a list of resource classes or types to the player, and lets them choose which one they want. */ void chooseResourceClass(obj_id player, String parentClass, boolean topLevel) { // make sure the deed was actually in use if( !utils.hasScriptVar(getSelf(), SCRIPTVAR_INUSE) ) { cleanup(); return; } String[] resourceClasses = null; //did we come from the main menu? If so no more space resources or energy for you! if(topLevel) resourceClasses = filterTopLevelResourceList(parentClass); else resourceClasses = getImmediateResourceChildClasses(parentClass); if ( resourceClasses == null ) { cleanup(); return; } if ( resourceClasses.length == 0 ) { //cleanup(); chooseResourceType(player, parentClass); return; } // filter out the resource classes with no resource type int goodResources = 0; for ( int i = 0; i < resourceClasses.length; ++i ) { if ( !hasResourceType(resourceClasses[i]) ) resourceClasses[i] = null; else ++goodResources; } string[] temp = new string[goodResources]; goodResources = 0; for ( int i = 0; i < resourceClasses.length; ++i ) { if ( resourceClasses[i] != null ) temp[goodResources++] = resourceClasses[i]; } resourceClasses = temp; temp = null; String[] resourceClassNames = getResourceClassNames(resourceClasses); if ( resourceClassNames == null ) { cleanup(); return; } string prompt; if ( parentClass == ROOT_RESOURCE_CLASS ) prompt = "@" + SID_CHOOSE_CLASS; else prompt = "@" + SID_CHOOSE_SUB_CLASS + " " + getResourceClassName(parentClass); int pid = sui.listbox(getSelf(), player, prompt, sui.OK_CANCEL, "@" + SID_RESOURCE_TITLE, resourceClassNames, "handleChooseResourceClass", false, false); if( parentClass != ROOT_RESOURCE_CLASS && pid >= 0 ) { // set a back button sui.setSUIProperty(pid, sui.LISTBOX_BTN_CANCEL, sui.PROP_TEXT,"@back"); } if ( pid >= 0 ) { sui.showSUIPage(pid); getSelf().getScriptVars().put(SCRIPTVAR_BASE_CLASS, parentClass); getSelf().getScriptVars().put(SCRIPTVAR_SUB_CLASSES, resourceClasses); } else cleanup(); } /* Shows a list of types to the player, and lets them choose which one they want. */ void chooseResourceType(obj_id player, String parentClass) { // make sure the deed was actually in use if( !utils.hasScriptVar(getSelf(), SCRIPTVAR_INUSE) ) { cleanup(); return; } obj_id[] resourceTypes = getResourceTypes(parentClass); if ( resourceTypes == null || resourceTypes.length == 0) { cleanup(); return; } string[] typeNames = getResourceNames(resourceTypes); if ( typeNames == null || typeNames.length == 0) { cleanup(); return; } int pid = sui.listbox(getSelf(), player, "@" + SID_CHOOSE_TYPE + " " + getResourceClassName(parentClass), sui.OK_CANCEL, "@" + SID_RESOURCE_TITLE, typeNames, "handleChooseResourceType", false, false); if ( pid >= 0 ) { // redefine cancel as back sui.setSUIProperty(pid, sui.LISTBOX_BTN_CANCEL, sui.PROP_TEXT,"@back"); sui.showSUIPage(pid); getSelf().getScriptVars().put(SCRIPTVAR_BASE_CLASS, parentClass); getSelf().getScriptVars().put(SCRIPTVAR_TYPES, resourceTypes); } else { cleanup(); } } /* Remove the scriptvars we use for the reward. */ void cleanup() { getSelf().getScriptVars().remove(SCRIPTVAR_INUSE); getSelf().getScriptVars().remove(SCRIPTVAR_BASE_CLASS); getSelf().getScriptVars().remove(SCRIPTVAR_SUB_CLASSES); getSelf().getScriptVars().remove(SCRIPTVAR_TYPES); getSelf().getScriptVars().remove(SCRIPTVAR_RESOURCECHOSEN); } string [] filterTopLevelResourceList(String parentClass) { String[] resourceClasses = null; //Syntax Nightmare.. String [] tempResourceClass = getImmediateResourceChildClasses(parentClass); Vector tempResourceClassTwo = null; for ( int x = 0; x < tempResourceClass.length; ++x ) { if(tempResourceClass[x] != "energy" && tempResourceClass[x] != "space_resource") tempResourceClassTwo = utils.addElement(tempResourceClassTwo, tempResourceClass[x]); } resourceClasses = new String[tempResourceClassTwo.size()]; tempResourceClassTwo.toArray (resourceClasses); return resourceClasses; }