XML:ONCC
ONCC : Oni Character Class | ||
---|---|---|
XML
OBAN << Other file types >> ONCV |
general information
- The xml code on this page is compatible with onisplit v0.9.61.0
- ONCP, ONIA, OBPI and OBPM are part of ONCC*.oni files.
- ONCC files can be found in AE/AEInstaller/vanilla/level0_Final.dat
- Things that still need deeper explanation:
- <DamageFactors>
- <CoverConstants>
- <AutoFreezeConstants>
- <LODConstants>
- Loser's warehouse ninja that can follow player onto crates
<AirConstants>
- Units
- times are in frames
- heights are in world units
- velocities are in world units per frames
- accelerations are in world units per frames squared
- Downwards velocity
- could correspond to the steady push experienced when neither jumping nor falling
- would be roughly equivalent to the starting velocity of a fall
- although the value .55 seems right, the "sinking" seems to be hardcoded now
- Gravity timer
- Seems to be hardcoded now (could be the time until gravity switches on)
- Jetpack timer
- You can press JUMP multiple times during the time window (quite fun!)
- Falling height
- let FH1 be <MaxNoDamageFallingHeight>
- let FH2 be <MaxDamageFallingHeight>
- let BH be the base health of the character
- let FH be the actual falling height
- then, if FH > FH2, the character is killed
- if FH < FH1, the character takes no damage
- if FH1 < FH < FH2, the character takes damage (FH - FH1) / (FH2 - FH1) * BH
XML tag | content type | description |
---|---|---|
<FallGravity> | float | downwards velocity? (always 0.55) |
<JumpGravity> | float | downward gravity acceleration |
<JumpStartVelocity> | float | starting velocity for a simple (tap) JUMP |
<MaxVelocity> | float | limit velocity for jumping and gravity flight |
<JetpackAcceleration> | float | upward acceleration (jetpack) if you hold JUMP |
<FramesFallGravity> | int16 | gravity timer? (always 7) |
<JetpackTimer> | int16 | time during which you can use the jetpack |
<MaxNoDamageFallingHeight> | float | maximal falling height without damage |
<MaxDamageFallingHeight> | float | maximal falling height with damage |
<ShadowConstants>
XML tag | content type | description |
---|---|---|
<Texture> | link | TXMPfile.oni (file suffix not used) |
<MaxHeight> | float | height where the shadow fades out completely |
<FadeHeight> | float | height where the diameter of the shadow decreases and the shadow fades out half |
<SizeMax> | float | height where the diameter of the shadow decreases |
<SizeFade> | float | height where the diameter of the shadow decreases |
<SizeMin> | float | height where the diameter of the shadow decreases |
<AlphaMax> | int16 | transparency of the shadow for the first part of a jump |
<AlphaFade> | int16 | transparency of the shadow for the second part of a jump |
<JumpConstants>
XML tag | content type | description |
---|---|---|
<JumpDistance> | float | always the same (25) |
<JumpHeight> | int8 | always the same (22) |
<JumpDistanceSquares> | int8 | always the same (6) |
<CoverConstants>
XML tag | content type | description |
---|---|---|
<RayIncrement> | float | always the same (40) |
<RayMax> | float | always the same (300) |
<RayAngle> | float | always the same (0.017453 = PI/180) |
<RayAngleMax> | float | always the same (1.57 = PI/2) |
<AutoFreezeConstants>
XML tag | content type | description |
---|---|---|
<DistanceXZ> | float | always the same (5) |
<DistanceY> | float | always the same (1) |
<InventoryConstants>
XML tag | content type | description |
---|---|---|
<HypoRegenerationRate> | int16 | (inverse) hypo regeneration rate in frames per health point; overhealth regeneration rate is not affected by this
if rate = 60; if a hypo restores 50HP then we get 60/1 * 50 = 3000 frames (50s) |
<LODConstants>
Distances from camera to render certain LODs (level of detail).
XML tag | content type | description |
---|---|---|
<Float> | float | always the same (193600); this is 440 squared |
<Float> | float | always the same (48400); this is 220 squared |
<Float> | float | always the same (12100); this is 110 squared |
<Float> | float | always the same (0) |
<Float> | float | always the same (0) |
<HurtSoundConstants>
XML tag | content type | description |
---|---|---|
<BasePercentage> | int16 | hurt_base_percentage; always the same (35) |
<MaxPercentage> | int16 | hurt_max_percentage; always the same (90) |
<PercentageThreshold> | int16 | hurt_percentage_threshold; always the same (15) |
<Timer> | int16 | hurt_timer; always the same (120) |
<MinTimer> | int16 | hurt_min_timer; always the same (35) |
<MaxLight> | int16 | always the same (1) |
<MaxMedium> | int16 | always the same (2) |
<DeathChance> | int16 | always the same (100) |
<VolumeTreshold> | int16 | hurt_volume_threshold; always the same (10) |
<MediumTreshold> | int16 | hurt_medium_threshold; always the same (12) |
<HeavyTreshold> | int16 | hurt_heavy_threshold; always the same (22) |
<MinVolume> | float | minimal sound volume |
<LightSound> | char[32] | OSBDfile.imp.oni (only the file name) |
<MediumSound> | char[32] | OSBDfile.imp.oni (only the file name) |
<HeavySound> | char[32] | OSBDfile.imp.oni (only the file name) |
<DeathSound> | char[32] | OSBDfile.imp.oni (only the file name) |
<AIConstants>
XML tag | content type | description |
---|---|---|
<Flags> | flag |
|
<RotationSpeed> | float | AI rotation speed factor. Reference rotation speed is about 1 turn (360°) per second. The setting is only effective if the AI is in control, so it's a bit like the AI's mouse sensitivity :) |
<DazedMinFrames> | int16 | minimal fallen time; number of frames for which AI remains in *fallen* position when it is knockdowned |
<DazedMaxFrames> | int16 | maximal fallen time; number of frames for which AI remains in *fallen* position when it is knockdowned |
<DodgeReactFrames> | uint32 | number of frames after which AI realizes that it is in the firing spread and it starts dodging |
<DodgeTimeScale> | float | minimal firingspread dodge amount; IMO similar to maneouvre variable, it tells AI how long it should perform dodging/hiding in response to some time spent inside firing spread (so setting this very high means that once enemy starts dodging/hiding, he will perform it even after firing spread disappears) |
<DodgeWeightScale> | float | maximal firingspread dodge amount; IMO similar to maneouvre variable |
<Targeting> | see HERE | |
<WeaponSkills> | see HERE | |
<DeadMakeSureDelay> | int32 | always the same (90), AI waits at the corpse for some time? |
<InvestigateBodyDelay> | int32 | always the same (240), unused ? |
<LostContactDelay> | int32 | always the same (180) |
<DeadTauntChance> | int32 | chance of AI doing a taunt when player or AI's of another team dies |
<GoForGunChance> | int32 | determines possibility that AI will run to some weapon and take it; can be checked in devmode by *debug_gun_behavior* command |
<RunPickupChance> | int32 | this value is possibility of AI running weapon pickup (acrobatics, slides) instead of normal "stop->pickup"; this is calculated AFTER engine decides that AI should run for weapon |
<CombatId> | int16 | combat profile ID |
<MeleeId> | int16 | melee profile ID |
<SoundConstants> | see HERE | |
<HostileThreatDefiniteTimer> | int32 | how long will AI know exactly where its enemy is even if it can't see him with central vision-field; AI attacks him; can be checked by *ai2_report_verbose* command (this command causes random crashes, beware) |
<HostileThreatStrongTimer> | int32 | how long will AI remain in strong feeling that there is the enemy, but will not attack him but investigate; can be checked by *ai2_report_verbose* command |
<HostileThreatWeakTimer> | int32 | how long will AI remain in weak feeling of an enemy, just looking around aimlessly (Glance pursue mode); can be checked by *ai2_report_verbose* command |
<FriendlyThreatDefiniteTimer> | int32 | how long will AI know exactly where its ally (Syndicate saw Syndicate for example) is even if it can't see him with central vision-field; AI simply knows there is someone else nearby; maybe has further possibilities; can be checked by *ai2_report_verbose* command (this command causes random crashes, beware) |
<FriendlyThreatStrongTimer> | int32 | how long will AI remain in strong feeling that there is someone else, but will not try to find him or look at him; can be checked by *ai2_report_verbose* command |
<FriendlyThreatWeakTimer> | int32 | how long will AI remain in weak feeling of ally, doing its usual job; can be checked by *ai2_report_verbose* command |
<EarshotRadius> | float | earshot radius; defines size of the sound-collision sphere around AI |
<Targeting>
XML tag | content type | description |
---|---|---|
<StartleMissAngle> | float | always the same for TURR and ONCC (0.5) |
<StartleMissDistance> | float | always the same for TURR and ONCC (25) |
<PredictAmount> | float | always the same for TURR |
<PredictPositionDelayFrames> | int32 | always the same for TURR |
<PredictDelayFrames> | int32 | always the same for TURR |
<PredictVelocityFrames> | int32 | always the same for TURR |
<PredictTrendFrames> | int32 | always the same for TURR |
<WeaponSkills>
|
These can be reviewed with e.g. ai2_skill_select konoko_generic w1_tap and then either ai2_skill_show (prints to console) or ai2_skill_save (prints to file) The first weapon (weapon 0) is not in the game anymore, whatever that was. Muro's thunderbolt is handled as animation-bound particles, although it used to be handled as a weapon (same for Mukade's ball, except w10_sni is still available) (w12_ba2 and w11_ba1 are a bit mixed up : the beam is made of w12_ba2 particles, and the grenade is a w11_ba1 particle...) |
<VisionConstants>
- Vision Field
The "range" and "max" values are logically angles but the cosine of the angle is stored instead for performace reasons. We have the following angles (in degrees):
|
|
Within "range" the "distance" field is used to compute visibility (character is visible if the distance between AI and character is < "distance" field). Between "range" and "max" the visibility distance decreases gradually towards 0. The vision field can be made visible with the script command *ai2_showvision =1* but it should be noted that the rendering might not be accurate. In particular the peripheral vision field it's missing the central segment.
XML tag | content type | description |
---|---|---|
<CentralDistance> | float | central vision distance |
<PeripheralDistance> | float | peripheral vision distance |
<VerticalRange> | float | vertical vision range |
<CentralRange> | float | central vision range |
<CentralMax> | float | central vision max |
<PeripheralRange> | float | peripheral vision range |
<PeripheralMax> | float | peripheral vision max |
ONCV, death particle, TRBS, TRMA, TRAC, TRAS, health, daodan, etc.
XML tag | content type | description |
---|---|---|
<Variant> | link | ONCVfile.oni, defines variants and upgrades |
<Particles> | link | ONCP instance number (#N) |
<Impacts> | link | ONIA instance number (#N) |
<ImpactModifierName> | flag | used to choose correct effect from ONIE; impact name -> material name -> modifier (<Component> must be probably "Impact")
|
<Impacts> | link | holds a lot <ONCCImpact><Name>Imptname.oni</Name></ONCCImpact> for character-environment collision; see ... ONIE in relation to characters
Seems to be a list of slots for specific animation types so that those animations inherit the Impt value (name). See <ONCCImpact><Name>"Fall_LandHard" and StNA anim type Fall_LandHard. |
<DeathParticle> | link | in vanilla Oni only Mad Bomber uses it |
<BodySet> | link | TRBSfile.oni |
<BodyTextures> | link | TRMAfile.oni |
<BodyMaterials> | link | CBPM instance number (#N) |
<BodyImpacts> | link | CBPI instance number (#N) |
<FightModeTimer> | int32 | fight mode, active for X frames (see with chr_debug_characters = 1)
COMidle animations will play until X frames passed and beyond that time. The character will return to his non-COM idle animations when an animation plays that has no COM variant, like running, so that the COM idle looped is breaked. This behavior qualifies as a bug. |
<IdleAnimation1Timer> | int32 | minimum timer in X frames before an Idle type animation can be played
|
<IdleAnimation2Timer> | int32 | timer in X frames, resets IdleAnimation1Timer (it is basically the minumum pause between to Idle animations) |
<Health> | int32 | basic health of the character model; extra health information for every unique character are stored in the BINACJBOCharacter.oni file. If playing on hard the character receives automatically a boost of 25% health by default (from ONGS, excluding player character). |
<FeetBones> | flag |
|
<MinBodySizeFactor> | float | minimal body size factor |
<MaxBodySizeFactor> | float | maximal body size factor |
<DamageFactors> | see HERE | |
<BossShieldProtectAmount> | float | Boss Shield Protect Amount, when boss shield is used by this ONCC (for example via chr_boss_shield(ai_name)), all incoming DamageTypes are multiplied by the value (1 - BossShieldProtectAmount) |
<Animations> | link | TRACfile.oni |
<AimingScreens> | link | TRASfile.oni |
<AIRateOfFire> | int16 | AI Rate of Fire |
<DeathDeleteDelay> | int16 | time between death and deletion, in frames (about 3 seconds for mad bomber) |
<WeaponHand> | flag |
|
<HasDaodanPowers> | int8 | when set to 1 indicates that character has daodan powers (character does more damage in overpower mode) |
<HasSupershield> | int8 | when set to 1 indicates that character has supershield
|
<CantTouchThis> | int8 | when set to 1, generically turns on canttouchthis cheat for this ONCC (used by ONCCMutantMuro) |
<DamageFactors>
The following 7 float values correspond to damage types. These are ONCC specific multipliers for DamageTypes. See Particle damage types for details.
These multipliers affect StunDamage and Knockback parameters of DamageBlast and DamageChar PAR3 actions, which utilize these DamageTypes. Damage parameters is not affected by these multipliers.
These multipliers are applied as follows: actual applied StunDamage or Knocback = (PAR3 StunDamage or Knockback)*(1-ONCCvalue)
XML tag | content type | description |
---|---|---|
<Float> | float | "Normal" DamageType multiplier |
<Float> | float | "MinorStun" DamageType multiplier |
<Float> | float | "MajorStun" DamageType multiplier |
<Float> | float | "MinorKnockdown" DamageType multiplier |
<Float> | float | "MajorKnockdown" DamageType multiplier |
<Float> | float | "Blownup" DamageType multiplier |
<Float> | float | "Pickup" DamageType multiplier |
ONCP: Oni Character Particle (Array)
- ONCP is used for giving particle to animations. Search for "Particles" tag in TRAM file.
XML structure
<ONCP id="3"> <Particles> <ONCPParticle> <Name>...</Name> <Type>...</Type> <BodyPart>...</BodyPart> </ONCPParticle> [...] </Particles> </ONCP>
- <Name> is anchor for TRAM link; vanilla names:
- acid - for death event in bio lab (level 3)
- barabwave - for Baraba's earthquaker
- blanka - for one of MutantMuro's special attacks
- contrail - for colored heavy attacks (character specific <Type>)
- daodan - Konoko's daodan blow
- daodan2 - Konoko's daodan blow (last level)
- death
- dust - Floor dust particle when player falls from heights
- fireball - Mukade's devil star
- flash - attack impact flash
- glow - colored glow particle for attacks
- murowave - for MutantMuro's ass bomb
- snap - health indicator particle ?
- teleport - for Mukade's teleport animation
- thud
- thunderbolt - for one of MutantMuro's special attacks
- trail - white color contrail for standard attacks
- rocket - for Baraba's jetpack
- super_attractor - for MutantMuro
- super_glow - body daodan glow particle
- super_l_hand - left hand daodan glow particle (<BodyPart>LeftFist)
- super_r_hand - right hand daodan glow particle (<BodyPart>RightFist)
- <Type> provide particle (file name without prefix BINA3RAP and without suffix .oni)
- <BodyPart> means bone Id, see TRIA; also allowed: "KillImpact"
ONIA: Oni Character Impact Array
- ONIA is used for special attacks as kind of extension to CBPI in ONIE.
- <Name> is anchor for TRAM link, <Type> and <Modifier> are links for ONIE. "Light", "Medium" and "Heavy" are possible modifier.
- See ONIE for more information.
XML structure
<ONIA id="4"> <Impacts> <ONIAImpact> <Name>...</Name> <Type>Bar_Super_Punch</Type> <Modifier>Heavy</Modifier> </ONIAImpact> [...] </ONIA>
CBPM: Character Body Part Materials
XML structure
The link Id is equal to bone list in TRIA. For example: eleventh material links to character's head.
<CBPM id="7"> <Materials> <Link>MtrlCloth</Link> <Link>MtrlCloth</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlCloth</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlCloth</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> <Link>MtrlArmor</Link> </Materials> </CBPM>
CBPI: Character Body Part Impacts
- They link to Impt files which are used by ONIE.
- Special attacks have there own Impt files. See ONIA.
XML structure
The link Id is equal to bone list in TRIA. For example: eleventh impact links to character's head.
<CBPI id="8"> <HitImpacts> <Link>ImptKick_Hit</Link> <Link>ImptKick_Hit</Link> <Link>ImptKick_Hit</Link> <Link>ImptKick_Hit</Link> <Link>ImptKick_Hit</Link> <Link>ImptKick_Hit</Link> <Link>ImptKick_Hit</Link> <Link>ImptKick_Hit</Link> <Link>ImptPunch_Hit</Link> <Link>ImptHead_Hit</Link> <Link>ImptHead_Hit</Link> <Link>ImptHead_Hit</Link> <Link>ImptPunch_Hit</Link> <Link>ImptPunch_Hit</Link> <Link>ImptPunch_Hit</Link> <Link>ImptHead_Hit</Link> <Link>ImptPunch_Hit</Link> <Link>ImptPunch_Hit</Link> <Link>ImptPunch_Hit</Link> </HitImpacts> <BlockedImpacts> <Link>ImptKick_Blocked</Link> <Link>ImptKick_Blocked</Link> <Link>ImptKick_Blocked</Link> <Link>ImptKick_Blocked</Link> <Link>ImptKick_Blocked</Link> <Link>ImptKick_Blocked</Link> <Link>ImptKick_Blocked</Link> <Link>ImptKick_Blocked</Link> <Link>ImptPunch_Blocked</Link> <Link>ImptHead_Blocked</Link> <Link>ImptHead_Blocked</Link> <Link>ImptHead_Blocked</Link> <Link>ImptPunch_Blocked</Link> <Link>ImptPunch_Blocked</Link> <Link>ImptPunch_Blocked</Link> <Link>ImptHead_Blocked</Link> <Link>ImptPunch_Blocked</Link> <Link>ImptPunch_Blocked</Link> <Link>ImptPunch_Blocked</Link> </BlockedImpacts> <KilledImpacts> <Link>ImptKick_Killed</Link> <Link>ImptKick_Killed</Link> <Link>ImptKick_Killed</Link> <Link>ImptKick_Killed</Link> <Link>ImptKick_Killed</Link> <Link>ImptKick_Killed</Link> <Link>ImptKick_Killed</Link> <Link>ImptKick_Killed</Link> <Link>ImptPunch_Killed</Link> <Link>ImptHead_Killed</Link> <Link>ImptHead_Killed</Link> <Link>ImptHead_Killed</Link> <Link>ImptPunch_Killed</Link> <Link>ImptPunch_Killed</Link> <Link>ImptPunch_Killed</Link> <Link>ImptHead_Killed</Link> <Link>ImptPunch_Killed</Link> <Link>ImptPunch_Killed</Link> <Link>ImptPunch_Killed</Link> </KilledImpacts> </CBPI>
list of original ONCC
barabus bdfem_1 bdfem_2 bdfem_3 bdfem_4 bd_1 bd_2 bd_3 bd_4 bd_5 comguy_1 comguy_2 comguy_3 CopfemA1 CopfemA2 CopmaleA1 CopmaleA2 CopmaleA3 CopmaleA4 elite_easy_1 elite_easy_2 elite_easy_3 elite_hard_1 elite_hard_2 elite_hard_3 elite_med_1 elite_med_2 elite_med_3 generic_female_1 generic_female_2 generic_female_3 generic_female_4 generic_female_5 generic_female_6 generic_female_7 generic_female_8 generic_female_9 generic_male_1 generic_male_2 generic_male_3 generic_male_4 generic_male_5 generic_male_6 griffin_generic griffin_swat k3 k4_A k4_F k4_G k4_K k4_L konoko_generic mad_bomber muro_generic mutantmuro ninjabot ninja_easy_1 ninja_easy_2 ninja_easy_3 ninja_hard_1 ninja_hard_2 ninja_hard_3 ninja_med_1 ninja_med_2 ninja_med_3 red_easy_1 red_easy_2 red_easy_3 red_hard_1 red_hard_2 red_hard_3 red_med_1 red_med_2 red_med_3 security_guard_1 security_guard_2 Shinzom_generic SH_dream_lab SH_generic sniper_generic striker_dream_lab striker_easy_1 striker_easy_2 striker_easy_3 striker_hard_1 striker_hard_2 striker_hard_3 striker_med_1 striker_med_2 striker_med_3 super_ninja_1 tanker_easy_1 tanker_hard_1 tanker_med_1 TCTF_lite_1 TCTF_lite_blackops_1 TCTF_swat_1 TCTF_swat_blackops_1 thug_air_1 thug_air_2 thug_air_3 thug_air_4 thug_air_5 thug_mfg_1 thug_mfg_2 thug_mfg_3 thug_mfg_4 thug_mfg_5 thug_neuro_1 thug_neuro_2 thug_neuro_3 thug_neuro_4 thug_neuro_5 thug_pow_1 thug_pow_2 thug_pow_3 thug_pow_4 thug_pow_5 thug_wh_1 thug_wh_2 thug_wh_3 thug_wh_4 thug_wh_5
character balance
Is a caracter sufficient balanced?
To decide on this we might compare vanilla characters and then compare against custome characters.
Values that could be taken into account:
- health
- attack strength (per TRAM)
- attack speed (frame count) (per TRAM)
- average attack movement set damage
- max attack damage per minute
- damage multipliers (<DamageFactors>)
- block changes (melee profile)