Jump to content


magnasimia

Member Since 25 Oct 2020
Offline Last Active Sep 22 2022 12:40 AM

Topics I've Started

"Unknown field 'ModelConditionState' in block 'Object'"

27 October 2020 - 02:58 AM

I'm trying to follow along with Fingulfin's tutorial "New Factions in BFME II Part II: Fortresses". I ended up with the exact same Worldbuilder error as in this thread: https://forums.revor...n/#entry1111829. I had a feeling this was a problem with the 'rohanfortress.ini' file itself, so I tried running BFME II directly and got this error message:

 

https://imgur.com/a/4cQme3n

 

My understanding is that this could mean that there is a missing "End" somewhere in the INI file, but I honestly can't find where that would be.

 

Here is the file 'rohanfortress.ini':

Object RohanFortressCenterGeneric	
	
	SelectPortrait = BPGFortress
	
	Draw = W3DScriptedModelDraw ModuleTag_01

    	DefaultModelConditionState
      		Model = None
    	End
    	
		ModelConditionState = WORLD_BUILDER
			Model = NBasePin
		End
	End
	
	
	Side = Shire;Men
	EditorSorting = STRUCTURE
	KindOf = IMMOBILE BASE_FOUNDATION CASTLE_CENTER CAN_CAST_REFLECTIONS CAN_CAST_REFLECTIONS
  
	Behavior = CastleBehavior ModuleTag_castle
		FilterValidOwnedEntries = ANY +STRUCTURE +WALK_ON_TOP_OF_WALL +BASE_FOUNDATION +TACTICAL_MARKER		;Anything that does not fit this filter will be given to the neutral player, so the template can have rocks and props.
	End  
End

//------------------------------------------------------------------------------
// These are the four corner buildplots.  Difference is just the BuildVariation flag they give the Expansion.
Object RohanFortressExpansionPad;Corner
	
	SelectPortrait = BPGFortress_BuildPlot
	
	// *** ART Parameters ***
	Draw = W3DFloorDraw DrawFloorBase  
		ModelName = GBFoundationB;RBFoundationNew;GBFoundationB
        ModelConditionState = WORLD_BUILDER
            Model = GBFoundationB;Name = GBFoundationB
        End
	End

	Draw = W3DScriptedModelDraw ModuleTag_DrawMain
		DefaultModelConditionState
			Model = WBFoundationP
		End
		;//Remove the buildplot when it's been constructed on
		ModelConditionState = CONSTRUCTION_COMPLETE
			Model = None
		End	
	End

	//PlacementViewAngle  = 0

	// ***DESIGN parameters ***
	DisplayName         = OBJECT:MenBuildingFoundation
	Side                = Shire;Men
	EditorSorting       = STRUCTURE
	ThreatLevel			= 1.0

	BuildCost           = 1
	BuildTime           = 5.0          // in seconds
	VisionRange         = 0.0          // Shroud clearing distance
	ShroudClearingRange = 0

	CommandSet = RohanFortressCommandSet;MenFortressExpansionPadCornerCommandSet

	// *** AUDIO Parameters ***
	VoiceSelect = Gui_PlotSelect	;GondorCitadelSelect	;MenFortressSelect


	// *** ENGINEERING Parameters ***	
	KindOf              = STRUCTURE SELECTABLE IMMOBILE BASE_FOUNDATION UNATTACKABLE MP_COUNT_FOR_VICTORY NO_COLLIDE DO_NOT_CLASSIFY CAN_CAST_REFLECTIONS EXPANSION_PAD

	Behavior            = FoundationAIUpdate ModuleTag_foundationAI
		BuildVariation = 2 // Will give BUILD_VARIATION_TWO to anything built on it
	End

	Behavior = CastleMemberBehavior ModuleTag_CMB
	End 

	Body                = ImmortalBody ModuleTag_05
		MaxHealth         = 15000.0
	End

	Geometry              = BOX
	GeometryMajorRadius   = 5.0
	GeometryMinorRadius   = 5.0
	GeometryHeight        = 0.8
	GeometryIsSmall       = No
	Shadow                = SHADOW_VOLUME
	BuildCompletion		= PLACED_BY_PLAYER
End

;--------------------------------------primary RohanCitadel ----------------------------------------------------
Object RohanFortressKeep

	SelectPortrait = BPRohanCastle_Citadel

   ; *** ART Parameters ***

  Draw = W3DScriptedModelDraw ModuleTag_Draw
    OkToChangeModelColor  = Yes
    UseStandardModelNames = Yes

	ExtraPublicBone = ARROWBONE01
	ExtraPublicBone = ARROWBONE02
	ExtraPublicBone = ARROWBONE03
	ExtraPublicBone = ARROWBONE04
	ExtraPublicBone = ARROWBONE05
	ExtraPublicBone = ARROWBONE06
	ExtraPublicBone = ARROWBONE07
	ExtraPublicBone = ARROWBONE08
	ExtraPublicBone = ARROWBONE09
	ExtraPublicBone = ARROWBONE10
	ExtraPublicBone = ARROWBONE11
	ExtraPublicBone = ARROWBONE12

    DefaultModelConditionState  
      Model = RBCastKeep
;      ParticleSysBone   = smokebone01 TorchGlow
;      ParticleSysBone   = smokebone01 TorchSmokeBlack
;      ParticleSysBone   = smokebone02 TorchGlow
;      ParticleSysBone   = smokebone02 TorchSmokeBlack
      WeaponLaunchBone	= PRIMARY ARROW_
      WeaponFireFXBone  = PRIMARY ARROW_
     End
    
	IdleAnimationState
		StateName = STATE_None
		;BeginScript
		;	Prev = CurDrawablePrevAnimationState()
		;	if Prev == "BeingConstructed" then 
			    ; Don't play completed sound when canceling build-in-progress or when
			    ; destroyed halfway
		;	    if not CurDrawableModelcondition( "DYING" ) then 
		;			CurDrawablePlaySound("CampSoldierCompleteGeneric")
		;		end
		;	end
		;EndScript
	End

;------------Build Up States
    ModelConditionState   = ACTIVELY_BEING_CONSTRUCTED
      Model               = RBCastKeep_A
;      ParticleSysBone	  = NONE BuildingDoughnutCloud
      ParticleSysBone     = NONE BuildingContructDust
    End  

	AnimationState          = ACTIVELY_BEING_CONSTRUCTED
		StateName = STATE_Constructing
		Animation
			AnimationName	= RBCastKeep_A.RBCastKeep_A
			AnimationMode   = MANUAL
		End
		BeginScript
			CurDrawablePlaySound("GondorBarracksBeginConstruction")
			CurDrawablePlaySound("BuildingTopple")
		EndScript
	End

    ModelConditionState   = DESTROYED_WHILST_BEING_CONSTRUCTED
		Model = RBCastKeep_A
		ParticleSysBone NONE Explosion3
		ParticleSysBone NONE ExplosiveMineSmoke02
    End  
	AnimationState	= DESTROYED_WHILST_BEING_CONSTRUCTED
		StateName = STATE_DetroyedConstructing
		Animation
			AnimationName		= RBCastKeep_A.RBCastKeep_A
			AnimationMode		= ONCE_BACKWARDS
			AnimationBlendTime	= 90	; 3 seconds * 30 frames
		End
		; Specifically no start last frame flag here.
		Flags = START_FRAME_FIRST
	End
	
;------------Build Up States
    ModelConditionState   = BASE_BUILD
      Model               = RBCastKeep_A
;      ParticleSysBone	  = NONE BuildingDoughnutCloud
      ParticleSysBone     = NONE BuildingContructDust
    End  

	AnimationState		  = BASE_BUILD
		StateName = STATE_None
		Animation
			AnimationName = RBCastKeep_A.RBCastKeep_A
			AnimationMode = ONCE
			AnimationBlendTime = 0			
			AnimationSpeedFactorRange = 2.0 2.0 ; 300 frame anim, but need to shrink down to 5 seconds
		End
		BeginScript
			CurDrawablePlaySound("GondorBarracksBeginConstruction")
			CurDrawablePlaySound("BuildingTopple")
		EndScript
	End

    ModelConditionState   = JUST_BUILT
      Model               = RBCastKeep_A
