diff --git a/Makefile b/Makefile index 951ecc7..54a422b 100755 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ package: cp -rv information.json package-script zip -v -q -r package-script.zip package-script cp -rv VM deb/opt/apps/deepin-wine-runner + cp -rv 2048 deb/opt/apps/deepin-wine-runner/ cp -rv Download.py deb/opt/apps/deepin-wine-runner/ cp -rv AllInstall.py deb/opt/apps/deepin-wine-runner cp -rv ShellList deb/opt/apps/deepin-wine-runner @@ -130,7 +131,7 @@ package: install: make build -j$(nproc) - sudo apt update | true + sudo apt update ; true #sudo dpkg -i spark-deepin-wine-runner.deb sudo apt reinstall ./spark-deepin-wine-runner.deb -y --allow-downgrades diff --git a/README.md b/README.md index 540519f..9f93c78 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

-

Wine 运行器 3.1.0

+

Wine 运行器 3.2.0


## 介绍 @@ -119,6 +119,28 @@ desktop文件中StartupWMClass字段。用于让桌面组件将窗口类名与de ![image.png](https://storage.deepin.org/thread/202207190822204627_image.png) ## 更新日志 +### 3.2.0(2023年03月19日) +**※1、Windows 应用适配工具新增系统资源显示;** +**※2、Windows 应用适配工具使用 C++ 重写;** +**※3、修复打包器(基于官方生态适配脚本)无法打开的问题;** +**※4、新增运行库功能安装,以实现使用 Qemu User 跨架构运行 Wine 的功能(理论上支持 3a4000 了,但没试过);** +**※5、修复 Chroot 容器的一些问题;** +**※6、修复在 Debian11 安装时缺失依赖 rar 的问题;** +**※7、新增安装 box86、box64 的功能;** +**※8、修复故障反馈功能错误的问题;** +**※9、支持调用 Flatpak 安装的 Wine;** +10、修改程序内的部分网址; +11、作者信息变更; +12、支持禁用程序的多语言支持(默认禁用,因为是机翻的); +13、支持在程序本地翻译缺失的情况下自动机翻缺失语句; +14、从此版本开始不再区分吾爱版、Spark 版和 UOS 版; +15、新增下载量查询; +16、更新程序公告; +17、新增断网彩蛋。 + +![图片.png](https://storage.deepin.org/thread/202303191608011688_图片.png) + + ### 3.1.0(2023年01月06日) **※1、不基于生态适配脚本打包器支持禁用 Mono/Gecko 打包器;** **※2、自动容器配置脚本新增命令 decompressionbottle、programforum、installmsi 以及上述命令的帮助;** diff --git a/VM-source/VirtualMachine b/VM-source/VirtualMachine index 7541d44..a431fab 100755 Binary files a/VM-source/VirtualMachine and b/VM-source/VirtualMachine differ diff --git a/VM/VirtualMachine b/VM/VirtualMachine index 7541d44..a431fab 100755 Binary files a/VM/VirtualMachine and b/VM/VirtualMachine differ diff --git a/deb/DEBIAN/control b/deb/DEBIAN/control index b6faa9b..b20fc90 100755 --- a/deb/DEBIAN/control +++ b/deb/DEBIAN/control @@ -1,5 +1,5 @@ Package: spark-deepin-wine-runner -Version: 3.1.0 +Version: 3.2.0 Maintainer: gfdgd xi <3025613752@qq.com> Homepage: https://gitee.com/gfdgd-xi-org/deep-wine-runner Architecture: all @@ -14,17 +14,23 @@ Section: utils Conflicts: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer, spark-deepin-wine-runner-52, spark-deepin-wine-runner Replaces: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer, spark-deepin-wine-runner-52, spark-deepin-wine-runner Installed-Size: 25856 -Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器,RacoonGX 团队作品 - 3.1.0 更新内容: - ※1、不基于生态适配脚本打包器支持禁用 Mono/Gecko 打包器; - ※2、自动容器配置脚本新增命令 decompressionbottle、programforum、installmsi 以及上述命令的帮助; - ※3、自动容器配置脚本新增评论功能; - ※4、自动容器配置脚本新增许多应用安装脚本; - ※5、安装 Windows 虚拟机功能更换应答镜像图标并添加常用 Windows 组件安装功能; - ※6、安装 Windows 虚拟机功能提供镜像下载的网盘链接; - ※7、简易打包器支持自动添加宋体; - 8、修复 installfont 命令下载的字体目录错误问题; - 9、修复提交日志功能在提交成功时依旧提示提交失败问题; - 10、支持强制启用所有被禁用的组件(不推荐)。 - 更新时间:2023年01月06日 +Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器 + 3.2.0 更新内容: + ※1、Windows 应用适配工具新增系统资源显示; + ※2、Windows 应用适配工具使用 C++ 重写; + ※3、修复打包器(基于官方生态适配脚本)无法打开的问题; + ※4、新增运行库功能安装,以实现使用 Qemu User 跨架构运行 Wine 的功能(理论上支持 3a4000 了,但没试过); + ※5、修复 Chroot 容器的一些问题; + ※6、修复在 Debian11 安装时缺失依赖 rar 的问题; + ※7、新增安装 box86、box64 的功能; + ※8、修复故障反馈功能错误的问题; + 9、修改程序内的部分网址; + 10、作者信息变更; + 11、支持禁用程序的多语言支持(默认禁用,因为是机翻的); + 12、支持在程序本地翻译缺失的情况下自动机翻缺失语句; + 13、从此版本开始不再区分吾爱版、Spark 版和 UOS 版; + 14、新增下载量查询; + 15、更新程序公告; + 16、新增断网彩蛋。 + 更新时间:2023年01月19日 作者:gfdgd xi、为什么您不喜欢熊出没和阿布呢 diff --git a/deb/opt/apps/deepin-wine-runner/2048/.gitignore b/deb/opt/apps/deepin-wine-runner/2048/.gitignore new file mode 100644 index 0000000..0d31019 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/.gitignore @@ -0,0 +1 @@ +.sass-cache/ diff --git a/deb/opt/apps/deepin-wine-runner/2048/.jshintrc b/deb/opt/apps/deepin-wine-runner/2048/.jshintrc new file mode 100644 index 0000000..87dbf9a --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/.jshintrc @@ -0,0 +1,19 @@ +{ + "esnext": true, + "indent": 2, + "maxlen": 80, + "freeze": true, + "camelcase": true, + "unused": true, + "eqnull": true, + "proto": true, + "supernew": true, + "noyield": true, + "evil": true, + "node": true, + "boss": true, + "expr": true, + "loopfunc": true, + "white": true, + "maxdepth": 4 +} diff --git a/deb/opt/apps/deepin-wine-runner/2048/CONTRIBUTING.md b/deb/opt/apps/deepin-wine-runner/2048/CONTRIBUTING.md new file mode 100644 index 0000000..8b269ae --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# Contributing +Changes and improvements are more than welcome! Feel free to fork and open a pull request. + +Please follow the house rules to have a bigger chance of your contribution being merged. + +## House rules + +### How to make changes + - To make changes, create a new branch based on `master` (do not create one from `gh-pages` unless strictly necessary) and make them there, then create a Pull Request to master. + `gh-pages` is different from master in that it contains sharing features, analytics and other things that have no direct bearing with the game. `master` is the "pure" version of the game. + - If you want to modify the CSS, please edit the SCSS files present in `style/`: `main.scss` and others. Don't edit the `main.css`, because it's supposed to be generated. + In order to compile your SCSS modifications, you need to use the `sass` gem (install it by running `gem install sass` once Ruby is installed). + To run SASS, simply use the following command: + `sass --unix-newlines --watch style/main.scss` + SASS will automatically recompile your css when changed. + - `Rakefile` contains some tasks that help during development. Feel free to add useful tasks if needed. + - Please use 2-space indentation when editing the JavaScript. A `.jshintrc` file is present, which will help your code to follow the guidelines if you install and run `jshint`. + - Please test your modification thoroughly before submitting your Pull Request. + +### Changes that might not be accepted +We have to be conservative with the core game. This means that some modifications won't be merged, or will have to be evaluated carefully before being merged: + + - Undo/redo features + - Save/reload features + - Changes to how the tiles look or their contents + - Changes to the layout + - Changes to the grid size + +### Changes that are welcome + - Bug fixes + - Compatibility improvements + - "Under the hood" enhancements + - Small changes that don't have an impact on the core gameplay diff --git a/deb/opt/apps/deepin-wine-runner/2048/LICENSE.txt b/deb/opt/apps/deepin-wine-runner/2048/LICENSE.txt new file mode 100644 index 0000000..b0dbfa4 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Gabriele Cirulli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/deb/opt/apps/deepin-wine-runner/2048/README.md b/deb/opt/apps/deepin-wine-runner/2048/README.md new file mode 100644 index 0000000..6b1da38 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/README.md @@ -0,0 +1,38 @@ +# 2048 +A small clone of [1024](https://play.google.com/store/apps/details?id=com.veewo.a1024), based on [Saming's 2048](http://saming.fr/p/2048/) (also a clone). + +Made just for fun. [Play it here!](http://gabrielecirulli.github.io/2048/) + +The official app can also be found on the [Play Store](https://play.google.com/store/apps/details?id=com.gabrielecirulli.app2048) and [App Store!](https://itunes.apple.com/us/app/2048-by-gabriele-cirulli/id868076805) + +### Contributions + +[Anna Harren](https://github.com/iirelu/) and [sigod](https://github.com/sigod) are maintainers for this repository. + +Other notable contributors: + + - [TimPetricola](https://github.com/TimPetricola) added best score storage + - [chrisprice](https://github.com/chrisprice) added custom code for swipe handling on mobile + - [marcingajda](https://github.com/marcingajda) made swipes work on Windows Phone + - [mgarciaisaia](https://github.com/mgarciaisaia) added support for Android 2.3 + +Many thanks to [rayhaanj](https://github.com/rayhaanj), [Mechazawa](https://github.com/Mechazawa), [grant](https://github.com/grant), [remram44](https://github.com/remram44) and [ghoullier](https://github.com/ghoullier) for the many other good contributions. + +### Screenshot + +

+ Screenshot +

+ +That screenshot is fake, by the way. I never reached 2048 :smile: + +## Contributing +Changes and improvements are more than welcome! Feel free to fork and open a pull request. Please make your changes in a specific branch and request to pull into `master`! If you can, please make sure the game fully works before sending the PR, as that will help speed up the process. + +You can find the same information in the [contributing guide.](https://github.com/gabrielecirulli/2048/blob/master/CONTRIBUTING.md) + +## License +2048 is licensed under the [MIT license.](https://github.com/gabrielecirulli/2048/blob/master/LICENSE.txt) + +## Donations +I made this in my spare time, and it's hosted on GitHub (which means I don't have any hosting costs), but if you enjoyed the game and feel like buying me coffee, you can donate at my BTC address: `1Ec6onfsQmoP9kkL3zkpB6c5sA4PVcXU2i`. Thank you very much! diff --git a/deb/opt/apps/deepin-wine-runner/2048/Rakefile b/deb/opt/apps/deepin-wine-runner/2048/Rakefile new file mode 100644 index 0000000..3e9851e --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/Rakefile @@ -0,0 +1,11 @@ +require "date" + +namespace :appcache do + desc "update the date in the appcache file (in the gh-pages branch)" + task :update do + appcache = File.read("cache.appcache") + updated = "# Updated: #{DateTime.now}" + + File.write("cache.appcache", appcache.sub(/^# Updated:.*$/, updated)) + end +end diff --git a/deb/opt/apps/deepin-wine-runner/2048/favicon.ico b/deb/opt/apps/deepin-wine-runner/2048/favicon.ico new file mode 100644 index 0000000..22109e0 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/favicon.ico differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/index.html b/deb/opt/apps/deepin-wine-runner/2048/index.html new file mode 100644 index 0000000..0da0ee0 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/index.html @@ -0,0 +1,99 @@ + + + + + 2048 + + + + + + + + + + + + + + +
+
+

2048

+
+
0
+
0
+
+
+ +
+

Join the numbers and get to the 2048 tile!

+ New Game +
+ +
+
+

+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+ +

+ How to play: Use your arrow keys to move the tiles. When two tiles with the same number touch, they merge into one! +

+
+

+ Note: This site is the official version of 2048. You can play it on your phone via http://git.io/2048. All other apps or sites are derivatives or fakes, and should be used with caution. +

+
+

+ Created by Gabriele Cirulli. Based on 1024 by Veewo Studio and conceptually similar to Threes by Asher Vollmer. +

