mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-31 00:15:54 -04:00
533 lines
14 KiB
Plaintext
533 lines
14 KiB
Plaintext
/**
|
|
* Copyright (C)2000-2002 Sony Online Entertainment Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* Title: firework.scriptlib
|
|
* Description: for "firework" functions
|
|
* @author $Author: rpalacio $
|
|
* @version $Revision: #13 $
|
|
*/
|
|
|
|
/***** INCLUDES ********************************************************/
|
|
|
|
include library.sui;
|
|
include library.utils;
|
|
include library.prose;
|
|
|
|
/***** CONSTANTS *******************************************************/
|
|
|
|
const int SHOW_EVENT_MAX = 20;
|
|
|
|
const float SHOW_DELAY_MIN = 1f;
|
|
const float SHOW_DELAY_MAX = 10f;
|
|
|
|
const string SCRIPT_PLAYER = "item.firework.player";
|
|
const string SCRIPT_FIREWORK_CLEANUP = "item.firework.cleanup";
|
|
const string SCRIPT_LAUNCHER = "item.firework.launcher";
|
|
|
|
const string VAR_FIREWORK_BASE = "firework";
|
|
|
|
const string VAR_FIREWORK_FX = VAR_FIREWORK_BASE + ".fx";
|
|
|
|
const string VAR_SHOW_BASE = VAR_FIREWORK_BASE + ".show";
|
|
const string VAR_SHOW_FX = VAR_SHOW_BASE + ".fx"; //string[]
|
|
const string VAR_SHOW_DELAY = VAR_SHOW_BASE + ".delay"; //float[]
|
|
|
|
const string SCRIPTVAR_COUNT = VAR_FIREWORK_BASE + ".cnt";
|
|
|
|
const string TBL_FX = "datatables/firework/fx.iff";
|
|
|
|
const string HANDLER_FIREWORK_PREPARE = "handleFireworkPrepare";
|
|
const string HANDLER_FIREWORK_IGNITE = "handleFireworkIgnite";
|
|
const string HANDLER_FIREWORK_LAUNCH = "handleFireworkLaunch";
|
|
const string HANDLER_FIREWORK_EXPLOSION = "handleFireworkExplosion";
|
|
const string HANDLER_FIREWORK_CLEANUP = "handleFireworkCleanup";
|
|
|
|
const string STF = "firework";
|
|
|
|
const string TEMPLATE_SHOW_LAUNCHER = "object/static/firework/show_launcher.iff";
|
|
|
|
const string_id SID_YOU_CANNOT_ADD = new string_id(STF,"you_cannot_add");
|
|
const string_id SID_NO_SHOWS_TO_REMOVE = new string_id(STF,"no_shows_to_remove");
|
|
const string_id SID_NO_SHOWS_TO_MODIFY = new string_id(STF,"no_shows_to_modify");
|
|
const string_id SID_NO_SHOWS_TO_DISPLAY = new string_id(STF,"no_shows_to_display");
|
|
const string_id SID_NO_NEED_TO_REORDER = new string_id(STF,"no_need_to_reorder");
|
|
const string_id SID_DUD_FIREWORK = new string_id(STF,"dud_firework");
|
|
|
|
|
|
/***** FUNCTIONS *******************************************************/
|
|
/***** BASIC FIREWORK *******************************************************/
|
|
boolean launch(obj_id target, obj_id firework)
|
|
{
|
|
if ( !isIdValid(target) || !isIdValid(firework) )
|
|
return false;
|
|
|
|
if ( !hasObjVar(firework, VAR_FIREWORK_BASE) )
|
|
makeRandomEffect(firework);
|
|
|
|
string fx = getStringObjVar(firework, VAR_FIREWORK_FX);
|
|
if ( fx == null || fx.equals("") )
|
|
fx = getRandomFireworkEffect();
|
|
|
|
dictionary params = new dictionary();
|
|
params.put("fx", fx);
|
|
|
|
useCharge(firework);
|
|
|
|
int cnt = utils.getIntScriptVar(target, SCRIPTVAR_COUNT);
|
|
cnt++;
|
|
|
|
utils.setScriptVar(target, SCRIPTVAR_COUNT, cnt);
|
|
|
|
if ( !hasScript(target, SCRIPT_PLAYER) )
|
|
attachScript(target, SCRIPT_PLAYER);
|
|
|
|
messageTo(target, HANDLER_FIREWORK_PREPARE, params, 0, false);
|
|
return true;
|
|
}
|
|
|
|
/***** FIREWORK SHOWS *******************************************************/
|
|
void launchShow(obj_id target, obj_id show)
|
|
{
|
|
if ( !isIdValid(target) || !isIdValid(show) )
|
|
return;
|
|
|
|
resizeable string[] show_fx = getResizeableStringArrayObjVar(show, VAR_SHOW_FX);
|
|
resizeable float[] show_delay = getResizeableFloatArrayObjVar(show, VAR_SHOW_DELAY);
|
|
if ( show_fx == null || show_fx.length == 0 || show_delay == null || show_delay.length == 0 )
|
|
return;
|
|
|
|
if ( show_fx.length != show_delay.length )
|
|
return;
|
|
|
|
location there = utils.findLocInFrontOfTarget(target, 0.75f);
|
|
if ( there == null )
|
|
there = getLocation(target);
|
|
|
|
//debugSpeakMsg(target, "attempting to launch show!");
|
|
|
|
obj_id launcher = createObject(TEMPLATE_SHOW_LAUNCHER, there);
|
|
if ( isIdValid(launcher) )
|
|
{
|
|
//debugSpeakMsg(target, "created launcher...");
|
|
attachScript(launcher, SCRIPT_LAUNCHER);
|
|
|
|
dictionary d = new dictionary();
|
|
d.put("fx", show_fx);
|
|
d.put("delay", show_delay);
|
|
d.put("player", target);
|
|
d.put("idx", 0);
|
|
|
|
messageTo(launcher, HANDLER_FIREWORK_LAUNCH, d, show_delay[0], false);
|
|
|
|
destroyObject(show);
|
|
}
|
|
}
|
|
|
|
boolean addShowEvent(obj_id target, obj_id show, obj_id firework)
|
|
{
|
|
if ( !isIdValid(target) || !isIdValid(show) || !isIdValid(firework) )
|
|
return false;
|
|
|
|
if ( getCount(show) >= SHOW_EVENT_MAX )
|
|
{
|
|
sendSystemMessage(target, SID_YOU_CANNOT_ADD);
|
|
return false;
|
|
}
|
|
|
|
string fw_fx = getStringObjVar(firework, VAR_FIREWORK_FX);
|
|
|
|
resizeable string[] show_fx = getResizeableStringArrayObjVar(show, VAR_SHOW_FX);
|
|
show_fx = utils.addElement(show_fx, fw_fx);
|
|
|
|
resizeable float[] show_delay = getResizeableFloatArrayObjVar(show, VAR_SHOW_DELAY);
|
|
show_delay = utils.addElement(show_delay, SHOW_DELAY_MIN);
|
|
|
|
boolean litmus = true;
|
|
litmus &= setObjVar(show, VAR_SHOW_FX, show_fx);
|
|
litmus &= setObjVar(show, VAR_SHOW_DELAY, show_delay);
|
|
|
|
if ( litmus )
|
|
{
|
|
useCharge(firework);
|
|
incrementCount(show, 1);
|
|
}
|
|
|
|
return litmus;
|
|
}
|
|
|
|
void removeShowEvent(obj_id target, obj_id show, int idx)
|
|
{
|
|
if ( !isIdValid(target) || !isIdValid(show) || idx < 0 )
|
|
return;
|
|
|
|
if ( getCount(show) == 0 )
|
|
{
|
|
sendSystemMessage(target, SID_NO_SHOWS_TO_REMOVE);
|
|
return;
|
|
}
|
|
|
|
resizeable string[] show_fx = getResizeableStringArrayObjVar(show, VAR_SHOW_FX);
|
|
resizeable float[] show_delay = getResizeableFloatArrayObjVar(show, VAR_SHOW_DELAY);
|
|
if ( show_fx == null || show_fx.length == 0 || show_delay == null || show_delay.length == 0 )
|
|
return;
|
|
|
|
if ( show_fx.length != show_delay.length )
|
|
return;
|
|
|
|
if ( idx >= show_fx.length )
|
|
return;
|
|
|
|
show_fx = utils.removeElementAt(show_fx, idx);
|
|
show_delay = utils.removeElementAt(show_delay, idx);
|
|
|
|
if ( show_fx.length != show_delay.length )
|
|
return;
|
|
|
|
setObjVar(show, VAR_SHOW_FX, show_fx);
|
|
setObjVar(show, VAR_SHOW_DELAY, show_delay);
|
|
|
|
incrementCount(show,-1);
|
|
}
|
|
|
|
void setShowEventDelay(obj_id target, obj_id show, int idx, float delay)
|
|
{
|
|
if ( !isIdValid(target) || !isIdValid(show) || idx < 0 )
|
|
return;
|
|
|
|
if ( getCount(show) == 0 )
|
|
{
|
|
sendSystemMessage(target, SID_NO_SHOWS_TO_MODIFY);
|
|
return;
|
|
}
|
|
|
|
resizeable float[] show_delay = getResizeableFloatArrayObjVar(show, VAR_SHOW_DELAY);
|
|
if ( show_delay == null || show_delay.length == 0 )
|
|
return;
|
|
|
|
if ( idx >= show_delay.length )
|
|
return;
|
|
|
|
if ( delay < 0.1f )
|
|
delay = 0.1f;
|
|
|
|
if ( delay > SHOW_DELAY_MAX )
|
|
delay = SHOW_DELAY_MAX;
|
|
|
|
show_delay[idx] = delay;
|
|
|
|
setObjVar(show, VAR_SHOW_DELAY, show_delay);
|
|
}
|
|
|
|
/***** SUI FUNCTIONS *******************************************************/
|
|
void showEventDataSUI(obj_id player, obj_id show)
|
|
{
|
|
if ( !isIdValid(player) || !isIdValid(show) )
|
|
return;
|
|
|
|
if ( getCount(show) == 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_SHOWS_TO_DISPLAY);
|
|
return;
|
|
}
|
|
|
|
cleanupSUIScriptVars(show);
|
|
|
|
resizeable string[] entries = getShowListEntries(show);
|
|
if ( entries == null || entries.length == 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_SHOWS_TO_DISPLAY);
|
|
return;
|
|
}
|
|
|
|
string title = "@firework:data_title";
|
|
string prompt = "@firework:data_prompt";
|
|
int pid = sui.listbox(show, player, prompt, sui.OK_ONLY, title, entries, "handleEventDataSUI");
|
|
if ( pid > -1 )
|
|
{
|
|
setSUIScriptVars(show, pid, player);
|
|
}
|
|
}
|
|
|
|
void showRemoveEventSUI(obj_id player, obj_id show)
|
|
{
|
|
if ( !isIdValid(player) || !isIdValid(show) )
|
|
return;
|
|
|
|
if ( getCount(show) == 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_SHOWS_TO_REMOVE);
|
|
return;
|
|
}
|
|
|
|
cleanupSUIScriptVars(show);
|
|
|
|
resizeable string[] entries = getShowListEntries(show);
|
|
if ( entries == null || entries.length == 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_SHOWS_TO_DISPLAY);
|
|
return;
|
|
}
|
|
|
|
string title = "@firework:remove_title";
|
|
string prompt = "@firework:remove_prompt";
|
|
int pid = sui.listbox(show, player, prompt, sui.OK_CANCEL, title, entries, "handleRemoveEventSUI");
|
|
if ( pid > -1 )
|
|
{
|
|
setSUIScriptVars(show, pid, player);
|
|
}
|
|
}
|
|
|
|
void showReorderEventsSUI(obj_id player, obj_id show)
|
|
{
|
|
if ( !isIdValid(player) || !isIdValid(show) )
|
|
return;
|
|
|
|
if ( getCount(show) == 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_NEED_TO_REORDER);
|
|
return;
|
|
}
|
|
|
|
cleanupSUIScriptVars(show);
|
|
|
|
resizeable string[] entries = getShowListEntries(show);
|
|
if ( entries == null || entries.length < 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_NEED_TO_REORDER);
|
|
return;
|
|
}
|
|
|
|
string title = "@firework:reorder_title";
|
|
string prompt = "@firework:reorder_prompt";
|
|
int pid = sui.listbox(show, player, prompt, sui.MOVEUP_MOVEDOWN_DONE, title, entries, "handleReorderEventsSUI");
|
|
if ( pid > -1 )
|
|
{
|
|
setSUIScriptVars(show, pid, player);
|
|
}
|
|
}
|
|
|
|
void showModifyEventIndexSUI(obj_id player, obj_id show)
|
|
{
|
|
if ( !isIdValid(player) || !isIdValid(show) )
|
|
return;
|
|
|
|
if ( getCount(show) == 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_SHOWS_TO_MODIFY);
|
|
return;
|
|
}
|
|
|
|
cleanupSUIScriptVars(show);
|
|
|
|
resizeable string[] entries = getShowListEntries(show);
|
|
if ( entries == null || entries.length == 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_SHOWS_TO_MODIFY);
|
|
return;
|
|
}
|
|
|
|
string title = "@firework:modify_index_title";
|
|
string prompt = "@firework:modify_index_prompt";
|
|
int pid = sui.listbox(show, player, prompt, sui.OK_CANCEL, title, entries, "handleModifyEventIndexSUI");
|
|
if ( pid > -1 )
|
|
{
|
|
setSUIScriptVars(show, pid, player);
|
|
}
|
|
}
|
|
|
|
void showModifyEventTimeSUI(obj_id player, obj_id show, int idx)
|
|
{
|
|
if ( !isIdValid(player) || !isIdValid(show) || idx < 0 )
|
|
return;
|
|
|
|
if ( getCount(show) == 0 )
|
|
{
|
|
sendSystemMessage(player, SID_NO_SHOWS_TO_MODIFY);
|
|
return;
|
|
}
|
|
|
|
cleanupSUIScriptVars(show);
|
|
|
|
resizeable float[] delays = getResizeableFloatArrayObjVar(show, VAR_SHOW_DELAY);
|
|
if ( delays == null || delays.length == 0 || idx >= delays.length )
|
|
return;
|
|
|
|
int current = (int)(delays[idx]*10);
|
|
int available = (int)(SHOW_DELAY_MAX*10) - current;
|
|
|
|
string title = "@firework:modify_delay_title";
|
|
string prompt = "@firework:modify_delay_prompt";
|
|
int pid = sui.transfer(show, player, prompt, title, "Available", available, "Delay", current, "handleModifyEventTimeSUI");
|
|
if ( pid > -1 )
|
|
{
|
|
setSUIScriptVars(show, pid, player, idx);
|
|
}
|
|
}
|
|
|
|
void setSUIScriptVars(obj_id show, int pid, obj_id player)
|
|
{
|
|
utils.setScriptVar(show, "firework.pid", pid);
|
|
utils.setScriptVar(show, "firework.player", player);
|
|
}
|
|
|
|
void setSUIScriptVars(obj_id show, int pid, obj_id player, int idx)
|
|
{
|
|
utils.setScriptVar(show, "firework.pid", pid);
|
|
utils.setScriptVar(show, "firework.player", player);
|
|
utils.setScriptVar(show, "firework.idx", idx);
|
|
}
|
|
|
|
void removeSUIScriptVars(obj_id show)
|
|
{
|
|
utils.removeScriptVar(show, "firework.pid");
|
|
utils.removeScriptVar(show, "firework.player");
|
|
utils.removeScriptVar(show, "firework.idx");
|
|
}
|
|
|
|
void cleanupSUIScriptVars(obj_id show)
|
|
{
|
|
if ( utils.hasScriptVar(show, "firework.pid") )
|
|
{
|
|
int oldpid = utils.getIntScriptVar(show, "firework.pid");
|
|
obj_id player = utils.getObjIdScriptVar(show, "firework.player");
|
|
if ( isIdValid(player) )
|
|
sui.closeSUI(player, oldpid);
|
|
|
|
removeSUIScriptVars(show);
|
|
}
|
|
}
|
|
|
|
Vector getShowListEntries(obj_id show)
|
|
{
|
|
resizeable string[] show_fx = getResizeableStringArrayObjVar(show, VAR_SHOW_FX);
|
|
resizeable float[] show_delay = getResizeableFloatArrayObjVar(show, VAR_SHOW_DELAY);
|
|
if ( show_fx == null || show_fx.length == 0 || show_delay == null || show_delay.length == 0 )
|
|
return null;
|
|
|
|
if ( show_fx.length != show_delay.length )
|
|
return null;
|
|
|
|
float time = 0;
|
|
resizeable string[] entries = new string[0];
|
|
for ( int i = 0; i < show_fx.length; i++ )
|
|
{
|
|
time += show_delay[i];
|
|
string sTime = utils.formatTime(time);
|
|
entries = utils.addElement(entries, "(" + sTime + "s) " + getString(new string_id("firework_n", show_fx[i])));
|
|
}
|
|
|
|
if ( entries == null || entries.length == 0 )
|
|
return null;
|
|
|
|
return entries;
|
|
}
|
|
|
|
void swapEvents(obj_id player, obj_id show, int idx1, int idx2)
|
|
{
|
|
if ( !isIdValid(player) || !isIdValid(show) )
|
|
return;
|
|
|
|
if ( idx1 < 0 || idx2 < 0 )
|
|
{
|
|
sendSystemMessage(player, new string_id(STF, "cannot_reorder"));
|
|
return;
|
|
}
|
|
|
|
resizeable string[] show_fx = getResizeableStringArrayObjVar(show, VAR_SHOW_FX);
|
|
resizeable float[] show_delay = getResizeableFloatArrayObjVar(show, VAR_SHOW_DELAY);
|
|
if ( show_fx == null || show_fx.length == 0 || show_delay == null || show_delay.length == 0 )
|
|
return;
|
|
|
|
if ( show_fx.length != show_delay.length )
|
|
return;
|
|
|
|
string tmpFx = show_fx[idx1];
|
|
float tmpDelay = show_delay[idx1];
|
|
|
|
show_fx[idx1] = show_fx[idx2];
|
|
show_delay[idx1] = show_delay[idx2];
|
|
|
|
show_fx[idx2] = tmpFx;
|
|
show_delay[idx2] = tmpDelay;
|
|
|
|
setObjVar(show, VAR_SHOW_FX, show_fx);
|
|
setObjVar(show, VAR_SHOW_DELAY, show_delay);
|
|
}
|
|
|
|
void setEventDelay(obj_id player, obj_id show, int idx, float delay)
|
|
{
|
|
if ( !isIdValid(player) || !isIdValid(show) )
|
|
return;
|
|
|
|
if ( delay < 0.1f )
|
|
delay = 0.1f;
|
|
|
|
if ( delay > SHOW_DELAY_MAX )
|
|
delay = SHOW_DELAY_MAX;
|
|
|
|
resizeable float[] delays = getResizeableFloatArrayObjVar(show, VAR_SHOW_DELAY);
|
|
if ( delays == null || delays.length == 0 || idx >= delays.length )
|
|
return;
|
|
|
|
delays[idx] = delay;
|
|
if ( setObjVar(show, VAR_SHOW_DELAY, delays) )
|
|
{
|
|
prose_package ppDelayUpdated = prose.getPackage(new string_id(STF, "prose_delay_update"), idx+1, delay);
|
|
sendSystemMessageProse(player, ppDelayUpdated);
|
|
}
|
|
}
|
|
|
|
/***** SUPPORT FUNCTIONS *******************************************************/
|
|
void setEffect(obj_id firework, string fx, color pColor)
|
|
{
|
|
if ( !isIdValid(firework) || fx == null || fx.equals("") || pColor == null )
|
|
return;
|
|
|
|
setObjVar(firework, VAR_FIREWORK_FX, fx);
|
|
}
|
|
|
|
void makeRandomEffect(obj_id firework)
|
|
{
|
|
if ( !isIdValid(firework) )
|
|
return;
|
|
|
|
string fx = getRandomFireworkEffect();
|
|
setObjVar(firework, VAR_FIREWORK_FX, fx);
|
|
}
|
|
|
|
string getRandomFireworkEffect()
|
|
{
|
|
string[] names = dataTableGetStringColumn(TBL_FX, "name");
|
|
if ( names == null || names.length == 0 )
|
|
return null;
|
|
|
|
int idx = rand(0, names.length - 1);
|
|
return names[idx];
|
|
}
|
|
|
|
void dud(obj_id target)
|
|
{
|
|
sendSystemMessage(target, SID_DUD_FIREWORK);
|
|
decrementFireworkCount(target);
|
|
}
|
|
|
|
void decrementFireworkCount(obj_id target)
|
|
{
|
|
int cnt = utils.getIntScriptVar(target, firework.SCRIPTVAR_COUNT);
|
|
cnt--;
|
|
if ( cnt < 1 )
|
|
{
|
|
utils.removeScriptVar(target, firework.SCRIPTVAR_COUNT);
|
|
detachScript(target, firework.SCRIPT_PLAYER);
|
|
}
|
|
}
|
|
|
|
void useCharge(obj_id firework)
|
|
{
|
|
incrementCount(firework, -1);
|
|
|
|
int cnt = getCount(firework);
|
|
if ( cnt < 1 )
|
|
destroyObject(firework);
|
|
} |