Compare commits
261 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
86654689da | ||
|
|
b4901add94 | ||
|
|
8df321b84d | ||
|
|
6a4dfb47bb | ||
|
|
dd8a810591 | ||
|
|
009858e2f8 | ||
|
|
337293dbe1 | ||
|
|
5e0be0d463 | ||
|
|
cf147be119 | ||
|
|
c695596285 | ||
|
|
7b97aefa0a | ||
|
|
a3e5ccffa4 | ||
|
|
452fa65748 | ||
|
|
7141f46948 | ||
|
|
481ea06e61 | ||
|
|
3aa60d3488 | ||
|
|
e152e147e2 | ||
|
|
c7b8dd24c7 | ||
|
|
9e384f80cb | ||
|
|
7f8e3e647a | ||
|
|
df79e99fa5 | ||
|
|
03eafb4881 | ||
|
|
e795604721 | ||
|
|
9769b33deb | ||
|
|
51968741ea | ||
|
|
29a5cc63df | ||
|
|
3f0bf28fbe | ||
|
|
2321176712 | ||
|
|
974308c843 | ||
|
|
1d59cba316 | ||
|
|
f3e1e9b4b2 | ||
|
|
5c38bb64a0 | ||
|
|
3fbff37095 | ||
|
|
540099a944 | ||
|
|
cd0b276885 | ||
|
|
519f84a804 | ||
|
|
e44462bb78 | ||
|
|
9da2300194 | ||
|
|
91c39ee7ef | ||
|
|
58ea85e6b9 | ||
|
|
7be2aa50dd | ||
|
|
ed9417dcdf | ||
|
|
36522c7146 | ||
|
|
20b74ea78a | ||
|
|
0ae9cbcdaa | ||
|
|
c9cbb0e363 | ||
|
|
0595ce4ea6 | ||
|
|
2e2427f942 | ||
|
|
aeddee2f03 | ||
|
|
43037f8043 | ||
|
|
0c3d552d08 | ||
|
|
a1b6b8a434 | ||
|
|
5061cad389 | ||
|
|
9d3fb33d10 | ||
|
|
4d82b182a6 | ||
|
|
78ac05efba | ||
|
|
02cf7b71c1 | ||
|
|
091bb23488 | ||
|
|
0ec0d80e9c | ||
|
|
d4d87ccb5c | ||
|
|
c782c1fcdd | ||
|
|
f7cdae8677 | ||
|
|
f41a68de0d | ||
|
|
aefde7a777 | ||
|
|
3dc61688c4 | ||
|
|
7e00a7d764 | ||
|
|
8304cf655b | ||
|
|
c25e7a3d5b | ||
|
|
b7b02ab5bc | ||
|
|
b3a8724538 | ||
|
|
ed11faf909 | ||
|
|
b5cd0be057 | ||
|
|
d31954d1e2 | ||
|
|
96bf30fcab | ||
|
|
e7fc5a676e | ||
|
|
4a81d8beb0 | ||
|
|
c583769cf3 | ||
|
|
2ff2fd1940 | ||
|
|
6d45cf978a | ||
|
|
4c3b80a1fb | ||
|
|
d22aa81fa0 | ||
|
|
1e76b8e533 | ||
|
|
886adc3534 | ||
|
|
aff7ffb2c4 | ||
|
|
4ec1f7c5c8 | ||
|
|
7772c9b424 | ||
|
|
514f0a17b5 | ||
|
|
91adc0d153 | ||
|
|
48425f5549 | ||
|
|
fd36562a7d | ||
|
|
4b36442170 | ||
|
|
dad6beca05 | ||
|
|
ee61c5aa8d | ||
|
|
1001588f97 | ||
|
|
25df3d819b | ||
|
|
a2e5656747 | ||
|
|
65fc0339b9 | ||
|
|
0421654c50 | ||
|
|
bdaa42f6df | ||
|
|
9984c3ecb5 | ||
|
|
5e7c2309ac | ||
|
|
9dda8555a0 | ||
|
|
43046a3cf3 | ||
|
|
fe29cc532d | ||
|
|
7dd73ef8d3 | ||
|
|
ad6bd7be4b | ||
|
|
c276b700fa | ||
|
|
98f73aa4c0 | ||
|
|
1db854618e | ||
|
|
940a1bc3f8 | ||
|
|
7463dd96dc | ||
|
|
48e96998a9 | ||
|
|
95a1b03cc5 | ||
|
|
ee4dfa7f51 | ||
|
|
06f403e9d7 | ||
|
|
c03f3f727c | ||
|
|
ed4ba1dc38 | ||
|
|
9663f8c316 | ||
|
|
2478df1242 | ||
|
|
1b54dd3b90 | ||
|
|
001014c70e | ||
|
|
1a444a9e98 | ||
|
|
d5397333d5 | ||
|
|
e1001c74c5 | ||
|
|
5f664c04d6 | ||
|
|
525fa4c25e | ||
|
|
f513760153 | ||
|
|
5faa929bb0 | ||
|
|
5c4557a7b7 | ||
|
|
69a84c035e | ||
|
|
f8277e1c8a | ||
|
|
48f3d293bd | ||
|
|
00bf828ef4 | ||
|
|
d1cef7ed84 | ||
|
|
17bb8dbe6d | ||
|
|
6166c03eab | ||
|
|
303f32f5b2 | ||
|
|
f7e4d7b30d | ||
|
|
f2957dff7b | ||
|
|
cadbe38a8f | ||
|
|
e55d117371 | ||
|
|
1f3d8a212b | ||
|
|
035f30d7e1 | ||
|
|
3202aa18b1 | ||
|
|
0c5d2bdf1a | ||
|
|
db25475c21 | ||
|
|
11b1c23be0 | ||
|
|
5b1eef890d | ||
|
|
3a3d062e5c | ||
|
|
2ee9ed237f | ||
|
|
9159661945 | ||
|
|
0efd2c8044 | ||
|
|
0aaa5822fb | ||
|
|
2b258aeaed | ||
|
|
0d7a80f2b5 | ||
|
|
d433d98c04 | ||
|
|
180dc12460 | ||
|
|
dd1d0b4126 | ||
|
|
f1517fad1a | ||
|
|
62ed279f07 | ||
|
|
6925d59f87 | ||
|
|
848cc41c72 | ||
|
|
f212076604 | ||
|
|
ee4fd51e0f | ||
|
|
f96b4f6724 | ||
|
|
7b6f2f826a | ||
|
|
8ed4fd6cba | ||
|
|
b914cb26be | ||
|
|
97472e9a17 | ||
|
|
dece8c0daa | ||
|
|
5796d1af32 | ||
|
|
06d7a1df6b | ||
|
|
ed293ddad8 | ||
|
|
d7a92344e5 | ||
|
|
3fa020fe91 | ||
|
|
ce19af7da0 | ||
|
|
e558a9fc9d | ||
|
|
fb5544ce0f | ||
|
|
051f0d484c | ||
|
|
108cbea686 | ||
|
|
8b61bd7d8a | ||
|
|
1699a2b68a | ||
|
|
2fca95e81b | ||
|
|
969aa87a10 | ||
|
|
b3dfa7d7ce | ||
|
|
483de50169 | ||
|
|
96762ffa5c | ||
|
|
88d05c2354 | ||
|
|
8aac152ee6 | ||
|
|
d83779662a | ||
|
|
c19e656d46 | ||
|
|
4631a2f440 | ||
|
|
338f5811a1 | ||
|
|
bc634b2eeb | ||
|
|
23cbb9e261 | ||
|
|
fbfbf3c32b | ||
|
|
3073a2e90d | ||
|
|
29e4dc93ab | ||
|
|
2b16a20032 | ||
|
|
59b412899d | ||
|
|
e656ab5e1d | ||
|
|
b90c06da72 | ||
|
|
f62f3652e2 | ||
|
|
dbbec9d2bd | ||
|
|
1be8189058 | ||
|
|
b8b3160ccd | ||
|
|
54fd3995e6 | ||
|
|
e506190c7f | ||
|
|
8f418a0da9 | ||
|
|
0403ee91ea | ||
|
|
47d1856143 | ||
|
|
e521f0fea0 | ||
|
|
eb1e7fd15a | ||
|
|
c9e0a58232 | ||
|
|
9acd8b54e3 | ||
|
|
acd66b1634 | ||
|
|
3820855812 | ||
|
|
056abe7b68 | ||
|
|
bf05b1bda2 | ||
|
|
77a3c146c0 | ||
|
|
5761f7f543 | ||
|
|
5ed5b543ce | ||
|
|
98ae0f2762 | ||
|
|
963bc80439 | ||
|
|
4106dc454e | ||
|
|
0ba26aa836 | ||
|
|
a4c775174b | ||
|
|
29c40c34fe | ||
|
|
44cb889b91 | ||
|
|
915d65d2f4 | ||
|
|
8b7c270cf6 | ||
|
|
a3f07f8ce4 | ||
|
|
91d3252685 | ||
|
|
f9d9112651 | ||
|
|
477a1acc61 | ||
|
|
4770366f74 | ||
|
|
1c66b4dce1 | ||
|
|
3a19bb534a | ||
|
|
f39b3cfd4a | ||
|
|
f0410243c4 | ||
|
|
8abc40707a | ||
|
|
f91fe34a12 | ||
|
|
e9bf6c3b58 | ||
|
|
17c660b5a2 | ||
|
|
ed46f73987 | ||
|
|
e1200b5038 | ||
|
|
7f7ea6ac97 | ||
|
|
f70edaac83 | ||
|
|
d932febe89 | ||
|
|
945a63c51d | ||
|
|
da716ea5c5 | ||
|
|
c6f92a3030 | ||
|
|
267e2dc544 | ||
|
|
cb7d3afdfb | ||
|
|
b57e863c28 | ||
|
|
7aed15fd4f | ||
|
|
6d71b26595 | ||
|
|
1df5406cb3 | ||
|
|
a2b762dcbc | ||
|
|
c2d29c3d6a | ||
|
|
da602eb693 |
31
.editorconfig
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# EmmyLuaCodeStyle
|
||||||
|
[*.lua]
|
||||||
|
max_line_length = 26000
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
space_around_table_field_list = false
|
||||||
|
space_before_attribute = false
|
||||||
|
space_before_function_call_open_parenthesis = false
|
||||||
|
space_before_closure_open_parenthesis = false
|
||||||
|
space_before_function_call_single_arg = false
|
||||||
|
space_before_open_square_bracket = false
|
||||||
|
space_inside_function_call_parentheses = false
|
||||||
|
space_inside_function_param_list_parentheses = false
|
||||||
|
space_inside_square_brackets = false
|
||||||
|
space_around_table_append_operator = false
|
||||||
|
space_before_inline_comment = false
|
||||||
|
space_around_math_operator = false
|
||||||
|
space_around_logical_operator = false
|
||||||
|
space_around_assign_operator = false
|
||||||
|
space_after_comma = false
|
||||||
|
space_after_comma_in_for_statement = false
|
||||||
|
space_around_concat_operator = false
|
||||||
|
align_call_args = false
|
||||||
|
align_function_params = false
|
||||||
|
align_continuous_assign_statement = true
|
||||||
|
align_continuous_rect_table_field = true
|
||||||
|
align_if_branch = false
|
||||||
|
align_array_table = true
|
||||||
|
ignore_spaces_inside_function_call = true
|
||||||
|
line_space_after_function_statement = keep
|
||||||
|
trailing_table_separator = smart
|
||||||
2
.github/actions/get-cc/action.yml
vendored
@@ -3,7 +3,7 @@ description: 'download cc into specific dir'
|
|||||||
inputs:
|
inputs:
|
||||||
tag:
|
tag:
|
||||||
required: false
|
required: false
|
||||||
default: "11.4"
|
default: "11.4.2"
|
||||||
platform:
|
platform:
|
||||||
required: true
|
required: true
|
||||||
dir:
|
dir:
|
||||||
|
|||||||
12
.github/build/iOS/love.patch
vendored
@@ -8,7 +8,7 @@ index c1932555..552e432e 100644
|
|||||||
**/
|
**/
|
||||||
-void vibrate();
|
-void vibrate();
|
||||||
+void vibrate(const double seconds);
|
+void vibrate(const double seconds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable mix mode (e.g. with background music apps) and playback with a muted device.
|
* Enable mix mode (e.g. with background music apps) and playback with a muted device.
|
||||||
diff --git a/src/common/ios.mm b/src/common/ios.mm
|
diff --git a/src/common/ios.mm b/src/common/ios.mm
|
||||||
@@ -18,16 +18,16 @@ index 7730991e..4ba8e708 100644
|
|||||||
@@ -36,6 +36,8 @@
|
@@ -36,6 +36,8 @@
|
||||||
#include <SDL_video.h>
|
#include <SDL_video.h>
|
||||||
#include <SDL_syswm.h>
|
#include <SDL_syswm.h>
|
||||||
|
|
||||||
+#include <sys/utsname.h>
|
+#include <sys/utsname.h>
|
||||||
+
|
+
|
||||||
static NSArray *getLovesInDocuments();
|
static NSArray *getLovesInDocuments();
|
||||||
static bool deleteFileInDocuments(NSString *filename);
|
static bool deleteFileInDocuments(NSString *filename);
|
||||||
|
|
||||||
@@ -391,10 +393,40 @@ std::string getExecutablePath()
|
@@ -391,10 +393,40 @@ std::string getExecutablePath()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
-void vibrate()
|
-void vibrate()
|
||||||
+void vibrate(const double seconds)
|
+void vibrate(const double seconds)
|
||||||
{
|
{
|
||||||
@@ -73,7 +73,7 @@ index c8af8596..ae7a5e32 100644
|
|||||||
@@ -140,6 +140,10 @@ enum DoneAction
|
@@ -140,6 +140,10 @@ enum DoneAction
|
||||||
DONE_RESTART,
|
DONE_RESTART,
|
||||||
};
|
};
|
||||||
|
|
||||||
+extern "C" {
|
+extern "C" {
|
||||||
+ int luaopen_CCloader(lua_State *L);
|
+ int luaopen_CCloader(lua_State *L);
|
||||||
+}
|
+}
|
||||||
@@ -84,7 +84,7 @@ index c8af8596..ae7a5e32 100644
|
|||||||
@@ -158,6 +162,9 @@ static DoneAction runlove(int argc, char **argv, int &retval)
|
@@ -158,6 +162,9 @@ static DoneAction runlove(int argc, char **argv, int &retval)
|
||||||
lua_State *L = luaL_newstate();
|
lua_State *L = luaL_newstate();
|
||||||
luaL_openlibs(L);
|
luaL_openlibs(L);
|
||||||
|
|
||||||
+ // Init CCloader
|
+ // Init CCloader
|
||||||
+ luaopen_CCloader(L);
|
+ luaopen_CCloader(L);
|
||||||
+
|
+
|
||||||
|
|||||||
10
.github/build/linux/dev/template.desktop
vendored
@@ -1,10 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=Techmino Development
|
|
||||||
Comment=Techmino is fun!
|
|
||||||
MimeType=application/x-love-game;
|
|
||||||
Exec=app %f
|
|
||||||
Type=Application
|
|
||||||
Categories=Game;
|
|
||||||
Terminal=false
|
|
||||||
Icon=icon
|
|
||||||
NoDisplay=false
|
|
||||||
1
.github/build/linux/release/.gitattributes
vendored
@@ -1 +0,0 @@
|
|||||||
*.template text eol=lf
|
|
||||||
10
.github/build/linux/release/template.desktop
vendored
@@ -1,10 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=Techmino
|
|
||||||
Comment=Techmino is fun!
|
|
||||||
MimeType=application/x-love-game;
|
|
||||||
Exec=app %f
|
|
||||||
Type=Application
|
|
||||||
Categories=Game;
|
|
||||||
Terminal=false
|
|
||||||
Icon=icon
|
|
||||||
NoDisplay=false
|
|
||||||
BIN
.github/build/web/favicon.ico
vendored
Normal file
|
After Width: | Height: | Size: 305 KiB |
288
.github/build/web/game.js
vendored
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
|
||||||
|
var Module;
|
||||||
|
|
||||||
|
if (typeof Module === 'undefined') Module = eval('(function() { try { return Module || {} } catch(e) { return {} } })()');
|
||||||
|
|
||||||
|
if (!Module.expectedDataFileDownloads) {
|
||||||
|
Module.expectedDataFileDownloads = 0;
|
||||||
|
Module.finishedDataFileDownloads = 0;
|
||||||
|
}
|
||||||
|
Module.expectedDataFileDownloads++;
|
||||||
|
(function() {
|
||||||
|
var loadPackage = function(metadata) {
|
||||||
|
|
||||||
|
var PACKAGE_PATH;
|
||||||
|
if (typeof window === 'object') {
|
||||||
|
PACKAGE_PATH = window['encodeURIComponent'](window.location.pathname.toString().substring(0, window.location.pathname.toString().lastIndexOf('/')) + '/');
|
||||||
|
} else if (typeof location !== 'undefined') {
|
||||||
|
// worker
|
||||||
|
PACKAGE_PATH = encodeURIComponent(location.pathname.toString().substring(0, location.pathname.toString().lastIndexOf('/')) + '/');
|
||||||
|
} else {
|
||||||
|
throw 'using preloaded data can only be done on a web page or in a web worker';
|
||||||
|
}
|
||||||
|
var PACKAGE_NAME = 'game.data';
|
||||||
|
var REMOTE_PACKAGE_BASE = 'game.data';
|
||||||
|
if (typeof Module['locateFilePackage'] === 'function' && !Module['locateFile']) {
|
||||||
|
Module['locateFile'] = Module['locateFilePackage'];
|
||||||
|
Module.printErr('warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)');
|
||||||
|
}
|
||||||
|
var REMOTE_PACKAGE_NAME = typeof Module['locateFile'] === 'function' ?
|
||||||
|
Module['locateFile'](REMOTE_PACKAGE_BASE) :
|
||||||
|
((Module['filePackagePrefixURL'] || '') + REMOTE_PACKAGE_BASE);
|
||||||
|
|
||||||
|
var REMOTE_PACKAGE_SIZE = metadata.remote_package_size;
|
||||||
|
var PACKAGE_UUID = metadata.package_uuid;
|
||||||
|
|
||||||
|
function fetchRemotePackage(packageName, packageSize, callback, errback) {
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('GET', packageName, true);
|
||||||
|
xhr.responseType = 'arraybuffer';
|
||||||
|
xhr.onprogress = function(event) {
|
||||||
|
var url = packageName;
|
||||||
|
var size = packageSize;
|
||||||
|
if (event.total) size = event.total;
|
||||||
|
if (event.loaded) {
|
||||||
|
if (!xhr.addedTotal) {
|
||||||
|
xhr.addedTotal = true;
|
||||||
|
if (!Module.dataFileDownloads) Module.dataFileDownloads = {};
|
||||||
|
Module.dataFileDownloads[url] = {
|
||||||
|
loaded: event.loaded,
|
||||||
|
total: size
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
Module.dataFileDownloads[url].loaded = event.loaded;
|
||||||
|
}
|
||||||
|
var total = 0;
|
||||||
|
var loaded = 0;
|
||||||
|
var num = 0;
|
||||||
|
for (var download in Module.dataFileDownloads) {
|
||||||
|
var data = Module.dataFileDownloads[download];
|
||||||
|
total += data.total;
|
||||||
|
loaded += data.loaded;
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
total = Math.ceil(total * Module.expectedDataFileDownloads/num);
|
||||||
|
if (Module['setStatus']) Module['setStatus']('Downloading data... (' + loaded + '/' + total + ')');
|
||||||
|
} else if (!Module.dataFileDownloads) {
|
||||||
|
if (Module['setStatus']) Module['setStatus']('Downloading data...');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.onerror = function(event) {
|
||||||
|
throw new Error("NetworkError for: " + packageName);
|
||||||
|
}
|
||||||
|
xhr.onload = function(event) {
|
||||||
|
if (xhr.status == 200 || xhr.status == 304 || xhr.status == 206 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
|
||||||
|
var packageData = xhr.response;
|
||||||
|
callback(packageData);
|
||||||
|
} else {
|
||||||
|
throw new Error(xhr.statusText + " : " + xhr.responseURL);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.send(null);
|
||||||
|
};
|
||||||
|
|
||||||
|
function handleError(error) {
|
||||||
|
console.error('package error:', error);
|
||||||
|
};
|
||||||
|
|
||||||
|
function runWithFS() {
|
||||||
|
|
||||||
|
function assert(check, msg) {
|
||||||
|
if (!check) throw msg + new Error().stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DataRequest(start, end, crunched, audio) {
|
||||||
|
this.start = start;
|
||||||
|
this.end = end;
|
||||||
|
this.crunched = crunched;
|
||||||
|
this.audio = audio;
|
||||||
|
}
|
||||||
|
DataRequest.prototype = {
|
||||||
|
requests: {},
|
||||||
|
open: function(mode, name) {
|
||||||
|
this.name = name;
|
||||||
|
this.requests[name] = this;
|
||||||
|
Module['addRunDependency']('fp ' + this.name);
|
||||||
|
},
|
||||||
|
send: function() {},
|
||||||
|
onload: function() {
|
||||||
|
var byteArray = this.byteArray.subarray(this.start, this.end);
|
||||||
|
|
||||||
|
this.finish(byteArray);
|
||||||
|
|
||||||
|
},
|
||||||
|
finish: function(byteArray) {
|
||||||
|
var that = this;
|
||||||
|
|
||||||
|
Module['FS_createDataFile'](this.name, null, byteArray, true, true, true); // canOwn this data in the filesystem, it is a slide into the heap that will never change
|
||||||
|
Module['removeRunDependency']('fp ' + that.name);
|
||||||
|
|
||||||
|
this.requests[this.name] = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var files = metadata.files;
|
||||||
|
for (i = 0; i < files.length; ++i) {
|
||||||
|
new DataRequest(files[i].start, files[i].end, files[i].crunched, files[i].audio).open('GET', files[i].filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
|
||||||
|
var IDB_RO = "readonly";
|
||||||
|
var IDB_RW = "readwrite";
|
||||||
|
var DB_NAME = "EM_PRELOAD_CACHE";
|
||||||
|
var DB_VERSION = 1;
|
||||||
|
var METADATA_STORE_NAME = 'METADATA';
|
||||||
|
var PACKAGE_STORE_NAME = 'PACKAGES';
|
||||||
|
function openDatabase(callback, errback) {
|
||||||
|
try {
|
||||||
|
var openRequest = indexedDB.open(DB_NAME, DB_VERSION);
|
||||||
|
} catch (e) {
|
||||||
|
return errback(e);
|
||||||
|
}
|
||||||
|
openRequest.onupgradeneeded = function(event) {
|
||||||
|
var db = event.target.result;
|
||||||
|
|
||||||
|
if(db.objectStoreNames.contains(PACKAGE_STORE_NAME)) {
|
||||||
|
db.deleteObjectStore(PACKAGE_STORE_NAME);
|
||||||
|
}
|
||||||
|
var packages = db.createObjectStore(PACKAGE_STORE_NAME);
|
||||||
|
|
||||||
|
if(db.objectStoreNames.contains(METADATA_STORE_NAME)) {
|
||||||
|
db.deleteObjectStore(METADATA_STORE_NAME);
|
||||||
|
}
|
||||||
|
var metadata = db.createObjectStore(METADATA_STORE_NAME);
|
||||||
|
};
|
||||||
|
openRequest.onsuccess = function(event) {
|
||||||
|
var db = event.target.result;
|
||||||
|
callback(db);
|
||||||
|
};
|
||||||
|
openRequest.onerror = function(error) {
|
||||||
|
errback(error);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Check if there's a cached package, and if so whether it's the latest available */
|
||||||
|
function checkCachedPackage(db, packageName, callback, errback) {
|
||||||
|
var transaction = db.transaction([METADATA_STORE_NAME], IDB_RO);
|
||||||
|
var metadata = transaction.objectStore(METADATA_STORE_NAME);
|
||||||
|
|
||||||
|
var getRequest = metadata.get("metadata/" + packageName);
|
||||||
|
getRequest.onsuccess = function(event) {
|
||||||
|
var result = event.target.result;
|
||||||
|
if (!result) {
|
||||||
|
return callback(false);
|
||||||
|
} else {
|
||||||
|
return callback(PACKAGE_UUID === result.uuid);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
getRequest.onerror = function(error) {
|
||||||
|
errback(error);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
function fetchCachedPackage(db, packageName, callback, errback) {
|
||||||
|
var transaction = db.transaction([PACKAGE_STORE_NAME], IDB_RO);
|
||||||
|
var packages = transaction.objectStore(PACKAGE_STORE_NAME);
|
||||||
|
|
||||||
|
var getRequest = packages.get("package/" + packageName);
|
||||||
|
getRequest.onsuccess = function(event) {
|
||||||
|
var result = event.target.result;
|
||||||
|
callback(result);
|
||||||
|
};
|
||||||
|
getRequest.onerror = function(error) {
|
||||||
|
errback(error);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
function cacheRemotePackage(db, packageName, packageData, packageMeta, callback, errback) {
|
||||||
|
var transaction_packages = db.transaction([PACKAGE_STORE_NAME], IDB_RW);
|
||||||
|
var packages = transaction_packages.objectStore(PACKAGE_STORE_NAME);
|
||||||
|
|
||||||
|
var putPackageRequest = packages.put(packageData, "package/" + packageName);
|
||||||
|
putPackageRequest.onsuccess = function(event) {
|
||||||
|
var transaction_metadata = db.transaction([METADATA_STORE_NAME], IDB_RW);
|
||||||
|
var metadata = transaction_metadata.objectStore(METADATA_STORE_NAME);
|
||||||
|
var putMetadataRequest = metadata.put(packageMeta, "metadata/" + packageName);
|
||||||
|
putMetadataRequest.onsuccess = function(event) {
|
||||||
|
callback(packageData);
|
||||||
|
};
|
||||||
|
putMetadataRequest.onerror = function(error) {
|
||||||
|
errback(error);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
putPackageRequest.onerror = function(error) {
|
||||||
|
errback(error);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
function processPackageData(arrayBuffer) {
|
||||||
|
Module.finishedDataFileDownloads++;
|
||||||
|
assert(arrayBuffer, 'Loading data file failed.');
|
||||||
|
assert(arrayBuffer instanceof ArrayBuffer, 'bad input to processPackageData');
|
||||||
|
var byteArray = new Uint8Array(arrayBuffer);
|
||||||
|
var curr;
|
||||||
|
|
||||||
|
// copy the entire loaded file into a spot in the heap. Files will refer to slices in that. They cannot be freed though
|
||||||
|
// (we may be allocating before malloc is ready, during startup).
|
||||||
|
if (Module['SPLIT_MEMORY']) Module.printErr('warning: you should run the file packager with --no-heap-copy when SPLIT_MEMORY is used, otherwise copying into the heap may fail due to the splitting');
|
||||||
|
var ptr = Module['getMemory'](byteArray.length);
|
||||||
|
Module['HEAPU8'].set(byteArray, ptr);
|
||||||
|
DataRequest.prototype.byteArray = Module['HEAPU8'].subarray(ptr, ptr+byteArray.length);
|
||||||
|
|
||||||
|
var files = metadata.files;
|
||||||
|
for (i = 0; i < files.length; ++i) {
|
||||||
|
DataRequest.prototype.requests[files[i].filename].onload();
|
||||||
|
}
|
||||||
|
Module['removeRunDependency']('datafile_game.data');
|
||||||
|
|
||||||
|
};
|
||||||
|
Module['addRunDependency']('datafile_game.data');
|
||||||
|
|
||||||
|
if (!Module.preloadResults) Module.preloadResults = {};
|
||||||
|
|
||||||
|
function preloadFallback(error) {
|
||||||
|
console.error(error);
|
||||||
|
console.error('falling back to default preload behavior');
|
||||||
|
fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, processPackageData, handleError);
|
||||||
|
};
|
||||||
|
|
||||||
|
openDatabase(
|
||||||
|
function(db) {
|
||||||
|
checkCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME,
|
||||||
|
function(useCached) {
|
||||||
|
Module.preloadResults[PACKAGE_NAME] = {fromCache: useCached};
|
||||||
|
if (useCached) {
|
||||||
|
console.info('loading ' + PACKAGE_NAME + ' from cache');
|
||||||
|
fetchCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME, processPackageData, preloadFallback);
|
||||||
|
} else {
|
||||||
|
console.info('loading ' + PACKAGE_NAME + ' from remote');
|
||||||
|
fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE,
|
||||||
|
function(packageData) {
|
||||||
|
cacheRemotePackage(db, PACKAGE_PATH + PACKAGE_NAME, packageData, {uuid:PACKAGE_UUID}, processPackageData,
|
||||||
|
function(error) {
|
||||||
|
console.error(error);
|
||||||
|
processPackageData(packageData);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
, preloadFallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, preloadFallback);
|
||||||
|
}
|
||||||
|
, preloadFallback);
|
||||||
|
|
||||||
|
if (Module['setStatus']) Module['setStatus']('Downloading...');
|
||||||
|
|
||||||
|
}
|
||||||
|
if (Module['calledRun']) {
|
||||||
|
runWithFS();
|
||||||
|
} else {
|
||||||
|
if (!Module['preRun']) Module['preRun'] = [];
|
||||||
|
Module["preRun"].push(runWithFS); // FS is not initialized yet, wait for it
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
loadPackage({"package_uuid":"80826f15-f924-4428-a8c4-e984743417c6","remote_package_size":62246034,"files":[{"filename":"/game.love","crunched":0,"start":0,"end":62246034,"audio":false}]});
|
||||||
|
|
||||||
|
})();
|
||||||
111
.github/build/web/index.html
vendored
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, minimum-scale=1, maximum-scale=1">
|
||||||
|
<title>Techmino</title>
|
||||||
|
|
||||||
|
<!-- Load custom style sheet -->
|
||||||
|
<link rel="stylesheet" type="text/css" href="theme/love.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<center>
|
||||||
|
<div>
|
||||||
|
<h1>Techmino</h1>
|
||||||
|
<canvas id="loadingCanvas" oncontextmenu="event.preventDefault()" width="800" height="600"></canvas>
|
||||||
|
<canvas id="canvas" oncontextmenu="event.preventDefault()"></canvas>
|
||||||
|
</div>
|
||||||
|
</center>
|
||||||
|
|
||||||
|
<script type='text/javascript'>
|
||||||
|
function goFullScreen(){
|
||||||
|
var canvas = document.getElementById("canvas");
|
||||||
|
if(canvas.requestFullScreen)
|
||||||
|
canvas.requestFullScreen();
|
||||||
|
else if(canvas.webkitRequestFullScreen)
|
||||||
|
canvas.webkitRequestFullScreen();
|
||||||
|
else if(canvas.mozRequestFullScreen)
|
||||||
|
canvas.mozRequestFullScreen();
|
||||||
|
}
|
||||||
|
function FullScreenHook(){
|
||||||
|
var canvas = document.getElementById("canvas");
|
||||||
|
canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
||||||
|
canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
|
||||||
|
}
|
||||||
|
var loadingContext = document.getElementById('loadingCanvas').getContext('2d');
|
||||||
|
function drawLoadingText(text) {
|
||||||
|
var canvas = loadingContext.canvas;
|
||||||
|
|
||||||
|
loadingContext.fillStyle = "rgb(142, 195, 227)";
|
||||||
|
loadingContext.fillRect(0, 0, canvas.scrollWidth, canvas.scrollHeight);
|
||||||
|
|
||||||
|
loadingContext.font = '2em arial';
|
||||||
|
loadingContext.textAlign = 'center'
|
||||||
|
loadingContext.fillStyle = "rgb( 11, 86, 117 )";
|
||||||
|
loadingContext.fillText(text, canvas.scrollWidth / 2, canvas.scrollHeight / 2);
|
||||||
|
|
||||||
|
loadingContext.fillText("Powered By Emscripten.", canvas.scrollWidth / 2, canvas.scrollHeight / 4);
|
||||||
|
loadingContext.fillText("Powered By LÖVE.", canvas.scrollWidth / 2, canvas.scrollHeight / 4 * 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = function () { window.focus(); };
|
||||||
|
window.onclick = function () { window.focus(); };
|
||||||
|
|
||||||
|
window.addEventListener("keydown", function(e) {
|
||||||
|
// space and arrow keys
|
||||||
|
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
var Module = {
|
||||||
|
arguments: ["./game.love"],
|
||||||
|
INITIAL_MEMORY: 536870912,
|
||||||
|
printErr: console.error.bind(console),
|
||||||
|
canvas: (function() {
|
||||||
|
var canvas = document.getElementById('canvas');
|
||||||
|
|
||||||
|
// As a default initial behavior, pop up an alert when webgl context is lost. To make your
|
||||||
|
// application robust, you may want to override this behavior before shipping!
|
||||||
|
// See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
|
||||||
|
canvas.addEventListener("webglcontextlost", function(e) { alert('WebGL context lost. You will need to reload the page.'); e.preventDefault(); }, false);
|
||||||
|
|
||||||
|
return canvas;
|
||||||
|
})(),
|
||||||
|
setStatus: function(text) {
|
||||||
|
if (text) {
|
||||||
|
drawLoadingText(text);
|
||||||
|
} else if (Module.remainingDependencies === 0) {
|
||||||
|
document.getElementById('loadingCanvas').style.display = 'none';
|
||||||
|
document.getElementById('canvas').style.visibility = 'visible';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
totalDependencies: 0,
|
||||||
|
remainingDependencies: 0,
|
||||||
|
monitorRunDependencies: function(left) {
|
||||||
|
this.remainingDependencies = left;
|
||||||
|
this.totalDependencies = Math.max(this.totalDependencies, left);
|
||||||
|
Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Module.setStatus('Downloading...');
|
||||||
|
window.onerror = function(event) {
|
||||||
|
// TODO: do not warn on ok events like simulating an infinite loop or exitStatus
|
||||||
|
Module.setStatus('Exception thrown, see JavaScript console');
|
||||||
|
Module.setStatus = function(text) {
|
||||||
|
if (text) Module.printErr('[post-exception status] ' + text);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var applicationLoad = function(e) {
|
||||||
|
Love(Module);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript" src="game.js"></script>
|
||||||
|
<script async type="text/javascript" src="love.js" onload="applicationLoad(this)"></script>
|
||||||
|
<footer>
|
||||||
|
<p>Built with <a href="https://github.com/Davidobot/love.js">love.js</a> <button onclick="goFullScreen();">Go Fullscreen</button><br>Hint: Reload the page if screen is blank</p>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
22
.github/build/web/love.js
vendored
Normal file
BIN
.github/build/web/love.wasm
vendored
Normal file
BIN
.github/build/web/theme/bg.png
vendored
Normal file
|
After Width: | Height: | Size: 7.0 KiB |
49
.github/build/web/theme/love.css
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-family: arial;
|
||||||
|
color: rgb( 11, 86, 117 );
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-image: url(bg.png);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
font-family: arial;
|
||||||
|
margin: 0;
|
||||||
|
padding: none;
|
||||||
|
background-color: rgb( 154, 205, 237 );
|
||||||
|
color: rgb( 28, 78, 104 );
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
font-family: arial;
|
||||||
|
font-size: 12px;
|
||||||
|
padding-left: 10px;
|
||||||
|
position:absolute;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Links */
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a:link {
|
||||||
|
color: rgb( 233, 73, 154 );
|
||||||
|
}
|
||||||
|
a:visited {
|
||||||
|
color: rgb( 110, 30, 71 );
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: rgb( 252, 207, 230 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the canvas *must not* have any border or padding, or mouse coords will be wrong */
|
||||||
|
#canvas {
|
||||||
|
padding-right: 0;
|
||||||
|
display: block;
|
||||||
|
border: 0px none;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
7
.github/build/windows/dev/template.rc
vendored
@@ -8,9 +8,12 @@ FILETYPE 0x1
|
|||||||
{
|
{
|
||||||
BLOCK "040904B0"
|
BLOCK "040904B0"
|
||||||
{
|
{
|
||||||
VALUE "FileDescription", "Techmino Development"
|
|
||||||
VALUE "CompanyName", "26F Studio"
|
VALUE "CompanyName", "26F Studio"
|
||||||
VALUE "LegalCopyright", "Copyright @ 26F Studio"
|
VALUE "FileDescription", "Techmino Development"
|
||||||
|
VALUE "FileVersion", "@Version"
|
||||||
|
VALUE "InternalName", "Techmino"
|
||||||
|
VALUE "LegalCopyright", "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||||
|
VALUE "OriginalFilename", "Techmino.exe"
|
||||||
VALUE "ProductName", "Techmino"
|
VALUE "ProductName", "Techmino"
|
||||||
VALUE "ProductVersion", "@Version"
|
VALUE "ProductVersion", "@Version"
|
||||||
}
|
}
|
||||||
|
|||||||
7
.github/build/windows/release/template.rc
vendored
@@ -8,9 +8,12 @@ FILETYPE 0x1
|
|||||||
{
|
{
|
||||||
BLOCK "040904B0"
|
BLOCK "040904B0"
|
||||||
{
|
{
|
||||||
VALUE "FileDescription", "Techmino"
|
|
||||||
VALUE "CompanyName", "26F Studio"
|
VALUE "CompanyName", "26F Studio"
|
||||||
VALUE "LegalCopyright", "Copyright @ 26F Studio"
|
VALUE "FileDescription", "Techmino"
|
||||||
|
VALUE "FileVersion", "@Version"
|
||||||
|
VALUE "InternalName", "Techmino"
|
||||||
|
VALUE "LegalCopyright", "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||||
|
VALUE "OriginalFilename", "Techmino.exe"
|
||||||
VALUE "ProductName", "Techmino"
|
VALUE "ProductName", "Techmino"
|
||||||
VALUE "ProductVersion", "@Version"
|
VALUE "ProductVersion", "@Version"
|
||||||
}
|
}
|
||||||
|
|||||||
228
.github/workflows/main.yml
vendored
@@ -70,8 +70,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
OUTPUT_FOLDER: ./build
|
OUTPUT_FOLDER: ./build
|
||||||
RELEASE_FOLDER: ./release
|
RELEASE_FOLDER: ./release
|
||||||
outputs:
|
|
||||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -99,6 +97,11 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
||||||
path: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
path: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||||
|
- name: Add icon to love package
|
||||||
|
run: |
|
||||||
|
cp ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png media/image/icon.png
|
||||||
|
zip -u ${{ env.CORE_LOVE_PACKAGE_PATH }} media/image/icon.png
|
||||||
|
rm media/image/icon.png
|
||||||
- name: Rename love package
|
- name: Rename love package
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ${{ env.OUTPUT_FOLDER }}
|
mkdir -p ${{ env.OUTPUT_FOLDER }}
|
||||||
@@ -123,12 +126,6 @@ jobs:
|
|||||||
body: ${{ needs.get-info.outputs.update-note }}
|
body: ${{ needs.get-info.outputs.update-note }}
|
||||||
name: ${{ needs.get-info.outputs.update-title }}
|
name: ${{ needs.get-info.outputs.update-title }}
|
||||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||||
- name: Upload to WeTransfer
|
|
||||||
id: transfer
|
|
||||||
run: |
|
|
||||||
curl -sL https://git.io/file-transfer | sh
|
|
||||||
./transfer wet -s -p 16 --no-progress ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.love 2>&1>./wetransfer.log
|
|
||||||
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
auto-test:
|
auto-test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -146,11 +143,10 @@ jobs:
|
|||||||
build-android:
|
build-android:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [get-info, build-core, auto-test]
|
needs: [get-info, build-core, auto-test]
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
env:
|
env:
|
||||||
OUTPUT_FOLDER: ./build
|
OUTPUT_FOLDER: ./build
|
||||||
RELEASE_FOLDER: ./release
|
RELEASE_FOLDER: ./release
|
||||||
outputs:
|
|
||||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -162,12 +158,12 @@ jobs:
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||||
if "${{ env.BUILD_TYPE }}" == "dev":
|
if "${{ env.BUILD_TYPE }}" == "dev":
|
||||||
f.write('bundle-id=org.f26_studio.' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '.snapshot\n')
|
f.write('bundle-id=org.f26_studio.' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '.snapshot\n')
|
||||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '_Snapshot\n')
|
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '-', '${{ needs.get-info.outputs.app-name }}') + '_Snapshot\n')
|
||||||
else:
|
else:
|
||||||
f.write('bundle-id=org.f26_studio.' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
f.write('bundle-id=org.f26_studio.' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '-', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
||||||
- name: Download core love package
|
- name: Download core love package
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
@@ -176,17 +172,10 @@ jobs:
|
|||||||
uses: ./.github/actions/get-cc
|
uses: ./.github/actions/get-cc
|
||||||
with:
|
with:
|
||||||
platform: Android
|
platform: Android
|
||||||
dir: ./ColdClear
|
dir: ./libAndroid
|
||||||
- name: Process ColdClear
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir -p ./libAndroid/armeabi-v7a/
|
|
||||||
mkdir -p ./libAndroid/arm64-v8a/
|
|
||||||
mv ./ColdClear/armeabi-v7a/libCCloader.so ./libAndroid/armeabi-v7a/
|
|
||||||
mv ./ColdClear/arm64-v8a/libCCloader.so ./libAndroid/arm64-v8a/
|
|
||||||
- name: Build Android packages
|
- name: Build Android packages
|
||||||
id: build-packages
|
id: build-packages
|
||||||
uses: love-actions/love-actions-android@v1
|
uses: love-actions/love-actions-android@main
|
||||||
with:
|
with:
|
||||||
app-name: ${{ needs.get-info.outputs.app-name }}
|
app-name: ${{ needs.get-info.outputs.app-name }}
|
||||||
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
||||||
@@ -197,8 +186,8 @@ jobs:
|
|||||||
keystore-store-password: ${{ secrets.ANDROID_KEYSTORE_STOREPASSWORD }}
|
keystore-store-password: ${{ secrets.ANDROID_KEYSTORE_STOREPASSWORD }}
|
||||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||||
resource-path: ./.github/build/android/${{ env.BUILD_TYPE }}/res
|
resource-path: ./.github/build/android/${{ env.BUILD_TYPE }}/res
|
||||||
libs-path: ./ColdClear/
|
|
||||||
extra-assets: ./libAndroid/
|
extra-assets: ./libAndroid/
|
||||||
|
custom-scheme: studio26f://oauth
|
||||||
product-name: ${{ steps.process-app-name.outputs.product-name }}
|
product-name: ${{ steps.process-app-name.outputs.product-name }}
|
||||||
version-string: ${{ needs.get-info.outputs.version-string }}
|
version-string: ${{ needs.get-info.outputs.version-string }}
|
||||||
version-code: ${{ needs.get-info.outputs.version-code }}
|
version-code: ${{ needs.get-info.outputs.version-code }}
|
||||||
@@ -223,22 +212,14 @@ jobs:
|
|||||||
body: ${{ needs.get-info.outputs.update-note }}
|
body: ${{ needs.get-info.outputs.update-note }}
|
||||||
name: ${{ needs.get-info.outputs.update-title }}
|
name: ${{ needs.get-info.outputs.update-title }}
|
||||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||||
- name: Upload to WeTransfer
|
|
||||||
id: transfer
|
|
||||||
run: |
|
|
||||||
curl -sL https://git.io/file-transfer | sh
|
|
||||||
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
|
|
||||||
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
build-ios:
|
build-ios:
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
needs: [get-info, build-core, auto-test]
|
needs: [get-info, build-core, auto-test]
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
env:
|
env:
|
||||||
OUTPUT_FOLDER: ./build
|
OUTPUT_FOLDER: ./build
|
||||||
RELEASE_FOLDER: ./release
|
RELEASE_FOLDER: ./release
|
||||||
outputs:
|
|
||||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -267,7 +248,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
app-name: ${{ needs.get-info.outputs.app-name }}
|
app-name: ${{ needs.get-info.outputs.app-name }}
|
||||||
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
||||||
copyright: "Copyright © 2019-2022 26F-Studio. Some Rights Reserved."
|
copyright: "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||||
icon-path: ./.github/build/iOS/${{ env.BUILD_TYPE }}/icon
|
icon-path: ./.github/build/iOS/${{ env.BUILD_TYPE }}/icon
|
||||||
love-patch: ./.github/build/iOS/love.patch
|
love-patch: ./.github/build/iOS/love.patch
|
||||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||||
@@ -312,12 +293,6 @@ jobs:
|
|||||||
body: ${{ needs.get-info.outputs.update-note }}
|
body: ${{ needs.get-info.outputs.update-note }}
|
||||||
name: ${{ needs.get-info.outputs.update-title }}
|
name: ${{ needs.get-info.outputs.update-title }}
|
||||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||||
- name: Upload to WeTransfer
|
|
||||||
id: transfer
|
|
||||||
run: |
|
|
||||||
wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
|
|
||||||
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
|
|
||||||
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
build-linux:
|
build-linux:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -325,8 +300,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
OUTPUT_FOLDER: ./build
|
OUTPUT_FOLDER: ./build
|
||||||
RELEASE_FOLDER: ./release
|
RELEASE_FOLDER: ./release
|
||||||
outputs:
|
|
||||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -337,12 +310,20 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
product_name = re.sub(r'[^A-Za-z0-9]+', '-', '${{ needs.get-info.outputs.app-name }}').strip('-').lower()
|
||||||
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
with open(os.getenv('GITHUB_OUTPUT'), 'a') as f:
|
||||||
f.write('product-name=' + re.sub(r'[^A-Za-z0-9]+', '_', '${{ needs.get-info.outputs.app-name }}') + '\n')
|
f.write('bundle-id=org.26f-studio.' + product_name + '\n')
|
||||||
|
f.write('product-name=' + product_name + '\n')
|
||||||
- name: Download core love package
|
- name: Download core love package
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
||||||
|
- name: Add icon to love package
|
||||||
|
run: |
|
||||||
|
cp ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png media/image/icon.png
|
||||||
|
zip -u ${{ env.CORE_LOVE_PACKAGE_PATH }} media/image/icon.png
|
||||||
|
rm media/image/icon.png
|
||||||
- name: Download ColdClear
|
- name: Download ColdClear
|
||||||
uses: ./.github/actions/get-cc
|
uses: ./.github/actions/get-cc
|
||||||
with:
|
with:
|
||||||
@@ -352,20 +333,19 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
cd ./ColdClear
|
cd ./ColdClear
|
||||||
mkdir ./libs
|
mkdir -p ./lib/lua/5.1
|
||||||
mv ./x64/libcold_clear.so ./libs
|
mv ./x64/CCloader.so ./lib/lua/5.1
|
||||||
mkdir ./shared
|
|
||||||
mv ./x64/CCloader.so ./shared
|
|
||||||
- name: Build Linux packages
|
- name: Build Linux packages
|
||||||
id: build-packages
|
id: build-packages
|
||||||
uses: love-actions/love-actions-linux@v1
|
uses: love-actions/love-actions-linux@v1
|
||||||
with:
|
with:
|
||||||
desktop-file-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/template.desktop
|
app-name: ${{ needs.get-info.outputs.app-name }}
|
||||||
executable-name: app
|
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
||||||
|
description: Techmino is fun!
|
||||||
|
version-string: ${{ needs.get-info.outputs.version-string }}
|
||||||
icon-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png
|
icon-path: ./.github/build/linux/${{ env.BUILD_TYPE }}/icon.png
|
||||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||||
libs-path: ./ColdClear/libs/
|
lib-path: ./ColdClear/lib
|
||||||
shared-path: ./ColdClear/shared/
|
|
||||||
product-name: ${{ steps.process-app-name.outputs.product-name }}
|
product-name: ${{ steps.process-app-name.outputs.product-name }}
|
||||||
output-folder: ${{ env.OUTPUT_FOLDER }}
|
output-folder: ${{ env.OUTPUT_FOLDER }}
|
||||||
- name: Upload AppImage artifact
|
- name: Upload AppImage artifact
|
||||||
@@ -373,37 +353,37 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: ${{ needs.get-info.outputs.base-name }}_Linux_AppImage
|
name: ${{ needs.get-info.outputs.base-name }}_Linux_AppImage
|
||||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage
|
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage
|
||||||
|
- name: Upload Debian artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ needs.get-info.outputs.base-name }}_Linux_Debian
|
||||||
|
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.deb
|
||||||
- name: Prepare for release
|
- name: Prepare for release
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.AppImage
|
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.AppImage ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.AppImage
|
||||||
|
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}.deb ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.deb
|
||||||
- name: Upload release
|
- name: Upload release
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
allowUpdates: true
|
allowUpdates: true
|
||||||
artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.AppImage
|
artifacts: |
|
||||||
|
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.AppImage
|
||||||
|
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Linux.deb
|
||||||
body: ${{ needs.get-info.outputs.update-note }}
|
body: ${{ needs.get-info.outputs.update-note }}
|
||||||
name: ${{ needs.get-info.outputs.update-title }}
|
name: ${{ needs.get-info.outputs.update-title }}
|
||||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||||
- name: Upload to WeTransfer
|
|
||||||
id: transfer
|
|
||||||
run: |
|
|
||||||
curl -sL https://git.io/file-transfer | sh
|
|
||||||
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
|
|
||||||
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
build-macos-appstore:
|
build-macos-appstore:
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
needs: [get-info, build-core, auto-test]
|
needs: [get-info, build-core, auto-test]
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
env:
|
env:
|
||||||
OUTPUT_FOLDER: ./build
|
OUTPUT_FOLDER: ./build
|
||||||
RELEASE_FOLDER: ./release
|
RELEASE_FOLDER: ./release
|
||||||
outputs:
|
|
||||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -436,7 +416,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
app-name: ${{ needs.get-info.outputs.app-name }}
|
app-name: ${{ needs.get-info.outputs.app-name }}
|
||||||
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
||||||
copyright: "Copyright © 2019-2022 26F-Studio. Some Rights Reserved."
|
copyright: "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||||
icon-path: ./.github/build/macOS/${{ env.BUILD_TYPE }}/icon.icns
|
icon-path: ./.github/build/macOS/${{ env.BUILD_TYPE }}/icon.icns
|
||||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||||
libs-path: ./ColdClear/universal/
|
libs-path: ./ColdClear/universal/
|
||||||
@@ -480,22 +460,14 @@ jobs:
|
|||||||
body: ${{ needs.get-info.outputs.update-note }}
|
body: ${{ needs.get-info.outputs.update-note }}
|
||||||
name: ${{ needs.get-info.outputs.update-title }}
|
name: ${{ needs.get-info.outputs.update-title }}
|
||||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||||
- name: Upload to WeTransfer
|
|
||||||
id: transfer
|
|
||||||
run: |
|
|
||||||
wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
|
|
||||||
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
|
|
||||||
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
build-macos-portable:
|
build-macos-portable:
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
needs: [get-info, build-core, auto-test]
|
needs: [get-info, build-core, auto-test]
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
env:
|
env:
|
||||||
OUTPUT_FOLDER: ./build
|
OUTPUT_FOLDER: ./build
|
||||||
RELEASE_FOLDER: ./release
|
RELEASE_FOLDER: ./release
|
||||||
outputs:
|
|
||||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -528,7 +500,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
app-name: ${{ needs.get-info.outputs.app-name }}
|
app-name: ${{ needs.get-info.outputs.app-name }}
|
||||||
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
bundle-id: ${{ steps.process-app-name.outputs.bundle-id }}
|
||||||
copyright: "Copyright © 2019-2022 26F-Studio. Some Rights Reserved."
|
copyright: "Copyright © 2019-2023 26F-Studio. Some Rights Reserved."
|
||||||
icon-path: ./.github/build/macOS/${{ env.BUILD_TYPE }}/icon.icns
|
icon-path: ./.github/build/macOS/${{ env.BUILD_TYPE }}/icon.icns
|
||||||
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
love-package: ${{ env.CORE_LOVE_PACKAGE_PATH }}
|
||||||
libs-path: ./ColdClear/universal/
|
libs-path: ./ColdClear/universal/
|
||||||
@@ -578,16 +550,40 @@ jobs:
|
|||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
allowUpdates: true
|
allowUpdates: true
|
||||||
artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.pkg, ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.dmg
|
artifacts: |
|
||||||
|
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.pkg
|
||||||
|
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_macOS_portable.dmg
|
||||||
body: ${{ needs.get-info.outputs.update-note }}
|
body: ${{ needs.get-info.outputs.update-note }}
|
||||||
name: ${{ needs.get-info.outputs.update-title }}
|
name: ${{ needs.get-info.outputs.update-title }}
|
||||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||||
- name: Upload to WeTransfer
|
|
||||||
id: transfer
|
build-web:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [get-info, build-core, auto-test]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Download core love package
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
||||||
|
- name: Move core love package
|
||||||
run: |
|
run: |
|
||||||
wget -qO- https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_darwin_amd64.tar.gz | tar xvz
|
mv ${{ env.CORE_LOVE_PACKAGE_PATH }} ./.github/build/web/game.data
|
||||||
./transfer wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
|
- name: Deploy to GitHub Pages
|
||||||
echo "download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $GITHUB_OUTPUT
|
uses: crazy-max/ghaction-github-pages@v3
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
build_dir: ./.github/build/web/
|
||||||
|
keep_history: false
|
||||||
|
target_branch: web-dev
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ needs.get-info.outputs.base-name }}_Web_PWA
|
||||||
|
path: ./.github/build/web/
|
||||||
|
|
||||||
build-windows:
|
build-windows:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
@@ -595,8 +591,6 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
OUTPUT_FOLDER: ./build
|
OUTPUT_FOLDER: ./build
|
||||||
RELEASE_FOLDER: ./release
|
RELEASE_FOLDER: ./release
|
||||||
outputs:
|
|
||||||
download-url: ${{ steps.transfer.outputs.download-url }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -618,6 +612,19 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
platform: Windows
|
platform: Windows
|
||||||
dir: ./ColdClear
|
dir: ./ColdClear
|
||||||
|
- name: Update Windows template
|
||||||
|
shell: python3 {0}
|
||||||
|
run: |
|
||||||
|
version_string = "${{ needs.get-info.outputs.version-string }}"
|
||||||
|
file_version = (f"{version_string.replace('.', ',')},0")
|
||||||
|
with open("./.github/build/windows/${{ env.BUILD_TYPE }}/template.rc", "r+", encoding="utf8") as file:
|
||||||
|
data = file.read()
|
||||||
|
data = data\
|
||||||
|
.replace("@Version", version_string)\
|
||||||
|
.replace("@FileVersion", file_version)
|
||||||
|
file.seek(0)
|
||||||
|
file.truncate()
|
||||||
|
file.write(data)
|
||||||
- name: Build Windows packages
|
- name: Build Windows packages
|
||||||
id: build-packages
|
id: build-packages
|
||||||
uses: love-actions/love-actions-windows@v1
|
uses: love-actions/love-actions-windows@v1
|
||||||
@@ -628,7 +635,9 @@ jobs:
|
|||||||
extra-assets-x86: ./ColdClear/x86/CCloader.dll ./ColdClear/x86/cold_clear.dll
|
extra-assets-x86: ./ColdClear/x86/CCloader.dll ./ColdClear/x86/cold_clear.dll
|
||||||
extra-assets-x64: ./ColdClear/x64/CCloader.dll ./ColdClear/x64/cold_clear.dll
|
extra-assets-x64: ./ColdClear/x64/CCloader.dll ./ColdClear/x64/cold_clear.dll
|
||||||
product-name: ${{ steps.process-app-name.outputs.product-name }}
|
product-name: ${{ steps.process-app-name.outputs.product-name }}
|
||||||
version-string: ${{ needs.get-info.outputs.version-string }}
|
app-id: ${{ secrets.WINDOWS_APP_ID }}
|
||||||
|
project-website: https://www.studio26f.org/
|
||||||
|
installer-languages: ChineseSimplified.isl ChineseTraditional.isl English.isl Spanish.isl French.isl Indonesian.isl Japanese.isl Portuguese.isl
|
||||||
output-folder: ${{ env.OUTPUT_FOLDER }}
|
output-folder: ${{ env.OUTPUT_FOLDER }}
|
||||||
- name: Upload 32-bit artifact
|
- name: Upload 32-bit artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
@@ -640,6 +649,11 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: ${{ needs.get-info.outputs.base-name }}_Windows_x64
|
name: ${{ needs.get-info.outputs.base-name }}_Windows_x64
|
||||||
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip
|
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip
|
||||||
|
- name: Upload installer artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ needs.get-info.outputs.base-name }}_Windows_installer
|
||||||
|
path: ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_installer.exe
|
||||||
- name: Prepare for release
|
- name: Prepare for release
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -647,29 +661,19 @@ jobs:
|
|||||||
mkdir -p ${{ env.RELEASE_FOLDER }}
|
mkdir -p ${{ env.RELEASE_FOLDER }}
|
||||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x86.zip ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x86.zip
|
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x86.zip ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x86.zip
|
||||||
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x64.zip
|
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_x64.zip ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x64.zip
|
||||||
|
cp ${{ env.OUTPUT_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_installer.exe ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_installer.exe
|
||||||
- name: Upload release
|
- name: Upload release
|
||||||
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
if: ${{ startsWith(github.ref, 'refs/tags/pre') || startsWith(github.ref, 'refs/tags/v') }}
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
allowUpdates: true
|
allowUpdates: true
|
||||||
artifacts: ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x86.zip, ${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x64.zip
|
artifacts: |
|
||||||
|
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x86.zip
|
||||||
|
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_x64.zip
|
||||||
|
${{ env.RELEASE_FOLDER }}/${{ steps.process-app-name.outputs.product-name }}_Windows_installer.exe
|
||||||
body: ${{ needs.get-info.outputs.update-note }}
|
body: ${{ needs.get-info.outputs.update-note }}
|
||||||
name: ${{ needs.get-info.outputs.update-title }}
|
name: ${{ needs.get-info.outputs.update-title }}
|
||||||
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
prerelease: ${{ startsWith(github.ref, 'refs/tags/pre') }}
|
||||||
- name: Get transfer
|
|
||||||
env:
|
|
||||||
TEMP_PATH: ./temp.zip
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
curl -L --retry 5 https://github.com/Mikubill/transfer/releases/download/v0.4.17/transfer_0.4.17_windows_amd64.zip -o ${{ env.TEMP_PATH }}
|
|
||||||
7z x ${{ env.TEMP_PATH }} -o./
|
|
||||||
rm ${{ env.TEMP_PATH }}
|
|
||||||
- name: Upload to WeTransfer
|
|
||||||
id: transfer
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
./transfer.exe wet -s -p 16 --no-progress ${{ steps.build-packages.outputs.package-paths }} 2>&1>./wetransfer.log
|
|
||||||
"download-url=$(cat ./wetransfer.log | grep https | cut -f3 -d" ")" >> $env:GITHUB_OUTPUT
|
|
||||||
|
|
||||||
post-build:
|
post-build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -684,44 +688,19 @@ jobs:
|
|||||||
build-linux,
|
build-linux,
|
||||||
build-macos-appstore,
|
build-macos-appstore,
|
||||||
build-macos-portable,
|
build-macos-portable,
|
||||||
|
build-web,
|
||||||
build-windows,
|
build-windows,
|
||||||
]
|
]
|
||||||
env:
|
env:
|
||||||
ACTION_TYPE: ${{ fromJSON('[["Development", "Pre-release"], ["Release", "Release"]]')[startsWith(github.ref, 'refs/tags/v')][startsWith(github.ref, 'refs/tags/pre')] }}
|
ACTION_TYPE: ${{ fromJSON('[["Development", "Pre-release"], ["Release", "Release"]]')[startsWith(github.ref, 'refs/tags/v')][startsWith(github.ref, 'refs/tags/pre')] }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Cleanup
|
- name: Cleanup
|
||||||
uses: geekyeggo/delete-artifact@v2
|
uses: geekyeggo/delete-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
name: ${{ env.CORE_LOVE_ARTIFACT_NAME }}
|
||||||
- name: Display summary
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "# Summary" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "## Version: ${{ needs.get-info.outputs.version-string }}" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "## Package Name: ${{ needs.get-info.outputs.base-name }}" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "## Download links: " >> $GITHUB_STEP_SUMMARY
|
|
||||||
- name: Display download links
|
|
||||||
shell: python3 {0}
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
with open(os.getenv('GITHUB_STEP_SUMMARY'), 'a') as f:
|
|
||||||
if "${{ needs.build-core.result }}" == "success":
|
|
||||||
f.write("- Bare love packages: [WeTransfer](${{ needs.build-core.outputs.download-url }})\n")
|
|
||||||
if "${{ needs.build-android.result }}" == "success":
|
|
||||||
f.write("- Android packages: [WeTransfer](${{ needs.build-android.outputs.download-url }})\n")
|
|
||||||
if "${{ needs.build-ios.result }}" == "success":
|
|
||||||
f.write("- iOS packages: [WeTransfer](${{ needs.build-ios.outputs.download-url }})\n")
|
|
||||||
if "${{ needs.build-linux.result }}" == "success":
|
|
||||||
f.write("- Linux packages: [WeTransfer](${{ needs.build-linux.outputs.download-url }})\n")
|
|
||||||
if "${{ needs.build-macos-appstore.result }}" == "success":
|
|
||||||
f.write("- macOS packages(App Store version): [WeTransfer](${{ needs.build-macos-appstore.outputs.download-url }})\n")
|
|
||||||
if "${{ needs.build-macos-portable.result }}" == "success":
|
|
||||||
f.write("- macOS packages(Portable version): [WeTransfer](${{ needs.build-macos-portable.outputs.download-url }})\n")
|
|
||||||
if "${{ needs.build-windows.result }}" == "success":
|
|
||||||
f.write("- Windows packages: [WeTransfer](${{ needs.build-windows.outputs.download-url }})\n")
|
|
||||||
- name: Send Discord message
|
- name: Send Discord message
|
||||||
uses: Sniddl/discord-commits@v1.5
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: Sniddl/discord-commits@v1.6
|
||||||
with:
|
with:
|
||||||
webhook: ${{ secrets.DISCORD_WEBHOOK }}
|
webhook: ${{ secrets.DISCORD_WEBHOOK }}
|
||||||
message: "Github Actions for **${{ github.repository }}**."
|
message: "Github Actions for **${{ github.repository }}**."
|
||||||
@@ -740,7 +719,6 @@ jobs:
|
|||||||
"fields":[
|
"fields":[
|
||||||
{"name":"Version","value":"${{ needs.get-info.outputs.version-string }}","inline": true},
|
{"name":"Version","value":"${{ needs.get-info.outputs.version-string }}","inline": true},
|
||||||
{"name":"Package Name","value":"${{ needs.get-info.outputs.base-name }}","inline": true},
|
{"name":"Package Name","value":"${{ needs.get-info.outputs.base-name }}","inline": true},
|
||||||
{"name":"Status","value":"**Automatic Test:** ${{ needs.auto-test.result }}\n**Core:** ${{ needs.build-core.result }}\n**Android:** ${{ needs.build-android.result }}\n**iOS:** ${{ needs.build-ios.result }}\n**Linux:** ${{ needs.build-linux.result }}\n**macOS App Store:** ${{ needs.build-macos-appstore.result }}\n**macOS portable:** ${{ needs.build-macos-portable.result }}\n**Windows:** ${{ needs.build-windows.result }}"},
|
{"name":"Status","value":"**Automatic Test:** ${{ needs.auto-test.result }}\n**Core:** ${{ needs.build-core.result }}\n**Android:** ${{ needs.build-android.result }}\n**iOS:** ${{ needs.build-ios.result }}\n**Linux:** ${{ needs.build-linux.result }}\n**macOS App Store:** ${{ needs.build-macos-appstore.result }}\n**macOS portable:** ${{ needs.build-macos-portable.result }}\n**Windows:** ${{ needs.build-windows.result }}"}
|
||||||
{"name":"Download Links","value":"**Core:** ${{ needs.build-core.outputs.download-url}}\n**Android:** ${{ needs.build-android.outputs.download-url }}\n**iOS:** ${{ needs.build-ios.outputs.download-url }}\n**Linux:** ${{ needs.build-linux.outputs.download-url }}\n**macOS App Store:** ${{ needs.build-macos-appstore.outputs.download-url }}\n**macOS portable:** ${{ needs.build-macos-portable.outputs.download-url }}\n**Windows:** ${{ needs.build-windows.outputs.download-url}}"}
|
|
||||||
]
|
]
|
||||||
}'
|
}'
|
||||||
|
|||||||
75
conf.lua
@@ -1,29 +1,42 @@
|
|||||||
|
SYSTEM=love._os
|
||||||
|
if SYSTEM=='OS X' then SYSTEM='macOS' end
|
||||||
|
MOBILE=SYSTEM=='Android' or SYSTEM=='iOS'
|
||||||
|
FNNS=SYSTEM:find'\79\83' -- What does FNSF stand for? IDK so don't ask me lol
|
||||||
|
|
||||||
|
if SYSTEM=='Web' then
|
||||||
|
local oldRead=love.filesystem.read
|
||||||
|
function love.filesystem.read(name,size)
|
||||||
|
if love.filesystem.getInfo(name) then
|
||||||
|
return oldRead(name,size)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function love.conf(t)
|
function love.conf(t)
|
||||||
t.identity='Techmino'-- Saving folder
|
local identity='Techmino'
|
||||||
t.version="11.1"
|
local msaa=0
|
||||||
|
local portrait=false
|
||||||
|
|
||||||
|
local fs=love.filesystem
|
||||||
|
fs.setIdentity(identity)
|
||||||
|
do -- Load grapgic settings from conf/settings
|
||||||
|
local fileData=fs.read('conf/settings')
|
||||||
|
if fileData then
|
||||||
|
msaa=tonumber(fileData:match('"msaa":(%d+)')) or 0;
|
||||||
|
portrait=MOBILE and fileData:find('"portrait":true') and true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
t.identity=identity -- Saving folder
|
||||||
|
t.version="11.4"
|
||||||
t.gammacorrect=false
|
t.gammacorrect=false
|
||||||
t.appendidentity=true-- Search files in source then in save directory
|
t.appendidentity=true -- Search files in source then in save directory
|
||||||
t.accelerometerjoystick=false-- Accelerometer=joystick on ios/android
|
t.accelerometerjoystick=false -- Accelerometer=joystick on ios/android
|
||||||
if t.audio then
|
if t.audio then
|
||||||
t.audio.mic=false
|
t.audio.mic=false
|
||||||
t.audio.mixwithsystem=true
|
t.audio.mixwithsystem=true
|
||||||
end
|
end
|
||||||
|
|
||||||
local W=t.window
|
|
||||||
W.title="Techmino "..require"version".string
|
|
||||||
W.width,W.height=1280,720
|
|
||||||
W.minwidth,W.minheight=640,360
|
|
||||||
W.borderless=false
|
|
||||||
W.resizable=true
|
|
||||||
W.fullscreen=false
|
|
||||||
W.vsync=0-- Unlimited FPS
|
|
||||||
W.msaa=0-- Multi-sampled antialiasing
|
|
||||||
W.depth=0-- Bits/samp of depth buffer
|
|
||||||
W.stencil=1-- Bits/samp of stencil buffer
|
|
||||||
W.display=1-- Monitor ID
|
|
||||||
W.highdpi=true-- High-dpi mode for the window on a Retina display
|
|
||||||
W.x,W.y=nil
|
|
||||||
|
|
||||||
local M=t.modules
|
local M=t.modules
|
||||||
M.window,M.system,M.event,M.thread=true,true,true,true
|
M.window,M.system,M.event,M.thread=true,true,true,true
|
||||||
M.timer,M.math,M.data=true,true,true
|
M.timer,M.math,M.data=true,true,true
|
||||||
@@ -31,4 +44,28 @@ function love.conf(t)
|
|||||||
M.graphics,M.font,M.image=true,true,true
|
M.graphics,M.font,M.image=true,true,true
|
||||||
M.mouse,M.touch,M.keyboard,M.joystick=true,true,true,true
|
M.mouse,M.touch,M.keyboard,M.joystick=true,true,true,true
|
||||||
M.physics=false
|
M.physics=false
|
||||||
|
|
||||||
|
local W=t.window
|
||||||
|
W.vsync=0 -- Unlimited FPS
|
||||||
|
W.msaa=msaa -- Multi-sampled antialiasing
|
||||||
|
W.depth=0 -- Bits/samp of depth buffer
|
||||||
|
W.stencil=1 -- Bits/samp of stencil buffer
|
||||||
|
W.display=1 -- Monitor ID
|
||||||
|
W.highdpi=true -- High-dpi mode for the window on a Retina display
|
||||||
|
W.x,W.y=nil,nil -- Position of the window
|
||||||
|
W.borderless=MOBILE -- Display window frame
|
||||||
|
W.resizable=not MOBILE -- Whether window is resizable
|
||||||
|
|
||||||
|
W.fullscreentype=MOBILE and "exclusive" or "desktop" -- Fullscreen type
|
||||||
|
if portrait then
|
||||||
|
W.width,W.height=720,1280
|
||||||
|
W.minwidth,W.minheight=360,640
|
||||||
|
else
|
||||||
|
W.width,W.height=1280,720
|
||||||
|
W.minwidth,W.minheight=640,360
|
||||||
|
end
|
||||||
|
W.title="Techmino "..require"version".string -- Window title
|
||||||
|
if fs.getInfo('media/image/icon.png') then
|
||||||
|
W.icon='media/image/icon.png'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
664
main.lua
@@ -10,10 +10,8 @@
|
|||||||
Instructions:
|
Instructions:
|
||||||
1. I made a framework called Zframework, *most* code in Zframework are not directly relevant to game;
|
1. I made a framework called Zframework, *most* code in Zframework are not directly relevant to game;
|
||||||
2. "xxx" are texts for reading by player, 'xxx' are string values just used in program;
|
2. "xxx" are texts for reading by player, 'xxx' are string values just used in program;
|
||||||
3. Some goto statement are used for better performance. All goto-labes have detailed names so don't be afraid;
|
3. Except "gcinfo" function of lua itself, other "gc" are short for "graphics";
|
||||||
4. Except "gcinfo" function of lua itself, other "gc" are short for "graphics";
|
]]
|
||||||
]]--
|
|
||||||
|
|
||||||
|
|
||||||
-- Var leak check
|
-- Var leak check
|
||||||
-- setmetatable(_G,{__newindex=function(self,k,v) print('>>'..k..string.rep(" ",26-#k),debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v) end})
|
-- setmetatable(_G,{__newindex=function(self,k,v) print('>>'..k..string.rep(" ",26-#k),debug.traceback():match("\n.-\n\t(.-): "))rawset(self,k,v) end})
|
||||||
@@ -22,13 +20,10 @@
|
|||||||
local fs=love.filesystem
|
local fs=love.filesystem
|
||||||
VERSION=require"version"
|
VERSION=require"version"
|
||||||
TIME=love.timer.getTime
|
TIME=love.timer.getTime
|
||||||
SYSTEM=love.system.getOS() if SYSTEM=='OS X' then SYSTEM='macOS' end
|
|
||||||
FNNS=SYSTEM:find'\79\83'-- What does FNSF stand for? IDK so don't ask me lol
|
|
||||||
MOBILE=SYSTEM=='Android' or SYSTEM=='iOS'
|
|
||||||
|
|
||||||
-- Global Vars & Settings
|
-- Global Vars & Settings
|
||||||
SFXPACKS={'chiptune'}
|
SFXPACKS={'chiptune'}
|
||||||
VOCPACKS={'miya','mono','xiaoya','miku'}
|
VOCPACKS={'miya','mono','xiaoya','flore','miku','zundamon'}
|
||||||
FIRSTLAUNCH=false
|
FIRSTLAUNCH=false
|
||||||
DAILYLAUNCH=false
|
DAILYLAUNCH=false
|
||||||
|
|
||||||
@@ -37,11 +32,6 @@ math.randomseed(os.time()*626)
|
|||||||
love.setDeprecationOutput(false)
|
love.setDeprecationOutput(false)
|
||||||
love.keyboard.setKeyRepeat(true)
|
love.keyboard.setKeyRepeat(true)
|
||||||
love.keyboard.setTextInput(false)
|
love.keyboard.setTextInput(false)
|
||||||
if MOBILE then
|
|
||||||
local w,h,f=love.window.getMode()
|
|
||||||
f.resizable=false
|
|
||||||
love.window.setMode(w,h,f)
|
|
||||||
end
|
|
||||||
|
|
||||||
local _LOADTIMELIST_={}
|
local _LOADTIMELIST_={}
|
||||||
local _LOADTIME_=TIME()
|
local _LOADTIME_=TIME()
|
||||||
@@ -55,12 +45,12 @@ FONT.load{
|
|||||||
FONT.setDefault('norm')
|
FONT.setDefault('norm')
|
||||||
FONT.setFallback('norm')
|
FONT.setFallback('norm')
|
||||||
|
|
||||||
SCR.setSize(1280,720)-- Initialize Screen size
|
SCR.setSize(1280,720) -- Initialize Screen size
|
||||||
BGM.setMaxSources(5)
|
BGM.setMaxSources(5)
|
||||||
VOC.setDiversion(.62)
|
VOC.setDiversion(.62)
|
||||||
|
|
||||||
WIDGET.setOnChange(function()
|
WIDGET.setOnChange(function()
|
||||||
if SCN.cur~='custom_field' then
|
if SCN.cur~='net_game' and SCN.cur~='custom_field' then
|
||||||
local colorList=THEME.getThemeColor()
|
local colorList=THEME.getThemeColor()
|
||||||
if colorList then
|
if colorList then
|
||||||
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
for _,W in next,SCN.scenes[SCN.cur].widgetList do
|
||||||
@@ -72,8 +62,6 @@ WIDGET.setOnChange(function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
|
|
||||||
|
|
||||||
-- Create shortcuts
|
-- Create shortcuts
|
||||||
setFont=FONT.set
|
setFont=FONT.set
|
||||||
getFont=FONT.get
|
getFont=FONT.get
|
||||||
@@ -98,10 +86,6 @@ for _,v in next,{'conf','record','replay','cache','lib'} do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
CHAR=require'parts.char'
|
|
||||||
require'parts.gameTables'
|
|
||||||
require'parts.gameFuncs'
|
|
||||||
|
|
||||||
-- Load shader files from SOURCE ONLY
|
-- Load shader files from SOURCE ONLY
|
||||||
SHADER={}
|
SHADER={}
|
||||||
for _,v in next,fs.getDirectoryItems('parts/shaders') do
|
for _,v in next,fs.getDirectoryItems('parts/shaders') do
|
||||||
@@ -111,31 +95,57 @@ for _,v in next,fs.getDirectoryItems('parts/shaders') do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
THEME= require'parts.theme'
|
-- Load modules
|
||||||
LINE= require'parts.line'
|
CHAR=require'parts.char'
|
||||||
DATA= require'parts.data'
|
require'parts.gameTables'
|
||||||
|
require'parts.gameFuncs'
|
||||||
|
|
||||||
TEXTURE= require'parts.texture'
|
THEME =require'parts.theme'
|
||||||
SKIN= require'parts.skin'
|
LINE =require'parts.line'
|
||||||
USERS= require'parts.users'
|
DATA =require'parts.data'
|
||||||
NET= require'parts.net'
|
|
||||||
VK= require'parts.virtualKey'
|
|
||||||
BOT= require'parts.bot'
|
|
||||||
RSlist= require'parts.RSlist'DSCP=RSlist.TRS.centerPos
|
|
||||||
PLY= require'parts.player'
|
|
||||||
NETPLY= require'parts.netPlayer'
|
|
||||||
MODES= require'parts.modes'
|
|
||||||
|
|
||||||
setmetatable(TEXTURE,{__index=function(self,k)
|
TEXTURE=require'parts.texture'
|
||||||
MES.new('warn',"No texture called: "..k)
|
SKIN =require'parts.skin'
|
||||||
self[k]=PAPER
|
USERS =require'parts.users'
|
||||||
return self[k]
|
NET =require'parts.net'
|
||||||
end})
|
VK =require'parts.virtualKey'
|
||||||
|
BOT =require'parts.bot'
|
||||||
|
RSlist =require'parts.RSlist'; DSCP=RSlist.TRS.centerPos
|
||||||
|
PLY =require'parts.player'
|
||||||
|
NETPLY =require'parts.netPlayer'
|
||||||
|
MODES =require'parts.modes'
|
||||||
|
|
||||||
table.insert(_LOADTIMELIST_,("Load Parts: %.3fs"):format(TIME()-_LOADTIME_))
|
setmetatable(TEXTURE,{
|
||||||
|
__index=function(self,k)
|
||||||
|
MES.new('warn',"No texture called: "..k)
|
||||||
|
self[k]=PAPER
|
||||||
|
return self[k]
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
-- Init Zframework
|
-- Load mode files
|
||||||
do-- Z.setCursor
|
for i=1,#MODES do
|
||||||
|
local m=MODES[i] -- Mode template
|
||||||
|
if FILE.isSafe('parts/modes/'..m.name) then
|
||||||
|
TABLE.complete(require('parts.modes.'..m.name),MODES[i])
|
||||||
|
MODES[m.name],MODES[i]=MODES[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _,v in next,fs.getDirectoryItems('parts/modes') do
|
||||||
|
if FILE.isSafe('parts/modes/'..v) and not MODES[v:sub(1,-5)] then
|
||||||
|
local M={name=v:sub(1,-5)}
|
||||||
|
local modeData=require('parts.modes.'..M.name)
|
||||||
|
if modeData.env then
|
||||||
|
TABLE.complete(modeData,M)
|
||||||
|
MODES[M.name]=M
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(_LOADTIMELIST_,("Load Modules: %.3fs"):format(TIME()-_LOADTIME_))
|
||||||
|
|
||||||
|
-- Initialize Zframework
|
||||||
|
do -- Z.setCursor
|
||||||
local normImg=GC.DO{16,16,
|
local normImg=GC.DO{16,16,
|
||||||
{'fCirc',8,8,4},
|
{'fCirc',8,8,4},
|
||||||
{'setCL',1,1,1,.7},
|
{'setCL',1,1,1,.7},
|
||||||
@@ -165,7 +175,7 @@ Z.setOnFnKeys({
|
|||||||
function() MES.new('error',"挂了") end,
|
function() MES.new('error',"挂了") end,
|
||||||
function()
|
function()
|
||||||
if GAME.playing and not GAME.net then
|
if GAME.playing and not GAME.net then
|
||||||
for _=1,8 do
|
for _=1,1 do
|
||||||
if #PLY_ALIVE>1 then
|
if #PLY_ALIVE>1 then
|
||||||
local P=PLY_ALIVE[math.random(2,#PLY_ALIVE)]
|
local P=PLY_ALIVE[math.random(2,#PLY_ALIVE)]
|
||||||
P.lastRecv=PLAYERS[1]
|
P.lastRecv=PLAYERS[1]
|
||||||
@@ -179,18 +189,20 @@ Z.setOnFnKeys({
|
|||||||
function() if love['_openConsole'] then love['_openConsole']() end end,
|
function() if love['_openConsole'] then love['_openConsole']() end end,
|
||||||
})
|
})
|
||||||
Z.setOnGlobalKey('f11',function()
|
Z.setOnGlobalKey('f11',function()
|
||||||
SETTING.fullscreen=not SETTING.fullscreen
|
if not MOBILE then
|
||||||
applySettings()
|
SETTING.fullscreen=not SETTING.fullscreen
|
||||||
saveSettings()
|
applySettings()
|
||||||
|
saveSettings()
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
Z.setVersionText(VERSION.string)
|
Z.setVersionText(VERSION.string)
|
||||||
Z.setDebugInfo{
|
Z.setDebugInfo{
|
||||||
{"Cache",gcinfo},
|
{"Cache", gcinfo},
|
||||||
{"Tasks",TASK.getCount},
|
{"Tasks", TASK.getCount},
|
||||||
{"Voices",VOC.getQueueCount},
|
{"Voices",VOC.getQueueCount},
|
||||||
{"Audios",love.audio.getSourceCount},
|
{"Audios",love.audio.getSourceCount},
|
||||||
}
|
}
|
||||||
do-- Z.setOnFocus
|
do -- Z.setOnFocus
|
||||||
local function task_autoSoundOff()
|
local function task_autoSoundOff()
|
||||||
while true do
|
while true do
|
||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
@@ -239,15 +251,126 @@ Z.setOnQuit(function()
|
|||||||
destroyPlayers()
|
destroyPlayers()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- Initialize image libs
|
||||||
|
IMG.init{
|
||||||
|
lock='media/image/mess/lock.png',
|
||||||
|
dialCircle='media/image/mess/dialCircle.png',
|
||||||
|
dialNeedle='media/image/mess/dialNeedle.png',
|
||||||
|
lifeIcon='media/image/mess/life.png',
|
||||||
|
badgeIcon='media/image/mess/badge.png',
|
||||||
|
ctrlSpeedLimit='media/image/mess/ctrlSpeedLimit.png',
|
||||||
|
pay1='media/image/mess/pay1.png',
|
||||||
|
pay2='media/image/mess/pay2.png',
|
||||||
|
|
||||||
|
miyaCH1='media/image/characters/miya1.png',
|
||||||
|
miyaCH2='media/image/characters/miya2.png',
|
||||||
|
miyaCH3='media/image/characters/miya3.png',
|
||||||
|
miyaCH4='media/image/characters/miya4.png',
|
||||||
|
miyaHeart='media/image/characters/miya_heart.png',
|
||||||
|
miyaGlow='media/image/characters/miya_glow.png',
|
||||||
|
monoCH='media/image/characters/mono.png',
|
||||||
|
xiaoyaCH='media/image/characters/xiaoya.png',
|
||||||
|
xiaoyaOmino='media/image/characters/xiaoya_Omino.png',
|
||||||
|
floreCH='media/image/characters/flore.png',
|
||||||
|
mikuCH='media/image/characters/miku.png',
|
||||||
|
zundamonCH='media/image/characters/zundamon.png',
|
||||||
|
z={
|
||||||
|
character='media/image/characters/z_character.png',
|
||||||
|
screen1='media/image/characters/z_screen1.png',
|
||||||
|
screen2='media/image/characters/z_screen2.png',
|
||||||
|
particle1='media/image/characters/z_particle1.png',
|
||||||
|
particle2='media/image/characters/z_particle2.png',
|
||||||
|
particle3='media/image/characters/z_particle3.png',
|
||||||
|
particle4='media/image/characters/z_particle4.png',
|
||||||
|
},
|
||||||
|
electric='media/image/characters/electric.png',
|
||||||
|
hbm='media/image/characters/hbm.png',
|
||||||
|
|
||||||
|
lanterns={
|
||||||
|
'media/image/lanterns/1.png',
|
||||||
|
'media/image/lanterns/2.png',
|
||||||
|
'media/image/lanterns/3.png',
|
||||||
|
'media/image/lanterns/4.png',
|
||||||
|
'media/image/lanterns/5.png',
|
||||||
|
'media/image/lanterns/6.png',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
SKIN.load{
|
||||||
|
{name="crystal_scf", path='media/image/skin/crystal_scf.png'},
|
||||||
|
{name="matte_mrz", path='media/image/skin/matte_mrz.png'},
|
||||||
|
{name="shiny_chno", path='media/image/skin/shiny_chno.png'},
|
||||||
|
{name="contrast_mrz", path='media/image/skin/contrast_mrz.png'},
|
||||||
|
{name="polkadots_scf", path='media/image/skin/polkadots_scf.png'},
|
||||||
|
{name="toy_scf", path='media/image/skin/toy_scf.png'},
|
||||||
|
{name="smooth_mrz", path='media/image/skin/smooth_mrz.png'},
|
||||||
|
{name="simple_scf", path='media/image/skin/simple_scf.png'},
|
||||||
|
{name="glass_scf", path='media/image/skin/glass_scf.png'},
|
||||||
|
{name="penta_scf", path='media/image/skin/penta_scf.png'},
|
||||||
|
{name="bubble_scf", path='media/image/skin/bubble_scf.png'},
|
||||||
|
{name="minoes_scf", path='media/image/skin/minoes_scf.png'},
|
||||||
|
{name="pure_mrz", path='media/image/skin/pure_mrz.png'},
|
||||||
|
{name="bright_scf", path='media/image/skin/bright_scf.png'},
|
||||||
|
{name="glow_mrz", path='media/image/skin/glow_mrz.png'},
|
||||||
|
{name="plastic_mrz", path='media/image/skin/plastic_mrz.png'},
|
||||||
|
{name="paper_mrz", path='media/image/skin/paper_mrz.png'},
|
||||||
|
{name="yinyang_scf", path='media/image/skin/yinyang_scf.png'},
|
||||||
|
{name="cartooncup_earety", path='media/image/skin/cartooncup_earety.png'},
|
||||||
|
{name="jelly_miya", path='media/image/skin/jelly_miya.png'},
|
||||||
|
{name="guidetris_xmiao_lusisi",path='media/image/skin/guidetris_xmiao_lusisi.png'},
|
||||||
|
{name="brick_notypey", path='media/image/skin/brick_notypey.png'},
|
||||||
|
{name="gem_notypey", path='media/image/skin/gem_notypey.png'},
|
||||||
|
{name="classic", path='media/image/skin/classic_unknown.png'},
|
||||||
|
{name="ball_shaw", path='media/image/skin/ball_shaw.png'},
|
||||||
|
{name="retro_notypey", path='media/image/skin/retro_notypey.png'},
|
||||||
|
{name="pixel_chno", path='media/image/skin/pixel_chno.png'},
|
||||||
|
{name="pastel_chno", path='media/image/skin/pastel_chno.png'},
|
||||||
|
{name="letters_chno", path='media/image/skin/letters_chno.png'},
|
||||||
|
{name="kanji_chno", path='media/image/skin/kanji_chno.png'},
|
||||||
|
{name="textbone_mrz", path='media/image/skin/textbone_mrz.png'},
|
||||||
|
{name="coloredbone_mrz", path='media/image/skin/coloredbone_mrz.png'},
|
||||||
|
{name="wtf", path='media/image/skin/wtf_mrz.png'},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Initialize sound libs
|
||||||
|
SFX.init((function() --[Warning] Not loading files here, just get the list of sound needed
|
||||||
|
local L={}
|
||||||
|
for _,v in next,fs.getDirectoryItems('media/effect/chiptune/') do
|
||||||
|
if FILE.isSafe('media/effect/chiptune/'..v) then
|
||||||
|
table.insert(L,v:sub(1,-5))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return L
|
||||||
|
end)())
|
||||||
|
BGM.init((function()
|
||||||
|
local L={}
|
||||||
|
for _,v in next,fs.getDirectoryItems('media/music') do
|
||||||
|
if FILE.isSafe('media/music/'..v) then
|
||||||
|
L[v:sub(1,-5)]='media/music/'..v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return L
|
||||||
|
end)())
|
||||||
|
VOC.init{
|
||||||
|
'zspin','sspin','jspin','lspin','tspin','ospin','ispin','pspin','qspin','fspin','espin','uspin','vspin','wspin','xspin','rspin','yspin','nspin','hspin','cspin',
|
||||||
|
'single','double','triple','techrash','pentacrash','hexacrash','heptacrash','octacrash','nonacrash','decacrash','undecacrash','dodecacrash','tridecacrash','tetradecacrash','pentadecacrash','hexadecacrash','heptadecacrash','octadecacrash','nonadecacrash','ultracrash','impossicrash',
|
||||||
|
'mini','b2b','b3b',
|
||||||
|
'perfect_clear','half_clear',
|
||||||
|
'win','lose','bye',
|
||||||
|
'test','happy','doubt',
|
||||||
|
'welcome',
|
||||||
|
}
|
||||||
|
|
||||||
|
table.insert(_LOADTIMELIST_,("Initialize Modules: %.3fs"):format(TIME()-_LOADTIME_))
|
||||||
|
|
||||||
-- Load settings and statistics
|
-- Load settings and statistics
|
||||||
if
|
if
|
||||||
not (
|
not (
|
||||||
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip') or loadFile('conf/user', '-luaon -canSkip') or{},USER) and
|
pcall(TABLE.cover, loadFile('conf/user', '-json -canSkip') or loadFile('conf/user', '-luaon -canSkip') or {},USER) and
|
||||||
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip') or loadFile('conf/unlock', '-luaon -canSkip') or{},RANKS) and
|
pcall(TABLE.cover, loadFile('conf/unlock', '-json -canSkip') or loadFile('conf/unlock', '-luaon -canSkip') or {},RANKS) and
|
||||||
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip') or loadFile('conf/settings', '-luaon -canSkip') or{},SETTING) and
|
pcall(TABLE.update,loadFile('conf/settings', '-json -canSkip') or loadFile('conf/settings', '-luaon -canSkip') or {},SETTING) and
|
||||||
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip') or loadFile('conf/data', '-luaon -canSkip') or{},STAT) and
|
pcall(TABLE.coverR,loadFile('conf/data', '-json -canSkip') or loadFile('conf/data', '-luaon -canSkip') or {},STAT) and
|
||||||
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip') or loadFile('conf/key', '-luaon -canSkip') or{},KEY_MAP) and
|
pcall(TABLE.cover, loadFile('conf/key', '-json -canSkip') or loadFile('conf/key', '-luaon -canSkip') or {},KEY_MAP) and
|
||||||
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip') or loadFile('conf/virtualkey','-luaon -canSkip') or{},VK_ORG)
|
pcall(TABLE.cover, loadFile('conf/virtualkey','-json -canSkip') or loadFile('conf/virtualkey','-luaon -canSkip') or {},VK_ORG)
|
||||||
)
|
)
|
||||||
then
|
then
|
||||||
MES.new('error',"An error occured during loading, and some data was lost.")
|
MES.new('error',"An error occured during loading, and some data was lost.")
|
||||||
@@ -277,270 +400,33 @@ if customData and customData['version']==VERSION.code then
|
|||||||
end
|
end
|
||||||
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
|
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
|
||||||
|
|
||||||
|
|
||||||
-- Initialize image libs
|
|
||||||
IMG.init{
|
|
||||||
lock='media/image/mess/lock.png',
|
|
||||||
dialCircle='media/image/mess/dialCircle.png',
|
|
||||||
dialNeedle='media/image/mess/dialNeedle.png',
|
|
||||||
lifeIcon='media/image/mess/life.png',
|
|
||||||
badgeIcon='media/image/mess/badge.png',
|
|
||||||
ctrlSpeedLimit='media/image/mess/ctrlSpeedLimit.png',
|
|
||||||
pay1='media/image/mess/pay1.png',
|
|
||||||
pay2='media/image/mess/pay2.png',
|
|
||||||
|
|
||||||
miyaCH1='media/image/characters/miya1.png',
|
|
||||||
miyaCH2='media/image/characters/miya2.png',
|
|
||||||
miyaCH3='media/image/characters/miya3.png',
|
|
||||||
miyaCH4='media/image/characters/miya4.png',
|
|
||||||
miyaHeart='media/image/characters/miya_heart.png',
|
|
||||||
miyaGlow='media/image/characters/miya_glow.png',
|
|
||||||
monoCH='media/image/characters/mono.png',
|
|
||||||
xiaoyaCH='media/image/characters/xiaoya.png',
|
|
||||||
xiaoyaOmino='media/image/characters/xiaoya_Omino.png',
|
|
||||||
mikuCH='media/image/characters/miku.png',
|
|
||||||
rinCH='media/image/characters/rin.png',
|
|
||||||
z={
|
|
||||||
character='media/image/characters/z_character.png',
|
|
||||||
screen1='media/image/characters/z_screen1.png',
|
|
||||||
screen2='media/image/characters/z_screen2.png',
|
|
||||||
particle1='media/image/characters/z_particle1.png',
|
|
||||||
particle2='media/image/characters/z_particle2.png',
|
|
||||||
particle3='media/image/characters/z_particle3.png',
|
|
||||||
particle4='media/image/characters/z_particle4.png',
|
|
||||||
},
|
|
||||||
electric='media/image/characters/electric.png',
|
|
||||||
hbm='media/image/characters/hbm.png',
|
|
||||||
|
|
||||||
lanterns={
|
|
||||||
'media/image/lanterns/1.png',
|
|
||||||
'media/image/lanterns/2.png',
|
|
||||||
'media/image/lanterns/3.png',
|
|
||||||
'media/image/lanterns/4.png',
|
|
||||||
'media/image/lanterns/5.png',
|
|
||||||
'media/image/lanterns/6.png',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
SKIN.load{
|
|
||||||
{name="crystal_scf",path='media/image/skin/crystal_scf.png'},
|
|
||||||
{name="matte_mrz",path='media/image/skin/matte_mrz.png'},
|
|
||||||
{name="shiny_chno",path='media/image/skin/shiny_chno.png'},
|
|
||||||
{name="contrast_mrz",path='media/image/skin/contrast_mrz.png'},
|
|
||||||
{name="polkadots_scf",path='media/image/skin/polkadots_scf.png'},
|
|
||||||
{name="toy_scf",path='media/image/skin/toy_scf.png'},
|
|
||||||
{name="smooth_mrz",path='media/image/skin/smooth_mrz.png'},
|
|
||||||
{name="simple_scf",path='media/image/skin/simple_scf.png'},
|
|
||||||
{name="glass_scf",path='media/image/skin/glass_scf.png'},
|
|
||||||
{name="penta_scf",path='media/image/skin/penta_scf.png'},
|
|
||||||
{name="bubble_scf",path='media/image/skin/bubble_scf.png'},
|
|
||||||
{name="minoes_scf",path='media/image/skin/minoes_scf.png'},
|
|
||||||
{name="pure_mrz",path='media/image/skin/pure_mrz.png'},
|
|
||||||
{name="bright_scf",path='media/image/skin/bright_scf.png'},
|
|
||||||
{name="glow_mrz",path='media/image/skin/glow_mrz.png'},
|
|
||||||
{name="plastic_mrz",path='media/image/skin/plastic_mrz.png'},
|
|
||||||
{name="paper_mrz",path='media/image/skin/paper_mrz.png'},
|
|
||||||
{name="yinyang_scf",path='media/image/skin/yinyang_scf.png'},
|
|
||||||
{name="cartooncup_earety",path='media/image/skin/cartooncup_earety.png'},
|
|
||||||
{name="jelly_miya",path='media/image/skin/jelly_miya.png'},
|
|
||||||
{name="guidetris_xmiao_lusisi",path='media/image/skin/guidetris_xmiao_lusisi.png'},
|
|
||||||
{name="brick_notypey",path='media/image/skin/brick_notypey.png'},
|
|
||||||
{name="gem_notypey",path='media/image/skin/gem_notypey.png'},
|
|
||||||
{name="classic",path='media/image/skin/classic_unknown.png'},
|
|
||||||
{name="ball_shaw",path='media/image/skin/ball_shaw.png'},
|
|
||||||
{name="retro_notypey",path='media/image/skin/retro_notypey.png'},
|
|
||||||
{name="pixel_chno",path='media/image/skin/pixel_chno.png'},
|
|
||||||
{name="pastel_chno",path='media/image/skin/pastel_chno.png'},
|
|
||||||
{name="letters_chno",path='media/image/skin/letters_chno.png'},
|
|
||||||
{name="kanji_chno",path='media/image/skin/kanji_chno.png'},
|
|
||||||
{name="textbone_mrz",path='media/image/skin/textbone_mrz.png'},
|
|
||||||
{name="coloredbone_mrz",path='media/image/skin/coloredbone_mrz.png'},
|
|
||||||
{name="wtf",path='media/image/skin/wtf_mrz.png'},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Initialize sound libs
|
|
||||||
SFX.init((function()--[Warning] Not loading files here, just get the list of sound needed
|
|
||||||
local L={}
|
|
||||||
for _,v in next,fs.getDirectoryItems('media/effect/chiptune/') do
|
|
||||||
if FILE.isSafe('media/effect/chiptune/'..v,"Dangerous file : %SAVE%/media/effect/chiptune/"..v) then
|
|
||||||
table.insert(L,v:sub(1,-5))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return L
|
|
||||||
end)())
|
|
||||||
BGM.init((function()
|
|
||||||
local L={}
|
|
||||||
for _,v in next,fs.getDirectoryItems('media/music') do
|
|
||||||
if FILE.isSafe('media/music/'..v,"Dangerous file : %SAVE%/media/music/"..v) then
|
|
||||||
L[v:sub(1,-5)]='media/music/'..v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return L
|
|
||||||
end)())
|
|
||||||
VOC.init{
|
|
||||||
'zspin','sspin','jspin','lspin','tspin','ospin','ispin','pspin','qspin','fspin','espin','uspin','vspin','wspin','xspin','rspin','yspin','nspin','hspin','cspin',
|
|
||||||
'single','double','triple','techrash','pentacrash','hexacrash',
|
|
||||||
'mini','b2b','b3b',
|
|
||||||
'perfect_clear','half_clear',
|
|
||||||
'win','lose','bye',
|
|
||||||
'test','happy','doubt',
|
|
||||||
'welcome',
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Initialize language lib
|
|
||||||
LANG.init('zh',
|
|
||||||
{
|
|
||||||
zh=require'parts.language.lang_zh',
|
|
||||||
zh_trad=require'parts.language.lang_zh_trad',
|
|
||||||
en=require'parts.language.lang_en',
|
|
||||||
fr=require'parts.language.lang_fr',
|
|
||||||
es=require'parts.language.lang_es',
|
|
||||||
pt=require'parts.language.lang_pt',
|
|
||||||
id=require'parts.language.lang_id',
|
|
||||||
ja=require'parts.language.lang_ja',
|
|
||||||
symbol=require'parts.language.lang_symbol',
|
|
||||||
zh_code=require'parts.language.lang_zh_code',
|
|
||||||
-- 1. Add language file to LANG folder;
|
|
||||||
-- 2. Require it;
|
|
||||||
-- 3. Add a button in parts/scenes/lang.lua;
|
|
||||||
},
|
|
||||||
{
|
|
||||||
block=BLOCK_NAMES
|
|
||||||
},
|
|
||||||
(function()
|
|
||||||
local tipMeta={__call=function(L) return L[math.random(#L)] end}
|
|
||||||
return function(L)
|
|
||||||
if type(rawget(L,'getTip'))=='table' then setmetatable(L.getTip,tipMeta) end
|
|
||||||
setmetatable(L,{__index=function(self,k)
|
|
||||||
local mes="No Text ("..SETTING.locale.."): "..k
|
|
||||||
LOG(mes)
|
|
||||||
MES.new('warn',mes)
|
|
||||||
self[k]=CHAR.zChan.thinking
|
|
||||||
return self[k]
|
|
||||||
end})
|
|
||||||
end
|
|
||||||
end)()
|
|
||||||
)
|
|
||||||
|
|
||||||
table.insert(_LOADTIMELIST_,("Initialize Parts: %.3fs"):format(TIME()-_LOADTIME_))
|
|
||||||
|
|
||||||
-- Load background files from SOURCE ONLY
|
|
||||||
for _,v in next,fs.getDirectoryItems('parts/backgrounds') do
|
|
||||||
if FILE.isSafe('parts/backgrounds/'..v) and v:sub(-3)=='lua' then
|
|
||||||
local name=v:sub(1,-5)
|
|
||||||
BG.add(name,require('parts.backgrounds.'..name))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
BG.remList('none')BG.remList('gray')BG.remList('custom')
|
|
||||||
-- Load scene files from SOURCE ONLY
|
|
||||||
for _,v in next,fs.getDirectoryItems('parts/scenes') do
|
|
||||||
if FILE.isSafe('parts/scenes/'..v) then
|
|
||||||
local sceneName=v:sub(1,-5)
|
|
||||||
SCN.add(sceneName,require('parts.scenes.'..sceneName))
|
|
||||||
LANG.addScene(sceneName)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- Load mode files
|
|
||||||
for i=1,#MODES do
|
|
||||||
local m=MODES[i]-- Mode template
|
|
||||||
if FILE.isSafe('parts/modes/'..m.name) then
|
|
||||||
TABLE.complete(require('parts.modes.'..m.name),MODES[i])
|
|
||||||
MODES[m.name],MODES[i]=MODES[i]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
for _,v in next,fs.getDirectoryItems('parts/modes') do
|
|
||||||
if FILE.isSafe('parts/modes/'..v) and not MODES[v:sub(1,-5)] then
|
|
||||||
local M={name=v:sub(1,-5)}
|
|
||||||
local modeData=require('parts.modes.'..M.name)
|
|
||||||
if modeData.env then
|
|
||||||
TABLE.complete(modeData,M)
|
|
||||||
MODES[M.name]=M
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_))
|
|
||||||
|
|
||||||
-- Update data
|
-- Update data
|
||||||
do
|
do
|
||||||
local needSave
|
|
||||||
|
|
||||||
if not fs.getInfo('conf/data') then
|
|
||||||
needSave=true
|
|
||||||
end
|
|
||||||
if type(STAT.version)~='number' then
|
if type(STAT.version)~='number' then
|
||||||
STAT.version=0
|
STAT.version=0
|
||||||
needSave=true
|
|
||||||
end
|
|
||||||
if STAT.version<1500 then
|
|
||||||
FILE.clear_s('')
|
|
||||||
end
|
|
||||||
if STAT.version<1505 then
|
|
||||||
fs.remove('record/bigbang.rec')
|
|
||||||
fs.remove('conf/replay')
|
|
||||||
end
|
|
||||||
if STAT.version==1506 then
|
|
||||||
local temp1,temp2
|
|
||||||
if fs.getInfo('record/master_l.rec') then
|
|
||||||
temp1=fs.read('record/master_l.rec')
|
|
||||||
end
|
|
||||||
if fs.getInfo('record/master_u.rec') then
|
|
||||||
temp2=fs.read('record/master_u.rec')
|
|
||||||
end
|
|
||||||
if temp1 then
|
|
||||||
fs.write('record/master_u.rec',temp1)
|
|
||||||
end
|
|
||||||
if temp2 then
|
|
||||||
fs.write('record/master_l.rec',temp2)
|
|
||||||
end
|
|
||||||
RANKS.master_l,RANKS.master_u=RANKS.master_u,RANKS.master_l
|
|
||||||
if RANKS.tsd_u then
|
|
||||||
RANKS.tsd_u=0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if STAT.version==1601 then
|
|
||||||
RANKS.round_e=nil
|
|
||||||
RANKS.round_n=nil
|
|
||||||
RANKS.round_h=nil
|
|
||||||
RANKS.round_l=nil
|
|
||||||
RANKS.round_u=nil
|
|
||||||
fs.remove('record/round_e.rec')
|
|
||||||
fs.remove('record/round_n.rec')
|
|
||||||
fs.remove('record/round_h.rec')
|
|
||||||
fs.remove('record/round_l.rec')
|
|
||||||
fs.remove('record/round_u.rec')
|
|
||||||
end
|
end
|
||||||
if STAT.version<1700 and SETTING.dascut<5 then
|
if STAT.version<1700 and SETTING.dascut<5 then
|
||||||
SETTING.dascut=SETTING.dascut+1
|
SETTING.dascut=SETTING.dascut+1
|
||||||
needSave=true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if RANKS.stack_e then
|
if RANKS.stack_e then
|
||||||
RANKS.stack_e=nil
|
RANKS.stack_e=nil; fs.remove('record/stack_e.rec')
|
||||||
RANKS.stack_h=nil
|
RANKS.stack_h=nil; fs.remove('record/stack_h.rec')
|
||||||
RANKS.stack_u=nil
|
RANKS.stack_u=nil; fs.remove('record/stack_u.rec')
|
||||||
fs.remove('record/stack_e.rec')
|
|
||||||
fs.remove('record/stack_h.rec')
|
|
||||||
fs.remove('record/stack_u.rec')
|
|
||||||
end
|
end
|
||||||
if RANKS.stack_20l then
|
if RANKS.stack_20l then
|
||||||
RANKS.stack_20l=nil
|
RANKS.stack_20l=nil; fs.remove('record/stack_20l.rec')
|
||||||
RANKS.stack_40l=nil
|
RANKS.stack_40l=nil; fs.remove('record/stack_40l.rec')
|
||||||
RANKS.stack_100l=nil
|
RANKS.stack_100l=nil; fs.remove('record/stack_100l.rec')
|
||||||
fs.remove('record/stack_20l.rec')
|
|
||||||
fs.remove('record/stack_40l.rec')
|
|
||||||
fs.remove('record/stack_100l.rec')
|
|
||||||
end
|
end
|
||||||
if RANKS.rhythm_e then
|
if RANKS.rhythm_e then
|
||||||
RANKS.rhythm_e=nil
|
RANKS.rhythm_e=nil; fs.remove('record/rhythm_e.rec')
|
||||||
RANKS.rhythm_h=nil
|
RANKS.rhythm_h=nil; fs.remove('record/rhythm_h.rec')
|
||||||
RANKS.rhythm_u=nil
|
RANKS.rhythm_u=nil; fs.remove('record/rhythm_u.rec')
|
||||||
fs.remove('record/rhythm_e.rec')
|
|
||||||
fs.remove('record/rhythm_h.rec')
|
|
||||||
fs.remove('record/rhythm_u.rec')
|
|
||||||
end
|
|
||||||
if RANKS.bigbang or RANKS.clearRush then
|
|
||||||
fs.remove('record/clearRush.rec')
|
|
||||||
fs.remove('record/bigbang.rec')
|
|
||||||
end
|
end
|
||||||
|
if RANKS.bigbang then fs.remove('record/bigbang.rec') end
|
||||||
|
if RANKS.clearRush then fs.remove('record/clearRush.rec') end
|
||||||
|
|
||||||
if STAT.version~=VERSION.code then
|
if STAT.version~=VERSION.code then
|
||||||
for k,v in next,MODE_UPDATE_MAP do
|
for k,v in next,MODE_UPDATE_MAP do
|
||||||
if RANKS[k] then
|
if RANKS[k] then
|
||||||
@@ -558,7 +444,6 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
STAT.version=VERSION.code
|
STAT.version=VERSION.code
|
||||||
needSave=true
|
|
||||||
end
|
end
|
||||||
SETTING.appLock,SETTING.dataSaving,SETTING.swap,SETTING.autoLogin=nil
|
SETTING.appLock,SETTING.dataSaving,SETTING.swap,SETTING.autoLogin=nil
|
||||||
if not SETTING.VKSkin then SETTING.VKSkin=1 end
|
if not SETTING.VKSkin then SETTING.VKSkin=1 end
|
||||||
@@ -576,41 +461,95 @@ do
|
|||||||
if RANKS.infinite then RANKS.infinite=0 end
|
if RANKS.infinite then RANKS.infinite=0 end
|
||||||
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
|
if RANKS.infinite_dig then RANKS.infinite_dig=0 end
|
||||||
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
|
if not RANKS.sprint_10l then RANKS.sprint_10l=0 end
|
||||||
if RANKS.master_l then RANKS.master_n,RANKS.master_l=RANKS.master_l needSave=true end
|
if RANKS.master_l then RANKS.master_n,RANKS.master_l=RANKS.master_l end
|
||||||
if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u needSave=true end
|
if RANKS.master_u then RANKS.master_h,RANKS.master_u=RANKS.master_u end
|
||||||
for _,v in next,VK_ORG do v.color=nil end
|
for _,v in next,VK_ORG do v.color=nil end
|
||||||
for name,rank in next,RANKS do
|
for name,rank in next,RANKS do
|
||||||
if type(name)=='number' or type(rank)~='number' then
|
if type(name)=='number' or type(rank)~='number' then
|
||||||
RANKS[name]=nil
|
RANKS[name]=nil
|
||||||
needSave=true
|
|
||||||
else
|
else
|
||||||
local M=MODES[name]
|
local M=MODES[name]
|
||||||
if M and M.unlock and rank>0 then
|
if M and M.unlock and rank>0 then
|
||||||
for _,unlockName in next,M.unlock do
|
for _,unlockName in next,M.unlock do
|
||||||
if not RANKS[unlockName] then
|
if not RANKS[unlockName] then
|
||||||
RANKS[unlockName]=0
|
RANKS[unlockName]=0
|
||||||
needSave=true
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not (M and M.x) then
|
if not (M and M.x) then
|
||||||
RANKS[name]=nil
|
RANKS[name]=nil
|
||||||
needSave=true
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not MODES[STAT.lastPlay] then
|
if not MODES[STAT.lastPlay] then
|
||||||
STAT.lastPlay='sprint_10l'
|
STAT.lastPlay='sprint_10l'
|
||||||
needSave=true
|
|
||||||
end
|
end
|
||||||
|
fs.remove('conf/account')
|
||||||
|
|
||||||
if needSave then
|
saveStats()
|
||||||
saveStats()
|
saveProgress()
|
||||||
saveProgress()
|
saveSettings()
|
||||||
saveSettings()
|
end
|
||||||
love.event.quit('restart')
|
|
||||||
|
-- Initialize language lib
|
||||||
|
LANG.init('zh',
|
||||||
|
{
|
||||||
|
zh=require'parts.language.lang_zh',
|
||||||
|
zh_trad=require'parts.language.lang_zh_trad',
|
||||||
|
en=require'parts.language.lang_en',
|
||||||
|
fr=require'parts.language.lang_fr',
|
||||||
|
es=require'parts.language.lang_es',
|
||||||
|
pt=require'parts.language.lang_pt',
|
||||||
|
id=require'parts.language.lang_id',
|
||||||
|
ja=require'parts.language.lang_ja',
|
||||||
|
symbol=require'parts.language.lang_symbol',
|
||||||
|
zh_code=require'parts.language.lang_zh_code',
|
||||||
|
vi=require'parts.language.lang_vi',
|
||||||
|
-- 1. Add language file to LANG folder;
|
||||||
|
-- 2. Require it;
|
||||||
|
-- 3. Add a button in parts/scenes/lang.lua;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
block=BLOCK_NAMES,
|
||||||
|
},
|
||||||
|
(function()
|
||||||
|
local tipMeta={__call=function(L) return L[math.random(#L)] end}
|
||||||
|
return function(L)
|
||||||
|
if type(rawget(L,'getTip'))=='table' then setmetatable(L.getTip,tipMeta) end
|
||||||
|
setmetatable(L,{
|
||||||
|
__index=function(self,k)
|
||||||
|
local mes="No Text ("..SETTING.locale.."): "..k
|
||||||
|
LOG(mes)
|
||||||
|
MES.new('warn',mes)
|
||||||
|
self[k]="["..k.."]"
|
||||||
|
return self[k]
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end)()
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Load background files from SOURCE ONLY
|
||||||
|
for _,v in next,fs.getDirectoryItems('parts/backgrounds') do
|
||||||
|
if FILE.isSafe('parts/backgrounds/'..v) and v:sub(-3)=='lua' then
|
||||||
|
local name=v:sub(1,-5)
|
||||||
|
BG.add(name,require('parts.backgrounds.'..name))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
BG.remList('none')
|
||||||
|
BG.remList('gray')
|
||||||
|
BG.remList('custom')
|
||||||
|
|
||||||
|
-- Load scene files from SOURCE ONLY
|
||||||
|
for _,v in next,fs.getDirectoryItems('parts/scenes') do
|
||||||
|
if FILE.isSafe('parts/scenes/'..v) then
|
||||||
|
local sceneName=v:sub(1,-5)
|
||||||
|
SCN.add(sceneName,require('parts.scenes.'..sceneName))
|
||||||
|
LANG.addScene(sceneName)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(_LOADTIMELIST_,("Load Files: %.3fs"):format(TIME()-_LOADTIME_))
|
||||||
|
|
||||||
-- First start
|
-- First start
|
||||||
FIRSTLAUNCH=STAT.run==0
|
FIRSTLAUNCH=STAT.run==0
|
||||||
@@ -626,50 +565,63 @@ applySettings()
|
|||||||
-- Load replays
|
-- Load replays
|
||||||
for _,fileName in next,fs.getDirectoryItems('replay') do
|
for _,fileName in next,fs.getDirectoryItems('replay') do
|
||||||
if fileName:sub(12,12):match("[a-zA-Z]") then
|
if fileName:sub(12,12):match("[a-zA-Z]") then
|
||||||
local date,mode,version,player,seed,setting,mod
|
repeat
|
||||||
local fileData=fs.read('replay/'..fileName)
|
local date,mode,version,player,seed,setting,mod
|
||||||
date, fileData=STRING.readLine(fileData)date=date:gsub("[a-zA-Z]","")
|
local success,fileData=true,fs.read('replay/'..fileName)
|
||||||
mode, fileData=STRING.readLine(fileData)mode=MODE_UPDATE_MAP[mode] or mode
|
date,fileData=STRING.readLine(fileData)
|
||||||
version,fileData=STRING.readLine(fileData)
|
date=date:gsub("[a-zA-Z]","")
|
||||||
player, fileData=STRING.readLine(fileData) if player=="Local Player" then player="Stacker" end
|
mode,fileData=STRING.readLine(fileData)
|
||||||
local success
|
mode=MODE_UPDATE_MAP[mode] or mode
|
||||||
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
|
version,fileData=STRING.readLine(fileData)
|
||||||
if not success then goto BREAK_cannotParse end
|
player,fileData=STRING.readLine(fileData)
|
||||||
seed, fileData=STRING.readLine(fileData)
|
if player=="Local Player" then player="Stacker" end
|
||||||
setting,fileData=STRING.readLine(fileData)setting=JSON.decode(setting)
|
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
|
||||||
mod, fileData=STRING.readLine(fileData)mod=JSON.decode(mod)
|
if not success then break end
|
||||||
if
|
seed,fileData=STRING.readLine(fileData)
|
||||||
not setting or
|
setting,fileData=STRING.readLine(fileData)
|
||||||
not mod or
|
setting=JSON.decode(setting)
|
||||||
not mode or
|
mod,fileData=STRING.readLine(fileData)
|
||||||
#mode==0
|
mod=JSON.decode(mod)
|
||||||
then goto BREAK_cannotParse end
|
if
|
||||||
|
not setting or
|
||||||
|
not mod or
|
||||||
|
not mode or
|
||||||
|
#mode==0
|
||||||
|
then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
fs.remove('replay/'..fileName)
|
fs.remove('replay/'..fileName)
|
||||||
local newName=fileName:sub(1,10)..fileName:sub(15)
|
local newName=fileName:sub(1,10)..fileName:sub(15)
|
||||||
fs.write('replay/'..newName,
|
fs.write('replay/'..newName,
|
||||||
love.data.compress('string','zlib',
|
love.data.compress('string','zlib',
|
||||||
JSON.encode{
|
JSON.encode{
|
||||||
date=date,
|
date=date,
|
||||||
mode=mode,
|
mode=mode,
|
||||||
version=version,
|
version=version,
|
||||||
player=player,
|
player=player,
|
||||||
seed=seed,
|
seed=seed,
|
||||||
setting=setting,
|
setting=setting,
|
||||||
mod=mod,
|
mod=mod,
|
||||||
}.."\n"..
|
}.."\n"..
|
||||||
fileData
|
fileData
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
fileName=newName
|
||||||
fileName=newName
|
until true
|
||||||
end
|
end
|
||||||
::BREAK_cannotParse::
|
|
||||||
local rep=DATA.parseReplay('replay/'..fileName)
|
local rep=DATA.parseReplay('replay/'..fileName)
|
||||||
table.insert(REPLAY,rep)
|
table.insert(REPLAY,rep)
|
||||||
end
|
end
|
||||||
table.sort(REPLAY,function(a,b) return a.fileName>b.fileName end)
|
table.sort(REPLAY,function(a,b) return a.fileName>b.fileName end)
|
||||||
|
|
||||||
table.insert(_LOADTIMELIST_,("Initialize Data: %.3fs"):format(TIME()-_LOADTIME_))
|
AUTHURL="https://studio26f.org/oauth?product=techmino"
|
||||||
|
AUTHHOST="cafuuchino1.3322.org:8081"
|
||||||
|
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
|
||||||
|
HTTP.setHost("cafuuchino1.3322.org:10026")
|
||||||
|
HTTP.setThreadCount(1)
|
||||||
|
|
||||||
|
table.insert(_LOADTIMELIST_,("Load Resources: %.3fs"):format(TIME()-_LOADTIME_))
|
||||||
|
|
||||||
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i]) end
|
for i=1,#_LOADTIMELIST_ do LOG(_LOADTIMELIST_[i]) end
|
||||||
|
|
||||||
@@ -679,7 +631,8 @@ if TABLE.find(arg,'-- test') then
|
|||||||
while not LOADED do coroutine.yield() end
|
while not LOADED do coroutine.yield() end
|
||||||
|
|
||||||
LOG("\27[92m\27[1mAutomatic Test Started\27[0m")
|
LOG("\27[92m\27[1mAutomatic Test Started\27[0m")
|
||||||
BGM.setVol(0)SFX.setVol(0)
|
BGM.setVol(0)
|
||||||
|
SFX.setVol(0)
|
||||||
love.keypressed('space')
|
love.keypressed('space')
|
||||||
TEST.yieldUntilNextScene()
|
TEST.yieldUntilNextScene()
|
||||||
|
|
||||||
@@ -706,6 +659,3 @@ if TABLE.find(arg,'-- test') then
|
|||||||
love.event.quit(1)
|
love.event.quit(1)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
WS.switchHost('cafuuchino1.3322.org','10026','/techmino/ws/v1')
|
|
||||||
HTTP.setHost("cafuuchino1.3322.org:10026")
|
|
||||||
HTTP.setThreadCount(1)
|
|
||||||
|
|||||||
BIN
media/image/characters/flore.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 117 KiB |
BIN
media/image/characters/zundamon.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 483 B After Width: | Height: | Size: 933 B |
|
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 1.3 KiB |
BIN
media/image/modeicon/hidden3.png
Normal file
|
After Width: | Height: | Size: 950 B |
BIN
media/image/modeicon/hidden4.png
Normal file
|
After Width: | Height: | Size: 925 B |
BIN
media/image/modeicon/hidden5.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 488 B |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 801 B |
|
Before Width: | Height: | Size: 457 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 25 KiB |