Jump to content

Workshop script activity while workshops are under attack - and problems resulting thereof


Sclerocephalus

Recommended Posts

Before going into the details, I should probably make clear that this post is not about the issue of too many settlements attacks running at the same time. If you did expect that to be discussed here, you're in the wrong thread.

 

This post is about the processes that start running when the player travels to a settlement under attack (i.e. if the attack happens physically) and about performance problems and related issues resulting from the way in which this is handled by the vanilla scripts.

 

There a three groups of processes that start running when the player arrives at a settlement where an attack is under way:

  1. A workshop reset will start running. This is because the player is not normally at the location where the attack takes place when the message pops up on the screen, and travelling there will trigger a workshop reset.
  2. The scripts on any work object that gets damaged during the attack will call WorkshopParentScript to register that damage and to update the workshop stats accordingly.
  3. The scripts on all actors that get wounded during an attack will call WorkshopParentScript too.

Thus, a large number of threads will start running WorkshopParentScript within a very short period of time, and the number increases as the settlements grow. It is obvious that proper handling of these threads is important to avoid performance issues, so it was worth a closer look.

 

Since it is not immediately obvious why wounded actors need to call WorkshopParentScript, let's start with a look at WorkshopNPCScript. The following three events are of concern in this context:

	Event OnEnterBleedout()
		; set this guy as "wounded"
		;WorkshopParent.wstrace(self + " OnEnterBleedout")
		if IsWounded()
			;WorkshopParent.wstrace(self + " already wounded - do nothing")
		else
			WorkshopParent.WoundActor(self)
		endif
	EndEvent

	; WOUNDED STATE: removing visible wounded state for now
	Event OnCombatStateChanged(Actor akTarget, int aeCombatState)
	    if aeCombatState == 0 && IsWounded()
	    	WorkshopParent.WoundActor(self, false)
	    endif
	EndEvent

	Event OnDeath(Actor akKiller)
		WorkshopParent.wstrace(self + " OnDeath")
		; death item if synth
		if bIsSynth
			AddItem(WorkshopParent.SynthDeathItem)
		endif
		; remove me from the workshop
		WorkshopParent.HandleActorDeath(self, akKiller)
	EndEvent

For now, only the OnEnterBleedout() and OnCombatStateChanged() events are of interest (I will come back to the OnDeath() event later): if OnEnterBleedout() fires, the actor's WorkshopNPCScript calls the WoundActor() function on WorkshopParentScript to mark him as wounded and to unassign him (temporarily) of all of his work objects. The obvious idea behind this is that wounded actors are unable to work and therefore should not contribute to productivity. So far, it makes sense.

 

Now look at the OnCombatStateChanged() event that fires immediately after OnEnterBleedout(): it calls the WoundActor() function on WorkshopParentScript again, this time with the second bool argument passed in as 'false' (default value is 'true'). This results in the actor being reset to not wounded and his work objects getting re-assigned. At this point, the procedure stops to make any sense, because the second call cancels everything the first one did, making both calls superfluous.

 

