void try_and_toggle_control_panel( short polygon_index, short line_index) { struct polygon_data *polygon= get_polygon_data(polygon_index); struct line_data *line= get_line_data(line_index); short side_index= find_adjacent_side(polygon_index, line_index); if (side_index!=NONE) { struct side_data *side= get_side_data(side_index); if (SIDE_IS_CONTROL_PANEL(side)) { if (switch_can_be_toggled(side_index, FALSE)) { boolean make_sound, state= GET_CONTROL_PANEL_STATUS(side); struct control_panel_definition *definition= get_control_panel_definition(side->control_panel_type); switch (definition->panel_class) { case _panel_is_tag_switch: state= !state; make_sound= set_tagged_light_statuses(side->control_panel_permutation, state); if (try_and_change_tagged_platform_states(side->control_panel_permutation, state)) make_sound= TRUE; if (!side->control_panel_permutation) make_sound= TRUE; if (make_sound) { SET_CONTROL_PANEL_STATUS(side, state); set_control_panel_texture(side); } break; case _panel_is_light_switch: state= !state; make_sound= set_light_status(side->control_panel_permutation, state); break; case _panel_is_platform_switch: state= !state; make_sound= try_and_change_platform_state(get_polygon_data(side->control_panel_permutation)->permutation, state); break; } if (make_sound) { play_control_panel_sound(side_index, state ? _activating_sound : _deactivating_sound); } } } } return; }
/* else it is that we can think of. */ void changed_polygon( short original_polygon_index, short new_polygon_index, short player_index) { struct polygon_data *new_polygon= get_polygon_data(new_polygon_index); struct player_data *player= player_index!=NONE ? get_player_data(player_index) : (struct player_data *) NULL; (void) (original_polygon_index); /* Entering this polygon.. */ switch (new_polygon->type) { case _polygon_is_visible_monster_trigger: if (player) { activate_nearby_monsters(player->monster_index, player->monster_index, _pass_solid_lines|_activate_deaf_monsters|_use_activation_biases|_activation_cannot_be_avoided); } break; case _polygon_is_invisible_monster_trigger: case _polygon_is_dual_monster_trigger: if (player) { activate_nearby_monsters(player->monster_index, player->monster_index, _pass_solid_lines|_activate_deaf_monsters|_activate_invisible_monsters|_use_activation_biases|_activation_cannot_be_avoided); } break; case _polygon_is_item_trigger: if (player) { trigger_nearby_items(new_polygon_index); } break; case _polygon_is_light_on_trigger: case _polygon_is_light_off_trigger: set_light_status(new_polygon->permutation, new_polygon->type==_polygon_is_light_off_trigger ? false : true); break; case _polygon_is_platform: platform_was_entered(new_polygon->permutation, player ? true : false); break; case _polygon_is_platform_on_trigger: case _polygon_is_platform_off_trigger: if (player) { try_and_change_platform_state(get_polygon_data(new_polygon->permutation)->permutation, new_polygon->type==_polygon_is_platform_off_trigger ? false : true); } break; case _polygon_must_be_explored: /* When a player enters a must be explored, it now becomes a normal polygon, to allow */ /* for must be explored flags to work across cooperative net games */ if(player) { new_polygon->type= _polygon_is_normal; } break; default: break; } }
static void change_panel_state( short player_index, short panel_side_index) { short state, make_sound= FALSE; struct side_data *side= get_side_data(panel_side_index); struct player_data *player= get_player_data(player_index); struct control_panel_definition *definition= get_control_panel_definition(side->control_panel_type); state= GET_CONTROL_PANEL_STATUS(side); /* Do the right thing, based on the panel type.. */ switch (definition->panel_class) { case _panel_is_oxygen_refuel: case _panel_is_shield_refuel: case _panel_is_double_shield_refuel: case _panel_is_triple_shield_refuel: #ifndef VULCAN player->control_panel_side_index= player->control_panel_side_index==panel_side_index ? NONE : panel_side_index; state= get_recharge_status(panel_side_index); SET_CONTROL_PANEL_STATUS(side, state); if (!state) set_control_panel_texture(side); #endif break; case _panel_is_computer_terminal: #ifndef VULCAN if (get_game_state()==_game_in_progress && !PLAYER_HAS_CHEATED(player) && !PLAYER_HAS_MAP_OPEN(player)) { /* this will handle changing levels, if necessary (i.e., if weÕre finished) */ enter_computer_interface(player_index, side->control_panel_permutation, calculate_level_completion_state()); } #endif break; case _panel_is_tag_switch: if (definition->item==NONE || (!state && try_and_subtract_player_item(player_index, definition->item))) { state= !state; make_sound= set_tagged_light_statuses(side->control_panel_permutation, state); if (try_and_change_tagged_platform_states(side->control_panel_permutation, state)) make_sound= TRUE; if (!side->control_panel_permutation) make_sound= TRUE; if (make_sound) { SET_CONTROL_PANEL_STATUS(side, state); set_control_panel_texture(side); } } break; case _panel_is_light_switch: state= !state; make_sound= set_light_status(side->control_panel_permutation, state); break; case _panel_is_platform_switch: state= !state; make_sound= try_and_change_platform_state(get_polygon_data(side->control_panel_permutation)->permutation, state); break; case _panel_is_pattern_buffer: #ifndef VULCAN if (dynamic_world->tick_count-player->ticks_at_last_successful_save>MINIMUM_RESAVE_TICKS && player_controlling_game() && !PLAYER_HAS_CHEATED(local_player) && !game_is_networked) { play_control_panel_sound(panel_side_index, _activating_sound); // fade_out_background_music(30); /* Assume a successful save- prevents vidding of the save game key.. */ player->ticks_at_last_successful_save= dynamic_world->tick_count; if (!save_game()) { // AMR 3/12/97 vidding happens with InputSprocket with this here //player->ticks_at_last_successful_save= 0; } // fade_in_background_music(30); } #endif break; default: halt(); } if (make_sound) { play_control_panel_sound(panel_side_index, state ? _activating_sound : _deactivating_sound); } return; }