+
+ + + + + + + + + + + + + diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/animframe_polyfill.js b/deb/opt/apps/deepin-wine-runner/2048/js/animframe_polyfill.js new file mode 100644 index 0000000..c524a99 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/animframe_polyfill.js @@ -0,0 +1,28 @@ +(function () { + var lastTime = 0; + var vendors = ['webkit', 'moz']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || + window[vendors[x] + 'CancelRequestAnimationFrame']; + } + + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = function (callback) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, + timeToCall); + lastTime = currTime + timeToCall; + return id; + }; + } + + if (!window.cancelAnimationFrame) { + window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; + } +}()); diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/application.js b/deb/opt/apps/deepin-wine-runner/2048/js/application.js new file mode 100644 index 0000000..2c1108e --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/application.js @@ -0,0 +1,4 @@ +// Wait till the browser is ready to render the game (avoids glitches) +window.requestAnimationFrame(function () { + new GameManager(4, KeyboardInputManager, HTMLActuator, LocalStorageManager); +}); diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/bind_polyfill.js b/deb/opt/apps/deepin-wine-runner/2048/js/bind_polyfill.js new file mode 100644 index 0000000..8d9c4a4 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/bind_polyfill.js @@ -0,0 +1,9 @@ +Function.prototype.bind = Function.prototype.bind || function (target) { + var self = this; + return function (args) { + if (!(args instanceof Array)) { + args = [args]; + } + self.apply(target, args); + }; +}; diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/classlist_polyfill.js b/deb/opt/apps/deepin-wine-runner/2048/js/classlist_polyfill.js new file mode 100644 index 0000000..1789ae7 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/classlist_polyfill.js @@ -0,0 +1,71 @@ +(function () { + if (typeof window.Element === "undefined" || + "classList" in document.documentElement) { + return; + } + + var prototype = Array.prototype, + push = prototype.push, + splice = prototype.splice, + join = prototype.join; + + function DOMTokenList(el) { + this.el = el; + // The className needs to be trimmed and split on whitespace + // to retrieve a list of classes. + var classes = el.className.replace(/^\s+|\s+$/g, '').split(/\s+/); + for (var i = 0; i < classes.length; i++) { + push.call(this, classes[i]); + } + } + + DOMTokenList.prototype = { + add: function (token) { + if (this.contains(token)) return; + push.call(this, token); + this.el.className = this.toString(); + }, + contains: function (token) { + return this.el.className.indexOf(token) != -1; + }, + item: function (index) { + return this[index] || null; + }, + remove: function (token) { + if (!this.contains(token)) return; + for (var i = 0; i < this.length; i++) { + if (this[i] == token) break; + } + splice.call(this, i, 1); + this.el.className = this.toString(); + }, + toString: function () { + return join.call(this, ' '); + }, + toggle: function (token) { + if (!this.contains(token)) { + this.add(token); + } else { + this.remove(token); + } + + return this.contains(token); + } + }; + + window.DOMTokenList = DOMTokenList; + + function defineElementGetter(obj, prop, getter) { + if (Object.defineProperty) { + Object.defineProperty(obj, prop, { + get: getter + }); + } else { + obj.__defineGetter__(prop, getter); + } + } + + defineElementGetter(HTMLElement.prototype, 'classList', function () { + return new DOMTokenList(this); + }); +})(); diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/game_manager.js b/deb/opt/apps/deepin-wine-runner/2048/js/game_manager.js new file mode 100644 index 0000000..1c13d15 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/game_manager.js @@ -0,0 +1,272 @@ +function GameManager(size, InputManager, Actuator, StorageManager) { + this.size = size; // Size of the grid + this.inputManager = new InputManager; + this.storageManager = new StorageManager; + this.actuator = new Actuator; + + this.startTiles = 2; + + this.inputManager.on("move", this.move.bind(this)); + this.inputManager.on("restart", this.restart.bind(this)); + this.inputManager.on("keepPlaying", this.keepPlaying.bind(this)); + + this.setup(); +} + +// Restart the game +GameManager.prototype.restart = function () { + this.storageManager.clearGameState(); + this.actuator.continueGame(); // Clear the game won/lost message + this.setup(); +}; + +// Keep playing after winning (allows going over 2048) +GameManager.prototype.keepPlaying = function () { + this.keepPlaying = true; + this.actuator.continueGame(); // Clear the game won/lost message +}; + +// Return true if the game is lost, or has won and the user hasn't kept playing +GameManager.prototype.isGameTerminated = function () { + return this.over || (this.won && !this.keepPlaying); +}; + +// Set up the game +GameManager.prototype.setup = function () { + var previousState = this.storageManager.getGameState(); + + // Reload the game from a previous game if present + if (previousState) { + this.grid = new Grid(previousState.grid.size, + previousState.grid.cells); // Reload grid + this.score = previousState.score; + this.over = previousState.over; + this.won = previousState.won; + this.keepPlaying = previousState.keepPlaying; + } else { + this.grid = new Grid(this.size); + this.score = 0; + this.over = false; + this.won = false; + this.keepPlaying = false; + + // Add the initial tiles + this.addStartTiles(); + } + + // Update the actuator + this.actuate(); +}; + +// Set up the initial tiles to start the game with +GameManager.prototype.addStartTiles = function () { + for (var i = 0; i < this.startTiles; i++) { + this.addRandomTile(); + } +}; + +// Adds a tile in a random position +GameManager.prototype.addRandomTile = function () { + if (this.grid.cellsAvailable()) { + var value = Math.random() < 0.9 ? 2 : 4; + var tile = new Tile(this.grid.randomAvailableCell(), value); + + this.grid.insertTile(tile); + } +}; + +// Sends the updated grid to the actuator +GameManager.prototype.actuate = function () { + if (this.storageManager.getBestScore() < this.score) { + this.storageManager.setBestScore(this.score); + } + + // Clear the state when the game is over (game over only, not win) + if (this.over) { + this.storageManager.clearGameState(); + } else { + this.storageManager.setGameState(this.serialize()); + } + + this.actuator.actuate(this.grid, { + score: this.score, + over: this.over, + won: this.won, + bestScore: this.storageManager.getBestScore(), + terminated: this.isGameTerminated() + }); + +}; + +// Represent the current game as an object +GameManager.prototype.serialize = function () { + return { + grid: this.grid.serialize(), + score: this.score, + over: this.over, + won: this.won, + keepPlaying: this.keepPlaying + }; +}; + +// Save all tile positions and remove merger info +GameManager.prototype.prepareTiles = function () { + this.grid.eachCell(function (x, y, tile) { + if (tile) { + tile.mergedFrom = null; + tile.savePosition(); + } + }); +}; + +// Move a tile and its representation +GameManager.prototype.moveTile = function (tile, cell) { + this.grid.cells[tile.x][tile.y] = null; + this.grid.cells[cell.x][cell.y] = tile; + tile.updatePosition(cell); +}; + +// Move tiles on the grid in the specified direction +GameManager.prototype.move = function (direction) { + // 0: up, 1: right, 2: down, 3: left + var self = this; + + if (this.isGameTerminated()) return; // Don't do anything if the game's over + + var cell, tile; + + var vector = this.getVector(direction); + var traversals = this.buildTraversals(vector); + var moved = false; + + // Save the current tile positions and remove merger information + this.prepareTiles(); + + // Traverse the grid in the right direction and move tiles + traversals.x.forEach(function (x) { + traversals.y.forEach(function (y) { + cell = { x: x, y: y }; + tile = self.grid.cellContent(cell); + + if (tile) { + var positions = self.findFarthestPosition(cell, vector); + var next = self.grid.cellContent(positions.next); + + // Only one merger per row traversal? + if (next && next.value === tile.value && !next.mergedFrom) { + var merged = new Tile(positions.next, tile.value * 2); + merged.mergedFrom = [tile, next]; + + self.grid.insertTile(merged); + self.grid.removeTile(tile); + + // Converge the two tiles' positions + tile.updatePosition(positions.next); + + // Update the score + self.score += merged.value; + + // The mighty 2048 tile + if (merged.value === 2048) self.won = true; + } else { + self.moveTile(tile, positions.farthest); + } + + if (!self.positionsEqual(cell, tile)) { + moved = true; // The tile moved from its original cell! + } + } + }); + }); + + if (moved) { + this.addRandomTile(); + + if (!this.movesAvailable()) { + this.over = true; // Game over! + } + + this.actuate(); + } +}; + +// Get the vector representing the chosen direction +GameManager.prototype.getVector = function (direction) { + // Vectors representing tile movement + var map = { + 0: { x: 0, y: -1 }, // Up + 1: { x: 1, y: 0 }, // Right + 2: { x: 0, y: 1 }, // Down + 3: { x: -1, y: 0 } // Left + }; + + return map[direction]; +}; + +// Build a list of positions to traverse in the right order +GameManager.prototype.buildTraversals = function (vector) { + var traversals = { x: [], y: [] }; + + for (var pos = 0; pos < this.size; pos++) { + traversals.x.push(pos); + traversals.y.push(pos); + } + + // Always traverse from the farthest cell in the chosen direction + if (vector.x === 1) traversals.x = traversals.x.reverse(); + if (vector.y === 1) traversals.y = traversals.y.reverse(); + + return traversals; +}; + +GameManager.prototype.findFarthestPosition = function (cell, vector) { + var previous; + + // Progress towards the vector direction until an obstacle is found + do { + previous = cell; + cell = { x: previous.x + vector.x, y: previous.y + vector.y }; + } while (this.grid.withinBounds(cell) && + this.grid.cellAvailable(cell)); + + return { + farthest: previous, + next: cell // Used to check if a merge is required + }; +}; + +GameManager.prototype.movesAvailable = function () { + return this.grid.cellsAvailable() || this.tileMatchesAvailable(); +}; + +// Check for available matches between tiles (more expensive check) +GameManager.prototype.tileMatchesAvailable = function () { + var self = this; + + var tile; + + for (var x = 0; x < this.size; x++) { + for (var y = 0; y < this.size; y++) { + tile = this.grid.cellContent({ x: x, y: y }); + + if (tile) { + for (var direction = 0; direction < 4; direction++) { + var vector = self.getVector(direction); + var cell = { x: x + vector.x, y: y + vector.y }; + + var other = self.grid.cellContent(cell); + + if (other && other.value === tile.value) { + return true; // These two tiles can be merged + } + } + } + } + } + + return false; +}; + +GameManager.prototype.positionsEqual = function (first, second) { + return first.x === second.x && first.y === second.y; +}; diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/grid.js b/deb/opt/apps/deepin-wine-runner/2048/js/grid.js new file mode 100644 index 0000000..29f0821 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/grid.js @@ -0,0 +1,117 @@ +function Grid(size, previousState) { + this.size = size; + this.cells = previousState ? this.fromState(previousState) : this.empty(); +} + +// Build a grid of the specified size +Grid.prototype.empty = function () { + var cells = []; + + for (var x = 0; x < this.size; x++) { + var row = cells[x] = []; + + for (var y = 0; y < this.size; y++) { + row.push(null); + } + } + + return cells; +}; + +Grid.prototype.fromState = function (state) { + var cells = []; + + for (var x = 0; x < this.size; x++) { + var row = cells[x] = []; + + for (var y = 0; y < this.size; y++) { + var tile = state[x][y]; + row.push(tile ? new Tile(tile.position, tile.value) : null); + } + } + + return cells; +}; + +// Find the first available random position +Grid.prototype.randomAvailableCell = function () { + var cells = this.availableCells(); + + if (cells.length) { + return cells[Math.floor(Math.random() * cells.length)]; + } +}; + +Grid.prototype.availableCells = function () { + var cells = []; + + this.eachCell(function (x, y, tile) { + if (!tile) { + cells.push({ x: x, y: y }); + } + }); + + return cells; +}; + +// Call callback for every cell +Grid.prototype.eachCell = function (callback) { + for (var x = 0; x < this.size; x++) { + for (var y = 0; y < this.size; y++) { + callback(x, y, this.cells[x][y]); + } + } +}; + +// Check if there are any cells available +Grid.prototype.cellsAvailable = function () { + return !!this.availableCells().length; +}; + +// Check if the specified cell is taken +Grid.prototype.cellAvailable = function (cell) { + return !this.cellOccupied(cell); +}; + +Grid.prototype.cellOccupied = function (cell) { + return !!this.cellContent(cell); +}; + +Grid.prototype.cellContent = function (cell) { + if (this.withinBounds(cell)) { + return this.cells[cell.x][cell.y]; + } else { + return null; + } +}; + +// Inserts a tile at its position +Grid.prototype.insertTile = function (tile) { + this.cells[tile.x][tile.y] = tile; +}; + +Grid.prototype.removeTile = function (tile) { + this.cells[tile.x][tile.y] = null; +}; + +Grid.prototype.withinBounds = function (position) { + return position.x >= 0 && position.x < this.size && + position.y >= 0 && position.y < this.size; +}; + +Grid.prototype.serialize = function () { + var cellState = []; + + for (var x = 0; x < this.size; x++) { + var row = cellState[x] = []; + + for (var y = 0; y < this.size; y++) { + row.push(this.cells[x][y] ? this.cells[x][y].serialize() : null); + } + } + + return { + size: this.size, + cells: cellState + }; +}; diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/html_actuator.js b/deb/opt/apps/deepin-wine-runner/2048/js/html_actuator.js new file mode 100644 index 0000000..6b31f2d --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/html_actuator.js @@ -0,0 +1,139 @@ +function HTMLActuator() { + this.tileContainer = document.querySelector(".tile-container"); + this.scoreContainer = document.querySelector(".score-container"); + this.bestContainer = document.querySelector(".best-container"); + this.messageContainer = document.querySelector(".game-message"); + + this.score = 0; +} + +HTMLActuator.prototype.actuate = function (grid, metadata) { + var self = this; + + window.requestAnimationFrame(function () { + self.clearContainer(self.tileContainer); + + grid.cells.forEach(function (column) { + column.forEach(function (cell) { + if (cell) { + self.addTile(cell); + } + }); + }); + + self.updateScore(metadata.score); + self.updateBestScore(metadata.bestScore); + + if (metadata.terminated) { + if (metadata.over) { + self.message(false); // You lose + } else if (metadata.won) { + self.message(true); // You win! + } + } + + }); +}; + +// Continues the game (both restart and keep playing) +HTMLActuator.prototype.continueGame = function () { + this.clearMessage(); +}; + +HTMLActuator.prototype.clearContainer = function (container) { + while (container.firstChild) { + container.removeChild(container.firstChild); + } +}; + +HTMLActuator.prototype.addTile = function (tile) { + var self = this; + + var wrapper = document.createElement("div"); + var inner = document.createElement("div"); + var position = tile.previousPosition || { x: tile.x, y: tile.y }; + var positionClass = this.positionClass(position); + + // We can't use classlist because it somehow glitches when replacing classes + var classes = ["tile", "tile-" + tile.value, positionClass]; + + if (tile.value > 2048) classes.push("tile-super"); + + this.applyClasses(wrapper, classes); + + inner.classList.add("tile-inner"); + inner.textContent = tile.value; + + if (tile.previousPosition) { + // Make sure that the tile gets rendered in the previous position first + window.requestAnimationFrame(function () { + classes[2] = self.positionClass({ x: tile.x, y: tile.y }); + self.applyClasses(wrapper, classes); // Update the position + }); + } else if (tile.mergedFrom) { + classes.push("tile-merged"); + this.applyClasses(wrapper, classes); + + // Render the tiles that merged + tile.mergedFrom.forEach(function (merged) { + self.addTile(merged); + }); + } else { + classes.push("tile-new"); + this.applyClasses(wrapper, classes); + } + + // Add the inner part of the tile to the wrapper + wrapper.appendChild(inner); + + // Put the tile on the board + this.tileContainer.appendChild(wrapper); +}; + +HTMLActuator.prototype.applyClasses = function (element, classes) { + element.setAttribute("class", classes.join(" ")); +}; + +HTMLActuator.prototype.normalizePosition = function (position) { + return { x: position.x + 1, y: position.y + 1 }; +}; + +HTMLActuator.prototype.positionClass = function (position) { + position = this.normalizePosition(position); + return "tile-position-" + position.x + "-" + position.y; +}; + +HTMLActuator.prototype.updateScore = function (score) { + this.clearContainer(this.scoreContainer); + + var difference = score - this.score; + this.score = score; + + this.scoreContainer.textContent = this.score; + + if (difference > 0) { + var addition = document.createElement("div"); + addition.classList.add("score-addition"); + addition.textContent = "+" + difference; + + this.scoreContainer.appendChild(addition); + } +}; + +HTMLActuator.prototype.updateBestScore = function (bestScore) { + this.bestContainer.textContent = bestScore; +}; + +HTMLActuator.prototype.message = function (won) { + var type = won ? "game-won" : "game-over"; + var message = won ? "You win!" : "Game over!"; + + this.messageContainer.classList.add(type); + this.messageContainer.getElementsByTagName("p")[0].textContent = message; +}; + +HTMLActuator.prototype.clearMessage = function () { + // IE only takes one value to remove at a time. + this.messageContainer.classList.remove("game-won"); + this.messageContainer.classList.remove("game-over"); +}; diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/keyboard_input_manager.js b/deb/opt/apps/deepin-wine-runner/2048/js/keyboard_input_manager.js new file mode 100644 index 0000000..ca01b3c --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/keyboard_input_manager.js @@ -0,0 +1,144 @@ +function KeyboardInputManager() { + this.events = {}; + + if (window.navigator.msPointerEnabled) { + //Internet Explorer 10 style + this.eventTouchstart = "MSPointerDown"; + this.eventTouchmove = "MSPointerMove"; + this.eventTouchend = "MSPointerUp"; + } else { + this.eventTouchstart = "touchstart"; + this.eventTouchmove = "touchmove"; + this.eventTouchend = "touchend"; + } + + this.listen(); +} + +KeyboardInputManager.prototype.on = function (event, callback) { + if (!this.events[event]) { + this.events[event] = []; + } + this.events[event].push(callback); +}; + +KeyboardInputManager.prototype.emit = function (event, data) { + var callbacks = this.events[event]; + if (callbacks) { + callbacks.forEach(function (callback) { + callback(data); + }); + } +}; + +KeyboardInputManager.prototype.listen = function () { + var self = this; + + var map = { + 38: 0, // Up + 39: 1, // Right + 40: 2, // Down + 37: 3, // Left + 75: 0, // Vim up + 76: 1, // Vim right + 74: 2, // Vim down + 72: 3, // Vim left + 87: 0, // W + 68: 1, // D + 83: 2, // S + 65: 3 // A + }; + + // Respond to direction keys + document.addEventListener("keydown", function (event) { + var modifiers = event.altKey || event.ctrlKey || event.metaKey || + event.shiftKey; + var mapped = map[event.which]; + + if (!modifiers) { + if (mapped !== undefined) { + event.preventDefault(); + self.emit("move", mapped); + } + } + + // R key restarts the game + if (!modifiers && event.which === 82) { + self.restart.call(self, event); + } + }); + + // Respond to button presses + this.bindButtonPress(".retry-button", this.restart); + this.bindButtonPress(".restart-button", this.restart); + this.bindButtonPress(".keep-playing-button", this.keepPlaying); + + // Respond to swipe events + var touchStartClientX, touchStartClientY; + var gameContainer = document.getElementsByClassName("game-container")[0]; + + gameContainer.addEventListener(this.eventTouchstart, function (event) { + if ((!window.navigator.msPointerEnabled && event.touches.length > 1) || + event.targetTouches.length > 1) { + return; // Ignore if touching with more than 1 finger + } + + if (window.navigator.msPointerEnabled) { + touchStartClientX = event.pageX; + touchStartClientY = event.pageY; + } else { + touchStartClientX = event.touches[0].clientX; + touchStartClientY = event.touches[0].clientY; + } + + event.preventDefault(); + }); + + gameContainer.addEventListener(this.eventTouchmove, function (event) { + event.preventDefault(); + }); + + gameContainer.addEventListener(this.eventTouchend, function (event) { + if ((!window.navigator.msPointerEnabled && event.touches.length > 0) || + event.targetTouches.length > 0) { + return; // Ignore if still touching with one or more fingers + } + + var touchEndClientX, touchEndClientY; + + if (window.navigator.msPointerEnabled) { + touchEndClientX = event.pageX; + touchEndClientY = event.pageY; + } else { + touchEndClientX = event.changedTouches[0].clientX; + touchEndClientY = event.changedTouches[0].clientY; + } + + var dx = touchEndClientX - touchStartClientX; + var absDx = Math.abs(dx); + + var dy = touchEndClientY - touchStartClientY; + var absDy = Math.abs(dy); + + if (Math.max(absDx, absDy) > 10) { + // (right : left) : (down : up) + self.emit("move", absDx > absDy ? (dx > 0 ? 1 : 3) : (dy > 0 ? 2 : 0)); + } + }); +}; + +KeyboardInputManager.prototype.restart = function (event) { + event.preventDefault(); + this.emit("restart"); +}; + +KeyboardInputManager.prototype.keepPlaying = function (event) { + event.preventDefault(); + this.emit("keepPlaying"); +}; + +KeyboardInputManager.prototype.bindButtonPress = function (selector, fn) { + var button = document.querySelector(selector); + button.addEventListener("click", fn.bind(this)); + button.addEventListener(this.eventTouchend, fn.bind(this)); +}; diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/local_storage_manager.js b/deb/opt/apps/deepin-wine-runner/2048/js/local_storage_manager.js new file mode 100644 index 0000000..2ca9cc3 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/local_storage_manager.js @@ -0,0 +1,63 @@ +window.fakeStorage = { + _data: {}, + + setItem: function (id, val) { + return this._data[id] = String(val); + }, + + getItem: function (id) { + return this._data.hasOwnProperty(id) ? this._data[id] : undefined; + }, + + removeItem: function (id) { + return delete this._data[id]; + }, + + clear: function () { + return this._data = {}; + } +}; + +function LocalStorageManager() { + this.bestScoreKey = "bestScore"; + this.gameStateKey = "gameState"; + + var supported = this.localStorageSupported(); + this.storage = supported ? window.localStorage : window.fakeStorage; +} + +LocalStorageManager.prototype.localStorageSupported = function () { + var testKey = "test"; + + try { + var storage = window.localStorage; + storage.setItem(testKey, "1"); + storage.removeItem(testKey); + return true; + } catch (error) { + return false; + } +}; + +// Best score getters/setters +LocalStorageManager.prototype.getBestScore = function () { + return this.storage.getItem(this.bestScoreKey) || 0; +}; + +LocalStorageManager.prototype.setBestScore = function (score) { + this.storage.setItem(this.bestScoreKey, score); +}; + +// Game state getters/setters and clearing +LocalStorageManager.prototype.getGameState = function () { + var stateJSON = this.storage.getItem(this.gameStateKey); + return stateJSON ? JSON.parse(stateJSON) : null; +}; + +LocalStorageManager.prototype.setGameState = function (gameState) { + this.storage.setItem(this.gameStateKey, JSON.stringify(gameState)); +}; + +LocalStorageManager.prototype.clearGameState = function () { + this.storage.removeItem(this.gameStateKey); +}; diff --git a/deb/opt/apps/deepin-wine-runner/2048/js/tile.js b/deb/opt/apps/deepin-wine-runner/2048/js/tile.js new file mode 100644 index 0000000..92a670a --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/js/tile.js @@ -0,0 +1,27 @@ +function Tile(position, value) { + this.x = position.x; + this.y = position.y; + this.value = value || 2; + + this.previousPosition = null; + this.mergedFrom = null; // Tracks tiles that merged together +} + +Tile.prototype.savePosition = function () { + this.previousPosition = { x: this.x, y: this.y }; +}; + +Tile.prototype.updatePosition = function (position) { + this.x = position.x; + this.y = position.y; +}; + +Tile.prototype.serialize = function () { + return { + position: { + x: this.x, + y: this.y + }, + value: this.value + }; +}; diff --git a/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-icon.png b/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-icon.png new file mode 100644 index 0000000..3fd20f6 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-icon.png differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-startup-image-640x1096.png b/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-startup-image-640x1096.png new file mode 100644 index 0000000..5a68ba0 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-startup-image-640x1096.png differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-startup-image-640x920.png b/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-startup-image-640x920.png new file mode 100644 index 0000000..17bc9d8 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/meta/apple-touch-startup-image-640x920.png differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.eot b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.eot new file mode 100755 index 0000000..3678ef2 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.eot differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.svg b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.svg new file mode 100755 index 0000000..aa985ae --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.svg @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.woff b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.woff new file mode 100755 index 0000000..184a945 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Bold-webfont.woff differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.eot b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.eot new file mode 100755 index 0000000..0dc609d Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.eot differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.svg b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.svg new file mode 100755 index 0000000..1d5d2ec --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.svg @@ -0,0 +1,670 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.woff b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.woff new file mode 100755 index 0000000..44555e0 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Light-webfont.woff differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.eot b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.eot new file mode 100755 index 0000000..b020e05 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.eot differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.svg b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.svg new file mode 100755 index 0000000..1e2cffd --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.svg @@ -0,0 +1,669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.woff b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.woff new file mode 100755 index 0000000..9d58858 Binary files /dev/null and b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/ClearSans-Regular-webfont.woff differ diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/fonts/clear-sans.css b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/clear-sans.css new file mode 100755 index 0000000..de2811d --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/style/fonts/clear-sans.css @@ -0,0 +1,30 @@ +@font-face { + font-family: "Clear Sans"; + src: url("ClearSans-Light-webfont.eot"); + src: url("ClearSans-Light-webfont.eot?#iefix") format("embedded-opentype"), + url("ClearSans-Light-webfont.svg#clear_sans_lightregular") format("svg"), + url("ClearSans-Light-webfont.woff") format("woff"); + font-weight: 200; + font-style: normal; +} + +@font-face { + font-family: "Clear Sans"; + src: url("ClearSans-Regular-webfont.eot"); + src: url("ClearSans-Regular-webfont.eot?#iefix") format("embedded-opentype"), + url("ClearSans-Regular-webfont.svg#clear_sansregular") format("svg"), + url("ClearSans-Regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: "Clear Sans"; + src: url("ClearSans-Bold-webfont.eot"); + src: url("ClearSans-Bold-webfont.eot?#iefix") format("embedded-opentype"), + url("ClearSans-Bold-webfont.svg#clear_sansbold") format("svg"), + url("ClearSans-Bold-webfont.woff") format("woff"); + font-weight: 700; + font-style: normal; +} + diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/helpers.scss b/deb/opt/apps/deepin-wine-runner/2048/style/helpers.scss new file mode 100644 index 0000000..72693ee --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/style/helpers.scss @@ -0,0 +1,82 @@ +// Exponent +// From: https://github.com/Team-Sass/Sassy-math/blob/master/sass/math.scss#L36 + +@function exponent($base, $exponent) { + // reset value + $value: $base; + // positive intergers get multiplied + @if $exponent > 1 { + @for $i from 2 through $exponent { + $value: $value * $base; } } + // negitive intergers get divided. A number divided by itself is 1 + @if $exponent < 1 { + @for $i from 0 through -$exponent { + $value: $value / $base; } } + // return the last value written + @return $value; +} + +@function pow($base, $exponent) { + @return exponent($base, $exponent); +} + +// Transition mixins +@mixin transition($args...) { + -webkit-transition: $args; + -moz-transition: $args; + transition: $args; +} + +@mixin transition-property($args...) { + -webkit-transition-property: $args; + -moz-transition-property: $args; + transition-property: $args; +} + +@mixin animation($args...) { + -webkit-animation: $args; + -moz-animation: $args; + animation: $args; +} + +@mixin animation-fill-mode($args...) { + -webkit-animation-fill-mode: $args; + -moz-animation-fill-mode: $args; + animation-fill-mode: $args; +} + +@mixin transform($args...) { + -webkit-transform: $args; + -moz-transform: $args; + -ms-transform: $args; + transform: $args; +} + +// Keyframe animations +@mixin keyframes($animation-name) { + @-webkit-keyframes $animation-name { + @content; + } + @-moz-keyframes $animation-name { + @content; + } + @keyframes $animation-name { + @content; + } +} + +// Media queries +@mixin smaller($width) { + @media screen and (max-width: $width) { + @content; + } +} + +// Clearfix +@mixin clearfix { + &:after { + content: ""; + display: block; + clear: both; + } +} diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/main.css b/deb/opt/apps/deepin-wine-runner/2048/style/main.css new file mode 100644 index 0000000..ea3cb19 --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/style/main.css @@ -0,0 +1,758 @@ +@import url(fonts/clear-sans.css); +html, body { + margin: 0; + padding: 0; + background: #faf8ef; + color: #776e65; + font-family: "Clear Sans", "Helvetica Neue", Arial, sans-serif; + font-size: 18px; } + +body { + margin: 80px 0; } + +.heading:after { + content: ""; + display: block; + clear: both; } + +h1.title { + font-size: 80px; + font-weight: bold; + margin: 0; + display: block; + float: left; } + +@-webkit-keyframes move-up { + 0% { + top: 25px; + opacity: 1; } + + 100% { + top: -50px; + opacity: 0; } } +@-moz-keyframes move-up { + 0% { + top: 25px; + opacity: 1; } + + 100% { + top: -50px; + opacity: 0; } } +@keyframes move-up { + 0% { + top: 25px; + opacity: 1; } + + 100% { + top: -50px; + opacity: 0; } } +.scores-container { + float: right; + text-align: right; } + +.score-container, .best-container { + position: relative; + display: inline-block; + background: #bbada0; + padding: 15px 25px; + font-size: 25px; + height: 25px; + line-height: 47px; + font-weight: bold; + border-radius: 3px; + color: white; + margin-top: 8px; + text-align: center; } + .score-container:after, .best-container:after { + position: absolute; + width: 100%; + top: 10px; + left: 0; + text-transform: uppercase; + font-size: 13px; + line-height: 13px; + text-align: center; + color: #eee4da; } + .score-container .score-addition, .best-container .score-addition { + position: absolute; + right: 30px; + color: red; + font-size: 25px; + line-height: 25px; + font-weight: bold; + color: rgba(119, 110, 101, 0.9); + z-index: 100; + -webkit-animation: move-up 600ms ease-in; + -moz-animation: move-up 600ms ease-in; + animation: move-up 600ms ease-in; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + animation-fill-mode: both; } + +.score-container:after { + content: "Score"; } + +.best-container:after { + content: "Best"; } + +p { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.65; } + +a { + color: #776e65; + font-weight: bold; + text-decoration: underline; + cursor: pointer; } + +strong.important { + text-transform: uppercase; } + +hr { + border: none; + border-bottom: 1px solid #d8d4d0; + margin-top: 20px; + margin-bottom: 30px; } + +.container { + width: 500px; + margin: 0 auto; } + +@-webkit-keyframes fade-in { + 0% { + opacity: 0; } + + 100% { + opacity: 1; } } +@-moz-keyframes fade-in { + 0% { + opacity: 0; } + + 100% { + opacity: 1; } } +@keyframes fade-in { + 0% { + opacity: 0; } + + 100% { + opacity: 1; } } +.game-container { + margin-top: 40px; + position: relative; + padding: 15px; + cursor: default; + -webkit-touch-callout: none; + -ms-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -ms-touch-action: none; + touch-action: none; + background: #bbada0; + border-radius: 6px; + width: 500px; + height: 500px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + .game-container .game-message { + display: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(238, 228, 218, 0.5); + z-index: 100; + text-align: center; + -webkit-animation: fade-in 800ms ease 1200ms; + -moz-animation: fade-in 800ms ease 1200ms; + animation: fade-in 800ms ease 1200ms; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + animation-fill-mode: both; } + .game-container .game-message p { + font-size: 60px; + font-weight: bold; + height: 60px; + line-height: 60px; + margin-top: 222px; } + .game-container .game-message .lower { + display: block; + margin-top: 59px; } + .game-container .game-message a { + display: inline-block; + background: #8f7a66; + border-radius: 3px; + padding: 0 20px; + text-decoration: none; + color: #f9f6f2; + height: 40px; + line-height: 42px; + margin-left: 9px; } + .game-container .game-message a.keep-playing-button { + display: none; } + .game-container .game-message.game-won { + background: rgba(237, 194, 46, 0.5); + color: #f9f6f2; } + .game-container .game-message.game-won a.keep-playing-button { + display: inline-block; } + .game-container .game-message.game-won, .game-container .game-message.game-over { + display: block; } + +.grid-container { + position: absolute; + z-index: 1; } + +.grid-row { + margin-bottom: 15px; } + .grid-row:last-child { + margin-bottom: 0; } + .grid-row:after { + content: ""; + display: block; + clear: both; } + +.grid-cell { + width: 106.25px; + height: 106.25px; + margin-right: 15px; + float: left; + border-radius: 3px; + background: rgba(238, 228, 218, 0.35); } + .grid-cell:last-child { + margin-right: 0; } + +.tile-container { + position: absolute; + z-index: 2; } + +.tile, .tile .tile-inner { + width: 107px; + height: 107px; + line-height: 107px; } +.tile.tile-position-1-1 { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); } +.tile.tile-position-1-2 { + -webkit-transform: translate(0px, 121px); + -moz-transform: translate(0px, 121px); + -ms-transform: translate(0px, 121px); + transform: translate(0px, 121px); } +.tile.tile-position-1-3 { + -webkit-transform: translate(0px, 242px); + -moz-transform: translate(0px, 242px); + -ms-transform: translate(0px, 242px); + transform: translate(0px, 242px); } +.tile.tile-position-1-4 { + -webkit-transform: translate(0px, 363px); + -moz-transform: translate(0px, 363px); + -ms-transform: translate(0px, 363px); + transform: translate(0px, 363px); } +.tile.tile-position-2-1 { + -webkit-transform: translate(121px, 0px); + -moz-transform: translate(121px, 0px); + -ms-transform: translate(121px, 0px); + transform: translate(121px, 0px); } +.tile.tile-position-2-2 { + -webkit-transform: translate(121px, 121px); + -moz-transform: translate(121px, 121px); + -ms-transform: translate(121px, 121px); + transform: translate(121px, 121px); } +.tile.tile-position-2-3 { + -webkit-transform: translate(121px, 242px); + -moz-transform: translate(121px, 242px); + -ms-transform: translate(121px, 242px); + transform: translate(121px, 242px); } +.tile.tile-position-2-4 { + -webkit-transform: translate(121px, 363px); + -moz-transform: translate(121px, 363px); + -ms-transform: translate(121px, 363px); + transform: translate(121px, 363px); } +.tile.tile-position-3-1 { + -webkit-transform: translate(242px, 0px); + -moz-transform: translate(242px, 0px); + -ms-transform: translate(242px, 0px); + transform: translate(242px, 0px); } +.tile.tile-position-3-2 { + -webkit-transform: translate(242px, 121px); + -moz-transform: translate(242px, 121px); + -ms-transform: translate(242px, 121px); + transform: translate(242px, 121px); } +.tile.tile-position-3-3 { + -webkit-transform: translate(242px, 242px); + -moz-transform: translate(242px, 242px); + -ms-transform: translate(242px, 242px); + transform: translate(242px, 242px); } +.tile.tile-position-3-4 { + -webkit-transform: translate(242px, 363px); + -moz-transform: translate(242px, 363px); + -ms-transform: translate(242px, 363px); + transform: translate(242px, 363px); } +.tile.tile-position-4-1 { + -webkit-transform: translate(363px, 0px); + -moz-transform: translate(363px, 0px); + -ms-transform: translate(363px, 0px); + transform: translate(363px, 0px); } +.tile.tile-position-4-2 { + -webkit-transform: translate(363px, 121px); + -moz-transform: translate(363px, 121px); + -ms-transform: translate(363px, 121px); + transform: translate(363px, 121px); } +.tile.tile-position-4-3 { + -webkit-transform: translate(363px, 242px); + -moz-transform: translate(363px, 242px); + -ms-transform: translate(363px, 242px); + transform: translate(363px, 242px); } +.tile.tile-position-4-4 { + -webkit-transform: translate(363px, 363px); + -moz-transform: translate(363px, 363px); + -ms-transform: translate(363px, 363px); + transform: translate(363px, 363px); } + +.tile { + position: absolute; + -webkit-transition: 100ms ease-in-out; + -moz-transition: 100ms ease-in-out; + transition: 100ms ease-in-out; + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + transition-property: transform; } + .tile .tile-inner { + border-radius: 3px; + background: #eee4da; + text-align: center; + font-weight: bold; + z-index: 10; + font-size: 55px; } + .tile.tile-2 .tile-inner { + background: #eee4da; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0), inset 0 0 0 1px rgba(255, 255, 255, 0); } + .tile.tile-4 .tile-inner { + background: #ede0c8; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0), inset 0 0 0 1px rgba(255, 255, 255, 0); } + .tile.tile-8 .tile-inner { + color: #f9f6f2; + background: #f2b179; } + .tile.tile-16 .tile-inner { + color: #f9f6f2; + background: #f59563; } + .tile.tile-32 .tile-inner { + color: #f9f6f2; + background: #f67c5f; } + .tile.tile-64 .tile-inner { + color: #f9f6f2; + background: #f65e3b; } + .tile.tile-128 .tile-inner { + color: #f9f6f2; + background: #edcf72; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.2381), inset 0 0 0 1px rgba(255, 255, 255, 0.14286); + font-size: 45px; } + @media screen and (max-width: 520px) { + .tile.tile-128 .tile-inner { + font-size: 25px; } } + .tile.tile-256 .tile-inner { + color: #f9f6f2; + background: #edcc61; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.31746), inset 0 0 0 1px rgba(255, 255, 255, 0.19048); + font-size: 45px; } + @media screen and (max-width: 520px) { + .tile.tile-256 .tile-inner { + font-size: 25px; } } + .tile.tile-512 .tile-inner { + color: #f9f6f2; + background: #edc850; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.39683), inset 0 0 0 1px rgba(255, 255, 255, 0.2381); + font-size: 45px; } + @media screen and (max-width: 520px) { + .tile.tile-512 .tile-inner { + font-size: 25px; } } + .tile.tile-1024 .tile-inner { + color: #f9f6f2; + background: #edc53f; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.47619), inset 0 0 0 1px rgba(255, 255, 255, 0.28571); + font-size: 35px; } + @media screen and (max-width: 520px) { + .tile.tile-1024 .tile-inner { + font-size: 15px; } } + .tile.tile-2048 .tile-inner { + color: #f9f6f2; + background: #edc22e; + box-shadow: 0 0 30px 10px rgba(243, 215, 116, 0.55556), inset 0 0 0 1px rgba(255, 255, 255, 0.33333); + font-size: 35px; } + @media screen and (max-width: 520px) { + .tile.tile-2048 .tile-inner { + font-size: 15px; } } + .tile.tile-super .tile-inner { + color: #f9f6f2; + background: #3c3a32; + font-size: 30px; } + @media screen and (max-width: 520px) { + .tile.tile-super .tile-inner { + font-size: 10px; } } + +@-webkit-keyframes appear { + 0% { + opacity: 0; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); } + + 100% { + opacity: 1; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); } } +@-moz-keyframes appear { + 0% { + opacity: 0; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); } + + 100% { + opacity: 1; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); } } +@keyframes appear { + 0% { + opacity: 0; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); } + + 100% { + opacity: 1; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); } } +.tile-new .tile-inner { + -webkit-animation: appear 200ms ease 100ms; + -moz-animation: appear 200ms ease 100ms; + animation: appear 200ms ease 100ms; + -webkit-animation-fill-mode: backwards; + -moz-animation-fill-mode: backwards; + animation-fill-mode: backwards; } + +@-webkit-keyframes pop { + 0% { + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); } + + 50% { + -webkit-transform: scale(1.2); + -moz-transform: scale(1.2); + -ms-transform: scale(1.2); + transform: scale(1.2); } + + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); } } +@-moz-keyframes pop { + 0% { + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); } + + 50% { + -webkit-transform: scale(1.2); + -moz-transform: scale(1.2); + -ms-transform: scale(1.2); + transform: scale(1.2); } + + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); } } +@keyframes pop { + 0% { + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); } + + 50% { + -webkit-transform: scale(1.2); + -moz-transform: scale(1.2); + -ms-transform: scale(1.2); + transform: scale(1.2); } + + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); } } +.tile-merged .tile-inner { + z-index: 20; + -webkit-animation: pop 200ms ease 100ms; + -moz-animation: pop 200ms ease 100ms; + animation: pop 200ms ease 100ms; + -webkit-animation-fill-mode: backwards; + -moz-animation-fill-mode: backwards; + animation-fill-mode: backwards; } + +.above-game:after { + content: ""; + display: block; + clear: both; } + +.game-intro { + float: left; + line-height: 42px; + margin-bottom: 0; } + +.restart-button { + display: inline-block; + background: #8f7a66; + border-radius: 3px; + padding: 0 20px; + text-decoration: none; + color: #f9f6f2; + height: 40px; + line-height: 42px; + display: block; + text-align: center; + float: right; } + +.game-explanation { + margin-top: 50px; } + +@media screen and (max-width: 520px) { + html, body { + font-size: 15px; } + + body { + margin: 20px 0; + padding: 0 20px; } + + h1.title { + font-size: 27px; + margin-top: 15px; } + + .container { + width: 280px; + margin: 0 auto; } + + .score-container, .best-container { + margin-top: 0; + padding: 15px 10px; + min-width: 40px; } + + .heading { + margin-bottom: 10px; } + + .game-intro { + width: 55%; + display: block; + box-sizing: border-box; + line-height: 1.65; } + + .restart-button { + width: 42%; + padding: 0; + display: block; + box-sizing: border-box; + margin-top: 2px; } + + .game-container { + margin-top: 17px; + position: relative; + padding: 10px; + cursor: default; + -webkit-touch-callout: none; + -ms-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -ms-touch-action: none; + touch-action: none; + background: #bbada0; + border-radius: 6px; + width: 280px; + height: 280px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + .game-container .game-message { + display: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(238, 228, 218, 0.5); + z-index: 100; + text-align: center; + -webkit-animation: fade-in 800ms ease 1200ms; + -moz-animation: fade-in 800ms ease 1200ms; + animation: fade-in 800ms ease 1200ms; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + animation-fill-mode: both; } + .game-container .game-message p { + font-size: 60px; + font-weight: bold; + height: 60px; + line-height: 60px; + margin-top: 222px; } + .game-container .game-message .lower { + display: block; + margin-top: 59px; } + .game-container .game-message a { + display: inline-block; + background: #8f7a66; + border-radius: 3px; + padding: 0 20px; + text-decoration: none; + color: #f9f6f2; + height: 40px; + line-height: 42px; + margin-left: 9px; } + .game-container .game-message a.keep-playing-button { + display: none; } + .game-container .game-message.game-won { + background: rgba(237, 194, 46, 0.5); + color: #f9f6f2; } + .game-container .game-message.game-won a.keep-playing-button { + display: inline-block; } + .game-container .game-message.game-won, .game-container .game-message.game-over { + display: block; } + + .grid-container { + position: absolute; + z-index: 1; } + + .grid-row { + margin-bottom: 10px; } + .grid-row:last-child { + margin-bottom: 0; } + .grid-row:after { + content: ""; + display: block; + clear: both; } + + .grid-cell { + width: 57.5px; + height: 57.5px; + margin-right: 10px; + float: left; + border-radius: 3px; + background: rgba(238, 228, 218, 0.35); } + .grid-cell:last-child { + margin-right: 0; } + + .tile-container { + position: absolute; + z-index: 2; } + + .tile, .tile .tile-inner { + width: 58px; + height: 58px; + line-height: 58px; } + .tile.tile-position-1-1 { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); } + .tile.tile-position-1-2 { + -webkit-transform: translate(0px, 67px); + -moz-transform: translate(0px, 67px); + -ms-transform: translate(0px, 67px); + transform: translate(0px, 67px); } + .tile.tile-position-1-3 { + -webkit-transform: translate(0px, 135px); + -moz-transform: translate(0px, 135px); + -ms-transform: translate(0px, 135px); + transform: translate(0px, 135px); } + .tile.tile-position-1-4 { + -webkit-transform: translate(0px, 202px); + -moz-transform: translate(0px, 202px); + -ms-transform: translate(0px, 202px); + transform: translate(0px, 202px); } + .tile.tile-position-2-1 { + -webkit-transform: translate(67px, 0px); + -moz-transform: translate(67px, 0px); + -ms-transform: translate(67px, 0px); + transform: translate(67px, 0px); } + .tile.tile-position-2-2 { + -webkit-transform: translate(67px, 67px); + -moz-transform: translate(67px, 67px); + -ms-transform: translate(67px, 67px); + transform: translate(67px, 67px); } + .tile.tile-position-2-3 { + -webkit-transform: translate(67px, 135px); + -moz-transform: translate(67px, 135px); + -ms-transform: translate(67px, 135px); + transform: translate(67px, 135px); } + .tile.tile-position-2-4 { + -webkit-transform: translate(67px, 202px); + -moz-transform: translate(67px, 202px); + -ms-transform: translate(67px, 202px); + transform: translate(67px, 202px); } + .tile.tile-position-3-1 { + -webkit-transform: translate(135px, 0px); + -moz-transform: translate(135px, 0px); + -ms-transform: translate(135px, 0px); + transform: translate(135px, 0px); } + .tile.tile-position-3-2 { + -webkit-transform: translate(135px, 67px); + -moz-transform: translate(135px, 67px); + -ms-transform: translate(135px, 67px); + transform: translate(135px, 67px); } + .tile.tile-position-3-3 { + -webkit-transform: translate(135px, 135px); + -moz-transform: translate(135px, 135px); + -ms-transform: translate(135px, 135px); + transform: translate(135px, 135px); } + .tile.tile-position-3-4 { + -webkit-transform: translate(135px, 202px); + -moz-transform: translate(135px, 202px); + -ms-transform: translate(135px, 202px); + transform: translate(135px, 202px); } + .tile.tile-position-4-1 { + -webkit-transform: translate(202px, 0px); + -moz-transform: translate(202px, 0px); + -ms-transform: translate(202px, 0px); + transform: translate(202px, 0px); } + .tile.tile-position-4-2 { + -webkit-transform: translate(202px, 67px); + -moz-transform: translate(202px, 67px); + -ms-transform: translate(202px, 67px); + transform: translate(202px, 67px); } + .tile.tile-position-4-3 { + -webkit-transform: translate(202px, 135px); + -moz-transform: translate(202px, 135px); + -ms-transform: translate(202px, 135px); + transform: translate(202px, 135px); } + .tile.tile-position-4-4 { + -webkit-transform: translate(202px, 202px); + -moz-transform: translate(202px, 202px); + -ms-transform: translate(202px, 202px); + transform: translate(202px, 202px); } + + .tile .tile-inner { + font-size: 35px; } + + .game-message p { + font-size: 30px !important; + height: 30px !important; + line-height: 30px !important; + margin-top: 90px !important; } + .game-message .lower { + margin-top: 30px !important; } } diff --git a/deb/opt/apps/deepin-wine-runner/2048/style/main.scss b/deb/opt/apps/deepin-wine-runner/2048/style/main.scss new file mode 100644 index 0000000..b0ec8da --- /dev/null +++ b/deb/opt/apps/deepin-wine-runner/2048/style/main.scss @@ -0,0 +1,549 @@ +@import "helpers"; +@import "fonts/clear-sans.css"; + +$field-width: 500px; +$grid-spacing: 15px; +$grid-row-cells: 4; +$tile-size: ($field-width - $grid-spacing * ($grid-row-cells + 1)) / $grid-row-cells; +$tile-border-radius: 3px; + +$mobile-threshold: $field-width + 20px; + +$text-color: #776E65; +$bright-text-color: #f9f6f2; + +$tile-color: #eee4da; +$tile-gold-color: #edc22e; +$tile-gold-glow-color: lighten($tile-gold-color, 15%); + +$game-container-margin-top: 40px; +$game-container-background: #bbada0; + +$transition-speed: 100ms; + +html, body { + margin: 0; + padding: 0; + + background: #faf8ef; + color: $text-color; + font-family: "Clear Sans", "Helvetica Neue", Arial, sans-serif; + font-size: 18px; +} + +body { + margin: 80px 0; +} + +.heading { + @include clearfix; +} + +h1.title { + font-size: 80px; + font-weight: bold; + margin: 0; + display: block; + float: left; +} + +@include keyframes(move-up) { + 0% { + top: 25px; + opacity: 1; + } + + 100% { + top: -50px; + opacity: 0; + } +} + +.scores-container { + float: right; + text-align: right; +} + +.score-container, .best-container { + $height: 25px; + + position: relative; + display: inline-block; + background: $game-container-background; + padding: 15px 25px; + font-size: $height; + height: $height; + line-height: $height + 22px; + font-weight: bold; + border-radius: 3px; + color: white; + margin-top: 8px; + text-align: center; + + &:after { + position: absolute; + width: 100%; + top: 10px; + left: 0; + text-transform: uppercase; + font-size: 13px; + line-height: 13px; + text-align: center; + color: $tile-color; + } + + .score-addition { + position: absolute; + right: 30px; + color: red; + font-size: $height; + line-height: $height; + font-weight: bold; + color: rgba($text-color, .9); + z-index: 100; + @include animation(move-up 600ms ease-in); + @include animation-fill-mode(both); + } +} + +.score-container:after { + content: "Score"; +} + +.best-container:after { + content: "Best"; +} + +p { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.65; +} + +a { + color: $text-color; + font-weight: bold; + text-decoration: underline; + cursor: pointer; +} + +strong { + &.important { + text-transform: uppercase; + } +} + +hr { + border: none; + border-bottom: 1px solid lighten($text-color, 40%); + margin-top: 20px; + margin-bottom: 30px; +} + +.container { + width: $field-width; + margin: 0 auto; +} + +@include keyframes(fade-in) { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +// Styles for buttons +@mixin button { + display: inline-block; + background: darken($game-container-background, 20%); + border-radius: 3px; + padding: 0 20px; + text-decoration: none; + color: $bright-text-color; + height: 40px; + line-height: 42px; +} + +// Game field mixin used to render CSS at different width +@mixin game-field { + .game-container { + margin-top: $game-container-margin-top; + position: relative; + padding: $grid-spacing; + + cursor: default; + -webkit-touch-callout: none; + -ms-touch-callout: none; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + + -ms-touch-action: none; + touch-action: none; + + background: $game-container-background; + border-radius: $tile-border-radius * 2; + width: $field-width; + height: $field-width; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + + .game-message { + display: none; + + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba($tile-color, .5); + z-index: 100; + + text-align: center; + + p { + font-size: 60px; + font-weight: bold; + height: 60px; + line-height: 60px; + margin-top: 222px; + // height: $field-width; + // line-height: $field-width; + } + + .lower { + display: block; + margin-top: 59px; + } + + a { + @include button; + margin-left: 9px; + // margin-top: 59px; + + &.keep-playing-button { + display: none; + } + } + + @include animation(fade-in 800ms ease $transition-speed * 12); + @include animation-fill-mode(both); + + &.game-won { + background: rgba($tile-gold-color, .5); + color: $bright-text-color; + + a.keep-playing-button { + display: inline-block; + } + } + + &.game-won, &.game-over { + display: block; + } + } + } + + .grid-container { + position: absolute; + z-index: 1; + } + + .grid-row { + margin-bottom: $grid-spacing; + + &:last-child { + margin-bottom: 0; + } + + &:after { + content: ""; + display: block; + clear: both; + } + } + + .grid-cell { + width: $tile-size; + height: $tile-size; + margin-right: $grid-spacing; + float: left; + + border-radius: $tile-border-radius; + + background: rgba($tile-color, .35); + + &:last-child { + margin-right: 0; + } + } + + .tile-container { + position: absolute; + z-index: 2; + } + + .tile { + &, .tile-inner { + width: ceil($tile-size); + height: ceil($tile-size); + line-height: ceil($tile-size); + } + + // Build position classes + @for $x from 1 through $grid-row-cells { + @for $y from 1 through $grid-row-cells { + &.tile-position-#{$x}-#{$y} { + $xPos: floor(($tile-size + $grid-spacing) * ($x - 1)); + $yPos: floor(($tile-size + $grid-spacing) * ($y - 1)); + @include transform(translate($xPos, $yPos)); + } + } + } + } +} + +// End of game-field mixin +@include game-field; + +.tile { + position: absolute; // Makes transforms relative to the top-left corner + + .tile-inner { + border-radius: $tile-border-radius; + + background: $tile-color; + text-align: center; + font-weight: bold; + z-index: 10; + + font-size: 55px; + } + + // Movement transition + @include transition($transition-speed ease-in-out); + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + transition-property: transform; + + $base: 2; + $exponent: 1; + $limit: 11; + + // Colors for all 11 states, false = no special color + $special-colors: false false, // 2 + false false, // 4 + #f78e48 true, // 8 + #fc5e2e true, // 16 + #ff3333 true, // 32 + #ff0000 true, // 64 + false true, // 128 + false true, // 256 + false true, // 512 + false true, // 1024 + false true; // 2048 + + // Build tile colors + @while $exponent <= $limit { + $power: pow($base, $exponent); + + &.tile-#{$power} .tile-inner { + // Calculate base background color + $gold-percent: ($exponent - 1) / ($limit - 1) * 100; + $mixed-background: mix($tile-gold-color, $tile-color, $gold-percent); + + $nth-color: nth($special-colors, $exponent); + + $special-background: nth($nth-color, 1); + $bright-color: nth($nth-color, 2); + + @if $special-background { + $mixed-background: mix($special-background, $mixed-background, 55%); + } + + @if $bright-color { + color: $bright-text-color; + } + + // Set background + background: $mixed-background; + + // Add glow + $glow-opacity: max($exponent - 4, 0) / ($limit - 4); + + @if not $special-background { + box-shadow: 0 0 30px 10px rgba($tile-gold-glow-color, $glow-opacity / 1.8), + inset 0 0 0 1px rgba(white, $glow-opacity / 3); + } + + // Adjust font size for bigger numbers + @if $power >= 100 and $power < 1000 { + font-size: 45px; + + // Media queries placed here to avoid carrying over the rest of the logic + @include smaller($mobile-threshold) { + font-size: 25px; + } + } @else if $power >= 1000 { + font-size: 35px; + + @include smaller($mobile-threshold) { + font-size: 15px; + } + } + } + + $exponent: $exponent + 1; + } + + // Super tiles (above 2048) + &.tile-super .tile-inner { + color: $bright-text-color; + background: mix(#333, $tile-gold-color, 95%); + + font-size: 30px; + + @include smaller($mobile-threshold) { + font-size: 10px; + } + } +} + +@include keyframes(appear) { + 0% { + opacity: 0; + @include transform(scale(0)); + } + + 100% { + opacity: 1; + @include transform(scale(1)); + } +} + +.tile-new .tile-inner { + @include animation(appear 200ms ease $transition-speed); + @include animation-fill-mode(backwards); +} + +@include keyframes(pop) { + 0% { + @include transform(scale(0)); + } + + 50% { + @include transform(scale(1.2)); + } + + 100% { + @include transform(scale(1)); + } +} + +.tile-merged .tile-inner { + z-index: 20; + @include animation(pop 200ms ease $transition-speed); + @include animation-fill-mode(backwards); +} + +.above-game { + @include clearfix; +} + +.game-intro { + float: left; + line-height: 42px; + margin-bottom: 0; +} + +.restart-button { + @include button; + display: block; + text-align: center; + float: right; +} + +.game-explanation { + margin-top: 50px; +} + +@include smaller($mobile-threshold) { + // Redefine variables for smaller screens + $field-width: 280px; + $grid-spacing: 10px; + $grid-row-cells: 4; + $tile-size: ($field-width - $grid-spacing * ($grid-row-cells + 1)) / $grid-row-cells; + $tile-border-radius: 3px; + $game-container-margin-top: 17px; + + html, body { + font-size: 15px; + } + + body { + margin: 20px 0; + padding: 0 20px; + } + + h1.title { + font-size: 27px; + margin-top: 15px; + } + + .container { + width: $field-width; + margin: 0 auto; + } + + .score-container, .best-container { + margin-top: 0; + padding: 15px 10px; + min-width: 40px; + } + + .heading { + margin-bottom: 10px; + } + + // Show intro and restart button side by side + .game-intro { + width: 55%; + display: block; + box-sizing: border-box; + line-height: 1.65; + } + + .restart-button { + width: 42%; + padding: 0; + display: block; + box-sizing: border-box; + margin-top: 2px; + } + + // Render the game field at the right width + @include game-field; + + // Rest of the font-size adjustments in the tile class + .tile .tile-inner { + font-size: 35px; + } + + .game-message { + p { + font-size: 30px !important; + height: 30px !important; + line-height: 30px !important; + margin-top: 90px !important; + } + + .lower { + margin-top: 30px !important; + } + } +} diff --git a/deb/opt/apps/deepin-wine-runner/AutoConfig.py b/deb/opt/apps/deepin-wine-runner/AutoConfig.py index 258d5a1..bad7e36 100755 --- a/deb/opt/apps/deepin-wine-runner/AutoConfig.py +++ b/deb/opt/apps/deepin-wine-runner/AutoConfig.py @@ -378,7 +378,7 @@ def UpdateFen(): uploadList = [] for i in range(now + 2, now - 1, -1): print(f"第 {i + 1} 条评论:") - info = requests.get(f"https://code.gitlink.org.cn/gfdgd-xi-org/bashpinlun/raw/branch/master/{urllib.request.quote(fileName)}/pf-{i}.txt").text.strip() + info = requests.get(f"https://code.gitlink.org.cn/gfdgd-xi/bashpinlun/raw/branch/master/{urllib.request.quote(fileName)}/pf-{i}.txt").text.strip() print(info) uploadList.append([f"用户{i + 1}", i + 1, info]) #ProgramRunStatusShow.pingLunLayout.removeItem(ProgramRunStatusShow.pingLunLayout.itemAt(2)) diff --git a/deb/opt/apps/deepin-wine-runner/VM/VirtualMachine b/deb/opt/apps/deepin-wine-runner/VM/VirtualMachine index 7541d44..a431fab 100755 Binary files a/deb/opt/apps/deepin-wine-runner/VM/VirtualMachine and b/deb/opt/apps/deepin-wine-runner/VM/VirtualMachine differ diff --git a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner index 45112f1..c656f41 100755 --- a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner +++ b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner @@ -1667,6 +1667,7 @@ class ProgramSetting(): buildByBottleName = None autoPath = None qemuUnmountHome = None + chineseLanguage = None def ShowWindow(): ProgramSetting.message = QtWidgets.QMainWindow() widget = QtWidgets.QWidget() @@ -1684,6 +1685,7 @@ class ProgramSetting(): widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "图标生成:")), 10, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "自动根据EXE名称生成路径:")), 11, 0, 1, 1) widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "Qemu + Chroot 挂载用户目录:")), 12, 0, 1, 1) + widgetLayout.addWidget(QtWidgets.QLabel(transla.transe("U", "程序翻译:")), 13, 0, 1, 1) ProgramSetting.wineBottonA = QtWidgets.QComboBox() ProgramSetting.wineDebug = QtWidgets.QCheckBox(transla.transe("U", "开启 DEBUG 输出")) ProgramSetting.defultWine = QtWidgets.QComboBox() @@ -1705,6 +1707,7 @@ class ProgramSetting(): ProgramSetting.buildByBottleName = QtWidgets.QCheckBox(transla.transe("U", "本软件构建的图标后面添加容器名")) ProgramSetting.autoPath = QtWidgets.QCheckBox(transla.transe("U", "自动根据文件名生成容器路径(开启后必须通过修改默认wine容器路径才可指定其它路径,重启程序后生效)")) ProgramSetting.qemuUnmountHome = QtWidgets.QCheckBox(transla.transe("U", "使用 Qemu + Chroot 时不挂载用户目录并与系统隔离(修改后重启操作系统生效)")) + ProgramSetting.chineseLanguage = QtWidgets.QCheckBox(transla.transe("U", "禁用程序界面翻译")) ProgramSetting.wineBottonA.addItems(["Auto", "win32", "win64"]) ProgramSetting.wineBottonA.setCurrentText(setting["Architecture"]) ProgramSetting.wineDebug.setChecked(setting["Debug"]) @@ -1719,6 +1722,7 @@ class ProgramSetting(): ProgramSetting.buildByBottleName.setChecked(setting["BuildByBottleName"]) ProgramSetting.autoPath.setChecked(setting["AutoPath"]) ProgramSetting.qemuUnmountHome.setChecked(setting["QemuUnMountHome"]) + ProgramSetting.chineseLanguage.setChecked(setting["Chinese"]) # QemuUnMountHome widgetLayout.addWidget(ProgramSetting.wineBottonA, 0, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.wineDebug, 1, 1, 1, 1) @@ -1735,7 +1739,8 @@ class ProgramSetting(): widgetLayout.addWidget(ProgramSetting.buildByBottleName, 10, 1, 1, 1) widgetLayout.addWidget(ProgramSetting.autoPath, 11, 1, 1, 2) widgetLayout.addWidget(ProgramSetting.qemuUnmountHome, 12, 1, 1, 2) - widgetLayout.addWidget(save, 13, 2, 1, 1) + widgetLayout.addWidget(ProgramSetting.chineseLanguage, 13, 1, 1, 2) + widgetLayout.addWidget(save, 14, 2, 1, 1) widget.setLayout(widgetLayout) ProgramSetting.message.setCentralWidget(widget) ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath)) @@ -1766,6 +1771,7 @@ class ProgramSetting(): setting["BuildByBottleName"] = ProgramSetting.buildByBottleName.isChecked() setting["AutoPath"] = ProgramSetting.autoPath.isChecked() setting["QemuUnMountHome"] = ProgramSetting.qemuUnmountHome.isChecked() + setting["Chinese"] = ProgramSetting.chineseLanguage.isChecked() try: write_txt(get_home() + "/.config/deepin-wine-runner/WineSetting.json", json.dumps(setting)) except: @@ -1914,11 +1920,12 @@ def GetNewInformation(): text = requests.get("https://code.gitlink.org.cn/gfdgd_xi/wine-runner-list/raw/branch/master/information/index.html").text except: traceback.print_exc() - text = """