;      ParticleSysBone	  = NONE BuildingDoughnutCloud
      ParticleSysBone     = NONE BuildingContructDust
    End  
	AnimationState		  = JUST_BUILT
		StateName = STATE_None
		Animation
			AnimationName = RBCastKeep_A.RBCastKeep_A
			AnimationMode = MANUAL			
			AnimationBlendTime = 0
		End
        Flags = START_FRAME_FIRST
	End
	
    ModelConditionState  = DAMAGED
      Model         = RBCastKeep_D1  
	
    End
    
    AnimationState = DAMAGED
		StateName = STATE_None
		EnteringStateFX	= FX_BuildingDamaged
    End

    ModelConditionState  = REALLYDAMAGED
      Model         = RBCastKeep_D2
;      ParticleSysBone NONE furnaceSmoke
	
    End
	AnimationState = REALLYDAMAGED
		StateName = STATE_None
       	Animation				=	ReallyDamagedanimation
			AnimationName		=	 RBCastKeep_D2.RBCastKeep_D2
			AnimationMode		=	ONCE
		End
		EnteringStateFX	= FX_BuildingReallyDamaged
    End

  End


	; *** AUDIO Parameters ***

;	#include "..\..\..\Includes\StandardBuildingEvaEvents.inc"

	VoiceSelect				= RohanCitadelSelect

	SoundOnDamaged			= BuildingLightDamageWood
	SoundOnReallyDamaged		= BuildingHeavyDamageWood

	VoiceSelectUnderConstruction	= BuildingGoodVoiceSelectUnderConstruction

	UnitSpecificSounds
		UnderConstruction		= BuildingBigConstructionLoop		; Built first time
		; UnderRepairFromDamage	= NoSound					; Repaired No animation on the building, so don't bother playing sound
		UnderRepairFromRubble	= BuildingBigConstructionLoop		; Repaired from completely destroyed (not used???)
	End

	EvaEventDieOwner = CitadelDie
	CampnessValue = CAMPNESS_FORTRESS

	ClientBehavior = AnimationSoundClientBehavior ModuleTag_AnimAudioBehavior
		MaxUpdateRangeCap = 800
 		AnimationSound = Sound:BuildingHeavyDamageWood	Animation:RBCastKeep_D3.RBCastKeep_D3	Frames:0
 		AnimationSound = Sound:BuildingSink			Animation:RBCastKeep_D3.RBCastKeep_D3	Frames:25
 		AnimationSound = Sound:BuildingLightDamageWood	Animation:RBCastKeep_D3.RBCastKeep_D3	Frames:105
	End


	; ***DESIGN parameters ***

	DisplayName      = OBJECT:RohanCastleBaseKeep
	Side = Shire;Obsolete
	EditorSorting   = STRUCTURE
	ThreatLevel = 1.0
	BuildCost           = 1000
	BuildTime           = 30.0           ; in seconds
	CommandSet			= RohanCastleBaseKeepCommandSet

	ArmorSet
		Conditions        = None
		Armor             = CitadelArmor
		DamageFX          = RohanWallDamageFX
	End

  ; *** ENGINEERING Parameters ***  
  KindOf					= PRELOAD COMMANDCENTER VITAL_FOR_BASE_SURVIVAL STRUCTURE SELECTABLE IMMOBILE SCORE CASTLE_KEEP MP_COUNT_FOR_VICTORY FS_FACTORY MADE_OF_WOOD DOZER CAN_CAST_REFLECTIONS AUTO_RALLYPOINT	;  GARRISONABLE_UNTIL_DESTROYED GARRISON
  RadarPriority				= STRUCTURE
  ;KeepSelectableWhenDead	= Yes
  
  Body              = ActiveBody ModuleTag_02
    MaxHealth       = 4000.0
  End

  Behavior = GettingBuiltBehavior ModuleTag_04
    SelfBuildingLoop = BuildingBigConstructionLoop				; Only played if we DON'T spawn a worker
	SelfRepairFromDamageLoop  = NoSound         				; This doesn't cause an animation, so don't bother playing a sound
	SelfRepairFromRubbleLoop  = BuildingBigConstructionLoop
  End

  Behavior = CastleMemberBehavior ModuleTag_CMB
	BeingBuiltSound = BuildingBigConstructionLoop
  End 

  	;-----------------------------------------------
	;Used for hero revival and initial construction     
	Behavior = ProductionUpdate ProductionUpdateModuleTag
		; nothing, but is required if we have any Object-level Upgrades!
	End
	Behavior = QueueProductionExitUpdate ModuleTag_QueuePEU
		UnitCreatePoint   = X:0.0 Y:-20.0 Z:0.0
		NaturalRallyPoint = X:28.8 Y:-80.0 Z:0.0;NaturalRallyPointX must always match GeometryMajorRadius! 
		ExitDelay = 300 ;Handles delays between units if multiple produced at a time. 
	End  
	;-----------------------------------------------

  ; Note that structures with "RUBBLE" states should not use DestroyDie; such buildings are 
  ; never truly destroyed, even when reduced to zero health. Also note that garrisonable
  ; buildings automatically stick around because GarrisonContain has it's own DieModule
  Behavior = KeepObjectDie ModuleTag_IWantRubble
  End
 
  
