mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-26 08:50:13 +00:00
Compare commits
1799 commits
v0.3.6-pre
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
33f8a63c99 | ||
|
|
eb40478b5e | ||
|
|
7015e09f90 | ||
|
|
7484ce6c2d | ||
|
|
97b44bf833 | ||
|
|
a491202f93 | ||
|
|
d50bca21c4 | ||
|
|
618b479818 | ||
|
|
ca08d4313a | ||
|
|
e9d0a58e0a | ||
|
|
2b4d910a4a | ||
|
|
d086d68a2f | ||
|
|
d0e2d0423f | ||
|
|
c7a82923ac | ||
|
|
b1a87114ad | ||
|
|
3215832fed | ||
|
|
123a19ce1c | ||
|
|
6343ceb151 | ||
|
|
7066062136 | ||
|
|
b2e2ad12c6 | ||
|
|
6694a0aa66 | ||
|
|
d73c84d98d | ||
|
|
5fe12f3f62 | ||
|
|
313a1877d5 | ||
|
|
12355316b3 | ||
|
|
4c26b1a8ae | ||
|
|
0d9aac2656 | ||
|
|
4309c8c69b | ||
|
|
e4194b1fc0 | ||
|
|
56f8f5c592 | ||
|
|
43caf7b5e6 | ||
|
|
2c79d82446 | ||
|
|
3f54d8bcb8 | ||
|
|
58839e611e | ||
|
|
0f19ed40f8 | ||
|
|
ea15740e17 | ||
|
|
a0267e6e95 | ||
|
|
f02fa10126 | ||
|
|
fe043b5da8 | ||
|
|
c8617d20c8 | ||
|
|
03aa915a05 | ||
|
|
25d1a7742d | ||
|
|
f39271453b | ||
|
|
40dd39feed | ||
|
|
376d0a0f77 | ||
|
|
b66033c6d8 | ||
|
|
b892dca0e5 | ||
|
|
4d46641ac2 | ||
|
|
eea205ffc9 | ||
|
|
ba99d505dd | ||
|
|
05f2bedf88 | ||
|
|
d646a0451d | ||
|
|
98b9e502c5 | ||
|
|
087e42d7a1 | ||
|
|
3ca8f20585 | ||
|
|
fa2e8ad0fe | ||
|
|
15f12d86b3 | ||
|
|
6bfa3dc402 | ||
|
|
432da20b3e | ||
|
|
1dd3823013 | ||
|
|
ed0cb0ad25 | ||
|
|
05e85d9fa7 | ||
|
|
7a5d80e801 | ||
|
|
891b9e5822 | ||
|
|
9a6a430768 | ||
|
|
a152023e5e | ||
|
|
1556559211 | ||
|
|
0a32c0fa27 | ||
|
|
d44411c304 | ||
|
|
c09a443b18 | ||
|
|
4fcb92dfdc | ||
|
|
ceb8006c3d | ||
|
|
d2a396df11 | ||
|
|
cbfe7d5f44 | ||
|
|
c8c01f8ac0 | ||
|
|
c18720f0f0 | ||
|
|
62e99da1c2 | ||
|
|
9ab70c7b1f | ||
|
|
d083ac11fa | ||
|
|
2e136e9fdc | ||
|
|
5e8d4e76c8 | ||
|
|
b10c8b7aea | ||
|
|
8a617e842b | ||
|
|
98cc282e7e | ||
|
|
a3934807af | ||
|
|
2c3bd06898 | ||
|
|
1a3146395a | ||
|
|
503f9ed650 | ||
|
|
d873f27070 | ||
|
|
a53342e23f | ||
|
|
285c4caf24 | ||
|
|
d9c12c733d | ||
|
|
93dabe83e4 | ||
|
|
c874ffc6b6 | ||
|
|
9a47def27c | ||
|
|
2b582f8a20 | ||
|
|
6c873622dc | ||
|
|
7927d98e79 | ||
|
|
2f68282afc | ||
|
|
a503d09d9b | ||
|
|
75db30c91e | ||
|
|
da5b464cf6 | ||
|
|
9cd2cfa46e | ||
|
|
0dc3e52d32 | ||
|
|
4f28187661 | ||
|
|
a20984ada2 | ||
|
|
2e9dd01d12 | ||
|
|
47e317debf | ||
|
|
d0743c5fee | ||
|
|
757fc857cd | ||
|
|
b8c33c7d9b | ||
|
|
11ecc475c8 | ||
|
|
a5aa1faf7a | ||
|
|
f9464dbacd | ||
|
|
df610ff472 | ||
|
|
d1d3645d2b | ||
|
|
2947e31375 | ||
|
|
79bc3a7fb6 | ||
|
|
0a2667aa05 | ||
|
|
397185d33c | ||
|
|
adc1b40290 | ||
|
|
fa25d8b6b9 | ||
|
|
3f324ddf3e | ||
|
|
97ec915e48 | ||
|
|
c25151eff1 | ||
|
|
ee6551b286 | ||
|
|
3f3ed22f78 | ||
|
|
81bd0791aa | ||
|
|
3a4d2e30bc | ||
|
|
9986de0529 | ||
|
|
587c0ef60d | ||
|
|
b9a1b0244b | ||
|
|
922d6bc8f6 | ||
|
|
42f2873c0d | ||
|
|
7b88b0c6ec | ||
|
|
f4d78e5820 | ||
|
|
e2fec0933e | ||
|
|
02456ec7c6 | ||
|
|
bafe036e79 | ||
|
|
abe5cc73df | ||
|
|
3b4909a140 | ||
|
|
7967878cd9 | ||
|
|
1b075e17f1 | ||
|
|
216c83d445 | ||
|
|
572b3ce7ca | ||
|
|
a70f42d4f6 | ||
|
|
2f4065cea0 | ||
|
|
aa164478e1 | ||
|
|
2365091266 | ||
|
|
40907757b0 | ||
|
|
96c5f27160 | ||
|
|
491dd2b673 | ||
|
|
661fba12c0 | ||
|
|
8fd1dfb4f1 | ||
|
|
f951dbb95d | ||
|
|
81180086e3 | ||
|
|
92a1e9b0c3 | ||
|
|
e46919cc2c | ||
|
|
8d4478b87c | ||
|
|
22f8b721c7 | ||
|
|
5678de562f | ||
|
|
0e78427767 | ||
|
|
e72d6ad852 | ||
|
|
101ea9fd17 | ||
|
|
a7e8a6eb83 | ||
|
|
c3fd6d2f85 | ||
|
|
b25dba8069 | ||
|
|
d00ebd00a0 | ||
|
|
2a2db5cfb5 | ||
|
|
25b35d5224 | ||
|
|
015574f0bd | ||
|
|
bf8c0aaf1a | ||
|
|
ebe52d3eba | ||
|
|
74ef454538 | ||
|
|
4e04050f91 | ||
|
|
e4da47b0d7 | ||
|
|
8fd735f4a3 | ||
|
|
a8c241f6bd | ||
|
|
f37a83fc52 | ||
|
|
7425881e98 | ||
|
|
9a570b49db | ||
|
|
be4cbad0b0 | ||
|
|
b6047cdce8 | ||
|
|
f9856c1046 | ||
|
|
31ab76427f | ||
|
|
cbdf03c07e | ||
|
|
296121f5e7 | ||
|
|
73ce601bb5 | ||
|
|
5086520354 | ||
|
|
f29ebbdd71 | ||
|
|
6d72228f66 | ||
|
|
ab8ff6b7e5 | ||
|
|
e9ce062112 | ||
|
|
329a1f4b12 | ||
|
|
ce4f93dfcb | ||
|
|
1482694495 | ||
|
|
027640189a | ||
|
|
7565019dc9 | ||
|
|
bd725f0bbe | ||
|
|
572bb4ef36 | ||
|
|
3103662528 | ||
|
|
42222e4095 | ||
|
|
a4c8fd621d | ||
|
|
afc5266acf | ||
|
|
c836b421fc | ||
|
|
42b776dbf8 | ||
|
|
d575c06bc1 | ||
|
|
be841fb3e1 | ||
|
|
1f6865afce | ||
|
|
1fd220de29 | ||
|
|
1988e778c7 | ||
|
|
24e2069225 | ||
|
|
d8c0820c76 | ||
|
|
964437cdf4 | ||
|
|
5d6376f3f1 | ||
|
|
a4ff315c81 | ||
|
|
3ad917bd95 | ||
|
|
9b2f100387 | ||
|
|
c97898712b | ||
|
|
8dca33e5cc | ||
|
|
b1171327cb | ||
|
|
4364fa7bbe | ||
|
|
9267aec0b0 | ||
|
|
ac9214c03f | ||
|
|
f580fd7e6b | ||
|
|
dcd78f4f28 | ||
|
|
4af9838ab4 | ||
|
|
aebc905261 | ||
|
|
57ccee2c28 | ||
|
|
586e9e74ff | ||
|
|
82990f5891 | ||
|
|
e7be60c624 | ||
|
|
2c6a345e32 | ||
|
|
a4d54e83bc | ||
|
|
a73c680190 | ||
|
|
2da0883544 | ||
|
|
5ee2b55f4b | ||
|
|
774f9bf214 | ||
|
|
c6a6849c86 | ||
|
|
6ab1a189c7 | ||
|
|
d24d12fb8f | ||
|
|
70a50e45f5 | ||
|
|
df79e08788 | ||
|
|
12fb8f73f7 | ||
|
|
b407d5d632 | ||
|
|
5d93108a88 | ||
|
|
de903e363c | ||
|
|
d36172fc90 | ||
|
|
b3ad64099b | ||
|
|
5ab6286f7e | ||
|
|
b04e36aaa4 | ||
|
|
6687c617d9 | ||
|
|
900626f5fe | ||
|
|
19b8d31da2 | ||
|
|
64c0c75bbf | ||
|
|
d20357415b | ||
|
|
2e6400f22e | ||
|
|
2560bd1307 | ||
|
|
b5f7659db5 | ||
|
|
a02e021730 | ||
|
|
7f0d9fe432 | ||
|
|
82d3abe5da | ||
|
|
d4c1eda22b | ||
|
|
494175e2a7 | ||
|
|
f99f4a732a | ||
|
|
74d7e969ab | ||
|
|
1f3e362512 | ||
|
|
8e51754615 | ||
|
|
70a5d3240c | ||
|
|
6a0e86efe8 | ||
|
|
91794f421e | ||
|
|
c7e16646fc | ||
|
|
cfb9e09e1d | ||
|
|
d6a25ca8f2 | ||
|
|
61b54cfa74 | ||
|
|
ec082e029c | ||
|
|
8229a963d1 | ||
|
|
0d49cc8b94 | ||
|
|
a63f980e02 | ||
|
|
7807058f9c | ||
|
|
b2826ce589 | ||
|
|
e64f9f4585 | ||
|
|
a39acd71ba | ||
|
|
4f4c169825 | ||
|
|
b7e5034f27 | ||
|
|
b8d92b5ff2 | ||
|
|
8f2a2dfbb4 | ||
|
|
3b8165cbef | ||
|
|
7105672f06 | ||
|
|
e21f808714 | ||
|
|
0d2fd02dca | ||
|
|
b99bf7021b | ||
|
|
154140f185 | ||
|
|
760c6a2790 | ||
|
|
60904e2e15 | ||
|
|
d75f2c62e5 | ||
|
|
55ef607093 | ||
|
|
0a6fdfb8b1 | ||
|
|
855f00c5b5 | ||
|
|
c20db42479 | ||
|
|
6e863a323a | ||
|
|
45850c5aa9 | ||
|
|
3ae18f03a1 | ||
|
|
00a97aae3f | ||
|
|
ce26284b90 | ||
|
|
8555c80aa2 | ||
|
|
7459f27771 | ||
|
|
74125b7340 | ||
|
|
fe8950bd4b | ||
|
|
32a51aa93d | ||
|
|
22798d1c76 | ||
|
|
395d6cdcba | ||
|
|
8cc90a69e8 | ||
|
|
37a5b4c9d9 | ||
|
|
fc182f8653 | ||
|
|
d68ef2ceb6 | ||
|
|
44d2b80998 | ||
|
|
0885f885e8 | ||
|
|
3dcd489e81 | ||
|
|
9f49f543f6 | ||
|
|
df55242c50 | ||
|
|
b659ab9caf | ||
|
|
8be8d31b85 | ||
|
|
6d2a94a844 | ||
|
|
bc4ff501e2 | ||
|
|
a13dfff9a1 | ||
|
|
99f4ded3b5 | ||
|
|
4b3e377add | ||
|
|
23a7d3718c | ||
|
|
3a4d59d584 | ||
|
|
2b99011cd8 | ||
|
|
4bd237b654 | ||
|
|
ce128990d2 | ||
|
|
2a9a7fe04e | ||
|
|
180990b9f1 | ||
|
|
f03ed8551b | ||
|
|
71837ade19 | ||
|
|
ff1840415e | ||
|
|
922177abe0 | ||
|
|
1d7eaaf2a0 | ||
|
|
5adb9370d2 | ||
|
|
ffe16f5cf2 | ||
|
|
3f0b152fe9 | ||
|
|
7c5bec50ef | ||
|
|
f712d3de94 | ||
|
|
ee59c37b83 | ||
|
|
c44e1bde0a | ||
|
|
14007c81df | ||
|
|
8761ad9301 | ||
|
|
0f480f5ada | ||
|
|
e6fbdfcc02 | ||
|
|
b3f406c6d3 | ||
|
|
d7d6819855 | ||
|
|
4cdccb7430 | ||
|
|
ae18d25996 | ||
|
|
bf62061a31 | ||
|
|
00201c1232 | ||
|
|
21ead2aa4b | ||
|
|
23ebfc7e85 | ||
|
|
df7feed648 | ||
|
|
d1bcd2f844 | ||
|
|
4b6ed04926 | ||
|
|
0dd1b08504 | ||
|
|
e033efc998 | ||
|
|
fb7b2b5390 | ||
|
|
50ca4f71f9 | ||
|
|
66f779c186 | ||
|
|
5eaf738b66 | ||
|
|
3790adfa06 | ||
|
|
90ccfbfc4e | ||
|
|
dbac4eb4f0 | ||
|
|
ae30137705 | ||
|
|
ae627193f8 | ||
|
|
4c10974553 | ||
|
|
22b0cc8a3c | ||
|
|
3ff43a530f | ||
|
|
0a62529b55 | ||
|
|
ee3f60a1bb | ||
|
|
66431ab762 | ||
|
|
05a37036c7 | ||
|
|
7d178d00fa | ||
|
|
062cfd1e4a | ||
|
|
5ea5588c14 | ||
|
|
b235345b2c | ||
|
|
1f8660f329 | ||
|
|
c7e25beaf1 | ||
|
|
269d9e2d40 | ||
|
|
c284a971c2 | ||
|
|
c1820fd07d | ||
|
|
52a97e7730 | ||
|
|
0a0ddbfd9f | ||
|
|
510f03fa32 | ||
|
|
7da1f6f5ca | ||
|
|
290e9bfbd8 | ||
|
|
52064eb438 | ||
|
|
71a3abe5d7 | ||
|
|
503115292b | ||
|
|
d9ab1c8297 | ||
|
|
6b61d24438 | ||
|
|
52d8da0ef0 | ||
|
|
0e14174764 | ||
|
|
b89aa36483 | ||
|
|
6bd950e817 | ||
|
|
b960a1cdd5 | ||
|
|
87e1ac7cdd | ||
|
|
a5609659c7 | ||
|
|
a2df2ff596 | ||
|
|
1d53c35ed7 | ||
|
|
3b20485c79 | ||
|
|
a103fb5168 | ||
|
|
bfbf590ee2 | ||
|
|
670055b873 | ||
|
|
2e879fe354 | ||
|
|
625754f0f7 | ||
|
|
1ed6380152 | ||
|
|
eeb116ff7e | ||
|
|
f101ed7c83 | ||
|
|
e24c39f4be | ||
|
|
ebc7d66dfe | ||
|
|
5172c07e15 | ||
|
|
533831e18d | ||
|
|
72993121ab | ||
|
|
22742fedb8 | ||
|
|
a6fe5662c8 | ||
|
|
fa82d32a9f | ||
|
|
114478271e | ||
|
|
a9e0a99f2b | ||
|
|
d7059c66dc | ||
|
|
6b7975107e | ||
|
|
120c2967eb | ||
|
|
bc2085b0fc | ||
|
|
bda5bb0a2b | ||
|
|
90edb3bc07 | ||
|
|
29c938dec2 | ||
|
|
9d1fb39363 | ||
|
|
5230815353 | ||
|
|
595ea466c2 | ||
|
|
e68a1fa2ec | ||
|
|
9600dd40e3 | ||
|
|
1ae4cfaf3f | ||
|
|
f4d705738b | ||
|
|
ae56f2eb80 | ||
|
|
f88d90ee88 | ||
|
|
0830215b31 | ||
|
|
0b8e1834f6 | ||
|
|
86cc6e16a4 | ||
|
|
d149255c58 | ||
|
|
41e15349c5 | ||
|
|
aed8c94544 | ||
|
|
801f29f043 | ||
|
|
2e134b686d | ||
|
|
5d5083683f | ||
|
|
64fd7eddf8 | ||
|
|
8dfd916fe4 | ||
|
|
bf8710d6a4 | ||
|
|
d6c752fba5 | ||
|
|
f283f9eb86 | ||
|
|
4a30fdf9f6 | ||
|
|
0caf945a44 | ||
|
|
9368c8a715 | ||
|
|
ef4cf461a5 | ||
|
|
d4c7157208 | ||
|
|
9b32a328c3 | ||
|
|
17d652947c | ||
|
|
1cff1a03a5 | ||
|
|
7f2ee8aa7e | ||
|
|
2dc5b21341 | ||
|
|
a417a00d3a | ||
|
|
6a0b0a99d1 | ||
|
|
09860e5fc6 | ||
|
|
dfddc71ebb | ||
|
|
355b75c3c7 | ||
|
|
c8f80339f1 | ||
|
|
1ea9334eca | ||
|
|
402bbc2f14 | ||
|
|
fd7886f4ce | ||
|
|
209f60031e | ||
|
|
02a1b5cbf3 | ||
|
|
63b4394e3e | ||
|
|
6aea48aea9 | ||
|
|
e572cdfb4a | ||
|
|
003ad8b20c | ||
|
|
8b7786f2b3 | ||
|
|
6d9adc547a | ||
|
|
1af5acba3f | ||
|
|
100d66d18b | ||
|
|
e54ed1d46f | ||
|
|
a619f44dfb | ||
|
|
18c06d98ac | ||
|
|
0b33bcbe53 | ||
|
|
64b03ffdf5 | ||
|
|
d1c99b1c0e | ||
|
|
e802decc84 | ||
|
|
eca570140a | ||
|
|
14cd6c82b2 | ||
|
|
0a04a00234 | ||
|
|
ce3caf0438 | ||
|
|
6484dfc32d | ||
|
|
f78d885e13 | ||
|
|
3c60ef8464 | ||
|
|
c8922e4826 | ||
|
|
f8f514d28c | ||
|
|
e0346c85df | ||
|
|
379ca116d1 | ||
|
|
702155ff4f | ||
|
|
25138b5648 | ||
|
|
2fb7901cca | ||
|
|
fabcde42a5 | ||
|
|
90843ea989 | ||
|
|
d0f544395e | ||
|
|
4e13a344e8 | ||
|
|
a802e05091 | ||
|
|
e7fe35c1f9 | ||
|
|
586408516b | ||
|
|
5f3bc79653 | ||
|
|
277a26b351 | ||
|
|
c1765b6b39 | ||
|
|
09b0bea981 | ||
|
|
d7c377292e | ||
|
|
167e710f92 | ||
|
|
1fd3d5fdc8 | ||
|
|
4025e6576c | ||
|
|
df7150503b | ||
|
|
5d4b0b0f04 | ||
|
|
a151531a2a | ||
|
|
11c07f19cb | ||
|
|
6cd3c613ef | ||
|
|
e2a484256c | ||
|
|
28d7d3ec00 | ||
|
|
7967bfdcb1 | ||
|
|
d2b2a25393 | ||
|
|
30513d0f06 | ||
|
|
ed3bca3d17 | ||
|
|
c676d99fc2 | ||
|
|
ae3e57ac3b | ||
|
|
c3be43de58 | ||
|
|
db0f868549 | ||
|
|
b236a85454 | ||
|
|
fa3a5ec67e | ||
|
|
8abb65a813 | ||
|
|
2c86fb4fa6 | ||
|
|
1588c1029a | ||
|
|
36158ae3e3 | ||
|
|
7a0c7241ba | ||
|
|
5801af41bc | ||
|
|
57b44d2347 | ||
|
|
6be695078b | ||
|
|
76ba428b87 | ||
|
|
60d5edf97f | ||
|
|
4907f4124b | ||
|
|
0f8852d290 | ||
|
|
5a5c2dcda3 | ||
|
|
395a8f77c4 | ||
|
|
b0046fa777 | ||
|
|
2acab47eee | ||
|
|
d99fe8de0f | ||
|
|
3e3bbf915e | ||
|
|
87cb293297 | ||
|
|
6f936f258f | ||
|
|
dd64724dbb | ||
|
|
a4415eb207 | ||
|
|
b00025918c | ||
|
|
c870460dea | ||
|
|
32497552d1 | ||
|
|
a731223e47 | ||
|
|
c70740fcdf | ||
|
|
005b1fcb54 | ||
|
|
b29d76bbc8 | ||
|
|
49ba89dfc3 | ||
|
|
67c8101f67 | ||
|
|
5df5f4d423 | ||
|
|
113be66314 | ||
|
|
48cb7df4b4 | ||
|
|
d44d462686 | ||
|
|
072f256af6 | ||
|
|
e62ae8b03e | ||
|
|
63f4d10ab1 | ||
|
|
4ce6fdb5f3 | ||
|
|
d0df6eed2c | ||
|
|
614fcf6b98 | ||
|
|
1f20f55c62 | ||
|
|
7c932559e0 | ||
|
|
279b4de09a | ||
|
|
b8712f380d | ||
|
|
f9947300da | ||
|
|
4a439fb0d1 | ||
|
|
d60d296b77 | ||
|
|
488ec945b6 | ||
|
|
36fed15d43 | ||
|
|
d558e3a927 | ||
|
|
315adfbe93 | ||
|
|
06ad676be1 | ||
|
|
2d00f00261 | ||
|
|
cd39cd821f | ||
|
|
8411c39eaf | ||
|
|
5ad849666d | ||
|
|
0f2f9ff78d | ||
|
|
b22183b000 | ||
|
|
220f1b177c | ||
|
|
495dfb7aae | ||
|
|
fba6aba80d | ||
|
|
dcf9aeed92 | ||
|
|
caad20285b | ||
|
|
d1a392cd0e | ||
|
|
1e80e294f0 | ||
|
|
cb99dbaea4 | ||
|
|
7e6de75e8a | ||
|
|
dab03f2729 | ||
|
|
dee33db0aa | ||
|
|
973db16658 | ||
|
|
1f1925797f | ||
|
|
98dc2a0dc7 | ||
|
|
c15ef915bf | ||
|
|
6d83027226 | ||
|
|
4edc4017ed | ||
|
|
3b79f44b54 | ||
|
|
020ba134cd | ||
|
|
03397ec23c | ||
|
|
f04875514e | ||
|
|
8b57e6fa45 | ||
|
|
b6ea78dfab | ||
|
|
5513c4aad5 | ||
|
|
39f4162ec1 | ||
|
|
8b9d626aec | ||
|
|
b23dbc9ab7 | ||
|
|
5031351736 | ||
|
|
ae40d393c3 | ||
|
|
f70df191a9 | ||
|
|
1daead3767 | ||
|
|
a43a43ed8e | ||
|
|
217edc81d9 | ||
|
|
6260ac281e | ||
|
|
29b5b6f959 | ||
|
|
4049f73ca6 | ||
|
|
bf5219c822 | ||
|
|
8169f5d5c0 | ||
|
|
119002626e | ||
|
|
6fbf5b5797 | ||
|
|
a0b978f95b | ||
|
|
8c3060f261 | ||
|
|
b80d88bded | ||
|
|
1c3f2f4ae3 | ||
|
|
67e6c9a984 | ||
|
|
9750110436 | ||
|
|
c017c61d2c | ||
|
|
ef5532cf15 | ||
|
|
e1be8667ed | ||
|
|
1b86f76d31 | ||
|
|
dc8619464a | ||
|
|
a7f7c4aa93 | ||
|
|
01685cc0bb | ||
|
|
2d53ff0c07 | ||
|
|
1152a70201 | ||
|
|
f5297f9945 | ||
|
|
9aed192503 | ||
|
|
7b03d5363b | ||
|
|
502d506a44 | ||
|
|
192c6175b8 | ||
|
|
cf3fe70f1f | ||
|
|
3667ff4998 | ||
|
|
203514abc7 | ||
|
|
e38324619e | ||
|
|
8378eb9232 | ||
|
|
ad511dad5e | ||
|
|
e3c2269b16 | ||
|
|
6fd32ecdc6 | ||
|
|
a3279ea1ad | ||
|
|
f0a515ff9c | ||
|
|
43ebae217c | ||
|
|
6ede9a2968 | ||
|
|
0b6265bc55 | ||
|
|
b0fafe5efa | ||
|
|
4dba20b757 | ||
|
|
eea3784976 | ||
|
|
f44ef7b9ea | ||
|
|
bce1f4d211 | ||
|
|
f57893a459 | ||
|
|
f07b730473 | ||
|
|
5c8a2afa35 | ||
|
|
385ac1e66c | ||
|
|
83a368aa85 | ||
|
|
f4ecef2ec5 | ||
|
|
4d4e5ed3b9 | ||
|
|
71e34e41b7 | ||
|
|
90bc9118f9 | ||
|
|
80d59a80aa | ||
|
|
c9467778dc | ||
|
|
6ccfdc9d11 | ||
|
|
24a63beb3c | ||
|
|
bcfdcce062 | ||
|
|
b24da8463c | ||
|
|
f0ba85fa80 | ||
|
|
6b290009aa | ||
|
|
e0ac81450d | ||
|
|
918762501f | ||
|
|
ffa6dda4d9 | ||
|
|
5a9be91fac | ||
|
|
4561eb8696 | ||
|
|
c9858655f6 | ||
|
|
69ff91e9a2 | ||
|
|
5ecc46623a | ||
|
|
c90c8fb8cf | ||
|
|
a962422b12 | ||
|
|
753f4ef1be | ||
|
|
5911b8eb01 | ||
|
|
5575fc6f28 | ||
|
|
ecb56e9a35 | ||
|
|
d34a3967f6 | ||
|
|
075b4c1772 | ||
|
|
448560a0d2 | ||
|
|
38210ec186 | ||
|
|
f7a996ab26 | ||
|
|
2c32b72f95 | ||
|
|
800862c50a | ||
|
|
cebca9a882 | ||
|
|
1a4b21955c | ||
|
|
422ff99b2a | ||
|
|
f235b8641f | ||
|
|
9cd52c4dd7 | ||
|
|
c1baffadf0 | ||
|
|
013f6be162 | ||
|
|
5fa5020af5 | ||
|
|
5a10ae9df0 | ||
|
|
aa9dc128d8 | ||
|
|
76f54bbd2c | ||
|
|
5b195781ad | ||
|
|
7b5ead8bd9 | ||
|
|
e7c1000fc2 | ||
|
|
0b1ea464bb | ||
|
|
93cc092ee1 | ||
|
|
e0d7cba330 | ||
|
|
d7a0a9f675 | ||
|
|
a2f9ccc9b9 | ||
|
|
7e7ad325dc | ||
|
|
e0828cc35c | ||
|
|
251ed7733b | ||
|
|
5a63d3799c | ||
|
|
5be80a9cc6 | ||
|
|
94e5855d53 | ||
|
|
f0c01bf352 | ||
|
|
a5b877de67 | ||
|
|
14e58eaa01 | ||
|
|
aed1f2ad21 | ||
|
|
a09a24e58e | ||
|
|
8391f93ca6 | ||
|
|
565c78d141 | ||
|
|
6cfb439fd6 | ||
|
|
c1b66f73c5 | ||
|
|
edd934a3e3 | ||
|
|
6a7071fd64 | ||
|
|
011a148105 | ||
|
|
f6d8c01779 | ||
|
|
b059bbcf89 | ||
|
|
468880e2c8 | ||
|
|
0968a11234 | ||
|
|
a48f6d1044 | ||
|
|
0fc887a3d2 | ||
|
|
dbdc45a8a9 | ||
|
|
bd8c46fa49 | ||
|
|
1fa2cbc64e | ||
|
|
fd8ea4e69e | ||
|
|
8ba5ca5337 | ||
|
|
9c3b5d17cf | ||
|
|
ed5134d601 | ||
|
|
a147347393 | ||
|
|
f5386060b6 | ||
|
|
209f8db382 | ||
|
|
64483a31d5 | ||
|
|
e9d2c43191 | ||
|
|
842771cb10 | ||
|
|
57265bfa4f | ||
|
|
6095170167 | ||
|
|
3f1083e9b5 | ||
|
|
77d53baa09 | ||
|
|
dceaf8f1ac | ||
|
|
5392243575 | ||
|
|
3e4708fe15 | ||
|
|
46b297aacc | ||
|
|
21762485ea | ||
|
|
3ef5b546fb | ||
|
|
5be55b1b14 | ||
|
|
cf68c156f1 | ||
|
|
16c8a2fd33 | ||
|
|
d4d876a563 | ||
|
|
c5e7dde931 | ||
|
|
f09913d6d2 | ||
|
|
d61bb036a7 | ||
|
|
1214369755 | ||
|
|
91dc45d19e | ||
|
|
3edf280e06 | ||
|
|
98c195fb8e | ||
|
|
c45951b368 | ||
|
|
a48eab43b8 | ||
|
|
3fa495d9ea | ||
|
|
23023dc140 | ||
|
|
db681ec4c6 | ||
|
|
6af9f90f45 | ||
|
|
e51b215f85 | ||
|
|
ffef3dda7e | ||
|
|
38111fe8c0 | ||
|
|
d48ead939b | ||
|
|
0982f557d2 | ||
|
|
3bdd3f1d3f | ||
|
|
8213de1d0f | ||
|
|
d40e8f1618 | ||
|
|
a05abc8881 | ||
|
|
04768f41de | ||
|
|
84d5a1125f | ||
|
|
ef7494700e | ||
|
|
03f8642fad | ||
|
|
0741b4d9e3 | ||
|
|
6e8704c520 | ||
|
|
b0b47c354a | ||
|
|
a6c4f6d2e9 | ||
|
|
c48065473f | ||
|
|
6bca3dd6c5 | ||
|
|
fa9017c6dc | ||
|
|
605d046838 | ||
|
|
8da5e5c029 | ||
|
|
bbbc4efced | ||
|
|
cc24597983 | ||
|
|
b03c326bcd | ||
|
|
792d8e1cf5 | ||
|
|
c31ab8c8b6 | ||
|
|
44ff2dd4ee | ||
|
|
727dfa5c6c | ||
|
|
d58c2f4269 | ||
|
|
f5a834b543 | ||
|
|
01ec830555 | ||
|
|
fdd6ca30c3 | ||
|
|
736d266c7e | ||
|
|
dd412af093 | ||
|
|
850e4e798d | ||
|
|
84f9d2e493 | ||
|
|
a9f21b2820 | ||
|
|
3e85c78790 | ||
|
|
2b79f9d121 | ||
|
|
c0ffca68f2 | ||
|
|
ea7b276125 | ||
|
|
75139aca77 | ||
|
|
ed02f5872a | ||
|
|
59e29e2988 | ||
|
|
9fe2ef381c | ||
|
|
a9835f6873 | ||
|
|
8cac557f86 | ||
|
|
ee3c12b2c0 | ||
|
|
67e4497945 | ||
|
|
90c88d7ecd | ||
|
|
d2f2d6db72 | ||
|
|
0a41ef7285 | ||
|
|
2be793cfba | ||
|
|
2c72d8462d | ||
|
|
28ce441214 | ||
|
|
8e67a41983 | ||
|
|
20b59c9d63 | ||
|
|
cf88a960f4 | ||
|
|
9216a6da28 | ||
|
|
ecc02595de | ||
|
|
e882110e7f | ||
|
|
3a143b9b5b | ||
|
|
8a81ffa29c | ||
|
|
b1015abffe | ||
|
|
2a52aedbf7 | ||
|
|
156ddfad9a | ||
|
|
43b007cdcd | ||
|
|
d79c79e1bc | ||
|
|
38ab1e0aea | ||
|
|
3b499d6871 | ||
|
|
c58fc3073f | ||
|
|
d9b9d1d2f2 | ||
|
|
4507a223cc | ||
|
|
b9c16e9be5 | ||
|
|
dfe091473c | ||
|
|
2b131548aa | ||
|
|
b34df01331 | ||
|
|
7dc12bb35e | ||
|
|
2d587d0d4b | ||
|
|
3c704088af | ||
|
|
103bb5a513 | ||
|
|
48bcee32b4 | ||
|
|
f44defec38 | ||
|
|
01f4ef5e79 | ||
|
|
6878f120e9 | ||
|
|
7a4347dbac | ||
|
|
cc2b413e22 | ||
|
|
2c6902d27d | ||
|
|
4272491d56 | ||
|
|
8f08d75748 | ||
|
|
499638142e | ||
|
|
85767187b1 | ||
|
|
0487d2eda6 | ||
|
|
863faf9b54 | ||
|
|
952f36b732 | ||
|
|
ebd9cf5542 | ||
|
|
64439673ce | ||
|
|
8f3f1b21af | ||
|
|
27213c1d40 | ||
|
|
1cd8e53b2f | ||
|
|
61adb4a803 | ||
|
|
862d743f87 | ||
|
|
d4bf8c871e | ||
|
|
d58c55ce8d | ||
|
|
f855327054 | ||
|
|
367b48af6b | ||
|
|
13c096f3e9 | ||
|
|
1108aa9ae6 | ||
|
|
022d387d95 | ||
|
|
acf99354b3 | ||
|
|
d3159791de | ||
|
|
e4fd4b4e6d | ||
|
|
74d5984ee2 | ||
|
|
de5c122307 | ||
|
|
1d9dc6dcae | ||
|
|
0089b3a160 | ||
|
|
e029e8649f | ||
|
|
d52c49c9fa | ||
|
|
b832940509 | ||
|
|
c5a6979d69 | ||
|
|
dd38026b23 | ||
|
|
9b60108fa6 | ||
|
|
ebaf95cc42 | ||
|
|
f8f57411f2 | ||
|
|
793c2b5611 | ||
|
|
4c1bc842bc | ||
|
|
9b092782c9 | ||
|
|
18d0e6a252 | ||
|
|
fb8c251a82 | ||
|
|
758ca76bd3 | ||
|
|
a1edddd1f0 | ||
|
|
e68ffbc711 | ||
|
|
470421879a | ||
|
|
7b3578420a | ||
|
|
91535fa9ae | ||
|
|
a728952058 | ||
|
|
5684b16721 | ||
|
|
f5d23a3a12 | ||
|
|
1bf4c2442a | ||
|
|
a87d62abf8 | ||
|
|
a7261a0d15 | ||
|
|
bba2f20588 | ||
|
|
9aa4b223dc | ||
|
|
214c1a9ff8 | ||
|
|
284b98d93a | ||
|
|
81b95b4af7 | ||
|
|
cd01d07a91 | ||
|
|
eafd09aca0 | ||
|
|
a97941f062 | ||
|
|
5883654e1e | ||
|
|
218d68e275 | ||
|
|
2f479c6230 | ||
|
|
6957ba97ea | ||
|
|
6df8c72cf7 | ||
|
|
882cb1bae3 | ||
|
|
b7c1aa39a9 | ||
|
|
fbcec9e7bf | ||
|
|
806744c483 | ||
|
|
925d15713c | ||
|
|
6e95709b68 | ||
|
|
819a690c33 | ||
|
|
42d66bc876 | ||
|
|
129fa84fe3 | ||
|
|
59fc7cebaf | ||
|
|
b52e9c29c6 | ||
|
|
3f340ca235 | ||
|
|
c3afe543c6 | ||
|
|
5216582f15 | ||
|
|
77879769d3 | ||
|
|
98ad71df0d | ||
|
|
9e4c3d67d9 | ||
|
|
78ad20f95d | ||
|
|
c503bc9432 | ||
|
|
39fc6a645e | ||
|
|
bff690ea53 | ||
|
|
e2f36f6ac5 | ||
|
|
6dc630c1d8 | ||
|
|
6645845d05 | ||
|
|
c0c750a76e | ||
|
|
6044739661 | ||
|
|
61412ae06d | ||
|
|
d682ec4ca7 | ||
|
|
2f234af43b | ||
|
|
6d21a8cb8d | ||
|
|
b44ff09b63 | ||
|
|
950a4e2991 | ||
|
|
65f19b2d53 | ||
|
|
d34f505eea | ||
|
|
9494b1e607 | ||
|
|
d2db0b46ff | ||
|
|
1165aa6e74 | ||
|
|
8cb0f1d0ef | ||
|
|
a03ee33f8c | ||
|
|
fb843026ad | ||
|
|
e2b2425230 | ||
|
|
f39ba56390 | ||
|
|
e6f48dd822 | ||
|
|
1e76df7c98 | ||
|
|
3d1b187986 | ||
|
|
3665723622 | ||
|
|
abfb6ecdb5 | ||
|
|
8d7391d73e | ||
|
|
c76ac579cb | ||
|
|
9336b2943c | ||
|
|
d46feee4fc | ||
|
|
2268f7ac34 | ||
|
|
6ffc0cec3d | ||
|
|
fe4fc714c3 | ||
|
|
0ffcf001a5 | ||
|
|
d7c4bdcd57 | ||
|
|
3ea1b96681 | ||
|
|
a10139284d | ||
|
|
ed2b50af26 | ||
|
|
8921c2ddf4 | ||
|
|
d44f5e6560 | ||
|
|
bc0d98adae | ||
|
|
a56b50df2b | ||
|
|
48f12d9ca8 | ||
|
|
d48e4fb7c3 | ||
|
|
60794c6e0f | ||
|
|
0a2cd213dc | ||
|
|
a90f2acd26 | ||
|
|
562fc13a6a | ||
|
|
79c0887db2 | ||
|
|
a4c23b7fa2 | ||
|
|
9c276d1072 | ||
|
|
a336bebbe5 | ||
|
|
f3e399e0ff | ||
|
|
db1f111054 | ||
|
|
afcd6f2db3 | ||
|
|
20fef40b7b | ||
|
|
9fe7bbf826 | ||
|
|
661f7e3e8d | ||
|
|
36d40905e1 | ||
|
|
367390a852 | ||
|
|
2f0fe302bc | ||
|
|
1f7f1076ca | ||
|
|
ef08366efc | ||
|
|
611946bd3e | ||
|
|
71b0a18238 | ||
|
|
e781ede5b2 | ||
|
|
88c3cfe7ab | ||
|
|
84b31d3bbd | ||
|
|
aaae07e477 | ||
|
|
ec93981a9d | ||
|
|
aaa3649975 | ||
|
|
c1a090a17c | ||
|
|
d8d59dcdc8 | ||
|
|
09d4a6ab41 | ||
|
|
fb8377f3ca | ||
|
|
7acaa4d301 | ||
|
|
8a24638ced | ||
|
|
eaf60b4f79 | ||
|
|
ee7de739fc | ||
|
|
641f943268 | ||
|
|
0b14141e97 | ||
|
|
30b821f7ba | ||
|
|
339ee4dbba | ||
|
|
b5131b19a3 | ||
|
|
f4a31fef2a | ||
|
|
c73da1629b | ||
|
|
41d121df1d | ||
|
|
8f68d1efb9 | ||
|
|
d6d70f62c7 | ||
|
|
25e90acf27 | ||
|
|
2fbf3f28e6 | ||
|
|
92ce7459bb | ||
|
|
dedafdf443 | ||
|
|
06c8c26b8a | ||
|
|
6649f1583a | ||
|
|
b5567b362f | ||
|
|
8a9248be79 | ||
|
|
844a0002dc | ||
|
|
0674dc9ec2 | ||
|
|
e41788c63f | ||
|
|
6cd8dc0d9d | ||
|
|
d9ce056e13 | ||
|
|
dd8e09c2d9 | ||
|
|
ddb8f06c3a | ||
|
|
d26bac0221 | ||
|
|
7cb4887011 | ||
|
|
bab66cfa35 | ||
|
|
344556c639 | ||
|
|
c25f7b0e52 | ||
|
|
381fc54c89 | ||
|
|
9a08edae09 | ||
|
|
8cba8033ba | ||
|
|
8858edde05 | ||
|
|
17022b9b40 | ||
|
|
b8e7fee9e7 | ||
|
|
92361c37df | ||
|
|
d817e4144c | ||
|
|
9a21e19486 | ||
|
|
c14b338a92 | ||
|
|
68251b647d | ||
|
|
e8fe53650b | ||
|
|
39bf8fb01e | ||
|
|
bcd984c1c5 | ||
|
|
3e8f03c7b7 | ||
|
|
10ad246e29 | ||
|
|
39634f442b | ||
|
|
8081a43d85 | ||
|
|
bc5a7867a9 | ||
|
|
b6a43d6ce7 | ||
|
|
61c0b91e39 | ||
|
|
8fd9b6afc9 | ||
|
|
162fd790ef | ||
|
|
f5d67c3c7f | ||
|
|
5827a8fcdd | ||
|
|
8efdaed7e4 | ||
|
|
c35bf8d953 | ||
|
|
29a989e1f4 | ||
|
|
0a03bf9028 | ||
|
|
b682e8c686 | ||
|
|
b34bf39746 | ||
|
|
71df1ccf6f | ||
|
|
102b34db2f | ||
|
|
fb6e7c7b57 | ||
|
|
271518ee08 | ||
|
|
f04a5c8f3e | ||
|
|
1b3dc52563 | ||
|
|
7475a4fff3 | ||
|
|
2e504232ec | ||
|
|
10e9e94a73 | ||
|
|
b8141262d2 | ||
|
|
3014c79c1f | ||
|
|
5adb5e0e9f | ||
|
|
d14982d125 | ||
|
|
797bb5d964 | ||
|
|
66ec35b106 | ||
|
|
6068d0d68d | ||
|
|
fa947eb9c7 | ||
|
|
63c8e82913 | ||
|
|
d70db7fa0b | ||
|
|
6cf511aa7f | ||
|
|
40a98f2436 | ||
|
|
6ab9ba65f9 | ||
|
|
46eb66b77f | ||
|
|
920950dfbd | ||
|
|
43de2be1f2 | ||
|
|
92db25038c | ||
|
|
2bdd024f19 | ||
|
|
3964a33c55 | ||
|
|
adf8e6414e | ||
|
|
f4754797bc | ||
|
|
7a1f330655 | ||
|
|
1bc3e6b677 | ||
|
|
fb6630a7ae | ||
|
|
06456faa63 | ||
|
|
25e2c60603 | ||
|
|
955b22841e | ||
|
|
eb9ca8e227 | ||
|
|
9e5f7c481e | ||
|
|
d8f2fedae1 | ||
|
|
c89dc50b6c | ||
|
|
c13e18cb55 | ||
|
|
c0f19f5883 | ||
|
|
d0f2916885 | ||
|
|
778363bfaf | ||
|
|
e13993de9b | ||
|
|
928f00de41 | ||
|
|
d072c852f3 | ||
|
|
5fdcb5df81 | ||
|
|
1cab2e1156 | ||
|
|
347e958703 | ||
|
|
c170216e1c | ||
|
|
00a66b7114 | ||
|
|
9705904052 | ||
|
|
7943edf252 | ||
|
|
716c0c0e4c | ||
|
|
109b0a984a | ||
|
|
d3221ff253 | ||
|
|
2cd4672912 | ||
|
|
72e07fbe3f | ||
|
|
8eb451aab5 | ||
|
|
9b8bc2e977 | ||
|
|
54750d4656 | ||
|
|
08bdd9eb36 | ||
|
|
971ada6397 | ||
|
|
88436fa400 | ||
|
|
c433188edb | ||
|
|
fe61d6acce | ||
|
|
b3d3814ce9 | ||
|
|
3446fffe86 | ||
|
|
7e271df032 | ||
|
|
745768511b | ||
|
|
682cb8d44b | ||
|
|
e002266607 | ||
|
|
ae8f900410 | ||
|
|
97662800d5 | ||
|
|
6e7a32ec7f | ||
|
|
d31c483944 | ||
|
|
823e2bcec6 | ||
|
|
b2d1edc9db | ||
|
|
355001c236 | ||
|
|
69fd0b03a2 | ||
|
|
18e42c22d4 | ||
|
|
c9c20ce433 | ||
|
|
1693abffd3 | ||
|
|
b44857dad9 | ||
|
|
9a199e20b6 | ||
|
|
2f1c9eb01b | ||
|
|
861bb3404f | ||
|
|
c9cfa864bf | ||
|
|
c9ea61aba7 | ||
|
|
a207ceef6c | ||
|
|
386de826af | ||
|
|
f5de4d2031 | ||
|
|
25c5d257ae | ||
|
|
c09ebae5af | ||
|
|
fc7cc44ef7 | ||
|
|
300e3ba71f | ||
|
|
54eae9bffc | ||
|
|
23cfb9b640 | ||
|
|
99d1f5778c | ||
|
|
7cfeed1e28 | ||
|
|
3d40e4dee5 | ||
|
|
0075fdd5e1 | ||
|
|
43c0e9b2e8 | ||
|
|
bbf4806fe8 | ||
|
|
7ab0b036c7 | ||
|
|
95ac97a41c | ||
|
|
e34357a0a4 | ||
|
|
4394f93a17 | ||
|
|
43c239ee2f | ||
|
|
e415451f89 | ||
|
|
5bafacc372 | ||
|
|
458c9ebe8c | ||
|
|
3c0e58bff4 | ||
|
|
647967cccb | ||
|
|
764cf86e38 | ||
|
|
d9a58115f9 | ||
|
|
4ceb313fb2 | ||
|
|
1e8c85d850 | ||
|
|
26fab2d5d0 | ||
|
|
2e92ec903c | ||
|
|
8c2f69ca0e | ||
|
|
6dd7213083 | ||
|
|
7dbf950323 | ||
|
|
711cb966ef | ||
|
|
14f672ab6a | ||
|
|
b5291d1883 | ||
|
|
510370dc7b | ||
|
|
9b9d56543c | ||
|
|
182b6686ac | ||
|
|
68a379610e | ||
|
|
f6f072a957 | ||
|
|
eef269ffb8 | ||
|
|
b5a48729b8 | ||
|
|
b7479cbb50 | ||
|
|
eb3cdbcc5f | ||
|
|
f7c752a316 | ||
|
|
4d0eef1f6f | ||
|
|
bfeb978eff | ||
|
|
0c8fb94f0c | ||
|
|
3f0e19970e | ||
|
|
047b9157ad | ||
|
|
e2e049b718 | ||
|
|
17bf963f3e | ||
|
|
2b8bb76d7a | ||
|
|
1598766b1e | ||
|
|
c77bd15538 | ||
|
|
90e7d61b6d | ||
|
|
6f7c57d975 | ||
|
|
6a8939d420 | ||
|
|
80c4e77c12 | ||
|
|
1979aa926b | ||
|
|
26f1a2d606 | ||
|
|
3849ad75ce | ||
|
|
2c67331bc3 | ||
|
|
6fa1e49cb2 | ||
|
|
9892d82c52 | ||
|
|
b699557597 | ||
|
|
6e94a3345f | ||
|
|
4f3e817913 | ||
|
|
efc394ce9e | ||
|
|
1d4f69add3 | ||
|
|
68b3cef0fe | ||
|
|
7034bc5f63 | ||
|
|
164124783b | ||
|
|
98739c1610 | ||
|
|
2f1b142e14 | ||
|
|
e464300346 | ||
|
|
73abbc2a08 | ||
|
|
d1414b6a46 | ||
|
|
f472ee3be8 | ||
|
|
d7e1a3773c | ||
|
|
d14f82cb7c | ||
|
|
fe2987dae1 | ||
|
|
2c25e08a25 | ||
|
|
a10e3e86fb | ||
|
|
508b7e839b | ||
|
|
6426bde7ea | ||
|
|
4be7910fdf | ||
|
|
b5a2175269 | ||
|
|
b3d8651db9 | ||
|
|
cda703b0f4 | ||
|
|
3202c1392d | ||
|
|
bc6cd6e5f2 | ||
|
|
9578e123cc | ||
|
|
71597c9a03 | ||
|
|
589ec3c263 | ||
|
|
0d002c9070 | ||
|
|
176b8bdc3d | ||
|
|
1808d98978 | ||
|
|
1aa404d670 | ||
|
|
f3415c2aff | ||
|
|
332c2f6d3f | ||
|
|
7220737d48 | ||
|
|
46365f4738 | ||
|
|
82d00c94c0 | ||
|
|
9809106a84 | ||
|
|
a8fd977a53 | ||
|
|
a3e0d36a72 | ||
|
|
3092d406fa | ||
|
|
0d9404c704 | ||
|
|
f7a79b436e | ||
|
|
e6741f815a | ||
|
|
79c8d93c45 | ||
|
|
593f06bdf7 | ||
|
|
dd67c88175 | ||
|
|
ed48a3c425 | ||
|
|
9d0da6242d | ||
|
|
d3241dce9e | ||
|
|
fed03f970c | ||
|
|
8493729a10 | ||
|
|
750b270502 | ||
|
|
dd7d74cb93 | ||
|
|
d6e398d814 | ||
|
|
2f0809b570 | ||
|
|
144c87a72f | ||
|
|
1446d4fddd | ||
|
|
84a6ee4801 | ||
|
|
00db93b7f2 | ||
|
|
fb01361837 | ||
|
|
d1c5e09127 | ||
|
|
f50cb04887 | ||
|
|
031448ec6d | ||
|
|
dfc78572f5 | ||
|
|
d2ae4d8215 | ||
|
|
e902375763 | ||
|
|
d5196abaec | ||
|
|
35683920ff | ||
|
|
1646bef1c2 | ||
|
|
ae6c2aa056 | ||
|
|
603e52e5b0 | ||
|
|
0a17683545 | ||
|
|
9cd7e7978d | ||
|
|
1f4880985b | ||
|
|
d696da9227 | ||
|
|
21c55ad6b4 | ||
|
|
643d48ee89 | ||
|
|
3082df2ac0 | ||
|
|
c4b2089d31 | ||
|
|
a67feb6d93 | ||
|
|
7c77c4a81e | ||
|
|
570465f51a | ||
|
|
f043077746 | ||
|
|
4393798409 | ||
|
|
ce36171000 | ||
|
|
f462db6bfa | ||
|
|
568c566e1a | ||
|
|
170ff1597c | ||
|
|
06facc0060 | ||
|
|
7c5d688c00 | ||
|
|
eaf827668a | ||
|
|
77ce54833a | ||
|
|
72a16a2427 | ||
|
|
2ee0934653 | ||
|
|
ef0e171da5 | ||
|
|
6f5bdb2e91 | ||
|
|
12aa5e01b6 | ||
|
|
e64b566d72 | ||
|
|
73439a4457 | ||
|
|
7e55d21cdd | ||
|
|
3a7ff71262 | ||
|
|
1b55ebb387 | ||
|
|
99de1fa3e5 | ||
|
|
d95abfb607 | ||
|
|
b658743e94 | ||
|
|
00a939a733 | ||
|
|
6928b8ddf6 | ||
|
|
19eb7a1fb7 | ||
|
|
8f2974b17c | ||
|
|
7c8bda0907 | ||
|
|
b4469b1577 | ||
|
|
a7474b96cf | ||
|
|
5fbeb7938c | ||
|
|
bc18fb7c3e | ||
|
|
4a445081d8 | ||
|
|
8ab83987f1 | ||
|
|
a7a559cdcc | ||
|
|
4986308581 | ||
|
|
6275a45ec0 | ||
|
|
984decd664 | ||
|
|
b87b6cee0f | ||
|
|
2b9f216dae | ||
|
|
28550dbc99 | ||
|
|
564a286282 | ||
|
|
48d15fc653 | ||
|
|
34bab8edd6 | ||
|
|
caf0d18393 | ||
|
|
7bbf2c7769 | ||
|
|
bae3477c94 | ||
|
|
458a95ae8e | ||
|
|
1ff48259cc | ||
|
|
9f8a0907c4 | ||
|
|
373dbbf95d | ||
|
|
2e38a9af65 | ||
|
|
53d144c51e | ||
|
|
2f3f9f1a21 | ||
|
|
fcb133dbbe | ||
|
|
63c09163dc | ||
|
|
56588e0dad | ||
|
|
59597ff39e | ||
|
|
068b6bc2cb | ||
|
|
62b7622f75 | ||
|
|
5fcf71e3ff | ||
|
|
321aaeae54 | ||
|
|
6075207d94 | ||
|
|
5004929f07 | ||
|
|
76bd6b409e | ||
|
|
f53f16a59b | ||
|
|
dce8a4e442 | ||
|
|
30058a8df5 | ||
|
|
1793549550 | ||
|
|
67db7383ad | ||
|
|
0afa41e908 | ||
|
|
094ef88e57 | ||
|
|
bee4dde9b7 | ||
|
|
ec5e7c66c3 | ||
|
|
1a370fef76 | ||
|
|
942df21c66 | ||
|
|
4987388ce7 | ||
|
|
df47d425f4 | ||
|
|
60ebb565bb | ||
|
|
920d6ac120 | ||
|
|
132598fc88 | ||
|
|
a9ddfe70c2 | ||
|
|
e2f65dfc59 | ||
|
|
a33f635490 | ||
|
|
23293d6453 | ||
|
|
56ec49f837 | ||
|
|
a1ee9827d8 | ||
|
|
27d18b2189 | ||
|
|
1853e8aa56 | ||
|
|
0b99cbafb2 | ||
|
|
701cb94ba6 | ||
|
|
f2337aeaa7 | ||
|
|
dd6f6d1174 | ||
|
|
21604461fc | ||
|
|
ea291179dd | ||
|
|
9291637977 | ||
|
|
4cf73a6def | ||
|
|
70abb12398 | ||
|
|
c622fde7be | ||
|
|
dd3f9e5b9e | ||
|
|
8856af6b2d | ||
|
|
acbfe99401 | ||
|
|
2717018631 | ||
|
|
8a20ccb69d | ||
|
|
30a65320fb | ||
|
|
a33119c070 | ||
|
|
1180f0227c | ||
|
|
8152314ba8 | ||
|
|
cfc6dc37c8 | ||
|
|
84558fda69 | ||
|
|
c72186fd11 | ||
|
|
b3441ee9ce | ||
|
|
ca141bb131 | ||
|
|
71cabddbd6 | ||
|
|
785df23f1b | ||
|
|
274419584e | ||
|
|
d96a87aafc | ||
|
|
ec665bae25 | ||
|
|
48d21f97bd | ||
|
|
863ea742f6 | ||
|
|
3439df0333 | ||
|
|
d7ebc5c8c7 | ||
|
|
333ada8eb6 | ||
|
|
14c2bc97b1 | ||
|
|
137b25f318 | ||
|
|
279c30367a | ||
|
|
baaa063342 | ||
|
|
4e137c4061 | ||
|
|
c8d9d6b792 | ||
|
|
366321042f | ||
|
|
9f3c236c48 | ||
|
|
59c50e3beb | ||
|
|
c20d7c2638 | ||
|
|
60b93cdfd9 | ||
|
|
55895340e9 | ||
|
|
b2dccca58c | ||
|
|
c622e547c9 | ||
|
|
6763cfcda0 | ||
|
|
4f51103cdb | ||
|
|
a06ac018ea | ||
|
|
d22f4b30ac | ||
|
|
54246345bb | ||
|
|
baab997da8 | ||
|
|
0a157d3255 | ||
|
|
846ba58d2e | ||
|
|
03c4d59592 | ||
|
|
2a9d26e1ea | ||
|
|
0ea8e55ad4 | ||
|
|
3cdaf78369 | ||
|
|
dc2aab5e90 | ||
|
|
ac0fe1bd61 | ||
|
|
1e53369869 | ||
|
|
ea9c7e68e7 | ||
|
|
463e3f5ed1 | ||
|
|
a2dd8ee5b5 | ||
|
|
90b8cccac5 | ||
|
|
753790ae47 | ||
|
|
6f7363fbcb | ||
|
|
3fce3adb39 | ||
|
|
7cd8e86d3b | ||
|
|
f98cc32947 | ||
|
|
bbf0c0b22c | ||
|
|
65c4bd1a17 | ||
|
|
983c64720d | ||
|
|
962c640ff5 | ||
|
|
fb80b125bd | ||
|
|
682f47f66b | ||
|
|
f0233c092b | ||
|
|
4dab5daf79 | ||
|
|
4972472b2a | ||
|
|
dd8c2cbb20 | ||
|
|
f22845b238 | ||
|
|
31ae689b2c | ||
|
|
475e0c213c | ||
|
|
f533373050 | ||
|
|
d7ef40c9d7 | ||
|
|
3bee0882cc | ||
|
|
5c830216be | ||
|
|
b31a2a66b6 | ||
|
|
5b06a62d91 | ||
|
|
4a213d8da8 | ||
|
|
29ca9809b1 | ||
|
|
16cdde82b3 | ||
|
|
967cedba0e | ||
|
|
7270a4e690 | ||
|
|
528b796dff | ||
|
|
8dd4bc80ec | ||
|
|
23878e530f | ||
|
|
ab0828a4ce | ||
|
|
c19edd407a | ||
|
|
a0979b9cd8 | ||
|
|
04f22376ce | ||
|
|
d3ec230cec | ||
|
|
8014f2650c | ||
|
|
cb0dfddf59 | ||
|
|
b15a21a957 | ||
|
|
5f06c18a54 | ||
|
|
c011d724c6 | ||
|
|
5d2bc9503d | ||
|
|
9cf331fdab | ||
|
|
3d2bade521 | ||
|
|
deea701222 | ||
|
|
e122d725f6 | ||
|
|
abf9ef0b5f | ||
|
|
e11d0956fb | ||
|
|
011b1c8295 | ||
|
|
f31fa29616 | ||
|
|
d72912714b | ||
|
|
640eaacb8c | ||
|
|
07d0485a31 | ||
|
|
1c85b7a46d | ||
|
|
4d39736d29 | ||
|
|
6951b7803d | ||
|
|
06a628dae2 | ||
|
|
52c1fed6ab | ||
|
|
d339734143 | ||
|
|
3e5760aefe | ||
|
|
f63b75c388 | ||
|
|
c44477fbee | ||
|
|
c6e39707de | ||
|
|
ede380ec60 | ||
|
|
edd7e5e591 | ||
|
|
d5de031c23 | ||
|
|
8f0d2cc4ab | ||
|
|
0a6f88e8ad | ||
|
|
921c83df2e | ||
|
|
1b2c7f595e | ||
|
|
6d21f77d32 | ||
|
|
63d8200303 | ||
|
|
b4f744d000 | ||
|
|
1c967e9628 | ||
|
|
4d1be18c18 | ||
|
|
8561d5c58c | ||
|
|
38333df260 | ||
|
|
9d1616a11b | ||
|
|
e0d47040d3 | ||
|
|
a49c013c89 | ||
|
|
3f64f81ec0 | ||
|
|
95e8fcb88e | ||
|
|
0562139868 | ||
|
|
cc61732106 | ||
|
|
5024e8cb32 | ||
|
|
926bcbb50e | ||
|
|
151303a20a | ||
|
|
1c1cdf0f23 | ||
|
|
b6dfa8b747 | ||
|
|
9f340ef456 | ||
|
|
1d33ebbfe4 | ||
|
|
e56d3ca7de | ||
|
|
63c8dfa304 | ||
|
|
e12e399c0a | ||
|
|
d4ea416dd6 | ||
|
|
3eded6772d | ||
|
|
6cba3f5c95 | ||
|
|
18e6c2e767 | ||
|
|
6a681bcf67 | ||
|
|
2afd455d52 | ||
|
|
c887a460ea | ||
|
|
163dc9618a | ||
|
|
819a38a7ca | ||
|
|
caea24f6ea | ||
|
|
7b3b33e664 | ||
|
|
a335605682 | ||
|
|
8b495a1ce9 | ||
|
|
f43277dc28 | ||
|
|
70dcb6ef43 | ||
|
|
18a3a0fd01 | ||
|
|
6e03866b56 | ||
|
|
068deabb0e | ||
|
|
ea1af87266 | ||
|
|
6d1f3c4caf | ||
|
|
c14bb791a0 | ||
|
|
9d26f8c29e | ||
|
|
01e0c2f9a3 | ||
|
|
f1d31643fc | ||
|
|
22bc5954d7 | ||
|
|
52507b1f74 | ||
|
|
941b2c4894 | ||
|
|
4db686a652 | ||
|
|
c57182627f | ||
|
|
f0d1702d5f | ||
|
|
088a11e62a | ||
|
|
13e3e5ea35 | ||
|
|
f2eabc87ef | ||
|
|
68bf3d32b0 | ||
|
|
4ac32a1206 | ||
|
|
6583ce9c57 | ||
|
|
a654dd5e99 | ||
|
|
97192ab2a4 | ||
|
|
0913146f54 | ||
|
|
a2c2675039 | ||
|
|
55082a0925 | ||
|
|
b23cf06f1c | ||
|
|
43b9ecd857 | ||
|
|
46f2c0df85 | ||
|
|
9c3faa0e16 | ||
|
|
e8d068c5cb | ||
|
|
4e3d50fc20 | ||
|
|
ab32ec8933 | ||
|
|
0a528935e2 | ||
|
|
593fd4e45d | ||
|
|
28c755040f | ||
|
|
bbfb170291 | ||
|
|
99f2b30594 | ||
|
|
22513505fa | ||
|
|
a1dbbf3915 | ||
|
|
7f89bd950a | ||
|
|
830bb3f105 | ||
|
|
d84adb2120 | ||
|
|
5c94b4e7ff | ||
|
|
6a281e468f | ||
|
|
299c725993 | ||
|
|
aa737def7f | ||
|
|
deed8011d7 | ||
|
|
26eefe9529 | ||
|
|
f89840a6aa | ||
|
|
bd3bd1b5a6 | ||
|
|
6df36f4588 | ||
|
|
8e4a0053c4 | ||
|
|
001c80a3db | ||
|
|
acde6070cf | ||
|
|
e793b44151 | ||
|
|
b381f1e13f | ||
|
|
770ac645d5 | ||
|
|
f369fe9c6e | ||
|
|
b4f6ca2ca7 | ||
|
|
3114e80fa8 | ||
|
|
2d124e7e54 | ||
|
|
e4f53ce0c3 | ||
|
|
200a00d4f5 | ||
|
|
63c6039dbb | ||
|
|
9d37f4c946 | ||
|
|
8f7c4a58cd | ||
|
|
b33831d833 | ||
|
|
ae5c05e14e | ||
|
|
e2b89c9b42 | ||
|
|
6a7287bde3 | ||
|
|
b0d7dbc32c | ||
|
|
bae32c1823 | ||
|
|
ae48e4d7a6 | ||
|
|
e916ef9bda | ||
|
|
1c7b87ee78 | ||
|
|
9ff9f2f1f1 | ||
|
|
725602b5e5 | ||
|
|
78fa10c6ba | ||
|
|
076793c61a | ||
|
|
a08260e2b8 | ||
|
|
09d6cd41c7 | ||
|
|
ae3f2a53cf | ||
|
|
3392e7b1a9 | ||
|
|
27261303d2 | ||
|
|
91f83cb108 | ||
|
|
dc29616513 | ||
|
|
faec3f6ec2 | ||
|
|
a2c6ce8a7b | ||
|
|
40289c5f8e | ||
|
|
45c2ed7a64 | ||
|
|
ea2d452f4b | ||
|
|
a0749df85e | ||
|
|
76728612ff | ||
|
|
3e5f6d0084 | ||
|
|
1bcc2c6b85 | ||
|
|
1c7908f02d | ||
|
|
2bd9575419 | ||
|
|
94a441e234 | ||
|
|
b65f3e0aa3 | ||
|
|
53a692b9ef | ||
|
|
d06d1df873 | ||
|
|
61cb2df400 | ||
|
|
e25253a6e8 | ||
|
|
f08b6fd4c2 | ||
|
|
32eb9e3bcb | ||
|
|
afaafa7470 | ||
|
|
e26cc28cb0 | ||
|
|
8b1fc42b7a | ||
|
|
19bc52f54e | ||
|
|
fd2ca42f28 | ||
|
|
127c8cccc3 | ||
|
|
45feb51e84 | ||
|
|
5030f5435f | ||
|
|
e93f097272 | ||
|
|
036e102fa0 | ||
|
|
73055c507f | ||
|
|
a1c4244a27 | ||
|
|
93850ac6dc | ||
|
|
5ad4b9be2d | ||
|
|
e600f003ca | ||
|
|
aa43aa6fc8 | ||
|
|
538a1db866 | ||
|
|
f1099f5940 | ||
|
|
e1c93c47be | ||
|
|
bdfec103ac | ||
|
|
a49decd9a6 | ||
|
|
7d89aabae5 | ||
|
|
700e05b142 | ||
|
|
09cdcd67b5 | ||
|
|
94ad89c764 | ||
|
|
47287a121a | ||
|
|
e6d373df3e | ||
|
|
f6fce0f19a | ||
|
|
eccbfb6a5f | ||
|
|
2e71c768db | ||
|
|
38c55e4f37 | ||
|
|
ad2915ce9e | ||
|
|
1c452018e1 | ||
|
|
96f7728227 | ||
|
|
a12126cc7e | ||
|
|
6fd1c94d99 | ||
|
|
0a88406a3d | ||
|
|
51a8cf565f | ||
|
|
a24ff375fb | ||
|
|
e2a2316038 | ||
|
|
a8500a80b5 | ||
|
|
2003cc8aaa | ||
|
|
f74dcc37e0 | ||
|
|
e8bbb17196 | ||
|
|
c21da8a1e2 | ||
|
|
c3047c33ba | ||
|
|
54ae05d298 | ||
|
|
23beae96e2 | ||
|
|
e94eb7f2d1 | ||
|
|
52317d1edd | ||
|
|
0ffeabd4ed | ||
|
|
f681a8b361 | ||
|
|
7f573fc06b | ||
|
|
ac3c90dd75 | ||
|
|
6cf08fbaa6 | ||
|
|
c13dbf2198 | ||
|
|
4cb03c38fe | ||
|
|
a4966e486f | ||
|
|
16c6c2b6a0 | ||
|
|
02cf0e4df3 | ||
|
|
63efac9fa6 | ||
|
|
24f2ec75ec | ||
|
|
faca22ac5f | ||
|
|
7ac990cff4 | ||
|
|
0313bd8692 | ||
|
|
71e8ed5b7d | ||
|
|
25bb63c50a | ||
|
|
16b4336700 | ||
|
|
884b72bc1c | ||
|
|
f9410cc4bd | ||
|
|
f374e19239 | ||
|
|
88dc1f94a6 |
433 changed files with 247150 additions and 10817 deletions
1
.claude/scheduled_tasks.lock
Normal file
1
.claude/scheduled_tasks.lock
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"sessionId":"55a28c7e-8043-44c2-9829-702f303c84ba","pid":3880168,"acquiredAt":1773085726967}
|
||||
146
.github/workflows/build.yml
vendored
146
.github/workflows/build.yml
vendored
|
|
@ -6,6 +6,13 @@ on:
|
|||
pull_request:
|
||||
branches: [master]
|
||||
|
||||
env:
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
WOWEE_AMD_FSR2_REPO: https://github.com/GPUOpen-Effects/FidelityFX-FSR2.git
|
||||
WOWEE_AMD_FSR2_REF: master
|
||||
WOWEE_FFX_SDK_REPO: https://github.com/Kelsidavis/FidelityFX-SDK.git
|
||||
WOWEE_FFX_SDK_REF: main
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build (${{ matrix.arch }})
|
||||
|
|
@ -57,8 +64,49 @@ jobs:
|
|||
libx11-dev
|
||||
sudo apt-get install -y libstorm-dev || true
|
||||
|
||||
- name: Configure
|
||||
run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
|
||||
- name: Fetch AMD FSR2 SDK
|
||||
run: |
|
||||
rm -rf extern/FidelityFX-FSR2
|
||||
git clone --depth 1 --branch "${WOWEE_AMD_FSR2_REF}" "${WOWEE_AMD_FSR2_REPO}" extern/FidelityFX-FSR2
|
||||
rm -rf extern/FidelityFX-SDK
|
||||
git clone --depth 1 --branch "${WOWEE_FFX_SDK_REF}" "${WOWEE_FFX_SDK_REPO}" extern/FidelityFX-SDK
|
||||
|
||||
- name: Check AMD FSR2 Vulkan permutation headers
|
||||
run: |
|
||||
set -euo pipefail
|
||||
SDK_DIR="$PWD/extern/FidelityFX-FSR2"
|
||||
OUT_DIR="$SDK_DIR/src/ffx-fsr2-api/vk/shaders"
|
||||
if [ -f "$OUT_DIR/ffx_fsr2_accumulate_pass_permutations.h" ]; then
|
||||
echo "AMD FSR2 Vulkan permutation headers detected."
|
||||
else
|
||||
echo "AMD FSR2 Vulkan permutation headers not found in SDK checkout."
|
||||
echo "WoWee CMake will bootstrap vendored headers."
|
||||
fi
|
||||
|
||||
- name: Check FidelityFX-SDK Kits framegen headers
|
||||
run: |
|
||||
set -euo pipefail
|
||||
KITS_DIR="$PWD/extern/FidelityFX-SDK/Kits/FidelityFX"
|
||||
test -f "$KITS_DIR/upscalers/fsr3/include/ffx_fsr3upscaler.h"
|
||||
test -f "$KITS_DIR/framegeneration/fsr3/include/ffx_frameinterpolation.h"
|
||||
test -f "$KITS_DIR/framegeneration/fsr3/include/ffx_opticalflow.h"
|
||||
test -f "$KITS_DIR/backend/vk/ffx_vk.h"
|
||||
echo "FidelityFX-SDK Kits framegen headers detected."
|
||||
|
||||
- name: Configure (AMD ON)
|
||||
run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DWOWEE_ENABLE_AMD_FSR2=ON
|
||||
|
||||
- name: Assert AMD FSR2 target
|
||||
run: cmake --build build --target wowee_fsr2_amd_vk --parallel $(nproc)
|
||||
|
||||
- name: Assert AMD FSR3 framegen probe target (if present)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if cmake --build build --target help | grep -q 'wowee_fsr3_framegen_amd_vk_probe'; then
|
||||
cmake --build build --target wowee_fsr3_framegen_amd_vk_probe --parallel $(nproc)
|
||||
else
|
||||
echo "FSR3 framegen probe target not generated for this SDK layout; continuing."
|
||||
fi
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build --parallel $(nproc)
|
||||
|
|
@ -96,6 +144,13 @@ jobs:
|
|||
# dylibbundler may not be in all brew mirrors; install separately to not block others
|
||||
brew install dylibbundler 2>/dev/null || true
|
||||
|
||||
- name: Fetch AMD FSR2 SDK
|
||||
run: |
|
||||
rm -rf extern/FidelityFX-FSR2
|
||||
git clone --depth 1 --branch "${WOWEE_AMD_FSR2_REF}" "${WOWEE_AMD_FSR2_REPO}" extern/FidelityFX-FSR2
|
||||
rm -rf extern/FidelityFX-SDK
|
||||
git clone --depth 1 --branch "${WOWEE_FFX_SDK_REF}" "${WOWEE_FFX_SDK_REPO}" extern/FidelityFX-SDK
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
BREW=$(brew --prefix)
|
||||
|
|
@ -103,7 +158,19 @@ jobs:
|
|||
cmake -S . -B build \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_PREFIX_PATH="$BREW" \
|
||||
-DOPENSSL_ROOT_DIR="$(brew --prefix openssl@3)"
|
||||
-DOPENSSL_ROOT_DIR="$(brew --prefix openssl@3)" \
|
||||
-DWOWEE_ENABLE_AMD_FSR2=ON
|
||||
|
||||
- name: Assert AMD FSR2 target
|
||||
run: cmake --build build --target wowee_fsr2_amd_vk --parallel $(sysctl -n hw.logicalcpu)
|
||||
|
||||
- name: Assert AMD FSR3 framegen probe target (if present)
|
||||
run: |
|
||||
if cmake --build build --target help | grep -q 'wowee_fsr3_framegen_amd_vk_probe'; then
|
||||
cmake --build build --target wowee_fsr3_framegen_amd_vk_probe --parallel $(sysctl -n hw.logicalcpu)
|
||||
else
|
||||
echo "FSR3 framegen probe target not generated for this SDK layout; continuing."
|
||||
fi
|
||||
|
||||
- name: Build
|
||||
run: cmake --build build --parallel $(sysctl -n hw.logicalcpu)
|
||||
|
|
@ -151,7 +218,32 @@ jobs:
|
|||
codesign --force --deep --sign - Wowee.app
|
||||
|
||||
- name: Create DMG
|
||||
run: hdiutil create -volname Wowee -srcfolder Wowee.app -ov -format UDZO Wowee.dmg
|
||||
run: |
|
||||
set -euo pipefail
|
||||
rm -f Wowee.dmg
|
||||
# CI runners can occasionally leave a mounted volume around; detach if present.
|
||||
if [ -d "/Volumes/Wowee" ]; then
|
||||
hdiutil detach "/Volumes/Wowee" -force || true
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
ok=0
|
||||
for attempt in 1 2 3 4 5; do
|
||||
if hdiutil create -volname Wowee -srcfolder Wowee.app -ov -format UDZO Wowee.dmg; then
|
||||
ok=1
|
||||
break
|
||||
fi
|
||||
echo "hdiutil create failed on attempt ${attempt}; retrying..."
|
||||
if [ -d "/Volumes/Wowee" ]; then
|
||||
hdiutil detach "/Volumes/Wowee" -force || true
|
||||
fi
|
||||
sleep 3
|
||||
done
|
||||
|
||||
if [ "$ok" -ne 1 ] || [ ! -f Wowee.dmg ]; then
|
||||
echo "Failed to create Wowee.dmg after retries."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Upload DMG
|
||||
uses: actions/upload-artifact@v4
|
||||
|
|
@ -206,9 +298,30 @@ jobs:
|
|||
cmake --build /tmp/StormLib/build --parallel $(nproc)
|
||||
cmake --install /tmp/StormLib/build
|
||||
|
||||
- name: Fetch AMD FSR2 SDK
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
rm -rf extern/FidelityFX-FSR2
|
||||
git clone --depth 1 --branch "${WOWEE_AMD_FSR2_REF}" "${WOWEE_AMD_FSR2_REPO}" extern/FidelityFX-FSR2
|
||||
rm -rf extern/FidelityFX-SDK
|
||||
git clone --depth 1 --branch "${WOWEE_FFX_SDK_REF}" "${WOWEE_FFX_SDK_REPO}" extern/FidelityFX-SDK
|
||||
|
||||
- name: Configure
|
||||
shell: msys2 {0}
|
||||
run: cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
|
||||
run: cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DWOWEE_ENABLE_AMD_FSR2=ON
|
||||
|
||||
- name: Assert AMD FSR2 target
|
||||
shell: msys2 {0}
|
||||
run: cmake --build build --target wowee_fsr2_amd_vk --parallel $(nproc)
|
||||
|
||||
- name: Assert AMD FSR3 framegen probe target (if present)
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
if cmake --build build --target help | grep -q 'wowee_fsr3_framegen_amd_vk_probe'; then
|
||||
cmake --build build --target wowee_fsr3_framegen_amd_vk_probe --parallel $(nproc)
|
||||
else
|
||||
echo "FSR3 framegen probe target not generated for this SDK layout; continuing."
|
||||
fi
|
||||
|
||||
- name: Build
|
||||
shell: msys2 {0}
|
||||
|
|
@ -276,9 +389,30 @@ jobs:
|
|||
cmake --build /tmp/StormLib/build --parallel $(nproc)
|
||||
cmake --install /tmp/StormLib/build
|
||||
|
||||
- name: Fetch AMD FSR2 SDK
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
rm -rf extern/FidelityFX-FSR2
|
||||
git clone --depth 1 --branch "${WOWEE_AMD_FSR2_REF}" "${WOWEE_AMD_FSR2_REPO}" extern/FidelityFX-FSR2
|
||||
rm -rf extern/FidelityFX-SDK
|
||||
git clone --depth 1 --branch "${WOWEE_FFX_SDK_REF}" "${WOWEE_FFX_SDK_REPO}" extern/FidelityFX-SDK
|
||||
|
||||
- name: Configure
|
||||
shell: msys2 {0}
|
||||
run: cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
|
||||
run: cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DWOWEE_ENABLE_AMD_FSR2=ON
|
||||
|
||||
- name: Assert AMD FSR2 target
|
||||
shell: msys2 {0}
|
||||
run: cmake --build build --target wowee_fsr2_amd_vk --parallel $(nproc)
|
||||
|
||||
- name: Assert AMD FSR3 framegen probe target (if present)
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
if cmake --build build --target help | grep -q 'wowee_fsr3_framegen_amd_vk_probe'; then
|
||||
cmake --build build --target wowee_fsr3_framegen_amd_vk_probe --parallel $(nproc)
|
||||
else
|
||||
echo "FSR3 framegen probe target not generated for this SDK layout; continuing."
|
||||
fi
|
||||
|
||||
- name: Build
|
||||
shell: msys2 {0}
|
||||
|
|
|
|||
3
.github/workflows/release.yml
vendored
3
.github/workflows/release.yml
vendored
|
|
@ -4,6 +4,9 @@ on:
|
|||
push:
|
||||
tags: ['v*']
|
||||
|
||||
env:
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
|
|
|
|||
3
.github/workflows/security.yml
vendored
3
.github/workflows/security.yml
vendored
|
|
@ -7,6 +7,9 @@ on:
|
|||
branches: [master]
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
|
|
|
|||
8
.gitignore
vendored
8
.gitignore
vendored
|
|
@ -48,6 +48,7 @@ extern/*
|
|||
!extern/imgui
|
||||
!extern/vk-bootstrap
|
||||
!extern/vk_mem_alloc.h
|
||||
!extern/lua-5.1.5
|
||||
|
||||
# ImGui state
|
||||
imgui.ini
|
||||
|
|
@ -100,3 +101,10 @@ node_modules/
|
|||
# Python cache artifacts
|
||||
tools/__pycache__/
|
||||
*.pyc
|
||||
|
||||
# artifacts
|
||||
.codex-loop/
|
||||
|
||||
# Local agent instructions
|
||||
AGENTS.md
|
||||
codex-loop.sh
|
||||
|
|
|
|||
8
.semgrepignore
Normal file
8
.semgrepignore
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
# Vendored third-party code (frozen releases, not ours to modify)
|
||||
extern/lua-5.1.5/
|
||||
extern/imgui/
|
||||
extern/stb_image.h
|
||||
extern/stb_image_write.h
|
||||
extern/vk-bootstrap/
|
||||
extern/FidelityFX-FSR2/
|
||||
extern/FidelityFX-SDK/
|
||||
|
|
@ -29,10 +29,14 @@ sudo apt install -y \
|
|||
sudo pacman -S --needed \
|
||||
base-devel cmake pkgconf git \
|
||||
sdl2 glew glm openssl zlib \
|
||||
vulkan-devel vulkan-tools shaderc \
|
||||
vulkan-headers vulkan-icd-loader vulkan-tools shaderc \
|
||||
ffmpeg unicorn stormlib
|
||||
```
|
||||
|
||||
> **Note:** `vulkan-headers` provides the `vulkan/vulkan.h` development headers required
|
||||
> at build time. `vulkan-devel` is a group that includes these on some distros but is not
|
||||
> available by name on Arch — install `vulkan-headers` and `vulkan-icd-loader` explicitly.
|
||||
|
||||
---
|
||||
|
||||
## 🐧 Linux (All Distros)
|
||||
|
|
@ -213,3 +217,10 @@ You can also specify an expansion: `.\extract_assets.ps1 "C:\Games\WoW\Data" wot
|
|||
```bash
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
- AMD FSR2 SDK is fetched automatically by `build.sh` / `rebuild.sh` / `build.ps1` / `rebuild.ps1` from:
|
||||
- `https://github.com/GPUOpen-Effects/FidelityFX-FSR2.git`
|
||||
- target path: `extern/FidelityFX-FSR2`
|
||||
- AMD backend is enabled when SDK headers and Vulkan permutation headers are available.
|
||||
- If upstream SDK checkout is missing generated Vulkan permutation headers, CMake bootstraps them from:
|
||||
- `third_party/fsr2_vk_permutations`
|
||||
- If SDK headers are missing, the build uses the internal FSR2 fallback path.
|
||||
|
|
|
|||
267
CMakeLists.txt
267
CMakeLists.txt
|
|
@ -1,5 +1,5 @@
|
|||
cmake_minimum_required(VERSION 3.15)
|
||||
project(wowee VERSION 1.0.0 LANGUAGES CXX)
|
||||
project(wowee VERSION 1.0.0 LANGUAGES C CXX)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
|
|
@ -18,10 +18,214 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
|||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||
|
||||
if(WIN32)
|
||||
# Needed for Vulkan Win32 external memory/semaphore handle types used by FSR3 interop.
|
||||
add_compile_definitions(VK_USE_PLATFORM_WIN32_KHR)
|
||||
endif()
|
||||
|
||||
# Options
|
||||
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
|
||||
option(WOWEE_BUILD_TESTS "Build tests" OFF)
|
||||
option(WOWEE_ENABLE_ASAN "Enable AddressSanitizer (Debug builds)" OFF)
|
||||
option(WOWEE_ENABLE_AMD_FSR2 "Enable AMD FidelityFX FSR2 backend when SDK is present" ON)
|
||||
option(WOWEE_ENABLE_AMD_FSR3_FRAMEGEN "Enable AMD FidelityFX SDK FSR3 frame generation interface probe when SDK is present" ON)
|
||||
option(WOWEE_BUILD_AMD_FSR3_RUNTIME "Build native AMD FidelityFX VK runtime (Path A) from extern/FidelityFX-SDK/Kits" ON)
|
||||
|
||||
# AMD FidelityFX FSR2 SDK detection (drop-in under extern/FidelityFX-FSR2)
|
||||
set(WOWEE_AMD_FSR2_DIR ${CMAKE_SOURCE_DIR}/extern/FidelityFX-FSR2)
|
||||
set(WOWEE_AMD_FSR2_HEADER ${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/ffx_fsr2.h)
|
||||
set(WOWEE_AMD_FSR2_VK_PERM_HEADER ${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/vk/shaders/ffx_fsr2_accumulate_pass_permutations.h)
|
||||
set(WOWEE_AMD_FSR2_VK_VENDOR_DIR ${CMAKE_SOURCE_DIR}/third_party/fsr2_vk_permutations)
|
||||
|
||||
# Upstream SDK checkouts may not ship generated Vulkan permutation headers.
|
||||
# If we have a vendored snapshot, copy it into the SDK tree before detection.
|
||||
if(WOWEE_ENABLE_AMD_FSR2 AND EXISTS ${WOWEE_AMD_FSR2_HEADER} AND NOT EXISTS ${WOWEE_AMD_FSR2_VK_PERM_HEADER} AND EXISTS ${WOWEE_AMD_FSR2_VK_VENDOR_DIR})
|
||||
file(GLOB WOWEE_AMD_FSR2_VK_VENDOR_HEADERS "${WOWEE_AMD_FSR2_VK_VENDOR_DIR}/ffx_fsr2_*pass*.h")
|
||||
list(LENGTH WOWEE_AMD_FSR2_VK_VENDOR_HEADERS WOWEE_AMD_FSR2_VK_VENDOR_COUNT)
|
||||
if(WOWEE_AMD_FSR2_VK_VENDOR_COUNT GREATER 0)
|
||||
file(MAKE_DIRECTORY ${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/vk/shaders)
|
||||
file(COPY ${WOWEE_AMD_FSR2_VK_VENDOR_HEADERS} DESTINATION ${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/vk/shaders)
|
||||
message(STATUS "AMD FSR2: bootstrapped ${WOWEE_AMD_FSR2_VK_VENDOR_COUNT} vendored Vulkan permutation headers")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WOWEE_ENABLE_AMD_FSR2 AND EXISTS ${WOWEE_AMD_FSR2_HEADER} AND EXISTS ${WOWEE_AMD_FSR2_VK_PERM_HEADER})
|
||||
message(STATUS "AMD FSR2 SDK detected at ${WOWEE_AMD_FSR2_DIR}")
|
||||
add_compile_definitions(WOWEE_HAS_AMD_FSR2=1)
|
||||
add_compile_definitions(FFX_GCC=1)
|
||||
|
||||
# AMD FSR2 Vulkan backend sources (official SDK implementation)
|
||||
set(WOWEE_AMD_FSR2_SOURCES
|
||||
${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/ffx_assert.cpp
|
||||
${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/ffx_fsr2.cpp
|
||||
${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/vk/ffx_fsr2_vk.cpp
|
||||
${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/vk/shaders/ffx_fsr2_shaders_vk.cpp
|
||||
)
|
||||
add_library(wowee_fsr2_amd_vk STATIC ${WOWEE_AMD_FSR2_SOURCES})
|
||||
set_target_properties(wowee_fsr2_amd_vk PROPERTIES
|
||||
CXX_STANDARD 17
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
)
|
||||
target_include_directories(wowee_fsr2_amd_vk PUBLIC
|
||||
${WOWEE_AMD_FSR2_DIR}/src
|
||||
${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api
|
||||
${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/vk
|
||||
${WOWEE_AMD_FSR2_DIR}/src/ffx-fsr2-api/vk/shaders
|
||||
)
|
||||
set(WOWEE_FFX_COMPAT_HEADER ${CMAKE_SOURCE_DIR}/include/third_party/ffx_fsr2_compat.h)
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
target_compile_options(wowee_fsr2_amd_vk PRIVATE
|
||||
"-include${WOWEE_FFX_COMPAT_HEADER}"
|
||||
)
|
||||
elseif(MSVC)
|
||||
target_compile_options(wowee_fsr2_amd_vk PRIVATE
|
||||
"/FI${WOWEE_FFX_COMPAT_HEADER}"
|
||||
)
|
||||
endif()
|
||||
target_link_libraries(wowee_fsr2_amd_vk PUBLIC Vulkan::Vulkan)
|
||||
else()
|
||||
add_compile_definitions(WOWEE_HAS_AMD_FSR2=0)
|
||||
if(WOWEE_ENABLE_AMD_FSR2)
|
||||
if(NOT EXISTS ${WOWEE_AMD_FSR2_HEADER})
|
||||
message(WARNING "AMD FSR2 SDK not found at ${WOWEE_AMD_FSR2_DIR}; using internal fallback implementation.")
|
||||
elseif(NOT EXISTS ${WOWEE_AMD_FSR2_VK_PERM_HEADER})
|
||||
message(WARNING "AMD FSR2 SDK found, but generated Vulkan permutation headers are missing (e.g. ${WOWEE_AMD_FSR2_VK_PERM_HEADER}); using internal fallback implementation.")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# AMD FidelityFX SDK (FSR3 frame generation interfaces) detection under extern/FidelityFX-SDK
|
||||
set(WOWEE_AMD_FFX_SDK_KITS_DIR ${CMAKE_SOURCE_DIR}/extern/FidelityFX-SDK/Kits/FidelityFX)
|
||||
set(WOWEE_AMD_FFX_SDK_KITS_FG_HEADER ${WOWEE_AMD_FFX_SDK_KITS_DIR}/framegeneration/include/ffx_framegeneration.h)
|
||||
|
||||
set(WOWEE_AMD_FFX_SDK_KITS_READY FALSE)
|
||||
if(EXISTS ${WOWEE_AMD_FFX_SDK_KITS_DIR}/upscalers/fsr3/include/ffx_fsr3upscaler.h
|
||||
AND EXISTS ${WOWEE_AMD_FFX_SDK_KITS_DIR}/framegeneration/fsr3/include/ffx_frameinterpolation.h
|
||||
AND EXISTS ${WOWEE_AMD_FFX_SDK_KITS_DIR}/framegeneration/fsr3/include/ffx_opticalflow.h
|
||||
AND EXISTS ${WOWEE_AMD_FFX_SDK_KITS_DIR}/backend/vk/ffx_vk.h)
|
||||
set(WOWEE_AMD_FFX_SDK_KITS_READY TRUE)
|
||||
endif()
|
||||
|
||||
if(WOWEE_ENABLE_AMD_FSR3_FRAMEGEN AND WOWEE_AMD_FFX_SDK_KITS_READY)
|
||||
message(STATUS "AMD FidelityFX-SDK framegen headers detected at ${WOWEE_AMD_FFX_SDK_KITS_DIR} (Kits layout)")
|
||||
add_compile_definitions(WOWEE_AMD_FFX_SDK_KITS=1)
|
||||
add_compile_definitions(WOWEE_HAS_AMD_FSR3_FRAMEGEN=1)
|
||||
add_library(wowee_fsr3_framegen_amd_vk_probe STATIC
|
||||
src/rendering/amd_fsr3_framegen_probe.cpp
|
||||
)
|
||||
set_target_properties(wowee_fsr3_framegen_amd_vk_probe PROPERTIES
|
||||
CXX_STANDARD 17
|
||||
CXX_STANDARD_REQUIRED ON
|
||||
)
|
||||
target_include_directories(wowee_fsr3_framegen_amd_vk_probe PUBLIC
|
||||
${WOWEE_AMD_FFX_SDK_KITS_DIR}/upscalers/include
|
||||
${WOWEE_AMD_FFX_SDK_KITS_DIR}/upscalers/fsr3/include
|
||||
${WOWEE_AMD_FFX_SDK_KITS_DIR}/framegeneration/fsr3/include
|
||||
${WOWEE_AMD_FFX_SDK_KITS_DIR}/framegeneration/include
|
||||
${WOWEE_AMD_FFX_SDK_KITS_DIR}/backend/vk
|
||||
${WOWEE_AMD_FFX_SDK_KITS_DIR}/api/internal
|
||||
${WOWEE_AMD_FFX_SDK_KITS_DIR}/api/include
|
||||
)
|
||||
target_link_libraries(wowee_fsr3_framegen_amd_vk_probe PUBLIC Vulkan::Vulkan)
|
||||
|
||||
if(WOWEE_BUILD_AMD_FSR3_RUNTIME)
|
||||
message(STATUS "AMD FSR3 Path A runtime target enabled: build with target 'wowee_fsr3_official_runtime_copy'")
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR ${CMAKE_BINARY_DIR}/ffx_sdk_runtime_build)
|
||||
if(WIN32)
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_NAME amd_fidelityfx_vk.dll)
|
||||
if(CMAKE_CONFIGURATION_TYPES)
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_SRC ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}/$<CONFIG>/amd_fidelityfx_vk.dll)
|
||||
else()
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_SRC ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}/amd_fidelityfx_vk.dll)
|
||||
endif()
|
||||
elseif(APPLE)
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_NAME libamd_fidelityfx_vk.dylib)
|
||||
if(CMAKE_CONFIGURATION_TYPES)
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_SRC ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}/$<CONFIG>/libamd_fidelityfx_vk.dylib)
|
||||
else()
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_SRC ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}/libamd_fidelityfx_vk.dylib)
|
||||
endif()
|
||||
else()
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_NAME libamd_fidelityfx_vk.so)
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_SRC ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}/libamd_fidelityfx_vk.so)
|
||||
endif()
|
||||
|
||||
if(CMAKE_BUILD_TYPE)
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_BUILD_TYPE ${CMAKE_BUILD_TYPE})
|
||||
else()
|
||||
set(WOWEE_AMD_FSR3_RUNTIME_BUILD_TYPE Release)
|
||||
endif()
|
||||
|
||||
# Locate bash at configure time so the build-time COMMAND works on Windows
|
||||
# (cmake custom commands run via cmd.exe on Windows, so bare 'bash' is not found).
|
||||
find_program(BASH_EXECUTABLE bash
|
||||
HINTS
|
||||
/usr/bin
|
||||
/bin
|
||||
"${MSYS2_PATH}/usr/bin"
|
||||
"$ENV{MSYS2_PATH}/usr/bin"
|
||||
"C:/msys64/usr/bin"
|
||||
"D:/msys64/usr/bin"
|
||||
)
|
||||
if(BASH_EXECUTABLE)
|
||||
add_custom_target(wowee_fsr3_official_runtime_build
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-S ${WOWEE_AMD_FFX_SDK_KITS_DIR}
|
||||
-B ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}
|
||||
-DCMAKE_BUILD_TYPE=${WOWEE_AMD_FSR3_RUNTIME_BUILD_TYPE}
|
||||
-DFFX_BUILD_VK=ON
|
||||
-DFFX_BUILD_FRAMEGENERATION=ON
|
||||
-DFFX_BUILD_UPSCALER=ON
|
||||
COMMAND ${BASH_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/generate_ffx_sdk_vk_permutations.sh
|
||||
${CMAKE_SOURCE_DIR}/extern/FidelityFX-SDK
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
--build ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}
|
||||
--config $<CONFIG>
|
||||
--parallel
|
||||
COMMENT "Building native AMD FSR3 runtime (Path A) from FidelityFX-SDK Kits"
|
||||
VERBATIM
|
||||
)
|
||||
else()
|
||||
message(STATUS "bash not found; VK permutation headers will not be auto-generated")
|
||||
add_custom_target(wowee_fsr3_official_runtime_build
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-S ${WOWEE_AMD_FFX_SDK_KITS_DIR}
|
||||
-B ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}
|
||||
-DCMAKE_BUILD_TYPE=${WOWEE_AMD_FSR3_RUNTIME_BUILD_TYPE}
|
||||
-DFFX_BUILD_VK=ON
|
||||
-DFFX_BUILD_FRAMEGENERATION=ON
|
||||
-DFFX_BUILD_UPSCALER=ON
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
--build ${WOWEE_AMD_FSR3_RUNTIME_BUILD_DIR}
|
||||
--config $<CONFIG>
|
||||
--parallel
|
||||
COMMENT "Building native AMD FSR3 runtime (Path A) from FidelityFX-SDK Kits (no permutation bootstrap)"
|
||||
VERBATIM
|
||||
)
|
||||
endif()
|
||||
|
||||
add_custom_target(wowee_fsr3_official_runtime_copy
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${WOWEE_AMD_FSR3_RUNTIME_SRC}
|
||||
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${WOWEE_AMD_FSR3_RUNTIME_NAME}
|
||||
DEPENDS wowee_fsr3_official_runtime_build
|
||||
COMMENT "Copying native AMD FSR3 runtime to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
|
||||
VERBATIM
|
||||
)
|
||||
endif()
|
||||
|
||||
else()
|
||||
add_compile_definitions(WOWEE_HAS_AMD_FSR3_FRAMEGEN=0)
|
||||
add_compile_definitions(WOWEE_AMD_FFX_SDK_KITS=0)
|
||||
if(WOWEE_ENABLE_AMD_FSR3_FRAMEGEN)
|
||||
if(EXISTS ${WOWEE_AMD_FFX_SDK_KITS_FG_HEADER})
|
||||
message(STATUS "FidelityFX-SDK Kits layout detected at ${WOWEE_AMD_FFX_SDK_KITS_DIR}, but required FSR3 headers are incomplete. FSR3 framegen interface probe disabled.")
|
||||
else()
|
||||
message(WARNING "AMD FidelityFX-SDK Kits headers not found at ${WOWEE_AMD_FFX_SDK_KITS_DIR}; FSR3 framegen interface probe disabled.")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Opcode registry generation/validation
|
||||
find_package(Python3 COMPONENTS Interpreter QUIET)
|
||||
|
|
@ -300,8 +504,8 @@ set(WOWEE_SOURCES
|
|||
|
||||
# Rendering
|
||||
src/rendering/renderer.cpp
|
||||
src/rendering/amd_fsr3_runtime.cpp
|
||||
src/rendering/shader.cpp
|
||||
src/rendering/texture.cpp
|
||||
src/rendering/mesh.cpp
|
||||
src/rendering/camera.cpp
|
||||
src/rendering/camera_controller.cpp
|
||||
|
|
@ -325,6 +529,7 @@ set(WOWEE_SOURCES
|
|||
src/rendering/character_preview.cpp
|
||||
src/rendering/wmo_renderer.cpp
|
||||
src/rendering/m2_renderer.cpp
|
||||
src/rendering/m2_model_classifier.cpp
|
||||
src/rendering/quest_marker_renderer.cpp
|
||||
src/rendering/minimap.cpp
|
||||
src/rendering/world_map.cpp
|
||||
|
|
@ -346,6 +551,12 @@ set(WOWEE_SOURCES
|
|||
src/ui/quest_log_screen.cpp
|
||||
src/ui/spellbook_screen.cpp
|
||||
src/ui/talent_screen.cpp
|
||||
src/ui/keybinding_manager.cpp
|
||||
|
||||
# Addons
|
||||
src/addons/addon_manager.cpp
|
||||
src/addons/lua_engine.cpp
|
||||
src/addons/toc_parser.cpp
|
||||
|
||||
# Main
|
||||
src/main.cpp
|
||||
|
|
@ -415,7 +626,6 @@ set(WOWEE_HEADERS
|
|||
include/rendering/vk_render_target.hpp
|
||||
include/rendering/renderer.hpp
|
||||
include/rendering/shader.hpp
|
||||
include/rendering/texture.hpp
|
||||
include/rendering/mesh.hpp
|
||||
include/rendering/camera.hpp
|
||||
include/rendering/camera_controller.hpp
|
||||
|
|
@ -450,6 +660,7 @@ set(WOWEE_HEADERS
|
|||
include/ui/inventory_screen.hpp
|
||||
include/ui/spellbook_screen.hpp
|
||||
include/ui/talent_screen.hpp
|
||||
include/ui/keybinding_manager.hpp
|
||||
)
|
||||
|
||||
set(WOWEE_PLATFORM_SOURCES)
|
||||
|
|
@ -463,12 +674,41 @@ if(WIN32)
|
|||
list(APPEND WOWEE_PLATFORM_SOURCES resources/wowee.rc)
|
||||
endif()
|
||||
|
||||
# ---- Lua 5.1.5 (vendored, static library) ----
|
||||
set(LUA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extern/lua-5.1.5/src)
|
||||
set(LUA_SOURCES
|
||||
${LUA_DIR}/lapi.c ${LUA_DIR}/lcode.c ${LUA_DIR}/ldebug.c
|
||||
${LUA_DIR}/ldo.c ${LUA_DIR}/ldump.c ${LUA_DIR}/lfunc.c
|
||||
${LUA_DIR}/lgc.c ${LUA_DIR}/llex.c ${LUA_DIR}/lmem.c
|
||||
${LUA_DIR}/lobject.c ${LUA_DIR}/lopcodes.c ${LUA_DIR}/lparser.c
|
||||
${LUA_DIR}/lstate.c ${LUA_DIR}/lstring.c ${LUA_DIR}/ltable.c
|
||||
${LUA_DIR}/ltm.c ${LUA_DIR}/lundump.c ${LUA_DIR}/lvm.c
|
||||
${LUA_DIR}/lzio.c ${LUA_DIR}/lauxlib.c ${LUA_DIR}/lbaselib.c
|
||||
${LUA_DIR}/ldblib.c ${LUA_DIR}/liolib.c ${LUA_DIR}/lmathlib.c
|
||||
${LUA_DIR}/loslib.c ${LUA_DIR}/ltablib.c ${LUA_DIR}/lstrlib.c
|
||||
${LUA_DIR}/linit.c
|
||||
)
|
||||
add_library(lua51 STATIC ${LUA_SOURCES})
|
||||
set_target_properties(lua51 PROPERTIES LINKER_LANGUAGE C C_STANDARD 99 POSITION_INDEPENDENT_CODE ON)
|
||||
target_include_directories(lua51 PUBLIC ${LUA_DIR})
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
|
||||
target_compile_options(lua51 PRIVATE -w)
|
||||
endif()
|
||||
|
||||
# Create executable
|
||||
add_executable(wowee ${WOWEE_SOURCES} ${WOWEE_HEADERS} ${WOWEE_PLATFORM_SOURCES})
|
||||
if(TARGET opcodes-generate)
|
||||
add_dependencies(wowee opcodes-generate)
|
||||
endif()
|
||||
|
||||
# FidelityFX-SDK headers can trigger compiler-specific pragma/unused-static noise
|
||||
# when included through the runtime bridge; keep suppression scoped to that TU.
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
set_source_files_properties(src/rendering/amd_fsr3_runtime.cpp PROPERTIES
|
||||
COMPILE_OPTIONS "-Wno-unknown-pragmas;-Wno-unused-variable"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Compile GLSL shaders to SPIR-V
|
||||
if(GLSLC)
|
||||
compile_shaders(wowee)
|
||||
|
|
@ -496,6 +736,7 @@ target_link_libraries(wowee PRIVATE
|
|||
OpenSSL::Crypto
|
||||
Threads::Threads
|
||||
ZLIB::ZLIB
|
||||
lua51
|
||||
${CMAKE_DL_LIBS}
|
||||
)
|
||||
|
||||
|
|
@ -537,6 +778,19 @@ if(TARGET vk-bootstrap)
|
|||
target_link_libraries(wowee PRIVATE vk-bootstrap)
|
||||
endif()
|
||||
|
||||
if(TARGET wowee_fsr2_amd_vk)
|
||||
target_link_libraries(wowee PRIVATE wowee_fsr2_amd_vk)
|
||||
endif()
|
||||
if(TARGET wowee_fsr3_framegen_amd_vk_probe)
|
||||
target_link_libraries(wowee PRIVATE wowee_fsr3_framegen_amd_vk_probe)
|
||||
endif()
|
||||
if(TARGET wowee_fsr3_official_runtime_copy)
|
||||
# FSR3 Path A runtime is an opt-in artifact; build explicitly with:
|
||||
# cmake --build build --target wowee_fsr3_official_runtime_copy
|
||||
# Do NOT add as a hard dependency of wowee — it would break arm64 and Windows CI
|
||||
# (no DXC available on arm64; bash context issues on MSYS2 Windows).
|
||||
endif()
|
||||
|
||||
# Link Unicorn if available
|
||||
if(HAVE_UNICORN)
|
||||
target_link_libraries(wowee PRIVATE ${UNICORN_LIBRARY})
|
||||
|
|
@ -556,6 +810,13 @@ if(MSVC)
|
|||
target_compile_options(wowee PRIVATE /W4)
|
||||
else()
|
||||
target_compile_options(wowee PRIVATE -Wall -Wextra -Wpedantic -Wno-missing-field-initializers)
|
||||
# GCC LTO emits -Wodr for FFX enum-name mismatches across SDK generations.
|
||||
# We intentionally keep FSR2+FSR3 integrations in separate TUs and suppress
|
||||
# this linker-time diagnostic to avoid CI noise.
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
target_compile_options(wowee PRIVATE -Wno-odr)
|
||||
target_link_options(wowee PRIVATE -Wno-odr)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Debug build flags
|
||||
|
|
|
|||
|
|
@ -1,96 +1,260 @@
|
|||
{
|
||||
"Spell": {
|
||||
"ID": 0, "Attributes": 5, "IconID": 117,
|
||||
"Name": 120, "Tooltip": 147, "Rank": 129
|
||||
"AreaTable": {
|
||||
"ExploreFlag": 3,
|
||||
"ID": 0,
|
||||
"MapID": 1,
|
||||
"ParentAreaNum": 2
|
||||
},
|
||||
"ItemDisplayInfo": {
|
||||
"ID": 0, "LeftModel": 1, "LeftModelTexture": 3,
|
||||
"InventoryIcon": 5, "GeosetGroup1": 7, "GeosetGroup3": 9,
|
||||
"TextureArmUpper": 14, "TextureArmLower": 15, "TextureHand": 16,
|
||||
"TextureTorsoUpper": 17, "TextureTorsoLower": 18,
|
||||
"TextureLegUpper": 19, "TextureLegLower": 20, "TextureFoot": 21
|
||||
"CharHairGeosets": {
|
||||
"GeosetID": 4,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"Variation": 3
|
||||
},
|
||||
"CharSections": {
|
||||
"RaceID": 1, "SexID": 2, "BaseSection": 3,
|
||||
"VariationIndex": 4, "ColorIndex": 5,
|
||||
"Texture1": 6, "Texture2": 7, "Texture3": 8,
|
||||
"Flags": 9
|
||||
},
|
||||
"SpellIcon": { "ID": 0, "Path": 1 },
|
||||
"FactionTemplate": {
|
||||
"ID": 0, "Faction": 1, "FactionGroup": 3,
|
||||
"FriendGroup": 4, "EnemyGroup": 5,
|
||||
"Enemy0": 6, "Enemy1": 7, "Enemy2": 8, "Enemy3": 9
|
||||
},
|
||||
"Faction": {
|
||||
"ID": 0, "ReputationRaceMask0": 2, "ReputationRaceMask1": 3,
|
||||
"ReputationRaceMask2": 4, "ReputationRaceMask3": 5,
|
||||
"ReputationBase0": 10, "ReputationBase1": 11,
|
||||
"ReputationBase2": 12, "ReputationBase3": 13
|
||||
},
|
||||
"AreaTable": { "ID": 0, "ExploreFlag": 3 },
|
||||
"CreatureDisplayInfoExtra": {
|
||||
"ID": 0, "RaceID": 1, "SexID": 2, "SkinID": 3, "FaceID": 4,
|
||||
"HairStyleID": 5, "HairColorID": 6, "FacialHairID": 7,
|
||||
"EquipDisplay0": 8, "EquipDisplay1": 9, "EquipDisplay2": 10,
|
||||
"EquipDisplay3": 11, "EquipDisplay4": 12, "EquipDisplay5": 13,
|
||||
"EquipDisplay6": 14, "EquipDisplay7": 15, "EquipDisplay8": 16,
|
||||
"EquipDisplay9": 17, "EquipDisplay10": 18, "BakeName": 20
|
||||
},
|
||||
"CreatureDisplayInfo": {
|
||||
"ID": 0, "ModelID": 1, "ExtraDisplayId": 3,
|
||||
"Skin1": 6, "Skin2": 7, "Skin3": 8
|
||||
},
|
||||
"TaxiNodes": {
|
||||
"ID": 0, "MapID": 1, "X": 2, "Y": 3, "Z": 4, "Name": 5
|
||||
},
|
||||
"TaxiPath": { "ID": 0, "FromNode": 1, "ToNode": 2, "Cost": 3 },
|
||||
"TaxiPathNode": {
|
||||
"ID": 0, "PathID": 1, "NodeIndex": 2, "MapID": 3,
|
||||
"X": 4, "Y": 5, "Z": 6
|
||||
},
|
||||
"TalentTab": {
|
||||
"ID": 0, "Name": 1, "ClassMask": 12,
|
||||
"OrderIndex": 14, "BackgroundFile": 15
|
||||
},
|
||||
"Talent": {
|
||||
"ID": 0, "TabID": 1, "Row": 2, "Column": 3,
|
||||
"RankSpell0": 4, "PrereqTalent0": 9, "PrereqRank0": 12
|
||||
},
|
||||
"SkillLineAbility": { "SkillLineID": 1, "SpellID": 2 },
|
||||
"SkillLine": { "ID": 0, "Category": 1, "Name": 3 },
|
||||
"Map": { "ID": 0, "InternalName": 1 },
|
||||
"CreatureModelData": { "ID": 0, "ModelPath": 2 },
|
||||
"CharHairGeosets": {
|
||||
"RaceID": 1, "SexID": 2, "Variation": 3, "GeosetID": 4
|
||||
"BaseSection": 3,
|
||||
"ColorIndex": 5,
|
||||
"Flags": 9,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"Texture1": 6,
|
||||
"Texture2": 7,
|
||||
"Texture3": 8,
|
||||
"VariationIndex": 4
|
||||
},
|
||||
"CharacterFacialHairStyles": {
|
||||
"RaceID": 0, "SexID": 1, "Variation": 2,
|
||||
"Geoset100": 3, "Geoset300": 4, "Geoset200": 5
|
||||
"Geoset100": 3,
|
||||
"Geoset200": 5,
|
||||
"Geoset300": 4,
|
||||
"RaceID": 0,
|
||||
"SexID": 1,
|
||||
"Variation": 2
|
||||
},
|
||||
"CreatureDisplayInfo": {
|
||||
"ExtraDisplayId": 3,
|
||||
"ID": 0,
|
||||
"ModelID": 1,
|
||||
"Skin1": 6,
|
||||
"Skin2": 7,
|
||||
"Skin3": 8
|
||||
},
|
||||
"CreatureDisplayInfoExtra": {
|
||||
"BakeName": 20,
|
||||
"EquipDisplay0": 8,
|
||||
"EquipDisplay1": 9,
|
||||
"EquipDisplay10": 18,
|
||||
"EquipDisplay2": 10,
|
||||
"EquipDisplay3": 11,
|
||||
"EquipDisplay4": 12,
|
||||
"EquipDisplay5": 13,
|
||||
"EquipDisplay6": 14,
|
||||
"EquipDisplay7": 15,
|
||||
"EquipDisplay8": 16,
|
||||
"EquipDisplay9": 17,
|
||||
"FaceID": 4,
|
||||
"FacialHairID": 7,
|
||||
"HairColorID": 6,
|
||||
"HairStyleID": 5,
|
||||
"ID": 0,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"SkinID": 3
|
||||
},
|
||||
"CreatureModelData": {
|
||||
"ID": 0,
|
||||
"ModelPath": 2
|
||||
},
|
||||
"Emotes": {
|
||||
"AnimID": 2,
|
||||
"ID": 0
|
||||
},
|
||||
"GameObjectDisplayInfo": { "ID": 0, "ModelName": 1 },
|
||||
"Emotes": { "ID": 0, "AnimID": 2 },
|
||||
"EmotesText": {
|
||||
"ID": 0, "Command": 1, "EmoteRef": 2,
|
||||
"OthersTargetTextID": 3, "SenderTargetTextID": 5,
|
||||
"OthersNoTargetTextID": 7, "SenderNoTargetTextID": 9
|
||||
"Command": 1,
|
||||
"EmoteRef": 2,
|
||||
"ID": 0,
|
||||
"OthersNoTargetTextID": 7,
|
||||
"OthersTargetTextID": 3,
|
||||
"SenderNoTargetTextID": 9,
|
||||
"SenderTargetTextID": 5
|
||||
},
|
||||
"EmotesTextData": {
|
||||
"ID": 0,
|
||||
"Text": 1
|
||||
},
|
||||
"Faction": {
|
||||
"ID": 0,
|
||||
"ReputationBase0": 10,
|
||||
"ReputationBase1": 11,
|
||||
"ReputationBase2": 12,
|
||||
"ReputationBase3": 13,
|
||||
"ReputationRaceMask0": 2,
|
||||
"ReputationRaceMask1": 3,
|
||||
"ReputationRaceMask2": 4,
|
||||
"ReputationRaceMask3": 5
|
||||
},
|
||||
"FactionTemplate": {
|
||||
"Enemy0": 6,
|
||||
"Enemy1": 7,
|
||||
"Enemy2": 8,
|
||||
"Enemy3": 9,
|
||||
"EnemyGroup": 5,
|
||||
"Faction": 1,
|
||||
"FactionGroup": 3,
|
||||
"FriendGroup": 4,
|
||||
"ID": 0
|
||||
},
|
||||
"GameObjectDisplayInfo": {
|
||||
"ID": 0,
|
||||
"ModelName": 1
|
||||
},
|
||||
"ItemDisplayInfo": {
|
||||
"GeosetGroup1": 7,
|
||||
"GeosetGroup3": 9,
|
||||
"ID": 0,
|
||||
"InventoryIcon": 5,
|
||||
"LeftModel": 1,
|
||||
"LeftModelTexture": 3,
|
||||
"TextureArmLower": 15,
|
||||
"TextureArmUpper": 14,
|
||||
"TextureFoot": 21,
|
||||
"TextureHand": 16,
|
||||
"TextureLegLower": 20,
|
||||
"TextureLegUpper": 19,
|
||||
"TextureTorsoLower": 18,
|
||||
"TextureTorsoUpper": 17
|
||||
},
|
||||
"EmotesTextData": { "ID": 0, "Text": 1 },
|
||||
"Light": {
|
||||
"ID": 0, "MapID": 1, "X": 2, "Z": 3, "Y": 4,
|
||||
"InnerRadius": 5, "OuterRadius": 6, "LightParamsID": 7,
|
||||
"LightParamsIDRain": 8, "LightParamsIDUnderwater": 9
|
||||
},
|
||||
"LightParams": { "LightParamsID": 0 },
|
||||
"LightIntBand": {
|
||||
"BlockIndex": 1, "NumKeyframes": 2, "TimeKey0": 3, "Value0": 19
|
||||
"ID": 0,
|
||||
"InnerRadius": 5,
|
||||
"LightParamsID": 7,
|
||||
"LightParamsIDRain": 8,
|
||||
"LightParamsIDUnderwater": 9,
|
||||
"MapID": 1,
|
||||
"OuterRadius": 6,
|
||||
"X": 2,
|
||||
"Y": 4,
|
||||
"Z": 3
|
||||
},
|
||||
"LightFloatBand": {
|
||||
"BlockIndex": 1, "NumKeyframes": 2, "TimeKey0": 3, "Value0": 19
|
||||
"BlockIndex": 1,
|
||||
"NumKeyframes": 2,
|
||||
"TimeKey0": 3,
|
||||
"Value0": 19
|
||||
},
|
||||
"LightIntBand": {
|
||||
"BlockIndex": 1,
|
||||
"NumKeyframes": 2,
|
||||
"TimeKey0": 3,
|
||||
"Value0": 19
|
||||
},
|
||||
"LightParams": {
|
||||
"LightParamsID": 0
|
||||
},
|
||||
"Map": {
|
||||
"ID": 0,
|
||||
"InternalName": 1
|
||||
},
|
||||
"SkillLine": {
|
||||
"Category": 1,
|
||||
"ID": 0,
|
||||
"Name": 3
|
||||
},
|
||||
"SkillLineAbility": {
|
||||
"SkillLineID": 1,
|
||||
"SpellID": 2
|
||||
},
|
||||
"Spell": {
|
||||
"Attributes": 5,
|
||||
"AttributesEx": 6,
|
||||
"CastingTimeIndex": 15,
|
||||
"DispelType": 4,
|
||||
"DurationIndex": 40,
|
||||
"EffectBasePoints0": 80,
|
||||
"EffectBasePoints1": 81,
|
||||
"EffectBasePoints2": 82,
|
||||
"ID": 0,
|
||||
"IconID": 117,
|
||||
"ManaCost": 29,
|
||||
"Name": 120,
|
||||
"PowerType": 28,
|
||||
"RangeIndex": 33,
|
||||
"Rank": 129,
|
||||
"SchoolEnum": 1,
|
||||
"Tooltip": 147
|
||||
},
|
||||
"SpellIcon": {
|
||||
"ID": 0,
|
||||
"Path": 1
|
||||
},
|
||||
"SpellRange": {
|
||||
"MaxRange": 2
|
||||
},
|
||||
"SpellVisual": {
|
||||
"CastKit": 2,
|
||||
"ID": 0,
|
||||
"ImpactKit": 3,
|
||||
"MissileModel": 8
|
||||
},
|
||||
"SpellVisualEffectName": {
|
||||
"FilePath": 2,
|
||||
"ID": 0
|
||||
},
|
||||
"SpellVisualKit": {
|
||||
"BaseEffect": 5,
|
||||
"ID": 0,
|
||||
"SpecialEffect0": 11,
|
||||
"SpecialEffect1": 12,
|
||||
"SpecialEffect2": 13
|
||||
},
|
||||
"Talent": {
|
||||
"Column": 3,
|
||||
"ID": 0,
|
||||
"PrereqRank0": 12,
|
||||
"PrereqTalent0": 9,
|
||||
"RankSpell0": 4,
|
||||
"Row": 2,
|
||||
"TabID": 1
|
||||
},
|
||||
"TalentTab": {
|
||||
"BackgroundFile": 15,
|
||||
"ClassMask": 12,
|
||||
"ID": 0,
|
||||
"Name": 1,
|
||||
"OrderIndex": 14
|
||||
},
|
||||
"TaxiNodes": {
|
||||
"ID": 0,
|
||||
"MapID": 1,
|
||||
"Name": 5,
|
||||
"X": 2,
|
||||
"Y": 3,
|
||||
"Z": 4
|
||||
},
|
||||
"TaxiPath": {
|
||||
"Cost": 3,
|
||||
"FromNode": 1,
|
||||
"ID": 0,
|
||||
"ToNode": 2
|
||||
},
|
||||
"TaxiPathNode": {
|
||||
"ID": 0,
|
||||
"MapID": 3,
|
||||
"NodeIndex": 2,
|
||||
"PathID": 1,
|
||||
"X": 4,
|
||||
"Y": 5,
|
||||
"Z": 6
|
||||
},
|
||||
"WorldMapArea": {
|
||||
"ID": 0, "MapID": 1, "AreaID": 2, "AreaName": 3,
|
||||
"LocLeft": 4, "LocRight": 5, "LocTop": 6, "LocBottom": 7,
|
||||
"DisplayMapID": 8, "ParentWorldMapID": 10
|
||||
"AreaID": 2,
|
||||
"AreaName": 3,
|
||||
"DisplayMapID": 8,
|
||||
"ID": 0,
|
||||
"LocBottom": 7,
|
||||
"LocLeft": 4,
|
||||
"LocRight": 5,
|
||||
"LocTop": 6,
|
||||
"MapID": 1,
|
||||
"ParentWorldMapID": 10
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -273,7 +273,7 @@
|
|||
"SMSG_INVENTORY_CHANGE_FAILURE": "0x112",
|
||||
"SMSG_OPEN_CONTAINER": "0x113",
|
||||
"CMSG_INSPECT": "0x114",
|
||||
"SMSG_INSPECT": "0x115",
|
||||
"SMSG_INSPECT_RESULTS_UPDATE": "0x115",
|
||||
"CMSG_INITIATE_TRADE": "0x116",
|
||||
"CMSG_BEGIN_TRADE": "0x117",
|
||||
"CMSG_BUSY_TRADE": "0x118",
|
||||
|
|
@ -300,7 +300,7 @@
|
|||
"CMSG_NEW_SPELL_SLOT": "0x12D",
|
||||
"CMSG_CAST_SPELL": "0x12E",
|
||||
"CMSG_CANCEL_CAST": "0x12F",
|
||||
"SMSG_CAST_RESULT": "0x130",
|
||||
"SMSG_CAST_FAILED": "0x130",
|
||||
"SMSG_SPELL_START": "0x131",
|
||||
"SMSG_SPELL_GO": "0x132",
|
||||
"SMSG_SPELL_FAILURE": "0x133",
|
||||
|
|
@ -504,8 +504,7 @@
|
|||
"CMSG_GM_SET_SECURITY_GROUP": "0x1F9",
|
||||
"CMSG_GM_NUKE": "0x1FA",
|
||||
"MSG_RANDOM_ROLL": "0x1FB",
|
||||
"SMSG_ENVIRONMENTALDAMAGELOG": "0x1FC",
|
||||
"CMSG_RWHOIS_OBSOLETE": "0x1FD",
|
||||
"SMSG_ENVIRONMENTAL_DAMAGE_LOG": "0x1FC",
|
||||
"SMSG_RWHOIS": "0x1FE",
|
||||
"MSG_LOOKING_FOR_GROUP": "0x1FF",
|
||||
"CMSG_SET_LOOKING_FOR_GROUP": "0x200",
|
||||
|
|
@ -528,7 +527,6 @@
|
|||
"CMSG_GMTICKET_GETTICKET": "0x211",
|
||||
"SMSG_GMTICKET_GETTICKET": "0x212",
|
||||
"CMSG_UNLEARN_TALENTS": "0x213",
|
||||
"SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE": "0x214",
|
||||
"SMSG_GAMEOBJECT_DESPAWN_ANIM": "0x215",
|
||||
"MSG_CORPSE_QUERY": "0x216",
|
||||
"CMSG_GMTICKET_DELETETICKET": "0x217",
|
||||
|
|
@ -538,7 +536,7 @@
|
|||
"SMSG_GMTICKET_SYSTEMSTATUS": "0x21B",
|
||||
"CMSG_SPIRIT_HEALER_ACTIVATE": "0x21C",
|
||||
"CMSG_SET_STAT_CHEAT": "0x21D",
|
||||
"SMSG_SET_REST_START": "0x21E",
|
||||
"SMSG_QUEST_FORCE_REMOVE": "0x21E",
|
||||
"CMSG_SKILL_BUY_STEP": "0x21F",
|
||||
"CMSG_SKILL_BUY_RANK": "0x220",
|
||||
"CMSG_XP_CHEAT": "0x221",
|
||||
|
|
@ -571,8 +569,6 @@
|
|||
"CMSG_BATTLEFIELD_LIST": "0x23C",
|
||||
"SMSG_BATTLEFIELD_LIST": "0x23D",
|
||||
"CMSG_BATTLEFIELD_JOIN": "0x23E",
|
||||
"SMSG_BATTLEFIELD_WIN_OBSOLETE": "0x23F",
|
||||
"SMSG_BATTLEFIELD_LOSE_OBSOLETE": "0x240",
|
||||
"CMSG_TAXICLEARNODE": "0x241",
|
||||
"CMSG_TAXIENABLENODE": "0x242",
|
||||
"CMSG_ITEM_TEXT_QUERY": "0x243",
|
||||
|
|
@ -605,7 +601,6 @@
|
|||
"SMSG_AUCTION_BIDDER_NOTIFICATION": "0x25E",
|
||||
"SMSG_AUCTION_OWNER_NOTIFICATION": "0x25F",
|
||||
"SMSG_PROCRESIST": "0x260",
|
||||
"SMSG_STANDSTATE_CHANGE_FAILURE_OBSOLETE": "0x261",
|
||||
"SMSG_DISPEL_FAILED": "0x262",
|
||||
"SMSG_SPELLORDAMAGE_IMMUNE": "0x263",
|
||||
"CMSG_AUCTION_LIST_BIDDER_ITEMS": "0x264",
|
||||
|
|
@ -693,8 +688,8 @@
|
|||
"SMSG_SCRIPT_MESSAGE": "0x2B6",
|
||||
"SMSG_DUEL_COUNTDOWN": "0x2B7",
|
||||
"SMSG_AREA_TRIGGER_MESSAGE": "0x2B8",
|
||||
"CMSG_TOGGLE_HELM": "0x2B9",
|
||||
"CMSG_TOGGLE_CLOAK": "0x2BA",
|
||||
"CMSG_SHOWING_HELM": "0x2B9",
|
||||
"CMSG_SHOWING_CLOAK": "0x2BA",
|
||||
"SMSG_MEETINGSTONE_JOINFAILED": "0x2BB",
|
||||
"SMSG_PLAYER_SKINNED": "0x2BC",
|
||||
"SMSG_DURABILITY_DAMAGE_DEATH": "0x2BD",
|
||||
|
|
@ -821,6 +816,5 @@
|
|||
"SMSG_LOTTERY_RESULT_OBSOLETE": "0x337",
|
||||
"SMSG_CHARACTER_PROFILE": "0x338",
|
||||
"SMSG_CHARACTER_PROFILE_REALM_CONNECTED": "0x339",
|
||||
"SMSG_UNK": "0x33A",
|
||||
"SMSG_DEFENSE_MESSAGE": "0x33B"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,38 +1,49 @@
|
|||
{
|
||||
"CONTAINER_FIELD_NUM_SLOTS": 48,
|
||||
"CONTAINER_FIELD_SLOT_1": 50,
|
||||
"GAMEOBJECT_DISPLAYID": 8,
|
||||
"ITEM_FIELD_DURABILITY": 48,
|
||||
"ITEM_FIELD_MAXDURABILITY": 49,
|
||||
"ITEM_FIELD_STACK_COUNT": 14,
|
||||
"OBJECT_FIELD_ENTRY": 3,
|
||||
"UNIT_FIELD_TARGET_LO": 16,
|
||||
"UNIT_FIELD_TARGET_HI": 17,
|
||||
"UNIT_FIELD_BYTES_0": 36,
|
||||
"UNIT_FIELD_HEALTH": 22,
|
||||
"UNIT_FIELD_POWER1": 23,
|
||||
"UNIT_FIELD_MAXHEALTH": 28,
|
||||
"UNIT_FIELD_MAXPOWER1": 29,
|
||||
"UNIT_FIELD_LEVEL": 34,
|
||||
"UNIT_FIELD_FACTIONTEMPLATE": 35,
|
||||
"UNIT_FIELD_FLAGS": 46,
|
||||
"UNIT_FIELD_DISPLAYID": 131,
|
||||
"UNIT_FIELD_MOUNTDISPLAYID": 133,
|
||||
"UNIT_FIELD_AURAS": 50,
|
||||
"UNIT_NPC_FLAGS": 147,
|
||||
"UNIT_DYNAMIC_FLAGS": 143,
|
||||
"UNIT_FIELD_RESISTANCES": 154,
|
||||
"UNIT_END": 188,
|
||||
"PLAYER_FLAGS": 190,
|
||||
"OBJECT_FIELD_SCALE_X": 4,
|
||||
"PLAYER_BYTES": 191,
|
||||
"PLAYER_BYTES_2": 192,
|
||||
"PLAYER_XP": 716,
|
||||
"PLAYER_NEXT_LEVEL_XP": 717,
|
||||
"PLAYER_END": 1282,
|
||||
"PLAYER_EXPLORED_ZONES_START": 1111,
|
||||
"PLAYER_FIELD_BANKBAG_SLOT_1": 612,
|
||||
"PLAYER_FIELD_BANK_SLOT_1": 564,
|
||||
"PLAYER_FIELD_COINAGE": 1176,
|
||||
"PLAYER_QUEST_LOG_START": 198,
|
||||
"PLAYER_FIELD_INV_SLOT_HEAD": 486,
|
||||
"PLAYER_FIELD_PACK_SLOT_1": 532,
|
||||
"PLAYER_FIELD_BANK_SLOT_1": 564,
|
||||
"PLAYER_FIELD_BANKBAG_SLOT_1": 612,
|
||||
"PLAYER_FLAGS": 190,
|
||||
"PLAYER_NEXT_LEVEL_XP": 717,
|
||||
"PLAYER_QUEST_LOG_START": 198,
|
||||
"PLAYER_REST_STATE_EXPERIENCE": 1175,
|
||||
"PLAYER_SKILL_INFO_START": 718,
|
||||
"PLAYER_EXPLORED_ZONES_START": 1111,
|
||||
"PLAYER_END": 1282,
|
||||
"GAMEOBJECT_DISPLAYID": 8,
|
||||
"ITEM_FIELD_STACK_COUNT": 14,
|
||||
"CONTAINER_FIELD_NUM_SLOTS": 48,
|
||||
"CONTAINER_FIELD_SLOT_1": 50
|
||||
"PLAYER_XP": 716,
|
||||
"UNIT_DYNAMIC_FLAGS": 143,
|
||||
"UNIT_END": 188,
|
||||
"UNIT_FIELD_AURAFLAGS": 98,
|
||||
"UNIT_FIELD_AURAS": 50,
|
||||
"UNIT_FIELD_BYTES_0": 36,
|
||||
"UNIT_FIELD_BYTES_1": 133,
|
||||
"UNIT_FIELD_DISPLAYID": 131,
|
||||
"UNIT_FIELD_FACTIONTEMPLATE": 35,
|
||||
"UNIT_FIELD_FLAGS": 46,
|
||||
"UNIT_FIELD_HEALTH": 22,
|
||||
"UNIT_FIELD_LEVEL": 34,
|
||||
"UNIT_FIELD_MAXHEALTH": 28,
|
||||
"UNIT_FIELD_MAXPOWER1": 29,
|
||||
"UNIT_FIELD_MOUNTDISPLAYID": 133,
|
||||
"UNIT_FIELD_POWER1": 23,
|
||||
"UNIT_FIELD_RESISTANCES": 154,
|
||||
"UNIT_FIELD_STAT0": 138,
|
||||
"UNIT_FIELD_STAT1": 139,
|
||||
"UNIT_FIELD_STAT2": 140,
|
||||
"UNIT_FIELD_STAT3": 141,
|
||||
"UNIT_FIELD_STAT4": 142,
|
||||
"UNIT_FIELD_TARGET_HI": 17,
|
||||
"UNIT_FIELD_TARGET_LO": 16,
|
||||
"UNIT_NPC_FLAGS": 147
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,98 +1,307 @@
|
|||
{
|
||||
"Spell": {
|
||||
"ID": 0, "Attributes": 5, "IconID": 124,
|
||||
"Name": 127, "Tooltip": 154, "Rank": 136
|
||||
"AreaTable": {
|
||||
"ExploreFlag": 3,
|
||||
"ID": 0,
|
||||
"MapID": 1,
|
||||
"ParentAreaNum": 2
|
||||
},
|
||||
"ItemDisplayInfo": {
|
||||
"ID": 0, "LeftModel": 1, "LeftModelTexture": 3,
|
||||
"InventoryIcon": 5, "GeosetGroup1": 7, "GeosetGroup3": 9,
|
||||
"TextureArmUpper": 14, "TextureArmLower": 15, "TextureHand": 16,
|
||||
"TextureTorsoUpper": 17, "TextureTorsoLower": 18,
|
||||
"TextureLegUpper": 19, "TextureLegLower": 20, "TextureFoot": 21
|
||||
"CharHairGeosets": {
|
||||
"GeosetID": 4,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"Variation": 3
|
||||
},
|
||||
"CharSections": {
|
||||
"RaceID": 1, "SexID": 2, "BaseSection": 3,
|
||||
"VariationIndex": 4, "ColorIndex": 5,
|
||||
"Texture1": 6, "Texture2": 7, "Texture3": 8,
|
||||
"Flags": 9
|
||||
"BaseSection": 3,
|
||||
"ColorIndex": 5,
|
||||
"Flags": 9,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"Texture1": 6,
|
||||
"Texture2": 7,
|
||||
"Texture3": 8,
|
||||
"VariationIndex": 4
|
||||
},
|
||||
"SpellIcon": { "ID": 0, "Path": 1 },
|
||||
"FactionTemplate": {
|
||||
"ID": 0, "Faction": 1, "FactionGroup": 3,
|
||||
"FriendGroup": 4, "EnemyGroup": 5,
|
||||
"Enemy0": 6, "Enemy1": 7, "Enemy2": 8, "Enemy3": 9
|
||||
},
|
||||
"Faction": {
|
||||
"ID": 0, "ReputationRaceMask0": 2, "ReputationRaceMask1": 3,
|
||||
"ReputationRaceMask2": 4, "ReputationRaceMask3": 5,
|
||||
"ReputationBase0": 10, "ReputationBase1": 11,
|
||||
"ReputationBase2": 12, "ReputationBase3": 13
|
||||
},
|
||||
"AreaTable": { "ID": 0, "ExploreFlag": 3 },
|
||||
"CreatureDisplayInfoExtra": {
|
||||
"ID": 0, "RaceID": 1, "SexID": 2, "SkinID": 3, "FaceID": 4,
|
||||
"HairStyleID": 5, "HairColorID": 6, "FacialHairID": 7,
|
||||
"EquipDisplay0": 8, "EquipDisplay1": 9, "EquipDisplay2": 10,
|
||||
"EquipDisplay3": 11, "EquipDisplay4": 12, "EquipDisplay5": 13,
|
||||
"EquipDisplay6": 14, "EquipDisplay7": 15, "EquipDisplay8": 16,
|
||||
"EquipDisplay9": 17, "EquipDisplay10": 18, "BakeName": 20
|
||||
},
|
||||
"CreatureDisplayInfo": {
|
||||
"ID": 0, "ModelID": 1, "ExtraDisplayId": 3,
|
||||
"Skin1": 6, "Skin2": 7, "Skin3": 8
|
||||
},
|
||||
"TaxiNodes": {
|
||||
"ID": 0, "MapID": 1, "X": 2, "Y": 3, "Z": 4, "Name": 5,
|
||||
"MountDisplayIdAllianceFallback": 12, "MountDisplayIdHordeFallback": 13,
|
||||
"MountDisplayIdAlliance": 14, "MountDisplayIdHorde": 15
|
||||
},
|
||||
"TaxiPath": { "ID": 0, "FromNode": 1, "ToNode": 2, "Cost": 3 },
|
||||
"TaxiPathNode": {
|
||||
"ID": 0, "PathID": 1, "NodeIndex": 2, "MapID": 3,
|
||||
"X": 4, "Y": 5, "Z": 6
|
||||
},
|
||||
"TalentTab": {
|
||||
"ID": 0, "Name": 1, "ClassMask": 12,
|
||||
"OrderIndex": 14, "BackgroundFile": 15
|
||||
},
|
||||
"Talent": {
|
||||
"ID": 0, "TabID": 1, "Row": 2, "Column": 3,
|
||||
"RankSpell0": 4, "PrereqTalent0": 9, "PrereqRank0": 12
|
||||
},
|
||||
"SkillLineAbility": { "SkillLineID": 1, "SpellID": 2 },
|
||||
"SkillLine": { "ID": 0, "Category": 1, "Name": 3 },
|
||||
"Map": { "ID": 0, "InternalName": 1 },
|
||||
"CreatureModelData": { "ID": 0, "ModelPath": 2 },
|
||||
"CharHairGeosets": {
|
||||
"RaceID": 1, "SexID": 2, "Variation": 3, "GeosetID": 4
|
||||
"CharTitles": {
|
||||
"ID": 0,
|
||||
"Title": 2,
|
||||
"TitleBit": 20
|
||||
},
|
||||
"CharacterFacialHairStyles": {
|
||||
"RaceID": 0, "SexID": 1, "Variation": 2,
|
||||
"Geoset100": 3, "Geoset300": 4, "Geoset200": 5
|
||||
"Geoset100": 3,
|
||||
"Geoset200": 5,
|
||||
"Geoset300": 4,
|
||||
"RaceID": 0,
|
||||
"SexID": 1,
|
||||
"Variation": 2
|
||||
},
|
||||
"CreatureDisplayInfo": {
|
||||
"ExtraDisplayId": 3,
|
||||
"ID": 0,
|
||||
"ModelID": 1,
|
||||
"Skin1": 6,
|
||||
"Skin2": 7,
|
||||
"Skin3": 8
|
||||
},
|
||||
"CreatureDisplayInfoExtra": {
|
||||
"BakeName": 20,
|
||||
"EquipDisplay0": 8,
|
||||
"EquipDisplay1": 9,
|
||||
"EquipDisplay10": 18,
|
||||
"EquipDisplay2": 10,
|
||||
"EquipDisplay3": 11,
|
||||
"EquipDisplay4": 12,
|
||||
"EquipDisplay5": 13,
|
||||
"EquipDisplay6": 14,
|
||||
"EquipDisplay7": 15,
|
||||
"EquipDisplay8": 16,
|
||||
"EquipDisplay9": 17,
|
||||
"FaceID": 4,
|
||||
"FacialHairID": 7,
|
||||
"HairColorID": 6,
|
||||
"HairStyleID": 5,
|
||||
"ID": 0,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"SkinID": 3
|
||||
},
|
||||
"CreatureModelData": {
|
||||
"ID": 0,
|
||||
"ModelPath": 2
|
||||
},
|
||||
"Emotes": {
|
||||
"AnimID": 2,
|
||||
"ID": 0
|
||||
},
|
||||
"GameObjectDisplayInfo": { "ID": 0, "ModelName": 1 },
|
||||
"Emotes": { "ID": 0, "AnimID": 2 },
|
||||
"EmotesText": {
|
||||
"ID": 0, "Command": 1, "EmoteRef": 2,
|
||||
"OthersTargetTextID": 3, "SenderTargetTextID": 5,
|
||||
"OthersNoTargetTextID": 7, "SenderNoTargetTextID": 9
|
||||
"Command": 1,
|
||||
"EmoteRef": 2,
|
||||
"ID": 0,
|
||||
"OthersNoTargetTextID": 7,
|
||||
"OthersTargetTextID": 3,
|
||||
"SenderNoTargetTextID": 9,
|
||||
"SenderTargetTextID": 5
|
||||
},
|
||||
"EmotesTextData": {
|
||||
"ID": 0,
|
||||
"Text": 1
|
||||
},
|
||||
"Faction": {
|
||||
"ID": 0,
|
||||
"ReputationBase0": 10,
|
||||
"ReputationBase1": 11,
|
||||
"ReputationBase2": 12,
|
||||
"ReputationBase3": 13,
|
||||
"ReputationRaceMask0": 2,
|
||||
"ReputationRaceMask1": 3,
|
||||
"ReputationRaceMask2": 4,
|
||||
"ReputationRaceMask3": 5
|
||||
},
|
||||
"FactionTemplate": {
|
||||
"Enemy0": 6,
|
||||
"Enemy1": 7,
|
||||
"Enemy2": 8,
|
||||
"Enemy3": 9,
|
||||
"EnemyGroup": 5,
|
||||
"Faction": 1,
|
||||
"FactionGroup": 3,
|
||||
"FriendGroup": 4,
|
||||
"ID": 0
|
||||
},
|
||||
"GameObjectDisplayInfo": {
|
||||
"ID": 0,
|
||||
"ModelName": 1
|
||||
},
|
||||
"ItemDisplayInfo": {
|
||||
"GeosetGroup1": 7,
|
||||
"GeosetGroup3": 9,
|
||||
"ID": 0,
|
||||
"InventoryIcon": 5,
|
||||
"LeftModel": 1,
|
||||
"LeftModelTexture": 3,
|
||||
"TextureArmLower": 15,
|
||||
"TextureArmUpper": 14,
|
||||
"TextureFoot": 21,
|
||||
"TextureHand": 16,
|
||||
"TextureLegLower": 20,
|
||||
"TextureLegUpper": 19,
|
||||
"TextureTorsoLower": 18,
|
||||
"TextureTorsoUpper": 17
|
||||
},
|
||||
"ItemSet": {
|
||||
"ID": 0,
|
||||
"Item0": 18,
|
||||
"Item1": 19,
|
||||
"Item2": 20,
|
||||
"Item3": 21,
|
||||
"Item4": 22,
|
||||
"Item5": 23,
|
||||
"Item6": 24,
|
||||
"Item7": 25,
|
||||
"Item8": 26,
|
||||
"Item9": 27,
|
||||
"Name": 1,
|
||||
"Spell0": 28,
|
||||
"Spell1": 29,
|
||||
"Spell2": 30,
|
||||
"Spell3": 31,
|
||||
"Spell4": 32,
|
||||
"Spell5": 33,
|
||||
"Spell6": 34,
|
||||
"Spell7": 35,
|
||||
"Spell8": 36,
|
||||
"Spell9": 37,
|
||||
"Threshold0": 38,
|
||||
"Threshold1": 39,
|
||||
"Threshold2": 40,
|
||||
"Threshold3": 41,
|
||||
"Threshold4": 42,
|
||||
"Threshold5": 43,
|
||||
"Threshold6": 44,
|
||||
"Threshold7": 45,
|
||||
"Threshold8": 46,
|
||||
"Threshold9": 47
|
||||
},
|
||||
"EmotesTextData": { "ID": 0, "Text": 1 },
|
||||
"Light": {
|
||||
"ID": 0, "MapID": 1, "X": 2, "Z": 3, "Y": 4,
|
||||
"InnerRadius": 5, "OuterRadius": 6, "LightParamsID": 7,
|
||||
"LightParamsIDRain": 8, "LightParamsIDUnderwater": 9
|
||||
},
|
||||
"LightParams": { "LightParamsID": 0 },
|
||||
"LightIntBand": {
|
||||
"BlockIndex": 1, "NumKeyframes": 2, "TimeKey0": 3, "Value0": 19
|
||||
"ID": 0,
|
||||
"InnerRadius": 5,
|
||||
"LightParamsID": 7,
|
||||
"LightParamsIDRain": 8,
|
||||
"LightParamsIDUnderwater": 9,
|
||||
"MapID": 1,
|
||||
"OuterRadius": 6,
|
||||
"X": 2,
|
||||
"Y": 4,
|
||||
"Z": 3
|
||||
},
|
||||
"LightFloatBand": {
|
||||
"BlockIndex": 1, "NumKeyframes": 2, "TimeKey0": 3, "Value0": 19
|
||||
"BlockIndex": 1,
|
||||
"NumKeyframes": 2,
|
||||
"TimeKey0": 3,
|
||||
"Value0": 19
|
||||
},
|
||||
"LightIntBand": {
|
||||
"BlockIndex": 1,
|
||||
"NumKeyframes": 2,
|
||||
"TimeKey0": 3,
|
||||
"Value0": 19
|
||||
},
|
||||
"LightParams": {
|
||||
"LightParamsID": 0
|
||||
},
|
||||
"Map": {
|
||||
"ID": 0,
|
||||
"InternalName": 1
|
||||
},
|
||||
"SkillLine": {
|
||||
"Category": 1,
|
||||
"ID": 0,
|
||||
"Name": 3
|
||||
},
|
||||
"SkillLineAbility": {
|
||||
"SkillLineID": 1,
|
||||
"SpellID": 2
|
||||
},
|
||||
"Spell": {
|
||||
"Attributes": 5,
|
||||
"AttributesEx": 6,
|
||||
"CastingTimeIndex": 22,
|
||||
"DispelType": 3,
|
||||
"DurationIndex": 40,
|
||||
"EffectBasePoints0": 80,
|
||||
"EffectBasePoints1": 81,
|
||||
"EffectBasePoints2": 82,
|
||||
"ID": 0,
|
||||
"IconID": 124,
|
||||
"ManaCost": 36,
|
||||
"Name": 127,
|
||||
"PowerType": 35,
|
||||
"RangeIndex": 40,
|
||||
"Rank": 136,
|
||||
"SchoolMask": 215,
|
||||
"Tooltip": 154
|
||||
},
|
||||
"SpellIcon": {
|
||||
"ID": 0,
|
||||
"Path": 1
|
||||
},
|
||||
"SpellItemEnchantment": {
|
||||
"ID": 0,
|
||||
"Name": 8
|
||||
},
|
||||
"SpellRange": {
|
||||
"MaxRange": 4
|
||||
},
|
||||
"SpellVisual": {
|
||||
"CastKit": 2,
|
||||
"ID": 0,
|
||||
"ImpactKit": 3,
|
||||
"MissileModel": 8
|
||||
},
|
||||
"SpellVisualEffectName": {
|
||||
"FilePath": 2,
|
||||
"ID": 0
|
||||
},
|
||||
"SpellVisualKit": {
|
||||
"BaseEffect": 5,
|
||||
"ID": 0,
|
||||
"SpecialEffect0": 11,
|
||||
"SpecialEffect1": 12,
|
||||
"SpecialEffect2": 13
|
||||
},
|
||||
"Talent": {
|
||||
"Column": 3,
|
||||
"ID": 0,
|
||||
"PrereqRank0": 12,
|
||||
"PrereqTalent0": 9,
|
||||
"RankSpell0": 4,
|
||||
"Row": 2,
|
||||
"TabID": 1
|
||||
},
|
||||
"TalentTab": {
|
||||
"BackgroundFile": 15,
|
||||
"ClassMask": 12,
|
||||
"ID": 0,
|
||||
"Name": 1,
|
||||
"OrderIndex": 14
|
||||
},
|
||||
"TaxiNodes": {
|
||||
"ID": 0,
|
||||
"MapID": 1,
|
||||
"MountDisplayIdAlliance": 14,
|
||||
"MountDisplayIdAllianceFallback": 12,
|
||||
"MountDisplayIdHorde": 15,
|
||||
"MountDisplayIdHordeFallback": 13,
|
||||
"Name": 5,
|
||||
"X": 2,
|
||||
"Y": 3,
|
||||
"Z": 4
|
||||
},
|
||||
"TaxiPath": {
|
||||
"Cost": 3,
|
||||
"FromNode": 1,
|
||||
"ID": 0,
|
||||
"ToNode": 2
|
||||
},
|
||||
"TaxiPathNode": {
|
||||
"ID": 0,
|
||||
"MapID": 3,
|
||||
"NodeIndex": 2,
|
||||
"PathID": 1,
|
||||
"X": 4,
|
||||
"Y": 5,
|
||||
"Z": 6
|
||||
},
|
||||
"WorldMapArea": {
|
||||
"ID": 0, "MapID": 1, "AreaID": 2, "AreaName": 3,
|
||||
"LocLeft": 4, "LocRight": 5, "LocTop": 6, "LocBottom": 7,
|
||||
"DisplayMapID": 8, "ParentWorldMapID": 10
|
||||
"AreaID": 2,
|
||||
"AreaName": 3,
|
||||
"DisplayMapID": 8,
|
||||
"ID": 0,
|
||||
"LocBottom": 7,
|
||||
"LocLeft": 4,
|
||||
"LocRight": 5,
|
||||
"LocTop": 6,
|
||||
"MapID": 1,
|
||||
"ParentWorldMapID": 10
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,49 @@
|
|||
{
|
||||
"CONTAINER_FIELD_NUM_SLOTS": 64,
|
||||
"CONTAINER_FIELD_SLOT_1": 66,
|
||||
"GAMEOBJECT_DISPLAYID": 8,
|
||||
"ITEM_FIELD_DURABILITY": 60,
|
||||
"ITEM_FIELD_MAXDURABILITY": 61,
|
||||
"ITEM_FIELD_STACK_COUNT": 14,
|
||||
"OBJECT_FIELD_ENTRY": 3,
|
||||
"UNIT_FIELD_TARGET_LO": 16,
|
||||
"UNIT_FIELD_TARGET_HI": 17,
|
||||
"OBJECT_FIELD_SCALE_X": 4,
|
||||
"PLAYER_BYTES": 237,
|
||||
"PLAYER_BYTES_2": 238,
|
||||
"PLAYER_EXPLORED_ZONES_START": 1312,
|
||||
"PLAYER_FIELD_ARENA_CURRENCY": 1506,
|
||||
"PLAYER_FIELD_BANKBAG_SLOT_1": 784,
|
||||
"PLAYER_FIELD_BANK_SLOT_1": 728,
|
||||
"PLAYER_FIELD_COINAGE": 1441,
|
||||
"PLAYER_FIELD_HONOR_CURRENCY": 1505,
|
||||
"PLAYER_FIELD_INV_SLOT_HEAD": 650,
|
||||
"PLAYER_FIELD_PACK_SLOT_1": 696,
|
||||
"PLAYER_FLAGS": 236,
|
||||
"PLAYER_NEXT_LEVEL_XP": 927,
|
||||
"PLAYER_QUEST_LOG_START": 244,
|
||||
"PLAYER_REST_STATE_EXPERIENCE": 1440,
|
||||
"PLAYER_SKILL_INFO_START": 928,
|
||||
"PLAYER_XP": 926,
|
||||
"UNIT_DYNAMIC_FLAGS": 164,
|
||||
"UNIT_END": 234,
|
||||
"UNIT_FIELD_BYTES_0": 36,
|
||||
"UNIT_FIELD_HEALTH": 22,
|
||||
"UNIT_FIELD_POWER1": 23,
|
||||
"UNIT_FIELD_MAXHEALTH": 28,
|
||||
"UNIT_FIELD_MAXPOWER1": 29,
|
||||
"UNIT_FIELD_LEVEL": 34,
|
||||
"UNIT_FIELD_BYTES_1": 137,
|
||||
"UNIT_FIELD_DISPLAYID": 152,
|
||||
"UNIT_FIELD_FACTIONTEMPLATE": 35,
|
||||
"UNIT_FIELD_FLAGS": 46,
|
||||
"UNIT_FIELD_FLAGS_2": 47,
|
||||
"UNIT_FIELD_DISPLAYID": 152,
|
||||
"UNIT_FIELD_HEALTH": 22,
|
||||
"UNIT_FIELD_LEVEL": 34,
|
||||
"UNIT_FIELD_MAXHEALTH": 28,
|
||||
"UNIT_FIELD_MAXPOWER1": 29,
|
||||
"UNIT_FIELD_MOUNTDISPLAYID": 154,
|
||||
"UNIT_NPC_FLAGS": 168,
|
||||
"UNIT_DYNAMIC_FLAGS": 164,
|
||||
"UNIT_FIELD_POWER1": 23,
|
||||
"UNIT_FIELD_RESISTANCES": 185,
|
||||
"UNIT_END": 234,
|
||||
"PLAYER_FLAGS": 236,
|
||||
"PLAYER_BYTES": 237,
|
||||
"PLAYER_BYTES_2": 238,
|
||||
"PLAYER_XP": 926,
|
||||
"PLAYER_NEXT_LEVEL_XP": 927,
|
||||
"PLAYER_FIELD_COINAGE": 1441,
|
||||
"PLAYER_QUEST_LOG_START": 244,
|
||||
"PLAYER_FIELD_INV_SLOT_HEAD": 650,
|
||||
"PLAYER_FIELD_PACK_SLOT_1": 696,
|
||||
"PLAYER_FIELD_BANK_SLOT_1": 728,
|
||||
"PLAYER_FIELD_BANKBAG_SLOT_1": 784,
|
||||
"PLAYER_SKILL_INFO_START": 928,
|
||||
"PLAYER_EXPLORED_ZONES_START": 1312,
|
||||
"GAMEOBJECT_DISPLAYID": 8,
|
||||
"ITEM_FIELD_STACK_COUNT": 14,
|
||||
"CONTAINER_FIELD_NUM_SLOTS": 64,
|
||||
"CONTAINER_FIELD_SLOT_1": 66
|
||||
"UNIT_FIELD_STAT0": 159,
|
||||
"UNIT_FIELD_STAT1": 160,
|
||||
"UNIT_FIELD_STAT2": 161,
|
||||
"UNIT_FIELD_STAT3": 162,
|
||||
"UNIT_FIELD_STAT4": 163,
|
||||
"UNIT_FIELD_TARGET_HI": 17,
|
||||
"UNIT_FIELD_TARGET_LO": 16,
|
||||
"UNIT_NPC_FLAGS": 168
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,96 +1,297 @@
|
|||
{
|
||||
"Spell": {
|
||||
"ID": 0, "Attributes": 5, "IconID": 117,
|
||||
"Name": 120, "Tooltip": 147, "Rank": 129
|
||||
"AreaTable": {
|
||||
"ExploreFlag": 3,
|
||||
"ID": 0,
|
||||
"MapID": 1,
|
||||
"ParentAreaNum": 2
|
||||
},
|
||||
"ItemDisplayInfo": {
|
||||
"ID": 0, "LeftModel": 1, "LeftModelTexture": 3,
|
||||
"InventoryIcon": 5, "GeosetGroup1": 7, "GeosetGroup3": 9,
|
||||
"TextureArmUpper": 14, "TextureArmLower": 15, "TextureHand": 16,
|
||||
"TextureTorsoUpper": 17, "TextureTorsoLower": 18,
|
||||
"TextureLegUpper": 19, "TextureLegLower": 20, "TextureFoot": 21
|
||||
"CharHairGeosets": {
|
||||
"GeosetID": 4,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"Variation": 3
|
||||
},
|
||||
"CharSections": {
|
||||
"RaceID": 1, "SexID": 2, "BaseSection": 3,
|
||||
"VariationIndex": 4, "ColorIndex": 5,
|
||||
"Texture1": 6, "Texture2": 7, "Texture3": 8,
|
||||
"Flags": 9
|
||||
},
|
||||
"SpellIcon": { "ID": 0, "Path": 1 },
|
||||
"FactionTemplate": {
|
||||
"ID": 0, "Faction": 1, "FactionGroup": 3,
|
||||
"FriendGroup": 4, "EnemyGroup": 5,
|
||||
"Enemy0": 6, "Enemy1": 7, "Enemy2": 8, "Enemy3": 9
|
||||
},
|
||||
"Faction": {
|
||||
"ID": 0, "ReputationRaceMask0": 2, "ReputationRaceMask1": 3,
|
||||
"ReputationRaceMask2": 4, "ReputationRaceMask3": 5,
|
||||
"ReputationBase0": 10, "ReputationBase1": 11,
|
||||
"ReputationBase2": 12, "ReputationBase3": 13
|
||||
},
|
||||
"AreaTable": { "ID": 0, "ExploreFlag": 3 },
|
||||
"CreatureDisplayInfoExtra": {
|
||||
"ID": 0, "RaceID": 1, "SexID": 2, "SkinID": 3, "FaceID": 4,
|
||||
"HairStyleID": 5, "HairColorID": 6, "FacialHairID": 7,
|
||||
"EquipDisplay0": 8, "EquipDisplay1": 9, "EquipDisplay2": 10,
|
||||
"EquipDisplay3": 11, "EquipDisplay4": 12, "EquipDisplay5": 13,
|
||||
"EquipDisplay6": 14, "EquipDisplay7": 15, "EquipDisplay8": 16,
|
||||
"EquipDisplay9": 17, "BakeName": 18
|
||||
},
|
||||
"CreatureDisplayInfo": {
|
||||
"ID": 0, "ModelID": 1, "ExtraDisplayId": 3,
|
||||
"Skin1": 6, "Skin2": 7, "Skin3": 8
|
||||
},
|
||||
"TaxiNodes": {
|
||||
"ID": 0, "MapID": 1, "X": 2, "Y": 3, "Z": 4, "Name": 5
|
||||
},
|
||||
"TaxiPath": { "ID": 0, "FromNode": 1, "ToNode": 2, "Cost": 3 },
|
||||
"TaxiPathNode": {
|
||||
"ID": 0, "PathID": 1, "NodeIndex": 2, "MapID": 3,
|
||||
"X": 4, "Y": 5, "Z": 6
|
||||
},
|
||||
"TalentTab": {
|
||||
"ID": 0, "Name": 1, "ClassMask": 12,
|
||||
"OrderIndex": 14, "BackgroundFile": 15
|
||||
},
|
||||
"Talent": {
|
||||
"ID": 0, "TabID": 1, "Row": 2, "Column": 3,
|
||||
"RankSpell0": 4, "PrereqTalent0": 9, "PrereqRank0": 12
|
||||
},
|
||||
"SkillLineAbility": { "SkillLineID": 1, "SpellID": 2 },
|
||||
"SkillLine": { "ID": 0, "Category": 1, "Name": 3 },
|
||||
"Map": { "ID": 0, "InternalName": 1 },
|
||||
"CreatureModelData": { "ID": 0, "ModelPath": 2 },
|
||||
"CharHairGeosets": {
|
||||
"RaceID": 1, "SexID": 2, "Variation": 3, "GeosetID": 4
|
||||
"BaseSection": 3,
|
||||
"ColorIndex": 5,
|
||||
"Flags": 9,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"Texture1": 6,
|
||||
"Texture2": 7,
|
||||
"Texture3": 8,
|
||||
"VariationIndex": 4
|
||||
},
|
||||
"CharacterFacialHairStyles": {
|
||||
"RaceID": 0, "SexID": 1, "Variation": 2,
|
||||
"Geoset100": 3, "Geoset300": 4, "Geoset200": 5
|
||||
"Geoset100": 3,
|
||||
"Geoset200": 5,
|
||||
"Geoset300": 4,
|
||||
"RaceID": 0,
|
||||
"SexID": 1,
|
||||
"Variation": 2
|
||||
},
|
||||
"CreatureDisplayInfo": {
|
||||
"ExtraDisplayId": 3,
|
||||
"ID": 0,
|
||||
"ModelID": 1,
|
||||
"Skin1": 6,
|
||||
"Skin2": 7,
|
||||
"Skin3": 8
|
||||
},
|
||||
"CreatureDisplayInfoExtra": {
|
||||
"BakeName": 18,
|
||||
"EquipDisplay0": 8,
|
||||
"EquipDisplay1": 9,
|
||||
"EquipDisplay2": 10,
|
||||
"EquipDisplay3": 11,
|
||||
"EquipDisplay4": 12,
|
||||
"EquipDisplay5": 13,
|
||||
"EquipDisplay6": 14,
|
||||
"EquipDisplay7": 15,
|
||||
"EquipDisplay8": 16,
|
||||
"EquipDisplay9": 17,
|
||||
"FaceID": 4,
|
||||
"FacialHairID": 7,
|
||||
"HairColorID": 6,
|
||||
"HairStyleID": 5,
|
||||
"ID": 0,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"SkinID": 3
|
||||
},
|
||||
"CreatureModelData": {
|
||||
"ID": 0,
|
||||
"ModelPath": 2
|
||||
},
|
||||
"Emotes": {
|
||||
"AnimID": 2,
|
||||
"ID": 0
|
||||
},
|
||||
"GameObjectDisplayInfo": { "ID": 0, "ModelName": 1 },
|
||||
"Emotes": { "ID": 0, "AnimID": 2 },
|
||||
"EmotesText": {
|
||||
"ID": 0, "Command": 1, "EmoteRef": 2,
|
||||
"OthersTargetTextID": 3, "SenderTargetTextID": 5,
|
||||
"OthersNoTargetTextID": 7, "SenderNoTargetTextID": 9
|
||||
"Command": 1,
|
||||
"EmoteRef": 2,
|
||||
"ID": 0,
|
||||
"OthersNoTargetTextID": 7,
|
||||
"OthersTargetTextID": 3,
|
||||
"SenderNoTargetTextID": 9,
|
||||
"SenderTargetTextID": 5
|
||||
},
|
||||
"EmotesTextData": {
|
||||
"ID": 0,
|
||||
"Text": 1
|
||||
},
|
||||
"Faction": {
|
||||
"ID": 0,
|
||||
"ReputationBase0": 10,
|
||||
"ReputationBase1": 11,
|
||||
"ReputationBase2": 12,
|
||||
"ReputationBase3": 13,
|
||||
"ReputationRaceMask0": 2,
|
||||
"ReputationRaceMask1": 3,
|
||||
"ReputationRaceMask2": 4,
|
||||
"ReputationRaceMask3": 5
|
||||
},
|
||||
"FactionTemplate": {
|
||||
"Enemy0": 6,
|
||||
"Enemy1": 7,
|
||||
"Enemy2": 8,
|
||||
"Enemy3": 9,
|
||||
"EnemyGroup": 5,
|
||||
"Faction": 1,
|
||||
"FactionGroup": 3,
|
||||
"FriendGroup": 4,
|
||||
"ID": 0
|
||||
},
|
||||
"GameObjectDisplayInfo": {
|
||||
"ID": 0,
|
||||
"ModelName": 1
|
||||
},
|
||||
"ItemDisplayInfo": {
|
||||
"GeosetGroup1": 7,
|
||||
"GeosetGroup3": 9,
|
||||
"ID": 0,
|
||||
"InventoryIcon": 5,
|
||||
"LeftModel": 1,
|
||||
"LeftModelTexture": 3,
|
||||
"TextureArmLower": 15,
|
||||
"TextureArmUpper": 14,
|
||||
"TextureFoot": 21,
|
||||
"TextureHand": 16,
|
||||
"TextureLegLower": 20,
|
||||
"TextureLegUpper": 19,
|
||||
"TextureTorsoLower": 18,
|
||||
"TextureTorsoUpper": 17
|
||||
},
|
||||
"ItemSet": {
|
||||
"ID": 0,
|
||||
"Item0": 10,
|
||||
"Item1": 11,
|
||||
"Item2": 12,
|
||||
"Item3": 13,
|
||||
"Item4": 14,
|
||||
"Item5": 15,
|
||||
"Item6": 16,
|
||||
"Item7": 17,
|
||||
"Item8": 18,
|
||||
"Item9": 19,
|
||||
"Name": 1,
|
||||
"Spell0": 20,
|
||||
"Spell1": 21,
|
||||
"Spell2": 22,
|
||||
"Spell3": 23,
|
||||
"Spell4": 24,
|
||||
"Spell5": 25,
|
||||
"Spell6": 26,
|
||||
"Spell7": 27,
|
||||
"Spell8": 28,
|
||||
"Spell9": 29,
|
||||
"Threshold0": 30,
|
||||
"Threshold1": 31,
|
||||
"Threshold2": 32,
|
||||
"Threshold3": 33,
|
||||
"Threshold4": 34,
|
||||
"Threshold5": 35,
|
||||
"Threshold6": 36,
|
||||
"Threshold7": 37,
|
||||
"Threshold8": 38,
|
||||
"Threshold9": 39
|
||||
},
|
||||
"EmotesTextData": { "ID": 0, "Text": 1 },
|
||||
"Light": {
|
||||
"ID": 0, "MapID": 1, "X": 2, "Z": 3, "Y": 4,
|
||||
"InnerRadius": 5, "OuterRadius": 6, "LightParamsID": 7,
|
||||
"LightParamsIDRain": 8, "LightParamsIDUnderwater": 9
|
||||
},
|
||||
"LightParams": { "LightParamsID": 0 },
|
||||
"LightIntBand": {
|
||||
"BlockIndex": 1, "NumKeyframes": 2, "TimeKey0": 3, "Value0": 19
|
||||
"ID": 0,
|
||||
"InnerRadius": 5,
|
||||
"LightParamsID": 7,
|
||||
"LightParamsIDRain": 8,
|
||||
"LightParamsIDUnderwater": 9,
|
||||
"MapID": 1,
|
||||
"OuterRadius": 6,
|
||||
"X": 2,
|
||||
"Y": 4,
|
||||
"Z": 3
|
||||
},
|
||||
"LightFloatBand": {
|
||||
"BlockIndex": 1, "NumKeyframes": 2, "TimeKey0": 3, "Value0": 19
|
||||
"BlockIndex": 1,
|
||||
"NumKeyframes": 2,
|
||||
"TimeKey0": 3,
|
||||
"Value0": 19
|
||||
},
|
||||
"LightIntBand": {
|
||||
"BlockIndex": 1,
|
||||
"NumKeyframes": 2,
|
||||
"TimeKey0": 3,
|
||||
"Value0": 19
|
||||
},
|
||||
"LightParams": {
|
||||
"LightParamsID": 0
|
||||
},
|
||||
"Map": {
|
||||
"ID": 0,
|
||||
"InternalName": 1
|
||||
},
|
||||
"SkillLine": {
|
||||
"Category": 1,
|
||||
"ID": 0,
|
||||
"Name": 3
|
||||
},
|
||||
"SkillLineAbility": {
|
||||
"SkillLineID": 1,
|
||||
"SpellID": 2
|
||||
},
|
||||
"Spell": {
|
||||
"Attributes": 5,
|
||||
"AttributesEx": 6,
|
||||
"CastingTimeIndex": 15,
|
||||
"DispelType": 4,
|
||||
"DurationIndex": 40,
|
||||
"EffectBasePoints0": 80,
|
||||
"EffectBasePoints1": 81,
|
||||
"EffectBasePoints2": 82,
|
||||
"ID": 0,
|
||||
"IconID": 117,
|
||||
"ManaCost": 29,
|
||||
"Name": 120,
|
||||
"PowerType": 28,
|
||||
"RangeIndex": 33,
|
||||
"Rank": 129,
|
||||
"SchoolEnum": 1,
|
||||
"Tooltip": 147
|
||||
},
|
||||
"SpellIcon": {
|
||||
"ID": 0,
|
||||
"Path": 1
|
||||
},
|
||||
"SpellItemEnchantment": {
|
||||
"ID": 0,
|
||||
"Name": 8
|
||||
},
|
||||
"SpellRange": {
|
||||
"MaxRange": 2
|
||||
},
|
||||
"SpellVisual": {
|
||||
"CastKit": 2,
|
||||
"ID": 0,
|
||||
"ImpactKit": 3,
|
||||
"MissileModel": 8
|
||||
},
|
||||
"SpellVisualEffectName": {
|
||||
"FilePath": 2,
|
||||
"ID": 0
|
||||
},
|
||||
"SpellVisualKit": {
|
||||
"BaseEffect": 5,
|
||||
"ID": 0,
|
||||
"SpecialEffect0": 11,
|
||||
"SpecialEffect1": 12,
|
||||
"SpecialEffect2": 13
|
||||
},
|
||||
"Talent": {
|
||||
"Column": 3,
|
||||
"ID": 0,
|
||||
"PrereqRank0": 12,
|
||||
"PrereqTalent0": 9,
|
||||
"RankSpell0": 4,
|
||||
"Row": 2,
|
||||
"TabID": 1
|
||||
},
|
||||
"TalentTab": {
|
||||
"BackgroundFile": 15,
|
||||
"ClassMask": 12,
|
||||
"ID": 0,
|
||||
"Name": 1,
|
||||
"OrderIndex": 14
|
||||
},
|
||||
"TaxiNodes": {
|
||||
"ID": 0,
|
||||
"MapID": 1,
|
||||
"Name": 5,
|
||||
"X": 2,
|
||||
"Y": 3,
|
||||
"Z": 4
|
||||
},
|
||||
"TaxiPath": {
|
||||
"Cost": 3,
|
||||
"FromNode": 1,
|
||||
"ID": 0,
|
||||
"ToNode": 2
|
||||
},
|
||||
"TaxiPathNode": {
|
||||
"ID": 0,
|
||||
"MapID": 3,
|
||||
"NodeIndex": 2,
|
||||
"PathID": 1,
|
||||
"X": 4,
|
||||
"Y": 5,
|
||||
"Z": 6
|
||||
},
|
||||
"WorldMapArea": {
|
||||
"ID": 0, "MapID": 1, "AreaID": 2, "AreaName": 3,
|
||||
"LocLeft": 4, "LocRight": 5, "LocTop": 6, "LocBottom": 7,
|
||||
"DisplayMapID": 8, "ParentWorldMapID": 10
|
||||
"AreaID": 2,
|
||||
"AreaName": 3,
|
||||
"DisplayMapID": 8,
|
||||
"ID": 0,
|
||||
"LocBottom": 7,
|
||||
"LocLeft": 4,
|
||||
"LocRight": 5,
|
||||
"LocTop": 6,
|
||||
"MapID": 1,
|
||||
"ParentWorldMapID": 10
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,300 +1,6 @@
|
|||
{
|
||||
"CMSG_PING": "0x1DC",
|
||||
"CMSG_AUTH_SESSION": "0x1ED",
|
||||
"CMSG_CHAR_CREATE": "0x036",
|
||||
"CMSG_CHAR_ENUM": "0x037",
|
||||
"CMSG_CHAR_DELETE": "0x038",
|
||||
"CMSG_PLAYER_LOGIN": "0x03D",
|
||||
"MSG_MOVE_START_FORWARD": "0x0B5",
|
||||
"MSG_MOVE_START_BACKWARD": "0x0B6",
|
||||
"MSG_MOVE_STOP": "0x0B7",
|
||||
"MSG_MOVE_START_STRAFE_LEFT": "0x0B8",
|
||||
"MSG_MOVE_START_STRAFE_RIGHT": "0x0B9",
|
||||
"MSG_MOVE_STOP_STRAFE": "0x0BA",
|
||||
"MSG_MOVE_JUMP": "0x0BB",
|
||||
"MSG_MOVE_START_TURN_LEFT": "0x0BC",
|
||||
"MSG_MOVE_START_TURN_RIGHT": "0x0BD",
|
||||
"MSG_MOVE_STOP_TURN": "0x0BE",
|
||||
"MSG_MOVE_SET_FACING": "0x0DA",
|
||||
"MSG_MOVE_FALL_LAND": "0x0C9",
|
||||
"MSG_MOVE_START_SWIM": "0x0CA",
|
||||
"MSG_MOVE_STOP_SWIM": "0x0CB",
|
||||
"MSG_MOVE_HEARTBEAT": "0x0EE",
|
||||
"SMSG_AUTH_CHALLENGE": "0x1EC",
|
||||
"SMSG_AUTH_RESPONSE": "0x1EE",
|
||||
"SMSG_CHAR_CREATE": "0x03A",
|
||||
"SMSG_CHAR_ENUM": "0x03B",
|
||||
"SMSG_CHAR_DELETE": "0x03C",
|
||||
"SMSG_CHARACTER_LOGIN_FAILED": "0x041",
|
||||
"SMSG_PONG": "0x1DD",
|
||||
"SMSG_LOGIN_VERIFY_WORLD": "0x236",
|
||||
"SMSG_INIT_WORLD_STATES": "0x2C2",
|
||||
"SMSG_LOGIN_SETTIMESPEED": "0x042",
|
||||
"SMSG_TUTORIAL_FLAGS": "0x0FD",
|
||||
"SMSG_INITIALIZE_FACTIONS": "0x122",
|
||||
"SMSG_WARDEN_DATA": "0x2E6",
|
||||
"CMSG_WARDEN_DATA": "0x2E7",
|
||||
"SMSG_NOTIFICATION": "0x1CB",
|
||||
"SMSG_ACCOUNT_DATA_TIMES": "0x209",
|
||||
"SMSG_UPDATE_OBJECT": "0x0A9",
|
||||
"SMSG_COMPRESSED_UPDATE_OBJECT": "0x1F6",
|
||||
"SMSG_PARTYKILLLOG": "0x1F5",
|
||||
"SMSG_MONSTER_MOVE_TRANSPORT": "0x2AE",
|
||||
"SMSG_SPLINE_MOVE_SET_WALK_MODE": "0x30E",
|
||||
"SMSG_SPLINE_MOVE_SET_RUN_MODE": "0x30D",
|
||||
"SMSG_SPLINE_SET_RUN_SPEED": "0x2FE",
|
||||
"SMSG_SPLINE_SET_RUN_BACK_SPEED": "0x2FF",
|
||||
"SMSG_SPLINE_SET_SWIM_SPEED": "0x300",
|
||||
"SMSG_DESTROY_OBJECT": "0x0AA",
|
||||
"CMSG_MESSAGECHAT": "0x095",
|
||||
"SMSG_MESSAGECHAT": "0x096",
|
||||
"CMSG_WHO": "0x062",
|
||||
"SMSG_WHO": "0x063",
|
||||
"CMSG_PLAYED_TIME": "0x1CC",
|
||||
"SMSG_PLAYED_TIME": "0x1CD",
|
||||
"CMSG_QUERY_TIME": "0x1CE",
|
||||
"SMSG_QUERY_TIME_RESPONSE": "0x1CF",
|
||||
"SMSG_FRIEND_STATUS": "0x068",
|
||||
"SMSG_CONTACT_LIST": "0x067",
|
||||
"CMSG_ADD_FRIEND": "0x069",
|
||||
"CMSG_DEL_FRIEND": "0x06A",
|
||||
"CMSG_ADD_IGNORE": "0x06C",
|
||||
"CMSG_DEL_IGNORE": "0x06D",
|
||||
"CMSG_PLAYER_LOGOUT": "0x04A",
|
||||
"CMSG_LOGOUT_REQUEST": "0x04B",
|
||||
"CMSG_LOGOUT_CANCEL": "0x04E",
|
||||
"SMSG_LOGOUT_RESPONSE": "0x04C",
|
||||
"SMSG_LOGOUT_COMPLETE": "0x04D",
|
||||
"CMSG_STANDSTATECHANGE": "0x101",
|
||||
"CMSG_SHOWING_HELM": "0x2B9",
|
||||
"CMSG_SHOWING_CLOAK": "0x2BA",
|
||||
"CMSG_TOGGLE_PVP": "0x253",
|
||||
"CMSG_GUILD_INVITE": "0x082",
|
||||
"CMSG_GUILD_ACCEPT": "0x084",
|
||||
"CMSG_GUILD_DECLINE": "0x085",
|
||||
"CMSG_GUILD_INFO": "0x087",
|
||||
"CMSG_GUILD_ROSTER": "0x089",
|
||||
"CMSG_GUILD_PROMOTE": "0x08B",
|
||||
"CMSG_GUILD_DEMOTE": "0x08C",
|
||||
"CMSG_GUILD_LEAVE": "0x08D",
|
||||
"CMSG_GUILD_MOTD": "0x091",
|
||||
"SMSG_GUILD_INFO": "0x088",
|
||||
"SMSG_GUILD_ROSTER": "0x08A",
|
||||
"CMSG_GUILD_QUERY": "0x054",
|
||||
"SMSG_GUILD_QUERY_RESPONSE": "0x055",
|
||||
"SMSG_GUILD_INVITE": "0x083",
|
||||
"CMSG_GUILD_REMOVE": "0x08E",
|
||||
"SMSG_GUILD_EVENT": "0x092",
|
||||
"SMSG_GUILD_COMMAND_RESULT": "0x093",
|
||||
"MSG_RAID_READY_CHECK": "0x322",
|
||||
"SMSG_ITEM_PUSH_RESULT": "0x166",
|
||||
"CMSG_DUEL_ACCEPTED": "0x16C",
|
||||
"CMSG_DUEL_CANCELLED": "0x16D",
|
||||
"SMSG_DUEL_REQUESTED": "0x167",
|
||||
"CMSG_INITIATE_TRADE": "0x116",
|
||||
"MSG_RANDOM_ROLL": "0x1FB",
|
||||
"CMSG_SET_SELECTION": "0x13D",
|
||||
"CMSG_NAME_QUERY": "0x050",
|
||||
"SMSG_NAME_QUERY_RESPONSE": "0x051",
|
||||
"CMSG_CREATURE_QUERY": "0x060",
|
||||
"SMSG_CREATURE_QUERY_RESPONSE": "0x061",
|
||||
"CMSG_GAMEOBJECT_QUERY": "0x05E",
|
||||
"SMSG_GAMEOBJECT_QUERY_RESPONSE": "0x05F",
|
||||
"CMSG_SET_ACTIVE_MOVER": "0x26A",
|
||||
"CMSG_BINDER_ACTIVATE": "0x1B5",
|
||||
"SMSG_LOG_XPGAIN": "0x1D0",
|
||||
"_NOTE_MONSTER_MOVE": "These look swapped vs vanilla (0x0DD/0x2FB) but may be intentional Turtle WoW changes. Check if NPC movement breaks.",
|
||||
"SMSG_MONSTER_MOVE": "0x2FB",
|
||||
"SMSG_COMPRESSED_MOVES": "0x06B",
|
||||
"CMSG_ATTACKSWING": "0x141",
|
||||
"CMSG_ATTACKSTOP": "0x142",
|
||||
"SMSG_ATTACKSTART": "0x143",
|
||||
"SMSG_ATTACKSTOP": "0x144",
|
||||
"SMSG_ATTACKERSTATEUPDATE": "0x14A",
|
||||
"SMSG_AI_REACTION": "0x13C",
|
||||
"SMSG_SPELLNONMELEEDAMAGELOG": "0x250",
|
||||
"SMSG_PLAY_SPELL_VISUAL": "0x1F3",
|
||||
"SMSG_SPELLHEALLOG": "0x150",
|
||||
"SMSG_SPELLENERGIZELOG": "0x151",
|
||||
"SMSG_PERIODICAURALOG": "0x24E",
|
||||
"SMSG_ENVIRONMENTAL_DAMAGE_LOG": "0x1FC",
|
||||
"CMSG_CAST_SPELL": "0x12E",
|
||||
"CMSG_CANCEL_CAST": "0x12F",
|
||||
"CMSG_CANCEL_AURA": "0x136",
|
||||
"SMSG_CAST_FAILED": "0x130",
|
||||
"SMSG_SPELL_START": "0x131",
|
||||
"SMSG_SPELL_GO": "0x132",
|
||||
"SMSG_SPELL_FAILURE": "0x133",
|
||||
"SMSG_SPELL_COOLDOWN": "0x134",
|
||||
"SMSG_COOLDOWN_EVENT": "0x135",
|
||||
"SMSG_EQUIPMENT_SET_SAVED": "0x137",
|
||||
"SMSG_INITIAL_SPELLS": "0x12A",
|
||||
"SMSG_LEARNED_SPELL": "0x12B",
|
||||
"SMSG_SUPERCEDED_SPELL": "0x12C",
|
||||
"SMSG_REMOVED_SPELL": "0x203",
|
||||
"SMSG_SPELL_DELAYED": "0x1E2",
|
||||
"SMSG_SET_FLAT_SPELL_MODIFIER": "0x266",
|
||||
"SMSG_SET_PCT_SPELL_MODIFIER": "0x267",
|
||||
"CMSG_LEARN_TALENT": "0x251",
|
||||
"MSG_TALENT_WIPE_CONFIRM": "0x2AA",
|
||||
"CMSG_GROUP_INVITE": "0x06E",
|
||||
"SMSG_GROUP_INVITE": "0x06F",
|
||||
"CMSG_GROUP_ACCEPT": "0x072",
|
||||
"CMSG_GROUP_DECLINE": "0x073",
|
||||
"SMSG_GROUP_DECLINE": "0x074",
|
||||
"CMSG_GROUP_UNINVITE_GUID": "0x076",
|
||||
"SMSG_GROUP_UNINVITE": "0x077",
|
||||
"CMSG_GROUP_SET_LEADER": "0x078",
|
||||
"SMSG_GROUP_SET_LEADER": "0x079",
|
||||
"CMSG_GROUP_DISBAND": "0x07B",
|
||||
"SMSG_GROUP_LIST": "0x07D",
|
||||
"SMSG_PARTY_COMMAND_RESULT": "0x07F",
|
||||
"MSG_RAID_TARGET_UPDATE": "0x321",
|
||||
"CMSG_REQUEST_RAID_INFO": "0x2CD",
|
||||
"SMSG_RAID_INSTANCE_INFO": "0x2CC",
|
||||
"CMSG_AUTOSTORE_LOOT_ITEM": "0x108",
|
||||
"CMSG_LOOT": "0x15D",
|
||||
"CMSG_LOOT_MONEY": "0x15E",
|
||||
"CMSG_LOOT_RELEASE": "0x15F",
|
||||
"SMSG_LOOT_RESPONSE": "0x160",
|
||||
"SMSG_LOOT_RELEASE_RESPONSE": "0x161",
|
||||
"SMSG_LOOT_REMOVED": "0x162",
|
||||
"SMSG_LOOT_MONEY_NOTIFY": "0x163",
|
||||
"SMSG_LOOT_CLEAR_MONEY": "0x165",
|
||||
"CMSG_ACTIVATETAXI": "0x1AD",
|
||||
"CMSG_GOSSIP_HELLO": "0x17B",
|
||||
"CMSG_GOSSIP_SELECT_OPTION": "0x17C",
|
||||
"SMSG_GOSSIP_MESSAGE": "0x17D",
|
||||
"SMSG_GOSSIP_COMPLETE": "0x17E",
|
||||
"SMSG_NPC_TEXT_UPDATE": "0x180",
|
||||
"CMSG_GAMEOBJ_USE": "0x0B1",
|
||||
"CMSG_QUESTGIVER_STATUS_QUERY": "0x182",
|
||||
"SMSG_QUESTGIVER_STATUS": "0x183",
|
||||
"CMSG_QUESTGIVER_HELLO": "0x184",
|
||||
"SMSG_QUESTGIVER_QUEST_LIST": "0x185",
|
||||
"CMSG_QUESTGIVER_QUERY_QUEST": "0x186",
|
||||
"SMSG_QUESTGIVER_QUEST_DETAILS": "0x188",
|
||||
"CMSG_QUESTGIVER_ACCEPT_QUEST": "0x189",
|
||||
"CMSG_QUESTGIVER_COMPLETE_QUEST": "0x18A",
|
||||
"SMSG_QUESTGIVER_REQUEST_ITEMS": "0x18B",
|
||||
"CMSG_QUESTGIVER_REQUEST_REWARD": "0x18C",
|
||||
"SMSG_QUESTGIVER_OFFER_REWARD": "0x18D",
|
||||
"CMSG_QUESTGIVER_CHOOSE_REWARD": "0x18E",
|
||||
"SMSG_QUESTGIVER_QUEST_INVALID": "0x18F",
|
||||
"SMSG_QUESTGIVER_QUEST_COMPLETE": "0x191",
|
||||
"CMSG_QUESTLOG_REMOVE_QUEST": "0x194",
|
||||
"SMSG_QUESTUPDATE_ADD_KILL": "0x199",
|
||||
"SMSG_QUESTUPDATE_COMPLETE": "0x198",
|
||||
"SMSG_QUEST_FORCE_REMOVE": "0x21E",
|
||||
"CMSG_QUEST_QUERY": "0x05C",
|
||||
"SMSG_QUEST_QUERY_RESPONSE": "0x05D",
|
||||
"SMSG_QUESTLOG_FULL": "0x195",
|
||||
"CMSG_LIST_INVENTORY": "0x19E",
|
||||
"SMSG_LIST_INVENTORY": "0x19F",
|
||||
"CMSG_SELL_ITEM": "0x1A0",
|
||||
"SMSG_SELL_ITEM": "0x1A1",
|
||||
"CMSG_BUY_ITEM": "0x1A2",
|
||||
"CMSG_BUYBACK_ITEM": "0x1A6",
|
||||
"SMSG_BUY_FAILED": "0x1A5",
|
||||
"CMSG_TRAINER_LIST": "0x1B0",
|
||||
"SMSG_TRAINER_LIST": "0x1B1",
|
||||
"CMSG_TRAINER_BUY_SPELL": "0x1B2",
|
||||
"SMSG_TRAINER_BUY_FAILED": "0x1B4",
|
||||
"CMSG_ITEM_QUERY_SINGLE": "0x056",
|
||||
"SMSG_ITEM_QUERY_SINGLE_RESPONSE": "0x058",
|
||||
"CMSG_USE_ITEM": "0x0AB",
|
||||
"CMSG_AUTOEQUIP_ITEM": "0x10A",
|
||||
"CMSG_SWAP_ITEM": "0x10C",
|
||||
"CMSG_SWAP_INV_ITEM": "0x10D",
|
||||
"SMSG_INVENTORY_CHANGE_FAILURE": "0x112",
|
||||
"CMSG_INSPECT": "0x114",
|
||||
"SMSG_INSPECT_RESULTS_UPDATE": "0x115",
|
||||
"CMSG_REPOP_REQUEST": "0x15A",
|
||||
"SMSG_RESURRECT_REQUEST": "0x15B",
|
||||
"CMSG_RESURRECT_RESPONSE": "0x15C",
|
||||
"CMSG_SPIRIT_HEALER_ACTIVATE": "0x21C",
|
||||
"SMSG_SPIRIT_HEALER_CONFIRM": "0x222",
|
||||
"MSG_MOVE_TELEPORT_ACK": "0x0C7",
|
||||
"SMSG_TRANSFER_PENDING": "0x03F",
|
||||
"SMSG_NEW_WORLD": "0x03E",
|
||||
"MSG_MOVE_WORLDPORT_ACK": "0x0DC",
|
||||
"SMSG_TRANSFER_ABORTED": "0x040",
|
||||
"SMSG_FORCE_RUN_SPEED_CHANGE": "0x0E2",
|
||||
"SMSG_CLIENT_CONTROL_UPDATE": "0x159",
|
||||
"CMSG_FORCE_RUN_SPEED_CHANGE_ACK": "0x0E3",
|
||||
"SMSG_SHOWTAXINODES": "0x1A9",
|
||||
"SMSG_ACTIVATETAXIREPLY": "0x1AE",
|
||||
"SMSG_NEW_TAXI_PATH": "0x1AF",
|
||||
"CMSG_ACTIVATETAXIEXPRESS": "0x312",
|
||||
"CMSG_TAXINODE_STATUS_QUERY": "0x1AA",
|
||||
"SMSG_TAXINODE_STATUS": "0x1AB",
|
||||
"SMSG_TRAINER_BUY_SUCCEEDED": "0x1B3",
|
||||
"SMSG_BINDPOINTUPDATE": "0x155",
|
||||
"SMSG_SET_PROFICIENCY": "0x127",
|
||||
"SMSG_ACTION_BUTTONS": "0x129",
|
||||
"SMSG_LEVELUP_INFO": "0x1D4",
|
||||
"SMSG_PLAY_SOUND": "0x2D2",
|
||||
"CMSG_UPDATE_ACCOUNT_DATA": "0x20B",
|
||||
"CMSG_BATTLEFIELD_LIST": "0x23C",
|
||||
"SMSG_BATTLEFIELD_LIST": "0x23D",
|
||||
"CMSG_BATTLEFIELD_JOIN": "0x23E",
|
||||
"CMSG_BATTLEFIELD_STATUS": "0x2D3",
|
||||
"SMSG_BATTLEFIELD_STATUS": "0x2D4",
|
||||
"CMSG_BATTLEFIELD_PORT": "0x2D5",
|
||||
"CMSG_BATTLEMASTER_HELLO": "0x2D7",
|
||||
"MSG_PVP_LOG_DATA": "0x2E0",
|
||||
"CMSG_LEAVE_BATTLEFIELD": "0x2E1",
|
||||
"SMSG_GROUP_JOINED_BATTLEGROUND": "0x2E8",
|
||||
"MSG_BATTLEGROUND_PLAYER_POSITIONS": "0x2E9",
|
||||
"SMSG_BATTLEGROUND_PLAYER_JOINED": "0x2EC",
|
||||
"SMSG_BATTLEGROUND_PLAYER_LEFT": "0x2ED",
|
||||
"CMSG_BATTLEMASTER_JOIN": "0x2EE",
|
||||
"CMSG_EMOTE": "0x102",
|
||||
"SMSG_EMOTE": "0x103",
|
||||
"CMSG_TEXT_EMOTE": "0x104",
|
||||
"SMSG_TEXT_EMOTE": "0x105",
|
||||
"CMSG_JOIN_CHANNEL": "0x097",
|
||||
"CMSG_LEAVE_CHANNEL": "0x098",
|
||||
"SMSG_CHANNEL_NOTIFY": "0x099",
|
||||
"CMSG_CHANNEL_LIST": "0x09A",
|
||||
"SMSG_CHANNEL_LIST": "0x09B",
|
||||
"SMSG_INSPECT_TALENT": "0x3F4",
|
||||
"SMSG_SHOW_MAILBOX": "0x297",
|
||||
"CMSG_GET_MAIL_LIST": "0x23A",
|
||||
"SMSG_MAIL_LIST_RESULT": "0x23B",
|
||||
"CMSG_SEND_MAIL": "0x238",
|
||||
"SMSG_SEND_MAIL_RESULT": "0x239",
|
||||
"CMSG_MAIL_TAKE_MONEY": "0x245",
|
||||
"CMSG_MAIL_TAKE_ITEM": "0x246",
|
||||
"CMSG_MAIL_DELETE": "0x249",
|
||||
"CMSG_MAIL_MARK_AS_READ": "0x247",
|
||||
"SMSG_RECEIVED_MAIL": "0x285",
|
||||
"MSG_QUERY_NEXT_MAIL_TIME": "0x284",
|
||||
"CMSG_BANKER_ACTIVATE": "0x1B7",
|
||||
"SMSG_SHOW_BANK": "0x1B8",
|
||||
"CMSG_BUY_BANK_SLOT": "0x1B9",
|
||||
"SMSG_BUY_BANK_SLOT_RESULT": "0x1BA",
|
||||
"CMSG_AUTOSTORE_BANK_ITEM": "0x282",
|
||||
"CMSG_AUTOBANK_ITEM": "0x283",
|
||||
"MSG_AUCTION_HELLO": "0x255",
|
||||
"CMSG_AUCTION_SELL_ITEM": "0x256",
|
||||
"CMSG_AUCTION_REMOVE_ITEM": "0x257",
|
||||
"CMSG_AUCTION_LIST_ITEMS": "0x258",
|
||||
"CMSG_AUCTION_LIST_OWNER_ITEMS": "0x259",
|
||||
"CMSG_AUCTION_PLACE_BID": "0x25A",
|
||||
"SMSG_AUCTION_COMMAND_RESULT": "0x25B",
|
||||
"SMSG_AUCTION_LIST_RESULT": "0x25C",
|
||||
"SMSG_AUCTION_OWNER_LIST_RESULT": "0x25D",
|
||||
"SMSG_AUCTION_OWNER_NOTIFICATION": "0x25E",
|
||||
"SMSG_AUCTION_BIDDER_NOTIFICATION": "0x260",
|
||||
"CMSG_AUCTION_LIST_BIDDER_ITEMS": "0x264",
|
||||
"SMSG_AUCTION_BIDDER_LIST_RESULT": "0x265",
|
||||
"MSG_MOVE_TIME_SKIPPED": "0x319",
|
||||
"SMSG_CANCEL_AUTO_REPEAT": "0x29C",
|
||||
"SMSG_WEATHER": "0x2F4",
|
||||
"SMSG_QUESTUPDATE_ADD_ITEM": "0x19A",
|
||||
"CMSG_GUILD_DISBAND": "0x08F",
|
||||
"CMSG_GUILD_LEADER": "0x090",
|
||||
"CMSG_GUILD_SET_PUBLIC_NOTE": "0x234",
|
||||
"CMSG_GUILD_SET_OFFICER_NOTE": "0x235"
|
||||
"_extends": "../classic/opcodes.json",
|
||||
"_remove": [
|
||||
"MSG_SET_DUNGEON_DIFFICULTY"
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,38 +1,49 @@
|
|||
{
|
||||
"CONTAINER_FIELD_NUM_SLOTS": 48,
|
||||
"CONTAINER_FIELD_SLOT_1": 50,
|
||||
"GAMEOBJECT_DISPLAYID": 8,
|
||||
"ITEM_FIELD_DURABILITY": 48,
|
||||
"ITEM_FIELD_MAXDURABILITY": 49,
|
||||
"ITEM_FIELD_STACK_COUNT": 14,
|
||||
"OBJECT_FIELD_ENTRY": 3,
|
||||
"UNIT_FIELD_TARGET_LO": 16,
|
||||
"UNIT_FIELD_TARGET_HI": 17,
|
||||
"UNIT_FIELD_BYTES_0": 36,
|
||||
"UNIT_FIELD_HEALTH": 22,
|
||||
"UNIT_FIELD_POWER1": 23,
|
||||
"UNIT_FIELD_MAXHEALTH": 28,
|
||||
"UNIT_FIELD_MAXPOWER1": 29,
|
||||
"UNIT_FIELD_LEVEL": 34,
|
||||
"UNIT_FIELD_FACTIONTEMPLATE": 35,
|
||||
"UNIT_FIELD_FLAGS": 46,
|
||||
"UNIT_FIELD_DISPLAYID": 131,
|
||||
"UNIT_FIELD_MOUNTDISPLAYID": 133,
|
||||
"UNIT_FIELD_AURAS": 50,
|
||||
"UNIT_NPC_FLAGS": 147,
|
||||
"UNIT_DYNAMIC_FLAGS": 143,
|
||||
"UNIT_FIELD_RESISTANCES": 154,
|
||||
"UNIT_END": 188,
|
||||
"PLAYER_FLAGS": 190,
|
||||
"OBJECT_FIELD_SCALE_X": 4,
|
||||
"PLAYER_BYTES": 191,
|
||||
"PLAYER_BYTES_2": 192,
|
||||
"PLAYER_XP": 716,
|
||||
"PLAYER_NEXT_LEVEL_XP": 717,
|
||||
"PLAYER_END": 1282,
|
||||
"PLAYER_EXPLORED_ZONES_START": 1111,
|
||||
"PLAYER_FIELD_BANKBAG_SLOT_1": 612,
|
||||
"PLAYER_FIELD_BANK_SLOT_1": 564,
|
||||
"PLAYER_FIELD_COINAGE": 1176,
|
||||
"PLAYER_QUEST_LOG_START": 198,
|
||||
"PLAYER_FIELD_INV_SLOT_HEAD": 486,
|
||||
"PLAYER_FIELD_PACK_SLOT_1": 532,
|
||||
"PLAYER_FIELD_BANK_SLOT_1": 564,
|
||||
"PLAYER_FIELD_BANKBAG_SLOT_1": 612,
|
||||
"PLAYER_FLAGS": 190,
|
||||
"PLAYER_NEXT_LEVEL_XP": 717,
|
||||
"PLAYER_QUEST_LOG_START": 198,
|
||||
"PLAYER_REST_STATE_EXPERIENCE": 1175,
|
||||
"PLAYER_SKILL_INFO_START": 718,
|
||||
"PLAYER_EXPLORED_ZONES_START": 1111,
|
||||
"PLAYER_END": 1282,
|
||||
"GAMEOBJECT_DISPLAYID": 8,
|
||||
"ITEM_FIELD_STACK_COUNT": 14,
|
||||
"CONTAINER_FIELD_NUM_SLOTS": 48,
|
||||
"CONTAINER_FIELD_SLOT_1": 50
|
||||
"PLAYER_XP": 716,
|
||||
"UNIT_DYNAMIC_FLAGS": 143,
|
||||
"UNIT_END": 188,
|
||||
"UNIT_FIELD_AURAFLAGS": 98,
|
||||
"UNIT_FIELD_AURAS": 50,
|
||||
"UNIT_FIELD_BYTES_0": 36,
|
||||
"UNIT_FIELD_BYTES_1": 133,
|
||||
"UNIT_FIELD_DISPLAYID": 131,
|
||||
"UNIT_FIELD_FACTIONTEMPLATE": 35,
|
||||
"UNIT_FIELD_FLAGS": 46,
|
||||
"UNIT_FIELD_HEALTH": 22,
|
||||
"UNIT_FIELD_LEVEL": 34,
|
||||
"UNIT_FIELD_MAXHEALTH": 28,
|
||||
"UNIT_FIELD_MAXPOWER1": 29,
|
||||
"UNIT_FIELD_MOUNTDISPLAYID": 133,
|
||||
"UNIT_FIELD_POWER1": 23,
|
||||
"UNIT_FIELD_RESISTANCES": 154,
|
||||
"UNIT_FIELD_STAT0": 138,
|
||||
"UNIT_FIELD_STAT1": 139,
|
||||
"UNIT_FIELD_STAT2": 140,
|
||||
"UNIT_FIELD_STAT3": 141,
|
||||
"UNIT_FIELD_STAT4": 142,
|
||||
"UNIT_FIELD_TARGET_HI": 17,
|
||||
"UNIT_FIELD_TARGET_LO": 16,
|
||||
"UNIT_NPC_FLAGS": 147
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,98 +1,323 @@
|
|||
{
|
||||
"Spell": {
|
||||
"ID": 0, "Attributes": 4, "IconID": 133,
|
||||
"Name": 136, "Tooltip": 139, "Rank": 153
|
||||
"Achievement": {
|
||||
"Description": 21,
|
||||
"ID": 0,
|
||||
"Points": 39,
|
||||
"Title": 4
|
||||
},
|
||||
"ItemDisplayInfo": {
|
||||
"ID": 0, "LeftModel": 1, "LeftModelTexture": 3,
|
||||
"InventoryIcon": 5, "GeosetGroup1": 7, "GeosetGroup3": 9,
|
||||
"TextureArmUpper": 14, "TextureArmLower": 15, "TextureHand": 16,
|
||||
"TextureTorsoUpper": 17, "TextureTorsoLower": 18,
|
||||
"TextureLegUpper": 19, "TextureLegLower": 20, "TextureFoot": 21
|
||||
"AchievementCriteria": {
|
||||
"AchievementID": 1,
|
||||
"Description": 9,
|
||||
"ID": 0,
|
||||
"Quantity": 4
|
||||
},
|
||||
"AreaTable": {
|
||||
"ExploreFlag": 3,
|
||||
"ID": 0,
|
||||
"MapID": 1,
|
||||
"ParentAreaNum": 2
|
||||
},
|
||||
"CharHairGeosets": {
|
||||
"GeosetID": 4,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"Variation": 3
|
||||
},
|
||||
"CharSections": {
|
||||
"RaceID": 1, "SexID": 2, "BaseSection": 3,
|
||||
"VariationIndex": 4, "ColorIndex": 5,
|
||||
"Texture1": 6, "Texture2": 7, "Texture3": 8,
|
||||
"Flags": 9
|
||||
"BaseSection": 3,
|
||||
"ColorIndex": 5,
|
||||
"Flags": 9,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"Texture1": 6,
|
||||
"Texture2": 7,
|
||||
"Texture3": 8,
|
||||
"VariationIndex": 4
|
||||
},
|
||||
"SpellIcon": { "ID": 0, "Path": 1 },
|
||||
"FactionTemplate": {
|
||||
"ID": 0, "Faction": 1, "FactionGroup": 3,
|
||||
"FriendGroup": 4, "EnemyGroup": 5,
|
||||
"Enemy0": 6, "Enemy1": 7, "Enemy2": 8, "Enemy3": 9
|
||||
},
|
||||
"Faction": {
|
||||
"ID": 0, "ReputationRaceMask0": 2, "ReputationRaceMask1": 3,
|
||||
"ReputationRaceMask2": 4, "ReputationRaceMask3": 5,
|
||||
"ReputationBase0": 10, "ReputationBase1": 11,
|
||||
"ReputationBase2": 12, "ReputationBase3": 13
|
||||
},
|
||||
"AreaTable": { "ID": 0, "ExploreFlag": 3 },
|
||||
"CreatureDisplayInfoExtra": {
|
||||
"ID": 0, "RaceID": 1, "SexID": 2, "SkinID": 3, "FaceID": 4,
|
||||
"HairStyleID": 5, "HairColorID": 6, "FacialHairID": 7,
|
||||
"EquipDisplay0": 8, "EquipDisplay1": 9, "EquipDisplay2": 10,
|
||||
"EquipDisplay3": 11, "EquipDisplay4": 12, "EquipDisplay5": 13,
|
||||
"EquipDisplay6": 14, "EquipDisplay7": 15, "EquipDisplay8": 16,
|
||||
"EquipDisplay9": 17, "EquipDisplay10": 18, "BakeName": 20
|
||||
},
|
||||
"CreatureDisplayInfo": {
|
||||
"ID": 0, "ModelID": 1, "ExtraDisplayId": 3,
|
||||
"Skin1": 6, "Skin2": 7, "Skin3": 8
|
||||
},
|
||||
"TaxiNodes": {
|
||||
"ID": 0, "MapID": 1, "X": 2, "Y": 3, "Z": 4, "Name": 5,
|
||||
"MountDisplayIdAllianceFallback": 20, "MountDisplayIdHordeFallback": 21,
|
||||
"MountDisplayIdAlliance": 22, "MountDisplayIdHorde": 23
|
||||
},
|
||||
"TaxiPath": { "ID": 0, "FromNode": 1, "ToNode": 2, "Cost": 3 },
|
||||
"TaxiPathNode": {
|
||||
"ID": 0, "PathID": 1, "NodeIndex": 2, "MapID": 3,
|
||||
"X": 4, "Y": 5, "Z": 6
|
||||
},
|
||||
"TalentTab": {
|
||||
"ID": 0, "Name": 1, "ClassMask": 20,
|
||||
"OrderIndex": 22, "BackgroundFile": 23
|
||||
},
|
||||
"Talent": {
|
||||
"ID": 0, "TabID": 1, "Row": 2, "Column": 3,
|
||||
"RankSpell0": 4, "PrereqTalent0": 9, "PrereqRank0": 12
|
||||
},
|
||||
"SkillLineAbility": { "SkillLineID": 1, "SpellID": 2 },
|
||||
"SkillLine": { "ID": 0, "Category": 1, "Name": 3 },
|
||||
"Map": { "ID": 0, "InternalName": 1 },
|
||||
"CreatureModelData": { "ID": 0, "ModelPath": 2 },
|
||||
"CharHairGeosets": {
|
||||
"RaceID": 1, "SexID": 2, "Variation": 3, "GeosetID": 4
|
||||
"CharTitles": {
|
||||
"ID": 0,
|
||||
"Title": 2,
|
||||
"TitleBit": 36
|
||||
},
|
||||
"CharacterFacialHairStyles": {
|
||||
"RaceID": 0, "SexID": 1, "Variation": 2,
|
||||
"Geoset100": 3, "Geoset300": 4, "Geoset200": 5
|
||||
"Geoset100": 3,
|
||||
"Geoset200": 5,
|
||||
"Geoset300": 4,
|
||||
"RaceID": 0,
|
||||
"SexID": 1,
|
||||
"Variation": 2
|
||||
},
|
||||
"CreatureDisplayInfo": {
|
||||
"ExtraDisplayId": 3,
|
||||
"ID": 0,
|
||||
"ModelID": 1,
|
||||
"Skin1": 6,
|
||||
"Skin2": 7,
|
||||
"Skin3": 8
|
||||
},
|
||||
"CreatureDisplayInfoExtra": {
|
||||
"BakeName": 20,
|
||||
"EquipDisplay0": 8,
|
||||
"EquipDisplay1": 9,
|
||||
"EquipDisplay10": 18,
|
||||
"EquipDisplay2": 10,
|
||||
"EquipDisplay3": 11,
|
||||
"EquipDisplay4": 12,
|
||||
"EquipDisplay5": 13,
|
||||
"EquipDisplay6": 14,
|
||||
"EquipDisplay7": 15,
|
||||
"EquipDisplay8": 16,
|
||||
"EquipDisplay9": 17,
|
||||
"FaceID": 4,
|
||||
"FacialHairID": 7,
|
||||
"HairColorID": 6,
|
||||
"HairStyleID": 5,
|
||||
"ID": 0,
|
||||
"RaceID": 1,
|
||||
"SexID": 2,
|
||||
"SkinID": 3
|
||||
},
|
||||
"CreatureModelData": {
|
||||
"ID": 0,
|
||||
"ModelPath": 2
|
||||
},
|
||||
"Emotes": {
|
||||
"AnimID": 2,
|
||||
"ID": 0
|
||||
},
|
||||
"GameObjectDisplayInfo": { "ID": 0, "ModelName": 1 },
|
||||
"Emotes": { "ID": 0, "AnimID": 2 },
|
||||
"EmotesText": {
|
||||
"ID": 0, "Command": 1, "EmoteRef": 2,
|
||||
"OthersTargetTextID": 3, "SenderTargetTextID": 5,
|
||||
"OthersNoTargetTextID": 7, "SenderNoTargetTextID": 9
|
||||
"Command": 1,
|
||||
"EmoteRef": 2,
|
||||
"ID": 0,
|
||||
"OthersNoTargetTextID": 7,
|
||||
"OthersTargetTextID": 3,
|
||||
"SenderNoTargetTextID": 9,
|
||||
"SenderTargetTextID": 5
|
||||
},
|
||||
"EmotesTextData": {
|
||||
"ID": 0,
|
||||
"Text": 1
|
||||
},
|
||||
"Faction": {
|
||||
"ID": 0,
|
||||
"ReputationBase0": 10,
|
||||
"ReputationBase1": 11,
|
||||
"ReputationBase2": 12,
|
||||
"ReputationBase3": 13,
|
||||
"ReputationRaceMask0": 2,
|
||||
"ReputationRaceMask1": 3,
|
||||
"ReputationRaceMask2": 4,
|
||||
"ReputationRaceMask3": 5
|
||||
},
|
||||
"FactionTemplate": {
|
||||
"Enemy0": 6,
|
||||
"Enemy1": 7,
|
||||
"Enemy2": 8,
|
||||
"Enemy3": 9,
|
||||
"EnemyGroup": 5,
|
||||
"Faction": 1,
|
||||
"FactionGroup": 3,
|
||||
"FriendGroup": 4,
|
||||
"ID": 0
|
||||
},
|
||||
"GameObjectDisplayInfo": {
|
||||
"ID": 0,
|
||||
"ModelName": 1
|
||||
},
|
||||
"ItemDisplayInfo": {
|
||||
"GeosetGroup1": 7,
|
||||
"GeosetGroup3": 9,
|
||||
"ID": 0,
|
||||
"InventoryIcon": 5,
|
||||
"LeftModel": 1,
|
||||
"LeftModelTexture": 3,
|
||||
"TextureArmLower": 15,
|
||||
"TextureArmUpper": 14,
|
||||
"TextureFoot": 21,
|
||||
"TextureHand": 16,
|
||||
"TextureLegLower": 20,
|
||||
"TextureLegUpper": 19,
|
||||
"TextureTorsoLower": 18,
|
||||
"TextureTorsoUpper": 17
|
||||
},
|
||||
"ItemSet": {
|
||||
"ID": 0,
|
||||
"Item0": 18,
|
||||
"Item1": 19,
|
||||
"Item2": 20,
|
||||
"Item3": 21,
|
||||
"Item4": 22,
|
||||
"Item5": 23,
|
||||
"Item6": 24,
|
||||
"Item7": 25,
|
||||
"Item8": 26,
|
||||
"Item9": 27,
|
||||
"Name": 1,
|
||||
"Spell0": 28,
|
||||
"Spell1": 29,
|
||||
"Spell2": 30,
|
||||
"Spell3": 31,
|
||||
"Spell4": 32,
|
||||
"Spell5": 33,
|
||||
"Spell6": 34,
|
||||
"Spell7": 35,
|
||||
"Spell8": 36,
|
||||
"Spell9": 37,
|
||||
"Threshold0": 38,
|
||||
"Threshold1": 39,
|
||||
"Threshold2": 40,
|
||||
"Threshold3": 41,
|
||||
"Threshold4": 42,
|
||||
"Threshold5": 43,
|
||||
"Threshold6": 44,
|
||||
"Threshold7": 45,
|
||||
"Threshold8": 46,
|
||||
"Threshold9": 47
|
||||
},
|
||||
"LFGDungeons": {
|
||||
"ID": 0,
|
||||
"Name": 1
|
||||
},
|
||||
"EmotesTextData": { "ID": 0, "Text": 1 },
|
||||
"Light": {
|
||||
"ID": 0, "MapID": 1, "X": 2, "Z": 3, "Y": 4,
|
||||
"InnerRadius": 5, "OuterRadius": 6, "LightParamsID": 7,
|
||||
"LightParamsIDRain": 8, "LightParamsIDUnderwater": 9
|
||||
},
|
||||
"LightParams": { "LightParamsID": 0 },
|
||||
"LightIntBand": {
|
||||
"BlockIndex": 1, "NumKeyframes": 2, "TimeKey0": 3, "Value0": 19
|
||||
"ID": 0,
|
||||
"InnerRadius": 5,
|
||||
"LightParamsID": 7,
|
||||
"LightParamsIDRain": 8,
|
||||
"LightParamsIDUnderwater": 9,
|
||||
"MapID": 1,
|
||||
"OuterRadius": 6,
|
||||
"X": 2,
|
||||
"Y": 4,
|
||||
"Z": 3
|
||||
},
|
||||
"LightFloatBand": {
|
||||
"BlockIndex": 1, "NumKeyframes": 2, "TimeKey0": 3, "Value0": 19
|
||||
"BlockIndex": 1,
|
||||
"NumKeyframes": 2,
|
||||
"TimeKey0": 3,
|
||||
"Value0": 19
|
||||
},
|
||||
"LightIntBand": {
|
||||
"BlockIndex": 1,
|
||||
"NumKeyframes": 2,
|
||||
"TimeKey0": 3,
|
||||
"Value0": 19
|
||||
},
|
||||
"LightParams": {
|
||||
"LightParamsID": 0
|
||||
},
|
||||
"Map": {
|
||||
"ID": 0,
|
||||
"InternalName": 1
|
||||
},
|
||||
"SkillLine": {
|
||||
"Category": 1,
|
||||
"ID": 0,
|
||||
"Name": 3
|
||||
},
|
||||
"SkillLineAbility": {
|
||||
"SkillLineID": 1,
|
||||
"SpellID": 2
|
||||
},
|
||||
"Spell": {
|
||||
"Attributes": 4,
|
||||
"AttributesEx": 5,
|
||||
"CastingTimeIndex": 47,
|
||||
"DispelType": 2,
|
||||
"DurationIndex": 40,
|
||||
"EffectBasePoints0": 80,
|
||||
"EffectBasePoints1": 81,
|
||||
"EffectBasePoints2": 82,
|
||||
"ID": 0,
|
||||
"IconID": 133,
|
||||
"ManaCost": 39,
|
||||
"Name": 136,
|
||||
"PowerType": 14,
|
||||
"RangeIndex": 49,
|
||||
"Rank": 153,
|
||||
"SchoolMask": 225,
|
||||
"Tooltip": 139
|
||||
},
|
||||
"SpellIcon": {
|
||||
"ID": 0,
|
||||
"Path": 1
|
||||
},
|
||||
"SpellItemEnchantment": {
|
||||
"ID": 0,
|
||||
"Name": 8
|
||||
},
|
||||
"SpellRange": {
|
||||
"MaxRange": 4
|
||||
},
|
||||
"SpellVisual": {
|
||||
"CastKit": 2,
|
||||
"ID": 0,
|
||||
"ImpactKit": 3,
|
||||
"MissileModel": 8
|
||||
},
|
||||
"SpellVisualEffectName": {
|
||||
"FilePath": 2,
|
||||
"ID": 0
|
||||
},
|
||||
"SpellVisualKit": {
|
||||
"BaseEffect": 5,
|
||||
"ID": 0,
|
||||
"SpecialEffect0": 11,
|
||||
"SpecialEffect1": 12,
|
||||
"SpecialEffect2": 13
|
||||
},
|
||||
"Talent": {
|
||||
"Column": 3,
|
||||
"ID": 0,
|
||||
"PrereqRank0": 12,
|
||||
"PrereqTalent0": 9,
|
||||
"RankSpell0": 4,
|
||||
"Row": 2,
|
||||
"TabID": 1
|
||||
},
|
||||
"TalentTab": {
|
||||
"BackgroundFile": 23,
|
||||
"ClassMask": 20,
|
||||
"ID": 0,
|
||||
"Name": 1,
|
||||
"OrderIndex": 22
|
||||
},
|
||||
"TaxiNodes": {
|
||||
"ID": 0,
|
||||
"MapID": 1,
|
||||
"MountDisplayIdAlliance": 22,
|
||||
"MountDisplayIdAllianceFallback": 20,
|
||||
"MountDisplayIdHorde": 23,
|
||||
"MountDisplayIdHordeFallback": 21,
|
||||
"Name": 5,
|
||||
"X": 2,
|
||||
"Y": 3,
|
||||
"Z": 4
|
||||
},
|
||||
"TaxiPath": {
|
||||
"Cost": 3,
|
||||
"FromNode": 1,
|
||||
"ID": 0,
|
||||
"ToNode": 2
|
||||
},
|
||||
"TaxiPathNode": {
|
||||
"ID": 0,
|
||||
"MapID": 3,
|
||||
"NodeIndex": 2,
|
||||
"PathID": 1,
|
||||
"X": 4,
|
||||
"Y": 5,
|
||||
"Z": 6
|
||||
},
|
||||
"WorldMapArea": {
|
||||
"ID": 0, "MapID": 1, "AreaID": 2, "AreaName": 3,
|
||||
"LocLeft": 4, "LocRight": 5, "LocTop": 6, "LocBottom": 7,
|
||||
"DisplayMapID": 8, "ParentWorldMapID": 10
|
||||
"AreaID": 2,
|
||||
"AreaName": 3,
|
||||
"DisplayMapID": 8,
|
||||
"ID": 0,
|
||||
"LocBottom": 7,
|
||||
"LocLeft": 4,
|
||||
"LocRight": 5,
|
||||
"LocTop": 6,
|
||||
"MapID": 1,
|
||||
"ParentWorldMapID": 10
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,61 @@
|
|||
{
|
||||
"CONTAINER_FIELD_NUM_SLOTS": 64,
|
||||
"CONTAINER_FIELD_SLOT_1": 66,
|
||||
"GAMEOBJECT_DISPLAYID": 8,
|
||||
"ITEM_FIELD_DURABILITY": 60,
|
||||
"ITEM_FIELD_MAXDURABILITY": 61,
|
||||
"ITEM_FIELD_STACK_COUNT": 14,
|
||||
"OBJECT_FIELD_ENTRY": 3,
|
||||
"UNIT_FIELD_TARGET_LO": 6,
|
||||
"UNIT_FIELD_TARGET_HI": 7,
|
||||
"OBJECT_FIELD_SCALE_X": 4,
|
||||
"PLAYER_BLOCK_PERCENTAGE": 1024,
|
||||
"PLAYER_BYTES": 153,
|
||||
"PLAYER_BYTES_2": 154,
|
||||
"PLAYER_CHOSEN_TITLE": 1349,
|
||||
"PLAYER_CRIT_PERCENTAGE": 1029,
|
||||
"PLAYER_DODGE_PERCENTAGE": 1025,
|
||||
"PLAYER_EXPLORED_ZONES_START": 1041,
|
||||
"PLAYER_FIELD_ARENA_CURRENCY": 1423,
|
||||
"PLAYER_FIELD_BANKBAG_SLOT_1": 458,
|
||||
"PLAYER_FIELD_BANK_SLOT_1": 402,
|
||||
"PLAYER_FIELD_COINAGE": 1170,
|
||||
"PLAYER_FIELD_COMBAT_RATING_1": 1231,
|
||||
"PLAYER_FIELD_HONOR_CURRENCY": 1422,
|
||||
"PLAYER_FIELD_INV_SLOT_HEAD": 324,
|
||||
"PLAYER_FIELD_MOD_DAMAGE_DONE_POS": 1171,
|
||||
"PLAYER_FIELD_MOD_HEALING_DONE_POS": 1192,
|
||||
"PLAYER_FIELD_PACK_SLOT_1": 370,
|
||||
"PLAYER_FLAGS": 150,
|
||||
"PLAYER_NEXT_LEVEL_XP": 635,
|
||||
"PLAYER_PARRY_PERCENTAGE": 1026,
|
||||
"PLAYER_QUEST_LOG_START": 158,
|
||||
"PLAYER_RANGED_CRIT_PERCENTAGE": 1030,
|
||||
"PLAYER_REST_STATE_EXPERIENCE": 1169,
|
||||
"PLAYER_SKILL_INFO_START": 636,
|
||||
"PLAYER_SPELL_CRIT_PERCENTAGE1": 1032,
|
||||
"PLAYER_XP": 634,
|
||||
"UNIT_DYNAMIC_FLAGS": 147,
|
||||
"UNIT_END": 148,
|
||||
"UNIT_FIELD_ATTACK_POWER": 123,
|
||||
"UNIT_FIELD_BYTES_0": 23,
|
||||
"UNIT_FIELD_HEALTH": 24,
|
||||
"UNIT_FIELD_POWER1": 25,
|
||||
"UNIT_FIELD_MAXHEALTH": 32,
|
||||
"UNIT_FIELD_MAXPOWER1": 33,
|
||||
"UNIT_FIELD_LEVEL": 54,
|
||||
"UNIT_FIELD_BYTES_1": 137,
|
||||
"UNIT_FIELD_DISPLAYID": 67,
|
||||
"UNIT_FIELD_FACTIONTEMPLATE": 55,
|
||||
"UNIT_FIELD_FLAGS": 59,
|
||||
"UNIT_FIELD_FLAGS_2": 60,
|
||||
"UNIT_FIELD_DISPLAYID": 67,
|
||||
"UNIT_FIELD_HEALTH": 24,
|
||||
"UNIT_FIELD_LEVEL": 54,
|
||||
"UNIT_FIELD_MAXHEALTH": 32,
|
||||
"UNIT_FIELD_MAXPOWER1": 33,
|
||||
"UNIT_FIELD_MOUNTDISPLAYID": 69,
|
||||
"UNIT_NPC_FLAGS": 82,
|
||||
"UNIT_DYNAMIC_FLAGS": 147,
|
||||
"UNIT_FIELD_POWER1": 25,
|
||||
"UNIT_FIELD_RANGED_ATTACK_POWER": 126,
|
||||
"UNIT_FIELD_RESISTANCES": 99,
|
||||
"UNIT_END": 148,
|
||||
"PLAYER_FLAGS": 150,
|
||||
"PLAYER_BYTES": 153,
|
||||
"PLAYER_BYTES_2": 154,
|
||||
"PLAYER_XP": 634,
|
||||
"PLAYER_NEXT_LEVEL_XP": 635,
|
||||
"PLAYER_FIELD_COINAGE": 1170,
|
||||
"PLAYER_QUEST_LOG_START": 158,
|
||||
"PLAYER_FIELD_INV_SLOT_HEAD": 324,
|
||||
"PLAYER_FIELD_PACK_SLOT_1": 370,
|
||||
"PLAYER_FIELD_BANK_SLOT_1": 402,
|
||||
"PLAYER_FIELD_BANKBAG_SLOT_1": 458,
|
||||
"PLAYER_SKILL_INFO_START": 636,
|
||||
"PLAYER_EXPLORED_ZONES_START": 1041,
|
||||
"GAMEOBJECT_DISPLAYID": 8,
|
||||
"ITEM_FIELD_STACK_COUNT": 14,
|
||||
"CONTAINER_FIELD_NUM_SLOTS": 64,
|
||||
"CONTAINER_FIELD_SLOT_1": 66
|
||||
"UNIT_FIELD_STAT0": 84,
|
||||
"UNIT_FIELD_STAT1": 85,
|
||||
"UNIT_FIELD_STAT2": 86,
|
||||
"UNIT_FIELD_STAT3": 87,
|
||||
"UNIT_FIELD_STAT4": 88,
|
||||
"UNIT_FIELD_TARGET_HI": 7,
|
||||
"UNIT_FIELD_TARGET_LO": 6,
|
||||
"UNIT_NPC_FLAGS": 82
|
||||
}
|
||||
|
|
|
|||
36
Data/interface/AddOns/HelloWorld/HelloWorld.lua
Normal file
36
Data/interface/AddOns/HelloWorld/HelloWorld.lua
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
-- HelloWorld addon — demonstrates the WoWee addon system
|
||||
|
||||
-- Initialize saved variables (persisted across sessions)
|
||||
if not HelloWorldDB then
|
||||
HelloWorldDB = { loginCount = 0 }
|
||||
end
|
||||
HelloWorldDB.loginCount = (HelloWorldDB.loginCount or 0) + 1
|
||||
|
||||
-- Create a frame and register for events (standard WoW addon pattern)
|
||||
local f = CreateFrame("Frame", "HelloWorldFrame")
|
||||
f:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||
f:RegisterEvent("CHAT_MSG_SAY")
|
||||
|
||||
f:SetScript("OnEvent", function(self, event, ...)
|
||||
if event == "PLAYER_ENTERING_WORLD" then
|
||||
local name = UnitName("player")
|
||||
local level = UnitLevel("player")
|
||||
print("|cff00ff00[HelloWorld]|r Welcome, " .. name .. "! (Level " .. level .. ")")
|
||||
print("|cff00ff00[HelloWorld]|r Login count: " .. HelloWorldDB.loginCount)
|
||||
elseif event == "CHAT_MSG_SAY" then
|
||||
local msg, sender = ...
|
||||
if msg and sender then
|
||||
print("|cff00ff00[HelloWorld]|r " .. sender .. " said: " .. msg)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- Register a custom slash command
|
||||
SLASH_HELLOWORLD1 = "/hello"
|
||||
SLASH_HELLOWORLD2 = "/hw"
|
||||
SlashCmdList["HELLOWORLD"] = function(args)
|
||||
print("|cff00ff00[HelloWorld]|r Hello! " .. (args ~= "" and args or "Type /hello <message>"))
|
||||
print("|cff00ff00[HelloWorld]|r Sessions: " .. HelloWorldDB.loginCount)
|
||||
end
|
||||
|
||||
print("|cff00ff00[HelloWorld]|r Addon loaded. Type /hello to test.")
|
||||
5
Data/interface/AddOns/HelloWorld/HelloWorld.toc
Normal file
5
Data/interface/AddOns/HelloWorld/HelloWorld.toc
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
## Interface: 30300
|
||||
## Title: Hello World
|
||||
## Notes: Test addon for the WoWee addon system
|
||||
## SavedVariables: HelloWorldDB
|
||||
HelloWorld.lua
|
||||
|
|
@ -41,7 +41,6 @@
|
|||
"SMSG_SPLINE_MOVE_SET_RUN_BACK_SPEED": "SMSG_SPLINE_SET_RUN_BACK_SPEED",
|
||||
"SMSG_SPLINE_MOVE_SET_RUN_SPEED": "SMSG_SPLINE_SET_RUN_SPEED",
|
||||
"SMSG_SPLINE_MOVE_SET_SWIM_SPEED": "SMSG_SPLINE_SET_SWIM_SPEED",
|
||||
"SMSG_UPDATE_AURA_DURATION": "SMSG_EQUIPMENT_SET_SAVED",
|
||||
"SMSG_VICTIMSTATEUPDATE_OBSOLETE": "SMSG_BATTLEFIELD_PORT_DENIED"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
126
EXPANSION_GUIDE.md
Normal file
126
EXPANSION_GUIDE.md
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
# Multi-Expansion Architecture Guide
|
||||
|
||||
WoWee supports three World of Warcraft expansions in a unified codebase using an expansion profile system. This guide explains how the multi-expansion support works.
|
||||
|
||||
## Supported Expansions
|
||||
|
||||
- **Vanilla (Classic) 1.12** - Original World of Warcraft
|
||||
- **The Burning Crusade (TBC) 2.4.3** - First expansion
|
||||
- **Wrath of the Lich King (WotLK) 3.3.5a** - Second expansion
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
The multi-expansion support is built on the **Expansion Profile** system:
|
||||
|
||||
1. **ExpansionProfile** (`include/game/expansion_profile.hpp`) - Metadata about each expansion
|
||||
- Defines protocol version, data paths, asset locations
|
||||
- Specifies which packet parsers to use
|
||||
|
||||
2. **Packet Parsers** - Expansion-specific message handling
|
||||
- `packet_parsers_classic.cpp` - Vanilla 1.12 message parsing
|
||||
- `packet_parsers_tbc.cpp` - TBC 2.4.3 message parsing
|
||||
- `packet_parsers_wotlk.cpp` (default) - WotLK 3.3.5a message parsing
|
||||
|
||||
3. **Update Fields** - Expansion-specific entity data layout
|
||||
- Loaded from `update_fields.json` in expansion data directory
|
||||
- Defines UNIT_END, OBJECT_END, field indices for stats/health/mana
|
||||
|
||||
## How to Use Different Expansions
|
||||
|
||||
### At Startup
|
||||
|
||||
WoWee auto-detects the expansion based on:
|
||||
1. Realm list response (protocol version)
|
||||
2. Server build number
|
||||
3. Update field count
|
||||
|
||||
### Manual Selection
|
||||
|
||||
Set environment variable:
|
||||
```bash
|
||||
WOWEE_EXPANSION=tbc ./wowee # Force TBC
|
||||
WOWEE_EXPANSION=classic ./wowee # Force Classic
|
||||
```
|
||||
|
||||
## Key Differences Between Expansions
|
||||
|
||||
### Packet Format Differences
|
||||
|
||||
#### SMSG_SPELL_COOLDOWN
|
||||
- **Classic**: 12 bytes per entry (spellId + itemId + cooldown, no flags)
|
||||
- **TBC/WotLK**: 8 bytes per entry (spellId + cooldown) + flags byte
|
||||
|
||||
#### SMSG_ACTION_BUTTONS
|
||||
- **Classic**: 120 slots, no mode byte
|
||||
- **TBC**: 132 slots, no mode byte
|
||||
- **WotLK**: 144 slots + uint8 mode byte
|
||||
|
||||
#### SMSG_PARTY_MEMBER_STATS
|
||||
- **Classic/TBC**: Full uint64 for guid, uint16 health
|
||||
- **WotLK**: PackedGuid format, uint32 health
|
||||
|
||||
### Data Differences
|
||||
|
||||
- **Talent trees**: Different spell IDs and tree structure per expansion
|
||||
- **Items**: Different ItemDisplayInfo entries
|
||||
- **Spells**: Different base stats, cooldowns
|
||||
- **Character textures**: Expansion-specific variants for races
|
||||
|
||||
## Adding Support for Another Expansion
|
||||
|
||||
1. Create new expansion profile entry in `expansion_profile.cpp`
|
||||
2. Add packet parser file (`packet_parsers_*.cpp`) for message variants
|
||||
3. Create update_fields.json with correct field layout
|
||||
4. Test realm connection and character loading
|
||||
|
||||
## Code Patterns
|
||||
|
||||
### Checking Current Expansion
|
||||
|
||||
```cpp
|
||||
#include "game/expansion_profile.hpp"
|
||||
|
||||
// Global helper
|
||||
bool isClassicLikeExpansion() {
|
||||
auto profile = ExpansionProfile::getActive();
|
||||
return profile && (profile->name == "Classic" || profile->name == "Vanilla");
|
||||
}
|
||||
|
||||
// Specific check
|
||||
if (GameHandler::getInstance().isActiveExpansion("tbc")) {
|
||||
// TBC-specific code
|
||||
}
|
||||
```
|
||||
|
||||
### Expansion-Specific Packet Parsing
|
||||
|
||||
```cpp
|
||||
// In packet_parsers_*.cpp, implement expansion-specific logic
|
||||
bool parseXxxPacket(BitStream& data, ...) {
|
||||
// Custom logic for this expansion's packet format
|
||||
}
|
||||
```
|
||||
|
||||
## Common Issues
|
||||
|
||||
### "Update fields mismatch" Error
|
||||
- Ensure `update_fields.json` matches server's field layout
|
||||
- Check OBJECT_END and UNIT_END values
|
||||
- Verify field indices for your target expansion
|
||||
|
||||
### "Unknown packet" Warnings
|
||||
- Expansion-specific opcodes may not be registered
|
||||
- Check packet parser registration in `game_handler.cpp`
|
||||
- Verify expansion profile is active
|
||||
|
||||
### Packet Parsing Failures
|
||||
- Each expansion has different struct layouts
|
||||
- Always read data size first, then upfront validate
|
||||
- Use size capping (e.g., max 100 items in list)
|
||||
|
||||
## References
|
||||
|
||||
- `include/game/expansion_profile.hpp` - Expansion metadata
|
||||
- `docs/status.md` - Current feature support by expansion
|
||||
- `src/game/packet_parsers_*.cpp` - Format-specific parsing logic
|
||||
- `docs/` directory - Additional protocol documentation
|
||||
218
GETTING_STARTED.md
Normal file
218
GETTING_STARTED.md
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
# Getting Started with WoWee
|
||||
|
||||
WoWee is a native C++ World of Warcraft client that connects to private servers. This guide walks you through setting up and playing WoWee.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- **World of Warcraft Game Data** (Vanilla 1.12, TBC 2.4.3, or WotLK 3.3.5a)
|
||||
- **A Private Server** (AzerothCore, TrinityCore, Mangos, or Turtle WoW compatible)
|
||||
- **System Requirements**: Linux, macOS, or Windows with a Vulkan-capable GPU
|
||||
|
||||
## Installation
|
||||
|
||||
### Step 1: Build WoWee
|
||||
|
||||
See [Building](README.md#building) section in README for detailed build instructions.
|
||||
|
||||
**Quick start (Linux/macOS)**:
|
||||
```bash
|
||||
./build.sh
|
||||
cd build/bin
|
||||
./wowee
|
||||
```
|
||||
|
||||
**Quick start (Windows)**:
|
||||
```powershell
|
||||
.\build.ps1
|
||||
cd build\bin
|
||||
.\wowee.exe
|
||||
```
|
||||
|
||||
### Step 2: Extract Game Data
|
||||
|
||||
WoWee needs game assets from your WoW installation:
|
||||
|
||||
**Using provided script (Linux/macOS)**:
|
||||
```bash
|
||||
./extract_assets.sh /path/to/wow/directory
|
||||
```
|
||||
|
||||
**Using provided script (Windows)**:
|
||||
```powershell
|
||||
.\extract_assets.ps1 -WowDirectory "C:\Program Files\World of Warcraft"
|
||||
```
|
||||
|
||||
**Manual extraction**:
|
||||
1. Install [StormLib](https://github.com/ladislav-zezula/StormLib)
|
||||
2. Extract to `./Data/`:
|
||||
```
|
||||
Data/
|
||||
├── dbc/ # DBC files
|
||||
├── map/ # World map data
|
||||
├── adt/ # Terrain chunks
|
||||
├── wmo/ # Building models
|
||||
├── m2/ # Character/creature models
|
||||
└── blp/ # Textures
|
||||
```
|
||||
|
||||
### Step 3: Connect to a Server
|
||||
|
||||
1. **Start WoWee**
|
||||
```bash
|
||||
cd build/bin && ./wowee
|
||||
```
|
||||
|
||||
2. **Enter Realm Information**
|
||||
- Server Address: e.g., `localhost:3724` or `play.example.com:3724`
|
||||
- WoWee fetches the realm list automatically
|
||||
- Select your realm and click **Connect**
|
||||
|
||||
3. **Choose Character**
|
||||
- Select existing character or create new one
|
||||
- Customize appearance and settings
|
||||
- Click **Enter World**
|
||||
|
||||
## First Steps in Game
|
||||
|
||||
### Default Controls
|
||||
|
||||
| Action | Key |
|
||||
|--------|-----|
|
||||
| Move Forward | W |
|
||||
| Move Backward | S |
|
||||
| Strafe Left | A |
|
||||
| Strafe Right | D |
|
||||
| Jump | Space |
|
||||
| Toggle Chat | Enter |
|
||||
| Interact (talk to NPC, loot) | F |
|
||||
| Open Inventory | B |
|
||||
| Open Spellbook | P |
|
||||
| Open Talent Tree | T |
|
||||
| Open Quest Log | Q |
|
||||
| Open World Map | W (when not typing) |
|
||||
| Toggle Minimap | M |
|
||||
| Toggle Nameplates | V |
|
||||
| Toggle Party Frames | F |
|
||||
| Toggle Settings | Escape |
|
||||
| Target Next Enemy | Tab |
|
||||
| Target Previous Enemy | Shift+Tab |
|
||||
|
||||
### Customizing Controls
|
||||
|
||||
Press **Escape** → **Keybindings** to customize hotkeys.
|
||||
|
||||
## Recommended First Steps
|
||||
|
||||
### 1. Adjust Graphics Settings
|
||||
- Press Escape → **Video Settings**
|
||||
- Select appropriate **Graphics Preset** for your GPU:
|
||||
- **LOW**: Low-end GPUs or when performance is priority
|
||||
- **MEDIUM**: Balanced quality and performance
|
||||
- **HIGH**: Good GPU with modern drivers
|
||||
- **ULTRA**: High-end GPU for maximum quality
|
||||
|
||||
### 2. Adjust Audio
|
||||
- Press Escape → **Audio Settings**
|
||||
- Set **Master Volume** to preferred level
|
||||
- Adjust individual audio tracks (Music, Ambient, UI, etc.)
|
||||
- Toggle **Original Soundtrack** if available
|
||||
|
||||
### 3. Configure UI
|
||||
- Press Escape → **Game Settings**
|
||||
- Minimap preferences (rotation, square mode, zoom)
|
||||
- Bag settings (separate windows, compact mode)
|
||||
- Action bar visibility
|
||||
|
||||
### 4. Complete First Quest
|
||||
- Talk to nearby NPCs (they have quest markers ! or ?)
|
||||
- Accept quest, complete objectives, return for reward
|
||||
- Level up and gain experience
|
||||
|
||||
## Important Notes
|
||||
|
||||
### Data Directory
|
||||
Game data is loaded from `Data/` subdirectory:
|
||||
- If running from build folder: `../../Data` (symlinked automatically)
|
||||
- If running from binary folder: `./Data` (must exist)
|
||||
- If running in-place: Ensure `Data/` is in correct location
|
||||
|
||||
### Settings
|
||||
- Settings are saved to `~/.wowee/settings.cfg` (Linux/macOS)
|
||||
- Or `%APPDATA%\wowee\settings.cfg` (Windows)
|
||||
- Keybindings, graphics settings, and UI state persist
|
||||
|
||||
### Multi-Expansion Support
|
||||
WoWee auto-detects expansion from server:
|
||||
- **Vanilla 1.12** - Original game
|
||||
- **TBC 2.4.3** - Burning Crusade
|
||||
- **WotLK 3.3.5a** - Wrath of the Lich King
|
||||
|
||||
You can override with environment variable:
|
||||
```bash
|
||||
WOWEE_EXPANSION=tbc ./wowee # Force TBC
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "No realm list" or "Connection Failed"
|
||||
- Check server address is correct
|
||||
- Verify server is running
|
||||
- See [Troubleshooting Guide](TROUBLESHOOTING.md#connection-issues)
|
||||
|
||||
### Graphics Errors
|
||||
- See [Graphics Troubleshooting](TROUBLESHOOTING.md#graphics-issues)
|
||||
- Start with LOW graphics preset
|
||||
- Update GPU driver
|
||||
|
||||
### Audio Not Working
|
||||
- Check system audio is enabled
|
||||
- Verify audio files are extracted
|
||||
- See [Audio Troubleshooting](TROUBLESHOOTING.md#audio-issues)
|
||||
|
||||
### General Issues
|
||||
- Comprehensive troubleshooting: See [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
|
||||
- Check logs in `~/.wowee/logs/` for errors
|
||||
- Verify expansion matches server requirements
|
||||
|
||||
## Server Configuration
|
||||
|
||||
### Tested Servers
|
||||
- **AzerothCore** - Full support, recommended for learning
|
||||
- **TrinityCore** - Full support, extensive customization
|
||||
- **Mangos** - Full support, solid foundation
|
||||
- **Turtle WoW** - Full support, 1.17 custom content
|
||||
|
||||
### Server Requirements
|
||||
- Must support Vanilla, TBC, or WotLK protocol
|
||||
- Warden anti-cheat supported (module execution via emulation)
|
||||
- Network must allow connections to realm list and world server ports
|
||||
|
||||
See [Multi-Expansion Guide](EXPANSION_GUIDE.md) for protocol details.
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **Explore the World** - Travel to different zones and enjoy the landscape
|
||||
2. **Join a Guild** - Find other players to group with
|
||||
3. **Run Dungeons** - Experience instanced content
|
||||
4. **PvP** - Engage in player-versus-player combat
|
||||
5. **Twink Alt** - Create additional characters
|
||||
6. **Customize Settings** - Fine-tune graphics, audio, and UI
|
||||
|
||||
## Getting Help
|
||||
|
||||
- **Game Issues**: See [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
|
||||
- **Graphics Help**: See [Graphics & Performance](README.md#graphics--performance) section
|
||||
- **Multi-Expansion**: See [EXPANSION_GUIDE.md](EXPANSION_GUIDE.md)
|
||||
- **Building Issues**: See [README.md](README.md#building)
|
||||
|
||||
## Tips for Better Performance
|
||||
|
||||
- Start with reasonable graphics preset for your GPU
|
||||
- Close other applications when testing
|
||||
- Keep GPU drivers updated
|
||||
- Use FSR2 (if supported) for smooth 60+ FPS on weaker hardware
|
||||
- Monitor frame rate with debug overlay (if available)
|
||||
|
||||
## Enjoy!
|
||||
|
||||
WoWee is a project to experience classic World of Warcraft on a modern engine. Have fun exploring Azeroth!
|
||||
107
PKGBUILD
Normal file
107
PKGBUILD
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
# Maintainer: <your name> <your@email>
|
||||
# Contributor: <your name> <your@email>
|
||||
|
||||
pkgname=wowee-git
|
||||
pkgver=r.1
|
||||
pkgrel=1
|
||||
pkgdesc="Open-source World of Warcraft client with Vulkan renderer (WotLK 3.3.5a / TBC / Classic)"
|
||||
arch=('x86_64')
|
||||
url="https://github.com/Kelsidavis/WoWee"
|
||||
license=('MIT')
|
||||
depends=(
|
||||
'sdl2'
|
||||
'vulkan-icd-loader'
|
||||
'openssl'
|
||||
'zlib'
|
||||
'ffmpeg'
|
||||
'unicorn'
|
||||
'glew'
|
||||
'libx11'
|
||||
'stormlib' # AUR — required at runtime by wowee-extract-assets (libstorm.so)
|
||||
)
|
||||
makedepends=(
|
||||
'git'
|
||||
'cmake'
|
||||
'pkgconf'
|
||||
'glm'
|
||||
'vulkan-headers'
|
||||
'shaderc'
|
||||
'python'
|
||||
)
|
||||
provides=('wowee')
|
||||
conflicts=('wowee')
|
||||
source=("${pkgname}::git+https://github.com/Kelsidavis/WoWee.git#branch=main"
|
||||
"git+https://github.com/ocornut/imgui.git"
|
||||
"git+https://github.com/charles-lunarg/vk-bootstrap.git")
|
||||
sha256sums=('SKIP' 'SKIP' 'SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "${pkgname}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${pkgname}"
|
||||
git submodule init
|
||||
git config submodule.extern/imgui.url "${srcdir}/imgui"
|
||||
git config submodule.extern/vk-bootstrap.url "${srcdir}/vk-bootstrap"
|
||||
git -c protocol.file.allow=always submodule update
|
||||
}
|
||||
|
||||
build() {
|
||||
cmake -S "${pkgname}" -B build \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
||||
-Wno-dev
|
||||
cmake --build build --parallel "$(nproc)"
|
||||
}
|
||||
|
||||
package() {
|
||||
DESTDIR="${pkgdir}" cmake --install build
|
||||
|
||||
# Relocate real binaries from /usr/bin → /usr/lib/wowee/
|
||||
# so wrapper scripts can live at /usr/bin instead.
|
||||
install -dm755 "${pkgdir}/usr/lib/wowee"
|
||||
for bin in wowee asset_extract dbc_to_csv auth_probe auth_login_probe blp_convert; do
|
||||
if [[ -f "${pkgdir}/usr/bin/${bin}" ]]; then
|
||||
mv "${pkgdir}/usr/bin/${bin}" "${pkgdir}/usr/lib/wowee/${bin}"
|
||||
fi
|
||||
done
|
||||
|
||||
# Main launcher: sets WOW_DATA_PATH to the user's XDG data dir.
|
||||
# The app uses WOW_DATA_PATH to locate Data/manifest.json at runtime.
|
||||
install -Dm755 /dev/stdin "${pkgdir}/usr/bin/wowee" <<'EOF'
|
||||
#!/bin/sh
|
||||
export WOW_DATA_PATH="${XDG_DATA_HOME:-$HOME/.local/share}/wowee/Data"
|
||||
exec /usr/lib/wowee/wowee "$@"
|
||||
EOF
|
||||
|
||||
# Asset extraction helper: runs asset_extract and outputs to the XDG data dir.
|
||||
# Usage: wowee-extract-assets /path/to/WoW/Data [wotlk|tbc|classic]
|
||||
install -Dm755 /dev/stdin "${pkgdir}/usr/bin/wowee-extract-assets" <<'EOF'
|
||||
#!/bin/sh
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: wowee-extract-assets /path/to/WoW/Data [wotlk|tbc|classic]"
|
||||
exit 1
|
||||
fi
|
||||
OUTPUT="${XDG_DATA_HOME:-$HOME/.local/share}/wowee/Data"
|
||||
mkdir -p "${OUTPUT}"
|
||||
exec /usr/lib/wowee/asset_extract --mpq-dir "$1" --output "${OUTPUT}" ${2:+--expansion "$2"}
|
||||
EOF
|
||||
|
||||
# License
|
||||
install -Dm644 "${pkgname}/LICENSE" \
|
||||
"${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
|
||||
|
||||
# Post-install instructions (shown by pacman helpers that support it)
|
||||
install -Dm644 /dev/stdin \
|
||||
"${pkgdir}/usr/share/doc/${pkgname}/POST_INSTALL" <<'EOF'
|
||||
==> WoWee requires game assets extracted from your own WoW client.
|
||||
==> Run the following once, pointing at your WoW Data/ directory:
|
||||
==>
|
||||
==> wowee-extract-assets /path/to/WoW-3.3.5a/Data wotlk
|
||||
==>
|
||||
==> Assets are written to ~/.local/share/wowee/Data/ (or $XDG_DATA_HOME/wowee/Data/).
|
||||
==> Then launch the client with: wowee
|
||||
EOF
|
||||
}
|
||||
130
README.md
130
README.md
|
|
@ -7,7 +7,7 @@
|
|||
A native C++ World of Warcraft client with a custom Vulkan renderer.
|
||||
|
||||
[](https://github.com/sponsors/Kelsidavis)
|
||||
[](https://discord.gg/SDqjA79B)
|
||||
[](https://discord.gg/PSdMPS8uje)
|
||||
|
||||
[](https://youtu.be/B-jtpPmiXGM)
|
||||
|
||||
|
|
@ -19,21 +19,27 @@ Protocol Compatible with **Vanilla (Classic) 1.12 + TBC 2.4.3 + WotLK 3.3.5a**.
|
|||
|
||||
> **Legal Disclaimer**: This is an educational/research project. It does not include any Blizzard Entertainment assets, data files, or proprietary code. World of Warcraft and all related assets are the property of Blizzard Entertainment, Inc. This project is not affiliated with or endorsed by Blizzard Entertainment. Users are responsible for supplying their own legally obtained game data files and for ensuring compliance with all applicable laws in their jurisdiction.
|
||||
|
||||
## Status & Direction (2026-02-18)
|
||||
## Status & Direction (2026-03-24)
|
||||
|
||||
- **Compatibility**: **Vanilla (Classic) 1.12 + TBC 2.4.3 + WotLK 3.3.5a** are all supported via expansion profiles and per-expansion packet parsers (`src/game/packet_parsers_classic.cpp`, `src/game/packet_parsers_tbc.cpp`). All three expansions are roughly on par — no single one is significantly more complete than the others.
|
||||
- **Tested against**: AzerothCore, TrinityCore, and Mangos.
|
||||
- **Current focus**: protocol correctness across server variants, visual accuracy (M2/WMO edge cases, equipment textures), and multi-expansion coverage.
|
||||
- **Compatibility**: **Vanilla (Classic) 1.12 + TBC 2.4.3 + WotLK 3.3.5a** are all supported via expansion profiles and per-expansion packet parsers. All three expansions are roughly on par.
|
||||
- **Tested against**: AzerothCore/ChromieCraft, TrinityCore, Mangos, and Turtle WoW (1.17).
|
||||
- **Current focus**: gameplay correctness (quest/GO interaction, NPC visibility), rendering stability, and multi-expansion coverage.
|
||||
- **Warden**: Full module execution via Unicorn Engine CPU emulation. Decrypts (RC4→RSA→zlib), parses and relocates the PE module, executes via x86 emulation with Windows API interception. Module cache at `~/.local/share/wowee/warden_cache/`.
|
||||
- **CI**: GitHub Actions builds for Linux (x86-64, ARM64), Windows (MSYS2 x86-64 + ARM64), and macOS (ARM64). Security scans via CodeQL, Semgrep, and sanitizers.
|
||||
- **Release**: v1.8.2-preview — 530+ WoW API functions, 140+ events, 664 opcode handlers.
|
||||
|
||||
## Features
|
||||
|
||||
### Rendering Engine
|
||||
- **Terrain** -- Multi-tile streaming with async loading, texture splatting (4 layers), frustum culling
|
||||
- **Terrain** -- Multi-tile streaming with async loading, texture splatting (4 layers), frustum culling, expanded load radius during taxi flights
|
||||
- **Atmosphere** -- Procedural clouds (FBM noise), lens flare with chromatic aberration, cloud/fog star occlusion
|
||||
- **Characters** -- Skeletal animation with GPU vertex skinning (256 bones), race-aware textures
|
||||
- **Buildings** -- WMO renderer with multi-material batches, frustum culling, 160-unit distance culling
|
||||
- **Particles** -- M2 particle emitters with WotLK struct parsing, billboarded glow effects
|
||||
- **Characters** -- Skeletal animation with GPU vertex skinning (256 bones), race-aware textures, per-instance NPC hair/skin textures
|
||||
- **Buildings** -- WMO renderer with multi-material batches, frustum culling, collision (wall/floor classification, slope sliding), interior glass transparency
|
||||
- **Instances** -- WDT parser for WMO-only dungeon maps, area trigger portals with glow/spin effects, seamless zone transitions
|
||||
- **Water & Lava** -- Terrain and WMO water with refraction/reflection, magma/slime rendering with multi-octave FBM noise flow, Beer-Lambert absorption, M2 lava waterfalls with UV scroll
|
||||
- **Particles** -- M2 particle emitters with WotLK struct parsing, billboarded glow effects, lava steam/splash effects
|
||||
- **Lighting** -- Shadow mapping with PCF filtering, per-frame shadow updates, AABB-based culling, interior/exterior light modes, WMO window glass with fresnel reflections
|
||||
- **Performance** -- Binary keyframe search for animations, incremental spatial index, static doodad skip, hash-free render/shadow culling
|
||||
|
||||
### Asset Pipeline
|
||||
- Extracted loose-file **`Data/`** tree indexed by **`manifest.json`** (fast lookup + caching)
|
||||
|
|
@ -44,21 +50,51 @@ Protocol Compatible with **Vanilla (Classic) 1.12 + TBC 2.4.3 + WotLK 3.3.5a**.
|
|||
### Gameplay Systems
|
||||
- **Authentication** -- Full SRP6a implementation with RC4 header encryption
|
||||
- **Character System** -- Creation (with nonbinary gender option), selection, 3D preview, stats panel, race/class support
|
||||
- **Movement** -- WASD movement, camera orbit, spline path following
|
||||
- **Combat** -- Auto-attack, spell casting with cooldowns, damage calculation, death handling
|
||||
- **Targeting** -- Tab-cycling, click-to-target, faction-based hostility (using Faction.dbc)
|
||||
- **Inventory** -- 23 equipment slots, 16 backpack slots, drag-drop, auto-equip
|
||||
- **Spells** -- Spellbook with class specialty tabs, drag-drop to action bar, spell icons
|
||||
- **Movement** -- WASD movement, camera orbit, spline path following, transport riding (trams, ships, zeppelins), movement ACK responses
|
||||
- **Combat** -- Auto-attack, spell casting with cooldowns, damage calculation, death handling, spirit healer resurrection
|
||||
- **Targeting** -- Tab-cycling with hostility filtering, click-to-target, faction-based hostility (using Faction.dbc)
|
||||
- **Inventory** -- 23 equipment slots, 16 backpack slots, drag-drop, auto-equip, item tooltips with weapon damage/speed, server-synced bag sort (quality/type/stack), independent bag windows
|
||||
- **Bank** -- Full bank support for all expansions, bag slots, drag-drop, right-click deposit (non-equippable items)
|
||||
- **Spells** -- Spellbook with specialty, general, profession, mount, and companion tabs; drag-drop to action bar; item use support
|
||||
- **Talents** -- Talent tree UI with proper visuals and functionality
|
||||
- **Action Bar** -- 12 slots, drag-drop from spellbook/inventory, click-to-cast, keybindings
|
||||
- **Trainers** -- Spell trainer UI, buy spells, known/available/unavailable states
|
||||
- **Quests** -- Quest markers (! and ?) on NPCs and minimap, quest log, quest details, turn-in flow
|
||||
- **Quests** -- Quest markers (! and ?) on NPCs and minimap, quest log, quest details, turn-in flow, quest item progress tracking
|
||||
- **Auction House** -- Search with filters, pagination, sell picker with tooltips, bid/buyout
|
||||
- **Mail** -- Item attachment support for sending
|
||||
- **Vendors** -- Buy, sell, and buyback (most recent sold item), gold tracking, inventory sync
|
||||
- **Loot** -- Loot window, gold looting, item pickup
|
||||
- **Loot** -- Loot window, gold looting, item pickup, chest/gameobject looting
|
||||
- **Gossip** -- NPC interaction, dialogue options
|
||||
- **Chat** -- Tabs/channels, emotes, chat bubbles, clickable URLs, clickable item links with tooltips
|
||||
- **Party** -- Group invites, party list
|
||||
- **Party** -- Group invites, party list, out-of-range member health via SMSG_PARTY_MEMBER_STATS
|
||||
- **Pets** -- Pet tracking via SMSG_PET_SPELLS, action bar (10 slots with icon/autocast tinting/tooltips), dismiss button
|
||||
- **Map Exploration** -- Subzone-level fog-of-war reveal, world map with continent/zone views, quest POI markers, taxi node markers, party member dots
|
||||
- **NPC Voices** -- Race/gender-specific NPC greeting, farewell, vendor, pissed, aggro, and flee sounds for all playable races including Blood Elf and Draenei
|
||||
- **Warden** -- Warden anti-cheat module execution via Unicorn Engine x86 emulation (cross-platform, no Wine)
|
||||
- **UI** -- Loading screens with progress bar, settings window, minimap with zoom/rotation/square mode, top-right minimap mute speaker, separate bag windows with compact-empty mode (aggregate view)
|
||||
- **UI** -- Loading screens with progress bar, settings window with graphics quality presets (LOW/MEDIUM/HIGH/ULTRA), shadow distance slider, minimap with zoom/rotation/square mode, top-right minimap mute speaker, separate bag windows with compact-empty mode (aggregate view)
|
||||
|
||||
## Graphics & Performance
|
||||
|
||||
### Quality Presets
|
||||
|
||||
WoWee includes four built-in graphics quality presets to help you quickly balance visual quality and performance:
|
||||
|
||||
| Preset | Shadows | MSAA | Normal Mapping | Clutter Density |
|
||||
|--------|---------|------|----------------|-----------------|
|
||||
| **LOW** | Off | Off | Disabled | 25% |
|
||||
| **MEDIUM** | 200m distance | 2x | Basic | 60% |
|
||||
| **HIGH** | 350m distance | 4x | Full (0.8x) | 100% |
|
||||
| **ULTRA** | 500m distance | 8x | Enhanced (1.2x) | 150% |
|
||||
|
||||
Press Escape to open **Video Settings** and select a preset, or adjust individual settings for a custom configuration.
|
||||
|
||||
### Performance Tips
|
||||
|
||||
- Start with **LOW** or **MEDIUM** if you experience frame drops
|
||||
- Shadows and MSAA have the largest impact on performance
|
||||
- Reduce **shadow distance** if shadows cause issues
|
||||
- Disable **water refraction** if you encounter GPU errors (requires FSR to be active)
|
||||
- Use **FSR2** (built-in upscaling) for better frame rates on modern GPUs
|
||||
|
||||
## Building
|
||||
|
||||
|
|
@ -157,6 +193,53 @@ make -j$(nproc)
|
|||
./bin/wowee
|
||||
```
|
||||
|
||||
### AMD FSR2 SDK (External)
|
||||
|
||||
- Build scripts (`build.sh`, `rebuild.sh`, `build.ps1`, `rebuild.ps1`) auto-fetch the AMD SDK to:
|
||||
- `extern/FidelityFX-FSR2`
|
||||
- Source URL:
|
||||
- `https://github.com/GPUOpen-Effects/FidelityFX-FSR2.git`
|
||||
- Ref:
|
||||
- `master` (depth-1 clone)
|
||||
- The renderer enables the AMD backend only when both are present:
|
||||
- `extern/FidelityFX-FSR2/src/ffx-fsr2-api/ffx_fsr2.h`
|
||||
- `extern/FidelityFX-FSR2/src/ffx-fsr2-api/vk/shaders/ffx_fsr2_accumulate_pass_permutations.h`
|
||||
- If the SDK checkout is missing generated Vulkan permutation headers, CMake auto-bootstraps them from `third_party/fsr2_vk_permutations`.
|
||||
- If SDK files are missing entirely, CMake falls back to the internal non-AMD FSR2 path automatically.
|
||||
|
||||
### FidelityFX SDK (Framegen Extern)
|
||||
|
||||
- Build scripts and CI also fetch:
|
||||
- `extern/FidelityFX-SDK`
|
||||
- Source URL:
|
||||
- `https://github.com/Kelsidavis/FidelityFX-SDK.git`
|
||||
- Ref:
|
||||
- `main` (depth-1 clone)
|
||||
- Override with env vars:
|
||||
- `WOWEE_FFX_SDK_REPO=https://github.com/<you>/FidelityFX-SDK.git`
|
||||
- `WOWEE_FFX_SDK_REF=<branch-or-tag>`
|
||||
- This ref includes Vulkan framegen building blocks (`frameinterpolation` + `opticalflow`) and Vulkan shader manifests:
|
||||
- `sdk/src/backends/vk/CMakeShadersFrameinterpolation.txt`
|
||||
- `sdk/src/backends/vk/CMakeShadersOpticalflow.txt`
|
||||
- CMake option:
|
||||
- `WOWEE_ENABLE_AMD_FSR3_FRAMEGEN=ON` enables a compile-probe target (`wowee_fsr3_framegen_amd_vk_probe`) that validates SDK FI/OF/FSR3/Vulkan interface headers at build time.
|
||||
- Runtime toggle:
|
||||
- In settings, `AMD FSR3 Frame Generation (Experimental)` persists to config.
|
||||
- Runtime library loader is Path A only (official AMD runtime).
|
||||
- Auto-probe checks common names (for example `amd_fidelityfx_vk` / `ffx_fsr3_vk`) in loader paths.
|
||||
- Override runtime path with:
|
||||
- `WOWEE_FFX_SDK_RUNTIME_LIB=/absolute/path/to/<amd-runtime-library>`
|
||||
- If runtime is missing, FG is cleanly unavailable (Path C).
|
||||
|
||||
|
||||
### Current FSR Defaults
|
||||
|
||||
- Upscaling quality default: `Native (100%)`
|
||||
- UI quality order: `Native (100%)`, `Ultra Quality (77%)`, `Quality (67%)`, `Balanced (59%)`
|
||||
- Default `FSR Sharpness`: `1.6`
|
||||
- Default FSR2 `Jitter Sign`: `0.38`
|
||||
- `Performance (50%)` preset is intentionally removed.
|
||||
|
||||
## Controls
|
||||
|
||||
### Camera & Movement
|
||||
|
|
@ -214,6 +297,17 @@ make -j$(nproc)
|
|||
- [Warden Quick Reference](docs/WARDEN_QUICK_REFERENCE.md) -- Warden module execution overview and testing
|
||||
- [Warden Implementation](docs/WARDEN_IMPLEMENTATION.md) -- Technical details of the implementation
|
||||
|
||||
## CI / CD
|
||||
|
||||
- GitHub Actions builds on every push: Linux (x86-64, ARM64), Windows (x86-64, ARM64 via MSYS2), macOS (ARM64)
|
||||
- All build jobs are AMD-FSR2-only (`WOWEE_ENABLE_AMD_FSR2=ON`) and explicitly build `wowee_fsr2_amd_vk`
|
||||
- Each job clones AMD's FSR2 SDK and FidelityFX-SDK (`Kelsidavis/FidelityFX-SDK`, `main` by default)
|
||||
- Linux CI validates FidelityFX-SDK Kits framegen headers
|
||||
- FSR3 Path A runtime build auto-bootstraps missing VK permutation headers via `tools/generate_ffx_sdk_vk_permutations.sh`
|
||||
- CI builds `wowee_fsr3_framegen_amd_vk_probe` when that target is generated for the detected SDK layout
|
||||
- If FSR2 generated Vulkan permutation headers are absent upstream, WoWee bootstraps them from `third_party/fsr2_vk_permutations`
|
||||
- Container build via `container/build-in-container.sh` (Podman)
|
||||
|
||||
## Security
|
||||
|
||||
- GitHub Actions runs a dedicated security workflow at `.github/workflows/security.yml`.
|
||||
|
|
|
|||
186
TROUBLESHOOTING.md
Normal file
186
TROUBLESHOOTING.md
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
# Troubleshooting Guide
|
||||
|
||||
This guide covers common issues and solutions for WoWee.
|
||||
|
||||
## Connection Issues
|
||||
|
||||
### "Authentication Failed"
|
||||
- **Cause**: Incorrect server address, expired realm list, or version mismatch
|
||||
- **Solution**:
|
||||
1. Verify server address in realm list is correct
|
||||
2. Ensure your WoW data directory is for the correct expansion (Vanilla/TBC/WotLK)
|
||||
3. Check that the emulator server is running and reachable
|
||||
|
||||
### "Realm List Connection Failed"
|
||||
- **Cause**: Server is down, firewall blocking connection, or DNS issue
|
||||
- **Solution**:
|
||||
1. Verify server IP/hostname is correct
|
||||
2. Test connectivity: `ping realm-server-address`
|
||||
3. Check firewall rules for port 3724 (auth) and 8085 (realm list)
|
||||
4. Try using IP address instead of hostname (DNS issues)
|
||||
|
||||
### "Connection Lost During Login"
|
||||
- **Cause**: Network timeout, server overload, or incompatible protocol version
|
||||
- **Solution**:
|
||||
1. Check your network connection
|
||||
2. Reduce number of assets loading (lower graphics preset)
|
||||
3. Verify server supports this expansion version
|
||||
|
||||
## Graphics Issues
|
||||
|
||||
### "VK_ERROR_DEVICE_LOST" or Client Crashes
|
||||
- **Cause**: GPU driver issue, insufficient VRAM, or graphics feature incompatibility
|
||||
- **Solution**:
|
||||
1. **Immediate**: Disable advanced graphics features:
|
||||
- Press Escape → Video Settings
|
||||
- Set graphics preset to **LOW**
|
||||
- Disable Water Refraction (requires FSR)
|
||||
- Disable MSAA (set to Off)
|
||||
2. **Medium term**: Update GPU driver to latest version
|
||||
3. **Verify**: Use a graphics test tool to ensure GPU stability
|
||||
4. **If persists**: Try FSR2 disabled mode - check renderer logs
|
||||
|
||||
### Black Screen or Rendering Issues
|
||||
- **Cause**: Missing shaders, GPU memory allocation failure, or incorrect graphics settings
|
||||
- **Solution**:
|
||||
1. Check logs: Look in `~/.wowee/logs/` for error messages
|
||||
2. Verify shaders compiled: Check for `.spv` files in `assets/shaders/compiled/`
|
||||
3. Reduce shadow distance: Press Escape → Video Settings → Lower shadow distance from 300m to 100m
|
||||
4. Disable shadows entirely if issues persist
|
||||
|
||||
### Low FPS or Frame Stuttering
|
||||
- **Cause**: Too high graphics settings for your GPU, memory fragmentation, or asset loading
|
||||
- **Solution**:
|
||||
1. Apply lower graphics preset: Escape → LOW or MEDIUM
|
||||
2. Disable MSAA: Set to "Off"
|
||||
3. Reduce draw distance: Move further away from complex areas
|
||||
4. Close other applications consuming GPU memory
|
||||
5. Check CPU usage - if high, reduce number of visible entities
|
||||
|
||||
### Water/Terrain Flickering
|
||||
- **Cause**: Shadow mapping artifacts, terrain LOD issues, or GPU memory pressure
|
||||
- **Solution**:
|
||||
1. Increase shadow distance slightly (150m to 200m)
|
||||
2. Disable shadows entirely as last resort
|
||||
3. Check GPU memory usage
|
||||
|
||||
## Audio Issues
|
||||
|
||||
### No Sound
|
||||
- **Cause**: Audio initialization failed, missing audio data, or incorrect mixer setup
|
||||
- **Solution**:
|
||||
1. Check system audio is working: Test with another application
|
||||
2. Verify audio files extracted: Check for `.wav` files in `Data/Audio/`
|
||||
3. Unmute audio: Look for speaker icon in minimap (top-right) - click to unmute
|
||||
4. Check settings: Escape → Audio Settings → Master Volume > 0
|
||||
|
||||
### Sound Cutting Out
|
||||
- **Cause**: Audio buffer underrun, too many simultaneous sounds, or driver issue
|
||||
- **Solution**:
|
||||
1. Lower audio volume: Escape → Audio Settings → Reduce Master Volume
|
||||
2. Disable distant ambient sounds: Reduce Ambient Volume
|
||||
3. Reduce number of particle effects
|
||||
4. Update audio driver
|
||||
|
||||
## Gameplay Issues
|
||||
|
||||
### Character Stuck or Not Moving
|
||||
- **Cause**: Network synchronization issue, collision bug, or server desync
|
||||
- **Solution**:
|
||||
1. Try pressing Escape to deselect any target, then move
|
||||
2. Jump (Spacebar) to test physics
|
||||
3. Reload the character: Press Escape → Disconnect → Reconnect
|
||||
4. Check for transport/vehicle state: Press 'R' to dismount if applicable
|
||||
|
||||
### Spells Not Casting or Showing "Error"
|
||||
- **Cause**: Cooldown, mana insufficient, target out of range, or server desync
|
||||
- **Solution**:
|
||||
1. Verify spell is off cooldown (action bar shows availability)
|
||||
2. Check mana/energy: Look at player frame (top-left)
|
||||
3. Verify target range: Hover action bar button for range info
|
||||
4. Check server logs for error messages (combat log will show reason)
|
||||
|
||||
### Quests Not Updating
|
||||
- **Cause**: Objective already completed in different session, quest giver not found, or network desync
|
||||
- **Solution**:
|
||||
1. Check quest objective: Open quest log (Q key) → Verify objective requirements
|
||||
2. Re-interact with NPC to trigger update packet
|
||||
3. Reload character if issue persists
|
||||
|
||||
### Items Not Appearing in Inventory
|
||||
- **Cause**: Inventory full, item filter active, or network desync
|
||||
- **Solution**:
|
||||
1. Check inventory space: Open inventory (B key) → Count free slots
|
||||
2. Verify item isn't already there: Search inventory for item name
|
||||
3. Check if bags are full: Open bag windows, consolidate items
|
||||
4. Reload character if item is still missing
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### For Low-End GPUs
|
||||
```
|
||||
Graphics Preset: LOW
|
||||
- Shadows: OFF
|
||||
- MSAA: OFF
|
||||
- Normal Mapping: Disabled
|
||||
- Clutter Density: 25%
|
||||
- Draw Distance: Minimum
|
||||
- Particles: Reduced
|
||||
```
|
||||
|
||||
### For Mid-Range GPUs
|
||||
```
|
||||
Graphics Preset: MEDIUM
|
||||
- Shadows: 200m
|
||||
- MSAA: 2x
|
||||
- Normal Mapping: Basic
|
||||
- Clutter Density: 60%
|
||||
- FSR2: Enabled (if desired)
|
||||
```
|
||||
|
||||
### For High-End GPUs
|
||||
```
|
||||
Graphics Preset: HIGH or ULTRA
|
||||
- Shadows: 350-500m
|
||||
- MSAA: 4-8x
|
||||
- Normal Mapping: Full (1.2x strength)
|
||||
- Clutter Density: 100-150%
|
||||
- FSR2: Optional (for 4K smoothness)
|
||||
```
|
||||
|
||||
## Getting Help
|
||||
|
||||
### Check Logs
|
||||
Detailed logs are saved to:
|
||||
- **Linux/macOS**: `~/.wowee/logs/`
|
||||
- **Windows**: `%APPDATA%\wowee\logs\`
|
||||
|
||||
Include relevant log entries when reporting issues.
|
||||
|
||||
### Check Server Compatibility
|
||||
- **AzerothCore**: Full support
|
||||
- **TrinityCore**: Full support
|
||||
- **Mangos**: Full support
|
||||
- **Turtle WoW**: Full support (1.17)
|
||||
|
||||
### Report Issues
|
||||
If you encounter a bug:
|
||||
1. Enable logging: Watch console for error messages
|
||||
2. Reproduce the issue consistently
|
||||
3. Gather system info: GPU, driver version, OS
|
||||
4. Check if issue is expansion-specific (Classic/TBC/WotLK)
|
||||
5. Report with detailed steps to reproduce
|
||||
|
||||
### Clear Cache
|
||||
If experiencing persistent issues, clear WoWee's cache:
|
||||
```bash
|
||||
# Linux/macOS
|
||||
rm -rf ~/.wowee/warden_cache/
|
||||
rm -rf ~/.wowee/asset_cache/
|
||||
|
||||
# Windows
|
||||
rmdir %APPDATA%\wowee\warden_cache\ /s
|
||||
rmdir %APPDATA%\wowee\asset_cache\ /s
|
||||
```
|
||||
|
||||
Then restart WoWee to rebuild cache.
|
||||
175
assets/shaders/fsr2_accumulate.comp.glsl
Normal file
175
assets/shaders/fsr2_accumulate.comp.glsl
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
#version 450
|
||||
|
||||
layout(local_size_x = 8, local_size_y = 8) in;
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D sceneColor;
|
||||
layout(set = 0, binding = 1) uniform sampler2D depthBuffer;
|
||||
layout(set = 0, binding = 2) uniform sampler2D motionVectors;
|
||||
layout(set = 0, binding = 3) uniform sampler2D historyInput;
|
||||
layout(set = 0, binding = 4, rgba16f) uniform writeonly image2D historyOutput;
|
||||
|
||||
layout(push_constant) uniform PushConstants {
|
||||
vec4 internalSize; // xy = internal resolution, zw = 1/internal
|
||||
vec4 displaySize; // xy = display resolution, zw = 1/display
|
||||
vec4 jitterOffset; // xy = current jitter (NDC-space), zw = unused
|
||||
vec4 params; // x = resetHistory, y = sharpness, z = convergenceFrame, w = unused
|
||||
} pc;
|
||||
|
||||
vec3 tonemap(vec3 c) {
|
||||
float luma = max(dot(c, vec3(0.299, 0.587, 0.114)), 0.0);
|
||||
return c / (1.0 + luma);
|
||||
}
|
||||
|
||||
vec3 inverseTonemap(vec3 c) {
|
||||
float luma = max(dot(c, vec3(0.299, 0.587, 0.114)), 0.0);
|
||||
return c / max(1.0 - luma, 1e-4);
|
||||
}
|
||||
|
||||
vec3 rgbToYCoCg(vec3 rgb) {
|
||||
float y = 0.25 * rgb.r + 0.5 * rgb.g + 0.25 * rgb.b;
|
||||
float co = 0.5 * rgb.r - 0.5 * rgb.b;
|
||||
float cg = -0.25 * rgb.r + 0.5 * rgb.g - 0.25 * rgb.b;
|
||||
return vec3(y, co, cg);
|
||||
}
|
||||
|
||||
vec3 yCoCgToRgb(vec3 ycocg) {
|
||||
float y = ycocg.x;
|
||||
float co = ycocg.y;
|
||||
float cg = ycocg.z;
|
||||
return vec3(y + co - cg, y + cg, y - co - cg);
|
||||
}
|
||||
|
||||
vec3 clipAABB(vec3 aabbMin, vec3 aabbMax, vec3 history) {
|
||||
vec3 center = 0.5 * (aabbMax + aabbMin);
|
||||
vec3 extents = 0.5 * (aabbMax - aabbMin) + 0.001;
|
||||
vec3 offset = history - center;
|
||||
vec3 absUnits = abs(offset / extents);
|
||||
float maxUnit = max(absUnits.x, max(absUnits.y, absUnits.z));
|
||||
if (maxUnit > 1.0)
|
||||
return center + offset / maxUnit;
|
||||
return history;
|
||||
}
|
||||
|
||||
// Lanczos2 kernel: sharper than bicubic, preserves high-frequency detail
|
||||
float lanczos2(float x) {
|
||||
if (abs(x) < 1e-6) return 1.0;
|
||||
if (abs(x) >= 2.0) return 0.0;
|
||||
float px = 3.14159265 * x;
|
||||
return sin(px) * sin(px * 0.5) / (px * px * 0.5);
|
||||
}
|
||||
|
||||
// Lanczos2 upsampling: sharper than Catmull-Rom bicubic
|
||||
vec3 sampleLanczos(sampler2D tex, vec2 uv, vec2 texSize) {
|
||||
vec2 invTexSize = 1.0 / texSize;
|
||||
vec2 texelPos = uv * texSize - 0.5;
|
||||
ivec2 base = ivec2(floor(texelPos));
|
||||
vec2 f = texelPos - vec2(base);
|
||||
|
||||
vec3 result = vec3(0.0);
|
||||
float totalWeight = 0.0;
|
||||
for (int y = -1; y <= 2; y++) {
|
||||
for (int x = -1; x <= 2; x++) {
|
||||
vec2 samplePos = (vec2(base + ivec2(x, y)) + 0.5) * invTexSize;
|
||||
float wx = lanczos2(float(x) - f.x);
|
||||
float wy = lanczos2(float(y) - f.y);
|
||||
float w = wx * wy;
|
||||
result += texture(tex, samplePos).rgb * w;
|
||||
totalWeight += w;
|
||||
}
|
||||
}
|
||||
return result / totalWeight;
|
||||
}
|
||||
|
||||
void main() {
|
||||
ivec2 outPixel = ivec2(gl_GlobalInvocationID.xy);
|
||||
ivec2 outSize = ivec2(pc.displaySize.xy);
|
||||
if (outPixel.x >= outSize.x || outPixel.y >= outSize.y) return;
|
||||
|
||||
vec2 outUV = (vec2(outPixel) + 0.5) * pc.displaySize.zw;
|
||||
|
||||
// Lanczos2 upsample: sharper than bicubic, better base image
|
||||
vec3 currentColor = sampleLanczos(sceneColor, outUV, pc.internalSize.xy);
|
||||
|
||||
// Temporal accumulation mode.
|
||||
const bool kUseTemporal = true;
|
||||
if (!kUseTemporal || pc.params.x > 0.5) {
|
||||
imageStore(historyOutput, outPixel, vec4(currentColor, 1.0));
|
||||
return;
|
||||
}
|
||||
|
||||
// Depth-dilated motion vector (3x3 nearest-to-camera)
|
||||
vec2 texelSize = pc.internalSize.zw;
|
||||
float closestDepth = texture(depthBuffer, outUV).r;
|
||||
vec2 closestOffset = vec2(0.0);
|
||||
for (int y = -1; y <= 1; y++) {
|
||||
for (int x = -1; x <= 1; x++) {
|
||||
vec2 off = vec2(float(x), float(y)) * texelSize;
|
||||
float d = texture(depthBuffer, outUV + off).r;
|
||||
if (d < closestDepth) {
|
||||
closestDepth = d;
|
||||
closestOffset = off;
|
||||
}
|
||||
}
|
||||
}
|
||||
vec2 motion = texture(motionVectors, outUV + closestOffset).rg;
|
||||
float motionMag = length(motion * pc.displaySize.xy);
|
||||
|
||||
vec2 historyUV = outUV + motion;
|
||||
float historyValid = (historyUV.x >= 0.0 && historyUV.x <= 1.0 &&
|
||||
historyUV.y >= 0.0 && historyUV.y <= 1.0) ? 1.0 : 0.0;
|
||||
vec3 historyColor = texture(historyInput, historyUV).rgb;
|
||||
|
||||
// Tonemapped space for blending
|
||||
vec3 tmCurrent = tonemap(currentColor);
|
||||
vec3 tmHistory = tonemap(historyColor);
|
||||
|
||||
// 5-tap cross neighborhood for variance (cheaper than 9-tap, sufficient)
|
||||
vec3 s0 = rgbToYCoCg(tmCurrent);
|
||||
vec3 s1 = rgbToYCoCg(tonemap(texture(sceneColor, outUV + vec2(-texelSize.x, 0.0)).rgb));
|
||||
vec3 s2 = rgbToYCoCg(tonemap(texture(sceneColor, outUV + vec2( texelSize.x, 0.0)).rgb));
|
||||
vec3 s3 = rgbToYCoCg(tonemap(texture(sceneColor, outUV + vec2(0.0, -texelSize.y)).rgb));
|
||||
vec3 s4 = rgbToYCoCg(tonemap(texture(sceneColor, outUV + vec2(0.0, texelSize.y)).rgb));
|
||||
|
||||
vec3 m1 = s0 + s1 + s2 + s3 + s4;
|
||||
vec3 m2 = s0*s0 + s1*s1 + s2*s2 + s3*s3 + s4*s4;
|
||||
vec3 mean = m1 / 5.0;
|
||||
vec3 variance = max(m2 / 5.0 - mean * mean, vec3(0.0));
|
||||
vec3 stddev = sqrt(variance);
|
||||
|
||||
float gamma = 1.25;
|
||||
vec3 boxMin = mean - gamma * stddev;
|
||||
vec3 boxMax = mean + gamma * stddev;
|
||||
|
||||
// Variance clip history
|
||||
vec3 tmHistYCoCg = rgbToYCoCg(tmHistory);
|
||||
vec3 clippedYCoCg = clipAABB(boxMin, boxMax, tmHistYCoCg);
|
||||
float clipDist = length(tmHistYCoCg - clippedYCoCg);
|
||||
tmHistory = yCoCgToRgb(clippedYCoCg);
|
||||
|
||||
// --- Blend factor ---
|
||||
// Base: always start from current frame (sharp Lanczos).
|
||||
// Temporal blending only at edges with small fixed weight.
|
||||
// This provides AA without blurring smooth areas.
|
||||
|
||||
// Edge detection: luminance variance in YCoCg
|
||||
float edgeStrength = smoothstep(0.04, 0.12, stddev.x);
|
||||
|
||||
// Keep temporal reconstruction active continuously instead of freezing after
|
||||
// a small convergence window. Favor history on stable pixels and favor
|
||||
// current color when edge/motion risk is high to avoid blur/ghosting.
|
||||
float motionFactor = smoothstep(0.05, 1.5, motionMag);
|
||||
float currentBase = mix(0.12, 0.30, edgeStrength);
|
||||
float blendFactor = mix(currentBase, 0.85, motionFactor);
|
||||
|
||||
// Disocclusion: replace stale history
|
||||
blendFactor = max(blendFactor, clamp(clipDist * 5.0, 0.0, 0.80));
|
||||
|
||||
// Invalid history: use current frame
|
||||
blendFactor = mix(blendFactor, 1.0, 1.0 - historyValid);
|
||||
|
||||
// Blend in tonemapped space, inverse-tonemap back to linear
|
||||
vec3 tmResult = mix(tmHistory, tmCurrent, blendFactor);
|
||||
vec3 result = inverseTonemap(tmResult);
|
||||
|
||||
imageStore(historyOutput, outPixel, vec4(result, 1.0));
|
||||
}
|
||||
BIN
assets/shaders/fsr2_accumulate.comp.spv
Normal file
BIN
assets/shaders/fsr2_accumulate.comp.spv
Normal file
Binary file not shown.
46
assets/shaders/fsr2_motion.comp.glsl
Normal file
46
assets/shaders/fsr2_motion.comp.glsl
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
#version 450
|
||||
|
||||
layout(local_size_x = 8, local_size_y = 8) in;
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D depthBuffer;
|
||||
layout(set = 0, binding = 1, rg16f) uniform writeonly image2D motionVectors;
|
||||
|
||||
layout(push_constant) uniform PushConstants {
|
||||
mat4 prevViewProjection; // previous jittered VP
|
||||
mat4 invCurrentViewProj; // inverse(current jittered VP)
|
||||
} pc;
|
||||
|
||||
void main() {
|
||||
ivec2 pixelCoord = ivec2(gl_GlobalInvocationID.xy);
|
||||
ivec2 imgSize = imageSize(motionVectors);
|
||||
if (pixelCoord.x >= imgSize.x || pixelCoord.y >= imgSize.y) return;
|
||||
|
||||
float depth = texelFetch(depthBuffer, pixelCoord, 0).r;
|
||||
|
||||
// Pixel center UV and NDC
|
||||
vec2 uv = (vec2(pixelCoord) + 0.5) / vec2(imgSize);
|
||||
vec2 ndc = uv * 2.0 - 1.0;
|
||||
|
||||
// Reconstruct current world position from current frame depth.
|
||||
vec4 clipPos = vec4(ndc, depth, 1.0);
|
||||
vec4 worldPos = pc.invCurrentViewProj * clipPos;
|
||||
if (abs(worldPos.w) < 1e-6) {
|
||||
imageStore(motionVectors, pixelCoord, vec4(0.0, 0.0, 0.0, 0.0));
|
||||
return;
|
||||
}
|
||||
worldPos /= worldPos.w;
|
||||
|
||||
// Project reconstructed world position into previous frame clip space.
|
||||
vec4 prevClip = pc.prevViewProjection * worldPos;
|
||||
if (abs(prevClip.w) < 1e-6) {
|
||||
imageStore(motionVectors, pixelCoord, vec4(0.0, 0.0, 0.0, 0.0));
|
||||
return;
|
||||
}
|
||||
vec2 prevNdc = prevClip.xy / prevClip.w;
|
||||
vec2 prevUV = prevNdc * 0.5 + 0.5;
|
||||
|
||||
vec2 currentUV = uv;
|
||||
vec2 motion = prevUV - currentUV;
|
||||
|
||||
imageStore(motionVectors, pixelCoord, vec4(motion, 0.0, 0.0));
|
||||
}
|
||||
BIN
assets/shaders/fsr2_motion.comp.spv
Normal file
BIN
assets/shaders/fsr2_motion.comp.spv
Normal file
Binary file not shown.
52
assets/shaders/fsr2_sharpen.frag.glsl
Normal file
52
assets/shaders/fsr2_sharpen.frag.glsl
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
#version 450
|
||||
|
||||
layout(location = 0) in vec2 TexCoord;
|
||||
layout(location = 0) out vec4 FragColor;
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D inputImage;
|
||||
|
||||
layout(push_constant) uniform PushConstants {
|
||||
vec4 params; // x = 1/width, y = 1/height, z = sharpness (0-2), w = unused
|
||||
} pc;
|
||||
|
||||
void main() {
|
||||
vec2 tc = TexCoord;
|
||||
|
||||
vec2 texelSize = pc.params.xy;
|
||||
float sharpness = pc.params.z;
|
||||
|
||||
// RCAS: Robust Contrast-Adaptive Sharpening
|
||||
// 5-tap cross pattern
|
||||
vec3 center = texture(inputImage, tc).rgb;
|
||||
vec3 north = texture(inputImage, tc + vec2(0.0, -texelSize.y)).rgb;
|
||||
vec3 south = texture(inputImage, tc + vec2(0.0, texelSize.y)).rgb;
|
||||
vec3 west = texture(inputImage, tc + vec2(-texelSize.x, 0.0)).rgb;
|
||||
vec3 east = texture(inputImage, tc + vec2( texelSize.x, 0.0)).rgb;
|
||||
|
||||
// Compute local contrast (min/max of neighborhood)
|
||||
vec3 minRGB = min(center, min(min(north, south), min(west, east)));
|
||||
vec3 maxRGB = max(center, max(max(north, south), max(west, east)));
|
||||
|
||||
// Adaptive sharpening weight based on local contrast
|
||||
// High contrast = less sharpening (prevent ringing)
|
||||
vec3 range = maxRGB - minRGB;
|
||||
vec3 rcpRange = 1.0 / (range + 0.001);
|
||||
|
||||
// AMD FidelityFX RCAS-style weight computation:
|
||||
// Compute per-channel sharpening weight from local contrast
|
||||
vec3 rcpM = 1.0 / (4.0 * range + 0.001);
|
||||
// Weight capped at sharpness, inversely proportional to contrast
|
||||
float w = min(min(rcpM.r, min(rcpM.g, rcpM.b)), sharpness);
|
||||
|
||||
// Apply sharpening: negative lobe on neighbors
|
||||
vec3 sharpened = (center * (1.0 + 4.0 * w) - (north + south + west + east) * w)
|
||||
/ (1.0 + 4.0 * w - 4.0 * w);
|
||||
// Simplified: center + w * (4*center - north - south - west - east)
|
||||
sharpened = center + w * (4.0 * center - north - south - west - east);
|
||||
|
||||
// Soft clamp: allow some overshoot for sharpness, prevent extreme ringing
|
||||
vec3 overshoot = 0.1 * (maxRGB - minRGB);
|
||||
sharpened = clamp(sharpened, minRGB - overshoot, maxRGB + overshoot);
|
||||
|
||||
FragColor = vec4(sharpened, 1.0);
|
||||
}
|
||||
BIN
assets/shaders/fsr2_sharpen.frag.spv
Normal file
BIN
assets/shaders/fsr2_sharpen.frag.spv
Normal file
Binary file not shown.
100
assets/shaders/fsr_easu.frag.glsl
Normal file
100
assets/shaders/fsr_easu.frag.glsl
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
#version 450
|
||||
// FSR 1.0 EASU (Edge Adaptive Spatial Upsampling) — Fragment Shader
|
||||
// Based on AMD FidelityFX Super Resolution 1.0
|
||||
// Implements edge-adaptive bilinear upsampling with directional filtering
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D uInput;
|
||||
|
||||
layout(push_constant) uniform FSRConstants {
|
||||
vec4 con0; // inputSize.xy, 1/inputSize.xy
|
||||
vec4 con1; // inputSize.xy / outputSize.xy, 0.5 * inputSize.xy / outputSize.xy
|
||||
vec4 con2; // outputSize.xy, 1/outputSize.xy
|
||||
vec4 con3; // sharpness, 0, 0, 0
|
||||
} fsr;
|
||||
|
||||
layout(location = 0) in vec2 TexCoord;
|
||||
layout(location = 0) out vec4 outColor;
|
||||
|
||||
// Fetch a texel with offset (in input pixels)
|
||||
vec3 fsrFetch(vec2 p, vec2 off) {
|
||||
return textureLod(uInput, (p + off + 0.5) * fsr.con0.zw, 0.0).rgb;
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec2 tc = TexCoord;
|
||||
|
||||
// Map output pixel to input space
|
||||
vec2 pp = tc * fsr.con2.xy; // output pixel position
|
||||
vec2 ip = pp * fsr.con1.xy - 0.5; // input pixel position (centered)
|
||||
vec2 fp = floor(ip);
|
||||
vec2 ff = ip - fp;
|
||||
|
||||
// 12-tap filter: 4x3 grid around the pixel
|
||||
// b c
|
||||
// e f g h
|
||||
// i j k l
|
||||
// n o
|
||||
vec3 b = fsrFetch(fp, vec2( 0, -1));
|
||||
vec3 c = fsrFetch(fp, vec2( 1, -1));
|
||||
vec3 e = fsrFetch(fp, vec2(-1, 0));
|
||||
vec3 f = fsrFetch(fp, vec2( 0, 0));
|
||||
vec3 g = fsrFetch(fp, vec2( 1, 0));
|
||||
vec3 h = fsrFetch(fp, vec2( 2, 0));
|
||||
vec3 i = fsrFetch(fp, vec2(-1, 1));
|
||||
vec3 j = fsrFetch(fp, vec2( 0, 1));
|
||||
vec3 k = fsrFetch(fp, vec2( 1, 1));
|
||||
vec3 l = fsrFetch(fp, vec2( 2, 1));
|
||||
vec3 n = fsrFetch(fp, vec2( 0, 2));
|
||||
vec3 o = fsrFetch(fp, vec2( 1, 2));
|
||||
|
||||
// Luma (use green channel as good perceptual approximation)
|
||||
float bL = b.g, cL = c.g, eL = e.g, fL = f.g;
|
||||
float gL = g.g, hL = h.g, iL = i.g, jL = j.g;
|
||||
float kL = k.g, lL = l.g, nL = n.g, oL = o.g;
|
||||
|
||||
// Directional edge detection
|
||||
// Compute gradients in 4 directions (N-S, E-W, NE-SW, NW-SE)
|
||||
float dc = cL - jL;
|
||||
float db = bL - kL;
|
||||
float de = eL - hL;
|
||||
float di = iL - lL;
|
||||
|
||||
// Length of the edge in each direction
|
||||
float lenH = abs(eL - fL) + abs(fL - gL) + abs(iL - jL) + abs(jL - kL);
|
||||
float lenV = abs(bL - fL) + abs(fL - jL) + abs(cL - gL) + abs(gL - kL);
|
||||
|
||||
// Determine dominant edge direction
|
||||
float dirH = lenV / (lenH + lenV + 1e-7);
|
||||
float dirV = lenH / (lenH + lenV + 1e-7);
|
||||
|
||||
// Bilinear weights
|
||||
float w1 = (1.0 - ff.x) * (1.0 - ff.y);
|
||||
float w2 = ff.x * (1.0 - ff.y);
|
||||
float w3 = (1.0 - ff.x) * ff.y;
|
||||
float w4 = ff.x * ff.y;
|
||||
|
||||
// Edge-aware sharpening: boost weights along edges
|
||||
float sharpness = fsr.con3.x;
|
||||
float edgeStr = max(abs(lenH - lenV) / (lenH + lenV + 1e-7), 0.0);
|
||||
float sharp = mix(0.0, sharpness, edgeStr);
|
||||
|
||||
// Sharpen bilinear by pulling toward nearest texel
|
||||
float maxW = max(max(w1, w2), max(w3, w4));
|
||||
w1 = mix(w1, float(w1 == maxW), sharp * 0.25);
|
||||
w2 = mix(w2, float(w2 == maxW), sharp * 0.25);
|
||||
w3 = mix(w3, float(w3 == maxW), sharp * 0.25);
|
||||
w4 = mix(w4, float(w4 == maxW), sharp * 0.25);
|
||||
|
||||
// Normalize
|
||||
float wSum = w1 + w2 + w3 + w4;
|
||||
w1 /= wSum; w2 /= wSum; w3 /= wSum; w4 /= wSum;
|
||||
|
||||
// Final color: weighted blend of the 4 nearest texels with edge awareness
|
||||
vec3 color = f * w1 + g * w2 + j * w3 + k * w4;
|
||||
|
||||
// Optional: blend in some of the surrounding texels for anti-aliasing
|
||||
float aa = 0.125 * edgeStr;
|
||||
color = mix(color, (b + c + e + h + i + l + n + o) / 8.0, aa * 0.15);
|
||||
|
||||
outColor = vec4(clamp(color, 0.0, 1.0), 1.0);
|
||||
}
|
||||
BIN
assets/shaders/fsr_easu.frag.spv
Normal file
BIN
assets/shaders/fsr_easu.frag.spv
Normal file
Binary file not shown.
43
assets/shaders/fsr_rcas.frag.glsl
Normal file
43
assets/shaders/fsr_rcas.frag.glsl
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
#version 450
|
||||
// FSR 1.0 RCAS (Robust Contrast Adaptive Sharpening) — Fragment Shader
|
||||
// Based on AMD FidelityFX Super Resolution 1.0
|
||||
// Applies contrast-adaptive sharpening after EASU upscaling
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D uInput;
|
||||
|
||||
layout(push_constant) uniform RCASConstants {
|
||||
vec4 con0; // 1/outputSize.xy, outputSize.xy
|
||||
vec4 con1; // sharpness (x), 0, 0, 0
|
||||
} rcas;
|
||||
|
||||
layout(location = 0) in vec2 TexCoord;
|
||||
layout(location = 0) out vec4 outColor;
|
||||
|
||||
void main() {
|
||||
// Fetch center and 4-neighborhood
|
||||
vec2 texelSize = rcas.con0.xy;
|
||||
vec3 c = texture(uInput, TexCoord).rgb;
|
||||
vec3 n = texture(uInput, TexCoord + vec2( 0, -texelSize.y)).rgb;
|
||||
vec3 s = texture(uInput, TexCoord + vec2( 0, texelSize.y)).rgb;
|
||||
vec3 w = texture(uInput, TexCoord + vec2(-texelSize.x, 0)).rgb;
|
||||
vec3 e = texture(uInput, TexCoord + vec2( texelSize.x, 0)).rgb;
|
||||
|
||||
// Luma (green channel approximation)
|
||||
float cL = c.g, nL = n.g, sL = s.g, wL = w.g, eL = e.g;
|
||||
|
||||
// Min/max of neighborhood
|
||||
float minL = min(min(nL, sL), min(wL, eL));
|
||||
float maxL = max(max(nL, sL), max(wL, eL));
|
||||
|
||||
// Contrast adaptive sharpening weight
|
||||
// Higher contrast = less sharpening to avoid ringing
|
||||
float contrast = maxL - minL;
|
||||
float sharpness = rcas.con1.x;
|
||||
float w0 = sharpness * (1.0 - smoothstep(0.0, 0.3, contrast));
|
||||
|
||||
// Apply sharpening: center + w0 * (center - average_neighbors)
|
||||
vec3 avg = (n + s + w + e) * 0.25;
|
||||
vec3 sharpened = c + w0 * (c - avg);
|
||||
|
||||
outColor = vec4(clamp(sharpened, 0.0, 1.0), 1.0);
|
||||
}
|
||||
BIN
assets/shaders/fsr_rcas.frag.spv
Normal file
BIN
assets/shaders/fsr_rcas.frag.spv
Normal file
Binary file not shown.
155
assets/shaders/fxaa.frag.glsl
Normal file
155
assets/shaders/fxaa.frag.glsl
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
#version 450
|
||||
|
||||
// FXAA 3.11 — Fast Approximate Anti-Aliasing post-process pass.
|
||||
// Reads the resolved scene color and outputs a smoothed result.
|
||||
// Push constant: rcpFrame = vec2(1/width, 1/height), sharpness (0=off, 2=max), desaturate (1=ghost grayscale).
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D uScene;
|
||||
|
||||
layout(location = 0) in vec2 TexCoord;
|
||||
layout(location = 0) out vec4 outColor;
|
||||
|
||||
layout(push_constant) uniform PC {
|
||||
vec2 rcpFrame;
|
||||
float sharpness; // 0 = no sharpen, 2 = max (matches FSR2 RCAS range)
|
||||
float desaturate; // 1 = full grayscale (ghost mode), 0 = normal color
|
||||
} pc;
|
||||
|
||||
// Quality tuning
|
||||
#define FXAA_EDGE_THRESHOLD (1.0/8.0) // minimum edge contrast to process
|
||||
#define FXAA_EDGE_THRESHOLD_MIN (1.0/24.0) // ignore very dark regions
|
||||
#define FXAA_SEARCH_STEPS 12
|
||||
#define FXAA_SEARCH_THRESHOLD (1.0/4.0)
|
||||
#define FXAA_SUBPIX 0.75
|
||||
#define FXAA_SUBPIX_TRIM (1.0/4.0)
|
||||
#define FXAA_SUBPIX_TRIM_SCALE (1.0/(1.0 - FXAA_SUBPIX_TRIM))
|
||||
#define FXAA_SUBPIX_CAP (3.0/4.0)
|
||||
|
||||
float luma(vec3 c) {
|
||||
return dot(c, vec3(0.299, 0.587, 0.114));
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec2 uv = TexCoord;
|
||||
vec2 rcp = pc.rcpFrame;
|
||||
|
||||
// --- Centre and cardinal neighbours ---
|
||||
vec3 rgbM = texture(uScene, uv).rgb;
|
||||
vec3 rgbN = texture(uScene, uv + vec2( 0.0, -1.0) * rcp).rgb;
|
||||
vec3 rgbS = texture(uScene, uv + vec2( 0.0, 1.0) * rcp).rgb;
|
||||
vec3 rgbE = texture(uScene, uv + vec2( 1.0, 0.0) * rcp).rgb;
|
||||
vec3 rgbW = texture(uScene, uv + vec2(-1.0, 0.0) * rcp).rgb;
|
||||
|
||||
float lumaN = luma(rgbN);
|
||||
float lumaS = luma(rgbS);
|
||||
float lumaE = luma(rgbE);
|
||||
float lumaW = luma(rgbW);
|
||||
float lumaM = luma(rgbM);
|
||||
|
||||
float lumaMin = min(lumaM, min(min(lumaN, lumaS), min(lumaE, lumaW)));
|
||||
float lumaMax = max(lumaM, max(max(lumaN, lumaS), max(lumaE, lumaW)));
|
||||
float range = lumaMax - lumaMin;
|
||||
|
||||
// Early exit on smooth regions
|
||||
if (range < max(FXAA_EDGE_THRESHOLD_MIN, lumaMax * FXAA_EDGE_THRESHOLD)) {
|
||||
outColor = vec4(rgbM, 1.0);
|
||||
return;
|
||||
}
|
||||
|
||||
// --- Diagonal neighbours ---
|
||||
vec3 rgbNW = texture(uScene, uv + vec2(-1.0, -1.0) * rcp).rgb;
|
||||
vec3 rgbNE = texture(uScene, uv + vec2( 1.0, -1.0) * rcp).rgb;
|
||||
vec3 rgbSW = texture(uScene, uv + vec2(-1.0, 1.0) * rcp).rgb;
|
||||
vec3 rgbSE = texture(uScene, uv + vec2( 1.0, 1.0) * rcp).rgb;
|
||||
|
||||
float lumaNW = luma(rgbNW);
|
||||
float lumaNE = luma(rgbNE);
|
||||
float lumaSW = luma(rgbSW);
|
||||
float lumaSE = luma(rgbSE);
|
||||
|
||||
// --- Sub-pixel blend factor ---
|
||||
float lumaL = (lumaN + lumaS + lumaE + lumaW) * 0.25;
|
||||
float rangeL = abs(lumaL - lumaM);
|
||||
float blendL = max(0.0, (rangeL / range) - FXAA_SUBPIX_TRIM) * FXAA_SUBPIX_TRIM_SCALE;
|
||||
blendL = min(FXAA_SUBPIX_CAP, blendL) * FXAA_SUBPIX;
|
||||
|
||||
// --- Edge orientation (horizontal vs. vertical) ---
|
||||
float edgeHorz =
|
||||
abs(-2.0*lumaW + lumaNW + lumaSW)
|
||||
+ 2.0*abs(-2.0*lumaM + lumaN + lumaS)
|
||||
+ abs(-2.0*lumaE + lumaNE + lumaSE);
|
||||
float edgeVert =
|
||||
abs(-2.0*lumaS + lumaSW + lumaSE)
|
||||
+ 2.0*abs(-2.0*lumaM + lumaW + lumaE)
|
||||
+ abs(-2.0*lumaN + lumaNW + lumaNE);
|
||||
|
||||
bool horzSpan = (edgeHorz >= edgeVert);
|
||||
float lengthSign = horzSpan ? rcp.y : rcp.x;
|
||||
|
||||
float luma1 = horzSpan ? lumaN : lumaW;
|
||||
float luma2 = horzSpan ? lumaS : lumaE;
|
||||
float grad1 = abs(luma1 - lumaM);
|
||||
float grad2 = abs(luma2 - lumaM);
|
||||
lengthSign = (grad1 >= grad2) ? -lengthSign : lengthSign;
|
||||
|
||||
// --- Edge search ---
|
||||
vec2 posB = uv;
|
||||
vec2 offNP = horzSpan ? vec2(rcp.x, 0.0) : vec2(0.0, rcp.y);
|
||||
if (!horzSpan) posB.x += lengthSign * 0.5;
|
||||
if ( horzSpan) posB.y += lengthSign * 0.5;
|
||||
|
||||
float lumaMLSS = lumaM - (luma1 + luma2) * 0.5;
|
||||
float gradientScaled = max(grad1, grad2) * 0.25;
|
||||
|
||||
vec2 posN = posB - offNP;
|
||||
vec2 posP = posB + offNP;
|
||||
bool done1 = false, done2 = false;
|
||||
float lumaEnd1 = 0.0, lumaEnd2 = 0.0;
|
||||
|
||||
for (int i = 0; i < FXAA_SEARCH_STEPS; ++i) {
|
||||
if (!done1) lumaEnd1 = luma(texture(uScene, posN).rgb) - lumaMLSS;
|
||||
if (!done2) lumaEnd2 = luma(texture(uScene, posP).rgb) - lumaMLSS;
|
||||
done1 = done1 || (abs(lumaEnd1) >= gradientScaled * FXAA_SEARCH_THRESHOLD);
|
||||
done2 = done2 || (abs(lumaEnd2) >= gradientScaled * FXAA_SEARCH_THRESHOLD);
|
||||
if (done1 && done2) break;
|
||||
if (!done1) posN -= offNP;
|
||||
if (!done2) posP += offNP;
|
||||
}
|
||||
|
||||
float dstN = horzSpan ? (uv.x - posN.x) : (uv.y - posN.y);
|
||||
float dstP = horzSpan ? (posP.x - uv.x) : (posP.y - uv.y);
|
||||
bool dirN = (dstN < dstP);
|
||||
float lumaEndFinal = dirN ? lumaEnd1 : lumaEnd2;
|
||||
|
||||
float spanLength = dstN + dstP;
|
||||
float pixelOffset = (dirN ? dstN : dstP) / spanLength;
|
||||
bool goodSpan = ((lumaEndFinal < 0.0) != (lumaMLSS < 0.0));
|
||||
float pixelOffsetFinal = max(goodSpan ? pixelOffset : 0.0, blendL);
|
||||
|
||||
vec2 finalUV = uv;
|
||||
if ( horzSpan) finalUV.y += pixelOffsetFinal * lengthSign;
|
||||
if (!horzSpan) finalUV.x += pixelOffsetFinal * lengthSign;
|
||||
|
||||
vec3 fxaaResult = texture(uScene, finalUV).rgb;
|
||||
|
||||
// Post-FXAA contrast-adaptive sharpening (unsharp mask).
|
||||
// Counteracts FXAA's sub-pixel blur when sharpness > 0.
|
||||
if (pc.sharpness > 0.0) {
|
||||
vec2 r = pc.rcpFrame;
|
||||
vec3 blur = (texture(uScene, uv + vec2(-r.x, 0)).rgb
|
||||
+ texture(uScene, uv + vec2( r.x, 0)).rgb
|
||||
+ texture(uScene, uv + vec2(0, -r.y)).rgb
|
||||
+ texture(uScene, uv + vec2(0, r.y)).rgb) * 0.25;
|
||||
// scale sharpness from [0,2] to a modest [0, 0.3] boost factor
|
||||
float s = pc.sharpness * 0.15;
|
||||
fxaaResult = clamp(fxaaResult + s * (fxaaResult - blur), 0.0, 1.0);
|
||||
}
|
||||
|
||||
// Ghost mode: desaturate to grayscale (with a slight cool blue tint).
|
||||
if (pc.desaturate > 0.5) {
|
||||
float gray = dot(fxaaResult, vec3(0.299, 0.587, 0.114));
|
||||
fxaaResult = mix(fxaaResult, vec3(gray, gray, gray * 1.05), pc.desaturate);
|
||||
}
|
||||
|
||||
outColor = vec4(fxaaResult, 1.0);
|
||||
}
|
||||
BIN
assets/shaders/fxaa.frag.spv
Normal file
BIN
assets/shaders/fxaa.frag.spv
Normal file
Binary file not shown.
|
|
@ -25,6 +25,9 @@ void main() {
|
|||
if (lum < 0.05) discard;
|
||||
}
|
||||
|
||||
float edge = smoothstep(0.5, 0.4, length(p - 0.5));
|
||||
outColor = texColor * vColor * vec4(vec3(1.0), edge);
|
||||
// Soft circular falloff for point-sprite edges.
|
||||
float edge = 1.0 - smoothstep(0.4, 0.5, length(p - 0.5));
|
||||
float alpha = texColor.a * vColor.a * edge;
|
||||
vec3 rgb = texColor.rgb * vColor.rgb * alpha;
|
||||
outColor = vec4(rgb, alpha);
|
||||
}
|
||||
|
|
|
|||
25
assets/shaders/m2_ribbon.frag.glsl
Normal file
25
assets/shaders/m2_ribbon.frag.glsl
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#version 450
|
||||
|
||||
// M2 ribbon emitter fragment shader.
|
||||
// Samples the ribbon texture, multiplied by vertex color and alpha.
|
||||
// Uses additive blending (pipeline-level) for magic/spell trails.
|
||||
|
||||
layout(set = 1, binding = 0) uniform sampler2D uTexture;
|
||||
|
||||
layout(location = 0) in vec3 vColor;
|
||||
layout(location = 1) in float vAlpha;
|
||||
layout(location = 2) in vec2 vUV;
|
||||
layout(location = 3) in float vFogFactor;
|
||||
|
||||
layout(location = 0) out vec4 outColor;
|
||||
|
||||
void main() {
|
||||
vec4 tex = texture(uTexture, vUV);
|
||||
// For additive ribbons alpha comes from texture luminance; multiply by vertex alpha.
|
||||
float a = tex.a * vAlpha;
|
||||
if (a < 0.01) discard;
|
||||
vec3 rgb = tex.rgb * vColor;
|
||||
// Ribbons fade slightly with fog (additive blend attenuated toward black = invisible in fog).
|
||||
rgb *= vFogFactor;
|
||||
outColor = vec4(rgb, a);
|
||||
}
|
||||
BIN
assets/shaders/m2_ribbon.frag.spv
Normal file
BIN
assets/shaders/m2_ribbon.frag.spv
Normal file
Binary file not shown.
43
assets/shaders/m2_ribbon.vert.glsl
Normal file
43
assets/shaders/m2_ribbon.vert.glsl
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
#version 450
|
||||
|
||||
// M2 ribbon emitter vertex shader.
|
||||
// Ribbon geometry is generated CPU-side as a triangle strip.
|
||||
// Vertex format: pos(3) + color(3) + alpha(1) + uv(2) = 9 floats.
|
||||
|
||||
layout(set = 0, binding = 0) uniform PerFrame {
|
||||
mat4 view;
|
||||
mat4 projection;
|
||||
mat4 lightSpaceMatrix;
|
||||
vec4 lightDir;
|
||||
vec4 lightColor;
|
||||
vec4 ambientColor;
|
||||
vec4 viewPos;
|
||||
vec4 fogColor;
|
||||
vec4 fogParams;
|
||||
vec4 shadowParams;
|
||||
};
|
||||
|
||||
layout(location = 0) in vec3 aPos;
|
||||
layout(location = 1) in vec3 aColor;
|
||||
layout(location = 2) in float aAlpha;
|
||||
layout(location = 3) in vec2 aUV;
|
||||
|
||||
layout(location = 0) out vec3 vColor;
|
||||
layout(location = 1) out float vAlpha;
|
||||
layout(location = 2) out vec2 vUV;
|
||||
layout(location = 3) out float vFogFactor;
|
||||
|
||||
void main() {
|
||||
vec4 worldPos = vec4(aPos, 1.0);
|
||||
vec4 viewPos4 = view * worldPos;
|
||||
gl_Position = projection * viewPos4;
|
||||
|
||||
float dist = length(viewPos4.xyz);
|
||||
float fogStart = fogParams.x;
|
||||
float fogEnd = fogParams.y;
|
||||
vFogFactor = clamp((fogEnd - dist) / max(fogEnd - fogStart, 0.001), 0.0, 1.0);
|
||||
|
||||
vColor = aColor;
|
||||
vAlpha = aAlpha;
|
||||
vUV = aUV;
|
||||
}
|
||||
BIN
assets/shaders/m2_ribbon.vert.spv
Normal file
BIN
assets/shaders/m2_ribbon.vert.spv
Normal file
Binary file not shown.
|
|
@ -40,23 +40,27 @@ void main() {
|
|||
float cs = cos(push.rotation);
|
||||
float sn = sin(push.rotation);
|
||||
vec2 rotated = vec2(center.x * cs - center.y * sn, center.x * sn + center.y * cs);
|
||||
vec2 mapUV = push.playerUV + vec2(-rotated.x, rotated.y) * push.zoomRadius * 2.0;
|
||||
vec2 mapUV = push.playerUV + vec2(rotated.x, rotated.y) * push.zoomRadius * 2.0;
|
||||
|
||||
vec4 mapColor = texture(uComposite, mapUV);
|
||||
|
||||
// Player arrow
|
||||
float acs = cos(push.arrowRotation);
|
||||
float asn = sin(push.arrowRotation);
|
||||
vec2 ac = center;
|
||||
vec2 arrowPos = vec2(-(ac.x * acs - ac.y * asn), ac.x * asn + ac.y * acs);
|
||||
|
||||
vec2 tip = vec2(0.0, -0.04);
|
||||
vec2 left = vec2(-0.02, 0.02);
|
||||
vec2 right = vec2(0.02, 0.02);
|
||||
|
||||
if (pointInTriangle(arrowPos, tip, left, right)) {
|
||||
mapColor = vec4(1.0, 0.8, 0.0, 1.0);
|
||||
// Single player direction indicator (center arrow) rendered in-shader.
|
||||
vec2 local = center; // [-0.5, 0.5] around minimap center
|
||||
float ac = cos(push.arrowRotation);
|
||||
float as = sin(push.arrowRotation);
|
||||
// TexCoord Y grows downward on screen; use negative Y so 0-angle points North (up).
|
||||
vec2 tip = vec2(0.0, -0.09);
|
||||
vec2 left = vec2(-0.045, 0.02);
|
||||
vec2 right = vec2( 0.045, 0.02);
|
||||
mat2 rot = mat2(ac, -as, as, ac);
|
||||
tip = rot * tip;
|
||||
left = rot * left;
|
||||
right = rot * right;
|
||||
if (pointInTriangle(local, tip, left, right)) {
|
||||
mapColor.rgb = vec3(1.0, 0.86, 0.05);
|
||||
}
|
||||
float centerDot = smoothstep(0.016, 0.0, length(local));
|
||||
mapColor.rgb = mix(mapColor.rgb, vec3(1.0), centerDot * 0.95);
|
||||
|
||||
// Dark border ring
|
||||
float border = smoothstep(0.48, 0.5, dist);
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -6,5 +6,7 @@ void main() {
|
|||
// Fullscreen triangle trick: 3 vertices, no vertex buffer
|
||||
TexCoord = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
|
||||
gl_Position = vec4(TexCoord * 2.0 - 1.0, 0.0, 1.0);
|
||||
TexCoord.y = 1.0 - TexCoord.y; // flip Y for Vulkan
|
||||
// No Y-flip: scene textures use Vulkan convention (v=0 at top),
|
||||
// and NDC y=-1 already maps to framebuffer top, so the triangle
|
||||
// naturally samples the correct row without any inversion.
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -5,6 +5,7 @@ layout(set = 1, binding = 0) uniform sampler2D markerTexture;
|
|||
layout(push_constant) uniform Push {
|
||||
mat4 model;
|
||||
float alpha;
|
||||
float grayscale; // 0 = full colour, 1 = fully desaturated (trivial quests)
|
||||
} push;
|
||||
|
||||
layout(location = 0) in vec2 TexCoord;
|
||||
|
|
@ -14,5 +15,7 @@ layout(location = 0) out vec4 outColor;
|
|||
void main() {
|
||||
vec4 texColor = texture(markerTexture, TexCoord);
|
||||
if (texColor.a < 0.1) discard;
|
||||
outColor = vec4(texColor.rgb, texColor.a * push.alpha);
|
||||
float lum = dot(texColor.rgb, vec3(0.299, 0.587, 0.114));
|
||||
vec3 rgb = mix(texColor.rgb, vec3(lum), push.grayscale);
|
||||
outColor = vec4(rgb, texColor.a * push.alpha);
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -29,6 +29,9 @@ layout(set = 1, binding = 1) uniform WMOMaterial {
|
|||
float heightMapVariance;
|
||||
float normalMapStrength;
|
||||
int isLava;
|
||||
float wmoAmbientR;
|
||||
float wmoAmbientG;
|
||||
float wmoAmbientB;
|
||||
};
|
||||
|
||||
layout(set = 1, binding = 2) uniform sampler2D uNormalHeightMap;
|
||||
|
|
@ -149,21 +152,21 @@ void main() {
|
|||
vec3 norm = vertexNormal;
|
||||
if (enableNormalMap != 0 && lodFactor < 0.99 && normalMapStrength > 0.001) {
|
||||
vec3 mapNormal = texture(uNormalHeightMap, finalUV).rgb * 2.0 - 1.0;
|
||||
// Scale XY by strength to control effect intensity
|
||||
mapNormal.xy *= normalMapStrength;
|
||||
mapNormal = normalize(mapNormal);
|
||||
vec3 worldNormal = normalize(TBN * mapNormal);
|
||||
if (!gl_FrontFacing) worldNormal = -worldNormal;
|
||||
// Blend: strength + LOD both contribute to fade toward vertex normal
|
||||
float blendFactor = max(lodFactor, 1.0 - normalMapStrength);
|
||||
norm = normalize(mix(worldNormal, vertexNormal, blendFactor));
|
||||
// Linear blend: strength controls how much normal map detail shows,
|
||||
// LOD fades out at distance. Both multiply for smooth falloff.
|
||||
float blend = clamp(normalMapStrength, 0.0, 1.0) * (1.0 - lodFactor);
|
||||
norm = normalize(mix(vertexNormal, worldNormal, blend));
|
||||
}
|
||||
|
||||
vec3 result;
|
||||
|
||||
// Sample shadow map — skip for interior WMO groups (no sun indoors)
|
||||
// Sample shadow map for all WMO groups (interior groups with 0x2000 flag
|
||||
// include covered outdoor areas like archways/streets that should receive shadows)
|
||||
float shadow = 1.0;
|
||||
if (shadowParams.x > 0.5 && isInterior == 0) {
|
||||
if (shadowParams.x > 0.5) {
|
||||
vec3 ldir = normalize(-lightDir.xyz);
|
||||
float normalOffset = SHADOW_TEXEL * 2.0 * (1.0 - abs(dot(norm, ldir)));
|
||||
vec3 biasedPos = FragPos + norm * normalOffset;
|
||||
|
|
@ -185,7 +188,13 @@ void main() {
|
|||
} else if (unlit != 0) {
|
||||
result = texColor.rgb * shadow;
|
||||
} else if (isInterior != 0) {
|
||||
vec3 mocv = max(VertColor.rgb, vec3(0.5));
|
||||
// WMO interior: vertex colors (MOCV) are pre-baked lighting from the artist.
|
||||
// The MOHD ambient color tints/floors the vertex colors so dark spots don't
|
||||
// go completely black, matching the WoW client's interior shading.
|
||||
vec3 wmoAmbient = vec3(wmoAmbientR, wmoAmbientG, wmoAmbientB);
|
||||
// Clamp ambient to at least 0.3 to avoid total darkness when MOHD color is zero
|
||||
wmoAmbient = max(wmoAmbient, vec3(0.3));
|
||||
vec3 mocv = max(VertColor.rgb, wmoAmbient);
|
||||
result = texColor.rgb * mocv * shadow;
|
||||
} else {
|
||||
vec3 ldir = normalize(-lightDir.xyz);
|
||||
|
|
|
|||
Binary file not shown.
40
build.ps1
40
build.ps1
|
|
@ -12,7 +12,47 @@ $ErrorActionPreference = "Stop"
|
|||
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||
Set-Location $ScriptDir
|
||||
|
||||
function Ensure-Fsr2Sdk {
|
||||
$sdkDir = Join-Path $ScriptDir "extern\FidelityFX-FSR2"
|
||||
$sdkHeader = Join-Path $sdkDir "src\ffx-fsr2-api\ffx_fsr2.h"
|
||||
if (Test-Path $sdkHeader) { return }
|
||||
|
||||
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
||||
Write-Warning "git not found; cannot auto-fetch AMD FSR2 SDK."
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Fetching AMD FidelityFX FSR2 SDK into $sdkDir ..."
|
||||
New-Item -ItemType Directory -Path (Join-Path $ScriptDir "extern") -Force | Out-Null
|
||||
& git clone --depth 1 https://github.com/GPUOpen-Effects/FidelityFX-FSR2.git $sdkDir
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Warning "Failed to clone AMD FSR2 SDK. Build will use internal fallback path."
|
||||
}
|
||||
}
|
||||
|
||||
function Ensure-FidelityFxSdk {
|
||||
$sdkDir = Join-Path $ScriptDir "extern\FidelityFX-SDK"
|
||||
$sdkHeader = Join-Path $sdkDir "sdk\include\FidelityFX\host\ffx_frameinterpolation.h"
|
||||
$sdkRepo = if ($env:WOWEE_FFX_SDK_REPO) { $env:WOWEE_FFX_SDK_REPO } else { "https://github.com/Kelsidavis/FidelityFX-SDK.git" }
|
||||
$sdkRef = if ($env:WOWEE_FFX_SDK_REF) { $env:WOWEE_FFX_SDK_REF } else { "main" }
|
||||
if (Test-Path $sdkHeader) { return }
|
||||
|
||||
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
||||
Write-Warning "git not found; cannot auto-fetch AMD FidelityFX SDK."
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Fetching AMD FidelityFX SDK ($sdkRef from $sdkRepo) into $sdkDir ..."
|
||||
New-Item -ItemType Directory -Path (Join-Path $ScriptDir "extern") -Force | Out-Null
|
||||
& git clone --depth 1 --branch $sdkRef $sdkRepo $sdkDir
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Warning "Failed to clone AMD FidelityFX SDK. FSR3 framegen extern will be unavailable."
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "Building wowee..."
|
||||
Ensure-Fsr2Sdk
|
||||
Ensure-FidelityFxSdk
|
||||
|
||||
# Create build directory if it doesn't exist
|
||||
if (-not (Test-Path "build")) {
|
||||
|
|
|
|||
38
build.sh
38
build.sh
|
|
@ -5,7 +5,45 @@ set -e # Exit on error
|
|||
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
ensure_fsr2_sdk() {
|
||||
local sdk_dir="extern/FidelityFX-FSR2"
|
||||
local sdk_header="$sdk_dir/src/ffx-fsr2-api/ffx_fsr2.h"
|
||||
if [ -f "$sdk_header" ]; then
|
||||
return
|
||||
fi
|
||||
if ! command -v git >/dev/null 2>&1; then
|
||||
echo "Warning: git not found; cannot auto-fetch AMD FSR2 SDK."
|
||||
return
|
||||
fi
|
||||
echo "Fetching AMD FidelityFX FSR2 SDK into $sdk_dir ..."
|
||||
mkdir -p extern
|
||||
git clone --depth 1 https://github.com/GPUOpen-Effects/FidelityFX-FSR2.git "$sdk_dir" || {
|
||||
echo "Warning: failed to clone AMD FSR2 SDK. Build will use internal fallback path."
|
||||
}
|
||||
}
|
||||
|
||||
ensure_fidelityfx_sdk() {
|
||||
local sdk_dir="extern/FidelityFX-SDK"
|
||||
local sdk_header="$sdk_dir/sdk/include/FidelityFX/host/ffx_frameinterpolation.h"
|
||||
local sdk_repo="${WOWEE_FFX_SDK_REPO:-https://github.com/Kelsidavis/FidelityFX-SDK.git}"
|
||||
local sdk_ref="${WOWEE_FFX_SDK_REF:-main}"
|
||||
if [ -f "$sdk_header" ]; then
|
||||
return
|
||||
fi
|
||||
if ! command -v git >/dev/null 2>&1; then
|
||||
echo "Warning: git not found; cannot auto-fetch AMD FidelityFX SDK."
|
||||
return
|
||||
fi
|
||||
echo "Fetching AMD FidelityFX SDK ($sdk_ref from $sdk_repo) into $sdk_dir ..."
|
||||
mkdir -p extern
|
||||
git clone --depth 1 --branch "$sdk_ref" "$sdk_repo" "$sdk_dir" || {
|
||||
echo "Warning: failed to clone AMD FidelityFX SDK. FSR3 framegen extern will be unavailable."
|
||||
}
|
||||
}
|
||||
|
||||
echo "Building wowee..."
|
||||
ensure_fsr2_sdk
|
||||
ensure_fidelityfx_sdk
|
||||
|
||||
# Create build directory if it doesn't exist
|
||||
mkdir -p build
|
||||
|
|
|
|||
87
docs/AMD_FSR2_INTEGRATION.md
Normal file
87
docs/AMD_FSR2_INTEGRATION.md
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
# AMD FSR2 Integration Notes
|
||||
|
||||
WoWee supports two FSR2 backends at runtime:
|
||||
|
||||
- `AMD FidelityFX SDK` backend (preferred when available).
|
||||
- `Internal fallback` backend (used when AMD SDK prerequisites are not met).
|
||||
|
||||
## SDK Location
|
||||
|
||||
AMD SDK checkout path:
|
||||
|
||||
`extern/FidelityFX-FSR2`
|
||||
|
||||
FidelityFX SDK checkout path (framegen extern):
|
||||
|
||||
`extern/FidelityFX-SDK` (default branch `main` from WoWee's fork in build scripts and CI)
|
||||
|
||||
Override knobs for local build scripts:
|
||||
|
||||
- `WOWEE_FFX_SDK_REPO` (default: `https://github.com/Kelsidavis/FidelityFX-SDK.git`)
|
||||
- `WOWEE_FFX_SDK_REF` (default: `main`)
|
||||
|
||||
Detection expects:
|
||||
|
||||
- `extern/FidelityFX-FSR2/src/ffx-fsr2-api/ffx_fsr2.h`
|
||||
- `extern/FidelityFX-FSR2/src/ffx-fsr2-api/vk/shaders/ffx_fsr2_accumulate_pass_permutations.h`
|
||||
- If permutation headers are missing in the SDK checkout, WoWee CMake copies a vendored snapshot from:
|
||||
- `third_party/fsr2_vk_permutations`
|
||||
|
||||
## Build Flags
|
||||
|
||||
- `WOWEE_ENABLE_AMD_FSR2=ON` (default): attempt AMD backend integration.
|
||||
- `WOWEE_ENABLE_AMD_FSR3_FRAMEGEN=ON` (default): build AMD FSR3 framegen interface probe when FidelityFX-SDK headers are present.
|
||||
- `WOWEE_HAS_AMD_FSR2` compile define:
|
||||
- `1` when AMD SDK prerequisites are present.
|
||||
- `0` when missing, in which case internal fallback remains active.
|
||||
- `WOWEE_HAS_AMD_FSR3_FRAMEGEN` compile define:
|
||||
- `1` when FidelityFX-SDK FI/OF/FSR3+VK headers are detected.
|
||||
- `0` when headers are missing (probe target disabled).
|
||||
|
||||
Runtime note:
|
||||
|
||||
- Renderer/UI expose a persisted experimental framegen toggle.
|
||||
- Runtime loader is Path A only (official AMD runtime library).
|
||||
- Path A runtime build now auto-runs `tools/generate_ffx_sdk_vk_permutations.sh` to ensure required VK permutation headers exist for FSR2/FSR3 upscaler shader blobs.
|
||||
- You can point to an explicit runtime binary with:
|
||||
- `WOWEE_FFX_SDK_RUNTIME_LIB=/absolute/path/to/libffx_fsr3_vk.so` (or `.dll` / `.dylib`).
|
||||
- If no official runtime is found, frame generation is disabled cleanly (Path C).
|
||||
|
||||
|
||||
## Current Status
|
||||
|
||||
- AMD FSR2 Vulkan dispatch path is integrated and used when available.
|
||||
- UI displays active backend in settings (`AMD FidelityFX SDK` or `Internal fallback`).
|
||||
- Runtime settings include persisted FSR2 jitter tuning.
|
||||
- FidelityFX-SDK extern is fetched across platforms (default: `Kelsidavis/FidelityFX-SDK` on `main`).
|
||||
- Startup safety behavior remains enabled:
|
||||
- persisted FSR2 is deferred until `IN_WORLD`
|
||||
- startup falls back unless `WOWEE_ALLOW_STARTUP_FSR2=1`
|
||||
|
||||
## FSR Defaults
|
||||
|
||||
- Quality default: `Native (100%)`
|
||||
- UI quality order: `Native`, `Ultra Quality`, `Quality`, `Balanced`
|
||||
- Default sharpness: `1.6`
|
||||
- Default FSR2 jitter sign: `0.38`
|
||||
- Performance preset is intentionally removed.
|
||||
|
||||
## CI Notes
|
||||
|
||||
- `build-linux-amd-fsr2` clones AMD's repository and configures with `WOWEE_ENABLE_AMD_FSR2=ON`.
|
||||
- All build jobs clone:
|
||||
- `GPUOpen-Effects/FidelityFX-FSR2` (`master`)
|
||||
- `Kelsidavis/FidelityFX-SDK` (`main`) by default
|
||||
- Linux CI validates FidelityFX-SDK Kits framegen headers:
|
||||
- `upscalers/fsr3/include/ffx_fsr3upscaler.h`
|
||||
- `framegeneration/fsr3/include/ffx_frameinterpolation.h`
|
||||
- `framegeneration/fsr3/include/ffx_opticalflow.h`
|
||||
- `backend/vk/ffx_vk.h`
|
||||
- Runtime build path auto-bootstrap:
|
||||
- Linux downloads DXC automatically when missing.
|
||||
- Windows (MSYS2) downloads DXC automatically when missing.
|
||||
- macOS expects `dxc` to be available in `PATH` (CI installs it via Homebrew).
|
||||
- CI builds `wowee_fsr3_framegen_amd_vk_probe` when that target is generated by CMake for the detected SDK layout.
|
||||
- Some upstream SDK checkouts do not include generated Vulkan permutation headers.
|
||||
- WoWee bootstraps those headers from the vendored snapshot so AMD backend builds remain cross-platform and deterministic.
|
||||
- If SDK headers are missing entirely, WoWee still falls back to the internal backend.
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
# Project Status
|
||||
|
||||
**Last updated**: 2026-02-19
|
||||
**Last updated**: 2026-03-24
|
||||
|
||||
## What This Repo Is
|
||||
|
||||
|
|
@ -11,23 +11,37 @@ Wowee is a native C++ World of Warcraft client experiment focused on connecting
|
|||
Implemented (working in normal use):
|
||||
|
||||
- Auth flow: SRP6a auth + realm list + world connect with header encryption
|
||||
- Rendering: terrain, WMO/M2 rendering, water, sky system, particles, minimap/world map, loading video playback
|
||||
- Character system: creation (including nonbinary gender), selection, 3D preview with equipment, character screen
|
||||
- Core gameplay: movement, targeting, combat, action bar, inventory/equipment, chat (tabs/channels, emotes, item links)
|
||||
- Quests: quest markers (! and ?) on NPCs/minimap, quest log with detail queries/retry, objective tracking, accept/complete flow, turn-in
|
||||
- Rendering: terrain, WMO/M2, water/magma/slime (FBM noise shaders), sky system, particles, shadow mapping, minimap/world map, loading video playback
|
||||
- Instances: WDT parser, WMO-only dungeon maps, area trigger portals with glow/spin effects, zone transitions
|
||||
- Character system: creation (including nonbinary gender), selection, 3D preview with equipment, character screen, per-instance NPC hair/skin textures
|
||||
- Core gameplay: movement (with ACK responses), targeting (hostility-filtered tab-cycle), combat, action bar, inventory/equipment, chat (tabs/channels, emotes, item links)
|
||||
- Quests: quest markers (! and ?) on NPCs/minimap, quest log with detail queries/retry, objective tracking, accept/complete flow, turn-in, quest item progress
|
||||
- Trainers: spell trainer UI, buy spells, known/available/unavailable states
|
||||
- Vendors, loot, gossip dialogs (including buyback for most recently sold item)
|
||||
- Spellbook with class tabs, drag-drop to action bar, spell icons
|
||||
- Vendors, loot (including chest/gameobject loot), gossip dialogs (including buyback for most recently sold item)
|
||||
- Bank: full bank support for all expansions, bag slots, drag-drop, right-click deposit
|
||||
- Auction house: search with filters, pagination, sell picker, bid/buyout, tooltips
|
||||
- Mail: item attachment support for sending
|
||||
- Spellbook with specialty/general/profession/mount/companion tabs, drag-drop to action bar, spell icons, item use
|
||||
- Talent tree UI with proper visuals and functionality
|
||||
- Pet tracking (SMSG_PET_SPELLS), dismiss pet button
|
||||
- Party: group invites, party list, out-of-range member health (SMSG_PARTY_MEMBER_STATS)
|
||||
- Nameplates: NPC subtitles, guild names, elite/boss/rare borders, quest/raid indicators, cast bars, debuff dots
|
||||
- Floating combat text: world-space damage/heal numbers above entities with 3D projection
|
||||
- Target/focus frames: guild name, creature type, rank badges, combo points, cast bars
|
||||
- Map exploration: subzone-level fog-of-war reveal
|
||||
- Warden anti-cheat: full module execution via Unicorn Engine x86 emulation; module caching
|
||||
- Audio: ambient, movement, combat, spell, and UI sound systems
|
||||
- Bag UI: separate bag windows, open-bag indicator on bag bar, optional collapse-empty mode in aggregate bag view
|
||||
- Audio: ambient, movement, combat, spell, and UI sound systems; NPC voice lines for all playable races (greeting/farewell/vendor/pissed/aggro/flee)
|
||||
- Bag UI: independent bag windows (any bag closable independently), open-bag indicator on bag bar, server-synced bag sort, off-screen position reset, optional collapse-empty mode in aggregate view
|
||||
- DBC auto-detection: CharSections.dbc field layout auto-detected at runtime (handles stock WotLK vs HD-textured clients)
|
||||
- Multi-expansion: Classic/Vanilla, TBC, WotLK, and Turtle WoW (1.17) protocol and asset variants
|
||||
- CI: GitHub Actions for Linux (x86-64, ARM64), Windows (MSYS2 x86-64 + ARM64), macOS (ARM64); container builds via Podman
|
||||
|
||||
In progress / known gaps:
|
||||
|
||||
- Transports (ships, zeppelins, elevators): partial support, timing and edge cases still buggy
|
||||
- 3D positional audio: not implemented (mono/stereo only)
|
||||
- Visual edge cases: some M2/WMO rendering gaps (character shin mesh, some particle effects)
|
||||
- Transports: M2 transports (trams) working with position-delta riding; WMO transports (ships, zeppelins) working with path following; some edge cases remain
|
||||
- Quest GO interaction: CMSG_GAMEOBJ_USE + CMSG_LOOT sent correctly, but some AzerothCore/ChromieCraft servers don't grant quest credit for chest-type GOs (server-side limitation)
|
||||
- Visual edge cases: some M2/WMO rendering gaps (some particle effects)
|
||||
- Water refraction: enabled by default; srcAccessMask barrier fix (2026-03-18) resolved prior VK_ERROR_DEVICE_LOST on AMD/Mali GPUs
|
||||
|
||||
## Where To Look
|
||||
|
||||
|
|
|
|||
34
extern/lua-5.1.5/COPYRIGHT
vendored
Normal file
34
extern/lua-5.1.5/COPYRIGHT
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
Lua License
|
||||
-----------
|
||||
|
||||
Lua is licensed under the terms of the MIT license reproduced below.
|
||||
This means that Lua is free software and can be used for both academic
|
||||
and commercial purposes at absolutely no cost.
|
||||
|
||||
For details and rationale, see http://www.lua.org/license.html .
|
||||
|
||||
===============================================================================
|
||||
|
||||
Copyright (C) 1994-2012 Lua.org, PUC-Rio.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
===============================================================================
|
||||
|
||||
(end of COPYRIGHT)
|
||||
183
extern/lua-5.1.5/HISTORY
vendored
Normal file
183
extern/lua-5.1.5/HISTORY
vendored
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
HISTORY for Lua 5.1
|
||||
|
||||
* Changes from version 5.0 to 5.1
|
||||
-------------------------------
|
||||
Language:
|
||||
+ new module system.
|
||||
+ new semantics for control variables of fors.
|
||||
+ new semantics for setn/getn.
|
||||
+ new syntax/semantics for varargs.
|
||||
+ new long strings and comments.
|
||||
+ new `mod' operator (`%')
|
||||
+ new length operator #t
|
||||
+ metatables for all types
|
||||
API:
|
||||
+ new functions: lua_createtable, lua_get(set)field, lua_push(to)integer.
|
||||
+ user supplies memory allocator (lua_open becomes lua_newstate).
|
||||
+ luaopen_* functions must be called through Lua.
|
||||
Implementation:
|
||||
+ new configuration scheme via luaconf.h.
|
||||
+ incremental garbage collection.
|
||||
+ better handling of end-of-line in the lexer.
|
||||
+ fully reentrant parser (new Lua function `load')
|
||||
+ better support for 64-bit machines.
|
||||
+ native loadlib support for Mac OS X.
|
||||
+ standard distribution in only one library (lualib.a merged into lua.a)
|
||||
|
||||
* Changes from version 4.0 to 5.0
|
||||
-------------------------------
|
||||
Language:
|
||||
+ lexical scoping.
|
||||
+ Lua coroutines.
|
||||
+ standard libraries now packaged in tables.
|
||||
+ tags replaced by metatables and tag methods replaced by metamethods,
|
||||
stored in metatables.
|
||||
+ proper tail calls.
|
||||
+ each function can have its own global table, which can be shared.
|
||||
+ new __newindex metamethod, called when we insert a new key into a table.
|
||||
+ new block comments: --[[ ... ]].
|
||||
+ new generic for.
|
||||
+ new weak tables.
|
||||
+ new boolean type.
|
||||
+ new syntax "local function".
|
||||
+ (f()) returns the first value returned by f.
|
||||
+ {f()} fills a table with all values returned by f.
|
||||
+ \n ignored in [[\n .
|
||||
+ fixed and-or priorities.
|
||||
+ more general syntax for function definition (e.g. function a.x.y:f()...end).
|
||||
+ more general syntax for function calls (e.g. (print or write)(9)).
|
||||
+ new functions (time/date, tmpfile, unpack, require, load*, etc.).
|
||||
API:
|
||||
+ chunks are loaded by using lua_load; new luaL_loadfile and luaL_loadbuffer.
|
||||
+ introduced lightweight userdata, a simple "void*" without a metatable.
|
||||
+ new error handling protocol: the core no longer prints error messages;
|
||||
all errors are reported to the caller on the stack.
|
||||
+ new lua_atpanic for host cleanup.
|
||||
+ new, signal-safe, hook scheme.
|
||||
Implementation:
|
||||
+ new license: MIT.
|
||||
+ new, faster, register-based virtual machine.
|
||||
+ support for external multithreading and coroutines.
|
||||
+ new and consistent error message format.
|
||||
+ the core no longer needs "stdio.h" for anything (except for a single
|
||||
use of sprintf to convert numbers to strings).
|
||||
+ lua.c now runs the environment variable LUA_INIT, if present. It can
|
||||
be "@filename", to run a file, or the chunk itself.
|
||||
+ support for user extensions in lua.c.
|
||||
sample implementation given for command line editing.
|
||||
+ new dynamic loading library, active by default on several platforms.
|
||||
+ safe garbage-collector metamethods.
|
||||
+ precompiled bytecodes checked for integrity (secure binary dostring).
|
||||
+ strings are fully aligned.
|
||||
+ position capture in string.find.
|
||||
+ read('*l') can read lines with embedded zeros.
|
||||
|
||||
* Changes from version 3.2 to 4.0
|
||||
-------------------------------
|
||||
Language:
|
||||
+ new "break" and "for" statements (both numerical and for tables).
|
||||
+ uniform treatment of globals: globals are now stored in a Lua table.
|
||||
+ improved error messages.
|
||||
+ no more '$debug': full speed *and* full debug information.
|
||||
+ new read form: read(N) for next N bytes.
|
||||
+ general read patterns now deprecated.
|
||||
(still available with -DCOMPAT_READPATTERNS.)
|
||||
+ all return values are passed as arguments for the last function
|
||||
(old semantics still available with -DLUA_COMPAT_ARGRET)
|
||||
+ garbage collection tag methods for tables now deprecated.
|
||||
+ there is now only one tag method for order.
|
||||
API:
|
||||
+ New API: fully re-entrant, simpler, and more efficient.
|
||||
+ New debug API.
|
||||
Implementation:
|
||||
+ faster than ever: cleaner virtual machine and new hashing algorithm.
|
||||
+ non-recursive garbage-collector algorithm.
|
||||
+ reduced memory usage for programs with many strings.
|
||||
+ improved treatment for memory allocation errors.
|
||||
+ improved support for 16-bit machines (we hope).
|
||||
+ code now compiles unmodified as both ANSI C and C++.
|
||||
+ numbers in bases other than 10 are converted using strtoul.
|
||||
+ new -f option in Lua to support #! scripts.
|
||||
+ luac can now combine text and binaries.
|
||||
|
||||
* Changes from version 3.1 to 3.2
|
||||
-------------------------------
|
||||
+ redirected all output in Lua's core to _ERRORMESSAGE and _ALERT.
|
||||
+ increased limit on the number of constants and globals per function
|
||||
(from 2^16 to 2^24).
|
||||
+ debugging info (lua_debug and hooks) moved into lua_state and new API
|
||||
functions provided to get and set this info.
|
||||
+ new debug lib gives full debugging access within Lua.
|
||||
+ new table functions "foreachi", "sort", "tinsert", "tremove", "getn".
|
||||
+ new io functions "flush", "seek".
|
||||
|
||||
* Changes from version 3.0 to 3.1
|
||||
-------------------------------
|
||||
+ NEW FEATURE: anonymous functions with closures (via "upvalues").
|
||||
+ new syntax:
|
||||
- local variables in chunks.
|
||||
- better scope control with DO block END.
|
||||
- constructors can now be also written: { record-part; list-part }.
|
||||
- more general syntax for function calls and lvalues, e.g.:
|
||||
f(x).y=1
|
||||
o:f(x,y):g(z)
|
||||
f"string" is sugar for f("string")
|
||||
+ strings may now contain arbitrary binary data (e.g., embedded zeros).
|
||||
+ major code re-organization and clean-up; reduced module interdependecies.
|
||||
+ no arbitrary limits on the total number of constants and globals.
|
||||
+ support for multiple global contexts.
|
||||
+ better syntax error messages.
|
||||
+ new traversal functions "foreach" and "foreachvar".
|
||||
+ the default for numbers is now double.
|
||||
changing it to use floats or longs is easy.
|
||||
+ complete debug information stored in pre-compiled chunks.
|
||||
+ sample interpreter now prompts user when run interactively, and also
|
||||
handles control-C interruptions gracefully.
|
||||
|
||||
* Changes from version 2.5 to 3.0
|
||||
-------------------------------
|
||||
+ NEW CONCEPT: "tag methods".
|
||||
Tag methods replace fallbacks as the meta-mechanism for extending the
|
||||
semantics of Lua. Whereas fallbacks had a global nature, tag methods
|
||||
work on objects having the same tag (e.g., groups of tables).
|
||||
Existing code that uses fallbacks should work without change.
|
||||
+ new, general syntax for constructors {[exp] = exp, ... }.
|
||||
+ support for handling variable number of arguments in functions (varargs).
|
||||
+ support for conditional compilation ($if ... $else ... $end).
|
||||
+ cleaner semantics in API simplifies host code.
|
||||
+ better support for writing libraries (auxlib.h).
|
||||
+ better type checking and error messages in the standard library.
|
||||
+ luac can now also undump.
|
||||
|
||||
* Changes from version 2.4 to 2.5
|
||||
-------------------------------
|
||||
+ io and string libraries are now based on pattern matching;
|
||||
the old libraries are still available for compatibility
|
||||
+ dofile and dostring can now return values (via return statement)
|
||||
+ better support for 16- and 64-bit machines
|
||||
+ expanded documentation, with more examples
|
||||
|
||||
* Changes from version 2.2 to 2.4
|
||||
-------------------------------
|
||||
+ external compiler creates portable binary files that can be loaded faster
|
||||
+ interface for debugging and profiling
|
||||
+ new "getglobal" fallback
|
||||
+ new functions for handling references to Lua objects
|
||||
+ new functions in standard lib
|
||||
+ only one copy of each string is stored
|
||||
+ expanded documentation, with more examples
|
||||
|
||||
* Changes from version 2.1 to 2.2
|
||||
-------------------------------
|
||||
+ functions now may be declared with any "lvalue" as a name
|
||||
+ garbage collection of functions
|
||||
+ support for pipes
|
||||
|
||||
* Changes from version 1.1 to 2.1
|
||||
-------------------------------
|
||||
+ object-oriented support
|
||||
+ fallbacks
|
||||
+ simplified syntax for tables
|
||||
+ many internal improvements
|
||||
|
||||
(end of HISTORY)
|
||||
99
extern/lua-5.1.5/INSTALL
vendored
Normal file
99
extern/lua-5.1.5/INSTALL
vendored
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
INSTALL for Lua 5.1
|
||||
|
||||
* Building Lua
|
||||
------------
|
||||
Lua is built in the src directory, but the build process can be
|
||||
controlled from the top-level Makefile.
|
||||
|
||||
Building Lua on Unix systems should be very easy. First do "make" and
|
||||
see if your platform is listed. If so, just do "make xxx", where xxx
|
||||
is your platform name. The platforms currently supported are:
|
||||
aix ansi bsd freebsd generic linux macosx mingw posix solaris
|
||||
|
||||
If your platform is not listed, try the closest one or posix, generic,
|
||||
ansi, in this order.
|
||||
|
||||
See below for customization instructions and for instructions on how
|
||||
to build with other Windows compilers.
|
||||
|
||||
If you want to check that Lua has been built correctly, do "make test"
|
||||
after building Lua. Also, have a look at the example programs in test.
|
||||
|
||||
* Installing Lua
|
||||
--------------
|
||||
Once you have built Lua, you may want to install it in an official
|
||||
place in your system. In this case, do "make install". The official
|
||||
place and the way to install files are defined in Makefile. You must
|
||||
have the right permissions to install files.
|
||||
|
||||
If you want to build and install Lua in one step, do "make xxx install",
|
||||
where xxx is your platform name.
|
||||
|
||||
If you want to install Lua locally, then do "make local". This will
|
||||
create directories bin, include, lib, man, and install Lua there as
|
||||
follows:
|
||||
|
||||
bin: lua luac
|
||||
include: lua.h luaconf.h lualib.h lauxlib.h lua.hpp
|
||||
lib: liblua.a
|
||||
man/man1: lua.1 luac.1
|
||||
|
||||
These are the only directories you need for development.
|
||||
|
||||
There are man pages for lua and luac, in both nroff and html, and a
|
||||
reference manual in html in doc, some sample code in test, and some
|
||||
useful stuff in etc. You don't need these directories for development.
|
||||
|
||||
If you want to install Lua locally, but in some other directory, do
|
||||
"make install INSTALL_TOP=xxx", where xxx is your chosen directory.
|
||||
|
||||
See below for instructions for Windows and other systems.
|
||||
|
||||
* Customization
|
||||
-------------
|
||||
Three things can be customized by editing a file:
|
||||
- Where and how to install Lua -- edit Makefile.
|
||||
- How to build Lua -- edit src/Makefile.
|
||||
- Lua features -- edit src/luaconf.h.
|
||||
|
||||
You don't actually need to edit the Makefiles because you may set the
|
||||
relevant variables when invoking make.
|
||||
|
||||
On the other hand, if you need to select some Lua features, you'll need
|
||||
to edit src/luaconf.h. The edited file will be the one installed, and
|
||||
it will be used by any Lua clients that you build, to ensure consistency.
|
||||
|
||||
We strongly recommend that you enable dynamic loading. This is done
|
||||
automatically for all platforms listed above that have this feature
|
||||
(and also Windows). See src/luaconf.h and also src/Makefile.
|
||||
|
||||
* Building Lua on Windows and other systems
|
||||
-----------------------------------------
|
||||
If you're not using the usual Unix tools, then the instructions for
|
||||
building Lua depend on the compiler you use. You'll need to create
|
||||
projects (or whatever your compiler uses) for building the library,
|
||||
the interpreter, and the compiler, as follows:
|
||||
|
||||
library: lapi.c lcode.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c
|
||||
lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c
|
||||
ltable.c ltm.c lundump.c lvm.c lzio.c
|
||||
lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c loslib.c
|
||||
ltablib.c lstrlib.c loadlib.c linit.c
|
||||
|
||||
interpreter: library, lua.c
|
||||
|
||||
compiler: library, luac.c print.c
|
||||
|
||||
If you use Visual Studio .NET, you can use etc/luavs.bat in its
|
||||
"Command Prompt".
|
||||
|
||||
If all you want is to build the Lua interpreter, you may put all .c files
|
||||
in a single project, except for luac.c and print.c. Or just use etc/all.c.
|
||||
|
||||
To use Lua as a library in your own programs, you'll need to know how to
|
||||
create and use libraries with your compiler.
|
||||
|
||||
As mentioned above, you may edit luaconf.h to select some features before
|
||||
building Lua.
|
||||
|
||||
(end of INSTALL)
|
||||
128
extern/lua-5.1.5/Makefile
vendored
Normal file
128
extern/lua-5.1.5/Makefile
vendored
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
# makefile for installing Lua
|
||||
# see INSTALL for installation instructions
|
||||
# see src/Makefile and src/luaconf.h for further customization
|
||||
|
||||
# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
|
||||
|
||||
# Your platform. See PLATS for possible values.
|
||||
PLAT= none
|
||||
|
||||
# Where to install. The installation starts in the src and doc directories,
|
||||
# so take care if INSTALL_TOP is not an absolute path.
|
||||
INSTALL_TOP= /usr/local
|
||||
INSTALL_BIN= $(INSTALL_TOP)/bin
|
||||
INSTALL_INC= $(INSTALL_TOP)/include
|
||||
INSTALL_LIB= $(INSTALL_TOP)/lib
|
||||
INSTALL_MAN= $(INSTALL_TOP)/man/man1
|
||||
#
|
||||
# You probably want to make INSTALL_LMOD and INSTALL_CMOD consistent with
|
||||
# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h (and also with etc/lua.pc).
|
||||
INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V
|
||||
INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V
|
||||
|
||||
# How to install. If your install program does not support "-p", then you
|
||||
# may have to run ranlib on the installed liblua.a (do "make ranlib").
|
||||
INSTALL= install -p
|
||||
INSTALL_EXEC= $(INSTALL) -m 0755
|
||||
INSTALL_DATA= $(INSTALL) -m 0644
|
||||
#
|
||||
# If you don't have install you can use cp instead.
|
||||
# INSTALL= cp -p
|
||||
# INSTALL_EXEC= $(INSTALL)
|
||||
# INSTALL_DATA= $(INSTALL)
|
||||
|
||||
# Utilities.
|
||||
MKDIR= mkdir -p
|
||||
RANLIB= ranlib
|
||||
|
||||
# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE =========
|
||||
|
||||
# Convenience platforms targets.
|
||||
PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris
|
||||
|
||||
# What to install.
|
||||
TO_BIN= lua luac
|
||||
TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp
|
||||
TO_LIB= liblua.a
|
||||
TO_MAN= lua.1 luac.1
|
||||
|
||||
# Lua version and release.
|
||||
V= 5.1
|
||||
R= 5.1.5
|
||||
|
||||
all: $(PLAT)
|
||||
|
||||
$(PLATS) clean:
|
||||
cd src && $(MAKE) $@
|
||||
|
||||
test: dummy
|
||||
src/lua test/hello.lua
|
||||
|
||||
install: dummy
|
||||
cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD)
|
||||
cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN)
|
||||
cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC)
|
||||
cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB)
|
||||
cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN)
|
||||
|
||||
ranlib:
|
||||
cd src && cd $(INSTALL_LIB) && $(RANLIB) $(TO_LIB)
|
||||
|
||||
local:
|
||||
$(MAKE) install INSTALL_TOP=..
|
||||
|
||||
none:
|
||||
@echo "Please do"
|
||||
@echo " make PLATFORM"
|
||||
@echo "where PLATFORM is one of these:"
|
||||
@echo " $(PLATS)"
|
||||
@echo "See INSTALL for complete instructions."
|
||||
|
||||
# make may get confused with test/ and INSTALL in a case-insensitive OS
|
||||
dummy:
|
||||
|
||||
# echo config parameters
|
||||
echo:
|
||||
@echo ""
|
||||
@echo "These are the parameters currently set in src/Makefile to build Lua $R:"
|
||||
@echo ""
|
||||
@cd src && $(MAKE) -s echo
|
||||
@echo ""
|
||||
@echo "These are the parameters currently set in Makefile to install Lua $R:"
|
||||
@echo ""
|
||||
@echo "PLAT = $(PLAT)"
|
||||
@echo "INSTALL_TOP = $(INSTALL_TOP)"
|
||||
@echo "INSTALL_BIN = $(INSTALL_BIN)"
|
||||
@echo "INSTALL_INC = $(INSTALL_INC)"
|
||||
@echo "INSTALL_LIB = $(INSTALL_LIB)"
|
||||
@echo "INSTALL_MAN = $(INSTALL_MAN)"
|
||||
@echo "INSTALL_LMOD = $(INSTALL_LMOD)"
|
||||
@echo "INSTALL_CMOD = $(INSTALL_CMOD)"
|
||||
@echo "INSTALL_EXEC = $(INSTALL_EXEC)"
|
||||
@echo "INSTALL_DATA = $(INSTALL_DATA)"
|
||||
@echo ""
|
||||
@echo "See also src/luaconf.h ."
|
||||
@echo ""
|
||||
|
||||
# echo private config parameters
|
||||
pecho:
|
||||
@echo "V = $(V)"
|
||||
@echo "R = $(R)"
|
||||
@echo "TO_BIN = $(TO_BIN)"
|
||||
@echo "TO_INC = $(TO_INC)"
|
||||
@echo "TO_LIB = $(TO_LIB)"
|
||||
@echo "TO_MAN = $(TO_MAN)"
|
||||
|
||||
# echo config parameters as Lua code
|
||||
# uncomment the last sed expression if you want nil instead of empty strings
|
||||
lecho:
|
||||
@echo "-- installation parameters for Lua $R"
|
||||
@echo "VERSION = '$V'"
|
||||
@echo "RELEASE = '$R'"
|
||||
@$(MAKE) echo | grep = | sed -e 's/= /= "/' -e 's/$$/"/' #-e 's/""/nil/'
|
||||
@echo "-- EOF"
|
||||
|
||||
# list targets that do not create files (but not all makes understand .PHONY)
|
||||
.PHONY: all $(PLATS) clean test install local none dummy echo pecho lecho
|
||||
|
||||
# (end of Makefile)
|
||||
37
extern/lua-5.1.5/README
vendored
Normal file
37
extern/lua-5.1.5/README
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
README for Lua 5.1
|
||||
|
||||
See INSTALL for installation instructions.
|
||||
See HISTORY for a summary of changes since the last released version.
|
||||
|
||||
* What is Lua?
|
||||
------------
|
||||
Lua is a powerful, light-weight programming language designed for extending
|
||||
applications. Lua is also frequently used as a general-purpose, stand-alone
|
||||
language. Lua is free software.
|
||||
|
||||
For complete information, visit Lua's web site at http://www.lua.org/ .
|
||||
For an executive summary, see http://www.lua.org/about.html .
|
||||
|
||||
Lua has been used in many different projects around the world.
|
||||
For a short list, see http://www.lua.org/uses.html .
|
||||
|
||||
* Availability
|
||||
------------
|
||||
Lua is freely available for both academic and commercial purposes.
|
||||
See COPYRIGHT and http://www.lua.org/license.html for details.
|
||||
Lua can be downloaded at http://www.lua.org/download.html .
|
||||
|
||||
* Installation
|
||||
------------
|
||||
Lua is implemented in pure ANSI C, and compiles unmodified in all known
|
||||
platforms that have an ANSI C compiler. In most Unix-like platforms, simply
|
||||
do "make" with a suitable target. See INSTALL for detailed instructions.
|
||||
|
||||
* Origin
|
||||
------
|
||||
Lua is developed at Lua.org, a laboratory of the Department of Computer
|
||||
Science of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro
|
||||
in Brazil).
|
||||
For more information about the authors, see http://www.lua.org/authors.html .
|
||||
|
||||
(end of README)
|
||||
497
extern/lua-5.1.5/doc/contents.html
vendored
Normal file
497
extern/lua-5.1.5/doc/contents.html
vendored
Normal file
|
|
@ -0,0 +1,497 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Lua 5.1 Reference Manual - contents</TITLE>
|
||||
<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">
|
||||
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8">
|
||||
<STYLE TYPE="text/css">
|
||||
ul {
|
||||
list-style-type: none ;
|
||||
}
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
|
||||
<BODY>
|
||||
|
||||
<HR>
|
||||
<H1>
|
||||
<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="" BORDER=0></A>
|
||||
Lua 5.1 Reference Manual
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
The reference manual is the official definition of the Lua language.
|
||||
For a complete introduction to Lua programming, see the book
|
||||
<A HREF="http://www.lua.org/docs.html#pil">Programming in Lua</A>.
|
||||
|
||||
<P>
|
||||
This manual is also available as a book:
|
||||
<BLOCKQUOTE>
|
||||
<A HREF="http://www.amazon.com/exec/obidos/ASIN/8590379833/lua-indexmanual-20">
|
||||
<IMG SRC="cover.png" ALT="" TITLE="buy from Amazon" BORDER=1 ALIGN="left" HSPACE=12>
|
||||
</A>
|
||||
<B>Lua 5.1 Reference Manual</B>
|
||||
<BR>by R. Ierusalimschy, L. H. de Figueiredo, W. Celes
|
||||
<BR>Lua.org, August 2006
|
||||
<BR>ISBN 85-903798-3-3
|
||||
<BR CLEAR="all">
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<P>
|
||||
<A HREF="http://www.amazon.com/exec/obidos/ASIN/8590379833/lua-indexmanual-20">Buy a copy</A>
|
||||
of this book and
|
||||
<A HREF="http://www.lua.org/donations.html">help to support</A>
|
||||
the Lua project.
|
||||
|
||||
<P>
|
||||
<A HREF="manual.html">start</A>
|
||||
·
|
||||
<A HREF="#contents">contents</A>
|
||||
·
|
||||
<A HREF="#index">index</A>
|
||||
·
|
||||
<A HREF="http://www.lua.org/manual/">other versions</A>
|
||||
<HR>
|
||||
<SMALL>
|
||||
Copyright © 2006–2012 Lua.org, PUC-Rio.
|
||||
Freely available under the terms of the
|
||||
<A HREF="http://www.lua.org/license.html">Lua license</A>.
|
||||
</SMALL>
|
||||
|
||||
<H2><A NAME="contents">Contents</A></H2>
|
||||
<UL style="padding: 0">
|
||||
<LI><A HREF="manual.html">1 – Introduction</A>
|
||||
<P>
|
||||
<LI><A HREF="manual.html#2">2 – The Language</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#2.1">2.1 – Lexical Conventions</A>
|
||||
<LI><A HREF="manual.html#2.2">2.2 – Values and Types</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#2.2.1">2.2.1 – Coercion</A>
|
||||
</UL>
|
||||
<LI><A HREF="manual.html#2.3">2.3 – Variables</A>
|
||||
<LI><A HREF="manual.html#2.4">2.4 – Statements</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#2.4.1">2.4.1 – Chunks</A>
|
||||
<LI><A HREF="manual.html#2.4.2">2.4.2 – Blocks</A>
|
||||
<LI><A HREF="manual.html#2.4.3">2.4.3 – Assignment</A>
|
||||
<LI><A HREF="manual.html#2.4.4">2.4.4 – Control Structures</A>
|
||||
<LI><A HREF="manual.html#2.4.5">2.4.5 – For Statement</A>
|
||||
<LI><A HREF="manual.html#2.4.6">2.4.6 – Function Calls as Statements</A>
|
||||
<LI><A HREF="manual.html#2.4.7">2.4.7 – Local Declarations</A>
|
||||
</UL>
|
||||
<LI><A HREF="manual.html#2.5">2.5 – Expressions</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#2.5.1">2.5.1 – Arithmetic Operators</A>
|
||||
<LI><A HREF="manual.html#2.5.2">2.5.2 – Relational Operators</A>
|
||||
<LI><A HREF="manual.html#2.5.3">2.5.3 – Logical Operators</A>
|
||||
<LI><A HREF="manual.html#2.5.4">2.5.4 – Concatenation</A>
|
||||
<LI><A HREF="manual.html#2.5.5">2.5.5 – The Length Operator</A>
|
||||
<LI><A HREF="manual.html#2.5.6">2.5.6 – Precedence</A>
|
||||
<LI><A HREF="manual.html#2.5.7">2.5.7 – Table Constructors</A>
|
||||
<LI><A HREF="manual.html#2.5.8">2.5.8 – Function Calls</A>
|
||||
<LI><A HREF="manual.html#2.5.9">2.5.9 – Function Definitions</A>
|
||||
</UL>
|
||||
<LI><A HREF="manual.html#2.6">2.6 – Visibility Rules</A>
|
||||
<LI><A HREF="manual.html#2.7">2.7 – Error Handling</A>
|
||||
<LI><A HREF="manual.html#2.8">2.8 – Metatables</A>
|
||||
<LI><A HREF="manual.html#2.9">2.9 – Environments</A>
|
||||
<LI><A HREF="manual.html#2.10">2.10 – Garbage Collection</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#2.10.1">2.10.1 – Garbage-Collection Metamethods</A>
|
||||
<LI><A HREF="manual.html#2.10.2">2.10.2 – Weak Tables</A>
|
||||
</UL>
|
||||
<LI><A HREF="manual.html#2.11">2.11 – Coroutines</A>
|
||||
</UL>
|
||||
<P>
|
||||
<LI><A HREF="manual.html#3">3 – The Application Program Interface</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#3.1">3.1 – The Stack</A>
|
||||
<LI><A HREF="manual.html#3.2">3.2 – Stack Size</A>
|
||||
<LI><A HREF="manual.html#3.3">3.3 – Pseudo-Indices</A>
|
||||
<LI><A HREF="manual.html#3.4">3.4 – C Closures</A>
|
||||
<LI><A HREF="manual.html#3.5">3.5 – Registry</A>
|
||||
<LI><A HREF="manual.html#3.6">3.6 – Error Handling in C</A>
|
||||
<LI><A HREF="manual.html#3.7">3.7 – Functions and Types</A>
|
||||
<LI><A HREF="manual.html#3.8">3.8 – The Debug Interface</A>
|
||||
</UL>
|
||||
<P>
|
||||
<LI><A HREF="manual.html#4">4 – The Auxiliary Library</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#4.1">4.1 – Functions and Types</A>
|
||||
</UL>
|
||||
<P>
|
||||
<LI><A HREF="manual.html#5">5 – Standard Libraries</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#5.1">5.1 – Basic Functions</A>
|
||||
<LI><A HREF="manual.html#5.2">5.2 – Coroutine Manipulation</A>
|
||||
<LI><A HREF="manual.html#5.3">5.3 – Modules</A>
|
||||
<LI><A HREF="manual.html#5.4">5.4 – String Manipulation</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#5.4.1">5.4.1 – Patterns</A>
|
||||
</UL>
|
||||
<LI><A HREF="manual.html#5.5">5.5 – Table Manipulation</A>
|
||||
<LI><A HREF="manual.html#5.6">5.6 – Mathematical Functions</A>
|
||||
<LI><A HREF="manual.html#5.7">5.7 – Input and Output Facilities</A>
|
||||
<LI><A HREF="manual.html#5.8">5.8 – Operating System Facilities</A>
|
||||
<LI><A HREF="manual.html#5.9">5.9 – The Debug Library</A>
|
||||
</UL>
|
||||
<P>
|
||||
<LI><A HREF="manual.html#6">6 – Lua Stand-alone</A>
|
||||
<P>
|
||||
<LI><A HREF="manual.html#7">7 – Incompatibilities with the Previous Version</A>
|
||||
<UL>
|
||||
<LI><A HREF="manual.html#7.1">7.1 – Changes in the Language</A>
|
||||
<LI><A HREF="manual.html#7.2">7.2 – Changes in the Libraries</A>
|
||||
<LI><A HREF="manual.html#7.3">7.3 – Changes in the API</A>
|
||||
</UL>
|
||||
<P>
|
||||
<LI><A HREF="manual.html#8">8 – The Complete Syntax of Lua</A>
|
||||
</UL>
|
||||
|
||||
<H2><A NAME="index">Index</A></H2>
|
||||
<TABLE WIDTH="100%">
|
||||
<TR VALIGN="top">
|
||||
<TD>
|
||||
<H3><A NAME="functions">Lua functions</A></H3>
|
||||
<A HREF="manual.html#pdf-_G">_G</A><BR>
|
||||
<A HREF="manual.html#pdf-_VERSION">_VERSION</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-assert">assert</A><BR>
|
||||
<A HREF="manual.html#pdf-collectgarbage">collectgarbage</A><BR>
|
||||
<A HREF="manual.html#pdf-dofile">dofile</A><BR>
|
||||
<A HREF="manual.html#pdf-error">error</A><BR>
|
||||
<A HREF="manual.html#pdf-getfenv">getfenv</A><BR>
|
||||
<A HREF="manual.html#pdf-getmetatable">getmetatable</A><BR>
|
||||
<A HREF="manual.html#pdf-ipairs">ipairs</A><BR>
|
||||
<A HREF="manual.html#pdf-load">load</A><BR>
|
||||
<A HREF="manual.html#pdf-loadfile">loadfile</A><BR>
|
||||
<A HREF="manual.html#pdf-loadstring">loadstring</A><BR>
|
||||
<A HREF="manual.html#pdf-module">module</A><BR>
|
||||
<A HREF="manual.html#pdf-next">next</A><BR>
|
||||
<A HREF="manual.html#pdf-pairs">pairs</A><BR>
|
||||
<A HREF="manual.html#pdf-pcall">pcall</A><BR>
|
||||
<A HREF="manual.html#pdf-print">print</A><BR>
|
||||
<A HREF="manual.html#pdf-rawequal">rawequal</A><BR>
|
||||
<A HREF="manual.html#pdf-rawget">rawget</A><BR>
|
||||
<A HREF="manual.html#pdf-rawset">rawset</A><BR>
|
||||
<A HREF="manual.html#pdf-require">require</A><BR>
|
||||
<A HREF="manual.html#pdf-select">select</A><BR>
|
||||
<A HREF="manual.html#pdf-setfenv">setfenv</A><BR>
|
||||
<A HREF="manual.html#pdf-setmetatable">setmetatable</A><BR>
|
||||
<A HREF="manual.html#pdf-tonumber">tonumber</A><BR>
|
||||
<A HREF="manual.html#pdf-tostring">tostring</A><BR>
|
||||
<A HREF="manual.html#pdf-type">type</A><BR>
|
||||
<A HREF="manual.html#pdf-unpack">unpack</A><BR>
|
||||
<A HREF="manual.html#pdf-xpcall">xpcall</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-coroutine.create">coroutine.create</A><BR>
|
||||
<A HREF="manual.html#pdf-coroutine.resume">coroutine.resume</A><BR>
|
||||
<A HREF="manual.html#pdf-coroutine.running">coroutine.running</A><BR>
|
||||
<A HREF="manual.html#pdf-coroutine.status">coroutine.status</A><BR>
|
||||
<A HREF="manual.html#pdf-coroutine.wrap">coroutine.wrap</A><BR>
|
||||
<A HREF="manual.html#pdf-coroutine.yield">coroutine.yield</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-debug.debug">debug.debug</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.getfenv">debug.getfenv</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.gethook">debug.gethook</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.getinfo">debug.getinfo</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.getlocal">debug.getlocal</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.getmetatable">debug.getmetatable</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.getregistry">debug.getregistry</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.getupvalue">debug.getupvalue</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.setfenv">debug.setfenv</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.sethook">debug.sethook</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.setlocal">debug.setlocal</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.setmetatable">debug.setmetatable</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.setupvalue">debug.setupvalue</A><BR>
|
||||
<A HREF="manual.html#pdf-debug.traceback">debug.traceback</A><BR>
|
||||
|
||||
</TD>
|
||||
<TD>
|
||||
<H3> </H3>
|
||||
<A HREF="manual.html#pdf-file:close">file:close</A><BR>
|
||||
<A HREF="manual.html#pdf-file:flush">file:flush</A><BR>
|
||||
<A HREF="manual.html#pdf-file:lines">file:lines</A><BR>
|
||||
<A HREF="manual.html#pdf-file:read">file:read</A><BR>
|
||||
<A HREF="manual.html#pdf-file:seek">file:seek</A><BR>
|
||||
<A HREF="manual.html#pdf-file:setvbuf">file:setvbuf</A><BR>
|
||||
<A HREF="manual.html#pdf-file:write">file:write</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-io.close">io.close</A><BR>
|
||||
<A HREF="manual.html#pdf-io.flush">io.flush</A><BR>
|
||||
<A HREF="manual.html#pdf-io.input">io.input</A><BR>
|
||||
<A HREF="manual.html#pdf-io.lines">io.lines</A><BR>
|
||||
<A HREF="manual.html#pdf-io.open">io.open</A><BR>
|
||||
<A HREF="manual.html#pdf-io.output">io.output</A><BR>
|
||||
<A HREF="manual.html#pdf-io.popen">io.popen</A><BR>
|
||||
<A HREF="manual.html#pdf-io.read">io.read</A><BR>
|
||||
<A HREF="manual.html#pdf-io.stderr">io.stderr</A><BR>
|
||||
<A HREF="manual.html#pdf-io.stdin">io.stdin</A><BR>
|
||||
<A HREF="manual.html#pdf-io.stdout">io.stdout</A><BR>
|
||||
<A HREF="manual.html#pdf-io.tmpfile">io.tmpfile</A><BR>
|
||||
<A HREF="manual.html#pdf-io.type">io.type</A><BR>
|
||||
<A HREF="manual.html#pdf-io.write">io.write</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-math.abs">math.abs</A><BR>
|
||||
<A HREF="manual.html#pdf-math.acos">math.acos</A><BR>
|
||||
<A HREF="manual.html#pdf-math.asin">math.asin</A><BR>
|
||||
<A HREF="manual.html#pdf-math.atan">math.atan</A><BR>
|
||||
<A HREF="manual.html#pdf-math.atan2">math.atan2</A><BR>
|
||||
<A HREF="manual.html#pdf-math.ceil">math.ceil</A><BR>
|
||||
<A HREF="manual.html#pdf-math.cos">math.cos</A><BR>
|
||||
<A HREF="manual.html#pdf-math.cosh">math.cosh</A><BR>
|
||||
<A HREF="manual.html#pdf-math.deg">math.deg</A><BR>
|
||||
<A HREF="manual.html#pdf-math.exp">math.exp</A><BR>
|
||||
<A HREF="manual.html#pdf-math.floor">math.floor</A><BR>
|
||||
<A HREF="manual.html#pdf-math.fmod">math.fmod</A><BR>
|
||||
<A HREF="manual.html#pdf-math.frexp">math.frexp</A><BR>
|
||||
<A HREF="manual.html#pdf-math.huge">math.huge</A><BR>
|
||||
<A HREF="manual.html#pdf-math.ldexp">math.ldexp</A><BR>
|
||||
<A HREF="manual.html#pdf-math.log">math.log</A><BR>
|
||||
<A HREF="manual.html#pdf-math.log10">math.log10</A><BR>
|
||||
<A HREF="manual.html#pdf-math.max">math.max</A><BR>
|
||||
<A HREF="manual.html#pdf-math.min">math.min</A><BR>
|
||||
<A HREF="manual.html#pdf-math.modf">math.modf</A><BR>
|
||||
<A HREF="manual.html#pdf-math.pi">math.pi</A><BR>
|
||||
<A HREF="manual.html#pdf-math.pow">math.pow</A><BR>
|
||||
<A HREF="manual.html#pdf-math.rad">math.rad</A><BR>
|
||||
<A HREF="manual.html#pdf-math.random">math.random</A><BR>
|
||||
<A HREF="manual.html#pdf-math.randomseed">math.randomseed</A><BR>
|
||||
<A HREF="manual.html#pdf-math.sin">math.sin</A><BR>
|
||||
<A HREF="manual.html#pdf-math.sinh">math.sinh</A><BR>
|
||||
<A HREF="manual.html#pdf-math.sqrt">math.sqrt</A><BR>
|
||||
<A HREF="manual.html#pdf-math.tan">math.tan</A><BR>
|
||||
<A HREF="manual.html#pdf-math.tanh">math.tanh</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-os.clock">os.clock</A><BR>
|
||||
<A HREF="manual.html#pdf-os.date">os.date</A><BR>
|
||||
<A HREF="manual.html#pdf-os.difftime">os.difftime</A><BR>
|
||||
<A HREF="manual.html#pdf-os.execute">os.execute</A><BR>
|
||||
<A HREF="manual.html#pdf-os.exit">os.exit</A><BR>
|
||||
<A HREF="manual.html#pdf-os.getenv">os.getenv</A><BR>
|
||||
<A HREF="manual.html#pdf-os.remove">os.remove</A><BR>
|
||||
<A HREF="manual.html#pdf-os.rename">os.rename</A><BR>
|
||||
<A HREF="manual.html#pdf-os.setlocale">os.setlocale</A><BR>
|
||||
<A HREF="manual.html#pdf-os.time">os.time</A><BR>
|
||||
<A HREF="manual.html#pdf-os.tmpname">os.tmpname</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-package.cpath">package.cpath</A><BR>
|
||||
<A HREF="manual.html#pdf-package.loaded">package.loaded</A><BR>
|
||||
<A HREF="manual.html#pdf-package.loaders">package.loaders</A><BR>
|
||||
<A HREF="manual.html#pdf-package.loadlib">package.loadlib</A><BR>
|
||||
<A HREF="manual.html#pdf-package.path">package.path</A><BR>
|
||||
<A HREF="manual.html#pdf-package.preload">package.preload</A><BR>
|
||||
<A HREF="manual.html#pdf-package.seeall">package.seeall</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-string.byte">string.byte</A><BR>
|
||||
<A HREF="manual.html#pdf-string.char">string.char</A><BR>
|
||||
<A HREF="manual.html#pdf-string.dump">string.dump</A><BR>
|
||||
<A HREF="manual.html#pdf-string.find">string.find</A><BR>
|
||||
<A HREF="manual.html#pdf-string.format">string.format</A><BR>
|
||||
<A HREF="manual.html#pdf-string.gmatch">string.gmatch</A><BR>
|
||||
<A HREF="manual.html#pdf-string.gsub">string.gsub</A><BR>
|
||||
<A HREF="manual.html#pdf-string.len">string.len</A><BR>
|
||||
<A HREF="manual.html#pdf-string.lower">string.lower</A><BR>
|
||||
<A HREF="manual.html#pdf-string.match">string.match</A><BR>
|
||||
<A HREF="manual.html#pdf-string.rep">string.rep</A><BR>
|
||||
<A HREF="manual.html#pdf-string.reverse">string.reverse</A><BR>
|
||||
<A HREF="manual.html#pdf-string.sub">string.sub</A><BR>
|
||||
<A HREF="manual.html#pdf-string.upper">string.upper</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#pdf-table.concat">table.concat</A><BR>
|
||||
<A HREF="manual.html#pdf-table.insert">table.insert</A><BR>
|
||||
<A HREF="manual.html#pdf-table.maxn">table.maxn</A><BR>
|
||||
<A HREF="manual.html#pdf-table.remove">table.remove</A><BR>
|
||||
<A HREF="manual.html#pdf-table.sort">table.sort</A><BR>
|
||||
|
||||
</TD>
|
||||
<TD>
|
||||
<H3>C API</H3>
|
||||
<A HREF="manual.html#lua_Alloc">lua_Alloc</A><BR>
|
||||
<A HREF="manual.html#lua_CFunction">lua_CFunction</A><BR>
|
||||
<A HREF="manual.html#lua_Debug">lua_Debug</A><BR>
|
||||
<A HREF="manual.html#lua_Hook">lua_Hook</A><BR>
|
||||
<A HREF="manual.html#lua_Integer">lua_Integer</A><BR>
|
||||
<A HREF="manual.html#lua_Number">lua_Number</A><BR>
|
||||
<A HREF="manual.html#lua_Reader">lua_Reader</A><BR>
|
||||
<A HREF="manual.html#lua_State">lua_State</A><BR>
|
||||
<A HREF="manual.html#lua_Writer">lua_Writer</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#lua_atpanic">lua_atpanic</A><BR>
|
||||
<A HREF="manual.html#lua_call">lua_call</A><BR>
|
||||
<A HREF="manual.html#lua_checkstack">lua_checkstack</A><BR>
|
||||
<A HREF="manual.html#lua_close">lua_close</A><BR>
|
||||
<A HREF="manual.html#lua_concat">lua_concat</A><BR>
|
||||
<A HREF="manual.html#lua_cpcall">lua_cpcall</A><BR>
|
||||
<A HREF="manual.html#lua_createtable">lua_createtable</A><BR>
|
||||
<A HREF="manual.html#lua_dump">lua_dump</A><BR>
|
||||
<A HREF="manual.html#lua_equal">lua_equal</A><BR>
|
||||
<A HREF="manual.html#lua_error">lua_error</A><BR>
|
||||
<A HREF="manual.html#lua_gc">lua_gc</A><BR>
|
||||
<A HREF="manual.html#lua_getallocf">lua_getallocf</A><BR>
|
||||
<A HREF="manual.html#lua_getfenv">lua_getfenv</A><BR>
|
||||
<A HREF="manual.html#lua_getfield">lua_getfield</A><BR>
|
||||
<A HREF="manual.html#lua_getglobal">lua_getglobal</A><BR>
|
||||
<A HREF="manual.html#lua_gethook">lua_gethook</A><BR>
|
||||
<A HREF="manual.html#lua_gethookcount">lua_gethookcount</A><BR>
|
||||
<A HREF="manual.html#lua_gethookmask">lua_gethookmask</A><BR>
|
||||
<A HREF="manual.html#lua_getinfo">lua_getinfo</A><BR>
|
||||
<A HREF="manual.html#lua_getlocal">lua_getlocal</A><BR>
|
||||
<A HREF="manual.html#lua_getmetatable">lua_getmetatable</A><BR>
|
||||
<A HREF="manual.html#lua_getstack">lua_getstack</A><BR>
|
||||
<A HREF="manual.html#lua_gettable">lua_gettable</A><BR>
|
||||
<A HREF="manual.html#lua_gettop">lua_gettop</A><BR>
|
||||
<A HREF="manual.html#lua_getupvalue">lua_getupvalue</A><BR>
|
||||
<A HREF="manual.html#lua_insert">lua_insert</A><BR>
|
||||
<A HREF="manual.html#lua_isboolean">lua_isboolean</A><BR>
|
||||
<A HREF="manual.html#lua_iscfunction">lua_iscfunction</A><BR>
|
||||
<A HREF="manual.html#lua_isfunction">lua_isfunction</A><BR>
|
||||
<A HREF="manual.html#lua_islightuserdata">lua_islightuserdata</A><BR>
|
||||
<A HREF="manual.html#lua_isnil">lua_isnil</A><BR>
|
||||
<A HREF="manual.html#lua_isnone">lua_isnone</A><BR>
|
||||
<A HREF="manual.html#lua_isnoneornil">lua_isnoneornil</A><BR>
|
||||
<A HREF="manual.html#lua_isnumber">lua_isnumber</A><BR>
|
||||
<A HREF="manual.html#lua_isstring">lua_isstring</A><BR>
|
||||
<A HREF="manual.html#lua_istable">lua_istable</A><BR>
|
||||
<A HREF="manual.html#lua_isthread">lua_isthread</A><BR>
|
||||
<A HREF="manual.html#lua_isuserdata">lua_isuserdata</A><BR>
|
||||
<A HREF="manual.html#lua_lessthan">lua_lessthan</A><BR>
|
||||
<A HREF="manual.html#lua_load">lua_load</A><BR>
|
||||
<A HREF="manual.html#lua_newstate">lua_newstate</A><BR>
|
||||
<A HREF="manual.html#lua_newtable">lua_newtable</A><BR>
|
||||
<A HREF="manual.html#lua_newthread">lua_newthread</A><BR>
|
||||
<A HREF="manual.html#lua_newuserdata">lua_newuserdata</A><BR>
|
||||
<A HREF="manual.html#lua_next">lua_next</A><BR>
|
||||
<A HREF="manual.html#lua_objlen">lua_objlen</A><BR>
|
||||
<A HREF="manual.html#lua_pcall">lua_pcall</A><BR>
|
||||
<A HREF="manual.html#lua_pop">lua_pop</A><BR>
|
||||
<A HREF="manual.html#lua_pushboolean">lua_pushboolean</A><BR>
|
||||
<A HREF="manual.html#lua_pushcclosure">lua_pushcclosure</A><BR>
|
||||
<A HREF="manual.html#lua_pushcfunction">lua_pushcfunction</A><BR>
|
||||
<A HREF="manual.html#lua_pushfstring">lua_pushfstring</A><BR>
|
||||
<A HREF="manual.html#lua_pushinteger">lua_pushinteger</A><BR>
|
||||
<A HREF="manual.html#lua_pushlightuserdata">lua_pushlightuserdata</A><BR>
|
||||
<A HREF="manual.html#lua_pushliteral">lua_pushliteral</A><BR>
|
||||
<A HREF="manual.html#lua_pushlstring">lua_pushlstring</A><BR>
|
||||
<A HREF="manual.html#lua_pushnil">lua_pushnil</A><BR>
|
||||
<A HREF="manual.html#lua_pushnumber">lua_pushnumber</A><BR>
|
||||
<A HREF="manual.html#lua_pushstring">lua_pushstring</A><BR>
|
||||
<A HREF="manual.html#lua_pushthread">lua_pushthread</A><BR>
|
||||
<A HREF="manual.html#lua_pushvalue">lua_pushvalue</A><BR>
|
||||
<A HREF="manual.html#lua_pushvfstring">lua_pushvfstring</A><BR>
|
||||
<A HREF="manual.html#lua_rawequal">lua_rawequal</A><BR>
|
||||
<A HREF="manual.html#lua_rawget">lua_rawget</A><BR>
|
||||
<A HREF="manual.html#lua_rawgeti">lua_rawgeti</A><BR>
|
||||
<A HREF="manual.html#lua_rawset">lua_rawset</A><BR>
|
||||
<A HREF="manual.html#lua_rawseti">lua_rawseti</A><BR>
|
||||
<A HREF="manual.html#lua_register">lua_register</A><BR>
|
||||
<A HREF="manual.html#lua_remove">lua_remove</A><BR>
|
||||
<A HREF="manual.html#lua_replace">lua_replace</A><BR>
|
||||
<A HREF="manual.html#lua_resume">lua_resume</A><BR>
|
||||
<A HREF="manual.html#lua_setallocf">lua_setallocf</A><BR>
|
||||
<A HREF="manual.html#lua_setfenv">lua_setfenv</A><BR>
|
||||
<A HREF="manual.html#lua_setfield">lua_setfield</A><BR>
|
||||
<A HREF="manual.html#lua_setglobal">lua_setglobal</A><BR>
|
||||
<A HREF="manual.html#lua_sethook">lua_sethook</A><BR>
|
||||
<A HREF="manual.html#lua_setlocal">lua_setlocal</A><BR>
|
||||
<A HREF="manual.html#lua_setmetatable">lua_setmetatable</A><BR>
|
||||
<A HREF="manual.html#lua_settable">lua_settable</A><BR>
|
||||
<A HREF="manual.html#lua_settop">lua_settop</A><BR>
|
||||
<A HREF="manual.html#lua_setupvalue">lua_setupvalue</A><BR>
|
||||
<A HREF="manual.html#lua_status">lua_status</A><BR>
|
||||
<A HREF="manual.html#lua_toboolean">lua_toboolean</A><BR>
|
||||
<A HREF="manual.html#lua_tocfunction">lua_tocfunction</A><BR>
|
||||
<A HREF="manual.html#lua_tointeger">lua_tointeger</A><BR>
|
||||
<A HREF="manual.html#lua_tolstring">lua_tolstring</A><BR>
|
||||
<A HREF="manual.html#lua_tonumber">lua_tonumber</A><BR>
|
||||
<A HREF="manual.html#lua_topointer">lua_topointer</A><BR>
|
||||
<A HREF="manual.html#lua_tostring">lua_tostring</A><BR>
|
||||
<A HREF="manual.html#lua_tothread">lua_tothread</A><BR>
|
||||
<A HREF="manual.html#lua_touserdata">lua_touserdata</A><BR>
|
||||
<A HREF="manual.html#lua_type">lua_type</A><BR>
|
||||
<A HREF="manual.html#lua_typename">lua_typename</A><BR>
|
||||
<A HREF="manual.html#lua_upvalueindex">lua_upvalueindex</A><BR>
|
||||
<A HREF="manual.html#lua_xmove">lua_xmove</A><BR>
|
||||
<A HREF="manual.html#lua_yield">lua_yield</A><BR>
|
||||
|
||||
</TD>
|
||||
<TD>
|
||||
<H3>auxiliary library</H3>
|
||||
<A HREF="manual.html#luaL_Buffer">luaL_Buffer</A><BR>
|
||||
<A HREF="manual.html#luaL_Reg">luaL_Reg</A><BR>
|
||||
<P>
|
||||
|
||||
<A HREF="manual.html#luaL_addchar">luaL_addchar</A><BR>
|
||||
<A HREF="manual.html#luaL_addlstring">luaL_addlstring</A><BR>
|
||||
<A HREF="manual.html#luaL_addsize">luaL_addsize</A><BR>
|
||||
<A HREF="manual.html#luaL_addstring">luaL_addstring</A><BR>
|
||||
<A HREF="manual.html#luaL_addvalue">luaL_addvalue</A><BR>
|
||||
<A HREF="manual.html#luaL_argcheck">luaL_argcheck</A><BR>
|
||||
<A HREF="manual.html#luaL_argerror">luaL_argerror</A><BR>
|
||||
<A HREF="manual.html#luaL_buffinit">luaL_buffinit</A><BR>
|
||||
<A HREF="manual.html#luaL_callmeta">luaL_callmeta</A><BR>
|
||||
<A HREF="manual.html#luaL_checkany">luaL_checkany</A><BR>
|
||||
<A HREF="manual.html#luaL_checkint">luaL_checkint</A><BR>
|
||||
<A HREF="manual.html#luaL_checkinteger">luaL_checkinteger</A><BR>
|
||||
<A HREF="manual.html#luaL_checklong">luaL_checklong</A><BR>
|
||||
<A HREF="manual.html#luaL_checklstring">luaL_checklstring</A><BR>
|
||||
<A HREF="manual.html#luaL_checknumber">luaL_checknumber</A><BR>
|
||||
<A HREF="manual.html#luaL_checkoption">luaL_checkoption</A><BR>
|
||||
<A HREF="manual.html#luaL_checkstack">luaL_checkstack</A><BR>
|
||||
<A HREF="manual.html#luaL_checkstring">luaL_checkstring</A><BR>
|
||||
<A HREF="manual.html#luaL_checktype">luaL_checktype</A><BR>
|
||||
<A HREF="manual.html#luaL_checkudata">luaL_checkudata</A><BR>
|
||||
<A HREF="manual.html#luaL_dofile">luaL_dofile</A><BR>
|
||||
<A HREF="manual.html#luaL_dostring">luaL_dostring</A><BR>
|
||||
<A HREF="manual.html#luaL_error">luaL_error</A><BR>
|
||||
<A HREF="manual.html#luaL_getmetafield">luaL_getmetafield</A><BR>
|
||||
<A HREF="manual.html#luaL_getmetatable">luaL_getmetatable</A><BR>
|
||||
<A HREF="manual.html#luaL_gsub">luaL_gsub</A><BR>
|
||||
<A HREF="manual.html#luaL_loadbuffer">luaL_loadbuffer</A><BR>
|
||||
<A HREF="manual.html#luaL_loadfile">luaL_loadfile</A><BR>
|
||||
<A HREF="manual.html#luaL_loadstring">luaL_loadstring</A><BR>
|
||||
<A HREF="manual.html#luaL_newmetatable">luaL_newmetatable</A><BR>
|
||||
<A HREF="manual.html#luaL_newstate">luaL_newstate</A><BR>
|
||||
<A HREF="manual.html#luaL_openlibs">luaL_openlibs</A><BR>
|
||||
<A HREF="manual.html#luaL_optint">luaL_optint</A><BR>
|
||||
<A HREF="manual.html#luaL_optinteger">luaL_optinteger</A><BR>
|
||||
<A HREF="manual.html#luaL_optlong">luaL_optlong</A><BR>
|
||||
<A HREF="manual.html#luaL_optlstring">luaL_optlstring</A><BR>
|
||||
<A HREF="manual.html#luaL_optnumber">luaL_optnumber</A><BR>
|
||||
<A HREF="manual.html#luaL_optstring">luaL_optstring</A><BR>
|
||||
<A HREF="manual.html#luaL_prepbuffer">luaL_prepbuffer</A><BR>
|
||||
<A HREF="manual.html#luaL_pushresult">luaL_pushresult</A><BR>
|
||||
<A HREF="manual.html#luaL_ref">luaL_ref</A><BR>
|
||||
<A HREF="manual.html#luaL_register">luaL_register</A><BR>
|
||||
<A HREF="manual.html#luaL_typename">luaL_typename</A><BR>
|
||||
<A HREF="manual.html#luaL_typerror">luaL_typerror</A><BR>
|
||||
<A HREF="manual.html#luaL_unref">luaL_unref</A><BR>
|
||||
<A HREF="manual.html#luaL_where">luaL_where</A><BR>
|
||||
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
<P>
|
||||
|
||||
<HR>
|
||||
<SMALL CLASS="footer">
|
||||
Last update:
|
||||
Mon Feb 13 18:53:32 BRST 2012
|
||||
</SMALL>
|
||||
<!--
|
||||
Last change: revised for Lua 5.1.5
|
||||
-->
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
BIN
extern/lua-5.1.5/doc/cover.png
vendored
Normal file
BIN
extern/lua-5.1.5/doc/cover.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
BIN
extern/lua-5.1.5/doc/logo.gif
vendored
Normal file
BIN
extern/lua-5.1.5/doc/logo.gif
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.1 KiB |
163
extern/lua-5.1.5/doc/lua.1
vendored
Normal file
163
extern/lua-5.1.5/doc/lua.1
vendored
Normal file
|
|
@ -0,0 +1,163 @@
|
|||
.\" $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $
|
||||
.TH LUA 1 "$Date: 2006/01/06 16:03:34 $"
|
||||
.SH NAME
|
||||
lua \- Lua interpreter
|
||||
.SH SYNOPSIS
|
||||
.B lua
|
||||
[
|
||||
.I options
|
||||
]
|
||||
[
|
||||
.I script
|
||||
[
|
||||
.I args
|
||||
]
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
.B lua
|
||||
is the stand-alone Lua interpreter.
|
||||
It loads and executes Lua programs,
|
||||
either in textual source form or
|
||||
in precompiled binary form.
|
||||
(Precompiled binaries are output by
|
||||
.BR luac ,
|
||||
the Lua compiler.)
|
||||
.B lua
|
||||
can be used as a batch interpreter and also interactively.
|
||||
.LP
|
||||
The given
|
||||
.I options
|
||||
(see below)
|
||||
are executed and then
|
||||
the Lua program in file
|
||||
.I script
|
||||
is loaded and executed.
|
||||
The given
|
||||
.I args
|
||||
are available to
|
||||
.I script
|
||||
as strings in a global table named
|
||||
.BR arg .
|
||||
If these arguments contain spaces or other characters special to the shell,
|
||||
then they should be quoted
|
||||
(but note that the quotes will be removed by the shell).
|
||||
The arguments in
|
||||
.B arg
|
||||
start at 0,
|
||||
which contains the string
|
||||
.RI ' script '.
|
||||
The index of the last argument is stored in
|
||||
.BR arg.n .
|
||||
The arguments given in the command line before
|
||||
.IR script ,
|
||||
including the name of the interpreter,
|
||||
are available in negative indices in
|
||||
.BR arg .
|
||||
.LP
|
||||
At the very start,
|
||||
before even handling the command line,
|
||||
.B lua
|
||||
executes the contents of the environment variable
|
||||
.BR LUA_INIT ,
|
||||
if it is defined.
|
||||
If the value of
|
||||
.B LUA_INIT
|
||||
is of the form
|
||||
.RI '@ filename ',
|
||||
then
|
||||
.I filename
|
||||
is executed.
|
||||
Otherwise, the string is assumed to be a Lua statement and is executed.
|
||||
.LP
|
||||
Options start with
|
||||
.B '\-'
|
||||
and are described below.
|
||||
You can use
|
||||
.B "'\--'"
|
||||
to signal the end of options.
|
||||
.LP
|
||||
If no arguments are given,
|
||||
then
|
||||
.B "\-v \-i"
|
||||
is assumed when the standard input is a terminal;
|
||||
otherwise,
|
||||
.B "\-"
|
||||
is assumed.
|
||||
.LP
|
||||
In interactive mode,
|
||||
.B lua
|
||||
prompts the user,
|
||||
reads lines from the standard input,
|
||||
and executes them as they are read.
|
||||
If a line does not contain a complete statement,
|
||||
then a secondary prompt is displayed and
|
||||
lines are read until a complete statement is formed or
|
||||
a syntax error is found.
|
||||
So, one way to interrupt the reading of an incomplete statement is
|
||||
to force a syntax error:
|
||||
adding a
|
||||
.B ';'
|
||||
in the middle of a statement is a sure way of forcing a syntax error
|
||||
(except inside multiline strings and comments; these must be closed explicitly).
|
||||
If a line starts with
|
||||
.BR '=' ,
|
||||
then
|
||||
.B lua
|
||||
displays the values of all the expressions in the remainder of the
|
||||
line. The expressions must be separated by commas.
|
||||
The primary prompt is the value of the global variable
|
||||
.BR _PROMPT ,
|
||||
if this value is a string;
|
||||
otherwise, the default prompt is used.
|
||||
Similarly, the secondary prompt is the value of the global variable
|
||||
.BR _PROMPT2 .
|
||||
So,
|
||||
to change the prompts,
|
||||
set the corresponding variable to a string of your choice.
|
||||
You can do that after calling the interpreter
|
||||
or on the command line
|
||||
(but in this case you have to be careful with quotes
|
||||
if the prompt string contains a space; otherwise you may confuse the shell.)
|
||||
The default prompts are "> " and ">> ".
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-
|
||||
load and execute the standard input as a file,
|
||||
that is,
|
||||
not interactively,
|
||||
even when the standard input is a terminal.
|
||||
.TP
|
||||
.BI \-e " stat"
|
||||
execute statement
|
||||
.IR stat .
|
||||
You need to quote
|
||||
.I stat
|
||||
if it contains spaces, quotes,
|
||||
or other characters special to the shell.
|
||||
.TP
|
||||
.B \-i
|
||||
enter interactive mode after
|
||||
.I script
|
||||
is executed.
|
||||
.TP
|
||||
.BI \-l " name"
|
||||
call
|
||||
.BI require(' name ')
|
||||
before executing
|
||||
.IR script .
|
||||
Typically used to load libraries.
|
||||
.TP
|
||||
.B \-v
|
||||
show version information.
|
||||
.SH "SEE ALSO"
|
||||
.BR luac (1)
|
||||
.br
|
||||
http://www.lua.org/
|
||||
.SH DIAGNOSTICS
|
||||
Error messages should be self explanatory.
|
||||
.SH AUTHORS
|
||||
R. Ierusalimschy,
|
||||
L. H. de Figueiredo,
|
||||
and
|
||||
W. Celes
|
||||
.\" EOF
|
||||
83
extern/lua-5.1.5/doc/lua.css
vendored
Normal file
83
extern/lua-5.1.5/doc/lua.css
vendored
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
body {
|
||||
color: #000000 ;
|
||||
background-color: #FFFFFF ;
|
||||
font-family: Helvetica, Arial, sans-serif ;
|
||||
text-align: justify ;
|
||||
margin-right: 30px ;
|
||||
margin-left: 30px ;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-family: Verdana, Geneva, sans-serif ;
|
||||
font-weight: normal ;
|
||||
font-style: italic ;
|
||||
}
|
||||
|
||||
h2 {
|
||||
padding-top: 0.4em ;
|
||||
padding-bottom: 0.4em ;
|
||||
padding-left: 30px ;
|
||||
padding-right: 30px ;
|
||||
margin-left: -30px ;
|
||||
background-color: #E0E0FF ;
|
||||
}
|
||||
|
||||
h3 {
|
||||
padding-left: 0.5em ;
|
||||
border-left: solid #E0E0FF 1em ;
|
||||
}
|
||||
|
||||
table h3 {
|
||||
padding-left: 0px ;
|
||||
border-left: none ;
|
||||
}
|
||||
|
||||
a:link {
|
||||
color: #000080 ;
|
||||
background-color: inherit ;
|
||||
text-decoration: none ;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
background-color: inherit ;
|
||||
text-decoration: none ;
|
||||
}
|
||||
|
||||
a:link:hover, a:visited:hover {
|
||||
color: #000080 ;
|
||||
background-color: #E0E0FF ;
|
||||
}
|
||||
|
||||
a:link:active, a:visited:active {
|
||||
color: #FF0000 ;
|
||||
}
|
||||
|
||||
hr {
|
||||
border: 0 ;
|
||||
height: 1px ;
|
||||
color: #a0a0a0 ;
|
||||
background-color: #a0a0a0 ;
|
||||
}
|
||||
|
||||
:target {
|
||||
background-color: #F8F8F8 ;
|
||||
padding: 8px ;
|
||||
border: solid #a0a0a0 2px ;
|
||||
}
|
||||
|
||||
.footer {
|
||||
color: gray ;
|
||||
font-size: small ;
|
||||
}
|
||||
|
||||
input[type=text] {
|
||||
border: solid #a0a0a0 2px ;
|
||||
border-radius: 2em ;
|
||||
-moz-border-radius: 2em ;
|
||||
background-image: url('images/search.png') ;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 4px center ;
|
||||
padding-left: 20px ;
|
||||
height: 2em ;
|
||||
}
|
||||
|
||||
172
extern/lua-5.1.5/doc/lua.html
vendored
Normal file
172
extern/lua-5.1.5/doc/lua.html
vendored
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
<!-- $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $ -->
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>LUA man page</TITLE>
|
||||
<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">
|
||||
</HEAD>
|
||||
|
||||
<BODY BGCOLOR="#FFFFFF">
|
||||
|
||||
<H2>NAME</H2>
|
||||
lua - Lua interpreter
|
||||
<H2>SYNOPSIS</H2>
|
||||
<B>lua</B>
|
||||
[
|
||||
<I>options</I>
|
||||
]
|
||||
[
|
||||
<I>script</I>
|
||||
[
|
||||
<I>args</I>
|
||||
]
|
||||
]
|
||||
<H2>DESCRIPTION</H2>
|
||||
<B>lua</B>
|
||||
is the stand-alone Lua interpreter.
|
||||
It loads and executes Lua programs,
|
||||
either in textual source form or
|
||||
in precompiled binary form.
|
||||
(Precompiled binaries are output by
|
||||
<B>luac</B>,
|
||||
the Lua compiler.)
|
||||
<B>lua</B>
|
||||
can be used as a batch interpreter and also interactively.
|
||||
<P>
|
||||
The given
|
||||
<I>options</I>
|
||||
(see below)
|
||||
are executed and then
|
||||
the Lua program in file
|
||||
<I>script</I>
|
||||
is loaded and executed.
|
||||
The given
|
||||
<I>args</I>
|
||||
are available to
|
||||
<I>script</I>
|
||||
as strings in a global table named
|
||||
<B>arg</B>.
|
||||
If these arguments contain spaces or other characters special to the shell,
|
||||
then they should be quoted
|
||||
(but note that the quotes will be removed by the shell).
|
||||
The arguments in
|
||||
<B>arg</B>
|
||||
start at 0,
|
||||
which contains the string
|
||||
'<I>script</I>'.
|
||||
The index of the last argument is stored in
|
||||
<B>arg.n</B>.
|
||||
The arguments given in the command line before
|
||||
<I>script</I>,
|
||||
including the name of the interpreter,
|
||||
are available in negative indices in
|
||||
<B>arg</B>.
|
||||
<P>
|
||||
At the very start,
|
||||
before even handling the command line,
|
||||
<B>lua</B>
|
||||
executes the contents of the environment variable
|
||||
<B>LUA_INIT</B>,
|
||||
if it is defined.
|
||||
If the value of
|
||||
<B>LUA_INIT</B>
|
||||
is of the form
|
||||
'@<I>filename</I>',
|
||||
then
|
||||
<I>filename</I>
|
||||
is executed.
|
||||
Otherwise, the string is assumed to be a Lua statement and is executed.
|
||||
<P>
|
||||
Options start with
|
||||
<B>'-'</B>
|
||||
and are described below.
|
||||
You can use
|
||||
<B>'--'</B>
|
||||
to signal the end of options.
|
||||
<P>
|
||||
If no arguments are given,
|
||||
then
|
||||
<B>"-v -i"</B>
|
||||
is assumed when the standard input is a terminal;
|
||||
otherwise,
|
||||
<B>"-"</B>
|
||||
is assumed.
|
||||
<P>
|
||||
In interactive mode,
|
||||
<B>lua</B>
|
||||
prompts the user,
|
||||
reads lines from the standard input,
|
||||
and executes them as they are read.
|
||||
If a line does not contain a complete statement,
|
||||
then a secondary prompt is displayed and
|
||||
lines are read until a complete statement is formed or
|
||||
a syntax error is found.
|
||||
So, one way to interrupt the reading of an incomplete statement is
|
||||
to force a syntax error:
|
||||
adding a
|
||||
<B>';'</B>
|
||||
in the middle of a statement is a sure way of forcing a syntax error
|
||||
(except inside multiline strings and comments; these must be closed explicitly).
|
||||
If a line starts with
|
||||
<B>'='</B>,
|
||||
then
|
||||
<B>lua</B>
|
||||
displays the values of all the expressions in the remainder of the
|
||||
line. The expressions must be separated by commas.
|
||||
The primary prompt is the value of the global variable
|
||||
<B>_PROMPT</B>,
|
||||
if this value is a string;
|
||||
otherwise, the default prompt is used.
|
||||
Similarly, the secondary prompt is the value of the global variable
|
||||
<B>_PROMPT2</B>.
|
||||
So,
|
||||
to change the prompts,
|
||||
set the corresponding variable to a string of your choice.
|
||||
You can do that after calling the interpreter
|
||||
or on the command line
|
||||
(but in this case you have to be careful with quotes
|
||||
if the prompt string contains a space; otherwise you may confuse the shell.)
|
||||
The default prompts are "> " and ">> ".
|
||||
<H2>OPTIONS</H2>
|
||||
<P>
|
||||
<B>-</B>
|
||||
load and execute the standard input as a file,
|
||||
that is,
|
||||
not interactively,
|
||||
even when the standard input is a terminal.
|
||||
<P>
|
||||
<B>-e </B><I>stat</I>
|
||||
execute statement
|
||||
<I>stat</I>.
|
||||
You need to quote
|
||||
<I>stat </I>
|
||||
if it contains spaces, quotes,
|
||||
or other characters special to the shell.
|
||||
<P>
|
||||
<B>-i</B>
|
||||
enter interactive mode after
|
||||
<I>script</I>
|
||||
is executed.
|
||||
<P>
|
||||
<B>-l </B><I>name</I>
|
||||
call
|
||||
<B>require</B>('<I>name</I>')
|
||||
before executing
|
||||
<I>script</I>.
|
||||
Typically used to load libraries.
|
||||
<P>
|
||||
<B>-v</B>
|
||||
show version information.
|
||||
<H2>SEE ALSO</H2>
|
||||
<B>luac</B>(1)
|
||||
<BR>
|
||||
<A HREF="http://www.lua.org/">http://www.lua.org/</A>
|
||||
<H2>DIAGNOSTICS</H2>
|
||||
Error messages should be self explanatory.
|
||||
<H2>AUTHORS</H2>
|
||||
R. Ierusalimschy,
|
||||
L. H. de Figueiredo,
|
||||
and
|
||||
W. Celes
|
||||
<!-- EOF -->
|
||||
</BODY>
|
||||
</HTML>
|
||||
136
extern/lua-5.1.5/doc/luac.1
vendored
Normal file
136
extern/lua-5.1.5/doc/luac.1
vendored
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
.\" $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $
|
||||
.TH LUAC 1 "$Date: 2006/01/06 16:03:34 $"
|
||||
.SH NAME
|
||||
luac \- Lua compiler
|
||||
.SH SYNOPSIS
|
||||
.B luac
|
||||
[
|
||||
.I options
|
||||
] [
|
||||
.I filenames
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
.B luac
|
||||
is the Lua compiler.
|
||||
It translates programs written in the Lua programming language
|
||||
into binary files that can be later loaded and executed.
|
||||
.LP
|
||||
The main advantages of precompiling chunks are:
|
||||
faster loading,
|
||||
protecting source code from accidental user changes,
|
||||
and
|
||||
off-line syntax checking.
|
||||
.LP
|
||||
Pre-compiling does not imply faster execution
|
||||
because in Lua chunks are always compiled into bytecodes before being executed.
|
||||
.B luac
|
||||
simply allows those bytecodes to be saved in a file for later execution.
|
||||
.LP
|
||||
Pre-compiled chunks are not necessarily smaller than the corresponding source.
|
||||
The main goal in pre-compiling is faster loading.
|
||||
.LP
|
||||
The binary files created by
|
||||
.B luac
|
||||
are portable only among architectures with the same word size and byte order.
|
||||
.LP
|
||||
.B luac
|
||||
produces a single output file containing the bytecodes
|
||||
for all source files given.
|
||||
By default,
|
||||
the output file is named
|
||||
.BR luac.out ,
|
||||
but you can change this with the
|
||||
.B \-o
|
||||
option.
|
||||
.LP
|
||||
In the command line,
|
||||
you can mix
|
||||
text files containing Lua source and
|
||||
binary files containing precompiled chunks.
|
||||
This is useful to combine several precompiled chunks,
|
||||
even from different (but compatible) platforms,
|
||||
into a single precompiled chunk.
|
||||
.LP
|
||||
You can use
|
||||
.B "'\-'"
|
||||
to indicate the standard input as a source file
|
||||
and
|
||||
.B "'\--'"
|
||||
to signal the end of options
|
||||
(that is,
|
||||
all remaining arguments will be treated as files even if they start with
|
||||
.BR "'\-'" ).
|
||||
.LP
|
||||
The internal format of the binary files produced by
|
||||
.B luac
|
||||
is likely to change when a new version of Lua is released.
|
||||
So,
|
||||
save the source files of all Lua programs that you precompile.
|
||||
.LP
|
||||
.SH OPTIONS
|
||||
Options must be separate.
|
||||
.TP
|
||||
.B \-l
|
||||
produce a listing of the compiled bytecode for Lua's virtual machine.
|
||||
Listing bytecodes is useful to learn about Lua's virtual machine.
|
||||
If no files are given, then
|
||||
.B luac
|
||||
loads
|
||||
.B luac.out
|
||||
and lists its contents.
|
||||
.TP
|
||||
.BI \-o " file"
|
||||
output to
|
||||
.IR file ,
|
||||
instead of the default
|
||||
.BR luac.out .
|
||||
(You can use
|
||||
.B "'\-'"
|
||||
for standard output,
|
||||
but not on platforms that open standard output in text mode.)
|
||||
The output file may be a source file because
|
||||
all files are loaded before the output file is written.
|
||||
Be careful not to overwrite precious files.
|
||||
.TP
|
||||
.B \-p
|
||||
load files but do not generate any output file.
|
||||
Used mainly for syntax checking and for testing precompiled chunks:
|
||||
corrupted files will probably generate errors when loaded.
|
||||
Lua always performs a thorough integrity test on precompiled chunks.
|
||||
Bytecode that passes this test is completely safe,
|
||||
in the sense that it will not break the interpreter.
|
||||
However,
|
||||
there is no guarantee that such code does anything sensible.
|
||||
(None can be given, because the halting problem is unsolvable.)
|
||||
If no files are given, then
|
||||
.B luac
|
||||
loads
|
||||
.B luac.out
|
||||
and tests its contents.
|
||||
No messages are displayed if the file passes the integrity test.
|
||||
.TP
|
||||
.B \-s
|
||||
strip debug information before writing the output file.
|
||||
This saves some space in very large chunks,
|
||||
but if errors occur when running a stripped chunk,
|
||||
then the error messages may not contain the full information they usually do.
|
||||
For instance,
|
||||
line numbers and names of local variables are lost.
|
||||
.TP
|
||||
.B \-v
|
||||
show version information.
|
||||
.SH FILES
|
||||
.TP 15
|
||||
.B luac.out
|
||||
default output file
|
||||
.SH "SEE ALSO"
|
||||
.BR lua (1)
|
||||
.br
|
||||
http://www.lua.org/
|
||||
.SH DIAGNOSTICS
|
||||
Error messages should be self explanatory.
|
||||
.SH AUTHORS
|
||||
L. H. de Figueiredo,
|
||||
R. Ierusalimschy and
|
||||
W. Celes
|
||||
.\" EOF
|
||||
145
extern/lua-5.1.5/doc/luac.html
vendored
Normal file
145
extern/lua-5.1.5/doc/luac.html
vendored
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
<!-- $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $ -->
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>LUAC man page</TITLE>
|
||||
<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">
|
||||
</HEAD>
|
||||
|
||||
<BODY BGCOLOR="#FFFFFF">
|
||||
|
||||
<H2>NAME</H2>
|
||||
luac - Lua compiler
|
||||
<H2>SYNOPSIS</H2>
|
||||
<B>luac</B>
|
||||
[
|
||||
<I>options</I>
|
||||
] [
|
||||
<I>filenames</I>
|
||||
]
|
||||
<H2>DESCRIPTION</H2>
|
||||
<B>luac</B>
|
||||
is the Lua compiler.
|
||||
It translates programs written in the Lua programming language
|
||||
into binary files that can be later loaded and executed.
|
||||
<P>
|
||||
The main advantages of precompiling chunks are:
|
||||
faster loading,
|
||||
protecting source code from accidental user changes,
|
||||
and
|
||||
off-line syntax checking.
|
||||
<P>
|
||||
Precompiling does not imply faster execution
|
||||
because in Lua chunks are always compiled into bytecodes before being executed.
|
||||
<B>luac</B>
|
||||
simply allows those bytecodes to be saved in a file for later execution.
|
||||
<P>
|
||||
Precompiled chunks are not necessarily smaller than the corresponding source.
|
||||
The main goal in precompiling is faster loading.
|
||||
<P>
|
||||
The binary files created by
|
||||
<B>luac</B>
|
||||
are portable only among architectures with the same word size and byte order.
|
||||
<P>
|
||||
<B>luac</B>
|
||||
produces a single output file containing the bytecodes
|
||||
for all source files given.
|
||||
By default,
|
||||
the output file is named
|
||||
<B>luac.out</B>,
|
||||
but you can change this with the
|
||||
<B>-o</B>
|
||||
option.
|
||||
<P>
|
||||
In the command line,
|
||||
you can mix
|
||||
text files containing Lua source and
|
||||
binary files containing precompiled chunks.
|
||||
This is useful because several precompiled chunks,
|
||||
even from different (but compatible) platforms,
|
||||
can be combined into a single precompiled chunk.
|
||||
<P>
|
||||
You can use
|
||||
<B>'-'</B>
|
||||
to indicate the standard input as a source file
|
||||
and
|
||||
<B>'--'</B>
|
||||
to signal the end of options
|
||||
(that is,
|
||||
all remaining arguments will be treated as files even if they start with
|
||||
<B>'-'</B>).
|
||||
<P>
|
||||
The internal format of the binary files produced by
|
||||
<B>luac</B>
|
||||
is likely to change when a new version of Lua is released.
|
||||
So,
|
||||
save the source files of all Lua programs that you precompile.
|
||||
<P>
|
||||
<H2>OPTIONS</H2>
|
||||
Options must be separate.
|
||||
<P>
|
||||
<B>-l</B>
|
||||
produce a listing of the compiled bytecode for Lua's virtual machine.
|
||||
Listing bytecodes is useful to learn about Lua's virtual machine.
|
||||
If no files are given, then
|
||||
<B>luac</B>
|
||||
loads
|
||||
<B>luac.out</B>
|
||||
and lists its contents.
|
||||
<P>
|
||||
<B>-o </B><I>file</I>
|
||||
output to
|
||||
<I>file</I>,
|
||||
instead of the default
|
||||
<B>luac.out</B>.
|
||||
(You can use
|
||||
<B>'-'</B>
|
||||
for standard output,
|
||||
but not on platforms that open standard output in text mode.)
|
||||
The output file may be a source file because
|
||||
all files are loaded before the output file is written.
|
||||
Be careful not to overwrite precious files.
|
||||
<P>
|
||||
<B>-p</B>
|
||||
load files but do not generate any output file.
|
||||
Used mainly for syntax checking and for testing precompiled chunks:
|
||||
corrupted files will probably generate errors when loaded.
|
||||
Lua always performs a thorough integrity test on precompiled chunks.
|
||||
Bytecode that passes this test is completely safe,
|
||||
in the sense that it will not break the interpreter.
|
||||
However,
|
||||
there is no guarantee that such code does anything sensible.
|
||||
(None can be given, because the halting problem is unsolvable.)
|
||||
If no files are given, then
|
||||
<B>luac</B>
|
||||
loads
|
||||
<B>luac.out</B>
|
||||
and tests its contents.
|
||||
No messages are displayed if the file passes the integrity test.
|
||||
<P>
|
||||
<B>-s</B>
|
||||
strip debug information before writing the output file.
|
||||
This saves some space in very large chunks,
|
||||
but if errors occur when running a stripped chunk,
|
||||
then the error messages may not contain the full information they usually do.
|
||||
For instance,
|
||||
line numbers and names of local variables are lost.
|
||||
<P>
|
||||
<B>-v</B>
|
||||
show version information.
|
||||
<H2>FILES</H2>
|
||||
<P>
|
||||
<B>luac.out</B>
|
||||
default output file
|
||||
<H2>SEE ALSO</H2>
|
||||
<B>lua</B>(1)
|
||||
<BR>
|
||||
<A HREF="http://www.lua.org/">http://www.lua.org/</A>
|
||||
<H2>DIAGNOSTICS</H2>
|
||||
Error messages should be self explanatory.
|
||||
<H2>AUTHORS</H2>
|
||||
L. H. de Figueiredo,
|
||||
R. Ierusalimschy and
|
||||
W. Celes
|
||||
<!-- EOF -->
|
||||
</BODY>
|
||||
</HTML>
|
||||
24
extern/lua-5.1.5/doc/manual.css
vendored
Normal file
24
extern/lua-5.1.5/doc/manual.css
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
h3 code {
|
||||
font-family: inherit ;
|
||||
font-size: inherit ;
|
||||
}
|
||||
|
||||
pre, code {
|
||||
font-size: 12pt ;
|
||||
}
|
||||
|
||||
span.apii {
|
||||
float: right ;
|
||||
font-family: inherit ;
|
||||
font-style: normal ;
|
||||
font-size: small ;
|
||||
color: gray ;
|
||||
}
|
||||
|
||||
p+h1, ul+h1 {
|
||||
padding-top: 0.4em ;
|
||||
padding-bottom: 0.4em ;
|
||||
padding-left: 30px ;
|
||||
margin-left: -30px ;
|
||||
background-color: #E0E0FF ;
|
||||
}
|
||||
8804
extern/lua-5.1.5/doc/manual.html
vendored
Normal file
8804
extern/lua-5.1.5/doc/manual.html
vendored
Normal file
File diff suppressed because it is too large
Load diff
40
extern/lua-5.1.5/doc/readme.html
vendored
Normal file
40
extern/lua-5.1.5/doc/readme.html
vendored
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Lua documentation</TITLE>
|
||||
<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">
|
||||
</HEAD>
|
||||
|
||||
<BODY>
|
||||
|
||||
<HR>
|
||||
<H1>
|
||||
<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua" BORDER=0></A>
|
||||
Documentation
|
||||
</H1>
|
||||
|
||||
This is the documentation included in the source distribution of Lua 5.1.5.
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="contents.html">Reference manual</A>
|
||||
<LI><A HREF="lua.html">lua man page</A>
|
||||
<LI><A HREF="luac.html">luac man page</A>
|
||||
<LI><A HREF="../README">lua/README</A>
|
||||
<LI><A HREF="../etc/README">lua/etc/README</A>
|
||||
<LI><A HREF="../test/README">lua/test/README</A>
|
||||
</UL>
|
||||
|
||||
Lua's
|
||||
<A HREF="http://www.lua.org/">official web site</A>
|
||||
contains updated documentation,
|
||||
especially the
|
||||
<A HREF="http://www.lua.org/manual/5.1/">reference manual</A>.
|
||||
<P>
|
||||
|
||||
<HR>
|
||||
<SMALL>
|
||||
Last update:
|
||||
Fri Feb 3 09:44:42 BRST 2012
|
||||
</SMALL>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
44
extern/lua-5.1.5/etc/Makefile
vendored
Normal file
44
extern/lua-5.1.5/etc/Makefile
vendored
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
# makefile for Lua etc
|
||||
|
||||
TOP= ..
|
||||
LIB= $(TOP)/src
|
||||
INC= $(TOP)/src
|
||||
BIN= $(TOP)/src
|
||||
SRC= $(TOP)/src
|
||||
TST= $(TOP)/test
|
||||
|
||||
CC= gcc
|
||||
CFLAGS= -O2 -Wall -I$(INC) $(MYCFLAGS)
|
||||
MYCFLAGS=
|
||||
MYLDFLAGS= -Wl,-E
|
||||
MYLIBS= -lm
|
||||
#MYLIBS= -lm -Wl,-E -ldl -lreadline -lhistory -lncurses
|
||||
RM= rm -f
|
||||
|
||||
default:
|
||||
@echo 'Please choose a target: min noparser one strict clean'
|
||||
|
||||
min: min.c
|
||||
$(CC) $(CFLAGS) $@.c -L$(LIB) -llua $(MYLIBS)
|
||||
echo 'print"Hello there!"' | ./a.out
|
||||
|
||||
noparser: noparser.o
|
||||
$(CC) noparser.o $(SRC)/lua.o -L$(LIB) -llua $(MYLIBS)
|
||||
$(BIN)/luac $(TST)/hello.lua
|
||||
-./a.out luac.out
|
||||
-./a.out -e'a=1'
|
||||
|
||||
one:
|
||||
$(CC) $(CFLAGS) all.c $(MYLIBS)
|
||||
./a.out $(TST)/hello.lua
|
||||
|
||||
strict:
|
||||
-$(BIN)/lua -e 'print(a);b=2'
|
||||
-$(BIN)/lua -lstrict -e 'print(a)'
|
||||
-$(BIN)/lua -e 'function f() b=2 end f()'
|
||||
-$(BIN)/lua -lstrict -e 'function f() b=2 end f()'
|
||||
|
||||
clean:
|
||||
$(RM) a.out core core.* *.o luac.out
|
||||
|
||||
.PHONY: default min noparser one strict clean
|
||||
37
extern/lua-5.1.5/etc/README
vendored
Normal file
37
extern/lua-5.1.5/etc/README
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
This directory contains some useful files and code.
|
||||
Unlike the code in ../src, everything here is in the public domain.
|
||||
|
||||
If any of the makes fail, you're probably not using the same libraries
|
||||
used to build Lua. Set MYLIBS in Makefile accordingly.
|
||||
|
||||
all.c
|
||||
Full Lua interpreter in a single file.
|
||||
Do "make one" for a demo.
|
||||
|
||||
lua.hpp
|
||||
Lua header files for C++ using 'extern "C"'.
|
||||
|
||||
lua.ico
|
||||
A Lua icon for Windows (and web sites: save as favicon.ico).
|
||||
Drawn by hand by Markus Gritsch <gritsch@iue.tuwien.ac.at>.
|
||||
|
||||
lua.pc
|
||||
pkg-config data for Lua
|
||||
|
||||
luavs.bat
|
||||
Script to build Lua under "Visual Studio .NET Command Prompt".
|
||||
Run it from the toplevel as etc\luavs.bat.
|
||||
|
||||
min.c
|
||||
A minimal Lua interpreter.
|
||||
Good for learning and for starting your own.
|
||||
Do "make min" for a demo.
|
||||
|
||||
noparser.c
|
||||
Linking with noparser.o avoids loading the parsing modules in lualib.a.
|
||||
Do "make noparser" for a demo.
|
||||
|
||||
strict.lua
|
||||
Traps uses of undeclared global variables.
|
||||
Do "make strict" for a demo.
|
||||
|
||||
38
extern/lua-5.1.5/etc/all.c
vendored
Normal file
38
extern/lua-5.1.5/etc/all.c
vendored
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* all.c -- Lua core, libraries and interpreter in a single file
|
||||
*/
|
||||
|
||||
#define luaall_c
|
||||
|
||||
#include "lapi.c"
|
||||
#include "lcode.c"
|
||||
#include "ldebug.c"
|
||||
#include "ldo.c"
|
||||
#include "ldump.c"
|
||||
#include "lfunc.c"
|
||||
#include "lgc.c"
|
||||
#include "llex.c"
|
||||
#include "lmem.c"
|
||||
#include "lobject.c"
|
||||
#include "lopcodes.c"
|
||||
#include "lparser.c"
|
||||
#include "lstate.c"
|
||||
#include "lstring.c"
|
||||
#include "ltable.c"
|
||||
#include "ltm.c"
|
||||
#include "lundump.c"
|
||||
#include "lvm.c"
|
||||
#include "lzio.c"
|
||||
|
||||
#include "lauxlib.c"
|
||||
#include "lbaselib.c"
|
||||
#include "ldblib.c"
|
||||
#include "liolib.c"
|
||||
#include "linit.c"
|
||||
#include "lmathlib.c"
|
||||
#include "loadlib.c"
|
||||
#include "loslib.c"
|
||||
#include "lstrlib.c"
|
||||
#include "ltablib.c"
|
||||
|
||||
#include "lua.c"
|
||||
9
extern/lua-5.1.5/etc/lua.hpp
vendored
Normal file
9
extern/lua-5.1.5/etc/lua.hpp
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// lua.hpp
|
||||
// Lua header files for C++
|
||||
// <<extern "C">> not supplied automatically because Lua also compiles as C++
|
||||
|
||||
extern "C" {
|
||||
#include "lua.h"
|
||||
#include "lualib.h"
|
||||
#include "lauxlib.h"
|
||||
}
|
||||
BIN
extern/lua-5.1.5/etc/lua.ico
vendored
Normal file
BIN
extern/lua-5.1.5/etc/lua.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
31
extern/lua-5.1.5/etc/lua.pc
vendored
Normal file
31
extern/lua-5.1.5/etc/lua.pc
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
# lua.pc -- pkg-config data for Lua
|
||||
|
||||
# vars from install Makefile
|
||||
|
||||
# grep '^V=' ../Makefile
|
||||
V= 5.1
|
||||
# grep '^R=' ../Makefile
|
||||
R= 5.1.5
|
||||
|
||||
# grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/'
|
||||
prefix= /usr/local
|
||||
INSTALL_BIN= ${prefix}/bin
|
||||
INSTALL_INC= ${prefix}/include
|
||||
INSTALL_LIB= ${prefix}/lib
|
||||
INSTALL_MAN= ${prefix}/man/man1
|
||||
INSTALL_LMOD= ${prefix}/share/lua/${V}
|
||||
INSTALL_CMOD= ${prefix}/lib/lua/${V}
|
||||
|
||||
# canonical vars
|
||||
exec_prefix=${prefix}
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: Lua
|
||||
Description: An Extensible Extension Language
|
||||
Version: ${R}
|
||||
Requires:
|
||||
Libs: -L${libdir} -llua -lm
|
||||
Cflags: -I${includedir}
|
||||
|
||||
# (end of lua.pc)
|
||||
28
extern/lua-5.1.5/etc/luavs.bat
vendored
Normal file
28
extern/lua-5.1.5/etc/luavs.bat
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
@rem Script to build Lua under "Visual Studio .NET Command Prompt".
|
||||
@rem Do not run from this directory; run it from the toplevel: etc\luavs.bat .
|
||||
@rem It creates lua51.dll, lua51.lib, lua.exe, and luac.exe in src.
|
||||
@rem (contributed by David Manura and Mike Pall)
|
||||
|
||||
@setlocal
|
||||
@set MYCOMPILE=cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE
|
||||
@set MYLINK=link /nologo
|
||||
@set MYMT=mt /nologo
|
||||
|
||||
cd src
|
||||
%MYCOMPILE% /DLUA_BUILD_AS_DLL l*.c
|
||||
del lua.obj luac.obj
|
||||
%MYLINK% /DLL /out:lua51.dll l*.obj
|
||||
if exist lua51.dll.manifest^
|
||||
%MYMT% -manifest lua51.dll.manifest -outputresource:lua51.dll;2
|
||||
%MYCOMPILE% /DLUA_BUILD_AS_DLL lua.c
|
||||
%MYLINK% /out:lua.exe lua.obj lua51.lib
|
||||
if exist lua.exe.manifest^
|
||||
%MYMT% -manifest lua.exe.manifest -outputresource:lua.exe
|
||||
%MYCOMPILE% l*.c print.c
|
||||
del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathlib.obj^
|
||||
loslib.obj ltablib.obj lstrlib.obj loadlib.obj
|
||||
%MYLINK% /out:luac.exe *.obj
|
||||
if exist luac.exe.manifest^
|
||||
%MYMT% -manifest luac.exe.manifest -outputresource:luac.exe
|
||||
del *.obj *.manifest
|
||||
cd ..
|
||||
39
extern/lua-5.1.5/etc/min.c
vendored
Normal file
39
extern/lua-5.1.5/etc/min.c
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* min.c -- a minimal Lua interpreter
|
||||
* loads stdin only with minimal error handling.
|
||||
* no interaction, and no standard library, only a "print" function.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lua.h"
|
||||
#include "lauxlib.h"
|
||||
|
||||
static int print(lua_State *L)
|
||||
{
|
||||
int n=lua_gettop(L);
|
||||
int i;
|
||||
for (i=1; i<=n; i++)
|
||||
{
|
||||
if (i>1) printf("\t");
|
||||
if (lua_isstring(L,i))
|
||||
printf("%s",lua_tostring(L,i));
|
||||
else if (lua_isnil(L,i))
|
||||
printf("%s","nil");
|
||||
else if (lua_isboolean(L,i))
|
||||
printf("%s",lua_toboolean(L,i) ? "true" : "false");
|
||||
else
|
||||
printf("%s:%p",luaL_typename(L,i),lua_topointer(L,i));
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
lua_State *L=lua_open();
|
||||
lua_register(L,"print",print);
|
||||
if (luaL_dofile(L,NULL)!=0) fprintf(stderr,"%s\n",lua_tostring(L,-1));
|
||||
lua_close(L);
|
||||
return 0;
|
||||
}
|
||||
50
extern/lua-5.1.5/etc/noparser.c
vendored
Normal file
50
extern/lua-5.1.5/etc/noparser.c
vendored
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* The code below can be used to make a Lua core that does not contain the
|
||||
* parsing modules (lcode, llex, lparser), which represent 35% of the total core.
|
||||
* You'll only be able to load binary files and strings, precompiled with luac.
|
||||
* (Of course, you'll have to build luac with the original parsing modules!)
|
||||
*
|
||||
* To use this module, simply compile it ("make noparser" does that) and list
|
||||
* its object file before the Lua libraries. The linker should then not load
|
||||
* the parsing modules. To try it, do "make luab".
|
||||
*
|
||||
* If you also want to avoid the dump module (ldump.o), define NODUMP.
|
||||
* #define NODUMP
|
||||
*/
|
||||
|
||||
#define LUA_CORE
|
||||
|
||||
#include "llex.h"
|
||||
#include "lparser.h"
|
||||
#include "lzio.h"
|
||||
|
||||
LUAI_FUNC void luaX_init (lua_State *L) {
|
||||
UNUSED(L);
|
||||
}
|
||||
|
||||
LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) {
|
||||
UNUSED(z);
|
||||
UNUSED(buff);
|
||||
UNUSED(name);
|
||||
lua_pushliteral(L,"parser not loaded");
|
||||
lua_error(L);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef NODUMP
|
||||
#include "lundump.h"
|
||||
|
||||
LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) {
|
||||
UNUSED(f);
|
||||
UNUSED(w);
|
||||
UNUSED(data);
|
||||
UNUSED(strip);
|
||||
#if 1
|
||||
UNUSED(L);
|
||||
return 0;
|
||||
#else
|
||||
lua_pushliteral(L,"dumper not loaded");
|
||||
lua_error(L);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
41
extern/lua-5.1.5/etc/strict.lua
vendored
Normal file
41
extern/lua-5.1.5/etc/strict.lua
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
--
|
||||
-- strict.lua
|
||||
-- checks uses of undeclared global variables
|
||||
-- All global variables must be 'declared' through a regular assignment
|
||||
-- (even assigning nil will do) in a main chunk before being used
|
||||
-- anywhere or assigned to inside a function.
|
||||
--
|
||||
|
||||
local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget
|
||||
|
||||
local mt = getmetatable(_G)
|
||||
if mt == nil then
|
||||
mt = {}
|
||||
setmetatable(_G, mt)
|
||||
end
|
||||
|
||||
mt.__declared = {}
|
||||
|
||||
local function what ()
|
||||
local d = getinfo(3, "S")
|
||||
return d and d.what or "C"
|
||||
end
|
||||
|
||||
mt.__newindex = function (t, n, v)
|
||||
if not mt.__declared[n] then
|
||||
local w = what()
|
||||
if w ~= "main" and w ~= "C" then
|
||||
error("assign to undeclared variable '"..n.."'", 2)
|
||||
end
|
||||
mt.__declared[n] = true
|
||||
end
|
||||
rawset(t, n, v)
|
||||
end
|
||||
|
||||
mt.__index = function (t, n)
|
||||
if not mt.__declared[n] and what() ~= "C" then
|
||||
error("variable '"..n.."' is not declared", 2)
|
||||
end
|
||||
return rawget(t, n)
|
||||
end
|
||||
|
||||
182
extern/lua-5.1.5/src/Makefile
vendored
Normal file
182
extern/lua-5.1.5/src/Makefile
vendored
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
# makefile for building Lua
|
||||
# see ../INSTALL for installation instructions
|
||||
# see ../Makefile and luaconf.h for further customization
|
||||
|
||||
# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================
|
||||
|
||||
# Your platform. See PLATS for possible values.
|
||||
PLAT= none
|
||||
|
||||
CC= gcc
|
||||
CFLAGS= -O2 -Wall $(MYCFLAGS)
|
||||
AR= ar rcu
|
||||
RANLIB= ranlib
|
||||
RM= rm -f
|
||||
LIBS= -lm $(MYLIBS)
|
||||
|
||||
MYCFLAGS=
|
||||
MYLDFLAGS=
|
||||
MYLIBS=
|
||||
|
||||
# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE =========
|
||||
|
||||
PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris
|
||||
|
||||
LUA_A= liblua.a
|
||||
CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \
|
||||
lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \
|
||||
lundump.o lvm.o lzio.o
|
||||
LIB_O= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \
|
||||
lstrlib.o loadlib.o linit.o
|
||||
|
||||
LUA_T= lua
|
||||
LUA_O= lua.o
|
||||
|
||||
LUAC_T= luac
|
||||
LUAC_O= luac.o print.o
|
||||
|
||||
ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
|
||||
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
|
||||
ALL_A= $(LUA_A)
|
||||
|
||||
default: $(PLAT)
|
||||
|
||||
all: $(ALL_T)
|
||||
|
||||
o: $(ALL_O)
|
||||
|
||||
a: $(ALL_A)
|
||||
|
||||
$(LUA_A): $(CORE_O) $(LIB_O)
|
||||
$(AR) $@ $(CORE_O) $(LIB_O) # DLL needs all object files
|
||||
$(RANLIB) $@
|
||||
|
||||
$(LUA_T): $(LUA_O) $(LUA_A)
|
||||
$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)
|
||||
|
||||
$(LUAC_T): $(LUAC_O) $(LUA_A)
|
||||
$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)
|
||||
|
||||
clean:
|
||||
$(RM) $(ALL_T) $(ALL_O)
|
||||
|
||||
depend:
|
||||
@$(CC) $(CFLAGS) -MM l*.c print.c
|
||||
|
||||
echo:
|
||||
@echo "PLAT = $(PLAT)"
|
||||
@echo "CC = $(CC)"
|
||||
@echo "CFLAGS = $(CFLAGS)"
|
||||
@echo "AR = $(AR)"
|
||||
@echo "RANLIB = $(RANLIB)"
|
||||
@echo "RM = $(RM)"
|
||||
@echo "MYCFLAGS = $(MYCFLAGS)"
|
||||
@echo "MYLDFLAGS = $(MYLDFLAGS)"
|
||||
@echo "MYLIBS = $(MYLIBS)"
|
||||
|
||||
# convenience targets for popular platforms
|
||||
|
||||
none:
|
||||
@echo "Please choose a platform:"
|
||||
@echo " $(PLATS)"
|
||||
|
||||
aix:
|
||||
$(MAKE) all CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall"
|
||||
|
||||
ansi:
|
||||
$(MAKE) all MYCFLAGS=-DLUA_ANSI
|
||||
|
||||
bsd:
|
||||
$(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-Wl,-E"
|
||||
|
||||
freebsd:
|
||||
$(MAKE) all MYCFLAGS="-DLUA_USE_LINUX" MYLIBS="-Wl,-E -lreadline"
|
||||
|
||||
generic:
|
||||
$(MAKE) all MYCFLAGS=
|
||||
|
||||
linux:
|
||||
$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
|
||||
|
||||
macosx:
|
||||
$(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline"
|
||||
# use this on Mac OS X 10.3-
|
||||
# $(MAKE) all MYCFLAGS=-DLUA_USE_MACOSX
|
||||
|
||||
mingw:
|
||||
$(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \
|
||||
"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
|
||||
"MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe
|
||||
$(MAKE) "LUAC_T=luac.exe" luac.exe
|
||||
|
||||
posix:
|
||||
$(MAKE) all MYCFLAGS=-DLUA_USE_POSIX
|
||||
|
||||
solaris:
|
||||
$(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl"
|
||||
|
||||
# list targets that do not create files (but not all makes understand .PHONY)
|
||||
.PHONY: all $(PLATS) default o a clean depend echo none
|
||||
|
||||
# DO NOT DELETE
|
||||
|
||||
lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \
|
||||
lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \
|
||||
lundump.h lvm.h
|
||||
lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h
|
||||
lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
|
||||
lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h \
|
||||
ltable.h
|
||||
ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \
|
||||
llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
|
||||
lfunc.h lstring.h lgc.h ltable.h lvm.h
|
||||
ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
|
||||
lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h \
|
||||
ltable.h lundump.h lvm.h
|
||||
ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \
|
||||
lzio.h lmem.h lundump.h
|
||||
lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \
|
||||
lstate.h ltm.h lzio.h
|
||||
lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
|
||||
lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
|
||||
linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h
|
||||
liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \
|
||||
lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h
|
||||
lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
|
||||
ltm.h lzio.h lmem.h ldo.h
|
||||
loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \
|
||||
ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h
|
||||
lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h
|
||||
loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h \
|
||||
lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h \
|
||||
lfunc.h lstring.h lgc.h ltable.h
|
||||
lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
|
||||
ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h
|
||||
lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \
|
||||
ltm.h lzio.h lstring.h lgc.h
|
||||
lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \
|
||||
ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h
|
||||
ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \
|
||||
lmem.h lstring.h lgc.h ltable.h
|
||||
lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h
|
||||
luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \
|
||||
lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h \
|
||||
lundump.h
|
||||
lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h \
|
||||
llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h
|
||||
lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h \
|
||||
lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h
|
||||
lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \
|
||||
lzio.h
|
||||
print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \
|
||||
ltm.h lzio.h lmem.h lopcodes.h lundump.h
|
||||
|
||||
# (end of Makefile)
|
||||
1087
extern/lua-5.1.5/src/lapi.c
vendored
Normal file
1087
extern/lua-5.1.5/src/lapi.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
16
extern/lua-5.1.5/src/lapi.h
vendored
Normal file
16
extern/lua-5.1.5/src/lapi.h
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** Auxiliary functions from Lua API
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#ifndef lapi_h
|
||||
#define lapi_h
|
||||
|
||||
|
||||
#include "lobject.h"
|
||||
|
||||
|
||||
LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o);
|
||||
|
||||
#endif
|
||||
652
extern/lua-5.1.5/src/lauxlib.c
vendored
Normal file
652
extern/lua-5.1.5/src/lauxlib.c
vendored
Normal file
|
|
@ -0,0 +1,652 @@
|
|||
/*
|
||||
** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $
|
||||
** Auxiliary functions for building Lua libraries
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/* This file uses only the official API of Lua.
|
||||
** Any function declared here could be written as an application function.
|
||||
*/
|
||||
|
||||
#define lauxlib_c
|
||||
#define LUA_LIB
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "lauxlib.h"
|
||||
|
||||
|
||||
#define FREELIST_REF 0 /* free list of references */
|
||||
|
||||
|
||||
/* convert a stack index to positive */
|
||||
#define abs_index(L, i) ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \
|
||||
lua_gettop(L) + (i) + 1)
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** Error-report functions
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
|
||||
LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) {
|
||||
lua_Debug ar;
|
||||
if (!lua_getstack(L, 0, &ar)) /* no stack frame? */
|
||||
return luaL_error(L, "bad argument #%d (%s)", narg, extramsg);
|
||||
lua_getinfo(L, "n", &ar);
|
||||
if (strcmp(ar.namewhat, "method") == 0) {
|
||||
narg--; /* do not count `self' */
|
||||
if (narg == 0) /* error is in the self argument itself? */
|
||||
return luaL_error(L, "calling " LUA_QS " on bad self (%s)",
|
||||
ar.name, extramsg);
|
||||
}
|
||||
if (ar.name == NULL)
|
||||
ar.name = "?";
|
||||
return luaL_error(L, "bad argument #%d to " LUA_QS " (%s)",
|
||||
narg, ar.name, extramsg);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) {
|
||||
const char *msg = lua_pushfstring(L, "%s expected, got %s",
|
||||
tname, luaL_typename(L, narg));
|
||||
return luaL_argerror(L, narg, msg);
|
||||
}
|
||||
|
||||
|
||||
static void tag_error (lua_State *L, int narg, int tag) {
|
||||
luaL_typerror(L, narg, lua_typename(L, tag));
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_where (lua_State *L, int level) {
|
||||
lua_Debug ar;
|
||||
if (lua_getstack(L, level, &ar)) { /* check function at level */
|
||||
lua_getinfo(L, "Sl", &ar); /* get info about it */
|
||||
if (ar.currentline > 0) { /* is there info? */
|
||||
lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline);
|
||||
return;
|
||||
}
|
||||
}
|
||||
lua_pushliteral(L, ""); /* else, no information available... */
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
|
||||
va_list argp;
|
||||
va_start(argp, fmt);
|
||||
luaL_where(L, 1);
|
||||
lua_pushvfstring(L, fmt, argp);
|
||||
va_end(argp);
|
||||
lua_concat(L, 2);
|
||||
return lua_error(L);
|
||||
}
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,
|
||||
const char *const lst[]) {
|
||||
const char *name = (def) ? luaL_optstring(L, narg, def) :
|
||||
luaL_checkstring(L, narg);
|
||||
int i;
|
||||
for (i=0; lst[i]; i++)
|
||||
if (strcmp(lst[i], name) == 0)
|
||||
return i;
|
||||
return luaL_argerror(L, narg,
|
||||
lua_pushfstring(L, "invalid option " LUA_QS, name));
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get registry.name */
|
||||
if (!lua_isnil(L, -1)) /* name already in use? */
|
||||
return 0; /* leave previous value on top, but return 0 */
|
||||
lua_pop(L, 1);
|
||||
lua_newtable(L); /* create metatable */
|
||||
lua_pushvalue(L, -1);
|
||||
lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) {
|
||||
void *p = lua_touserdata(L, ud);
|
||||
if (p != NULL) { /* value is a userdata? */
|
||||
if (lua_getmetatable(L, ud)) { /* does it have a metatable? */
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */
|
||||
if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */
|
||||
lua_pop(L, 2); /* remove both metatables */
|
||||
return p;
|
||||
}
|
||||
}
|
||||
}
|
||||
luaL_typerror(L, ud, tname); /* else error */
|
||||
return NULL; /* to avoid warnings */
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) {
|
||||
if (!lua_checkstack(L, space))
|
||||
luaL_error(L, "stack overflow (%s)", mes);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {
|
||||
if (lua_type(L, narg) != t)
|
||||
tag_error(L, narg, t);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_checkany (lua_State *L, int narg) {
|
||||
if (lua_type(L, narg) == LUA_TNONE)
|
||||
luaL_argerror(L, narg, "value expected");
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) {
|
||||
const char *s = lua_tolstring(L, narg, len);
|
||||
if (!s) tag_error(L, narg, LUA_TSTRING);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API const char *luaL_optlstring (lua_State *L, int narg,
|
||||
const char *def, size_t *len) {
|
||||
if (lua_isnoneornil(L, narg)) {
|
||||
if (len)
|
||||
*len = (def ? strlen(def) : 0);
|
||||
return def;
|
||||
}
|
||||
else return luaL_checklstring(L, narg, len);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) {
|
||||
lua_Number d = lua_tonumber(L, narg);
|
||||
if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */
|
||||
tag_error(L, narg, LUA_TNUMBER);
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) {
|
||||
return luaL_opt(L, luaL_checknumber, narg, def);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {
|
||||
lua_Integer d = lua_tointeger(L, narg);
|
||||
if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */
|
||||
tag_error(L, narg, LUA_TNUMBER);
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
|
||||
lua_Integer def) {
|
||||
return luaL_opt(L, luaL_checkinteger, narg, def);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) {
|
||||
if (!lua_getmetatable(L, obj)) /* no metatable? */
|
||||
return 0;
|
||||
lua_pushstring(L, event);
|
||||
lua_rawget(L, -2);
|
||||
if (lua_isnil(L, -1)) {
|
||||
lua_pop(L, 2); /* remove metatable and metafield */
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
lua_remove(L, -2); /* remove only metatable */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
|
||||
obj = abs_index(L, obj);
|
||||
if (!luaL_getmetafield(L, obj, event)) /* no metafield? */
|
||||
return 0;
|
||||
lua_pushvalue(L, obj);
|
||||
lua_call(L, 1, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void (luaL_register) (lua_State *L, const char *libname,
|
||||
const luaL_Reg *l) {
|
||||
luaI_openlib(L, libname, l, 0);
|
||||
}
|
||||
|
||||
|
||||
static int libsize (const luaL_Reg *l) {
|
||||
int size = 0;
|
||||
for (; l->name; l++) size++;
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaI_openlib (lua_State *L, const char *libname,
|
||||
const luaL_Reg *l, int nup) {
|
||||
if (libname) {
|
||||
int size = libsize(l);
|
||||
/* check whether lib already exists */
|
||||
luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);
|
||||
lua_getfield(L, -1, libname); /* get _LOADED[libname] */
|
||||
if (!lua_istable(L, -1)) { /* not found? */
|
||||
lua_pop(L, 1); /* remove previous result */
|
||||
/* try global variable (and create one if it does not exist) */
|
||||
if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL)
|
||||
luaL_error(L, "name conflict for module " LUA_QS, libname);
|
||||
lua_pushvalue(L, -1);
|
||||
lua_setfield(L, -3, libname); /* _LOADED[libname] = new table */
|
||||
}
|
||||
lua_remove(L, -2); /* remove _LOADED table */
|
||||
lua_insert(L, -(nup+1)); /* move library table to below upvalues */
|
||||
}
|
||||
for (; l->name; l++) {
|
||||
int i;
|
||||
for (i=0; i<nup; i++) /* copy upvalues to the top */
|
||||
lua_pushvalue(L, -nup);
|
||||
lua_pushcclosure(L, l->func, nup);
|
||||
lua_setfield(L, -(nup+2), l->name);
|
||||
}
|
||||
lua_pop(L, nup); /* remove upvalues */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** getn-setn: size for arrays
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
#if defined(LUA_COMPAT_GETN)
|
||||
|
||||
static int checkint (lua_State *L, int topop) {
|
||||
int n = (lua_type(L, -1) == LUA_TNUMBER) ? lua_tointeger(L, -1) : -1;
|
||||
lua_pop(L, topop);
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
static void getsizes (lua_State *L) {
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, "LUA_SIZES");
|
||||
if (lua_isnil(L, -1)) { /* no `size' table? */
|
||||
lua_pop(L, 1); /* remove nil */
|
||||
lua_newtable(L); /* create it */
|
||||
lua_pushvalue(L, -1); /* `size' will be its own metatable */
|
||||
lua_setmetatable(L, -2);
|
||||
lua_pushliteral(L, "kv");
|
||||
lua_setfield(L, -2, "__mode"); /* metatable(N).__mode = "kv" */
|
||||
lua_pushvalue(L, -1);
|
||||
lua_setfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); /* store in register */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_setn (lua_State *L, int t, int n) {
|
||||
t = abs_index(L, t);
|
||||
lua_pushliteral(L, "n");
|
||||
lua_rawget(L, t);
|
||||
if (checkint(L, 1) >= 0) { /* is there a numeric field `n'? */
|
||||
lua_pushliteral(L, "n"); /* use it */
|
||||
lua_pushinteger(L, n);
|
||||
lua_rawset(L, t);
|
||||
}
|
||||
else { /* use `sizes' */
|
||||
getsizes(L);
|
||||
lua_pushvalue(L, t);
|
||||
lua_pushinteger(L, n);
|
||||
lua_rawset(L, -3); /* sizes[t] = n */
|
||||
lua_pop(L, 1); /* remove `sizes' */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaL_getn (lua_State *L, int t) {
|
||||
int n;
|
||||
t = abs_index(L, t);
|
||||
lua_pushliteral(L, "n"); /* try t.n */
|
||||
lua_rawget(L, t);
|
||||
if ((n = checkint(L, 1)) >= 0) return n;
|
||||
getsizes(L); /* else try sizes[t] */
|
||||
lua_pushvalue(L, t);
|
||||
lua_rawget(L, -2);
|
||||
if ((n = checkint(L, 2)) >= 0) return n;
|
||||
return (int)lua_objlen(L, t);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
|
||||
LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,
|
||||
const char *r) {
|
||||
const char *wild;
|
||||
size_t l = strlen(p);
|
||||
luaL_Buffer b;
|
||||
luaL_buffinit(L, &b);
|
||||
while ((wild = strstr(s, p)) != NULL) {
|
||||
luaL_addlstring(&b, s, wild - s); /* push prefix */
|
||||
luaL_addstring(&b, r); /* push replacement in place of pattern */
|
||||
s = wild + l; /* continue after `p' */
|
||||
}
|
||||
luaL_addstring(&b, s); /* push last suffix */
|
||||
luaL_pushresult(&b);
|
||||
return lua_tostring(L, -1);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API const char *luaL_findtable (lua_State *L, int idx,
|
||||
const char *fname, int szhint) {
|
||||
const char *e;
|
||||
lua_pushvalue(L, idx);
|
||||
do {
|
||||
e = strchr(fname, '.');
|
||||
if (e == NULL) e = fname + strlen(fname);
|
||||
lua_pushlstring(L, fname, e - fname);
|
||||
lua_rawget(L, -2);
|
||||
if (lua_isnil(L, -1)) { /* no such field? */
|
||||
lua_pop(L, 1); /* remove this nil */
|
||||
lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */
|
||||
lua_pushlstring(L, fname, e - fname);
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -4); /* set new table into field */
|
||||
}
|
||||
else if (!lua_istable(L, -1)) { /* field has a non-table value? */
|
||||
lua_pop(L, 2); /* remove table and value */
|
||||
return fname; /* return problematic part of the name */
|
||||
}
|
||||
lua_remove(L, -2); /* remove previous table */
|
||||
fname = e + 1;
|
||||
} while (*e == '.');
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** Generic Buffer manipulation
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
|
||||
#define bufflen(B) ((B)->p - (B)->buffer)
|
||||
#define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B)))
|
||||
|
||||
#define LIMIT (LUA_MINSTACK/2)
|
||||
|
||||
|
||||
static int emptybuffer (luaL_Buffer *B) {
|
||||
size_t l = bufflen(B);
|
||||
if (l == 0) return 0; /* put nothing on stack */
|
||||
else {
|
||||
lua_pushlstring(B->L, B->buffer, l);
|
||||
B->p = B->buffer;
|
||||
B->lvl++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void adjuststack (luaL_Buffer *B) {
|
||||
if (B->lvl > 1) {
|
||||
lua_State *L = B->L;
|
||||
int toget = 1; /* number of levels to concat */
|
||||
size_t toplen = lua_strlen(L, -1);
|
||||
do {
|
||||
size_t l = lua_strlen(L, -(toget+1));
|
||||
if (B->lvl - toget + 1 >= LIMIT || toplen > l) {
|
||||
toplen += l;
|
||||
toget++;
|
||||
}
|
||||
else break;
|
||||
} while (toget < B->lvl);
|
||||
lua_concat(L, toget);
|
||||
B->lvl = B->lvl - toget + 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {
|
||||
if (emptybuffer(B))
|
||||
adjuststack(B);
|
||||
return B->buffer;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
|
||||
while (l--)
|
||||
luaL_addchar(B, *s++);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {
|
||||
luaL_addlstring(B, s, strlen(s));
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_pushresult (luaL_Buffer *B) {
|
||||
emptybuffer(B);
|
||||
lua_concat(B->L, B->lvl);
|
||||
B->lvl = 1;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_addvalue (luaL_Buffer *B) {
|
||||
lua_State *L = B->L;
|
||||
size_t vl;
|
||||
const char *s = lua_tolstring(L, -1, &vl);
|
||||
if (vl <= bufffree(B)) { /* fit into buffer? */
|
||||
memcpy(B->p, s, vl); /* put it there */
|
||||
B->p += vl;
|
||||
lua_pop(L, 1); /* remove from stack */
|
||||
}
|
||||
else {
|
||||
if (emptybuffer(B))
|
||||
lua_insert(L, -2); /* put buffer before new value */
|
||||
B->lvl++; /* add new value into B stack */
|
||||
adjuststack(B);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {
|
||||
B->L = L;
|
||||
B->p = B->buffer;
|
||||
B->lvl = 0;
|
||||
}
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
LUALIB_API int luaL_ref (lua_State *L, int t) {
|
||||
int ref;
|
||||
t = abs_index(L, t);
|
||||
if (lua_isnil(L, -1)) {
|
||||
lua_pop(L, 1); /* remove from stack */
|
||||
return LUA_REFNIL; /* `nil' has a unique fixed reference */
|
||||
}
|
||||
lua_rawgeti(L, t, FREELIST_REF); /* get first free element */
|
||||
ref = (int)lua_tointeger(L, -1); /* ref = t[FREELIST_REF] */
|
||||
lua_pop(L, 1); /* remove it from stack */
|
||||
if (ref != 0) { /* any free element? */
|
||||
lua_rawgeti(L, t, ref); /* remove it from list */
|
||||
lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */
|
||||
}
|
||||
else { /* no free elements */
|
||||
ref = (int)lua_objlen(L, t);
|
||||
ref++; /* create new reference */
|
||||
}
|
||||
lua_rawseti(L, t, ref);
|
||||
return ref;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
|
||||
if (ref >= 0) {
|
||||
t = abs_index(L, t);
|
||||
lua_rawgeti(L, t, FREELIST_REF);
|
||||
lua_rawseti(L, t, ref); /* t[ref] = t[FREELIST_REF] */
|
||||
lua_pushinteger(L, ref);
|
||||
lua_rawseti(L, t, FREELIST_REF); /* t[FREELIST_REF] = ref */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** Load functions
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
typedef struct LoadF {
|
||||
int extraline;
|
||||
FILE *f;
|
||||
char buff[LUAL_BUFFERSIZE];
|
||||
} LoadF;
|
||||
|
||||
|
||||
static const char *getF (lua_State *L, void *ud, size_t *size) {
|
||||
LoadF *lf = (LoadF *)ud;
|
||||
(void)L;
|
||||
if (lf->extraline) {
|
||||
lf->extraline = 0;
|
||||
*size = 1;
|
||||
return "\n";
|
||||
}
|
||||
if (feof(lf->f)) return NULL;
|
||||
*size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);
|
||||
return (*size > 0) ? lf->buff : NULL;
|
||||
}
|
||||
|
||||
|
||||
static int errfile (lua_State *L, const char *what, int fnameindex) {
|
||||
const char *serr = strerror(errno);
|
||||
const char *filename = lua_tostring(L, fnameindex) + 1;
|
||||
lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);
|
||||
lua_remove(L, fnameindex);
|
||||
return LUA_ERRFILE;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
|
||||
LoadF lf;
|
||||
int status, readstatus;
|
||||
int c;
|
||||
int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */
|
||||
lf.extraline = 0;
|
||||
if (filename == NULL) {
|
||||
lua_pushliteral(L, "=stdin");
|
||||
lf.f = stdin;
|
||||
}
|
||||
else {
|
||||
lua_pushfstring(L, "@%s", filename);
|
||||
lf.f = fopen(filename, "r");
|
||||
if (lf.f == NULL) return errfile(L, "open", fnameindex);
|
||||
}
|
||||
c = getc(lf.f);
|
||||
if (c == '#') { /* Unix exec. file? */
|
||||
lf.extraline = 1;
|
||||
while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */
|
||||
if (c == '\n') c = getc(lf.f);
|
||||
}
|
||||
if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */
|
||||
lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */
|
||||
if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
|
||||
/* skip eventual `#!...' */
|
||||
while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;
|
||||
lf.extraline = 0;
|
||||
}
|
||||
ungetc(c, lf.f);
|
||||
status = lua_load(L, getF, &lf, lua_tostring(L, -1));
|
||||
readstatus = ferror(lf.f);
|
||||
if (filename) fclose(lf.f); /* close file (even in case of errors) */
|
||||
if (readstatus) {
|
||||
lua_settop(L, fnameindex); /* ignore results from `lua_load' */
|
||||
return errfile(L, "read", fnameindex);
|
||||
}
|
||||
lua_remove(L, fnameindex);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
typedef struct LoadS {
|
||||
const char *s;
|
||||
size_t size;
|
||||
} LoadS;
|
||||
|
||||
|
||||
static const char *getS (lua_State *L, void *ud, size_t *size) {
|
||||
LoadS *ls = (LoadS *)ud;
|
||||
(void)L;
|
||||
if (ls->size == 0) return NULL;
|
||||
*size = ls->size;
|
||||
ls->size = 0;
|
||||
return ls->s;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
|
||||
const char *name) {
|
||||
LoadS ls;
|
||||
ls.s = buff;
|
||||
ls.size = size;
|
||||
return lua_load(L, getS, &ls, name);
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) {
|
||||
return luaL_loadbuffer(L, s, strlen(s), s);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
|
||||
(void)ud;
|
||||
(void)osize;
|
||||
if (nsize == 0) {
|
||||
free(ptr);
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
return realloc(ptr, nsize);
|
||||
}
|
||||
|
||||
|
||||
static int panic (lua_State *L) {
|
||||
(void)L; /* to avoid warnings */
|
||||
fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n",
|
||||
lua_tostring(L, -1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API lua_State *luaL_newstate (void) {
|
||||
lua_State *L = lua_newstate(l_alloc, NULL);
|
||||
if (L) lua_atpanic(L, &panic);
|
||||
return L;
|
||||
}
|
||||
|
||||
174
extern/lua-5.1.5/src/lauxlib.h
vendored
Normal file
174
extern/lua-5.1.5/src/lauxlib.h
vendored
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** Auxiliary functions for building Lua libraries
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#ifndef lauxlib_h
|
||||
#define lauxlib_h
|
||||
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
|
||||
#if defined(LUA_COMPAT_GETN)
|
||||
LUALIB_API int (luaL_getn) (lua_State *L, int t);
|
||||
LUALIB_API void (luaL_setn) (lua_State *L, int t, int n);
|
||||
#else
|
||||
#define luaL_getn(L,i) ((int)lua_objlen(L, i))
|
||||
#define luaL_setn(L,i,j) ((void)0) /* no op! */
|
||||
#endif
|
||||
|
||||
#if defined(LUA_COMPAT_OPENLIB)
|
||||
#define luaI_openlib luaL_openlib
|
||||
#endif
|
||||
|
||||
|
||||
/* extra error code for `luaL_load' */
|
||||
#define LUA_ERRFILE (LUA_ERRERR+1)
|
||||
|
||||
|
||||
typedef struct luaL_Reg {
|
||||
const char *name;
|
||||
lua_CFunction func;
|
||||
} luaL_Reg;
|
||||
|
||||
|
||||
|
||||
LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname,
|
||||
const luaL_Reg *l, int nup);
|
||||
LUALIB_API void (luaL_register) (lua_State *L, const char *libname,
|
||||
const luaL_Reg *l);
|
||||
LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
|
||||
LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
|
||||
LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname);
|
||||
LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);
|
||||
LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,
|
||||
size_t *l);
|
||||
LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,
|
||||
const char *def, size_t *l);
|
||||
LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);
|
||||
LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);
|
||||
|
||||
LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
|
||||
LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
|
||||
lua_Integer def);
|
||||
|
||||
LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
|
||||
LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);
|
||||
LUALIB_API void (luaL_checkany) (lua_State *L, int narg);
|
||||
|
||||
LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname);
|
||||
LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
|
||||
|
||||
LUALIB_API void (luaL_where) (lua_State *L, int lvl);
|
||||
LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
|
||||
|
||||
LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
|
||||
const char *const lst[]);
|
||||
|
||||
LUALIB_API int (luaL_ref) (lua_State *L, int t);
|
||||
LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
|
||||
|
||||
LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);
|
||||
LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,
|
||||
const char *name);
|
||||
LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
|
||||
|
||||
LUALIB_API lua_State *(luaL_newstate) (void);
|
||||
|
||||
|
||||
LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
|
||||
const char *r);
|
||||
|
||||
LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,
|
||||
const char *fname, int szhint);
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** ===============================================================
|
||||
** some useful macros
|
||||
** ===============================================================
|
||||
*/
|
||||
|
||||
#define luaL_argcheck(L, cond,numarg,extramsg) \
|
||||
((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
|
||||
#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
|
||||
#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
|
||||
#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
|
||||
#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d)))
|
||||
#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n)))
|
||||
#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d)))
|
||||
|
||||
#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i)))
|
||||
|
||||
#define luaL_dofile(L, fn) \
|
||||
(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
|
||||
|
||||
#define luaL_dostring(L, s) \
|
||||
(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
|
||||
|
||||
#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n)))
|
||||
|
||||
#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** Generic Buffer manipulation
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
|
||||
|
||||
typedef struct luaL_Buffer {
|
||||
char *p; /* current position in buffer */
|
||||
int lvl; /* number of strings in the stack (level) */
|
||||
lua_State *L;
|
||||
char buffer[LUAL_BUFFERSIZE];
|
||||
} luaL_Buffer;
|
||||
|
||||
#define luaL_addchar(B,c) \
|
||||
((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \
|
||||
(*(B)->p++ = (char)(c)))
|
||||
|
||||
/* compatibility only */
|
||||
#define luaL_putchar(B,c) luaL_addchar(B,c)
|
||||
|
||||
#define luaL_addsize(B,n) ((B)->p += (n))
|
||||
|
||||
LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
|
||||
LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B);
|
||||
LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
|
||||
LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
|
||||
LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
|
||||
LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
|
||||
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
/* compatibility with ref system */
|
||||
|
||||
/* pre-defined references */
|
||||
#define LUA_NOREF (-2)
|
||||
#define LUA_REFNIL (-1)
|
||||
|
||||
#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \
|
||||
(lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0))
|
||||
|
||||
#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref))
|
||||
|
||||
#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))
|
||||
|
||||
|
||||
#define luaL_reg luaL_Reg
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
653
extern/lua-5.1.5/src/lbaselib.c
vendored
Normal file
653
extern/lua-5.1.5/src/lbaselib.c
vendored
Normal file
|
|
@ -0,0 +1,653 @@
|
|||
/*
|
||||
** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $
|
||||
** Basic library
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define lbaselib_c
|
||||
#define LUA_LIB
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "lauxlib.h"
|
||||
#include "lualib.h"
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** If your system does not support `stdout', you can just remove this function.
|
||||
** If you need, you can define your own `print' function, following this
|
||||
** model but changing `fputs' to put the strings at a proper place
|
||||
** (a console window or a log file, for instance).
|
||||
*/
|
||||
static int luaB_print (lua_State *L) {
|
||||
int n = lua_gettop(L); /* number of arguments */
|
||||
int i;
|
||||
lua_getglobal(L, "tostring");
|
||||
for (i=1; i<=n; i++) {
|
||||
const char *s;
|
||||
lua_pushvalue(L, -1); /* function to be called */
|
||||
lua_pushvalue(L, i); /* value to print */
|
||||
lua_call(L, 1, 1);
|
||||
s = lua_tostring(L, -1); /* get result */
|
||||
if (s == NULL)
|
||||
return luaL_error(L, LUA_QL("tostring") " must return a string to "
|
||||
LUA_QL("print"));
|
||||
if (i>1) fputs("\t", stdout);
|
||||
fputs(s, stdout);
|
||||
lua_pop(L, 1); /* pop result */
|
||||
}
|
||||
fputs("\n", stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_tonumber (lua_State *L) {
|
||||
int base = luaL_optint(L, 2, 10);
|
||||
if (base == 10) { /* standard conversion */
|
||||
luaL_checkany(L, 1);
|
||||
if (lua_isnumber(L, 1)) {
|
||||
lua_pushnumber(L, lua_tonumber(L, 1));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else {
|
||||
const char *s1 = luaL_checkstring(L, 1);
|
||||
char *s2;
|
||||
unsigned long n;
|
||||
luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");
|
||||
n = strtoul(s1, &s2, base);
|
||||
if (s1 != s2) { /* at least one valid digit? */
|
||||
while (isspace((unsigned char)(*s2))) s2++; /* skip trailing spaces */
|
||||
if (*s2 == '\0') { /* no invalid trailing characters? */
|
||||
lua_pushnumber(L, (lua_Number)n);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
lua_pushnil(L); /* else not a number */
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_error (lua_State *L) {
|
||||
int level = luaL_optint(L, 2, 1);
|
||||
lua_settop(L, 1);
|
||||
if (lua_isstring(L, 1) && level > 0) { /* add extra information? */
|
||||
luaL_where(L, level);
|
||||
lua_pushvalue(L, 1);
|
||||
lua_concat(L, 2);
|
||||
}
|
||||
return lua_error(L);
|
||||
}
|
||||
|
||||
|
||||
static int luaB_getmetatable (lua_State *L) {
|
||||
luaL_checkany(L, 1);
|
||||
if (!lua_getmetatable(L, 1)) {
|
||||
lua_pushnil(L);
|
||||
return 1; /* no metatable */
|
||||
}
|
||||
luaL_getmetafield(L, 1, "__metatable");
|
||||
return 1; /* returns either __metatable field (if present) or metatable */
|
||||
}
|
||||
|
||||
|
||||
static int luaB_setmetatable (lua_State *L) {
|
||||
int t = lua_type(L, 2);
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,
|
||||
"nil or table expected");
|
||||
if (luaL_getmetafield(L, 1, "__metatable"))
|
||||
luaL_error(L, "cannot change a protected metatable");
|
||||
lua_settop(L, 2);
|
||||
lua_setmetatable(L, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static void getfunc (lua_State *L, int opt) {
|
||||
if (lua_isfunction(L, 1)) lua_pushvalue(L, 1);
|
||||
else {
|
||||
lua_Debug ar;
|
||||
int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1);
|
||||
luaL_argcheck(L, level >= 0, 1, "level must be non-negative");
|
||||
if (lua_getstack(L, level, &ar) == 0)
|
||||
luaL_argerror(L, 1, "invalid level");
|
||||
lua_getinfo(L, "f", &ar);
|
||||
if (lua_isnil(L, -1))
|
||||
luaL_error(L, "no function environment for tail call at level %d",
|
||||
level);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int luaB_getfenv (lua_State *L) {
|
||||
getfunc(L, 1);
|
||||
if (lua_iscfunction(L, -1)) /* is a C function? */
|
||||
lua_pushvalue(L, LUA_GLOBALSINDEX); /* return the thread's global env. */
|
||||
else
|
||||
lua_getfenv(L, -1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_setfenv (lua_State *L) {
|
||||
luaL_checktype(L, 2, LUA_TTABLE);
|
||||
getfunc(L, 0);
|
||||
lua_pushvalue(L, 2);
|
||||
if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) {
|
||||
/* change environment of current thread */
|
||||
lua_pushthread(L);
|
||||
lua_insert(L, -2);
|
||||
lua_setfenv(L, -2);
|
||||
return 0;
|
||||
}
|
||||
else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0)
|
||||
luaL_error(L,
|
||||
LUA_QL("setfenv") " cannot change environment of given object");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_rawequal (lua_State *L) {
|
||||
luaL_checkany(L, 1);
|
||||
luaL_checkany(L, 2);
|
||||
lua_pushboolean(L, lua_rawequal(L, 1, 2));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_rawget (lua_State *L) {
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
luaL_checkany(L, 2);
|
||||
lua_settop(L, 2);
|
||||
lua_rawget(L, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int luaB_rawset (lua_State *L) {
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
luaL_checkany(L, 2);
|
||||
luaL_checkany(L, 3);
|
||||
lua_settop(L, 3);
|
||||
lua_rawset(L, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_gcinfo (lua_State *L) {
|
||||
lua_pushinteger(L, lua_getgccount(L));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_collectgarbage (lua_State *L) {
|
||||
static const char *const opts[] = {"stop", "restart", "collect",
|
||||
"count", "step", "setpause", "setstepmul", NULL};
|
||||
static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
|
||||
LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL};
|
||||
int o = luaL_checkoption(L, 1, "collect", opts);
|
||||
int ex = luaL_optint(L, 2, 0);
|
||||
int res = lua_gc(L, optsnum[o], ex);
|
||||
switch (optsnum[o]) {
|
||||
case LUA_GCCOUNT: {
|
||||
int b = lua_gc(L, LUA_GCCOUNTB, 0);
|
||||
lua_pushnumber(L, res + ((lua_Number)b/1024));
|
||||
return 1;
|
||||
}
|
||||
case LUA_GCSTEP: {
|
||||
lua_pushboolean(L, res);
|
||||
return 1;
|
||||
}
|
||||
default: {
|
||||
lua_pushnumber(L, res);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int luaB_type (lua_State *L) {
|
||||
luaL_checkany(L, 1);
|
||||
lua_pushstring(L, luaL_typename(L, 1));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_next (lua_State *L) {
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
lua_settop(L, 2); /* create a 2nd argument if there isn't one */
|
||||
if (lua_next(L, 1))
|
||||
return 2;
|
||||
else {
|
||||
lua_pushnil(L);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int luaB_pairs (lua_State *L) {
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */
|
||||
lua_pushvalue(L, 1); /* state, */
|
||||
lua_pushnil(L); /* and initial value */
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
static int ipairsaux (lua_State *L) {
|
||||
int i = luaL_checkint(L, 2);
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
i++; /* next value */
|
||||
lua_pushinteger(L, i);
|
||||
lua_rawgeti(L, 1, i);
|
||||
return (lua_isnil(L, -1)) ? 0 : 2;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_ipairs (lua_State *L) {
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */
|
||||
lua_pushvalue(L, 1); /* state, */
|
||||
lua_pushinteger(L, 0); /* and initial value */
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
static int load_aux (lua_State *L, int status) {
|
||||
if (status == 0) /* OK? */
|
||||
return 1;
|
||||
else {
|
||||
lua_pushnil(L);
|
||||
lua_insert(L, -2); /* put before error message */
|
||||
return 2; /* return nil plus error message */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int luaB_loadstring (lua_State *L) {
|
||||
size_t l;
|
||||
const char *s = luaL_checklstring(L, 1, &l);
|
||||
const char *chunkname = luaL_optstring(L, 2, s);
|
||||
return load_aux(L, luaL_loadbuffer(L, s, l, chunkname));
|
||||
}
|
||||
|
||||
|
||||
static int luaB_loadfile (lua_State *L) {
|
||||
const char *fname = luaL_optstring(L, 1, NULL);
|
||||
return load_aux(L, luaL_loadfile(L, fname));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Reader for generic `load' function: `lua_load' uses the
|
||||
** stack for internal stuff, so the reader cannot change the
|
||||
** stack top. Instead, it keeps its resulting string in a
|
||||
** reserved slot inside the stack.
|
||||
*/
|
||||
static const char *generic_reader (lua_State *L, void *ud, size_t *size) {
|
||||
(void)ud; /* to avoid warnings */
|
||||
luaL_checkstack(L, 2, "too many nested functions");
|
||||
lua_pushvalue(L, 1); /* get function */
|
||||
lua_call(L, 0, 1); /* call it */
|
||||
if (lua_isnil(L, -1)) {
|
||||
*size = 0;
|
||||
return NULL;
|
||||
}
|
||||
else if (lua_isstring(L, -1)) {
|
||||
lua_replace(L, 3); /* save string in a reserved stack slot */
|
||||
return lua_tolstring(L, 3, size);
|
||||
}
|
||||
else luaL_error(L, "reader function must return a string");
|
||||
return NULL; /* to avoid warnings */
|
||||
}
|
||||
|
||||
|
||||
static int luaB_load (lua_State *L) {
|
||||
int status;
|
||||
const char *cname = luaL_optstring(L, 2, "=(load)");
|
||||
luaL_checktype(L, 1, LUA_TFUNCTION);
|
||||
lua_settop(L, 3); /* function, eventual name, plus one reserved slot */
|
||||
status = lua_load(L, generic_reader, NULL, cname);
|
||||
return load_aux(L, status);
|
||||
}
|
||||
|
||||
|
||||
static int luaB_dofile (lua_State *L) {
|
||||
const char *fname = luaL_optstring(L, 1, NULL);
|
||||
int n = lua_gettop(L);
|
||||
if (luaL_loadfile(L, fname) != 0) lua_error(L);
|
||||
lua_call(L, 0, LUA_MULTRET);
|
||||
return lua_gettop(L) - n;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_assert (lua_State *L) {
|
||||
luaL_checkany(L, 1);
|
||||
if (!lua_toboolean(L, 1))
|
||||
return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!"));
|
||||
return lua_gettop(L);
|
||||
}
|
||||
|
||||
|
||||
static int luaB_unpack (lua_State *L) {
|
||||
int i, e, n;
|
||||
luaL_checktype(L, 1, LUA_TTABLE);
|
||||
i = luaL_optint(L, 2, 1);
|
||||
e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));
|
||||
if (i > e) return 0; /* empty range */
|
||||
n = e - i + 1; /* number of elements */
|
||||
if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */
|
||||
return luaL_error(L, "too many results to unpack");
|
||||
lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */
|
||||
while (i++ < e) /* push arg[i + 1...e] */
|
||||
lua_rawgeti(L, 1, i);
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_select (lua_State *L) {
|
||||
int n = lua_gettop(L);
|
||||
if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') {
|
||||
lua_pushinteger(L, n-1);
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
int i = luaL_checkint(L, 1);
|
||||
if (i < 0) i = n + i;
|
||||
else if (i > n) i = n;
|
||||
luaL_argcheck(L, 1 <= i, 1, "index out of range");
|
||||
return n - i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int luaB_pcall (lua_State *L) {
|
||||
int status;
|
||||
luaL_checkany(L, 1);
|
||||
status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0);
|
||||
lua_pushboolean(L, (status == 0));
|
||||
lua_insert(L, 1);
|
||||
return lua_gettop(L); /* return status + all results */
|
||||
}
|
||||
|
||||
|
||||
static int luaB_xpcall (lua_State *L) {
|
||||
int status;
|
||||
luaL_checkany(L, 2);
|
||||
lua_settop(L, 2);
|
||||
lua_insert(L, 1); /* put error function under function to be called */
|
||||
status = lua_pcall(L, 0, LUA_MULTRET, 1);
|
||||
lua_pushboolean(L, (status == 0));
|
||||
lua_replace(L, 1);
|
||||
return lua_gettop(L); /* return status + all results */
|
||||
}
|
||||
|
||||
|
||||
static int luaB_tostring (lua_State *L) {
|
||||
luaL_checkany(L, 1);
|
||||
if (luaL_callmeta(L, 1, "__tostring")) /* is there a metafield? */
|
||||
return 1; /* use its value */
|
||||
switch (lua_type(L, 1)) {
|
||||
case LUA_TNUMBER:
|
||||
lua_pushstring(L, lua_tostring(L, 1));
|
||||
break;
|
||||
case LUA_TSTRING:
|
||||
lua_pushvalue(L, 1);
|
||||
break;
|
||||
case LUA_TBOOLEAN:
|
||||
lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false"));
|
||||
break;
|
||||
case LUA_TNIL:
|
||||
lua_pushliteral(L, "nil");
|
||||
break;
|
||||
default:
|
||||
lua_pushfstring(L, "%s: %p", luaL_typename(L, 1), lua_topointer(L, 1));
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_newproxy (lua_State *L) {
|
||||
lua_settop(L, 1);
|
||||
lua_newuserdata(L, 0); /* create proxy */
|
||||
if (lua_toboolean(L, 1) == 0)
|
||||
return 1; /* no metatable */
|
||||
else if (lua_isboolean(L, 1)) {
|
||||
lua_newtable(L); /* create a new metatable `m' ... */
|
||||
lua_pushvalue(L, -1); /* ... and mark `m' as a valid metatable */
|
||||
lua_pushboolean(L, 1);
|
||||
lua_rawset(L, lua_upvalueindex(1)); /* weaktable[m] = true */
|
||||
}
|
||||
else {
|
||||
int validproxy = 0; /* to check if weaktable[metatable(u)] == true */
|
||||
if (lua_getmetatable(L, 1)) {
|
||||
lua_rawget(L, lua_upvalueindex(1));
|
||||
validproxy = lua_toboolean(L, -1);
|
||||
lua_pop(L, 1); /* remove value */
|
||||
}
|
||||
luaL_argcheck(L, validproxy, 1, "boolean or proxy expected");
|
||||
lua_getmetatable(L, 1); /* metatable is valid; get it */
|
||||
}
|
||||
lua_setmetatable(L, 2);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static const luaL_Reg base_funcs[] = {
|
||||
{"assert", luaB_assert},
|
||||
{"collectgarbage", luaB_collectgarbage},
|
||||
{"dofile", luaB_dofile},
|
||||
{"error", luaB_error},
|
||||
{"gcinfo", luaB_gcinfo},
|
||||
{"getfenv", luaB_getfenv},
|
||||
{"getmetatable", luaB_getmetatable},
|
||||
{"loadfile", luaB_loadfile},
|
||||
{"load", luaB_load},
|
||||
{"loadstring", luaB_loadstring},
|
||||
{"next", luaB_next},
|
||||
{"pcall", luaB_pcall},
|
||||
{"print", luaB_print},
|
||||
{"rawequal", luaB_rawequal},
|
||||
{"rawget", luaB_rawget},
|
||||
{"rawset", luaB_rawset},
|
||||
{"select", luaB_select},
|
||||
{"setfenv", luaB_setfenv},
|
||||
{"setmetatable", luaB_setmetatable},
|
||||
{"tonumber", luaB_tonumber},
|
||||
{"tostring", luaB_tostring},
|
||||
{"type", luaB_type},
|
||||
{"unpack", luaB_unpack},
|
||||
{"xpcall", luaB_xpcall},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** Coroutine library
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
#define CO_RUN 0 /* running */
|
||||
#define CO_SUS 1 /* suspended */
|
||||
#define CO_NOR 2 /* 'normal' (it resumed another coroutine) */
|
||||
#define CO_DEAD 3
|
||||
|
||||
static const char *const statnames[] =
|
||||
{"running", "suspended", "normal", "dead"};
|
||||
|
||||
static int costatus (lua_State *L, lua_State *co) {
|
||||
if (L == co) return CO_RUN;
|
||||
switch (lua_status(co)) {
|
||||
case LUA_YIELD:
|
||||
return CO_SUS;
|
||||
case 0: {
|
||||
lua_Debug ar;
|
||||
if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */
|
||||
return CO_NOR; /* it is running */
|
||||
else if (lua_gettop(co) == 0)
|
||||
return CO_DEAD;
|
||||
else
|
||||
return CO_SUS; /* initial state */
|
||||
}
|
||||
default: /* some error occured */
|
||||
return CO_DEAD;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int luaB_costatus (lua_State *L) {
|
||||
lua_State *co = lua_tothread(L, 1);
|
||||
luaL_argcheck(L, co, 1, "coroutine expected");
|
||||
lua_pushstring(L, statnames[costatus(L, co)]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int auxresume (lua_State *L, lua_State *co, int narg) {
|
||||
int status = costatus(L, co);
|
||||
if (!lua_checkstack(co, narg))
|
||||
luaL_error(L, "too many arguments to resume");
|
||||
if (status != CO_SUS) {
|
||||
lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]);
|
||||
return -1; /* error flag */
|
||||
}
|
||||
lua_xmove(L, co, narg);
|
||||
lua_setlevel(L, co);
|
||||
status = lua_resume(co, narg);
|
||||
if (status == 0 || status == LUA_YIELD) {
|
||||
int nres = lua_gettop(co);
|
||||
if (!lua_checkstack(L, nres + 1))
|
||||
luaL_error(L, "too many results to resume");
|
||||
lua_xmove(co, L, nres); /* move yielded values */
|
||||
return nres;
|
||||
}
|
||||
else {
|
||||
lua_xmove(co, L, 1); /* move error message */
|
||||
return -1; /* error flag */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int luaB_coresume (lua_State *L) {
|
||||
lua_State *co = lua_tothread(L, 1);
|
||||
int r;
|
||||
luaL_argcheck(L, co, 1, "coroutine expected");
|
||||
r = auxresume(L, co, lua_gettop(L) - 1);
|
||||
if (r < 0) {
|
||||
lua_pushboolean(L, 0);
|
||||
lua_insert(L, -2);
|
||||
return 2; /* return false + error message */
|
||||
}
|
||||
else {
|
||||
lua_pushboolean(L, 1);
|
||||
lua_insert(L, -(r + 1));
|
||||
return r + 1; /* return true + `resume' returns */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int luaB_auxwrap (lua_State *L) {
|
||||
lua_State *co = lua_tothread(L, lua_upvalueindex(1));
|
||||
int r = auxresume(L, co, lua_gettop(L));
|
||||
if (r < 0) {
|
||||
if (lua_isstring(L, -1)) { /* error object is a string? */
|
||||
luaL_where(L, 1); /* add extra info */
|
||||
lua_insert(L, -2);
|
||||
lua_concat(L, 2);
|
||||
}
|
||||
lua_error(L); /* propagate error */
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_cocreate (lua_State *L) {
|
||||
lua_State *NL = lua_newthread(L);
|
||||
luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1,
|
||||
"Lua function expected");
|
||||
lua_pushvalue(L, 1); /* move function to top */
|
||||
lua_xmove(L, NL, 1); /* move function from L to NL */
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_cowrap (lua_State *L) {
|
||||
luaB_cocreate(L);
|
||||
lua_pushcclosure(L, luaB_auxwrap, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int luaB_yield (lua_State *L) {
|
||||
return lua_yield(L, lua_gettop(L));
|
||||
}
|
||||
|
||||
|
||||
static int luaB_corunning (lua_State *L) {
|
||||
if (lua_pushthread(L))
|
||||
lua_pushnil(L); /* main thread is not a coroutine */
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static const luaL_Reg co_funcs[] = {
|
||||
{"create", luaB_cocreate},
|
||||
{"resume", luaB_coresume},
|
||||
{"running", luaB_corunning},
|
||||
{"status", luaB_costatus},
|
||||
{"wrap", luaB_cowrap},
|
||||
{"yield", luaB_yield},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
static void auxopen (lua_State *L, const char *name,
|
||||
lua_CFunction f, lua_CFunction u) {
|
||||
lua_pushcfunction(L, u);
|
||||
lua_pushcclosure(L, f, 1);
|
||||
lua_setfield(L, -2, name);
|
||||
}
|
||||
|
||||
|
||||
static void base_open (lua_State *L) {
|
||||
/* set global _G */
|
||||
lua_pushvalue(L, LUA_GLOBALSINDEX);
|
||||
lua_setglobal(L, "_G");
|
||||
/* open lib into global table */
|
||||
luaL_register(L, "_G", base_funcs);
|
||||
lua_pushliteral(L, LUA_VERSION);
|
||||
lua_setglobal(L, "_VERSION"); /* set global _VERSION */
|
||||
/* `ipairs' and `pairs' need auxiliary functions as upvalues */
|
||||
auxopen(L, "ipairs", luaB_ipairs, ipairsaux);
|
||||
auxopen(L, "pairs", luaB_pairs, luaB_next);
|
||||
/* `newproxy' needs a weaktable as upvalue */
|
||||
lua_createtable(L, 0, 1); /* new table `w' */
|
||||
lua_pushvalue(L, -1); /* `w' will be its own metatable */
|
||||
lua_setmetatable(L, -2);
|
||||
lua_pushliteral(L, "kv");
|
||||
lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */
|
||||
lua_pushcclosure(L, luaB_newproxy, 1);
|
||||
lua_setglobal(L, "newproxy"); /* set global `newproxy' */
|
||||
}
|
||||
|
||||
|
||||
LUALIB_API int luaopen_base (lua_State *L) {
|
||||
base_open(L);
|
||||
luaL_register(L, LUA_COLIBNAME, co_funcs);
|
||||
return 2;
|
||||
}
|
||||
|
||||
831
extern/lua-5.1.5/src/lcode.c
vendored
Normal file
831
extern/lua-5.1.5/src/lcode.c
vendored
Normal file
|
|
@ -0,0 +1,831 @@
|
|||
/*
|
||||
** $Id: lcode.c,v 2.25.1.5 2011/01/31 14:53:16 roberto Exp $
|
||||
** Code generator for Lua
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#define lcode_c
|
||||
#define LUA_CORE
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "lcode.h"
|
||||
#include "ldebug.h"
|
||||
#include "ldo.h"
|
||||
#include "lgc.h"
|
||||
#include "llex.h"
|
||||
#include "lmem.h"
|
||||
#include "lobject.h"
|
||||
#include "lopcodes.h"
|
||||
#include "lparser.h"
|
||||
#include "ltable.h"
|
||||
|
||||
|
||||
#define hasjumps(e) ((e)->t != (e)->f)
|
||||
|
||||
|
||||
static int isnumeral(expdesc *e) {
|
||||
return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP);
|
||||
}
|
||||
|
||||
|
||||
void luaK_nil (FuncState *fs, int from, int n) {
|
||||
Instruction *previous;
|
||||
if (fs->pc > fs->lasttarget) { /* no jumps to current position? */
|
||||
if (fs->pc == 0) { /* function start? */
|
||||
if (from >= fs->nactvar)
|
||||
return; /* positions are already clean */
|
||||
}
|
||||
else {
|
||||
previous = &fs->f->code[fs->pc-1];
|
||||
if (GET_OPCODE(*previous) == OP_LOADNIL) {
|
||||
int pfrom = GETARG_A(*previous);
|
||||
int pto = GETARG_B(*previous);
|
||||
if (pfrom <= from && from <= pto+1) { /* can connect both? */
|
||||
if (from+n-1 > pto)
|
||||
SETARG_B(*previous, from+n-1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0); /* else no optimization */
|
||||
}
|
||||
|
||||
|
||||
int luaK_jump (FuncState *fs) {
|
||||
int jpc = fs->jpc; /* save list of jumps to here */
|
||||
int j;
|
||||
fs->jpc = NO_JUMP;
|
||||
j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP);
|
||||
luaK_concat(fs, &j, jpc); /* keep them on hold */
|
||||
return j;
|
||||
}
|
||||
|
||||
|
||||
void luaK_ret (FuncState *fs, int first, int nret) {
|
||||
luaK_codeABC(fs, OP_RETURN, first, nret+1, 0);
|
||||
}
|
||||
|
||||
|
||||
static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {
|
||||
luaK_codeABC(fs, op, A, B, C);
|
||||
return luaK_jump(fs);
|
||||
}
|
||||
|
||||
|
||||
static void fixjump (FuncState *fs, int pc, int dest) {
|
||||
Instruction *jmp = &fs->f->code[pc];
|
||||
int offset = dest-(pc+1);
|
||||
lua_assert(dest != NO_JUMP);
|
||||
if (abs(offset) > MAXARG_sBx)
|
||||
luaX_syntaxerror(fs->ls, "control structure too long");
|
||||
SETARG_sBx(*jmp, offset);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** returns current `pc' and marks it as a jump target (to avoid wrong
|
||||
** optimizations with consecutive instructions not in the same basic block).
|
||||
*/
|
||||
int luaK_getlabel (FuncState *fs) {
|
||||
fs->lasttarget = fs->pc;
|
||||
return fs->pc;
|
||||
}
|
||||
|
||||
|
||||
static int getjump (FuncState *fs, int pc) {
|
||||
int offset = GETARG_sBx(fs->f->code[pc]);
|
||||
if (offset == NO_JUMP) /* point to itself represents end of list */
|
||||
return NO_JUMP; /* end of list */
|
||||
else
|
||||
return (pc+1)+offset; /* turn offset into absolute position */
|
||||
}
|
||||
|
||||
|
||||
static Instruction *getjumpcontrol (FuncState *fs, int pc) {
|
||||
Instruction *pi = &fs->f->code[pc];
|
||||
if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1))))
|
||||
return pi-1;
|
||||
else
|
||||
return pi;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** check whether list has any jump that do not produce a value
|
||||
** (or produce an inverted value)
|
||||
*/
|
||||
static int need_value (FuncState *fs, int list) {
|
||||
for (; list != NO_JUMP; list = getjump(fs, list)) {
|
||||
Instruction i = *getjumpcontrol(fs, list);
|
||||
if (GET_OPCODE(i) != OP_TESTSET) return 1;
|
||||
}
|
||||
return 0; /* not found */
|
||||
}
|
||||
|
||||
|
||||
static int patchtestreg (FuncState *fs, int node, int reg) {
|
||||
Instruction *i = getjumpcontrol(fs, node);
|
||||
if (GET_OPCODE(*i) != OP_TESTSET)
|
||||
return 0; /* cannot patch other instructions */
|
||||
if (reg != NO_REG && reg != GETARG_B(*i))
|
||||
SETARG_A(*i, reg);
|
||||
else /* no register to put value or register already has the value */
|
||||
*i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static void removevalues (FuncState *fs, int list) {
|
||||
for (; list != NO_JUMP; list = getjump(fs, list))
|
||||
patchtestreg(fs, list, NO_REG);
|
||||
}
|
||||
|
||||
|
||||
static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,
|
||||
int dtarget) {
|
||||
while (list != NO_JUMP) {
|
||||
int next = getjump(fs, list);
|
||||
if (patchtestreg(fs, list, reg))
|
||||
fixjump(fs, list, vtarget);
|
||||
else
|
||||
fixjump(fs, list, dtarget); /* jump to default target */
|
||||
list = next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void dischargejpc (FuncState *fs) {
|
||||
patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc);
|
||||
fs->jpc = NO_JUMP;
|
||||
}
|
||||
|
||||
|
||||
void luaK_patchlist (FuncState *fs, int list, int target) {
|
||||
if (target == fs->pc)
|
||||
luaK_patchtohere(fs, list);
|
||||
else {
|
||||
lua_assert(target < fs->pc);
|
||||
patchlistaux(fs, list, target, NO_REG, target);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaK_patchtohere (FuncState *fs, int list) {
|
||||
luaK_getlabel(fs);
|
||||
luaK_concat(fs, &fs->jpc, list);
|
||||
}
|
||||
|
||||
|
||||
void luaK_concat (FuncState *fs, int *l1, int l2) {
|
||||
if (l2 == NO_JUMP) return;
|
||||
else if (*l1 == NO_JUMP)
|
||||
*l1 = l2;
|
||||
else {
|
||||
int list = *l1;
|
||||
int next;
|
||||
while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */
|
||||
list = next;
|
||||
fixjump(fs, list, l2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaK_checkstack (FuncState *fs, int n) {
|
||||
int newstack = fs->freereg + n;
|
||||
if (newstack > fs->f->maxstacksize) {
|
||||
if (newstack >= MAXSTACK)
|
||||
luaX_syntaxerror(fs->ls, "function or expression too complex");
|
||||
fs->f->maxstacksize = cast_byte(newstack);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaK_reserveregs (FuncState *fs, int n) {
|
||||
luaK_checkstack(fs, n);
|
||||
fs->freereg += n;
|
||||
}
|
||||
|
||||
|
||||
static void freereg (FuncState *fs, int reg) {
|
||||
if (!ISK(reg) && reg >= fs->nactvar) {
|
||||
fs->freereg--;
|
||||
lua_assert(reg == fs->freereg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void freeexp (FuncState *fs, expdesc *e) {
|
||||
if (e->k == VNONRELOC)
|
||||
freereg(fs, e->u.s.info);
|
||||
}
|
||||
|
||||
|
||||
static int addk (FuncState *fs, TValue *k, TValue *v) {
|
||||
lua_State *L = fs->L;
|
||||
TValue *idx = luaH_set(L, fs->h, k);
|
||||
Proto *f = fs->f;
|
||||
int oldsize = f->sizek;
|
||||
if (ttisnumber(idx)) {
|
||||
lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v));
|
||||
return cast_int(nvalue(idx));
|
||||
}
|
||||
else { /* constant not found; create a new entry */
|
||||
setnvalue(idx, cast_num(fs->nk));
|
||||
luaM_growvector(L, f->k, fs->nk, f->sizek, TValue,
|
||||
MAXARG_Bx, "constant table overflow");
|
||||
while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);
|
||||
setobj(L, &f->k[fs->nk], v);
|
||||
luaC_barrier(L, f, v);
|
||||
return fs->nk++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int luaK_stringK (FuncState *fs, TString *s) {
|
||||
TValue o;
|
||||
setsvalue(fs->L, &o, s);
|
||||
return addk(fs, &o, &o);
|
||||
}
|
||||
|
||||
|
||||
int luaK_numberK (FuncState *fs, lua_Number r) {
|
||||
TValue o;
|
||||
setnvalue(&o, r);
|
||||
return addk(fs, &o, &o);
|
||||
}
|
||||
|
||||
|
||||
static int boolK (FuncState *fs, int b) {
|
||||
TValue o;
|
||||
setbvalue(&o, b);
|
||||
return addk(fs, &o, &o);
|
||||
}
|
||||
|
||||
|
||||
static int nilK (FuncState *fs) {
|
||||
TValue k, v;
|
||||
setnilvalue(&v);
|
||||
/* cannot use nil as key; instead use table itself to represent nil */
|
||||
sethvalue(fs->L, &k, fs->h);
|
||||
return addk(fs, &k, &v);
|
||||
}
|
||||
|
||||
|
||||
void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
|
||||
if (e->k == VCALL) { /* expression is an open function call? */
|
||||
SETARG_C(getcode(fs, e), nresults+1);
|
||||
}
|
||||
else if (e->k == VVARARG) {
|
||||
SETARG_B(getcode(fs, e), nresults+1);
|
||||
SETARG_A(getcode(fs, e), fs->freereg);
|
||||
luaK_reserveregs(fs, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaK_setoneret (FuncState *fs, expdesc *e) {
|
||||
if (e->k == VCALL) { /* expression is an open function call? */
|
||||
e->k = VNONRELOC;
|
||||
e->u.s.info = GETARG_A(getcode(fs, e));
|
||||
}
|
||||
else if (e->k == VVARARG) {
|
||||
SETARG_B(getcode(fs, e), 2);
|
||||
e->k = VRELOCABLE; /* can relocate its simple result */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaK_dischargevars (FuncState *fs, expdesc *e) {
|
||||
switch (e->k) {
|
||||
case VLOCAL: {
|
||||
e->k = VNONRELOC;
|
||||
break;
|
||||
}
|
||||
case VUPVAL: {
|
||||
e->u.s.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.s.info, 0);
|
||||
e->k = VRELOCABLE;
|
||||
break;
|
||||
}
|
||||
case VGLOBAL: {
|
||||
e->u.s.info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->u.s.info);
|
||||
e->k = VRELOCABLE;
|
||||
break;
|
||||
}
|
||||
case VINDEXED: {
|
||||
freereg(fs, e->u.s.aux);
|
||||
freereg(fs, e->u.s.info);
|
||||
e->u.s.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.s.info, e->u.s.aux);
|
||||
e->k = VRELOCABLE;
|
||||
break;
|
||||
}
|
||||
case VVARARG:
|
||||
case VCALL: {
|
||||
luaK_setoneret(fs, e);
|
||||
break;
|
||||
}
|
||||
default: break; /* there is one value available (somewhere) */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int code_label (FuncState *fs, int A, int b, int jump) {
|
||||
luaK_getlabel(fs); /* those instructions may be jump targets */
|
||||
return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump);
|
||||
}
|
||||
|
||||
|
||||
static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
|
||||
luaK_dischargevars(fs, e);
|
||||
switch (e->k) {
|
||||
case VNIL: {
|
||||
luaK_nil(fs, reg, 1);
|
||||
break;
|
||||
}
|
||||
case VFALSE: case VTRUE: {
|
||||
luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0);
|
||||
break;
|
||||
}
|
||||
case VK: {
|
||||
luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info);
|
||||
break;
|
||||
}
|
||||
case VKNUM: {
|
||||
luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval));
|
||||
break;
|
||||
}
|
||||
case VRELOCABLE: {
|
||||
Instruction *pc = &getcode(fs, e);
|
||||
SETARG_A(*pc, reg);
|
||||
break;
|
||||
}
|
||||
case VNONRELOC: {
|
||||
if (reg != e->u.s.info)
|
||||
luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
lua_assert(e->k == VVOID || e->k == VJMP);
|
||||
return; /* nothing to do... */
|
||||
}
|
||||
}
|
||||
e->u.s.info = reg;
|
||||
e->k = VNONRELOC;
|
||||
}
|
||||
|
||||
|
||||
static void discharge2anyreg (FuncState *fs, expdesc *e) {
|
||||
if (e->k != VNONRELOC) {
|
||||
luaK_reserveregs(fs, 1);
|
||||
discharge2reg(fs, e, fs->freereg-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void exp2reg (FuncState *fs, expdesc *e, int reg) {
|
||||
discharge2reg(fs, e, reg);
|
||||
if (e->k == VJMP)
|
||||
luaK_concat(fs, &e->t, e->u.s.info); /* put this jump in `t' list */
|
||||
if (hasjumps(e)) {
|
||||
int final; /* position after whole expression */
|
||||
int p_f = NO_JUMP; /* position of an eventual LOAD false */
|
||||
int p_t = NO_JUMP; /* position of an eventual LOAD true */
|
||||
if (need_value(fs, e->t) || need_value(fs, e->f)) {
|
||||
int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs);
|
||||
p_f = code_label(fs, reg, 0, 1);
|
||||
p_t = code_label(fs, reg, 1, 0);
|
||||
luaK_patchtohere(fs, fj);
|
||||
}
|
||||
final = luaK_getlabel(fs);
|
||||
patchlistaux(fs, e->f, final, reg, p_f);
|
||||
patchlistaux(fs, e->t, final, reg, p_t);
|
||||
}
|
||||
e->f = e->t = NO_JUMP;
|
||||
e->u.s.info = reg;
|
||||
e->k = VNONRELOC;
|
||||
}
|
||||
|
||||
|
||||
void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
|
||||
luaK_dischargevars(fs, e);
|
||||
freeexp(fs, e);
|
||||
luaK_reserveregs(fs, 1);
|
||||
exp2reg(fs, e, fs->freereg - 1);
|
||||
}
|
||||
|
||||
|
||||
int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
|
||||
luaK_dischargevars(fs, e);
|
||||
if (e->k == VNONRELOC) {
|
||||
if (!hasjumps(e)) return e->u.s.info; /* exp is already in a register */
|
||||
if (e->u.s.info >= fs->nactvar) { /* reg. is not a local? */
|
||||
exp2reg(fs, e, e->u.s.info); /* put value on it */
|
||||
return e->u.s.info;
|
||||
}
|
||||
}
|
||||
luaK_exp2nextreg(fs, e); /* default */
|
||||
return e->u.s.info;
|
||||
}
|
||||
|
||||
|
||||
void luaK_exp2val (FuncState *fs, expdesc *e) {
|
||||
if (hasjumps(e))
|
||||
luaK_exp2anyreg(fs, e);
|
||||
else
|
||||
luaK_dischargevars(fs, e);
|
||||
}
|
||||
|
||||
|
||||
int luaK_exp2RK (FuncState *fs, expdesc *e) {
|
||||
luaK_exp2val(fs, e);
|
||||
switch (e->k) {
|
||||
case VKNUM:
|
||||
case VTRUE:
|
||||
case VFALSE:
|
||||
case VNIL: {
|
||||
if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */
|
||||
e->u.s.info = (e->k == VNIL) ? nilK(fs) :
|
||||
(e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) :
|
||||
boolK(fs, (e->k == VTRUE));
|
||||
e->k = VK;
|
||||
return RKASK(e->u.s.info);
|
||||
}
|
||||
else break;
|
||||
}
|
||||
case VK: {
|
||||
if (e->u.s.info <= MAXINDEXRK) /* constant fit in argC? */
|
||||
return RKASK(e->u.s.info);
|
||||
else break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
/* not a constant in the right range: put it in a register */
|
||||
return luaK_exp2anyreg(fs, e);
|
||||
}
|
||||
|
||||
|
||||
void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {
|
||||
switch (var->k) {
|
||||
case VLOCAL: {
|
||||
freeexp(fs, ex);
|
||||
exp2reg(fs, ex, var->u.s.info);
|
||||
return;
|
||||
}
|
||||
case VUPVAL: {
|
||||
int e = luaK_exp2anyreg(fs, ex);
|
||||
luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0);
|
||||
break;
|
||||
}
|
||||
case VGLOBAL: {
|
||||
int e = luaK_exp2anyreg(fs, ex);
|
||||
luaK_codeABx(fs, OP_SETGLOBAL, e, var->u.s.info);
|
||||
break;
|
||||
}
|
||||
case VINDEXED: {
|
||||
int e = luaK_exp2RK(fs, ex);
|
||||
luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
lua_assert(0); /* invalid var kind to store */
|
||||
break;
|
||||
}
|
||||
}
|
||||
freeexp(fs, ex);
|
||||
}
|
||||
|
||||
|
||||
void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
|
||||
int func;
|
||||
luaK_exp2anyreg(fs, e);
|
||||
freeexp(fs, e);
|
||||
func = fs->freereg;
|
||||
luaK_reserveregs(fs, 2);
|
||||
luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key));
|
||||
freeexp(fs, key);
|
||||
e->u.s.info = func;
|
||||
e->k = VNONRELOC;
|
||||
}
|
||||
|
||||
|
||||
static void invertjump (FuncState *fs, expdesc *e) {
|
||||
Instruction *pc = getjumpcontrol(fs, e->u.s.info);
|
||||
lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET &&
|
||||
GET_OPCODE(*pc) != OP_TEST);
|
||||
SETARG_A(*pc, !(GETARG_A(*pc)));
|
||||
}
|
||||
|
||||
|
||||
static int jumponcond (FuncState *fs, expdesc *e, int cond) {
|
||||
if (e->k == VRELOCABLE) {
|
||||
Instruction ie = getcode(fs, e);
|
||||
if (GET_OPCODE(ie) == OP_NOT) {
|
||||
fs->pc--; /* remove previous OP_NOT */
|
||||
return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond);
|
||||
}
|
||||
/* else go through */
|
||||
}
|
||||
discharge2anyreg(fs, e);
|
||||
freeexp(fs, e);
|
||||
return condjump(fs, OP_TESTSET, NO_REG, e->u.s.info, cond);
|
||||
}
|
||||
|
||||
|
||||
void luaK_goiftrue (FuncState *fs, expdesc *e) {
|
||||
int pc; /* pc of last jump */
|
||||
luaK_dischargevars(fs, e);
|
||||
switch (e->k) {
|
||||
case VK: case VKNUM: case VTRUE: {
|
||||
pc = NO_JUMP; /* always true; do nothing */
|
||||
break;
|
||||
}
|
||||
case VJMP: {
|
||||
invertjump(fs, e);
|
||||
pc = e->u.s.info;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
pc = jumponcond(fs, e, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
luaK_concat(fs, &e->f, pc); /* insert last jump in `f' list */
|
||||
luaK_patchtohere(fs, e->t);
|
||||
e->t = NO_JUMP;
|
||||
}
|
||||
|
||||
|
||||
static void luaK_goiffalse (FuncState *fs, expdesc *e) {
|
||||
int pc; /* pc of last jump */
|
||||
luaK_dischargevars(fs, e);
|
||||
switch (e->k) {
|
||||
case VNIL: case VFALSE: {
|
||||
pc = NO_JUMP; /* always false; do nothing */
|
||||
break;
|
||||
}
|
||||
case VJMP: {
|
||||
pc = e->u.s.info;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
pc = jumponcond(fs, e, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
luaK_concat(fs, &e->t, pc); /* insert last jump in `t' list */
|
||||
luaK_patchtohere(fs, e->f);
|
||||
e->f = NO_JUMP;
|
||||
}
|
||||
|
||||
|
||||
static void codenot (FuncState *fs, expdesc *e) {
|
||||
luaK_dischargevars(fs, e);
|
||||
switch (e->k) {
|
||||
case VNIL: case VFALSE: {
|
||||
e->k = VTRUE;
|
||||
break;
|
||||
}
|
||||
case VK: case VKNUM: case VTRUE: {
|
||||
e->k = VFALSE;
|
||||
break;
|
||||
}
|
||||
case VJMP: {
|
||||
invertjump(fs, e);
|
||||
break;
|
||||
}
|
||||
case VRELOCABLE:
|
||||
case VNONRELOC: {
|
||||
discharge2anyreg(fs, e);
|
||||
freeexp(fs, e);
|
||||
e->u.s.info = luaK_codeABC(fs, OP_NOT, 0, e->u.s.info, 0);
|
||||
e->k = VRELOCABLE;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
lua_assert(0); /* cannot happen */
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* interchange true and false lists */
|
||||
{ int temp = e->f; e->f = e->t; e->t = temp; }
|
||||
removevalues(fs, e->f);
|
||||
removevalues(fs, e->t);
|
||||
}
|
||||
|
||||
|
||||
void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
|
||||
t->u.s.aux = luaK_exp2RK(fs, k);
|
||||
t->k = VINDEXED;
|
||||
}
|
||||
|
||||
|
||||
static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
|
||||
lua_Number v1, v2, r;
|
||||
if (!isnumeral(e1) || !isnumeral(e2)) return 0;
|
||||
v1 = e1->u.nval;
|
||||
v2 = e2->u.nval;
|
||||
switch (op) {
|
||||
case OP_ADD: r = luai_numadd(v1, v2); break;
|
||||
case OP_SUB: r = luai_numsub(v1, v2); break;
|
||||
case OP_MUL: r = luai_nummul(v1, v2); break;
|
||||
case OP_DIV:
|
||||
if (v2 == 0) return 0; /* do not attempt to divide by 0 */
|
||||
r = luai_numdiv(v1, v2); break;
|
||||
case OP_MOD:
|
||||
if (v2 == 0) return 0; /* do not attempt to divide by 0 */
|
||||
r = luai_nummod(v1, v2); break;
|
||||
case OP_POW: r = luai_numpow(v1, v2); break;
|
||||
case OP_UNM: r = luai_numunm(v1); break;
|
||||
case OP_LEN: return 0; /* no constant folding for 'len' */
|
||||
default: lua_assert(0); r = 0; break;
|
||||
}
|
||||
if (luai_numisnan(r)) return 0; /* do not attempt to produce NaN */
|
||||
e1->u.nval = r;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {
|
||||
if (constfolding(op, e1, e2))
|
||||
return;
|
||||
else {
|
||||
int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0;
|
||||
int o1 = luaK_exp2RK(fs, e1);
|
||||
if (o1 > o2) {
|
||||
freeexp(fs, e1);
|
||||
freeexp(fs, e2);
|
||||
}
|
||||
else {
|
||||
freeexp(fs, e2);
|
||||
freeexp(fs, e1);
|
||||
}
|
||||
e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2);
|
||||
e1->k = VRELOCABLE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,
|
||||
expdesc *e2) {
|
||||
int o1 = luaK_exp2RK(fs, e1);
|
||||
int o2 = luaK_exp2RK(fs, e2);
|
||||
freeexp(fs, e2);
|
||||
freeexp(fs, e1);
|
||||
if (cond == 0 && op != OP_EQ) {
|
||||
int temp; /* exchange args to replace by `<' or `<=' */
|
||||
temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */
|
||||
cond = 1;
|
||||
}
|
||||
e1->u.s.info = condjump(fs, op, cond, o1, o2);
|
||||
e1->k = VJMP;
|
||||
}
|
||||
|
||||
|
||||
void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {
|
||||
expdesc e2;
|
||||
e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;
|
||||
switch (op) {
|
||||
case OPR_MINUS: {
|
||||
if (!isnumeral(e))
|
||||
luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */
|
||||
codearith(fs, OP_UNM, e, &e2);
|
||||
break;
|
||||
}
|
||||
case OPR_NOT: codenot(fs, e); break;
|
||||
case OPR_LEN: {
|
||||
luaK_exp2anyreg(fs, e); /* cannot operate on constants */
|
||||
codearith(fs, OP_LEN, e, &e2);
|
||||
break;
|
||||
}
|
||||
default: lua_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
|
||||
switch (op) {
|
||||
case OPR_AND: {
|
||||
luaK_goiftrue(fs, v);
|
||||
break;
|
||||
}
|
||||
case OPR_OR: {
|
||||
luaK_goiffalse(fs, v);
|
||||
break;
|
||||
}
|
||||
case OPR_CONCAT: {
|
||||
luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */
|
||||
break;
|
||||
}
|
||||
case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
|
||||
case OPR_MOD: case OPR_POW: {
|
||||
if (!isnumeral(v)) luaK_exp2RK(fs, v);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
luaK_exp2RK(fs, v);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
|
||||
switch (op) {
|
||||
case OPR_AND: {
|
||||
lua_assert(e1->t == NO_JUMP); /* list must be closed */
|
||||
luaK_dischargevars(fs, e2);
|
||||
luaK_concat(fs, &e2->f, e1->f);
|
||||
*e1 = *e2;
|
||||
break;
|
||||
}
|
||||
case OPR_OR: {
|
||||
lua_assert(e1->f == NO_JUMP); /* list must be closed */
|
||||
luaK_dischargevars(fs, e2);
|
||||
luaK_concat(fs, &e2->t, e1->t);
|
||||
*e1 = *e2;
|
||||
break;
|
||||
}
|
||||
case OPR_CONCAT: {
|
||||
luaK_exp2val(fs, e2);
|
||||
if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) {
|
||||
lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1);
|
||||
freeexp(fs, e1);
|
||||
SETARG_B(getcode(fs, e2), e1->u.s.info);
|
||||
e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info;
|
||||
}
|
||||
else {
|
||||
luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */
|
||||
codearith(fs, OP_CONCAT, e1, e2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break;
|
||||
case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break;
|
||||
case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break;
|
||||
case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break;
|
||||
case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break;
|
||||
case OPR_POW: codearith(fs, OP_POW, e1, e2); break;
|
||||
case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break;
|
||||
case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break;
|
||||
case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break;
|
||||
case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break;
|
||||
case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break;
|
||||
case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break;
|
||||
default: lua_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaK_fixline (FuncState *fs, int line) {
|
||||
fs->f->lineinfo[fs->pc - 1] = line;
|
||||
}
|
||||
|
||||
|
||||
static int luaK_code (FuncState *fs, Instruction i, int line) {
|
||||
Proto *f = fs->f;
|
||||
dischargejpc(fs); /* `pc' will change */
|
||||
/* put new instruction in code array */
|
||||
luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,
|
||||
MAX_INT, "code size overflow");
|
||||
f->code[fs->pc] = i;
|
||||
/* save corresponding line information */
|
||||
luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int,
|
||||
MAX_INT, "code size overflow");
|
||||
f->lineinfo[fs->pc] = line;
|
||||
return fs->pc++;
|
||||
}
|
||||
|
||||
|
||||
int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
|
||||
lua_assert(getOpMode(o) == iABC);
|
||||
lua_assert(getBMode(o) != OpArgN || b == 0);
|
||||
lua_assert(getCMode(o) != OpArgN || c == 0);
|
||||
return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline);
|
||||
}
|
||||
|
||||
|
||||
int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
|
||||
lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx);
|
||||
lua_assert(getCMode(o) == OpArgN);
|
||||
return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline);
|
||||
}
|
||||
|
||||
|
||||
void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
|
||||
int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1;
|
||||
int b = (tostore == LUA_MULTRET) ? 0 : tostore;
|
||||
lua_assert(tostore != 0);
|
||||
if (c <= MAXARG_C)
|
||||
luaK_codeABC(fs, OP_SETLIST, base, b, c);
|
||||
else {
|
||||
luaK_codeABC(fs, OP_SETLIST, base, b, 0);
|
||||
luaK_code(fs, cast(Instruction, c), fs->ls->lastline);
|
||||
}
|
||||
fs->freereg = base + 1; /* free registers with list values */
|
||||
}
|
||||
|
||||
76
extern/lua-5.1.5/src/lcode.h
vendored
Normal file
76
extern/lua-5.1.5/src/lcode.h
vendored
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** Code generator for Lua
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#ifndef lcode_h
|
||||
#define lcode_h
|
||||
|
||||
#include "llex.h"
|
||||
#include "lobject.h"
|
||||
#include "lopcodes.h"
|
||||
#include "lparser.h"
|
||||
|
||||
|
||||
/*
|
||||
** Marks the end of a patch list. It is an invalid value both as an absolute
|
||||
** address, and as a list link (would link an element to itself).
|
||||
*/
|
||||
#define NO_JUMP (-1)
|
||||
|
||||
|
||||
/*
|
||||
** grep "ORDER OPR" if you change these enums
|
||||
*/
|
||||
typedef enum BinOpr {
|
||||
OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,
|
||||
OPR_CONCAT,
|
||||
OPR_NE, OPR_EQ,
|
||||
OPR_LT, OPR_LE, OPR_GT, OPR_GE,
|
||||
OPR_AND, OPR_OR,
|
||||
OPR_NOBINOPR
|
||||
} BinOpr;
|
||||
|
||||
|
||||
typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
|
||||
|
||||
|
||||
#define getcode(fs,e) ((fs)->f->code[(e)->u.s.info])
|
||||
|
||||
#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)
|
||||
|
||||
#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET)
|
||||
|
||||
LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);
|
||||
LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C);
|
||||
LUAI_FUNC void luaK_fixline (FuncState *fs, int line);
|
||||
LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);
|
||||
LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);
|
||||
LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);
|
||||
LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s);
|
||||
LUAI_FUNC int luaK_numberK (FuncState *fs, lua_Number r);
|
||||
LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);
|
||||
LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);
|
||||
LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);
|
||||
LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);
|
||||
LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);
|
||||
LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);
|
||||
LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);
|
||||
LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);
|
||||
LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);
|
||||
LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);
|
||||
LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);
|
||||
LUAI_FUNC int luaK_jump (FuncState *fs);
|
||||
LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);
|
||||
LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);
|
||||
LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);
|
||||
LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);
|
||||
LUAI_FUNC int luaK_getlabel (FuncState *fs);
|
||||
LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v);
|
||||
LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);
|
||||
LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2);
|
||||
LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);
|
||||
|
||||
|
||||
#endif
|
||||
398
extern/lua-5.1.5/src/ldblib.c
vendored
Normal file
398
extern/lua-5.1.5/src/ldblib.c
vendored
Normal file
|
|
@ -0,0 +1,398 @@
|
|||
/*
|
||||
** $Id: ldblib.c,v 1.104.1.4 2009/08/04 18:50:18 roberto Exp $
|
||||
** Interface from Lua to its debug API
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define ldblib_c
|
||||
#define LUA_LIB
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "lauxlib.h"
|
||||
#include "lualib.h"
|
||||
|
||||
|
||||
|
||||
static int db_getregistry (lua_State *L) {
|
||||
lua_pushvalue(L, LUA_REGISTRYINDEX);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int db_getmetatable (lua_State *L) {
|
||||
luaL_checkany(L, 1);
|
||||
if (!lua_getmetatable(L, 1)) {
|
||||
lua_pushnil(L); /* no metatable */
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int db_setmetatable (lua_State *L) {
|
||||
int t = lua_type(L, 2);
|
||||
luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,
|
||||
"nil or table expected");
|
||||
lua_settop(L, 2);
|
||||
lua_pushboolean(L, lua_setmetatable(L, 1));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int db_getfenv (lua_State *L) {
|
||||
luaL_checkany(L, 1);
|
||||
lua_getfenv(L, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int db_setfenv (lua_State *L) {
|
||||
luaL_checktype(L, 2, LUA_TTABLE);
|
||||
lua_settop(L, 2);
|
||||
if (lua_setfenv(L, 1) == 0)
|
||||
luaL_error(L, LUA_QL("setfenv")
|
||||
" cannot change environment of given object");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static void settabss (lua_State *L, const char *i, const char *v) {
|
||||
lua_pushstring(L, v);
|
||||
lua_setfield(L, -2, i);
|
||||
}
|
||||
|
||||
|
||||
static void settabsi (lua_State *L, const char *i, int v) {
|
||||
lua_pushinteger(L, v);
|
||||
lua_setfield(L, -2, i);
|
||||
}
|
||||
|
||||
|
||||
static lua_State *getthread (lua_State *L, int *arg) {
|
||||
if (lua_isthread(L, 1)) {
|
||||
*arg = 1;
|
||||
return lua_tothread(L, 1);
|
||||
}
|
||||
else {
|
||||
*arg = 0;
|
||||
return L;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) {
|
||||
if (L == L1) {
|
||||
lua_pushvalue(L, -2);
|
||||
lua_remove(L, -3);
|
||||
}
|
||||
else
|
||||
lua_xmove(L1, L, 1);
|
||||
lua_setfield(L, -2, fname);
|
||||
}
|
||||
|
||||
|
||||
static int db_getinfo (lua_State *L) {
|
||||
lua_Debug ar;
|
||||
int arg;
|
||||
lua_State *L1 = getthread(L, &arg);
|
||||
const char *options = luaL_optstring(L, arg+2, "flnSu");
|
||||
if (lua_isnumber(L, arg+1)) {
|
||||
if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), &ar)) {
|
||||
lua_pushnil(L); /* level out of range */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (lua_isfunction(L, arg+1)) {
|
||||
lua_pushfstring(L, ">%s", options);
|
||||
options = lua_tostring(L, -1);
|
||||
lua_pushvalue(L, arg+1);
|
||||
lua_xmove(L, L1, 1);
|
||||
}
|
||||
else
|
||||
return luaL_argerror(L, arg+1, "function or level expected");
|
||||
if (!lua_getinfo(L1, options, &ar))
|
||||
return luaL_argerror(L, arg+2, "invalid option");
|
||||
lua_createtable(L, 0, 2);
|
||||
if (strchr(options, 'S')) {
|
||||
settabss(L, "source", ar.source);
|
||||
settabss(L, "short_src", ar.short_src);
|
||||
settabsi(L, "linedefined", ar.linedefined);
|
||||
settabsi(L, "lastlinedefined", ar.lastlinedefined);
|
||||
settabss(L, "what", ar.what);
|
||||
}
|
||||
if (strchr(options, 'l'))
|
||||
settabsi(L, "currentline", ar.currentline);
|
||||
if (strchr(options, 'u'))
|
||||
settabsi(L, "nups", ar.nups);
|
||||
if (strchr(options, 'n')) {
|
||||
settabss(L, "name", ar.name);
|
||||
settabss(L, "namewhat", ar.namewhat);
|
||||
}
|
||||
if (strchr(options, 'L'))
|
||||
treatstackoption(L, L1, "activelines");
|
||||
if (strchr(options, 'f'))
|
||||
treatstackoption(L, L1, "func");
|
||||
return 1; /* return table */
|
||||
}
|
||||
|
||||
|
||||
static int db_getlocal (lua_State *L) {
|
||||
int arg;
|
||||
lua_State *L1 = getthread(L, &arg);
|
||||
lua_Debug ar;
|
||||
const char *name;
|
||||
if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */
|
||||
return luaL_argerror(L, arg+1, "level out of range");
|
||||
name = lua_getlocal(L1, &ar, luaL_checkint(L, arg+2));
|
||||
if (name) {
|
||||
lua_xmove(L1, L, 1);
|
||||
lua_pushstring(L, name);
|
||||
lua_pushvalue(L, -2);
|
||||
return 2;
|
||||
}
|
||||
else {
|
||||
lua_pushnil(L);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int db_setlocal (lua_State *L) {
|
||||
int arg;
|
||||
lua_State *L1 = getthread(L, &arg);
|
||||
lua_Debug ar;
|
||||
if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */
|
||||
return luaL_argerror(L, arg+1, "level out of range");
|
||||
luaL_checkany(L, arg+3);
|
||||
lua_settop(L, arg+3);
|
||||
lua_xmove(L, L1, 1);
|
||||
lua_pushstring(L, lua_setlocal(L1, &ar, luaL_checkint(L, arg+2)));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int auxupvalue (lua_State *L, int get) {
|
||||
const char *name;
|
||||
int n = luaL_checkint(L, 2);
|
||||
luaL_checktype(L, 1, LUA_TFUNCTION);
|
||||
if (lua_iscfunction(L, 1)) return 0; /* cannot touch C upvalues from Lua */
|
||||
name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n);
|
||||
if (name == NULL) return 0;
|
||||
lua_pushstring(L, name);
|
||||
lua_insert(L, -(get+1));
|
||||
return get + 1;
|
||||
}
|
||||
|
||||
|
||||
static int db_getupvalue (lua_State *L) {
|
||||
return auxupvalue(L, 1);
|
||||
}
|
||||
|
||||
|
||||
static int db_setupvalue (lua_State *L) {
|
||||
luaL_checkany(L, 3);
|
||||
return auxupvalue(L, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static const char KEY_HOOK = 'h';
|
||||
|
||||
|
||||
static void hookf (lua_State *L, lua_Debug *ar) {
|
||||
static const char *const hooknames[] =
|
||||
{"call", "return", "line", "count", "tail return"};
|
||||
lua_pushlightuserdata(L, (void *)&KEY_HOOK);
|
||||
lua_rawget(L, LUA_REGISTRYINDEX);
|
||||
lua_pushlightuserdata(L, L);
|
||||
lua_rawget(L, -2);
|
||||
if (lua_isfunction(L, -1)) {
|
||||
lua_pushstring(L, hooknames[(int)ar->event]);
|
||||
if (ar->currentline >= 0)
|
||||
lua_pushinteger(L, ar->currentline);
|
||||
else lua_pushnil(L);
|
||||
lua_assert(lua_getinfo(L, "lS", ar));
|
||||
lua_call(L, 2, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int makemask (const char *smask, int count) {
|
||||
int mask = 0;
|
||||
if (strchr(smask, 'c')) mask |= LUA_MASKCALL;
|
||||
if (strchr(smask, 'r')) mask |= LUA_MASKRET;
|
||||
if (strchr(smask, 'l')) mask |= LUA_MASKLINE;
|
||||
if (count > 0) mask |= LUA_MASKCOUNT;
|
||||
return mask;
|
||||
}
|
||||
|
||||
|
||||
static char *unmakemask (int mask, char *smask) {
|
||||
int i = 0;
|
||||
if (mask & LUA_MASKCALL) smask[i++] = 'c';
|
||||
if (mask & LUA_MASKRET) smask[i++] = 'r';
|
||||
if (mask & LUA_MASKLINE) smask[i++] = 'l';
|
||||
smask[i] = '\0';
|
||||
return smask;
|
||||
}
|
||||
|
||||
|
||||
static void gethooktable (lua_State *L) {
|
||||
lua_pushlightuserdata(L, (void *)&KEY_HOOK);
|
||||
lua_rawget(L, LUA_REGISTRYINDEX);
|
||||
if (!lua_istable(L, -1)) {
|
||||
lua_pop(L, 1);
|
||||
lua_createtable(L, 0, 1);
|
||||
lua_pushlightuserdata(L, (void *)&KEY_HOOK);
|
||||
lua_pushvalue(L, -2);
|
||||
lua_rawset(L, LUA_REGISTRYINDEX);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int db_sethook (lua_State *L) {
|
||||
int arg, mask, count;
|
||||
lua_Hook func;
|
||||
lua_State *L1 = getthread(L, &arg);
|
||||
if (lua_isnoneornil(L, arg+1)) {
|
||||
lua_settop(L, arg+1);
|
||||
func = NULL; mask = 0; count = 0; /* turn off hooks */
|
||||
}
|
||||
else {
|
||||
const char *smask = luaL_checkstring(L, arg+2);
|
||||
luaL_checktype(L, arg+1, LUA_TFUNCTION);
|
||||
count = luaL_optint(L, arg+3, 0);
|
||||
func = hookf; mask = makemask(smask, count);
|
||||
}
|
||||
gethooktable(L);
|
||||
lua_pushlightuserdata(L, L1);
|
||||
lua_pushvalue(L, arg+1);
|
||||
lua_rawset(L, -3); /* set new hook */
|
||||
lua_pop(L, 1); /* remove hook table */
|
||||
lua_sethook(L1, func, mask, count); /* set hooks */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int db_gethook (lua_State *L) {
|
||||
int arg;
|
||||
lua_State *L1 = getthread(L, &arg);
|
||||
char buff[5];
|
||||
int mask = lua_gethookmask(L1);
|
||||
lua_Hook hook = lua_gethook(L1);
|
||||
if (hook != NULL && hook != hookf) /* external hook? */
|
||||
lua_pushliteral(L, "external hook");
|
||||
else {
|
||||
gethooktable(L);
|
||||
lua_pushlightuserdata(L, L1);
|
||||
lua_rawget(L, -2); /* get hook */
|
||||
lua_remove(L, -2); /* remove hook table */
|
||||
}
|
||||
lua_pushstring(L, unmakemask(mask, buff));
|
||||
lua_pushinteger(L, lua_gethookcount(L1));
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
static int db_debug (lua_State *L) {
|
||||
for (;;) {
|
||||
char buffer[250];
|
||||
fputs("lua_debug> ", stderr);
|
||||
if (fgets(buffer, sizeof(buffer), stdin) == 0 ||
|
||||
strcmp(buffer, "cont\n") == 0)
|
||||
return 0;
|
||||
if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||
|
||||
lua_pcall(L, 0, 0, 0)) {
|
||||
fputs(lua_tostring(L, -1), stderr);
|
||||
fputs("\n", stderr);
|
||||
}
|
||||
lua_settop(L, 0); /* remove eventual returns */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define LEVELS1 12 /* size of the first part of the stack */
|
||||
#define LEVELS2 10 /* size of the second part of the stack */
|
||||
|
||||
static int db_errorfb (lua_State *L) {
|
||||
int level;
|
||||
int firstpart = 1; /* still before eventual `...' */
|
||||
int arg;
|
||||
lua_State *L1 = getthread(L, &arg);
|
||||
lua_Debug ar;
|
||||
if (lua_isnumber(L, arg+2)) {
|
||||
level = (int)lua_tointeger(L, arg+2);
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
else
|
||||
level = (L == L1) ? 1 : 0; /* level 0 may be this own function */
|
||||
if (lua_gettop(L) == arg)
|
||||
lua_pushliteral(L, "");
|
||||
else if (!lua_isstring(L, arg+1)) return 1; /* message is not a string */
|
||||
else lua_pushliteral(L, "\n");
|
||||
lua_pushliteral(L, "stack traceback:");
|
||||
while (lua_getstack(L1, level++, &ar)) {
|
||||
if (level > LEVELS1 && firstpart) {
|
||||
/* no more than `LEVELS2' more levels? */
|
||||
if (!lua_getstack(L1, level+LEVELS2, &ar))
|
||||
level--; /* keep going */
|
||||
else {
|
||||
lua_pushliteral(L, "\n\t..."); /* too many levels */
|
||||
while (lua_getstack(L1, level+LEVELS2, &ar)) /* find last levels */
|
||||
level++;
|
||||
}
|
||||
firstpart = 0;
|
||||
continue;
|
||||
}
|
||||
lua_pushliteral(L, "\n\t");
|
||||
lua_getinfo(L1, "Snl", &ar);
|
||||
lua_pushfstring(L, "%s:", ar.short_src);
|
||||
if (ar.currentline > 0)
|
||||
lua_pushfstring(L, "%d:", ar.currentline);
|
||||
if (*ar.namewhat != '\0') /* is there a name? */
|
||||
lua_pushfstring(L, " in function " LUA_QS, ar.name);
|
||||
else {
|
||||
if (*ar.what == 'm') /* main? */
|
||||
lua_pushfstring(L, " in main chunk");
|
||||
else if (*ar.what == 'C' || *ar.what == 't')
|
||||
lua_pushliteral(L, " ?"); /* C function or tail call */
|
||||
else
|
||||
lua_pushfstring(L, " in function <%s:%d>",
|
||||
ar.short_src, ar.linedefined);
|
||||
}
|
||||
lua_concat(L, lua_gettop(L) - arg);
|
||||
}
|
||||
lua_concat(L, lua_gettop(L) - arg);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static const luaL_Reg dblib[] = {
|
||||
{"debug", db_debug},
|
||||
{"getfenv", db_getfenv},
|
||||
{"gethook", db_gethook},
|
||||
{"getinfo", db_getinfo},
|
||||
{"getlocal", db_getlocal},
|
||||
{"getregistry", db_getregistry},
|
||||
{"getmetatable", db_getmetatable},
|
||||
{"getupvalue", db_getupvalue},
|
||||
{"setfenv", db_setfenv},
|
||||
{"sethook", db_sethook},
|
||||
{"setlocal", db_setlocal},
|
||||
{"setmetatable", db_setmetatable},
|
||||
{"setupvalue", db_setupvalue},
|
||||
{"traceback", db_errorfb},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
LUALIB_API int luaopen_debug (lua_State *L) {
|
||||
luaL_register(L, LUA_DBLIBNAME, dblib);
|
||||
return 1;
|
||||
}
|
||||
|
||||
638
extern/lua-5.1.5/src/ldebug.c
vendored
Normal file
638
extern/lua-5.1.5/src/ldebug.c
vendored
Normal file
|
|
@ -0,0 +1,638 @@
|
|||
/*
|
||||
** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $
|
||||
** Debug Interface
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#define ldebug_c
|
||||
#define LUA_CORE
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "lapi.h"
|
||||
#include "lcode.h"
|
||||
#include "ldebug.h"
|
||||
#include "ldo.h"
|
||||
#include "lfunc.h"
|
||||
#include "lobject.h"
|
||||
#include "lopcodes.h"
|
||||
#include "lstate.h"
|
||||
#include "lstring.h"
|
||||
#include "ltable.h"
|
||||
#include "ltm.h"
|
||||
#include "lvm.h"
|
||||
|
||||
|
||||
|
||||
static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name);
|
||||
|
||||
|
||||
static int currentpc (lua_State *L, CallInfo *ci) {
|
||||
if (!isLua(ci)) return -1; /* function is not a Lua function? */
|
||||
if (ci == L->ci)
|
||||
ci->savedpc = L->savedpc;
|
||||
return pcRel(ci->savedpc, ci_func(ci)->l.p);
|
||||
}
|
||||
|
||||
|
||||
static int currentline (lua_State *L, CallInfo *ci) {
|
||||
int pc = currentpc(L, ci);
|
||||
if (pc < 0)
|
||||
return -1; /* only active lua functions have current-line information */
|
||||
else
|
||||
return getline(ci_func(ci)->l.p, pc);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** this function can be called asynchronous (e.g. during a signal)
|
||||
*/
|
||||
LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) {
|
||||
if (func == NULL || mask == 0) { /* turn off hooks? */
|
||||
mask = 0;
|
||||
func = NULL;
|
||||
}
|
||||
L->hook = func;
|
||||
L->basehookcount = count;
|
||||
resethookcount(L);
|
||||
L->hookmask = cast_byte(mask);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
LUA_API lua_Hook lua_gethook (lua_State *L) {
|
||||
return L->hook;
|
||||
}
|
||||
|
||||
|
||||
LUA_API int lua_gethookmask (lua_State *L) {
|
||||
return L->hookmask;
|
||||
}
|
||||
|
||||
|
||||
LUA_API int lua_gethookcount (lua_State *L) {
|
||||
return L->basehookcount;
|
||||
}
|
||||
|
||||
|
||||
LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
|
||||
int status;
|
||||
CallInfo *ci;
|
||||
lua_lock(L);
|
||||
for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) {
|
||||
level--;
|
||||
if (f_isLua(ci)) /* Lua function? */
|
||||
level -= ci->tailcalls; /* skip lost tail calls */
|
||||
}
|
||||
if (level == 0 && ci > L->base_ci) { /* level found? */
|
||||
status = 1;
|
||||
ar->i_ci = cast_int(ci - L->base_ci);
|
||||
}
|
||||
else if (level < 0) { /* level is of a lost tail call? */
|
||||
status = 1;
|
||||
ar->i_ci = 0;
|
||||
}
|
||||
else status = 0; /* no such level */
|
||||
lua_unlock(L);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static Proto *getluaproto (CallInfo *ci) {
|
||||
return (isLua(ci) ? ci_func(ci)->l.p : NULL);
|
||||
}
|
||||
|
||||
|
||||
static const char *findlocal (lua_State *L, CallInfo *ci, int n) {
|
||||
const char *name;
|
||||
Proto *fp = getluaproto(ci);
|
||||
if (fp && (name = luaF_getlocalname(fp, n, currentpc(L, ci))) != NULL)
|
||||
return name; /* is a local variable in a Lua function */
|
||||
else {
|
||||
StkId limit = (ci == L->ci) ? L->top : (ci+1)->func;
|
||||
if (limit - ci->base >= n && n > 0) /* is 'n' inside 'ci' stack? */
|
||||
return "(*temporary)";
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) {
|
||||
CallInfo *ci = L->base_ci + ar->i_ci;
|
||||
const char *name = findlocal(L, ci, n);
|
||||
lua_lock(L);
|
||||
if (name)
|
||||
luaA_pushobject(L, ci->base + (n - 1));
|
||||
lua_unlock(L);
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {
|
||||
CallInfo *ci = L->base_ci + ar->i_ci;
|
||||
const char *name = findlocal(L, ci, n);
|
||||
lua_lock(L);
|
||||
if (name)
|
||||
setobjs2s(L, ci->base + (n - 1), L->top - 1);
|
||||
L->top--; /* pop value */
|
||||
lua_unlock(L);
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
static void funcinfo (lua_Debug *ar, Closure *cl) {
|
||||
if (cl->c.isC) {
|
||||
ar->source = "=[C]";
|
||||
ar->linedefined = -1;
|
||||
ar->lastlinedefined = -1;
|
||||
ar->what = "C";
|
||||
}
|
||||
else {
|
||||
ar->source = getstr(cl->l.p->source);
|
||||
ar->linedefined = cl->l.p->linedefined;
|
||||
ar->lastlinedefined = cl->l.p->lastlinedefined;
|
||||
ar->what = (ar->linedefined == 0) ? "main" : "Lua";
|
||||
}
|
||||
luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);
|
||||
}
|
||||
|
||||
|
||||
static void info_tailcall (lua_Debug *ar) {
|
||||
ar->name = ar->namewhat = "";
|
||||
ar->what = "tail";
|
||||
ar->lastlinedefined = ar->linedefined = ar->currentline = -1;
|
||||
ar->source = "=(tail call)";
|
||||
luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE);
|
||||
ar->nups = 0;
|
||||
}
|
||||
|
||||
|
||||
static void collectvalidlines (lua_State *L, Closure *f) {
|
||||
if (f == NULL || f->c.isC) {
|
||||
setnilvalue(L->top);
|
||||
}
|
||||
else {
|
||||
Table *t = luaH_new(L, 0, 0);
|
||||
int *lineinfo = f->l.p->lineinfo;
|
||||
int i;
|
||||
for (i=0; i<f->l.p->sizelineinfo; i++)
|
||||
setbvalue(luaH_setnum(L, t, lineinfo[i]), 1);
|
||||
sethvalue(L, L->top, t);
|
||||
}
|
||||
incr_top(L);
|
||||
}
|
||||
|
||||
|
||||
static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
|
||||
Closure *f, CallInfo *ci) {
|
||||
int status = 1;
|
||||
if (f == NULL) {
|
||||
info_tailcall(ar);
|
||||
return status;
|
||||
}
|
||||
for (; *what; what++) {
|
||||
switch (*what) {
|
||||
case 'S': {
|
||||
funcinfo(ar, f);
|
||||
break;
|
||||
}
|
||||
case 'l': {
|
||||
ar->currentline = (ci) ? currentline(L, ci) : -1;
|
||||
break;
|
||||
}
|
||||
case 'u': {
|
||||
ar->nups = f->c.nupvalues;
|
||||
break;
|
||||
}
|
||||
case 'n': {
|
||||
ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL;
|
||||
if (ar->namewhat == NULL) {
|
||||
ar->namewhat = ""; /* not found */
|
||||
ar->name = NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'L':
|
||||
case 'f': /* handled by lua_getinfo */
|
||||
break;
|
||||
default: status = 0; /* invalid option */
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
|
||||
int status;
|
||||
Closure *f = NULL;
|
||||
CallInfo *ci = NULL;
|
||||
lua_lock(L);
|
||||
if (*what == '>') {
|
||||
StkId func = L->top - 1;
|
||||
luai_apicheck(L, ttisfunction(func));
|
||||
what++; /* skip the '>' */
|
||||
f = clvalue(func);
|
||||
L->top--; /* pop function */
|
||||
}
|
||||
else if (ar->i_ci != 0) { /* no tail call? */
|
||||
ci = L->base_ci + ar->i_ci;
|
||||
lua_assert(ttisfunction(ci->func));
|
||||
f = clvalue(ci->func);
|
||||
}
|
||||
status = auxgetinfo(L, what, ar, f, ci);
|
||||
if (strchr(what, 'f')) {
|
||||
if (f == NULL) setnilvalue(L->top);
|
||||
else setclvalue(L, L->top, f);
|
||||
incr_top(L);
|
||||
}
|
||||
if (strchr(what, 'L'))
|
||||
collectvalidlines(L, f);
|
||||
lua_unlock(L);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** Symbolic Execution and code checker
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
#define check(x) if (!(x)) return 0;
|
||||
|
||||
#define checkjump(pt,pc) check(0 <= pc && pc < pt->sizecode)
|
||||
|
||||
#define checkreg(pt,reg) check((reg) < (pt)->maxstacksize)
|
||||
|
||||
|
||||
|
||||
static int precheck (const Proto *pt) {
|
||||
check(pt->maxstacksize <= MAXSTACK);
|
||||
check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);
|
||||
check(!(pt->is_vararg & VARARG_NEEDSARG) ||
|
||||
(pt->is_vararg & VARARG_HASARG));
|
||||
check(pt->sizeupvalues <= pt->nups);
|
||||
check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0);
|
||||
check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
#define checkopenop(pt,pc) luaG_checkopenop((pt)->code[(pc)+1])
|
||||
|
||||
int luaG_checkopenop (Instruction i) {
|
||||
switch (GET_OPCODE(i)) {
|
||||
case OP_CALL:
|
||||
case OP_TAILCALL:
|
||||
case OP_RETURN:
|
||||
case OP_SETLIST: {
|
||||
check(GETARG_B(i) == 0);
|
||||
return 1;
|
||||
}
|
||||
default: return 0; /* invalid instruction after an open call */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) {
|
||||
switch (mode) {
|
||||
case OpArgN: check(r == 0); break;
|
||||
case OpArgU: break;
|
||||
case OpArgR: checkreg(pt, r); break;
|
||||
case OpArgK:
|
||||
check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
|
||||
int pc;
|
||||
int last; /* stores position of last instruction that changed `reg' */
|
||||
last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */
|
||||
check(precheck(pt));
|
||||
for (pc = 0; pc < lastpc; pc++) {
|
||||
Instruction i = pt->code[pc];
|
||||
OpCode op = GET_OPCODE(i);
|
||||
int a = GETARG_A(i);
|
||||
int b = 0;
|
||||
int c = 0;
|
||||
check(op < NUM_OPCODES);
|
||||
checkreg(pt, a);
|
||||
switch (getOpMode(op)) {
|
||||
case iABC: {
|
||||
b = GETARG_B(i);
|
||||
c = GETARG_C(i);
|
||||
check(checkArgMode(pt, b, getBMode(op)));
|
||||
check(checkArgMode(pt, c, getCMode(op)));
|
||||
break;
|
||||
}
|
||||
case iABx: {
|
||||
b = GETARG_Bx(i);
|
||||
if (getBMode(op) == OpArgK) check(b < pt->sizek);
|
||||
break;
|
||||
}
|
||||
case iAsBx: {
|
||||
b = GETARG_sBx(i);
|
||||
if (getBMode(op) == OpArgR) {
|
||||
int dest = pc+1+b;
|
||||
check(0 <= dest && dest < pt->sizecode);
|
||||
if (dest > 0) {
|
||||
int j;
|
||||
/* check that it does not jump to a setlist count; this
|
||||
is tricky, because the count from a previous setlist may
|
||||
have the same value of an invalid setlist; so, we must
|
||||
go all the way back to the first of them (if any) */
|
||||
for (j = 0; j < dest; j++) {
|
||||
Instruction d = pt->code[dest-1-j];
|
||||
if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break;
|
||||
}
|
||||
/* if 'j' is even, previous value is not a setlist (even if
|
||||
it looks like one) */
|
||||
check((j&1) == 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (testAMode(op)) {
|
||||
if (a == reg) last = pc; /* change register `a' */
|
||||
}
|
||||
if (testTMode(op)) {
|
||||
check(pc+2 < pt->sizecode); /* check skip */
|
||||
check(GET_OPCODE(pt->code[pc+1]) == OP_JMP);
|
||||
}
|
||||
switch (op) {
|
||||
case OP_LOADBOOL: {
|
||||
if (c == 1) { /* does it jump? */
|
||||
check(pc+2 < pt->sizecode); /* check its jump */
|
||||
check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST ||
|
||||
GETARG_C(pt->code[pc+1]) != 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OP_LOADNIL: {
|
||||
if (a <= reg && reg <= b)
|
||||
last = pc; /* set registers from `a' to `b' */
|
||||
break;
|
||||
}
|
||||
case OP_GETUPVAL:
|
||||
case OP_SETUPVAL: {
|
||||
check(b < pt->nups);
|
||||
break;
|
||||
}
|
||||
case OP_GETGLOBAL:
|
||||
case OP_SETGLOBAL: {
|
||||
check(ttisstring(&pt->k[b]));
|
||||
break;
|
||||
}
|
||||
case OP_SELF: {
|
||||
checkreg(pt, a+1);
|
||||
if (reg == a+1) last = pc;
|
||||
break;
|
||||
}
|
||||
case OP_CONCAT: {
|
||||
check(b < c); /* at least two operands */
|
||||
break;
|
||||
}
|
||||
case OP_TFORLOOP: {
|
||||
check(c >= 1); /* at least one result (control variable) */
|
||||
checkreg(pt, a+2+c); /* space for results */
|
||||
if (reg >= a+2) last = pc; /* affect all regs above its base */
|
||||
break;
|
||||
}
|
||||
case OP_FORLOOP:
|
||||
case OP_FORPREP:
|
||||
checkreg(pt, a+3);
|
||||
/* go through */
|
||||
case OP_JMP: {
|
||||
int dest = pc+1+b;
|
||||
/* not full check and jump is forward and do not skip `lastpc'? */
|
||||
if (reg != NO_REG && pc < dest && dest <= lastpc)
|
||||
pc += b; /* do the jump */
|
||||
break;
|
||||
}
|
||||
case OP_CALL:
|
||||
case OP_TAILCALL: {
|
||||
if (b != 0) {
|
||||
checkreg(pt, a+b-1);
|
||||
}
|
||||
c--; /* c = num. returns */
|
||||
if (c == LUA_MULTRET) {
|
||||
check(checkopenop(pt, pc));
|
||||
}
|
||||
else if (c != 0)
|
||||
checkreg(pt, a+c-1);
|
||||
if (reg >= a) last = pc; /* affect all registers above base */
|
||||
break;
|
||||
}
|
||||
case OP_RETURN: {
|
||||
b--; /* b = num. returns */
|
||||
if (b > 0) checkreg(pt, a+b-1);
|
||||
break;
|
||||
}
|
||||
case OP_SETLIST: {
|
||||
if (b > 0) checkreg(pt, a + b);
|
||||
if (c == 0) {
|
||||
pc++;
|
||||
check(pc < pt->sizecode - 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OP_CLOSURE: {
|
||||
int nup, j;
|
||||
check(b < pt->sizep);
|
||||
nup = pt->p[b]->nups;
|
||||
check(pc + nup < pt->sizecode);
|
||||
for (j = 1; j <= nup; j++) {
|
||||
OpCode op1 = GET_OPCODE(pt->code[pc + j]);
|
||||
check(op1 == OP_GETUPVAL || op1 == OP_MOVE);
|
||||
}
|
||||
if (reg != NO_REG) /* tracing? */
|
||||
pc += nup; /* do not 'execute' these pseudo-instructions */
|
||||
break;
|
||||
}
|
||||
case OP_VARARG: {
|
||||
check((pt->is_vararg & VARARG_ISVARARG) &&
|
||||
!(pt->is_vararg & VARARG_NEEDSARG));
|
||||
b--;
|
||||
if (b == LUA_MULTRET) check(checkopenop(pt, pc));
|
||||
checkreg(pt, a+b-1);
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
return pt->code[last];
|
||||
}
|
||||
|
||||
#undef check
|
||||
#undef checkjump
|
||||
#undef checkreg
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
int luaG_checkcode (const Proto *pt) {
|
||||
return (symbexec(pt, pt->sizecode, NO_REG) != 0);
|
||||
}
|
||||
|
||||
|
||||
static const char *kname (Proto *p, int c) {
|
||||
if (ISK(c) && ttisstring(&p->k[INDEXK(c)]))
|
||||
return svalue(&p->k[INDEXK(c)]);
|
||||
else
|
||||
return "?";
|
||||
}
|
||||
|
||||
|
||||
static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos,
|
||||
const char **name) {
|
||||
if (isLua(ci)) { /* a Lua function? */
|
||||
Proto *p = ci_func(ci)->l.p;
|
||||
int pc = currentpc(L, ci);
|
||||
Instruction i;
|
||||
*name = luaF_getlocalname(p, stackpos+1, pc);
|
||||
if (*name) /* is a local? */
|
||||
return "local";
|
||||
i = symbexec(p, pc, stackpos); /* try symbolic execution */
|
||||
lua_assert(pc != -1);
|
||||
switch (GET_OPCODE(i)) {
|
||||
case OP_GETGLOBAL: {
|
||||
int g = GETARG_Bx(i); /* global index */
|
||||
lua_assert(ttisstring(&p->k[g]));
|
||||
*name = svalue(&p->k[g]);
|
||||
return "global";
|
||||
}
|
||||
case OP_MOVE: {
|
||||
int a = GETARG_A(i);
|
||||
int b = GETARG_B(i); /* move from `b' to `a' */
|
||||
if (b < a)
|
||||
return getobjname(L, ci, b, name); /* get name for `b' */
|
||||
break;
|
||||
}
|
||||
case OP_GETTABLE: {
|
||||
int k = GETARG_C(i); /* key index */
|
||||
*name = kname(p, k);
|
||||
return "field";
|
||||
}
|
||||
case OP_GETUPVAL: {
|
||||
int u = GETARG_B(i); /* upvalue index */
|
||||
*name = p->upvalues ? getstr(p->upvalues[u]) : "?";
|
||||
return "upvalue";
|
||||
}
|
||||
case OP_SELF: {
|
||||
int k = GETARG_C(i); /* key index */
|
||||
*name = kname(p, k);
|
||||
return "method";
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
return NULL; /* no useful name found */
|
||||
}
|
||||
|
||||
|
||||
static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
|
||||
Instruction i;
|
||||
if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1))
|
||||
return NULL; /* calling function is not Lua (or is unknown) */
|
||||
ci--; /* calling function */
|
||||
i = ci_func(ci)->l.p->code[currentpc(L, ci)];
|
||||
if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
|
||||
GET_OPCODE(i) == OP_TFORLOOP)
|
||||
return getobjname(L, ci, GETARG_A(i), name);
|
||||
else
|
||||
return NULL; /* no useful name can be found */
|
||||
}
|
||||
|
||||
|
||||
/* only ANSI way to check whether a pointer points to an array */
|
||||
static int isinstack (CallInfo *ci, const TValue *o) {
|
||||
StkId p;
|
||||
for (p = ci->base; p < ci->top; p++)
|
||||
if (o == p) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
|
||||
const char *name = NULL;
|
||||
const char *t = luaT_typenames[ttype(o)];
|
||||
const char *kind = (isinstack(L->ci, o)) ?
|
||||
getobjname(L, L->ci, cast_int(o - L->base), &name) :
|
||||
NULL;
|
||||
if (kind)
|
||||
luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)",
|
||||
op, kind, name, t);
|
||||
else
|
||||
luaG_runerror(L, "attempt to %s a %s value", op, t);
|
||||
}
|
||||
|
||||
|
||||
void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {
|
||||
if (ttisstring(p1) || ttisnumber(p1)) p1 = p2;
|
||||
lua_assert(!ttisstring(p1) && !ttisnumber(p1));
|
||||
luaG_typeerror(L, p1, "concatenate");
|
||||
}
|
||||
|
||||
|
||||
void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {
|
||||
TValue temp;
|
||||
if (luaV_tonumber(p1, &temp) == NULL)
|
||||
p2 = p1; /* first operand is wrong */
|
||||
luaG_typeerror(L, p2, "perform arithmetic on");
|
||||
}
|
||||
|
||||
|
||||
int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
|
||||
const char *t1 = luaT_typenames[ttype(p1)];
|
||||
const char *t2 = luaT_typenames[ttype(p2)];
|
||||
if (t1[2] == t2[2])
|
||||
luaG_runerror(L, "attempt to compare two %s values", t1);
|
||||
else
|
||||
luaG_runerror(L, "attempt to compare %s with %s", t1, t2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void addinfo (lua_State *L, const char *msg) {
|
||||
CallInfo *ci = L->ci;
|
||||
if (isLua(ci)) { /* is Lua code? */
|
||||
char buff[LUA_IDSIZE]; /* add file:line information */
|
||||
int line = currentline(L, ci);
|
||||
luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE);
|
||||
luaO_pushfstring(L, "%s:%d: %s", buff, line, msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaG_errormsg (lua_State *L) {
|
||||
if (L->errfunc != 0) { /* is there an error handling function? */
|
||||
StkId errfunc = restorestack(L, L->errfunc);
|
||||
if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR);
|
||||
setobjs2s(L, L->top, L->top - 1); /* move argument */
|
||||
setobjs2s(L, L->top - 1, errfunc); /* push function */
|
||||
incr_top(L);
|
||||
luaD_call(L, L->top - 2, 1); /* call it */
|
||||
}
|
||||
luaD_throw(L, LUA_ERRRUN);
|
||||
}
|
||||
|
||||
|
||||
void luaG_runerror (lua_State *L, const char *fmt, ...) {
|
||||
va_list argp;
|
||||
va_start(argp, fmt);
|
||||
addinfo(L, luaO_pushvfstring(L, fmt, argp));
|
||||
va_end(argp);
|
||||
luaG_errormsg(L);
|
||||
}
|
||||
|
||||
33
extern/lua-5.1.5/src/ldebug.h
vendored
Normal file
33
extern/lua-5.1.5/src/ldebug.h
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** Auxiliary functions from Debug Interface module
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#ifndef ldebug_h
|
||||
#define ldebug_h
|
||||
|
||||
|
||||
#include "lstate.h"
|
||||
|
||||
|
||||
#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1)
|
||||
|
||||
#define getline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0)
|
||||
|
||||
#define resethookcount(L) (L->hookcount = L->basehookcount)
|
||||
|
||||
|
||||
LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o,
|
||||
const char *opname);
|
||||
LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2);
|
||||
LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1,
|
||||
const TValue *p2);
|
||||
LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1,
|
||||
const TValue *p2);
|
||||
LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...);
|
||||
LUAI_FUNC void luaG_errormsg (lua_State *L);
|
||||
LUAI_FUNC int luaG_checkcode (const Proto *pt);
|
||||
LUAI_FUNC int luaG_checkopenop (Instruction i);
|
||||
|
||||
#endif
|
||||
519
extern/lua-5.1.5/src/ldo.c
vendored
Normal file
519
extern/lua-5.1.5/src/ldo.c
vendored
Normal file
|
|
@ -0,0 +1,519 @@
|
|||
/*
|
||||
** $Id: ldo.c,v 2.38.1.4 2012/01/18 02:27:10 roberto Exp $
|
||||
** Stack and Call structure of Lua
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#include <setjmp.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define ldo_c
|
||||
#define LUA_CORE
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "ldebug.h"
|
||||
#include "ldo.h"
|
||||
#include "lfunc.h"
|
||||
#include "lgc.h"
|
||||
#include "lmem.h"
|
||||
#include "lobject.h"
|
||||
#include "lopcodes.h"
|
||||
#include "lparser.h"
|
||||
#include "lstate.h"
|
||||
#include "lstring.h"
|
||||
#include "ltable.h"
|
||||
#include "ltm.h"
|
||||
#include "lundump.h"
|
||||
#include "lvm.h"
|
||||
#include "lzio.h"
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** {======================================================
|
||||
** Error-recovery functions
|
||||
** =======================================================
|
||||
*/
|
||||
|
||||
|
||||
/* chain list of long jump buffers */
|
||||
struct lua_longjmp {
|
||||
struct lua_longjmp *previous;
|
||||
luai_jmpbuf b;
|
||||
volatile int status; /* error code */
|
||||
};
|
||||
|
||||
|
||||
void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
|
||||
switch (errcode) {
|
||||
case LUA_ERRMEM: {
|
||||
setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));
|
||||
break;
|
||||
}
|
||||
case LUA_ERRERR: {
|
||||
setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling"));
|
||||
break;
|
||||
}
|
||||
case LUA_ERRSYNTAX:
|
||||
case LUA_ERRRUN: {
|
||||
setobjs2s(L, oldtop, L->top - 1); /* error message on current top */
|
||||
break;
|
||||
}
|
||||
}
|
||||
L->top = oldtop + 1;
|
||||
}
|
||||
|
||||
|
||||
static void restore_stack_limit (lua_State *L) {
|
||||
lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);
|
||||
if (L->size_ci > LUAI_MAXCALLS) { /* there was an overflow? */
|
||||
int inuse = cast_int(L->ci - L->base_ci);
|
||||
if (inuse + 1 < LUAI_MAXCALLS) /* can `undo' overflow? */
|
||||
luaD_reallocCI(L, LUAI_MAXCALLS);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void resetstack (lua_State *L, int status) {
|
||||
L->ci = L->base_ci;
|
||||
L->base = L->ci->base;
|
||||
luaF_close(L, L->base); /* close eventual pending closures */
|
||||
luaD_seterrorobj(L, status, L->base);
|
||||
L->nCcalls = L->baseCcalls;
|
||||
L->allowhook = 1;
|
||||
restore_stack_limit(L);
|
||||
L->errfunc = 0;
|
||||
L->errorJmp = NULL;
|
||||
}
|
||||
|
||||
|
||||
void luaD_throw (lua_State *L, int errcode) {
|
||||
if (L->errorJmp) {
|
||||
L->errorJmp->status = errcode;
|
||||
LUAI_THROW(L, L->errorJmp);
|
||||
}
|
||||
else {
|
||||
L->status = cast_byte(errcode);
|
||||
if (G(L)->panic) {
|
||||
resetstack(L, errcode);
|
||||
lua_unlock(L);
|
||||
G(L)->panic(L);
|
||||
}
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
|
||||
struct lua_longjmp lj;
|
||||
lj.status = 0;
|
||||
lj.previous = L->errorJmp; /* chain new error handler */
|
||||
L->errorJmp = &lj;
|
||||
LUAI_TRY(L, &lj,
|
||||
(*f)(L, ud);
|
||||
);
|
||||
L->errorJmp = lj.previous; /* restore old error handler */
|
||||
return lj.status;
|
||||
}
|
||||
|
||||
/* }====================================================== */
|
||||
|
||||
|
||||
static void correctstack (lua_State *L, TValue *oldstack) {
|
||||
CallInfo *ci;
|
||||
GCObject *up;
|
||||
L->top = (L->top - oldstack) + L->stack;
|
||||
for (up = L->openupval; up != NULL; up = up->gch.next)
|
||||
gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack;
|
||||
for (ci = L->base_ci; ci <= L->ci; ci++) {
|
||||
ci->top = (ci->top - oldstack) + L->stack;
|
||||
ci->base = (ci->base - oldstack) + L->stack;
|
||||
ci->func = (ci->func - oldstack) + L->stack;
|
||||
}
|
||||
L->base = (L->base - oldstack) + L->stack;
|
||||
}
|
||||
|
||||
|
||||
void luaD_reallocstack (lua_State *L, int newsize) {
|
||||
TValue *oldstack = L->stack;
|
||||
int realsize = newsize + 1 + EXTRA_STACK;
|
||||
lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1);
|
||||
luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue);
|
||||
L->stacksize = realsize;
|
||||
L->stack_last = L->stack+newsize;
|
||||
correctstack(L, oldstack);
|
||||
}
|
||||
|
||||
|
||||
void luaD_reallocCI (lua_State *L, int newsize) {
|
||||
CallInfo *oldci = L->base_ci;
|
||||
luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo);
|
||||
L->size_ci = newsize;
|
||||
L->ci = (L->ci - oldci) + L->base_ci;
|
||||
L->end_ci = L->base_ci + L->size_ci - 1;
|
||||
}
|
||||
|
||||
|
||||
void luaD_growstack (lua_State *L, int n) {
|
||||
if (n <= L->stacksize) /* double size is enough? */
|
||||
luaD_reallocstack(L, 2*L->stacksize);
|
||||
else
|
||||
luaD_reallocstack(L, L->stacksize + n);
|
||||
}
|
||||
|
||||
|
||||
static CallInfo *growCI (lua_State *L) {
|
||||
if (L->size_ci > LUAI_MAXCALLS) /* overflow while handling overflow? */
|
||||
luaD_throw(L, LUA_ERRERR);
|
||||
else {
|
||||
luaD_reallocCI(L, 2*L->size_ci);
|
||||
if (L->size_ci > LUAI_MAXCALLS)
|
||||
luaG_runerror(L, "stack overflow");
|
||||
}
|
||||
return ++L->ci;
|
||||
}
|
||||
|
||||
|
||||
void luaD_callhook (lua_State *L, int event, int line) {
|
||||
lua_Hook hook = L->hook;
|
||||
if (hook && L->allowhook) {
|
||||
ptrdiff_t top = savestack(L, L->top);
|
||||
ptrdiff_t ci_top = savestack(L, L->ci->top);
|
||||
lua_Debug ar;
|
||||
ar.event = event;
|
||||
ar.currentline = line;
|
||||
if (event == LUA_HOOKTAILRET)
|
||||
ar.i_ci = 0; /* tail call; no debug information about it */
|
||||
else
|
||||
ar.i_ci = cast_int(L->ci - L->base_ci);
|
||||
luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
|
||||
L->ci->top = L->top + LUA_MINSTACK;
|
||||
lua_assert(L->ci->top <= L->stack_last);
|
||||
L->allowhook = 0; /* cannot call hooks inside a hook */
|
||||
lua_unlock(L);
|
||||
(*hook)(L, &ar);
|
||||
lua_lock(L);
|
||||
lua_assert(!L->allowhook);
|
||||
L->allowhook = 1;
|
||||
L->ci->top = restorestack(L, ci_top);
|
||||
L->top = restorestack(L, top);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
|
||||
int i;
|
||||
int nfixargs = p->numparams;
|
||||
Table *htab = NULL;
|
||||
StkId base, fixed;
|
||||
for (; actual < nfixargs; ++actual)
|
||||
setnilvalue(L->top++);
|
||||
#if defined(LUA_COMPAT_VARARG)
|
||||
if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */
|
||||
int nvar = actual - nfixargs; /* number of extra arguments */
|
||||
lua_assert(p->is_vararg & VARARG_HASARG);
|
||||
luaC_checkGC(L);
|
||||
luaD_checkstack(L, p->maxstacksize);
|
||||
htab = luaH_new(L, nvar, 1); /* create `arg' table */
|
||||
for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */
|
||||
setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i);
|
||||
/* store counter in field `n' */
|
||||
setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar));
|
||||
}
|
||||
#endif
|
||||
/* move fixed parameters to final position */
|
||||
fixed = L->top - actual; /* first fixed argument */
|
||||
base = L->top; /* final position of first argument */
|
||||
for (i=0; i<nfixargs; i++) {
|
||||
setobjs2s(L, L->top++, fixed+i);
|
||||
setnilvalue(fixed+i);
|
||||
}
|
||||
/* add `arg' parameter */
|
||||
if (htab) {
|
||||
sethvalue(L, L->top++, htab);
|
||||
lua_assert(iswhite(obj2gco(htab)));
|
||||
}
|
||||
return base;
|
||||
}
|
||||
|
||||
|
||||
static StkId tryfuncTM (lua_State *L, StkId func) {
|
||||
const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL);
|
||||
StkId p;
|
||||
ptrdiff_t funcr = savestack(L, func);
|
||||
if (!ttisfunction(tm))
|
||||
luaG_typeerror(L, func, "call");
|
||||
/* Open a hole inside the stack at `func' */
|
||||
for (p = L->top; p > func; p--) setobjs2s(L, p, p-1);
|
||||
incr_top(L);
|
||||
func = restorestack(L, funcr); /* previous call may change stack */
|
||||
setobj2s(L, func, tm); /* tag method is the new function to be called */
|
||||
return func;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define inc_ci(L) \
|
||||
((L->ci == L->end_ci) ? growCI(L) : \
|
||||
(condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci))
|
||||
|
||||
|
||||
int luaD_precall (lua_State *L, StkId func, int nresults) {
|
||||
LClosure *cl;
|
||||
ptrdiff_t funcr;
|
||||
if (!ttisfunction(func)) /* `func' is not a function? */
|
||||
func = tryfuncTM(L, func); /* check the `function' tag method */
|
||||
funcr = savestack(L, func);
|
||||
cl = &clvalue(func)->l;
|
||||
L->ci->savedpc = L->savedpc;
|
||||
if (!cl->isC) { /* Lua function? prepare its call */
|
||||
CallInfo *ci;
|
||||
StkId st, base;
|
||||
Proto *p = cl->p;
|
||||
luaD_checkstack(L, p->maxstacksize);
|
||||
func = restorestack(L, funcr);
|
||||
if (!p->is_vararg) { /* no varargs? */
|
||||
base = func + 1;
|
||||
if (L->top > base + p->numparams)
|
||||
L->top = base + p->numparams;
|
||||
}
|
||||
else { /* vararg function */
|
||||
int nargs = cast_int(L->top - func) - 1;
|
||||
base = adjust_varargs(L, p, nargs);
|
||||
func = restorestack(L, funcr); /* previous call may change the stack */
|
||||
}
|
||||
ci = inc_ci(L); /* now `enter' new function */
|
||||
ci->func = func;
|
||||
L->base = ci->base = base;
|
||||
ci->top = L->base + p->maxstacksize;
|
||||
lua_assert(ci->top <= L->stack_last);
|
||||
L->savedpc = p->code; /* starting point */
|
||||
ci->tailcalls = 0;
|
||||
ci->nresults = nresults;
|
||||
for (st = L->top; st < ci->top; st++)
|
||||
setnilvalue(st);
|
||||
L->top = ci->top;
|
||||
if (L->hookmask & LUA_MASKCALL) {
|
||||
L->savedpc++; /* hooks assume 'pc' is already incremented */
|
||||
luaD_callhook(L, LUA_HOOKCALL, -1);
|
||||
L->savedpc--; /* correct 'pc' */
|
||||
}
|
||||
return PCRLUA;
|
||||
}
|
||||
else { /* if is a C function, call it */
|
||||
CallInfo *ci;
|
||||
int n;
|
||||
luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
|
||||
ci = inc_ci(L); /* now `enter' new function */
|
||||
ci->func = restorestack(L, funcr);
|
||||
L->base = ci->base = ci->func + 1;
|
||||
ci->top = L->top + LUA_MINSTACK;
|
||||
lua_assert(ci->top <= L->stack_last);
|
||||
ci->nresults = nresults;
|
||||
if (L->hookmask & LUA_MASKCALL)
|
||||
luaD_callhook(L, LUA_HOOKCALL, -1);
|
||||
lua_unlock(L);
|
||||
n = (*curr_func(L)->c.f)(L); /* do the actual call */
|
||||
lua_lock(L);
|
||||
if (n < 0) /* yielding? */
|
||||
return PCRYIELD;
|
||||
else {
|
||||
luaD_poscall(L, L->top - n);
|
||||
return PCRC;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static StkId callrethooks (lua_State *L, StkId firstResult) {
|
||||
ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
|
||||
luaD_callhook(L, LUA_HOOKRET, -1);
|
||||
if (f_isLua(L->ci)) { /* Lua function? */
|
||||
while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */
|
||||
luaD_callhook(L, LUA_HOOKTAILRET, -1);
|
||||
}
|
||||
return restorestack(L, fr);
|
||||
}
|
||||
|
||||
|
||||
int luaD_poscall (lua_State *L, StkId firstResult) {
|
||||
StkId res;
|
||||
int wanted, i;
|
||||
CallInfo *ci;
|
||||
if (L->hookmask & LUA_MASKRET)
|
||||
firstResult = callrethooks(L, firstResult);
|
||||
ci = L->ci--;
|
||||
res = ci->func; /* res == final position of 1st result */
|
||||
wanted = ci->nresults;
|
||||
L->base = (ci - 1)->base; /* restore base */
|
||||
L->savedpc = (ci - 1)->savedpc; /* restore savedpc */
|
||||
/* move results to correct place */
|
||||
for (i = wanted; i != 0 && firstResult < L->top; i--)
|
||||
setobjs2s(L, res++, firstResult++);
|
||||
while (i-- > 0)
|
||||
setnilvalue(res++);
|
||||
L->top = res;
|
||||
return (wanted - LUA_MULTRET); /* 0 iff wanted == LUA_MULTRET */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Call a function (C or Lua). The function to be called is at *func.
|
||||
** The arguments are on the stack, right after the function.
|
||||
** When returns, all the results are on the stack, starting at the original
|
||||
** function position.
|
||||
*/
|
||||
void luaD_call (lua_State *L, StkId func, int nResults) {
|
||||
if (++L->nCcalls >= LUAI_MAXCCALLS) {
|
||||
if (L->nCcalls == LUAI_MAXCCALLS)
|
||||
luaG_runerror(L, "C stack overflow");
|
||||
else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
|
||||
luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
|
||||
}
|
||||
if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */
|
||||
luaV_execute(L, 1); /* call it */
|
||||
L->nCcalls--;
|
||||
luaC_checkGC(L);
|
||||
}
|
||||
|
||||
|
||||
static void resume (lua_State *L, void *ud) {
|
||||
StkId firstArg = cast(StkId, ud);
|
||||
CallInfo *ci = L->ci;
|
||||
if (L->status == 0) { /* start coroutine? */
|
||||
lua_assert(ci == L->base_ci && firstArg > L->base);
|
||||
if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA)
|
||||
return;
|
||||
}
|
||||
else { /* resuming from previous yield */
|
||||
lua_assert(L->status == LUA_YIELD);
|
||||
L->status = 0;
|
||||
if (!f_isLua(ci)) { /* `common' yield? */
|
||||
/* finish interrupted execution of `OP_CALL' */
|
||||
lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL ||
|
||||
GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL);
|
||||
if (luaD_poscall(L, firstArg)) /* complete it... */
|
||||
L->top = L->ci->top; /* and correct top if not multiple results */
|
||||
}
|
||||
else /* yielded inside a hook: just continue its execution */
|
||||
L->base = L->ci->base;
|
||||
}
|
||||
luaV_execute(L, cast_int(L->ci - L->base_ci));
|
||||
}
|
||||
|
||||
|
||||
static int resume_error (lua_State *L, const char *msg) {
|
||||
L->top = L->ci->base;
|
||||
setsvalue2s(L, L->top, luaS_new(L, msg));
|
||||
incr_top(L);
|
||||
lua_unlock(L);
|
||||
return LUA_ERRRUN;
|
||||
}
|
||||
|
||||
|
||||
LUA_API int lua_resume (lua_State *L, int nargs) {
|
||||
int status;
|
||||
lua_lock(L);
|
||||
if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci))
|
||||
return resume_error(L, "cannot resume non-suspended coroutine");
|
||||
if (L->nCcalls >= LUAI_MAXCCALLS)
|
||||
return resume_error(L, "C stack overflow");
|
||||
luai_userstateresume(L, nargs);
|
||||
lua_assert(L->errfunc == 0);
|
||||
L->baseCcalls = ++L->nCcalls;
|
||||
status = luaD_rawrunprotected(L, resume, L->top - nargs);
|
||||
if (status != 0) { /* error? */
|
||||
L->status = cast_byte(status); /* mark thread as `dead' */
|
||||
luaD_seterrorobj(L, status, L->top);
|
||||
L->ci->top = L->top;
|
||||
}
|
||||
else {
|
||||
lua_assert(L->nCcalls == L->baseCcalls);
|
||||
status = L->status;
|
||||
}
|
||||
--L->nCcalls;
|
||||
lua_unlock(L);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
LUA_API int lua_yield (lua_State *L, int nresults) {
|
||||
luai_userstateyield(L, nresults);
|
||||
lua_lock(L);
|
||||
if (L->nCcalls > L->baseCcalls)
|
||||
luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
|
||||
L->base = L->top - nresults; /* protect stack slots below */
|
||||
L->status = LUA_YIELD;
|
||||
lua_unlock(L);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int luaD_pcall (lua_State *L, Pfunc func, void *u,
|
||||
ptrdiff_t old_top, ptrdiff_t ef) {
|
||||
int status;
|
||||
unsigned short oldnCcalls = L->nCcalls;
|
||||
ptrdiff_t old_ci = saveci(L, L->ci);
|
||||
lu_byte old_allowhooks = L->allowhook;
|
||||
ptrdiff_t old_errfunc = L->errfunc;
|
||||
L->errfunc = ef;
|
||||
status = luaD_rawrunprotected(L, func, u);
|
||||
if (status != 0) { /* an error occurred? */
|
||||
StkId oldtop = restorestack(L, old_top);
|
||||
luaF_close(L, oldtop); /* close eventual pending closures */
|
||||
luaD_seterrorobj(L, status, oldtop);
|
||||
L->nCcalls = oldnCcalls;
|
||||
L->ci = restoreci(L, old_ci);
|
||||
L->base = L->ci->base;
|
||||
L->savedpc = L->ci->savedpc;
|
||||
L->allowhook = old_allowhooks;
|
||||
restore_stack_limit(L);
|
||||
}
|
||||
L->errfunc = old_errfunc;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** Execute a protected parser.
|
||||
*/
|
||||
struct SParser { /* data to `f_parser' */
|
||||
ZIO *z;
|
||||
Mbuffer buff; /* buffer to be used by the scanner */
|
||||
const char *name;
|
||||
};
|
||||
|
||||
static void f_parser (lua_State *L, void *ud) {
|
||||
int i;
|
||||
Proto *tf;
|
||||
Closure *cl;
|
||||
struct SParser *p = cast(struct SParser *, ud);
|
||||
int c = luaZ_lookahead(p->z);
|
||||
luaC_checkGC(L);
|
||||
tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z,
|
||||
&p->buff, p->name);
|
||||
cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L)));
|
||||
cl->l.p = tf;
|
||||
for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */
|
||||
cl->l.upvals[i] = luaF_newupval(L);
|
||||
setclvalue(L, L->top, cl);
|
||||
incr_top(L);
|
||||
}
|
||||
|
||||
|
||||
int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {
|
||||
struct SParser p;
|
||||
int status;
|
||||
p.z = z; p.name = name;
|
||||
luaZ_initbuffer(L, &p.buff);
|
||||
status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc);
|
||||
luaZ_freebuffer(L, &p.buff);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
57
extern/lua-5.1.5/src/ldo.h
vendored
Normal file
57
extern/lua-5.1.5/src/ldo.h
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** Stack and Call structure of Lua
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#ifndef ldo_h
|
||||
#define ldo_h
|
||||
|
||||
|
||||
#include "lobject.h"
|
||||
#include "lstate.h"
|
||||
#include "lzio.h"
|
||||
|
||||
|
||||
#define luaD_checkstack(L,n) \
|
||||
if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \
|
||||
luaD_growstack(L, n); \
|
||||
else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1));
|
||||
|
||||
|
||||
#define incr_top(L) {luaD_checkstack(L,1); L->top++;}
|
||||
|
||||
#define savestack(L,p) ((char *)(p) - (char *)L->stack)
|
||||
#define restorestack(L,n) ((TValue *)((char *)L->stack + (n)))
|
||||
|
||||
#define saveci(L,p) ((char *)(p) - (char *)L->base_ci)
|
||||
#define restoreci(L,n) ((CallInfo *)((char *)L->base_ci + (n)))
|
||||
|
||||
|
||||
/* results from luaD_precall */
|
||||
#define PCRLUA 0 /* initiated a call to a Lua function */
|
||||
#define PCRC 1 /* did a call to a C function */
|
||||
#define PCRYIELD 2 /* C funtion yielded */
|
||||
|
||||
|
||||
/* type of protected functions, to be ran by `runprotected' */
|
||||
typedef void (*Pfunc) (lua_State *L, void *ud);
|
||||
|
||||
LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name);
|
||||
LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line);
|
||||
LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults);
|
||||
LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults);
|
||||
LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u,
|
||||
ptrdiff_t oldtop, ptrdiff_t ef);
|
||||
LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult);
|
||||
LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize);
|
||||
LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize);
|
||||
LUAI_FUNC void luaD_growstack (lua_State *L, int n);
|
||||
|
||||
LUAI_FUNC void luaD_throw (lua_State *L, int errcode);
|
||||
LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
|
||||
|
||||
LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop);
|
||||
|
||||
#endif
|
||||
|
||||
164
extern/lua-5.1.5/src/ldump.c
vendored
Normal file
164
extern/lua-5.1.5/src/ldump.c
vendored
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** save precompiled Lua chunks
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#define ldump_c
|
||||
#define LUA_CORE
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "lobject.h"
|
||||
#include "lstate.h"
|
||||
#include "lundump.h"
|
||||
|
||||
typedef struct {
|
||||
lua_State* L;
|
||||
lua_Writer writer;
|
||||
void* data;
|
||||
int strip;
|
||||
int status;
|
||||
} DumpState;
|
||||
|
||||
#define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D)
|
||||
#define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D)
|
||||
|
||||
static void DumpBlock(const void* b, size_t size, DumpState* D)
|
||||
{
|
||||
if (D->status==0)
|
||||
{
|
||||
lua_unlock(D->L);
|
||||
D->status=(*D->writer)(D->L,b,size,D->data);
|
||||
lua_lock(D->L);
|
||||
}
|
||||
}
|
||||
|
||||
static void DumpChar(int y, DumpState* D)
|
||||
{
|
||||
char x=(char)y;
|
||||
DumpVar(x,D);
|
||||
}
|
||||
|
||||
static void DumpInt(int x, DumpState* D)
|
||||
{
|
||||
DumpVar(x,D);
|
||||
}
|
||||
|
||||
static void DumpNumber(lua_Number x, DumpState* D)
|
||||
{
|
||||
DumpVar(x,D);
|
||||
}
|
||||
|
||||
static void DumpVector(const void* b, int n, size_t size, DumpState* D)
|
||||
{
|
||||
DumpInt(n,D);
|
||||
DumpMem(b,n,size,D);
|
||||
}
|
||||
|
||||
static void DumpString(const TString* s, DumpState* D)
|
||||
{
|
||||
if (s==NULL || getstr(s)==NULL)
|
||||
{
|
||||
size_t size=0;
|
||||
DumpVar(size,D);
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t size=s->tsv.len+1; /* include trailing '\0' */
|
||||
DumpVar(size,D);
|
||||
DumpBlock(getstr(s),size,D);
|
||||
}
|
||||
}
|
||||
|
||||
#define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D)
|
||||
|
||||
static void DumpFunction(const Proto* f, const TString* p, DumpState* D);
|
||||
|
||||
static void DumpConstants(const Proto* f, DumpState* D)
|
||||
{
|
||||
int i,n=f->sizek;
|
||||
DumpInt(n,D);
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
const TValue* o=&f->k[i];
|
||||
DumpChar(ttype(o),D);
|
||||
switch (ttype(o))
|
||||
{
|
||||
case LUA_TNIL:
|
||||
break;
|
||||
case LUA_TBOOLEAN:
|
||||
DumpChar(bvalue(o),D);
|
||||
break;
|
||||
case LUA_TNUMBER:
|
||||
DumpNumber(nvalue(o),D);
|
||||
break;
|
||||
case LUA_TSTRING:
|
||||
DumpString(rawtsvalue(o),D);
|
||||
break;
|
||||
default:
|
||||
lua_assert(0); /* cannot happen */
|
||||
break;
|
||||
}
|
||||
}
|
||||
n=f->sizep;
|
||||
DumpInt(n,D);
|
||||
for (i=0; i<n; i++) DumpFunction(f->p[i],f->source,D);
|
||||
}
|
||||
|
||||
static void DumpDebug(const Proto* f, DumpState* D)
|
||||
{
|
||||
int i,n;
|
||||
n= (D->strip) ? 0 : f->sizelineinfo;
|
||||
DumpVector(f->lineinfo,n,sizeof(int),D);
|
||||
n= (D->strip) ? 0 : f->sizelocvars;
|
||||
DumpInt(n,D);
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
DumpString(f->locvars[i].varname,D);
|
||||
DumpInt(f->locvars[i].startpc,D);
|
||||
DumpInt(f->locvars[i].endpc,D);
|
||||
}
|
||||
n= (D->strip) ? 0 : f->sizeupvalues;
|
||||
DumpInt(n,D);
|
||||
for (i=0; i<n; i++) DumpString(f->upvalues[i],D);
|
||||
}
|
||||
|
||||
static void DumpFunction(const Proto* f, const TString* p, DumpState* D)
|
||||
{
|
||||
DumpString((f->source==p || D->strip) ? NULL : f->source,D);
|
||||
DumpInt(f->linedefined,D);
|
||||
DumpInt(f->lastlinedefined,D);
|
||||
DumpChar(f->nups,D);
|
||||
DumpChar(f->numparams,D);
|
||||
DumpChar(f->is_vararg,D);
|
||||
DumpChar(f->maxstacksize,D);
|
||||
DumpCode(f,D);
|
||||
DumpConstants(f,D);
|
||||
DumpDebug(f,D);
|
||||
}
|
||||
|
||||
static void DumpHeader(DumpState* D)
|
||||
{
|
||||
char h[LUAC_HEADERSIZE];
|
||||
luaU_header(h);
|
||||
DumpBlock(h,LUAC_HEADERSIZE,D);
|
||||
}
|
||||
|
||||
/*
|
||||
** dump Lua function as precompiled chunk
|
||||
*/
|
||||
int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip)
|
||||
{
|
||||
DumpState D;
|
||||
D.L=L;
|
||||
D.writer=w;
|
||||
D.data=data;
|
||||
D.strip=strip;
|
||||
D.status=0;
|
||||
DumpHeader(&D);
|
||||
DumpFunction(f,NULL,&D);
|
||||
return D.status;
|
||||
}
|
||||
174
extern/lua-5.1.5/src/lfunc.c
vendored
Normal file
174
extern/lua-5.1.5/src/lfunc.c
vendored
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $
|
||||
** Auxiliary functions to manipulate prototypes and closures
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#define lfunc_c
|
||||
#define LUA_CORE
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "lfunc.h"
|
||||
#include "lgc.h"
|
||||
#include "lmem.h"
|
||||
#include "lobject.h"
|
||||
#include "lstate.h"
|
||||
|
||||
|
||||
|
||||
Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) {
|
||||
Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems)));
|
||||
luaC_link(L, obj2gco(c), LUA_TFUNCTION);
|
||||
c->c.isC = 1;
|
||||
c->c.env = e;
|
||||
c->c.nupvalues = cast_byte(nelems);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) {
|
||||
Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems)));
|
||||
luaC_link(L, obj2gco(c), LUA_TFUNCTION);
|
||||
c->l.isC = 0;
|
||||
c->l.env = e;
|
||||
c->l.nupvalues = cast_byte(nelems);
|
||||
while (nelems--) c->l.upvals[nelems] = NULL;
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
UpVal *luaF_newupval (lua_State *L) {
|
||||
UpVal *uv = luaM_new(L, UpVal);
|
||||
luaC_link(L, obj2gco(uv), LUA_TUPVAL);
|
||||
uv->v = &uv->u.value;
|
||||
setnilvalue(uv->v);
|
||||
return uv;
|
||||
}
|
||||
|
||||
|
||||
UpVal *luaF_findupval (lua_State *L, StkId level) {
|
||||
global_State *g = G(L);
|
||||
GCObject **pp = &L->openupval;
|
||||
UpVal *p;
|
||||
UpVal *uv;
|
||||
while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) {
|
||||
lua_assert(p->v != &p->u.value);
|
||||
if (p->v == level) { /* found a corresponding upvalue? */
|
||||
if (isdead(g, obj2gco(p))) /* is it dead? */
|
||||
changewhite(obj2gco(p)); /* ressurect it */
|
||||
return p;
|
||||
}
|
||||
pp = &p->next;
|
||||
}
|
||||
uv = luaM_new(L, UpVal); /* not found: create a new one */
|
||||
uv->tt = LUA_TUPVAL;
|
||||
uv->marked = luaC_white(g);
|
||||
uv->v = level; /* current value lives in the stack */
|
||||
uv->next = *pp; /* chain it in the proper position */
|
||||
*pp = obj2gco(uv);
|
||||
uv->u.l.prev = &g->uvhead; /* double link it in `uvhead' list */
|
||||
uv->u.l.next = g->uvhead.u.l.next;
|
||||
uv->u.l.next->u.l.prev = uv;
|
||||
g->uvhead.u.l.next = uv;
|
||||
lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
|
||||
return uv;
|
||||
}
|
||||
|
||||
|
||||
static void unlinkupval (UpVal *uv) {
|
||||
lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
|
||||
uv->u.l.next->u.l.prev = uv->u.l.prev; /* remove from `uvhead' list */
|
||||
uv->u.l.prev->u.l.next = uv->u.l.next;
|
||||
}
|
||||
|
||||
|
||||
void luaF_freeupval (lua_State *L, UpVal *uv) {
|
||||
if (uv->v != &uv->u.value) /* is it open? */
|
||||
unlinkupval(uv); /* remove from open list */
|
||||
luaM_free(L, uv); /* free upvalue */
|
||||
}
|
||||
|
||||
|
||||
void luaF_close (lua_State *L, StkId level) {
|
||||
UpVal *uv;
|
||||
global_State *g = G(L);
|
||||
while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) {
|
||||
GCObject *o = obj2gco(uv);
|
||||
lua_assert(!isblack(o) && uv->v != &uv->u.value);
|
||||
L->openupval = uv->next; /* remove from `open' list */
|
||||
if (isdead(g, o))
|
||||
luaF_freeupval(L, uv); /* free upvalue */
|
||||
else {
|
||||
unlinkupval(uv);
|
||||
setobj(L, &uv->u.value, uv->v);
|
||||
uv->v = &uv->u.value; /* now current value lives here */
|
||||
luaC_linkupval(L, uv); /* link upvalue into `gcroot' list */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Proto *luaF_newproto (lua_State *L) {
|
||||
Proto *f = luaM_new(L, Proto);
|
||||
luaC_link(L, obj2gco(f), LUA_TPROTO);
|
||||
f->k = NULL;
|
||||
f->sizek = 0;
|
||||
f->p = NULL;
|
||||
f->sizep = 0;
|
||||
f->code = NULL;
|
||||
f->sizecode = 0;
|
||||
f->sizelineinfo = 0;
|
||||
f->sizeupvalues = 0;
|
||||
f->nups = 0;
|
||||
f->upvalues = NULL;
|
||||
f->numparams = 0;
|
||||
f->is_vararg = 0;
|
||||
f->maxstacksize = 0;
|
||||
f->lineinfo = NULL;
|
||||
f->sizelocvars = 0;
|
||||
f->locvars = NULL;
|
||||
f->linedefined = 0;
|
||||
f->lastlinedefined = 0;
|
||||
f->source = NULL;
|
||||
return f;
|
||||
}
|
||||
|
||||
|
||||
void luaF_freeproto (lua_State *L, Proto *f) {
|
||||
luaM_freearray(L, f->code, f->sizecode, Instruction);
|
||||
luaM_freearray(L, f->p, f->sizep, Proto *);
|
||||
luaM_freearray(L, f->k, f->sizek, TValue);
|
||||
luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);
|
||||
luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);
|
||||
luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *);
|
||||
luaM_free(L, f);
|
||||
}
|
||||
|
||||
|
||||
void luaF_freeclosure (lua_State *L, Closure *c) {
|
||||
int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) :
|
||||
sizeLclosure(c->l.nupvalues);
|
||||
luaM_freemem(L, c, size);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Look for n-th local variable at line `line' in function `func'.
|
||||
** Returns NULL if not found.
|
||||
*/
|
||||
const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
|
||||
int i;
|
||||
for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
|
||||
if (pc < f->locvars[i].endpc) { /* is variable active? */
|
||||
local_number--;
|
||||
if (local_number == 0)
|
||||
return getstr(f->locvars[i].varname);
|
||||
}
|
||||
}
|
||||
return NULL; /* not found */
|
||||
}
|
||||
|
||||
34
extern/lua-5.1.5/src/lfunc.h
vendored
Normal file
34
extern/lua-5.1.5/src/lfunc.h
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** Auxiliary functions to manipulate prototypes and closures
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#ifndef lfunc_h
|
||||
#define lfunc_h
|
||||
|
||||
|
||||
#include "lobject.h"
|
||||
|
||||
|
||||
#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \
|
||||
cast(int, sizeof(TValue)*((n)-1)))
|
||||
|
||||
#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \
|
||||
cast(int, sizeof(TValue *)*((n)-1)))
|
||||
|
||||
|
||||
LUAI_FUNC Proto *luaF_newproto (lua_State *L);
|
||||
LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e);
|
||||
LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e);
|
||||
LUAI_FUNC UpVal *luaF_newupval (lua_State *L);
|
||||
LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level);
|
||||
LUAI_FUNC void luaF_close (lua_State *L, StkId level);
|
||||
LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f);
|
||||
LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c);
|
||||
LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv);
|
||||
LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number,
|
||||
int pc);
|
||||
|
||||
|
||||
#endif
|
||||
710
extern/lua-5.1.5/src/lgc.c
vendored
Normal file
710
extern/lua-5.1.5/src/lgc.c
vendored
Normal file
|
|
@ -0,0 +1,710 @@
|
|||
/*
|
||||
** $Id: lgc.c,v 2.38.1.2 2011/03/18 18:05:38 roberto Exp $
|
||||
** Garbage Collector
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#define lgc_c
|
||||
#define LUA_CORE
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "ldebug.h"
|
||||
#include "ldo.h"
|
||||
#include "lfunc.h"
|
||||
#include "lgc.h"
|
||||
#include "lmem.h"
|
||||
#include "lobject.h"
|
||||
#include "lstate.h"
|
||||
#include "lstring.h"
|
||||
#include "ltable.h"
|
||||
#include "ltm.h"
|
||||
|
||||
|
||||
#define GCSTEPSIZE 1024u
|
||||
#define GCSWEEPMAX 40
|
||||
#define GCSWEEPCOST 10
|
||||
#define GCFINALIZECOST 100
|
||||
|
||||
|
||||
#define maskmarks cast_byte(~(bitmask(BLACKBIT)|WHITEBITS))
|
||||
|
||||
#define makewhite(g,x) \
|
||||
((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g)))
|
||||
|
||||
#define white2gray(x) reset2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)
|
||||
#define black2gray(x) resetbit((x)->gch.marked, BLACKBIT)
|
||||
|
||||
#define stringmark(s) reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT)
|
||||
|
||||
|
||||
#define isfinalized(u) testbit((u)->marked, FINALIZEDBIT)
|
||||
#define markfinalized(u) l_setbit((u)->marked, FINALIZEDBIT)
|
||||
|
||||
|
||||
#define KEYWEAK bitmask(KEYWEAKBIT)
|
||||
#define VALUEWEAK bitmask(VALUEWEAKBIT)
|
||||
|
||||
|
||||
|
||||
#define markvalue(g,o) { checkconsistency(o); \
|
||||
if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); }
|
||||
|
||||
#define markobject(g,t) { if (iswhite(obj2gco(t))) \
|
||||
reallymarkobject(g, obj2gco(t)); }
|
||||
|
||||
|
||||
#define setthreshold(g) (g->GCthreshold = (g->estimate/100) * g->gcpause)
|
||||
|
||||
|
||||
static void removeentry (Node *n) {
|
||||
lua_assert(ttisnil(gval(n)));
|
||||
if (iscollectable(gkey(n)))
|
||||
setttype(gkey(n), LUA_TDEADKEY); /* dead key; remove it */
|
||||
}
|
||||
|
||||
|
||||
static void reallymarkobject (global_State *g, GCObject *o) {
|
||||
lua_assert(iswhite(o) && !isdead(g, o));
|
||||
white2gray(o);
|
||||
switch (o->gch.tt) {
|
||||
case LUA_TSTRING: {
|
||||
return;
|
||||
}
|
||||
case LUA_TUSERDATA: {
|
||||
Table *mt = gco2u(o)->metatable;
|
||||
gray2black(o); /* udata are never gray */
|
||||
if (mt) markobject(g, mt);
|
||||
markobject(g, gco2u(o)->env);
|
||||
return;
|
||||
}
|
||||
case LUA_TUPVAL: {
|
||||
UpVal *uv = gco2uv(o);
|
||||
markvalue(g, uv->v);
|
||||
if (uv->v == &uv->u.value) /* closed? */
|
||||
gray2black(o); /* open upvalues are never black */
|
||||
return;
|
||||
}
|
||||
case LUA_TFUNCTION: {
|
||||
gco2cl(o)->c.gclist = g->gray;
|
||||
g->gray = o;
|
||||
break;
|
||||
}
|
||||
case LUA_TTABLE: {
|
||||
gco2h(o)->gclist = g->gray;
|
||||
g->gray = o;
|
||||
break;
|
||||
}
|
||||
case LUA_TTHREAD: {
|
||||
gco2th(o)->gclist = g->gray;
|
||||
g->gray = o;
|
||||
break;
|
||||
}
|
||||
case LUA_TPROTO: {
|
||||
gco2p(o)->gclist = g->gray;
|
||||
g->gray = o;
|
||||
break;
|
||||
}
|
||||
default: lua_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void marktmu (global_State *g) {
|
||||
GCObject *u = g->tmudata;
|
||||
if (u) {
|
||||
do {
|
||||
u = u->gch.next;
|
||||
makewhite(g, u); /* may be marked, if left from previous GC */
|
||||
reallymarkobject(g, u);
|
||||
} while (u != g->tmudata);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* move `dead' udata that need finalization to list `tmudata' */
|
||||
size_t luaC_separateudata (lua_State *L, int all) {
|
||||
global_State *g = G(L);
|
||||
size_t deadmem = 0;
|
||||
GCObject **p = &g->mainthread->next;
|
||||
GCObject *curr;
|
||||
while ((curr = *p) != NULL) {
|
||||
if (!(iswhite(curr) || all) || isfinalized(gco2u(curr)))
|
||||
p = &curr->gch.next; /* don't bother with them */
|
||||
else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) {
|
||||
markfinalized(gco2u(curr)); /* don't need finalization */
|
||||
p = &curr->gch.next;
|
||||
}
|
||||
else { /* must call its gc method */
|
||||
deadmem += sizeudata(gco2u(curr));
|
||||
markfinalized(gco2u(curr));
|
||||
*p = curr->gch.next;
|
||||
/* link `curr' at the end of `tmudata' list */
|
||||
if (g->tmudata == NULL) /* list is empty? */
|
||||
g->tmudata = curr->gch.next = curr; /* creates a circular list */
|
||||
else {
|
||||
curr->gch.next = g->tmudata->gch.next;
|
||||
g->tmudata->gch.next = curr;
|
||||
g->tmudata = curr;
|
||||
}
|
||||
}
|
||||
}
|
||||
return deadmem;
|
||||
}
|
||||
|
||||
|
||||
static int traversetable (global_State *g, Table *h) {
|
||||
int i;
|
||||
int weakkey = 0;
|
||||
int weakvalue = 0;
|
||||
const TValue *mode;
|
||||
if (h->metatable)
|
||||
markobject(g, h->metatable);
|
||||
mode = gfasttm(g, h->metatable, TM_MODE);
|
||||
if (mode && ttisstring(mode)) { /* is there a weak mode? */
|
||||
weakkey = (strchr(svalue(mode), 'k') != NULL);
|
||||
weakvalue = (strchr(svalue(mode), 'v') != NULL);
|
||||
if (weakkey || weakvalue) { /* is really weak? */
|
||||
h->marked &= ~(KEYWEAK | VALUEWEAK); /* clear bits */
|
||||
h->marked |= cast_byte((weakkey << KEYWEAKBIT) |
|
||||
(weakvalue << VALUEWEAKBIT));
|
||||
h->gclist = g->weak; /* must be cleared after GC, ... */
|
||||
g->weak = obj2gco(h); /* ... so put in the appropriate list */
|
||||
}
|
||||
}
|
||||
if (weakkey && weakvalue) return 1;
|
||||
if (!weakvalue) {
|
||||
i = h->sizearray;
|
||||
while (i--)
|
||||
markvalue(g, &h->array[i]);
|
||||
}
|
||||
i = sizenode(h);
|
||||
while (i--) {
|
||||
Node *n = gnode(h, i);
|
||||
lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n)));
|
||||
if (ttisnil(gval(n)))
|
||||
removeentry(n); /* remove empty entries */
|
||||
else {
|
||||
lua_assert(!ttisnil(gkey(n)));
|
||||
if (!weakkey) markvalue(g, gkey(n));
|
||||
if (!weakvalue) markvalue(g, gval(n));
|
||||
}
|
||||
}
|
||||
return weakkey || weakvalue;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** All marks are conditional because a GC may happen while the
|
||||
** prototype is still being created
|
||||
*/
|
||||
static void traverseproto (global_State *g, Proto *f) {
|
||||
int i;
|
||||
if (f->source) stringmark(f->source);
|
||||
for (i=0; i<f->sizek; i++) /* mark literals */
|
||||
markvalue(g, &f->k[i]);
|
||||
for (i=0; i<f->sizeupvalues; i++) { /* mark upvalue names */
|
||||
if (f->upvalues[i])
|
||||
stringmark(f->upvalues[i]);
|
||||
}
|
||||
for (i=0; i<f->sizep; i++) { /* mark nested protos */
|
||||
if (f->p[i])
|
||||
markobject(g, f->p[i]);
|
||||
}
|
||||
for (i=0; i<f->sizelocvars; i++) { /* mark local-variable names */
|
||||
if (f->locvars[i].varname)
|
||||
stringmark(f->locvars[i].varname);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void traverseclosure (global_State *g, Closure *cl) {
|
||||
markobject(g, cl->c.env);
|
||||
if (cl->c.isC) {
|
||||
int i;
|
||||
for (i=0; i<cl->c.nupvalues; i++) /* mark its upvalues */
|
||||
markvalue(g, &cl->c.upvalue[i]);
|
||||
}
|
||||
else {
|
||||
int i;
|
||||
lua_assert(cl->l.nupvalues == cl->l.p->nups);
|
||||
markobject(g, cl->l.p);
|
||||
for (i=0; i<cl->l.nupvalues; i++) /* mark its upvalues */
|
||||
markobject(g, cl->l.upvals[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void checkstacksizes (lua_State *L, StkId max) {
|
||||
int ci_used = cast_int(L->ci - L->base_ci); /* number of `ci' in use */
|
||||
int s_used = cast_int(max - L->stack); /* part of stack in use */
|
||||
if (L->size_ci > LUAI_MAXCALLS) /* handling overflow? */
|
||||
return; /* do not touch the stacks */
|
||||
if (4*ci_used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci)
|
||||
luaD_reallocCI(L, L->size_ci/2); /* still big enough... */
|
||||
condhardstacktests(luaD_reallocCI(L, ci_used + 1));
|
||||
if (4*s_used < L->stacksize &&
|
||||
2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize)
|
||||
luaD_reallocstack(L, L->stacksize/2); /* still big enough... */
|
||||
condhardstacktests(luaD_reallocstack(L, s_used));
|
||||
}
|
||||
|
||||
|
||||
static void traversestack (global_State *g, lua_State *l) {
|
||||
StkId o, lim;
|
||||
CallInfo *ci;
|
||||
markvalue(g, gt(l));
|
||||
lim = l->top;
|
||||
for (ci = l->base_ci; ci <= l->ci; ci++) {
|
||||
lua_assert(ci->top <= l->stack_last);
|
||||
if (lim < ci->top) lim = ci->top;
|
||||
}
|
||||
for (o = l->stack; o < l->top; o++)
|
||||
markvalue(g, o);
|
||||
for (; o <= lim; o++)
|
||||
setnilvalue(o);
|
||||
checkstacksizes(l, lim);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** traverse one gray object, turning it to black.
|
||||
** Returns `quantity' traversed.
|
||||
*/
|
||||
static l_mem propagatemark (global_State *g) {
|
||||
GCObject *o = g->gray;
|
||||
lua_assert(isgray(o));
|
||||
gray2black(o);
|
||||
switch (o->gch.tt) {
|
||||
case LUA_TTABLE: {
|
||||
Table *h = gco2h(o);
|
||||
g->gray = h->gclist;
|
||||
if (traversetable(g, h)) /* table is weak? */
|
||||
black2gray(o); /* keep it gray */
|
||||
return sizeof(Table) + sizeof(TValue) * h->sizearray +
|
||||
sizeof(Node) * sizenode(h);
|
||||
}
|
||||
case LUA_TFUNCTION: {
|
||||
Closure *cl = gco2cl(o);
|
||||
g->gray = cl->c.gclist;
|
||||
traverseclosure(g, cl);
|
||||
return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) :
|
||||
sizeLclosure(cl->l.nupvalues);
|
||||
}
|
||||
case LUA_TTHREAD: {
|
||||
lua_State *th = gco2th(o);
|
||||
g->gray = th->gclist;
|
||||
th->gclist = g->grayagain;
|
||||
g->grayagain = o;
|
||||
black2gray(o);
|
||||
traversestack(g, th);
|
||||
return sizeof(lua_State) + sizeof(TValue) * th->stacksize +
|
||||
sizeof(CallInfo) * th->size_ci;
|
||||
}
|
||||
case LUA_TPROTO: {
|
||||
Proto *p = gco2p(o);
|
||||
g->gray = p->gclist;
|
||||
traverseproto(g, p);
|
||||
return sizeof(Proto) + sizeof(Instruction) * p->sizecode +
|
||||
sizeof(Proto *) * p->sizep +
|
||||
sizeof(TValue) * p->sizek +
|
||||
sizeof(int) * p->sizelineinfo +
|
||||
sizeof(LocVar) * p->sizelocvars +
|
||||
sizeof(TString *) * p->sizeupvalues;
|
||||
}
|
||||
default: lua_assert(0); return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static size_t propagateall (global_State *g) {
|
||||
size_t m = 0;
|
||||
while (g->gray) m += propagatemark(g);
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** The next function tells whether a key or value can be cleared from
|
||||
** a weak table. Non-collectable objects are never removed from weak
|
||||
** tables. Strings behave as `values', so are never removed too. for
|
||||
** other objects: if really collected, cannot keep them; for userdata
|
||||
** being finalized, keep them in keys, but not in values
|
||||
*/
|
||||
static int iscleared (const TValue *o, int iskey) {
|
||||
if (!iscollectable(o)) return 0;
|
||||
if (ttisstring(o)) {
|
||||
stringmark(rawtsvalue(o)); /* strings are `values', so are never weak */
|
||||
return 0;
|
||||
}
|
||||
return iswhite(gcvalue(o)) ||
|
||||
(ttisuserdata(o) && (!iskey && isfinalized(uvalue(o))));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** clear collected entries from weaktables
|
||||
*/
|
||||
static void cleartable (GCObject *l) {
|
||||
while (l) {
|
||||
Table *h = gco2h(l);
|
||||
int i = h->sizearray;
|
||||
lua_assert(testbit(h->marked, VALUEWEAKBIT) ||
|
||||
testbit(h->marked, KEYWEAKBIT));
|
||||
if (testbit(h->marked, VALUEWEAKBIT)) {
|
||||
while (i--) {
|
||||
TValue *o = &h->array[i];
|
||||
if (iscleared(o, 0)) /* value was collected? */
|
||||
setnilvalue(o); /* remove value */
|
||||
}
|
||||
}
|
||||
i = sizenode(h);
|
||||
while (i--) {
|
||||
Node *n = gnode(h, i);
|
||||
if (!ttisnil(gval(n)) && /* non-empty entry? */
|
||||
(iscleared(key2tval(n), 1) || iscleared(gval(n), 0))) {
|
||||
setnilvalue(gval(n)); /* remove value ... */
|
||||
removeentry(n); /* remove entry from table */
|
||||
}
|
||||
}
|
||||
l = h->gclist;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void freeobj (lua_State *L, GCObject *o) {
|
||||
switch (o->gch.tt) {
|
||||
case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;
|
||||
case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break;
|
||||
case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break;
|
||||
case LUA_TTABLE: luaH_free(L, gco2h(o)); break;
|
||||
case LUA_TTHREAD: {
|
||||
lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread);
|
||||
luaE_freethread(L, gco2th(o));
|
||||
break;
|
||||
}
|
||||
case LUA_TSTRING: {
|
||||
G(L)->strt.nuse--;
|
||||
luaM_freemem(L, o, sizestring(gco2ts(o)));
|
||||
break;
|
||||
}
|
||||
case LUA_TUSERDATA: {
|
||||
luaM_freemem(L, o, sizeudata(gco2u(o)));
|
||||
break;
|
||||
}
|
||||
default: lua_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM)
|
||||
|
||||
|
||||
static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {
|
||||
GCObject *curr;
|
||||
global_State *g = G(L);
|
||||
int deadmask = otherwhite(g);
|
||||
while ((curr = *p) != NULL && count-- > 0) {
|
||||
if (curr->gch.tt == LUA_TTHREAD) /* sweep open upvalues of each thread */
|
||||
sweepwholelist(L, &gco2th(curr)->openupval);
|
||||
if ((curr->gch.marked ^ WHITEBITS) & deadmask) { /* not dead? */
|
||||
lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT));
|
||||
makewhite(g, curr); /* make it white (for next cycle) */
|
||||
p = &curr->gch.next;
|
||||
}
|
||||
else { /* must erase `curr' */
|
||||
lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT));
|
||||
*p = curr->gch.next;
|
||||
if (curr == g->rootgc) /* is the first element of the list? */
|
||||
g->rootgc = curr->gch.next; /* adjust first */
|
||||
freeobj(L, curr);
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
static void checkSizes (lua_State *L) {
|
||||
global_State *g = G(L);
|
||||
/* check size of string hash */
|
||||
if (g->strt.nuse < cast(lu_int32, g->strt.size/4) &&
|
||||
g->strt.size > MINSTRTABSIZE*2)
|
||||
luaS_resize(L, g->strt.size/2); /* table is too big */
|
||||
/* check size of buffer */
|
||||
if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) { /* buffer too big? */
|
||||
size_t newsize = luaZ_sizebuffer(&g->buff) / 2;
|
||||
luaZ_resizebuffer(L, &g->buff, newsize);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void GCTM (lua_State *L) {
|
||||
global_State *g = G(L);
|
||||
GCObject *o = g->tmudata->gch.next; /* get first element */
|
||||
Udata *udata = rawgco2u(o);
|
||||
const TValue *tm;
|
||||
/* remove udata from `tmudata' */
|
||||
if (o == g->tmudata) /* last element? */
|
||||
g->tmudata = NULL;
|
||||
else
|
||||
g->tmudata->gch.next = udata->uv.next;
|
||||
udata->uv.next = g->mainthread->next; /* return it to `root' list */
|
||||
g->mainthread->next = o;
|
||||
makewhite(g, o);
|
||||
tm = fasttm(L, udata->uv.metatable, TM_GC);
|
||||
if (tm != NULL) {
|
||||
lu_byte oldah = L->allowhook;
|
||||
lu_mem oldt = g->GCthreshold;
|
||||
L->allowhook = 0; /* stop debug hooks during GC tag method */
|
||||
g->GCthreshold = 2*g->totalbytes; /* avoid GC steps */
|
||||
setobj2s(L, L->top, tm);
|
||||
setuvalue(L, L->top+1, udata);
|
||||
L->top += 2;
|
||||
luaD_call(L, L->top - 2, 0);
|
||||
L->allowhook = oldah; /* restore hooks */
|
||||
g->GCthreshold = oldt; /* restore threshold */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Call all GC tag methods
|
||||
*/
|
||||
void luaC_callGCTM (lua_State *L) {
|
||||
while (G(L)->tmudata)
|
||||
GCTM(L);
|
||||
}
|
||||
|
||||
|
||||
void luaC_freeall (lua_State *L) {
|
||||
global_State *g = G(L);
|
||||
int i;
|
||||
g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT); /* mask to collect all elements */
|
||||
sweepwholelist(L, &g->rootgc);
|
||||
for (i = 0; i < g->strt.size; i++) /* free all string lists */
|
||||
sweepwholelist(L, &g->strt.hash[i]);
|
||||
}
|
||||
|
||||
|
||||
static void markmt (global_State *g) {
|
||||
int i;
|
||||
for (i=0; i<NUM_TAGS; i++)
|
||||
if (g->mt[i]) markobject(g, g->mt[i]);
|
||||
}
|
||||
|
||||
|
||||
/* mark root set */
|
||||
static void markroot (lua_State *L) {
|
||||
global_State *g = G(L);
|
||||
g->gray = NULL;
|
||||
g->grayagain = NULL;
|
||||
g->weak = NULL;
|
||||
markobject(g, g->mainthread);
|
||||
/* make global table be traversed before main stack */
|
||||
markvalue(g, gt(g->mainthread));
|
||||
markvalue(g, registry(L));
|
||||
markmt(g);
|
||||
g->gcstate = GCSpropagate;
|
||||
}
|
||||
|
||||
|
||||
static void remarkupvals (global_State *g) {
|
||||
UpVal *uv;
|
||||
for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) {
|
||||
lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
|
||||
if (isgray(obj2gco(uv)))
|
||||
markvalue(g, uv->v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void atomic (lua_State *L) {
|
||||
global_State *g = G(L);
|
||||
size_t udsize; /* total size of userdata to be finalized */
|
||||
/* remark occasional upvalues of (maybe) dead threads */
|
||||
remarkupvals(g);
|
||||
/* traverse objects cautch by write barrier and by 'remarkupvals' */
|
||||
propagateall(g);
|
||||
/* remark weak tables */
|
||||
g->gray = g->weak;
|
||||
g->weak = NULL;
|
||||
lua_assert(!iswhite(obj2gco(g->mainthread)));
|
||||
markobject(g, L); /* mark running thread */
|
||||
markmt(g); /* mark basic metatables (again) */
|
||||
propagateall(g);
|
||||
/* remark gray again */
|
||||
g->gray = g->grayagain;
|
||||
g->grayagain = NULL;
|
||||
propagateall(g);
|
||||
udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */
|
||||
marktmu(g); /* mark `preserved' userdata */
|
||||
udsize += propagateall(g); /* remark, to propagate `preserveness' */
|
||||
cleartable(g->weak); /* remove collected objects from weak tables */
|
||||
/* flip current white */
|
||||
g->currentwhite = cast_byte(otherwhite(g));
|
||||
g->sweepstrgc = 0;
|
||||
g->sweepgc = &g->rootgc;
|
||||
g->gcstate = GCSsweepstring;
|
||||
g->estimate = g->totalbytes - udsize; /* first estimate */
|
||||
}
|
||||
|
||||
|
||||
static l_mem singlestep (lua_State *L) {
|
||||
global_State *g = G(L);
|
||||
/*lua_checkmemory(L);*/
|
||||
switch (g->gcstate) {
|
||||
case GCSpause: {
|
||||
markroot(L); /* start a new collection */
|
||||
return 0;
|
||||
}
|
||||
case GCSpropagate: {
|
||||
if (g->gray)
|
||||
return propagatemark(g);
|
||||
else { /* no more `gray' objects */
|
||||
atomic(L); /* finish mark phase */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
case GCSsweepstring: {
|
||||
lu_mem old = g->totalbytes;
|
||||
sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]);
|
||||
if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */
|
||||
g->gcstate = GCSsweep; /* end sweep-string phase */
|
||||
lua_assert(old >= g->totalbytes);
|
||||
g->estimate -= old - g->totalbytes;
|
||||
return GCSWEEPCOST;
|
||||
}
|
||||
case GCSsweep: {
|
||||
lu_mem old = g->totalbytes;
|
||||
g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);
|
||||
if (*g->sweepgc == NULL) { /* nothing more to sweep? */
|
||||
checkSizes(L);
|
||||
g->gcstate = GCSfinalize; /* end sweep phase */
|
||||
}
|
||||
lua_assert(old >= g->totalbytes);
|
||||
g->estimate -= old - g->totalbytes;
|
||||
return GCSWEEPMAX*GCSWEEPCOST;
|
||||
}
|
||||
case GCSfinalize: {
|
||||
if (g->tmudata) {
|
||||
GCTM(L);
|
||||
if (g->estimate > GCFINALIZECOST)
|
||||
g->estimate -= GCFINALIZECOST;
|
||||
return GCFINALIZECOST;
|
||||
}
|
||||
else {
|
||||
g->gcstate = GCSpause; /* end collection */
|
||||
g->gcdept = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
default: lua_assert(0); return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaC_step (lua_State *L) {
|
||||
global_State *g = G(L);
|
||||
l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul;
|
||||
if (lim == 0)
|
||||
lim = (MAX_LUMEM-1)/2; /* no limit */
|
||||
g->gcdept += g->totalbytes - g->GCthreshold;
|
||||
do {
|
||||
lim -= singlestep(L);
|
||||
if (g->gcstate == GCSpause)
|
||||
break;
|
||||
} while (lim > 0);
|
||||
if (g->gcstate != GCSpause) {
|
||||
if (g->gcdept < GCSTEPSIZE)
|
||||
g->GCthreshold = g->totalbytes + GCSTEPSIZE; /* - lim/g->gcstepmul;*/
|
||||
else {
|
||||
g->gcdept -= GCSTEPSIZE;
|
||||
g->GCthreshold = g->totalbytes;
|
||||
}
|
||||
}
|
||||
else {
|
||||
setthreshold(g);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void luaC_fullgc (lua_State *L) {
|
||||
global_State *g = G(L);
|
||||
if (g->gcstate <= GCSpropagate) {
|
||||
/* reset sweep marks to sweep all elements (returning them to white) */
|
||||
g->sweepstrgc = 0;
|
||||
g->sweepgc = &g->rootgc;
|
||||
/* reset other collector lists */
|
||||
g->gray = NULL;
|
||||
g->grayagain = NULL;
|
||||
g->weak = NULL;
|
||||
g->gcstate = GCSsweepstring;
|
||||
}
|
||||
lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate);
|
||||
/* finish any pending sweep phase */
|
||||
while (g->gcstate != GCSfinalize) {
|
||||
lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep);
|
||||
singlestep(L);
|
||||
}
|
||||
markroot(L);
|
||||
while (g->gcstate != GCSpause) {
|
||||
singlestep(L);
|
||||
}
|
||||
setthreshold(g);
|
||||
}
|
||||
|
||||
|
||||
void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {
|
||||
global_State *g = G(L);
|
||||
lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
|
||||
lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);
|
||||
lua_assert(ttype(&o->gch) != LUA_TTABLE);
|
||||
/* must keep invariant? */
|
||||
if (g->gcstate == GCSpropagate)
|
||||
reallymarkobject(g, v); /* restore invariant */
|
||||
else /* don't mind */
|
||||
makewhite(g, o); /* mark as white just to avoid other barriers */
|
||||
}
|
||||
|
||||
|
||||
void luaC_barrierback (lua_State *L, Table *t) {
|
||||
global_State *g = G(L);
|
||||
GCObject *o = obj2gco(t);
|
||||
lua_assert(isblack(o) && !isdead(g, o));
|
||||
lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);
|
||||
black2gray(o); /* make table gray (again) */
|
||||
t->gclist = g->grayagain;
|
||||
g->grayagain = o;
|
||||
}
|
||||
|
||||
|
||||
void luaC_link (lua_State *L, GCObject *o, lu_byte tt) {
|
||||
global_State *g = G(L);
|
||||
o->gch.next = g->rootgc;
|
||||
g->rootgc = o;
|
||||
o->gch.marked = luaC_white(g);
|
||||
o->gch.tt = tt;
|
||||
}
|
||||
|
||||
|
||||
void luaC_linkupval (lua_State *L, UpVal *uv) {
|
||||
global_State *g = G(L);
|
||||
GCObject *o = obj2gco(uv);
|
||||
o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */
|
||||
g->rootgc = o;
|
||||
if (isgray(o)) {
|
||||
if (g->gcstate == GCSpropagate) {
|
||||
gray2black(o); /* closed upvalues need barrier */
|
||||
luaC_barrier(L, uv, uv->v);
|
||||
}
|
||||
else { /* sweep phase: sweep it (turning it into white) */
|
||||
makewhite(g, o);
|
||||
lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
110
extern/lua-5.1.5/src/lgc.h
vendored
Normal file
110
extern/lua-5.1.5/src/lgc.h
vendored
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** Garbage Collector
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#ifndef lgc_h
|
||||
#define lgc_h
|
||||
|
||||
|
||||
#include "lobject.h"
|
||||
|
||||
|
||||
/*
|
||||
** Possible states of the Garbage Collector
|
||||
*/
|
||||
#define GCSpause 0
|
||||
#define GCSpropagate 1
|
||||
#define GCSsweepstring 2
|
||||
#define GCSsweep 3
|
||||
#define GCSfinalize 4
|
||||
|
||||
|
||||
/*
|
||||
** some userful bit tricks
|
||||
*/
|
||||
#define resetbits(x,m) ((x) &= cast(lu_byte, ~(m)))
|
||||
#define setbits(x,m) ((x) |= (m))
|
||||
#define testbits(x,m) ((x) & (m))
|
||||
#define bitmask(b) (1<<(b))
|
||||
#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2))
|
||||
#define l_setbit(x,b) setbits(x, bitmask(b))
|
||||
#define resetbit(x,b) resetbits(x, bitmask(b))
|
||||
#define testbit(x,b) testbits(x, bitmask(b))
|
||||
#define set2bits(x,b1,b2) setbits(x, (bit2mask(b1, b2)))
|
||||
#define reset2bits(x,b1,b2) resetbits(x, (bit2mask(b1, b2)))
|
||||
#define test2bits(x,b1,b2) testbits(x, (bit2mask(b1, b2)))
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** Layout for bit use in `marked' field:
|
||||
** bit 0 - object is white (type 0)
|
||||
** bit 1 - object is white (type 1)
|
||||
** bit 2 - object is black
|
||||
** bit 3 - for userdata: has been finalized
|
||||
** bit 3 - for tables: has weak keys
|
||||
** bit 4 - for tables: has weak values
|
||||
** bit 5 - object is fixed (should not be collected)
|
||||
** bit 6 - object is "super" fixed (only the main thread)
|
||||
*/
|
||||
|
||||
|
||||
#define WHITE0BIT 0
|
||||
#define WHITE1BIT 1
|
||||
#define BLACKBIT 2
|
||||
#define FINALIZEDBIT 3
|
||||
#define KEYWEAKBIT 3
|
||||
#define VALUEWEAKBIT 4
|
||||
#define FIXEDBIT 5
|
||||
#define SFIXEDBIT 6
|
||||
#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT)
|
||||
|
||||
|
||||
#define iswhite(x) test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)
|
||||
#define isblack(x) testbit((x)->gch.marked, BLACKBIT)
|
||||
#define isgray(x) (!isblack(x) && !iswhite(x))
|
||||
|
||||
#define otherwhite(g) (g->currentwhite ^ WHITEBITS)
|
||||
#define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS)
|
||||
|
||||
#define changewhite(x) ((x)->gch.marked ^= WHITEBITS)
|
||||
#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT)
|
||||
|
||||
#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x)))
|
||||
|
||||
#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS)
|
||||
|
||||
|
||||
#define luaC_checkGC(L) { \
|
||||
condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \
|
||||
if (G(L)->totalbytes >= G(L)->GCthreshold) \
|
||||
luaC_step(L); }
|
||||
|
||||
|
||||
#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \
|
||||
luaC_barrierf(L,obj2gco(p),gcvalue(v)); }
|
||||
|
||||
#define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t))) \
|
||||
luaC_barrierback(L,t); }
|
||||
|
||||
#define luaC_objbarrier(L,p,o) \
|
||||
{ if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \
|
||||
luaC_barrierf(L,obj2gco(p),obj2gco(o)); }
|
||||
|
||||
#define luaC_objbarriert(L,t,o) \
|
||||
{ if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); }
|
||||
|
||||
LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all);
|
||||
LUAI_FUNC void luaC_callGCTM (lua_State *L);
|
||||
LUAI_FUNC void luaC_freeall (lua_State *L);
|
||||
LUAI_FUNC void luaC_step (lua_State *L);
|
||||
LUAI_FUNC void luaC_fullgc (lua_State *L);
|
||||
LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt);
|
||||
LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv);
|
||||
LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v);
|
||||
LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t);
|
||||
|
||||
|
||||
#endif
|
||||
38
extern/lua-5.1.5/src/linit.c
vendored
Normal file
38
extern/lua-5.1.5/src/linit.c
vendored
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $
|
||||
** Initialization of libraries for lua.c
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
|
||||
#define linit_c
|
||||
#define LUA_LIB
|
||||
|
||||
#include "lua.h"
|
||||
|
||||
#include "lualib.h"
|
||||
#include "lauxlib.h"
|
||||
|
||||
|
||||
static const luaL_Reg lualibs[] = {
|
||||
{"", luaopen_base},
|
||||
{LUA_LOADLIBNAME, luaopen_package},
|
||||
{LUA_TABLIBNAME, luaopen_table},
|
||||
{LUA_IOLIBNAME, luaopen_io},
|
||||
{LUA_OSLIBNAME, luaopen_os},
|
||||
{LUA_STRLIBNAME, luaopen_string},
|
||||
{LUA_MATHLIBNAME, luaopen_math},
|
||||
{LUA_DBLIBNAME, luaopen_debug},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
LUALIB_API void luaL_openlibs (lua_State *L) {
|
||||
const luaL_Reg *lib = lualibs;
|
||||
for (; lib->func; lib++) {
|
||||
lua_pushcfunction(L, lib->func);
|
||||
lua_pushstring(L, lib->name);
|
||||
lua_call(L, 1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue