location GetNewLocation(object oPC); void DrunkPC(int iValue, object oPC); void main() { object oPC = OBJECT_SELF; int iDrunk = GetLocalInt(oPC,"iDrunk"); int iCon = GetAbilityScore(oPC,ABILITY_CONSTITUTION); int iSave = GetFortitudeSavingThrow(oPC); int iSaveBonus = iCon/6; if (GetRacialType(oPC)==RACIAL_TYPE_DWARF) iSaveBonus = iCon; if (GetRacialType(oPC)==RACIAL_TYPE_ELF) iSaveBonus = iCon/2; if (GetRacialType(oPC)==RACIAL_TYPE_HALFELF) iSaveBonus = iCon/3; if (GetRacialType(oPC)==RACIAL_TYPE_HALFLING) iSaveBonus = iCon/3; if (GetRacialType(oPC)==RACIAL_TYPE_HALFORC) iSaveBonus = iCon/3; if (GetRacialType(oPC)==RACIAL_TYPE_GNOME) iSaveBonus = iCon/4; if (Random(1000)<950) //decay drunk state chance { iDrunk--; SetLocalInt(oPC,"iDrunk",iDrunk); } int iSaveRoll = iDrunk-iSaveBonus; iSaveRoll=iSaveRoll-d4(1); if (iSaveRoll<0) iSaveRoll=0; string sMessage; switch (iSaveRoll) { case 0:{sMessage="you feel sober.";break;} case 1:{sMessage="You feel sober.";break;} case 2:{sMessage="You feel good.";break;} case 3:{sMessage="You feel happy.";break;} case 4:{sMessage="You feel lightheaded.";break;} case 5:{sMessage="You are tipsy.";break;} case 6:{sMessage="You are drunk.";break;} case 7:{sMessage="You are drunk.";break;} case 8:{sMessage="You are very drunk.";break;} case 9:{sMessage="You are very drunk.";break;} case 10:{sMessage="You are very drunk.";break;} case 11:{sMessage="You are inebriated.";break;} case 12:{sMessage="You are inebriated.";break;} case 13:{sMessage="You are unable to walk properly.";break;} case 14:{sMessage="You are unable to walk properly.";break;} case 15:{sMessage="You are unable to walk properly.";break;} case 16:{sMessage="You are unable to stand.";break;} case 17:{sMessage="You are unable to stand.";break;} case 18:{sMessage="You are unable to stand.";break;} case 19:{sMessage="You are unable to stand.";break;} case 20:{sMessage="You pass out...";break;} default:{sMessage="You pass out....";break;} } if (iSaveRoll<20)FloatingTextStringOnCreature(sMessage,oPC,FALSE); if (iDrunk-iCon>5) { if (Random(1000)<600) { AssignCommand(oPC,SpeakString("*Hic!*",TALKVOLUME_TALK)); AssignCommand(oPC,ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK,1.0)); } else { AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_DRUNK,1.0,5.0)); } } location lSelf = GetLocation(oPC); location lSelf2; object oTemp = CreateObject(OBJECT_TYPE_PLACEABLE,"temporaryplaceho",lSelf); float fTemp = 1.0; int iCount = 29; DestroyObject(oTemp,60.0); if (iSaveRoll>19) //Pass Out { DrunkPC(1,oPC); AssignCommand(oPC,ClearAllActions()); if (Random(1000)<950) //decay drunk state chance { iDrunk--; SetLocalInt(oPC,"iDrunk",iDrunk); } AssignCommand(oTemp,DelayCommand(30.0,ExecuteScript("_uoa_drunk",oPC))); AssignCommand(oTemp,DelayCommand(3.0,FadeToBlack(oPC,FADE_SPEED_MEDIUM))); AssignCommand(oTemp,DelayCommand(2.0,FloatingTextStringOnCreature(sMessage,oPC,FALSE))); AssignCommand(oTemp,DelayCommand(27.0,FadeFromBlack(oPC,FADE_SPEED_SLOW))); lSelf2 = GetNewLocation(oPC); //Move a little bit if (Random(1000)<500) { AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,SpeakString("*Hic!*",TALKVOLUME_TALK)))); AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK,1.0)))); } AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionMoveToLocation(lSelf2,FALSE)))); //Fall Down Drunk and pass out if (Random(1000)<501) { AssignCommand(oTemp,DelayCommand(3.0,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,1.0,26.0)))); } else { AssignCommand(oTemp,DelayCommand(3.0,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_DEAD_BACK,1.0,26.0)))); } AssignCommand(oTemp,DelayCommand(4.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_IMP_SLEEP,FALSE),oPC,24.0))); AssignCommand(oTemp,DelayCommand(1.0,SetCutsceneMode(oPC,TRUE))); AssignCommand(oTemp,DelayCommand(28.0,SetCutsceneMode(oPC,FALSE))); return; } if (iSaveRoll>15) //Knockdown & random Walk { DrunkPC(2,oPC); AssignCommand(oPC,ClearAllActions()); AssignCommand(oTemp,DelayCommand(30.0,ExecuteScript("_uoa_drunk",oPC))); AssignCommand(oTemp,DelayCommand(0.5,SetCutsceneMode(oPC,TRUE))); AssignCommand(oTemp,DelayCommand(28.0,SetCutsceneMode(oPC,FALSE))); for (iCount; iCount>0; iCount--) { fTemp=fTemp+1.0; if (Random(1000)<800) { AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS,1.0,1.2)))); } else { lSelf2 = GetNewLocation(oPC); if (Random(1000)<500) { AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,SpeakString("*Hic!*",TALKVOLUME_TALK)))); AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK,1.0)))); } AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionMoveToLocation(lSelf2,FALSE)))); } } return; } if (iSaveRoll>12) //RandomWalk { DrunkPC(3,oPC); AssignCommand(oPC,ClearAllActions()); AssignCommand(oTemp,DelayCommand(30.0,ExecuteScript("_uoa_drunk",oPC))); AssignCommand(oTemp,DelayCommand(0.5,SetCutsceneMode(oPC,TRUE))); AssignCommand(oTemp,DelayCommand(28.0,SetCutsceneMode(oPC,FALSE))); for (iCount; iCount>0; iCount--) { fTemp=fTemp+1.0; if (Random(1000)<200) { AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS,1.0,1.2)))); } else { if (Random(1000)<500) { AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,SpeakString("*Hic!*",TALKVOLUME_TALK)))); AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK,1.0)))); } lSelf2 = GetNewLocation(oPC); AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionMoveToLocation(lSelf2,FALSE)))); } } return; } if (iSaveRoll>7) //RandomWalk 50% { DrunkPC(4,oPC); AssignCommand(oTemp,DelayCommand(30.0,ExecuteScript("_uoa_drunk",oPC))); for (iCount; iCount>0; iCount--) { fTemp=fTemp+1.0; if (Random(1000)<500) { if (Random(1000)<200) { AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,SpeakString("*Hic!*",TALKVOLUME_TALK)))); AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK,1.0)))); } lSelf2 = GetNewLocation(oPC); AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionMoveToLocation(lSelf2,FALSE)))); } } return; } if (iSaveRoll>4) //RandomWalk 25% { DrunkPC(5,oPC); AssignCommand(oTemp,DelayCommand(30.0,ExecuteScript("_uoa_drunk",oPC))); for (iCount; iCount>0; iCount--) { fTemp=fTemp+1.0; if (Random(1000)<250) { if (Random(1000)<200) { AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,SpeakString("*Hic!*",TALKVOLUME_TALK)))); AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionPlayAnimation(ANIMATION_FIREFORGET_DODGE_DUCK,1.0)))); } lSelf2 = GetNewLocation(oPC); AssignCommand(oTemp,DelayCommand(fTemp,AssignCommand(oPC,ActionMoveToLocation(lSelf2,FALSE)))); } } return; } if (iDrunk>1) { AssignCommand(oTemp,DelayCommand(30.0,ExecuteScript("_uoa_drunk",oPC))); } SetLocalInt(oPC,"iAmDrunk",0); } location GetNewLocation(object oPC) { location lPC = GetLocation(oPC); vector vSelf = GetPosition(OBJECT_SELF); object oArea = GetArea(OBJECT_SELF); int vDirection; float fSelf; float fDistance; location lSelf2; fSelf = GetFacing(OBJECT_SELF)+Random(360); fDistance = (IntToFloat(d4(2)+1)/6.0); vSelf = vSelf + (AngleToVector(fSelf) * fDistance); lSelf2 = Location(oArea,vSelf,fSelf); return lSelf2; } void DrunkPC(int iValue, object oPC) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATED,FALSE),oPC,31.0); if (iValue==1) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_DEXTERITY,10),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_INTELLIGENCE,10),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_WISDOM,10),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectACDecrease(5),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowDecrease(SAVING_THROW_REFLEX,5),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowIncrease(SAVING_THROW_FORT,5),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSkillDecrease(SKILL_ALL_SKILLS,10),oPC,31.0); if (GetCurrentHitPoints(oPC)<=GetMaxHitPoints(oPC))ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectTemporaryHitpoints(20),oPC,31.0); } if (iValue==2) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_DEXTERITY,6),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_INTELLIGENCE,6),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_WISDOM,6),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectACDecrease(4),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowDecrease(SAVING_THROW_REFLEX,4),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowIncrease(SAVING_THROW_FORT,4),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSkillDecrease(SKILL_ALL_SKILLS,6),oPC,31.0); if (GetCurrentHitPoints(oPC)<=GetMaxHitPoints(oPC))ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectTemporaryHitpoints(10),oPC,31.0); } if (iValue==3) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_DEXTERITY,3),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_INTELLIGENCE,3),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_WISDOM,3),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectACDecrease(3),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowDecrease(SAVING_THROW_REFLEX,3),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowIncrease(SAVING_THROW_FORT,3),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSkillDecrease(SKILL_ALL_SKILLS,3),oPC,31.0); if (GetCurrentHitPoints(oPC)<=GetMaxHitPoints(oPC))ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectTemporaryHitpoints(5),oPC,31.0); } if (iValue==4) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_DEXTERITY,2),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_INTELLIGENCE,2),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_WISDOM,2),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectACDecrease(2),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowDecrease(SAVING_THROW_REFLEX,2),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowIncrease(SAVING_THROW_FORT,2),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSkillDecrease(SKILL_ALL_SKILLS,2),oPC,31.0); if (GetCurrentHitPoints(oPC)<=GetMaxHitPoints(oPC))ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectTemporaryHitpoints(3),oPC,31.0); } if (iValue==5) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_DEXTERITY,1),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_INTELLIGENCE,1),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectAbilityDecrease(ABILITY_WISDOM,1),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectACDecrease(1),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowDecrease(SAVING_THROW_REFLEX,1),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSavingThrowIncrease(SAVING_THROW_FORT,1),oPC,31.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSkillDecrease(SKILL_ALL_SKILLS,1),oPC,31.0); if (GetCurrentHitPoints(oPC)<=GetMaxHitPoints(oPC))ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectTemporaryHitpoints(1),oPC,31.0); } return; }