;  Behavior = SlowDeathBehavior ModuleTag_SlowDeathWithoutRubble
;      DestructionDelay  = 6500
;  End


;  Behavior                  = StructureCollapseUpdate ModuleTag_06
;    MinCollapseDelay        = 5000
;    MaxCollapseDelay        = 5000
;    CollapseDamping         = .5
;    MaxShudder              = 0.6
;    MinBurstDelay           = 250
;    MaxBurstDelay           = 800
;    BigBurstFrequency       = 4
;    FXList                  = INITIAL   FX_StructureMediumCollapse
;  End
  
  
  
  
	Behavior       = EvacuateDamage ModuleTag_evacuateDamage
		WeaponThatCausesEvacuation  = MordorCatapultHumanHeads
	End

;	Behavior = HordeGarrisonContain ModuleTag_hordeGarrison
;		ObjectStatusOfContained	= UNSELECTABLE CAN_ATTACK
;		ContainMax              = 4
;		DamagePercentToUnits    = 0%
;		PassengerFilter			= ANY +INFANTRY +HORDE -CAVALRY -SUMMONED -WildSpiderling -WildSpiderlingHorde
;		AllowEnemiesInside      = Yes
;		AllowNeutralInside      = Yes
;		NumberOfExitPaths       = 1 ; Defaults to 1.  Set 0 to not use ExitStart/ExitEnd, set higher than 1 to use ExitStart01-nn/ExitEnd01-nn
;		PassengerBonePrefix     = PassengerBone:ARROWBONE KindOf:INFANTRY
;		EntryOffset				= X:0.0 Y:-45.0 Z:0.0
;		ExitOffset				= X:0.0 Y:-45.0 Z:0.0
;		
;		;PassengersTestCollisionHeight = 80
;		;Slots                         = 1
;		;EnterSound                     = GarrisonEnter
;		;ExitSound                      = GarrisonExit
;		;ExitDelay               = 250
;		;GoAggressiveOnExit      = Yes ; AI Will tell people to set their mood to Aggressive on exiting
;		;ForceOrientationContainer = No  ; otherwise contained units can't orient themselves towards their targets...
;	End 

	Behavior = AutoDepositUpdate AutoDepositModuleTag
		DepositTiming			= GENERIC_KEEP_MONEY_TIME   ; in milliseconds
		DepositAmount			= GENERIC_KEEP_MONEY_AMOUNT   ; cash amount to deposit every DepositTiming
		InitialCaptureBonus		= 0  ; no initial bonus
	End


  Behavior                  = BuildingBehavior BuildingModuleTag
    NightWindowName         = WINDOW_N01
  ;  FireWindowName          = WINDOW_F01
  ;  GlowWindowName			= WINDOW_G01
  End
  
  Geometry				= BOX
  GeometryMajorRadius   = 21.0
  GeometryMinorRadius   = 41.0
  GeometryHeight        = 51.0
  
  AdditionalGeometry    = CYLINDER
  GeometryMajorRadius   = 57.0
  GeometryMinorRadius   = 0
  GeometryHeight        = 7.0
  
  AdditionalGeometry    = BOX
  GeometryMajorRadius   = 12.0
  GeometryMinorRadius   = 12.0
  GeometryHeight        = 120.0
  GeometryOffset		= X:-1 Y:2 Z:0
  
  GeometryIsSmall       = No
  Shadow                = SHADOW_VOLUME
  
