Skip to content

Commit

Permalink
Version 98
Browse files Browse the repository at this point in the history
  • Loading branch information
morgan3d committed Dec 18, 2023
1 parent b541a1e commit ee61e25
Show file tree
Hide file tree
Showing 24 changed files with 650 additions and 238 deletions.
2 changes: 1 addition & 1 deletion console/ace/mode-pyxlscript.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ define("ace/mode/pyxlscript_highlight_rules",["require","exports","module","ace/
// END CONSTANTS

// BEGIN FUNCTIONS GENERATED CODE
var builtinFunctions = "set_screen_size|ray_intersect|ray_intersect_map|up_y|draw_bounds|draw_disk|reset_clip|reset_transform|set_clip|draw_line|draw_sprite_corner_rect|intersect_clip|draw_point|draw_corner_rect|reset_camera|set_camera|get_camera|draw_rect|get_background|set_background|text_width|sprite_transfer_orientation|get_sprite_pixel_color|draw_sprite|draw_text|draw_tri|draw_poly|get_transform|get_clip|rotation_sign|sign_nonzero|set_transform|xy|xz_to_xyz|xy_to_angle|angle_to_xy|xy_to_xyz|xz_to_xy|xy_to_xz|xz|xyz|any_button_press|any_button_release|draw_map|draw_map_span|map_resize|map_generate_maze|map_resize|get_mode|get_previous_mode|get_map_pixel_color|get_map_pixel_color_by_ws_coord|get_map_sprite|set_map_sprite|get_map_sprite_by_ws_coord|set_map_sprite_by_ws_coord|parse|unparse|format_number|uppercase|lowercase|resume_audio|get_audio_status|ray_value|play_sound|stop_audio|game_frames|mode_frames|delay|sequence|add_frame_hook|make_spline|remove_frame_hook|make_entity|entity_mass|entity_move|entity_inertia|entity_area|draw_entity|overlaps|entity_remove_all|entity_add_child|entity_remove_child|entity_update_children|entity_simulate|split|now|game_frames|mode_frames|replace|starts_with|ends_with|find_move|make_move_finder|map_find_path|find_path|make_array|join|entity_apply_force|entity_apply_impulse|perp|gray|rgb|rgba|hsv|hsva|last_value|last_key|insert|reverse|reversed|call|set_post_effects|get_post_effects|reset_post_effects|push_front|local_time|device_control|physics_add_contact_callback|physics_entity_contacts|physics_entity_has_contacts|physics_add_entity|physics_remove_entity|physics_remove_all|physics_attach|physics_detach|make_physics|make_contact_group|draw_physics|physics_simulate|min|max|mid|find_max_value|find_min_value|max_value|min_value|abs|acos|atan|asin|sign|sign_nonzero|cos|clamp|hash|smoothstep|lerp|lerp_angle|smootherstep|perceptual_lerp_color|log|log2|log10|noise|oscillate|pow|make_random|random_from_distribution|random_sign|random_integer|random_within_cube|random_within_region|random_within_sphere|random_on_sphere|random_within_circle|random_within_region|random_within_square|random_on_square|random_on_circle|random_direction2D|random_direction3D|random_value|random_gaussian3D|random_on_cube|random_gaussian|random_gaussian2D|random_truncated_gaussian|random_truncated_gaussian2D|random_truncated_gaussian3D|ξ|sqrt|cbrt|sin|set_random_seed|tan|conncatenate|extend|extended|make_bot_gamepad|update_bot_gamepad|deep_immutable_clone|deep_clone|clone|copy|draw_previous_mode|cross|direction|dot|equivalent|magnitude|magnitude_squared|max_component|min_component|xy|xyz|midi_send_raw|trim_spaces|slice|set_pause_menu|iterate|iterate_pairs|contains|fast_remove_key|find|keys|remove_key|shuffle|shuffled|sort|sorted|resize|push|pop|pop_front|push_front|fast_remove_value|remove_values|remove_all|round|floor|ceil|todo|debug_pause|debug_print|resized|set_playback_rate|set_pitch|set_volume|set_pan|set_loop|remove_frame_hooks_by_mode|is_string|is_function|is_NaN|is_object|is_nil|is_boolean|is_number|is_array|rgb_to_xyz|axis_aligned_draw_box|animation_frame|load_local|save_local|transform_map_layer_to_ws_z|transform_ws_z_to_map_layer|transform_map_space_to_ws|transform_ws_to_map_space|transform_cs_to_ss|transform_cs_z_to_ws_z|transform_ws_z_to_cs_z|transform_ss_to_cs|transform_cs_to_ws|transform_ws_to_cs|transform_es_to_es|transform_es_to_sprite_space|transform_sprite_space_to_es|transform_to|transform_from|transform_es_to_ws|transform_ws_to_ws|transform_to_parent|transform_to_child|compose_transform|transform_ws_to_es|transform_cs_z_to_ss_z|transform_ss_z_to_cs_z|transform_ss_to_ws|transform_ws_to_ss|array_value|push_guest_menu_mode|stop_hosting|start_hosting|disconnect_guest|unparse_hex_color|xyz_to_rgb|ABS|ADD|DIV|MAD|SUM|PROD|MUL|SUB|FLOOR|CEIL|ROUND|MAX|MIN|MEAN|MEAN3|MEAN4|SIGN|CLAMP|LERP|RGB_ADD_RGB|RGB_SUB_RGB|RGB_MUL_RGB|RGB_DIV_RGB|RGB_DISTANCE|RGB_MUL|RGB_DIV|RGB_DOT_RGB|RGB_LERP|RGBA_ADD_RGBA|RGBA_SUB_RGBA|RGBA_MUL_RGBA|RGBA_DIV_RGBA|RGBA_MUL|RGBA_DIV|RGBA_DOT_RGBA|RGBA_LERP|XY_DISTANCE|XZ_DISTANCE|XYZ_DISTANCE|XY_MAD_S_XY|XY_MAD_XY_XY|XY_ADD_XY|XY_SUB_XY|XY_MUL_XY|XY_DIV_XY|XY_MUL|XY_DIV|XY_DOT_XY|XY_CRS_XY|XZ_ADD_XZ|XZ_SUB_XZ|XZ_MUL_XZ|XZ_DIV_XZ|XZ_MUL|XZ_DIV|XZ_DOT_XZ|XYZ_DIRECTION|XYZ_ADD_XYZ|XYZ_SUB_XYZ|XYZ_MAD_S_XYZ|XYZ_MUL_XYZ|XYZ_DIV_XYZ|XYZ_MUL|XYZ_DIV|XYZ_DOT_XYZ|XYZ_CRS_XYZ|XY_LERP|XYZ_LERP|XZ_LERP|XY_DIRECTION|XY_MAGNITUDE|XZ_MAGNITUDE|XYZ_MAGNITUDE|MAT2x2_MATMUL_XY|XZ_DIRECTION|MAT2x2_MATMUL_XZ|MAT3x3_MATMUL_XYZ|MAT3x4_MATMUL_XYZ|MAT3x4_MATMUL_XYZW";
var builtinFunctions = "set_screen_size|ray_intersect|ray_intersect_map|up_y|draw_bounds|draw_disk|reset_clip|reset_transform|set_clip|draw_line|draw_sprite_corner_rect|intersect_clip|draw_point|draw_corner_rect|reset_camera|set_camera|get_camera|draw_rect|get_background|set_background|text_width|sprite_transfer_orientation|get_sprite_pixel_color|draw_sprite|draw_text|draw_tri|draw_poly|get_transform|get_clip|rotation_sign|sign_nonzero|set_transform|xy|xz_to_xyz|xy_to_angle|angle_to_xy|xy_to_xyz|xz_to_xy|xy_to_xz|xz|xyz|any_button_press|any_button_release|draw_map|draw_map_span|map_resize|map_generate_maze|map_resize|get_mode|get_previous_mode|get_map_pixel_color|get_map_pixel_color_by_ws_coord|get_map_sprite|set_map_sprite|get_map_sprite_by_ws_coord|set_map_sprite_by_ws_coord|parse|unparse|format_number|capitalized|uppercase|lowercase|resume_audio|get_audio_status|ray_value|play_sound|stop_audio|game_frames|mode_frames|delay|sequence|add_frame_hook|make_spline|remove_frame_hook|make_entity|entity_mass|entity_move|entity_inertia|entity_area|draw_entity|overlaps|entity_remove_all|entity_add_child|entity_remove_child|entity_update_children|entity_simulate|split|now|game_frames|mode_frames|replace|starts_with|ends_with|find_move|make_move_finder|map_find_path|find_path|make_array|join|entity_apply_force|entity_apply_impulse|perp|gray|rgb|rgba|hsv|hsva|last_value|last_key|insert|reverse|reversed|call|set_post_effects|get_post_effects|reset_post_effects|push_front|local_time|device_control|physics_add_contact_callback|physics_entity_contacts|physics_entity_has_contacts|physics_add_entity|physics_remove_entity|physics_remove_all|physics_attach|physics_detach|make_physics|make_contact_group|draw_physics|physics_simulate|min|max|mid|find_max_value|find_min_value|max_value|min_value|abs|acos|atan|asin|sign|sign_nonzero|cos|clamp|hash|smoothstep|lerp|lerp_angle|smootherstep|perceptual_lerp_color|log|log2|log10|noise|oscillate|pow|make_random|random_from_distribution|random_sign|random_integer|random_within_cube|random_within_region|random_within_sphere|random_on_sphere|random_within_circle|random_within_region|random_within_square|random_on_square|random_on_circle|random_direction2D|random_direction3D|random_value|random_gaussian3D|random_on_cube|random_gaussian|random_gaussian2D|random_truncated_gaussian|random_truncated_gaussian2D|random_truncated_gaussian3D|ξ|sqrt|cbrt|sin|set_random_seed|tan|conncatenate|extend|extended|make_bot_gamepad|update_bot_gamepad|deep_immutable_clone|deep_clone|clone|copy|draw_previous_mode|cross|direction|dot|equivalent|magnitude|magnitude_squared|max_component|min_component|xy|xyz|midi_send_raw|trim_spaces|slice|set_pause_menu|iterate|iterate_pairs|contains|fast_remove_key|find|keys|remove_key|shuffle|shuffled|sort|sorted|resize|push|pop|pop_front|push_front|fast_remove_value|remove_values|remove_all|round|floor|ceil|todo|debug_pause|debug_print|resized|set_playback_rate|set_pitch|set_volume|set_pan|set_loop|remove_frame_hooks_by_mode|is_string|is_function|is_NaN|is_object|is_nil|is_boolean|is_number|is_array|rgb_to_xyz|axis_aligned_draw_box|animation_frame|load_local|save_local|transform_map_layer_to_ws_z|transform_ws_z_to_map_layer|transform_map_space_to_ws|transform_ws_to_map_space|transform_cs_to_ss|transform_cs_z_to_ws_z|transform_ws_z_to_cs_z|transform_ss_to_cs|transform_cs_to_ws|transform_ws_to_cs|transform_es_to_es|transform_es_to_sprite_space|transform_sprite_space_to_es|transform_to|transform_from|transform_es_to_ws|transform_ws_to_ws|transform_to_parent|transform_to_child|compose_transform|transform_ws_to_es|transform_cs_z_to_ss_z|transform_ss_z_to_cs_z|transform_ss_to_ws|transform_ws_to_ss|array_value|push_guest_menu_mode|stop_hosting|start_hosting|disconnect_guest|unparse_hex_color|xyz_to_rgb|ABS|ADD|DIV|MAD|SUM|PROD|MUL|SUB|FLOOR|CEIL|ROUND|MAX|MIN|MEAN|MEAN3|MEAN4|SIGN|CLAMP|LERP|RGB_ADD_RGB|RGB_SUB_RGB|RGB_MUL_RGB|RGB_DIV_RGB|RGB_DISTANCE|RGB_MUL|RGB_DIV|RGB_DOT_RGB|RGB_LERP|RGBA_ADD_RGBA|RGBA_SUB_RGBA|RGBA_MUL_RGBA|RGBA_DIV_RGBA|RGBA_MUL|RGBA_DIV|RGBA_DOT_RGBA|RGBA_LERP|XY_DISTANCE|XZ_DISTANCE|XYZ_DISTANCE|XY_MAD_S_XY|XY_MAD_XY_XY|XY_ADD_XY|XY_SUB_XY|XY_MUL_XY|XY_DIV_XY|XY_MUL|XY_DIV|XY_DOT_XY|XY_CRS_XY|XZ_ADD_XZ|XZ_SUB_XZ|XZ_MUL_XZ|XZ_DIV_XZ|XZ_MUL|XZ_DIV|XZ_DOT_XZ|XYZ_DIRECTION|XYZ_ADD_XYZ|XYZ_SUB_XYZ|XYZ_MAD_S_XYZ|XYZ_MUL_XYZ|XYZ_DIV_XYZ|XYZ_MUL|XYZ_DIV|XYZ_DOT_XYZ|XYZ_CRS_XYZ|XY_LERP|XYZ_LERP|XZ_LERP|XY_DIRECTION|XY_MAGNITUDE|XZ_MAGNITUDE|XYZ_MAGNITUDE|MAT2x2_MATMUL_XY|XZ_DIRECTION|MAT2x2_MATMUL_XZ|MAT3x3_MATMUL_XYZ|MAT3x4_MATMUL_XYZ|MAT3x4_MATMUL_XYZW";
// END FUNCTIONS

var keywordMapper = this.createKeywordMapper({
Expand Down
2 changes: 2 additions & 0 deletions console/filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,13 @@ EuroFilter.prototype.update = function (x, dt) {

if ((param.smoothValue === undefined) || isNaN(param.smoothValue) || (dt <= 0) || (dt === Infinity)) {
// First value
console.assert(! isNaN(x));
param.smoothValue = x;
param.smoothDerivative = 0;
return;
}

console.assert(dt !== 0);
// Filter the derivative
const dx = (x - param.smoothValue) / dt;
param.smoothDerivative = smoothLerp(dx, param.smoothDerivative, dt, param.derivativeCutoff);
Expand Down
3 changes: 2 additions & 1 deletion console/quadplay-browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,8 @@ function $systemPrint(m, style) {
// Allows HTML. location may be undefined
function $outputAppend(m, location, linkAll) {
if (m !== '' && m !== undefined) {
// Uncomment to debug mystery output
// Uncomment to debug mystery output. Also
// use your browser debugger to 'pause on caught exceptions'
//console.trace();

// Remove tags and then restore HTML entities
Expand Down
127 changes: 124 additions & 3 deletions console/quadplay-edit-asset.js
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,6 @@ function readNumberFromControl(controlName, defaultValue) {
}



function readIntFromControl(controlName, defaultValue) {
const a = parseInt(document.getElementById(controlName).value)
if (! isFinite(a)) {
Expand All @@ -498,6 +497,7 @@ function readIntFromControl(controlName, defaultValue) {
}
}


/*
templateParameters is a table. Each key triggers a SINGLE
replacement in the template of "TODO: key" -> JSON.stringify(value).
Expand Down Expand Up @@ -562,6 +562,126 @@ function hideNewAssetDialog() {

/////////////////////////////////////////////////////////////////////////////////////////////////////

function onCloneAsset(assetName) {
document.getElementById('cloneAssetDialog').classList.remove('hidden');

document.getElementById('cloneAssetSrcName').innerHTML = assetName;

// Remove any leading slash, which is part of the URL but will
// confuse a user by looking like an absolute filesystem path
const gamePath = getGamePath().replace(/^\//, '');
const srcUrl = gameSource.json.assets[assetName];
const srcAbsoluteUrl = ((srcUrl.indexOf(':') === -1) ?
gamePath : '') + srcUrl;

document.getElementById('cloneAssetSrcUrl').innerHTML = srcAbsoluteUrl;

document.getElementById('cloneAssetDstUrl').innerHTML = gamePath +
gameSource.json.assets[assetName].replace(/^.*\//, '');

document.getElementById('cloneAssetKeepOriginal').checked = false;
document.getElementById('cloneAssetNewName').disabled = true;
document.getElementById('cloneAssetNewName').value = '';
}


function hideCloneAssetDialog() {
document.getElementById('cloneAssetDialog').classList.add('hidden');
}


function onCloneAssetCreate() {
// The order of operations in this function is convoluted because
// it must asynchronously read the asset JSON, and then may need
// to read the asset data, before it can write.

hideCloneAssetDialog();

const add = document.getElementById('cloneAssetKeepOriginal').checked;

const srcAssetName = document.getElementById('cloneAssetSrcName').innerHTML;
const dstAssetName = add ? document.getElementById('cloneAssetNewName').value.replace(/(^_|[^_0-9A-Za-z])/g, '') : srcAssetName;

const cloneData = document.getElementById('cloneAssetCloneData').checked;

// Absolute
const srcAbsoluteUrl = document.getElementById('cloneAssetSrcUrl').innerHTML;

// Relative to the game
const dstUrl = document.getElementById('cloneAssetDstUrl').innerHTML.replace(/^.*\//, '');

// Accumulated after the LoadManager is created
const filesToWrite = [];

const cloneLoadManager = new LoadManager({
callback: function () {
serverWriteFiles(
filesToWrite,

function () {
// Modify game JSON to reference the new file
gameSource.json.assets[dstAssetName] = dstUrl;

// Save and reload game JSON
serverSaveGameJSON(function () {
loadGameIntoIDE(window.gameURL, function () {
// Select the renamed asset
onProjectSelect(document.getElementById('projectAsset_' + dstAssetName), 'asset', gameSource.assets[dstAssetName]);
}, true);
});
}); // write files
} // load manager callback
}); // load manager

// Clone the asset JSON
cloneLoadManager.fetch(
srcAbsoluteUrl,
'text',
null,
function (assetJson) {
const dstAssetUrl = assetJson.url.replace(/^.*\//, '');

// Change the url in the file to be the new relative url for the json
assetJson.url = dstAssetUrl;

const dstAbsoluteUrl = getGamePath() + dstUrl;

filesToWrite.push({
filename: dstAbsoluteUrl,
contents: assetJson,
encoding: 'utf8'});

if (cloneData) {
let srcAssetAbsoluteUrl = assetJson.url;
if (srcAssetAbsoluteUrl.indexOf(':') === -1) {
// This src asset was specified is relative to the
// asset json, so copy over its path prefix
srcAssetAbsoluteUrl = srcAbsoluteUrl.replace(/\/[^\/]*$/, '/') + srcAssetAbsoluteUrl;
}

const dstAssetAbsoluteUrl = getGamePath() + dstAssetUrl;

// Copy the underlying asset
cloneLoadManager.fetch(
srcAssetAbsoluteUrl,
'arraybuffer',
null,
function (assetData) {
filesToWrite.push({
filename: dstAssetAbsoluteUrl,
contents: assetData,
encoding: (typeof assetData === 'string' ? 'utf8' : 'binary')
});
});
} // if clone data
}); // fetch first

// Start the loading, which will trigger the saving
cloneLoadManager.end();
}

/////////////////////////////////////////////////////////////////////////////////////////////////////

function onRenameAsset(assetName) {
let newName;
while (true) {
Expand Down Expand Up @@ -643,10 +763,11 @@ function showAssetContextMenu(assetName) {
}
}
}

customContextMenu.innerHTML =
`<div onmousedown="onProjectSelect(${getElement}, 'asset', gameSource.assets['${assetName}'])">Inspect</div>
<div onmousedown="onRenameAsset('${assetName}')">Rename&hellip;</div>` +
<div onmousedown="onRenameAsset('${assetName}')">Rename&hellip;</div>
<div onmousedown="onCloneAsset('${assetName}')">Clone&hellip;</div>` +
externalCmds +
`<hr><div onmousedown="onRemoveAsset('${assetName}')"><span style="margin-left:-18px; width:18px; display:inline-block; text-align:center">&times;</span>Remove '${assetName}'</div>`;
showContextMenu('project');
Expand Down
Loading

0 comments on commit ee61e25

Please sign in to comment.