XML:ONCC: Difference between revisions
Paradox-01 (talk | contribs) (some copy paste) |
Paradox-01 (talk | contribs) (and the rest of it) |
||
Line 19: | Line 19: | ||
==<AirConstants>== | ==<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 [http://mods.oni2.net/node/83 (quite fun!)] | |||
;Falling height: let FH1 be the height at <MaxNoDamageFallingHeight> | |||
:let FH2 be the height at <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 | |||
{| | {| | ||
{{table}} | {{table}} | ||
|width=200px|<FallGravity> | |width=200px|<FallGravity> | ||
|width=40px| float | |||
| downwards velocity? (always 0.55) | | downwards velocity? (always 0.55) | ||
|- | |- | ||
| <JumpGravity> | | <JumpGravity> | ||
| float | |||
| downward gravity acceleration | | downward gravity acceleration | ||
|- | |- | ||
| <JumpStartVelocity> | | <JumpStartVelocity> | ||
| float | |||
| starting velocity for a simple (tap) JUMP | | starting velocity for a simple (tap) JUMP | ||
|- | |- | ||
| <MaxVelocity> | | <MaxVelocity> | ||
| float | |||
| limit velocity for jumping and gravity flight | | limit velocity for jumping and gravity flight | ||
|- | |- | ||
| <JetpackAcceleration> | | <JetpackAcceleration> | ||
| float | |||
| upward acceleration (jetpack) if you hold JUMP | | upward acceleration (jetpack) if you hold JUMP | ||
|- | |- | ||
| <FramesFallGravity> | | <FramesFallGravity> | ||
| | | int16 | ||
| gravity timer? (always 7) | |||
|- | |- | ||
| <JetpackTimer> | | <JetpackTimer> | ||
| int16 | |||
| time during which you can use the jetpack | | time during which you can use the jetpack | ||
|- | |- | ||
| <MaxNoDamageFallingHeight> | | <MaxNoDamageFallingHeight> | ||
| float | |||
| maximal falling height without damage | | maximal falling height without damage | ||
|- | |- | ||
| <MaxDamageFallingHeight> | | <MaxDamageFallingHeight> | ||
| float | |||
| maximal falling height with damage | | maximal falling height with damage | ||
|} | |} | ||
Line 72: | Line 80: | ||
{{table}} | {{table}} | ||
|width=200px| <Texture> | |width=200px| <Texture> | ||
| | |width=40px| float | ||
| <font color="#777777">TXMP</font>file<font color="#777777">.oni</font> | |||
|- | |- | ||
| <MaxHeight> | | <MaxHeight> | ||
| float | |||
| height where the shadow fades out completely | | height where the shadow fades out completely | ||
|- | |- | ||
| <FadeHeight> | | <FadeHeight> | ||
| | | float | ||
| height where the diameter of the shadow decreases and the shadow fades out half | |||
|- | |- | ||
| <SizeMax> | | <SizeMax> | ||
| | | float | ||
| height where the diameter of the shadow decreases | |||
|- | |- | ||
| <SizeFade> | | <SizeFade> | ||
| | | float | ||
| height where the diameter of the shadow decreases | |||
|- | |- | ||
| <SizeMin> | | <SizeMin> | ||
| | | float | ||
| height where the diameter of the shadow decreases | |||
|- | |- | ||
| <AlphaMax> | | <AlphaMax> | ||
| int16 | |||
| transparency of the shadow for the first part of a jump | | transparency of the shadow for the first part of a jump | ||
|- | |- | ||
| <AlphaFade> | | <AlphaFade> | ||
| int16 | |||
| transparency of the shadow for the second part of a jump | | transparency of the shadow for the second part of a jump | ||
|} | |} | ||
Line 101: | Line 117: | ||
{{table}} | {{table}} | ||
|width=200px| <JumpDistance> | |width=200px| <JumpDistance> | ||
| | |width=40px| float | ||
| always the same (25) | |||
|- | |- | ||
| <JumpHeight> | | <JumpHeight> | ||
| | | int8 | ||
| always the same (22) | |||
|- | |- | ||
| <JumpDistanceSquares> | | <JumpDistanceSquares> | ||
| | | int 8 | ||
| always the same (6) | |||
|} | |} | ||
Line 115: | Line 134: | ||
{{table}} | {{table}} | ||
|width=200px| <RayIncrement> | |width=200px| <RayIncrement> | ||
|width=40px| float | |||
|always the same (40) | |always the same (40) | ||
|- | |- | ||
| <RayMax> | | <RayMax> | ||
| float | |||
| always the same (300) | | always the same (300) | ||
|- | |- | ||
| <RayAngle> | | <RayAngle> | ||
| float | |||
| always the same (0.017453 = PI/180) | | always the same (0.017453 = PI/180) | ||
|- | |- | ||
| <RayAngleMax> | | <RayAngleMax> | ||
| float | |||
| always the same (1.57 = PI/2) | | always the same (1.57 = PI/2) | ||
|} | |} | ||
Line 132: | Line 155: | ||
{{table}} | {{table}} | ||
|width=200px| <DistanceXZ> | |width=200px| <DistanceXZ> | ||
|width=40px| float | |||
| always the same (5) | | always the same (5) | ||
|- | |- | ||
| <DistanceY> | | <DistanceY> | ||
| float | |||
| always the same (1) | | always the same (1) | ||
|} | |} | ||
Line 143: | Line 168: | ||
{{table}} | {{table}} | ||
|width=200px| <HypoRegenerationRate> | |width=200px| <HypoRegenerationRate> | ||
|width=40px| int16 | |||
| (inverse) hypo regeneration rate in frames per health point; overhealth regeneration rate is not affected by this | | (inverse) hypo regeneration rate in frames per health point; overhealth regeneration rate is not affected by this | ||
Line 154: | Line 180: | ||
{| | {| | ||
{{table}} | {{table}} | ||
|width=200px| | |width=200px| | ||
| always the same | |width=40px| float | ||
| always the same (193600); this is 440 squared | |||
|- | |- | ||
| <Float> | | <Float> | ||
| always the same | | float | ||
| always the same (48400); this is 220 squared | |||
|- | |- | ||
| <Float> | | <Float> | ||
| always the same | | float | ||
| always the same (12100); this is 110 squared | |||
|- | |- | ||
| <Float> | | <Float> | ||
| always the same | | float | ||
| always the same (0) | |||
|- | |- | ||
| <Float> | | <Float> | ||
| always the same | | float | ||
| always the same (0) | |||
|} | |} | ||
Line 175: | Line 206: | ||
{{table}} | {{table}} | ||
|width=200px| <BasePercentage> | |width=200px| <BasePercentage> | ||
| | |width=40px|int16 | ||
| hurt_base_percentage; always the same (35) | |||
|- | |- | ||
| <MaxPercentage> | | <MaxPercentage> | ||
| | | int16 | ||
| hurt_max_percentage; always the same (90) | |||
|- | |- | ||
| <PercentageThreshold> | | <PercentageThreshold> | ||
| | | int16 | ||
| hurt_percentage_threshold; always the same (15) | |||
|- | |- | ||
| <Timer> | | <Timer> | ||
| | | int16 | ||
| hurt_timer; always the same (120) | |||
|- | |- | ||
| <MinTimer> | | <MinTimer> | ||
| | | int16 | ||
| hurt_min_timer; always the same (35) | |||
|- | |- | ||
| <MaxLight> | | <MaxLight> | ||
| | | int16 | ||
| always the same (1) | |||
|- | |- | ||
| <MaxMedium> | | <MaxMedium> | ||
| | | int16 | ||
| always the same (2) | |||
|- | |- | ||
| <DeathChance> | | <DeathChance> | ||
| | | int16 | ||
| always the same (100) | |||
|- | |- | ||
| <VolumeTreshold> | | <VolumeTreshold> | ||
| | | int16 | ||
| hurt_volume_threshold; always the same (10) | |||
|- | |- | ||
| <MediumTreshold> | | <MediumTreshold> | ||
| | | int16 | ||
| hurt_medium_threshold; always the same (12) | |||
|- | |- | ||
| <HeavyTreshold> | | <HeavyTreshold> | ||
| | | int16 | ||
| hurt_heavy_threshold; always the same (22) | |||
|- | |- | ||
| <MinVolume> | | <MinVolume> | ||
| | | float | ||
| minimal sound volume | |||
|- | |- | ||
| <LightSound> | | <LightSound> | ||
| | | char[32] | ||
| <font color="#777777">OSBD</font>file<font color="#777777">.imp.oni</font> (only the file name) | |||
|- | |- | ||
| <MediumSound> | | <MediumSound> | ||
| | | char[32] | ||
| <font color="#777777">OSBD</font>file<font color="#777777">.imp.oni</font> (only the file name) | |||
|- | |- | ||
| <HeavySound> | | <HeavySound> | ||
| | | char[32] | ||
| <font color="#777777">OSBD</font>file<font color="#777777">.imp.oni</font> (only the file name) | |||
|- | |- | ||
| <DeathSound> | | <DeathSound> | ||
| | | char[32] | ||
| <font color="#777777">OSBD</font>file<font color="#777777">.imp.oni</font> (only the file name) | |||
|} | |} | ||
Line 228: | Line 275: | ||
{{table}} | {{table}} | ||
|width=200px| <Flags> | |width=200px| <Flags> | ||
|width=40|flag | |||
| | | | ||
: NoStartleAnim | : NoStartleAnim | ||
: EnableMeleeFireDodge | : EnableMeleeFireDodge | ||
: ShootDodge | : ShootDodge (requires EnableMeleeFireDodge; AI tries to face shooter and shoot back while dodging) | ||
: RunAwayDodge | : RunAwayDodge (requires EnableMeleeFireDodge; overrides ShootDodge; firingspread/projectile dodge enabled for weapons; AI isn't shooting, it just tends to run away, not facing shooter) | ||
: NotUsed | : NotUsed | ||
|- | |- | ||
| <RotationSpeed> | | <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> | | <DazedMinFrames> | ||
| | | int16 | ||
| minimal fallen time; number of frames for which AI remains in *fallen* position when it is knockdowned | |||
|- | |- | ||
| <DazedMaxFrames> | | <DazedMaxFrames> | ||
| | | int16 | ||
| maximal fallen time; number of frames for which AI remains in *fallen* position when it is knockdowned | |||
|- | |- | ||
| <DodgeReactFrames> | | <DodgeReactFrames> | ||
| | | uint32 | ||
| number of frames after which AI realizes that it is in the firing spread and it starts dodging | |||
|- | |- | ||
| <DodgeTimeScale> | | <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> | | <DodgeWeightScale> | ||
| | | float | ||
| maximal firingspread dodge amount; IMO similar to maneouvre variable | |||
|- | |- | ||
| | | <Targeting> | ||
| | | | ||
| see [[#<Targeting>|HERE]] | |||
|- | |- | ||
| | | <WeaponSkills> | ||
| | | | ||
| see [[#<WeaponSkills>|HERE]] | |||
|- | |- | ||
| <DeadMakeSureDelay> | | <DeadMakeSureDelay> | ||
| | | int32 | ||
| always the same (90), AI waits at the corpse for some time? | |||
|- | |- | ||
| <InvestigateBodyDelay> | | <InvestigateBodyDelay> | ||
| | | int32 | ||
| always the same (240), unused ? | |||
|- | |- | ||
| <LostContactDelay> | | <LostContactDelay> | ||
| | | int32 | ||
| always the same (180) | |||
|- | |- | ||
| <DeadTauntChance> | | <DeadTauntChance> | ||
| | | int32 | ||
| chance of AI doing a taunt when player or AI's of another team dies | |||
|- | |- | ||
| <GoForGunChance> | | <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> | | <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> | | <CombatId> | ||
| | | int16 | ||
| [[OBD_talk:BINA/OBJC/CMBT|combat profile ID]] | |||
|- | |- | ||
| <MeleeId> | | <MeleeId> | ||
| | | int16 | ||
| [[OBD_talk:BINA/OBJC/MELE|melee profile ID]] | |||
|- | |- | ||
| | | <SoundConstants> | ||
| | | | ||
| see [[OBD_talk:SNDD#step_1:_preparing_the_TRAM|HERE]] | |||
|- | |- | ||
| <HostileThreatDefiniteTimer> | | <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> | | <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> | | <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> | | <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> | | <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> | | <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> | | <EarshotRadius> | ||
| | | float | ||
| earshot radius; defines size of the sound-collision sphere around AI | |||
|} | |} | ||
Line 313: | Line 385: | ||
{{table}} | {{table}} | ||
|width=200px| <StartleMissAngle> | |width=200px| <StartleMissAngle> | ||
| | | width=40px| float | ||
| always the same for TURR and ONCC (0.5) | |||
|- | |- | ||
| <StartleMissDistance> | | <StartleMissDistance> | ||
| | | float | ||
| always the same for TURR and ONCC (25) | |||
|- | |- | ||
| <PredictAmount> | | <PredictAmount> | ||
| | | float | ||
| always the same for TURR | |||
|- | |- | ||
| <PredictPositionDelayFrames> | | <PredictPositionDelayFrames> | ||
| | | int32 | ||
| always the same for TURR | |||
|- | |- | ||
| <PredictDelayFrames> | | <PredictDelayFrames> | ||
| | | int32 | ||
| always the same for TURR | |||
|- | |- | ||
| <PredictVelocityFrames> | | <PredictVelocityFrames> | ||
| | | int32 | ||
| always the same for TURR | |||
|- | |- | ||
| <PredictTrendFrames> | | <PredictTrendFrames> | ||
| | | int32 | ||
| always the same for TURR | |||
|} | |} | ||
===<WeaponSkills>=== | ===<WeaponSkills>=== | ||
{|width=100%| | |||
|valign=top| | |||
{{Table|width=""|align="left"}} | |||
|-BGCOLOR="#E9E9E9" ALIGN=CENTER | |||
!Weapon ||recoil||bestangle||error||decay||inaccuracy||delays | |||
|-ALIGN=CENTER | |||
|'''w0_sec''' || 0.0 || 0.000000|| 0.00|| 1.0 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w1_tap''' || 0.0 || 0.000000|| 0.40|| 0.4 || 0.0 || 30 - 45 | |||
|-ALIGN=CENTER | |||
|'''w2_sap''' || 0.3 || 0.013962|| 0.13|| 1.0 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w3_phr''' || 0.3 || 0.010472|| 0.05|| 0.5 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w4_psm''' || 0.3 || 0.015707|| 0.03|| 0.2 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w5_sbg''' || 0.3 || 0.001745|| 0.00|| 0.1 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w6_vdg''' || 0.3 || 0.001745|| 0.13|| 0.9 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w7_scc''' || 0.3 || 0.001745|| 0.05|| 0.1 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w8_mbo''' || 0.3 || 0.005236|| 0.01|| 0.5 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w9_scr''' || 0.3 || 0.010472|| 0.04|| 0.5 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w10_sni'''|| 0.0 || 0.000000|| 0.00|| 1.0 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w11_ba1'''|| 0.0 || 0.000000|| 0.00|| 1.0 || 1.0 || 0 - 0 | |||
|-ALIGN=CENTER | |||
|'''w12_ba2'''|| 0.0 || 0.000000|| 0.00|| 1.0 || 1.0 || 0 - 0 | |||
|} | |||
|valign=top| | |||
{| | {| | ||
{{table}} | {{table}} | ||
|width=200px| <RecoilCompensation> | |width=200px| <RecoilCompensation> | ||
| | |width=40px| float | ||
| (float; 0.0 = min, 1.0 = max) | |||
|- | |- | ||
| <BestAimingAngle> | | <BestAimingAngle> | ||
| | | float | ||
| best aiming angle in radians | |||
|- | |- | ||
| <ShotGroupError> | | <ShotGroupError> | ||
| | | float | ||
| shot grouping error | |||
|- | |- | ||
| <ShotGroupDecay> | | <ShotGroupDecay> | ||
| | | float | ||
| shot grouping decay | |||
|- | |- | ||
| <ShootingInaccuracyMultiplier> | | <ShootingInaccuracyMultiplier> | ||
| | | float | ||
| shooting inaccuracy multiplier | |||
|- | |- | ||
| <MinShotDelay> | | <MinShotDelay> | ||
| | | uint16 | ||
| minimum delay between shots in frames | |||
|- | |- | ||
| <MaxShotDelay> | | <MaxShotDelay> | ||
| uint16 | |||
| maximum delay between shots in frames | |||
|} | |||
;AI Shooting Skills | |||
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): | |||
{| | |||
| | | | ||
: <VerticalRange>0.766044438</VerticalRange> | |||
: <CentralRange>0.819152057</CentralRange> | |||
: <CentralMax>0.57357645 </CentralMax> | |||
: <PeripheralRange>0.1736482</PeripheralRange> | |||
: <PeripheralMax>-0.42261824</PeripheralMax> | |||
| | |||
: = 40° | |||
: = 35° | |||
: = 55° | |||
: = 80° | |||
: = 115° | |||
|} | |} | ||
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. | |||
{| | {| | ||
{{table}} | {{table}} | ||
|width=200px| <CentralDistance> | |width=200px| <CentralDistance> | ||
| | |width=40px| float | ||
| central vision distance | |||
|- | |- | ||
| <PeripheralDistance> | | <PeripheralDistance> | ||
| | | float | ||
| peripheral vision distance | |||
|- | |- | ||
| <VerticalRange> | | <VerticalRange> | ||
| | | float | ||
| vertical vision range | |||
|- | |- | ||
| <CentralRange> | | <CentralRange> | ||
| | | float | ||
| central vision range | |||
|- | |- | ||
| <CentralMax> | | <CentralMax> | ||
| | | float | ||
| central vision max | |||
|- | |- | ||
| <PeripheralRange> | | <PeripheralRange> | ||
| | | float | ||
| peripheral vision range | |||
|- | |- | ||
| <PeripheralMax> | | <PeripheralMax> | ||
| | | float | ||
| peripheral vision max | |||
|} | |} | ||
Line 391: | Line 549: | ||
{{table}} | {{table}} | ||
|width=200px| <Variant> | |width=200px| <Variant> | ||
| ONCV | |width=40px|string | ||
| <font color="#777777">ONCV</font>file<font color="#777777">.oni</font>, defines variants and upgrades | |||
|- | |- | ||
| <Particles> | | <Particles> | ||
| ONCP instance number | | string | ||
| [[#ONCP: character particle|ONCP]] instance number | |||
|- | |- | ||
| <Impacts> | | <Impacts> | ||
| ONIA instance number | | string | ||
| [[#ONIA: Oni character impact array|ONIA]] instance number | |||
|- | |- | ||
| <ImpactModifierName> | | <ImpactModifierName> | ||
| | | flag | ||
| used to choose correct effect from [[OBD_talk:BINA/ONIE#XML_flags|ONIE]]; impact name -> material name -> modifier (<Component> must be probably "Impact") | |||
: Any | |||
: Light | |||
: Medium | |||
: Heavy | |||
|- | |- | ||
| <Impacts> | | <Impacts> | ||
| | | string | ||
| holds a lot <ONCCImpact><Name><font color="#777777">Impt</font>name<font color="#777777">.oni</font> for character-environment collision; see [[OBD_talk:BINA/ONIE#Visual_guides:_weapon.2C_melee.2C_environment|... ONIE in relation to characters]] | |||
|- | |- | ||
| <DeathParticle> | | <DeathParticle> | ||
| | | link | ||
| in vanilla Oni only Mad Bomber uses it | |||
|- | |- | ||
| <BodySet> | | <BodySet> | ||
| TRBS file | | link | ||
| <font color="#777777">TRBS</font>file<font color="#777777">.oni</font> | |||
|- | |- | ||
| <BodyTextures> | | <BodyTextures> | ||
| TRMA file | | link | ||
| <font color="#777777">TRMA</font>file<font color="#777777">.oni</font> | |||
|- | |- | ||
| <BodyMaterials> | | <BodyMaterials> | ||
| string | |||
| [[#CBPM: character body part materials|CBPM]] instance number | | [[#CBPM: character body part materials|CBPM]] instance number | ||
|- | |- | ||
| <BodyImpacts> | | <BodyImpacts> | ||
| string | |||
| [[#CBPI: character body part impacts|CBPI]] instance number | | [[#CBPI: character body part impacts|CBPI]] instance number | ||
|- | |- | ||
| <FightModeTimer> | | <FightModeTimer> | ||
| | | int32 | ||
| fight mode timer in 1/60 seconds | |||
|- | |- | ||
| <IdleAnimation1Timer> | | <IdleAnimation1Timer> | ||
| | | int32 | ||
| first idle animation timer in 1/60 seconds | |||
|- | |- | ||
| <IdleAnimation2Timer> | | <IdleAnimation2Timer> | ||
| | | int32 | ||
| second idle animation timer in 1/60 seconds | |||
|- | |- | ||
| <Health> | | <Health> | ||
| | | int32 | ||
| basic health of the character model; extra health information for every unique character are stored in the [[OBD_talk:BINA/OBJC/CHAR#XML|BINACJBOCharacter.oni]] file | |||
|- | |- | ||
| <FeetBones> | | <FeetBones> | ||
| flag | |||
| | | | ||
: LeftFoot | |||
: RightFoot | |||
|- | |- | ||
| <MinBodySizeFactor> | | <MinBodySizeFactor> | ||
| | | float | ||
| minimal body size factor | |||
|- | |- | ||
| <MaxBodySizeFactor> | | <MaxBodySizeFactor> | ||
| | | float | ||
| maximal body size factor | |||
|- | |- | ||
| <DamageFactors> | | <DamageFactors> | ||
| | | | ||
| see [[#<DamageFactors>|HERE]] | |||
|- | |- | ||
| <BossShieldProtectAmount> | | <BossShieldProtectAmount> | ||
| | | float | ||
| BossShield Protect Amount | |||
|- | |- | ||
| <Animations> | | <Animations> | ||
| | | link | ||
| <font color="#777777">TRAC</font>file<font color="#777777">.oni</font> | |||
|- | |- | ||
| <AimingScreens> | | <AimingScreens> | ||
| | | link | ||
| <font color="#777777">TRAS</font>file<font color="#777777">.oni</font> | |||
|- | |- | ||
| <AIRateOfFire> | | <AIRateOfFire> | ||
| | | int16 | ||
| AI Rate of Fire | |||
|- | |- | ||
| <DeathDeleteDelay> | | <DeathDeleteDelay> | ||
| | | int16 | ||
| time between death and deletion, in frames (about 3 seconds for mad bomber) | |||
|- | |- | ||
| <WeaponHand> | | <WeaponHand> | ||
| flag | |||
| | | | ||
: 0 - right | |||
: 1 - left | |||
|- | |- | ||
| <HasDaodanPowers> | | <HasDaodanPowers> | ||
| | | int8 | ||
| when set to 1 indicates that character has daodan powers (character does more damage in overpower mode) | |||
|- | |- | ||
| <HasSupershield> | | <HasSupershield> | ||
| | | int8 | ||
| when set to 1 indicates that character has supershield | |||
* is visible as red shield when overpowered | |||
* needs daodan flag above and 51% overpower to be enabled; chenille cheat works too | |||
* now it prevents damage from weapon fire and melee (exception are throws) | |||
* received (melee) hits cause not blue block flashes but orange flares (see [http://paradox.oni2.net/Bilder/blocked_attacks_on_51percent_overpower_plus_daodan-flag_plus_supershield.png HERE]) | |||
|- | |- | ||
| <CantTouchThis> | | <CantTouchThis> | ||
| | | int8 | ||
| when set to 1, generically turns on canttouchthis cheat for this ONCC (used by ONCCMutantMuro) | |||
|} | |||
===<DamageFactors>=== | |||
The following 7 float values corespond to damage types. | |||
{| | |||
{{table}} | |||
|width=200px| <Float> | |||
|width=40px| float | |||
| somthing with normal damage ? | |||
|- | |||
| <Float> | |||
| float | |||
| something with minor stun ? | |||
|- | |||
| <Float> | |||
| float | |||
| major stun timer; specifies how long should be this char stunned when hit with w6_vdg; the longest time possible to be stunned is when this field is zero. Then this ONCC is stunned for 200 frames (30 frames for initial stagger + the rest of the frames is stun animation). The shortest time is for 1.000000 (no stagger/stun at all) | |||
|- | |||
| <Float> | |||
| float | |||
| something with minor knockdown ? | |||
|- | |||
| <Float> | |||
| float | |||
| something with major knockdown ? | |||
|- | |||
| <Float> | |||
| float | |||
| something with blownup ? | |||
|- | |||
| <Float> | |||
| float | |||
| something with pickup ? | |||
|} | |} | ||
Revision as of 13:09, 12 April 2012
The xml code on this page is based on onisplit v0.9.61.0 |
ONCC: Oni character class
general information
- ONCP, ONIA, OBPI and OBPM are part of ONCC*.oni files.
- ONCC files can be found in Edition/GameDataFolder/level0_Final
- The XML tags are more or less self-explanatory - if not, look at the hex page.
Things that still need deeper explanation:
- <CoverConstants>
- <AutoFreezeConstants>
- <LODConstants>
<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 the height at <MaxNoDamageFallingHeight>
- let FH2 be the height at <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
<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>
<Texture> | float | TXMPfile.oni |
<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>
<JumpDistance> | float | always the same (25) |
<JumpHeight> | int8 | always the same (22) |
<JumpDistanceSquares> | int 8 | always the same (6) |
<CoverConstants>
<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>
<DistanceXZ> | float | always the same (5) |
<DistanceY> | float | always the same (1) |
<InventoryConstants>
<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>
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>
<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>
<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>
<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.
<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.
<Variant> | string | ONCVfile.oni, defines variants and upgrades |
<Particles> | string | ONCP instance number |
<Impacts> | string | ONIA instance number |
<ImpactModifierName> | flag | used to choose correct effect from ONIE; impact name -> material name -> modifier (<Component> must be probably "Impact")
|
<Impacts> | string | holds a lot <ONCCImpact><Name>Imptname.oni for character-environment collision; see ... ONIE in relation to characters |
<DeathParticle> | link | in vanilla Oni only Mad Bomber uses it |
<BodySet> | link | TRBSfile.oni |
<BodyTextures> | link | TRMAfile.oni |
<BodyMaterials> | string | CBPM instance number |
<BodyImpacts> | string | CBPI instance number |
<FightModeTimer> | int32 | fight mode timer in 1/60 seconds |
<IdleAnimation1Timer> | int32 | first idle animation timer in 1/60 seconds |
<IdleAnimation2Timer> | int32 | second idle animation timer in 1/60 seconds |
<Health> | int32 | basic health of the character model; extra health information for every unique character are stored in the BINACJBOCharacter.oni file |
<FeetBones> | flag |
|
<MinBodySizeFactor> | float | minimal body size factor |
<MaxBodySizeFactor> | float | maximal body size factor |
<DamageFactors> | see HERE | |
<BossShieldProtectAmount> | float | BossShield Protect Amount |
<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 corespond to damage types.
<Float> | float | somthing with normal damage ? |
<Float> | float | something with minor stun ? |
<Float> | float | major stun timer; specifies how long should be this char stunned when hit with w6_vdg; the longest time possible to be stunned is when this field is zero. Then this ONCC is stunned for 200 frames (30 frames for initial stagger + the rest of the frames is stun animation). The shortest time is for 1.000000 (no stagger/stun at all) |
<Float> | float | something with minor knockdown ? |
<Float> | float | something with major knockdown ? |
<Float> | float | something with blownup ? |
<Float> | float | something with pickup ? |
ONCP: character particle
- 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
- 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 material 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>
special ONCC overview
"Here you can download the complete overview of all used different ONCC files as a text file.
Copy it to a spreadsheet calculation program like Excel." - ssg