无法连接到服务器

+ text = f"""

无法连接到服务器


你可以尝试:

-

1. 判断使用的是否使用吾爱版本,如果使用吾爱版本则无法连接

-

2. 判断是否能正常连接网络

""" +

1. 判断是否能正常连接网络

+

2. 作者的服务出问题了?(到这反馈:https://gitee.com/gfdgd-xi/deep-wine-runner/issues

+

3. 玩个游戏解闷下

""" global webInformation if bad: webInformation = QtWidgets.QTextBrowser() @@ -1987,13 +1994,12 @@ class GetVersionThread(QtCore.QThread): # Gitee/Github……:正常版本 # Docker 版本 programVersionTypeLnk = { - "spark": "星火应用商店版本", - "uos": "deepin/UOS 应用商店版本<带签名>" + "spark": "普通版本", + "uos": "普通版本" } # 直接判断是不是 Docker 版本 if os.path.exists(f"{programPath}/docker.txt") or os.path.exists("/.dockerenv"): - programVersionType = "Docker/Chroot 内置版本" - window.setWindowTitle(f"{title} (Docker/Chroot 内置版本)") + programVersionType = "普通版本" self.signal.emit("") else: programVersionType = "从源码运行的版本" @@ -2005,14 +2011,12 @@ class GetVersionThread(QtCore.QThread): package = False for i in range(0, len(fileName)): if fileName[i] == "Package: spark-deepin-wine-runner-docker": - programVersionType = "Docker 内置版本" - window.setWindowTitle(f"{title} (Docker 内置版本)") + programVersionType = "普通版本" #AddDockerMenu() self.signal.emit("") break if fileName[i] == "Package: spark-deepin-wine-runner-52": - programVersionType = "吾爱专版" - window.setWindowTitle(f"{title}(吾爱专版)") + programVersionType = "普通版本" newPackage = False break if fileName[i] == "Package: spark-deepin-wine-runner": @@ -2033,7 +2037,7 @@ class GetVersionThread(QtCore.QThread): version = fileName[i][fileName[i].index(":") + 1:].strip() print(f"版本号为:{version}") if not "-" in version: - programVersionType = "从Gitee/Github/Gitlink等平台获取的版本" + programVersionType = "普通版本" break programVersionType = version[version.index("-") + 1:] print(programVersionType) @@ -2043,7 +2047,7 @@ class GetVersionThread(QtCore.QThread): try: programVersionType = programVersionTypeLnk[programVersionType] except: - programVersionType = "从Gitee/Github/Gitlink等平台获取的版本" + programVersionType = "普通版本" break except: traceback.print_exc() @@ -2151,7 +2155,8 @@ defultProgramList = { "MustRead": False, "BuildByBottleName": False, "AutoPath": False, - "QemuUnMountHome": False + "QemuUnMountHome": False, + "Chinese": True } if not os.path.exists(get_home() + "/.config/"): # 如果没有配置文件夹 os.mkdir(get_home() + "/.config/") # 创建配置文件夹 @@ -2327,6 +2332,18 @@ try: wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine64" canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64") untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64") + if os.path.exists(f"{programPath}/wine/{i}/bin/wine-i386"): + wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-i386"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine-i386" + canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-i386") + untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-i386") + if os.path.exists(f"{programPath}/wine/{i}/bin/wine-aarch64"): + wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-aarch64"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine-aarch64" + canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-aarch64") + untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-aarch64") + if os.path.exists(f"{programPath}/wine/{i}/bin/wine-x86_64"): + wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-x86_64"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine-x86_64" + canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-x86_64") + untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-x86_64") except: pass try: @@ -2353,7 +2370,7 @@ print(wine) # 程序信息 ########################### # 语言载入 -if not "zh_CN".lower() in get_now_lang().lower(): +if not "zh_CN".lower() in get_now_lang().lower() and not setting["Chinese"]: transla = Trans("en_US", f"{programPath}/trans/deepin-wine-runner.json") else: transla = Trans("zh_CN") @@ -2382,20 +2399,27 @@ exe路径\' 参数 \' 千万不要中断后不删除源的情况下 apt upgrade !!!中断后只需重新打开脚本输入 repair 或者随意安装一个 Wine(会自动执行恢复操作)即可 以及此脚本安装的 Wine 无法保证 100% 能使用,以及副作用是会提示; N: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。''') -updateThingsString = transla.transe("U", '''※1、不基于生态适配脚本打包器支持禁用 Mono/Gecko 打包器; -※2、自动容器配置脚本新增命令 decompressionbottle、programforum、installmsi 以及上述命令的帮助; -※3、自动容器配置脚本新增评论功能; -※4、自动容器配置脚本新增许多应用安装脚本; -※5、安装 Windows 虚拟机功能更换应答镜像图标并添加常用 Windows 组件安装功能; -※6、安装 Windows 虚拟机功能提供镜像下载的网盘链接; -※7、简易打包器支持自动添加宋体; -8、修复 installfont 命令下载的字体目录错误问题; -9、修复提交日志功能在提交成功时依旧提示提交失败问题; -10、支持强制启用所有被禁用的组件(不推荐)。 +updateThingsString = transla.transe("U", '''※1、Windows 应用适配工具新增系统资源显示; +※2、Windows 应用适配工具使用 C++ 重写; +※3、修复打包器(基于官方生态适配脚本)无法打开的问题; +※4、新增运行库功能安装,以实现使用 Qemu User 跨架构运行 Wine 的功能(理论上支持 3a4000 了,但没试过); +※5、修复 Chroot 容器的一些问题; +※6、修复在 Debian11 安装时缺失依赖 rar 的问题; +※7、新增安装 box86、box64 的功能; +※8、修复故障反馈功能错误的问题; +※9、支持调用 Flatpak 安装的 Wine; +10、修改程序内的部分网址; +11、作者信息变更; +12、支持禁用程序的多语言支持(默认禁用,因为是机翻的); +13、支持在程序本地翻译缺失的情况下自动机翻缺失语句; +14、从此版本开始不再区分吾爱版、Spark 版和 UOS 版; +15、新增下载量查询; +16、更新程序公告; +17、新增断网彩蛋。 ''') for i in information["Thank"]: thankText += f"{i}\n" -updateTime = "2023年01月06日" +updateTime = "2023年03月19日" aboutProgram = transla.transe("U", """

Wine运行器是一个能让Linux用户更加方便地运行Windows应用的程序,内置了对Wine图形化的支持、各种Wine工具、自制的Wine程序打包器和运行库安装工具等。

它同时还内置了基于VirtualBox制作的、专供小白使用的Windows虚拟机安装工具,可以做到只需下载系统镜像并点击安装即可,无需考虑虚拟机的安装、创建、分区等操作。

@@ -2433,6 +2457,7 @@ Qt 版本:{QtCore.qVersion()}
 
星火应用商店:https://spark-app.store/
 Deepin 官网:https://www.deepin.org
 Deepin 论坛:https://bbs.deepin.org
+gfdgd xi:https://gfdgd-xi.github.io
 

©2020~{time.strftime("%Y")} By gfdgd xi、为什么您不喜欢熊出没和阿布呢

''' title = "Wine 运行器 {}".format(version) @@ -2628,6 +2653,7 @@ installWineOnDeepin23Alpha = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/ installWineHQ = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/wine.png"), transla.transe("U", "安装 WineHQ")) installMoreWine = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/more-wine.png"), transla.transe("U", "安装更多 Wine")) downloadChrootBottle = QtWidgets.QAction(QtGui.QIcon(f"{programPath}/Icon/Function/CHROOT.png"), transla.transe("U", "下载 Chroot 容器")) +installBox86 = QtWidgets.QAction(QtGui.QIcon.fromTheme("box"), transla.transe("U", "安装 Box86")) p2 = QtWidgets.QAction(QtGui.QIcon.fromTheme("settings"), transla.transe("U", "设置程序(&S)")) enabledAll = QtWidgets.QAction(transla.transe("U", "强制启用所有被禁用的组件(不推荐)")) p3 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(47), transla.transe("U", "清空软件历史记录(&C)")) @@ -2640,6 +2666,7 @@ programmenu.addAction(installWineOnDeepin23Alpha) programmenu.addAction(installWineHQ) programmenu.addAction(installMoreWine) programmenu.addAction(downloadChrootBottle) +programmenu.addAction(installBox86) programmenu.addSeparator() programmenu.addAction(p2) programmenu.addAction(enabledAll) @@ -2657,6 +2684,7 @@ installMoreWine.triggered.connect(lambda: threading.Thread(target=os.system, arg downloadChrootBottle.triggered.connect(lambda: threading.Thread(target=os.system, args=[f"'{programPath}/QemuDownload.py'"]).start()) p2.triggered.connect(ProgramSetting.ShowWindow) enabledAll.triggered.connect(lambda: DisableButton(False)) +installBox86.triggered.connect(lambda: OpenTerminal(f"pkexec bash '{programPath}/InstallBox86.sh'")) p3.triggered.connect(CleanProgramHistory) cleanCache.triggered.connect(CleanProgramCache) cleanProgramUnuse.triggered.connect(CleanProgram) @@ -2899,6 +2927,34 @@ log.addAction(saveLogText) log.addAction(transLogText) log.addAction(uploadLogText) +actionList = [] +def AddLib(install: QtWidgets.QAction, uninstall, menu, info): + actionList.append(install) + actionList.append(uninstall) + install.triggered.connect(lambda: OpenTerminal(f"bash '{programPath}/InstallRuntime/{info}'")) + uninstall.triggered.connect(lambda: OpenTerminal(f"bash '{programPath}/InstallRuntime/remove/{info}'")) + menu.addAction(install) + menu.addAction(uninstall) + +if os.path.exists(f"{programPath}/InstallRuntime"): + installLib = menu.addMenu(transla.transe("U", "运行库")) + installQemuMenu = installLib.addMenu(transla.transe("U", "安装 Qemu User")) + installQemu = QtWidgets.QAction("安装 Qemu User") + removeQemu = QtWidgets.QAction("卸载 Qemu User") + installQemuMenu.addAction(installQemu) + installQemuMenu.addAction(removeQemu) + installQemu.triggered.connect(lambda: OpenTerminal(f"bash '{programPath}/InstallQemuUser.sh'")) + removeQemu.triggered.connect(lambda: OpenTerminal(f"bash '{programPath}/RemoveQemuUser.sh'")) + actionList = [] + nameList = {} + for i in os.listdir(f"{programPath}/InstallRuntime"): + if i[-3:] == ".sh": + print(f"检测到库 {os.path.splitext(i)[0]}") + + AddLib(QtWidgets.QAction(transla.transe("U", f"安装 {os.path.splitext(i)[0]} 运行库")), QtWidgets.QAction(transla.transe("U", f"卸载 {os.path.splitext(i)[0]} 运行库")), installLib.addMenu(transla.transe("U", f"运行库 {os.path.splitext(i)[0]}")), i) + + + qemuMenu = menu.addMenu(transla.transe("U", "容器(&C)")) unpackDeb = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(32), transla.transe("U", "解包 deb 提取容器")) qemuMenu.addAction(unpackDeb) @@ -2917,7 +2973,7 @@ wineRunnerHelp = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(2 h3 = QtWidgets.QAction(transla.transe("U", "更新内容")) h4 = QtWidgets.QAction(transla.transe("U", "鸣谢名单")) h5 = QtWidgets.QAction(transla.transe("U", "更新这个程序")) -programInformation = QtWidgets.QAction(transla.transe("U", "获取程序公告")) +programInformation = QtWidgets.QAction(transla.transe("U", "获取程序公告(也可以在这里看程序安装/打开量)")) h6 = QtWidgets.QAction(transla.transe("U", "反馈这个程序的建议和问题")) fenUpload = QtWidgets.QAction(transla.transe("U", "程序评分")) h7 = QtWidgets.QAction(QtWidgets.QApplication.style().standardIcon(9), transla.transe("U", "关于这个程序")) diff --git a/deb/opt/apps/deepin-wine-runner/information.json b/deb/opt/apps/deepin-wine-runner/information.json index 56c70ac..bc8fce0 100755 --- a/deb/opt/apps/deepin-wine-runner/information.json +++ b/deb/opt/apps/deepin-wine-runner/information.json @@ -1,5 +1,5 @@ { - "Version": "3.1.0", + "Version": "3.2.0", "Thank": [ "感谢 RacoonGX 的付出与贡献", "感谢 @Amber 编写的《使用wine运行器打包无安装包的软件》:https://bbs.deepin.org/post/247720", diff --git a/deb/opt/apps/deepin-wine-runner/package-script.zip b/deb/opt/apps/deepin-wine-runner/package-script.zip index 1ab81ce..77413f0 100755 Binary files a/deb/opt/apps/deepin-wine-runner/package-script.zip and b/deb/opt/apps/deepin-wine-runner/package-script.zip differ diff --git a/deb/opt/apps/deepin-wine-runner/req/__init__.py b/deb/opt/apps/deepin-wine-runner/req/__init__.py index f52e5c6..935bb7c 100755 --- a/deb/opt/apps/deepin-wine-runner/req/__init__.py +++ b/deb/opt/apps/deepin-wine-runner/req/__init__.py @@ -1,27 +1,28 @@ -# 此库用于实现 52 版不连接程序服务器 +# 此库用于实现 52 版不连接程序服务器(不再区分) import requests unConnect = False -with open("/var/lib/dpkg/status", "r") as i: - unConnect = "Package: spark-deepin-wine-runner-52" in open("/var/lib/dpkg/status", "r").read() -if unConnect: - print("52专版,将会无法连接服务器") +# 不再区分吾爱版 +#with open("/var/lib/dpkg/status", "r") as i: +# unConnect = "Package: spark-deepin-wine-runner-52" in open("/var/lib/dpkg/status", "r").read() +#if unConnect: +# print("52专版,将会无法连接服务器") class Respon: text = "" def get(url, timeout=None): # -> requests.Response: - if unConnect: + #if unConnect: # 全部 Url 都拦截 - raise Exception("52专版不支持连接服务器") + #raise Exception("52专版不支持连接服务器") if timeout == None: return requests.get(url) return requests.get(url, timeout=timeout) def post(url, data, timeout=None): - if unConnect: + #if unConnect: # 全部 Url 都拦截 - raise Exception("52专版不支持连接服务器") + # raise Exception("52专版不支持连接服务器") if timeout == None: return requests.post(url, data) return requests.post(url, data, timeout=timeout) \ No newline at end of file diff --git a/deb/opt/apps/deepin-wine-runner/trans/__init__.py b/deb/opt/apps/deepin-wine-runner/trans/__init__.py index 3f2ab23..d86e5b8 100644 --- a/deb/opt/apps/deepin-wine-runner/trans/__init__.py +++ b/deb/opt/apps/deepin-wine-runner/trans/__init__.py @@ -4,6 +4,13 @@ import json import requests import traceback +typeList = [ + "Auto", + "ZH_CN2JA", + "ZH_CN2KR", + "ZH_CN2EN" +] + class Trans(): isTrans = False unCloudTrans = False diff --git a/deb/opt/apps/deepin-wine-runner/trans/deepin-wine-runner.json b/deb/opt/apps/deepin-wine-runner/trans/deepin-wine-runner.json index 84d9b78..112d2a6 100644 --- a/deb/opt/apps/deepin-wine-runner/trans/deepin-wine-runner.json +++ b/deb/opt/apps/deepin-wine-runner/trans/deepin-wine-runner.json @@ -1 +1 @@ -{"快速启动": "Quick start", "请选择容器路径:": "Please select a container path:", "请选择要执行的程序(EXE、MSI或者命令):": "Please select the application that performs (EXE, MSI or command) :", "浏览": "browse", "请选择WINE版本:": "Please select a WINE version:", "高级功能": "Advanced features", "创建快捷方式(Desktop文件):": "Create a shortcut (Desktop file) :", "名称:": "Name:", "创建到桌面": "Create to the desktop", "创建到开始菜单": "Create to the start menu", "程序管理:": "Program management:", "提取图标": "Extract the icon", "窗口透明工具": "Transparent Windows tool", "卸载程序": "Uninstall program", "微型应用商店": "The micro app store", "获取该程序运行情况": "To get the program running situation", "检测静态下程序缺少DLL": "Test under static program lacks the DLL", "WINE配置:": "WINE configuration:", "配置容器": "Configuration of the container", "字体商店": "Font store", "RegShot": "RegShot", "星火wine配置": "The spark wine configuration", "自动/手动配置 Wine 容器": "Automatic/manual configuration Wine containers", "在此可以看到wine安装应用时的终端输出内容": "Here you can see the terminal output content of wine installation application", "运行程序": "To run the program", "终止程序": "To terminate the program", "终止指定容器的程序": "The designated container program", "程序(&P)": "Program (& P)", "安装 wine(&I)": "Install wine (& I)", "安装 wine(只限Deepin23 Preview)": "Install wine (only Deepin23 Preview)", "安装 wine(只限Deepin23 Alpha)": "Install wine (only Deepin23 Alpha)", "安装 WineHQ": "Install the WineHQ", "安装更多 Wine": "Install more Wine", "下载 Chroot 容器": "Download the Chroot container", "设置程序(&S)": "Setup (& S)", "清空软件历史记录(&C)": "Empty the software history (& C)", "清空软件缓存": "Empty the software cache", "删除程序组件": "Delete the component", "退出程序(&E)": "Exit the program (& E)", "Wine(&W)": "酒(易名)", "打开 Wine 容器目录": "Open the Wine container directory", "安装常见字体": "Common fonts installed", "安装自定义字体": "Install custom fonts", "删除选择的 Wine 容器": "Delete selected Wine vessel", "清理 Wine 容器(基于 Wine 适配活动脚本)": "Clean up the Wine containers (script) based on Wine adaptation activity", "Wine 快捷键映射": "Wine shortcut key mapping", "打包 wine 应用": "Wine packaging application", "使用官方 Wine 适配活动的脚本进行打包": "Using official script package Wine adaptation activities", "使用简易打包器进行打包(小白且无特殊需求建议使用这个)": "Using simple packaging machine for packaging (white and no special requirements for recommended this)", "从互联网获取DLL": "Get the DLL from the Internet", "从镜像获取DLL(只支持官方安装镜像,DOS内核如 Windows 95 暂不支持)": "Official from image acquisition DLL (only support the installation image, DOS kernel, such as Windows 95 temporary does not support)", "从 Geek Uninstaller 官网升级程序": "From the Geek Uninstaller website update", "删除部分 Wine 程序在启动器的快捷方式": "Delete some Wine program in a shortcut to the starter", "删除所有 Wine 程序在启动器的快捷方式": "Delete all Wine program in a shortcut to the starter", "在指定 Wine、容器安装组件": "In the designated Wine, container installation components", "在指定wine、指定容器安装 .net framework": "Container specified in the designated wine, install the.net framework", "在指定wine、指定容器安装 Visual Studio C++": "Specified in the designated wine, container install Visual Studio c + +", "在指定wine、指定容器安装 MSXML": "Install MSXML in designated wine, designated container", "在指定wine、指定容器安装 gecko": "In the designated wine, designated container installation gecko", "在指定wine、指定容器安装 mono": "Specified in the designated wine, container install mono", "在指定wine、指定容器安装 Visual Basic Runtime": "Container installation specified in the designated wine, Visual Basic Runtime", "在指定wine、指定容器安装其它运行库": "In the designated wine, designated container install other runtime", "在指定 Wine、容器运行基础应用": "In the designated Wine, container operation based applications", "打开指定wine、指定容器的控制面板": "Open the specified wine, the control panel of the specified container", "打开指定wine、指定容器的浏览器": "Open the specified wine, browser of the specified container", "打开指定wine、指定容器的注册表": "Open the specified wine, specify the registry of the vessel", "打开指定wine、指定容器的任务管理器": "Open the specified wine, specify the task manager of the vessel", "打开指定wine、指定容器的资源管理器": "Open the specified wine, specify the container resource manager", "打开指定wine、指定容器的关于 wine": "Open the specified wine, specify the vessel about wine", "设置 run_v3.sh 的文管为 Deepin 默认文管": "Set run_v3. Sh tube for Deepin tube by default", "设置 run_v3.sh 的文管为 Wine 默认文管": "Set run_v3. Sh tube for Wine tube by default", "重新安装 deepin-wine-helper": "Reinstall the deepin - wine - a helper", "使用winetricks打开指定容器": "Using winetricks open the specified container", "组件功能测试": "Component function test", "测试 Visual Basic 6 程序": "Test the Visual Basic 6 program", "测试 .net framework 程序": "Test the.net framework application", "测试 .net framework + Internet Explorer 程序": "Test the.net framework + Internet Explorer program", "启用/禁用功能": "Enable/disable function", "启用/禁用 opengl": "Enable/disable opengl", "开启 opengl": "Open the opengl", "禁用 opengl": "Disable the opengl", "安装/卸载 winbind": "Install/uninstall the winbind", "安装 winbind": "Install the winbind", "卸载 winbind": "Uninstall the winbind", "安装/卸载 DXVK": "Install/uninstall DXVK", "安装 DXVK": "Install DXVK", "卸载 DXVK": "Uninstall DXVK", "允许/禁止指定 wine 容器生成快捷方式": "Allowed/prohibited specified wine containers generated shortcuts", "允许指定 wine 容器生成快捷方式": "Allows you to specify wine containers generated shortcuts", "禁止指定 wine 容器生成快捷方式": "Designated wine containers generated shortcut is prohibited", "启用/禁用指定 wine 容器崩溃提示窗口": "Enable/disable specified wine containers collapse prompt window", "禁用指定 wine 容器崩溃提示窗口": "Disable specified wine containers collapse prompt window", "启用指定 wine 容器崩溃提示窗口": "Enable the specified wine containers collapse prompt window", "设置指定 Wine 容器代理": "Set the specified Wine vessel agent", "设置指定 wine 容器的代理": "Set the specified wine vessel agent", "禁用指定 wine 容器的代理": "Disable specified wine vessel agent", "函数顶替库列表": "Function library list", "导出函数顶替列表": "Export function list", "导入函数顶替列表": "The import function list", "编辑函数顶替库列表": "Edit function library list", "虚拟机(&V)": "The virtual machine (& V)", "使用 Virtualbox 虚拟机运行 Windows 应用": "Using Virtualbox virtual machine run Windows applications", "校验值计算(&S)": "Check value calculation (& S)", "MD5(&M)": "MD5(&M)", "SHA1(&M)": "SHA1(&M)", "Base64(建议小文件)(&B)": "Base64 (small files) proposed (& B)", "SHA256(&S)": "SHA256(谨此告知)", "SHA512(&S)": "SHA512(&S)", "云沙箱(&C)": "Cloud sandbox (& C)", "360 沙箱云": "360 the sandbox cloud", "微步云沙箱": "Micro step cloud sandbox", "VIRUSTOTAL": "VIRUSTOTAL", "日志(&L)": "Log (& L)", "查询 Dll": "Query the Dll", "日志分析": "Log analysis", "另存为日志": "Save as logs", "翻译日志(翻译后日志分析功能会故障)": "Translation log (translated will log analysis function failure)", "上传日志": "Upload the log", "容器(&C)": "The container (& C)", "解包 deb 提取容器": "Unpack the deb extraction container", "配置指定 Chroot 容器": "Configure Chroot container specified", "帮助(&H)": "Help (& H)", "查询程序在 Wine 的运行情况": "The operation of the query in the Wine", "程序官网": "The program's website", "小提示": "tip", "Wine运行器和Wine打包器傻瓜式使用教程(小白专用) By 鹤舞白沙": "Run Wine and Wine packaging machine fool (white) By using the tutorial crane dancing baisha", "更新内容": "Update the content", "谢明名单": "Iv list", "更新这个程序": "Update the program", "反馈这个程序的建议和问题": "Suggestions and feedback on this procedure", "关于这个程序": "About this program", "关于 Qt": "On Qt", "作者个人站": "The author stood", "程序论坛": "BBS program", "Gitee": "Gitee", "Github": "Github", "Gitlink": "Gitlink", "Gitlab": "Gitlab", "极狐": "A fox", "程序 Wiki": "Program the Wiki", "视频教程": "Video tutorial", "更多生态适配应用": "More ecological adaptation", "运行 Android 应用:UEngine 运行器": "Run Android applications: UEngine runner", "选择 Wine 容器版本:": "Choose the Wine container version:", "wine DEBUG 信息输出:": "Wine the DEBUG information output:", "默认 Wine:": "The default Wine:", "默认 Wine 容器:": "The default Wine container:", "使用终端打开:": "Use terminal to open:", "自定义 wine 参数:": "Custom wine parameters:", "程序主题:": "Program topics:", "Wine 默认 Mono 和 Gecko 安装器:": "Wine default Mono and Gecko installer:", "忽略未安装的 Wine:": "Ignore the Wine not installed:", "下载缓存:": "Download cache:", "图标生成:": "Icon to generate:", "自动根据EXE名称生成路径:": "Automatically generated path according to EXE name:", "开启 DEBUG 输出": "Open the DEBUG output", "保存": "save", "测试(重启后变回设置的主题)": "The theme of the test (back after restart set)", "使用终端打开(deepin 终端)": "Use terminal open (deepin terminal)", "屏蔽 Wine 默认 Mono 和 Gecko 安装器": "Shielding Wine default Mono and Gecko installer", "不显示未检测到的 Wine": "Don't show the Wine not detected", "开启下载缓存": "Open the download cache", "本软件构建的图标后面添加容器名": "Add container name behind the software build icon", "自动根据文件名生成容器路径(开启后必须通过修改默认wine容器路径才可指定其它路径,重启后生效)": "Automatic container path was generated according to the file name (open must by modifying the default after wine container path to specify other paths, to take effect after a restart)", "ISO镜像:": "ISO image:", "读取/挂载ISO镜像": "Read/mount the ISO image", "关闭/卸载ISO镜像": "Close/uninstall ISO image", "查找": "To find the", "保存到 wine 容器中": "Save the wine containers", "设置 wine 容器": "Set up the wine containers", "查找DLL\n(为空则代表不查找,\n将显示全部内容):": "Find the DLL\n(null represents not find,\nWill show all content) :", "提示:\n 目前本提取功能暂只支持 NT 内核系统的官方安装镜像,不支持读取 ghost 等第三方封装方式的安装镜像\n 以及不要拷贝/替换太多的 dll,否则可能会导致 wine 容器异常,以及不要替换 Wine 的核心 dll\n 最后,拷贝/替换 dll 后,建议点击下面“设置 wine 容器”按钮==》函数库 进行设置\n当前选择的 Wine 容器:/home/gfdgd_xi/.wine": "Tip:\nCurrently used to extract features of this temporary support only official installation image, NT kernel system does not support read ghost third party packaging approaches such as the installation image\nAnd don't copy/replace the DLL too much, otherwise it may cause the wine vessel abnormalities, and not to replace the wine at the core of the DLL\nFinally, after copy/replace the DLL, it is recommended that the click \"Settings\" wine containers below button = = \"function library to set\nThe currently selected Wine container: / home/gfdgd_xi /. Wine", "常见 Linux 发行版": "Common Linux distributions", "

提示:

\n1、使用终端运行该程序,可以看到 wine 以及程序本身的提示和报错;\n2、wine 32 位和 64 位的容器互不兼容;\n3、所有的 wine 和 winetricks 均需要自行安装(可以从 菜单栏=>程序 里面进行安装);\n4、本程序支持带参数运行 wine 程序(之前版本也可以),只需要按以下格式即可:\nexe路径' 参数 '\n即可(单引号需要输入);\n5、wine 容器如果没有指定,则会默认为 ~/.wine;\n6、如果可执行文件比较大的话,会出现点击“获取该程序运行情况”出现假死的情况,因为正在后台读取 SHA1,只需要等一下即可(读取速度依照您电脑处理速度、读写速度、可执行文件大小等有关);\n7、对于非 X86 的用户来说,请不要使用本程序自带的 Wine 安装程序和 Windows 虚拟机安装功能(检测到为非 X86 架构会自动禁用);\n8、如果非 X86 的用户的 UOS 专业版用户想要使用的话,只需要在应用商店安装一个 Wine 版本微信即可在本程序选择正确的 Wine 运行程序;\n9、在使用 linglong 包的 Wine 应用时,必须安装至少一个 linglong 的使用 Wine 软件包才会出现该选项,\n而程序识别到的 Wine 是按 linglong 的使用 Wine 软件包名的字母排序第一个的 Wine,且生成的容器不在用户目录下,而是在容器的用户目录下(~/.deepinwine、/tmp、桌面、下载、文档等被映射的目录除外),\n同理需要运行的 EXE 也必须在被映射的目录内;\n10、如果是使用 Deepin 23 的 Wine 安装脚本,请切记——安装过程会临时添加 Deepin 20 的 apt 源,不要中断安装以及\n千万不要中断后不删除源的情况下 apt upgrade !!!中断后只需重新打开脚本输入 repair 或者随意安装一个 Wine(会自动执行恢复操作)即可\n以及此脚本安装的 Wine 无法保证 100% 能使用,以及副作用是会提示;\nN: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。": "< h4 > tip: < / h4 >\n1, use terminal run the program, you can see wine as well as the program itself hints and error;\n2, wine containers of 32-bit and 64 - bit incompatible;\n3, need to install in all types of wine and winetricks (available from the menu bar = > application for installation);\n4, a parameter with this program run wine program (previous version), you just need to in the following format:\nExe path 'parameters'\n(single quotes need to input);\n5, wine containers if not specified, will default to ~ /. Wine;\n6, if the executable file is large, there will be a click on the \"get the program running situation\" suspended animation, because reading SHA1 backstage, you just need to wait (read speed according to your computer processing speed, to read and write speed and the executable file size, etc).\n7, for non-x86 user, please do not use this program with the Wine of the installer and install Windows virtual machine function (detected for the X86 architecture will be automatically disabled);\n8, if users of non-x86 UOS pro users want to use, only need to install a Wine in the app store version WeChat can choose the right Wine in the this program to run the program;\nSeptember and, when it is applied in Wine of linglong package must be installed at least one linglong using this option, Wine package will start\nAnd procedures to identify the Wine is according to the use of linglong Wine package name alphabetical order the first Wine, and generate the container is not in the user directory, but the user directory in the container (~ /. Deepinwine, / TMP, desktop, download, and document except mapped directory).\nSimilarly need to run the EXE also must be mapped directory;\n10, if is to use Deepin 23 Wine install script, please bear in mind - the installation process will temporarily add Deepin 20 apt source, installation and don't interrupt\nDon't delete after < b > don't interrupt source under the condition of apt upgrade!!!!!!\nAnd 100% can use this script installed Wine cannot be guaranteed, and the side effect is prompt;\n< code > N: since the warehouse 'https://community-packages.deepin.com/beige beige InRelease' does not support 'i386 architecture, skip the configuration file' main/binary - i386 / Packages' acquisition.", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持解压指定 deb 的内打包好的容器;\n5、优化 Wine 列表显示;\n6、优化非基于生态适配脚本的打包器内容自动填充功能;\n7、新增程序论坛和教程入口;\n8、优化程序文案\n": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support decompression specified deb packed in containers;\n5, optimization of Wine list;\n6, an optimization based on the ecological adaptation that pack the script content automatically filled function;\n7, new procedures BBS and tutorial entry;\n8, optimization of procedure document", "确定": "determine", "

Wine运行器是一个能让Linux用户更加方便地运行Windows应用的程序,内置了对Wine图形化的支持、各种Wine工具、自制的Wine程序打包器和运行库安装工具等。

\n

它同时还内置了基于VirtualBox制作的、专供小白使用的Windows虚拟机安装工具,可以做到只需下载系统镜像并点击安装即可,无需考虑虚拟机的安装、创建、分区等操作。

\n
\n\n一个图形化了如下命令的程序(最简单格式)\nenv WINEPREFIX=容器路径 wine(wine的路径) 可执行文件路径\n让你可以简易方便的使用 wine": "< p > Wine runner is a could make Linux users more convenient to run Windows application program, with built-in support for Wine graphical, all kinds of Wine packaging tools, homemade Wine program and runtime installation tools, etc.\n< p > it also has a built-in based on VirtualBox, meant for use by small white Windows virtual machine installation tools, can simply download the system image and click install, do not need to consider the installation of the virtual machine, such as creating, partition operation.\n
\nA graphical the program of the following commands (the simplest format)\n< code > env WINEPREFIX = wine container path (path) of wine executable file path < / code >\nLet the wine you can easy to use", "简易使用教程": "Simple to use the tutorial", "打包教程": "Packaging tutorial", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持解压指定 deb 的内打包好的容器;\n5、优化 Wine 列表显示;\n6、优化非基于生态适配脚本的打包器内容自动填充功能;\n7、新增程序论坛和教程入口;\n8、优化程序文案;\n9、新增日志翻译功能;\n10、程序进一步完善英语翻译(机翻);\n11、优化程序更新策略;\n": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support decompression specified deb packed in containers;\n5, optimization of Wine list;\n6, an optimization based on the ecological adaptation that pack the script content automatically filled function;\n7, new procedures BBS and tutorial entry;\n8, optimization copywriting program;\n9, new log function;\n10, program, we will further improve the English translation (machine);\n11, optimization program update strategy;", "更新(更新后需要自行手动重启程序)": "Need to manually restart the program after update (update)", "检查更新": "Check the update", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持解压指定 deb 的内打包好的容器;\n※5、优化 Wine 列表显示;\n※6、新增程序论坛和教程入口;\n7、优化非基于生态适配脚本的打包器内容自动填充功能;\n8、优化程序文案;\n9、新增日志翻译功能;\n10、程序进一步完善英语翻译(机翻);\n11、优化程序更新策略;\n12、新增程序评分功能。\n": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support decompression specified deb packed in containers;\n※ 5 optimize Wine list;\n※ 6 new BBS and tutorial entrance program;\n7, an optimization based on ecological adaptation that pack the script content automatically filled function;\n8, optimization copywriting program;\n9, new log function;\n10, program, we will further improve the English translation (machine);\n11, optimization program update strategy;\n12, new scoring function.", "程序评分": "Program ratings", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持解压指定 deb 的内打包好的容器;\n※5、优化 Wine 列表显示;\n※6、新增程序论坛和教程入口;\n7、优化非基于生态适配脚本的打包器内容自动填充功能;\n8、优化程序文案;\n9、新增日志翻译功能;\n10、程序进一步完善英语翻译(机翻);\n11、优化程序更新策略;\n12、优化日志分析功能;\n13、新增程序评分功能。\n": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support decompression specified deb packed in containers;\n※ 5 optimize Wine list;\n※ 6 new BBS and tutorial entrance program;\n7, an optimization based on ecological adaptation that pack the script content automatically filled function;\n8, optimization copywriting program;\n9, new log function;\n10, program, we will further improve the English translation (machine);\n11, optimization program update strategy;\n12, optimization of log analysis function;\n13, the new scoring function.", "获取程序公告": "Access to program announcement", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持在隔离的 Chroot 容器内运行 Wine;\n※5、支持解压指定 deb 的内打包好的容器;\n※6、优化 Wine 列表显示;\n※7、新增程序论坛和教程入口;\n※8、程序公告功能;\n※9、新增程序评分功能;\n※10、新增解包 deb 内 Wine 容器功能;\n※11、新增 Vkd3d Proton 安装功能,更新 dxvk 版本至 2.0.0;\n※12、新增程序菜单栏部分栏目图标;\n13、优化非基于生态适配脚本的打包器内容自动填充功能;\n14、优化程序文案;\n15、新增日志翻译功能;\n16、程序进一步完善英语翻译(机翻);\n17、优化程序更新策略;\n18、优化日志分析功能;\n19、优化程序 UI。": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support running in isolated Chroot container Wine;\n※ 5 support decompression specified deb packed in containers;\n※ 6 optimize Wine list;\n※ 7 new BBS and tutorial entrance program;\n※ 8 program announcement function;\n※ 9 new program grading function;\n※ 10 new unpacking deb Wine containers within the function;\n※ 11 new Vkd3d Proton installation function, update DXVK version to 2.0.0;\n※ 12 new program menu bar section column icon;\n13, an optimization based on the ecological adaptation that pack the script content automatically filled function;\n14, optimization copywriting program;\n15, new log function;\n16, program, we will further improve the English translation (machine);\n17, optimization program update strategy;\n18, optimization of log analysis function;\n19, optimization program UI.", "快捷方式管理工具": "Shortcut management tools", "run_v3.sh 管理": "Run_v3. Sh management", "安装/卸载 Vkd3d": "Install/uninstall Vkd3d", "安装 Vkd3d": "Install Vkd3d", "卸载 Vkd3d": "Uninstall Vkd3d", "启用/禁止指定 wine 容器生成快捷方式": "Enable/designated wine containers generated shortcut is prohibited", "启用/禁止指定 wine 容器创建文件关联": "Enable/designated wine containers to create file associations is prohibited", "允许指定 wine 容器创建文件关联": "Allows you to specify wine containers to create file associations", "禁止指定 wine 容器创建文件关联": "Designated wine containers to create file associations is prohibited", "※1、不基于生态适配脚本打包器支持禁用 Mono/Gecko 打包器;\n※2、自动容器配置脚本新增命令 decompressionbottle、programforum、installmsi 以及上述命令的帮助;\n※3、自动容器配置脚本新增评论功能;\n※4、自动容器配置脚本新增许多应用安装脚本;\n※5、安装 Windows 虚拟机功能更换应答镜像图标并添加常用 Windows 组件安装功能;\n※6、安装 Windows 虚拟机功能提供镜像下载的网盘链接;\n※7、简易打包器支持自动添加宋体;\n8、修复 installfont 命令下载的字体目录错误问题;\n9、修复提交日志功能在提交成功时依旧提示提交失败问题;\n10、支持强制启用所有被禁用的组件(不推荐)。\n": "※ 1 is not based on the ecological adaptation that packaging script support disabled Mono/Gecko packaging;\n※ 2 automatic container configuration script command new decompressionbottle, programforum, installmsi and the help of the above command;\n※ 3 container configuration script automatically add comments;\n※ 4 automatic container configuration script increased many application installation script;\n※ may install Windows virtual machine function change response mirror icon and add commonly used Windows component installation function;\n※ 6 install Windows virtual machine provides network backup image download links;\n※ 7 simple packaging machine support automatically add song typeface.\n8, repair installfont command to download the font directory error problem;\n9, repair the commit log function in submit success still prompt submit failure problem;\n10, support force enable all disabled components (not recommended).", "强制启用所有被禁用的组件(不推荐)": "Forced to enable all disabled components (not recommended)", "鸣谢名单": "Thanks to the list", "此为最新版本,无需更新": "This is the latest version, do not need to update"}
\ No newline at end of file
+{"快速启动": "Quick start", "请选择容器路径:": "Please select a container path:", "请选择要执行的程序(EXE、MSI或者命令):": "Please select the application that performs (EXE, MSI or command) :", "浏览": "browse", "请选择WINE版本:": "Please select a WINE version:", "高级功能": "Advanced features", "创建快捷方式(Desktop文件):": "Create a shortcut (Desktop file) :", "名称:": "Name:", "创建到桌面": "Create to the desktop", "创建到开始菜单": "Create to the start menu", "程序管理:": "Program management:", "提取图标": "Extract the icon", "窗口透明工具": "Transparent Windows tool", "卸载程序": "Uninstall program", "微型应用商店": "The micro app store", "获取该程序运行情况": "To get the program running situation", "检测静态下程序缺少DLL": "Test under static program lacks the DLL", "WINE配置:": "WINE configuration:", "配置容器": "Configuration of the container", "字体商店": "Font store", "RegShot": "RegShot", "星火wine配置": "The spark wine configuration", "自动/手动配置 Wine 容器": "Automatic/manual configuration Wine containers", "在此可以看到wine安装应用时的终端输出内容": "Here you can see the terminal output content of wine installation application", "运行程序": "To run the program", "终止程序": "To terminate the program", "终止指定容器的程序": "The designated container program", "程序(&P)": "Program (& P)", "安装 wine(&I)": "Install wine (& I)", "安装 wine(只限Deepin23 Preview)": "Install wine (only Deepin23 Preview)", "安装 wine(只限Deepin23 Alpha)": "Install wine (only Deepin23 Alpha)", "安装 WineHQ": "Install the WineHQ", "安装更多 Wine": "Install more Wine", "下载 Chroot 容器": "Download the Chroot container", "设置程序(&S)": "Setup (& S)", "清空软件历史记录(&C)": "Empty the software history (& C)", "清空软件缓存": "Empty the software cache", "删除程序组件": "Delete the component", "退出程序(&E)": "Exit the program (& E)", "Wine(&W)": "酒(易名)", "打开 Wine 容器目录": "Open the Wine container directory", "安装常见字体": "Common fonts installed", "安装自定义字体": "Install custom fonts", "删除选择的 Wine 容器": "Delete selected Wine vessel", "清理 Wine 容器(基于 Wine 适配活动脚本)": "Clean up the Wine containers (script) based on Wine adaptation activity", "Wine 快捷键映射": "Wine shortcut key mapping", "打包 wine 应用": "Wine packaging application", "使用官方 Wine 适配活动的脚本进行打包": "Using official script package Wine adaptation activities", "使用简易打包器进行打包(小白且无特殊需求建议使用这个)": "Using simple packaging machine for packaging (white and no special requirements for recommended this)", "从互联网获取DLL": "Get the DLL from the Internet", "从镜像获取DLL(只支持官方安装镜像,DOS内核如 Windows 95 暂不支持)": "Official from image acquisition DLL (only support the installation image, DOS kernel, such as Windows 95 temporary does not support)", "从 Geek Uninstaller 官网升级程序": "From the Geek Uninstaller website update", "删除部分 Wine 程序在启动器的快捷方式": "Delete some Wine program in a shortcut to the starter", "删除所有 Wine 程序在启动器的快捷方式": "Delete all Wine program in a shortcut to the starter", "在指定 Wine、容器安装组件": "In the designated Wine, container installation components", "在指定wine、指定容器安装 .net framework": "Container specified in the designated wine, install the.net framework", "在指定wine、指定容器安装 Visual Studio C++": "Specified in the designated wine, container install Visual Studio c + +", "在指定wine、指定容器安装 MSXML": "Install MSXML in designated wine, designated container", "在指定wine、指定容器安装 gecko": "In the designated wine, designated container installation gecko", "在指定wine、指定容器安装 mono": "Specified in the designated wine, container install mono", "在指定wine、指定容器安装 Visual Basic Runtime": "Container installation specified in the designated wine, Visual Basic Runtime", "在指定wine、指定容器安装其它运行库": "In the designated wine, designated container install other runtime", "在指定 Wine、容器运行基础应用": "In the designated Wine, container operation based applications", "打开指定wine、指定容器的控制面板": "Open the specified wine, the control panel of the specified container", "打开指定wine、指定容器的浏览器": "Open the specified wine, browser of the specified container", "打开指定wine、指定容器的注册表": "Open the specified wine, specify the registry of the vessel", "打开指定wine、指定容器的任务管理器": "Open the specified wine, specify the task manager of the vessel", "打开指定wine、指定容器的资源管理器": "Open the specified wine, specify the container resource manager", "打开指定wine、指定容器的关于 wine": "Open the specified wine, specify the vessel about wine", "设置 run_v3.sh 的文管为 Deepin 默认文管": "Set run_v3. Sh tube for Deepin tube by default", "设置 run_v3.sh 的文管为 Wine 默认文管": "Set run_v3. Sh tube for Wine tube by default", "重新安装 deepin-wine-helper": "Reinstall the deepin - wine - a helper", "使用winetricks打开指定容器": "Using winetricks open the specified container", "组件功能测试": "Component function test", "测试 Visual Basic 6 程序": "Test the Visual Basic 6 program", "测试 .net framework 程序": "Test the.net framework application", "测试 .net framework + Internet Explorer 程序": "Test the.net framework + Internet Explorer program", "启用/禁用功能": "Enable/disable function", "启用/禁用 opengl": "Enable/disable opengl", "开启 opengl": "Open the opengl", "禁用 opengl": "Disable the opengl", "安装/卸载 winbind": "Install/uninstall the winbind", "安装 winbind": "Install the winbind", "卸载 winbind": "Uninstall the winbind", "安装/卸载 DXVK": "Install/uninstall DXVK", "安装 DXVK": "Install DXVK", "卸载 DXVK": "Uninstall DXVK", "允许/禁止指定 wine 容器生成快捷方式": "Allowed/prohibited specified wine containers generated shortcuts", "允许指定 wine 容器生成快捷方式": "Allows you to specify wine containers generated shortcuts", "禁止指定 wine 容器生成快捷方式": "Designated wine containers generated shortcut is prohibited", "启用/禁用指定 wine 容器崩溃提示窗口": "Enable/disable specified wine containers collapse prompt window", "禁用指定 wine 容器崩溃提示窗口": "Disable specified wine containers collapse prompt window", "启用指定 wine 容器崩溃提示窗口": "Enable the specified wine containers collapse prompt window", "设置指定 Wine 容器代理": "Set the specified Wine vessel agent", "设置指定 wine 容器的代理": "Set the specified wine vessel agent", "禁用指定 wine 容器的代理": "Disable specified wine vessel agent", "函数顶替库列表": "Function library list", "导出函数顶替列表": "Export function list", "导入函数顶替列表": "The import function list", "编辑函数顶替库列表": "Edit function library list", "虚拟机(&V)": "The virtual machine (& V)", "使用 Virtualbox 虚拟机运行 Windows 应用": "Using Virtualbox virtual machine run Windows applications", "校验值计算(&S)": "Check value calculation (& S)", "MD5(&M)": "MD5(&M)", "SHA1(&M)": "SHA1(&M)", "Base64(建议小文件)(&B)": "Base64 (small files) proposed (& B)", "SHA256(&S)": "SHA256(谨此告知)", "SHA512(&S)": "SHA512(&S)", "云沙箱(&C)": "Cloud sandbox (& C)", "360 沙箱云": "360 the sandbox cloud", "微步云沙箱": "Micro step cloud sandbox", "VIRUSTOTAL": "VIRUSTOTAL", "日志(&L)": "Log (& L)", "查询 Dll": "Query the Dll", "日志分析": "Log analysis", "另存为日志": "Save as logs", "翻译日志(翻译后日志分析功能会故障)": "Translation log (translated will log analysis function failure)", "上传日志": "Upload the log", "容器(&C)": "The container (& C)", "解包 deb 提取容器": "Unpack the deb extraction container", "配置指定 Chroot 容器": "Configure Chroot container specified", "帮助(&H)": "Help (& H)", "查询程序在 Wine 的运行情况": "The operation of the query in the Wine", "程序官网": "The program's website", "小提示": "tip", "Wine运行器和Wine打包器傻瓜式使用教程(小白专用) By 鹤舞白沙": "Run Wine and Wine packaging machine fool (white) By using the tutorial crane dancing baisha", "更新内容": "Update the content", "谢明名单": "Iv list", "更新这个程序": "Update the program", "反馈这个程序的建议和问题": "Suggestions and feedback on this procedure", "关于这个程序": "About this program", "关于 Qt": "On Qt", "作者个人站": "The author stood", "程序论坛": "BBS program", "Gitee": "Gitee", "Github": "Github", "Gitlink": "Gitlink", "Gitlab": "Gitlab", "极狐": "A fox", "程序 Wiki": "Program the Wiki", "视频教程": "Video tutorial", "更多生态适配应用": "More ecological adaptation", "运行 Android 应用:UEngine 运行器": "Run Android applications: UEngine runner", "选择 Wine 容器版本:": "Choose the Wine container version:", "wine DEBUG 信息输出:": "Wine the DEBUG information output:", "默认 Wine:": "The default Wine:", "默认 Wine 容器:": "The default Wine container:", "使用终端打开:": "Use terminal to open:", "自定义 wine 参数:": "Custom wine parameters:", "程序主题:": "Program topics:", "Wine 默认 Mono 和 Gecko 安装器:": "Wine default Mono and Gecko installer:", "忽略未安装的 Wine:": "Ignore the Wine not installed:", "下载缓存:": "Download cache:", "图标生成:": "Icon to generate:", "自动根据EXE名称生成路径:": "Automatically generated path according to EXE name:", "开启 DEBUG 输出": "Open the DEBUG output", "保存": "save", "测试(重启后变回设置的主题)": "The theme of the test (back after restart set)", "使用终端打开(deepin 终端)": "Use terminal open (deepin terminal)", "屏蔽 Wine 默认 Mono 和 Gecko 安装器": "Shielding Wine default Mono and Gecko installer", "不显示未检测到的 Wine": "Don't show the Wine not detected", "开启下载缓存": "Open the download cache", "本软件构建的图标后面添加容器名": "Add container name behind the software build icon", "自动根据文件名生成容器路径(开启后必须通过修改默认wine容器路径才可指定其它路径,重启后生效)": "Automatic container path was generated according to the file name (open must by modifying the default after wine container path to specify other paths, to take effect after a restart)", "ISO镜像:": "ISO image:", "读取/挂载ISO镜像": "Read/mount the ISO image", "关闭/卸载ISO镜像": "Close/uninstall ISO image", "查找": "To find the", "保存到 wine 容器中": "Save the wine containers", "设置 wine 容器": "Set up the wine containers", "查找DLL\n(为空则代表不查找,\n将显示全部内容):": "Find the DLL\n(null represents not find,\nWill show all content) :", "提示:\n    目前本提取功能暂只支持 NT 内核系统的官方安装镜像,不支持读取 ghost 等第三方封装方式的安装镜像\n    以及不要拷贝/替换太多的 dll,否则可能会导致 wine 容器异常,以及不要替换 Wine 的核心 dll\n    最后,拷贝/替换 dll 后,建议点击下面“设置 wine 容器”按钮==》函数库 进行设置\n当前选择的 Wine 容器:/home/gfdgd_xi/.wine": "Tip:\nCurrently used to extract features of this temporary support only official installation image, NT kernel system does not support read ghost third party packaging approaches such as the installation image\nAnd don't copy/replace the DLL too much, otherwise it may cause the wine vessel abnormalities, and not to replace the wine at the core of the DLL\nFinally, after copy/replace the DLL, it is recommended that the click \"Settings\" wine containers below button = = \"function library to set\nThe currently selected Wine container: / home/gfdgd_xi /. Wine", "常见 Linux 发行版": "Common Linux distributions", "

提示:

\n1、使用终端运行该程序,可以看到 wine 以及程序本身的提示和报错;\n2、wine 32 位和 64 位的容器互不兼容;\n3、所有的 wine 和 winetricks 均需要自行安装(可以从 菜单栏=>程序 里面进行安装);\n4、本程序支持带参数运行 wine 程序(之前版本也可以),只需要按以下格式即可:\nexe路径' 参数 '\n即可(单引号需要输入);\n5、wine 容器如果没有指定,则会默认为 ~/.wine;\n6、如果可执行文件比较大的话,会出现点击“获取该程序运行情况”出现假死的情况,因为正在后台读取 SHA1,只需要等一下即可(读取速度依照您电脑处理速度、读写速度、可执行文件大小等有关);\n7、对于非 X86 的用户来说,请不要使用本程序自带的 Wine 安装程序和 Windows 虚拟机安装功能(检测到为非 X86 架构会自动禁用);\n8、如果非 X86 的用户的 UOS 专业版用户想要使用的话,只需要在应用商店安装一个 Wine 版本微信即可在本程序选择正确的 Wine 运行程序;\n9、在使用 linglong 包的 Wine 应用时,必须安装至少一个 linglong 的使用 Wine 软件包才会出现该选项,\n而程序识别到的 Wine 是按 linglong 的使用 Wine 软件包名的字母排序第一个的 Wine,且生成的容器不在用户目录下,而是在容器的用户目录下(~/.deepinwine、/tmp、桌面、下载、文档等被映射的目录除外),\n同理需要运行的 EXE 也必须在被映射的目录内;\n10、如果是使用 Deepin 23 的 Wine 安装脚本,请切记——安装过程会临时添加 Deepin 20 的 apt 源,不要中断安装以及\n千万不要中断后不删除源的情况下 apt upgrade !!!中断后只需重新打开脚本输入 repair 或者随意安装一个 Wine(会自动执行恢复操作)即可\n以及此脚本安装的 Wine 无法保证 100% 能使用,以及副作用是会提示;\nN: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。": "< h4 > tip: < / h4 >\n1, use terminal run the program, you can see wine as well as the program itself hints and error;\n2, wine containers of 32-bit and 64 - bit incompatible;\n3, need to install in all types of wine and winetricks (available from the menu bar = > application for installation);\n4, a parameter with this program run wine program (previous version), you just need to in the following format:\nExe path 'parameters'\n(single quotes need to input);\n5, wine containers if not specified, will default to ~ /. Wine;\n6, if the executable file is large, there will be a click on the \"get the program running situation\" suspended animation, because reading SHA1 backstage, you just need to wait (read speed according to your computer processing speed, to read and write speed and the executable file size, etc).\n7, for non-x86 user, please do not use this program with the Wine of the installer and install Windows virtual machine function (detected for the X86 architecture will be automatically disabled);\n8, if users of non-x86 UOS pro users want to use, only need to install a Wine in the app store version WeChat can choose the right Wine in the this program to run the program;\nSeptember and, when it is applied in Wine of linglong package must be installed at least one linglong using this option, Wine package will start\nAnd procedures to identify the Wine is according to the use of linglong Wine package name alphabetical order the first Wine, and generate the container is not in the user directory, but the user directory in the container (~ /. Deepinwine, / TMP, desktop, download, and document except mapped directory).\nSimilarly need to run the EXE also must be mapped directory;\n10, if is to use Deepin 23 Wine install script, please bear in mind - the installation process will temporarily add Deepin 20 apt source, installation and don't interrupt\nDon't delete after < b > don't interrupt source under the condition of apt upgrade!!!!!!\nAnd 100% can use this script installed Wine cannot be guaranteed, and the side effect is prompt;\n< code > N: since the warehouse 'https://community-packages.deepin.com/beige beige InRelease' does not support 'i386 architecture, skip the configuration file' main/binary - i386 / Packages' acquisition.", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持解压指定 deb 的内打包好的容器;\n5、优化 Wine 列表显示;\n6、优化非基于生态适配脚本的打包器内容自动填充功能;\n7、新增程序论坛和教程入口;\n8、优化程序文案\n": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support decompression specified deb packed in containers;\n5, optimization of Wine list;\n6, an optimization based on the ecological adaptation that pack the script content automatically filled function;\n7, new procedures BBS and tutorial entry;\n8, optimization of procedure document", "确定": "determine", "

Wine运行器是一个能让Linux用户更加方便地运行Windows应用的程序,内置了对Wine图形化的支持、各种Wine工具、自制的Wine程序打包器和运行库安装工具等。

\n

它同时还内置了基于VirtualBox制作的、专供小白使用的Windows虚拟机安装工具,可以做到只需下载系统镜像并点击安装即可,无需考虑虚拟机的安装、创建、分区等操作。

\n
\n\n一个图形化了如下命令的程序(最简单格式)\nenv WINEPREFIX=容器路径 wine(wine的路径) 可执行文件路径\n让你可以简易方便的使用 wine": "< p > Wine runner is a could make Linux users more convenient to run Windows application program, with built-in support for Wine graphical, all kinds of Wine packaging tools, homemade Wine program and runtime installation tools, etc.\n< p > it also has a built-in based on VirtualBox, meant for use by small white Windows virtual machine installation tools, can simply download the system image and click install, do not need to consider the installation of the virtual machine, such as creating, partition operation.\n
\nA graphical the program of the following commands (the simplest format)\n< code > env WINEPREFIX = wine container path (path) of wine executable file path < / code >\nLet the wine you can easy to use", "简易使用教程": "Simple to use the tutorial", "打包教程": "Packaging tutorial", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持解压指定 deb 的内打包好的容器;\n5、优化 Wine 列表显示;\n6、优化非基于生态适配脚本的打包器内容自动填充功能;\n7、新增程序论坛和教程入口;\n8、优化程序文案;\n9、新增日志翻译功能;\n10、程序进一步完善英语翻译(机翻);\n11、优化程序更新策略;\n": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support decompression specified deb packed in containers;\n5, optimization of Wine list;\n6, an optimization based on the ecological adaptation that pack the script content automatically filled function;\n7, new procedures BBS and tutorial entry;\n8, optimization copywriting program;\n9, new log function;\n10, program, we will further improve the English translation (machine);\n11, optimization program update strategy;", "更新(更新后需要自行手动重启程序)": "Need to manually restart the program after update (update)", "检查更新": "Check the update", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持解压指定 deb 的内打包好的容器;\n※5、优化 Wine 列表显示;\n※6、新增程序论坛和教程入口;\n7、优化非基于生态适配脚本的打包器内容自动填充功能;\n8、优化程序文案;\n9、新增日志翻译功能;\n10、程序进一步完善英语翻译(机翻);\n11、优化程序更新策略;\n12、新增程序评分功能。\n": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support decompression specified deb packed in containers;\n※ 5 optimize Wine list;\n※ 6 new BBS and tutorial entrance program;\n7, an optimization based on ecological adaptation that pack the script content automatically filled function;\n8, optimization copywriting program;\n9, new log function;\n10, program, we will further improve the English translation (machine);\n11, optimization program update strategy;\n12, new scoring function.", "程序评分": "Program ratings", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持解压指定 deb 的内打包好的容器;\n※5、优化 Wine 列表显示;\n※6、新增程序论坛和教程入口;\n7、优化非基于生态适配脚本的打包器内容自动填充功能;\n8、优化程序文案;\n9、新增日志翻译功能;\n10、程序进一步完善英语翻译(机翻);\n11、优化程序更新策略;\n12、优化日志分析功能;\n13、新增程序评分功能。\n": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support decompression specified deb packed in containers;\n※ 5 optimize Wine list;\n※ 6 new BBS and tutorial entrance program;\n7, an optimization based on ecological adaptation that pack the script content automatically filled function;\n8, optimization copywriting program;\n9, new log function;\n10, program, we will further improve the English translation (machine);\n11, optimization program update strategy;\n12, optimization of log analysis function;\n13, the new scoring function.", "获取程序公告": "Access to program announcement", "※1、支持使用 Qemu + Chroot 跨运行 Wine 以及指定程序的功能;\n※2、提供了简易打包器以用于打包简易 deb;\n※3、支持下载配置过的 Qemu + Chroot 容器;\n※4、支持在隔离的 Chroot 容器内运行 Wine;\n※5、支持解压指定 deb 的内打包好的容器;\n※6、优化 Wine 列表显示;\n※7、新增程序论坛和教程入口;\n※8、程序公告功能;\n※9、新增程序评分功能;\n※10、新增解包 deb 内 Wine 容器功能;\n※11、新增 Vkd3d Proton 安装功能,更新 dxvk 版本至 2.0.0;\n※12、新增程序菜单栏部分栏目图标;\n13、优化非基于生态适配脚本的打包器内容自动填充功能;\n14、优化程序文案;\n15、新增日志翻译功能;\n16、程序进一步完善英语翻译(机翻);\n17、优化程序更新策略;\n18、优化日志分析功能;\n19、优化程序 UI。": "※ 1 support using Qemu + Chroot run across the Wine and the function of the designated procedures;\n※ 2 provides a simple packaging machine for packaging simple deb;\n※ 3 support download Qemu + Chroot container configuration before;\n※ 4 support running in isolated Chroot container Wine;\n※ 5 support decompression specified deb packed in containers;\n※ 6 optimize Wine list;\n※ 7 new BBS and tutorial entrance program;\n※ 8 program announcement function;\n※ 9 new program grading function;\n※ 10 new unpacking deb Wine containers within the function;\n※ 11 new Vkd3d Proton installation function, update DXVK version to 2.0.0;\n※ 12 new program menu bar section column icon;\n13, an optimization based on the ecological adaptation that pack the script content automatically filled function;\n14, optimization copywriting program;\n15, new log function;\n16, program, we will further improve the English translation (machine);\n17, optimization program update strategy;\n18, optimization of log analysis function;\n19, optimization program UI.", "快捷方式管理工具": "Shortcut management tools", "run_v3.sh 管理": "Run_v3. Sh management", "安装/卸载 Vkd3d": "Install/uninstall Vkd3d", "安装 Vkd3d": "Install Vkd3d", "卸载 Vkd3d": "Uninstall Vkd3d", "启用/禁止指定 wine 容器生成快捷方式": "Enable/designated wine containers generated shortcut is prohibited", "启用/禁止指定 wine 容器创建文件关联": "Enable/designated wine containers to create file associations is prohibited", "允许指定 wine 容器创建文件关联": "Allows you to specify wine containers to create file associations", "禁止指定 wine 容器创建文件关联": "Designated wine containers to create file associations is prohibited", "※1、不基于生态适配脚本打包器支持禁用 Mono/Gecko 打包器;\n※2、自动容器配置脚本新增命令 decompressionbottle、programforum、installmsi 以及上述命令的帮助;\n※3、自动容器配置脚本新增评论功能;\n※4、自动容器配置脚本新增许多应用安装脚本;\n※5、安装 Windows 虚拟机功能更换应答镜像图标并添加常用 Windows 组件安装功能;\n※6、安装 Windows 虚拟机功能提供镜像下载的网盘链接;\n※7、简易打包器支持自动添加宋体;\n8、修复 installfont 命令下载的字体目录错误问题;\n9、修复提交日志功能在提交成功时依旧提示提交失败问题;\n10、支持强制启用所有被禁用的组件(不推荐)。\n": "※ 1 is not based on the ecological adaptation that packaging script support disabled Mono/Gecko packaging;\n※ 2 automatic container configuration script command new decompressionbottle, programforum, installmsi and the help of the above command;\n※ 3 container configuration script automatically add comments;\n※ 4 automatic container configuration script increased many application installation script;\n※ may install Windows virtual machine function change response mirror icon and add commonly used Windows component installation function;\n※ 6 install Windows virtual machine provides network backup image download links;\n※ 7 simple packaging machine support automatically add song typeface.\n8, repair installfont command to download the font directory error problem;\n9, repair the commit log function in submit success still prompt submit failure problem;\n10, support force enable all disabled components (not recommended).", "强制启用所有被禁用的组件(不推荐)": "Forced to enable all disabled components (not recommended)", "鸣谢名单": "Thanks to the list", "此为最新版本,无需更新": "This is the latest version, do not need to update", "※1、Windows 应用适配工具新增系统资源显示;\n※2、修复打包器(基于官方生态适配脚本)无法打开的问题;\n※3、新增运行库功能安装,以实现使用 Qemu User 跨架构运行 Wine 的功能;\n※4、修复 Chroot 容器的一些问题;\n※5、修复在 Debian11 安装时缺失依赖 rar 的问题;\n※6、新增安装 box86、box64 的功能;\n7、修改程序内的部分网址;\n8、作者信息变更;\n": "※ 1 new system resources display Windows application adapter tools;\n※ 2 repair packaging machine (official script) ecological adaptation based unable to open the problem;\n※ 3 new runtime features installed, in order to realize the use Qemu User across architecture operation function of Wine;\nDoes 4 problems, repair the Chroot containers.\n※ 5 repair when Debian11 installed on missing rar problem;\n※ 6, new installation box86 box64 function;\nPart of the site within seven, modify the program;\n8, the author information changes;", "运行库": "The runtime", "安装 Qemu User": "Install Qemu User", "运行库 s390x": "The runtime s390x", "运行库 amd64": "The runtime amd64", "运行库 arm64": "The runtime arm64", "运行库 armhf": "The runtime armhf", "运行库 ppc64el": "The runtime ppc64el", "运行库 i386": "The runtime i386", "运行库 riscv64": "The runtime riscv64", "运行库 mips64el": "The runtime mips64el", "※1、Windows 应用适配工具新增系统资源显示;\n※2、修复打包器(基于官方生态适配脚本)无法打开的问题;\n※3、新增运行库功能安装,以实现使用 Qemu User 跨架构运行 Wine 的功能;\n※4、修复 Chroot 容器的一些问题;\n※5、修复在 Debian11 安装时缺失依赖 rar 的问题;\n※6、新增安装 box86、box64 的功能;\n7、修改程序内的部分网址;\n8、作者信息变更;\n9、支持禁用程序的多语言支持(默认禁用,因为是机翻的);\n10、支持在程序本地翻译缺失的情况下自动机翻缺失语句;\n": "※ 1 new system resources display Windows application adapter tools;\n※ 2 repair packaging machine (official script) ecological adaptation based unable to open the problem;\n※ 3 new runtime features installed, in order to realize the use Qemu User across architecture operation function of Wine;\nDoes 4 problems, repair the Chroot containers.\n※ 5 repair when Debian11 installed on missing rar problem;\n※ 6, new installation box86 box64 function;\nPart of the site within seven, modify the program;\n8, the author information changes;\n9, support multiple language support to disable the program (disabled by default, because it is a machine);\n10, lack of support in the application of local translation of automata over missing statement;", "※1、Windows 应用适配工具新增系统资源显示;\n※2、修复打包器(基于官方生态适配脚本)无法打开的问题;\n※3、新增运行库功能安装,以实现使用 Qemu User 跨架构运行 Wine 的功能;\n※4、修复 Chroot 容器的一些问题;\n※5、修复在 Debian11 安装时缺失依赖 rar 的问题;\n※6、新增安装 box86、box64 的功能;\n7、修改程序内的部分网址;\n8、作者信息变更;\n9、支持禁用程序的多语言支持(默认禁用,因为是机翻的);\n10、支持在程序本地翻译缺失的情况下自动机翻缺失语句;\n11、从此版本开始不再区分吾爱版、Spark 版和 UOS 版\n": "※ 1 new system resources display Windows application adapter tools;\n※ 2 repair packaging machine (official script) ecological adaptation based unable to open the problem;\n※ 3 new runtime features installed, in order to realize the use Qemu User across architecture operation function of Wine;\nDoes 4 problems, repair the Chroot containers.\n※ 5 repair when Debian11 installed on missing rar problem;\n※ 6, new installation box86 box64 function;\nPart of the site within seven, modify the program;\n8, the author information changes;\n9, support multiple language support to disable the program (disabled by default, because it is a machine);\n10, lack of support in the application of local translation of automata over missing statement;\n11, the beginning of a version no longer distinguish between my love edition version, Spark and UOS edition", "安装 Box86": "Install Box86", "安装 s390x 运行库": "Install s390x runtime", "卸载 s390x 运行库": "Uninstall s390x runtime", "安装 amd64 运行库": "Install the amd64 runtime", "卸载 amd64 运行库": "Uninstall amd64 runtime", "安装 arm64 运行库": "Install arm64 runtime", "卸载 arm64 运行库": "Uninstall arm64 runtime", "安装 armhf 运行库": "Install armhf runtime", "卸载 armhf 运行库": "Uninstall armhf runtime", "安装 ppc64el 运行库": "Install ppc64el runtime", "卸载 ppc64el 运行库": "Uninstall ppc64el runtime", "安装 i386 运行库": "Install i386 runtime", "卸载 i386 运行库": "Uninstall i386 runtime", "安装 riscv64 运行库": "Install riscv64 runtime", "卸载 riscv64 运行库": "Uninstall riscv64 runtime", "安装 mips64el 运行库": "Install mips64el runtime", "卸载 mips64el 运行库": "Uninstall mips64el runtime", "Qemu + Chroot 挂载用户目录:": "Qemu + Chroot mount user directory:", "程序翻译:": "Program translation:", "自动根据文件名生成容器路径(开启后必须通过修改默认wine容器路径才可指定其它路径,重启程序后生效)": "Automatic container path was generated according to the file name (open must by modifying the default after wine container path to specify other paths, to take effect after a restart the program)", "使用 Qemu + Chroot 时不挂载用户目录并与系统隔离(修改后重启操作系统生效)": "Don't mount when using Qemu + Chroot user directory and from the system (modified restart your operating system)", "禁用程序界面翻译": "To disable the program interface translation"}
\ No newline at end of file
diff --git a/information.json b/information.json
index d8ecb48..bc8fce0 100644
--- a/information.json
+++ b/information.json
@@ -1,5 +1,5 @@
 {
-    "Version": "3.1.1",
+    "Version": "3.2.0",
     "Thank": [
         "感谢 RacoonGX 的付出与贡献",
         "感谢 @Amber 编写的《使用wine运行器打包无安装包的软件》:https://bbs.deepin.org/post/247720",
diff --git a/mainwindow.py b/mainwindow.py
index 61435d5..c656f41 100755
--- a/mainwindow.py
+++ b/mainwindow.py
@@ -2332,6 +2332,18 @@ try:
                         wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine64"
                         canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64")
                         untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine64")
+                    if os.path.exists(f"{programPath}/wine/{i}/bin/wine-i386"):
+                        wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-i386"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine-i386"
+                        canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-i386")
+                        untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-i386")
+                    if os.path.exists(f"{programPath}/wine/{i}/bin/wine-aarch64"):        
+                        wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-aarch64"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine-aarch64"
+                        canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-aarch64")
+                        untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-aarch64")
+                    if os.path.exists(f"{programPath}/wine/{i}/bin/wine-x86_64"):        
+                        wine[f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-x86_64"] = f"{k[1]}{chrootProgramPath}/wine/{i}/bin/wine-x86_64"
+                        canUseWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-x86_64")
+                        untipsWine.append(f"{k[0]}{chrootProgramPath}/wine/{i}/bin/wine-x86_64")
     except:
         pass
     try:
@@ -2395,14 +2407,15 @@ updateThingsString = transla.transe("U", '''※1、Windows 应用适配工具新
 ※6、修复在 Debian11 安装时缺失依赖 rar 的问题;
 ※7、新增安装 box86、box64 的功能;
 ※8、修复故障反馈功能错误的问题;
-9、修改程序内的部分网址;
-10、作者信息变更;
-11、支持禁用程序的多语言支持(默认禁用,因为是机翻的);
-12、支持在程序本地翻译缺失的情况下自动机翻缺失语句;
-13、从此版本开始不再区分吾爱版、Spark 版和 UOS 版;
-14、新增下载量查询;
-15、更新程序公告;
-16、新增断网彩蛋。
+※9、支持调用 Flatpak 安装的 Wine;
+10、修改程序内的部分网址;
+11、作者信息变更;
+12、支持禁用程序的多语言支持(默认禁用,因为是机翻的);
+13、支持在程序本地翻译缺失的情况下自动机翻缺失语句;
+14、从此版本开始不再区分吾爱版、Spark 版和 UOS 版;
+15、新增下载量查询;
+16、更新程序公告;
+17、新增断网彩蛋。
 ''')
 for i in information["Thank"]:
     thankText += f"{i}\n"
@@ -2444,6 +2457,7 @@ Qt 版本:{QtCore.qVersion()}
 
星火应用商店:https://spark-app.store/
 Deepin 官网:https://www.deepin.org
 Deepin 论坛:https://bbs.deepin.org
+gfdgd xi:https://gfdgd-xi.github.io
 

©2020~{time.strftime("%Y")} By gfdgd xi、为什么您不喜欢熊出没和阿布呢

''' title = "Wine 运行器 {}".format(version) diff --git a/package-script.zip b/package-script.zip old mode 100755 new mode 100644 index 1ab81ce..77413f0 Binary files a/package-script.zip and b/package-script.zip differ diff --git a/package-script/information.json b/package-script/information.json index 56c70ac..bc8fce0 100755 --- a/package-script/information.json +++ b/package-script/information.json @@ -1,5 +1,5 @@ { - "Version": "3.1.0", + "Version": "3.2.0", "Thank": [ "感谢 RacoonGX 的付出与贡献", "感谢 @Amber 编写的《使用wine运行器打包无安装包的软件》:https://bbs.deepin.org/post/247720",