diff --git a/app/Changelog.md b/app/Changelog.md index 0b329ec2a..6b5392527 100644 --- a/app/Changelog.md +++ b/app/Changelog.md @@ -1,3 +1,38 @@ +## v2.0.2 + +*Sun Apr 17 2022* + +### ✨ New Features + +* Internal: Add two utility classes to change cursor on specific elements + +### ⚡️ General Improvements + +* Add an explicit close button to the asset-selector, if there is a cancel action defined to it. Also adds an example of a "close" button pattern inside a dimmer to the CSS stylebook +* Add basic typings to Window object and to the global scope (setTimeout and co, atob, btoa and such) +* Add support for ct.pointer to ct.vkeys +* Do not show "there is nothing here" filler if an asset viewer has to display a "none" option +* Move particles' node modules to the same folder as tandems'; enforce type checks on default emitters and tandems; add the missing uid property to emitter tandems. +* Tweak UI animations' duration; add subtle animations to most modal dialogues +* Update Chinese Simplified translations (#335 by @emaoshushu) +* Update Turkish translation. 100% coverage thanks to Sarpmanon.js! + +### 🐛 Bug Fixes + +* 🍱 Fix music stopping on the third level of the Lab Raid demo. Thanks mugeen for finding the issue and its source. +* Changing speed of a copy from zero should reuse its saved direction (zeroDirectionAccessor). Closes #334 +* Fix asset inputs' styles affecting button groups deeper into its tree +* Fix broken project-aware code completions +* Fix ct.place.moveAlong (which is also this.moveContinuous for copies) using v1 directions values and not handling the latest bit of the path properly +* Fix ct.pointer not writing pointer.PrimaryKey, pointer.SecondaryKey to the Actions system +* Fix the asset selector applying styles to more than it should have. Fixes the group editor inside asset selection models being large as heck. +* Fix the asset-selector incorrectly capturing clicks on its modal's background +* Fix the usage of non-existent ct.place methods in ct.pointer + +### 🌐 Website + +* :zap: Update list of features in the presskit + ## v2.0.1 *Sat Mar 26 2022* diff --git a/app/data/ct.libs/gamepad/index.js b/app/data/ct.libs/gamepad/index.js index c775b0065..344951916 100644 --- a/app/data/ct.libs/gamepad/index.js +++ b/app/data/ct.libs/gamepad/index.js @@ -1,128 +1,131 @@ -/* Based on https://github.com/luser/gamepadtest */ - -(function() { - const standardMapping = { - controllers: {}, - buttonsMapping: [ - 'Button1', - 'Button2', - 'Button3', - 'Button4', - 'L1', - 'R1', - 'L2', - 'R2', - 'Select', - 'Start', - // here, must have same name as in module.js - 'L3', - //'LStickButton', - // here, too... - 'R3', - //'RStickButton', - // up, down, left and right are all mapped as axes. - 'Up', - 'Down', - 'Left', - 'Right' - - // + a special button code `Any`, that requires special handling - ], - axesMapping: ['LStickX', 'LStickY', 'RStickX', 'RStickY'] - }; - - const prefix = 'gamepad.'; - - const setRegistry = function(key, value) { - ct.inputs.registry[prefix + key] = value; - }; - const getRegistry = function(key) { - return ct.inputs.registry[prefix + key] || 0; - }; - - const getGamepads = function() { - return navigator.getGamepads(); - }; - - const addGamepad = function(gamepad) { - standardMapping.controllers[gamepad.index] = gamepad; - }; - - const scanGamepads = function() { - const gamepads = getGamepads(); - for (let i = 0, len = gamepads.length; i < len; i++) { - if (gamepads[i]) { - const {controllers} = standardMapping; - if (!(gamepads[i].index in controllers)) { - // add new gamepad object - addGamepad(gamepads[i]); - } else { - // update gamepad object state - controllers[gamepads[i].index] = gamepads[i]; - } - } - } - }; - - const updateStatus = function() { - scanGamepads(); - let j; - const {controllers} = standardMapping; - const {buttonsMapping} = standardMapping; - const {axesMapping} = standardMapping; - for (j in controllers) { - /** - * @type {Gamepad} - */ - const controller = controllers[j]; - const buttonsLen = controller.buttons.length; - - // Reset the 'any button' input - setRegistry('Any', 0); - // loop through all the known button codes and update their state - for (let i = 0; i < buttonsLen; i++) { - setRegistry(buttonsMapping[i], controller.buttons[i].value); - // update the 'any button', if needed - setRegistry('Any', Math.max(getRegistry('Any'), controller.buttons[i].value)); - ct.gamepad.lastButton = buttonsMapping[i]; - } - - // loop through all the known axes and update their state - const axesLen = controller.axes.length; - for (let i = 0; i < axesLen; i++) { - setRegistry(axesMapping[i], controller.axes[i]); - } - } - }; - - ct.gamepad = Object.assign(new PIXI.utils.EventEmitter(), { - list: getGamepads(), - connected(e) { - ct.gamepad.emit('connected', e.gamepad, e); - addGamepad(e.gamepad); - }, - disconnected(e) { - ct.gamepad.emit('disconnected', e.gamepad, e); - delete standardMapping.controllers[e.gamepad.index]; - }, - getButton: code => { - if (standardMapping.buttonsMapping.indexOf(code) === -1 && code !== 'Any') { - throw new Error(`[ct.gamepad] Attempt to get the state of a non-existing button ${code}. A typo?`); - } - return getRegistry(code); - }, - getAxis: code => { - if (standardMapping.axesMapping.indexOf(code) === -1) { - throw new Error(`[ct.gamepad] Attempt to get the state of a non-existing axis ${code}. A typo?`); - } - return getRegistry(code); - }, - lastButton: null - }); - - // register events - window.addEventListener('gamepadconnected', ct.gamepad.connected); - window.addEventListener('gamepaddisconnected', ct.gamepad.disconnected); - // register a ticker listener - ct.pixiApp.ticker.add(updateStatus); -})(); +/* Based on https://github.com/luser/gamepadtest */ + +(function ctGamepad() { + const standardMapping = { + controllers: {}, + buttonsMapping: [ + 'Button1', + 'Button2', + 'Button3', + 'Button4', + 'L1', + 'R1', + 'L2', + 'R2', + 'Select', + 'Start', + // here, must have same name as in module.js + 'L3', + //'LStickButton', + // here, too... + 'R3', + //'RStickButton', + // up, down, left and right are all mapped as axes. + 'Up', + 'Down', + 'Left', + 'Right' + + // + a special button code `Any`, that requires special handling + ], + axesMapping: ['LStickX', 'LStickY', 'RStickX', 'RStickY'] + }; + + const prefix = 'gamepad.'; + + const setRegistry = function (key, value) { + ct.inputs.registry[prefix + key] = value; + }; + const getRegistry = function (key) { + return ct.inputs.registry[prefix + key] || 0; + }; + + const getGamepads = function () { + if (navigator.getGamepads) { + return navigator.getGamepads(); + } + return []; + }; + + const addGamepad = function (gamepad) { + standardMapping.controllers[gamepad.index] = gamepad; + }; + + const scanGamepads = function () { + const gamepads = getGamepads(); + for (let i = 0, len = gamepads.length; i < len; i++) { + if (gamepads[i]) { + const {controllers} = standardMapping; + if (!(gamepads[i].index in controllers)) { + // add new gamepad object + addGamepad(gamepads[i]); + } else { + // update gamepad object state + controllers[gamepads[i].index] = gamepads[i]; + } + } + } + }; + + const updateStatus = function () { + scanGamepads(); + let j; + const {controllers} = standardMapping; + const {buttonsMapping} = standardMapping; + const {axesMapping} = standardMapping; + for (j in controllers) { + /** + * @type {Gamepad} + */ + const controller = controllers[j]; + const buttonsLen = controller.buttons.length; + + // Reset the 'any button' input + setRegistry('Any', 0); + // loop through all the known button codes and update their state + for (let i = 0; i < buttonsLen; i++) { + setRegistry(buttonsMapping[i], controller.buttons[i].value); + // update the 'any button', if needed + setRegistry('Any', Math.max(getRegistry('Any'), controller.buttons[i].value)); + ct.gamepad.lastButton = buttonsMapping[i]; + } + + // loop through all the known axes and update their state + const axesLen = controller.axes.length; + for (let i = 0; i < axesLen; i++) { + setRegistry(axesMapping[i], controller.axes[i]); + } + } + }; + + ct.gamepad = Object.assign(new PIXI.utils.EventEmitter(), { + list: getGamepads(), + connected(e) { + ct.gamepad.emit('connected', e.gamepad, e); + addGamepad(e.gamepad); + }, + disconnected(e) { + ct.gamepad.emit('disconnected', e.gamepad, e); + delete standardMapping.controllers[e.gamepad.index]; + }, + getButton: code => { + if (standardMapping.buttonsMapping.indexOf(code) === -1 && code !== 'Any') { + throw new Error(`[ct.gamepad] Attempt to get the state of a non-existing button ${code}. A typo?`); + } + return getRegistry(code); + }, + getAxis: code => { + if (standardMapping.axesMapping.indexOf(code) === -1) { + throw new Error(`[ct.gamepad] Attempt to get the state of a non-existing axis ${code}. A typo?`); + } + return getRegistry(code); + }, + lastButton: null + }); + + // register events + window.addEventListener('gamepadconnected', ct.gamepad.connected); + window.addEventListener('gamepaddisconnected', ct.gamepad.disconnected); + // register a ticker listener + ct.pixiApp.ticker.add(updateStatus); +})(); diff --git a/app/data/ct.libs/gamepad/module.json b/app/data/ct.libs/gamepad/module.json index 68df676e1..3d94d6c64 100644 --- a/app/data/ct.libs/gamepad/module.json +++ b/app/data/ct.libs/gamepad/module.json @@ -4,7 +4,7 @@ "tagline": "Connect your gamepad to the Actions system.", "name_Ru": "Геймпад", "tagline_Ru": "Подключает джойстики к системе Действий.", - "version": "1.0.0", + "version": "1.0.1", "packageName": "gamepad", "authors": [ { diff --git a/app/data/ct.libs/place/index.js b/app/data/ct.libs/place/index.js index 5506b7c49..0c8830fed 100644 --- a/app/data/ct.libs/place/index.js +++ b/app/data/ct.libs/place/index.js @@ -602,9 +602,13 @@ length *= -1; dir += 180; } - var dx = Math.cos(dir * Math.PI / -180) * precision, - dy = Math.sin(dir * Math.PI / -180) * precision; - for (let i = 0; i < length; i += precision) { + var dx = Math.cos(dir * Math.PI / 180) * precision, + dy = Math.sin(dir * Math.PI / 180) * precision; + while (length > 0) { + if (length < 1) { + dx *= length; + dy *= length; + } const occupied = ct.place.occupied(me, me.x + dx, me.y + dy, cgroup); if (!occupied) { me.x += dx; @@ -613,6 +617,7 @@ } else { return occupied; } + length--; } return false; }, diff --git a/app/data/ct.libs/pointer/index.js b/app/data/ct.libs/pointer/index.js index 55be62c61..a047eb600 100644 --- a/app/data/ct.libs/pointer/index.js +++ b/app/data/ct.libs/pointer/index.js @@ -88,10 +88,6 @@ tiltY: pointer.tiltY, twist: pointer.twist }); - for (const button in buttonMappings) { - // eslint-disable-next-line no-bitwise - setKey(button, (pointer.buttons & buttonMappings[button]) === button ? 1 : 0); - } }; var handleHoverStart = function (e) { @@ -184,7 +180,7 @@ if (specificPointer && pointer.id !== specificPointer.id) { continue; } - if (ct.place[uiSpace ? 'collideUi' : 'collide'](copy, { + if (ct.place.collide(copy, { x: uiSpace ? pointer.xui : pointer.x, y: uiSpace ? pointer.yui : pointer.y, scale: { @@ -356,6 +352,16 @@ lastPanY = y; lastAngle = angle; lastScaleDistance = distance; + + for (const button in buttonMappings) { + setKey(button, 0); + for (const pointer of ct.pointer.down) { + // eslint-disable-next-line no-bitwise + if ((pointer.buttons & buttonMappings[button]) === buttonMappings[button]) { + setKey(button, 1); + } + } + } }, lock() { if (locking) { diff --git a/app/data/ct.libs/pointer/module.json b/app/data/ct.libs/pointer/module.json index ff9b0f139..9e478c472 100644 --- a/app/data/ct.libs/pointer/module.json +++ b/app/data/ct.libs/pointer/module.json @@ -4,7 +4,7 @@ "name_Ru": "Указатель", "tagline": "A uniform API for any type of pointer devices, be it touchscreens, pen tablets, or mouse.", "tagline_Ru": "Единый API для всех видов указателей — мышек, тач-экранов, графических планшетов и т.д.", - "version": "1.0.0", + "version": "1.0.1", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" diff --git a/app/data/ct.libs/vkeys/index.js b/app/data/ct.libs/vkeys/index.js index ac13f1272..89f817bbe 100644 --- a/app/data/ct.libs/vkeys/index.js +++ b/app/data/ct.libs/vkeys/index.js @@ -1,4 +1,4 @@ -(function () { +(function ctVkeys() { ct.vkeys = { button(options) { var opts = ct.u.ext({ diff --git a/app/data/ct.libs/vkeys/injections/templates.js b/app/data/ct.libs/vkeys/injections/templates.js index 02e12b84f..585547e93 100644 --- a/app/data/ct.libs/vkeys/injections/templates.js +++ b/app/data/ct.libs/vkeys/injections/templates.js @@ -1,4 +1,4 @@ -(function () { +(function vkeysTemplates() { ct.templates.templates.VKEY = { onStep: function () { var down = false, @@ -19,6 +19,14 @@ } } } + if (ct.pointer) { + if (ct.pointer.hoversUi(this)) { + hover = true; + if (ct.pointer.collidesUi(this)) { + down = true; + } + } + } if (down) { this.tex = this.opts.texActive || this.opts.texNormal; @@ -33,10 +41,12 @@ } }, onDraw: function () { - this.x = (typeof this.opts.x === 'function')? this.opts.x() : this.opts.x; - this.y = (typeof this.opts.y === 'function')? this.opts.y() : this.opts.y; + this.x = (typeof this.opts.x === 'function') ? this.opts.x() : this.opts.x; + this.y = (typeof this.opts.y === 'function') ? this.opts.y() : this.opts.y; + }, + onDestroy: function () { + void 0; }, - onDestroy: function () {void 0;}, onCreate: function () { this.tex = this.opts.texNormal; this.depth = this.opts.depth; @@ -51,6 +61,7 @@ this.trackball = new PIXI.Sprite(ct.res.getTexture(this.opts.trackballTex, 0)); this.addChild(this.trackball); }, + // eslint-disable-next-line complexity onStep: function () { var dx = 0, dy = 0; @@ -87,6 +98,25 @@ this.down = false; } } + if (ct.pointer) { + if (this.trackedPointer && !ct.pointer.down.includes(this.trackedPointer)) { + this.trackedPointer = void 0; + } + if (!this.trackedPointer) { + const pointer = ct.pointer.collidesUi(this); + if (pointer) { + this.down = true; + this.trackedPointer = pointer; + } + } + if (this.trackedPointer) { + dx = this.trackedPointer.xui - this.x; + dy = this.trackedPointer.yui - this.y; + } else { + this.touchId = false; + this.down = false; + } + } var r = this.shape.r || this.shape.right || 64; if (this.down) { dx /= r; @@ -106,9 +136,11 @@ this.trackball.y = dy * r; }, onDraw: function () { - this.x = (typeof this.opts.x === 'function')? this.opts.x() : this.opts.x; - this.y = (typeof this.opts.y === 'function')? this.opts.y() : this.opts.y; + this.x = (typeof this.opts.x === 'function') ? this.opts.x() : this.opts.x; + this.y = (typeof this.opts.y === 'function') ? this.opts.y() : this.opts.y; }, - onDestroy: function () {void 0;} + onDestroy: function () { + void 0; + } }; })(); diff --git a/app/data/ct.libs/vkeys/module.json b/app/data/ct.libs/vkeys/module.json index ab1f1b9c8..e6c091e8f 100644 --- a/app/data/ct.libs/vkeys/module.json +++ b/app/data/ct.libs/vkeys/module.json @@ -4,7 +4,7 @@ "name_Ru": "Виртуальные клавиши", "tagline": "Create on-screen buttons and joysticks and listen to them in Actions system.", "tagline_Ru": "Создай экранные кнопки и джойстики и слушай за их событиями в системе Действий.", - "version": "2.0.0", + "version": "3.0.0", "authors": [{ "name": "Cosmo Myzrail Gorynych", "mail": "admin@nersta.ru" @@ -35,5 +35,6 @@ "Vjoy3Y": "3rd virtual joystick, Y axis", "Vjoy4X": "4th virtual joystick, X axis", "Vjoy4Y": "4th virtual joystick, Y axis" - } + }, + "optionalDependencies": ["mouse", "touch", "pointer"] } diff --git a/app/data/ct.release/templates.js b/app/data/ct.release/templates.js index d50947e7c..a7d3cbf4e 100644 --- a/app/data/ct.release/templates.js +++ b/app/data/ct.release/templates.js @@ -155,7 +155,9 @@ const Copy = (function Copy() { return; } if (this.speed === 0) { - this.hspeed = value; + const restoredDir = this[zeroDirectionAccessor]; + this[hspeedAccessor] = value * Math.cos(restoredDir * Math.PI / 180); + this[vspeedAccessor] = value * Math.sin(restoredDir * Math.PI / 180); return; } var multiplier = value / this.speed; diff --git a/app/data/i18n/Chinese Simplified.json b/app/data/i18n/Chinese Simplified.json index ff99c1aa0..e9f0b1729 100644 --- a/app/data/i18n/Chinese Simplified.json +++ b/app/data/i18n/Chinese Simplified.json @@ -22,7 +22,7 @@ "name": "名称", "no": "否", "none": "无", - "ok": "好", + "ok": "确认", "open": "打开", "paste": "粘贴", "rename": "重命名", @@ -42,32 +42,32 @@ "couldNotLoadFromClipboard": "无法从剪贴板加载数据", "filter": "过滤:", "pastedFromClipboard": "从剪贴板粘贴", - "edit": "", - "nothingToShowFiller": "", - "required": "", - "settings": "", + "edit": "编辑", + "nothingToShowFiller": "这里没有什么可以展示的", + "required": "必需", + "settings": "设置", "fieldTypes": { - "checkbox": "", - "code": "", - "color": "", - "group": "", - "h1": "", - "h2": "", - "h3": "", - "h4": "", - "number": "", - "point2D": "", - "radio": "", - "slider": "", - "sliderAndNumber": "", - "table": "", - "text": "", - "textfield": "", - "texture": "", - "template": "", - "room": "", - "sound": "", - "tandem": "" + "checkbox": "复选", + "code": "程序代码", + "color": "颜色", + "group": "字段组", + "h1": "一级主标题", + "h2": "二级主标题", + "h3": "三级主标题", + "h4": "四级主标题", + "number": "数字", + "point2D": "二维点", + "radio": "单选按钮", + "slider": "滑块", + "sliderAndNumber": "带有数字输入的滑块", + "table": "表格", + "text": "短文本", + "textfield": "文本框", + "texture": "纹理", + "template": "模板", + "room": "房间", + "sound": "声音", + "tandem": "粒子发射器" }, "newName": "新名称", "saveProject": "保存项目", @@ -81,49 +81,49 @@ "noRooms": "您需要至少一个房间来编译您的应用.", "tileLayer": "平铺层", "ctSite": "ct.js 网站首页", - "docsShort": "", - "docsLong": "", - "openAssetGallery": "", + "docsShort": "文档", + "docsLong": "文档", + "openAssetGallery": "图库", "assetTypes": { "textures": [ - "", - "", - "" + "纹理", + "纹理", + "纹理" ], "templates": [ - "", - "", - "" + "模板", + "模板", + "模板" ], "emitterTandems": [ - "", - "", - "" + "发射器串联", + "发射器串联", + "发射器串联" ], "rooms": [ - "", - "", - "" + "房间", + "房间", + "房间" ], "fonts": [ - "", - "", - "" + "字体", + "字体", + "字体" ], "styles": [ - "", - "", - "" + "样式", + "样式", + "样式" ], "sounds": [ - "", - "", - "" + "声音", + "声音", + "声音" ], "skeletons": [ - "", - "", - "" + "骨骼精灵图形", + "骨骼精灵图形", + "骨骼精灵图形" ] } }, @@ -166,14 +166,14 @@ "windowsCrossBuildWarning": "要从Linux/MacOS为Windows构建, 需要在系统中安装Wine. 安装说明对于不同的平台都是不一样的,所以你最好自己搜索一下:)", "cannotBuildForMacOnWin": "糟糕, Windows只会生成坏掉的Mac包. 尝试使用Linux机器;例如, 在虚拟机里, 它是100%免费的!", "firstRunNotice": "每个平台的第一次运行会比较慢, 因为ct.js会下载并保存打包所需的额外库. 这需要一些时间, 但下一次几乎是瞬间的.", - "projectTitleRequired": "", - "appIdRequired": "", - "noAndroidSdkFound": "", - "envVarNotice": "", - "downloadAndroidStudio": "", - "requiresInternetNotice": "", - "noJdkFound": "", - "downloadJDK": "" + "projectTitleRequired": "你需要在项目选项卡 → 创作 → 名称 中添加标题", + "appIdRequired": "你需要在项目选项卡 → 创作 → 应用 ID 中设置唯一的 appId 来发布应用", + "noAndroidSdkFound": "没有找到Android SDK (Android SDK ROOT环境变量没有设置). 你可以通过安装Android Studio获得Android SDK", + "envVarNotice": "你可能仍然需要手动设置此环境变量并重新启动设备", + "downloadAndroidStudio": "下载 Android Studio", + "requiresInternetNotice": "此操作需要Internet连接来设置每个项目", + "noJdkFound": "没有找到JDK 11 (JAVA HOME环境变量没有设置或没有指向JDK 11). 你可以在这里获得JDK 11:", + "downloadJDK": "下载 JDK 11" }, "intro": { "loading": "请稍等: 小猫正在聚集光速!", @@ -204,13 +204,13 @@ "twitter": "Twitter 频道", "discord": "Discord 社区", "createOrBrowseJunction": "或", - "cloneProject": "", - "github": "", - "itch": "", - "vkontakte": "", - "patreon": "", - "templates": "", - "templatesInfo": "" + "cloneProject": "克隆这个项目到一个新的位置", + "github": "Ct.js 在 Github", + "itch": "Ct.js 在 itch.io 上的商店页面", + "vkontakte": "Vkontakte 公共社区", + "patreon": "在 Patreon 支持 ct.js!", + "templates": "模板", + "templatesInfo": "你可以通过使用这些模板之一来启动游戏开发.它们只包含占位符图像,但具有有效的机制. 选择项目将为新项目打开一个保存目录选择器" }, "onboarding": { "hoorayHeader": "赞! 您成功创建了一个项目!", @@ -234,14 +234,14 @@ "methods": "输入方法", "multiplier": "乘数", "noActionsYet": "动作允许开发人员一次监听多个输入方法并动态地更改它们, 所有这些操作都使用一个统一的API. 点击上面的文档图标来阅读更多内容", - "makeFromScratch": "", - "presets": "", - "presetXYMovement": "", - "presetTouchAndMouse": "", - "presetCustom": "", - "exportActionPreset": "", - "importErrorMissingModules": "", - "importErrorNotCtJsPreset": "" + "makeFromScratch": "从头做起", + "presets": "预设", + "presetXYMovement": "通用XY移动", + "presetTouchAndMouse": "鼠标和触控", + "presetCustom": "导入自己的", + "exportActionPreset": "导出为预设", + "importErrorMissingModules": "不能导入预设动作 因为你的ct.js安装缺乏以下模块: $1.", + "importErrorNotCtJsPreset": "这个文件看起来不像ct.js的预设动作." }, "authoring": { "author": "作者姓名", @@ -250,8 +250,8 @@ "title": "名称:", "version": "版本:", "versionPostfix": "后缀:", - "appId": "", - "appIdExplanation": "" + "appId": "应用 ID", + "appIdExplanation": "这主要用于移动端构建. 它是用来唯一标识你的游戏的字符串. 它通常遵循zone.developer.projectName格式, 比如rocks.ctjs.catsteroids就是一个很好的例子" }, "branding": { "heading": "图标", @@ -260,11 +260,11 @@ "icon": "游戏图标:", "iconNotice": "图标应为一个正方形,单帧纹理,至少256x256像素大的图片.", "invertPreloaderScheme": "反转预加载器的配色方案", - "hideLoadingLogo": "", - "splashScreen": "", - "splashScreenNotice": "", - "forceSmoothIcons": "", - "forceSmoothSplashScreen": "" + "hideLoadingLogo": "在加载屏幕中隐藏 \"Made with ct.js\" 图形", + "splashScreen": "启动画面:", + "splashScreenNotice": "该图像将用于移动端构建. 它应该至少是1920x1920像素大小, 并将调整大小和裁剪图像和横向屏幕方向, 所以确保所有重要的东西都在画面中心", + "forceSmoothIcons": "不论渲染设置如何使用平滑的图标", + "forceSmoothSplashScreen": "不管渲染设置如何使用平滑的启动画面图像" }, "modules": { "heading": "Cat模组" @@ -283,13 +283,13 @@ "windowed": "窗口" }, "pixelatedRender": "在此处和导出的项目中禁用图像平滑 (保留清晰像素)", - "usePixiLegacy": "", - "mobileBuilds": "", - "screenOrientation": "", + "usePixiLegacy": "添加一个传统的, 基于画布的渲染器来支持旧的浏览器和显卡(你的游戏增加~20kb)", + "mobileBuilds": "移动端构建", + "screenOrientation": "屏幕方向:", "screenOrientations": { - "unspecified": "", - "landscape": "", - "portrait": "" + "unspecified": "任何", + "landscape": "横向", + "portrait": "纵向" } }, "scripts": { @@ -314,28 +314,28 @@ }, "catmodsSettings": "Cat模组设置", "content": { - "heading": "", - "addContentType": "", - "missingTypeName": "", - "unnamedContentTypeHint": "", - "typeName": "", - "typeNameHint": "", - "typeReadableName": "", - "typeReadableNameHint": "", - "icon": "", - "typeSpecification": "", - "fieldName": "", - "fieldNameHint": "", - "fieldReadableName": "", - "fieldReadableNameHint": "", - "fieldType": "", - "deleteContentType": "", - "confirmDeletionMessage": "", - "gotoEntries": "", - "entries": "", - "array": "" + "heading": "内容类型编辑器", + "addContentType": "添加类型", + "missingTypeName": "未命名内容类型", + "unnamedContentTypeHint": "这个内容类型未命名. 除非添加名称, 否则它在游戏中是不可用的.", + "typeName": "内容类型名称", + "typeNameHint": "将在代码中使用的内容类型名称. 例如: GearItems, EnemySkills, Cities.", + "typeReadableName": "可读名称", + "typeReadableNameHint": "内容类型的可读名称, 在这里和内容编辑器中显示.", + "icon": "图标", + "typeSpecification": "内容图式", + "fieldName": "名称", + "fieldNameHint": "将在代码中使用的字段名. 比如: power, hp, spawnType.", + "fieldReadableName": "可读名称", + "fieldReadableNameHint": "名称的可读版本, 在内容编辑器中使用.", + "fieldType": "类型", + "deleteContentType": "删除这个内容类型", + "confirmDeletionMessage": "您确定要删除此内容类型吗? 它是不可逆的, 并且也将删除该内容类型的所有条目.", + "gotoEntries": "进入条目", + "entries": "条目", + "array": "数组" }, - "contentTypes": "" + "contentTypes": "内容类型" }, "modules": { "author": "这个cat模组的作者", @@ -378,11 +378,11 @@ "createTemplate": "从中创建一个类型", "importFromClipboard": "从剪贴板导入", "generatePlaceholder": "生成一个占位符", - "textures": "" + "textures": "纹理" }, "sounds": { "create": "创建", - "record": "" + "record": "记录" }, "styles": { "create": "创建", @@ -524,7 +524,7 @@ "successZipExport": "已成功导出到{0}.", "zipExport": "导出为web", "heading": "部署", - "exportAndroid": "" + "exportAndroid": "导出为Android..." }, "latestProjects": { "recentProjects": "最近的项目" @@ -537,16 +537,16 @@ "codeFontCustom": "自定义...", "theme": "主题", "themes": { - "Day": "亮色", - "Night": "暗色", - "Horizon": "地平线", - "HCBlack": "高对比度黑", - "SpringStream": "春涧流泉", - "LucasDracula": "卢卡斯德古拉" + "Day": "Day", + "Night": "Night", + "SpringStream": "Spring Stream", + "LucasDracula": "Lucas Dracula", + "Horizon": "Horizon", + "HCBlack": "High-contrast Black" }, "newFont": "新字体:", "language": "语言", - "translateToYourLanguage": "将ct.js翻译成您的语言", + "translateToYourLanguage": "将 ct.js 翻译成你的语言", "codeFont": "代码字体", "codeLigatures": "连字", "codeDense": "密集布局", @@ -566,13 +566,13 @@ }, "meta": { "license": "许可证", - "visitDiscordForGamedevSupport": "加入 Discord 服务器以获得游戏开发支持", + "visitDiscordForGamedevSupport": "Discord 服务", "openIconList": "打开 icons 图标列表", "heading": "元数据", - "twitter": "", - "vkontakte": "", - "ctjsForum": "", - "openStylebook": "" + "twitter": "Twitter 频道", + "vkontakte": "Vkontakte 公共社区", + "ctjsForum": "加入 ct.js 社区", + "openStylebook": "打开 CSS 样式书" } }, "appView": { @@ -597,11 +597,11 @@ "extensionsEditor": { "noEntries": "没有条目.", "addRow": "添加一行", - "actions": "", - "values": "", - "moveDown": "", - "moveUp": "", - "deleteRow": "" + "actions": "操作", + "values": "值", + "moveDown": "下移", + "moveUp": "上移", + "deleteRow": "删除行" }, "textureGenerator": { "name": "纹理名称:", @@ -618,11 +618,11 @@ "fillerNone": "无", "fillerCross": "交叉", "fillerLabel": "文本标签", - "form": "", - "formRectangular": "", - "formRound": "", - "formDiamond": "", - "fillerArrow": "" + "form": "表单", + "formRectangular": "矩形", + "formRound": "圆形", + "formDiamond": "菱形", + "fillerArrow": "箭头" }, "textureInput": { "jumpToTexture": "跳转到纹理", @@ -641,31 +641,31 @@ "complete": "文件夹已设置, 一切正常✅" }, "copyCustomProperties": { - "customProperties": "", - "addProperty": "", - "property": "", - "value": "", - "delete": "" + "customProperties": "自定义属性", + "addProperty": "添加属性", + "property": "属性", + "value": "值", + "delete": "删除" }, "assetViewer": { - "addNewGroup": "", - "ungrouped": "", - "newGroupName": "", - "groupDeletionConfirmation": "" + "addNewGroup": "新分组", + "ungrouped": "显示未分组", + "newGroupName": "新分组", + "groupDeletionConfirmation": "是否确定删除该分组? 所有资产将成为未分组" }, "groupEditor": { - "groupEditor": "", - "icon": "", - "color": "" + "groupEditor": "分组编辑器", + "icon": "图标", + "color": "颜色" }, "soundRecorder": { - "recorderHeading": "", - "record": "", - "stopRecording": "", - "discardRecording": "", - "finishRecording": "", - "cannotRecordSound": "", - "troubleshootingWindows": "" + "recorderHeading": "录音机", + "record": "开始录音", + "stopRecording": "停止录音", + "discardRecording": "删除录音", + "finishRecording": "完成录音", + "cannotRecordSound": "无法开始录音: 检查音频设置重启录音设备", + "troubleshootingWindows": "Windows系统依次打开设置 -> 隐私 -> 麦克风 检查应用是否有权限访问麦克风设备" }, "roomBackgrounds": { "add": "添加一个背景", @@ -718,12 +718,12 @@ "rotation": "旋转", "scale": "缩放" }, - "customProperties": "", - "restrictCamera": "", - "minimumX": "", - "minimumY": "", - "maximumX": "", - "maximumY": "", + "customProperties": "自定义属性", + "restrictCamera": "保持相机在一个矩形中", + "minimumX": "X 最小值", + "minimumY": "Y 最小值", + "maximumX": "X 最大值", + "maximumY": "Y 最大值", "gridOff": "禁用网格", "gridSize": "网格大小:", "toCenter": "居中", @@ -751,8 +751,8 @@ "textWrap": "自动换行", "textWrapWidth": "最大宽度:", "useCustomFont": "使用自定义字体…", - "code": "", - "copyCode": "", + "code": "代码", + "copyCode": "复制", "fillColor": "颜色:", "fillColor1": "颜色 1:", "fillColor2": "颜色 2:", @@ -802,9 +802,9 @@ "paddingNotice": "这将影响纹理的导出方式:它在边缘上添加重复的像素, 并防止平铺和缩放纹理上的失真. 默认值通常是足够的, 但是, 如果你强烈地收缩纹理,流血可能会再次出现. 如果这个纹理在游戏中有工件, 就增加这个值.", "updateFromClipboard": "从剪贴板更新", "previewAnimationNotice": "这是一个预览. 用this.animationSpeed属性改变它的真实拷贝.", - "showFrameIndices": "", - "pasteCollisionMask": "", - "copyCollisionMask": "", + "showFrameIndices": "显示帧索引", + "pasteCollisionMask": "粘贴碰撞遮罩", + "copyCollisionMask": "拷贝碰撞遮罩", "bgColor": "改变背景颜色", "setCenter": "图片中心点", "replaceTexture": "替换...", @@ -860,34 +860,34 @@ "name": "名称:", "step": "同步", "visible": "显示", - "appearance": "", - "opacity": "", - "blendMode": "", - "playAnimationOnStart": "", + "appearance": "外观", + "opacity": "不透明度:", + "blendMode": "混合模式:", + "playAnimationOnStart": "开始时播放动画", "blendModes": { - "normal": "", - "add": "", - "multiply": "", - "screen": "" + "normal": "正常", + "add": "掺入 (溶解)", + "multiply": "倍增 (变暗)", + "screen": "遮蔽 (变亮)" } }, "assetInput": { - "changeAsset": "", - "jumpToAsset": "", - "selectAssetHeader": "" + "changeAsset": "切换资产", + "jumpToAsset": "跳转到该资产", + "selectAssetHeader": "选择资产" }, "builtinAssetGallery": { - "galleryTip": "", - "assetGalleryHeader": "", - "importIntoProject": "", - "importAll": "", - "byAuthorPrefix": "", - "cannotImportExplanation": "", - "nameOccupied": "", - "cannotImportNameOccupied": "", - "visitSource": "", - "visitAuthorsItch": "", - "visitAuthorsTwitter": "", - "tipAuthor": "" + "galleryTip": "这是一个免费的, 内置的各种纹理和声音的资产库. 所有的资产都是CC0或WTFPL或者在特殊条款下发布, 以便在ct.js中使用. 在商业和其他项目中, 你可以以任何方式使用这些资源", + "assetGalleryHeader": "资产", + "importIntoProject": "导入到当前项目", + "importAll": "导入所有", + "byAuthorPrefix": "通过", + "cannotImportExplanation": "这个资产的名称会被其他资产使用. 你可能需要重命名现有资产; 或者你已经导入了这个资产", + "nameOccupied": "名称被占用", + "cannotImportNameOccupied": "无法导入 $1 该名称已被占用", + "visitSource": "打开这个资产包的商店页面", + "visitAuthorsItch": "访问作者的 itch.io 页面", + "visitAuthorsTwitter": "访问作者的 Twitter 页面", + "tipAuthor": "奖励作者的辛勤工作 :D" } -} \ No newline at end of file +} diff --git a/app/data/i18n/Turkish.json b/app/data/i18n/Turkish.json new file mode 100644 index 000000000..ac128cd89 --- /dev/null +++ b/app/data/i18n/Turkish.json @@ -0,0 +1,893 @@ +{ + "me": { + "id": "Tur", + "native": "Türkçe", + "eng": "Turkish" + }, + "common": { + "newName": "Yeni isim:", + "add": "Ekle", + "addToNotes": "Notlara ekle", + "apply": "Uygula", + "cancel": "İptal", + "cannotBeEmpty": "Bu boş olamaz", + "clear": "Temizle", + "close": "Kapat", + "confirmDelete": "{0}'yi silmek istediğinden emin misin? Bu işlem geri alınamaz.", + "contribute": "Katkıda bulun", + "copy": "Kopyala", + "copyName": "İsmi kopyala", + "couldNotLoadFromClipboard": "Panodan veri yüklenemedi", + "ctSite": "ct.js ana sayfası", + "openAssetGallery": "Galeri", + "cut": "Kes", + "delete": "Sil", + "donate": "Bağış Yap", + "done": "Bitti!", + "duplicate": "Çoğalt", + "exit": "Çık", + "reallyExitConfirm": "Çıkmak istediğinden emin misin? Kaydedilmeyen değişikliklerin tümü yok olacak!", + "fastImport": "Hızlı İçe Aktar", + "filter": "Filtre:", + "loading": "Yükleniyor…", + "name": "İsim:", + "nameTaken": "Bu isim zaten alınmış", + "no": "Hayır", + "none": "Yok", + "noRooms": "Uygulamanı derlemek için en az 1 odaya ihtiyacın var.", + "notFoundOrUnknown": "Bilinmeyen dosya. Dosyanın gerçekte var olduğundan emin ol", + "ok": "Tamam", + "open": "Aç", + "openProject": "Proje aç…", + "paste": "Yapıştır", + "pastedFromClipboard": "Panodan yapıştırıldı", + "rename": "Yeniden adlandır", + "save": "Kaydet", + "savedMessage": "Projen başarılı bir şekilde kaydedildi.", + "saveProject": "Projeyi kaydet", + "selectDialogue": "Seç…", + "select": "Seç", + "search": "Ara:", + "sort": "Sırala:", + "tileLayer": "döşeme katmanı", + "wrongFormat": "Yanlış dosya formatı", + "yes": "Evet", + "zoom": "Yakınlaştır", + "zoomIn": "Yakınlaştır", + "zoomOut": "Uzaklaştır", + "fieldTypes": { + "checkbox": "Kutucuk", + "code": "Kod Kutusu", + "color": "Renk", + "group": "Alanlar Grubu", + "h1": "1. seviyenin başlığı", + "h2": "2. seviyenin başlığı", + "h3": "3. seviyenin başlığı", + "h4": "4. seviyenin başlığı", + "number": "Sayı", + "point2D": "2D nokta", + "radio": "Seçenek düğmeleri", + "slider": "Kaydırıcı", + "sliderAndNumber": "Sayı girişi ile kaydırıcı", + "table": "Masa", + "text": "Kısa Yazı", + "textfield": "Metin Kutusu", + "texture": "Doku", + "template": "Şablon", + "room": "Oda", + "sound": "Ses", + "tandem": "Partikül dağıtıcısı" + }, + "assetTypes": { + "textures": [ + "doku", + "dokular", + "dokular" + ], + "templates": [ + "şablon", + "şablonlar", + "şablonlar" + ], + "emitterTandems": [ + "dağıtıcı partikül dağıtıcı", + "dağıtıcı partikül dağıtıcılar", + "dağıtıcı partikül dağıtıcılar" + ], + "rooms": [ + "oda", + "odalar", + "odalar" + ], + "fonts": [ + "font", + "fontlar", + "fontlar" + ], + "styles": [ + "tarz", + "tarzlar", + "tarzlar" + ], + "sounds": [ + "ses", + "sesler", + "sesler" + ], + "skeletons": [ + "Çatı görüntü", + "Çatı görüntüler", + "çatı görüntü" + ] + }, + "docsShort": "Dök", + "docsLong": "Dökümentasyon", + "edit": "Değiştir", + "nothingToShowFiller": "Burada gösterilecek hiçbir şey yok!", + "required": "Gerekli", + "settings": "Ayarlar" + }, + "assetInput": { + "changeAsset": "Görseli değiştirmek için tıkla", + "jumpToAsset": "Görsele git", + "selectAssetHeader": "Bir görsel seç" + }, + "assetViewer": { + "addNewGroup": "Yeni grup", + "ungrouped": "Grupta olmayanları göster", + "newGroupName": "Yeni grup", + "groupDeletionConfirmation": "Bu grubu silmek istediğine emin misin? Tüm görseller gruptan çıkarılacak." + }, + "builtinAssetGallery": { + "galleryTip": "Bu, bedava birsürü doku ve sesin galerisi. Tüm görseller CC0 veya WTFPL, veya ct.js'in özel şartları içinde yayınlanmıştır. Ama bunları diğer projelerinizde istediğiniz gibi kullanabilirsiniz.", + "assetGalleryHeader": "Görseller", + "importIntoProject": "Şu anki projenin içe aktar", + "importAll": "Hepsini içe aktar", + "byAuthorPrefix": "tarafından", + "cannotImportExplanation": "Bu görselin ismi başka görseller tarafından alınmış olabilir. Var olan görsellerin ismini değiştirmeniz gerekebilir; veya belki de bu görseli zaten içe aktarmışsındır?", + "nameOccupied": "İsim yerleştirildi", + "cannotImportNameOccupied": "$1 içe aktarılamıyor, zaten böyle bir isim yerleştirilmiş.", + "visitSource": "Bu görsel paketinin sayfasını aç", + "visitAuthorsItch": "Yapımcının itch.io sayfasına göz at", + "visitAuthorsTwitter": "Yapımcının Twitter sayfasını ziyaret et", + "tipAuthor": "Sıkı çalışması için yapımcıya bahşiş ver :D" + }, + "colorPicker": { + "current": "Yeni", + "globalPalette": "Küresel Palet", + "old": "Eski", + "projectPalette": "Proje'nin paleti" + }, + "copyCustomProperties": { + "customProperties": "Özel Özellikler", + "addProperty": "Özellik Ekle", + "property": "Özellik", + "value": "Değer", + "delete": "Sil" + }, + "curveEditor": { + "curveLineHint": "Nokta eklemek için kavise tıkla", + "dragPointHint": "Noktayı hareket ettirmek için sürükle, silmek için sağ tıkla.", + "pointTime": "Zaman:", + "pointValue": "Değer:" + }, + "debuggerToolbar": { + "pause": "Durdur", + "resume": "Oyuna devam et", + "restartGame": "Oyunu baştan başlat", + "restartRoom": "Odayı baştan başlat", + "switchRoom": "Odaya git…", + "toggleDevTools": "Geliştirici araçlarını aç/kapa", + "screenshot": "Ekran görüntüsü al", + "enterFullscreen": "Tam ekrana gir", + "exitFullscreen": "Tam ekrandan çık", + "links": "Linkler ve QR-Kodlar", + "openExternal": "Tarayıcıda aç", + "close": "Kapat" + }, + "docsShortcut": { + "openDocs": "Dökümantasyonu aç" + }, + "docsPanel": { + "documentation": "Dökümantasyon", + "reference": "Referans" + }, + "exportPanel": { + "hide": "Gizle", + "working": "Çalışıyor…", + "debug": "Versiyonu ayıkla", + "export": "Dışa aktar", + "exportPanel": "Projeyi dışa aktar", + "log": "Mesaj Günlüğü", + "windowsCrossBuildWarning": "Linux/MacOS'dan Windows'a derlemek için, sisteminizde Wine kurulu olmalıdır. Kurulum talimatları bazı platformlar için farklıdır, bu yüzden bunu Google'a yazmanız daha doğru olacaktır :)", + "cannotBuildForMacOnWin": "Ne yazık ki, Windows sadece bozuk Mac paketleri derleyebiliyor. Bi Linux makine kullanabilirsin; mesela, bir sanal makine. Bu %100 bedava!", + "projectTitleRequired": "Projene Proje sekmesi → Sahiplenme → İsim kısmından bir başlık girmelisin.", + "appIdRequired": "Projene uygulamayı dağıtmak için Projene Proje sekmesi → Sahiplenme → App ID kısmından benzersiz bir appID girmelisin.", + "noAndroidSdkFound": "Hiçbir Android SDK'sı bulunamadı. (ANDROID_SDK_ROOT küresesel değeri yok). Android Studio'yu kurarak bir Android SDK'sı elde edebilirsin:", + "envVarNotice": "Bu küresel değeri kendin değiştirip cihazını yeniden başlatman gerekebilir.", + "downloadAndroidStudio": "Android Studio'yu indir", + "requiresInternetNotice": "Bu işlemde her projeyi kurmak için internet bağlantısı gereklidir.", + "noJdkFound": "JDK 11 bulunamadı (JAVA_HOME küresel değişkeni ayarlanmamış veya JDK 11'e yönelik değil). JDK 11'i buradan alabilirsin:", + "downloadJDK": "JDK 11'i indir", + "firstRunNotice": "ct.js paketleme için gerekli kütüphaneleri yükleyip kaydedeceğinden ilk çalıştırma uzun sürebilir. Fakat sonraki zamanlarda neredeyse anında olur." + }, + "extensionsEditor": { + "noEntries": "Şimdiye kadar hiçbir giriş yok.", + "addRow": "Dizi ekle", + "actions": "Eylemler", + "values": "Değerler", + "moveDown": "Aşağı git", + "moveUp": "Yukarı git", + "deleteRow": "Diziyi sil" + }, + "groupEditor": { + "groupEditor": "Grup Editörü", + "icon": "İkon:", + "color": "Renk:" + }, + "intro": { + "loading": "Lütfen bekle: kedicikler ışık hızını bir araya getiriyor!", + "newProject": { + "button": "Klasör seç ve oluştur", + "input": "Proje'nin ismi (harfler ve rakamlar)", + "text": "Yeni oluştur", + "saveProjectHere": "Projeyi buraya kaydet", + "selectProjectFolder": "Projeni barındracak klasörü seç", + "nameError": "Yanlış proje ismi" + }, + "recovery": { + "message": "

