Added PRC'd CEP blueprints. Updated CEP1 Merge tlk. Updated CEP2 Merge baseitems.2da.
This commit is contained in:
parent
7beb6e4816
commit
fc8cfecc2b
File diff suppressed because it is too large
Load Diff
@ -211,7 +211,7 @@
|
|||||||
207 16967219 stacksmall1 1 1 0x00000 0 0 it_smlmisc 0 1 1 1 it_bag iinvalid_1x1 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 10 0.01 1726 28 8 0 15 4 **** **** **** **** **** **** 0 0 5448 0 0 1 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
207 16967219 stacksmall1 1 1 0x00000 0 0 it_smlmisc 0 1 1 1 it_bag iinvalid_1x1 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 10 0.01 1726 28 8 0 15 4 **** **** **** **** **** **** 0 0 5448 0 0 1 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
208 16967214 PeltLarge 2 3 0x00000 0 0 it_peltlrg 0 1 1 1 zlc_j33 iinvalid_2x3 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 0.01 16967185 30 8 0 15 4 **** **** **** **** **** **** 0 0 5450 0 0 50 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
208 16967214 PeltLarge 2 3 0x00000 0 0 it_peltlrg 0 1 1 1 zlc_j33 iinvalid_2x3 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 0.01 16967185 30 8 0 15 4 **** **** **** **** **** **** 0 0 5450 0 0 50 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
209 16967215 PeltThin 1 2 0x00000 0 0 it_peltthn 0 1 1 1 it_bag iinvalid_1x2 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 1 16967185 29 8 0 15 4 **** **** **** **** **** **** 0 0 5474 0 0 5 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
209 16967215 PeltThin 1 2 0x00000 0 0 it_peltthn 0 1 1 1 it_bag iinvalid_1x2 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 1 16967185 29 8 0 15 4 **** **** **** **** **** **** 0 0 5474 0 0 5 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
210 16967237 TinySpear 1 4 0x1C030 1 2 WPlSs 0 1 1 1 it_bag iwplss 0 4 1 3 **** 1.2 10 255 1 6 1 3 1 1 1 2 16967238 15 8 0 0 1 46 48 **** **** **** 4 0 0 16967239 0 1 20 17 **** **** **** 35 35 65 76 1 **** **** **** **** **** **** **** **** **** ****
|
210 16967237 TinySpear 1 4 0x1C030 1 2 WPlSs 0 1 1 1 it_bag iwplss 0 4 1 3 **** 1.2 10 255 1 6 1 3 1 1 1 2 16967238 15 8 0 0 1 46 48 **** **** **** 4 0 0 16967239 0 1 20 17 **** **** **** 35 35 65 76 1 97 627 135 665 59 717 503 924 **** ****
|
||||||
211 16967240 miscsmall3 1 1 0x00000 0 0 it_smlmis3 0 1 1 1 it_bag iinvalid_1x1 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 1 1726 28 8 0 15 4 **** **** **** **** **** **** 0 0 5448 0 0 3 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
211 16967240 miscsmall3 1 1 0x00000 0 0 it_smlmis3 0 1 1 1 it_bag iinvalid_1x1 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 1 1726 28 8 0 15 4 **** **** **** **** **** **** 0 0 5448 0 0 3 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
212 16967241 miscmedium3 2 2 0x00000 0 0 it_midmis3 0 1 1 1 it_bag iinvalid_2x2 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 1 1726 29 8 0 15 4 **** **** **** **** **** **** 0 0 5449 0 0 5 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
212 16967241 miscmedium3 2 2 0x00000 0 0 it_midmis3 0 1 1 1 it_bag iinvalid_2x2 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 1 1726 29 8 0 15 4 **** **** **** **** **** **** 0 0 5449 0 0 5 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
213 16967220 Widget 1 1 0x00000 0 0 it_crpwdgt 0 1 1 1 it_bag iinvalid_1x1 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 0.01 1726 28 8 0 15 4 **** **** **** **** **** **** 0 0 5448 0 0 0 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
213 16967220 Widget 1 1 0x00000 0 0 it_crpwdgt 0 1 1 1 it_bag iinvalid_1x1 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 0.01 1726 28 8 0 15 4 **** **** **** **** **** **** 0 0 5448 0 0 0 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
@ -320,12 +320,12 @@
|
|||||||
316 16807266 falchion_2 2 4 0x1C010 1 2 WxSwFa 0 1 1 1 it_bag iwswfa 0 **** 3 4 **** 1.5 10 255 2 4 3 2 1 36 1 2.09 16807234 9 8 0 0 1 45 **** **** **** **** 4 0 0 16807235 0 1 160 11 **** **** **** 100 100 0 99 1 24606 24618 24630 24642 24654 24666 24678 24690 **** ****
|
316 16807266 falchion_2 2 4 0x1C010 1 2 WxSwFa 0 1 1 1 it_bag iwswfa 0 **** 3 4 **** 1.5 10 255 2 4 3 2 1 36 1 2.09 16807234 9 8 0 0 1 45 **** **** **** **** 4 0 0 16807235 0 1 160 11 **** **** **** 100 100 0 99 1 24606 24618 24630 24642 24654 24666 24678 24690 **** ****
|
||||||
317 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
317 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
318 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
318 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
319 16807278 mercurial_longsword 1 4 0x1C030 1 2 WSwLs 0 1 1 1 it_bag iwswls 0 **** 4 3 **** 1.5 10 255 1 8 1 4 1 200 1 2 16807279 9 8 0 0 1 44 **** **** **** **** 4 0 0 16807280 0 1 60 1 **** **** **** 50 50 50 99 1 **** **** **** **** **** **** **** **** **** ****
|
319 16807278 mercurial_longsword 1 4 0x1C030 1 2 WSwLs 0 1 1 1 it_bag iwswls 0 **** 4 3 **** 1.5 10 255 1 8 1 4 1 200 1 2 16807279 9 8 0 0 1 44 **** **** **** **** 4 0 0 16807280 0 1 60 1 **** **** **** 50 50 50 99 1 106 636 144 674 68 726 512 928 **** ****
|
||||||
320 16807281 mercurial_greatsword 2 5 0x1C010 1 2 WSwGs 0 1 1 1 it_bag iwswgs 0 **** 4 4 **** 1.8 10 255 2 6 1 4 1 300 1 2 16807282 9 8 0 0 1 44 **** **** **** **** 4 0 0 16807283 0 1 170 11 **** **** **** 65 65 35 99 1 **** **** **** **** **** **** **** **** **** ****
|
320 16807281 mercurial_greatsword 2 5 0x1C010 1 2 WSwGs 0 1 1 1 it_bag iwswgs 0 **** 4 4 **** 1.8 10 255 2 6 1 4 1 300 1 2 16807282 9 8 0 0 1 44 **** **** **** **** 4 0 0 16807283 0 1 170 11 **** **** **** 65 65 35 99 1 97 627 135 665 59 717 503 924 **** ****
|
||||||
321 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
321 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
322 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
322 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
323 16807287 windfirewheel 2 2 0x1C030 0 2 WSpWf 0 1 1 1 it_bag iwspwf 0 **** 3 2 **** 1.1 10 255 1 4 2 2 1 2 1 2 16807288 7 8 0 0 1 44 49 **** **** **** 4 0 0 16807289 0 1 10 18 **** **** **** 100 100 0 9 1 **** **** **** **** **** **** **** **** **** ****
|
323 16807287 windfirewheel 2 2 0x1C030 0 2 WSpWf 0 1 1 1 it_bag iwspwf 0 **** 3 2 **** 1.1 10 255 1 4 2 2 1 2 1 2 16807288 7 8 0 0 1 44 49 **** **** **** 4 0 0 16807289 0 1 10 18 **** **** **** 100 100 0 9 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
324 16807942 maugdoublesword 1 4 0x1C030 1 2 WMaDs 0 1 1 1 it_bag iwdbsw 0 **** 4 3 **** 1.5 10 255 1 8 2 2 1 15 1 2 16807944 9 8 0 0 1 45 **** **** **** **** 4 0 0 16807945 0 1 40 1 **** **** **** 50 50 50 70 1 **** **** **** **** **** **** **** **** **** ****
|
324 16807942 maugdoublesword 1 4 0x1C030 1 2 WMaDs 0 1 1 1 it_bag iwdbsw 0 **** 4 3 **** 1.5 10 255 1 8 2 2 1 15 1 2 16807944 9 8 0 0 1 45 **** **** **** **** 4 0 0 16807945 0 1 40 1 **** **** **** 50 50 50 70 1 127 655 165 693 89 745 531 943 **** ****
|
||||||
325 16807237 Flowers 1 2 0x1C010 1 2 WFlwr 0 0 0 0 it_bag iwclfr_m_011 0 4 2 3 **** 1.6 10 255 1 6 1 2 8 1 1 1 198 3 8 0 3 4 **** **** **** **** **** 4 0 0 59 50 0 1 **** **** **** **** 50 50 50 10 1 **** **** **** **** **** **** **** **** **** ****
|
325 16807237 Flowers 1 2 0x1C010 1 2 WFlwr 0 0 0 0 it_bag iwclfr_m_011 0 4 2 3 **** 1.6 10 255 1 6 1 2 8 1 1 1 198 3 8 0 3 4 **** **** **** **** **** 4 0 0 59 50 0 1 **** **** **** **** 50 50 50 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
326 16808089 useable_torch 1 3 0x1c030 1 2 hrtorch 0 1 1 1 it_bag ihrtorch 0 **** 2 2 **** 1.1 10 255 **** **** **** **** 1 1 1 0.02 1725 17 8 0 20 4 **** **** **** **** **** **** 0 0 5408 0 1 1 2 **** **** **** 100 100 0 0 1 **** **** **** **** **** **** **** **** **** ****
|
326 16808089 useable_torch 1 3 0x1c030 1 2 hrtorch 0 1 1 1 it_bag ihrtorch 0 **** 2 2 **** 1.1 10 255 **** **** **** **** 1 1 1 0.02 1725 17 8 0 20 4 **** **** **** **** **** **** 0 0 5408 0 1 1 2 **** **** **** 100 100 0 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
327 16807240 Flowers_Crystal 1 2 0x1C010 1 2 WClfr 0 1 1 1 it_bag iwclfr_m_011 0 4 2 3 **** 1.6 10 255 1 6 1 2 8 1 1 1 198 1 8 0 3 4 **** **** **** **** **** 4 0 0 59 50 0 5 **** **** **** **** 50 50 50 10 1 **** **** **** **** **** **** **** **** **** ****
|
327 16807240 Flowers_Crystal 1 2 0x1C010 1 2 WClfr 0 1 1 1 it_bag iwclfr_m_011 0 4 2 3 **** 1.6 10 255 1 6 1 2 8 1 1 1 198 1 8 0 3 4 **** **** **** **** **** 4 0 0 59 50 0 5 **** **** **** **** 50 50 50 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||||
|
3
cep_blueprints/BuildHaks.cmd
Normal file
3
cep_blueprints/BuildHaks.cmd
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
cd _tools\
|
||||||
|
NWN.CLI.exe -k
|
||||||
|
cd ..
|
BIN
cep_blueprints/_hak/prc_add_sb/_on_playerchat.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/_on_playerchat.ncs
Normal file
Binary file not shown.
708
cep_blueprints/_hak/prc_add_sb/_on_playerchat.nss
Normal file
708
cep_blueprints/_hak/prc_add_sb/_on_playerchat.nss
Normal file
@ -0,0 +1,708 @@
|
|||||||
|
// _on_playerchat
|
||||||
|
|
||||||
|
#include "mali_string_fns"
|
||||||
|
#include "sparky_inc"
|
||||||
|
#include "dmts_common_inc"
|
||||||
|
|
||||||
|
|
||||||
|
string ShowVector(vector vSomewhere)
|
||||||
|
{ string sVector = FloatToString(vSomewhere.x, 0, 2) + "x "
|
||||||
|
+ FloatToString(vSomewhere.y, 0, 2) + "y "
|
||||||
|
+ FloatToString(vSomewhere.z, 0, 2) + "z";
|
||||||
|
return sVector;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector StringToVector(string sVector)
|
||||||
|
{ float fLocX = StringToFloat(FirstWord(sVector, "x"));
|
||||||
|
sVector = RestWords(sVector, "x");
|
||||||
|
float fLocY = StringToFloat(FirstWord(sVector, "y"));
|
||||||
|
sVector = RestWords(sVector, "y");
|
||||||
|
float fLocZ = StringToFloat(FirstWord(sVector, "z"));
|
||||||
|
|
||||||
|
return Vector(fLocX, fLocY, fLocZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
string SparkyList(object oDB, string sListWhat)
|
||||||
|
{ int iEnc = 1;
|
||||||
|
string sEnc = "nyah";
|
||||||
|
string sEncVar;
|
||||||
|
string sList;
|
||||||
|
|
||||||
|
while (sEnc != "")
|
||||||
|
{ sEncVar = sListWhat + ((iEnc < 10) ? "_0" : "_") + IntToString(iEnc);
|
||||||
|
sEnc = GetLocalString(oDB, sEncVar);
|
||||||
|
if (sEnc != "")
|
||||||
|
{ sList += sEncVar + " = " + sEnc + "\n"; }
|
||||||
|
iEnc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sList == "")
|
||||||
|
{ sList = "No matching variables found."; }
|
||||||
|
|
||||||
|
return sList;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = GetPCChatSpeaker();
|
||||||
|
object oArea = GetArea(oPC);
|
||||||
|
string sChat = GetPCChatMessage();
|
||||||
|
object oTarget = GetLocalObject(oPC, "DM_Tool_Target");
|
||||||
|
string sTargetLoc = GetLocalString(oPC, "DM_Tool_TargetLoc");
|
||||||
|
|
||||||
|
// If speaker is a possessed NPC, make note of that on the possessing DM
|
||||||
|
if (GetIsDMPossessed(oPC))
|
||||||
|
{ SetLocalObject(GetMaster(oPC), "oPossessedNPC", oPC); }
|
||||||
|
else if (GetIsDM(oPC))
|
||||||
|
{ DeleteLocalObject(oPC, "oPossessedNPC"); }
|
||||||
|
|
||||||
|
|
||||||
|
// Not a valid command
|
||||||
|
if (GetStringLeft( sChat, 2) != "@@")
|
||||||
|
// Send it to the spy network
|
||||||
|
{ object oPlayer = GetFirstPC();
|
||||||
|
string sSpyHeard = "(" + GetName(GetArea(oPC)) + ") " + GetName(oPC) + ": " + sChat;
|
||||||
|
int iIsDM = 0;
|
||||||
|
object oPossessedNPC;
|
||||||
|
while (GetIsObjectValid(oPlayer))
|
||||||
|
{ iIsDM = (GetIsDM(oPlayer));
|
||||||
|
oPossessedNPC = GetLocalObject(oPlayer, "oPossessedNPC");
|
||||||
|
if (GetCampaignInt("dmfi", "dmfi_DMSpy", oPlayer) && iIsDM)
|
||||||
|
{ SendMessageToPC(oPlayer, sSpyHeard);
|
||||||
|
if (GetMaster(oPossessedNPC) == oPlayer)
|
||||||
|
{ SendMessageToPC(oPossessedNPC, sSpyHeard); }
|
||||||
|
}
|
||||||
|
oPlayer = GetNextPC();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// It begins with @@, so let's not send it to everyone
|
||||||
|
SetPCChatMessage();
|
||||||
|
|
||||||
|
|
||||||
|
string sCommand = GetStringLowerCase(FirstWord(GetStringRight(sChat, GetStringLength(sChat) - 2)));
|
||||||
|
string sParameter = RestWords(sChat);
|
||||||
|
|
||||||
|
|
||||||
|
// PC commands
|
||||||
|
|
||||||
|
if (sCommand == "pclist")
|
||||||
|
{ ExecuteScript("zmal_pcl_list", oPC); return; }
|
||||||
|
|
||||||
|
if ((sCommand == "time") && (sParameter == ""))
|
||||||
|
{ int iHour = GetTimeHour();
|
||||||
|
int iMin = GetTimeMinute();
|
||||||
|
int iSec = GetTimeSecond();
|
||||||
|
|
||||||
|
string sTime = IntToString(iHour) + ((iMin < 10) ? ":0" : ":")
|
||||||
|
+ IntToString(iMin) + ((iSec < 10) ? ":0" : ":") + IntToString(iSec);
|
||||||
|
SendMessageToPC(oPC, "Current time is " + sTime);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( !(GetIsDM(oPC) || GetIsDMPossessed(oPC)))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Invalid command."); return; }
|
||||||
|
|
||||||
|
// DM commands
|
||||||
|
|
||||||
|
// Commands that don't require a target
|
||||||
|
|
||||||
|
|
||||||
|
if (sCommand == "help")
|
||||||
|
{ sParameter = GetStringLowerCase(sParameter);
|
||||||
|
if (TestStringAgainstPattern("@@**", sParameter))
|
||||||
|
{ sParameter = RestWords(sParameter, "@@"); }
|
||||||
|
string sHelp = "Valid commands: @@name, @@tag, @@retag, @@view, @@desc, @@app, @@deity, "
|
||||||
|
+ "@@shop, @@infinite, @@makeshop, @@copyshop, @@clone, @@dmspy, "
|
||||||
|
+ "@@copyfrom, @@copyto, @@time, @@location, @@findtag, @@sparky, "
|
||||||
|
+ "@@scribble, @@editdesc, @@swapdesc";
|
||||||
|
if (sParameter == "name")
|
||||||
|
{ sHelp = "@@name NewName: Renames the target.\n"
|
||||||
|
+ "@@name: With no parameter, resets the name to the original."; }
|
||||||
|
else if (sParameter == "tag")
|
||||||
|
{ sHelp = "@@tag: Displays the target's tag."; }
|
||||||
|
else if (sParameter == "retag")
|
||||||
|
{ sHelp = "@@retag: Changes the tag of placeables and items."; }
|
||||||
|
else if (sParameter == "view")
|
||||||
|
{ sHelp = "@@view: View the target's current description."; }
|
||||||
|
else if (sParameter == "desc")
|
||||||
|
{ sHelp = "@@desc NewDesc: Changes the target's description. Use %n for a carriage return.\n"
|
||||||
|
+ "@@desc: With no parameter, resets the description."; }
|
||||||
|
else if (sParameter == "app")
|
||||||
|
{ sHelp = "@@app: Displays the target's appearance number.\n"
|
||||||
|
+ "@@app AppNumber: Change the target's appearance."; }
|
||||||
|
else if (sParameter == "deity")
|
||||||
|
{ sHelp = "@@deity: Display the target's deity.\n"
|
||||||
|
+ "@@deity NewDeity: Change the target's deity."; }
|
||||||
|
else if (sParameter == "time")
|
||||||
|
{ sHelp = "@@time: Displays the current time.\n"
|
||||||
|
+ "@@time hour:min:sec : Sets the current time."; }
|
||||||
|
else if (sParameter == "dmspy")
|
||||||
|
{ sHelp = "@@dmspy: Toggles the status of the DM Spy Network, which "
|
||||||
|
+ "reports anything said anywhere on the server."; }
|
||||||
|
else if (sParameter == "clone")
|
||||||
|
{ sHelp = "@@clone Copies: Makes the specified number of copies of the target."
|
||||||
|
+ " Copies defaults to 1."; }
|
||||||
|
else if (sParameter == "copyfrom")
|
||||||
|
{ sHelp = "@@copyfrom: Copies items from the first container you "
|
||||||
|
+ " target to the second container you target."; }
|
||||||
|
else if (sParameter == "copyto")
|
||||||
|
{ sHelp = "@@copyto: Copies items from the second container you "
|
||||||
|
+ " target to the first container you target."; }
|
||||||
|
else if (sParameter == "makeshop")
|
||||||
|
{ sHelp = "@@makeshop: Opens a new store for the target NPC."
|
||||||
|
+ " Must already be set up with a merchant conversation.\n"
|
||||||
|
+ "@@makeshop ShopTag: Attempts to set up a shop for the targeted"
|
||||||
|
+ " NPC with the specified ShopTag. Use with stores on the pallete.\n"
|
||||||
|
+ "(shop commands only work if the shop has a tag of the form Shop_NPCtag)"; }
|
||||||
|
else if (sParameter == "copyshop")
|
||||||
|
{ sHelp = "@@copyshop: Copy the target NPC's shop to your current location.\n"
|
||||||
|
+ "@@copyshop NewTag: Copy the target NPC's shop, and change "
|
||||||
|
+ "its tag to NewTag.\n"
|
||||||
|
+ "(shop commands only work if the shop has a tag of the form Shop_NPCtag)"; }
|
||||||
|
else if (sParameter == "shop")
|
||||||
|
{ sHelp = "@@shop: Open the target NPC's store.\n"
|
||||||
|
+ "(shop commands only work if the shop has a tag of the form Shop_NPCtag)"; }
|
||||||
|
else if (sParameter == "infinite")
|
||||||
|
{ sHelp = "@@infinite: Sets a shop item to an infinite supply."; }
|
||||||
|
else if (sParameter == "finite")
|
||||||
|
{ sHelp = "@@finite: Sets a shop item to a finite supply."; }
|
||||||
|
else if (sParameter == "sparky")
|
||||||
|
{ sHelp = "@@sparky despawn: Removes all Sparky spawns from the area.\n"
|
||||||
|
+ "@@sparky force despawn: If the spawn script was aborted, or"
|
||||||
|
+ " creatures were spawned from the DM Encounter Spawn widget,"
|
||||||
|
+ " this command should despawn them when @@sparky despawn cannot.\n"
|
||||||
|
+ "@@sparky spawn: Removes any current Sparky spawns, and after a 2"
|
||||||
|
+ " second delay, forces the spawns to activate.\n"
|
||||||
|
+ "@@sparky list encounters: Lists the encounter variables on the current area.\n"
|
||||||
|
+ "@@sparky list table TableName: Lists the specified table.\n"
|
||||||
|
+ "@@sparky list group GroupName: Lists the specified group."
|
||||||
|
+ "After targeting a Sparky Spawn trigger, you may use these commands:\n"
|
||||||
|
+ "@@sparky trigger spawn: Removes any current Sparky spawns, and after a 2"
|
||||||
|
+ " second delay, forces the spawns on the trigger to activate.\n"
|
||||||
|
+ "@@sparky trigger list encounters: Lists the encounter variables on the trigger.\n"
|
||||||
|
+ "@@sparky trigger list table TableName: Lists the specified table.\n"
|
||||||
|
+ "@@sparky trigger list group GroupName: Lists the specified group."; }
|
||||||
|
else if (sParameter == "location")
|
||||||
|
{ sHelp = "@@location: Shows your current coordinates and facing."; }
|
||||||
|
else if (sParameter == "findtag")
|
||||||
|
{ sHelp = "@@findtag Tag: Displays the location (area and coordinates) of"
|
||||||
|
+ " all objects with the tag Tag. If the object is on a creature"
|
||||||
|
+ " or in a container, the name of the creature/container will be"
|
||||||
|
+ " displayed as well."; }
|
||||||
|
else if (sParameter == "scribble")
|
||||||
|
{ sHelp = "@@scribble Message: Writes the specified message on the floor "
|
||||||
|
+ "at the targeted location. A stage manager widget is provided, "
|
||||||
|
+ "ready to be boxed up."; }
|
||||||
|
else if (sParameter == "editdesc")
|
||||||
|
{ sHelp = "@@editdesc Delimiter SearchFor<Delimiter>ReplaceWith\n"
|
||||||
|
+ "Replaces all occurances of SearchFor with ReplaceWith in target's"
|
||||||
|
+ " description."; }
|
||||||
|
else if (sParameter == "swapdesc")
|
||||||
|
{ sHelp = "@@swapdesc\nSwaps the identified and unidentified descriptions of the target."; }
|
||||||
|
|
||||||
|
SendMessageToPC(oPC, sHelp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (sCommand == "location")
|
||||||
|
{ SendMessageToPC(oPC, "Your location is: " + ShowVector(GetPosition(oPC))
|
||||||
|
+ ", facing " + FloatToString(GetFacing(oPC), 0,0));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "findtag")
|
||||||
|
{ object oFindee = oPC;
|
||||||
|
object oPossessor = oPC;
|
||||||
|
string sFindeeLocs = "";
|
||||||
|
|
||||||
|
int iLoop = 0;
|
||||||
|
while (GetIsObjectValid(oFindee))
|
||||||
|
{ oFindee = GetObjectByTag(sParameter, iLoop);
|
||||||
|
if (GetIsObjectValid(oFindee))
|
||||||
|
{ oPossessor = GetItemPossessor(oFindee);
|
||||||
|
if (GetIsObjectValid(oPossessor))
|
||||||
|
{ sFindeeLocs += "\n" + GetName(GetArea(oPossessor)) + ": "
|
||||||
|
+ ShowVector(GetPosition(oPossessor)) + " on "
|
||||||
|
+ GetName(oPossessor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ sFindeeLocs += "\n" + GetName(GetArea(oFindee)) + ": "
|
||||||
|
+ ShowVector(GetPosition(oFindee));
|
||||||
|
}
|
||||||
|
iLoop++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iLoop = 0)
|
||||||
|
{ SendMessageToPC(oPC, "Nothing found."); }
|
||||||
|
else
|
||||||
|
{ SendMessageToPC(oPC, "Locations for tag " + sParameter + ":" + sFindeeLocs); }
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "dmspy")
|
||||||
|
{ int iDMSpy = GetCampaignInt("dmfi", "dmfi_DMSpy", oPC);
|
||||||
|
int iToggle = abs(iDMSpy - 1);
|
||||||
|
SetCampaignInt("dmfi", "dmfi_DMSpy", iToggle, oPC);
|
||||||
|
string sStatus = iToggle ? "on" : "off";
|
||||||
|
SendMessageToPC(oPC, "DM Spy network " + sStatus + ".");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "time")
|
||||||
|
{ if (sParameter != "")
|
||||||
|
{ if (TestStringAgainstPattern("*n:*n:*n", sParameter))
|
||||||
|
{ int iHour = StringToInt(FirstWord(sParameter, ":"));
|
||||||
|
sParameter = RestWords(sParameter, ":");
|
||||||
|
|
||||||
|
int iMin = StringToInt(FirstWord(sParameter, ":"));
|
||||||
|
sParameter = RestWords(sParameter, ":");
|
||||||
|
|
||||||
|
int iSec = StringToInt(FirstWord(sParameter, ":"));
|
||||||
|
sParameter = RestWords(sParameter, ":");
|
||||||
|
|
||||||
|
SetTime(iHour, iMin, iSec, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Invalid time format."); return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
int iHour = GetTimeHour();
|
||||||
|
int iMin = GetTimeMinute();
|
||||||
|
int iSec = GetTimeSecond();
|
||||||
|
|
||||||
|
string sTime = IntToString(iHour) + ((iMin < 10) ? ":0" : ":")
|
||||||
|
+ IntToString(iMin) + ((iSec < 10) ? ":0" : ":") + IntToString(iSec);
|
||||||
|
SendMessageToPC(oPC, "Current time is " + sTime);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "sparky")
|
||||||
|
{ sParameter = GetStringLowerCase(sParameter);
|
||||||
|
if (sParameter == "despawn")
|
||||||
|
{ SendMessageToPC(oPC, "Despawning...");
|
||||||
|
Despawn(oArea);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (sParameter == "force despawn")
|
||||||
|
{ SendMessageToPC(oPC, "Forcing a despawn...");
|
||||||
|
SetLocalInt(oArea, "iSparkySpawned", TRUE);
|
||||||
|
Despawn(oArea);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
object oDB = oArea;
|
||||||
|
if (FirstWord(sParameter) == "trigger")
|
||||||
|
{ if ( !( (GetObjectType(oTarget) == OBJECT_TYPE_TRIGGER) && (GetLocalInt(oTarget, "iSparkyTrigger")) ))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Target is not a Sparky Spawn trigger!"); return; }
|
||||||
|
|
||||||
|
sParameter = RestWords(sParameter);
|
||||||
|
oDB = oTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sParameter == "respawn") || (sParameter == "spawn"))
|
||||||
|
{ SendMessageToPC(oPC, "Spawning...");
|
||||||
|
Despawn(oArea);
|
||||||
|
DelayCommand(2.0f, SpawnEncounters(oDB));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (FirstWord(sParameter) == "list")
|
||||||
|
{ sParameter = RestWords(sParameter);
|
||||||
|
string sListWhat = FirstWord(sParameter);
|
||||||
|
sParameter = FirstWord(RestWords(sParameter));
|
||||||
|
if (sListWhat == "encounters")
|
||||||
|
{ SendMessageToPC(oPC, SparkyList(oDB, "encounter")); return; }
|
||||||
|
if ((sListWhat != "table") && (sListWhat != "group"))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Invalid Sparky list command."); return; }
|
||||||
|
if (sParameter == "")
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: No " + GetStringLowerCase(sListWhat) + " name supplied."); return; }
|
||||||
|
|
||||||
|
SendMessageToPC(oPC, SparkyList(oDB, GetStringLowerCase(sListWhat + "_" + sParameter)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SendMessageToPC(oPC, "ERROR: Invalid Sparky command."); return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "areavar")
|
||||||
|
{ string sVarType = GetStringLowerCase(FirstWord(sParameter));
|
||||||
|
string sParameter2 = RestWords(sParameter);
|
||||||
|
string sVarName = FirstWord(sParameter2);
|
||||||
|
sParameter2 = RestWords(sParameter2);
|
||||||
|
|
||||||
|
if (sVarName == "")
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: No variable name supplied."); return; }
|
||||||
|
|
||||||
|
if (sVarType == "int")
|
||||||
|
{ int iValue = StringToInt(sParameter2);
|
||||||
|
SetLocalInt(oArea, sVarName, iValue);
|
||||||
|
SendMessageToPC(oPC, "Variable " + sVarName + " set to: " + IntToString(iValue));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (sVarType == "float")
|
||||||
|
{ float fValue = StringToFloat(sParameter2);
|
||||||
|
SetLocalFloat(oArea, sVarName, fValue);
|
||||||
|
SendMessageToPC(oPC, "Variable " + sVarName + " set to: " + FloatToString(fValue));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (sVarType == "string")
|
||||||
|
{ SetLocalString(oArea, sVarName, sParameter2);
|
||||||
|
SendMessageToPC(oPC, "Variable " + sVarName + " set to: " + sParameter2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ((sCommand == "scribble") || (sCommand == "scribblewall"))
|
||||||
|
{ if (sTargetLoc == "")
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Target a location first!"); return; }
|
||||||
|
|
||||||
|
vector vStart = StringToVector(sTargetLoc);
|
||||||
|
float fTheta = GetTheta(GetPosition(oPC), vStart);
|
||||||
|
location lStartLoc = Location(oArea, vStart, fTheta);
|
||||||
|
|
||||||
|
if (sParameter == "")
|
||||||
|
{ object oMarker = GetObjectByTag("ScribbleMarker_" + ObjectToString(oPC));
|
||||||
|
if (GetIsObjectValid(oMarker))
|
||||||
|
{ DestroyObject(oMarker);
|
||||||
|
SendMessageToPC(oPC, "Marker removed.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ SendMessageToPC(oPC, "Creating marker...");
|
||||||
|
oMarker = CreateObject(OBJECT_TYPE_PLACEABLE, "zep_os_sar_001", lStartLoc, FALSE, "ScribbleMarker_" + ObjectToString(oPC));
|
||||||
|
if (sCommand == "scribblewall")
|
||||||
|
{ SetLocalInt(oMarker, "iPlayAnimation", ANIMATION_PLACEABLE_CLOSE);
|
||||||
|
ExecuteScript("playanimation", oMarker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string sAlphabet_LC = "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
string sAlphabet_UC = GetStringUpperCase(sAlphabet_LC);
|
||||||
|
string sNumbers = "0123456789";
|
||||||
|
string sSpecial = ".,-";
|
||||||
|
string sSpecialTag = "pdcmds";
|
||||||
|
string sLetter;
|
||||||
|
|
||||||
|
int iPlayAnimation = 0;
|
||||||
|
object oMarker = GetObjectByTag("ScribbleMarker_" + ObjectToString(oPC));
|
||||||
|
if (GetIsObjectValid(oMarker))
|
||||||
|
{ lStartLoc = GetLocation(oMarker);
|
||||||
|
iPlayAnimation = GetLocalInt(oMarker, "iPlayAnimation");
|
||||||
|
fTheta = GetFacing(oMarker);
|
||||||
|
DestroyObject(oMarker);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ SendMessageToPC(oPC, "WARNING: Marker not found. Using target location..."); }
|
||||||
|
|
||||||
|
location lLoc = lStartLoc;
|
||||||
|
|
||||||
|
object oSM_widget = CreateItemOnObject("mali_dm_stage", oPC);
|
||||||
|
if (!GetIsObjectValid(oSM_widget))
|
||||||
|
{ SendMessageToPC(oPC, "Warning: Could not create a stage manager widget..."); }
|
||||||
|
|
||||||
|
object oLetter;
|
||||||
|
int iLoop;
|
||||||
|
for (iLoop = 0; iLoop < GetStringLength(sParameter); iLoop++)
|
||||||
|
{ sLetter = GetSubString(sParameter, iLoop, 1);
|
||||||
|
if (FindSubString(sAlphabet_LC + sNumbers, sLetter) != -1)
|
||||||
|
{ oLetter = CreateObject(OBJECT_TYPE_PLACEABLE, "zep_os_sn" + sLetter + "_001", lLoc);
|
||||||
|
if (iPlayAnimation)
|
||||||
|
{ SetLocalInt(oLetter, "iPlayAnimation", iPlayAnimation);
|
||||||
|
ExecuteScript("playanimation", oLetter);
|
||||||
|
}
|
||||||
|
lLoc = Location(oArea, GetChangedPosition(GetPositionFromLocation(lLoc), 0.25f, fTheta - 90.0f), fTheta);
|
||||||
|
if (GetIsObjectValid(oSM_widget))
|
||||||
|
{ SetLocalObject(oSM_widget, "oProp" + IntToString(iLoop + 1), oLetter);
|
||||||
|
SetLocalInt(oSM_widget, "iProp" + ObjectToString(oLetter), iLoop + 1);
|
||||||
|
SetLocalInt(oSM_widget, "iPropIndex", iLoop + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (FindSubString(sAlphabet_UC, sLetter) != -1)
|
||||||
|
{ oLetter = CreateObject(OBJECT_TYPE_PLACEABLE, "zep_os_sn" + GetStringLowerCase(sLetter) + "_002", lLoc);
|
||||||
|
if (iPlayAnimation)
|
||||||
|
{ SetLocalInt(oLetter, "iPlayAnimation", iPlayAnimation);
|
||||||
|
ExecuteScript("playanimation", oLetter);
|
||||||
|
}
|
||||||
|
lLoc = Location(oArea, GetChangedPosition(GetPositionFromLocation(lLoc), 0.25f, fTheta - 90.0f), fTheta);
|
||||||
|
if (GetIsObjectValid(oSM_widget))
|
||||||
|
{ SetLocalObject(oSM_widget, "oProp" + IntToString(iLoop + 1), oLetter);
|
||||||
|
SetLocalInt(oSM_widget, "iProp" + ObjectToString(oLetter), iLoop + 1);
|
||||||
|
SetLocalInt(oSM_widget, "iPropIndex", iLoop + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (FindSubString(sSpecial, sLetter) != -1)
|
||||||
|
{ oLetter = CreateObject(OBJECT_TYPE_PLACEABLE, "zep_os_s" + GetSubString(sSpecialTag, FindSubString(sSpecial, sLetter) * 2, 2) + "_001", lLoc);
|
||||||
|
if (iPlayAnimation)
|
||||||
|
{ SetLocalInt(oLetter, "iPlayAnimation", iPlayAnimation);
|
||||||
|
ExecuteScript("playanimation", oLetter);
|
||||||
|
}
|
||||||
|
lLoc = Location(oArea, GetChangedPosition(GetPositionFromLocation(lLoc), 0.25f, fTheta - 90.0f), fTheta);
|
||||||
|
if (GetIsObjectValid(oSM_widget))
|
||||||
|
{ SetLocalObject(oSM_widget, "oProp" + IntToString(iLoop + 1), oLetter);
|
||||||
|
SetLocalInt(oSM_widget, "iProp" + ObjectToString(oLetter), iLoop + 1);
|
||||||
|
SetLocalInt(oSM_widget, "iPropIndex", iLoop + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ lLoc = Location(oArea, GetChangedPosition(GetPositionFromLocation(lLoc), 0.5f, fTheta - 90.0f), fTheta); }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetIsObjectValid(oSM_widget))
|
||||||
|
{ SetName(oSM_widget, "The Moving Finger");
|
||||||
|
SetDescription(oSM_widget, "Use this stage manager widget to enscribe the following message on the floor:\n\n" + sParameter);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Commands that require a target
|
||||||
|
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oTarget))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Invalid target!"); return; }
|
||||||
|
|
||||||
|
string sTargetName = GetName(oTarget);
|
||||||
|
|
||||||
|
|
||||||
|
if (sCommand == "setstring")
|
||||||
|
{ string sVarName = FirstWord(sParameter);
|
||||||
|
sParameter = RestWords(sParameter);
|
||||||
|
if (sParameter == "")
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: No variable name supplied!"); return; }
|
||||||
|
SetLocalString(oTarget, sVarName, sParameter);
|
||||||
|
SendMessageToPC(oPC, "Set.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "areavar")
|
||||||
|
{ string sVarType = GetStringLowerCase(FirstWord(sParameter));
|
||||||
|
string sParameter2 = RestWords(sParameter);
|
||||||
|
string sVarName = FirstWord(sParameter2);
|
||||||
|
|
||||||
|
if (sVarType != "object")
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Invalid variable type."); return; }
|
||||||
|
|
||||||
|
SetLocalObject(oArea, sVarName, oTarget);
|
||||||
|
SendMessageToPC(oPC, "Variable " + sVarName + " set to: " + sTargetName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "name")
|
||||||
|
{ if( GetIsDM(oTarget) || GetIsPC(oTarget))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: You can't rename a PC or DM."); return; }
|
||||||
|
else
|
||||||
|
{ SetName(oTarget, sParameter);
|
||||||
|
SendMessageToPC(oPC, sTargetName + "'s name set to: " + GetName(oTarget));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "view")
|
||||||
|
{ SendMessageToPC(oPC, sTargetName + "'s Description:\n" + GetDescription(oTarget)); return; }
|
||||||
|
|
||||||
|
if (sCommand == "desc")
|
||||||
|
{ SetDescription(oTarget, SearchAndReplace(sParameter, "%n", "\n")); return; }
|
||||||
|
|
||||||
|
if (sCommand == "editdesc")
|
||||||
|
{ string sDesc = GetDescription(oTarget);
|
||||||
|
string sDelimiter = FirstWord(sParameter);
|
||||||
|
sParameter = RestWords(sParameter);
|
||||||
|
string sSearch = FirstWord(sParameter, sDelimiter);
|
||||||
|
string sReplace = RestWords(sParameter, sDelimiter);
|
||||||
|
|
||||||
|
SetDescription(oTarget, SearchAndReplace(sDesc, sSearch, sReplace));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "swapdesc")
|
||||||
|
{ string sDesc = GetDescription(oTarget);
|
||||||
|
SetDescription(oTarget, GetDescription(oTarget, FALSE, FALSE));
|
||||||
|
SetDescription(oTarget, sDesc, FALSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "app")
|
||||||
|
{ int iApp = StringToInt(sParameter);
|
||||||
|
|
||||||
|
if (GetObjectType(oTarget) != OBJECT_TYPE_CREATURE)
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Invalid target. NPCs, players, or DMs only."); return; }
|
||||||
|
if (sParameter == "")
|
||||||
|
{ SendMessageToPC(oPC, sTargetName + "'s appearance: " + IntToString(GetAppearanceType(oTarget))); return; }
|
||||||
|
if ( ((sParameter != "0") && (iApp == 0)) || (iApp < 0) )
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Appearance must be a non-negative integer!"); return; }
|
||||||
|
SetCreatureAppearanceType(oTarget, iApp); return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "deity")
|
||||||
|
{ if (GetObjectType(oTarget) != OBJECT_TYPE_CREATURE)
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Invalid target."); return; }
|
||||||
|
if (sParameter == "")
|
||||||
|
{ SendMessageToPC(oPC, sTargetName + "'s deity: " + GetDeity(oTarget)); return; }
|
||||||
|
else
|
||||||
|
{ SetDeity(oTarget, sParameter);
|
||||||
|
SendMessageToPC(oPC, sTargetName + "'s deity set to: " + GetDeity(oTarget));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "tag")
|
||||||
|
{ SendMessageToPC(oPC, sTargetName + "'s tag: " + GetTag(oTarget)); return; }
|
||||||
|
|
||||||
|
if (sCommand == "retag")
|
||||||
|
{ if (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
|
||||||
|
{ location lTargetLocation = GetLocation(oTarget);
|
||||||
|
oTarget = RecreateObjectAtLocation(oTarget, lTargetLocation, sParameter);
|
||||||
|
SetLocalInt(oTarget, "iRetagged", TRUE);
|
||||||
|
SetLocalObject(oPC, "DM_Tool_Target", oTarget);
|
||||||
|
SendMessageToPC(oPC, sTargetName + "'s tag is now: " + GetTag(oTarget));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (GetObjectType(oTarget) == OBJECT_TYPE_ITEM)
|
||||||
|
{ object oNewItem = CopyObject(oTarget, GetLocation(oPC), oPC, sParameter);
|
||||||
|
if (GetIsObjectValid(oNewItem))
|
||||||
|
{ DestroyObject(oTarget);
|
||||||
|
SendMessageToPC(oPC, sTargetName + "'s tag is now: " + GetTag(oNewItem));
|
||||||
|
SetLocalObject(oPC, "DM_Tool_Target", oNewItem);
|
||||||
|
return; }
|
||||||
|
else
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Item not retagged. Reason unknown."); return; }
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Only placeables and items may be retagged."); return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "shop")
|
||||||
|
{ if (GetObjectType(oTarget) == OBJECT_TYPE_STORE)
|
||||||
|
{ OpenStore(oTarget, oPC); return; }
|
||||||
|
if (GetIsPC(oTarget) || !(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Not an NPC!"); return; }
|
||||||
|
object oStore = GetNearestObjectByTag("Store_" + GetTag(oTarget), oTarget);
|
||||||
|
if (!GetIsObjectValid(oStore) || (GetObjectType(oStore) != OBJECT_TYPE_STORE))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Could not find store!"); return; }
|
||||||
|
else
|
||||||
|
{ OpenStore(oStore, oPC); return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "infinite")
|
||||||
|
{ if (GetObjectType(oTarget) != OBJECT_TYPE_ITEM)
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Must target an item!"); return; }
|
||||||
|
else if (GetObjectType(GetItemPossessor(oTarget)) != OBJECT_TYPE_STORE)
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Must target an item in a store!"); return; }
|
||||||
|
else
|
||||||
|
{ SetInfiniteFlag(oTarget);
|
||||||
|
SendMessageToPC(oPC, sTargetName + " is now set infinite."); return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "finite")
|
||||||
|
{ if (GetObjectType(oTarget) != OBJECT_TYPE_ITEM)
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Must target an item!"); return; }
|
||||||
|
else if (GetObjectType(GetItemPossessor(oTarget)) != OBJECT_TYPE_STORE)
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Must target an item in a store!"); return; }
|
||||||
|
else
|
||||||
|
{ SetInfiniteFlag(oTarget, FALSE);
|
||||||
|
SendMessageToPC(oPC, sTargetName + " is now set finite."); return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "makeshop")
|
||||||
|
{ if (GetIsPC(oTarget) || !(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Not an NPC!"); return; }
|
||||||
|
string sStoreTag = "Store_" + GetTag(oTarget);
|
||||||
|
string sStoreResRef = sStoreTag;
|
||||||
|
if (sParameter != "")
|
||||||
|
{ sStoreResRef = sParameter; }
|
||||||
|
object oStore = CreateObject(OBJECT_TYPE_STORE, sStoreResRef, GetLocation(oPC), FALSE, sStoreTag);
|
||||||
|
if (!GetIsObjectValid(oStore))
|
||||||
|
{ oStore = CreateObject(OBJECT_TYPE_STORE, "Empty_Store", GetLocation(oPC), FALSE, sStoreTag); }
|
||||||
|
if (GetIsObjectValid(oStore))
|
||||||
|
{ SetLocalObject(oPC, "DM_Tool_Target", oStore);
|
||||||
|
SendMessageToPC(oPC, "New target: " + GetName(oStore) + "\nTag: " + GetTag(oStore));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Store not created. Reason unknown."); return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "copyshop")
|
||||||
|
{ if (GetIsPC(oTarget) || !(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Not an NPC!"); return; }
|
||||||
|
object oStore = GetNearestObjectByTag("Store_" + GetTag(oTarget), oTarget);
|
||||||
|
if (!GetIsObjectValid(oStore) || (GetObjectType(oStore) != OBJECT_TYPE_STORE))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Could not find store!"); return; }
|
||||||
|
string sStoreName = GetName(oStore);
|
||||||
|
string sStoreTag = GetTag(oStore);
|
||||||
|
if (!(sParameter == ""))
|
||||||
|
{ sStoreTag = sParameter; }
|
||||||
|
object oNewStore = CreateObject(OBJECT_TYPE_STORE, "Empty_Store", GetLocation(oPC), FALSE, sStoreTag);
|
||||||
|
if (GetIsObjectValid(oNewStore))
|
||||||
|
{ object oMerchandise = GetFirstItemInInventory(oStore);
|
||||||
|
while (GetIsObjectValid(oMerchandise))
|
||||||
|
{ if (GetInfiniteFlag(oMerchandise))
|
||||||
|
{ CopyItem(oMerchandise, oNewStore, TRUE); }
|
||||||
|
oMerchandise = GetNextItemInInventory(oStore);
|
||||||
|
}
|
||||||
|
SetName(oNewStore, sStoreName);
|
||||||
|
SetLocalObject(oPC, "DM_Tool_Target", oNewStore);
|
||||||
|
SendMessageToPC(oPC, "New target: " + GetName(oNewStore) + "\nTag: " + GetTag(oNewStore));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Store not created. Reason unknown."); return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sCommand == "clone")
|
||||||
|
{ if ( !((GetObjectType(oTarget) == OBJECT_TYPE_ITEM) || (GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: You may only clone items and creatures."); return; }
|
||||||
|
int iCopies = StringToInt(sParameter);
|
||||||
|
if (sParameter == "")
|
||||||
|
{ iCopies = 1; }
|
||||||
|
if (iCopies < 1)
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Number of copies must be an integer greater than zero!"); return; }
|
||||||
|
int iLoop = 0;
|
||||||
|
while (iLoop < iCopies)
|
||||||
|
{ if (GetObjectType(oTarget) == OBJECT_TYPE_ITEM)
|
||||||
|
{ CopyObject(oTarget, GetLocation(oPC), oPC); }
|
||||||
|
else
|
||||||
|
{ CopyObject(oTarget, GetLocation(oTarget)); }
|
||||||
|
iLoop++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sCommand == "copyfrom") || (sCommand == "copyto"))
|
||||||
|
{ object oSource;
|
||||||
|
object oDest;
|
||||||
|
object oThingie;
|
||||||
|
|
||||||
|
if (sCommand == "copyfrom")
|
||||||
|
{ oSource = GetLocalObject(oPC, "oDM_Bag1");
|
||||||
|
oDest = GetLocalObject(oPC, "oDM_Bag2");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ oSource = GetLocalObject(oPC, "oDM_Bag2");
|
||||||
|
oDest = GetLocalObject(oPC, "oDM_Bag1");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oSource) || !GetIsObjectValid(oDest))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Invalid target. Re-target both containers."); return; }
|
||||||
|
if (!GetHasInventory(oSource) || !GetHasInventory(oDest))
|
||||||
|
{ SendMessageToPC(oPC, "ERROR: Command may only be used with containers."); return; }
|
||||||
|
|
||||||
|
CopyContents(oSource, oDest, sParameter);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Doesn't match anything
|
||||||
|
|
||||||
|
SendMessageToPC(oPC, "ERROR: Invalid command.");
|
||||||
|
}
|
||||||
|
|
BIN
cep_blueprints/_hak/prc_add_sb/aarcl007.uti
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/aarcl007.uti
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/am_it_kocra_hide.uti
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/am_it_kocra_hide.uti
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/blockdoor.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/blockdoor.ncs
Normal file
Binary file not shown.
26
cep_blueprints/_hak/prc_add_sb/blockdoor.nss
Normal file
26
cep_blueprints/_hak/prc_add_sb/blockdoor.nss
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* Script generated by
|
||||||
|
Lilac Soul's NWN Script Generator, v. 1.2
|
||||||
|
|
||||||
|
For download info, please visit:
|
||||||
|
http://www.angelfire.com/space/lilacsoul */
|
||||||
|
|
||||||
|
//Put this OnEnter
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
|
||||||
|
object oPC = GetEnteringObject();
|
||||||
|
|
||||||
|
if (!GetIsPC(oPC)) return;
|
||||||
|
|
||||||
|
object oTarget;
|
||||||
|
object oSpawn;
|
||||||
|
oTarget = GetWaypointByTag("here");
|
||||||
|
|
||||||
|
oSpawn = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_boulder", GetLocation(oTarget));
|
||||||
|
|
||||||
|
oTarget = oSpawn;
|
||||||
|
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BREACH), GetLocation(oTarget));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
BIN
cep_blueprints/_hak/prc_add_sb/canolothskin.uti
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/canolothskin.uti
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/canolothtongue.uti
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/canolothtongue.uti
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/celestialchar001.utc
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/celestialchar001.utc
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/celestialcharger.utc
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/celestialcharger.utc
Normal file
Binary file not shown.
14
cep_blueprints/_hak/prc_add_sb/cep2damax.2da
Normal file
14
cep_blueprints/_hak/prc_add_sb/cep2damax.2da
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
2DA V2.0
|
||||||
|
|
||||||
|
LABEL MAX
|
||||||
|
0 **** ****
|
||||||
|
1 appearance 3999
|
||||||
|
2 portraits 3829
|
||||||
|
3 tailmodel 4999
|
||||||
|
4 visualeffects 7167
|
||||||
|
5 wingmodel 1999
|
||||||
|
6 **** ****
|
||||||
|
7 **** ****
|
||||||
|
8 **** ****
|
||||||
|
9 **** ****
|
||||||
|
10 **** ****
|
BIN
cep_blueprints/_hak/prc_add_sb/cep_unicorn.utc
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/cep_unicorn.utc
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/cep_unicorn001.utc
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/cep_unicorn001.utc
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codibigspore.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codibigspore.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codibigspore2.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codibigspore2.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codietheroscope.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codietheroscope.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codifallenspire.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codifallenspire.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codifortwheel.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codifortwheel.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codihighspire.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codihighspire.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codimediumspore.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codimediumspore.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codiportala.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codiportala.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codiportalb.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codiportalb.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codiredcloud.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codiredcloud.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codirug01.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codirug01.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codirug02.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codirug02.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codisextant.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codisextant.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codishelf01.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codishelf01.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codiskullpost.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codiskullpost.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codismallcage.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codismallcage.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codismallspore.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codismallspore.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codispirea.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codispirea.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codispirebench.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codispirebench.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codisporegroup1.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codisporegroup1.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codisporegroup2.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codisporegroup2.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codistatuebuddha.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codistatuebuddha.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codistatuegargoy.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codistatuegargoy.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codistatuejudge.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codistatuejudge.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codistatuesit.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codistatuesit.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codistone.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codistone.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codisupportarcha.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codisupportarcha.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codisupportarchb.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codisupportarchb.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/coditable.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/coditable.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/coditable03.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/coditable03.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/coditiltedspire.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/coditiltedspire.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codiwall.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codiwall.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codiwall2.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codiwall2.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codiwall3.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codiwall3.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/codiwall4.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/codiwall4.utp
Normal file
Binary file not shown.
566
cep_blueprints/_hak/prc_add_sb/colors_inc.nss
Normal file
566
cep_blueprints/_hak/prc_add_sb/colors_inc.nss
Normal file
@ -0,0 +1,566 @@
|
|||||||
|
/*
|
||||||
|
* colors_inc.nss
|
||||||
|
*
|
||||||
|
* Access to the color tokens provided by The Krit.
|
||||||
|
************************************************************
|
||||||
|
* Please use these judiciously to enhance the gaming
|
||||||
|
* experience. (Overuse of colors detracts from it.)
|
||||||
|
************************************************************
|
||||||
|
* Color tokens in a string will change the color from that
|
||||||
|
* point on when the string is displayed on the screen.
|
||||||
|
* Every color change should be ended by an end token,
|
||||||
|
* supplied by ColorTokenEnd().
|
||||||
|
************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Constants
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
const string ColorArray = " !##$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]]^_`abcdefghijklmnopqrstuvwxyz{|}~€<7F>‚ƒ„…†‡ˆ‰Š‹Œ<E280B9>Ž<EFBFBD><C5BD>‘’“”•–—˜™š›œ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþþ";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Prototypes
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the given RGB values.
|
||||||
|
// Valid parameter values are 0-255.
|
||||||
|
string ColorToken(int nRed, int nGreen, int nBlue);
|
||||||
|
|
||||||
|
// Supplies a string that ends an earlier color change.
|
||||||
|
string ColorTokenEnd();
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to black.
|
||||||
|
string ColorTokenBlack();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to blue.
|
||||||
|
string ColorTokenBlue();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to gray.
|
||||||
|
string ColorTokenGray();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to green.
|
||||||
|
string ColorTokenGreen();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to light purple.
|
||||||
|
string ColorTokenLightPurple();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to orange.
|
||||||
|
string ColorTokenOrange();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to pink.
|
||||||
|
string ColorTokenPink();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to purple.
|
||||||
|
string ColorTokenPurple();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to red.
|
||||||
|
string ColorTokenRed();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to white.
|
||||||
|
string ColorTokenWhite();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to yellow.
|
||||||
|
string ColorTokenYellow();
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// combat messages.
|
||||||
|
string ColorTokenCombat();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// dialog.
|
||||||
|
string ColorTokenDialog();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// dialog actions.
|
||||||
|
string ColorTokenDialogAction();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// dialog checks.
|
||||||
|
string ColorTokenDialogCheck();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// dialog highlighting.
|
||||||
|
string ColorTokenDialogHighlight();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// replies in the dialog window.
|
||||||
|
string ColorTokenDialogReply();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// the DM channel.
|
||||||
|
string ColorTokenDM();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// many game engine messages.
|
||||||
|
string ColorTokenGameEngine();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// saving throw messages.
|
||||||
|
string ColorTokenSavingThrow();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// messages sent from scripts.
|
||||||
|
string ColorTokenScript();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// server messages.
|
||||||
|
string ColorTokenServer();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// shouts.
|
||||||
|
string ColorTokenShout();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// skill check messages.
|
||||||
|
string ColorTokenSkillCheck();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// the talk and party talk channels.
|
||||||
|
string ColorTokenTalk();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// tells.
|
||||||
|
string ColorTokenTell();
|
||||||
|
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// whispers.
|
||||||
|
string ColorTokenWhisper();
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Returns the name of oPC, surrounded by color tokens, so the color of
|
||||||
|
// the name is the lighter blue often used in NWN game engine messages.
|
||||||
|
string GetNamePCColor(object oPC);
|
||||||
|
|
||||||
|
// Returns the name of oNPC, surrounded by color tokens, so the color of
|
||||||
|
// the name is the shade of purple often used in NWN game engine messages.
|
||||||
|
string GetNameNPCColor(object oNPC);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Basic Functions
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorToken()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the given RGB values.
|
||||||
|
// Valid parameter values are 0-255.
|
||||||
|
//
|
||||||
|
string ColorToken(int nRed, int nGreen, int nBlue)
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, nRed, 1) +
|
||||||
|
GetSubString(ColorArray, nGreen, 1) +
|
||||||
|
GetSubString(ColorArray, nBlue, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenEnd()
|
||||||
|
//
|
||||||
|
// Supplies a string that ends an earlier color change.
|
||||||
|
//
|
||||||
|
string ColorTokenEnd()
|
||||||
|
{
|
||||||
|
return "</c>";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Functions by Color
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenBlack()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to black.
|
||||||
|
//
|
||||||
|
string ColorTokenBlack()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenBlue()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to blue.
|
||||||
|
//
|
||||||
|
string ColorTokenBlue()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenGray()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to gray.
|
||||||
|
//
|
||||||
|
string ColorTokenGray()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 127, 1) +
|
||||||
|
GetSubString(ColorArray, 127, 1) +
|
||||||
|
GetSubString(ColorArray, 127, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenGreen()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to green.
|
||||||
|
//
|
||||||
|
string ColorTokenGreen()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenLightPurple()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to light purple.
|
||||||
|
//
|
||||||
|
string ColorTokenLightPurple()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 175, 1) +
|
||||||
|
GetSubString(ColorArray, 48, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenOrange()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to orange.
|
||||||
|
//
|
||||||
|
string ColorTokenOrange()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 127, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenPink()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to pink.
|
||||||
|
//
|
||||||
|
string ColorTokenPink()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenPurple()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to purple.
|
||||||
|
//
|
||||||
|
string ColorTokenPurple()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 127, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenRed()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to red.
|
||||||
|
//
|
||||||
|
string ColorTokenRed()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenWhite()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to white.
|
||||||
|
//
|
||||||
|
string ColorTokenWhite()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenYellow()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to yellow.
|
||||||
|
//
|
||||||
|
string ColorTokenYellow()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Functions by Purpose
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenCombat()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// combat messages.
|
||||||
|
//
|
||||||
|
string ColorTokenCombat()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 102, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenDialog()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// dialog.
|
||||||
|
//
|
||||||
|
string ColorTokenDialog()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenDialogAction()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// dialog actions.
|
||||||
|
//
|
||||||
|
string ColorTokenDialogAction()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 1, 1) +
|
||||||
|
GetSubString(ColorArray, 254, 1) +
|
||||||
|
GetSubString(ColorArray, 1, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenDialogCheck()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// dialog checks.
|
||||||
|
//
|
||||||
|
string ColorTokenDialogCheck()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 254, 1) +
|
||||||
|
GetSubString(ColorArray, 1, 1) +
|
||||||
|
GetSubString(ColorArray, 1, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenDialogHighlight()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// dialog highlighting.
|
||||||
|
//
|
||||||
|
string ColorTokenDialogHighlight()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 1, 1) +
|
||||||
|
GetSubString(ColorArray, 1, 1) +
|
||||||
|
GetSubString(ColorArray, 254, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenDialogReply()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// replies in the dialog window.
|
||||||
|
//
|
||||||
|
string ColorTokenDialogReply()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 102, 1) +
|
||||||
|
GetSubString(ColorArray, 178, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenDM()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// the DM channel.
|
||||||
|
//
|
||||||
|
string ColorTokenDM()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 16, 1) +
|
||||||
|
GetSubString(ColorArray, 223, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenGameEngine()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// many game engine messages.
|
||||||
|
//
|
||||||
|
string ColorTokenGameEngine()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 204, 1) +
|
||||||
|
GetSubString(ColorArray, 119, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenSavingThrow()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// saving throw messages.
|
||||||
|
//
|
||||||
|
string ColorTokenSavingThrow()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 102, 1) +
|
||||||
|
GetSubString(ColorArray, 204, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenScript()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// messages sent from scripts.
|
||||||
|
//
|
||||||
|
string ColorTokenScript()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 0, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenServer()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// server messages.
|
||||||
|
//
|
||||||
|
string ColorTokenServer()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 176, 1) +
|
||||||
|
GetSubString(ColorArray, 176, 1) +
|
||||||
|
GetSubString(ColorArray, 176, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenShout()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// shouts.
|
||||||
|
//
|
||||||
|
string ColorTokenShout()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 239, 1) +
|
||||||
|
GetSubString(ColorArray, 80, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenSkillCheck()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// skill check messages.
|
||||||
|
//
|
||||||
|
string ColorTokenSkillCheck()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 0, 1) +
|
||||||
|
GetSubString(ColorArray, 102, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenTalk()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// the talk and party talk channels.
|
||||||
|
//
|
||||||
|
string ColorTokenTalk()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 240, 1) +
|
||||||
|
GetSubString(ColorArray, 240, 1) +
|
||||||
|
GetSubString(ColorArray, 240, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenTell()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// tells.
|
||||||
|
//
|
||||||
|
string ColorTokenTell()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 32, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 32, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ColorTokenWhisper()
|
||||||
|
//
|
||||||
|
// Supplies a string that changes the text to the color of
|
||||||
|
// whispers.
|
||||||
|
//
|
||||||
|
string ColorTokenWhisper()
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 128, 1) +
|
||||||
|
GetSubString(ColorArray, 128, 1) +
|
||||||
|
GetSubString(ColorArray, 128, 1) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Colored Name Functions
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// GetNamePCColor()
|
||||||
|
//
|
||||||
|
// Returns the name of oPC, surrounded by color tokens, so the color of
|
||||||
|
// the name is the lighter blue often used in NWN game engine messages.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
string GetNamePCColor(object oPC)
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 153, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) +
|
||||||
|
GetSubString(ColorArray, 255, 1) + ">" +
|
||||||
|
GetName(oPC) + "</c>";
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// GetNameNPCColor()
|
||||||
|
//
|
||||||
|
// Returns the name of oNPC, surrounded by color tokens, so the color of
|
||||||
|
// the name is the shade of purple often used in NWN game engine messages.
|
||||||
|
//
|
||||||
|
string GetNameNPCColor(object oNPC)
|
||||||
|
{
|
||||||
|
return "<c" + GetSubString(ColorArray, 204, 1) +
|
||||||
|
GetSubString(ColorArray, 153, 1) +
|
||||||
|
GetSubString(ColorArray, 204, 1) + ">" +
|
||||||
|
GetName(oNPC) + "</c>";
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check1.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check1.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check1.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check1.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 1);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check10.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check10.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check10.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check10.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 10);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check2.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check2.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check2.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check2.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 2);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check3.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check3.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check3.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check3.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 3);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check4.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check4.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check4.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check4.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 4);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check5.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check5.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check5.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check5.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 5);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check6.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check6.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check6.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check6.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 6);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check7.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check7.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check7.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check7.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 7);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check8.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check8.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check8.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check8.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 8);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_check9.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_check9.ncs
Normal file
Binary file not shown.
10
cep_blueprints/_hak/prc_add_sb/conv_check9.nss
Normal file
10
cep_blueprints/_hak/prc_add_sb/conv_check9.nss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
int iPageTotal = iTotalItems - (iPage * iPageLen);
|
||||||
|
|
||||||
|
return (iPageTotal >= 9);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_checknext.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_checknext.ncs
Normal file
Binary file not shown.
9
cep_blueprints/_hak/prc_add_sb/conv_checknext.nss
Normal file
9
cep_blueprints/_hak/prc_add_sb/conv_checknext.nss
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPageLen = 10;
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
int iTotalItems = GetLocalInt(oPC, "iConvTotal");
|
||||||
|
|
||||||
|
|
||||||
|
return (iTotalItems > ((iPage * iPageLen) + iPageLen));
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_checkprev.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_checkprev.ncs
Normal file
Binary file not shown.
6
cep_blueprints/_hak/prc_add_sb/conv_checkprev.nss
Normal file
6
cep_blueprints/_hak/prc_add_sb/conv_checkprev.nss
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
int StartingConditional()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
|
||||||
|
return (iPage != 0);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_clear.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_clear.ncs
Normal file
Binary file not shown.
9
cep_blueprints/_hak/prc_add_sb/conv_clear.nss
Normal file
9
cep_blueprints/_hak/prc_add_sb/conv_clear.nss
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = GetPCSpeaker();
|
||||||
|
|
||||||
|
DeleteLocalInt(oPC, "iConvPage");
|
||||||
|
DeleteLocalInt(oPC, "iConvChoice");
|
||||||
|
DeleteLocalString(oPC, "sConvScript");
|
||||||
|
DeleteLocalInt(oPC, "iConvTotal");
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_nextpage.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_nextpage.ncs
Normal file
Binary file not shown.
6
cep_blueprints/_hak/prc_add_sb/conv_nextpage.nss
Normal file
6
cep_blueprints/_hak/prc_add_sb/conv_nextpage.nss
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
void main()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
iPage++;
|
||||||
|
SetLocalInt(oPC, "iConvPage", iPage);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/conv_prevpage.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/conv_prevpage.ncs
Normal file
Binary file not shown.
6
cep_blueprints/_hak/prc_add_sb/conv_prevpage.nss
Normal file
6
cep_blueprints/_hak/prc_add_sb/conv_prevpage.nss
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
void main()
|
||||||
|
{ object oPC = GetPCSpeaker();
|
||||||
|
int iPage = GetLocalInt(oPC, "iConvPage");
|
||||||
|
iPage--;
|
||||||
|
SetLocalInt(oPC, "iConvPage", iPage);
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/craniumrathide.uti
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/craniumrathide.uti
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/crushingwalltrap.utp
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/crushingwalltrap.utp
Normal file
Binary file not shown.
BIN
cep_blueprints/_hak/prc_add_sb/cut_and_paste.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/cut_and_paste.ncs
Normal file
Binary file not shown.
12
cep_blueprints/_hak/prc_add_sb/cut_and_paste.nss
Normal file
12
cep_blueprints/_hak/prc_add_sb/cut_and_paste.nss
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/* paste the following in your OnActivateItem module event
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// *add: Social Pheno v2* \\
|
||||||
|
if(GetTag(oItem) == "TBIT_BANJO")
|
||||||
|
{
|
||||||
|
ExecuteScript("tbx0_banjo01",GetItemActivator());
|
||||||
|
}
|
||||||
|
// *end: Social Pheno v2* \\
|
||||||
|
|
||||||
|
|
BIN
cep_blueprints/_hak/prc_add_sb/cz_realtroll_sp.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/cz_realtroll_sp.ncs
Normal file
Binary file not shown.
285
cep_blueprints/_hak/prc_add_sb/cz_realtroll_sp.nss
Normal file
285
cep_blueprints/_hak/prc_add_sb/cz_realtroll_sp.nss
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
#include "x0_i0_anims"
|
||||||
|
// #include "x0_i0_walkway" - in x0_i0_anims
|
||||||
|
#include "x0_i0_treasure"
|
||||||
|
|
||||||
|
#include "x2_inc_switches"
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// ***** Spawn-In Conditions ***** //
|
||||||
|
|
||||||
|
// * REMOVE COMMENTS (// ) before the "Set..." functions to activate
|
||||||
|
// * them. Do NOT touch lines commented out with // *, those are
|
||||||
|
// * real comments for information.
|
||||||
|
|
||||||
|
// * This causes the creature to say a one-line greeting in their
|
||||||
|
// * conversation file upon perceiving the player. Put [NW_D2_GenCheck]
|
||||||
|
// * in the "Text Seen When" field of the greeting in the conversation
|
||||||
|
// * file. Don't attach any player responses.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION);
|
||||||
|
|
||||||
|
// * Same as above, but for hostile creatures to make them say
|
||||||
|
// * a line before attacking.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION);
|
||||||
|
|
||||||
|
// * This NPC will attack when its allies call for help
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SHOUT_ATTACK_MY_TARGET);
|
||||||
|
|
||||||
|
// * If the NPC has the Hide skill they will go into stealth mode
|
||||||
|
// * while doing WalkWayPoints().
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_STEALTH);
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Enable stealth mode by setting a variable on the creature
|
||||||
|
// Great for ambushes
|
||||||
|
// See x2_inc_switches for more information about this
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_STEALTH) == TRUE)
|
||||||
|
{
|
||||||
|
SetSpawnInCondition(NW_FLAG_STEALTH);
|
||||||
|
}
|
||||||
|
// * Same, but for Search mode
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SEARCH);
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Make creature enter search mode after spawning by setting a variable
|
||||||
|
// Great for guards, etc
|
||||||
|
// See x2_inc_switches for more information about this
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_SEARCH) == TRUE)
|
||||||
|
{
|
||||||
|
SetSpawnInCondition(NW_FLAG_SEARCH);
|
||||||
|
}
|
||||||
|
// * This will set the NPC to give a warning to non-enemies
|
||||||
|
// * before attacking.
|
||||||
|
// * NN -- no clue what this really does yet
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SET_WARNINGS);
|
||||||
|
|
||||||
|
// * Separate the NPC's waypoints into day & night.
|
||||||
|
// * See comment on WalkWayPoints() for use.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);
|
||||||
|
|
||||||
|
// * If this is set, the NPC will appear using the "EffectAppear"
|
||||||
|
// * animation instead of fading in, *IF* SetListeningPatterns()
|
||||||
|
// * is called below.
|
||||||
|
// *
|
||||||
|
//SetSpawnInCondition(NW_FLAG_APPEAR_SPAWN_IN_ANIMATION);
|
||||||
|
|
||||||
|
// * This will cause an NPC to use common animations it possesses,
|
||||||
|
// * and use social ones to any other nearby friendly NPCs.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Enable immobile ambient animations by setting a variable
|
||||||
|
// See x2_inc_switches for more information about this
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT_IMMOBILE) == TRUE)
|
||||||
|
{
|
||||||
|
SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
|
||||||
|
}
|
||||||
|
// * Same as above, except NPC will wander randomly around the
|
||||||
|
// * area.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Enable mobile ambient animations by setting a variable
|
||||||
|
// See x2_inc_switches for more information about this
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT) == TRUE)
|
||||||
|
{
|
||||||
|
SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);
|
||||||
|
}
|
||||||
|
// **** Animation Conditions **** //
|
||||||
|
// * These are extra conditions you can put on creatures with ambient
|
||||||
|
// * animations.
|
||||||
|
|
||||||
|
// * Civilized creatures interact with placeables in
|
||||||
|
// * their area that have the tag "NW_INTERACTIVE"
|
||||||
|
// * and "talk" to each other.
|
||||||
|
// *
|
||||||
|
// * Humanoid races are civilized by default, so only
|
||||||
|
// * set this flag for monster races that you want to
|
||||||
|
// * behave the same way.
|
||||||
|
// SetAnimationCondition(NW_ANIM_FLAG_IS_CIVILIZED);
|
||||||
|
|
||||||
|
// * If this flag is set, this creature will constantly
|
||||||
|
// * be acting. Otherwise, creatures will only start
|
||||||
|
// * performing their ambient animations when they
|
||||||
|
// * first perceive a player, and they will stop when
|
||||||
|
// * the player moves away.
|
||||||
|
// SetAnimationCondition(NW_ANIM_FLAG_CONSTANT);
|
||||||
|
|
||||||
|
// * Civilized creatures with this flag set will
|
||||||
|
// * randomly use a few voicechats. It's a good
|
||||||
|
// * idea to avoid putting this on multiple
|
||||||
|
// * creatures using the same voiceset.
|
||||||
|
// SetAnimationCondition(NW_ANIM_FLAG_CHATTER);
|
||||||
|
|
||||||
|
// * Creatures with _immobile_ ambient animations
|
||||||
|
// * can have this flag set to make them mobile in a
|
||||||
|
// * close range. They will never leave their immediate
|
||||||
|
// * area, but will move around in it, frequently
|
||||||
|
// * returning to their starting point.
|
||||||
|
// *
|
||||||
|
// * Note that creatures spawned inside interior areas
|
||||||
|
// * that contain a waypoint with one of the tags
|
||||||
|
// * "NW_HOME", "NW_TAVERN", "NW_SHOP" will automatically
|
||||||
|
// * have this condition set.
|
||||||
|
// SetAnimationCondition(NW_ANIM_FLAG_IS_MOBILE_CLOSE_RANGE);
|
||||||
|
|
||||||
|
|
||||||
|
// **** Special Combat Tactics *****//
|
||||||
|
// * These are special flags that can be set on creatures to
|
||||||
|
// * make them follow certain specialized combat tactics.
|
||||||
|
// * NOTE: ONLY ONE OF THESE SHOULD BE SET ON A SINGLE CREATURE.
|
||||||
|
|
||||||
|
// * Ranged attacker
|
||||||
|
// * Will attempt to stay at ranged distance from their
|
||||||
|
// * target.
|
||||||
|
// SetCombatCondition(X0_COMBAT_FLAG_RANGED);
|
||||||
|
|
||||||
|
// * Defensive attacker
|
||||||
|
// * Will use defensive combat feats and parry
|
||||||
|
// SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE);
|
||||||
|
|
||||||
|
// * Ambusher
|
||||||
|
// * Will go stealthy/invisible and attack, then
|
||||||
|
// * run away and try to go stealthy again before
|
||||||
|
// * attacking anew.
|
||||||
|
// SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER);
|
||||||
|
|
||||||
|
// * Cowardly
|
||||||
|
// * Cowardly creatures will attempt to flee
|
||||||
|
// * attackers.
|
||||||
|
// SetCombatCondition(X0_COMBAT_FLAG_COWARDLY);
|
||||||
|
|
||||||
|
|
||||||
|
// **** Escape Commands ***** //
|
||||||
|
// * NOTE: ONLY ONE OF THE FOLLOWING SHOULD EVER BE SET AT ONE TIME.
|
||||||
|
// * NOTE2: Not clear that these actually work. -- NN
|
||||||
|
|
||||||
|
// * Flee to a way point and return a short time later.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_ESCAPE_RETURN);
|
||||||
|
|
||||||
|
// * Flee to a way point and do not return.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_ESCAPE_LEAVE);
|
||||||
|
|
||||||
|
// * Teleport to safety and do not return.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_TELEPORT_LEAVE);
|
||||||
|
|
||||||
|
// * Teleport to safety and return a short time later.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_TELEPORT_RETURN);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ***** CUSTOM USER DEFINED EVENTS ***** /
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
If you uncomment any of these conditions, the creature will fire
|
||||||
|
a specific user-defined event number on each event. That will then
|
||||||
|
allow you to write custom code in the "OnUserDefinedEvent" handler
|
||||||
|
script to go on top of the default NPC behaviors for that event.
|
||||||
|
|
||||||
|
Example: I want to add some custom behavior to my NPC when they
|
||||||
|
are damaged. I uncomment the "NW_FLAG_DAMAGED_EVENT", then create
|
||||||
|
a new user-defined script that has something like this in it:
|
||||||
|
|
||||||
|
if (GetUserDefinedEventNumber() == 1006) {
|
||||||
|
// Custom code for my NPC to execute when it's damaged
|
||||||
|
}
|
||||||
|
|
||||||
|
These user-defined events are in the range 1001-1007.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1001 in the OnHeartbeat
|
||||||
|
// *
|
||||||
|
SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1002
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1005
|
||||||
|
// *
|
||||||
|
SetSpawnInCondition(NW_FLAG_ATTACK_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1006
|
||||||
|
// *
|
||||||
|
SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1008
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_DISTURBED_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1003
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1004
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);
|
||||||
|
|
||||||
|
SetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ***** DEFAULT GENERIC BEHAVIOR (DO NOT TOUCH) ***** //
|
||||||
|
|
||||||
|
// * Goes through and sets up which shouts the NPC will listen to.
|
||||||
|
// *
|
||||||
|
SetListeningPatterns();
|
||||||
|
|
||||||
|
// * Walk among a set of waypoints.
|
||||||
|
// * 1. Find waypoints with the tag "WP_" + NPC TAG + "_##" and walk
|
||||||
|
// * among them in order.
|
||||||
|
// * 2. If the tag of the Way Point is "POST_" + NPC TAG, stay there
|
||||||
|
// * and return to it after combat.
|
||||||
|
//
|
||||||
|
// * Optional Parameters:
|
||||||
|
// * void WalkWayPoints(int nRun = FALSE, float fPause = 1.0)
|
||||||
|
//
|
||||||
|
// * If "NW_FLAG_DAY_NIGHT_POSTING" is set above, you can also
|
||||||
|
// * create waypoints with the tags "WN_" + NPC Tag + "_##"
|
||||||
|
// * and those will be walked at night. (The standard waypoints
|
||||||
|
// * will be walked during the day.)
|
||||||
|
// * The night "posting" waypoint tag is simply "NIGHT_" + NPC tag.
|
||||||
|
WalkWayPoints();
|
||||||
|
SetImmortal(OBJECT_SELF,TRUE);
|
||||||
|
//* Create a small amount of treasure on the creature
|
||||||
|
if ((GetLocalInt(GetModule(), "X2_L_NOTREASURE") == FALSE) &&
|
||||||
|
(GetLocalInt(OBJECT_SELF, "X2_L_NOTREASURE") == FALSE) )
|
||||||
|
{
|
||||||
|
CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //
|
||||||
|
|
||||||
|
// * If Incorporeal, apply changes
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_IS_INCORPOREAL) == TRUE)
|
||||||
|
{
|
||||||
|
effect eConceal = EffectConcealment(50, MISS_CHANCE_TYPE_NORMAL);
|
||||||
|
eConceal = ExtraordinaryEffect(eConceal);
|
||||||
|
effect eGhost = EffectCutsceneGhost();
|
||||||
|
eGhost = ExtraordinaryEffect(eGhost);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eConceal, OBJECT_SELF);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/cz_realtroll_ud.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/cz_realtroll_ud.ncs
Normal file
Binary file not shown.
500
cep_blueprints/_hak/prc_add_sb/cz_realtroll_ud.nss
Normal file
500
cep_blueprints/_hak/prc_add_sb/cz_realtroll_ud.nss
Normal file
@ -0,0 +1,500 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Tz-Auber's Perfect Troll Regeneration Script 1.3
|
||||||
|
By: Tz-Auber
|
||||||
|
Last Modified: 9/23/03
|
||||||
|
Developed for: 1.30/SoU
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
This small script properly implements 3rd Edition subdual damage rules as it relates
|
||||||
|
to regeneration. Some of the highlighted features are:
|
||||||
|
- By using the SetImmortal function, feedback for the Troll's health is properly
|
||||||
|
displayed.
|
||||||
|
- Only uses OnHeartbeat and OnDamaged events. No messing with OnDeath and XP
|
||||||
|
calculations.
|
||||||
|
- Allows for quickly killing a downed Troll through a specified item (by default,
|
||||||
|
a torch item type equipped in the off-hand) or through SoU grenade type
|
||||||
|
weapons (Acid Flask and Alchemist Fire).
|
||||||
|
- A knockdown effect occurs when actual damage exceeds subdual damage, and it
|
||||||
|
also simulates attacking a prone opponent.
|
||||||
|
- Allows for automatic 3E Coup de Grace attempts if the Troll is down and the equipped
|
||||||
|
weapon is capable of doing permanent damage.
|
||||||
|
|
||||||
|
Modifications Required
|
||||||
|
----------------------
|
||||||
|
- This script must be placed in a creature's OnUserDefined event.
|
||||||
|
- The OnSpawn script must have the following SetSpawnInConditions uncommented/added:
|
||||||
|
- NW_FLAG_HEARTBEAT_EVENT
|
||||||
|
- NW_FLAG_DAMAGED_EVENT
|
||||||
|
- NW_FLAG_ATTACK_EVENT
|
||||||
|
- NW_FLAG_SPELL_CAST_AT_EVENT
|
||||||
|
- The following line must be added in the OnSpawn script at the end
|
||||||
|
- SetImmortal(OBJECT_SELF,TRUE);
|
||||||
|
- Remove the default Troll's regeneration property by removing it's hide from the
|
||||||
|
creature inventory (or remove the regeneration property if you want to keep
|
||||||
|
other hide properties).
|
||||||
|
|
||||||
|
Credits
|
||||||
|
-------
|
||||||
|
I want to thank U'lias, as I used his code for a basis and starting point
|
||||||
|
(creation date 12/29/02). His code can be found by searching the vault under
|
||||||
|
"Ulias' 3eMM D&D Style Trolls v1.3"
|
||||||
|
|
||||||
|
I would also like to thank El Magnifico Uno, one of the pioneers of Troll
|
||||||
|
regeneration code, who also provided useful critique in the development of this
|
||||||
|
work.
|
||||||
|
|
||||||
|
Version History
|
||||||
|
---------------
|
||||||
|
1.5 (8/3/06, Resonance)
|
||||||
|
* Making the full round burning uninterruptible can also glitch PCs so that
|
||||||
|
they are stuck until they relog, so remove that. PCs will still play the
|
||||||
|
bending over animation, and will still queue attacks until after that
|
||||||
|
finishes, but if they run, they can break out of the animation immediately
|
||||||
|
without problems.
|
||||||
|
|
||||||
|
1.4 (8/1/06, Resonance)
|
||||||
|
* Acid, Fire, and Death Magic spells now properly act like grenades
|
||||||
|
* Forcing the PCs to run to the target on Coup de Grace causes locks, so removed.
|
||||||
|
* Burning the body from melee still takes a full round
|
||||||
|
* Flame Weapon and Darkfire now make weapons count as torches
|
||||||
|
* There is no apparent way to get Flame Weapon/Darkfire damage to
|
||||||
|
actually count as fire damage, however -- it is always subdual.
|
||||||
|
* Coup de Grace damage is now cumulative for setting DC
|
||||||
|
* Factored out fire and acid death effect code
|
||||||
|
|
||||||
|
1.3 (9/23/03) - Found out that my code has just been released into the wilds of
|
||||||
|
a PW and have received a lot of useful feedback. New features added: support
|
||||||
|
for 3E Coup de Grace attempts and the use of Alchemist Fire and Acid Flasks
|
||||||
|
to fry a Troll in addition to the torch.
|
||||||
|
|
||||||
|
1.2 (9/22/03) - Hmm.. this was supposed to come sooner, but here it is. Changed
|
||||||
|
from a resref dependency of the burning item, to a base item type dependency.
|
||||||
|
So any BASE_ITEM_TORCH equipped in the off-hand should work regardless of
|
||||||
|
tags and resrefs. Finally added debug message considerations. I'll save
|
||||||
|
the final spell modifications when HotU comes out, but a small placeholder
|
||||||
|
is there in the meantime.
|
||||||
|
|
||||||
|
1.1 (7/24/03) - My implementation of subdual rules were a little messed up. I'm now
|
||||||
|
considering damage in excess of the limit of SetImmortal function. Also
|
||||||
|
added visual effect support for acid damaging weapons and tweaked with the
|
||||||
|
fire visual effects a little.
|
||||||
|
|
||||||
|
1.0 (7/21/03) - Initial Release
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Included for the RemoveSpecificEffect function
|
||||||
|
#include "nw_i0_spells"
|
||||||
|
|
||||||
|
// The amount of hitpoints (subdual damage) regenerated per round
|
||||||
|
const int REGENERATION_VALUE = 5;
|
||||||
|
|
||||||
|
// The time it takes (in full rounds) to burn a Troll
|
||||||
|
const int BURNING_TIME = 1;
|
||||||
|
|
||||||
|
// Switching debug messages on/off
|
||||||
|
const int DEBUG_OUTPUT = 0;
|
||||||
|
|
||||||
|
void BurnEffect()
|
||||||
|
{
|
||||||
|
CreateObject(OBJECT_TYPE_PLACEABLE, "plc_weathmark", GetLocation(OBJECT_SELF), TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find out if the weapon is burning from Flame Weapon or Darkfire
|
||||||
|
int GetIsBurning(object oItem)
|
||||||
|
{
|
||||||
|
// Start by checking to see if it's a torch
|
||||||
|
if(GetBaseItemType(oItem) == BASE_ITEM_TORCH) return TRUE;
|
||||||
|
|
||||||
|
// Now check for Flame Weapon or Darkfire
|
||||||
|
itemproperty ip = GetFirstItemProperty(oItem);
|
||||||
|
while (GetIsItemPropertyValid(ip))
|
||||||
|
{
|
||||||
|
if (GetItemPropertyType(ip) == ITEM_PROPERTY_ONHITCASTSPELL)
|
||||||
|
{
|
||||||
|
if (GetItemPropertySubType(ip) == 127) return TRUE; // Darkfire
|
||||||
|
if (GetItemPropertySubType(ip) == 124) return TRUE; // Flame Weapon
|
||||||
|
if (GetItemPropertySubType(ip) == 301) return TRUE; //Purist Burning Blade
|
||||||
|
}
|
||||||
|
ip = GetNextItemProperty(oItem);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Returns 0 if the spell does neither fire nor acid damage
|
||||||
|
// Returns 1 if the spell does acid damage
|
||||||
|
// Returns 2 if the spell does fire damage (or both fire and acid)
|
||||||
|
// Returns 3 if the spell is death magic
|
||||||
|
// Grenades are counted as spells
|
||||||
|
int IsAcidFireDeathSpell(int nSpellID)
|
||||||
|
{
|
||||||
|
int retval = 0; // Default to neither fire nor acid
|
||||||
|
|
||||||
|
switch(nSpellID)
|
||||||
|
{
|
||||||
|
// Check for acid spells
|
||||||
|
case SPELL_ACID_FOG:
|
||||||
|
case SPELL_ACID_SPLASH:
|
||||||
|
case SPELL_CLOUDKILL:
|
||||||
|
case SPELL_GRENADE_ACID:
|
||||||
|
case SPELL_MELFS_ACID_ARROW:
|
||||||
|
case SPELL_MESTILS_ACID_BREATH:
|
||||||
|
case SPELL_MESTILS_ACID_SHEATH:
|
||||||
|
case SPELL_STORM_OF_VENGEANCE:
|
||||||
|
retval = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Check for fire spells
|
||||||
|
// Flame Weapon/Darkfire from OnHit don't count?
|
||||||
|
case SPELL_BURNING_HANDS:
|
||||||
|
case SPELL_COMBUST:
|
||||||
|
case SPELL_DARKFIRE:
|
||||||
|
case SPELL_DELAYED_BLAST_FIREBALL:
|
||||||
|
case SPELL_EPIC_HELLBALL:
|
||||||
|
case SPELL_FIRE_STORM:
|
||||||
|
case SPELL_FIREBALL:
|
||||||
|
case SPELL_FIREBRAND:
|
||||||
|
case SPELL_FLAME_ARROW:
|
||||||
|
case SPELL_FLAME_LASH:
|
||||||
|
case SPELL_FLAME_STRIKE:
|
||||||
|
case SPELL_FLAME_WEAPON:
|
||||||
|
case SPELL_GRENADE_FIRE:
|
||||||
|
case SPELL_INCENDIARY_CLOUD:
|
||||||
|
case SPELL_INFERNO:
|
||||||
|
case SPELL_METEOR_SWARM:
|
||||||
|
case SPELL_SEARING_LIGHT:
|
||||||
|
case SPELL_SHADES_FIREBALL:
|
||||||
|
case SPELL_SHADES_WALL_OF_FIRE:
|
||||||
|
case SPELL_SUNBEAM:
|
||||||
|
case SPELL_SUNBURST:
|
||||||
|
retval = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Check for death magic
|
||||||
|
case SPELL_CIRCLE_OF_DEATH:
|
||||||
|
case SPELL_DESTRUCTION:
|
||||||
|
case SPELL_FINGER_OF_DEATH:
|
||||||
|
case SPELL_IMPLOSION:
|
||||||
|
case SPELL_POWER_WORD_KILL:
|
||||||
|
case SPELL_SLAY_LIVING:
|
||||||
|
case SPELL_WAIL_OF_THE_BANSHEE:
|
||||||
|
case SPELL_WORD_OF_FAITH:
|
||||||
|
retval = 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Troll death effect: fire damage
|
||||||
|
void FireDeathEffect(object oTroll)
|
||||||
|
{
|
||||||
|
effect eFlame = EffectVisualEffect(VFX_DUR_INFERNO_CHEST); //VFX_IMP_FLAME_M
|
||||||
|
DelayCommand(2.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eFlame, oTroll, 3.0));
|
||||||
|
DelayCommand(1.5, BurnEffect());
|
||||||
|
//object oFlame = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_flamemedium", GetLocation(oTroll), TRUE);
|
||||||
|
//DestroyObject(oFlame, 3.25);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Troll death effect: acid damage
|
||||||
|
void AcidDeathEffect(object oTroll)
|
||||||
|
{
|
||||||
|
effect eAcid = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_ACID);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eAcid, oTroll);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
int nUser = GetUserDefinedEventNumber();
|
||||||
|
|
||||||
|
if(nUser == EVENT_HEARTBEAT) // OnHeartbeat Event
|
||||||
|
{
|
||||||
|
// the Troll's cumulative Fire and Acid damage
|
||||||
|
int nPermanentDamage = GetLocalInt(OBJECT_SELF, "nPermanentDamage");;
|
||||||
|
// the Troll's original maximum hitpoints
|
||||||
|
int nOriginalHPs = GetMaxHitPoints(OBJECT_SELF);
|
||||||
|
// the Troll's current hitpoints
|
||||||
|
int nCurrentHPs = GetCurrentHitPoints(OBJECT_SELF);
|
||||||
|
// the Troll's excess damage
|
||||||
|
int nExcessDamage = GetLocalInt(OBJECT_SELF, "nExcessDamage");
|
||||||
|
|
||||||
|
// the maximum number of HPs that the Troll can possibly regenerate due
|
||||||
|
// to permanent fire or acid damage
|
||||||
|
int nMaxHPsPossible = nOriginalHPs - nPermanentDamage;
|
||||||
|
|
||||||
|
// Debug Stuff
|
||||||
|
if(DEBUG_OUTPUT)
|
||||||
|
{
|
||||||
|
SendMessageToPC(GetFirstPC(),"Current HPs = " + IntToString(nCurrentHPs));
|
||||||
|
SendMessageToPC(GetFirstPC(),"Subdual Damage = " + IntToString(nMaxHPsPossible - nCurrentHPs));
|
||||||
|
SendMessageToPC(GetFirstPC(),"Excess Damage = " + IntToString(nExcessDamage));
|
||||||
|
SendMessageToPC(GetFirstPC(),"Effective HPs = " + IntToString(nCurrentHPs - nExcessDamage));
|
||||||
|
SendMessageToPC(GetFirstPC(),"Max Possible HPs = " + IntToString(nMaxHPsPossible) + "/" + IntToString(nOriginalHPs));
|
||||||
|
SendMessageToPC(GetFirstPC(),"-----");
|
||||||
|
}
|
||||||
|
|
||||||
|
// the Troll may only regenerate if its current HPs are less than its
|
||||||
|
// maximum possible HPs left after fire and acid damage
|
||||||
|
if(nExcessDamage >= REGENERATION_VALUE)
|
||||||
|
{
|
||||||
|
nExcessDamage -= REGENERATION_VALUE;
|
||||||
|
SetLocalInt(OBJECT_SELF, "nExcessDamage", nExcessDamage);
|
||||||
|
}
|
||||||
|
else if(nExcessDamage > 0)
|
||||||
|
{
|
||||||
|
// regeneration effect (the excess difference)
|
||||||
|
effect eHeal = EffectHeal(REGENERATION_VALUE - nExcessDamage);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
|
||||||
|
|
||||||
|
nExcessDamage = 0;
|
||||||
|
SetLocalInt(OBJECT_SELF, "nExcessDamage", nExcessDamage);
|
||||||
|
}
|
||||||
|
else if (nCurrentHPs <= (nMaxHPsPossible - REGENERATION_VALUE))
|
||||||
|
{
|
||||||
|
// regeneration effect (5 HPs every round)
|
||||||
|
effect eHeal = EffectHeal(REGENERATION_VALUE);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
else if (nCurrentHPs <= nMaxHPsPossible)
|
||||||
|
{
|
||||||
|
// regeneration effect (the remainder of hitpoints)
|
||||||
|
effect eHeal = EffectHeal(nMaxHPsPossible - nCurrentHPs);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
|
||||||
|
// the Troll will now see if it can get up after it's latest beating
|
||||||
|
// provided that the Troll is grounded
|
||||||
|
effect eKnockdown = EffectKnockdown();
|
||||||
|
int bDowned = GetLocalInt(OBJECT_SELF,"bDowned");
|
||||||
|
// When current subdual damage is lower than current hit points
|
||||||
|
if (((nMaxHPsPossible - nCurrentHPs + nExcessDamage) < nMaxHPsPossible)&&(bDowned))
|
||||||
|
{
|
||||||
|
RemoveSpecificEffect(GetEffectType(eKnockdown),OBJECT_SELF);
|
||||||
|
SetLocalInt(OBJECT_SELF,"bDowned",0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(nUser == EVENT_DAMAGED) // OnDamaged Event
|
||||||
|
{
|
||||||
|
object oDamager = GetLastDamager();
|
||||||
|
|
||||||
|
// the Troll's cumulative Permanent damage
|
||||||
|
int nPermanentDamage = GetLocalInt(OBJECT_SELF, "nPermanentDamage");
|
||||||
|
// the Troll's current Fire damage newly received
|
||||||
|
int nFireDamage = GetDamageDealtByType(DAMAGE_TYPE_FIRE);
|
||||||
|
// the Troll's current Acid damage newly received
|
||||||
|
int nAcidDamage = GetDamageDealtByType(DAMAGE_TYPE_ACID);
|
||||||
|
// the rest of the damage inflicted on the Troll
|
||||||
|
int nOtherDamage = GetTotalDamageDealt() - nFireDamage - nAcidDamage;
|
||||||
|
// the Troll's excess damage
|
||||||
|
int nExcessDamage = GetLocalInt(OBJECT_SELF, "nExcessDamage");
|
||||||
|
// the Troll's coup de grace cumulative damage
|
||||||
|
int nCoupDamage = GetLocalInt(OBJECT_SELF, "nCoupDamage");
|
||||||
|
// the Troll's current hitpoints
|
||||||
|
int nCurrentHPs = GetCurrentHitPoints(OBJECT_SELF);
|
||||||
|
// the Troll's previous (newly inflicted HP value)
|
||||||
|
int nPrevHPs = GetLocalInt(OBJECT_SELF, "nPrevHPs");
|
||||||
|
// in case this is the first time the Troll is damaged
|
||||||
|
if(nPrevHPs == 0)
|
||||||
|
nPrevHPs = GetMaxHitPoints(OBJECT_SELF);
|
||||||
|
|
||||||
|
// if there is damage in excess of the previous hp value,
|
||||||
|
// excess damage will be updated
|
||||||
|
if(nOtherDamage > nPrevHPs)
|
||||||
|
nExcessDamage += (nOtherDamage - nPrevHPs);
|
||||||
|
|
||||||
|
// Now the excess damage and previous hit points will be updated
|
||||||
|
SetLocalInt(OBJECT_SELF,"nExcessDamage",nExcessDamage);
|
||||||
|
SetLocalInt(OBJECT_SELF,"nPrevHPs",nCurrentHPs);
|
||||||
|
|
||||||
|
// make sure Fire damage is not less than 0
|
||||||
|
if (nFireDamage < 0) nFireDamage = 0;
|
||||||
|
// make sure Acid damage is not less than 0
|
||||||
|
if (nAcidDamage < 0) nAcidDamage = 0;
|
||||||
|
|
||||||
|
// if the Troll suffered Fire damage
|
||||||
|
if (nFireDamage > 0)
|
||||||
|
{
|
||||||
|
// keep track of cumulative Fire damage
|
||||||
|
nPermanentDamage += nFireDamage;
|
||||||
|
// won't be counted as subdual damage
|
||||||
|
effect eHeal = EffectHeal(nFireDamage);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
// if the Troll suffered Acid damage
|
||||||
|
if (nAcidDamage > 0)
|
||||||
|
{
|
||||||
|
// keep track of cumulative Acid damage
|
||||||
|
nPermanentDamage += nAcidDamage;
|
||||||
|
// won't be counted as subdual damage
|
||||||
|
effect eHeal = EffectHeal(nAcidDamage);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the Permanent Damage
|
||||||
|
SetLocalInt(OBJECT_SELF,"nPermanentDamage",nPermanentDamage);
|
||||||
|
|
||||||
|
// the Troll's original maximum hitpoints
|
||||||
|
int nOriginalHPs = GetMaxHitPoints(OBJECT_SELF);
|
||||||
|
// the maximum number of HPs that the Troll can possibly regenerate due
|
||||||
|
// to permanent fire or acid damage
|
||||||
|
int nMaxHPsPossible = nOriginalHPs - nPermanentDamage;
|
||||||
|
|
||||||
|
// This part will simulate an unconscience effect via knockdown
|
||||||
|
// If the troll's subdual damage exceeds it's current hitpoints ...
|
||||||
|
effect eKnockdown = EffectKnockdown();
|
||||||
|
int bDowned = GetLocalInt(OBJECT_SELF,"bDowned");
|
||||||
|
// When current subdual damage is higher than current hit points
|
||||||
|
if ((nMaxHPsPossible < (nMaxHPsPossible - nCurrentHPs + nExcessDamage))&&(!bDowned))
|
||||||
|
{
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eKnockdown,OBJECT_SELF);
|
||||||
|
bDowned = 1;
|
||||||
|
SetLocalInt(OBJECT_SELF,"bDowned",bDowned);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now let's check and see if the troll has attained final death
|
||||||
|
// First we'll check whether someone is carefully burning the body
|
||||||
|
// (will take a full round to perform)
|
||||||
|
object oLeftHandItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oDamager);
|
||||||
|
object oRightHandItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oDamager);
|
||||||
|
|
||||||
|
if( bDowned && (GetIsBurning(oLeftHandItem) || GetIsBurning(oRightHandItem)) )
|
||||||
|
{
|
||||||
|
// DelayCommand(0.2,SetCommandable(FALSE,oDamager));
|
||||||
|
AssignCommand(oDamager, ClearAllActions());
|
||||||
|
AssignCommand(oDamager, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, RoundsToSeconds(BURNING_TIME)));
|
||||||
|
// AssignCommand(oDamager, ActionDoCommand(SetCommandable(TRUE,oDamager)));
|
||||||
|
FireDeathEffect(OBJECT_SELF);
|
||||||
|
effect eDeath = EffectDeath();
|
||||||
|
SetImmortal(OBJECT_SELF,FALSE);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
else if( bDowned && (GetLocalInt(oDamager, "VAR_IGNITESPELL") == 1))
|
||||||
|
{
|
||||||
|
// DelayCommand(0.2,SetCommandable(FALSE,oDamager));
|
||||||
|
AssignCommand(oDamager, ClearAllActions());
|
||||||
|
AssignCommand(oDamager, ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP, 0.8, RoundsToSeconds(BURNING_TIME)));
|
||||||
|
// AssignCommand(oDamager, ActionDoCommand(SetCommandable(TRUE,oDamager)));
|
||||||
|
FireDeathEffect(OBJECT_SELF);
|
||||||
|
effect eDeath = EffectDeath();
|
||||||
|
SetImmortal(OBJECT_SELF,FALSE);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
// Now let's check and see if the damager is capable of performing a
|
||||||
|
// Coup de Grace attempt, and if so they will automatically perform one.
|
||||||
|
// The Troll's save will be Fortitude of DC 10 + Permanent Damage dealt.
|
||||||
|
else if (GetLocalInt(OBJECT_SELF,"bCoupdeGrace") && !GetLocalInt(OBJECT_SELF,"bGrenade")
|
||||||
|
&& (nFireDamage || nAcidDamage) && bDowned)
|
||||||
|
{
|
||||||
|
DeleteLocalInt(OBJECT_SELF,"bCoupdeGrace");
|
||||||
|
object eSelf = OBJECT_SELF;
|
||||||
|
location lSelf = GetLocation(eSelf);
|
||||||
|
|
||||||
|
// DelayCommand(0.2,SetCommandable(FALSE,oDamager));
|
||||||
|
// AssignCommand(oDamager, ClearAllActions());
|
||||||
|
// AssignCommand(oDamager, ActionMoveToObject(eSelf,TRUE,0.1));
|
||||||
|
// AssignCommand(oDamager, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 4.5));
|
||||||
|
// //AssignCommand(oDamager, ActionDoCommand(SetCommandable(TRUE,oDamager)));
|
||||||
|
|
||||||
|
nCoupDamage = nCoupDamage + nFireDamage + nAcidDamage;
|
||||||
|
if(!FortitudeSave(OBJECT_SELF,10 + nCoupDamage,
|
||||||
|
SAVING_THROW_TYPE_ALL, oDamager))
|
||||||
|
{
|
||||||
|
effect eBlood = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
|
||||||
|
|
||||||
|
// AssignCommand(oDamager, ActionDoCommand(ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eBlood, lSelf)));
|
||||||
|
// AssignCommand(oDamager, ActionDoCommand(SetCommandable(TRUE,oDamager)));
|
||||||
|
|
||||||
|
FloatingTextStringOnCreature("Coup de Grace (success)",oDamager);
|
||||||
|
|
||||||
|
// Fire will be favored over acid in the event they are equal
|
||||||
|
if(nFireDamage >= nAcidDamage)
|
||||||
|
{
|
||||||
|
FireDeathEffect(OBJECT_SELF);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AcidDeathEffect(OBJECT_SELF);
|
||||||
|
}
|
||||||
|
effect eDeath = EffectDeath();
|
||||||
|
SetImmortal(OBJECT_SELF,FALSE);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
else // Fort save succeeded, store cumulative coup damage
|
||||||
|
{
|
||||||
|
// AssignCommand(oDamager, ActionDoCommand(SetCommandable(TRUE,oDamager)));
|
||||||
|
SetLocalInt(OBJECT_SELF, "nCoupDamage", nCoupDamage);
|
||||||
|
FloatingTextStringOnCreature("Coup de Grace (failure)",oDamager);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ... or if it took damage the old fashioned way ...
|
||||||
|
// (i.e. all hitpoints exhausted due to fire and/or acid)
|
||||||
|
else if (nMaxHPsPossible <= 0)
|
||||||
|
{
|
||||||
|
SetImmortal(OBJECT_SELF,FALSE);
|
||||||
|
// Fire will be favored over acid in the event they are equal
|
||||||
|
if(nFireDamage >= nAcidDamage)
|
||||||
|
{
|
||||||
|
FireDeathEffect(OBJECT_SELF);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AcidDeathEffect(OBJECT_SELF);
|
||||||
|
}
|
||||||
|
effect eDeath = EffectDeath();
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(nUser == EVENT_SPELL_CAST_AT) // OnSpellCastAt Event
|
||||||
|
{
|
||||||
|
int nSpellID = GetLastSpell();
|
||||||
|
int nAcidFireDeath = IsAcidFireDeathSpell(nSpellID);
|
||||||
|
|
||||||
|
object oCaster = GetLastSpellCaster();
|
||||||
|
|
||||||
|
// Will consider all instant death effects, acid and fire damage from
|
||||||
|
// both spells and grenades
|
||||||
|
if(GetLastSpellHarmful())
|
||||||
|
{
|
||||||
|
if(GetLocalInt(OBJECT_SELF,"bDowned") && nAcidFireDeath)
|
||||||
|
{
|
||||||
|
SetLocalInt(OBJECT_SELF,"bGrenade",1);
|
||||||
|
object eSelf = OBJECT_SELF;
|
||||||
|
|
||||||
|
// DelayCommand(0.2,SetCommandable(FALSE,oCaster));
|
||||||
|
// AssignCommand(oCaster, ClearAllActions());
|
||||||
|
// AssignCommand(oCaster, ActionMoveToObject(eSelf,TRUE,0.1));
|
||||||
|
// AssignCommand(oCaster, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, RoundsToSeconds(BURNING_TIME)));
|
||||||
|
// AssignCommand(oCaster, ActionDoCommand(SetCommandable(TRUE,oCaster)));
|
||||||
|
|
||||||
|
if(nAcidFireDeath == 2)
|
||||||
|
{
|
||||||
|
FireDeathEffect(OBJECT_SELF);
|
||||||
|
}
|
||||||
|
else if(nAcidFireDeath == 1)
|
||||||
|
{
|
||||||
|
AcidDeathEffect(OBJECT_SELF);
|
||||||
|
}
|
||||||
|
effect eDeath = EffectDeath();
|
||||||
|
SetImmortal(OBJECT_SELF,FALSE);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Will consider all healing effects
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(nUser == EVENT_ATTACKED) // OnPhysicalAttacked Event
|
||||||
|
{
|
||||||
|
if(GetLocalInt(OBJECT_SELF,"bDowned"))
|
||||||
|
{
|
||||||
|
SetLocalInt(OBJECT_SELF,"bCoupdeGrace",1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
BIN
cep_blueprints/_hak/prc_add_sb/df_t0_camopita.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/df_t0_camopita.ncs
Normal file
Binary file not shown.
52
cep_blueprints/_hak/prc_add_sb/df_t0_camopita.nss
Normal file
52
cep_blueprints/_hak/prc_add_sb/df_t0_camopita.nss
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
//File name: df_t0_camopita
|
||||||
|
//Description: Scrips for use with CEP pit traps.
|
||||||
|
|
||||||
|
#include "zep_inc_scrptdlg"
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = GetEnteringObject();
|
||||||
|
|
||||||
|
//Now we make them fall in the hole.
|
||||||
|
|
||||||
|
int nDC;
|
||||||
|
int nDamage;
|
||||||
|
object oTrap = GetAreaOfEffectCreator(OBJECT_SELF);
|
||||||
|
string sTag = GetTag(oTrap);
|
||||||
|
|
||||||
|
nDamage =d6(1);
|
||||||
|
if(GetTrapDetectedBy(oTrap,oPC))
|
||||||
|
nDC = 10;
|
||||||
|
else
|
||||||
|
nDC = 25;
|
||||||
|
|
||||||
|
string sMessageToPC;
|
||||||
|
|
||||||
|
if(ReflexSave(oPC, nDC, SAVING_THROW_TYPE_TRAP))
|
||||||
|
{
|
||||||
|
sMessageToPC=GetStringByStrRef(nZEPPitJump,GENDER_MALE);
|
||||||
|
SendMessageToPC(oPC,sMessageToPC);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_IMP_REFLEX_SAVE_THROW_USE), oPC);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sMessageToPC=GetStringByStrRef(nZEPPitFall,GENDER_MALE);
|
||||||
|
SendMessageToPC(oPC,sMessageToPC);
|
||||||
|
AssignCommand(oPC,PlaySound("cb_ht_fleshston2"));
|
||||||
|
PlayVoiceChat(VOICE_CHAT_PAIN3,oPC);
|
||||||
|
if(GetCurrentHitPoints(oPC)-nDamage>0)
|
||||||
|
{
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDisappearAppear(GetLocation(oPC)), oPC, 30.0f);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectParalyze(), oPC, 30.0f);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_NORMAL), oPC);
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), GetLocation(oPC));
|
||||||
|
sMessageToPC=GetStringByStrRef(nZEPPitClimb,GENDER_MALE);
|
||||||
|
DelayCommand(30.0,SendMessageToPC(oPC,sMessageToPC));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_NORMAL), oPC);
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), GetLocation(oPC));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/df_t0_deeppita.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/df_t0_deeppita.ncs
Normal file
Binary file not shown.
52
cep_blueprints/_hak/prc_add_sb/df_t0_deeppita.nss
Normal file
52
cep_blueprints/_hak/prc_add_sb/df_t0_deeppita.nss
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
//File name: df_t0_deeppita
|
||||||
|
//Usage: Scripts for use with CEP Deep pit trap.
|
||||||
|
|
||||||
|
#include "zep_inc_scrptdlg"
|
||||||
|
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = GetEnteringObject();
|
||||||
|
|
||||||
|
//Now we make them fall in the hole.
|
||||||
|
|
||||||
|
int nDC;
|
||||||
|
int nDamage;
|
||||||
|
object oTrap = GetAreaOfEffectCreator(OBJECT_SELF);
|
||||||
|
string sTag = GetTag(oTrap);
|
||||||
|
|
||||||
|
nDamage =d6(2);
|
||||||
|
if(GetTrapDetectedBy(oTrap,oPC))
|
||||||
|
nDC = 10;
|
||||||
|
else
|
||||||
|
nDC = 15;
|
||||||
|
string sMessageToPC;
|
||||||
|
|
||||||
|
if(ReflexSave(oPC, nDC, SAVING_THROW_TYPE_TRAP))
|
||||||
|
{
|
||||||
|
sMessageToPC=GetStringByStrRef(nZEPPitJump,GENDER_MALE);
|
||||||
|
SendMessageToPC(oPC,sMessageToPC);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_IMP_REFLEX_SAVE_THROW_USE), oPC);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sMessageToPC=GetStringByStrRef(nZEPPitFall,GENDER_MALE);
|
||||||
|
SendMessageToPC(oPC,sMessageToPC);
|
||||||
|
AssignCommand(oPC,PlaySound("cb_ht_fleshston2"));
|
||||||
|
PlayVoiceChat(VOICE_CHAT_PAIN3,oPC);
|
||||||
|
if(GetCurrentHitPoints(oPC)-nDamage>0)
|
||||||
|
{
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectDisappearAppear(GetLocation(oPC)), oPC, 30.0f);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectParalyze(), oPC, 30.0f);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_NORMAL), oPC);
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), GetLocation(oPC));
|
||||||
|
sMessageToPC=GetStringByStrRef(nZEPPitClimb,GENDER_MALE);
|
||||||
|
DelayCommand(30.0,SendMessageToPC(oPC,sMessageToPC));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_NORMAL), oPC);
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SMOKE_PUFF), GetLocation(oPC));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/df_t0_whirlbldc.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/df_t0_whirlbldc.ncs
Normal file
Binary file not shown.
81
cep_blueprints/_hak/prc_add_sb/df_t0_whirlbldc.nss
Normal file
81
cep_blueprints/_hak/prc_add_sb/df_t0_whirlbldc.nss
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
void TrapPlayAnim(object oTrap)
|
||||||
|
{
|
||||||
|
AssignCommand(oTrap, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ResetWhirlingBlades()
|
||||||
|
{
|
||||||
|
object oTrap = GetLocalObject(OBJECT_SELF,"TRP_TRP");
|
||||||
|
|
||||||
|
DeleteLocalInt(oTrap,"TRP_TRIGGERED");
|
||||||
|
PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
|
||||||
|
DestroyObject(OBJECT_SELF);
|
||||||
|
if(GetIsObjectValid(oTrap))
|
||||||
|
{
|
||||||
|
DeleteLocalInt(oTrap,"TRP_TRP");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
if(GetLocalInt(OBJECT_SELF,"TRP_TRIGGERED"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetLocalInt(OBJECT_SELF,"TRP_TRIGGERED",1);
|
||||||
|
|
||||||
|
|
||||||
|
object oTrap;
|
||||||
|
|
||||||
|
if(GetLocalInt(OBJECT_SELF,"TRP_PLCBL_SHOW")==0)
|
||||||
|
{
|
||||||
|
location lPlcbl = GetLocalLocation(OBJECT_SELF,"TRP_PLCBL_LOC");
|
||||||
|
SetLocalInt(OBJECT_SELF,"TRP_PLCBL_SHOW",1);
|
||||||
|
oTrap = CreateObject(OBJECT_TYPE_PLACEABLE,"whirlbladepcbl",lPlcbl);
|
||||||
|
SetLocalObject(OBJECT_SELF,"TRP_PLCBL_OBJ",oTrap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
oTrap = GetLocalObject(OBJECT_SELF,"TRP_PLCBL_OBJ");
|
||||||
|
|
||||||
|
AssignCommand(oTrap,DelayCommand(1.0,TrapPlayAnim(oTrap)));
|
||||||
|
AssignCommand(oTrap,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,EffectAreaOfEffect(40),GetLocation(oTrap),120.0));
|
||||||
|
AssignCommand(oTrap,DelayCommand(120.0, ResetWhirlingBlades()));
|
||||||
|
object oThis = OBJECT_SELF;
|
||||||
|
SetLocalObject(oTrap, "TRP_TRP", oThis);
|
||||||
|
|
||||||
|
|
||||||
|
int nDC;
|
||||||
|
int nDamage;
|
||||||
|
string sTag = GetTag(oTrap);
|
||||||
|
|
||||||
|
object oPC = GetFirstObjectInShape(SHAPE_SPHERE,5.0,GetLocation(oTrap));
|
||||||
|
while(GetIsObjectValid(oPC))
|
||||||
|
{
|
||||||
|
nDamage = d4(2)+4;
|
||||||
|
nDC = 20;
|
||||||
|
if(!ReflexSave(oPC, nDC, SAVING_THROW_TYPE_TRAP))
|
||||||
|
{
|
||||||
|
if (GetHasFeat(FEAT_IMPROVED_EVASION, oPC))
|
||||||
|
{
|
||||||
|
nDamage /= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (GetHasFeat(FEAT_EVASION, oPC) || GetHasFeat(FEAT_IMPROVED_EVASION, oPC))
|
||||||
|
{
|
||||||
|
nDamage = 0;
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_IMP_REFLEX_SAVE_THROW_USE), oPC);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nDamage /= 2;
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_IMP_REFLEX_SAVE_THROW_USE), oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(nDamage>0)
|
||||||
|
{
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_SLASHING, DAMAGE_POWER_NORMAL), oPC);
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_BLOOD_CRT_RED), GetLocation(oPC));
|
||||||
|
}
|
||||||
|
oPC = GetNextObjectInShape(SHAPE_SPHERE,5.0,GetLocation(oTrap));
|
||||||
|
}
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/df_t1_bricks.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/df_t1_bricks.ncs
Normal file
Binary file not shown.
73
cep_blueprints/_hak/prc_add_sb/df_t1_bricks.nss
Normal file
73
cep_blueprints/_hak/prc_add_sb/df_t1_bricks.nss
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
void TrapPlayAnim(object oTrap)
|
||||||
|
{
|
||||||
|
AssignCommand(oTrap, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
|
||||||
|
}
|
||||||
|
|
||||||
|
void FallingBrickHitPC(object oPC, int nDamage)
|
||||||
|
{
|
||||||
|
object oTrap = GetLocalObject(OBJECT_SELF,"TRP_PLCBL_OBJ");
|
||||||
|
PlayVoiceChat(VOICE_CHAT_PAIN2,oPC);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_COM_BLOOD_CRT_RED), oPC);
|
||||||
|
AssignCommand(oTrap,ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_NORMAL), oPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
int TrapSave(object oPC, int nDC, int nDamage)
|
||||||
|
{
|
||||||
|
if(!ReflexSave(oPC, nDC, SAVING_THROW_TYPE_TRAP))
|
||||||
|
{
|
||||||
|
if (GetHasFeat(FEAT_IMPROVED_EVASION, oPC))
|
||||||
|
nDamage /= 2;
|
||||||
|
}
|
||||||
|
else if (GetHasFeat(FEAT_EVASION, oPC) || GetHasFeat(FEAT_IMPROVED_EVASION, oPC))
|
||||||
|
{
|
||||||
|
nDamage = 0;
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect( VFX_IMP_REFLEX_SAVE_THROW_USE), oPC);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nDamage /= 2;
|
||||||
|
|
||||||
|
return nDamage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
if(GetLocalInt(OBJECT_SELF,"TRP_TRIGGERED"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetLocalInt(OBJECT_SELF,"TRP_TRIGGERED",1);
|
||||||
|
|
||||||
|
|
||||||
|
object oTrap;
|
||||||
|
|
||||||
|
if(GetLocalInt(OBJECT_SELF,"TRP_PLCBL_SHOW")==0)
|
||||||
|
{
|
||||||
|
location lPlcbl = GetLocalLocation(OBJECT_SELF,"TRP_PLCBL_LOC");
|
||||||
|
SetLocalInt(OBJECT_SELF,"TRP_PLCBL_SHOW",1);
|
||||||
|
oTrap = CreateObject(OBJECT_TYPE_PLACEABLE,"fallingbrickpcbl",lPlcbl);
|
||||||
|
SetLocalObject(OBJECT_SELF,"TRP_PLCBL_OBJ",oTrap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
oTrap = GetLocalObject(OBJECT_SELF,"TRP_PLCBL_OBJ");
|
||||||
|
|
||||||
|
|
||||||
|
AssignCommand(oTrap,DelayCommand(1.0,TrapPlayAnim(oTrap)));
|
||||||
|
|
||||||
|
int nDC = 15;
|
||||||
|
object oPC = GetNearestObject(OBJECT_TYPE_CREATURE, oTrap);
|
||||||
|
AssignCommand(oPC, PlaySound("as_na_rockfallg1"));//cb_bu_stonelg
|
||||||
|
int nDamage,nN;
|
||||||
|
while(GetIsObjectValid(oPC)&&(GetDistanceBetween(oTrap,oPC)<2.0))
|
||||||
|
{
|
||||||
|
nDamage = d6(2);
|
||||||
|
|
||||||
|
nDamage = TrapSave(oPC, nDC, nDamage);
|
||||||
|
|
||||||
|
if(nDamage>0)
|
||||||
|
{
|
||||||
|
DelayCommand(1.1,FallingBrickHitPC(oPC,nDamage));
|
||||||
|
}
|
||||||
|
|
||||||
|
nN++;
|
||||||
|
oPC = GetNearestObject(OBJECT_TYPE_CREATURE, oTrap, nN);
|
||||||
|
}
|
||||||
|
}
|
BIN
cep_blueprints/_hak/prc_add_sb/df_t1_camopit.ncs
Normal file
BIN
cep_blueprints/_hak/prc_add_sb/df_t1_camopit.ncs
Normal file
Binary file not shown.
18
cep_blueprints/_hak/prc_add_sb/df_t1_camopit.nss
Normal file
18
cep_blueprints/_hak/prc_add_sb/df_t1_camopit.nss
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
void TrapPlayAnim(object oTrap)
|
||||||
|
{
|
||||||
|
AssignCommand(oTrap, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
if(GetLocalInt(OBJECT_SELF,"TRP_TRIGGERED"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
SetLocalInt(OBJECT_SELF,"TRP_TRIGGERED",1);
|
||||||
|
|
||||||
|
object oTrap = GetLocalObject(OBJECT_SELF,"TRP_PLCBL_OBJ");
|
||||||
|
|
||||||
|
TrapPlayAnim(oTrap);
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,EffectAreaOfEffect(38),GetLocation(oTrap),HoursToSeconds(200));
|
||||||
|
return;
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user