void make_camera_deviations(struct PlayerInfo *player,struct Dungeon *dungeon) { long x,y; x = player->acamera->mappos.x.val; y = player->acamera->mappos.y.val; if (dungeon->camera_deviate_quake != 0) { x += UNSYNC_RANDOM(80) - 40; y += UNSYNC_RANDOM(80) - 40; } if (dungeon->camera_deviate_jump != 0) { x += ( (dungeon->camera_deviate_jump * LbSinL(player->acamera->orient_a) >> 8) >> 8); y += (-(dungeon->camera_deviate_jump * LbCosL(player->acamera->orient_a) >> 8) >> 8); }
long instf_attack_room_slab(struct Thing *creatng, long *param) { TRACE_THING(creatng); //return _DK_instf_attack_room_slab(creatng, param); struct Room *room; room = get_room_thing_is_on(creatng); if (room_is_invalid(room)) { ERRORLOG("The %s is not on room",thing_model_name(creatng)); return 0; } struct SlabMap *slb; slb = get_slabmap_thing_is_on(creatng); if (slb->health > 2) { //TODO CONFIG damage made to room slabs is constant - doesn't look good slb->health -= 2; thing_play_sample(creatng, 128 + UNSYNC_RANDOM(3), NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); return 1; } if (room->owner != game.neutral_player_num) { struct Dungeon *dungeon; dungeon = get_dungeon(room->owner); dungeon->rooms_destroyed++; } if (!delete_room_slab(coord_slab(creatng->mappos.x.val), coord_slab(creatng->mappos.y.val), 1)) { ERRORLOG("Cannot delete %s room tile destroyed by %s",room_code_name(room->kind),thing_model_name(creatng)); return 0; } create_effect(&creatng->mappos, 3, creatng->owner); thing_play_sample(creatng, 47, NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); return 1; }
long instf_damage_wall(struct Thing *creatng, long *param) { SYNCDBG(16,"Starting"); TRACE_THING(creatng); //return _DK_instf_damage_wall(creatng, param); MapSubtlCoord stl_x, stl_y; { struct CreatureControl *cctrl; cctrl = creature_control_get_from_thing(creatng); stl_x = stl_num_decode_x(cctrl->field_284); stl_y = stl_num_decode_y(cctrl->field_284); } struct SlabMap *slb; slb = get_slabmap_for_subtile(stl_x, stl_y); if (slb->health > 2) { slb->health -= 2; } else { place_slab_type_on_map(2, stl_x, stl_y, creatng->owner, 0); do_slab_efficiency_alteration(subtile_slab_fast(stl_x), subtile_slab_fast(stl_y)); } thing_play_sample(creatng, 63+UNSYNC_RANDOM(6), NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); return 1; }
/** Returns a random speech phrase for given message */ long get_phrase_for_message(long msg_idx) { struct SMessage *smsg; long i; smsg = &messages[msg_idx]; if (smsg->count <= 0) return -1; i = UNSYNC_RANDOM(smsg->count); return smsg->start_idx + i; }
long instf_fart(struct Thing *creatng, long *param) { TRACE_THING(creatng); //return _DK_instf_fart(creatng, param); struct Thing *efftng; efftng = create_effect(&creatng->mappos, 13, creatng->owner); if (!thing_is_invalid(efftng)) efftng->byte_16 = 4; thing_play_sample(creatng,94+UNSYNC_RANDOM(6), NORMAL_PITCH, 0, 3, 0, 4, FULL_LOUDNESS); return 1; }
void make_camera_deviations(struct PlayerInfo *player,struct Dungeon *dungeon) { long x,y; struct Camera *cam; cam = player->acamera; x = cam->mappos.x.val; y = cam->mappos.y.val; if (dungeon->camera_deviate_quake != 0) { x += UNSYNC_RANDOM(80) - 40; y += UNSYNC_RANDOM(80) - 40; } if (dungeon->camera_deviate_jump != 0) { x += distance_with_angle_to_coord_x(dungeon->camera_deviate_jump, cam->orient_a); y += distance_with_angle_to_coord_y(dungeon->camera_deviate_jump, cam->orient_a); } if ((dungeon->camera_deviate_quake != 0) || (dungeon->camera_deviate_jump != 0)) { // bounding position if (x < 0) { x = 0; } else if (x > 65535) { x = 65535; } if (y < 0) { y = 0; } else if (y > 65535) { y = 65535; } // setting deviated position cam->mappos.x.val = x; cam->mappos.y.val = y; } }
void activate_trap_shot_head_for_target90(struct Thing *traptng, struct Thing *creatng) { struct TrapStats *trapstat; trapstat = &trap_stats[traptng->model]; if (trapstat->field_1A <= 0) { ERRORLOG("Trap activation of bad shot kind %d",(int)trapstat->field_1A); return; } struct Thing *shotng; shotng = create_shot(&traptng->mappos, trapstat->field_1A, traptng->owner); if (!thing_is_invalid(shotng)) { { MapCoord crpos_x, crpos_y; MapCoord trpos_x, trpos_y; trpos_x = traptng->mappos.x.val; trpos_y = traptng->mappos.y.val; crpos_x = creatng->mappos.x.val; crpos_y = creatng->mappos.y.val; if (abs(trpos_x - crpos_x) <= abs(trpos_y - crpos_y)) { if (crpos_y >= trpos_y) shotng->move_angle_xy = LbFPMath_PI; else shotng->move_angle_xy = 0; } else { if (crpos_x >= trpos_x) shotng->move_angle_xy = LbFPMath_PI/2; else shotng->move_angle_xy = 3*LbFPMath_PI/2; } } shotng->move_angle_z = 0; struct ShotConfigStats *shotst; shotst = get_shot_model_stats(trapstat->field_1A); struct ComponentVector cvect; angles_to_vector(shotng->move_angle_xy, 0, shotst->old->speed, &cvect); shotng->veloc_push_add.x.val += cvect.x; shotng->veloc_push_add.y.val += cvect.y; shotng->veloc_push_add.z.val += cvect.z; shotng->state_flags |= TF1_PushAdd; shotng->byte_16 = trapstat->field_1B; if (shotst->old->firing_sound > 0) { thing_play_sample(traptng, shotst->old->firing_sound+UNSYNC_RANDOM(shotst->old->firing_sound_variants), NORMAL_PITCH, 0, 3, 0, 6, FULL_LOUDNESS); } if (shotst->old->shot_sound > 0) { thing_play_sample(shotng, shotst->old->shot_sound, NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); } } }
void update_player_sounds(void) { int k; struct PlayerInfo *player; SYNCDBG(7,"Starting"); if ((game.operation_flags & GOF_Paused) == 0) { player = get_my_player(); process_messages(); if (!SoundDisabled) { if (game.audiotrack > 0) { PlayMusicPlayer(game.audiotrack); } update_3d_sound_receiver(player); } game.play_gameturn++; } find_nearest_rooms_for_ambient_sound(); process_3d_sounds(); k = (game.bonus_time-game.play_gameturn) / 2; if (bonus_timer_enabled()) { if ((game.bonus_time == game.play_gameturn) || ((game.bonus_time > game.play_gameturn) && (((k <= 100) && ((k % 10) == 0)) || ((k<=300) && ((k % 50) == 0)) || ((k % 250) == 0))) ) play_non_3d_sample(89); } // Rare message easter egg if ((game.play_gameturn != 0) && ((game.play_gameturn % 20000) == 0)) { if (ACTION_RANDOM(2000) == 0) { k = UNSYNC_RANDOM(10); SYNCDBG(9,"Rare message condition met, selected %d",(int)k); if (k == 7) { output_message(SMsg_PantsTooTight, 0, true); } else { output_message(SMsg_FunnyMessages+k, 0, true); } } } SYNCDBG(9,"Finished"); }
void randomize_sound_font(void) { StopMusic(); switch (UNSYNC_RANDOM(3)) { case 0: if (LoadAwe32Soundfont("bullfrog")) StartMusic(1, 127); break; case 1: if (LoadAwe32Soundfont("atmos1")) StartMusic(1, 127); break; case 2: if (LoadAwe32Soundfont("atmos2")) StartMusic(1, 127); break; } }
void play_creature_sound_and_create_sound_thing(struct Thing *thing, long snd_idx, long a2) { struct CreatureSound *crsound; struct Thing *efftng; long i; if (playing_creature_sound(thing, snd_idx)) { return; } crsound = get_creature_sound(thing, snd_idx); if (crsound->index <= 0) { SYNCDBG(14,"No sample %d for creature %d",snd_idx,thing->model); return; } i = UNSYNC_RANDOM(crsound->count); efftng = create_effect(&thing->mappos, TngEff_Unknown49, thing->owner); if (!thing_is_invalid(efftng)) { thing_play_sample(efftng, crsound->index+i, NORMAL_PITCH, 0, 3, 0, a2, FULL_LOUDNESS); } }
void play_creature_sound(struct Thing *thing, long snd_idx, long a3, long a4) { struct CreatureSound *crsound; long i; SYNCDBG(8,"Starting"); if (playing_creature_sound(thing, snd_idx)) { return; } crsound = get_creature_sound(thing, snd_idx); if (crsound->index <= 0) { SYNCDBG(19,"No sample %d for creature %d",snd_idx,thing->model); return; } i = UNSYNC_RANDOM(crsound->count); SYNCDBG(18,"Playing sample %d (index %d) for creature %d",snd_idx,crsound->index+i,thing->model); if ( a4 ) { thing_play_sample(thing, crsound->index+i, NORMAL_PITCH, 0, 3, 8, a3, FULL_LOUDNESS); } else { thing_play_sample(thing, crsound->index+i, NORMAL_PITCH, 0, 3, 0, a3, FULL_LOUDNESS); } }
long instf_tunnel(struct Thing *creatng, long *param) { struct CreatureControl *cctrl; struct SlabMap *slb; SYNCDBG(16,"Starting"); TRACE_THING(creatng); cctrl = creature_control_get_from_thing(creatng); MapSubtlCoord stl_x,stl_y; stl_x = stl_num_decode_x(cctrl->navi.field_15); stl_y = stl_num_decode_y(cctrl->navi.field_15); slb = get_slabmap_for_subtile(stl_x, stl_y); if (slabmap_block_invalid(slb)) { return 0; } thing_play_sample(creatng, 69+UNSYNC_RANDOM(3), NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); if (slb->health > 1) { slb->health--; } else { dig_out_block(stl_x, stl_y, creatng->owner); } return 1; }
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); } } }
long instf_dig(struct Thing *creatng, long *param) { struct CreatureControl *cctrl; struct Dungeon *dungeon; struct SlabMap *slb; long stl_x,stl_y; long task_idx,taskkind; long dig_damage,gold; SYNCDBG(16,"Starting"); TRACE_THING(creatng); //return _DK_instf_dig(thing, param); cctrl = creature_control_get_from_thing(creatng); dungeon = get_dungeon(creatng->owner); task_idx = cctrl->word_91; { struct MapTask *task; task = get_dungeon_task_list_entry(dungeon,task_idx); taskkind = task->kind; if (task->coords != cctrl->word_8F) { return 0; } stl_x = stl_num_decode_x(cctrl->word_8F); stl_y = stl_num_decode_y(cctrl->word_8F); } slb = get_slabmap_for_subtile(stl_x, stl_y); if (slabmap_block_invalid(slb)) { return 0; } dig_damage = calculate_damage_did_to_slab_with_single_hit(creatng, slb); if (slb->health > dig_damage) { if (!slab_kind_is_indestructible(slb->kind)) slb->health -= dig_damage; thing_play_sample(creatng, 63 + UNSYNC_RANDOM(6), NORMAL_PITCH, 0, 3, 0, 2, FULL_LOUDNESS); create_effect(&creatng->mappos, TngEff_Unknown25, creatng->owner); if (taskkind == SDDigTask_MineGold) { gold = calculate_gold_digged_out_of_slab_with_single_hit(dig_damage, creatng->owner, cctrl->explevel, slb); creatng->creature.gold_carried += gold; dungeon->lvstats.gold_mined += gold; } return 0; } // slb->health <= dig_damage - we're going to destroy the slab remove_from_task_list(creatng->owner, task_idx); if (taskkind == SDDigTask_MineGold) { gold = calculate_gold_digged_out_of_slab_with_single_hit(slb->health, creatng->owner, cctrl->explevel, slb); creatng->creature.gold_carried += gold; dungeon->lvstats.gold_mined += gold; mine_out_block(stl_x, stl_y, creatng->owner); if (dig_has_revealed_area(stl_x, stl_y, creatng->owner)) { EventIndex evidx; evidx = event_create_event_or_update_nearby_existing_event( subtile_coord_center(stl_x), subtile_coord_center(stl_y), EvKind_AreaDiscovered, creatng->owner, 0); if ((evidx > 0) && is_my_player_number(creatng->owner)) output_message(SMsg_DugIntoNewArea, 0, true); } } else if (taskkind == SDDigTask_DigEarth) { dig_out_block(stl_x, stl_y, creatng->owner); if (dig_has_revealed_area(stl_x, stl_y, creatng->owner)) { EventIndex evidx; evidx = event_create_event_or_update_nearby_existing_event( subtile_coord_center(stl_x), subtile_coord_center(stl_y), EvKind_AreaDiscovered, creatng->owner, 0); if ((evidx > 0) && is_my_player_number(creatng->owner)) output_message(SMsg_DugIntoNewArea, 0, true); } } check_map_explored(creatng, stl_x, stl_y); thing_play_sample(creatng, 72 + UNSYNC_RANDOM(3), NORMAL_PITCH, 0, 3, 0, 4, FULL_LOUDNESS); return 1; }