// The PC will create a golem if they do not have one already, have the skills, are // near the machine and have the right stuff in their bag void CreateGolem(object oPC); // Will destroy the PC's saved golem. If they golem is currently out, it will // be destroyed too. void DestroyGolem(object oPC); // Stores the PC's golem, if he currently has one out // This allows the PC to send the golem home and is called via a conversation void StoreGolem(object oPC); // Saves the PC's golem IN THE DATABASE, if he has one // This function is run on every PC every so often void SaveGolem(object oPC); // Gets the PC's golem and automatically makes it a henchman void RetrieveGolem(object oPC); // Checks whether this PC has a golem. Note that the golem may be stored and this will still return true int GetHasGolem(object oPC); // Checks whether this PC has a golem. This is only used when the player first enters the module int GetHasGolemOnStartup(object oPC); // Gets whether oPC has the ability to craft a golem. int GetGolemSkills(object oPC); // Sets whether oPC has the ability to craft a golem. Default is true void SetGolemSkills(object oPC, int nSkills=TRUE); void SetGolemSkills(object oPC, int nSkills=TRUE) { object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem"); SetLocalInt(oBox,"golemskills",nSkills); } int GetGolemSkills(object oPC) { int nSkills=GetLocalInt(GetItemPossessedBy(oPC,"jw_crafting_gem"),"golemskills"); return nSkills; } int GetHasGolemOnStartup(object oPC) { int nReturn=FALSE; object oGolem=RetrieveCampaignObject("NEW_WORLD","mygolem",GetLocation(oPC),oPC,oPC); if (GetIsObjectValid(oGolem)) { DestroyObject(oGolem); SetLocalInt(oPC,"hasgolem",TRUE); nReturn=TRUE; } return nReturn; } int GetHasGolem(object oPC) { return GetLocalInt(oPC,"hasgolem"); } void RetrieveGolem(object oPC) { object oGolem=GetLocalObject(oPC,"mygolem"); if (GetIsObjectValid(oGolem)) { SendMessageToPC(oPC,"Your golem has already been summoned."); return; } oGolem=RetrieveCampaignObject("NEW_WORLD","mygolem",GetLocation(oPC),oPC,oPC); if (GetLocalInt(oPC,"hasgolem")==FALSE) { SendMessageToPC(oPC,"You do not appear to have a golem to call"); return; } if (!GetIsObjectValid(oGolem)) { SendMessageToPC(oPC,"You do not appear to have a golem to call."); return; } // Make the golem do animation effect eAppear = EffectAppear(); ApplyEffectToObject(DURATION_TYPE_INSTANT, eAppear, oGolem); // Make the golem make some noise AssignCommand(oGolem,PlayVoiceChat(VOICE_CHAT_BATTLECRY1)); // Make the golem the PC's henchman AddHenchman(oPC,oGolem); SetLocalObject(oPC,"mygolem",oGolem); //int damage = GetCampaignInt("NEW_WORLD","GHP",oPC); // if(damage > 0) // { // ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(damage), oGolem); // } } void SaveGolem(object oPC) { object oGolem=GetLocalObject(oPC,"mygolem"); if (!GetIsObjectValid(oGolem)) { return; } StoreCampaignObject("NEW_WORLD","mygolem",oGolem,oPC); } void StoreGolem(object oPC) { object oGolem=GetLocalObject(oPC,"mygolem"); if (!GetIsObjectValid(oGolem)) { SendMessageToPC(oPC,"You do not appear to have a golem currently summoned to store."); return; } StoreCampaignObject("NEW_WORLD","mygolem",oGolem,oPC); effect eAppear = EffectDisappear(); ApplyEffectToObject(DURATION_TYPE_INSTANT, eAppear, oGolem); DestroyObject(oGolem); } void DestroyGolem(object oPC) { object oGolem=GetLocalObject(oPC,"mygolem"); if (GetIsObjectValid(oGolem)) { RemoveHenchman(oPC,oGolem); RemoveFromParty(oGolem); effect eAppear = EffectKnockdown(); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAppear, oGolem,6.0); AssignCommand(oGolem,PlayVoiceChat(VOICE_CHAT_PAIN1)); DestroyObject(oGolem,3.0); } DeleteCampaignVariable("NEW_WORLD","mygolem",oPC); SetLocalInt(oPC,"hasgolem",FALSE); SendMessageToPC(oPC,"Your golem has been destroyed forever."); } void CreateGolem(object oPC) { object oGolem=GetLocalObject(oPC,"mygolem"); if (GetIsObjectValid(oGolem)) { SendMessageToPC(oPC,"You cannot make a golem while you already have one. Store your golem, and then use your craft skills to delete it entirely before making a new one."); return; } if (GetHasGolem(oPC)==TRUE) { SendMessageToPC(oPC,"You already have a stored golem. You must use your craft skills to delete it entirely before making a new one."); return; } if (GetGolemSkills(oPC)==FALSE) { SendMessageToPC(oPC,"You do now know how to make a golem."); return; } object oDevice; oDevice=GetNearestObjectByTag("jw_golem_machine",oPC); if (!GetIsObjectValid(oDevice)) { SendMessageToPC(oPC,"You need to be near a golem crafting machine."); return; } float fDistance=GetDistanceBetween(oPC,oDevice); if (fDistance<0.0) { SendMessageToPC(oPC,"You need to be near a golem crafting machine."); return; } if (fDistance>5.0) { SendMessageToPC(oPC,"You need to be near a golem crafting machine."); return; } // Everything is done, start to make the golem object oBox=GetItemPossessedBy(oPC,"jw_crafting_gem"); object oHead=GetItemPossessedBy(oBox,"jw_golem_head"); object oPowerCore=GetItemPossessedBy(oBox,"jw_golem_power"); object oChest=GetItemPossessedBy(oBox,"jw_golem_chest"); if ((!GetIsObjectValid(oHead))||(!GetIsObjectValid(oPowerCore))|| (!GetIsObjectValid(oChest))) { SendMessageToPC(oPC,"A crucial part is missing."); return; } // Destroy all the ingredients DestroyObject(oHead); DestroyObject(oPowerCore); DestroyObject(oChest); // Okay, we can make it oGolem=CreateObject(OBJECT_TYPE_CREATURE,"jw_golem_hench",GetLocation(oPC),TRUE); // work out what type of golem it is. // Basic golem int nType=1; string sMetal; int nLevel=7; if (GetIsObjectValid(GetItemPossessedBy(oBox,"ccr1_xx_xx_xx_ad"))) { // It is mithral nType=2; sMetal="ccr1_xx_xx_xx_ad"; } else if (GetIsObjectValid(GetItemPossessedBy(oBox,"ccr1_xx_xx_xx_ac"))) { // It is adamantite nType=3; sMetal="ccr1_xx_xx_xx_ac"; } else if (GetIsObjectValid(GetItemPossessedBy(oBox,"ccr1_xx_xx_xx_ab"))) { // It is lead nType=4; sMetal="ccr1_xx_xx_xx_ab"; } if (nType==1) { SetCreatureAppearanceType(oGolem,APPEARANCE_TYPE_SHIELD_GUARDIAN); } else { SetCreatureAppearanceType(oGolem,APPEARANCE_TYPE_GOLEM_IRON); // Get levels and destroy metals, if we are using metals object oMetal = GetItemPossessedBy(oBox,sMetal); SetPlotFlag(oMetal,0); DestroyObject(oMetal); } // Golem cannot be higher level than wizard levels-1 if (!GetIsDM(oPC)) { nLevel=GetLevelByClass(CLASS_TYPE_WIZARD,oPC)-2; } else { nLevel=12; } // Level up our golem int nIdx; for(nIdx=1; nIdx<=nLevel; nIdx++) { LevelUpHenchman(oGolem,CLASS_TYPE_CONSTRUCT,TRUE,PACKAGE_CONSTRUCT); } // give it special powers if appropriate itemproperty iProp; object oSlam=GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oGolem); object oPower=GetItemPossessedBy(oBox,"etr_fire"); if (GetIsObjectValid(oPower)) { DestroyObject(oPower); iProp=ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d4); AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oSlam); } oPower=GetItemPossessedBy(oBox,"etr_quartz"); if (GetIsObjectValid(oPower)) { DestroyObject(oPower); iProp=ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGEBONUS_1d4); AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oSlam); } oPower=GetItemPossessedBy(oBox,"etr_ice"); if (GetIsObjectValid(oPower)) { DestroyObject(oPower); iProp=ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGEBONUS_1d4); AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oSlam); } oPower=GetItemPossessedBy(oBox,"etr_acid"); if (GetIsObjectValid(oPower)) { DestroyObject(oPower); iProp=ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ACID,IP_CONST_DAMAGEBONUS_1d4); AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oSlam); } // Give it a bonus to hit iProp=ItemPropertyEnhancementBonus(nType); AddItemProperty(DURATION_TYPE_PERMANENT,iProp,oSlam); // Give it extra attacks if (nType>1) { nType=nType-1; ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectModifyAttacks(nType)),oGolem); } // Make it henchman AssignCommand(oGolem,PlayVoiceChat(VOICE_CHAT_BATTLECRY1)); // Make the golem the PC's henchman AddHenchman(oPC,oGolem); SetLocalObject(oPC,"mygolem",oGolem); SetLocalInt(oPC,"hasgolem",TRUE); // Save golem in database int nSuccess=StoreCampaignObject("NEW_WORLD","mygolem",oGolem,oPC); if (nSuccess==FALSE) { //SendMessageToPC(oPC,"Error - golem failed to save"); } else { //SendMessageToPC(oPC,"Golem saved succesfully"); } //SetCampaignInt("NEW_WORLD","GHP",0,oPC); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_MYSTICAL_EXPLOSION),oDevice); }