| 2418 | } |
| 2419 | |
| 2420 | void do_melee_attack(object *obj) { |
| 2421 | ai_frame *ai_info = obj->ai_info; |
| 2422 | float damage; |
| 2423 | notify melee_info; |
| 2424 | int attack_num; |
| 2425 | object *target = ObjGet(ai_info->target_handle); |
| 2426 | |
| 2427 | if (ai_info->animation_type == AS_MELEE1) { |
| 2428 | damage = ai_info->melee_damage[0]; |
| 2429 | ai_info->next_melee_time = Gametime + ai_info->melee_latency[0]; |
| 2430 | attack_num = 0; |
| 2431 | } else { |
| 2432 | damage = ai_info->melee_damage[1]; |
| 2433 | ai_info->next_melee_time = Gametime + ai_info->melee_latency[1]; |
| 2434 | attack_num = 1; |
| 2435 | } |
| 2436 | |
| 2437 | melee_info.obj_handle = ai_info->target_handle; |
| 2438 | melee_info.attack_num = attack_num; |
| 2439 | |
| 2440 | AINotify(obj, AIN_MELEE_ATTACK_FRAME, (void *)&melee_info); |
| 2441 | |
| 2442 | if (target) { |
| 2443 | float dist = ai_info->dist_to_target_actual; |
| 2444 | |
| 2445 | if (dist <= AI_MAX_MELEE_RANGE) { |
| 2446 | AINotify(obj, AIN_MELEE_HIT, (void *)&melee_info); |
| 2447 | |
| 2448 | if (damage >= 1.0f) { |
| 2449 | object *objptr = ObjGet(ai_info->target_handle); |
| 2450 | |
| 2451 | if (objptr) { |
| 2452 | if (ps_rand() > D3_RAND_MAX / 2) { |
| 2453 | Sound_system.Play3dSound(SOUND_MELEE_HIT_0, SND_PRIORITY_HIGHEST, objptr); |
| 2454 | if (Game_mode & GM_MULTI) |
| 2455 | MultiPlay3dSound(SOUND_MELEE_HIT_0, OBJNUM(objptr), SND_PRIORITY_HIGHEST); |
| 2456 | if (Demo_flags == DF_RECORDING) |
| 2457 | DemoWrite3DSound(SOUND_MELEE_HIT_0, OBJNUM(objptr), SND_PRIORITY_HIGHEST); |
| 2458 | } else { |
| 2459 | Sound_system.Play3dSound(SOUND_MELEE_HIT_1, SND_PRIORITY_HIGHEST, objptr); |
| 2460 | if (Game_mode & GM_MULTI) |
| 2461 | MultiPlay3dSound(SOUND_MELEE_HIT_1, OBJNUM(objptr), SND_PRIORITY_HIGHEST); |
| 2462 | if (Demo_flags == DF_RECORDING) |
| 2463 | DemoWrite3DSound(SOUND_MELEE_HIT_1, OBJNUM(objptr), SND_PRIORITY_HIGHEST); |
| 2464 | } |
| 2465 | |
| 2466 | if (objptr->type == OBJ_PLAYER) |
| 2467 | ApplyDamageToPlayer(objptr, obj, PD_MELEE_ATTACK, damage); |
| 2468 | else |
| 2469 | ApplyDamageToGeneric(objptr, obj, GD_MELEE_ATTACK, damage); |
| 2470 | } |
| 2471 | } else if (damage == 0.0f) { |
| 2472 | float energy; |
| 2473 | object *objptr = ObjGet(ai_info->target_handle); |
| 2474 | |
| 2475 | // chrishack - milestone - replace with real code |
| 2476 | if (objptr) { |
| 2477 | Sound_system.Play3dSound(SOUND_ENERGY_DRAIN, SND_PRIORITY_HIGHEST, objptr); |
no test coverage detected