606 lines
17 KiB
Plaintext
606 lines
17 KiB
Plaintext
#include "mn_i_pcskin"
|
|
#include "mn_i_pwfunctions"
|
|
#include "prc_inc_skin"
|
|
|
|
// void main(){}
|
|
// Used for neccessary initializations of entering PC
|
|
void handleEnteringPC(object oPC);
|
|
|
|
string generateID()
|
|
{
|
|
int id;
|
|
|
|
id = GetCampaignInt("mn_cids", "cid");
|
|
id++;
|
|
SetCampaignInt("mn_cids", "cid", id);
|
|
|
|
return IntToString(id);
|
|
}
|
|
|
|
void setupJournal(object oPC)
|
|
{
|
|
if (GetIsDM(oPC))
|
|
{
|
|
// Add instructions (dm tools) and rules references.
|
|
AddJournalQuestEntry( "info_dm", 1, oPC, FALSE, FALSE, TRUE );
|
|
AddJournalQuestEntry( "info_guidelines", 1, oPC, FALSE, FALSE, TRUE );
|
|
AddJournalQuestEntry( "info_rules", 1, oPC, FALSE, FALSE, TRUE );
|
|
AddJournalQuestEntry( "info_spells", 1, oPC, FALSE, FALSE, TRUE );
|
|
}
|
|
else
|
|
{
|
|
// Add complete rules references and latest news.
|
|
AddJournalQuestEntry( "info_chars", 1, oPC, FALSE, FALSE, TRUE );
|
|
AddJournalQuestEntry( "info_new", 1, oPC, FALSE, FALSE, TRUE );
|
|
AddJournalQuestEntry( "info_guidelines", 1, oPC, FALSE, FALSE, TRUE );
|
|
AddJournalQuestEntry( "info_rules", 1, oPC, FALSE, FALSE, TRUE );
|
|
AddJournalQuestEntry( "info_spells", 1, oPC, FALSE, FALSE, TRUE );
|
|
|
|
// Add persistant quests
|
|
// TODO: Move to java, this is highly inefficient
|
|
/*
|
|
string questID;
|
|
int i;
|
|
|
|
questID = "quest_0001";
|
|
i = GetQuestStatus(oPC, questID);
|
|
if (i != QUEST_UNKNOWN)
|
|
{
|
|
AddJournalQuestEntry( questID, i, oPC, FALSE, FALSE, TRUE);
|
|
}
|
|
|
|
questID = "quest_0002";
|
|
i = GetQuestStatus(oPC, questID);
|
|
if (i != QUEST_UNKNOWN)
|
|
{
|
|
AddJournalQuestEntry( questID, i, oPC, FALSE, FALSE, TRUE);
|
|
}
|
|
|
|
questID = "quest_0015";
|
|
i = GetQuestStatus(oPC, questID);
|
|
if (i != QUEST_UNKNOWN)
|
|
{
|
|
AddJournalQuestEntry( questID, i, oPC, FALSE, FALSE, TRUE);
|
|
}
|
|
|
|
questID = "quest_0016";
|
|
i = GetQuestStatus(oPC, questID);
|
|
if (i != QUEST_UNKNOWN)
|
|
{
|
|
AddJournalQuestEntry( questID, i, oPC, FALSE, FALSE, TRUE);
|
|
}
|
|
*/
|
|
}
|
|
}
|
|
|
|
void giveDMTools(object oPC)
|
|
{
|
|
if (GetIsDM(oPC))
|
|
{
|
|
}
|
|
}
|
|
|
|
void setupLocalVariables(object oPC)
|
|
{
|
|
// Add teleport blocking here also
|
|
|
|
// Setup id
|
|
object serverToken = GetItemPossessedBy( oPC, "MN_SERVERTOKEN" );
|
|
string charid = GetLocalString( serverToken, "cid" );
|
|
SetLocalString( oPC, "cid", charid );
|
|
|
|
// Class blockers
|
|
/*
|
|
// Tjek om Palemaster skal blokeres
|
|
if ( GetLevelByClass( CLASS_TYPE_PALEMASTER, oPC ) >= 9 ||
|
|
GetLevelByClass( CLASS_TYPE_PALE_MASTER, oPC ) >= 9 )
|
|
{
|
|
SetLocalInt( oPC, "X2_AllowPalema", 1 );
|
|
}
|
|
else
|
|
{
|
|
DeleteLocalInt( oPC, "X2_AllowPalema" );
|
|
}
|
|
*/
|
|
|
|
// Bloker Shifter
|
|
SetLocalInt( oPC, "X2_AllowShiftr", 1 );
|
|
|
|
// Bloker Palemaster
|
|
SetLocalInt( oPC, "X2_AllowPalema", 1 );
|
|
|
|
// Bloker Shadowdancer
|
|
SetLocalInt( oPC, "X1_AllowShadow", 1 );
|
|
}
|
|
|
|
void assignStartingEquipment(object oPC, string chosenClothes = "")
|
|
{
|
|
int class = GetClassByPosition(1, oPC);
|
|
|
|
// Clothes
|
|
if (chosenClothes == "")
|
|
{
|
|
chosenClothes = "nw_cloth022";
|
|
}
|
|
object clothes = CreateItemOnObject(chosenClothes, oPC);
|
|
AssignCommand(oPC,ActionEquipItem(clothes,INVENTORY_SLOT_CHEST));
|
|
|
|
// Assign class based equipment
|
|
switch (class)
|
|
{
|
|
case CLASS_TYPE_BARBARIAN:
|
|
// Weapon
|
|
CreateItemOnObject("nw_waxhn001", oPC); // Hand Axe
|
|
// Armor
|
|
CreateItemOnObject("nw_aarcl008", oPC); // Hide Armor
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 20);
|
|
break;
|
|
|
|
case CLASS_TYPE_BARD:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wswdg001", oPC); // Dagger
|
|
CreateItemOnObject("nw_wbwxl001", oPC); // Light Crossbow
|
|
CreateItemOnObject("nw_wambo001", oPC, 99); // 99 Bolts
|
|
// Armor
|
|
CreateItemOnObject("nw_aarcl001", oPC); // Leather Armor
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
CreateItemOnObject("nw_it_sparscr109", oPC); // Scroll Magic Missile
|
|
CreateItemOnObject("nw_it_sparscr108", oPC); // Scroll Sleep
|
|
CreateItemOnObject("nw_it_sparscr102", oPC); // Scroll Prot. from Alignment
|
|
CreateItemOnObject("nw_it_sparscr105", oPC); // Scroll Summon Creature 1
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 100);
|
|
break;
|
|
|
|
case CLASS_TYPE_CLERIC:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wblml001", oPC); // Mace
|
|
// Armor
|
|
CreateItemOnObject("nw_aarcl002", oPC); // Studded Leather Armor
|
|
CreateItemOnObject("nw_aarcl002", oPC); // Small Shield
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 75);
|
|
break;
|
|
|
|
case CLASS_TYPE_DRUID:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wspsc001", oPC); // Sickle
|
|
// Armor
|
|
CreateItemOnObject("nw_aarcl001", oPC); // Leather Armor
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 50);
|
|
break;
|
|
|
|
case CLASS_TYPE_FIGHTER:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wswss001", oPC); // Short Sword
|
|
// Armor
|
|
CreateItemOnObject("nw_aarcl002", oPC); // Studded Leather Armor
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 50);
|
|
break;
|
|
|
|
case CLASS_TYPE_MONK:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wspka001", oPC); // Kama
|
|
// Armor
|
|
CreateItemOnObject("nw_cl0th016", oPC); // Monk's Outfit
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 20);
|
|
break;
|
|
|
|
case CLASS_TYPE_PALADIN:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wswss001", oPC); // Short Sword
|
|
// Armor
|
|
CreateItemOnObject("nw_aarcl002", oPC); // Studded Leather Armor
|
|
CreateItemOnObject("nw_arhe001", oPC); // Pot Helmet
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 50);
|
|
break;
|
|
|
|
case CLASS_TYPE_RANGER:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wswdg001", oPC); // Dagger
|
|
CreateItemOnObject("nw_wswls001", oPC); // Long Sword
|
|
CreateItemOnObject("nw_wswss001", oPC); // Short Bow
|
|
CreateItemOnObject("nw_wamar001", oPC, 99); // 99 Arrows
|
|
// Armor
|
|
CreateItemOnObject("nw_aarcl001", oPC); // Leather Armor
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 50);
|
|
break;
|
|
|
|
case CLASS_TYPE_ROGUE:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wswss001", oPC); // Short Sword
|
|
CreateItemOnObject("nw_wswdg001", oPC); // Dagger
|
|
// Armor
|
|
CreateItemOnObject("nw_aarcl001", oPC); // Leather Armor
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_picks001", oPC); // Thieves Tools +1
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 100);
|
|
break;
|
|
|
|
case CLASS_TYPE_SORCERER:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wswdg001", oPC); // Dagger
|
|
CreateItemOnObject("nw_wbwxl001", oPC); // Light Crossbow
|
|
CreateItemOnObject("nw_wambo001", oPC); // 99 Bolts
|
|
// Armor
|
|
CreateItemOnObject("nw_cl0th008", oPC); // Sorcerer's Robe
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
CreateItemOnObject("nw_it_sparscr109", oPC); // Scroll Magic Missile
|
|
CreateItemOnObject("nw_it_sparscr108", oPC); // Scroll Sleep
|
|
CreateItemOnObject("nw_it_sparscr102", oPC); // Scroll Prot. from Alignment
|
|
CreateItemOnObject("nw_it_sparscr105", oPC); // Scroll Summon Creature 1
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 75);
|
|
break;
|
|
|
|
case CLASS_TYPE_WIZARD:
|
|
// Weapon
|
|
CreateItemOnObject("nw_wswdg001", oPC); // Dagger
|
|
CreateItemOnObject("nw_wbwxl001", oPC); // Light Crossbow
|
|
CreateItemOnObject("nw_wambo001", oPC, 99); // 99 Bolts
|
|
// Armor
|
|
CreateItemOnObject("nw_cl0th005", oPC); // Wizard's Robe
|
|
// Misc items
|
|
CreateItemOnObject("nw_it_mpotion001", oPC, 3); // 3 X Pot. Cure Light Wounds
|
|
CreateItemOnObject("nw_it_torch001", oPC); // Torch
|
|
CreateItemOnObject("nw_it_sparscr109", oPC); // Scroll Magic Missile
|
|
CreateItemOnObject("nw_it_sparscr108", oPC); // Scroll Sleep
|
|
CreateItemOnObject("nw_it_sparscr102", oPC); // Scroll Prot. from Alignment
|
|
CreateItemOnObject("nw_it_sparscr105", oPC); // Scroll Summon Creature 1
|
|
// Gold
|
|
GiveGoldToCreature(oPC, 75);
|
|
break;
|
|
}
|
|
|
|
// Assign to all new characters
|
|
CreateItemOnObject("mn_savechar", oPC); // Character export widget
|
|
CreateItemOnObject("dmfi_pc_emote", oPC); // Emote Wand
|
|
// CreateItemOnObject("intimateemotewan", oPC); // Emote crystal
|
|
}
|
|
|
|
void stripCharacterOfItems(object oPC)
|
|
{
|
|
string carryOnClothes = "";
|
|
object clothing = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
|
|
if(GetIsObjectValid(clothing))
|
|
{
|
|
string resrefOfClothes = GetResRef(clothing);
|
|
if (GetStringLeft(resrefOfClothes, 8) == "nw_cloth")
|
|
{
|
|
carryOnClothes = resrefOfClothes;
|
|
}
|
|
}
|
|
|
|
// Delete equipment
|
|
ExecuteScript("mn_removeitems", oPC);
|
|
|
|
// Init new equipment
|
|
DelayCommand(1.0f,assignStartingEquipment(oPC, carryOnClothes));
|
|
|
|
}
|
|
|
|
void feedback( string message, object oPC )
|
|
{
|
|
FloatingTextStringOnCreature(message,oPC,FALSE);
|
|
// SendMessageToPC( oPC, message );
|
|
}
|
|
|
|
void handleInvalidChar( object oPC, string reason = "")
|
|
{
|
|
/* feedback("Your character failed validation: "+reason+". Please contact a DM", oPC);
|
|
SetLocalInt(oPC, "BLOCK_TELEPORT_PC", 15); // Block all teleportation
|
|
SetCommandable( FALSE, oPC ); */
|
|
}
|
|
|
|
int validateStartingAbilities(object oPC)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
int validateStartingSkills(object oPC)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
int validateStartingFeats(object oPC)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
int validateStartingHP(object oPC)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
int validateStartingLevels(object oPC)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
void removeSpecialMarkers(object oPC)
|
|
{
|
|
SetPlotFlag(oPC, FALSE);
|
|
SetImmortal(oPC, FALSE);
|
|
}
|
|
|
|
void removeTemporaryItemProperties(object obj)
|
|
{
|
|
if (GetIsObjectValid(obj))
|
|
{
|
|
itemproperty property = GetFirstItemProperty(obj);
|
|
while (GetIsItemPropertyValid(property))
|
|
{
|
|
if (GetItemPropertyDurationType(property) == DURATION_TYPE_TEMPORARY)
|
|
{
|
|
RemoveItemProperty( obj, property );
|
|
}
|
|
|
|
property = GetNextItemProperty(obj);
|
|
}
|
|
}
|
|
}
|
|
|
|
void clearItemTemporaryProperties(object oPC)
|
|
{
|
|
object obj = GetFirstItemInInventory(oPC);
|
|
while (GetIsObjectValid(obj))
|
|
{
|
|
removeTemporaryItemProperties(obj);
|
|
obj = GetNextItemInInventory(oPC);
|
|
}
|
|
|
|
//Clear equipped items.
|
|
int i;
|
|
for(i = 0; i < NUM_INVENTORY_SLOTS; i++)
|
|
{
|
|
object oItem = GetItemInSlot(i, oPC);
|
|
if(GetIsObjectValid(oItem))
|
|
{
|
|
removeTemporaryItemProperties(oItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
int performBeginningValidations(object oPC)
|
|
{
|
|
int success = TRUE;
|
|
if (!validateStartingAbilities(oPC))
|
|
{
|
|
success = FALSE;
|
|
handleInvalidChar(oPC, "Invalid Abilities");
|
|
} else if (!validateStartingSkills(oPC))
|
|
{
|
|
success = FALSE;
|
|
handleInvalidChar(oPC, "Invalid Skills");
|
|
}
|
|
else if (!validateStartingFeats(oPC))
|
|
{
|
|
success = FALSE;
|
|
handleInvalidChar(oPC, "Invalid Feats");
|
|
}
|
|
else if (!validateStartingHP(oPC))
|
|
{
|
|
success = FALSE;
|
|
handleInvalidChar(oPC, "Invalid HP");
|
|
}
|
|
else if (!validateStartingLevels(oPC))
|
|
{
|
|
success = FALSE;
|
|
handleInvalidChar(oPC, "Invalid Levels");
|
|
}
|
|
return success;
|
|
}
|
|
|
|
void giveAlangaraStone(object oPC, string passkey = "")
|
|
{
|
|
object serverToken = CreateItemOnObject( "mn_servertoken", oPC );
|
|
if(passkey != "")
|
|
{
|
|
SetLocalString(serverToken, "passkey", passkey);
|
|
}
|
|
SetLocalString(serverToken, "cid", generateID());
|
|
}
|
|
|
|
string initCharInDB(object oPC)
|
|
{
|
|
string passkey = "";
|
|
|
|
return passkey;
|
|
}
|
|
|
|
void handleEnteringDM(object oPC)
|
|
{
|
|
stripCharacterOfItems(oPC);
|
|
giveDMTools(oPC);
|
|
setupJournal(oPC);
|
|
}
|
|
|
|
void handleEnteringExistingPC(object oPC)
|
|
{
|
|
removeSpecialMarkers(oPC);
|
|
clearItemTemporaryProperties(oPC);
|
|
updateSkin(oPC);
|
|
setupLocalVariables(oPC);
|
|
setupSpecialEffects(oPC);
|
|
setupJournal(oPC);
|
|
}
|
|
|
|
void handleEnteringNewPC(object oPC)
|
|
{
|
|
//stripCharacterOfItems(oPC);
|
|
removeSpecialMarkers(oPC);
|
|
removeEffects(oPC);
|
|
if (performBeginningValidations(oPC))
|
|
{
|
|
// Character is validated correctly
|
|
updateSkin(oPC);
|
|
string passkey = initCharInDB(oPC);
|
|
giveAlangaraStone(oPC, passkey);
|
|
setupLocalVariables(oPC);
|
|
setupSpecialEffects(oPC);
|
|
SetXP(oPC, 1);
|
|
ExportSingleCharacter( oPC );
|
|
setupJournal(oPC);
|
|
}
|
|
}
|
|
|
|
void handleTransitionExistingPC(object oPC)
|
|
{
|
|
updateSkin(oPC);
|
|
handleEnteringExistingPC(oPC);
|
|
}
|
|
|
|
|
|
int validatePCinDB (object oPC)
|
|
{
|
|
if (!GetIsDM(oPC))
|
|
{
|
|
object token = GetItemPossessedBy( oPC, "MN_SERVERTOKEN" );
|
|
if (GetIsObjectValid(token))
|
|
{
|
|
string localPasskey = GetLocalString(token, "passkey");
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void removeObsoleteItems(object oPC)
|
|
{
|
|
// Remove rogue power item
|
|
object power = GetItemPossessedBy(oPC, "mn_rogueboost");
|
|
if (GetIsObjectValid(power))
|
|
{
|
|
SetPlotFlag(power, FALSE);
|
|
DestroyObject(power);
|
|
}
|
|
|
|
power = GetItemPossessedBy(oPC, "mn_monkboost");
|
|
if (GetIsObjectValid(power))
|
|
{
|
|
SetPlotFlag(power, FALSE);
|
|
DestroyObject(power);
|
|
}
|
|
|
|
}
|
|
|
|
int authenticateKey(object oPC)
|
|
{
|
|
string sPName = GetStringLowerCase(GetPCPlayerName(oPC));
|
|
string sKey = GetPCPublicCDKey(oPC);
|
|
string sStoredKey = FetchPString("playerkeys", sPName, "key01");
|
|
if (sStoredKey == "")
|
|
{
|
|
StorePString("playerkeys", sPName, "key01", sKey);
|
|
feedback("Your account has been linked with your CD key", oPC);
|
|
return TRUE;
|
|
} else
|
|
{
|
|
if (sStoredKey==sKey)
|
|
{
|
|
return TRUE; // Key validated
|
|
}
|
|
else
|
|
{
|
|
string sLogmsg = "INCORRECT CD KEY DETECTED! Account: " + sPName + "; Charname: " +
|
|
GetName(oPC) + "; CD Key: " + sKey + "; IP: " + GetPCIPAddress(oPC);
|
|
|
|
WriteTimestampedLogEntry(sLogmsg);
|
|
SendMessageToAllDMs(sLogmsg);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void handleEnteringPC(object oPC)
|
|
{
|
|
if (GetIsPC(oPC) && GetIsObjectValid(oPC))
|
|
{
|
|
if (authenticateKey(oPC) == FALSE)
|
|
{
|
|
BootPC(oPC);
|
|
}
|
|
|
|
removeObsoleteItems(oPC);
|
|
object serverToken = GetItemPossessedBy( oPC, "MN_SERVERTOKEN" );
|
|
object pcSkin = GetPCSkin(oPC);
|
|
if (GetIsDM(oPC) && validatePCinDB(oPC))
|
|
{
|
|
// Player is DM
|
|
handleEnteringDM(oPC);
|
|
} else if (GetXP(oPC) == 0 && !GetIsObjectValid(serverToken) && !GetIsObjectValid(pcSkin))
|
|
{
|
|
// New player - throrough validations and initialization
|
|
// feedback("New PC", oPC);
|
|
handleEnteringNewPC(oPC);
|
|
}
|
|
else if (GetXP(oPC) == 0)
|
|
{
|
|
// New character, but with items. This should not be possible (remember that min XP after XP loss should be 1, fix this in death script)
|
|
handleInvalidChar(oPC, "Starting character had special items");
|
|
}
|
|
else
|
|
{
|
|
// Check for correct items
|
|
if (GetIsObjectValid( serverToken ) && GetIsObjectValid( pcSkin ) && validatePCinDB(oPC))
|
|
{
|
|
// Player has correct items
|
|
// feedback("Existing", oPC);
|
|
handleEnteringExistingPC( oPC );
|
|
}
|
|
else if ( GetIsObjectValid( serverToken ) && !GetIsObjectValid( pcSkin ) )
|
|
{
|
|
// During beta only. Tweak to include new test-systems in condition above.
|
|
// Right now, skin was added during development, so might be missing.
|
|
// feedback("Transition", oPC);
|
|
handleTransitionExistingPC( oPC );
|
|
}
|
|
else
|
|
{
|
|
// Player lacks the neccessary items for being a correct char, or
|
|
// failed validation in other ways.
|
|
handleInvalidChar(oPC, "Invalid Character Composition");
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|