OBD:BINA/OBJC/CMBT: Difference between revisions
No edit summary |
m (added family to footer template call) |
||
(37 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
{{OBD OBJC Header|align=center|type=CMBT|prev=CHAR|next=CONS|name=Combat | {{OBD OBJC Header | align=center | type=CMBT | prev=CHAR | next=CONS | name=Combat Profile | stuff=b_cb}} | ||
---- | ==File description== | ||
--- | ===General settings=== | ||
[[image:bin_r_cb.gif]] | |||
{{Table}} | |||
{{OBDth}} | |||
{{OBDtr| 0x00 | 4CC |FF0000| 43 4A 42 4F | OBJC | objects }} | |||
{{OBDtr| 0x04 | int32 |FFFF00| B0 0D 00 00 | 35628 | length (in bytes) to end of OBJC from here }} | |||
{{OBDtr| 0x08 | int32 |00FF00| 27 00 00 00 | 39 | object list version }} | |||
{{OBDtr| 0x0C | int32 |00FFFF| B4 00 00 00 | 180 | size of the following object in bytes }} | |||
{{OBDtrBK|First object (black outline)}} | |||
{{OBDtr| 0x00 | 4CC |FFC8C8| 54 42 4D 43 | TBMC | combat }} | |||
{{OBDtr| 0x04 | int32 |FFFFC8| 70 01 00 00 | 368 | object ID }} | |||
{{OBDtr| 0x08 | int32 |C8FFC8| 00 00 00 00 | 0 | object flags }} | |||
{{OBDtr| 0x0C | float |C8FFFF| 13 55 5F C3 |-223.332321| x-position of handle }} | |||
{{OBDtr| 0x10 | float |C8FFFF| D4 A8 8E 41 | 17.832436 | y-position of handle }} | |||
{{OBDtr| 0x14 | float |C8FFFF| C3 05 E9 C2 |-116.511253| z-position of handle }} | |||
{{OBDtr| 0x18 | float |FFC8FF| 00 00 00 00 | 0.000000 | x-rotation of handle in degrees }} | |||
{{OBDtr| 0x1C | float |FFC8FF| 00 00 00 00 | 0.000000 | y-rotation of handle in degrees }} | |||
{{OBDtr| 0x20 | float |FFC8FF| 00 00 00 00 | 0.000000 | z-rotation of handle in degrees }} | |||
{{OBDtr2|0x24 | char[64] |FFC800| Stand_and_Fire | name }} | |||
{{OBDtr| 0x64 | int32 |C800C8| 00 00 00 00 | 0 | combat ID (looked up from [[OBD:BINA/OBJC/CHAR|Character.BINA]]) }} | |||
|} | |||
===Behavior part=== | |||
{{Table}} | |||
{{OBDth}} | |||
{{OBDtr| 0x68 | int32 |C87C64| 02 00 00 00 | 2 | long range behavior; the following values are possible (values in dec): | |||
:00 - none | |||
:01 - stare | |||
:02 - hold and fire | |||
:03 - firing charge | |||
:04 - melee | |||
:05 - Barabbas shoot | |||
:06 - Barabbas advance | |||
:07 - Barabbas melee | |||
:08 - Superninja fireball | |||
:09 - Superninja advance | |||
:10 - Superninja melee | |||
:11 - run for alarm (not used in Oni) | |||
:12 - Mutant Muro melee | |||
:13 - Muro thunderbolt | |||
}} | |||
{{OBDtr| 0x6C | int32 |B0C3D4| 02 00 00 00 | 2 | medium range behavior; values as above }} | |||
{{OBDtr| 0x70 | int32 |E7CEA5| 02 00 00 00 | 2 | short range behavior (hand to hand behavior); values as above }} | |||
{{OBDtr| 0x74 | int32 |FFDDDD| 02 00 00 00 | 2 | medium retreat behavior; values as above }} | |||
{{OBDtr| 0x78 | int32 |64AAAA| 02 00 00 00 | 2 | long retreat behavior; values as above }} | |||
|} | |||
===Combat part=== | |||
{{Table}} | |||
{{OBDth}} | |||
{{OBDtr| 0x7C | float |EBEBEB| 00 00 F0 42 | 120.000000| long/medium range; distance of the border between long and medium ranges; you can make it visible with the script command *ai2_showcombatranges <nowiki>=</nowiki> 1* }} | |||
{{OBDtr| 0x80 | int32 |8C8CCC| 01 00 00 00 | 1 | melee override; see below; the following values are possible: | |||
:0 - nothing | |||
:1 - if punched | |||
:2 - (canceled) | |||
:3 - short Crange | |||
:4 - medium range | |||
:5 - always melee | |||
}} | |||
{{OBDtr| 0x84 | int32 |FF00C8| 00 00 00 00 | 0 | if no gun; behavior of AI which doesn't have a gun in its hand ( but can have it holstered); the following values are possible: | |||
:0 - melee | |||
:1 - retreat | |||
:2 - run to alarm | |||
}} | |||
{{OBDtr| 0x88 | float |F0F096| 00 00 20 42 | 40.000000 | medium/short range; distance of the border between medium and short ranges; you can make it visible with the script command *ai2_showcombatranges <nowiki>=</nowiki> 1* }} | |||
{{OBDtr| 0x8C | float |00C864| 00 00 48 43 | 200.000000| pursuit distance; see below for info }} | |||
|} | |||
{ | ===Non-combatant part=== | ||
{{Table}} | |||
{{OBDth}} | |||
| | {{OBDtr| 0x90 | int32 |00C8FF| 58 02 00 00 | 600 | panic hurt (time in 1/60 seconds) }} | ||
| | {{OBDtr| 0x94 | int32 |00C8FF| 84 03 00 00 | 900 | panic gunfire (time in 1/60 seconds) }} | ||
| | {{OBDtr| 0x98 | int32 |00C8FF| 58 02 00 00 | 600 | panic melee (time in 1/60 seconds) }} | ||
{{OBDtr| 0x9C | int32 |00C8FF| B0 04 00 00 | 1200 | panic sight (time in 1/60 seconds) }} | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| | |||
| 600 | |||
| | |||
| | |||
| | |||
| 1200 | |||
| | |||
|} | |} | ||
===Alarm part=== | |||
{{Table}} | |||
{{OBDth}} | |||
{{OBDtr| 0xA0 | float |C80040| 00 00 96 43 | 300.000000| alarm search distance }} | |||
{{OBDtr| 0xA4 | float |C80040| 00 00 A0 42 | 80.000000 | alarm enemy ignore distance }} | |||
{{OBDtr| 0xA8 | float |FFCD96| 00 00 00 00 | 0.000000 | alarm enemy attack distance }} | |||
{{OBDtr| 0xAC | int32 |C8C864| 1E 00 00 00 | 30 | alarm damage threshold }} | |||
{{OBDtr| 0xB0 | int32 |C8C864| 68 01 00 00 | 360 | alarm fight timer }} | |||
|} | |} | ||
These settings affect the behavior of an AI that's running for a console (e.g., script command *ai2_doalarm*). For an example of how flexible the AI is when using alarm behavior, see [https://www.youtube.com/watch?v=CkzguNxjGEs this demo from Loser] where an AI completes Chapter 1. | |||
;alarm search distance | |||
:area around AI, where engine checks if there is some console with 40 bit (see [[OBD:BINA/OBJC/CONS|CONS]]). | |||
;Alarm enemy ignore distance | |||
:This one specifies an "ignore range". Enemies which are inside this range are not ignored but AI doesn't attack them. | |||
;Alarm enemy attack distance | |||
:Zero by default. | |||
:This one specifies an "attack range" around an AI running for an alarm. When there is an enemy inside, AI stops running for the console and attack the enemy (if AI knows about him, of course) | |||
:Nevertheless AI still keeps in mind that it should run for the console. So when there is no enemy inside this range and fight timer runs out, AI resumes running to the specified console. | |||
;Fight timer | |||
:When AI, which is running for the console, is engaged in a fight and enemy manages to disappear (either by phase-cloak or simply by hiding behind some corner), AI tries to chase him or looks for him. Alarm timer specifies how long should AI chase/look for the enemy. For chasing, timer starts when the enemy is outside *Alarm enemy attack distance*. Of course when the enemy escapes even from *Alarm enemy ignore range*, AI abandons him automatically. | |||
;Alarm damage threshold | |||
:Specifies how long AI, which is running for the console, remembers someone hurt it. Until this timer runs away, AI doesn't tend to use console. It only stays in fight stance near console, ready to fight. If someone hurts AI which is running for the console, then escapes and then tries to hurt it again while this timer isn't finished yet, AI remembers him and initatively attacks him the moment he steps inside *Alarm enemy attack distance*. | |||
---- | ---- | ||
Whole alarm logic can be tripped by: | |||
* *ai2_doalarm* command (suitable for geyser's rugby) | |||
* *run for alarm* (0b) behavior, altough this behavior alone does NOTHING, it just turns on *alarm search distance*. If there is no console with 40 bit in reach, AI stands still and just stares. | |||
* *run to alarm* if no gun event ( only when AI is unarmed ), again it turns on *alarm search distance*, but this time AI can do normal actions (attack, hunt) if there is no 40 bit console within reach. | |||
* ???Find alarm??? pm_pursue action, still unknown | |||
---- | ---- | ||
==Further info== | |||
===About pursuit distance=== | |||
First of all, pursuit is NOT when you have been seen and now running away. If you do that, AI is in *combat* mode, not *pursue* mode. You are pursued only when you have NOT been seen by central vision field (see [[OBD:ONCC|ONCC]]). So if some enemy does sound that touches AI's sound detection sphere, or when some enemy interferes with AI's peripheral vision field, AI goes into pursue mode with him. In this mode AI uses special behavior for investigating. According to the EXE, possibilities are (dunno if it is in proper order, it is raw EXE rip): | |||
:*Find Alarm | |||
:*Keep Looking | |||
:*Return To Job | |||
:*Glance | |||
:*Hunt - not implemented in Oni (accidentaly I have read error message in Manplant a few months ago saying that) | |||
:*Move | |||
:*Look | |||
:*Wait | |||
:*GoTo | |||
:*Forget | |||
What AI does while in pursuit mode depends on the last values in [[OBD:BINA/OBJC/CHAR|CHAR]].Go there for further info. | |||
So...what is the pursuit distance??? It is distance that is AI allowed to travel from its original location for *pursue* purposes. Set it high and AI can run through whole level if it hears or spots something. Set it low and AI will do just a few steps in a direction of disturbing action. | |||
---- | ---- | ||
===About melee override=== | |||
---- | First something about minimal shooting distance.It is in the [[OBD:ONWC|ONWC]] and determines closest range for AI to fire that weapon. If enemy goes closer, AI stops shooting and tends to run away until it reahes minimal shooting distance again. | ||
--- | Now if you set this minimal shooting distance higher than it is originally (for example try 200) you can have some fun chasing AIs as they are running away from you. | ||
{{OBD OBJC Footer | |||
Point is that if you set melee override to some range (for example 03 - short range) and then try it, you will see that the moment you are closer than minimal shooting distance AND you are in range which enables it (short range in this example) AI will switch to melee mode instead of running away. | |||
So you can make short range for example 200 units big and set min.shoot.dist. 100 units big and have melee override 03 -short range. AI will then shoot at you even if you are inside short range, but the moment you ecounter min.shoot.dist. it switches to melee. | |||
How it switches back to weapon when you run away back into min.shoot.dist. is not clear. So far it happens automatically after some time. Where is timer for that??? Let us know, if you know.... | |||
--[[User:Loser|Loser]] 09:03, 29 July 2007 (CEST) | |||
Try using ai2_report on a character, I noticed a timer next to the mode or something of that sort - Gumby :) | |||
==Dialogs from level0_Tools== | |||
[[Image:Tool dialog - Choose Combat.png]] | |||
[[Image:Tool dialog - Edit Combat.png]] | |||
{{OBD OBJC Footer | type=CMBT | prev=CHAR | next=CONS | name=Combat profile | family=Level}} | |||
{{OBD}} |
Latest revision as of 21:17, 9 December 2023
|
File description
General settings
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x00 | 4CC | 43 4A 42 4F | OBJC | objects |
0x04 | int32 | B0 0D 00 00 | 35628 | length (in bytes) to end of OBJC from here |
0x08 | int32 | 27 00 00 00 | 39 | object list version |
0x0C | int32 | B4 00 00 00 | 180 | size of the following object in bytes |
First object (black outline) | ||||
0x00 | 4CC | 54 42 4D 43 | TBMC | combat |
0x04 | int32 | 70 01 00 00 | 368 | object ID |
0x08 | int32 | 00 00 00 00 | 0 | object flags |
0x0C | float | 13 55 5F C3 | -223.332321 | x-position of handle |
0x10 | float | D4 A8 8E 41 | 17.832436 | y-position of handle |
0x14 | float | C3 05 E9 C2 | -116.511253 | z-position of handle |
0x18 | float | 00 00 00 00 | 0.000000 | x-rotation of handle in degrees |
0x1C | float | 00 00 00 00 | 0.000000 | y-rotation of handle in degrees |
0x20 | float | 00 00 00 00 | 0.000000 | z-rotation of handle in degrees |
0x24 | char[64] | Stand_and_Fire | name | |
0x64 | int32 | 00 00 00 00 | 0 | combat ID (looked up from Character.BINA) |
Behavior part
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x68 | int32 | 02 00 00 00 | 2 | long range behavior; the following values are possible (values in dec):
|
0x6C | int32 | 02 00 00 00 | 2 | medium range behavior; values as above |
0x70 | int32 | 02 00 00 00 | 2 | short range behavior (hand to hand behavior); values as above |
0x74 | int32 | 02 00 00 00 | 2 | medium retreat behavior; values as above |
0x78 | int32 | 02 00 00 00 | 2 | long retreat behavior; values as above |
Combat part
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x7C | float | 00 00 F0 42 | 120.000000 | long/medium range; distance of the border between long and medium ranges; you can make it visible with the script command *ai2_showcombatranges = 1* |
0x80 | int32 | 01 00 00 00 | 1 | melee override; see below; the following values are possible:
|
0x84 | int32 | 00 00 00 00 | 0 | if no gun; behavior of AI which doesn't have a gun in its hand ( but can have it holstered); the following values are possible:
|
0x88 | float | 00 00 20 42 | 40.000000 | medium/short range; distance of the border between medium and short ranges; you can make it visible with the script command *ai2_showcombatranges = 1* |
0x8C | float | 00 00 48 43 | 200.000000 | pursuit distance; see below for info |
Non-combatant part
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0x90 | int32 | 58 02 00 00 | 600 | panic hurt (time in 1/60 seconds) |
0x94 | int32 | 84 03 00 00 | 900 | panic gunfire (time in 1/60 seconds) |
0x98 | int32 | 58 02 00 00 | 600 | panic melee (time in 1/60 seconds) |
0x9C | int32 | B0 04 00 00 | 1200 | panic sight (time in 1/60 seconds) |
Alarm part
Offset | Type | Raw Hex | Value | Description |
---|---|---|---|---|
0xA0 | float | 00 00 96 43 | 300.000000 | alarm search distance |
0xA4 | float | 00 00 A0 42 | 80.000000 | alarm enemy ignore distance |
0xA8 | float | 00 00 00 00 | 0.000000 | alarm enemy attack distance |
0xAC | int32 | 1E 00 00 00 | 30 | alarm damage threshold |
0xB0 | int32 | 68 01 00 00 | 360 | alarm fight timer |
These settings affect the behavior of an AI that's running for a console (e.g., script command *ai2_doalarm*). For an example of how flexible the AI is when using alarm behavior, see this demo from Loser where an AI completes Chapter 1.
- alarm search distance
- area around AI, where engine checks if there is some console with 40 bit (see CONS).
- Alarm enemy ignore distance
- This one specifies an "ignore range". Enemies which are inside this range are not ignored but AI doesn't attack them.
- Alarm enemy attack distance
- Zero by default.
- This one specifies an "attack range" around an AI running for an alarm. When there is an enemy inside, AI stops running for the console and attack the enemy (if AI knows about him, of course)
- Nevertheless AI still keeps in mind that it should run for the console. So when there is no enemy inside this range and fight timer runs out, AI resumes running to the specified console.
- Fight timer
- When AI, which is running for the console, is engaged in a fight and enemy manages to disappear (either by phase-cloak or simply by hiding behind some corner), AI tries to chase him or looks for him. Alarm timer specifies how long should AI chase/look for the enemy. For chasing, timer starts when the enemy is outside *Alarm enemy attack distance*. Of course when the enemy escapes even from *Alarm enemy ignore range*, AI abandons him automatically.
- Alarm damage threshold
- Specifies how long AI, which is running for the console, remembers someone hurt it. Until this timer runs away, AI doesn't tend to use console. It only stays in fight stance near console, ready to fight. If someone hurts AI which is running for the console, then escapes and then tries to hurt it again while this timer isn't finished yet, AI remembers him and initatively attacks him the moment he steps inside *Alarm enemy attack distance*.
Whole alarm logic can be tripped by:
- *ai2_doalarm* command (suitable for geyser's rugby)
- *run for alarm* (0b) behavior, altough this behavior alone does NOTHING, it just turns on *alarm search distance*. If there is no console with 40 bit in reach, AI stands still and just stares.
- *run to alarm* if no gun event ( only when AI is unarmed ), again it turns on *alarm search distance*, but this time AI can do normal actions (attack, hunt) if there is no 40 bit console within reach.
- ???Find alarm??? pm_pursue action, still unknown
Further info
About pursuit distance
First of all, pursuit is NOT when you have been seen and now running away. If you do that, AI is in *combat* mode, not *pursue* mode. You are pursued only when you have NOT been seen by central vision field (see ONCC). So if some enemy does sound that touches AI's sound detection sphere, or when some enemy interferes with AI's peripheral vision field, AI goes into pursue mode with him. In this mode AI uses special behavior for investigating. According to the EXE, possibilities are (dunno if it is in proper order, it is raw EXE rip):
- Find Alarm
- Keep Looking
- Return To Job
- Glance
- Hunt - not implemented in Oni (accidentaly I have read error message in Manplant a few months ago saying that)
- Move
- Look
- Wait
- GoTo
- Forget
What AI does while in pursuit mode depends on the last values in CHAR.Go there for further info.
So...what is the pursuit distance??? It is distance that is AI allowed to travel from its original location for *pursue* purposes. Set it high and AI can run through whole level if it hears or spots something. Set it low and AI will do just a few steps in a direction of disturbing action.
About melee override
First something about minimal shooting distance.It is in the ONWC and determines closest range for AI to fire that weapon. If enemy goes closer, AI stops shooting and tends to run away until it reahes minimal shooting distance again. Now if you set this minimal shooting distance higher than it is originally (for example try 200) you can have some fun chasing AIs as they are running away from you.
Point is that if you set melee override to some range (for example 03 - short range) and then try it, you will see that the moment you are closer than minimal shooting distance AND you are in range which enables it (short range in this example) AI will switch to melee mode instead of running away.
So you can make short range for example 200 units big and set min.shoot.dist. 100 units big and have melee override 03 -short range. AI will then shoot at you even if you are inside short range, but the moment you ecounter min.shoot.dist. it switches to melee.
How it switches back to weapon when you run away back into min.shoot.dist. is not clear. So far it happens automatically after some time. Where is timer for that??? Let us know, if you know....
--Loser 09:03, 29 July 2007 (CEST)
Try using ai2_report on a character, I noticed a timer next to the mode or something of that sort - Gumby :)
Dialogs from level0_Tools
ONI BINARY DATA |
---|
AKVA << Other file types >> CBPI |
BINA : Binary data |
TMBD << Other BINA >> ONIE |
OBJC : Objects |
CHAR << Other OBJC >> CONS |
CMBT : Combat profile |
Level file |