<cfcomponent
output="false"
hint="This is your shortie; treat her well.">
<cfset VARIABLES.Instance = StructNew() />
<cfset VARIABLES.Instance.Brain = "" />
<cfset VARIABLES.Instance.Anger = 0 />
<cfset VARIABLES.Instance.Energy = 0 />
<cfset VARIABLES.Instance.Hunger = 0 />
<cfset VARIABLES.Instance.Happiness = 0 />
<cfset VARIABLES.Instance.Love = 0 />
<cfset VARIABLES.Instance.Time = Now() />
<cfset VARIABLES.Instance.RealTime = Now() />
<cfset VARIABLES.Instance.DayScale = 120 />
<cfset VARIABLES.Instance.NextInteractionTime = Now() />
<cffunction
name="Init"
access="public"
returntype="any"
output="false"
hint="Returns an initialized shortie instance.">
<cfargument
name="Brain"
type="any"
required="true"
/>
<cfset VARIABLES.Instance.Brain = ARGUMENTS.Brain />
<cfset VARIABLES.LoadData() />
<cfset THIS.AdjustTime() />
<cfreturn THIS />
</cffunction>
<cffunction
name="AdjustTime"
access="public"
returntype="void"
output="false"
hint="This adjusts the shortie time to make sure it scales to regular world time increments.">
<cfset var LOCAL = StructNew() />
<cfset LOCAL.Now = Now() />
<cfset LOCAL.DayDiff = (
(LOCAL.Now - VARIABLES.Instance.RealTime) *
VARIABLES.Instance.DayScale
) />
<cfset LOCAL.TargetTime = (
VARIABLES.Instance.Time +
LOCAL.DayDiff
) />
<cfset VARIABLES.IncrementTime(
(LOCAL.TargetTime - VARIABLES.Instance.Time)
) />
<cfset VARIABLES.Instance.RealTime = LOCAL.Now />
<cfreturn />
</cffunction>
<cffunction
name="CommitData"
access="private"
returntype="void"
output="false"
hint="This commits short term memory to the brain.">
<cfset VARIABLES.Instance.Brain.Set(
Property = "Anger",
Value = VARIABLES.Instance.Anger,
CommitData = false
) />
<cfset VARIABLES.Instance.Brain.Set(
Property = "Energy",
Value = VARIABLES.Instance.Energy,
CommitData = false
) />
<cfset VARIABLES.Instance.Brain.Set(
Property = "Hunger",
Value = VARIABLES.Instance.Hunger,
CommitData = false
) />
<cfset VARIABLES.Instance.Brain.Set(
Property = "Happiness",
Value = VARIABLES.Instance.Happiness,
CommitData = false
) />
<cfset VARIABLES.Instance.Brain.Set(
Property = "Love",
Value = VARIABLES.Instance.Love
) />
<cfset VARIABLES.Instance.Brain.Set(
Property = "Time",
Value = VARIABLES.Instance.Time
) />
<cfreturn />
</cffunction>
<cffunction
name="GetNextInteractionTime"
access="public"
returntype="numeric"
output="false"
hint="Gets the time at which the Shortie can next be interacted with.">
<cfreturn VARIABLES.Instance.NextInteractionTime />
</cffunction>
<cffunction
name="GetProperties"
access="public"
returntype="struct"
output="false"
hint="Returns the 'mental' properties of the shortie.">
<cfset var LOCAL = StructNew() />
<cfset LOCAL.Anger = VARIABLES.Instance.Anger />
<cfset LOCAL.Energy = VARIABLES.Instance.Energy />
<cfset LOCAL.Hunger = VARIABLES.Instance.Hunger />
<cfset LOCAL.Happiness = VARIABLES.Instance.Happiness />
<cfset LOCAL.Love = VARIABLES.Instance.Love />
<cfreturn LOCAL />
</cffunction>
<cffunction
name="GetTime"
access="public"
returntype="string"
output="false"
hint="Returns the shortie time (internal time model).">
<cfreturn (
DateFormat(
VARIABLES.Instance.Time,
"mm/dd/yyyy "
) &
TimeFormat(
VARIABLES.Instance.Time,
"hh:mm TT"
)
) />
</cffunction>
<cffunction
name="IncrementTime"
access="private"
returntype="void"
output="false"
hint="This increments time.">
<cfargument
name="TimeSpan"
type="numeric"
required="false"
default="#CreateTimeSpan( 0, 1, 0, 0 )#"
hint="The time to increase for this iteration (defaults to an hour)."
/>
<cfset VARIABLES.Instance.Time = (
VARIABLES.Instance.Time +
ARGUMENTS.TimeSpan
) />
<cfset VARIABLES.Instance.Energy = (
VARIABLES.Instance.Energy -
(
1 *
ARGUMENTS.TimeSpan / CreateTimeSpan( 0, 4, 0, 0 )
)
) />
<cfset VARIABLES.Instance.Hunger = (
VARIABLES.Instance.Hunger +
(
1 *
ARGUMENTS.TimeSpan / CreateTimeSpan( 0, 4, 0, 0 )
)
) />
<cfset VARIABLES.CommitData() />
<cfreturn />
</cffunction>
<cffunction
name="Interact"
access="public"
returntype="void"
output="false"
hint="This is how you can pass in an interaction. This will update the internal state.">
<cfargument
name="Interaction"
type="any"
required="true"
hint="This is an interaction that must implement the interaction interface."
/>
<cfset var LOCAL = StructNew() />
<cfset THIS.AdjustTime() />
<cfif (VARIABLES.Instance.NextInteractionTime GT VARIABLES.Instance.Time)>
<cfreturn />
</cfif>
<cfset LOCAL.TimeRequired = ARGUMENTS.Interaction.GetTimeRequired() />
<cfset VARIABLES.Instance.NextInteractionTime = (
VARIABLES.Instance.Time +
LOCAL.TimeRequired
) />
<cfif (RandRange( 1, 30 ) EQ 15)>
<cfset LOCAL.Multiplier = -1 />
<cfelse>
<cfset LOCAL.Multiplier = 1 />
</cfif>
<cfset LOCAL.Delta = StructNew() />
<cfset LOCAL.Delta.Anger = (
(
ARGUMENTS.Interaction.GetAnger() *
LOCAL.Multiplier
) +
RandRange( -1, 1 )
) />
<cfset LOCAL.Delta.Energy = (
(
ARGUMENTS.Interaction.GetEnergy() *
LOCAL.Multiplier
) +
RandRange( -1, 1 )
) />
<cfset LOCAL.Delta.Hunger = (
(
ARGUMENTS.Interaction.GetHunger() *
LOCAL.Multiplier
) +
RandRange( -1, 1 )
) />
<cfset LOCAL.Delta.Happiness = (
(
ARGUMENTS.Interaction.GetHappiness() *
LOCAL.Multiplier
) +
RandRange( -1, 1 )
) />
<cfset LOCAL.Delta.Love = (
(
ARGUMENTS.Interaction.GetLove() *
LOCAL.Multiplier
) +
RandRange( -1, 1 )
) />
<cfset LOCAL.Delta.IsPositive = ARGUMENTS.Interaction.GetIsPositive() />
<cfset VARIABLES.Instance.Anger = (
VARIABLES.Instance.Anger +
LOCAL.Delta.Anger
) />
<cfset VARIABLES.Instance.Energy = (
VARIABLES.Instance.Energy +
LOCAL.Delta.Energy
) />
<cfset VARIABLES.Instance.Hunger = (
VARIABLES.Instance.Hunger +
LOCAL.Delta.Hunger
) />
<cfset VARIABLES.Instance.Happiness = (
VARIABLES.Instance.Happiness +
LOCAL.Delta.Happiness
) />
<cfset VARIABLES.Instance.Love = (
VARIABLES.Instance.Love +
LOCAL.Delta.Love
) />
<cfset VARIABLES.CommitData() />
<cfreturn />
</cffunction>
<cffunction
name="LoadData"
access="private"
returntype="void"
output="false"
hint="Loads the property data from the brain (persisted data).">
<cfset VARIABLES.Instance.Anger = Val(
VARIABLES.Instance.Brain.Get( "Anger" )
) />
<cfset VARIABLES.Instance.Energy = Val(
VARIABLES.Instance.Brain.Get( "Energy" )
) />
<cfset VARIABLES.Instance.Hunger = Val(
VARIABLES.Instance.Brain.Get( "Hunger" )
) />
<cfset VARIABLES.Instance.Happiness = Val(
VARIABLES.Instance.Brain.Get( "Happiness" )
) />
<cfset VARIABLES.Instance.Love = Val(
VARIABLES.Instance.Brain.Get( "Love" )
) />
<cfset VARIABLES.Instance.Time = Val(
VARIABLES.Instance.Brain.Get( "Time" )
) />
<cfif NOT VARIABLES.Instance.Time>
<cfset VARIABLES.Instance.Time = VARIABLES.Instance.RealTime />
</cfif>
<cfreturn />
</cffunction>
<cffunction
name="Labotomize"
access="public"
returntype="void"
output="false"
hint="Clears the brain data, thereby, resenting the properties.">
<cfset VARIABLES.Instance.Brain.ClearData() />
<cfset VARIABLES.LoadData() />
<cfset VARIABLES.Instance.NextInteractionTime = Now() />
<cfreturn />
</cffunction>
</cfcomponent>