It would make sense if there were any actors remaining wounded after the attack, but I have never seen that happen. There may be a 'population damage' (it's called that way in the scripts; it simply means to wound actors) applied to a settlement after an attack, but this is handled elsewhere. What we see here is just a blatant waste of performance.

 

What makes this really bad is that each actor may get wounded (and subsequently recovers) several times during a single attack. The following log is from a supermutant attack on County Crossing that happened relatively early in the game, when only two settlers and few crops were present. I have removed all traces related to the workshop reset, so what you see here is only the activity caused by actors and damaged crops calling WorkshopParentScript:

 

;a crop gets damaged:

[07/24/2016 - 11:30:22AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:22AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:22AM]   	total damage= 0.500000
[07/24/2016 - 11:30:22AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:22AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:22AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:22AM]  	2.000000 population
[07/24/2016 - 11:30:22AM]  	7.500000 food
[07/24/2016 - 11:30:22AM]  	3.000000 water
[07/24/2016 - 11:30:22AM]  	0.000000 safety
[07/24/2016 - 11:30:22AM]  	0.000000 power
[07/24/2016 - 11:30:22AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:22AM]  	0.000000 population
[07/24/2016 - 11:30:22AM]  	0.500000 food
[07/24/2016 - 11:30:22AM]  	0.000000 water
[07/24/2016 - 11:30:22AM]  	0.000000 safety
[07/24/2016 - 11:30:22AM]  	0.000000 power
[07/24/2016 - 11:30:22AM]  	UpdateCurrentDamage: 0.500000/12.500000=4.000000
[07/24/2016 - 11:30:22AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:30:22AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:22AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:22AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:22AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE

;another crop gets damaged:

[07/24/2016 - 11:30:22AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:22AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:23AM]   	total damage= 1.000000
[07/24/2016 - 11:30:23AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:23AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:23AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:23AM]  	2.000000 population
[07/24/2016 - 11:30:23AM]  	7.500000 food
[07/24/2016 - 11:30:23AM]  	3.000000 water
[07/24/2016 - 11:30:23AM]  	0.000000 safety
[07/24/2016 - 11:30:23AM]  	0.000000 power
[07/24/2016 - 11:30:23AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:23AM]  	0.000000 population
[07/24/2016 - 11:30:23AM]  	1.000000 food
[07/24/2016 - 11:30:23AM]  	0.000000 water
[07/24/2016 - 11:30:23AM]  	0.000000 safety
[07/24/2016 - 11:30:23AM]  	0.000000 power
[07/24/2016 - 11:30:23AM]  	UpdateCurrentDamage: 1.000000/12.500000=8.000000
[07/24/2016 - 11:30:23AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:30:23AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:23AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:23AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:23AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:30:26AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1

;Actor 1 gets wounded:

[07/24/2016 - 11:30:26AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=True
[07/24/2016 - 11:30:26AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:30:26AM]   WoundActor: DONE

;Actor 2 gets wounded:

[07/24/2016 - 11:30:26AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=True
[07/24/2016 - 11:30:26AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:26AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:30:27AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:27AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:30:27AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:27AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:30:27AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:27AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:30:27AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:27AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:30:27AM]   WoundActor: DONE

;Actor 1 recovers:

[07/24/2016 - 11:30:44AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=False
[07/24/2016 - 11:30:44AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:44AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:30:44AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:44AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:30:44AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:44AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:44AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:30:45AM]   WoundActor: DONE

;Actor 2 recovers:

[07/24/2016 - 11:30:45AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=False
[07/24/2016 - 11:30:45AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:45AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:30:46AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:46AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:30:46AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:46AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:30:46AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:46AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:30:46AM]   WoundActor: DONE

;another two crops get damaged, and another two while the script is still running on the previous ones:

[07/24/2016 - 11:30:46AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:46AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:47AM]   	total damage= 2.000000
[07/24/2016 - 11:30:47AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:47AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:47AM]   	total damage= 2.500000
[07/24/2016 - 11:30:47AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:47AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 2
[07/24/2016 - 11:30:47AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 3
[07/24/2016 - 11:30:47AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:47AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:47AM]  	2.000000 population
[07/24/2016 - 11:30:47AM]  	7.500000 food
[07/24/2016 - 11:30:47AM]  	3.000000 water
[07/24/2016 - 11:30:47AM]  	0.000000 safety
[07/24/2016 - 11:30:47AM]  	0.000000 power
[07/24/2016 - 11:30:47AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:47AM]  	0.000000 population
[07/24/2016 - 11:30:47AM]  	2.500000 food
[07/24/2016 - 11:30:47AM]  	0.000000 water
[07/24/2016 - 11:30:47AM]  	0.000000 safety
[07/24/2016 - 11:30:47AM]  	0.000000 power
[07/24/2016 - 11:30:47AM]  	UpdateCurrentDamage: 2.500000/12.500000=20.000000
[07/24/2016 - 11:30:47AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:47AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:47AM]  	2.000000 population
[07/24/2016 - 11:30:47AM]  	7.500000 food
[07/24/2016 - 11:30:47AM]  	3.000000 water
[07/24/2016 - 11:30:47AM]  	0.000000 safety
[07/24/2016 - 11:30:47AM]  	0.000000 power
[07/24/2016 - 11:30:47AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:47AM]  	0.000000 population
[07/24/2016 - 11:30:47AM]  	2.500000 food
[07/24/2016 - 11:30:47AM]  	0.000000 water
[07/24/2016 - 11:30:47AM]  	0.000000 safety
[07/24/2016 - 11:30:47AM]  	0.000000 power
[07/24/2016 - 11:30:47AM]  	UpdateCurrentDamage: 2.500000/12.500000=20.000000
[07/24/2016 - 11:30:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:30:47AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:30:47AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:47AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:47AM]   	total damage= 2.500000
[07/24/2016 - 11:30:47AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:47AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:47AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:47AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:30:47AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:47AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:30:47AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:47AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:47AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:47AM]  	2.000000 population
[07/24/2016 - 11:30:47AM]  	7.500000 food
[07/24/2016 - 11:30:47AM]  	3.000000 water
[07/24/2016 - 11:30:47AM]  	0.000000 safety
[07/24/2016 - 11:30:47AM]  	0.000000 power
[07/24/2016 - 11:30:47AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:47AM]  	0.000000 population
[07/24/2016 - 11:30:47AM]  	2.500000 food
[07/24/2016 - 11:30:47AM]  	0.000000 water
[07/24/2016 - 11:30:47AM]  	0.000000 safety
[07/24/2016 - 11:30:47AM]  	0.000000 power
[07/24/2016 - 11:30:47AM]  	UpdateCurrentDamage: 2.500000/12.500000=20.000000
[07/24/2016 - 11:30:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:30:47AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:47AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:47AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:47AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:47AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:48AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:48AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:30:48AM]   	total damage= 3.000000
[07/24/2016 - 11:30:48AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 2
[07/24/2016 - 11:30:48AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:48AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:48AM]  	2.000000 population
[07/24/2016 - 11:30:48AM]  	7.500000 food
[07/24/2016 - 11:30:48AM]  	3.000000 water
[07/24/2016 - 11:30:48AM]  	0.000000 safety
[07/24/2016 - 11:30:48AM]  	0.000000 power
[07/24/2016 - 11:30:48AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:48AM]  	0.000000 population
[07/24/2016 - 11:30:48AM]  	3.000000 food
[07/24/2016 - 11:30:48AM]  	0.000000 water
[07/24/2016 - 11:30:48AM]  	0.000000 safety
[07/24/2016 - 11:30:48AM]  	0.000000 power
[07/24/2016 - 11:30:48AM]  	UpdateCurrentDamage: 3.000000/12.500000=24.000000
[07/24/2016 - 11:30:48AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 2
[07/24/2016 - 11:30:48AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:48AM]   	total damage= 3.500000

;Actor 2 gets wounded:

[07/24/2016 - 11:30:48AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=True
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:48AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:48AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:30:48AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:30:48AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:48AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:30:48AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 2
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:30:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:48AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:30:48AM]   WoundActor: DONE

;more crops get damaged:

[07/24/2016 - 11:30:48AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:48AM]   	total damage= 4.000000
[07/24/2016 - 11:30:49AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 2
[07/24/2016 - 11:30:49AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:49AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:49AM]  	2.000000 population
[07/24/2016 - 11:30:49AM]  	7.500000 food
[07/24/2016 - 11:30:49AM]  	3.000000 water
[07/24/2016 - 11:30:49AM]  	0.000000 safety
[07/24/2016 - 11:30:49AM]  	0.000000 power
[07/24/2016 - 11:30:49AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:49AM]  	1.000000 population
[07/24/2016 - 11:30:49AM]  	4.000000 food
[07/24/2016 - 11:30:49AM]  	0.000000 water
[07/24/2016 - 11:30:49AM]  	0.000000 safety
[07/24/2016 - 11:30:49AM]  	0.000000 power
[07/24/2016 - 11:30:49AM]  	UpdateCurrentDamage: 5.000000/12.500000=40.000000
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:49AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:49AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:49AM]  	2.000000 population
[07/24/2016 - 11:30:49AM]  	7.500000 food
[07/24/2016 - 11:30:49AM]  	3.000000 water
[07/24/2016 - 11:30:49AM]  	0.000000 safety
[07/24/2016 - 11:30:49AM]  	0.000000 power
[07/24/2016 - 11:30:49AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:49AM]  	1.000000 population
[07/24/2016 - 11:30:49AM]  	4.000000 food
[07/24/2016 - 11:30:49AM]  	0.000000 water
[07/24/2016 - 11:30:49AM]  	0.000000 safety
[07/24/2016 - 11:30:49AM]  	0.000000 power
[07/24/2016 - 11:30:49AM]  	UpdateCurrentDamage: 5.000000/12.500000=40.000000
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:49AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:49AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:49AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:30:49AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:49AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:49AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:30:49AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1

;Actor 1 gets wounded:
 
[07/24/2016 - 11:30:49AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=True
[07/24/2016 - 11:30:49AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:49AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:49AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:50AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:30:50AM]   WoundActor: DONE

;more damaged crops:

[07/24/2016 - 11:30:50AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:30:50AM]   	total damage= 4.500000
[07/24/2016 - 11:30:50AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:30:50AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:30:50AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:50AM]  	2.000000 population
[07/24/2016 - 11:30:50AM]  	7.500000 food
[07/24/2016 - 11:30:50AM]  	3.000000 water
[07/24/2016 - 11:30:50AM]  	0.000000 safety
[07/24/2016 - 11:30:50AM]  	0.000000 power
[07/24/2016 - 11:30:50AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:30:50AM]  	2.000000 population
[07/24/2016 - 11:30:50AM]  	4.500000 food
[07/24/2016 - 11:30:50AM]  	0.000000 water
[07/24/2016 - 11:30:50AM]  	0.000000 safety
[07/24/2016 - 11:30:50AM]  	0.000000 power
[07/24/2016 - 11:30:50AM]  	UpdateCurrentDamage: 6.500000/12.500000=52.000000
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:30:50AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:30:50AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:30:50AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:30:50AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:31:00AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1

;Actor 2 recovers:

[07/24/2016 - 11:31:00AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=False
[07/24/2016 - 11:31:00AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:00AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:31:00AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:00AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:31:01AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:01AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:31:01AM]   WoundActor: DONE

;Actor 1 recovers:

[07/24/2016 - 11:31:05AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=False
[07/24/2016 - 11:31:05AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:31:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:05AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:31:05AM]   WoundActor: DONE

;damaging a few more crops while waiting for the actors to get wounded again:

[07/24/2016 - 11:31:06AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:06AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:31:06AM]   	total damage= 5.000000
[07/24/2016 - 11:31:06AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:06AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Water (00000332)>]
[07/24/2016 - 11:31:06AM]   	total damage= 3.000000
[07/24/2016 - 11:31:06AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:06AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:31:06AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:06AM]  	2.000000 population
[07/24/2016 - 11:31:06AM]  	7.500000 food
[07/24/2016 - 11:31:06AM]  	3.000000 water
[07/24/2016 - 11:31:06AM]  	0.000000 safety
[07/24/2016 - 11:31:06AM]  	0.000000 power
[07/24/2016 - 11:31:06AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:06AM]  	0.000000 population
[07/24/2016 - 11:31:06AM]  	5.000000 food
[07/24/2016 - 11:31:06AM]  	3.000000 water
[07/24/2016 - 11:31:06AM]  	0.000000 safety
[07/24/2016 - 11:31:06AM]  	0.000000 power
[07/24/2016 - 11:31:06AM]  	UpdateCurrentDamage: 8.000000/12.500000=64.000000
[07/24/2016 - 11:31:06AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:06AM]  	2.000000 population
[07/24/2016 - 11:31:06AM]  	7.500000 food
[07/24/2016 - 11:31:06AM]  	3.000000 water
[07/24/2016 - 11:31:06AM]  	0.000000 safety
[07/24/2016 - 11:31:06AM]  	0.000000 power
[07/24/2016 - 11:31:06AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:06AM]  	0.000000 population
[07/24/2016 - 11:31:06AM]  	5.000000 food
[07/24/2016 - 11:31:06AM]  	3.000000 water
[07/24/2016 - 11:31:06AM]  	0.000000 safety
[07/24/2016 - 11:31:06AM]  	0.000000 power
[07/24/2016 - 11:31:06AM]  	UpdateCurrentDamage: 8.000000/12.500000=64.000000
[07/24/2016 - 11:31:06AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (002472D6)>] bRemoveObject=False
[07/24/2016 - 11:31:06AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:06AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:31:06AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:06AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:06AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:31:06AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:31:06AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:06AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:31:06AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:31:11AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:11AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:31:11AM]   	total damage= 5.500000
[07/24/2016 - 11:31:11AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:11AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:31:11AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:11AM]  	2.000000 population
[07/24/2016 - 11:31:11AM]  	7.500000 food
[07/24/2016 - 11:31:11AM]  	3.000000 water
[07/24/2016 - 11:31:11AM]  	0.000000 safety
[07/24/2016 - 11:31:11AM]  	0.000000 power
[07/24/2016 - 11:31:11AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:11AM]  	0.000000 population
[07/24/2016 - 11:31:11AM]  	5.500000 food
[07/24/2016 - 11:31:11AM]  	3.000000 water
[07/24/2016 - 11:31:11AM]  	0.000000 safety
[07/24/2016 - 11:31:11AM]  	0.000000 power
[07/24/2016 - 11:31:11AM]  	UpdateCurrentDamage: 8.500000/12.500000=68.000000
[07/24/2016 - 11:31:11AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:31:11AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:11AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:11AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:31:11AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:31:11AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:11AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:31:11AM]   	total damage= 6.000000
[07/24/2016 - 11:31:11AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:11AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:31:11AM]   	total damage= 6.500000
[07/24/2016 - 11:31:11AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:11AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 2
[07/24/2016 - 11:31:11AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:31:11AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:11AM]  	2.000000 population
[07/24/2016 - 11:31:11AM]  	7.500000 food
[07/24/2016 - 11:31:11AM]  	3.000000 water
[07/24/2016 - 11:31:11AM]  	0.000000 safety
[07/24/2016 - 11:31:11AM]  	0.000000 power
[07/24/2016 - 11:31:11AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:11AM]  	0.000000 population
[07/24/2016 - 11:31:11AM]  	6.500000 food
[07/24/2016 - 11:31:11AM]  	3.000000 water
[07/24/2016 - 11:31:11AM]  	0.000000 safety
[07/24/2016 - 11:31:11AM]  	0.000000 power
[07/24/2016 - 11:31:11AM]  	UpdateCurrentDamage: 9.500000/12.500000=76.000000
[07/24/2016 - 11:31:11AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:31:11AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:11AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:31:11AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:11AM]  	2.000000 population
[07/24/2016 - 11:31:11AM]  	7.500000 food
[07/24/2016 - 11:31:11AM]  	3.000000 water
[07/24/2016 - 11:31:11AM]  	0.000000 safety
[07/24/2016 - 11:31:11AM]  	0.000000 power
[07/24/2016 - 11:31:11AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:11AM]  	0.000000 population
[07/24/2016 - 11:31:11AM]  	6.500000 food
[07/24/2016 - 11:31:11AM]  	3.000000 water
[07/24/2016 - 11:31:11AM]  	0.000000 safety
[07/24/2016 - 11:31:11AM]  	0.000000 power
[07/24/2016 - 11:31:11AM]  	UpdateCurrentDamage: 9.500000/12.500000=76.000000
[07/24/2016 - 11:31:12AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:31:12AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:12AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:12AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:31:12AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:31:12AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:12AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:31:12AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:31:13AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:13AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <Food (00000331)>]
[07/24/2016 - 11:31:13AM]   	total damage= 7.000000
[07/24/2016 - 11:31:13AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1
[07/24/2016 - 11:31:13AM]   RecalculateResourceDamageForResource [workshopscript < (0009B1D1)>] for [ActorValue <WorkshopRatingFoodTypeTato (000A4706)>]
[07/24/2016 - 11:31:13AM]  GetTotalResourcePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:13AM]  	2.000000 population
[07/24/2016 - 11:31:13AM]  	7.500000 food
[07/24/2016 - 11:31:13AM]  	3.000000 water
[07/24/2016 - 11:31:13AM]  	0.000000 safety
[07/24/2016 - 11:31:13AM]  	0.000000 power
[07/24/2016 - 11:31:13AM]  GetTotalDamagePoints for [workshopscript < (0009B1D1)>]: 
[07/24/2016 - 11:31:13AM]  	0.000000 population
[07/24/2016 - 11:31:13AM]  	7.000000 food
[07/24/2016 - 11:31:13AM]  	3.000000 water
[07/24/2016 - 11:31:13AM]  	0.000000 safety
[07/24/2016 - 11:31:13AM]  	0.000000 power
[07/24/2016 - 11:31:13AM]  	UpdateCurrentDamage: 10.000000/12.500000=80.000000
[07/24/2016 - 11:31:13AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:31:13AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:13AM]   SendDestructionStateChangedEvent [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:14AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>]
[07/24/2016 - 11:31:14AM]   UpdateWorkshopObjectives for [workshopscript < (00135A90)>] - DONE
[07/24/2016 - 11:31:14AM]  [workshopparentscript <WorkshopParent (0002058E)>] Edit Lock Count = 1

;Actor 2 gets wounded:

[07/24/2016 - 11:31:14AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=True
[07/24/2016 - 11:31:14AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:31:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:14AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:31:14AM]   WoundActor: DONE

;Actor 1 gets wounded:

[07/24/2016 - 11:31:15AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=True
[07/24/2016 - 11:31:15AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:31:16AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:16AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:31:16AM]   WoundActor: DONE

;Actor 2 recovers:

[07/24/2016 - 11:31:31AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=False
[07/24/2016 - 11:31:31AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:31:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:31AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:31:31AM]   WoundActor: DONE

;Actor 1 recovers:

[07/24/2016 - 11:31:32AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=False
[07/24/2016 - 11:31:32AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:32AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:31:33AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:33AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:31:33AM]   WoundActor: DONE

;Actor 1 gets wounded:

[07/24/2016 - 11:31:51AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=True
[07/24/2016 - 11:31:51AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:51AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:31:52AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:52AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:31:52AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:52AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:31:52AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:52AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:31:52AM]   WoundActor: DONE

;Actor 2 gets wounded:

[07/24/2016 - 11:31:55AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=True
[07/24/2016 - 11:31:55AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:31:55AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:31:55AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:55AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:31:55AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:55AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:31:55AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:55AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:31:56AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:56AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:31:56AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:56AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:31:56AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:56AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:31:56AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:31:56AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:31:56AM]   WoundActor: DONE

;Actor 1 recovers:

[07/24/2016 - 11:32:05AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=False
[07/24/2016 - 11:32:05AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:05AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:32:06AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:06AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:32:06AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:06AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:32:06AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:06AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:32:06AM]   WoundActor: DONE

;Actor 2 recovers:

[07/24/2016 - 11:32:08AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=False
[07/24/2016 - 11:32:08AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:32:08AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:32:08AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:08AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:32:08AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:08AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:32:09AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:09AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:32:09AM]   WoundActor: DONE

;Actor 1 gets wounded:

[07/24/2016 - 11:32:21AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=True
[07/24/2016 - 11:32:21AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:32:21AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:21AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:32:21AM]   WoundActor: DONE

;Actor 2 gets wounded:

[07/24/2016 - 11:32:22AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=True
[07/24/2016 - 11:32:22AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:22AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:32:23AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:23AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:32:23AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:23AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:32:23AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:23AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:32:23AM]   WoundActor: DONE

;Actor 1 recovers:

[07/24/2016 - 11:32:34AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=False
[07/24/2016 - 11:32:34AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:32:34AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:32:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:35AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:32:35AM]   WoundActor: DONE

;Actor 2 recovers:

[07/24/2016 - 11:32:36AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=False
[07/24/2016 - 11:32:36AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:36AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:32:37AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:37AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:32:37AM]   WoundActor: DONE

;Actor 1 gets wounded:

[07/24/2016 - 11:32:47AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=True
[07/24/2016 - 11:32:47AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:47AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:32:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:32:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:48AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:32:48AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:48AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:32:48AM]   WoundActor: DONE

;Actor 1 recovers:

[07/24/2016 - 11:32:59AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=False
[07/24/2016 - 11:32:59AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:32:59AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:32:59AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:32:59AM]   WoundActor: DONE

;Actor 1 gets wounded:

[07/24/2016 - 11:33:13AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=True
[07/24/2016 - 11:33:13AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:13AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:14AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:33:14AM]   WoundActor: DONE

;Actor 2 gets wounded:

[07/24/2016 - 11:33:14AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=True
[07/24/2016 - 11:33:14AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:14AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:33:15AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:15AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:33:15AM]   WoundActor: DONE

;Actor 1 recovers:

[07/24/2016 - 11:33:31AM]   WoundActor: [workshopnpcscript < (0009B1C7)>], bWoundMe=False
[07/24/2016 - 11:33:31AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C7)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA6)>] bRemoveObject=False
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAF)>] bRemoveObject=False
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB2)>] bRemoveObject=False
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB0)>] bRemoveObject=False
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAD)>] bRemoveObject=False
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAB)>] bRemoveObject=False
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA9)>] bRemoveObject=False
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA7)>] bRemoveObject=False
[07/24/2016 - 11:33:31AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:31AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:33:31AM]   WoundActor: DONE

;Actor 2 recovers:

[07/24/2016 - 11:33:34AM]   WoundActor: [workshopnpcscript < (0009B1C6)>], bWoundMe=False
[07/24/2016 - 11:33:34AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: Actor = [workshopnpcscript < (0009B1C6)>], Workshop = [workshopscript < (0009B1D1)>]
[07/24/2016 - 11:33:34AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB3)>] bRemoveObject=False
[07/24/2016 - 11:33:34AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:34AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FB1)>] bRemoveObject=False
[07/24/2016 - 11:33:34AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:34AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAE)>] bRemoveObject=False
[07/24/2016 - 11:33:34AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:34AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAC)>] bRemoveObject=False
[07/24/2016 - 11:33:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FAA)>] bRemoveObject=False
[07/24/2016 - 11:33:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA8)>] bRemoveObject=False
[07/24/2016 - 11:33:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:35AM]  	UpdateWorkshopRatingsForObject [workshopobjectscript < (00159FA5)>] bRemoveObject=False
[07/24/2016 - 11:33:35AM]  	UpdateWorkshopRatingsForObject DONE
[07/24/2016 - 11:33:35AM]  [workshopparentscript <WorkshopParent (0002058E)>] UpdateActorsWorkObjects: DONE
[07/24/2016 - 11:33:35AM]   WoundActor: DONE

 

One actor got wounded seven times, the other six times. Both of them had recovered at the end of the attack. This makes a total of 26 completely unnecessary calls of the WoundActor() function. Imagine what that means for large settlements!

 

But things are much worse than that. Look at the WoundActor() function now:

function WoundActor(WorkShopNPCScript woundedActor, bool bWoundMe = true)
	wsTrace("------------------------------------------------------------------------------ ")
	wsTrace(" WoundActor: " + woundedActor + ", bWoundMe=" + bWoundMe)

	; get actor's workshop
	WorkshopScript workshopRef = GetWorkshop(woundedActor.GetWorkshopID())
	; wound/heal actor
	woundedActor.SetWounded(bWoundMe)

	; increase or decrease damage?
	int damageValue = 1
	if !bWoundMe
		damageValue = -1
	endif

	; update damage rating
	; RESOURCE CHANGE:
	; reduce extra pop damage if > 0 ; otherwise, damage is normally tracked within WorkshopRatingPopulation (difference between base value and current value)
	if bWoundMe == false && workshopRef.GetValue(WorkshopRatings[WorkshopRatingDamagePopulation].resourceValue) > 0
		ModifyResourceData(WorkshopRatings[WorkshopRatingDamagePopulation].resourceValue, workshopRef, damageValue)
	endif

	; update my work objects for "can produce"
	UpdateActorsWorkObjects(woundedActor, workshopRef, true)

	wsTrace(" WoundActor: DONE")
	wsTrace("------------------------------------------------------------------------------ ")
endFunction

THIS FUNCTION IS NOT LOCKED !!!

 

Script locks are used throughout the workshop scripts to ensure that sensitive data can only be touched by one thread at a time. Not doing so leads to threading issues with unpredictable results, e.g. the well known pip-boy stats bug - although this is only a minor aspect and there are in fact many more things that can go wrong in the background when threading issues are involved.

 

This function does touch sensitive data, as it changes ownership of work objects and updates the workshop stats to reflect these changes. It directly collides with what a workshop reset is doing; simply speaking, it modifies work object assignment 'under a reset's arse' while that one is trying to run householding tasks on them. Though it's worth noting here that it may also interfere with other processes, because it calls the UpdateActorsWorkObjects() function, and some of the sub-functions that are called from that function have many other users (including external scripts).

 

This is a serious bug. This function must be locked, but I can't do that without limiting the number of calls from WorkshopNPCScript. Otherwise, I would easily get dozens of threads hanging in the lock (and sitting on the stack) within a very short period of time, and this increases the chances of getting a CTD when fast travelling to a settlement under attack. Fortunately though, this should be pretty easy since most of these calls are superfluous anyway.

 

Another issue worth mentioning here is related to the OnDeath() event on WorkshopNPCScript: This event calls the HandleActorDeath() function on WorkshopParentScript, which does similar things as the WoundActor() function and is not locked either. Locking that one is less troublesome, as it is rarely called in the vanilla game (since settlers are protected). It will be called more often though if you have a mod installed that makes settlers mortal.

 

Finally, we also have to discuss whether the workshop reset does really need to be started while an attack is running. After all, the reset is doing householding work and refreshes the workshop stats. Householding includes work object and actor assignment tasks, but the outcome of these procedures is not reliable when work objects are getting damaged and actors wounded while it is still running. Not that it matters: this all gets sorted eventually; either by the player when he does the repairs or when the next workshop reset is running. This only emphasizes however that there is no real need for a reset while an attack is running. Assuming that all threads are properly locked, the reset would block all other tasks from being executed for a while, and many threads could pile up on the stack. In view of keeping the performance drawn by the workshop scripts as low as possible, it's probably best therefore to delay the reset until the attack is over.

 

Meanwhile, I have conceived a solution that delays the reset and blocks the workshopNPCScripts from spamming unnecessary calls of the WoundActor() function until the attack is over. This means that only damaged work objects will call WorkshopParentScript while the attack is running. When the attack quest ends, all workshopNPCScripts that still need to call WorkshopParentScript are given a chance do get their jobs done, but testing has shown so far that there are usually none left. Subsequently, the reset starts running, and it turned out that it takes significantly less time to complete when there aren't dozens of unfinished tasks sitting on the stack [NB: I did the comparison with all threads locked, i.e. when the reset function was running, it was the only thread running on WorkshopParentScript. If it runs at attack start, however, there will be other threads piling up on the stack while it runs; if it runs after the attack has ended, all those tasks are already gone].

 

This fix is currently being tested and can hopefully be included in the next UFO4P update. I will present the technical details in a subsequent post.

Link to comment
Share on other sites

Now to the details.

 

1. Tracking of workshop attacks:

==========================

 

The workshop scripts need to be able to track whether a workshop is currently under attack, but this can't be done from the vanilla scripts.

I therefore added a tracking bool to WorkshopScript (Note: this is the only modification to that script relating to this issue):

;-----------------------------------------------------------
;	Added by UFO4P 1.0.x for Bug #yyyyy:
;-----------------------------------------------------------

;This will be set to 'true' when an attack is scheduled for this workshop, and reset to 'false' when the attack ends:
bool property UFO4P_CurrentlyUnderAttack = false auto hidden

This bool is set to 'true' by the TriggerAttack() function on WorkshopParentScript when a workshop attack has been started (an 'else' branch has been added for this purpose):

function TriggerAttack(WorkshopScript workshopRef, int attackStrength)
	wsTrace("   TriggerAttack on " + workshopRef)
	
	if !WorkshopEventAttack.SendStoryEventAndWait(akLoc = workshopRef.myLocation, aiValue1 = attackStrength, akRef1 = workshopRef)
		; Removed - now that we have an attack message, don't do fake attacks
		;/
		wsTrace(" 	no attack quest started - resolve if player is not nearby")
		; no quest started - resolve if player is not at this location
		if workshopRef.Is3DLoaded() == false && Game.Getplayer().GetDistance(workshopRef) > 4000
			ResolveAttack(workshopRef, attackStrength, RaiderFaction)
		endif
		/;
	else
		;UFO4P 1.0.x Bug #yyyyy: Added this line to mark the workshop as getting attacked:
		workshopRef.UFO4P_CurrentlyUnderAttack = true
	endif
	wsTrace("   TriggerAttack DONE")
endFunction

To reset the bool to 'false', the CheckResolveAttack() function on WorkshopAttackScript has been modified to call the new UFO4P_ResolveAttack() function on WorkshopParentScript to do this job. The CheckResolveAttack() function is called by all attack quests when the timer has run out, in order to check whether an attack has to be resolved off screen or not. It is thus always called when an attack ends. Also note that all workshop attack quests are running this script (Note: this is the only modification to WorkshopAttackScript relating to this issue).

bool function CheckResolveAttack()
    debug.tracestack(self + " CheckResolveAttack")
    WorkshopScript workshopRef = WorkshopAlias.GetRef() as WorkshopScript

	;Added by UFO4P 1.0.x for Bug#yyyyy:
	WorkshopParent.UFO4P_ResolveAttack (workshopRef)

	; attackers aren't all dead, so resolve
	if GetStageDone(attackDoneStage) == false && workshopRef.Is3DLoaded() == false
        ; 1.3: 86527: disable attackers if we are resolving attack off screen
        Attackers.DisableAll()
        ; 1.3: 89559: return ResolveAttack value (TRUE=attackers won)
		return WorkshopParent.ResolveAttack(workshopRef, attackStrength, attackerFaction)
    else
        return false
	endif
endFunction

Now the workshop scripts can track whether a workshop is under attack. This might even prove to be useful for other purposes.

Link to comment
Share on other sites

2. Blocking unnecessary calls of the WoundActor() function:

===================================

 

The OnEnterBleedout() and OnCombatStateChanged() events on WorkshopNPCScript have been modified as follows:

	Event OnEnterBleedout()
		; set this guy as "wounded"
		;WorkshopParent.wstrace(self + " OnEnterBleedout")
		if IsWounded()
			;WorkshopParent.wstrace(self + " already wounded - do nothing")
		else
			
			;WorkshopParent.WoundActor(self)

			;UFO4P 1.0.x Bug #yyyyy: Replaced the previous line with the following code:
			SetWounded (true)
			int counter = 0
			while IsWounded() && !IsDead() && (counter < 10)
				Utility.Wait(0.5)
				counter += 1
			endWhile
			if IsWounded() && !IsDead()
				WorkshopParent.WoundActor(self)
			endIf
	
		endIf
	EndEvent

	; WOUNDED STATE: removing visible wounded state for now
	Event OnCombatStateChanged(Actor akTarget, int aeCombatState)
	    if aeCombatState == 0 && IsWounded()

			;WorkshopParent.WoundActor(self, false)

			;UFO4P 1.0.x Bug #yyyyy: Replaced the previous line with the following line:
			SetWounded (false)

	    endif
	EndEvent

Since the two events can produce cancelling pairs of WoundActor() function calls at any time, there is no need to check whether an attack is running. In other words: this is intended to be a general solution for this issue.

 

The vanilla OnCombatStateChanged() event was set up to react when a wounded actor went out of combat. This implies that he was in combat before and that an OnEnterBleedout() event already fired. Thus, calling WoundActor() from OnCombatStateChanged() would always nullify a previous call of WoundActor() from OnEnterBleedout(). Conclusion is that OnCombatStateChanged() should not call WoundActor() at all. It only needs to reset the actor's wounded state [NB: the vanilla scripts set and reset the wounded state from the WoundActor() function, which does this by calling the SetWounded() function on WorkshopNPCScript. The modified events do this now by calling the SetWounded() function directly.]

 

The OnEnterBleedout() event now waits in a loop for the OnCombatStateChanged() to react and reset the actor's wounded state. If that happens, it returns without doing anything. It will now call the WoundActor() function only if the actor is still wounded after a short period of time. Only in that case, WorkshopParentScript has to register him as wounded until the householding procedures can deal with him and reset his state [NB: both the workshop reset on WorkshopParentScript and the daily update on WorkshopScript have code for doing this: whatever runs first when the location is loaded will reset him by calling the WoundActor() function.]

Link to comment
Share on other sites

3. Delaying the workshop reset:

========================

 

For this purpose, two new variables are needed on WorkshopParentScript:

;------------------------------------------------------
;	Added by UFO4P 1.0.x for Bug #yyyyy:
;------------------------------------------------------

int UFO4P_DelayedResetTimerID = 96

WorkshopScript UFO4P_WorkshopRef_ResetDelayed = none

The OnLoactionChange() event has been modified as follows:

	if akNewLoc && akNewLoc.HasKeyword(LocTypeWorkshopSettlement)
		;wsTrace(" OnLocationChange: entered workshop settlement location " + akNewLoc)
		; when player enters a workshop location, recalc the workbench ratings
		; get the workbench
		WorkshopScript workshopRef = GetWorkshopFromLocation(akNewLoc)
		if !workshopRef
			wsTrace(" ERROR - OnLocationChange: failed to find workshop matching " + akNewLoc + " which has the LocTypeWorkshopSettlement keyword", 2)
			return
		else
			;UFO4P 1.0.3 Bug #20576: Check whether the player really entered a new location.
			;If NOT, skip the reset if the last reset of this location ran less than a game day ago.
			;UFO4P 1.0.x Bug #yyyyy: Added a check for UFO4P_CurrentlyUnderAttack: always perform a reset if the workshop is currently under attack:
			if (workshopRef.UFO4P_CurrentlyUnderAttack == false)
				if UFO4P_PreviousWorkshopLocation && UFO4P_PreviousWorkshopLocation.IsSameLocation (akNewLoc)
					;wsTrace(" OnLocationChange: New workshop location is the same as the last workshop location left by the player.")
					Float UFO4P_GameTimeSinceLastReset = Utility.GetCurrentGameTime() - UFO4P_GameTimeOfLastResetStarted
					;wsTrace(" OnLocationChange: Game time since last reset = " + UFO4P_GameTimeSinceLastReset)
					if UFO4P_GameTimeSinceLastReset < 1
						;wsTrace(" OnLocationChange: Skipping reset.")
						Return
					endIf
				endIf
			endIf

			;UFO4P 1.0.x Bug #yyyyy: Suspend the reset if the workshop is currently under attack:
			if workshopRef.UFO4P_CurrentlyUnderAttack
				UFO4P_WorkshopRef_ResetDelayed = workshopRef
				wsTrace(" OnLocationChange: Workshop location is under attack right now. Suspending workshop reset.")
			else
				;UFO4P 1.0.3 Bug #20576: Remember the current game time as the time when the last reset started running:
				UFO4P_GameTimeOfLastResetStarted = Utility.GetCurrentGameTime()
				ResetWorkshop(workshopRef)
			endIf

			; send change location script event
			; OBSOLETE - moved to always use MinRadiantStart
;			WorkshopEventChangeLocation.SendStoryEvent(akNewLoc, workshopRef)

		EndIf
	EndIf

There are two edits here:

  1. The first one is to skip the checks added by UFO4P 1.0.3 when a workshop is under attack. It's a good idea to always run a reset in that case, even if not otherwise needed, simply because the stats may change as a result of objects getting damaged. Not directly related to the current issue, but a useful improvement.
  2. The second one (below the first one) adds another check for workshop attacks: if currently under attack, the reference of the workshop is stored in UFO4P_WorkshopRef_ResetDelayed and no reset will be started.

The delayed reset gets started by the UFO4P_ResolveAttack function, which is called from WorkshopAttackScript to also reset the attack bool on WorkshopScript (I already mentioned this above):

;-----------------------------------------------------------
;	Added by UFO4P 1.0.x for Bug #yyyyy
;-----------------------------------------------------------

;This will be called by WorkshopAttackScript whenever a settlement attack ends:
function UFO4P_ResolveAttack (WorkshopScript workshopRef)
	;Clear attack bool on workshop:
	workshopRef.UFO4P_CurrentlyUnderAttack = false
	if workshopRef == UFO4P_WorkshopRef_ResetDelayed
		;Start reset via timer to prevent delays on WorkshopAttackScript:
		StartTimer(1.0, UFO4P_DelayedResetTimerID)
		wsTrace("UFO4P_ResolveAttack: Started timer for reset of workshop " + workshopRef)
	endIf
endFunction

event OnTimer(int aiTimerID)
	if aiTimerID == UFO4P_DelayedResetTimerID
		;Safety Check: Make sure that the workshop location is still loaded before starting the reset:
		if UFO4P_WorkshopRef_ResetDelayed.myLocation.IsLoaded()
			UFO4P_GameTimeOfLastResetStarted = Utility.GetCurrentGameTime()
			ResetWorkshop(UFO4P_WorkshopRef_ResetDelayed)
		endIf
	endIf
endEvent 

Since the attack quest will call this function for any attack (including those that are resolved off screen), we have to check here whether workshopRef is the same as UFO4P_WorkshopRef_ResetDelayed [NB: there will always be only one location with a delayed reset, since the player cannot be physically present at more than one location at the same time].

 

The reset has to be started via timer. Otherwise, the attack quests would get blocked for an overly long time since WorkshopAttackScript waits for the function to return. Finally, the timer event has to check whether the location is still loaded. This is to deal with the case of the player leaving the location before the attack is over.

 

 

4. Last but not least:

================

I locked the WoundActor() and HandleActorDeath() functions on WorkshopParentScript.

 

 

All this is currently being tested, so nothing of this is final. There may be further modifications needed.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...