;  AttackContactPoint	= X:-1 Y:2 Z:117
;  AttackContactPoint	= X:-1 Y:2 Z:0

	GeometryContactPoint	= X:-1.538		Y:2.559		Z:149.812			Swoop
	GeometryContactPoint	= X:-1.538		Y:2.559		Z:0

End

The "RohanFortressKeep" object is essentially copy-pasted from "RohanCastleBaseKeep" /obsolete/rohan/campsandcastles.ini. Part of the tutorial involved deleting the code for RUBBLE since it shouldn't apply to a fortress in BFME2. I went back through those lines to try and see whether I had left out an important "End" in those lines, but to be honest I can't tell (the indenting in the file isn't the best and I'm not familiar enough with INI code structure to know for sure). I've included it here, in case anybody else can decipher where I may have messed up:

;--------------------------------------primary RohanCitadel ----------------------------------------------------
Object RohanCastleBaseKeep

	SelectPortrait = BPRohanCastle_Citadel

   ; *** ART Parameters ***

  Draw = W3DScriptedModelDraw ModuleTag_Draw
    OkToChangeModelColor  = Yes
    UseStandardModelNames = Yes

	ExtraPublicBone = ARROWBONE01
	ExtraPublicBone = ARROWBONE02
	ExtraPublicBone = ARROWBONE03
	ExtraPublicBone = ARROWBONE04
	ExtraPublicBone = ARROWBONE05
	ExtraPublicBone = ARROWBONE06
	ExtraPublicBone = ARROWBONE07
	ExtraPublicBone = ARROWBONE08
	ExtraPublicBone = ARROWBONE09
	ExtraPublicBone = ARROWBONE10
	ExtraPublicBone = ARROWBONE11
	ExtraPublicBone = ARROWBONE12

    DefaultModelConditionState  
      Model = RBCastKeep
;      ParticleSysBone   = smokebone01 TorchGlow
;      ParticleSysBone   = smokebone01 TorchSmokeBlack
;      ParticleSysBone   = smokebone02 TorchGlow
;      ParticleSysBone   = smokebone02 TorchSmokeBlack
      WeaponLaunchBone	= PRIMARY ARROW_
      WeaponFireFXBone  = PRIMARY ARROW_
     End
    
	IdleAnimationState
		StateName = STATE_None
		;BeginScript
		;	Prev = CurDrawablePrevAnimationState()
		;	if Prev == "BeingConstructed" then 
			    ; Don't play completed sound when canceling build-in-progress or when
			    ; destroyed halfway
		;	    if not CurDrawableModelcondition( "DYING" ) then 
		;			CurDrawablePlaySound("CampSoldierCompleteGeneric")
		;		end
		;	end
		;EndScript
	End

;------------Build Up States
    ModelConditionState   = ACTIVELY_BEING_CONSTRUCTED
      Model               = RBCastKeep_A
