Files
dsrc/sku.0/sys.server/compiled/game/script/systems/veteran_reward/resource.script
T

594 lines
17 KiB
Plaintext

/*
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<resourceAttribs.length; ++i )
{
string_id temp = new string_id("obj_attr_n", resourceAttribs[i].getName());
testMsg += target_dummy.GREEN +"@" + temp + " = " + target_dummy.WHITE + resourceAttribs[i].getValue();
testMsg += target_dummy.addLineBreaks(1);
}
// Create the dialog page.
int pid = sui.createSUIPage(sui.SUI_MSGBOX, self, sui.getPlayerId(params), "handleCreateChosenResourceConfirm");
// Add elements text.
setSUIProperty(pid, sui.MSGBOX_TITLE, sui.PROP_TEXT, title);
setSUIProperty(pid, sui.MSGBOX_PROMPT, sui.PROP_TEXT, testMsg);
// Add buttons.
sui.msgboxButtonSetup(pid, sui.OK_CANCEL);
setSUIProperty(pid, sui.MSGBOX_BTN_OK, sui.PROP_TEXT, "Confirm");
setSUIProperty(pid, sui.MSGBOX_BTN_CANCEL, sui.PROP_TEXT, "@back");
// Show dialog
sui.showSUIPage(pid);
}
else
{
// resource ID was invalid for some reason. Try redisplaying
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 handleCreateChosenResourceConfirm()
{
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) )
{
obj_id player = sui.getPlayerId(params);
obj_id crate = createResourceCrate(resourceChosen, 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 " + resourceChosen +". They have TWICE confirmed that they wish to consume this deed in order to get a crate of their chosen resource.", player);
}
cleanup();
}
else
{
// resource ID was invalid for some reason. Try redisplaying
string resourceClass = self.getScriptVars().getString(SCRIPTVAR_BASE_CLASS);
chooseResourceClass(sui.getPlayerId(params), resourceClass);
}
}
break;
case sui.BP_CANCEL :
{
// redisplay the previous screen to choose a resource
string resourceClass = self.getScriptVars().getString(SCRIPTVAR_BASE_CLASS);
chooseResourceClass(sui.getPlayerId(params), resourceClass);
break;
}
default:
cleanup();
break;
}
return SCRIPT_CONTINUE;
}
// Displays the stats of the resource and allows player to confirm resource selection or go back to previous
// script listing resource types based on parentClass
void showResourceStats(obj_id player, obj_id resource)
{
if( !isIdValid(player) )
{
cleanup();
return;
}
if( !isIdValid(resource) )
{
cleanup();
return;
}
obj_id self = getSelf();
// make sure the deed was actually in use
if( !utils.hasScriptVar(self, SCRIPTVAR_INUSE) )
{
cleanup();
return;
}
// get resource attributes array
resource_attribute[] resourceAttribs = getResourceAttributes(resource);
// setup a string array which will be filled with string elements that look like name = value pairs
resizeable String[] attribStrings = new String[0];
// make sure we have something
if( resourceAttribs == null )
{
cleanup();
return;
}
attribStrings = utils.addElement( attribStrings, "@"+SID_RESOURCE_NAME + " = " + getResourceName(resource) );
// create readable strings that look like name = value pairs to fill listbox to display resource attributes
for( int i=0; i<resourceAttribs.length; ++i )
{
string_id temp = new string_id("obj_attr_n", resourceAttribs[i].getName());
attribStrings = utils.addElement( attribStrings, "@" + temp + " = " + resourceAttribs[i].getValue() );
}
int pid = sui.listbox(getSelf(), player, "@" + SID_CONFIRM_RESOURCE_SELECTION,
sui.OK_CANCEL, "@" + SID_RESOURCE_TITLE /*getResourceName(resource)*/, attribStrings, "handleChooseResourceTypeStats", 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_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;
}