/* ============================================================================ ---------------------------------------------------------------------------- File : job_drink.skrit Author(s) : Bartosz Kijanka, Witness (Lisa Hui) Purpose : Take a swig of the "hard stuff." (C)opyright 2000 Gas Powered Games, Inc. ---------------------------------------------------------------------------- ============================================================================ */ //////////////////////////////////////////////////////////////////////////////// // GLOBAL VARIABLES //////////////////////////////////////////////////////////////////////////////// Go m_Go$; GoMind m_Mind$; Job m_Job$; Goid m_Beverage$; Goid m_Weapon$; Goid m_Shield$; eInventoryLocation m_ilSelected$; int m_DrinkAnim$; bool m_DrinkAutoUse$; bool m_DrinkEnchant$; bool m_DrinkUnequip$; string m_DrinkSound$; void debug$( string msg$ ) { //report.screenf("job_drink - %s", msg$); } startup state STARTUP$ {} //////////////////////////////////////////////////////////////////////////////// // GLOBAL EVENTS AND TRIGGERS //////////////////////////////////////////////////////////////////////////////// event OnJobInitPointers$( Job job$ ) { m_Job$ = job$; m_Go$ = job$.Go; m_Mind$ = job$.Go.Mind; m_Beverage$ = job$.GoalObject; } event OnJobInit$( Job job$ ) { OnJobInitPointers$( job$ ); debug$("init"); //avoid calling GetGo a bunch of times... Go beverage$ = m_Beverage$.Go; //filter out modifiers if ( beverage$.HasMagic() ) { if ( ( beverage$.Magic.PrefixModifierName != "" ) || ( beverage$.Magic.SuffixModifierName != "" ) ) { m_Job$.MarkForDeletion(); GoDb.SMarkForDeletion( m_Beverage$ ); //m_DrinkAutoUse$ = false; //SetState Exiting$; return; } } //check for additional potion usage parameters (part 1) if ( beverage$.HasComponent( "charges" ) ) { if ( beverage$.GetComponentInt( "charges", "charges_curr" , 1 ) < 1 ) { m_DrinkAutoUse$ = false; SetState Exiting$; return; } } //check for additional potion usage parameters (part 2) if ( beverage$.HasComponent( "potion_use" ) ) { m_DrinkAnim$ = beverage$.GetComponentInt( "potion_use", "anim" ); m_DrinkAutoUse$ = beverage$.GetComponentBool( "potion_use", "auto_use" ); m_DrinkEnchant$ = beverage$.GetComponentBool( "potion_use", "enchant" ); m_DrinkUnequip$ = beverage$.GetComponentBool( "potion_use", "unequip" ); m_DrinkSound$ = beverage$.GetComponentString( "potion_use", "sound" ); } else { //defaults m_DrinkAnim$ = 'drnk'; m_DrinkAutoUse$ = true; m_DrinkEnchant$ = false; //autouse already applies enchantments m_DrinkUnequip$ = true; m_DrinkSound$ = "drink"; } //run hardcoded drinking behavior? if ( m_DrinkAutoUse$ ) { debug$( "Inventory.SBeginUse( m_Beverage$ )" ); m_Go$.Inventory.SBeginUse( m_Beverage$ ); if ( !m_Go$.Inventory.SAutoUse( m_Beverage$, m_Job$.Origin, false ) ) { debug$( "NOT m_Go$.Inventory.SAutoUse" ); m_DrinkUnequip$ = false; SetState Exiting$; return; } } else { debug$( "DON'T AUTOUSE" ); PostWorldMessage( WE_REQ_USE, m_Go$.Goid, m_Beverage$, 0 ); if ( m_DrinkEnchant$ ) { debug$( "apply custom enchantments" ); beverage$.Magic.SApplyEnchantments( m_Go$.Goid, m_Beverage$ ); } } //unequip hands? if ( m_DrinkUnequip$ ) { SetState UnequippingGear$; } else { SetState Drinking$; } } trigger OnWorldMessage$( WE_JOB_DESTRUCTED ) { debug$( "heard WE_JOB_DESTRUCTED" ); if ( m_DrinkUnequip$ ) { SetState RequippingGear$; } else { SetState Exiting$; } } trigger OnWorldMessage$( WE_DESTRUCTED ) { SetState Exiting$; } //////////////////////////////////////////////////////////////////////////////// // STATES //////////////////////////////////////////////////////////////////////////////// State UnequippingGear$ { event OnEnterState$ { debug$( "UnequippingGear$ - OnEnterState$" ); // make sure we're not doing anything else... $$$ - Mike, check this out. -bk MCPManager.Flush( m_Go$.Goid ); //////////////////////////////////////// // unequip gear m_ilSelected$ = m_Go$.Inventory.GetSelectedLocation(); Go weapon$ = m_Go$.Inventory.GetEquipped( ES_WEAPON_HAND ); Go shield$ = m_Go$.Inventory.GetEquipped( ES_SHIELD_HAND ); if( weapon$ != NULL ) { m_Weapon$ = weapon$.Goid; m_Go$.Inventory.RSUnequip( ES_WEAPON_HAND, m_Job$.Origin ); } if( shield$ != NULL ) { m_Shield$ = shield$.Goid; m_Go$.Inventory.RSUnequip( ES_SHIELD_HAND, m_Job$.Origin ); } //////////////////////////////////////// // equip potion m_Go$.Inventory.RSEquip( ES_WEAPON_HAND, m_Beverage$, m_Job$.Origin ); SetState Drinking$; } } State Drinking$ { transition { -> ApplyBeverage$ : OnWorldMessage( WE_ANIM_DONE ); -> RequippingGear$ : OnWorldMessage( WE_MCP_INVALIDATED ); } event OnEnterState$ { debug$( "Drinking$ - OnEnterState$" ); m_DrinkAnim$ = ( m_DrinkAnim$ < 0 ? m_Go$.Aspect.AspectHandle.Blender.GetSubAnimIndex( CHORE_MISC, m_DrinkAnim$ ) : m_Go$.Aspect.AspectHandle.Blender.GetSubAnimIndex( CHORE_MISC, 'drnk' ) ); if ( m_DrinkSound$ != "" ) { m_Beverage$.Go.PlayVoiceSound( m_DrinkSound$, true ); } if ( m_DrinkAnim$ >= 0 ) { eReqRetCode ret$ = MCPManager.MakeRequest( m_Go$.Goid, PL_PLAYANIM, CHORE_MISC, m_DrinkAnim$, 0 ); if ( RequestFailed( ret$ ) ) { SetState ApplyBeverage$; } } else { // No 'drink' animation in the chore SetState ApplyBeverage$; } } } State ApplyBeverage$ { event OnEnterState$ { debug$( "ApplyBeverage$ - OnEnterState$" ); if ( m_DrinkUnequip$ ) { SetState RequippingGear$; } else { SetState Exiting$; } } } State RequippingGear$ { event OnEnterState$ { debug$( "RequippingGear$ - OnEnterState$" ); //make sure the weapon is still valid and part of our inventory ( we could have been killed //while drinking, and out inventory could have been scattered during the execution of this job if( ( m_Weapon$.Go != NULL ) && m_Go$.Inventory.Contains( m_Weapon$.Go ) ) { m_Go$.Inventory.RSEquip( ES_WEAPON_HAND, m_Weapon$, m_Job$.Origin ); } else { //if we didn't have a weapon in hand, make sure to unequip the beverage m_Go$.Inventory.RSEquip( ES_WEAPON_HAND, Goid.NoneGoid, m_Job$.Origin ); } if( ( m_Shield$.Go != NULL ) && m_Go$.Inventory.Contains( m_Shield$.Go ) ) { m_Go$.Inventory.RSEquip( ES_SHIELD_HAND, m_Shield$, m_Job$.Origin ); } m_Go$.Inventory.RSSelect( m_ilSelected$, m_Job$.Origin ); m_DrinkUnequip$ = false; //just finished equipping, don't need to equip again... m_Job$.MarkForDeletion(); } } State Exiting$ { event OnEnterState$ { debug$( "Exiting$ - OnEnterState$" ); if ( m_DrinkAutoUse$ ) { m_Go$.Inventory.SEndUse( m_Beverage$ ); } m_Job$.MarkForDeletion(); } }