;      ParticleSysBone	  = NONE BuildingDoughnutCloud
      ParticleSysBone     = NONE BuildingContructDust
    End  

	AnimationState          = ACTIVELY_BEING_CONSTRUCTED
		StateName = STATE_Constructing
		Animation
			AnimationName	= RBCastKeep_A.RBCastKeep_A
			AnimationMode   = MANUAL
		End
		BeginScript
			CurDrawablePlaySound("GondorBarracksBeginConstruction")
			CurDrawablePlaySound("BuildingTopple")
		EndScript
	End

    ModelConditionState   = DESTROYED_WHILST_BEING_CONSTRUCTED
		Model = RBCastKeep_A
		ParticleSysBone NONE Explosion3
		ParticleSysBone NONE ExplosiveMineSmoke02
    End  
	AnimationState	= DESTROYED_WHILST_BEING_CONSTRUCTED
		StateName = STATE_DetroyedConstructing
		Animation
			AnimationName		= RBCastKeep_A.RBCastKeep_A
			AnimationMode		= ONCE_BACKWARDS
			AnimationBlendTime	= 90	; 3 seconds * 30 frames
		End
		; Specifically no start last frame flag here.
		Flags = START_FRAME_FIRST
	End
	
;------------Build Up States
    ModelConditionState   = BASE_BUILD
      Model               = RBCastKeep_A
;      ParticleSysBone	  = NONE BuildingDoughnutCloud
      ParticleSysBone     = NONE BuildingContructDust
    End  

	AnimationState		  = BASE_BUILD
		StateName = STATE_None
		Animation
			AnimationName = RBCastKeep_A.RBCastKeep_A
			AnimationMode = ONCE
			AnimationBlendTime = 0			
			AnimationSpeedFactorRange = 2.0 2.0 ; 300 frame anim, but need to shrink down to 5 seconds
		End
		BeginScript
			CurDrawablePlaySound("GondorBarracksBeginConstruction")
			CurDrawablePlaySound("BuildingTopple")
		EndScript
	End

    ModelConditionState   = JUST_BUILT
      Model               = RBCastKeep_A
;      ParticleSysBone	  = NONE BuildingDoughnutCloud
      ParticleSysBone     = NONE BuildingContructDust
    End  
	AnimationState		  = JUST_BUILT
		StateName = STATE_None
		Animation
			AnimationName = RBCastKeep_A.RBCastKeep_A
			AnimationMode = MANUAL			
			AnimationBlendTime = 0
		End
        Flags = START_FRAME_FIRST
	End
	
    ModelConditionState  = DAMAGED
      Model         = RBCastKeep_D1  
	
    End
    
    AnimationState = DAMAGED
		StateName = STATE_None
		EnteringStateFX	= FX_BuildingDamaged
    End

    ModelConditionState  = REALLYDAMAGED
      Model         = RBCastKeep_D2
;      ParticleSysBone NONE furnaceSmoke
	
    End
	AnimationState = REALLYDAMAGED
		StateName = STATE_None
       	Animation				=	ReallyDamagedanimation
			AnimationName		=	 RBCastKeep_D2.RBCastKeep_D2
			AnimationMode		=	ONCE
		End
		EnteringStateFX	= FX_BuildingReallyDamaged
    End


	;-------RUBBLE--------------------------------------------------------------------------------
	TransitionState = TRANS_U_IntoRubble
		Animation = D3
			AnimationName		= RBCastKeep_D3.RBCastKeep_D3
			AnimationMode		= ONCE
			AnimationBlendTime = 0
		End
		ParticleSysBone NONE Explosion3
		ParticleSysBone NONE ExplosiveMineSmoke02
	End
    ModelConditionState  = RUBBLE
		Model         = RBCastKeep_D3
    End
    AnimationState = RUBBLE
		Flags = START_FRAME_LAST
		StateName = STATE_Rubble
		Animation				=	Death
			AnimationName		=	RBCastKeep_D3.RBCastKeep_D3
			AnimationMode		=	ONCE
		End
		BeginScript
			Prev = CurDrawablePrevAnimationState()
			if Prev == "STATE_None"
			then
				; Only play the rubble anim if we havn't come from another rubble.
				CurDrawableSetTransitionAnimState("TRANS_U_IntoRubble")
			end
		EndScript
    End      

  End


	; *** AUDIO Parameters ***

