void stop_thing_playing_sample(struct Thing *heartng, short a2) { unsigned char eidx; eidx = heartng->snd_emitter_id; if (eidx > 0) { if (S3DEmitterIsPlayingSample(eidx, a2, 0)) { S3DDeleteSampleFromEmitter(eidx, a2, 0); } } }
TbBool playing_creature_sound(struct Thing *thing, long snd_idx) { struct CreatureSound *crsound; long i; crsound = get_creature_sound(thing, snd_idx); for (i=0; i < crsound->count; i++) { if (S3DEmitterIsPlayingSample(thing->snd_emitter_id, crsound->index+i, 0)) return true; } return false; }
long instf_reinforce(struct Thing *creatng, long *param) { struct CreatureControl *cctrl; SYNCDBG(16,"Starting"); TRACE_THING(creatng); //return _DK_instf_reinforce(creatng, param); cctrl = creature_control_get_from_thing(creatng); MapSubtlCoord stl_x,stl_y; MapSlabCoord slb_x,slb_y; stl_x = stl_num_decode_x(cctrl->digger.working_stl); stl_y = stl_num_decode_y(cctrl->digger.working_stl); slb_x = subtile_slab_fast(stl_x); slb_y = subtile_slab_fast(stl_y); if (check_place_to_reinforce(creatng, slb_x, slb_y) <= 0) { return 0; } if (cctrl->digger.byte_93 <= 25) { cctrl->digger.byte_93++; if (!S3DEmitterIsPlayingSample(creatng->snd_emitter_id, 172, 0)) { thing_play_sample(creatng, 172, NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); } return 0; } cctrl->digger.byte_93 = 0; place_and_process_pretty_wall_slab(creatng, slb_x, slb_y); struct Coord3d pos; pos.x.stl.pos = 128; pos.y.stl.pos = 128; pos.z.stl.pos = 128; long n; for (n=0; n < SMALL_AROUND_LENGTH; n++) { pos.x.stl.num = stl_x + 2 * small_around[n].delta_x; pos.y.stl.num = stl_y + 2 * small_around[n].delta_y; struct Map *mapblk; mapblk = get_map_block_at(pos.x.stl.num, pos.y.stl.num); if (map_block_revealed(mapblk, creatng->owner) && ((mapblk->flags & MapFlg_IsTall) == 0)) { pos.z.val = get_floor_height_at(&pos); create_effect(&pos, imp_spangle_effects[creatng->owner], creatng->owner); } } thing_play_sample(creatng, 41, NORMAL_PITCH, 0, 3, 0, 3, FULL_LOUDNESS); return 0; }
void stop_creature_sound(struct Thing *thing, long snd_idx) { struct CreatureSound *crsound; int i; crsound = get_creature_sound(thing, snd_idx); if (crsound->index <= 0) { SYNCDBG(19,"No sample %d for creature %d",snd_idx,thing->model); return; } for (i = 0; i < crsound->count; i++) { if (S3DEmitterIsPlayingSample(thing->snd_emitter_id, crsound->index+i, 0)) { S3DDeleteSampleFromEmitter(thing->snd_emitter_id, crsound->index+i, 0); } } }
void set_room_playing_ambient_sound(struct Coord3d *pos, long sample_idx) { struct Thing *thing; long i; //_DK_set_room_playing_ambient_sound(pos, sample_idx);return; if (game.ambient_sound_thing_idx == 0) { ERRORLOG("No room ambient sound object"); return; } thing = thing_get(game.ambient_sound_thing_idx); if ( thing_is_invalid(thing) ) { ERRORLOG("Invalid room ambient sound object"); return; } if (sample_idx != 0) { move_thing_in_map(thing, pos); i = thing->snd_emitter_id; if (i != 0) { if ( !S3DEmitterIsPlayingSample(i, sample_idx, 0) ) { S3DDeleteAllSamplesFromEmitter(thing->snd_emitter_id); thing_play_sample(thing, sample_idx, NORMAL_PITCH, -1, 3, 0, 6, FULL_LOUDNESS); } } else { thing_play_sample(thing, sample_idx, NORMAL_PITCH, -1, 3, 0, 6, FULL_LOUDNESS); } } else { i = thing->snd_emitter_id; if (i != 0) { S3DDestroySoundEmitterAndSamples(i); thing->snd_emitter_id = 0; } } }
void play_thing_walking(struct Thing *thing) { struct PlayerInfo *myplyr; myplyr = get_my_player(); struct Camera *cam; cam = myplyr->acamera; { // Skip the thing if its distance to camera is too big MapSubtlDelta dist_x, dist_y; dist_x = coord_subtile(abs(cam->mappos.x.val - (MapCoordDelta)thing->mappos.x.val)); dist_y = coord_subtile(abs(cam->mappos.y.val - (MapCoordDelta)thing->mappos.y.val)); if (dist_x <= dist_y) dist_x = dist_y; if (dist_x >= 10) { return; } } if ((get_creature_model_flags(thing) & CMF_IsSpectator) != 0) { // Spectators don't do sounds return; } long loudness; loudness = (myplyr->view_mode == PVM_CreatureView) ? (FULL_LOUDNESS) : (FULL_LOUDNESS/5); // Flying diptera has a buzzing noise sound if ((get_creature_model_flags(thing) & CMF_IsDiptera) && ((thing->movement_flags & TMvF_Flying) != 0) && (thing->field_60 < (int)thing->mappos.z.val)) { if ( !S3DEmitterIsPlayingSample(thing->snd_emitter_id, 25, 0) ) { thing_play_sample(thing, 25, 100, -1, 2, 0, 2, loudness); } } else { if ( S3DEmitterIsPlayingSample(thing->snd_emitter_id, 25, 0) ) { S3DDeleteSampleFromEmitter(thing->snd_emitter_id, 25, 0); } struct CreatureControl *cctrl; cctrl = creature_control_get_from_thing(thing); if ((cctrl->field_9) && get_foot_creature_has_down(thing)) { int smpl_variant; smpl_variant = foot_down_sound_sample_variant[4 * ((cctrl->mood_flags & 0x1C) >> 2) + (cctrl->field_67 & 0x1F)]; long smpl_idx; if ((thing->movement_flags & TMvF_Unknown80) != 0) { smpl_idx = 181 + smpl_variant; } else { struct CreatureSound *crsound; crsound = get_creature_sound(thing, CrSnd_Foot); smpl_idx = crsound->index + smpl_variant; } cctrl->field_67 = (cctrl->field_67 ^ (cctrl->field_67 ^ (cctrl->field_67 + 1))) & 0x1F; if ((cctrl->field_67 & 0x1F) >= 4) { cctrl->mood_flags &= ~0x1C; cctrl->mood_flags |= (UNSYNC_RANDOM(4) << 2); cctrl->field_67 &= ~0x1F; } int v15; unsigned short smpl_delay; //TODO CONFIG creature model dependency; remove, add config file option for this v15 = thing->model; if ( v15 == 19 || v15 == 24 ) {//FLY or BUG smpl_delay = 400; } else if ( v15 == 27 ) {//HELL_HOUND smpl_delay = 300; } else { smpl_delay = 100; } thing_play_sample(thing, smpl_idx, smpl_delay, 0, 3, 3, 1, loudness); if ((thing->movement_flags & TMvF_IsOnWater) != 0) { thing_play_sample(thing, 21+SOUND_RANDOM(4), 90+SOUND_RANDOM(20), 0, 3, 3, 1, FULL_LOUDNESS); } } }
short creature_being_scavenged(struct Thing *creatng) { //return _DK_creature_being_scavenged(creatng); struct Thing *fellowtng; struct Dungeon *dungeon; SYNCDBG(8,"Starting"); //return _DK_make_all_players_creatures_angry(plyr_idx); dungeon = get_players_num_dungeon(creatng->owner); fellowtng = INVALID_THING; if (dungeon->num_active_creatrs <= 1) { SYNCDBG(19,"No other creatures"); return 0; } int n; n = ACTION_RANDOM(dungeon->num_active_creatrs-1); unsigned long k; int i; k = 0; i = dungeon->creatr_list_start; while (i != 0) { struct Thing *thing; thing = thing_get(i); TRACE_THING(thing); struct CreatureControl *cctrl; cctrl = creature_control_get_from_thing(thing); if (thing_is_invalid(thing) || creature_control_invalid(cctrl)) { ERRORLOG("Jump to invalid creature detected"); break; } i = cctrl->players_next_creature_idx; // Thing list loop body if ((n <= 0) && (thing->index != creatng->index)) { fellowtng = thing; break; } n--; // Thing list loop body ends k++; if (k > CREATURES_COUNT) { ERRORLOG("Infinite loop detected when sweeping creatures list"); break; } } if (thing_is_invalid(fellowtng)) { SYNCDBG(19,"Cannot get creature"); return 0; } if (setup_person_move_to_coord(creatng, &fellowtng->mappos, NavRtF_Default) <= 0) { SYNCDBG(19,"Cannot move to coord"); return 0; } creatng->continue_state = CrSt_CreatureBeingScavenged; if (!S3DEmitterIsPlayingSample(creatng->snd_emitter_id, 156, 0)) thing_play_sample(creatng, 156, NORMAL_PITCH, 0, 3, 1, 2, FULL_LOUDNESS); SYNCDBG(19,"Finished"); return 1; }