Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AISoundHandling.c
Go to the documentation of this file.
28
29
30class SCR_AISoundHandling
31{
32 static const int NORMAL_PRIORITY = 50; // priority of signals
33 static const int SIGNAL_VALUE_SOLDIER_ALL = 1000;
34 static const int DISTANCE_TYPE_MID = 50;
35 static const int DISTANCE_TYPE_LONG = 2500;
36
37 //--------------------------------------------------------------------------------------------
38 static bool SetSignalsAndTransmit(SCR_AITalkRequest request, IEntity speakerEntity, VoNComponent von, SignalsManagerComponent signalsMgr)
39 {
40 ref array<float> signals = {};
41 SCR_CallsignCharacterComponent callsignComponent;
42 int SN_Seed = signalsMgr.FindSignal("Seed");
43 // randomize variant of the signal
44 SetSignal(SN_Seed, Math.RandomFloat(0, 1), signals);
45 // different signals depending on cummunication type
46 if (request.m_Entity)
47 callsignComponent = SCR_CallsignCharacterComponent.Cast(request.m_Entity.FindComponent(SCR_CallsignCharacterComponent));
48
49 ECommunicationType commType = request.m_eCommType;
50 switch (commType)
51 {
52 case ECommunicationType.REPORT_TARGET:
53 {
54 if (!request.m_Entity)
55 {
56 ErrorMissingEntity(commType);
57 return false;
58 }
59 SetSignal_TargetValues(request.m_Entity, signalsMgr, signals);
60 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
61 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_TARGET, signals, NORMAL_PRIORITY);
62 break;
63 }
64 case ECommunicationType.REPORT_MOVE:
65 {
66 if (request.m_vPosition == vector.Zero)
67 {
68 ErrorMissingPosition(commType);
69 return false;
70 }
71 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
72
73 float distanceType = SetSignal_PositionValues(request.m_Entity, signalsMgr, request.m_vPosition, speakerEntity.GetOrigin(), signals);
74 if (distanceType < DISTANCE_TYPE_MID) // close range distance
75 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_MOVE_CLOSE, signals, NORMAL_PRIORITY);
76 else if (distanceType < DISTANCE_TYPE_LONG) // mid range distance
77 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_MOVE_MID, signals, NORMAL_PRIORITY);
78 else // long range distance
79 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_MOVE_LONG, signals, NORMAL_PRIORITY);
80
81 break;
82 }
83 case ECommunicationType.REPORT_CONTACT:
84 {
85 if (!request.m_Entity || request.m_vPosition == vector.Zero)
86 {
87 ErrorMissingEntityOrPosition(commType);
88 return false;
89 }
90 SetSignal_ObjectType(request.m_Entity, signalsMgr, signals);
91 SetSignal_TargetFactionValues(request.m_Entity, signalsMgr, signals);
92 float distanceType = SetSignal_PositionValues(request.m_Entity, signalsMgr, request.m_vPosition, speakerEntity.GetOrigin(), signals);
93 SetSignal_FactionValues(signalsMgr, 1, signals);
94 if (distanceType < DISTANCE_TYPE_MID)
95 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_SPOTTED_CLOSE, signals, NORMAL_PRIORITY);
96 else if (distanceType < DISTANCE_TYPE_LONG)
97 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_SPOTTED_MID, signals, NORMAL_PRIORITY);
98 else
99 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_SPOTTED_LONG, signals, NORMAL_PRIORITY);
100 break;
101 }
102 case ECommunicationType.REPORT_RETURN:
103 {
104 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
105 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_RETURN, signals, NORMAL_PRIORITY);
106 break;
107 }
108 case ECommunicationType.REPORT_MOUNT:
109 {
110 if (!request.m_Entity)
111 {
112 ErrorMissingEntity(commType);
113 return false;
114 }
115 SetSignal_TargetValues(request.m_Entity, signalsMgr, signals);
116 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
117 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_MOUNT_BOARD, signals, NORMAL_PRIORITY);
118 break;
119 }
120 case ECommunicationType.REPORT_MOUNT_AS:
121 {
122 if (!callsignComponent)
123 {
124 ErrorMissingCallsign(commType);
125 return false;
126 }
127 SetSignal_MountAsValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), RoleInVehicleToSoundRoleEnum(request.m_EnumSignal), signals);
128 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_MOUNT_ROLE, signals, NORMAL_PRIORITY);
129 break;
130 }
131 case ECommunicationType.REPORT_MOUNT_NEAREST:
132 {
133 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
134 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_MOUNT_NEAREST, signals, NORMAL_PRIORITY);
135 break;
136 }
137 case ECommunicationType.REPORT_UNMOUNT:
138 {
139 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
140 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_MOUNT_GETOUT, signals, NORMAL_PRIORITY);
141 break;
142 }
143 case ECommunicationType.REPORT_STOP:
144 {
145 if (callsignComponent)
146 SetSignal_SoldierCalledValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), signals);
147 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_STOP, signals, NORMAL_PRIORITY);
148 break;
149 }
150 case ECommunicationType.REPORT_FLANK:
151 {
152 if (!callsignComponent)
153 {
154 ErrorMissingCallsign(commType);
155 return false;
156 }
157 SetSignal_SoldierCalledValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), signals);
158 SetSignal_FlankValues(signalsMgr, request.m_EnumSignal, signals);
159 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_FLANK, signals, NORMAL_PRIORITY);
160 break;
161 }
162 case ECommunicationType.REPORT_SEARCH_AND_DESTROY:
163 {
164 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
165 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_SEARCH_AND_DESTROY, signals, NORMAL_PRIORITY);
166 break;
167 }
168 case ECommunicationType.REPORT_NO_AMMO:
169 {
170 von.SoundEventPriority(SCR_SoundEvent.SOUND_REPORTS_STATUS_NOAMMO, signals, NORMAL_PRIORITY);
171 break;
172 }
173 case ECommunicationType.REPORT_CLEAR:
174 {
175 von.SoundEventPriority(SCR_SoundEvent.SOUND_REPORTS_STATUS_CLEAR, signals, NORMAL_PRIORITY);
176 break;
177 }
178 case ECommunicationType.REPORT_ENGAGING:
179 {
180 von.SoundEventPriority(SCR_SoundEvent.SOUND_REPORTS_STATUS_ENGAGING, signals, NORMAL_PRIORITY);
181 break;
182 }
183 case ECommunicationType.REPORT_TARGET_DOWN:
184 {
185 von.SoundEventPriority(SCR_SoundEvent.SOUND_REPORTS_STATUS_TARGETDOWN, signals, NORMAL_PRIORITY);
186 break;
187 }
188 case ECommunicationType.REPORT_RELOADING:
189 {
190 von.SoundEventPriority(SCR_SoundEvent.SOUND_REPORTS_ACTIONSTATUS_RELOAD, signals, NORMAL_PRIORITY);
191 break;
192 }
193 case ECommunicationType.REPORT_MOVING:
194 {
195 von.SoundEventPriority(SCR_SoundEvent.SOUND_REPORTS_ACTIONSTATUS_MOVE, signals, NORMAL_PRIORITY);
196 break;
197 }
198 case ECommunicationType.REPORT_COVERING:
199 {
200 von.SoundEventPriority(SCR_SoundEvent.SOUND_REPORTS_ACTIONSTATUS_COVER, signals, NORMAL_PRIORITY);
201 break;
202 }
203 case ECommunicationType.REPORT_DEFEND:
204 {
205 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
206 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_DEFEND_POSITION, signals, NORMAL_PRIORITY);
207 break;
208 }
209 case ECommunicationType.REPORT_NEGATIVE:
210 {
211 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_NEGATIVEFEEDBACK_NEGATIVE, signals, NORMAL_PRIORITY);
212 break;
213 }
214 case ECommunicationType.REPORT_IDLE:
215 {
216 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_IDLE_SPEECH, signals, NORMAL_PRIORITY);
217 break;
218 }
219 case ECommunicationType.REPORT_TARGET_LOST:
220 {
221 if (callsignComponent)
222 SetSignal_SoldierCalledValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), signals);
223 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_REPORTS_AREACLEAR, signals, NORMAL_PRIORITY);
224 break;
225 }
226 case ECommunicationType.REPORT_UNDER_FIRE:
227 {
228 if (callsignComponent)
229 SetSignal_SoldierCalledValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), signals);
230 von.SoundEventPriority(SCR_SoundEvent.SOUND_CP_REPORTS_UNDER_FIRE, signals, NORMAL_PRIORITY);
231 break;
232 }
233 }
234 return true;
235 }
236
237 //--------------------------------------------------------------------------------------------
238 static void ErrorMissingCallsign(ECommunicationType commType)
239 {
240 Print(string.Format("SCR_AISoundHandling: SetSignalsAndTransmit: Missing callsign for: %1", typename.EnumToString(ECommunicationType, commType)), LogLevel.ERROR);
241 }
242
243 //--------------------------------------------------------------------------------------------
244 static void ErrorMissingEntity(ECommunicationType commType)
245 {
246 Print(string.Format("SCR_AISoundHandling: SetSignalsAndTransmit: Missing entity for: %1", typename.EnumToString(ECommunicationType, commType)), LogLevel.ERROR);
247 }
248
249 //--------------------------------------------------------------------------------------------
250 static void ErrorMissingPosition(ECommunicationType commType)
251 {
252 Print(string.Format("SCR_AISoundHandling: SetSignalsAndTransmit: Missing position for: %1", typename.EnumToString(ECommunicationType, commType)), LogLevel.ERROR);
253 }
254
255 //--------------------------------------------------------------------------------------------
256 static void ErrorMissingEntityOrPosition(ECommunicationType commType)
257 {
258 Print(string.Format("SCR_AISoundHandling: SetSignalsAndTransmit: Missing entity or position for: %1", typename.EnumToString(ECommunicationType, commType)), LogLevel.ERROR);
259 }
260
261 //--------------------------------------------------------------------------------------------
262 static SCR_AIInfoComponent GetInfoComponent(IEntity entity)
263 {
264 if (!entity)
265 return null;
266 SCR_ChimeraAIAgent agent = SCR_ChimeraAIAgent.Cast(entity);
267 if (entity && !agent)
268 {
269 AIControlComponent cc = AIControlComponent.Cast(entity.FindComponent(AIControlComponent));
270 if (!cc)
271 return null;
272 agent = SCR_ChimeraAIAgent.Cast(cc.GetAIAgent());
273 if (!agent)
274 return null;
275 }
276 return agent.m_InfoComponent;
277 }
278
279 //--------------------------------------------------------------------------------------------
280 static int InfoUnitRoleToSoundCharacterEnum(SCR_AIInfoComponent info)
281 {
282 if (!info)
283 return ECP_Characters.MAN;
284 else if (info.HasRole(EUnitRole.MACHINEGUNNER))
285 return ECP_Characters.MACHINE_GUNNER;
286 else if (info.HasRole(EUnitRole.AT_SPECIALIST))
287 return ECP_Characters.AT_SOLDIER;
288 else if (info.HasRole(EUnitRole.SNIPER))
289 return ECP_Characters.SNIPER;
290 else if (info.HasRole(EUnitRole.RIFLEMAN))
291 return ECP_Characters.SOLDIER;
292 return ECP_Characters.MAN;
293 }
294
295 //--------------------------------------------------------------------------------------------
296 static int RoleInVehicleToSoundRoleEnum(int role)
297 {
298 switch (role)
299 {
300 case ECompartmentType.PILOT:
301 {
302 return ECP_VehicleRoles.DRIVER;
303 }
304 case ECompartmentType.TURRET:
305 {
306 return ECP_VehicleRoles.GUNNER;
307 }
308 case ECompartmentType.CARGO:
309 {
310 return ECP_VehicleRoles.PASSANGER;
311 }
312 }
313 return role;
314 }
315
316 //--------------------------------------------------------------------------------------------
317 static int VehicleTypeToSoundVehicleFactionEnum(int role)
318 {
319 switch (role)
320 {
321 case EVehicleType.VEHICLE:
322 {
323 return ECP_VehicleTypes.VEHICLE;
324 }
325 case EVehicleType.CAR:
326 {
327 return ECP_VehicleTypes.CAR;
328 }
329 case EVehicleType.TRUCK:
330 {
331 return ECP_VehicleTypes.TRUCK;
332 }
333 case EVehicleType.APC:
334 {
335 return ECP_VehicleTypes.APC;
336 }
337 case EVehicleType.COMM_TRUCK:
338 {
339 return ECP_VehicleTypes.COMM_TRUCK;
340 }
341 case EVehicleType.FUEL_TRUCK:
342 {
343 return ECP_VehicleTypes.FUEL_TRUCK;
344 }
345 case EVehicleType.SUPPLY_TRUCK:
346 {
347 return ECP_VehicleTypes.SUPPLY_TRUCK;
348 }
349 case EVehicleType.MORTAR:
350 {
351 return ECP_VehicleTypes.MORTAR;
352 }
353 default:
354 {
355 return ECP_VehicleTypes.HELICOPTER;
356 }
357 }
358 return role;
359 }
360
361 //--------------------------------------------------------------------------------------------
362 static void SetSignal_ObjectType(IEntity target, SignalsManagerComponent signalsManagerComponent, array<float> signals)
363 {
364 int SN_ObjectType = signalsManagerComponent.FindSignal("ObjectType");
365 float value;
366 if (target.IsInherited(ChimeraCharacter))
367 value = 0.0;
368 else if (target.IsInherited(Vehicle))
369 value = 1.0;
370 else
371 value = 2.0; // Misc
372 SetSignal(SN_ObjectType, value, signals);
373 }
374
375 //--------------------------------------------------------------------------------------------
376 static void SetSignal_TargetValues(IEntity target, SignalsManagerComponent signalsManagerComponent, array<float> signals)
377 {
378 if (target.IsInherited(Vehicle))
379 {
380 int SN_Vehicle = signalsManagerComponent.FindSignal("Vehicle");
381
382 SetSignal(SN_Vehicle, VehicleTypeToSoundVehicleFactionEnum(Vehicle.Cast(target).m_eVehicleType), signals);
383 }
384
385 else if (target.IsInherited(ChimeraCharacter))
386 {
387 int SN_Character = signalsManagerComponent.FindSignal("Character");
388 SCR_AIInfoComponent targetInfoComponent = GetInfoComponent(target);
389 int unitRole = InfoUnitRoleToSoundCharacterEnum(targetInfoComponent);
390
391 SetSignal(SN_Character, unitRole, signals);
392 }
393 //TODO: do Miscellaneous - now not objects to attacks
394 }
395
396 //--------------------------------------------------------------------------------------------
397 static void SetSignal_TargetFactionValues(IEntity target, SignalsManagerComponent signalsManagerComponent, array<float> signals)
398 {
399 if (target.IsInherited(Vehicle))
400 {
401 int SN_VehicleFaction = signalsManagerComponent.FindSignal("VehicleFaction");
402
403 SetSignal(SN_VehicleFaction, 100 + VehicleTypeToSoundVehicleFactionEnum(Vehicle.Cast(target).m_eVehicleType), signals);
404 }
405
406 else if (target.IsInherited(ChimeraCharacter))
407 {
408 int SN_CharacterFaction = signalsManagerComponent.FindSignal("CharacterFaction");
409 SCR_AIInfoComponent targetInfoComponent = GetInfoComponent(target);
410 int unitRole = InfoUnitRoleToSoundCharacterEnum(targetInfoComponent) + 100;
411
412 SetSignal(SN_CharacterFaction, unitRole, signals);
413 }
414 //TODO: do Miscellaneous - now not objects to attacks
415 }
416
417 //--------------------------------------------------------------------------------------------
418 static float SetSignal_PositionValues(IEntity target, SignalsManagerComponent signalsManagerComponent, vector locationTarget, vector locationSelf, array<float> signals)
419 {
420 if (target)
421 locationTarget = target.GetOrigin();
422
423 float distance = vector.Distance(locationTarget,locationSelf);
424 if (distance < DISTANCE_TYPE_MID)
425 {
426 vector dirVec = locationTarget - locationSelf;
427 float directionAngle = dirVec.ToYaw();
428 int SN_DirectionClose = signalsManagerComponent.FindSignal("DirectionClose");
429 SetSignal(SN_DirectionClose, directionAngle, signals);
430 }
431 else if (distance < DISTANCE_TYPE_LONG)
432 {
433 vector dirVec = locationTarget - locationSelf;
434 float directionAngle = dirVec.ToYaw();
435
436 int SN_TargetDistance = signalsManagerComponent.FindSignal("TargetDistance");
437 int SN_DirectionAngle = signalsManagerComponent.FindSignal("DirectionAngle");
438
439 SetSignal(SN_TargetDistance, distance, signals);
440 SetSignal(SN_DirectionAngle, directionAngle, signals);
441 }
442 else if (distance >= DISTANCE_TYPE_LONG)
443 {
444 SetSignal_GridValues(locationTarget, signalsManagerComponent, signals);
445 }
446 return distance;
447 }
448
449 //--------------------------------------------------------------------------------------------
450 static void SetSignal_GridValues(vector locationTarget, SignalsManagerComponent signalsManagerComponent, array<float> signals)
451 {
452 array<int> gridXcoords = {};
453 array<int> gridZcoords = {};
454 int gridX, gridZ;
455 SCR_MapEntity.GetGridPos(locationTarget, gridX: gridX, gridZ: gridZ);
456
457 int SN_Grid = signalsManagerComponent.FindSignal("Grid");
458 for (int i = 2; i >= 0; i--)
459 {
460 int mod = Math.Pow(10, i);
461 gridXcoords.Insert(gridX / mod);
462 gridZcoords.Insert(gridZ / mod);
463 gridX = gridX % mod;
464 gridZ = gridZ % mod;
465 };
466 for (int i = 0; i < 3; i++)
467 SetSignal(SN_Grid, gridXcoords[i], signals);
468 for (int i = 0; i < 3; i++)
469 SetSignal(SN_Grid, gridZcoords[i], signals);
470 }
471
472 //--------------------------------------------------------------------------------------------
473 static void SetSignal_SoldierCalledValues(SignalsManagerComponent signalsManagerComponent, int soldierCalled, array<float> signals)
474 {
475 int SN_SoldierCalled = signalsManagerComponent.FindSignal("SoldierCalled");
476
477 SetSignal(SN_SoldierCalled, soldierCalled, signals);
478 }
479
480 //--------------------------------------------------------------------------------------------
481 static void SetSignal_MountAsValues(SignalsManagerComponent signalsManagerComponent, int soldierCalledId, int soldierRole, array<float> signals)
482 {
483 int SN_SoldierCalled = signalsManagerComponent.FindSignal("SoldierCalled");
484 int SN_Role = signalsManagerComponent.FindSignal("Role");
485
486 SetSignal(SN_SoldierCalled, soldierCalledId, signals);
487 SetSignal(SN_Role, soldierRole, signals);
488 }
489
490 //--------------------------------------------------------------------------------------------
491 static void SetSignal_FlankValues(SignalsManagerComponent signalsManagerComponent, int flank, array<float> signals)
492 {
493 int SN_Flank = signalsManagerComponent.FindSignal("Flank");
494
495 SetSignal(SN_Flank, flank, signals);
496 }
497
498 //--------------------------------------------------------------------------------------------
499 static void SetSignal_FactionValues(SignalsManagerComponent signalsManagerComponent, int faction, array<float> signals)
500 {
501 int SN_Faction = signalsManagerComponent.FindSignal("Faction");
502
503 SetSignal(SN_Faction, faction, signals);
504 }
505
506 //--------------------------------------------------------------------------------------------
507 static void SetSignal(int index, float value, notnull array<float> signals)
508 {
509 signals.Insert(index);
510 signals.Insert(value);
511 }
512
513 //--------------------------------------------------------------------------------------------
514 static SCR_AICommsHandler FindCommsHandler(AIAgent agent)
515 {
516 SCR_ChimeraAIAgent chimeraAgent = SCR_ChimeraAIAgent.Cast(agent);
517 if (!chimeraAgent)
518 return null;
519 return chimeraAgent.m_UtilityComponent.m_CommsHandler;
520 }
521}
ECompartmentType
enum ECommunicationType NORMAL_PRIORITY
ECommunicationType
@ REPORT_NO_AMMO
@ REPORT_MOVING
@ REPORT_RELOADING
@ REPORT_RETURN
@ REPORT_TARGET_LOST
@ REPORT_MOUNT_AS
@ REPORT_UNDER_FIRE
@ REPORT_TARGET
@ REPORT_MOVE
@ REPORT_MOUNT_NEAREST
@ REPORT_IDLE
@ REPORT_TARGET_DOWN
@ REPORT_CONTACT
@ REPORT_SEARCH_AND_DESTROY
@ REPORT_STOP
@ REPORT_CLEAR
@ REPORT_FLANK
@ REPORT_COVERING
@ REPORT_DEFEND
@ REPORT_NEGATIVE
@ REPORT_UNMOUNT
@ REPORT_ENGAGING
@ REPORT_MOUNT
void SCR_AITalkRequest(ECommunicationType type, IEntity entity, vector pos, int enumSignal, bool transmitIfNoReceivers, bool transmitIfPassenger, SCR_EAITalkRequestPreset preset)
float distance
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
EVehicleType
Definition Vehicle.c:4
enum EVehicleType IEntity
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
Definition Math.c:13
bool HasRole(EUnitRole role)
enum EPhysicsLayerPresets Vehicle
Definition gameLib.c:24
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
@ NONE
When Shape is created and not initialized yet.
Definition ShapeType.c:15