;	#include "..\..\..\Includes\StandardBuildingEvaEvents.inc"

	VoiceSelect				= RohanCitadelSelect

	SoundOnDamaged			= BuildingLightDamageWood
	SoundOnReallyDamaged		= BuildingHeavyDamageWood

	VoiceSelectUnderConstruction	= BuildingGoodVoiceSelectUnderConstruction

	UnitSpecificSounds
		UnderConstruction		= BuildingBigConstructionLoop		; Built first time
		; UnderRepairFromDamage	= NoSound					; Repaired No animation on the building, so don't bother playing sound
		UnderRepairFromRubble	= BuildingBigConstructionLoop		; Repaired from completely destroyed (not used???)
	End

	EvaEventDieOwner = CitadelDie
	CampnessValue = CAMPNESS_FORTRESS

	ClientBehavior = AnimationSoundClientBehavior ModuleTag_AnimAudioBehavior
		MaxUpdateRangeCap = 800
 		AnimationSound = Sound:BuildingHeavyDamageWood	Animation:RBCastKeep_D3.RBCastKeep_D3	Frames:0
 		AnimationSound = Sound:BuildingSink			Animation:RBCastKeep_D3.RBCastKeep_D3	Frames:25
 		AnimationSound = Sound:BuildingLightDamageWood	Animation:RBCastKeep_D3.RBCastKeep_D3	Frames:105
	End


	; ***DESIGN parameters ***

	DisplayName      = OBJECT:RohanCastleBaseKeep
	Side = Obsolete
	EditorSorting   = STRUCTURE
	ThreatLevel = 1.0
	BuildCost           = 1000
	BuildTime           = 30.0           ; in seconds
	CommandSet			= RohanCastleBaseKeepCommandSet

	ArmorSet
		Conditions        = None
		Armor             = CitadelArmor
		DamageFX          = RohanWallDamageFX
	End

  ; *** ENGINEERING Parameters ***  
  KindOf					= VITAL_FOR_BASE_SURVIVAL STRUCTURE SELECTABLE IMMOBILE SCORE CASTLE_KEEP MP_COUNT_FOR_VICTORY FS_FACTORY MADE_OF_WOOD CAN_ATTACK AUTO_RALLYPOINT	;  GARRISONABLE_UNTIL_DESTROYED GARRISON
  RadarPriority				= STRUCTURE
  KeepSelectableWhenDead	= Yes
  
  Body              = ActiveBody ModuleTag_02
    MaxHealth       = 4000.0
  End

  Behavior = GettingBuiltBehavior ModuleTag_04
    SelfBuildingLoop = BuildingBigConstructionLoop				; Only played if we DON'T spawn a worker
	SelfRepairFromDamageLoop  = NoSound         				; This doesn't cause an animation, so don't bother playing a sound
	SelfRepairFromRubbleLoop  = BuildingBigConstructionLoop
  End

  Behavior = CastleMemberBehavior ModuleTag_CMB
	BeingBuiltSound = BuildingBigConstructionLoop
  End 

  	;-----------------------------------------------
	;Used for hero revival and initial construction     
	Behavior = ProductionUpdate ProductionUpdateModuleTag
		; nothing, but is required if we have any Object-level Upgrades!
	End
	Behavior = QueueProductionExitUpdate ModuleTag_QueuePEU
		UnitCreatePoint   = X:0.0 Y:-20.0 Z:0.0
		NaturalRallyPoint = X:28.8 Y:-80.0 Z:0.0;NaturalRallyPointX must always match GeometryMajorRadius! 
		ExitDelay = 300 ;Handles delays between units if multiple produced at a time. 
	End  
	;-----------------------------------------------

  ; Note that structures with "RUBBLE" states should not use DestroyDie; such buildings are 
  ; never truly destroyed, even when reduced to zero health. Also note that garrisonable
  ; buildings automatically stick around because GarrisonContain has it's own DieModule
  Behavior = KeepObjectDie ModuleTag_IWantRubble
  End
 
  
