var start_animation_cb = function(obj, id, pulse) { var mclick_value = m_ctl.get_sensor_value(obj, id, 0); var tclick_value = m_ctl.get_sensor_value(obj, id, 1); var timeline = m_ctl.get_sensor_value(obj, id, 2); if (mclick_value || tclick_value) { var payload = mclick_value ? m_ctl.get_sensor_payload(obj, id, 0): m_ctl.get_sensor_payload(obj, id, 1); var canv_coords = m_cont.client_to_canvas_coords( payload.coords[0], payload.coords[1], _vec2_tmp); var obj = m_scs.pick_object(canv_coords[0], canv_coords[1]); if (obj) { var clicked_planet = get_planet_by_geom(obj); if (clicked_planet) { // check second click on planet if (clicked_planet.focused) { _focusing = false; } else { _focusing = true; } // init sun data _sun.start_time = timeline; var sun_trans = m_trans.get_translation_rel(_sun.geom, _vec3_tmp); _sun.start_trans_length = m_vec3.length(sun_trans); // init orbit _orbits.start_time = timeline; _orbits.start_scale = m_trans.get_scale(_orbits.front); // init data of planet animations for (var i = 0; i < _planets.length; i++) { var planet = _planets[i]; var trans = m_trans.get_translation_rel(planet.armature, _vec3_tmp); if (_focusing) { m_vec3.copy(trans, planet.original_trans); if (planet.geom == obj) { planet.focused = true; } else { planet.focused = false; } } else { planet.focused = false; } planet.start_scale = m_trans.get_scale(planet.armature); planet.start_time = timeline; planet.start_trans_length = m_vec3.length(trans); } } } } }
function multiselection_cb(obj, id, pulse) { var selected_count = 0; for (var i = 0; i < SELECTION_COUNT; i++) selected_count += m_ctl.get_sensor_value(obj, id, i); for (var i = 0; i < SELECTION_COUNT; i++) { if (selected_count > 4) m_mat.set_diffuse_color(paws[i], "Material", BLUE); else if (m_ctl.get_sensor_value(obj, id, i)) m_mat.set_diffuse_color(paws[i], "Material", RED); else m_mat.set_diffuse_color(paws[i], "Material", DEF_COLOR); } }
function smooth_cb(obj, id, pulse) { if (Math.abs(_mouse_delta[0]) > 0.01 || Math.abs(_mouse_delta[1]) > 0.01) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); var rot_x = m_util.smooth(_mouse_delta[0], 0, elapsed, CAM_SMOOTH_CHARACTER_MOUSE); var rot_y = m_util.smooth(_mouse_delta[1], 0, elapsed, CAM_SMOOTH_CHARACTER_MOUSE); // TODO: need more control with this objects var character = m_scs.get_first_character(); var camera = m_scs.get_active_camera(); m_cam.rotate(camera, -rot_x * FPS_MOUSE_MULT, rot_y * FPS_MOUSE_MULT); _mouse_delta[0] -= rot_x; _mouse_delta[1] -= rot_y; if (character) { var angles = _vec2_tmp; m_cam.get_angles(camera, angles); angles[0] += Math.PI; angles[1] *= -1; m_phy.set_character_rotation(character, angles[0], angles[1]); } } }
var shoot_cb = function(obj, id, pulse) { if (is_clicked) { var time = m_ctl.get_sensor_value(obj, id, 0); shoot(time); is_clicked = false; } }
var update_asteroid_cb = function(obj, id, pulse) { var asteroid = obj; if (asteroid.active) { // set new tranlation var ast_obj = asteroid.ast_obj; var asteroid_pos = m_trans.get_translation(ast_obj, _vec3_tmp); var elapsed = m_ctl.get_sensor_value(obj, id, 0); var diff_pos = m_vec3.scale(asteroid.velosity, elapsed, _vec3_tmp2); m_vec3.add(asteroid_pos, diff_pos, asteroid_pos); m_trans.set_translation_v(ast_obj, asteroid_pos); // set new rotation var angle = m_quat.slerp(QUAT4_IDENT, asteroid.angular_velosity, elapsed, _quat_tmp); var aster_quat = m_trans.get_rotation(ast_obj, _quat_tmp2); var new_aster_quat = m_quat.multiply(aster_quat, angle, _quat_tmp); m_quat.normalize(new_aster_quat, new_aster_quat); m_trans.set_rotation_v(ast_obj, new_aster_quat); var ast_copy_obj = asteroid.ast_copy_obj; if (ast_copy_obj) { m_trans.set_translation_v(ast_copy_obj, asteroid_pos); m_trans.set_rotation_v(ast_copy_obj, new_aster_quat); } if (asteroid_pos[2] > 20) init_asteroid_transform(asteroid); } }
var cam_move_cb = function(camobj, id, pulse) { if (pulse == 1) { if (_anim_stop) { _cam_anim.timeline = -ANIM_TIME; return; } m_app.disable_camera_controls(); // elapsed = frame time (e_sensor value) var elapsed = m_ctl.get_sensor_value(camobj, id, 1); var delta = elapsed / ANIM_TIME; m_vec3.subtract(_cam_anim.final_eye, _cam_anim.starting_eye, _vec3_tmp); m_vec3.scaleAndAdd(_cam_anim.current_eye, _vec3_tmp, delta, _cam_anim.current_eye); _delta_target -= elapsed; delta = 1 - _delta_target * _delta_target / (ANIM_TIME * ANIM_TIME); m_vec3.subtract(_cam_anim.final_target, _cam_anim.starting_target, _vec3_tmp); m_vec3.scaleAndAdd(_cam_anim.starting_target, _vec3_tmp, delta, _cam_anim.current_target); m_cam.set_trans_pivot(camobj, _cam_anim.current_eye, _cam_anim.current_target); } else { m_app.enable_camera_controls(false); if (!_anim_stop) m_cam.set_trans_pivot(camobj, _cam_anim.final_eye, _cam_anim.final_target); else _anim_stop = false; } }
var rot_interp_cb = function(obj, id, pulse) { if (pulse == 1 && (Math.abs(dest_x_mouse) > 0.001 || Math.abs(dest_y_mouse) > 0.001 || Math.abs(dest_x_touch) > 0.001 || Math.abs(dest_y_touch) > 0.001) && use_pivot) { var value = m_ctl.get_sensor_value(obj, id, 0); var x_mouse = m_util.smooth(dest_x_mouse, 0, value, CAM_SMOOTH_ROT_MOUSE); var y_mouse = m_util.smooth(dest_y_mouse, 0, value, CAM_SMOOTH_ROT_MOUSE); dest_x_mouse -= x_mouse; dest_y_mouse -= y_mouse; var x_touch = m_util.smooth(dest_x_touch, 0, value, CAM_SMOOTH_ROT_TOUCH); var y_touch = m_util.smooth(dest_y_touch, 0, value, CAM_SMOOTH_ROT_TOUCH); dest_x_touch -= x_touch; dest_y_touch -= y_touch; m_cam.rotate_pivot(obj, x_mouse + x_touch, y_mouse + y_touch); } }
function rock_fall_cb(obj, id, pulse, rock_wrapper) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); var mark = rock_wrapper.mark; m_trans.set_scale(mark, 0); rock_wrapper.falling_time += elapsed; if (rock_wrapper.falling_time <= _level_conf.ROCK_FALL_DELAY) { rock_wrapper.terrain_type = TT_NONE; return; } var rock_pos = _vec3_tmp; var mark_pos = _vec3_tmp_2; m_trans.get_translation(obj, rock_pos); m_trans.get_translation(mark, mark_pos); rock_pos[1] -= _level_conf.ROCK_SPEED * elapsed; m_trans.set_translation_v(obj, rock_pos); var mark_scale = 1 - Math.abs((rock_pos[1] - mark_pos[1])) / _level_conf.ROCK_RAY_LENGTH; m_trans.set_scale(mark, mark_scale); if (rock_pos[1] <= mark_pos[1]) rock_crash(rock_wrapper) }
var mute_solo_cb = function(obj, id, pulse) { var mute_solo = Boolean(m_ctl.get_sensor_value(obj, id, 2)); if (mute_solo) switch_mute(); else switch_solo(); }
function anim_cb(obj, id, pulse) { if (_char_wrapper.state == m_conf.CH_ATTACK) return; var on_ground = m_ctl.get_sensor_value(obj, id, 0); var cur_anim = m_anim.get_current_anim_name(_char_wrapper.rig); var required_anim = m_conf.CHAR_IDLE_ANIM; if (_char_wrapper.state == m_conf.CH_JUMP) { var required_anim = m_conf.CHAR_JUMP_ANIM; } else if (move_state.forw_back == 1) { var required_anim = m_conf.CHAR_RUN_ANIM; } else if (move_state.forw_back == -1) { var required_anim = m_conf.CHAR_RUN_ANIM; m_anim.set_speed(_char_wrapper.rig, -1); } else if (move_state.left_right == 1) { var required_anim = m_conf.CHAR_STRAFE; m_anim.set_speed(_char_wrapper.rig, -1); } else if (move_state.left_right == -1) { var required_anim = m_conf.CHAR_STRAFE; } if (cur_anim != required_anim) { m_anim.apply(_char_wrapper.rig, required_anim); m_anim.play(_char_wrapper.rig); m_anim.set_behavior(_char_wrapper.rig, m_anim.AB_CYCLIC); } }
function elapsed_cb(obj, id, pulse) { if (pulse == 1) { for (var i = 0; i < _ev_tracks.length; i++) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); process_event_track(_ev_tracks[i], elapsed); } } }
var shake_cb = function(obj, id, pulse) { var time = m_ctl.get_sensor_value(obj, id, 0); if (time - _start_shake_time < COCKPIT_SHAKE_TIME) { _dest_x_trans += (Math.random() - 0.5) * (1 - (time - _start_shake_time) / COCKPIT_SHAKE_TIME); _dest_y_trans += (Math.random() - 0.5) * (1 - (time - _start_shake_time) / COCKPIT_SHAKE_TIME); } else m_ctl.set_custom_sensor(_shake_sensor, 0); }
function bonus_lifetime_cb(obj, id, pulse, bonus_wrapper) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); bonus_wrapper.lifetime -= elapsed; if (bonus_wrapper.lifetime > 0) process_bonus_flashing(bonus_wrapper); else { m_trans.set_translation_v(bonus_wrapper.empty, m_conf.DEFAULT_POS) } }
var touch_cb = function(obj, id, pulse, param) { if (pulse == 1) { var r_mult = TOUCH_ROTATION_MULT_PX * rot_speed; var value = m_ctl.get_sensor_value(obj, id, 0); dest_x_touch += (param == "X") ? -value * r_mult : 0; dest_y_touch += (param == "Y") ? -value * r_mult : 0; } }
function animation_cb(obj, id, pulse) { var timeline = m_ctl.get_sensor_value(obj, id, 0); animate_sun(timeline); animate_planets(timeline); animate_orbits(timeline); }
var mouse_cb = function(obj, id, pulse, param) { if (pulse == 1) { var value = m_ctl.get_sensor_value(obj, id, 1); var r_mult = MOUSE_ROTATION_MULT_PX * rot_speed; dest_x_mouse += (param == "X") ? -value * r_mult : 0; dest_y_mouse += (param == "Y") ? -value * r_mult : 0; } }
function trigger_outline(obj, id, pulse) { if (pulse == 1) { // change outline color according to the // first manifold sensor (collision sensor) status var has_collision = m_ctl.get_sensor_value(obj, id, 0); if (has_collision) m_scenes.set_outline_color(OUTLINE_COLOR_ERROR); else m_scenes.set_outline_color(OUTLINE_COLOR_VALID); } }
var zoom_interp_cb = function(obj, id, pulse) { if (pulse == 1 && (Math.abs(dest_zoom_mouse) > 0.001 || Math.abs(dest_zoom_touch) > 0.001) && use_pivot) { var value = m_ctl.get_sensor_value(obj, id, 0); var zoom_mouse = m_util.smooth(dest_zoom_mouse, 0, value, CAM_SMOOTH_ZOOM_MOUSE); dest_zoom_mouse -= zoom_mouse; var zoom_touch = m_util.smooth(dest_zoom_touch, 0, value, CAM_SMOOTH_ZOOM_TOUCH); dest_zoom_touch -= zoom_touch; // block movement when in collision with some other object if (collision && m_ctl.get_sensor_value(obj, "CAMERA_COLLISION", 1)) return; m_trans.move_local(obj, 0, zoom_mouse + zoom_touch, 0); } }
function main_canvas_down(e) { if (e.button != 0) return; var camobj = m_scenes.get_active_camera(); if (m_ctl.get_sensor_value(camobj, "CAMERA_MOVE", 0) - _cam_anim.timeline < ANIM_TIME) _anim_stop = true; }
function smooth_cb(obj, id, pulse, rot_callback) { if (Math.abs(_mouse_delta[0]) > 0.01 || Math.abs(_mouse_delta[1]) > 0.01) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); var rot_x = m_util.smooth(_mouse_delta[0], 0, elapsed, smooth_coeff_mouse()); var rot_y = m_util.smooth(_mouse_delta[1], 0, elapsed, smooth_coeff_mouse()); _mouse_delta[0] -= rot_x; _mouse_delta[1] -= rot_y; rot_callback(-rot_x * FPS_MOUSE_MULT, -rot_y * FPS_MOUSE_MULT); } }
var crosshair_cb = function(obj, id, pulse) { var cam_pos = m_trans.get_translation(cam_obj, _vec3_tmp); m_trans.set_translation_v(obj, cam_pos); var view = m_trans.get_rotation(cam_obj, _quat_tmp); var cross_view = m_trans.get_rotation(obj, _quat_tmp2); var elapsed = m_ctl.get_sensor_value(obj, id, 0); var new_cross_view = m_quat.lerp(cross_view, view, CROSSHAIR_DELAY * elapsed, _quat_tmp); m_trans.set_rotation_v(obj, new_cross_view); }
function rock_fall_cb(obj, id, pulse) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); var obj_name = m_scs.get_object_name(obj); falling_time[obj_name] += elapsed; if (falling_time[obj_name] <= ROCK_FALL_DELAY) return; var rock_pos = _vec3_tmp; m_trans.get_translation(obj, rock_pos); rock_pos[1] -= ROCK_SPEED * elapsed; m_trans.set_translation_v(obj, rock_pos); }
var touch_zoom_cb = function(obj, id, pulse, param) { if (pulse == 1) { if (use_pivot) { var value = m_ctl.get_sensor_value(obj, id, 0); var cam_pivot = _vec3_tmp; var cam_eye = m_cam.get_eye(obj); m_cam.get_pivot(obj, cam_pivot); var dist = m_vec3.dist(cam_pivot, cam_eye); var t_mult = -value * dist * TOUCH_ZOOM_FACTOR * trans_speed; dest_zoom_touch += t_mult; } } }
var switch_spk_cb = function(obj, id, pulse) { if (pulse == 1) { var dir = Boolean(m_ctl.get_sensor_value(obj, id, 0)) ? -1 : 1; switch_strip(dir); if (id == "SWITCH_STRIP") m_ctl.reset_timer_sensor(obj, id, 5, 0.3); else m_ctl.reset_timer_sensor(obj, id, 5, 0); } else { // hold on some time m_ctl.reset_timer_sensor(obj, id, 5, 10); } }
// shiled and lava protect effects function bonus_timer_cb(obj, id) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); if (_shield_time_left > 0) { if (_shield_time_left - elapsed < m_conf.SHIELD_FLASH_LENGTH) m_char.remove_shield(); _shield_time_left -= elapsed; } if (_lava_protect_time_left > 0) { if (_lava_protect_time_left - elapsed < m_conf.LAVA_FALL_LENGTH) m_char.remove_lava_protect(); _lava_protect_time_left -= elapsed; } }
function move_cb(obj, id, pulse) { if (_char_wrapper.state == m_conf.CH_ATTACK) { m_phy.set_character_move_dir(obj, 0, 0); return; } var on_ground = m_ctl.get_sensor_value(obj, id, 6); if (pulse == 1) { switch(id) { case "FORWARD": move_state.forw_back = 1; break; case "BACKWARD": move_state.forw_back = -1; break; case "LEFT": move_state.left_right = 1; break; case "RIGHT": move_state.left_right = -1; break; } if (_char_wrapper.state != m_conf.CH_JUMP) _char_wrapper.state = m_conf.CH_RUN; } else { switch(id) { case "FORWARD": case "BACKWARD": move_state.forw_back = 0; break; case "LEFT": case "RIGHT": move_state.left_right = 0; break; } if (_char_wrapper.state != m_conf.CH_JUMP) _char_wrapper.state = m_conf.CH_STILL; } if ((move_state.forw_back || move_state.left_right) && on_ground) { if (!m_sfx.is_play(_char_run_spk)) m_sfx.play_def(_char_run_spk); } else { if (m_sfx.is_play(_char_run_spk)) m_sfx.stop(_char_run_spk); } m_phy.set_character_move_dir(obj, move_state.forw_back, move_state.left_right); };
function elapsed_cb(obj, id, pulse) { if (pulse == 1) { var value = m_ctl.get_sensor_value(obj, id, 0); switch (cam_type) { case m_cam.MS_TARGET_CONTROLS: m_cam.rotate_pivot(obj, value * auto_rotate_ratio, 0); break; case m_cam.MS_EYE_CONTROLS: m_cam.rotate(obj, value * auto_rotate_ratio, 0); break; } } }
var key_cb = function(obj, id, pulse) { if (pulse == 1) { var elapsed = m_ctl.get_sensor_value(obj, id, 0); switch (id) { case "FORWARD": if (is_vehicle) m_phy.vehicle_throttle(obj, 1); else m_trans.move_local(obj, 0, 0, trans_speed * elapsed); break; case "BACKWARD": if (is_vehicle) m_phy.vehicle_throttle(obj, -1); else m_trans.move_local(obj, 0, 0, -trans_speed * elapsed); break; case "LEFT": if (is_vehicle) m_phy.vehicle_steer(obj, -1); else m_trans.move_local(obj, trans_speed * elapsed, 0, 0); break; case "RIGHT": if (is_vehicle) m_phy.vehicle_steer(obj, 1); else m_trans.move_local(obj, -trans_speed * elapsed, 0, 0); break; default: break; } } else { switch (id) { case "FORWARD": case "BACKWARD": if (is_vehicle) m_phy.vehicle_throttle(obj, 0); break; case "LEFT": case "RIGHT": if (is_vehicle) m_phy.vehicle_steer(obj, 0); break; default: break; } } }
var burst_cb = function(obj, id, pulse) { var time = m_ctl.get_sensor_value(obj, id, 0); if (time - _burst_time > BURST_LISER_TIME) { m_ctl.set_custom_sensor(_burst_fire_sensor, 0); var speaker_strike = _cockpit.speaker_strike; if (speaker_strike && m_sfx.is_playing(speaker_strike)) m_sfx.stop(speaker_strike); } var cross_pos = m_trans.get_translation(obj, _vec3_tmp); var cross_view = m_trans.get_rotation(obj, _quat_tmp); var forward = m_vec3.transformQuat(m_util.AXIS_MY, cross_view, _vec3_tmp2); forward = m_vec3.scale(forward, MAX_LASER_LENGTH, _vec3_tmp2); forward = m_vec3.add(forward, cross_pos, forward); var elapsed = m_ctl.get_sensor_value(obj, id, 1); var ray_test_cb = function(id, hit_fract, obj_hit, hit_time) { damage_asteroid(obj_hit, elapsed * LASER_DAMAGE); } var id = m_phy.append_ray_test(null, cross_pos, forward, "crash", ray_test_cb, true); }
var inc_dec_cb = function(obj, id, pulse) { if (pulse == 1) { var dir = Boolean(m_ctl.get_sensor_value(obj, id, 2)) ? -1 : 1; param_inc_dec(dir); if (id == "INC_DEC") m_ctl.reset_timer_sensor(obj, id, 6, 0.3); else m_ctl.reset_timer_sensor(obj, id, 6, 0); } else { // hold on some time m_ctl.reset_timer_sensor(obj, id, 6, 10); } }