İyileştirme

ct.js bir bozuk dosya buldu. Büyük ihtimal, projen doğru bir şekilde kaydedilmedi veya ct.js bir acil durum karşısında kapatıldı.Bu dosyaların en son değiştirildiği tarih ise şu:

Seçilmiş dosyan: {0} {1}
Düzelt: {2} {3}

ct.js'in hangi dosyayı açması gerekiyor?

", + "loadTarget": "Hedef Dosya", + "loadRecovery": "Düzelt", + "newer": "(daha yeni)", + "older": "(daha eski)" + }, + "loadingProject": "Proje yükleniyor…", + "loadingProjectError": "Bu hata yüzünden proje açılamıyor: ", + "homepage": "Ana Sayfa", + "latestVersion": "Versiyon $1 kullanılabilir", + "forgetProject": "Bu projeyi unut", + "cloneProject": "Bu projeyi yeni bir konuma klonla", + "browse": "Göz gezdir", + "latest": "En son projeler", + "examples": "Örnekler", + "templates": "Şablonlar", + "templatesInfo": "Bu şablonları kullanarak oyun geliştiriciliğini başlatabilirsin. Sadece vekil grafikler içeriyorlar ama çalışan mekaniklere sahiple. Bir proje seçmek yeni projen için bir kayıt konumu oluşturacak.", + "unableToWriteToFolders": "Ct.js projeler için herhangi bir uygun notka bulamadı! ct.js uygulamasını yazma izni olan bir yerde tuttuğundan emin ol.", + "twitter": "Twitter kanalı", + "discord": "Discord topluluğu", + "github": "GitHub'da ct.js", + "itch": "itch.io ct.js market sayfası", + "vkontakte": "Vkontakte topluluğu", + "patreon": "ct.js'i Patreon'da destekle!", + "createOrBrowseJunction": "veya" + }, + "onboarding": { + "hoorayHeader": "Vay canına! Bir proje oluşturdun!", + "nowWhatParagraph": "Şimdi ne yapmalıyız", + "openSpaceShooterTutorial": "Space Shooter'ın nasıl yapacağını öğren", + "openPlatformerTutorial": "Bir Platformer'ın nasıl yapacağını öğren", + "openJettyCatTutorial": "Bir Jetty Cat'in nasıl yapacağını öğren", + "doNothing": "Bu ekranı geç ve mükemmel bir oyun yap!", + "showOnboardingCheckbox": "Bu ekranı yeni bir proje oluşturduğumda göster" + }, + "settings": { + "actions": { + "heading": "Eylemler ve giriş metodları", + "actions": "Eylemler", + "addAction": "Bir eylem ekle", + "addMethod": "Bir giriş metodu ekle", + "deleteAction": "Bu eylemi sil", + "deleteMethod": "Bu metodu sil", + "inputActionNamePlaceholder": "Eylem ismi", + "methodModuleMissing": "Bu metod için gereken modül kayıp.", + "methods": "Giriş metodları", + "multiplier": "Çoğaltıcı", + "noActionsYet": "Eylemler geliştiricilere farklı giriş metodlarını tek seferde dinamik tek seferde uniform API sayesinde onları değiştirme imkanı verir. Yukarıdaki Dökümantasyın ikonuna tıklayarak daha fazlasını okuyabilirsin.", + "makeFromScratch": "Sıfırdan yap", + "presets": "Ön Ayarlar", + "presetXYMovement": "Genel XY hareketi", + "presetTouchAndMouse": "Fare & Dokunma", + "presetCustom": "Kendininkini içe aktar", + "exportActionPreset": "Bir ön ayar olarak dışa aktar", + "importErrorMissingModules": "ct.js kurulumundaki $1 modülünün eksikliği nedeniyle eylem ön ayarını içe aktarılamıyor.", + "importErrorNotCtJsPreset": "Bu dosya ct.js eylem ön ayarı gibi görünmüyor." + }, + "authoring": { + "heading": "Sahiplenme", + "author": "Geliştirici:", + "site": "Ana Sayfa:", + "title": "İsim:", + "version": "Versiyon:", + "versionPostfix": "Son ek:", + "appId": "Uygulama ID'si", + "appIdExplanation": "Bu genellikle mobil derlemeler için kullanılır. Bu oyununu belirten eşsiz bir dizidir. Genellikle format bölgesini takip eder.developer.projectName, ve, de, rocks.ctjs.catsteroids bunun için iyi bir örnek." + }, + "branding": { + "heading": "Markalaştırma", + "accent": "Vurgu:", + "accentNotice": "Ön-yükleyicinin rengini belirler, eğer bunu bir mobil uygulama kullanıyorsa bazı diğer yerler de dahil.", + "icon": "Oyun'un ikonu:", + "iconNotice": "Kare olmalı, 1 çerçeveli en az 256x256 çözünürlüğünde görsel olmalı.", + "splashScreen": "Açılış Ekranı:", + "splashScreenNotice": "Bu görsel mobil derlemelerde kullanılacak. En az 1920x1920 çözünürlüğünde olmalı, ayrıca görsel portre ve yatay mod için kırpılacak, yani önemli herşeyin tam ortadaki bir karede olduğundan emin ol.", + "forceSmoothIcons": "Render ayarlarına aldırmadan pürüzsüz ikonlar kullan", + "forceSmoothSplashScreen": "Render ayarlarına aldırmadan pürüzsüz açılış ekranı görselleri kullan", + "invertPreloaderScheme": "Ön-yükleyici'nin renklerini tersine çevir", + "hideLoadingLogo": "\"Made with ct.js\" yazısını yükleme ekranında sakla" + }, + "content": { + "heading": "İçerik türü editörü", + "addContentType": "Bir tür ekle", + "missingTypeName": "İsimlendirilmemiş içerik türü", + "unnamedContentTypeHint": "Bu içerik türü isimlendirilmemiş. Eğer ad eklemezsen oyunda kullanılamayacak.", + "typeName": "İsmin içerik türü", + "typeNameHint": "İçerik türünün ismi kodda kullanılacaktır. Mesela: GearItems, EnemySkills, Cities.", + "typeReadableName": "Okunabilir isim", + "typeReadableNameHint": "İçerik türünün okunabilir ismi, burada ve içerik editörlerinde gözükür.", + "icon": "İkon", + "typeSpecification": "İçerik şeması", + "fieldName": "İsim", + "fieldNameHint": "Alanın ismi kodda kullanılacaktır. Örnek olarak: güç, can, spawnType.", + "fieldReadableName": "Okunabilir isim", + "fieldReadableNameHint": "İçerik editöründe kullanılan bu ismin okunabilir versiyonu.", + "fieldType": "Tür", + "array": "Array", + "deleteContentType": "Bu içerik türünü sil", + "confirmDeletionMessage": "Bu içerik türünü silmek istediğinden emin misin? Bu geri alınamaz. Ayrıca bu içerik türündeki tüm girişleri de siler.", + "gotoEntries": "Girişlere git", + "entries": "Girişler" + }, + "modules": { + "heading": "Catmodlar" + }, + "rendering": { + "heading": "Render Ayarları", + "framerate": "Kare Sayısı:", + "highDensity": "Yüksek pixel sıklığını destekle (retina ekranları gibi)", + "maxFPS": "En fazla kare sayısı:", + "hideCursor": "Sistem imlecini gizle", + "usePixiLegacy": "Eski browserları ve ekran kartlarını desteklemesi için eski, canvas tabanlı bir renderer kullan. (oyunun boyutuna yaklaşık 20kb ekler)", + "desktopBuilds": "Masaüstü derlemeleri", + "launchMode": "Başlatma Modu:", + "launchModes": { + "maximized": "Büyütülmüş", + "fullscreen": "Tam Ekran", + "windowed": "Pencereli" + }, + "mobileBuilds": "Mobil derlemeler", + "screenOrientation": "Ekran Oryantasyonu:", + "screenOrientations": { + "unspecified": "Herhangi", + "landscape": "Yatay", + "portrait": "Portre" + }, + "pixelatedRender": "Dışarı aktarılan proje ve burada görsel pürüzsüzleştirmeyi kapat (net pixelleri korur)" + }, + "scripts": { + "heading": "Özel scriptler", + "addNew": "Yeni bir script ekle", + "deleteScript": "Scripti sil", + "moveDown": "Aşağı in", + "moveUp": "Yukarı çık", + "newScriptComment": "Küçük libraryleri içe aktarmak ve sık fonksiyonları tanımlamak için scriptleri kullan" + }, + "export": { + "heading": "Dışa aktarma ayarları", + "functionWrap": "Tüm kodu bir fonksiyon içinde sar. (Hata ayıklamayı zorlaştırır, ama oyunun kodunu izole eder. Oyunu geliştirirken aktif etme.)", + "codeModifier": "Kod dönüşümleri", + "obfuscateWarning": "Bu ayar kodunun %15-80 arası daha yavaş çalışmasına sebep olur, ama kodunun orijinale geri döndürülmesini aşırı zorlaştırır.", + "codeModifierAndWrapNote": "Not: bu ayarlar sadece dışa aktarılmış projeler için geçerlidir (Web ve Masaüstü için dışa aktarma komutları) paketlemeyi gözle görülür şekilde yavaşlattıkları ve hata ayıklamayı zorlaştırdıkları için, onları Ana menü → Ayarlar → Üretim işlemlerini hata ayıklama dışa aktarımları için zorla'dan zorlayabilirsin.", + "codeModifiers": { + "none": "Hiç", + "minify": "Küçült", + "obfuscate": "Kodu gizle" + } + }, + "catmodsSettings": "Catmod ayarları", + "contentTypes": "İçerik türleri" + }, + "modules": { + "author": "Bu catmod'un sahibi", + "dependencies": "Bağlılıklar:", + "help": "Referans", + "info": "Bilgi", + "license": "Lisans", + "logs": "Değişim günlüğü", + "methods": "Metodlar", + "optionalDependencies": "İsteğe bağlı bağlılıklar:", + "parameters": "Parametreler", + "logs2": "Değişim günlüğü", + "settings": "Ayarlar", + "importModules": "Modülleri içe aktar", + "enabledModules": "Aktif modüller", + "availableModules": "Kullanılabilir modüller", + "filter": "Filtrele", + "preview": "(önizleme)", + "previewTooltip": "Bu modül henüz yayınlanmadı ve sadece önizleme olarak görülebilir.", + "deprecatedTooltip": "Bu modül artık kullanılmıyor. Yakında kaldırılıcak.", + "categories": { + "customization": "Kişiselleştirme", + "utilities": "Araçlar", + "media": "Multimedya", + "misc": "Diğer", + "desktop": "Masaüstü derlemeleri", + "motionPlanning": "Devinim planlama", + "inputs": "Giriş metodları", + "fx": "FX", + "mobile": "Mobil cihazlar", + "integrations": "İntegrasyonlar", + "tweaks": "İnce Ayarlar", + "networking": "Ağ Kurma" + } + }, + "texture": { + "create": "Oluştur", + "import": "İçe aktar", + "skeletons": "Çatı Animasyon", + "textures": "Dokular", + "createTemplate": "Ondan bir şablon oluştur", + "importFromClipboard": "Panodan içe aktar", + "generatePlaceholder": "Bir vekil oluştur" + }, + "textureGenerator": { + "name": "Dokunun ismi:", + "width": "Genişlik:", + "height": "Yükseklik:", + "color": "Arkaplan rengi:", + "label": "Etiket:", + "optional": "(tercihe bağlı)", + "createAndClose": "Oluştur ve kapat", + "createAndContinue": "Oluştur ve başka bir tane daha ekle", + "scalingAtX4": "Küçük bir dokunun büyüklüğünü 4 kat arttır", + "generationSuccessMessage": "$1 tane doku projene başarıyla eklendi", + "form": "Form", + "formRectangular": "Dikdörtgen", + "formRound": "Yuvarlak", + "formDiamond": "Karo", + "filler": "Filler:", + "fillerNone": "Hiç", + "fillerCross": "Çarpı", + "fillerArrow": "Tamam", + "fillerLabel": "Yazı etiketi" + }, + "soundRecorder": { + "recorderHeading": "Kaydedici", + "record": "Kaydı başlat", + "stopRecording": "Kaydediciyi durdur", + "discardRecording": "Kaydı at", + "finishRecording": "Kaydı tamamla", + "cannotRecordSound": "Kaydedici başlatılamıyor: ses ayarlarını ve kayıt cihazını kontrol et.", + "troubleshootingWindows": "Windows'ta Ayarlar -> Gizlilik -> Mikrofon'a git ve uygulamanın mikrofon erişimi olup olmadığını kontrol et." + }, + "particleEmitters": { + "emittersHeading": "Partikül dağıtıcıları", + "emitterHeading": "Dağıtıcı", + "from": "Bundan:", + "to": "Şuna:", + "textureHeading": "Doku", + "selectTexture": "Seç…", + "importBuiltin": "Varsayılanı içeri aktar…", + "colorAndOpacityHeading": "Renk ve Saydamlık", + "stepped": "Kademeli", + "steppedColor": "Kademeli renk", + "steppedAlpha": "Kademeli saydamlık", + "blendMode": "Karıştırma modu:", + "regular": "Normal", + "darken": "Karanlık", + "lighten": "Aydınlık", + "burn": "Yanan", + "scalingHeading": "Yükselme", + "scale": "Ölçek:", + "minimumSize": "Minimum boyut:", + "minimumSizeHint": "Onu daha düşük bir değere çekersen her partikülün boyutu rastgele belirlenir. Daha düşük değer, daha güçlü efekt.", + "velocityHeading": "Sürat", + "velocity": "Sürat:", + "minimumSpeed": "Minimum hız:", + "minimumSpeedHint": "Onu daha düşük değerlere çekersen her partikülün hızı rastgele belirlenir; daha düşük değer, daha yavaş partikül anlamına gelebilir.", + "maxSpeed": "Maksimum hız:", + "gravityHeading": "Yer Çekimi", + "gravityNotice": "Not: Eğer (0;0)'dan farklıysa', hız eklentisi devre dışı kalır, bu da hız grafiğinin sadece ilk düğümünün efekti olacak.", + "directionHeading": "Yön", + "startingDirection": "Başlangıç yönü", + "preserveTextureDirection": "Doku yönünü koru", + "rotationHeading": "Yön", + "rotationSpeed": "Yön hızı", + "rotationAcceleration": "Yön hızlandırma:", + "spawningHeading": "Doğma", + "timeBetweenBursts": "Patlamalar arası süre:", + "spawnAtOnce": "Bir kere doğ:", + "chanceToSpawn": "Partikül çıkarma ihtimali:", + "maxParticles": "Maksimum partiküller", + "lifetime": "Partikül ömrü, san.", + "emitterLifetime": "Dağıtıcı ömrü, san.:", + "prewarmDelay": "Ön ısıtma / gecikme, san.:", + "prewarmDelayNotice": "Negative values will prepare the particles of the emitter before showing it, which is useful for long effects like dust particles or mist that should already be visible on room start; positive values will delay the simulation.", + "shapeAndPositioningHeading": "Şekil and Konumlandırma", + "spawnType": "Şekil türü:", + "spawnShapes": { + "point": "Nokta", + "rectangle": "Dikdörtgen", + "circle": "Daire", + "ring": "Yüzük", + "star": "Yıldız" + }, + "width": "Genişlik:", + "height": "Yükseklik:", + "radius": "Yarıçap:", + "starPoints": "Noktalar:", + "startAngle": "Döndür, derec.:", + "showShapeVisualizer": "Şekil görselleyicisini göster", + "relativeEmitterPosition": "Diğer dağıtıcılara göre konum", + "addEmitter": "Başka bir dağıtıcı ekle", + "reset": "Önizlemeyi sıfırla", + "changeBg": "Arkaplanı değiştir", + "inspectorComplete": "Tamamlandı!", + "alreadyHasAnImportingTexture": "Zaten $1 isimli bir dokun var. Onu sil ya da yeniden isimlendir; Ama daha önceden eklediğin dokuyu içe aktarmak zorundasın :)", + "changeGrid": "Izgara boyutunu belirle", + "newGridSize": "Yeni ızgara boyutu:", + "setPreviewTexture": "Önizleme dokusunu belirle" + }, + "rooms": { + "create": "Ekle", + "makeStarting": "Başlangıç odası olarak belirle" + }, + "notepad": { + "local": "Proje'nin Not Defteri", + "global": "Evrensel Not Defteri", + "helpPages": "Öğren", + "backToHome": "Dök. ana sayfasına geri döm", + "modulesPages": "Modül Döküm." + }, + "patreon": { + "aboutPatrons": "Patronlar yenilenen bağışlar şeklinde ComigoGames'e desteklerini gösteren insanlardır. Tabi herkes ct.js'ten gelmiyor; bazıları ComigoGames'in başka uygulamalarını kullanıyor. İpucu: Eğer ComigoGames'e bağış yapan bir üreticiysen, you will get a link to your page here — that's my little help to your creations :)", + "patronsHeader": "Patronlarımız", + "businessShuttles": "İş shuttleları", + "noShuttlesYet": "Şimdilik hiçbir business shutle yok :c Gerçi senin şirketin ilki olabilir!", + "shuttlesDescription": "İş shuttları ct.js'in partnerleri olarak düşünülürler. ct.js'in ana sayfasında ve mağazasında gözükürler.", + "spacePirates": "Uzay Korsanları", + "noPiratesYet": "Şimdilik hiç Uzay Korsanı yok :c", + "piratesDescription": "Uzay korsanları Discord sunucusunda havalı bir rolle beraber öncelikli destek alırlar, ve burada listelenirler.", + "spaceProgrammers": "Uzay Programcısı", + "programmersDescription": "\"Uzay Programcısı\" ct.js açık-kaynak olmadan önce ve patronlara jam oyunlarının kaynaklarını almadan önce elde edilebilirdi.", + "aspiringAstronauts": "Can Atan Astronotlar", + "noAstronautsYet": "Şimdilik hiç Can Atan Astronot yok :c", + "astronautsDescription": "Astronotlar Discord'da özel bir rol alırlar ve burada listelenirler!", + "thankAllPatrons": "Şu anki ve önceki tüm ComigoGames patronlarına teşekkürler, desteğiniz Comigo'yu ileriye taşır ve daha iyi uygulamalar yapmasına olanak tanır! :)", + "becomeAPatron": "Patron ol", + "aboutFillers": [ + "her yerde havalı 😎", + "ile sohbet etmesi güzeş 🤗", + "henüz bir yıldız olmadı 💫", + "sadece bir deha ⭐️", + "iyi bir arkadaş 🤝", + "güvenilir 🙏", + "altından bir kalbi var 🧡", + "bir büyücü 🔮", + "yardım etmek için burda! 💪", + "bir süper kahraman 🦸‍", + "henüz gözükmedi 🦹‍", + "çözülememiş bir gizem 🔍", + "destansı! ✨", + "büyük ihtimal bir robot 🤖", + "yanan bir ateş gibi! 🔥", + "ışık ve umut getiriyor 🌞", + "şık ve çok güzel 🎩" + ] + }, + "textureInput": { + "jumpToTexture": "Dokuya atla", + "changeTexture": "Dokuyu değiştir" + }, + "writableFolderPrompt": { + "headerSelectFolderForData": "ct.js verisi için bir klasör seç", + "paragraphCouldNotPickDirectory": "Olamaz! Ct.js projelerin, paket derlemelerin, ve hata ayıklama için bir klasör bulamadı. Ct.js genelde otomatik olarak bir tane bulur, ama bu sefer baktığı tüm dosyalar salt-okunurdu!", + "paragraphDirectoryDirections": "Yine de bu düzeltilebilir. Aşağıdaki butona bas ve verinin depolanacağı klasörü seç Click the button below and select a folder at which to store data. If you are unsure, create a \"ct.js\" directory in your Documents folder.", + "selectFolder": "Klasör seç..." + }, + "writableFolderSelector": { + "folderDoesNotExist": "Bu klasör gerçekten varmış gibi durmuyor... Bunu nasl yaptın?", + "notADirectory": "Bu bir alt dizim gibi durmuyor! Bunu nasıl yaptın?", + "folderNotWritable": "Bu klasörü değiştirme iznin yok. Başka bir tanesini dene", + "complete": "Klasör ayarlandı, her şey tamam ✅" + }, + "mainMenu": { + "troubleshooting": { + "toggleDevTools": "Geliştirici Ayarlarını Aç/Kapa", + "copySystemInfo": "Sistem bilgisini kopyala", + "systemInfoWait": "Biraz bekle, veriyi topluyorum…", + "systemInfoDone": "Bitti!", + "disableAcceleration": "Grafik hızlandırmayı devre dışı bırak (yeniden başlatma gerektirir)", + "disableBuiltInDebugger": "Yerleşik hata ayıklayıcıyı devre dışı bırak", + "postAnIssue": "GitHub'da bir sorunu yayınla…", + "heading": "Sorun giderme" + }, + "deploy": { + "heading": "Aç", + "exportDesktop": "Masaüstü için dışarı aktar…", + "successZipExport": "Başarıyla {0} konumuna kaydedildi.", + "zipExport": "Web için dışa aktar", + "exportAndroid": "Android için dışa aktar…" + }, + "latestProjects": { + "recentProjects": "Geçmiş projeler" + }, + "settings": { + "heading": "Ayarlar", + "theme": "Tema", + "themes": { + "Day": "Gündüz", + "Night": "Gece", + "SpringStream": "İlkbahar Yayını", + "LucasDracula": "Lucas Drakula", + "Horizon": "Ufuk", + "HCBlack": "Yüksek-kontrast siyah" + }, + "language": "Dil", + "translateToYourLanguage": "ct.js'i çevir!", + "codeFontDefault": "Varsayılan (Iosevka Light)", + "codeFontOldSchool": "Eski Moda", + "codeFontSystem": "Sistem", + "codeFontCustom": "Özel…", + "newFont": "Yeni font:", + "codeFont": "Kod için font", + "codeLigatures": "Bağlar", + "codeDense": "Düzeni yoğunlaştır", + "disableSounds": "Arayüz seslerini kapat", + "changeDataFolder": "Veri klasörü yolunu ayarla", + "forceProductionForDebug": "Hata ayıklamaları dışarı aktarmak için üretim işlemlerini zorla" + }, + "project": { + "heading": "Proje", + "save": "Projeyi Kaydet", + "openIncludeFolder": "\"include\" klasörünü aç", + "openProject": "Bir proje aç…", + "openExample": "Bir örnek proje aç…", + "startScreen": "Başlangıç ekranına geri dön", + "successZipProject": "Proje başarılı bir şekilde şuraya ziplendi: {0}.", + "zipProject": "Projeyi zip ile paketle" + }, + "meta": { + "heading": "Meta", + "license": "Lisans", + "visitDiscordForGamedevSupport": "Discord sunucusu", + "openIconList": "İkonların listesini aç", + "openStylebook": "CSS stil kitabını aç", + "twitter": "Twitter kalanı", + "vkontakte": "Vkontakte topluluğu", + "ctjsForum": "ct.js forumuna katıl" + } + }, + "appView": { + "ctIDE": "ct.IDE", + "texture": "Dokular", + "launch": "Çalıştır", + "launchHotkeys": "(F5; varsayılan tarayıcında çalıştırmak için: Alt+F5)", + "min": "Pencereli", + "patrons": "Patronlar", + "restart": "Yeniden Başlat", + "rooms": "Odalar", + "project": "Proje", + "sounds": "Sesler", + "ui": "Arayüz", + "fx": "Efektler", + "templates": "Şablonlar" + }, + "roomBackgrounds": { + "add": "Arkaplan ekle", + "depth": "Derinlik:", + "movement": "Hareket hızı (X, Y):", + "parallax": "Uzaklık açısı (X, Y):", + "repeat": "Tekrar et:", + "scale": "Boyutlandırma (X, Y):", + "shift": "Yer (X, Y):", + "notBackgroundTextureWarning": "Bu doku arkaplan olarak işaretlenmemiş. Dışa aktarıldığında boşluklar olacaktır.", + "fixBackground": "Düzelt.", + "dismissWarning": "Bırak." + }, + "roomTiles": { + "moveTileLayer": "Yeni bir derinliğe taşı", + "show": "Katmanı göster", + "hide": "Katmanı gizle", + "findTileset": "Bir Döşeme Bul" + }, + "roomView": { + "name": "İsim:", + "width": "Görüntü genişliği", + "height": "Görüntü yüksekliği:", + "isUi": "Bu arayüz bir katman mı?", + "events": "Oda olayları", + "copies": "Kopyalar", + "backgrounds": "Arkaplanlar", + "backgroundColor": "Arkaplan rengi:", + "tiles": "Desenler", + "properties": "Özellikler", + "add": "Ekle", + "none": "Hiçbirşey", + "done": "Bitti", + "grid": "Izgarayı Ayarla", + "gridOff": "Izgarayı kapat", + "gridSize": "Izgara boyutu:", + "hotkeysNotice": "Ctrl = Sil, Alt = Izgara Yok, Shift = Çoğalt", + "hotkeysNoticeMovement": "Ctrl = Sil, Shift = Seç", + "toCenter": "Ortala", + "shiftLabel": "Tarafından değiştir:", + "shift": "Herşeyi taşı", + "step": "Adımda", + "create": "Oluşturulduğunda", + "leave": "Ayrıldığında", + "draw": "Çizildiğinde", + "newDepth": "Yeni derinlik:", + "deleteCopy": "{0}. kopyayı sil", + "deleteCopies": "Kopyaları sil", + "shiftCopies": "Kopyaları değiştir", + "sortHorizontally": "Yatay sırala", + "sortVertically": "Dikey sırala", + "selectAndMove": "Seç ve Hareket Et", + "changeCopyScale": "Boyutu değiştir", + "changeCopyRotation": "Döndür", + "shiftCopy": "Kordinatları ayarla", + "customProperties": "Özel Özellikler", + "deleteTile": "Bir deseni sil", + "deleteTiles": "Desenleri sil", + "moveTilesToLayer": "Katmana git", + "shiftTiles": "Desenleri değiştir", + "findTileset": "Bir tileset bul", + "copyProperties": { + "position": "Pozisyon", + "rotation": "Rotasyon", + "scale": "Boyut" + }, + "restrictCamera": "Kamerayı dörtgende tut", + "minimumX": "Minimum X", + "minimumY": "Minimum Y", + "maximumX": "Maksimum X", + "maximumY": "Maksimum Y" + }, + "styleView": { + "active": "Aktif", + "alignment": "Hiza:", + "apply": "Uygula", + "fill": "Doldur", + "font": "Font", + "italic": "İtalik", + "lineHeight": "Çizgi yüksekliği:", + "shadow": "Gölge", + "stroke": "Hat", + "textWrap": "Sözcük kaydırma", + "textWrapWidth": "Maksimum genişlik:", + "useCustomFont": "Özel font kullan…", + "code": "Kod", + "copyCode": "Kopyala", + "fillColor": "Renk:", + "fillColor1": "Renk 1:", + "fillColor2": "Renk 2:", + "fillGrad": "Gradyan", + "fillGradType": "Gradyan türü:", + "fillHorizontal": "Yatay", + "fillSolid": "Dağılım", + "fillType": "Doldurma türü:", + "fillVertical": "Dikey", + "fontWeight": "Ağırlık:", + "shadowBlur": "Bulanıklık:", + "shadowColor": "Gölge rengi:", + "shadowShift": "Değiştir:", + "strokeColor": "Hat rengi:", + "strokeWeight": "Çizgi ağırlığı:", + "testText": "Deneme yazısı 0123 +", + "fontFamily": "Font ailesi:", + "fontSize": "Font boyutu:" + }, + "textureView": { + "center": "Eksen:", + "cols": "Sütun:", + "done": "Uygula", + "fill": "Doldur", + "form": "Çarpışma şekli", + "frames": "Kare sayısı:", + "isometrify": "İzometrikleştirme: Ekseni orta alt noktasına götür, tüm görüntüyü bir çarpışma maskesi ile doldur", + "name": "İsim:", + "radius": "Yarıçap:", + "rectangle": "Dikdörtgen", + "reimport": "Yeniden içe aktar", + "round": "Daire", + "rows": "Sıralar:", + "speed": "Kare hızı:", + "tiled": "Arkaplan olarak kullanılsın mı?", + "updateFromClipboard": "Panodan güncelle", + "corrupted": "Dosya bozulmuş veya yok! Şimdi kapatılıyor.", + "showFrameIndices": "Kare indekslerini göster", + "width": "Genişlik:", + "height": "Yükseklik:", + "strip": "Çizgi şeridi / Poligon", + "removePoint": "Noktayı kaldır", + "closeShape": "Şekli kapat", + "addPoint": "Bir nokta ekle", + "moveCenter": "Ekseni hareket ettir", + "movePoint": "Bu noktayı hareket ettir", + "symmetryTool": "Simetri aleti", + "padding": "Doldurma:", + "paddingNotice": "Bu bir dokunun nasıl dışa aktarıldığını etkiler: kenarlara yinelenen pikseller ekler ve döşenmiş ve ölçeklenmiş dokularda kanama artifaktlarını önler. Varsayılan değer genellikle yeterlidir, ancak dokuları güçlü bir şekilde küçültürseniz, kanama yeniden görünebilir. Bu doku oyun içindeyken artifaktlar içeriyorsa bu değeri artırın.", + "previewAnimationNotice": "Bu bir önizleme. Onu gerçek kopyalar için değiştirmek için this.animationSpeed özelliğini kullan.", + "pasteCollisionMask": "Bir çarpışma maskesini yapıştır", + "copyCollisionMask": "Çarpışma maskesini kopyala", + "bgColor": "Ap rengini değiştir", + "setCenter": "Görselin merkezi", + "replaceTexture": "Değiştir…", + "showMask": "Maskeyi göster", + "marginX": "Kenar X:", + "marginY": "Kenar Y:", + "offX": "Öteleme X:", + "offY": "Öteleme Y:" + }, + "sounds": { + "create": "Oluştur", + "record": "Kaydet" + }, + "soundView": { + "import": "İçe Aktar", + "name": "İsim:", + "save": "Kaydet", + "isMusicFile": "Bu bir müzikal parça", + "poolSize": "Havuz boyutu:" + }, + "styles": { + "create": "Oluştur", + "styles": "Yazı Stilleri" + }, + "fonts": { + "fonts": "Fontlar", + "import": "İçe TTF aktar", + "italic": "İtalik" + }, + "fontView": { + "italic": "İtalik mi?", + "reimport": "Yeniden içe aktar", + "generateBitmapFont": "Ayrıca bir bitmap fontu oluştur", + "bitmapFont": "Bitmap fontu", + "bitmapFontSize": "Font boyutu:", + "bitmapFontLineHeight": "Line yüksekliği:", + "resultingBitmapFontName": "Kaynak adı", + "charset": "Karakter Kodlaması:", + "charsets": { + "punctuation": "Sayılar ve noktalama (genelde bunu yapmaya ihtiyacın var)", + "basicLatin": "Basit Latin", + "latinExtended": "Latin genişleyilmiş", + "cyrillic": "Cyrillic", + "greekCoptic": "Yunan and Antik Mısır", + "custom": "Özel", + "allInFont": "Fontun desteklediği herşeyi çiz" + }, + "customCharsetHint": "İçermesini istediğin tüm harfleri yaz, büyük ve küçük harflerle.", + "fontWeight": "Font ağırlığı:", + "typefaceName": "Yazı biçimi ismi:" + }, + "licensePanel": { + "ctjsLicense": "Ct.js Lisansı (MIT)" + }, + "templates": { + "create": "Oluştur" + }, + "templateView": { + "change": "Görüntüyü değiştir", + "create": "Oluşturulunca", + "destroy": "Yok Edilince", + "done": "Oldu", + "draw": "Çiz", + "learnAboutTypes": "Kodlama şablonları hakkında öğren", + "name": "İsim:", + "step": "Her Adımda", + "appearance": "Görünüm", + "visible": "Görünür", + "depth": "Derinlik:", + "opacity": "Saydamlık:", + "blendMode": "Karıştırma modu:", + "playAnimationOnStart": "Başlangıçta animasyonu oynat", + "blendModes": { + "normal": "Normal", + "add": "Ekle (yanık)", + "multiply": "Çoğalt (karanlık)", + "screen": "Ekran (aydınlık)" + } + } +} diff --git a/app/package-lock.json b/app/package-lock.json index 740a0456d..4d5634f5c 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "ctjs", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ctjs", - "version": "2.0.0", + "version": "2.0.1", "license": "MIT", "dependencies": { "@capacitor/cli": "^3.4.0", @@ -8061,9 +8061,9 @@ } }, "node_modules/plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "dependencies": { "base64-js": "^1.5.1", "xmlbuilder": "^9.0.7" @@ -16127,9 +16127,9 @@ } }, "plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "requires": { "base64-js": "^1.5.1", "xmlbuilder": "^9.0.7" diff --git a/app/package.json b/app/package.json index a4fe332ac..f9d65c1e6 100644 --- a/app/package.json +++ b/app/package.json @@ -2,7 +2,7 @@ "main": "index.html", "name": "ctjs", "description": "ct.js — a free 2D game engine", - "version": "2.0.1", + "version": "2.0.2", "homepage": "https://ctjs.rocks/", "author": { "name": "Cosmo Myzrail Gorynych", diff --git a/package-lock.json b/package-lock.json index 6db975b55..ce0223970 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ctjsbuildenvironment", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ctjsbuildenvironment", - "version": "2.0.0", + "version": "2.0.1", "license": "MIT", "dependencies": { "@types/css-font-loading-module": "0.0.7", @@ -10195,9 +10195,9 @@ } }, "node_modules/plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "dependencies": { "base64-js": "^1.5.1", "xmlbuilder": "^9.0.7" @@ -22300,9 +22300,9 @@ } }, "plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "requires": { "base64-js": "^1.5.1", "xmlbuilder": "^9.0.7" diff --git a/package.json b/package.json index 9e847ebfb..067bf59a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ctjsbuildenvironment", - "version": "2.0.1", + "version": "2.0.2", "description": "", "directories": { "doc": "docs" diff --git a/src/examples/DungeonCrawler_tutorial.ict b/src/examples/DungeonCrawler_tutorial.ict index cab140d67..4e2a5276e 100644 --- a/src/examples/DungeonCrawler_tutorial.ict +++ b/src/examples/DungeonCrawler_tutorial.ict @@ -1,4 +1,4 @@ -ctjsVersion: 2.0.0 +ctjsVersion: 2.0.1 notes: /* empty */ libs: fittoscreen: @@ -726,7 +726,7 @@ templates: onstep: |- this.vspeed = ct.actions.MoveY.value * this.maxSpeed; this.hspeed = ct.actions.MoveX.value * this.maxSpeed; - console.log(this.moveContinuousByAxes('Solid')); + this.moveContinuousByAxes('Solid'); if (ct.actions.Shoot.pressed) { const bullet = ct.templates.copy('Bullet', this.x, this.y - 5); @@ -789,7 +789,7 @@ templates: extends: cgroup: '' uid: c40336ea-2846-45d5-97ba-d51852d3f6c5 - lastmod: 1641334773965 + lastmod: 1650173622519 - name: Crate depth: 0 oncreate: this.depth = this.y; @@ -6238,12 +6238,13 @@ rooms: }); onstep: '' ondraw: '' - onleave: >- - ct.sound.stop('InGameTheme'); - - - console.log('This demo is a work in progress, stay tuned for more levels - :)'); + onleave: |- + // If there is no cat in the room, + // it means that we are restarting the room because the cat died. + if (ct.templates.exists('Cat')) { + ct.sound.stop('InGameTheme'); + console.log('This demo is a work in progress, stay tuned for more levels :)'); + } width: 240 height: 160 backgrounds: [] @@ -8734,6 +8735,7 @@ emitterTandems: particleSpacing: 360 uid: 4f1c4b6a-d8a7-428b-a7f2-c7ce01c0f162 previewTexture: 8bef1226-7fb8-4bf5-8120-ac6e53d81ea5 + uid: pt1f52a07073af - name: BlueSparks origname: ptedde43ecfba6 emitters: @@ -8900,6 +8902,7 @@ emitterTandems: uid: 0e491f30-ae29-4653-8750-6cfc60976637 showShapeVisualizer: false previewTexture: 4733fb53-5e41-4cf8-b9a8-91ad700f2246 + uid: ptb58af8b29aed - name: Cat_Damage origname: pta8f6693e58be emitters: diff --git a/src/js/codeEditorProjectAwareCompletions.js b/src/js/codeEditorProjectAwareCompletions.js index b4af41430..93ba818a9 100644 --- a/src/js/codeEditorProjectAwareCompletions.js +++ b/src/js/codeEditorProjectAwareCompletions.js @@ -66,7 +66,7 @@ }; const provideTemplateNames = function provideTemplateNames(model, position) { - if (!checkMatch(model, position, /ct\.templates\.((make|copy)\(|list\[|templates\[)$/)) { + if (!checkMatch(model, position, /ct\.templates\.((make|copy|exists)\(|list\[|templates\[)$/)) { return { suggestions: [] }; @@ -127,19 +127,19 @@ window.signals = window.signals || riot.observable({}); window.signals.on('monacoBooted', () => { - monaco.languages.registerCompletionItemProvider('templatescript', { + monaco.languages.registerCompletionItemProvider('typescript', { provideCompletionItems: provideTemplateNames, triggerCharacters: ['(', '['] }); - monaco.languages.registerCompletionItemProvider('templatescript', { + monaco.languages.registerCompletionItemProvider('typescript', { provideCompletionItems: provideSoundNames, triggerCharacters: ['('] }); - monaco.languages.registerCompletionItemProvider('templatescript', { + monaco.languages.registerCompletionItemProvider('typescript', { provideCompletionItems: provideActionNames, triggerCharacters: ['.'] }); - monaco.languages.registerCompletionItemProvider('templatescript', { + monaco.languages.registerCompletionItemProvider('typescript', { provideCompletionItems: provideRoomNames, triggerCharacters: ['(', '['] }); diff --git a/src/js/projectMigrationScripts/2.0.2.js b/src/js/projectMigrationScripts/2.0.2.js new file mode 100644 index 000000000..8d943f3c4 --- /dev/null +++ b/src/js/projectMigrationScripts/2.0.2.js @@ -0,0 +1,11 @@ +window.migrationProcess = window.migrationProcess || []; + +window.migrationProcess.push({ + version: '2.0.2', + process: project => new Promise(resolve => { + for (const tandem of project.emitterTandems) { + tandem.uid = tandem.uid || tandem.origname; + } + resolve(); + }) +}); diff --git a/src/node_requires/resources/IAssetGroup.d.ts b/src/node_requires/resources/IAssetGroup.d.ts new file mode 100644 index 000000000..c7347e960 --- /dev/null +++ b/src/node_requires/resources/IAssetGroup.d.ts @@ -0,0 +1,12 @@ +type ungroupedAssetGroup = { + isUngroupedGroup: true +}; +type customAssetGroup = { + isUngroupedGroup?: false, + name: string, + icon: string, + colorClass: string, + uid: string +} + +type assetGroup = ungroupedAssetGroup | customAssetGroup; diff --git a/src/node_requires/resources/particles/defaultEmitter.js b/src/node_requires/resources/emitterTandems/defaultEmitter.ts similarity index 97% rename from src/node_requires/resources/particles/defaultEmitter.js rename to src/node_requires/resources/emitterTandems/defaultEmitter.ts index 65634a5f9..57dea9a0e 100644 --- a/src/node_requires/resources/particles/defaultEmitter.js +++ b/src/node_requires/resources/emitterTandems/defaultEmitter.ts @@ -86,10 +86,10 @@ const emitter = { }, delay: 0 } -}; +} as ITandemEmitter; module.exports = { - get() { + get(): ITandemEmitter { const generateGUID = require('./../../generateGUID'); const newEmitter = JSON.parse(JSON.stringify(emitter)); newEmitter.uid = generateGUID(); diff --git a/src/node_requires/resources/emitterTandems/index.ts b/src/node_requires/resources/emitterTandems/index.ts index d75bc47ed..885ba209e 100644 --- a/src/node_requires/resources/emitterTandems/index.ts +++ b/src/node_requires/resources/emitterTandems/index.ts @@ -9,7 +9,30 @@ const getById = function getById(id: string): ITandem { return tandem; }; +const defaultEmitter = require('./defaultEmitter'); + +const createNewTandem = function createNewTandem(group?: assetRef): ITandem { + const emitter = defaultEmitter.get(); + const generateGUID = require('./../../generateGUID'); + const id = generateGUID(), + slice = id.slice(-6); + + const tandem = { + name: 'Tandem_' + slice, + uid: id, + origname: 'pt' + slice, + emitters: [emitter], + group, + lastmod: Number(new Date()), + type: 'tandem' + } as ITandem; + + return tandem; +}; + export { getThumbnail, - getById + getById, + defaultEmitter, + createNewTandem }; diff --git a/src/node_requires/resources/particles/index.js b/src/node_requires/resources/particles/index.js deleted file mode 100644 index 2eef75f6a..000000000 --- a/src/node_requires/resources/particles/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const defaultEmitter = require('./defaultEmitter'); - -module.exports = { - defaultEmitter -}; diff --git a/src/riotTags/main-menu/stylebook-panel.tag b/src/riotTags/main-menu/stylebook-panel.tag index a42215a77..299a65b38 100644 --- a/src/riotTags/main-menu/stylebook-panel.tag +++ b/src/riotTags/main-menu/stylebook-panel.tag @@ -21,6 +21,10 @@ stylebook-panel.aPanel.aView.pad.flexrow svg.feather use(xlink:href="#table-sidebar") span Tables + li(onclick="{openTab('cursor')}" class="{active: tab === 'cursor'}") + svg.feather + use(xlink:href="#ui") + span Cursor main.aPanel.pad.tall(if="{tab === 'common'}") @@ -480,11 +484,26 @@ stylebook-panel.aPanel.aView.pad.flexrow p Here the #[code.inline .relative.pad] classes on the dimmer are added only to prevent the modal from overlaying the whole screen, and to add some borders around the modal. You won't usually use these two classes. yield(to="example") .aDimmer.relative.pad + button.aDimmer-aCloseButton + svg.feather + use(xlink:href="#x") .aModal.pad.npb h2 A heading p Some interesting (or not) content .inset button A button + stylebook-section(heading="A dimmer with a close button") + yield(to="description") + yield(to="example") + .aDimmer.relative + button.aDimmer-aCloseButton + svg.feather + use(xlink:href="#x") + .aSpacer + .aSpacer + .aSpacer + .aSpacer + .aSpacer stylebook-section(heading="Striped lists") yield(to="example") ul.aStripedList @@ -846,7 +865,22 @@ stylebook-panel.aPanel.aView.pad.flexrow td Cell 2.7 td Cell 2.8 td Cell 2.9 - + main.aPanel.pad.tall(if="{tab === 'cursor'}") + h1 Cursor styles + .aSpacer + stylebook-section() + yield(to="description") + p There are several styles that change the cursor hovering over the element. + yield(to="example") + p.pointer A paragraph that changes a cursor to a pointer. + button A regular button + p + button.cursordefault A button that shows a default cursor instead of a pointer. + p + button.loading + svg.feather.rotate + use(xlink:href="#refresh-cw") + span A button with a "wait" cursor .aSpacer.nogrow .nogrow button.inline.square(onclick="{opts.onclose}" title="{vocGlob.close}") diff --git a/src/riotTags/particles/emitter-tandem-editor.tag b/src/riotTags/particles/emitter-tandem-editor.tag index c0b76656f..2afe453a2 100644 --- a/src/riotTags/particles/emitter-tandem-editor.tag +++ b/src/riotTags/particles/emitter-tandem-editor.tag @@ -348,7 +348,7 @@ emitter-tandem-editor.aPanel.aView.flexrow UI events */ this.addEmitter = () => { - const defaultEmitter = require('./data/node_requires/resources/particles/defaultEmitter').get(); + const defaultEmitter = require('./data/node_requires/resources/emitterTandems/defaultEmitter').get(); this.tandem.emitters.push(defaultEmitter); this.resetEmitters(); }; diff --git a/src/riotTags/particles/fx-panel.tag b/src/riotTags/particles/fx-panel.tag index 5d1dd0300..c354eff9b 100644 --- a/src/riotTags/particles/fx-panel.tag +++ b/src/riotTags/particles/fx-panel.tag @@ -37,19 +37,9 @@ fx-panel.aPanel.aView e.preventDefault(); }; + const {createNewTandem} = require('./data/node_requires/resources/emitterTandems'); this.emitterTandemCreate = () => { - const defaultEmitter = require('./data/node_requires/resources/particles/defaultEmitter').get(); - const generateGUID = require('./data/node_requires/generateGUID'); - const id = generateGUID(), - slice = id.slice(-6); - - const tandem = { - name: 'Tandem_' + slice, - origname: 'pt' + slice, - emitters: [defaultEmitter], - group: this.refs.emitterTandems.currentGroup.uid - }; - + const tandem = createNewTandem(this.refs.emitterTandems.currentGroup.uid); global.currentProject.emitterTandems.push(tandem); this.editingTandem = true; this.editedTandem = tandem; diff --git a/src/riotTags/shared/asset-selector.tag b/src/riotTags/shared/asset-selector.tag index e7f26f598..c4e40c558 100644 --- a/src/riotTags/shared/asset-selector.tag +++ b/src/riotTags/shared/asset-selector.tag @@ -23,8 +23,13 @@ The value passed in the function is the uid of the selected asset. It is also called with -1 when the asset input cannot find the current asset in the project. -asset-selector.aDimmer(onclick="{closeSelector}" ref="dimmer") - .aModal.pad +asset-selector.aDimmer.pointer.pad.fadein(onclick="{closeOnDimmer}" ref="dimmer") + + button.aDimmer-aCloseButton.forcebackground(if="{opts.oncancelled}" title="{vocGlob.close}" onclick="{opts.oncancelled}") + svg.feather + use(xlink:href="#x") + + .aModal.pad.cursordefault.appear asset-viewer( assettype="{opts.assettype}" collection="{currentProject[opts.assettype]}" @@ -47,8 +52,8 @@ asset-selector.aDimmer(onclick="{closeSelector}" ref="dimmer") }; updateResourceAPIs(); - this.closeSelector = e => { - if (e.target === this.refs.dimmer) { + this.closeOnDimmer = e => { + if (e.target === this.root) { if (this.opts.oncancelled) { this.opts.oncancelled(); } diff --git a/src/riotTags/shared/asset-viewer.tag b/src/riotTags/shared/asset-viewer.tag index 8c9d91b76..c4e27f517 100644 --- a/src/riotTags/shared/asset-viewer.tag +++ b/src/riotTags/shared/asset-viewer.tag @@ -111,7 +111,7 @@ asset-viewer.flexfix(class="{opts.namespace} {opts.class}") use(xlink:href="#{group.icon}") .aCard-Properties span {group.name} - .center(if="{!(searchResults? searchResults : getGrouped(collection)).length}") + .center(if="{!opts.shownone && !(searchResults? searchResults : getGrouped(collection)).length}") svg.anIllustration use(xlink:href="data/img/weirdFoldersIllustration.svg#illustration") br diff --git a/src/riotTags/shared/color-input.tag b/src/riotTags/shared/color-input.tag index 258ea96ff..c039cc4a2 100644 --- a/src/riotTags/shared/color-input.tag +++ b/src/riotTags/shared/color-input.tag @@ -17,7 +17,7 @@ color-input .color-input-aPicker(style="background-color: {value};" onclick="{openPicker}") span(style="color: {dark? '#fff' : '#000'};") {value} - color-picker( + color-picker.appear( ref="colorPicker" if="{opened}" color="{value}" hidealpha="{opts.hidealpha}" onapply="{applyColor}" onchanged="{changeColor}" oncancel="{cancelColor}" diff --git a/src/riotTags/shared/group-editor.tag b/src/riotTags/shared/group-editor.tag index ca33c9ec5..a3bbbf5cf 100644 --- a/src/riotTags/shared/group-editor.tag +++ b/src/riotTags/shared/group-editor.tag @@ -8,8 +8,8 @@ @attribute group (object) The group that should be edited. -group-editor.aDimmer - .aModal.pad.npb(ref="widget") +group-editor.aDimmer.fadein + .aModal.pad.npb.appear(ref="widget") .toright svg.feather.anActionableIcon(onclick="{opts.onclose}") use(xlink:href="#x") diff --git a/src/riotTags/sounds/sound-recorder.tag b/src/riotTags/sounds/sound-recorder.tag index 3735bada4..2e230c226 100644 --- a/src/riotTags/sounds/sound-recorder.tag +++ b/src/riotTags/sounds/sound-recorder.tag @@ -1,5 +1,5 @@ -sound-recorder.aDimmer - .aModal.pad +sound-recorder.aDimmer.fadein + .aModal.pad.appear .toright button.square.inline(onclick="{opts.onclose}" title="{vocGlob.close}") svg.feather diff --git a/src/riotTags/textures/textures-panel.tag b/src/riotTags/textures/textures-panel.tag index dead1d3c8..30b3cf5db 100644 --- a/src/riotTags/textures/textures-panel.tag +++ b/src/riotTags/textures/textures-panel.tag @@ -194,9 +194,9 @@ textures-panel.aPanel.aView }; const deleteCurrentTexture = () => { - for (const type of global.currentProject.types) { - if (type.texture === this.currentTexture.uid) { - type.texture = -1; + for (const template of global.currentProject.templates) { + if (template.texture === this.currentTexture.uid) { + template.texture = -1; } } for (const room of global.currentProject.rooms) { diff --git a/src/styl/3rdParty/alertify.styl b/src/styl/3rdParty/alertify.styl index 975454c4c..b7a7c6956 100644 --- a/src/styl/3rdParty/alertify.styl +++ b/src/styl/3rdParty/alertify.styl @@ -23,6 +23,7 @@ width 100% height 100% z-index 99999 + @extends .fadein &.hide opacity 0 pointer-events none diff --git a/src/styl/buildingBlocks.styl b/src/styl/buildingBlocks.styl index e4f35f62c..914556209 100644 --- a/src/styl/buildingBlocks.styl +++ b/src/styl/buildingBlocks.styl @@ -16,6 +16,14 @@ flex-flow column nowrap align-items center justify-content center + &-aCloseButton + position absolute + right 1rem + top 1rem + @extends button.square + @extends button.inline + @extends button.square.inline + margin 0 .aModal, .aPanel box-sizing border-box diff --git a/src/styl/hvost.styl b/src/styl/hvost.styl index c83aa587a..03153572f 100644 --- a/src/styl/hvost.styl +++ b/src/styl/hvost.styl @@ -220,6 +220,10 @@ for i in 1 2 3 4 5 6 7 8 .loading cursor wait +.pointer + cursor pointer +.cursordefault + cursor default .aContainer16x9 @@ -318,11 +322,17 @@ for i in 1 2 3 4 5 6 7 8 animation wiggle cubic-bezier(0.45, 0.05, 0.55, 0.95) 1s infinite .shake animation shake 1s ease 1 +.fadein + animation fade-in linear 0.15s 1 + z-index 50 +.popin + animation pop-in cubic-bezier(0.13, -0.1, 0.65, -0.51) 0.75s 1 + z-index 50 .popout animation pop-out cubic-bezier(0.13, -0.1, 0.65, -0.51) 0.75s 1 z-index 50 .appear - animation 0.35s cubic-bezier(0.39, 0.58, 0.57, 1) appear + animation appear ease 0.15s 1 /* flexfix */ .flexfix display flex diff --git a/src/styl/tags/notepad-panel.styl b/src/styl/tags/notepad-panel.styl index d515cb404..9732317ae 100644 --- a/src/styl/tags/notepad-panel.styl +++ b/src/styl/tags/notepad-panel.styl @@ -1,60 +1,60 @@ -notepad-panel - display flex - flex-direction column - width 75% - z-index 20 - transition 0.35s ease left - {shadamb} - position fixed !important - {trans} - & > div - flex 1 1 auto - position relative - & > div > div - position absolute - left 0 - top 0 - right 0 - bottom 0 - .aNav - flex 0 1 auto - border-bottom-left-radius 0 - border-bottom-right-radius 0 - border-top-right-radius 0 - &.opened - transform translate(-100%, 0) - iframe, webview - position absolute - left 0 - top 0 - width 100% - height 100% - border 0 none - // @stylint off - background #fff - // @stylint on - .aHomeButton - position absolute - right 0.5rem - top 0.5rem - padding 0.25rem 0.5rem -.dockleft - position absolute - right 100% - top 40% - height 20% - margin 0 - border-top-right-radius 0 - border-bottom-right-radius 0 - border-right 0 none - -.dockright - position absolute - left 100% - top 10% - height 80% - margin 0 - transform translate(0, 0) - border-top-right-radius 0 - border-bottom-right-radius 0 - border-right 0 none +notepad-panel + display flex + flex-direction column + width 75% + z-index 20 + transition 0.25s ease left + {shadamb} + position fixed !important + {trans} + & > div + flex 1 1 auto + position relative + & > div > div + position absolute + left 0 + top 0 + right 0 + bottom 0 + .aNav + flex 0 1 auto + border-bottom-left-radius 0 + border-bottom-right-radius 0 + border-top-right-radius 0 + &.opened + transform translate(-100%, 0) + iframe, webview + position absolute + left 0 + top 0 + width 100% + height 100% + border 0 none + // @stylint off + background #fff + // @stylint on + .aHomeButton + position absolute + right 0.5rem + top 0.5rem + padding 0.25rem 0.5rem +.dockleft + position absolute + right 100% + top 40% + height 20% + margin 0 + border-top-right-radius 0 + border-bottom-right-radius 0 + border-right 0 none + +.dockright + position absolute + left 100% + top 10% + height 80% + margin 0 + transform translate(0, 0) + border-top-right-radius 0 + border-bottom-right-radius 0 + border-right 0 none diff --git a/src/styl/tags/shared/asset-input.styl b/src/styl/tags/shared/asset-input.styl index 1f4439593..770badcd8 100644 --- a/src/styl/tags/shared/asset-input.styl +++ b/src/styl/tags/shared/asset-input.styl @@ -1,6 +1,6 @@ asset-input &.wide - .aButtonGroup + & > .aButtonGroup @extends .aButtonGroup.wide button flex 0 0 auto diff --git a/src/styl/tags/shared/asset-selector.styl b/src/styl/tags/shared/asset-selector.styl index 86355281e..37521baba 100644 --- a/src/styl/tags/shared/asset-selector.styl +++ b/src/styl/tags/shared/asset-selector.styl @@ -1,4 +1,4 @@ asset-selector - .aModal + & > .aModal width 90vw height 90vh diff --git a/src/typedefs/default/lib.dom.d.ts b/src/typedefs/default/lib.dom.d.ts index 4c0804be1..e0acda041 100644 --- a/src/typedefs/default/lib.dom.d.ts +++ b/src/typedefs/default/lib.dom.d.ts @@ -1,3 +1,38 @@ +interface WindowOrWorkerGlobalScope { + readonly caches: CacheStorage; + readonly crossOriginIsolated: boolean; + readonly crypto: Crypto; + readonly indexedDB: IDBFactory; + readonly isSecureContext: boolean; + readonly origin: string; + readonly performance: Performance; + atob(data: string): string; + btoa(data: string): string; + clearInterval(handle?: number): void; + clearTimeout(handle?: number): void; + createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise; + createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise; + fetch(input: RequestInfo, init?: RequestInit): Promise; + queueMicrotask(callback: VoidFunction): void; + setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number; + setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number; +} + +interface Window extends WindowOrWorkerGlobalScope { + readonly devicePixelRatio: number; + readonly document: Document; + [key: string]: any; +} + // Mainly you don't need any DOM API in game development, so let's not pollute typings with tons of global prototypes, mmkay? -var window: any; -var document: any; \ No newline at end of file +var window: Window; +var document: any; + +declare const atob: (data: string) => string; +declare const btoa: (data: string) => string; +declare const clearInterval: (handle?: number) => void; +declare const clearTimeout: (handle?: number) => void; +declare const fetch: (input: RequestInfo, init?: RequestInit) => Promise; +declare const queueMicrotask: (callback: VoidFunction) => void; +declare const setInterval: (handler: TimerHandler, timeout?: number, ...arguments: any[]) => number; +declare const setTimeout: (handler: TimerHandler, timeout?: number, ...arguments: any[]) => number;