;  Behavior = SlowDeathBehavior ModuleTag_SlowDeathWithoutRubble
;      DestructionDelay  = 6500
;  End


;  Behavior                  = StructureCollapseUpdate ModuleTag_06
;    MinCollapseDelay        = 5000
;    MaxCollapseDelay        = 5000
;    CollapseDamping         = .5
;    MaxShudder              = 0.6
;    MinBurstDelay           = 250
;    MaxBurstDelay           = 800
;    BigBurstFrequency       = 4
;    FXList                  = INITIAL   FX_StructureMediumCollapse
;  End
  
  
  
  
	Behavior       = EvacuateDamage ModuleTag_evacuateDamage
		WeaponThatCausesEvacuation  = MordorCatapultHumanHeads
	End

;	Behavior = HordeGarrisonContain ModuleTag_hordeGarrison
;		ObjectStatusOfContained	= UNSELECTABLE CAN_ATTACK
;		ContainMax              = 4
;		DamagePercentToUnits    = 0%
;		PassengerFilter			= ANY +INFANTRY +HORDE -CAVALRY -SUMMONED -WildSpiderling -WildSpiderlingHorde
;		AllowEnemiesInside      = Yes
;		AllowNeutralInside      = Yes
;		NumberOfExitPaths       = 1 ; Defaults to 1.  Set 0 to not use ExitStart/ExitEnd, set higher than 1 to use ExitStart01-nn/ExitEnd01-nn
;		PassengerBonePrefix     = PassengerBone:ARROWBONE KindOf:INFANTRY
;		EntryOffset				= X:0.0 Y:-45.0 Z:0.0
;		ExitOffset				= X:0.0 Y:-45.0 Z:0.0
;		
;		;PassengersTestCollisionHeight = 80
;		;Slots                         = 1
;		;EnterSound                     = GarrisonEnter
;		;ExitSound                      = GarrisonExit
;		;ExitDelay               = 250
;		;GoAggressiveOnExit      = Yes ; AI Will tell people to set their mood to Aggressive on exiting
;		;ForceOrientationContainer = No  ; otherwise contained units can't orient themselves towards their targets...
;	End 

	Behavior = AutoDepositUpdate AutoDepositModuleTag
		DepositTiming			= GENERIC_KEEP_MONEY_TIME   ; in milliseconds
		DepositAmount			= GENERIC_KEEP_MONEY_AMOUNT   ; cash amount to deposit every DepositTiming
		InitialCaptureBonus		= 0  ; no initial bonus
	End


  Behavior                  = BuildingBehavior BuildingModuleTag
    NightWindowName         = WINDOW_N01
  ;  FireWindowName          = WINDOW_F01
  ;  GlowWindowName			= WINDOW_G01
  End
  
  Geometry				= BOX
  GeometryMajorRadius   = 21.0
  GeometryMinorRadius   = 41.0
  GeometryHeight        = 51.0
  
  AdditionalGeometry    = CYLINDER
  GeometryMajorRadius   = 57.0
  GeometryMinorRadius   = 0
  GeometryHeight        = 7.0
  
  AdditionalGeometry    = BOX
  GeometryMajorRadius   = 12.0
  GeometryMinorRadius   = 12.0
  GeometryHeight        = 120.0
  GeometryOffset		= X:-1 Y:2 Z:0
  
  GeometryIsSmall       = No
  Shadow                = SHADOW_VOLUME
  
;  AttackContactPoint	= X:-1 Y:2 Z:117
;  AttackContactPoint	= X:-1 Y:2 Z:0

	GeometryContactPoint	= X:-1.538		Y:2.559		Z:149.812			Swoop
	GeometryContactPoint	= X:-1.538		Y:2.559		Z:0

End