 |
Forum Info
|
 |
Forum Members: 18,677
Total Threads: 8,798
Posts: 95,842
Administrators:
DeeZire, Redemption
There are currently 30 users online.
|
 |
Partner Links
|
 |
 |
Advertisements
|
 |
|
| LOTR: Battle For Middle Earth I & II Editing Discuss any modding related issues to do with the Lord Of The Rings: Battle For Middle Earth I and II RTS games here. |
12-07-2004, 09:14 AM
|
#11 (permalink)
|
|
Senior Member
Join Date: Apr 2003
Location: Derby, UK / Den Haag, NL
Posts: 590
|
Quote:
|
I am beginning to fear it's official...
|
Why do I always quote everything?
It probably is, but it's probably very incomplete, and we're getting the wrong end of the stick - for example, maybe the world builder uses an output like that to place units (giving each unit a number, the order they appear in the script we see, and then placing it on the map respectively, with the details that are contained in the said map about it's status or whatever?
|
|
|
12-07-2004, 09:17 AM
|
#12 (permalink)
|
|
Senior Member
Join Date: Dec 2002
Posts: 1,031
|
Then why would they use #define GANDALF_THE_GREY_Bla in stead of #define <Unit name> <stat> <value>.
Those unit names are hardcoded. And THATS the problem.
|
|
|
12-07-2004, 09:25 AM
|
#13 (permalink)
|
|
Senior Member
Join Date: Apr 2003
Location: Derby, UK / Den Haag, NL
Posts: 590
|
Quote:
|
Then why would they use #define GANDALF_THE_GREY_Bla in stead of #define <Unit name> <stat> <value>.
|
Who am I to question the utter bizzarreness that is official architectural layouts? I've seen worse 0_o, although thinking about it it does seem a bit silly.
Quote:
|
Those unit names are hardcoded. And THATS the problem.
|
It would appear that way, but perhaps what we see is in fact a leak of a small portion of hard code, after all, what evidence we have is NOT reliable. Perhaps we're going to be able to use defines in the soft architecture instead?
|
|
|
12-07-2004, 09:29 AM
|
#14 (permalink)
|
|
Senior Member
Join Date: Dec 2002
Posts: 1,031
|
Question, if a unit is hardcoded, then what happens if you remove all traces of said unit?
To quote a cartoon serie from Cartoon Network (forget the one, Johny Bravo?)
Quote:
|
"And now it's time to put our arms up in the air, run around and scream for our mommy."
|
I think thats the best thing the B4ME modding community can do if this is official code.
|
|
|
12-07-2004, 09:34 AM
|
#15 (permalink)
|
|
Senior Member
Join Date: Apr 2003
Location: Derby, UK / Den Haag, NL
Posts: 590
|
Quote:
|
Question, if a unit is hardcoded, then what happens if you remove all traces of said unit?
|
Well, if it's no longer included in any of the soft architecture, nothing at all save maybe a few invisible warnings that aren't really important.
It may be that you can simply replace a unit with you own, by leaving the hardcode name etc, but that's something that I wouldn't want to be forced to do, it would leave the unit with a lot of the vital characteristics of the parent.
It may be that a new unit can be built without the use of hard-coded elements, using characteristics from anywhere else. We shall see...
|
|
|
12-07-2004, 11:49 AM
|
#16 (permalink)
|
|
Senior Member
Join Date: Jan 2003
Location: Netherlands
Posts: 206
|
Relax everyone! :lol:
You see, such a #define system is part of a preprocessor in C. My guess is that EA has constructed a preprocessor for the INI files. They probably have dozens of instances of Gandalf et al in the INI files (one for each cinematic) and to prevent them from going mad, these will have things like "BuildCost = GANDALF_THE_GREY_COST" in there. The game preprocessor will then automatically replace that #define name by the actual value specified in the header file.
This, at least, is my professional opinion at this moment. Until someone sends me the INI.BIG or equivalent file, I cannot confirm anything
But one thing is sure, EA will not go back to hardcoding things. They have learned from the past 
|
|
|
12-07-2004, 01:19 PM
|
#18 (permalink)
|
|
Senior Member
Join Date: Mar 2003
Location: UK
Posts: 676
|
However, I find that notepad works fine
HURRAH!!!!
Code:
;------------------------------------------------------------------------------
;Rohan Archer Range a.k.a Rohan Archery Range RohanArcheryRange
Object RohanArcherRange
SelectPortrait = BPRArcheryRange
; *** ART Parameters ***
Draw = W3DScriptedModelDraw ModuleTag_Draw
ExtraPublicBone = ARROW_01
ExtraPublicBone = ARROW_02
ExtraPublicBone = ARROW_03
ExtraPublicBone = ARROW_04
ExtraPublicBone = ARROW_05
ExtraPublicBone = ARROW_06
OkToChangeModelColor = Yes
UseStandardModelNames = Yes
StaticModelLODMode = yes ; Will append M or L to the skin name depending on GameLOD
DefaultModelConditionState
Model = RBArchRnge_SKN
WeaponLaunchBone = PRIMARY ARROW_
End
IdleAnimationState
StateName = STATE_Idle
Animation = IdleA
AnimationName = RBArchRnge_SKL.RBArchRnge_IDLA
AnimationMode = ONCE
AnimationPriority = 30
End
Animation = IdleB
AnimationName = RBArchRnge_SKL.RBArchRnge_IDLB
AnimationMode = ONCE
AnimationPriority = 5
End
Flags = RESTART_ANIM_WHEN_COMPLETE
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("CampSoldierCompleteRohanArcheryRange")
end
end
EndScript
End
;-----------------------Build Up States
ModelConditionState = AWAITING_CONSTRUCTION
Model = RBArchRnge_A
; ParticleSysBone = NONE BuildingDoughnutCloud
End
AnimationState = AWAITING_CONSTRUCTION
Animation
AnimationName =RBArchRnge_ASKL.RBArchRnge_ABLD
AnimationMode = MANUAL
End
Flags = START_FRAME_FIRST
End
ModelConditionState = ACTIVELY_BEING_CONSTRUCTED
Model = RBArchRnge_A
ParticleSysBone = Chimney BuildingContructDust
End;
AnimationState = ACTIVELY_BEING_CONSTRUCTED
Animation
AnimationName = RBArchRnge_ASKL.RBArchRnge_ABLD
AnimationMode = MANUAL
End
Flags = START_FRAME_FIRST
StateName = BeingConstructed
BeginScript
CurDrawablePlaySound("GondorBarracksBeginConstruction")
EndScript
End
;--damaged building
ModelConditionState = DESTROYED_FRONT
Model = RBArchRnge_D2
ParticleSysBone FireSmall01 FireBuildingLarge
ParticleSysBone FireSmall02 FireBuildingLarge
ParticleSysBone FireSmall03 FireBuildingLarge
ParticleSysBone FireSmall04 FireBuildingMedium
ParticleSysBone FireSmall05 SmokeBuildingLarge
End
AnimationState = DESTROYED_FRONT
BeginScript
CurDrawableHideSubObject("ArcheryDP_1")
EndScript
End
ModelConditionState = DESTROYED_RIGHT
Model = RBArchRnge_D2
ParticleSysBone FireSmall01 FireBuildingLarge
ParticleSysBone FireSmall02 FireBuildingLarge
ParticleSysBone FireSmall03 FireBuildingLarge
ParticleSysBone FireSmall04 FireBuildingMedium
ParticleSysBone FireSmall05 SmokeBuildingLarge
End
AnimationState = DESTROYED_RIGHT
BeginScript
CurDrawableHideSubObject("ArcheryDP_3")
EndScript
End
ModelConditionState = DESTROYED_BACK
Model = RBArchRnge_D2
ParticleSysBone FireSmall01 FireBuildingLarge
ParticleSysBone FireSmall02 FireBuildingLarge
ParticleSysBone FireSmall03 FireBuildingLarge
ParticleSysBone FireSmall04 FireBuildingMedium
ParticleSysBone FireSmall05 SmokeBuildingLarge
End
AnimationState = DESTROYED_BACK
BeginScript
CurDrawableHideSubObject("ArcheryDP_2")
EndScript
End
ModelConditionState = DESTROYED_LEFT
Model = RBArchRnge_D2
ParticleSysBone FireSmall01 FireBuildingLarge
ParticleSysBone FireSmall02 FireBuildingLarge
ParticleSysBone FireSmall03 FireBuildingLarge
ParticleSysBone FireSmall04 FireBuildingMedium
ParticleSysBone FireSmall05 SmokeBuildingLarge
End
AnimationState = DESTROYED_LEFT
BeginScript
CurDrawableHideSubObject("ArcheryDP_4")
EndScript
End
ModelConditionState = DAMAGED
Model = RBArchRnge_D1
ParticleSysBone FireSmall01 FireBuildingLarge
ParticleSysBone FireSmall02 FireBuildingMedium
ParticleSysBone FireSmall03 FireBuildingMedium
ParticleSysBone FireSmall04 FireBuildingMedium
ParticleSysBone FireSmall05 SmokeBuildingLarge
End
AnimationState = DAMAGED
EnteringStateFX = FX_BuildingDamaged
End
ModelConditionState = REALLYDAMAGED
Model = RBArchRnge_D2
ParticleSysBone FireSmall01 FireBuildingLarge
ParticleSysBone FireSmall02 FireBuildingLarge
ParticleSysBone FireSmall03 FireBuildingLarge
ParticleSysBone FireSmall04 FireBuildingMedium
ParticleSysBone FireSmall05 SmokeBuildingLarge
End
AnimationState = REALLYDAMAGED
EnteringStateFX = FX_BuildingReallyDamaged
End
ModelConditionState = RUBBLE
Model = RBArchRnge_D2
ParticleSysBone SmokeLarge01 SmokeBuildingLarge
End
AnimationState = RUBBLE
BeginScript
CurDrawableHideSubObject("ArcheryDP_1")
CurDrawableHideSubObject("ArcheryDP_2")
CurDrawableHideSubObject("ArcheryDP_3")
CurDrawableHideSubObject("ArcheryDP_4")
EndScript
End
ModelConditionState = POST_RUBBLE
Model = None
ParticleSysBone NONE SmokeBuildingMediumRubble
End
ModelConditionState = POST_COLLAPSE
Model = None
ParticleSysBone NONE SmokeBuildingMediumRubble
End
End
Draw = W3DFloorDraw ModuleTag_DrawFloor
StaticModelLODMode = Yes ; THIS NEEDS TO BE COMMENTED OUT WHEN ENGINEERING ENABLES LOD'S IN THE FLOOR DRAW
ModelName = RBArchRnge_Bib
End
PlacementViewAngle = -180
; ***DESIGN parameters ***
DisplayName = OBJECT:RohanArcherRange
Description = OBJECT:RohanArcheryRangeDescription
Side = Rohan
EditorSorting = STRUCTURE
ThreatLevel = 1.0
CommandSet = RohanArcherRangeCommandSet
BuildCost = ROHAN_ARCHERYRANGE_BUILDCOST
BuildTime = ROHAN_ARCHERYRANGE_BUILDTIME ; in seconds
VisionRange = ROHAN_ARCHERYRANGE_VISIONRANGE ; Shroud clearing distance
ShroudClearingRange = ROHAN_ARCHERYRANGE_SHROUDCLEAR
BountyValue = ROHAN_ARCHERYRANGE_BOUNTY_VALUE
ArmorSet
Conditions = None
Armor = StructureArmor
;DamageFX = StructureDamageFXNoShake
End
WeaponSet
Conditions = None
End
WeaponSet
Weapon = PRIMARY RohanStructureBow
Conditions = PLAYER_UPGRADE
AutoChooseSources = PRIMARY FROM_PLAYER FROM_SCRIPT FROM_AI
End
; *** AUDIO Parameters ***
VoiceSelect = RohanArcheryRangeSelect
SoundOnDamaged = BuildingLightDamageWood
SoundOnReallyDamaged = BuildingHeavyDamageWood
VoiceSelectUnderConstruction = BuildingGoodVoiceSelectUnderConstruction
UnitSpecificSounds
UnderConstruction = BuildingConstructionLoop ; Built first time
; UnderRepairFromDamage = NoSound ; Repaired No animation on the building, so don't bother playing sound
UnderRepairFromRubble = BuildingConstructionLoop ; Repaired from completely destroyed (not used???)
End
ClientBehavior = AnimationSoundClientBehavior ModuleTag_AnimAudioBehavior
MaxUpdateRangeCap = 800
AnimationSound = Sound: RohanArcheryRangeArrowQuiver Animation:RBARCHRNGE_SKL.RBARCHRNGE_IDLA Frames: 15 23
AnimationSound = Sound: RohanArcheryRangeDrawBow Animation:RBARCHRNGE_SKL.RBARCHRNGE_IDLA Frames: 49 63
AnimationSound = Sound: RohanArcheryRangeBows Animation:RBARCHRNGE_SKL.RBARCHRNGE_IDLA Frames: 75 96
AnimationSound = Sound: RohanArcheryRangeHits1 Animation:RBARCHRNGE_SKL.RBARCHRNGE_IDLA Frames: 78
AnimationSound = Sound: RohanArcheryRangeHits2 Animation:RBARCHRNGE_SKL.RBARCHRNGE_IDLA Frames: 98
End
; *** ENGINEERING Parameters ***
RadarPriority = STRUCTURE
KindOf = PRELOAD STRUCTURE SELECTABLE IMMOBILE SCORE CAPTURABLE FS_FACTORY AUTO_RALLYPOINT MP_COUNT_FOR_VICTORY NEED_BASE_FOUNDATION ATTACK_NEEDS_LINE_OF_SIGHT CAN_ATTACK MADE_OF_WOOD
Behavior = GettingBuiltBehavior ModuleTag_04
WorkerName = RohanWorkerNoSelect
End
Behavior = CastleMemberBehavior ModuleTag_CMB
End
Body = ActiveBody ModuleTag_05
MaxHealth = ROHAN_ARCHERYRANGE_MAXHEALTH
MaxHealthDamaged = ROHAN_ARCHERYRANGE_MAXHEALTHDAMAGED
MaxHealthReallyDamaged = ROHAN_ARCHERYRANGE_MAXHEALTH_REALLYDAMAGED
DamageCreationList = OCL_BuildingDamageList01 CATAPULT_ROCK
DamageCreationList = OCL_RBArchRnge_Chunk1 CATAPULT_ROCK FRONT_DESTROYED
DamageCreationList = OCL_RBArchRnge_Chunk2 CATAPULT_ROCK BACK_DESTROYED
DamageCreationList = OCL_RBArchRnge_Chunk3 CATAPULT_ROCK RIGHT_DESTROYED
DamageCreationList = OCL_RBArchRnge_Chunk4 CATAPULT_ROCK LEFT_DESTROYED
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 = SlowDeathBehavior ModuleTag_SlowDeathWithoutRubble
DestructionDelay = 6500
End
Behavior = StructureCollapseUpdate ModuleTag_06
MinCollapseDelay = 000
MaxCollapseDelay = 000
CollapseDamping = .5
MaxShudder = 0.6
MinBurstDelay = 250
MaxBurstDelay = 800
BigBurstFrequency = 4
FXList = INITIAL FX_StructureMediumCollapse
End
Behavior = AIUpdateInterface ModuleTag_SoWeCanUseWeapon
AutoAcquireEnemiesWhenIdle = Yes
MoodAttackCheckRate = 250
End
Behavior = SubObjectsUpgrade ModuleTag_HideAll
TriggeredBy = Upgrade_StructureLevel1
HideSubObjects = V1 V1A V2
End
Behavior = SubObjectsUpgrade ModuleTag_ShowWalls
TriggeredBy = Upgrade_StructureLevel2
ShowSubObjects = V1 V1A
HideSubObjects = V2
End
Behavior = SubObjectsUpgrade ModuleTag_ShowPillars
TriggeredBy = Upgrade_StructureLevel3
ShowSubObjects = V1 V1A V2
End
Behavior = WeaponSetUpgrade ModuleTag_ThirdLevelBuildingArrows
TriggeredBy = Upgrade_StructureLevel3
ConflictsWith = Upgrade_EasyAIMultiPlayer
End
Behavior = ProductionUpdate ProductionUpdateModuleTag
; nothing
End
Behavior = QueueProductionExitUpdate QueueProductionModuleTag
PlacementViewAngle = -180
UnitCreatePoint = X:32.5 Y:38.0 Z:0.0
NaturalRallyPoint = X:-50.0 Y:38.0 Z:0.0
ExitDelay = 750
End
Behavior = BuildingBehavior BuildingModuleTag
NightWindowName = WINDOW_N01
;FireWindowName = WINDOW_F01
;GlowWindowName = WINDOW_G01
End
; Behavior = CommandSetUpgrade ModuleTag_commandSetUpgrade
; TriggeredBy = Upgrade_ElvenAllies
; CommandSet = RohanArcherRangeElvenAlliesUpgradedCommandSet
; End
Behavior = GeometryUpgrade Geom_ModuleTag_HideAll
TriggeredBy = Upgrade_StructureLevel1
HideGeometry = Geom_V1 Geom_V2
End
Behavior = GeometryUpgrade Geom_ModuleTag_ShowWalls
TriggeredBy = Upgrade_StructureLevel2
ShowGeometry = Geom_V1
HideGeometry = Geom_V2 Geom_V1A
End
Behavior = GeometryUpgrade Geom_ModuleTag_ShowPillars
TriggeredBy = Upgrade_StructureLevel3
ShowGeometry = Geom_V2
HideGeometry = Geom_V2A
End
Geometry = BOX
GeometryName = Geom_Orig
GeometryMajorRadius = 13.0
GeometryMinorRadius = 37.0
GeometryHeight = 40.0
GeometryOffset = X:32.5 Y:15.0 Z:0
AdditionalGeometry = BOX
GeometryName = Geom_Orig
GeometryMajorRadius = 40.0
GeometryMinorRadius = 13.0
GeometryHeight = 27.0
GeometryOffset = X:7 Y:41 Z:0
AdditionalGeometry = BOX
GeometryName = Geom_V2A
GeometryMajorRadius = 14.0
GeometryMinorRadius = 13.0
GeometryHeight = 57.0
GeometryOffset = X:32.5 Y:41 Z:0
AdditionalGeometry = BOX
GeometryName = Geom_V1A
GeometryMajorRadius = 23.0
GeometryMinorRadius = 40.0
GeometryHeight = 10.0
GeometryOffset = X:-4.0 Y:-12.0 Z:0
AdditionalGeometry = BOX
GeometryName = Geom_V1
GeometryActive = No
GeometryMajorRadius = 29.0
GeometryMinorRadius = 42.0
GeometryHeight = 18.0
GeometryOffset = X:-4.0 Y:-12.0 Z:0
AdditionalGeometry = BOX
GeometryName = Geom_V2
GeometryActive = No
GeometryMajorRadius = 14.0
GeometryMinorRadius = 13.0
GeometryHeight = 117.0
GeometryOffset = X:32.5 Y:41 Z:0
GeometryIsSmall = No
Shadow = SHADOW_VOLUME
BuildCompletion = PLACED_BY_PLAYER
GeometryContactPoint = X:-37.335 Y:16.447 Z:0 Repair
GeometryContactPoint = X:50.342 Y:-14.685 Z:0 Repair
GeometryContactPoint = X:36.154 Y:57.817 Z:0
GeometryContactPoint = X:-16.613 Y:-57.348 Z:0
GeometryContactPoint = X:29.704 Y:41.391 Z:75.577 Swoop
End
Anyway, after a quick look, it appears that the code is basically the same except for the mildly odd method of defining health, rof etc. :/
Weapon code has been slightly modified:
Code:
; Weapons now work with Nuggets (like ObjectCreationLists) where each type of nugget
; does one thing, instead of Weapon doing all things itself. So here are the Nuggets,
; and their syntax.
; DamageFieldNugget ; A Nugget that lays down an area of damage that persists independantly
; WeaponTemplateName = SmallFireFieldWeapon
; Duration = 3000
; End
; DamageNugget ; A basic Nugget that just does damage
; Damage = 1 ;Damage for a normal hit
; Radius = 0.0 ;Radius of damage
; DelayTime = 0 ;How long from hit till the damage is applied
; DamageType = SLASH ;Used to cross reference with victim's armor to determine if hurt
; DamageFXType = SWORD_SLASH ;used to cross with their DamageFX listing to determine what effect to play
; DeathType = NORMAL ;Used as index to their Death Modules to determine which one to play
; End
; MetaImpactNugget ; A Nugget that throws things back with force
; HeroResist = .75 ;only knocks heroes down 75% of the time
; ShockWaveAmount = 50.0
; ShockWaveRadius = 10.0
; ShockWaveArc = 90 ; in degrees to each side 180 is full circle
; ShockWaveTaperOff = 1.0
; ShockWaveSpeed = 0.0
; ShockWaveZMult = 1.0
; InvertShockWave = Yes ; Pull instead of push
; End
; ProjectileNugget ; A Nugget that creates an Object and sends it to the target with a Warhead
; ProjectileTemplateName = GimliAxeProjectile
; WarheadTemplateName = RohanGimliAxeThrownWarhead
; End
; WeaponOCLNugget ; A Nugget that should only be used for OCL fluff. If you are doing something important, it should be somewhere else.
; WeaponOCLName = OCL_WeaponFluffForGandalf
; End
; AttributeModifierNugget
; AttributeModifier = WitchKingMorgulBladeEffect
; DamageFXType = SWORD_SLASH ;used to cross with their DamageFX listing to determine what effect to play
; End
Anyway, things to test:
Can you replace the ROHAN_RANGE_HEALTH or whatever it is with a numerical value?
Can you replace ROHAN_RANGE_HEALTH with your own MY_OBJECT_HEALTH tags?
I will add to this list afetr having a further look...
|
|
|
12-07-2004, 01:40 PM
|
#20 (permalink)
|
|
Senior Member
Join Date: Mar 2003
Location: UK
Posts: 676
|
Umm.. that file which was released early wasn't fake. It is in there
Anyway, thanks to Phoib and Olaf for extracting them 
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -4. The time now is 03:08 AM.
|