mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
Compare commits
223 Commits
v5.0.0-bet
...
v5.0.0-bet
Author | SHA1 | Date | |
---|---|---|---|
![]() |
00eda8ced8 | ||
![]() |
7ca5ef6e6c | ||
![]() |
ff8f7e5877 | ||
![]() |
c8739e3c24 | ||
![]() |
69eacedc2b | ||
![]() |
e5f229e3f7 | ||
![]() |
74e43f2b43 | ||
![]() |
a04f641415 | ||
![]() |
2e5a9e2cfa | ||
![]() |
cd4bfd767a | ||
![]() |
d9135636fe | ||
![]() |
88e08ab7d8 | ||
![]() |
6a3af0d57a | ||
![]() |
95b4091085 | ||
![]() |
5556766059 | ||
![]() |
1332582a03 | ||
![]() |
77177063d8 | ||
![]() |
ed7ddd2b67 | ||
![]() |
990f59d093 | ||
![]() |
6326c185f4 | ||
![]() |
9c6972ec0a | ||
![]() |
814577edff | ||
![]() |
a8ea4b8fe7 | ||
![]() |
494666e690 | ||
![]() |
e5a24e3e32 | ||
![]() |
68771be104 | ||
![]() |
9d2bff9442 | ||
![]() |
6a08fb9a86 | ||
![]() |
c96c3ff1a2 | ||
![]() |
788d557f0e | ||
![]() |
4f17d526ab | ||
![]() |
bc27364bb8 | ||
![]() |
1fd719fb41 | ||
![]() |
f7e93c2a13 | ||
![]() |
c268b19264 | ||
![]() |
6baef705eb | ||
![]() |
fe8295a6e3 | ||
![]() |
de616de3fc | ||
![]() |
9e725c58b5 | ||
![]() |
37028de2f4 | ||
![]() |
509dd8ff10 | ||
![]() |
4c38bcffa8 | ||
![]() |
90c2cc7e44 | ||
![]() |
bd6e4206a2 | ||
![]() |
9cf5755a90 | ||
![]() |
11c29f444e | ||
![]() |
11475b9cf3 | ||
![]() |
e5476f5712 | ||
![]() |
e7457c7564 | ||
![]() |
fd015f9ee4 | ||
![]() |
394eb9488c | ||
![]() |
dd771ea3d1 | ||
![]() |
140c7f52cb | ||
![]() |
cb14f7cfa5 | ||
![]() |
93e8dd4002 | ||
![]() |
b91a2da81c | ||
![]() |
d6f99c5841 | ||
![]() |
d2dc352c2a | ||
![]() |
f3dc69ea68 | ||
![]() |
f4522291fc | ||
![]() |
60d7901054 | ||
![]() |
b19e71fe85 | ||
![]() |
2b9524651f | ||
![]() |
680aa3fa6b | ||
![]() |
25f8bddfcf | ||
![]() |
a02e5952a3 | ||
![]() |
b382b99ece | ||
![]() |
f6b16da334 | ||
![]() |
130912f3c8 | ||
![]() |
49418351d4 | ||
![]() |
cbad5de106 | ||
![]() |
1e33a1c6f0 | ||
![]() |
997c251a07 | ||
![]() |
a14e854f4e | ||
![]() |
b0af6c88fe | ||
![]() |
08b1f3b5fe | ||
![]() |
b392192def | ||
![]() |
1759e85b84 | ||
![]() |
a3d223ae39 | ||
![]() |
d2fa8c43cf | ||
![]() |
dc0dcb673f | ||
![]() |
fa2c1bed79 | ||
![]() |
8489cc3e70 | ||
![]() |
0150e197b0 | ||
![]() |
f5a6ca0246 | ||
![]() |
a53b63680c | ||
![]() |
2489a26a08 | ||
![]() |
2346e41936 | ||
![]() |
0b5980d0b6 | ||
![]() |
99fc0b7b46 | ||
![]() |
fb45454951 | ||
![]() |
9abfa741ce | ||
![]() |
980081516a | ||
![]() |
f1bed6ead9 | ||
![]() |
e139c0218b | ||
![]() |
ffd0cf8808 | ||
![]() |
ae87d3298e | ||
![]() |
6b7a9dd39c | ||
![]() |
5a3686d6a3 | ||
![]() |
bfef000cc6 | ||
![]() |
c000a735bb | ||
![]() |
21e034863e | ||
![]() |
72b883654b | ||
![]() |
b1152b9059 | ||
![]() |
7d48b85d42 | ||
![]() |
fb8926dd66 | ||
![]() |
9ce195e371 | ||
![]() |
f88f8b60d6 | ||
![]() |
4eb8ddfba6 | ||
![]() |
aaab3cb212 | ||
![]() |
6b3ce705aa | ||
![]() |
988a7fdb9d | ||
![]() |
11592b11c4 | ||
![]() |
e8791fcdf9 | ||
![]() |
e661923fd3 | ||
![]() |
61c57059fa | ||
![]() |
922019eef0 | ||
![]() |
79ca28fbdb | ||
![]() |
124079c50f | ||
![]() |
2e42fc01be | ||
![]() |
770aad5672 | ||
![]() |
bef1b9fb1e | ||
![]() |
831dce0f51 | ||
![]() |
2da4e79d06 | ||
![]() |
804a07c56e | ||
![]() |
b367f13116 | ||
![]() |
581d7716f7 | ||
![]() |
19de7aefbc | ||
![]() |
57759aa1b8 | ||
![]() |
07876afc28 | ||
![]() |
b9029fba4d | ||
![]() |
c4ba357296 | ||
![]() |
a47acbb82a | ||
![]() |
f1f93c9be0 | ||
![]() |
f56d864efb | ||
![]() |
017f8cf554 | ||
![]() |
d8546c5547 | ||
![]() |
0bc6e41709 | ||
![]() |
943fac772d | ||
![]() |
327e4cb6a3 | ||
![]() |
277989f329 | ||
![]() |
2bdae4ed14 | ||
![]() |
4bfbd7c78f | ||
![]() |
7b76564dda | ||
![]() |
41a2b87dd0 | ||
![]() |
397781bb98 | ||
![]() |
b4fa741717 | ||
![]() |
6e16bd764f | ||
![]() |
1071b66c92 | ||
![]() |
9ff6d91717 | ||
![]() |
bda1eb01d2 | ||
![]() |
dfcaf472c7 | ||
![]() |
c8a9da6aea | ||
![]() |
daa50931ae | ||
![]() |
f84a97a4f2 | ||
![]() |
10d5c403a7 | ||
![]() |
15471e6e28 | ||
![]() |
7ccebc69fa | ||
![]() |
4c57fbc01f | ||
![]() |
ed58ebd3be | ||
![]() |
9cae4fb264 | ||
![]() |
83e7314863 | ||
![]() |
8ec56164af | ||
![]() |
ba0c4a9bc4 | ||
![]() |
8706dc727d | ||
![]() |
7ee9facb34 | ||
![]() |
4190cbda88 | ||
![]() |
aa73b01bbc | ||
![]() |
b242c7863f | ||
![]() |
41550ee10f | ||
![]() |
7af0999f59 | ||
![]() |
93e0ccc163 | ||
![]() |
94303fccc2 | ||
![]() |
33949fd93c | ||
![]() |
bd40bb892c | ||
![]() |
c2cf935bd9 | ||
![]() |
c7d5ab8013 | ||
![]() |
e8c93a5622 | ||
![]() |
348459481a | ||
![]() |
e7348f08c4 | ||
![]() |
ef96adee92 | ||
![]() |
66b3ec1686 | ||
![]() |
b77eb123e8 | ||
![]() |
dcba4272e0 | ||
![]() |
c2dd5a0a09 | ||
![]() |
a6ae265705 | ||
![]() |
94fb2fede6 | ||
![]() |
7bcaf55342 | ||
![]() |
cc9632e7c1 | ||
![]() |
3ff5dd7cd2 | ||
![]() |
1193e1bbd0 | ||
![]() |
9c55b0acc6 | ||
![]() |
d03c1964cb | ||
![]() |
e5695aacf6 | ||
![]() |
8e6d2da9f7 | ||
![]() |
5c043fd04a | ||
![]() |
4edbd9d377 | ||
![]() |
c6f21955a3 | ||
![]() |
03cc406459 | ||
![]() |
c5d855b768 | ||
![]() |
2aba1c57c4 | ||
![]() |
9614549436 | ||
![]() |
f1730c239d | ||
![]() |
acb19bf8ed | ||
![]() |
4d63fbcca0 | ||
![]() |
eb19b6ba21 | ||
![]() |
d2747782b4 | ||
![]() |
8202e6b38e | ||
![]() |
6deb4fa122 | ||
![]() |
3990064da9 | ||
![]() |
a315eabdce | ||
![]() |
faa02d4459 | ||
![]() |
8b294ae369 | ||
![]() |
cb43eb7780 | ||
![]() |
765295fc5d | ||
![]() |
beb3bde4a8 | ||
![]() |
fe5b519917 | ||
![]() |
8661fbef07 | ||
![]() |
afd11d2480 | ||
![]() |
c5ad9715df | ||
![]() |
4362e8dd42 | ||
![]() |
372fa46709 | ||
![]() |
c43cfcd49e |
@@ -31,12 +31,17 @@ vector<gd::InstructionsList*> ForEachEvent::GetAllActionsVectors() {
|
||||
return allActions;
|
||||
}
|
||||
|
||||
vector<gd::Expression*> ForEachEvent::GetAllExpressions() {
|
||||
vector<gd::Expression*> allExpressions;
|
||||
allExpressions.push_back(&objectsToPick);
|
||||
vector<pair<gd::Expression*, gd::ParameterMetadata> >
|
||||
ForEachEvent::GetAllExpressionsWithMetadata() {
|
||||
vector<pair<gd::Expression*, gd::ParameterMetadata> >
|
||||
allExpressionsWithMetadata;
|
||||
auto metadata = gd::ParameterMetadata().SetType("object");
|
||||
allExpressionsWithMetadata.push_back(
|
||||
std::make_pair(&objectsToPick, metadata));
|
||||
|
||||
return allExpressions;
|
||||
return allExpressionsWithMetadata;
|
||||
}
|
||||
|
||||
vector<const gd::InstructionsList*> ForEachEvent::GetAllConditionsVectors()
|
||||
const {
|
||||
vector<const gd::InstructionsList*> allConditions;
|
||||
@@ -52,11 +57,15 @@ vector<const gd::InstructionsList*> ForEachEvent::GetAllActionsVectors() const {
|
||||
return allActions;
|
||||
}
|
||||
|
||||
vector<const gd::Expression*> ForEachEvent::GetAllExpressions() const {
|
||||
vector<const gd::Expression*> allExpressions;
|
||||
allExpressions.push_back(&objectsToPick);
|
||||
vector<pair<const gd::Expression*, const gd::ParameterMetadata> >
|
||||
ForEachEvent::GetAllExpressionsWithMetadata() const {
|
||||
vector<pair<const gd::Expression*, const gd::ParameterMetadata> >
|
||||
allExpressionsWithMetadata;
|
||||
auto metadata = gd::ParameterMetadata().SetType("object");
|
||||
allExpressionsWithMetadata.push_back(
|
||||
std::make_pair(&objectsToPick, metadata));
|
||||
|
||||
return allExpressions;
|
||||
return allExpressionsWithMetadata;
|
||||
}
|
||||
|
||||
void ForEachEvent::SerializeTo(SerializerElement& element) const {
|
||||
|
@@ -50,10 +50,13 @@ class GD_CORE_API ForEachEvent : public gd::BaseEvent {
|
||||
virtual std::vector<const gd::InstructionsList*> GetAllConditionsVectors()
|
||||
const;
|
||||
virtual std::vector<const gd::InstructionsList*> GetAllActionsVectors() const;
|
||||
virtual std::vector<const gd::Expression*> GetAllExpressions() const;
|
||||
virtual std::vector<std::pair<const gd::Expression*, const gd::ParameterMetadata> >
|
||||
GetAllExpressionsWithMetadata() const;
|
||||
|
||||
virtual std::vector<gd::InstructionsList*> GetAllConditionsVectors();
|
||||
virtual std::vector<gd::InstructionsList*> GetAllActionsVectors();
|
||||
virtual std::vector<gd::Expression*> GetAllExpressions();
|
||||
virtual std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> >
|
||||
GetAllExpressionsWithMetadata();
|
||||
|
||||
virtual void SerializeTo(SerializerElement& element) const;
|
||||
virtual void UnserializeFrom(gd::Project& project,
|
||||
|
@@ -31,11 +31,15 @@ vector<gd::InstructionsList*> RepeatEvent::GetAllActionsVectors() {
|
||||
return allActions;
|
||||
}
|
||||
|
||||
vector<gd::Expression*> RepeatEvent::GetAllExpressions() {
|
||||
vector<gd::Expression*> allExpressions;
|
||||
allExpressions.push_back(&repeatNumberExpression);
|
||||
vector<pair<gd::Expression*, gd::ParameterMetadata> >
|
||||
RepeatEvent::GetAllExpressionsWithMetadata() {
|
||||
vector<pair<gd::Expression*, gd::ParameterMetadata> >
|
||||
allExpressionsWithMetadata;
|
||||
auto metadata = gd::ParameterMetadata().SetType("expression");
|
||||
allExpressionsWithMetadata.push_back(
|
||||
std::make_pair(&repeatNumberExpression, metadata));
|
||||
|
||||
return allExpressions;
|
||||
return allExpressionsWithMetadata;
|
||||
}
|
||||
|
||||
vector<const gd::InstructionsList*> RepeatEvent::GetAllConditionsVectors()
|
||||
@@ -53,11 +57,15 @@ vector<const gd::InstructionsList*> RepeatEvent::GetAllActionsVectors() const {
|
||||
return allActions;
|
||||
}
|
||||
|
||||
vector<const gd::Expression*> RepeatEvent::GetAllExpressions() const {
|
||||
vector<const gd::Expression*> allExpressions;
|
||||
allExpressions.push_back(&repeatNumberExpression);
|
||||
vector<pair<const gd::Expression*, const gd::ParameterMetadata> >
|
||||
RepeatEvent::GetAllExpressionsWithMetadata() const {
|
||||
vector<pair<const gd::Expression*, const gd::ParameterMetadata> >
|
||||
allExpressionsWithMetadata;
|
||||
auto metadata = gd::ParameterMetadata().SetType("expression");
|
||||
allExpressionsWithMetadata.push_back(
|
||||
std::make_pair(&repeatNumberExpression, metadata));
|
||||
|
||||
return allExpressions;
|
||||
return allExpressionsWithMetadata;
|
||||
}
|
||||
|
||||
void RepeatEvent::SerializeTo(SerializerElement& element) const {
|
||||
|
@@ -45,11 +45,14 @@ class GD_CORE_API RepeatEvent : public gd::BaseEvent {
|
||||
|
||||
virtual std::vector<gd::InstructionsList*> GetAllConditionsVectors();
|
||||
virtual std::vector<gd::InstructionsList*> GetAllActionsVectors();
|
||||
virtual std::vector<gd::Expression*> GetAllExpressions();
|
||||
virtual std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> >
|
||||
GetAllExpressionsWithMetadata();
|
||||
|
||||
virtual std::vector<const gd::InstructionsList*> GetAllConditionsVectors()
|
||||
const;
|
||||
virtual std::vector<const gd::InstructionsList*> GetAllActionsVectors() const;
|
||||
virtual std::vector<const gd::Expression*> GetAllExpressions() const;
|
||||
virtual std::vector<std::pair<const gd::Expression*, const gd::ParameterMetadata> >
|
||||
GetAllExpressionsWithMetadata() const;
|
||||
|
||||
virtual void SerializeTo(SerializerElement& element) const;
|
||||
virtual void UnserializeFrom(gd::Project& project,
|
||||
|
@@ -12,6 +12,7 @@
|
||||
#include <vector>
|
||||
#include "GDCore/Events/Instruction.h"
|
||||
#include "GDCore/Events/InstructionsList.h"
|
||||
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
|
||||
#include "GDCore/String.h"
|
||||
namespace gd {
|
||||
class EventsList;
|
||||
@@ -127,15 +128,17 @@ class GD_CORE_API BaseEvent {
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Return a list of all expressions of the event.
|
||||
* \note Used to preprocess or search in the expressions.
|
||||
* \brief Return a list of all expressions of the event, each with their associated metadata.
|
||||
* \note Used to preprocess or search in the expressions of the event.
|
||||
*/
|
||||
virtual std::vector<gd::Expression*> GetAllExpressions() {
|
||||
std::vector<gd::Expression*> noExpr;
|
||||
virtual std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> >
|
||||
GetAllExpressionsWithMetadata() {
|
||||
std::vector<std::pair<gd::Expression*, gd::ParameterMetadata> > noExpr;
|
||||
return noExpr;
|
||||
};
|
||||
virtual std::vector<const gd::Expression*> GetAllExpressions() const {
|
||||
std::vector<const gd::Expression*> noExpr;
|
||||
virtual std::vector<std::pair<const gd::Expression*, const gd::ParameterMetadata> >
|
||||
GetAllExpressionsWithMetadata() const {
|
||||
std::vector<std::pair<const gd::Expression*, const gd::ParameterMetadata> > noExpr;
|
||||
return noExpr;
|
||||
};
|
||||
|
||||
|
@@ -348,7 +348,8 @@ class GD_CORE_API ExpressionParser2 {
|
||||
return std::move(child);
|
||||
}
|
||||
|
||||
return std::move(std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode>());
|
||||
return std::move(
|
||||
std::unique_ptr<VariableAccessorOrVariableBracketAccessorNode>());
|
||||
}
|
||||
|
||||
std::unique_ptr<FunctionCallNode> FreeFunction(
|
||||
@@ -367,10 +368,10 @@ class GD_CORE_API ExpressionParser2 {
|
||||
: MetadataProvider::GetStrExpressionMetadata(
|
||||
platform, functionFullName);
|
||||
|
||||
auto parametersAndError = Parameters(metadata.parameters);
|
||||
auto parametersNode = Parameters(metadata.parameters);
|
||||
auto function = gd::make_unique<FunctionCallNode>(
|
||||
type, std::move(parametersAndError.first), metadata, functionFullName);
|
||||
function->diagnostic = std::move(parametersAndError.second);
|
||||
type, std::move(parametersNode.parameters), metadata, functionFullName);
|
||||
function->diagnostic = std::move(parametersNode.diagnostic);
|
||||
if (!function->diagnostic)
|
||||
function->diagnostic =
|
||||
ValidateFunction(*function, identifierLocation.GetStartPosition());
|
||||
@@ -379,6 +380,8 @@ class GD_CORE_API ExpressionParser2 {
|
||||
identifierLocation.GetStartPosition(), GetCurrentPosition());
|
||||
function->functionNameLocation = identifierLocation;
|
||||
function->openingParenthesisLocation = openingParenthesisLocation;
|
||||
function->closingParenthesisLocation =
|
||||
parametersNode.closingParenthesisLocation;
|
||||
return std::move(function);
|
||||
}
|
||||
|
||||
@@ -421,14 +424,14 @@ class GD_CORE_API ExpressionParser2 {
|
||||
: MetadataProvider::GetObjectStrExpressionMetadata(
|
||||
platform, objectType, objectFunctionOrBehaviorName);
|
||||
|
||||
auto parametersAndError = Parameters(metadata.parameters, objectName);
|
||||
auto function =
|
||||
gd::make_unique<FunctionCallNode>(type,
|
||||
objectName,
|
||||
std::move(parametersAndError.first),
|
||||
metadata,
|
||||
objectFunctionOrBehaviorName);
|
||||
function->diagnostic = std::move(parametersAndError.second);
|
||||
auto parametersNode = Parameters(metadata.parameters, objectName);
|
||||
auto function = gd::make_unique<FunctionCallNode>(
|
||||
type,
|
||||
objectName,
|
||||
std::move(parametersNode.parameters),
|
||||
metadata,
|
||||
objectFunctionOrBehaviorName);
|
||||
function->diagnostic = std::move(parametersNode.diagnostic);
|
||||
if (!function->diagnostic)
|
||||
function->diagnostic =
|
||||
ValidateFunction(*function, objectNameLocation.GetStartPosition());
|
||||
@@ -439,6 +442,8 @@ class GD_CORE_API ExpressionParser2 {
|
||||
function->objectNameDotLocation = objectNameDotLocation;
|
||||
function->functionNameLocation = objectFunctionOrBehaviorNameLocation;
|
||||
function->openingParenthesisLocation = openingParenthesisLocation;
|
||||
function->closingParenthesisLocation =
|
||||
parametersNode.closingParenthesisLocation;
|
||||
return std::move(function);
|
||||
}
|
||||
|
||||
@@ -485,16 +490,16 @@ class GD_CORE_API ExpressionParser2 {
|
||||
: MetadataProvider::GetBehaviorStrExpressionMetadata(
|
||||
platform, behaviorType, functionName);
|
||||
|
||||
auto parametersAndError =
|
||||
auto parametersNode =
|
||||
Parameters(metadata.parameters, objectName, behaviorName);
|
||||
auto function =
|
||||
gd::make_unique<FunctionCallNode>(type,
|
||||
objectName,
|
||||
behaviorName,
|
||||
std::move(parametersAndError.first),
|
||||
metadata,
|
||||
functionName);
|
||||
function->diagnostic = std::move(parametersAndError.second);
|
||||
auto function = gd::make_unique<FunctionCallNode>(
|
||||
type,
|
||||
objectName,
|
||||
behaviorName,
|
||||
std::move(parametersNode.parameters),
|
||||
metadata,
|
||||
functionName);
|
||||
function->diagnostic = std::move(parametersNode.diagnostic);
|
||||
if (!function->diagnostic)
|
||||
function->diagnostic =
|
||||
ValidateFunction(*function, objectNameLocation.GetStartPosition());
|
||||
@@ -507,6 +512,8 @@ class GD_CORE_API ExpressionParser2 {
|
||||
function->behaviorNameNamespaceSeparatorLocation =
|
||||
behaviorNameNamespaceSeparatorLocation;
|
||||
function->openingParenthesisLocation = openingParenthesisLocation;
|
||||
function->closingParenthesisLocation =
|
||||
parametersNode.closingParenthesisLocation;
|
||||
function->functionNameLocation = functionNameLocation;
|
||||
return std::move(function);
|
||||
} else {
|
||||
@@ -527,11 +534,17 @@ class GD_CORE_API ExpressionParser2 {
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<std::vector<std::unique_ptr<ExpressionNode>>,
|
||||
std::unique_ptr<gd::ExpressionParserError>>
|
||||
Parameters(std::vector<gd::ParameterMetadata> parameterMetadata,
|
||||
const gd::String &objectName = "",
|
||||
const gd::String &behaviorName = "") {
|
||||
// A temporary node that will be integrated into function nodes.
|
||||
struct ParametersNode {
|
||||
std::vector<std::unique_ptr<ExpressionNode>> parameters;
|
||||
std::unique_ptr<gd::ExpressionParserError> diagnostic;
|
||||
ExpressionParserLocation closingParenthesisLocation;
|
||||
};
|
||||
|
||||
ParametersNode Parameters(
|
||||
std::vector<gd::ParameterMetadata> parameterMetadata,
|
||||
const gd::String &objectName = "",
|
||||
const gd::String &behaviorName = "") {
|
||||
std::vector<std::unique_ptr<ExpressionNode>> parameters;
|
||||
|
||||
// By convention, object is always the first parameter, and behavior the
|
||||
@@ -543,8 +556,9 @@ class GD_CORE_API ExpressionParser2 {
|
||||
SkipAllWhitespaces();
|
||||
|
||||
if (CheckIfChar(IsClosingParenthesis)) {
|
||||
SkipChar();
|
||||
return std::make_pair(std::move(parameters), nullptr);
|
||||
auto closingParenthesisLocation = SkipChar();
|
||||
return ParametersNode{
|
||||
std::move(parameters), nullptr, closingParenthesisLocation};
|
||||
} else {
|
||||
if (parameterIndex < parameterMetadata.size()) {
|
||||
const gd::String &type = parameterMetadata[parameterIndex].GetType();
|
||||
@@ -588,10 +602,12 @@ class GD_CORE_API ExpressionParser2 {
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_pair(
|
||||
ExpressionParserLocation invalidClosingParenthesisLocation;
|
||||
return ParametersNode{
|
||||
std::move(parameters),
|
||||
RaiseSyntaxError(_("The list of parameters is not terminated. Add a "
|
||||
"closing parenthesis to end the parameters.")));
|
||||
"closing parenthesis to end the parameters.")),
|
||||
invalidClosingParenthesisLocation};
|
||||
}
|
||||
///@}
|
||||
|
||||
@@ -821,6 +837,7 @@ class GD_CORE_API ExpressionParser2 {
|
||||
|
||||
bool IsEndReached() { return currentPosition >= expression.size(); }
|
||||
|
||||
// A temporary node used when reading an identifier
|
||||
struct IdentifierAndLocation {
|
||||
gd::String name;
|
||||
ExpressionParserLocation location;
|
||||
|
@@ -385,6 +385,8 @@ struct FunctionCallNode : public FunctionCallOrObjectFunctionNameOrEmptyNode {
|
||||
///separator, if any.
|
||||
ExpressionParserLocation
|
||||
openingParenthesisLocation; ///< Location of the "(".
|
||||
ExpressionParserLocation
|
||||
closingParenthesisLocation; ///< Location of the ")".
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -13,11 +13,12 @@ namespace gd {
|
||||
void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
gd::PlatformExtension& extension) {
|
||||
extension
|
||||
.SetExtensionInformation("BuiltinObject",
|
||||
_("Features for all objects"),
|
||||
_("Common features that can be used for all objects in GDevelop."),
|
||||
"Florian Rival",
|
||||
"Open source (MIT License)")
|
||||
.SetExtensionInformation(
|
||||
"BuiltinObject",
|
||||
_("Features for all objects"),
|
||||
_("Common features that can be used for all objects in GDevelop."),
|
||||
"Florian Rival",
|
||||
"Open source (MIT License)")
|
||||
.SetExtensionHelpPath("/objects/base_object/events");
|
||||
|
||||
gd::ObjectMetadata& obj = extension.AddObject<gd::Object>(
|
||||
@@ -72,14 +73,14 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.UseStandardOperatorParameters("number")
|
||||
.MarkAsSimple();
|
||||
|
||||
obj.AddAction(
|
||||
"MettreXY",
|
||||
_("Position of an object"),
|
||||
_("Change the position of an object."),
|
||||
_("Change the position of _PARAM0_: _PARAM1_ _PARAM2_ (x axis), _PARAM3_ _PARAM4_ (y axis)"),
|
||||
_("Position"),
|
||||
"res/actions/position24.png",
|
||||
"res/actions/position.png")
|
||||
obj.AddAction("MettreXY",
|
||||
_("Position of an object"),
|
||||
_("Change the position of an object."),
|
||||
_("Change the position of _PARAM0_: _PARAM1_ _PARAM2_ (x "
|
||||
"axis), _PARAM3_ _PARAM4_ (y axis)"),
|
||||
_("Position"),
|
||||
"res/actions/position24.png",
|
||||
"res/actions/position.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("operator", _("Modification's sign"))
|
||||
@@ -294,14 +295,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardOperatorParameters("number");
|
||||
|
||||
obj.AddAction(
|
||||
"ModVarObjetTxt",
|
||||
_("Modify the text of a variable of an object"),
|
||||
_("Modify the text of a variable of an object"),
|
||||
_("the text of variable _PARAM1_"),
|
||||
_("Variables"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
obj.AddAction("ModVarObjetTxt",
|
||||
_("Modify the text of a variable of an object"),
|
||||
_("Modify the text of a variable of an object"),
|
||||
_("the text of variable _PARAM1_"),
|
||||
_("Variables"),
|
||||
"res/actions/var24.png",
|
||||
"res/actions/var.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
@@ -473,14 +473,13 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
.UseStandardRelationalOperatorParameters("number");
|
||||
|
||||
obj.AddCondition(
|
||||
"VarObjetTxt",
|
||||
_("Text of an object's variable"),
|
||||
_("Compare the text of a variable of an object."),
|
||||
_("the text of variable _PARAM1_"),
|
||||
_("Variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
obj.AddCondition("VarObjetTxt",
|
||||
_("Text of an object's variable"),
|
||||
_("Compare the text of a variable of an object."),
|
||||
_("the text of variable _PARAM1_"),
|
||||
_("Variables"),
|
||||
"res/conditions/var24.png",
|
||||
"res/conditions/var.png")
|
||||
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("objectvar", _("Variable"))
|
||||
@@ -634,6 +633,23 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(
|
||||
.AddParameter("expression", _("Y position of the point"))
|
||||
.MarkAsSimple();
|
||||
|
||||
extension
|
||||
.AddCondition("SourisSurObjet",
|
||||
_("The cursor/touch is on an object"),
|
||||
_("Test if the cursor is over an object, or if the object "
|
||||
"is being touched."),
|
||||
_("The cursor/touch is on _PARAM0_"),
|
||||
_("Mouse and touch"),
|
||||
"res/conditions/surObjet24.png",
|
||||
"res/conditions/surObjet.png")
|
||||
|
||||
.AddParameter("objectList", _("Object"))
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("yesorno", _("Accurate test (yes by default)"), "", true)
|
||||
.SetDefaultValue("yes")
|
||||
.AddCodeOnlyParameter("conditionInverted", "")
|
||||
.MarkAsSimple();
|
||||
|
||||
obj.AddCondition(
|
||||
"ObjectTimer",
|
||||
_("Value of a timer"),
|
||||
|
@@ -21,23 +21,6 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsMouseExtension(
|
||||
.SetExtensionHelpPath("/all-features/mouse-touch");
|
||||
|
||||
#if defined(GD_IDE_ONLY)
|
||||
extension
|
||||
.AddCondition("SourisSurObjet",
|
||||
_("The cursor/touch is on an object"),
|
||||
_("Test if the cursor is over an object, or if the object "
|
||||
"is being touched."),
|
||||
_("The cursor/touch is on _PARAM0_"),
|
||||
_("Mouse and touch"),
|
||||
"res/conditions/surObjet24.png",
|
||||
"res/conditions/surObjet.png")
|
||||
|
||||
.AddParameter("objectList", _("Object"))
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.AddParameter("yesorno", _("Accurate test (yes by default)"), "", true)
|
||||
.SetDefaultValue("yes")
|
||||
.AddCodeOnlyParameter("conditionInverted", "")
|
||||
.MarkAsSimple();
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
"IsMouseWheelScrollingUp",
|
||||
|
@@ -380,7 +380,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
|
||||
obj.AddAction("ChangeBlendMode",
|
||||
_("Blend mode"),
|
||||
_("Change the number of the blend mode of an object.\nThe "
|
||||
"default blend mode is 0 (Alpha)."),
|
||||
"default blend mode is 0 (Normal)."),
|
||||
_("Change Blend mode of _PARAM0_ to _PARAM1_"),
|
||||
_("Effects"),
|
||||
"res/actions/color24.png",
|
||||
@@ -388,7 +388,7 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsSpriteExtension(
|
||||
|
||||
.AddParameter("object", _("Object"), "Sprite")
|
||||
.AddParameter("expression",
|
||||
_("Mode (0 : Alpha, 1 : Add, 2 : Multiply, 3 : None)"))
|
||||
_("Mode (0: Normal, 1: Add, 2: Multiply, 3: Screen)"))
|
||||
.MarkAsSimple();
|
||||
|
||||
obj.AddAction("FlipX",
|
||||
|
@@ -279,6 +279,43 @@ bool EventsRefactorer::RenameObjectInConditions(
|
||||
return somethingModified;
|
||||
}
|
||||
|
||||
bool EventsRefactorer::RenameObjectInEventParameters(
|
||||
const gd::Platform& platform,
|
||||
gd::ObjectsContainer& project,
|
||||
gd::ObjectsContainer& layout,
|
||||
gd::Expression& expression,
|
||||
gd::ParameterMetadata parameterMetadata,
|
||||
gd::String oldName,
|
||||
gd::String newName) {
|
||||
bool somethingModified = false;
|
||||
|
||||
if (gd::ParameterMetadata::IsObject(parameterMetadata.GetType()) &&
|
||||
expression.GetPlainString() == oldName)
|
||||
expression = gd::Expression(newName);
|
||||
// Replace object's name in expressions
|
||||
else if (ParameterMetadata::IsExpression(
|
||||
"number", parameterMetadata.GetType())) {
|
||||
gd::ExpressionParser2 parser(platform, project, layout);
|
||||
auto node = parser.ParseExpression("number", expression.GetPlainString());
|
||||
|
||||
if (ExpressionObjectRenamer::Rename(*node, oldName, newName)) {
|
||||
expression = ExpressionParser2NodePrinter::PrintNode(*node);
|
||||
}
|
||||
}
|
||||
// Replace object's name in text expressions
|
||||
else if (ParameterMetadata::IsExpression(
|
||||
"string", parameterMetadata.GetType())) {
|
||||
gd::ExpressionParser2 parser(platform, project, layout);
|
||||
auto node = parser.ParseExpression("string", expression.GetPlainString());
|
||||
|
||||
if (ExpressionObjectRenamer::Rename(*node, oldName, newName)) {
|
||||
expression = ExpressionParser2NodePrinter::PrintNode(*node);
|
||||
}
|
||||
}
|
||||
|
||||
return somethingModified;
|
||||
}
|
||||
|
||||
void EventsRefactorer::RenameObjectInEvents(const gd::Platform& platform,
|
||||
gd::ObjectsContainer& project,
|
||||
gd::ObjectsContainer& layout,
|
||||
@@ -300,6 +337,15 @@ void EventsRefactorer::RenameObjectInEvents(const gd::Platform& platform,
|
||||
platform, project, layout, *actionsVectors[j], oldName, newName);
|
||||
}
|
||||
|
||||
vector<pair<gd::Expression*, gd::ParameterMetadata>> expressionsWithMetadata =
|
||||
events[i].GetAllExpressionsWithMetadata();
|
||||
for (std::size_t j = 0; j < expressionsWithMetadata.size(); ++j) {
|
||||
gd::Expression* expression = expressionsWithMetadata[j].first;
|
||||
gd::ParameterMetadata parameterMetadata = expressionsWithMetadata[j].second;
|
||||
bool somethingModified = RenameObjectInEventParameters(
|
||||
platform, project, layout, *expression, parameterMetadata, oldName, newName);
|
||||
}
|
||||
|
||||
if (events[i].CanHaveSubEvents())
|
||||
RenameObjectInEvents(platform,
|
||||
project,
|
||||
|
@@ -8,6 +8,7 @@
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "GDCore/Events/Instruction.h"
|
||||
#include "GDCore/Extensions/Metadata/InstructionMetadata.h"
|
||||
#include "GDCore/String.h"
|
||||
namespace gd {
|
||||
class EventsList;
|
||||
@@ -146,6 +147,20 @@ class GD_CORE_API EventsRefactorer {
|
||||
gd::InstructionsList& instructions,
|
||||
gd::String oldName,
|
||||
gd::String newName);
|
||||
/**
|
||||
* Replace all occurrences of an object name by another name in an expression
|
||||
* with the specified metadata
|
||||
* ( include : objects or objects in math/text expressions ).
|
||||
*
|
||||
* \return true if something was modified.
|
||||
*/
|
||||
static bool RenameObjectInEventParameters(const gd::Platform& platform,
|
||||
gd::ObjectsContainer& project,
|
||||
gd::ObjectsContainer& layout,
|
||||
gd::Expression& expression,
|
||||
gd::ParameterMetadata parameterMetadata,
|
||||
gd::String oldName,
|
||||
gd::String newName);
|
||||
|
||||
/**
|
||||
* Remove all conditions of the list using an object
|
||||
|
@@ -43,8 +43,9 @@ struct ExpressionCompletionDescription {
|
||||
/**
|
||||
* \brief Create a completion for an object with the given prefix
|
||||
*/
|
||||
static ExpressionCompletionDescription ForObject(const gd::String& prefix_) {
|
||||
return ExpressionCompletionDescription(Object, "", prefix_);
|
||||
static ExpressionCompletionDescription ForObject(const gd::String& type_,
|
||||
const gd::String& prefix_) {
|
||||
return ExpressionCompletionDescription(Object, type_, prefix_);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -114,23 +115,21 @@ struct ExpressionCompletionDescription {
|
||||
const gd::String& GetBehaviorName() const { return behaviorName; }
|
||||
|
||||
/**
|
||||
* \brief Set if the completion description is informative, i.e: it's not used
|
||||
* to
|
||||
* complete anything. Rather, it should display information about what is
|
||||
* \brief Set if the completion description is exact, i.e: it's not used
|
||||
* to complete anything. Rather, it should display information about what is
|
||||
* described by the completion.
|
||||
*/
|
||||
ExpressionCompletionDescription& SetIsInformative(bool isInformative_) {
|
||||
isInformative = isInformative_;
|
||||
ExpressionCompletionDescription& SetIsExact(bool isExact_) {
|
||||
isExact = isExact_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Check if the completion description is informative, i.e: it's not
|
||||
* used to
|
||||
* complete anything. Rather, it should display information about what is
|
||||
* described by the completion.
|
||||
* \brief Check if the completion description is exact, i.e: it's not
|
||||
* used to complete anything. Rather, it should display information
|
||||
* about what is described by the completion.
|
||||
*/
|
||||
bool IsInformative() const { return isInformative; }
|
||||
bool IsExact() const { return isExact; }
|
||||
|
||||
/** Default constructor, only to be used by Emscripten bindings. */
|
||||
ExpressionCompletionDescription() : completionKind(Object){};
|
||||
@@ -146,14 +145,14 @@ struct ExpressionCompletionDescription {
|
||||
prefix(prefix_),
|
||||
objectName(objectName_),
|
||||
behaviorName(behaviorName_),
|
||||
isInformative(false) {}
|
||||
isExact(false) {}
|
||||
|
||||
CompletionKind completionKind;
|
||||
gd::String type;
|
||||
gd::String prefix;
|
||||
gd::String objectName;
|
||||
gd::String behaviorName;
|
||||
bool isInformative;
|
||||
bool isExact;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -164,7 +163,7 @@ std::ostream& operator<<(std::ostream& os,
|
||||
os << "{ " << value.GetCompletionKind() << ", " << value.GetType() << ", "
|
||||
<< value.GetPrefix() << ", " << value.GetObjectName() << ", "
|
||||
<< value.GetBehaviorName() << ", "
|
||||
<< (value.IsInformative() ? "informative" : "non-informative") << " }";
|
||||
<< (value.IsExact() ? "exact" : "non-exact") << " }";
|
||||
return os;
|
||||
}
|
||||
|
||||
@@ -209,17 +208,20 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
|
||||
protected:
|
||||
void OnVisitSubExpressionNode(SubExpressionNode& node) override {
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(""));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.type, ""));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpression(node.type, ""));
|
||||
}
|
||||
void OnVisitOperatorNode(OperatorNode& node) override {
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(""));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.type, ""));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpression(node.type, ""));
|
||||
}
|
||||
void OnVisitUnaryOperatorNode(UnaryOperatorNode& node) override {
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(""));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.type, ""));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpression(node.type, ""));
|
||||
}
|
||||
@@ -243,12 +245,12 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
void OnVisitIdentifierNode(IdentifierNode& node) override {
|
||||
if (gd::ParameterMetadata::IsObject(node.type)) {
|
||||
// Only show completions of objects if an object is required
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.identifierName));
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(
|
||||
node.type, node.identifierName));
|
||||
} else {
|
||||
// Show completions for expressions and objects otherwise.
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.identifierName));
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(
|
||||
node.type, node.identifierName));
|
||||
completions.push_back(ExpressionCompletionDescription::ForExpression(
|
||||
node.type, node.identifierName));
|
||||
}
|
||||
@@ -259,8 +261,8 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
// Behavior function (or behavior function being written, with the
|
||||
// function name missing)
|
||||
if (IsCaretOn(node.objectNameLocation)) {
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.objectName));
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(
|
||||
node.type, node.objectName));
|
||||
} else if (IsCaretOn(node.objectNameDotLocation) ||
|
||||
IsCaretOn(node.objectFunctionOrBehaviorNameLocation)) {
|
||||
completions.push_back(ExpressionCompletionDescription::ForBehavior(
|
||||
@@ -276,8 +278,8 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
} else {
|
||||
// Object function or behavior name
|
||||
if (IsCaretOn(node.objectNameLocation)) {
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.objectName));
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(
|
||||
node.type, node.objectName));
|
||||
} else if (IsCaretOn(node.objectNameDotLocation) ||
|
||||
IsCaretOn(node.objectFunctionOrBehaviorNameLocation)) {
|
||||
completions.push_back(ExpressionCompletionDescription::ForBehavior(
|
||||
@@ -288,11 +290,14 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
}
|
||||
}
|
||||
void OnVisitFunctionCallNode(FunctionCallNode& node) override {
|
||||
bool isCaretOnParenthesis = IsCaretOn(node.openingParenthesisLocation) ||
|
||||
IsCaretOn(node.closingParenthesisLocation);
|
||||
|
||||
if (!node.behaviorName.empty()) {
|
||||
// Behavior function
|
||||
if (IsCaretOn(node.objectNameLocation)) {
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.objectName));
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(
|
||||
node.type, node.objectName));
|
||||
} else if (IsCaretOn(node.objectNameDotLocation) ||
|
||||
IsCaretOn(node.behaviorNameLocation)) {
|
||||
completions.push_back(ExpressionCompletionDescription::ForBehavior(
|
||||
@@ -303,40 +308,38 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
node.functionName,
|
||||
node.objectName,
|
||||
node.behaviorName)
|
||||
.SetIsInformative(IsCaretOn(node.openingParenthesisLocation)));
|
||||
.SetIsExact(isCaretOnParenthesis));
|
||||
}
|
||||
} else if (!node.objectName.empty()) {
|
||||
// Object function
|
||||
if (IsCaretOn(node.objectNameLocation)) {
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.objectName));
|
||||
completions.push_back(ExpressionCompletionDescription::ForObject(
|
||||
node.type, node.objectName));
|
||||
} else {
|
||||
// Add completions for behaviors, because we could imagine that the user
|
||||
// wants to move from an object function to a behavior function, and so
|
||||
// need behavior completions. Do this unless we're on the parenthesis
|
||||
// (at which point we're only showing informative message about the
|
||||
// function).
|
||||
if (!IsCaretOn(node.openingParenthesisLocation)) {
|
||||
if (!isCaretOnParenthesis) {
|
||||
completions.push_back(ExpressionCompletionDescription::ForBehavior(
|
||||
node.functionName, node.objectName));
|
||||
}
|
||||
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpression(
|
||||
node.type, node.functionName, node.objectName)
|
||||
.SetIsInformative(IsCaretOn(node.openingParenthesisLocation)));
|
||||
completions.push_back(ExpressionCompletionDescription::ForExpression(
|
||||
node.type, node.functionName, node.objectName)
|
||||
.SetIsExact(isCaretOnParenthesis));
|
||||
}
|
||||
} else {
|
||||
// Free function
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpression(node.type,
|
||||
node.functionName)
|
||||
.SetIsInformative(IsCaretOn(node.openingParenthesisLocation)));
|
||||
completions.push_back(ExpressionCompletionDescription::ForExpression(
|
||||
node.type, node.functionName)
|
||||
.SetIsExact(isCaretOnParenthesis));
|
||||
}
|
||||
}
|
||||
void OnVisitEmptyNode(EmptyNode& node) override {
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForObject(node.text));
|
||||
ExpressionCompletionDescription::ForObject(node.type, node.text));
|
||||
completions.push_back(
|
||||
ExpressionCompletionDescription::ForExpression(node.type, node.text));
|
||||
}
|
||||
@@ -344,6 +347,8 @@ class GD_CORE_API ExpressionCompletionFinder
|
||||
private:
|
||||
bool IsCaretOn(const ExpressionParserLocation& location,
|
||||
bool inclusive = false) {
|
||||
if (!location.IsValid()) return false;
|
||||
|
||||
return (location.GetStartPosition() <= searchedPosition &&
|
||||
((!inclusive && searchedPosition < location.GetEndPosition()) ||
|
||||
(inclusive && searchedPosition <= location.GetEndPosition())));
|
||||
|
@@ -4,6 +4,7 @@
|
||||
* reserved. This project is released under the MIT License.
|
||||
*/
|
||||
#include "ProjectStripper.h"
|
||||
|
||||
#include "GDCore/Project/ExternalEvents.h"
|
||||
#include "GDCore/Project/ExternalLayout.h"
|
||||
#include "GDCore/Project/Layout.h"
|
||||
@@ -20,61 +21,8 @@ void GD_CORE_API ProjectStripper::StripProjectForExport(gd::Project& project) {
|
||||
project.GetLayout(i).GetObjectGroups().Clear();
|
||||
project.GetLayout(i).GetEvents().Clear();
|
||||
}
|
||||
}
|
||||
|
||||
void GD_CORE_API ProjectStripper::StripProjectForLayoutEdition(
|
||||
gd::Project& project, const gd::String& layoutName) {
|
||||
while (project.GetExternalEventsCount() > 0)
|
||||
project.RemoveExternalEvents(project.GetExternalEvents(0).GetName());
|
||||
|
||||
for (unsigned int i = 0; i < project.GetLayoutsCount(); ++i) {
|
||||
auto& layout = project.GetLayout(i);
|
||||
if (layoutName == layout.GetName()) continue;
|
||||
|
||||
project.GetLayout(i).GetEvents().Clear();
|
||||
project.GetLayout(i).GetInitialInstances().Clear();
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < project.GetExternalEventsCount(); ++i) {
|
||||
project.GetExternalEvents(i).GetEvents().Clear();
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < project.GetExternalLayoutsCount(); ++i) {
|
||||
project.GetExternalLayout(i).GetInitialInstances().Clear();
|
||||
}
|
||||
}
|
||||
|
||||
void GD_CORE_API ProjectStripper::StripProjectForExternalLayoutEdition(
|
||||
gd::Project& project, const gd::String& externalLayoutName) {
|
||||
while (project.GetExternalEventsCount() > 0)
|
||||
project.RemoveExternalEvents(project.GetExternalEvents(0).GetName());
|
||||
|
||||
gd::String associatedLayoutName;
|
||||
if (project.HasExternalLayoutNamed(externalLayoutName)) {
|
||||
associatedLayoutName =
|
||||
project.GetExternalLayout(externalLayoutName).GetAssociatedLayout();
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < project.GetLayoutsCount(); ++i) {
|
||||
auto& layout = project.GetLayout(i);
|
||||
if (!associatedLayoutName.empty() &&
|
||||
associatedLayoutName == layout.GetName())
|
||||
continue;
|
||||
|
||||
project.GetLayout(i).GetEvents().Clear();
|
||||
project.GetLayout(i).GetInitialInstances().Clear();
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < project.GetExternalEventsCount(); ++i) {
|
||||
project.GetExternalEvents(i).GetEvents().Clear();
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < project.GetExternalLayoutsCount(); ++i) {
|
||||
auto& externalLayout = project.GetExternalLayout(i);
|
||||
if (externalLayoutName == externalLayout.GetName()) continue;
|
||||
|
||||
externalLayout.GetInitialInstances().Clear();
|
||||
}
|
||||
project.ClearEventsFunctionsExtensions();
|
||||
}
|
||||
|
||||
} // namespace gd
|
||||
|
@@ -28,23 +28,6 @@ class GD_CORE_API ProjectStripper {
|
||||
*/
|
||||
static void StripProjectForExport(gd::Project& project);
|
||||
|
||||
/**
|
||||
* \brief Strip project to keep only the full content of the specified
|
||||
* layout. The content of other layouts, external events and external layouts
|
||||
* is removed.
|
||||
*/
|
||||
static void StripProjectForLayoutEdition(gd::Project& project,
|
||||
const gd::String& layoutName);
|
||||
|
||||
/**
|
||||
* \brief Strip project to keep only the full content of the specified
|
||||
* external layout and the associated layout.
|
||||
* The content of other layouts, external events and external layouts is
|
||||
* removed.
|
||||
*/
|
||||
static void StripProjectForExternalLayoutEdition(
|
||||
gd::Project& project, const gd::String& externalLayoutName);
|
||||
|
||||
private:
|
||||
ProjectStripper(){};
|
||||
virtual ~ProjectStripper(){};
|
||||
|
@@ -181,7 +181,7 @@ class GD_CORE_API WholeProjectRefactorer {
|
||||
bool isObjectGroup);
|
||||
|
||||
/**
|
||||
* \brief Refactor the events function after an object or group is renamed
|
||||
* \brief Refactor the events function after an object or group is removed
|
||||
*
|
||||
* This will update the events of the function and groups.
|
||||
*/
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#include "Project.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <cctype>
|
||||
#include <SFML/System/Utf.hpp>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
@@ -520,6 +521,9 @@ void Project::RemoveEventsFunctionsExtension(const gd::String& name) {
|
||||
|
||||
eventsFunctionsExtensions.erase(eventsFunctionExtension);
|
||||
}
|
||||
void Project::ClearEventsFunctionsExtensions() {
|
||||
eventsFunctionsExtensions.clear();
|
||||
}
|
||||
#endif
|
||||
|
||||
void Project::UnserializeFrom(const SerializerElement& element) {
|
||||
@@ -945,18 +949,16 @@ void Project::SerializeTo(SerializerElement& element) const {
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Project::ValidateObjectName(const gd::String& name) {
|
||||
bool Project::ValidateName(const gd::String& name) {
|
||||
if (name.empty()) return false;
|
||||
|
||||
if (isdigit(name[0])) return false;
|
||||
|
||||
gd::String allowedCharacters =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
|
||||
return !(name.find_first_not_of(allowedCharacters) != gd::String::npos);
|
||||
}
|
||||
|
||||
gd::String Project::GetBadObjectNameWarning() {
|
||||
return _("Please use only letters, digits\nand underscores ( _ ).");
|
||||
}
|
||||
|
||||
void Project::ExposeResources(gd::ArbitraryResourceWorker& worker) {
|
||||
// See also gd::WholeProjectRefactorer::ExposeProjectEvents for a method that
|
||||
// traverse the whole project (this time for events) and ExposeProjectEffects
|
||||
|
@@ -8,6 +8,7 @@
|
||||
#define GDCORE_PROJECT_H
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "GDCore/Project/LoadingScreen.h"
|
||||
#include "GDCore/Project/ObjectGroupsContainer.h"
|
||||
#include "GDCore/Project/ObjectsContainer.h"
|
||||
@@ -460,22 +461,27 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
std::size_t GetLayoutsCount() const;
|
||||
|
||||
/**
|
||||
* \brief \brief Adds a new empty layout called "name" at the specified
|
||||
* \brief Add a new empty layout called "name" at the specified
|
||||
* position in the layout list.
|
||||
*/
|
||||
gd::Layout& InsertNewLayout(const gd::String& name, std::size_t position);
|
||||
|
||||
/**
|
||||
* \brief \brief Adds a new layout constructed from the layout passed as
|
||||
* parameter. \note No pointer or reference must be kept on the layout passed
|
||||
* as parameter. \param layout The layout that must be copied and inserted
|
||||
* into the project \param position Insertion position. Even if the position
|
||||
* \brief Add a new layout constructed from the layout passed as
|
||||
* parameter.
|
||||
* \param layout The layout that must be copied and inserted
|
||||
* into the project
|
||||
* \param position Insertion position. Even if the position
|
||||
* is invalid, the layout must be inserted at the end of the layout list.
|
||||
*
|
||||
* \note No pointer or reference must be kept on the layout passed
|
||||
* as parameter.
|
||||
*
|
||||
*/
|
||||
gd::Layout& InsertLayout(const Layout& layout, std::size_t position);
|
||||
|
||||
/**
|
||||
* Must delete layout named "name".
|
||||
* \brief Delete layout named "name".
|
||||
*/
|
||||
void RemoveLayout(const gd::String& name);
|
||||
|
||||
@@ -592,7 +598,7 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
std::size_t position);
|
||||
|
||||
/**
|
||||
* Must delete external events named "name".
|
||||
* \brief Delete external events named "name".
|
||||
*/
|
||||
void RemoveExternalEvents(const gd::String& name);
|
||||
#endif
|
||||
@@ -673,7 +679,7 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
std::size_t position);
|
||||
|
||||
/**
|
||||
* Must delete external layout named "name".
|
||||
* \brief Delete external layout named "name".
|
||||
*/
|
||||
void RemoveExternalLayout(const gd::String& name);
|
||||
|
||||
@@ -694,37 +700,37 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
///@{
|
||||
#if defined(GD_IDE_ONLY)
|
||||
/**
|
||||
* Return true if events functions extension called "name" exists.
|
||||
* \brief Check if events functions extension called "name" exists.
|
||||
*/
|
||||
bool HasEventsFunctionsExtensionNamed(const gd::String& name) const;
|
||||
|
||||
/**
|
||||
* Return a reference to the events functions extension called "name".
|
||||
* \brief Return a reference to the events functions extension called "name".
|
||||
*/
|
||||
EventsFunctionsExtension& GetEventsFunctionsExtension(const gd::String& name);
|
||||
|
||||
/**
|
||||
* Return a reference to the events functions extension called "name".
|
||||
* \brief Return a reference to the events functions extension called "name".
|
||||
*/
|
||||
const EventsFunctionsExtension& GetEventsFunctionsExtension(
|
||||
const gd::String& name) const;
|
||||
|
||||
/**
|
||||
* Return a reference to the events functions extension at position "index" in
|
||||
* the list
|
||||
* \brief Return a reference to the events functions extension at position
|
||||
* "index" in the list
|
||||
*/
|
||||
EventsFunctionsExtension& GetEventsFunctionsExtension(std::size_t index);
|
||||
|
||||
/**
|
||||
* Return a reference to the events functions extension at position "index" in
|
||||
* the list
|
||||
* \brief Return a reference to the events functions extension at position
|
||||
* "index" in the list
|
||||
*/
|
||||
const EventsFunctionsExtension& GetEventsFunctionsExtension(
|
||||
std::size_t index) const;
|
||||
|
||||
/**
|
||||
* Return the position of the events functions extension called "name" in the
|
||||
* list
|
||||
* \brief Return the position of the events functions extension called "name"
|
||||
* in the list.
|
||||
*/
|
||||
std::size_t GetEventsFunctionsExtensionPosition(const gd::String& name) const;
|
||||
|
||||
@@ -736,7 +742,7 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
void SwapEventsFunctionsExtensions(std::size_t first, std::size_t second);
|
||||
|
||||
/**
|
||||
* Return the number of events functions extension.
|
||||
* \brief Returns the number of events functions extension.
|
||||
*/
|
||||
std::size_t GetEventsFunctionsExtensionsCount() const;
|
||||
|
||||
@@ -759,9 +765,14 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
std::size_t position);
|
||||
|
||||
/**
|
||||
* Must delete the events functions extension named "name".
|
||||
* \brief Delete the events functions extension named "name".
|
||||
*/
|
||||
void RemoveEventsFunctionsExtension(const gd::String& name);
|
||||
|
||||
/**
|
||||
* \brief Remove all the events functions extensions.
|
||||
*/
|
||||
void ClearEventsFunctionsExtensions();
|
||||
#endif
|
||||
///@}
|
||||
|
||||
@@ -843,21 +854,10 @@ class GD_CORE_API Project : public ObjectsContainer {
|
||||
///@{
|
||||
|
||||
/**
|
||||
* Return true if \a objectName can be used as name for an object.
|
||||
*
|
||||
* Default implementation check if objectName is only composed of a-z,A-Z,0-9
|
||||
* or _ characters an if does not conflict with an expression.
|
||||
* Return true if \a name is valid (can be used safely for an object,
|
||||
* behavior, events function name, etc...).
|
||||
*/
|
||||
static bool ValidateObjectName(const gd::String& objectName);
|
||||
|
||||
/**
|
||||
* Return a message that will be displayed when an invalid object name has
|
||||
* been entered.
|
||||
*
|
||||
* \note This message will be displayed by the IDE into a tooltip.
|
||||
*/
|
||||
static gd::String GetBadObjectNameWarning();
|
||||
|
||||
static bool ValidateName(const gd::String& name);
|
||||
///@}
|
||||
|
||||
/** \name External source files
|
||||
|
@@ -76,6 +76,7 @@ const Variable& Variable::GetChild(const gd::String& name) const {
|
||||
void Variable::RemoveChild(const gd::String& name) {
|
||||
if (!isStructure) return;
|
||||
children.erase(name);
|
||||
isStructure = !children.empty();
|
||||
}
|
||||
|
||||
bool Variable::RenameChild(const gd::String& oldName,
|
||||
@@ -190,6 +191,7 @@ void Variable::RemoveRecursively(const gd::Variable& variableToRemove) {
|
||||
it++;
|
||||
}
|
||||
}
|
||||
isStructure = !children.empty();
|
||||
}
|
||||
|
||||
Variable::Variable(const Variable& other)
|
||||
|
@@ -95,6 +95,14 @@ void Serializer::FromXML(SerializerElement& element,
|
||||
}
|
||||
#endif
|
||||
|
||||
gd::String Serializer::ToEscapedXMLString(const gd::String& str) {
|
||||
return str.FindAndReplace("&", "&")
|
||||
.FindAndReplace("'", "'")
|
||||
.FindAndReplace("\"", """)
|
||||
.FindAndReplace("<", "<")
|
||||
.FindAndReplace(">", ">");
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
/**
|
||||
|
@@ -27,14 +27,26 @@ class GD_CORE_API Serializer {
|
||||
static void FromXML(SerializerElement& element,
|
||||
const TiXmlElement* xmlElement);
|
||||
#endif
|
||||
/**
|
||||
* \brief Escape a string for inclusion in a XML tag
|
||||
*/
|
||||
static gd::String ToEscapedXMLString(const gd::String& str);
|
||||
///@}
|
||||
|
||||
/** \name JSON serialization.
|
||||
* Serialize a SerializerElement from/to JSON.
|
||||
*/
|
||||
///@{
|
||||
/**
|
||||
* \brief Serialize a gd::SerializerElement to a JSON string.
|
||||
*/
|
||||
static gd::String ToJSON(const SerializerElement& element);
|
||||
|
||||
static SerializerElement FromJSON(const std::string& json);
|
||||
|
||||
/**
|
||||
* \brief Parse a JSON string and returns a gd::SerializerElement for it.
|
||||
*/
|
||||
static SerializerElement FromJSON(const gd::String& json) {
|
||||
return FromJSON(json.ToUTF8());
|
||||
}
|
||||
|
@@ -34,7 +34,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
SECTION("Identifier") {
|
||||
SECTION("Object or expression completions when type is string") {
|
||||
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("My"),
|
||||
gd::ExpressionCompletionDescription::ForObject("string", "My"),
|
||||
gd::ExpressionCompletionDescription::ForExpression("string", "My")};
|
||||
REQUIRE(getCompletionsFor("string", "My", 0) == expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "My", 1) == expectedCompletions);
|
||||
@@ -42,7 +42,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
}
|
||||
SECTION("Object or expression completions when type is number") {
|
||||
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("My"),
|
||||
gd::ExpressionCompletionDescription::ForObject("number", "My"),
|
||||
gd::ExpressionCompletionDescription::ForExpression("number", "My")};
|
||||
REQUIRE(getCompletionsFor("number", "My", 0) == expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("number", "My", 1) == expectedCompletions);
|
||||
@@ -50,14 +50,17 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
}
|
||||
SECTION("Object when type is an object") {
|
||||
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("My")};
|
||||
gd::ExpressionCompletionDescription::ForObject("object", "My")};
|
||||
REQUIRE(getCompletionsFor("object", "My", 0) == expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("object", "My", 1) == expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("object", "My", 2) == expectedEmptyCompletions);
|
||||
}
|
||||
|
||||
SECTION("Object when type is an object (alternate type)") {
|
||||
// Also test alternate types also considered as objects (but that can
|
||||
// result
|
||||
// in different code generation):
|
||||
// result in different code generation):
|
||||
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("objectPtr", "My")};
|
||||
REQUIRE(getCompletionsFor("objectPtr", "My", 0) == expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("objectPtr", "My", 1) == expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("objectPtr", "My", 2) ==
|
||||
@@ -66,7 +69,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
}
|
||||
SECTION("Operator (number)") {
|
||||
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject(""),
|
||||
gd::ExpressionCompletionDescription::ForObject("number", ""),
|
||||
gd::ExpressionCompletionDescription::ForExpression("number", "")};
|
||||
REQUIRE(getCompletionsFor("number", "1 + ", 1) == expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("number", "1 + ", 2) == expectedCompletions);
|
||||
@@ -74,7 +77,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
}
|
||||
SECTION("Operator (string)") {
|
||||
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject(""),
|
||||
gd::ExpressionCompletionDescription::ForObject("string", ""),
|
||||
gd::ExpressionCompletionDescription::ForExpression("string", "")};
|
||||
REQUIRE(getCompletionsFor("string", "\"a\" + ", 3) == expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "\"a\" + ", 4) == expectedCompletions);
|
||||
@@ -87,10 +90,10 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
gd::ExpressionCompletionDescription::ForExpression("string",
|
||||
"Function")};
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedInformativeCompletions{
|
||||
expectedExactCompletions{
|
||||
gd::ExpressionCompletionDescription::ForExpression("string",
|
||||
"Function")
|
||||
.SetIsInformative(true)};
|
||||
.SetIsExact(true)};
|
||||
REQUIRE(getCompletionsFor("string", "Function(", 0) ==
|
||||
expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "Function(", 1) ==
|
||||
@@ -98,9 +101,11 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
REQUIRE(getCompletionsFor("string", "Function(", 7) ==
|
||||
expectedCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "Function(", 8) ==
|
||||
expectedInformativeCompletions);
|
||||
expectedExactCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "Function(", 9) ==
|
||||
expectedEmptyCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "Function()", 9) ==
|
||||
expectedExactCompletions);
|
||||
}
|
||||
SECTION("Unknown function, test with arguments") {
|
||||
REQUIRE(getCompletionsFor("string", "Function(1", 9) ==
|
||||
@@ -109,7 +114,7 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
expectedEmptyCompletions);
|
||||
|
||||
std::vector<gd::ExpressionCompletionDescription> expectedCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("a"),
|
||||
gd::ExpressionCompletionDescription::ForObject("unknown", "a"),
|
||||
gd::ExpressionCompletionDescription::ForExpression("unknown", "a")};
|
||||
REQUIRE(getCompletionsFor("string", "Function(a", 9) ==
|
||||
expectedCompletions);
|
||||
@@ -128,7 +133,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
SECTION("Test 1") {
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedObjectCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("MyObject")};
|
||||
gd::ExpressionCompletionDescription::ForObject("string",
|
||||
"MyObject")};
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedBehaviorOrFunctionCompletions{
|
||||
gd::ExpressionCompletionDescription::ForBehavior("Func",
|
||||
@@ -154,7 +160,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
SECTION("Test 1") {
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedObjectCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("MyObject")};
|
||||
gd::ExpressionCompletionDescription::ForObject("string",
|
||||
"MyObject")};
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedBehaviorOrFunctionCompletions{
|
||||
gd::ExpressionCompletionDescription::ForBehavior("Func",
|
||||
@@ -162,10 +169,10 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
gd::ExpressionCompletionDescription::ForExpression(
|
||||
"string", "Func", "MyObject")};
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedInformativeFunctionCompletions{
|
||||
expectedExactFunctionCompletions{
|
||||
gd::ExpressionCompletionDescription::ForExpression(
|
||||
"string", "Func", "MyObject")
|
||||
.SetIsInformative(true)};
|
||||
.SetIsExact(true)};
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 0) ==
|
||||
expectedObjectCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 7) ==
|
||||
@@ -177,9 +184,11 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 12) ==
|
||||
expectedBehaviorOrFunctionCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 13) ==
|
||||
expectedInformativeFunctionCompletions);
|
||||
expectedExactFunctionCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.Func(", 14) ==
|
||||
expectedEmptyCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.Func()", 14) ==
|
||||
expectedExactFunctionCompletions);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,7 +196,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
SECTION("Test 1") {
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedObjectCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("MyObject")};
|
||||
gd::ExpressionCompletionDescription::ForObject("string",
|
||||
"MyObject")};
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedBehaviorCompletions{
|
||||
gd::ExpressionCompletionDescription::ForBehavior("MyBehavior",
|
||||
@@ -218,7 +228,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
SECTION("Test 2") {
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedObjectCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("MyObject")};
|
||||
gd::ExpressionCompletionDescription::ForObject("string",
|
||||
"MyObject")};
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedBehaviorCompletions{
|
||||
gd::ExpressionCompletionDescription::ForBehavior("MyBehavior",
|
||||
@@ -248,7 +259,8 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
SECTION("Test 1") {
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedObjectCompletions{
|
||||
gd::ExpressionCompletionDescription::ForObject("MyObject")};
|
||||
gd::ExpressionCompletionDescription::ForObject("string",
|
||||
"MyObject")};
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedBehaviorCompletions{
|
||||
gd::ExpressionCompletionDescription::ForBehavior("MyBehavior",
|
||||
@@ -258,10 +270,10 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
gd::ExpressionCompletionDescription::ForExpression(
|
||||
"string", "Func", "MyObject", "MyBehavior")};
|
||||
std::vector<gd::ExpressionCompletionDescription>
|
||||
expectedInformativeFunctionCompletions{
|
||||
expectedExactFunctionCompletions{
|
||||
gd::ExpressionCompletionDescription::ForExpression(
|
||||
"string", "Func", "MyObject", "MyBehavior")
|
||||
.SetIsInformative(true)};
|
||||
.SetIsExact(true)};
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 0) ==
|
||||
expectedObjectCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 7) ==
|
||||
@@ -282,6 +294,14 @@ TEST_CASE("ExpressionCompletionFinder", "[common][events]") {
|
||||
expectedFunctionCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 23) ==
|
||||
expectedFunctionCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 24) ==
|
||||
expectedFunctionCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 25) ==
|
||||
expectedExactFunctionCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func(", 26) ==
|
||||
expectedEmptyCompletions);
|
||||
REQUIRE(getCompletionsFor("string", "MyObject.MyBehavior::Func()", 26) ==
|
||||
expectedExactFunctionCompletions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1172,6 +1172,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(textNode.location.GetEndPosition() == 23);
|
||||
REQUIRE(identifierNode.location.GetStartPosition() == 25);
|
||||
REQUIRE(identifierNode.location.GetEndPosition() == 30);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 30);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 31);
|
||||
}
|
||||
SECTION("Free function locations (with whitespaces)") {
|
||||
auto node = parser.ParseExpression("number",
|
||||
@@ -1192,6 +1194,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(functionNode.functionNameLocation.GetEndPosition() == 16);
|
||||
REQUIRE(functionNode.openingParenthesisLocation.GetStartPosition() == 18);
|
||||
REQUIRE(functionNode.openingParenthesisLocation.GetEndPosition() == 19);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 32);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 33);
|
||||
}
|
||||
SECTION("Object function locations") {
|
||||
auto node = parser.ParseExpression(
|
||||
@@ -1231,6 +1235,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(textNode.location.GetEndPosition() == 38);
|
||||
REQUIRE(identifierNode.location.GetStartPosition() == 40);
|
||||
REQUIRE(identifierNode.location.GetEndPosition() == 45);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 45);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 46);
|
||||
}
|
||||
SECTION("Object function name locations") {
|
||||
auto node =
|
||||
@@ -1306,6 +1312,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(functionNode.functionNameLocation.GetEndPosition() == 33);
|
||||
REQUIRE(functionNode.openingParenthesisLocation.GetStartPosition() == 34);
|
||||
REQUIRE(functionNode.openingParenthesisLocation.GetEndPosition() == 35);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 48);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 49);
|
||||
}
|
||||
SECTION("Behavior function locations") {
|
||||
auto node = parser.ParseExpression(
|
||||
@@ -1350,6 +1358,8 @@ TEST_CASE("ExpressionParser2", "[common][events]") {
|
||||
REQUIRE(textNode.location.GetEndPosition() == 56);
|
||||
REQUIRE(identifierNode.location.GetStartPosition() == 58);
|
||||
REQUIRE(identifierNode.location.GetEndPosition() == 63);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetStartPosition() == 63);
|
||||
REQUIRE(functionNode.closingParenthesisLocation.GetEndPosition() == 64);
|
||||
}
|
||||
SECTION("Behavior function name locations (with whitespace)") {
|
||||
auto node = parser.ParseExpression(
|
||||
|
@@ -35,6 +35,8 @@ module.exports = {
|
||||
if (propertyName in objectContent) {
|
||||
if (typeof objectContent[propertyName] === 'boolean')
|
||||
objectContent[propertyName] = newValue === '1';
|
||||
else if (typeof objectContent[propertyName] === 'number')
|
||||
objectContent[propertyName] = parseFloat(newValue);
|
||||
else objectContent[propertyName] = newValue;
|
||||
return true;
|
||||
}
|
||||
@@ -67,7 +69,7 @@ module.exports = {
|
||||
|
||||
objectProperties.set(
|
||||
'fontSize',
|
||||
new gd.PropertyDescriptor(objectContent.fontSize)
|
||||
new gd.PropertyDescriptor(objectContent.fontSize.toString())
|
||||
.setType('number')
|
||||
.setLabel(_('Base size'))
|
||||
);
|
||||
@@ -111,7 +113,7 @@ module.exports = {
|
||||
text:
|
||||
'[b]bold[/b] [i]italic[/i] [size=15]smaller[/size] [font=times]times[/font] font\n[spacing=12]spaced out[/spacing]\n[outline=yellow]outlined[/outline] [shadow=red]DropShadow[/shadow] ',
|
||||
opacity: 255,
|
||||
fontSize: '20',
|
||||
fontSize: 20,
|
||||
visible: true,
|
||||
color: '#000000',
|
||||
fontFamily: 'Arial',
|
||||
@@ -410,7 +412,7 @@ module.exports = {
|
||||
objectsEditorService.registerEditorConfiguration(
|
||||
'BBText::BBText',
|
||||
objectsEditorService.getDefaultObjectJsImplementationPropertiesEditor({
|
||||
helpPagePath: '/objects/bbtext_object',
|
||||
helpPagePath: '/objects/bbtext',
|
||||
})
|
||||
);
|
||||
},
|
||||
|
@@ -76,6 +76,7 @@ gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateText = function() {
|
||||
|
||||
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateColor = function() {
|
||||
this._pixiObject.textStyles.default.fill = this._object._color;
|
||||
this._pixiObject.dirty = true;
|
||||
};
|
||||
|
||||
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateAlignment = function() {
|
||||
@@ -83,10 +84,12 @@ gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateAlignment = function() {
|
||||
this._pixiObject.dirty = true;
|
||||
};
|
||||
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateFontFamily = function() {
|
||||
this._pixiObject.textStyles.default.fontFamily = this._object._fontFamily;
|
||||
this._pixiObject.textStyles.default.fontFamily = this._object._runtimeScene.getGame().getFontManager().getFontFamily(this._object._fontFamily);
|
||||
this._pixiObject.dirty = true;
|
||||
};
|
||||
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updateFontSize = function() {
|
||||
this._pixiObject.textStyles.default.fontSize = this._object._fontSize + 'px';
|
||||
this._pixiObject.dirty = true;
|
||||
};
|
||||
|
||||
gdjs.BBTextRuntimeObjectPixiRenderer.prototype.updatePosition = function() {
|
||||
|
@@ -25,7 +25,8 @@ gdjs.BBTextRuntimeObject = function(runtimeScene, objectData) {
|
||||
gdjs.RuntimeObject.call(this, runtimeScene, objectData);
|
||||
|
||||
/** @type {number} */
|
||||
this._opacity = objectData.content.opacity;
|
||||
this._opacity = parseFloat(objectData.content.opacity);
|
||||
// parseFloat should not be required, but GDevelop 5.0 beta 92 and below were storing it as a string.
|
||||
/** @type {boolean} */
|
||||
this._visible = objectData.content.visible;
|
||||
/** @type {string} */
|
||||
@@ -35,7 +36,8 @@ gdjs.BBTextRuntimeObject = function(runtimeScene, objectData) {
|
||||
/** @type {string} */
|
||||
this._fontFamily = objectData.content.fontFamily;
|
||||
/** @type {number} */
|
||||
this._fontSize = objectData.content.fontSize;
|
||||
this._fontSize = parseFloat(objectData.content.fontSize);
|
||||
// parseFloat should not be required, but GDevelop 5.0 beta 92 and below were storing it as a string.
|
||||
/** @type {boolean} */
|
||||
this._wordWrap = objectData.content.wordWrap;
|
||||
/** @type {number} */
|
||||
|
File diff suppressed because one or more lines are too long
@@ -45,7 +45,7 @@ module.exports = {
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/DialogueTree/dialoguetools.js')
|
||||
.addIncludeFile('Extensions/DialogueTree/bondage.min.js')
|
||||
.addIncludeFile('Extensions/DialogueTree/bondage.js/dist/bondage.min.js')
|
||||
.setFunctionName('gdjs.dialogueTree.loadFromSceneVariable');
|
||||
|
||||
extension
|
||||
@@ -69,7 +69,7 @@ module.exports = {
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/DialogueTree/dialoguetools.js')
|
||||
.addIncludeFile('Extensions/DialogueTree/bondage.min.js')
|
||||
.addIncludeFile('Extensions/DialogueTree/bondage.js/dist/bondage.min.js')
|
||||
.setFunctionName('gdjs.dialogueTree.loadFromJsonFile');
|
||||
|
||||
extension
|
||||
@@ -168,15 +168,14 @@ module.exports = {
|
||||
_(
|
||||
'Select option by number. Use this when the dialogue line is of type "options" and the player has pressed a button to change selected option.'
|
||||
),
|
||||
_('Select option by number'),
|
||||
_('Select option at index _PARAM0_'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
)
|
||||
.addParameter('expression', _('Option index number'), '', false)
|
||||
.setDefaultValue('0')
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.selectPreviousOption');
|
||||
.setFunctionName('gdjs.dialogueTree.selectOption');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
@@ -210,21 +209,55 @@ module.exports = {
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'SetVariable',
|
||||
_('Set dialogue state variable'),
|
||||
'SetStringVariable',
|
||||
_('Set dialogue state string variable'),
|
||||
_(
|
||||
'Set dialogue state variable. Use this to set a variable that the dialogue data is using.'
|
||||
'Set dialogue state string variable. Use this to set a variable that the dialogue data is using.'
|
||||
),
|
||||
_('Set dialogue state variable _PARAM0_ to _PARAM1_'),
|
||||
_('Set dialogue state string variable _PARAM0_ to _PARAM1_'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
)
|
||||
.addParameter('string', _('State Variable Name'), '', false)
|
||||
.addParameter('expression', _('Variable Value'), '', false)
|
||||
.addParameter('string', _('Variable string value'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.setVariable');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'SetNumberVariable',
|
||||
_('Set dialogue state number variable'),
|
||||
_(
|
||||
'Set dialogue state number variable. Use this to set a variable that the dialogue data is using.'
|
||||
),
|
||||
_('Set dialogue state number variable _PARAM0_ to _PARAM1_'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
)
|
||||
.addParameter('string', _('State Variable Name'), '', false)
|
||||
.addParameter('expression', _('Variable number value'), '', true)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.setVariable');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'SetBooleanVariable',
|
||||
_('Set dialogue state boolean variable'),
|
||||
_(
|
||||
'Set dialogue state boolean variable. Use this to set a variable that the dialogue data is using.'
|
||||
),
|
||||
_('Set dialogue state boolean variable _PARAM0_ to _PARAM1_'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
)
|
||||
.addParameter('string', _('State Variable Name'), '', false)
|
||||
.addParameter('trueorfalse', _('Variable boolean value'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.setVariable');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'SaveState',
|
||||
@@ -257,6 +290,21 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.loadState');
|
||||
|
||||
extension
|
||||
.addAction(
|
||||
'ClearState',
|
||||
_('Clear dialogue state'),
|
||||
_(
|
||||
'Clear dialogue state. This resets all dialogue state accumulated by the player choices. Useful when the player is starting a new game.'
|
||||
),
|
||||
_('Clear dialogue state'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.clearState');
|
||||
|
||||
extension
|
||||
.addStrExpression(
|
||||
'LineText',
|
||||
@@ -592,9 +640,9 @@ module.exports = {
|
||||
extension
|
||||
.addCondition(
|
||||
'WasBranchVisited',
|
||||
_('Branch title has been visited before'),
|
||||
_('Check if the current branch has been visited before'),
|
||||
_('Branch title _PARAM0_ has been visited before'),
|
||||
_('Branch title has been visited'),
|
||||
_('Check if a branch has been visited'),
|
||||
_('Branch title _PARAM0_ has been visited'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
@@ -605,12 +653,12 @@ module.exports = {
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'CompareDialogueStateVariable',
|
||||
_('Compare dialogue state variable'),
|
||||
'CompareDialogueStateStringVariable',
|
||||
_('Compare dialogue state string variable'),
|
||||
_(
|
||||
'Compare dialogue state variable. Use this to trigger game events via dialogue variables.'
|
||||
'Compare dialogue state string variable. Use this to trigger game events via dialogue variables.'
|
||||
),
|
||||
_('Dialogue state variable _PARAM0_ is equal to _PARAM1_'),
|
||||
_('Dialogue state string variable _PARAM0_ is equal to _PARAM1_'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
@@ -620,6 +668,40 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.compareVariable');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'CompareDialogueStateNumberVariable',
|
||||
_('Compare dialogue state number variable'),
|
||||
_(
|
||||
'Compare dialogue state number variable. Use this to trigger game events via dialogue variables.'
|
||||
),
|
||||
_('Dialogue state number variable _PARAM0_ is equal to _PARAM1_'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
)
|
||||
.addParameter('string', _('State variable'), '', false)
|
||||
.addParameter('expression', _('Equal to'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.compareVariable');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'CompareDialogueStateBooleanVariable',
|
||||
_('Compare dialogue state boolean variable'),
|
||||
_(
|
||||
'Compare dialogue state variable. Use this to trigger game events via dialogue variables.'
|
||||
),
|
||||
_('Dialogue state boolean variable _PARAM0_ is equal to _PARAM1_'),
|
||||
_('Dialogue Tree (experimental)'),
|
||||
'JsPlatform/Extensions/yarn24.png',
|
||||
'JsPlatform/Extensions/yarn32.png'
|
||||
)
|
||||
.addParameter('string', _('State variable'), '', false)
|
||||
.addParameter('trueorfalse', _('Equal to'), '', false)
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('gdjs.dialogueTree.compareVariable');
|
||||
|
||||
extension
|
||||
.addCondition(
|
||||
'HasClippedTextScrollingCompleted',
|
||||
|
21
Extensions/DialogueTree/bondage.js/LICENSE.txt
Normal file
21
Extensions/DialogueTree/bondage.js/LICENSE.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2017 j hayley
|
||||
|
||||
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.
|
66
Extensions/DialogueTree/bondage.js/README.md
Normal file
66
Extensions/DialogueTree/bondage.js/README.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# bondage.js [](https://travis-ci.org/jhayley/bondage.js)
|
||||
[Yarn](https://github.com/InfiniteAmmoInc/Yarn) parser for Javascript, in the same vein as [YarnSpinner](https://github.com/thesecretlab/YarnSpinner).
|
||||
|
||||
# Usage
|
||||
|
||||
#### As a Web Tool
|
||||
|
||||
To run through your yarn files in your browser, go to http://hayley.zone/bondage.js, paste your yarn data in the field, then hit "compile".
|
||||
|
||||
#### As a Command Line Tool
|
||||
Installation: `npm install -g bondage`
|
||||
|
||||
Now you can use the `bondage` command to run through Yarn files from the command line. You can load one or multiple files at a time. If you load multiple files and a two nodes are encountered with the same name, the node will be overwritten.
|
||||
|
||||
**Examples**
|
||||
|
||||
* Running a single file from the default start node (named "Start"): `bondage run yarnfile.json`
|
||||
* Running a single file from the specified node name: `bondage run -s StartNode yarnfile.json`
|
||||
* Running multiple files from the specified node name: `bondage run -s StartNode yarnfile1.json yarnfile2.json ...`
|
||||
* See the compiled ast: `bondage compile --ast yarnfile.json`
|
||||
* See the tokenized input: `bondage compile --tokens yarnfile.json`
|
||||
|
||||
#### As a Library
|
||||
|
||||
**Web**
|
||||
|
||||
Include [dist/bondage.min.js](https://github.com/jhayley/bondage.js/blob/master/dist/bondage.min.js) somewhere in your html, and the `bondage` variable will be added to the global scope. You can then access everything in the example below (such as `bondage.Runner`) through that variable.
|
||||
|
||||
**Node**
|
||||
|
||||
Installation: `npm install bondage`
|
||||
|
||||
```javascript
|
||||
const fs = require('fs');
|
||||
const bondage = require('bondage');
|
||||
|
||||
const runner = new bondage.Runner();
|
||||
const yarnData = JSON.parse(fs.readFileSync('yarnFile.json'));
|
||||
|
||||
runner.load(yarnData);
|
||||
|
||||
// Loop over the dialogue from the node titled 'Start'
|
||||
for (const result of runner.run('Start')) {
|
||||
// Do something else with the result
|
||||
if (result instanceof bondage.TextResult) {
|
||||
console.log(result.text);
|
||||
} else if (result instanceof bondage.OptionsResult) {
|
||||
// This works for both links between nodes and shortcut options
|
||||
console.log(result.options);
|
||||
|
||||
// Select based on the option's index in the array (if you don't select an option, the dialog will continue past them)
|
||||
result.select(1);
|
||||
} else if (result instanceof bondage.CommandResult) {
|
||||
// If the text was inside <<here>>, it will get returned as a CommandResult string, which you can use in any way you want
|
||||
console.log(result.text);
|
||||
}
|
||||
}
|
||||
|
||||
// Advance the dialogue manually from the node titled 'Start'
|
||||
const d = runner.run('Start')
|
||||
let result = d.next().value;
|
||||
let nextResult = d.next().value;
|
||||
// And so on
|
||||
```
|
||||
|
||||
For usage of the yarn format itself, please see the [YarnSpinner Documentation](https://github.com/thesecretlab/YarnSpinner/tree/master/Documentation), everything there should carry here too (if something does not match up, please open an issue).
|
File diff suppressed because one or more lines are too long
5
Extensions/DialogueTree/bondage.js/version.txt
Normal file
5
Extensions/DialogueTree/bondage.js/version.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
This extension is using bondage.js library to parse yarn syntax.
|
||||
https://github.com/hylyh/bondage.js
|
||||
|
||||
The current build used is built from commit 3c63e21
|
||||
|
@@ -101,7 +101,20 @@ gdjs.dialogueTree.isRunning = function() {
|
||||
gdjs.dialogueTree.scrollClippedText = function() {
|
||||
if (this.pauseScrolling || !this.dialogueIsRunning) return;
|
||||
|
||||
if (this.dialogueText) {
|
||||
// Autoscroll commands so the user doesnt have to press again
|
||||
if (
|
||||
gdjs.dialogueTree._isLineTypeCommand() &&
|
||||
this.dialogueDataType === 'text' &&
|
||||
this.dialogueBranchTitle === this.dialogueData.data.title &&
|
||||
this.lineNum === this.dialogueData.lineNum &&
|
||||
gdjs.dialogueTree.hasClippedScrollingCompleted()
|
||||
) {
|
||||
gdjs.dialogueTree.goToNextDialogueLine();
|
||||
return
|
||||
}
|
||||
|
||||
// Increment scrolling of clipped text
|
||||
if (this.dialogueText && this.dialogueDataType === 'text' && this.clipTextEnd < this.dialogueText.length) {
|
||||
this.clipTextEnd += 1;
|
||||
}
|
||||
};
|
||||
@@ -110,7 +123,7 @@ gdjs.dialogueTree.scrollClippedText = function() {
|
||||
* Scroll the clipped text to its end, so the entire text is printed. This can be useful in keeping the event sheet logic simpler, while supporting more variation.
|
||||
*/
|
||||
gdjs.dialogueTree.completeClippedTextScrolling = function() {
|
||||
if (this.pauseScrolling || !this.dialogueIsRunning || !this.dialogueText)
|
||||
if (this.pauseScrolling || !this.dialogueIsRunning || !this.dialogueText || this.dialogueDataType !== 'text')
|
||||
return;
|
||||
this.clipTextEnd = this.dialogueText.length;
|
||||
};
|
||||
@@ -120,9 +133,11 @@ gdjs.dialogueTree.completeClippedTextScrolling = function() {
|
||||
* Useful to prevent the user from skipping to next line before the current one has been printed fully.
|
||||
*/
|
||||
gdjs.dialogueTree.hasClippedScrollingCompleted = function() {
|
||||
if (!this.dialogueIsRunning) return false;
|
||||
if (this.dialogueData && this.dialogueText.length) {
|
||||
return this.clipTextEnd >= this.dialogueText.length;
|
||||
if (!this.dialogueIsRunning || this.dialogueDataType === '') return false;
|
||||
|
||||
if (this.dialogueData && this.dialogueText.length > 0 && this.clipTextEnd >= this.dialogueText.length) {
|
||||
if (gdjs.dialogueTree.getVariable('debug')) console.warn('Scroll completed:', this.clipTextEnd,'/', this.dialogueText.length);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
@@ -142,7 +157,6 @@ gdjs.dialogueTree.getClippedLineText = function() {
|
||||
* Note that using this instead getClippedLineText will skip any <<wait>> commands entirely.
|
||||
*/
|
||||
gdjs.dialogueTree.getLineText = function() {
|
||||
this.completeClippedTextScrolling();
|
||||
return this.dialogueIsRunning && this.dialogueText.length
|
||||
? this.dialogueText
|
||||
: '';
|
||||
@@ -163,6 +177,7 @@ gdjs.dialogueTree.commandParametersCount = function() {
|
||||
* @param {number} paramIndex The index of the parameter to get.
|
||||
*/
|
||||
gdjs.dialogueTree.getCommandParameter = function(paramIndex) {
|
||||
if (paramIndex === -1 && this.commandParameters.length > 0) return this.commandParameters[0];
|
||||
if (
|
||||
this.commandParameters &&
|
||||
this.commandParameters.length >= paramIndex + 1
|
||||
@@ -188,17 +203,20 @@ gdjs.dialogueTree.isCommandCalled = function(command) {
|
||||
|
||||
if (this.pauseScrolling || !commandCalls) return false;
|
||||
return this.commandCalls.some(function(call, index) {
|
||||
if (clipTextEnd < call.time) return false;
|
||||
if (call.cmd === 'wait' && clipTextEnd !== dialogueText.length) {
|
||||
if (clipTextEnd !== 0 && clipTextEnd < call.time) return false;
|
||||
if (call.cmd === 'wait' && (clipTextEnd === 0 || clipTextEnd !== dialogueText.length)) {
|
||||
gdjs.dialogueTree.pauseScrolling = true;
|
||||
setTimeout(function() {
|
||||
gdjs.dialogueTree.pauseScrolling = false;
|
||||
commandCalls.splice(index, 1);
|
||||
if (gdjs.dialogueTree.getVariable('debug')) console.info('CMD:', call);
|
||||
}, parseInt(call.params[1], 10));
|
||||
}
|
||||
if (call.cmd === command) {
|
||||
gdjs.dialogueTree.commandParameters = call.params;
|
||||
commandCalls.splice(index, 1);
|
||||
if (gdjs.dialogueTree.getVariable('debug')) console.info('CMD:', call);
|
||||
|
||||
return true;
|
||||
}
|
||||
});
|
||||
@@ -339,7 +357,7 @@ gdjs.dialogueTree.selectOption = function(optionIndex) {
|
||||
if (!this.dialogueIsRunning) return;
|
||||
if (this.dialogueData.select) {
|
||||
this.selectedOption = gdjs.dialogueTree._normalizedOptionIndex(
|
||||
this.selectedOption
|
||||
optionIndex
|
||||
);
|
||||
this.selectedOptionUpdated = true;
|
||||
}
|
||||
@@ -384,16 +402,21 @@ gdjs.dialogueTree.hasSelectedOptionChanged = function() {
|
||||
* @param {string} type The type you want to check for ( one of the three above )
|
||||
*/
|
||||
gdjs.dialogueTree.isDialogueLineType = function(type) {
|
||||
if (
|
||||
this.commandCalls &&
|
||||
this.commandCalls.some(function(call) {
|
||||
return gdjs.dialogueTree.clipTextEnd > call.time && call.cmd === 'wait';
|
||||
})
|
||||
) {
|
||||
return !this.pauseScrolling;
|
||||
if (!this.dialogueIsRunning) return false;
|
||||
if (this.commandCalls && type === 'command') {
|
||||
if (
|
||||
this.commandCalls.some(function(call) {
|
||||
return gdjs.dialogueTree.clipTextEnd > call.time && call.cmd === 'wait';
|
||||
})
|
||||
) {
|
||||
return !this.pauseScrolling;
|
||||
}
|
||||
if (this.commandCalls.length > 0 && this.commandParameters.length > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return this.dialogueIsRunning ? this.dialogueDataType === type : false;
|
||||
return this.dialogueDataType === type;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -420,19 +443,27 @@ gdjs.dialogueTree.startFrom = function(startDialogueNode) {
|
||||
if (!this.hasDialogueBranch(startDialogueNode)) return;
|
||||
this.optionsCount = 0;
|
||||
this.options = [];
|
||||
this.dialogueBranchTitle = '';
|
||||
this.dialogueBranchBody = '';
|
||||
this.dialogueBranchTags = [];
|
||||
this.tagParameters = [];
|
||||
this.dialogue = this.runner.run(startDialogueNode);
|
||||
this.dialogueData = null;
|
||||
this.dialogueDataType = '';
|
||||
this.dialogueText = '';
|
||||
this.clipTextEnd = 0;
|
||||
this.commandCalls = [];
|
||||
this.commandParameters = [];
|
||||
this.pauseScrolling = false;
|
||||
|
||||
this.dialogueData = this.dialogue.next().value;
|
||||
this.dialogueBranchTags = this.dialogueData.data.tags;
|
||||
this.dialogueBranchTitle = this.dialogueData.data.title;
|
||||
this.dialogueBranchBody = this.dialogueData.data.body;
|
||||
this.lineNum = this.dialogueData.lineNum;
|
||||
if (gdjs.dialogueTree._isLineTypeText()){
|
||||
this.dialogueDataType = 'text';
|
||||
} else if (gdjs.dialogueTree._isLineTypeOptions()){
|
||||
this.dialogueDataType = 'options';
|
||||
} else {
|
||||
this.dialogueDataType = 'command';
|
||||
};
|
||||
|
||||
this.dialogueIsRunning = true;
|
||||
gdjs.dialogueTree.goToNextDialogueLine();
|
||||
};
|
||||
@@ -462,32 +493,37 @@ gdjs.dialogueTree.goToNextDialogueLine = function() {
|
||||
this.selectedOption = -1;
|
||||
this.selectedOptionUpdated = false;
|
||||
|
||||
if (gdjs.dialogueTree._isLineTypeText()) {
|
||||
if (
|
||||
this.dialogueDataType === 'options' ||
|
||||
this.dialogueDataType === 'text' ||
|
||||
!this.dialogueDataType
|
||||
) {
|
||||
if (gdjs.dialogueTree.getVariable('debug')) console.info('parsing:', this.dialogueData);
|
||||
|
||||
if (!this.dialogueData) {
|
||||
gdjs.dialogueTree.stopRunningDialogue();
|
||||
} else if (gdjs.dialogueTree._isLineTypeText()) {
|
||||
if (this.lineNum === this.dialogueData.lineNum && this.dialogueBranchTitle === this.dialogueData.data.title){
|
||||
this.clipTextEnd = this.dialogueText.length - 1;
|
||||
this.dialogueText +=
|
||||
(this.dialogueText === '' ? '' : ' ') + this.dialogueData.text;
|
||||
} else {
|
||||
this.clipTextEnd = 0;
|
||||
this.dialogueText = this.dialogueData.text;
|
||||
this.commandCalls = [];
|
||||
} else {
|
||||
this.dialogueText += this.dialogueData.text;
|
||||
}
|
||||
|
||||
this.dialogueDataType = 'text';
|
||||
this.dialogueBranchTags = this.dialogueData.data.tags;
|
||||
this.dialogueBranchTitle = this.dialogueData.data.title;
|
||||
this.dialogueBranchBody = this.dialogueData.data.body;
|
||||
this.lineNum = this.dialogueData.lineNum;
|
||||
this.dialogueDataType = 'text';
|
||||
|
||||
this.dialogueData = this.dialogue.next().value;
|
||||
} else if (gdjs.dialogueTree._isLineTypeOptions()) {
|
||||
this.commandCalls = [];
|
||||
this.dialogueDataType = 'options';
|
||||
this.dialogueText = '';
|
||||
this.clipTextEnd = 0;
|
||||
this.optionsCount = this.dialogueData.options.length;
|
||||
this.options = this.dialogueData.options;
|
||||
this.selectedOptionUpdated = true;
|
||||
} else if (gdjs.dialogueTree._isLineTypeCommand()) {
|
||||
this.dialogueDataType = 'command';
|
||||
|
||||
var command = this.dialogueData.text.split(' ');
|
||||
// If last command was to wait, increase time by one
|
||||
var offsetTime =
|
||||
@@ -505,11 +541,6 @@ gdjs.dialogueTree.goToNextDialogueLine = function() {
|
||||
} else {
|
||||
this.dialogueDataType = 'unknown';
|
||||
}
|
||||
|
||||
if (gdjs.dialogueTree._isLineTypeCommand()) {
|
||||
this.dialogueDataType = 'command';
|
||||
gdjs.dialogueTree.goToNextDialogueLine();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -627,7 +658,7 @@ gdjs.dialogueTree.getBranchText = function() {
|
||||
*/
|
||||
gdjs.dialogueTree.getVariable = function(key) {
|
||||
if (this.dialogueIsRunning && key in this.runner.variables.data) {
|
||||
return this.runner.variables.data[key];
|
||||
return this.runner.variables.get(key);
|
||||
}
|
||||
return '';
|
||||
};
|
||||
@@ -635,11 +666,11 @@ gdjs.dialogueTree.getVariable = function(key) {
|
||||
/**
|
||||
* Check if a specific variable created by the Dialogue parses exists and is equal to a specific value.
|
||||
* @param {string} key The name of the variable you want to check the value of
|
||||
* @param {string} value The value you want to check against
|
||||
* @param {string|boolean|number} value The value you want to check against
|
||||
*/
|
||||
gdjs.dialogueTree.compareVariable = function(key, value) {
|
||||
if (this.dialogueIsRunning && key in this.runner.variables.data) {
|
||||
return this.runner.variables.data[key].toString() === value;
|
||||
return this.runner.variables.get(key) === value;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
@@ -647,11 +678,11 @@ gdjs.dialogueTree.compareVariable = function(key, value) {
|
||||
/**
|
||||
* Set a specific variable created by the Dialogue parser to a specific value.
|
||||
* @param {string} key The name of the variable you want to set the value of
|
||||
* @param {string} value The value you want to set
|
||||
* @param {string|boolean|number} value The value you want to set
|
||||
*/
|
||||
gdjs.dialogueTree.setVariable = function(key, value) {
|
||||
if (this.dialogueIsRunning && this.runner.variables.data) {
|
||||
this.runner.variables.data[key] = value;
|
||||
if (this.runner.variables) {
|
||||
this.runner.variables.set(key, value);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -662,7 +693,7 @@ gdjs.dialogueTree.setVariable = function(key, value) {
|
||||
* @param {gdjs.Variable} outputVariable The variable where to store the State
|
||||
*/
|
||||
gdjs.dialogueTree.saveState = function(outputVariable) {
|
||||
const dialogueState = {
|
||||
var dialogueState = {
|
||||
variables: gdjs.dialogueTree.runner.variables.data,
|
||||
visited: gdjs.dialogueTree.runner.visited,
|
||||
};
|
||||
@@ -673,17 +704,32 @@ gdjs.dialogueTree.saveState = function(outputVariable) {
|
||||
* Load the current State of the Dialogue Parser from a specified variable.
|
||||
* Can be used to implement persistence in dialogue through your game's Load/Save function.
|
||||
* That way you can later load all the dialogue choices the player has made.
|
||||
* @param {gdjs.Variable} inputVariable The variable where to load the State from.
|
||||
* @param {gdjs.Variable} inputVariable The structured variable where to load the State from.
|
||||
*/
|
||||
gdjs.dialogueTree.loadState = function(inputVariable) {
|
||||
const jsonData = gdjs.evtTools.network.variableStructureToJSON(inputVariable);
|
||||
var loadedState = JSON.parse(
|
||||
gdjs.evtTools.network.variableStructureToJSON(inputVariable)
|
||||
);
|
||||
if (!loadedState) {
|
||||
console.error('Load state variable is empty:', inputVariable);
|
||||
return
|
||||
}
|
||||
try {
|
||||
const loadedState = JSON.parse(
|
||||
gdjs.evtTools.network.variableStructureToJSON(inputVariable)
|
||||
);
|
||||
gdjs.dialogueTree.runner.visited = loadedState.visited;
|
||||
gdjs.dialogueTree.runner.variables.data = loadedState.variables;
|
||||
gdjs.dialogueTree.runner.variables.data = {};
|
||||
Object.keys(loadedState.variables).forEach(function(key) {
|
||||
var value = loadedState.variables[key];
|
||||
gdjs.dialogueTree.runner.variables.set(key, value);
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
console.error('Failed to load state from variable:', inputVariable, e);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Clear the current State of the Dialogue Parser.
|
||||
*/
|
||||
gdjs.dialogueTree.clearState = function() {
|
||||
gdjs.dialogueTree.runner.visited = {};
|
||||
gdjs.dialogueTree.runner.variables.data = {};
|
||||
};
|
||||
|
@@ -1,6 +1,11 @@
|
||||
|
||||
// @ts-check
|
||||
describe('gdjs.DraggableRuntimeBehavior', function() {
|
||||
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
|
||||
var runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: {resources: []},
|
||||
// @ts-ignore
|
||||
properties: {windowWidth: 800, windowHeight: 600}
|
||||
});
|
||||
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers:[{name:"", visibility: true}],
|
||||
@@ -10,8 +15,8 @@ describe('gdjs.DraggableRuntimeBehavior', function() {
|
||||
instances: []
|
||||
});
|
||||
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{type: "DraggableBehavior::Draggable"}]});
|
||||
var object2 = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{type: "DraggableBehavior::Draggable"}]});
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{name: "Behavior1", type: "DraggableBehavior::Draggable"}], variables: []});
|
||||
var object2 = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{name: "Behavior1", type: "DraggableBehavior::Draggable"}], variables: []});
|
||||
runtimeScene.addObject(object);
|
||||
runtimeScene.addObject(object2);
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
18
Extensions/Effects/blending-mode-pixi-filter.js
Normal file
18
Extensions/Effects/blending-mode-pixi-filter.js
Normal file
@@ -0,0 +1,18 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('BlendingMode', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var blendingModeFilter = new PIXI.filters.AlphaFilter();
|
||||
|
||||
return blendingModeFilter;
|
||||
},
|
||||
update: function(filter, layer) {},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'alpha') {
|
||||
filter.alpha = value;
|
||||
}
|
||||
if (parameterName === 'blendmode') {
|
||||
filter.blendMode = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {},
|
||||
});
|
@@ -14,7 +14,7 @@ gdjs.PixiFiltersTools.registerFilterCreator('Blur', {
|
||||
return;
|
||||
|
||||
if (parameterName === 'kernelSize') {
|
||||
value = gdjs.PixiFiltersTools.clampKernelSize(value);
|
||||
value = gdjs.PixiFiltersTools.clampKernelSize(value, 5, 15);
|
||||
}
|
||||
|
||||
filter[parameterName] = value;
|
||||
|
27
Extensions/Effects/bulge-pinch-pixi-filter.js
Normal file
27
Extensions/Effects/bulge-pinch-pixi-filter.js
Normal file
@@ -0,0 +1,27 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('BulgePinch', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var bulgePinchFilter = new PIXI.filters.BulgePinchFilter();
|
||||
|
||||
return bulgePinchFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'centerX') {
|
||||
filter.center[0] = value;
|
||||
}
|
||||
else if (parameterName === 'centerY') {
|
||||
filter.center[1] = value;
|
||||
}
|
||||
else if (parameterName === 'radius') {
|
||||
filter.radius = value;
|
||||
}
|
||||
else if (parameterName === 'strength') {
|
||||
filter.strength = gdjs.PixiFiltersTools.clampValue(value, -1, 1);
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {
|
||||
},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {
|
||||
},
|
||||
});
|
22
Extensions/Effects/color-replace-pixi-filter.js
Normal file
22
Extensions/Effects/color-replace-pixi-filter.js
Normal file
@@ -0,0 +1,22 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('ColorReplace', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var colorReplaceFilter = new PIXI.filters.ColorReplaceFilter();
|
||||
|
||||
return colorReplaceFilter;
|
||||
},
|
||||
update: function(filter, layer) {},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'epsilon') {
|
||||
filter.epsilon = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'originalColor') {
|
||||
filter.originalColor = parseInt(value.replace('#', '0x'), 16);
|
||||
}
|
||||
else if (parameterName === 'newColor') {
|
||||
filter.newColor = parseInt(value.replace('#', '0x'), 16);
|
||||
}
|
||||
},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {},
|
||||
});
|
@@ -1,13 +1,20 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('CRT', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var crtFilter = new PIXI.filters.CRTFilter();
|
||||
|
||||
crtFilter._animationTimer = 0;
|
||||
return crtFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
if (filter.animated) {
|
||||
filter.time += layer.getElapsedTime() / 1000;
|
||||
filter.seed = Math.random();
|
||||
if (filter.animationSpeed !== 0) {
|
||||
// Multiply by 10 so that the default value is a sensible speed
|
||||
filter.time += layer.getElapsedTime() / 1000 * 10 * filter.animationSpeed;
|
||||
}
|
||||
if (filter.animationFrequency !== 0) {
|
||||
filter._animationTimer += layer.getElapsedTime() / 1000;
|
||||
if (filter._animationTimer >= 1 / filter.animationFrequency) {
|
||||
filter.seed = Math.random();
|
||||
filter._animationTimer = 0;
|
||||
}
|
||||
}
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
@@ -27,6 +34,10 @@ gdjs.PixiFiltersTools.registerFilterCreator('CRT', {
|
||||
filter.vignettingAlpha = value;
|
||||
} else if (parameterName === 'vignettingBlur') {
|
||||
filter.vignettingBlur = value;
|
||||
} else if (parameterName === 'animationSpeed') {
|
||||
filter.animationSpeed = value;
|
||||
} else if (parameterName === 'animationFrequency') {
|
||||
filter.animationFrequency = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {},
|
||||
@@ -34,8 +45,5 @@ gdjs.PixiFiltersTools.registerFilterCreator('CRT', {
|
||||
if (parameterName === 'verticalLine') {
|
||||
filter.verticalLine = value;
|
||||
}
|
||||
if (parameterName === 'animated') {
|
||||
filter.animated = value;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
18
Extensions/Effects/dot-pixi-filter.js
Normal file
18
Extensions/Effects/dot-pixi-filter.js
Normal file
@@ -0,0 +1,18 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('Dot', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var dotFilter = new PIXI.filters.DotFilter();
|
||||
|
||||
return dotFilter;
|
||||
},
|
||||
update: function(filter, layer) {},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'scale') {
|
||||
filter.scale = value;
|
||||
}
|
||||
else if (parameterName === 'angle') {
|
||||
filter.angle = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {},
|
||||
});
|
64
Extensions/Effects/glitch-pixi-filter.js
Normal file
64
Extensions/Effects/glitch-pixi-filter.js
Normal file
@@ -0,0 +1,64 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('Glitch', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var glitchFilter = new PIXI.filters.GlitchFilter();
|
||||
glitchFilter._animationTimer = 0;
|
||||
return glitchFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
if (filter.animationFrequency !== 0) {
|
||||
filter._animationTimer += layer.getElapsedTime() / 1000;
|
||||
if (filter._animationTimer >= 1 / filter.animationFrequency) {
|
||||
filter.seed = Math.random();
|
||||
filter._animationTimer = 0;
|
||||
}
|
||||
}
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'slices') {
|
||||
filter.slices = value;
|
||||
}
|
||||
else if (parameterName === 'offset') {
|
||||
filter.offset = value;
|
||||
}
|
||||
else if (parameterName === 'direction') {
|
||||
filter.direction = value;
|
||||
}
|
||||
else if (parameterName === 'fillMode') {
|
||||
filter.fillMode = value;
|
||||
}
|
||||
else if (parameterName === 'minSize') {
|
||||
filter.minSize = value;
|
||||
}
|
||||
else if (parameterName === 'sampleSize') {
|
||||
filter.sampleSize = value;
|
||||
}
|
||||
else if (parameterName === 'redX') {
|
||||
filter.red.x = value;
|
||||
}
|
||||
else if (parameterName === 'redY') {
|
||||
filter.red.y = value;
|
||||
}
|
||||
else if (parameterName === 'greenX') {
|
||||
filter.green.x = value;
|
||||
}
|
||||
else if (parameterName === 'greenY') {
|
||||
filter.green.y = value;
|
||||
}
|
||||
else if (parameterName === 'blueX') {
|
||||
filter.blue.x = value;
|
||||
}
|
||||
else if (parameterName === 'blueY') {
|
||||
filter.blue.y = value;
|
||||
}
|
||||
else if (parameterName === 'animationFrequency') {
|
||||
filter.animationFrequency = value;
|
||||
}
|
||||
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'average') {
|
||||
filter.average = value;
|
||||
}
|
||||
},
|
||||
});
|
@@ -5,8 +5,8 @@ gdjs.PixiFiltersTools.registerFilterCreator('Godray', {
|
||||
return godrayFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
if (filter.animated) {
|
||||
filter.time += layer.getElapsedTime() / 1000;
|
||||
if (filter.animationSpeed !== 0) {
|
||||
filter.time += layer.getElapsedTime() / 1000 * filter.animationSpeed;
|
||||
}
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
@@ -22,6 +22,8 @@ gdjs.PixiFiltersTools.registerFilterCreator('Godray', {
|
||||
filter.x = value;
|
||||
} else if (parameterName === 'y') {
|
||||
filter.y = value;
|
||||
} else if (parameterName === 'animationSpeed') {
|
||||
filter.animationSpeed = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {},
|
||||
@@ -29,8 +31,5 @@ gdjs.PixiFiltersTools.registerFilterCreator('Godray', {
|
||||
if (parameterName === 'parallel') {
|
||||
filter.parallel = value;
|
||||
}
|
||||
if (parameterName === 'animated') {
|
||||
filter.animated = value;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
50
Extensions/Effects/old-film-pixi-filter.js
Normal file
50
Extensions/Effects/old-film-pixi-filter.js
Normal file
@@ -0,0 +1,50 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('OldFilm', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var oldFilmFilter = new PIXI.filters.OldFilmFilter();
|
||||
oldFilmFilter._animationTimer = 0;
|
||||
return oldFilmFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
if (filter.animationFrequency !== 0) {
|
||||
filter._animationTimer += layer.getElapsedTime() / 1000;
|
||||
if (filter._animationTimer >= 1 / filter.animationFrequency) {
|
||||
filter.seed = Math.random();
|
||||
filter._animationTimer = 0;
|
||||
}
|
||||
}
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'sepia') {
|
||||
filter.sepia = value;
|
||||
}
|
||||
else if (parameterName === 'noise') {
|
||||
filter.noise = value;
|
||||
}
|
||||
else if (parameterName === 'noiseSize') {
|
||||
filter.noiseSize = value;
|
||||
}
|
||||
else if (parameterName === 'scratch') {
|
||||
filter.scratch = value;
|
||||
}
|
||||
else if (parameterName === 'scratchDensity') {
|
||||
filter.scratchDensity = value;
|
||||
}
|
||||
else if (parameterName === 'scratchWidth') {
|
||||
filter.scratchWidth = value;
|
||||
}
|
||||
else if (parameterName === 'vignetting') {
|
||||
filter.vignetting = value;
|
||||
}
|
||||
else if (parameterName === 'vignettingAlpha') {
|
||||
filter.vignettingAlpha = value;
|
||||
}
|
||||
else if (parameterName === 'vignettingBlur') {
|
||||
filter.vignettingBlur = value;
|
||||
}
|
||||
else if (parameterName === 'animationFrequency') {
|
||||
filter.animationFrequency = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {},
|
||||
});
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n(t.__filters={},t.PIXI)}(this,function(t,n){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform float gamma;\nuniform float contrast;\nuniform float saturation;\nuniform float brightness;\nuniform float red;\nuniform float green;\nuniform float blue;\nuniform float alpha;\n\nvoid main(void)\n{\n vec4 c = texture2D(uSampler, vTextureCoord);\n\n if (c.a > 0.0) {\n c.rgb /= c.a;\n\n vec3 rgb = pow(c.rgb, vec3(1. / gamma));\n rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, saturation), contrast);\n rgb.r *= red;\n rgb.g *= green;\n rgb.b *= blue;\n c.rgb = rgb * brightness;\n\n c.rgb *= c.a;\n }\n\n gl_FragColor = c * alpha;\n}\n",i=function(t){function n(n){t.call(this,r,e),Object.assign(this,{gamma:1,saturation:1,contrast:1,brightness:1,red:1,green:1,blue:1,alpha:1},n)}return t&&(n.__proto__=t),n.prototype=Object.create(t&&t.prototype),n.prototype.constructor=n,n.prototype.apply=function(t,n,r,e){this.uniforms.gamma=Math.max(this.gamma,1e-4),this.uniforms.saturation=this.saturation,this.uniforms.contrast=this.contrast,this.uniforms.brightness=this.brightness,this.uniforms.red=this.red,this.uniforms.green=this.green,this.uniforms.blue=this.blue,this.uniforms.alpha=this.alpha,t.applyFilter(this,n,r,e)},n}(n.Filter);t.AdjustmentFilter=i,Object.defineProperty(t,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-adjustment.js.map
|
||||
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("pixi.js"),require("@pixi/filter-kawase-blur")):"function"==typeof define&&define.amd?define(["exports","pixi.js","@pixi/filter-kawase-blur"],t):t(e.__filters={},e.PIXI,e.PIXI.filters)}(this,function(e,t,r){"use strict";var o="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",i="\nuniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform float threshold;\n\nvoid main() {\n vec4 color = texture2D(uSampler, vTextureCoord);\n\n // A simple & fast algorithm for getting brightness.\n // It's inaccuracy , but good enought for this feature.\n float _max = max(max(color.r, color.g), color.b);\n float _min = min(min(color.r, color.g), color.b);\n float brightness = (_max + _min) * 0.5;\n\n if(brightness > threshold) {\n gl_FragColor = color;\n } else {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n }\n}\n",n=function(e){function t(t){void 0===t&&(t=.5),e.call(this,o,i),this.threshold=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var r={threshold:{configurable:!0}};return r.threshold.get=function(){return this.uniforms.threshold},r.threshold.set=function(e){this.uniforms.threshold=e},Object.defineProperties(t.prototype,r),t}(t.Filter),l="uniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D bloomTexture;\nuniform float bloomScale;\nuniform float brightness;\n\nvoid main() {\n vec4 color = texture2D(uSampler, vTextureCoord);\n color.rgb *= brightness;\n vec4 bloomColor = vec4(texture2D(bloomTexture, vTextureCoord).rgb, 0.0);\n bloomColor.rgb *= bloomScale;\n gl_FragColor = color + bloomColor;\n}\n",s=function(e){function i(i){e.call(this,o,l),"number"==typeof i&&(i={threshold:i}),i=Object.assign({threshold:.5,bloomScale:1,brightness:1,kernels:null,blur:8,quality:4,pixelSize:1,resolution:t.settings.RESOLUTION},i),this.bloomScale=i.bloomScale,this.brightness=i.brightness;var s=i.kernels,u=i.blur,a=i.quality,c=i.pixelSize,h=i.resolution;this._extractFilter=new n(i.threshold),this._extractFilter.resolution=h,this._blurFilter=s?new r.KawaseBlurFilter(s):new r.KawaseBlurFilter(u,a),this.pixelSize=c,this.resolution=h}e&&(i.__proto__=e),i.prototype=Object.create(e&&e.prototype),i.prototype.constructor=i;var s={resolution:{configurable:!0},threshold:{configurable:!0},kernels:{configurable:!0},blur:{configurable:!0},quality:{configurable:!0},pixelSize:{configurable:!0}};return i.prototype.apply=function(e,t,r,o,i){var n=e.getRenderTarget(!0);this._extractFilter.apply(e,t,n,!0,i);var l=e.getRenderTarget(!0);this._blurFilter.apply(e,n,l,!0,i),this.uniforms.bloomScale=this.bloomScale,this.uniforms.brightness=this.brightness,this.uniforms.bloomTexture=l,e.applyFilter(this,t,r,o),e.returnRenderTarget(l),e.returnRenderTarget(n)},s.resolution.get=function(){return this._resolution},s.resolution.set=function(e){this._resolution=e,this._extractFilter&&(this._extractFilter.resolution=e),this._blurFilter&&(this._blurFilter.resolution=e)},s.threshold.get=function(){return this._extractFilter.threshold},s.threshold.set=function(e){this._extractFilter.threshold=e},s.kernels.get=function(){return this._blurFilter.kernels},s.kernels.set=function(e){this._blurFilter.kernels=e},s.blur.get=function(){return this._blurFilter.blur},s.blur.set=function(e){this._blurFilter.blur=e},s.quality.get=function(){return this._blurFilter.quality},s.quality.set=function(e){this._blurFilter.quality=e},s.pixelSize.get=function(){return this._blurFilter.pixelSize},s.pixelSize.set=function(e){this._blurFilter.pixelSize=e},Object.defineProperties(i.prototype,s),i}(t.Filter);e.AdvancedBloomFilter=s,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-advanced-bloom.js.map
|
||||
|
8
Extensions/Effects/pixi-filters/filter-alpha.js
Normal file
8
Extensions/Effects/pixi-filters/filter-alpha.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*!
|
||||
* @pixi/filter-alpha - v5.2.1
|
||||
* Compiled Tue, 28 Jan 2020 23:33:11 UTC
|
||||
*
|
||||
* @pixi/filter-alpha is licensed under the MIT License.
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
this.PIXI=this.PIXI||{},this.PIXI.filters=this.PIXI.filters||{};var _pixi_filter_alpha=function(t,r){"use strict";var e="varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float uAlpha;\n\nvoid main(void)\n{\n gl_FragColor = texture2D(uSampler, vTextureCoord) * uAlpha;\n}\n",i=function(t){function i(i){void 0===i&&(i=1),t.call(this,r.defaultVertex,e,{uAlpha:1}),this.alpha=i}t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i;var a={alpha:{configurable:!0}};return a.alpha.get=function(){return this.uniforms.uAlpha},a.alpha.set=function(t){this.uniforms.uAlpha=t},Object.defineProperties(i.prototype,a),i}(r.Filter);return t.AlphaFilter=i,t}({},PIXI);Object.assign(this.PIXI.filters,_pixi_filter_alpha);
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n(e.__filters={},e.PIXI)}(this,function(e,n){"use strict";var o="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\n\nuniform vec4 filterArea;\nuniform float pixelSize;\nuniform sampler2D uSampler;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 pixelate(vec2 coord, vec2 size)\n{\n return floor( coord / size ) * size;\n}\n\nvec2 getMod(vec2 coord, vec2 size)\n{\n return mod( coord , size) / size;\n}\n\nfloat character(float n, vec2 p)\n{\n p = floor(p*vec2(4.0, -4.0) + 2.5);\n if (clamp(p.x, 0.0, 4.0) == p.x && clamp(p.y, 0.0, 4.0) == p.y)\n {\n if (int(mod(n/exp2(p.x + 5.0*p.y), 2.0)) == 1) return 1.0;\n }\n return 0.0;\n}\n\nvoid main()\n{\n vec2 coord = mapCoord(vTextureCoord);\n\n // get the rounded color..\n vec2 pixCoord = pixelate(coord, vec2(pixelSize));\n pixCoord = unmapCoord(pixCoord);\n\n vec4 color = texture2D(uSampler, pixCoord);\n\n // determine the character to use\n float gray = (color.r + color.g + color.b) / 3.0;\n\n float n = 65536.0; // .\n if (gray > 0.2) n = 65600.0; // :\n if (gray > 0.3) n = 332772.0; // *\n if (gray > 0.4) n = 15255086.0; // o\n if (gray > 0.5) n = 23385164.0; // &\n if (gray > 0.6) n = 15252014.0; // 8\n if (gray > 0.7) n = 13199452.0; // @\n if (gray > 0.8) n = 11512810.0; // #\n\n // get the mod..\n vec2 modd = getMod(coord, vec2(pixelSize));\n\n gl_FragColor = color * character( n, vec2(-1.0) + modd * 2.0);\n\n}",t=function(e){function n(n){void 0===n&&(n=8),e.call(this,o,r),this.size=n}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var t={size:{configurable:!0}};return t.size.get=function(){return this.uniforms.pixelSize},t.size.set=function(e){this.uniforms.pixelSize=e},Object.defineProperties(n.prototype,t),n}(n.Filter);e.AsciiFilter=t,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-ascii.js.map
|
||||
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],t):t(o.__filters={},o.PIXI)}(this,function(o,t){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",i="precision mediump float;\n\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform float transformX;\nuniform float transformY;\nuniform vec3 lightColor;\nuniform float lightAlpha;\nuniform vec3 shadowColor;\nuniform float shadowAlpha;\n\nvoid main(void) {\n vec2 transform = vec2(1.0 / filterArea) * vec2(transformX, transformY);\n vec4 color = texture2D(uSampler, vTextureCoord);\n float light = texture2D(uSampler, vTextureCoord - transform).a;\n float shadow = texture2D(uSampler, vTextureCoord + transform).a;\n\n color.rgb = mix(color.rgb, lightColor, clamp((color.a - light) * lightAlpha, 0.0, 1.0));\n color.rgb = mix(color.rgb, shadowColor, clamp((color.a - shadow) * shadowAlpha, 0.0, 1.0));\n gl_FragColor = vec4(color.rgb * color.a, color.a);\n}\n",n=function(o){function n(t){void 0===t&&(t={}),o.call(this,r,i),this.uniforms.lightColor=new Float32Array(3),this.uniforms.shadowColor=new Float32Array(3),t=Object.assign({rotation:45,thickness:2,lightColor:16777215,lightAlpha:.7,shadowColor:0,shadowAlpha:.7},t),this.rotation=t.rotation,this.thickness=t.thickness,this.lightColor=t.lightColor,this.lightAlpha=t.lightAlpha,this.shadowColor=t.shadowColor,this.shadowAlpha=t.shadowAlpha}o&&(n.__proto__=o),n.prototype=Object.create(o&&o.prototype),n.prototype.constructor=n;var e={rotation:{configurable:!0},thickness:{configurable:!0},lightColor:{configurable:!0},lightAlpha:{configurable:!0},shadowColor:{configurable:!0},shadowAlpha:{configurable:!0}};return n.prototype._updateTransform=function(){this.uniforms.transformX=this._thickness*Math.cos(this._angle),this.uniforms.transformY=this._thickness*Math.sin(this._angle)},e.rotation.get=function(){return this._angle/t.DEG_TO_RAD},e.rotation.set=function(o){this._angle=o*t.DEG_TO_RAD,this._updateTransform()},e.thickness.get=function(){return this._thickness},e.thickness.set=function(o){this._thickness=o,this._updateTransform()},e.lightColor.get=function(){return t.utils.rgb2hex(this.uniforms.lightColor)},e.lightColor.set=function(o){t.utils.hex2rgb(o,this.uniforms.lightColor)},e.lightAlpha.get=function(){return this.uniforms.lightAlpha},e.lightAlpha.set=function(o){this.uniforms.lightAlpha=o},e.shadowColor.get=function(){return t.utils.rgb2hex(this.uniforms.shadowColor)},e.shadowColor.set=function(o){t.utils.hex2rgb(o,this.uniforms.shadowColor)},e.shadowAlpha.get=function(){return this.uniforms.shadowAlpha},e.shadowAlpha.set=function(o){this.uniforms.shadowAlpha=o},Object.defineProperties(n.prototype,e),n}(t.Filter);o.BevelFilter=n,Object.defineProperty(o,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-bevel.js.map
|
||||
|
8
Extensions/Effects/pixi-filters/filter-bulge-pinch.js
Normal file
8
Extensions/Effects/pixi-filters/filter-bulge-pinch.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*!
|
||||
* @pixi/filter-bulge-pinch - v2.7.0
|
||||
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
|
||||
*
|
||||
* @pixi/filter-bulge-pinch is licensed under the MIT License.
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n((e=e||self).__filters={},e.PIXI)}(this,function(e,n){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="uniform float radius;\nuniform float strength;\nuniform vec2 center;\nuniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\n\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nuniform vec2 dimensions;\n\nvoid main()\n{\n vec2 coord = vTextureCoord * filterArea.xy;\n coord -= center * dimensions.xy;\n float distance = length(coord);\n if (distance < radius) {\n float percent = distance / radius;\n if (strength > 0.0) {\n coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75);\n } else {\n coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent);\n }\n }\n coord += center * dimensions.xy;\n coord /= filterArea.xy;\n vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw);\n vec4 color = texture2D(uSampler, clampedCoord);\n if (coord != clampedCoord) {\n color *= max(0.0, 1.0 - length(coord - clampedCoord));\n }\n\n gl_FragColor = color;\n}\n",o=function(e){function n(n,o,i){e.call(this,t,r),this.uniforms.dimensions=new Float32Array(2),this.center=n||[.5,.5],this.radius="number"==typeof o?o:100,this.strength="number"==typeof i?i:1}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var o={radius:{configurable:!0},strength:{configurable:!0},center:{configurable:!0}};return n.prototype.apply=function(e,n,t,r){this.uniforms.dimensions[0]=n.sourceFrame.width,this.uniforms.dimensions[1]=n.sourceFrame.height,e.applyFilter(this,n,t,r)},o.radius.get=function(){return this.uniforms.radius},o.radius.set=function(e){this.uniforms.radius=e},o.strength.get=function(){return this.uniforms.strength},o.strength.set=function(e){this.uniforms.strength=e},o.center.get=function(){return this.uniforms.center},o.center.set=function(e){this.uniforms.center=e},Object.defineProperties(n.prototype,o),n}(n.Filter);e.BulgePinchFilter=o,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
var __filters=function(e,i,t){"use strict";var o="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform sampler2D colorMap;\nuniform float _mix;\nuniform float _size;\nuniform float _sliceSize;\nuniform float _slicePixelSize;\nuniform float _sliceInnerSize;\nvoid main() {\n vec4 color = texture2D(uSampler, vTextureCoord.xy);\n\n vec4 adjusted;\n if (color.a > 0.0) {\n color.rgb /= color.a;\n float innerWidth = _size - 1.0;\n float zSlice0 = min(floor(color.b * innerWidth), innerWidth);\n float zSlice1 = min(zSlice0 + 1.0, innerWidth);\n float xOffset = _slicePixelSize * 0.5 + color.r * _sliceInnerSize;\n float s0 = xOffset + (zSlice0 * _sliceSize);\n float s1 = xOffset + (zSlice1 * _sliceSize);\n float yOffset = _sliceSize * 0.5 + color.g * (1.0 - _sliceSize);\n vec4 slice0Color = texture2D(colorMap, vec2(s0,yOffset));\n vec4 slice1Color = texture2D(colorMap, vec2(s1,yOffset));\n float zOffset = fract(color.b * innerWidth);\n adjusted = mix(slice0Color, slice1Color, zOffset);\n\n color.rgb *= color.a;\n }\n gl_FragColor = vec4(mix(color, adjusted, _mix).rgb, color.a);\n\n}",s=function(e){function s(i,t,s){void 0===t&&(t=!1),void 0===s&&(s=1),e.call(this,o,r),this._size=0,this._sliceSize=0,this._slicePixelSize=0,this._sliceInnerSize=0,this._scaleMode=null,this._nearest=!1,this.nearest=t,this.mix=s,this.colorMap=i}e&&(s.__proto__=e),s.prototype=Object.create(e&&e.prototype),s.prototype.constructor=s;var n={colorSize:{configurable:!0},colorMap:{configurable:!0},nearest:{configurable:!0}};return s.prototype.apply=function(e,i,t,o){this.uniforms._mix=this.mix,e.applyFilter(this,i,t,o)},n.colorSize.get=function(){return this._size},n.colorMap.get=function(){return this._colorMap},n.colorMap.set=function(e){e instanceof i.Texture||(e=i.Texture.from(e)),e&&e.baseTexture&&(e.baseTexture.scaleMode=this._scaleMode,e.baseTexture.mipmap=!1,this._size=e.height,this._sliceSize=1/this._size,this._slicePixelSize=this._sliceSize/this._size,this._sliceInnerSize=this._slicePixelSize*(this._size-1),this.uniforms._size=this._size,this.uniforms._sliceSize=this._sliceSize,this.uniforms._slicePixelSize=this._slicePixelSize,this.uniforms._sliceInnerSize=this._sliceInnerSize,this.uniforms.colorMap=e),this._colorMap=e},n.nearest.get=function(){return this._nearest},n.nearest.set=function(e){this._nearest=e,this._scaleMode=e?t.SCALE_MODES.NEAREST:t.SCALE_MODES.LINEAR;var i=this._colorMap;i&&i.baseTexture&&(i.baseTexture._glTextures={},i.baseTexture.scaleMode=this._scaleMode,i.baseTexture.mipmap=!1,i._updateID++,i.baseTexture.emit("update",i.baseTexture))},s.prototype.updateColorMap=function(){var e=this._colorMap;e&&e.baseTexture&&(e._updateID++,e.baseTexture.emit("update",e.baseTexture),this.colorMap=e)},s.prototype.destroy=function(i){this._colorMap&&this._colorMap.destroy(i),e.prototype.destroy.call(this)},Object.defineProperties(s.prototype,n),s}(i.Filter);return e.ColorMapFilter=s,e}({},PIXI,PIXI);Object.assign(PIXI.filters,__filters);
|
||||
//# sourceMappingURL=filter-color-map.js.map
|
||||
|
8
Extensions/Effects/pixi-filters/filter-color-replace.js
Normal file
8
Extensions/Effects/pixi-filters/filter-color-replace.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*!
|
||||
* @pixi/filter-color-replace - v2.7.0
|
||||
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
|
||||
*
|
||||
* @pixi/filter-color-replace is licensed under the MIT License.
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(o,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],r):r((o=o||self).__filters={},o.PIXI)}(this,function(o,r){"use strict";var e="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",i="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec3 originalColor;\nuniform vec3 newColor;\nuniform float epsilon;\nvoid main(void) {\n vec4 currentColor = texture2D(uSampler, vTextureCoord);\n vec3 colorDiff = originalColor - (currentColor.rgb / max(currentColor.a, 0.0000000001));\n float colorDistance = length(colorDiff);\n float doReplace = step(colorDistance, epsilon);\n gl_FragColor = vec4(mix(currentColor.rgb, (newColor + colorDiff) * currentColor.a, doReplace), currentColor.a);\n}\n",n=function(o){function n(r,n,t){void 0===r&&(r=16711680),void 0===n&&(n=0),void 0===t&&(t=.4),o.call(this,e,i),this.uniforms.originalColor=new Float32Array(3),this.uniforms.newColor=new Float32Array(3),this.originalColor=r,this.newColor=n,this.epsilon=t}o&&(n.__proto__=o),n.prototype=Object.create(o&&o.prototype),n.prototype.constructor=n;var t={originalColor:{configurable:!0},newColor:{configurable:!0},epsilon:{configurable:!0}};return t.originalColor.set=function(o){var e=this.uniforms.originalColor;"number"==typeof o?(r.utils.hex2rgb(o,e),this._originalColor=o):(e[0]=o[0],e[1]=o[1],e[2]=o[2],this._originalColor=r.utils.rgb2hex(e))},t.originalColor.get=function(){return this._originalColor},t.newColor.set=function(o){var e=this.uniforms.newColor;"number"==typeof o?(r.utils.hex2rgb(o,e),this._newColor=o):(e[0]=o[0],e[1]=o[1],e[2]=o[2],this._newColor=r.utils.rgb2hex(e))},t.newColor.get=function(){return this._newColor},t.epsilon.set=function(o){this.uniforms.epsilon=o},t.epsilon.get=function(){return this.uniforms.epsilon},Object.defineProperties(n.prototype,t),n}(r.Filter);o.ColorReplaceFilter=n,Object.defineProperty(o,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
@@ -10,4 +10,3 @@
|
||||
* Modified the minified file to work on pixi4 by renaming filterFrame to sourceFrame below
|
||||
*/
|
||||
var __filters=function(n,i){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\nuniform vec2 dimensions;\n\nconst float SQRT_2 = 1.414213;\n\nconst float light = 1.0;\n\nuniform float curvature;\nuniform float lineWidth;\nuniform float lineContrast;\nuniform bool verticalLine;\nuniform float noise;\nuniform float noiseSize;\n\nuniform float vignetting;\nuniform float vignettingAlpha;\nuniform float vignettingBlur;\n\nuniform float seed;\nuniform float time;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main(void)\n{\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\n vec2 coord = pixelCoord / dimensions;\n\n vec2 dir = vec2(coord - vec2(0.5, 0.5));\n\n float _c = curvature > 0. ? curvature : 1.;\n float k = curvature > 0. ?(length(dir * dir) * 0.25 * _c * _c + 0.935 * _c) : 1.;\n vec2 uv = dir * k;\n\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n vec3 rgb = gl_FragColor.rgb;\n\n\n if (noise > 0.0 && noiseSize > 0.0)\n {\n pixelCoord.x = floor(pixelCoord.x / noiseSize);\n pixelCoord.y = floor(pixelCoord.y / noiseSize);\n float _noise = rand(pixelCoord * noiseSize * seed) - 0.5;\n rgb += _noise * noise;\n }\n\n if (lineWidth > 0.0) {\n float v = (verticalLine ? uv.x * dimensions.x : uv.y * dimensions.y) * min(1.0, 2.0 / lineWidth ) / _c;\n float j = 1. + cos(v * 1.2 - time) * 0.5 * lineContrast;\n rgb *= j;\n float segment = verticalLine ? mod((dir.x + .5) * dimensions.x, 4.) : mod((dir.y + .5) * dimensions.y, 4.);\n rgb *= 0.99 + ceil(segment) * 0.015;\n }\n\n if (vignetting > 0.0)\n {\n float outter = SQRT_2 - vignetting * SQRT_2;\n float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0);\n rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha);\n }\n\n gl_FragColor.rgb = rgb;\n}\n",r=function(n){function i(i){n.call(this,t,e),this.uniforms.dimensions=new Float32Array(2),this.time=0,this.seed=0,Object.assign(this,{curvature:1,lineWidth:1,lineContrast:.25,verticalLine:!1,noise:0,noiseSize:1,seed:0,vignetting:.3,vignettingAlpha:1,vignettingBlur:.3,time:0},i)}n&&(i.__proto__=n),i.prototype=Object.create(n&&n.prototype),i.prototype.constructor=i;var r={curvature:{configurable:!0},lineWidth:{configurable:!0},lineContrast:{configurable:!0},verticalLine:{configurable:!0},noise:{configurable:!0},noiseSize:{configurable:!0},vignetting:{configurable:!0},vignettingAlpha:{configurable:!0},vignettingBlur:{configurable:!0}};return i.prototype.apply=function(n,i,t,e){this.uniforms.dimensions[0]=i.sourceFrame.width,this.uniforms.dimensions[1]=i.sourceFrame.height,this.uniforms.seed=this.seed,this.uniforms.time=this.time,n.applyFilter(this,i,t,e)},r.curvature.set=function(n){this.uniforms.curvature=n},r.curvature.get=function(){return this.uniforms.curvature},r.lineWidth.set=function(n){this.uniforms.lineWidth=n},r.lineWidth.get=function(){return this.uniforms.lineWidth},r.lineContrast.set=function(n){this.uniforms.lineContrast=n},r.lineContrast.get=function(){return this.uniforms.lineContrast},r.verticalLine.set=function(n){this.uniforms.verticalLine=n},r.verticalLine.get=function(){return this.uniforms.verticalLine},r.noise.set=function(n){this.uniforms.noise=n},r.noise.get=function(){return this.uniforms.noise},r.noiseSize.set=function(n){this.uniforms.noiseSize=n},r.noiseSize.get=function(){return this.uniforms.noiseSize},r.vignetting.set=function(n){this.uniforms.vignetting=n},r.vignetting.get=function(){return this.uniforms.vignetting},r.vignettingAlpha.set=function(n){this.uniforms.vignettingAlpha=n},r.vignettingAlpha.get=function(){return this.uniforms.vignettingAlpha},r.vignettingBlur.set=function(n){this.uniforms.vignettingBlur=n},r.vignettingBlur.get=function(){return this.uniforms.vignettingBlur},Object.defineProperties(i.prototype,r),i}(i.Filter);return n.CRTFilter=r,n}({},PIXI);Object.assign(PIXI.filters,__filters);
|
||||
//# sourceMappingURL=filter-crt.js.map
|
||||
|
8
Extensions/Effects/pixi-filters/filter-dot.js
Normal file
8
Extensions/Effects/pixi-filters/filter-dot.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*!
|
||||
* @pixi/filter-dot - v2.7.0
|
||||
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
|
||||
*
|
||||
* @pixi/filter-dot is licensed under the MIT License.
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n((e=e||self).__filters={},e.PIXI)}(this,function(e,n){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",o="precision mediump float;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform vec4 filterArea;\nuniform sampler2D uSampler;\n\nuniform float angle;\nuniform float scale;\n\nfloat pattern()\n{\n float s = sin(angle), c = cos(angle);\n vec2 tex = vTextureCoord * filterArea.xy;\n vec2 point = vec2(\n c * tex.x - s * tex.y,\n s * tex.x + c * tex.y\n ) * scale;\n return (sin(point.x) * sin(point.y)) * 4.0;\n}\n\nvoid main()\n{\n vec4 color = texture2D(uSampler, vTextureCoord);\n float average = (color.r + color.g + color.b) / 3.0;\n gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);\n}\n",r=function(e){function n(n,r){void 0===n&&(n=1),void 0===r&&(r=5),e.call(this,t,o),this.scale=n,this.angle=r}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var r={scale:{configurable:!0},angle:{configurable:!0}};return r.scale.get=function(){return this.uniforms.scale},r.scale.set=function(e){this.uniforms.scale=e},r.angle.get=function(){return this.uniforms.angle},r.angle.set=function(e){this.uniforms.angle=e},Object.defineProperties(n.prototype,r),n}(n.Filter);e.DotFilter=r,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports,require("@pixi/filter-kawase-blur"),require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","@pixi/filter-kawase-blur","pixi.js"],i):i(t.__filters={},t.PIXI.filters,t.PIXI)}(this,function(t,i,e){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",n="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform float alpha;\nuniform vec3 color;\nvoid main(void){\n vec4 sample = texture2D(uSampler, vTextureCoord);\n\n // Un-premultiply alpha before applying the color\n if (sample.a > 0.0) {\n sample.rgb /= sample.a;\n }\n\n // Premultiply alpha again\n sample.rgb = color.rgb * sample.a;\n\n // alpha user alpha\n sample *= alpha;\n\n gl_FragColor = sample;\n}",o=function(t){function o(o){o&&o.constructor!==Object&&(console.warn("DropShadowFilter now uses options instead of (rotation, distance, blur, color, alpha)"),o={rotation:o},void 0!==arguments[1]&&(o.distance=arguments[1]),void 0!==arguments[2]&&(o.blur=arguments[2]),void 0!==arguments[3]&&(o.color=arguments[3]),void 0!==arguments[4]&&(o.alpha=arguments[4])),o=Object.assign({rotation:45,distance:5,color:0,alpha:.5,shadowOnly:!1,kernels:null,blur:2,quality:3,pixelSize:1,resolution:e.settings.RESOLUTION},o),t.call(this);var l=o.kernels,a=o.blur,s=o.quality,u=o.pixelSize,c=o.resolution;this._tintFilter=new e.Filter(r,n),this._tintFilter.uniforms.color=new Float32Array(4),this._tintFilter.resolution=c,this._blurFilter=l?new i.KawaseBlurFilter(l):new i.KawaseBlurFilter(a,s),this.pixelSize=u,this.resolution=c,this.targetTransform=new e.Matrix;var p=o.shadowOnly,h=o.rotation,f=o.distance,d=o.alpha,g=o.color;this.shadowOnly=p,this.rotation=h,this.distance=f,this.alpha=d,this.color=g,this._updatePadding()}t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o;var l={resolution:{configurable:!0},distance:{configurable:!0},rotation:{configurable:!0},alpha:{configurable:!0},color:{configurable:!0},kernels:{configurable:!0},blur:{configurable:!0},quality:{configurable:!0},pixelSize:{configurable:!0}};return o.prototype.apply=function(t,i,e,r){var n=t.getRenderTarget();n.transform=this.targetTransform,this._tintFilter.apply(t,i,n,!0),n.transform=null,this._blurFilter.apply(t,n,e,r),!0!==this.shadowOnly&&t.applyFilter(this,i,e,!1),t.returnRenderTarget(n)},o.prototype._updatePadding=function(){this.padding=this.distance+2*this.blur},o.prototype._updateTargetTransform=function(){this.targetTransform.tx=this.distance*Math.cos(this.angle),this.targetTransform.ty=this.distance*Math.sin(this.angle)},l.resolution.get=function(){return this._resolution},l.resolution.set=function(t){this._resolution=t,this._tintFilter&&(this._tintFilter.resolution=t),this._blurFilter&&(this._blurFilter.resolution=t)},l.distance.get=function(){return this._distance},l.distance.set=function(t){this._distance=t,this._updatePadding(),this._updateTargetTransform()},l.rotation.get=function(){return this.angle/e.DEG_TO_RAD},l.rotation.set=function(t){this.angle=t*e.DEG_TO_RAD,this._updateTargetTransform()},l.alpha.get=function(){return this._tintFilter.uniforms.alpha},l.alpha.set=function(t){this._tintFilter.uniforms.alpha=t},l.color.get=function(){return e.utils.rgb2hex(this._tintFilter.uniforms.color)},l.color.set=function(t){e.utils.hex2rgb(t,this._tintFilter.uniforms.color)},l.kernels.get=function(){return this._blurFilter.kernels},l.kernels.set=function(t){this._blurFilter.kernels=t},l.blur.get=function(){return this._blurFilter.blur},l.blur.set=function(t){this._blurFilter.blur=t,this._updatePadding()},l.quality.get=function(){return this._blurFilter.quality},l.quality.set=function(t){this._blurFilter.quality=t},l.pixelSize.get=function(){return this._blurFilter.pixelSize},l.pixelSize.set=function(t){this._blurFilter.pixelSize=t},Object.defineProperties(o.prototype,l),o}(e.Filter);t.DropShadowFilter=o,Object.defineProperty(t,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-drop-shadow.js.map
|
||||
|
8
Extensions/Effects/pixi-filters/filter-glitch.js
Normal file
8
Extensions/Effects/pixi-filters/filter-glitch.js
Normal file
File diff suppressed because one or more lines are too long
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(o,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],t):t(o.__filters={},o.PIXI)}(this,function(o,t){"use strict";var n="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler;\n\nuniform float distance;\nuniform float outerStrength;\nuniform float innerStrength;\nuniform vec4 glowColor;\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nconst float PI = 3.14159265358979323846264;\n\nvoid main(void) {\n vec2 px = vec2(1.0 / filterArea.x, 1.0 / filterArea.y);\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\n vec4 curColor;\n float totalAlpha = 0.0;\n float maxTotalAlpha = 0.0;\n float cosAngle;\n float sinAngle;\n vec2 displaced;\n for (float angle = 0.0; angle <= PI * 2.0; angle += %QUALITY_DIST%) {\n cosAngle = cos(angle);\n sinAngle = sin(angle);\n for (float curDistance = 1.0; curDistance <= %DIST%; curDistance++) {\n displaced.x = vTextureCoord.x + cosAngle * curDistance * px.x;\n displaced.y = vTextureCoord.y + sinAngle * curDistance * px.y;\n curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\n totalAlpha += (distance - curDistance) * curColor.a;\n maxTotalAlpha += (distance - curDistance);\n }\n }\n maxTotalAlpha = max(maxTotalAlpha, 0.0001);\n\n ownColor.a = max(ownColor.a, 0.0001);\n ownColor.rgb = ownColor.rgb / ownColor.a;\n float outerGlowAlpha = (totalAlpha / maxTotalAlpha) * outerStrength * (1. - ownColor.a);\n float innerGlowAlpha = ((maxTotalAlpha - totalAlpha) / maxTotalAlpha) * innerStrength * ownColor.a;\n float resultAlpha = (ownColor.a + outerGlowAlpha);\n gl_FragColor = vec4(mix(mix(ownColor.rgb, glowColor.rgb, innerGlowAlpha / ownColor.a), glowColor.rgb, outerGlowAlpha / resultAlpha) * resultAlpha, resultAlpha);\n}\n",r=function(o){function r(t,r,i,l,a){void 0===t&&(t=10),void 0===r&&(r=4),void 0===i&&(i=0),void 0===l&&(l=16777215),void 0===a&&(a=.1),o.call(this,n,e.replace(/%QUALITY_DIST%/gi,""+(1/a/t).toFixed(7)).replace(/%DIST%/gi,""+t.toFixed(7))),this.uniforms.glowColor=new Float32Array([0,0,0,1]),this.distance=t,this.color=l,this.outerStrength=r,this.innerStrength=i}o&&(r.__proto__=o),r.prototype=Object.create(o&&o.prototype),r.prototype.constructor=r;var i={color:{configurable:!0},distance:{configurable:!0},outerStrength:{configurable:!0},innerStrength:{configurable:!0}};return i.color.get=function(){return t.utils.rgb2hex(this.uniforms.glowColor)},i.color.set=function(o){t.utils.hex2rgb(o,this.uniforms.glowColor)},i.distance.get=function(){return this.uniforms.distance},i.distance.set=function(o){this.uniforms.distance=o},i.outerStrength.get=function(){return this.uniforms.outerStrength},i.outerStrength.set=function(o){this.uniforms.outerStrength=o},i.innerStrength.get=function(){return this.uniforms.innerStrength},i.innerStrength.set=function(o){this.uniforms.innerStrength=o},Object.defineProperties(r.prototype,i),r}(t.Filter);o.GlowFilter=r,Object.defineProperty(o,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-glow.js.map
|
||||
|
File diff suppressed because one or more lines are too long
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],t):t(e.__filters={},e.PIXI)}(this,function(e,t){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",i="\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 uOffset;\n\nvoid main(void)\n{\n vec4 color = vec4(0.0);\n\n // Sample top left pixel\n color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y));\n\n // Sample top right pixel\n color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y));\n\n // Sample bottom right pixel\n color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y));\n\n // Sample bottom left pixel\n color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y));\n\n // Average\n color *= 0.25;\n\n gl_FragColor = color;\n}",o="\nvarying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 uOffset;\nuniform vec4 filterClamp;\n\nvoid main(void)\n{\n vec4 color = vec4(0.0);\n\n // Sample top left pixel\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\n\n // Sample top right pixel\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\n\n // Sample bottom right pixel\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\n\n // Sample bottom left pixel\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\n\n // Average\n color *= 0.25;\n\n gl_FragColor = color;\n}\n",n=function(e){function n(n,l,u){void 0===n&&(n=4),void 0===l&&(l=3),void 0===u&&(u=!1),e.call(this,r,u?o:i),this.uniforms.uOffset=new Float32Array(2),this._pixelSize=new t.Point,this.pixelSize=1,this._clamp=u,this._kernels=null,Array.isArray(n)?this.kernels=n:(this._blur=n,this.quality=l)}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var l={kernels:{configurable:!0},clamp:{configurable:!0},pixelSize:{configurable:!0},quality:{configurable:!0},blur:{configurable:!0}};return n.prototype.apply=function(e,t,r,i){var o,n=this.pixelSize.x/t.size.width,l=this.pixelSize.y/t.size.height;if(1===this._quality||0===this._blur)o=this._kernels[0]+.5,this.uniforms.uOffset[0]=o*n,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,t,r,i);else{for(var u,s=e.getRenderTarget(!0),f=t,a=s,p=this._quality-1,x=0;x<p;x++)o=this._kernels[x]+.5,this.uniforms.uOffset[0]=o*n,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,f,a,!0),u=f,f=a,a=u;o=this._kernels[p]+.5,this.uniforms.uOffset[0]=o*n,this.uniforms.uOffset[1]=o*l,e.applyFilter(this,f,r,i),e.returnRenderTarget(s)}},n.prototype._generateKernels=function(){var e=this._blur,t=this._quality,r=[e];if(e>0)for(var i=e,o=e/t,n=1;n<t;n++)i-=o,r.push(i);this._kernels=r},l.kernels.get=function(){return this._kernels},l.kernels.set=function(e){Array.isArray(e)&&e.length>0?(this._kernels=e,this._quality=e.length,this._blur=Math.max.apply(Math,e)):(this._kernels=[0],this._quality=1)},l.clamp.get=function(){return this._clamp},l.pixelSize.set=function(e){"number"==typeof e?(this._pixelSize.x=e,this._pixelSize.y=e):Array.isArray(e)?(this._pixelSize.x=e[0],this._pixelSize.y=e[1]):e instanceof t.Point?(this._pixelSize.x=e.x,this._pixelSize.y=e.y):(this._pixelSize.x=1,this._pixelSize.y=1)},l.pixelSize.get=function(){return this._pixelSize},l.quality.get=function(){return this._quality},l.quality.set=function(e){this._quality=Math.max(1,Math.round(e)),this._generateKernels()},l.blur.get=function(){return this._blur},l.blur.set=function(e){this._blur=e,this._generateKernels()},Object.defineProperties(n.prototype,l),n}(t.Filter);e.KawaseBlurFilter=n,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-kawase-blur.js.map
|
||||
|
8
Extensions/Effects/pixi-filters/filter-old-film.js
Normal file
8
Extensions/Effects/pixi-filters/filter-old-film.js
Normal file
File diff suppressed because one or more lines are too long
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],o):o(e.__filters={},e.PIXI)}(this,function(e,o){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec2 thickness;\nuniform vec4 outlineColor;\nuniform vec4 filterClamp;\n\nconst float DOUBLE_PI = 3.14159265358979323846264 * 2.;\n\nvoid main(void) {\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\n vec4 curColor;\n float maxAlpha = 0.;\n vec2 displaced;\n for (float angle = 0.; angle <= DOUBLE_PI; angle += ${angleStep}) {\n displaced.x = vTextureCoord.x + thickness.x * cos(angle);\n displaced.y = vTextureCoord.y + thickness.y * sin(angle);\n curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\n maxAlpha = max(maxAlpha, curColor.a);\n }\n float resultAlpha = max(maxAlpha, ownColor.a);\n gl_FragColor = vec4((ownColor.rgb + outlineColor.rgb * (1. - ownColor.a)) * resultAlpha, resultAlpha);\n}\n",n=function(e){function n(o,i,l){void 0===o&&(o=1),void 0===i&&(i=0),void 0===l&&(l=.1);var s=Math.max(l*n.MAX_SAMPLES,n.MIN_SAMPLES),a=(2*Math.PI/s).toFixed(7);e.call(this,t,r.replace(/\$\{angleStep\}/,a)),this.uniforms.thickness=new Float32Array([0,0]),this.thickness=o,this.uniforms.outlineColor=new Float32Array([0,0,0,1]),this.color=i,this.quality=l}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var i={color:{configurable:!0}};return n.prototype.apply=function(e,o,t,r){this.uniforms.thickness[0]=this.thickness/o.size.width,this.uniforms.thickness[1]=this.thickness/o.size.height,e.applyFilter(this,o,t,r)},i.color.get=function(){return o.utils.rgb2hex(this.uniforms.outlineColor)},i.color.set=function(e){o.utils.hex2rgb(e,this.uniforms.outlineColor)},Object.defineProperties(n.prototype,i),n}(o.Filter);n.MIN_SAMPLES=1,n.MAX_SAMPLES=100,e.OutlineFilter=n,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-outline.js.map
|
||||
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
var __filters=function(e,o){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",n="precision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform vec2 size;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 pixelate(vec2 coord, vec2 size)\n{\n\treturn floor( coord / size ) * size;\n}\n\nvoid main(void)\n{\n vec2 coord = mapCoord(vTextureCoord);\n\n coord = pixelate(coord, size);\n\n coord = unmapCoord(coord);\n\n gl_FragColor = texture2D(uSampler, coord);\n}\n",t=function(e){function o(o){void 0===o&&(o=10),e.call(this,r,n),this.size=o}e&&(o.__proto__=e),o.prototype=Object.create(e&&e.prototype),o.prototype.constructor=o;var t={size:{configurable:!0}};return t.size.get=function(){return this.uniforms.size},t.size.set=function(e){"number"==typeof e&&(e=[e,e]),this.uniforms.size=e},Object.defineProperties(o.prototype,t),o}(o.Filter);return e.PixelateFilter=t,e}({},PIXI);Object.assign(PIXI.filters,__filters);
|
||||
//# sourceMappingURL=filter-pixelate.js.map
|
||||
|
8
Extensions/Effects/pixi-filters/filter-radial-blur.js
Normal file
8
Extensions/Effects/pixi-filters/filter-radial-blur.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*!
|
||||
* @pixi/filter-radial-blur - v2.7.0
|
||||
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
|
||||
*
|
||||
* @pixi/filter-radial-blur is licensed under the MIT License.
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n((e=e||self).__filters={},e.PIXI)}(this,function(e,n){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform float uRadian;\nuniform vec2 uCenter;\nuniform float uRadius;\nuniform int uKernelSize;\n\nconst int MAX_KERNEL_SIZE = 2048;\n\nvoid main(void)\n{\n vec4 color = texture2D(uSampler, vTextureCoord);\n\n if (uKernelSize == 0)\n {\n gl_FragColor = color;\n return;\n }\n\n float aspect = filterArea.y / filterArea.x;\n vec2 center = uCenter.xy / filterArea.xy;\n float gradient = uRadius / filterArea.x * 0.3;\n float radius = uRadius / filterArea.x - gradient * 0.5;\n int k = uKernelSize - 1;\n\n vec2 coord = vTextureCoord;\n vec2 dir = vec2(center - coord);\n float dist = length(vec2(dir.x, dir.y * aspect));\n\n float radianStep = uRadian;\n if (radius >= 0.0 && dist > radius) {\n float delta = dist - radius;\n float gap = gradient;\n float scale = 1.0 - abs(delta / gap);\n if (scale <= 0.0) {\n gl_FragColor = color;\n return;\n }\n radianStep *= scale;\n }\n radianStep /= float(k);\n\n float s = sin(radianStep);\n float c = cos(radianStep);\n mat2 rotationMatrix = mat2(vec2(c, -s), vec2(s, c));\n\n for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) {\n if (i == k) {\n break;\n }\n\n coord -= center;\n coord.y *= aspect;\n coord = rotationMatrix * coord;\n coord.y /= aspect;\n coord += center;\n\n vec4 sample = texture2D(uSampler, coord);\n\n // switch to pre-multiplied alpha to correctly blur transparent images\n // sample.rgb *= sample.a;\n\n color += sample;\n }\n\n gl_FragColor = color / float(uKernelSize);\n}\n",i=function(e){function n(n,i,o,a){void 0===n&&(n=0),void 0===i&&(i=[0,0]),void 0===o&&(o=5),void 0===a&&(a=-1),e.call(this,t,r),this._angle=0,this.angle=n,this.center=i,this.kernelSize=o,this.radius=a}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var i={angle:{configurable:!0},center:{configurable:!0},radius:{configurable:!0}};return n.prototype.apply=function(e,n,t,r){this.uniforms.uKernelSize=0!==this._angle?this.kernelSize:0,e.applyFilter(this,n,t,r)},i.angle.set=function(e){this._angle=e,this.uniforms.uRadian=e*Math.PI/180},i.angle.get=function(){return this._angle},i.center.get=function(){return this.uniforms.uCenter},i.center.set=function(e){this.uniforms.uCenter=e},i.radius.get=function(){return this.uniforms.uRadius},i.radius.set=function(e){(e<0||e===1/0)&&(e=-1),this.uniforms.uRadius=e},Object.defineProperties(n.prototype,i),n}(n.Filter);e.RadialBlurFilter=i,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n(e.__filters={},e.PIXI)}(this,function(e,n){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",t="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\n\nuniform vec4 filterArea;\nuniform vec4 filterClamp;\nuniform vec2 dimensions;\n\nuniform bool mirror;\nuniform float boundary;\nuniform vec2 amplitude;\nuniform vec2 waveLength;\nuniform vec2 alpha;\nuniform float time;\n\nfloat rand(vec2 co) {\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main(void)\n{\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\n vec2 coord = pixelCoord / dimensions;\n\n if (coord.y < boundary) {\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n return;\n }\n\n float k = (coord.y - boundary) / (1. - boundary + 0.0001);\n float areaY = boundary * dimensions.y / filterArea.y;\n float v = areaY + areaY - vTextureCoord.y;\n float y = mirror ? v : vTextureCoord.y;\n\n float _amplitude = ((amplitude.y - amplitude.x) * k + amplitude.x ) / filterArea.x;\n float _waveLength = ((waveLength.y - waveLength.x) * k + waveLength.x) / filterArea.y;\n float _alpha = (alpha.y - alpha.x) * k + alpha.x;\n\n float x = vTextureCoord.x + cos(v * 6.28 / _waveLength - time) * _amplitude;\n x = clamp(x, filterClamp.x, filterClamp.z);\n\n vec4 color = texture2D(uSampler, vec2(x, y));\n\n gl_FragColor = color * _alpha;\n}\n",o=function(e){function n(n){e.call(this,r,t),Object.assign(this,{mirror:!0,boundary:.5,amplitude:[0,20],waveLength:[30,100],alpha:[1,1],time:0},n)}e&&(n.__proto__=e),n.prototype=Object.create(e&&e.prototype),n.prototype.constructor=n;var o={mirror:{configurable:!0},boundary:{configurable:!0},amplitude:{configurable:!0},waveLength:{configurable:!0},alpha:{configurable:!0}};return n.prototype.apply=function(e,n,r,t){this.uniforms.dimensions[0]=n.sourceFrame.width,this.uniforms.dimensions[1]=n.sourceFrame.height,this.uniforms.time=this.time,e.applyFilter(this,n,r,t)},o.mirror.set=function(e){this.uniforms.mirror=e},o.mirror.get=function(){return this.uniforms.mirror},o.boundary.set=function(e){this.uniforms.boundary=e},o.boundary.get=function(){return this.uniforms.boundary},o.amplitude.set=function(e){this.uniforms.amplitude[0]=e[0],this.uniforms.amplitude[1]=e[1]},o.amplitude.get=function(){return this.uniforms.amplitude},o.waveLength.set=function(e){this.uniforms.waveLength[0]=e[0],this.uniforms.waveLength[1]=e[1]},o.waveLength.get=function(){return this.uniforms.waveLength},o.alpha.set=function(e){this.uniforms.alpha[0]=e[0],this.uniforms.alpha[1]=e[1]},o.alpha.get=function(){return this.uniforms.alpha},Object.defineProperties(n.prototype,o),n}(n.Filter);e.ReflectionFilter=o,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this.__filters);
|
||||
//# sourceMappingURL=filter-reflection.js.map
|
||||
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],r):r(e.__filters={},e.PIXI)}(this,function(e,r){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",n="precision mediump float;\n\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\nuniform vec2 red;\nuniform vec2 green;\nuniform vec2 blue;\n\nvoid main(void)\n{\n gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/filterArea.xy).r;\n gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/filterArea.xy).g;\n gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/filterArea.xy).b;\n gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;\n}\n",o=function(e){function r(r,o,i){void 0===r&&(r=[-10,0]),void 0===o&&(o=[0,10]),void 0===i&&(i=[0,0]),e.call(this,t,n),this.red=r,this.green=o,this.blue=i}e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r;var o={red:{configurable:!0},green:{configurable:!0},blue:{configurable:!0}};return o.red.get=function(){return this.uniforms.red},o.red.set=function(e){this.uniforms.red=e},o.green.get=function(){return this.uniforms.green},o.green.set=function(e){this.uniforms.green=e},o.blue.get=function(){return this.uniforms.blue},o.blue.set=function(e){this.uniforms.blue=e},Object.defineProperties(r.prototype,o),r}(r.Filter);e.RGBSplitFilter=o,Object.defineProperty(e,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-rgb-split.js.map
|
||||
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],e):e(t.__filters={},t.PIXI)}(this,function(t,e){"use strict";var i="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float blur;\nuniform float gradientBlur;\nuniform vec2 start;\nuniform vec2 end;\nuniform vec2 delta;\nuniform vec2 texSize;\n\nfloat random(vec3 scale, float seed)\n{\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\n}\n\nvoid main(void)\n{\n vec4 color = vec4(0.0);\n float total = 0.0;\n\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\n vec2 normal = normalize(vec2(start.y - end.y, end.x - start.x));\n float radius = smoothstep(0.0, 1.0, abs(dot(vTextureCoord * texSize - start, normal)) / gradientBlur) * blur;\n\n for (float t = -30.0; t <= 30.0; t++)\n {\n float percent = (t + offset - 0.5) / 30.0;\n float weight = 1.0 - abs(percent);\n vec4 sample = texture2D(uSampler, vTextureCoord + delta / texSize * percent * radius);\n sample.rgb *= sample.a;\n color += sample * weight;\n total += weight;\n }\n\n color /= total;\n color.rgb /= color.a + 0.00001;\n\n gl_FragColor = color;\n}\n",n=function(t){function n(n,o,s,l){void 0===n&&(n=100),void 0===o&&(o=600),void 0===s&&(s=null),void 0===l&&(l=null),t.call(this,i,r),this.uniforms.blur=n,this.uniforms.gradientBlur=o,this.uniforms.start=s||new e.Point(0,window.innerHeight/2),this.uniforms.end=l||new e.Point(600,window.innerHeight/2),this.uniforms.delta=new e.Point(30,30),this.uniforms.texSize=new e.Point(window.innerWidth,window.innerHeight),this.updateDelta()}t&&(n.__proto__=t),n.prototype=Object.create(t&&t.prototype),n.prototype.constructor=n;var o={blur:{configurable:!0},gradientBlur:{configurable:!0},start:{configurable:!0},end:{configurable:!0}};return n.prototype.updateDelta=function(){this.uniforms.delta.x=0,this.uniforms.delta.y=0},o.blur.get=function(){return this.uniforms.blur},o.blur.set=function(t){this.uniforms.blur=t},o.gradientBlur.get=function(){return this.uniforms.gradientBlur},o.gradientBlur.set=function(t){this.uniforms.gradientBlur=t},o.start.get=function(){return this.uniforms.start},o.start.set=function(t){this.uniforms.start=t,this.updateDelta()},o.end.get=function(){return this.uniforms.end},o.end.set=function(t){this.uniforms.end=t,this.updateDelta()},Object.defineProperties(n.prototype,o),n}(e.Filter),o=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.updateDelta=function(){var t=this.uniforms.end.x-this.uniforms.start.x,e=this.uniforms.end.y-this.uniforms.start.y,i=Math.sqrt(t*t+e*e);this.uniforms.delta.x=t/i,this.uniforms.delta.y=e/i},e}(n),s=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.updateDelta=function(){var t=this.uniforms.end.x-this.uniforms.start.x,e=this.uniforms.end.y-this.uniforms.start.y,i=Math.sqrt(t*t+e*e);this.uniforms.delta.x=-e/i,this.uniforms.delta.y=t/i},e}(n),l=function(t){function e(e,i,r,n){void 0===e&&(e=100),void 0===i&&(i=600),void 0===r&&(r=null),void 0===n&&(n=null),t.call(this),this.tiltShiftXFilter=new o(e,i,r,n),this.tiltShiftYFilter=new s(e,i,r,n)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={blur:{configurable:!0},gradientBlur:{configurable:!0},start:{configurable:!0},end:{configurable:!0}};return e.prototype.apply=function(t,e,i){var r=t.getRenderTarget(!0);this.tiltShiftXFilter.apply(t,e,r),this.tiltShiftYFilter.apply(t,r,i),t.returnRenderTarget(r)},i.blur.get=function(){return this.tiltShiftXFilter.blur},i.blur.set=function(t){this.tiltShiftXFilter.blur=this.tiltShiftYFilter.blur=t},i.gradientBlur.get=function(){return this.tiltShiftXFilter.gradientBlur},i.gradientBlur.set=function(t){this.tiltShiftXFilter.gradientBlur=this.tiltShiftYFilter.gradientBlur=t},i.start.get=function(){return this.tiltShiftXFilter.start},i.start.set=function(t){this.tiltShiftXFilter.start=this.tiltShiftYFilter.start=t},i.end.get=function(){return this.tiltShiftXFilter.end},i.end.set=function(t){this.tiltShiftXFilter.end=this.tiltShiftYFilter.end=t},Object.defineProperties(e.prototype,i),e}(e.Filter);t.TiltShiftFilter=l,t.TiltShiftXFilter=o,t.TiltShiftYFilter=s,t.TiltShiftAxisFilter=n,Object.defineProperty(t,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-tilt-shift.js.map
|
||||
|
8
Extensions/Effects/pixi-filters/filter-twist.js
Normal file
8
Extensions/Effects/pixi-filters/filter-twist.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/*!
|
||||
* @pixi/filter-twist - v2.7.0
|
||||
* Compiled Sun, 13 Jan 2019 22:51:52 UTC
|
||||
*
|
||||
* @pixi/filter-twist is licensed under the MIT License.
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(o,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],n):n((o=o||self).__filters={},o.PIXI)}(this,function(o,n){"use strict";var r="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",e="varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform float radius;\nuniform float angle;\nuniform vec2 offset;\nuniform vec4 filterArea;\n\nvec2 mapCoord( vec2 coord )\n{\n coord *= filterArea.xy;\n coord += filterArea.zw;\n\n return coord;\n}\n\nvec2 unmapCoord( vec2 coord )\n{\n coord -= filterArea.zw;\n coord /= filterArea.xy;\n\n return coord;\n}\n\nvec2 twist(vec2 coord)\n{\n coord -= offset;\n\n float dist = length(coord);\n\n if (dist < radius)\n {\n float ratioDist = (radius - dist) / radius;\n float angleMod = ratioDist * ratioDist * angle;\n float s = sin(angleMod);\n float c = cos(angleMod);\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\n }\n\n coord += offset;\n\n return coord;\n}\n\nvoid main(void)\n{\n\n vec2 coord = mapCoord(vTextureCoord);\n\n coord = twist(coord);\n\n coord = unmapCoord(coord);\n\n gl_FragColor = texture2D(uSampler, coord );\n\n}\n",t=function(o){function n(n,t,i){void 0===n&&(n=200),void 0===t&&(t=4),void 0===i&&(i=20),o.call(this,r,e),this.radius=n,this.angle=t,this.padding=i}o&&(n.__proto__=o),n.prototype=Object.create(o&&o.prototype),n.prototype.constructor=n;var t={offset:{configurable:!0},radius:{configurable:!0},angle:{configurable:!0}};return t.offset.get=function(){return this.uniforms.offset},t.offset.set=function(o){this.uniforms.offset=o},t.radius.get=function(){return this.uniforms.radius},t.radius.set=function(o){this.uniforms.radius=o},t.angle.get=function(){return this.uniforms.angle},t.angle.set=function(o){this.uniforms.angle=o},Object.defineProperties(n.prototype,t),n}(n.Filter);o.TwistFilter=t,Object.defineProperty(o,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
@@ -6,4 +6,3 @@
|
||||
* http://www.opensource.org/licenses/mit-license
|
||||
*/
|
||||
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("pixi.js")):"function"==typeof define&&define.amd?define(["exports","pixi.js"],e):e(n.__filters={},n.PIXI)}(this,function(n,e){"use strict";var t="attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}",r="varying vec2 vTextureCoord;\nuniform sampler2D uSampler;\nuniform vec4 filterArea;\n\nuniform vec2 uCenter;\nuniform float uStrength;\nuniform float uInnerRadius;\nuniform float uRadius;\n\nconst float MAX_KERNEL_SIZE = 32.0;\n\nfloat random(vec3 scale, float seed) {\n // use the fragment position for a different seed per-pixel\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\n}\n\nvoid main() {\n\n float minGradient = uInnerRadius * 0.3;\n float innerRadius = (uInnerRadius + minGradient * 0.5) / filterArea.x;\n\n float gradient = uRadius * 0.3;\n float radius = (uRadius - gradient * 0.5) / filterArea.x;\n\n float countLimit = MAX_KERNEL_SIZE;\n\n vec2 dir = vec2(uCenter.xy / filterArea.xy - vTextureCoord);\n float dist = length(vec2(dir.x, dir.y * filterArea.y / filterArea.x));\n\n float strength = uStrength;\n\n float delta = 0.0;\n float gap;\n if (dist < innerRadius) {\n delta = innerRadius - dist;\n gap = minGradient;\n } else if (radius >= 0.0 && dist > radius) { // radius < 0 means it's infinity\n delta = dist - radius;\n gap = gradient;\n }\n\n if (delta > 0.0) {\n float normalCount = gap / filterArea.x;\n delta = (normalCount - delta) / normalCount;\n countLimit *= delta;\n strength *= delta;\n if (countLimit < 1.0)\n {\n gl_FragColor = texture2D(uSampler, vTextureCoord);\n return;\n }\n }\n\n // randomize the lookup values to hide the fixed number of samples\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\n\n float total = 0.0;\n vec4 color = vec4(0.0);\n\n dir *= strength;\n\n for (float t = 0.0; t < MAX_KERNEL_SIZE; t++) {\n float percent = (t + offset) / MAX_KERNEL_SIZE;\n float weight = 4.0 * (percent - percent * percent);\n vec2 p = vTextureCoord + dir * percent;\n vec4 sample = texture2D(uSampler, p);\n\n // switch to pre-multiplied alpha to correctly blur transparent images\n // sample.rgb *= sample.a;\n\n color += sample * weight;\n total += weight;\n\n if (t > countLimit){\n break;\n }\n }\n\n color /= total;\n // switch back from pre-multiplied alpha\n color.rgb /= color.a + 0.00001;\n\n gl_FragColor = color;\n}\n",i=function(n){function e(e,i,o,a){void 0===e&&(e=.1),void 0===i&&(i=[0,0]),void 0===o&&(o=0),void 0===a&&(a=-1),n.call(this,t,r),this.center=i,this.strength=e,this.innerRadius=o,this.radius=a}n&&(e.__proto__=n),e.prototype=Object.create(n&&n.prototype),e.prototype.constructor=e;var i={center:{configurable:!0},strength:{configurable:!0},innerRadius:{configurable:!0},radius:{configurable:!0}};return i.center.get=function(){return this.uniforms.uCenter},i.center.set=function(n){this.uniforms.uCenter=n},i.strength.get=function(){return this.uniforms.uStrength},i.strength.set=function(n){this.uniforms.uStrength=n},i.innerRadius.get=function(){return this.uniforms.uInnerRadius},i.innerRadius.set=function(n){this.uniforms.uInnerRadius=n},i.radius.get=function(){return this.uniforms.uRadius},i.radius.set=function(n){(n<0||n===1/0)&&(n=-1),this.uniforms.uRadius=n},Object.defineProperties(e.prototype,i),e}(e.Filter);n.ZoomBlurFilter=i,Object.defineProperty(n,"__esModule",{value:!0})}),Object.assign(PIXI.filters,this?this.__filters:__filters);
|
||||
//# sourceMappingURL=filter-zoom-blur.js.map
|
||||
|
32
Extensions/Effects/radial-blur-pixi-filter.js
Normal file
32
Extensions/Effects/radial-blur-pixi-filter.js
Normal file
@@ -0,0 +1,32 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('RadialBlur', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var radialBlurFilter = new PIXI.filters.RadialBlurFilter();
|
||||
|
||||
return radialBlurFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
filter.center[0] = Math.round(filter._centerX * layer.getWidth());
|
||||
filter.center[1] = Math.round(filter._centerY * layer.getHeight());
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'radius') {
|
||||
filter.radius = (value < 0 ? -1 : value);
|
||||
}
|
||||
else if (parameterName === 'angle') {
|
||||
filter.angle = value;
|
||||
}
|
||||
else if (parameterName === 'kernelSize') {
|
||||
filter.kernelSize = gdjs.PixiFiltersTools.clampKernelSize(value, 3, 25);
|
||||
}
|
||||
else if (parameterName === 'centerX') {
|
||||
filter._centerX = value;
|
||||
}
|
||||
else if (parameterName === 'centerY') {
|
||||
filter._centerY = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {
|
||||
},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {
|
||||
},
|
||||
});
|
@@ -23,8 +23,8 @@ gdjs.PixiFiltersTools.registerFilterCreator("Reflection", {
|
||||
return reflectionFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
if (filter.animated) {
|
||||
filter.time -= layer.getElapsedTime() / 1000;
|
||||
if (filter.animationSpeed !== 0) {
|
||||
filter.time += layer.getElapsedTime() / 1000 * filter.animationSpeed;
|
||||
}
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
@@ -55,14 +55,15 @@ gdjs.PixiFiltersTools.registerFilterCreator("Reflection", {
|
||||
if (parameterName === "alphaEnding") {
|
||||
filter.alpha[1] = value;
|
||||
}
|
||||
|
||||
if (parameterName === "animationSpeed") {
|
||||
filter.animationSpeed = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === "mirror") {
|
||||
filter.mirror = value;
|
||||
}
|
||||
if (parameterName === "animated") {
|
||||
filter.animated = value;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
32
Extensions/Effects/twist-pixi-filter.js
Normal file
32
Extensions/Effects/twist-pixi-filter.js
Normal file
@@ -0,0 +1,32 @@
|
||||
gdjs.PixiFiltersTools.registerFilterCreator('Twist', {
|
||||
makePIXIFilter: function(layer, effectData) {
|
||||
var twistFilter = new PIXI.filters.TwistFilter();
|
||||
|
||||
return twistFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
filter.offset[0] = Math.round(filter._offsetX * layer.getWidth());
|
||||
filter.offset[1] = Math.round(filter._offsetY * layer.getHeight());
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'radius') {
|
||||
filter.radius = value;
|
||||
}
|
||||
else if (parameterName === 'angle') {
|
||||
filter.angle = value;
|
||||
}
|
||||
else if (parameterName === 'padding') {
|
||||
filter.padding = value;
|
||||
}
|
||||
else if (parameterName === 'offsetX') {
|
||||
filter._offsetX = value;
|
||||
}
|
||||
else if (parameterName === 'offsetY') {
|
||||
filter._offsetY = value;
|
||||
}
|
||||
},
|
||||
updateStringParameter: function(filter, parameterName, value) {
|
||||
},
|
||||
updateBooleanParameter: function(filter, parameterName, value) {
|
||||
},
|
||||
});
|
@@ -5,16 +5,18 @@ gdjs.PixiFiltersTools.registerFilterCreator('ZoomBlur', {
|
||||
return zoomBlurFilter;
|
||||
},
|
||||
update: function(filter, layer) {
|
||||
filter.center[0] = Math.round(filter._centerX * layer.getWidth());
|
||||
filter.center[1] = Math.round(filter._centerY * layer.getHeight());
|
||||
},
|
||||
updateDoubleParameter: function(filter, parameterName, value) {
|
||||
if (parameterName === 'centerX') {
|
||||
filter.center[0]= Math.round(window.innerWidth * value);
|
||||
filter._centerX = value;
|
||||
}
|
||||
else if (parameterName === 'centerY') {
|
||||
filter.center[1] = Math.round(window.innerHeight * value);
|
||||
filter._centerY = value;
|
||||
}
|
||||
else if (parameterName === 'innerRadius') {
|
||||
filter.innerRadius = Math.round(window.innerWidth * value);
|
||||
filter.innerRadius = value;
|
||||
}
|
||||
else if (parameterName === 'strength') {
|
||||
filter.strength = gdjs.PixiFiltersTools.clampValue(value / 10, 0, 20);
|
||||
|
@@ -385,6 +385,19 @@ module.exports = {
|
||||
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
|
||||
.setFunctionName('gdjs.fileSystem.getUserdataPath');
|
||||
|
||||
extension
|
||||
.addStrExpression(
|
||||
'UserHomePath',
|
||||
_('User\'s Home folder'),
|
||||
_('Get the path to the user home folder.'),
|
||||
_('Filesystem/Windows, Linux, MacOS'),
|
||||
'JsPlatform/Extensions/filesystem_folder24.png',
|
||||
'JsPlatform/Extensions/filesystem_folder32.png'
|
||||
)
|
||||
.getCodeExtraInformation()
|
||||
.setIncludeFile('Extensions/FileSystem/filesystemtools.js')
|
||||
.setFunctionName('gdjs.fileSystem.getUserHomePath');
|
||||
|
||||
extension
|
||||
.addStrExpression(
|
||||
'TempPath',
|
||||
|
@@ -97,6 +97,23 @@ gdjs.fileSystem.getUserdataPath = function(runtimeScene) {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the path to the user's home folder (on Windows `C:\Users\<USERNAME>\` for example).
|
||||
* @return {string} The path to user's "home" folder
|
||||
*/
|
||||
gdjs.fileSystem.getUserHomePath = function() {
|
||||
const electron = runtimeScene
|
||||
.getGame()
|
||||
.getRenderer()
|
||||
.getElectron();
|
||||
|
||||
if (electron) {
|
||||
return electron.remote.app.getPath('home') || '';
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the path to 'Temp' folder.
|
||||
* @param {gdjs.RuntimeScene} runtimeScene The current scene
|
||||
|
@@ -1,5 +1,5 @@
|
||||
describe('Inventory', function() {
|
||||
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
|
||||
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}, resources: {resources: []}});
|
||||
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
|
||||
gdjs.evtTools.inventory.add(runtimeScene, "MyInventory", "sword");
|
||||
|
@@ -1,6 +1,6 @@
|
||||
|
||||
describe('gdjs.LinksManager', function() {
|
||||
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
|
||||
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}, resources: {resources: []}});
|
||||
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers:[{name:"", visibility: true}],
|
||||
|
@@ -245,7 +245,7 @@ gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setTexture = function(
|
||||
texture,
|
||||
makeInsideTexture(
|
||||
new PIXI.Rectangle(
|
||||
this._borderSprites[1].width - obj._rBorder,
|
||||
texture.width - obj._rBorder,
|
||||
0,
|
||||
obj._rBorder,
|
||||
obj._tBorder
|
||||
@@ -261,7 +261,7 @@ gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setTexture = function(
|
||||
makeInsideTexture(
|
||||
new PIXI.Rectangle(
|
||||
0,
|
||||
this._borderSprites[5].height - obj._bBorder,
|
||||
texture.height - obj._bBorder,
|
||||
obj._lBorder,
|
||||
obj._bBorder
|
||||
)
|
||||
@@ -271,8 +271,8 @@ gdjs.PanelSpriteRuntimeObjectPixiRenderer.prototype.setTexture = function(
|
||||
texture,
|
||||
makeInsideTexture(
|
||||
new PIXI.Rectangle(
|
||||
this._borderSprites[7].width - obj._rBorder,
|
||||
this._borderSprites[7].height - obj._bBorder,
|
||||
texture.width - obj._rBorder,
|
||||
texture.height - obj._bBorder,
|
||||
obj._rBorder,
|
||||
obj._bBorder
|
||||
)
|
||||
|
@@ -133,15 +133,14 @@ class PathfindingBehaviorJsExtension : public gd::PlatformExtension {
|
||||
GetAllExpressionsForBehavior(
|
||||
"PathfindingBehavior::PathfindingObstacleBehavior");
|
||||
|
||||
autActions["PathfindingObstacleBehavior::Cost"]
|
||||
autActions["PathfindingBehavior::Cost"]
|
||||
.SetFunctionName("setCost")
|
||||
.SetGetter("getCost");
|
||||
autConditions["PathfindingObstacleBehavior::Cost"].SetFunctionName(
|
||||
"getCost");
|
||||
autActions["PathfindingObstacleBehavior::SetImpassable"].SetFunctionName(
|
||||
autConditions["PathfindingBehavior::Cost"].SetFunctionName("getCost");
|
||||
autActions["PathfindingBehavior::SetImpassable"].SetFunctionName(
|
||||
"setImpassable");
|
||||
autConditions["PathfindingObstacleBehavior::IsImpassable"]
|
||||
.SetFunctionName("isImpassable");
|
||||
autConditions["PathfindingBehavior::IsImpassable"].SetFunctionName(
|
||||
"isImpassable");
|
||||
|
||||
autExpressions["Cost"].SetFunctionName("getCost");
|
||||
}
|
||||
|
@@ -754,8 +754,7 @@ module.exports = {
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setShapeScale')
|
||||
|
||||
.setFunctionName('setShapeScale')
|
||||
.setGetter('getShapeScale');
|
||||
|
||||
aut
|
||||
@@ -790,8 +789,7 @@ module.exports = {
|
||||
.addParameter('behavior', _('Behavior'), 'Physics2Behavior')
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setDensity')
|
||||
|
||||
.setFunctionName('setDensity')
|
||||
.setGetter('getDensity');
|
||||
|
||||
aut
|
||||
@@ -840,7 +838,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setFriction')
|
||||
|
||||
.setGetter('getFriction');
|
||||
|
||||
aut
|
||||
@@ -889,7 +886,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setRestitution')
|
||||
|
||||
.setGetter('getRestitution');
|
||||
|
||||
aut
|
||||
@@ -938,7 +934,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setLinearDamping')
|
||||
|
||||
.setGetter('getLinearDamping');
|
||||
|
||||
aut
|
||||
@@ -987,7 +982,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setAngularDamping')
|
||||
|
||||
.setGetter('getAngularDamping');
|
||||
|
||||
aut
|
||||
@@ -1036,7 +1030,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setGravityScale')
|
||||
|
||||
.setGetter('getGravityScale');
|
||||
|
||||
aut
|
||||
@@ -1157,7 +1150,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setLinearVelocityX')
|
||||
|
||||
.setGetter('getLinearVelocityX');
|
||||
|
||||
aut
|
||||
@@ -1204,7 +1196,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setLinearVelocityY')
|
||||
|
||||
.setGetter('getLinearVelocityY');
|
||||
|
||||
aut
|
||||
@@ -1280,7 +1271,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setAngularVelocity')
|
||||
|
||||
.setGetter('getAngularVelocity');
|
||||
|
||||
aut
|
||||
@@ -1729,7 +1719,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setDistanceJointLength')
|
||||
|
||||
.setGetter('getDistanceJointLength');
|
||||
|
||||
aut
|
||||
@@ -1762,7 +1751,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setDistanceJointFrequency')
|
||||
|
||||
.setGetter('getDistanceJointFrequency');
|
||||
|
||||
aut
|
||||
@@ -1795,7 +1783,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setDistanceJointDampingRatio')
|
||||
|
||||
.setGetter('getDistanceJointDampingRatio');
|
||||
|
||||
aut
|
||||
@@ -2091,7 +2078,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setRevoluteJointMotorSpeed')
|
||||
|
||||
.setGetter('getRevoluteJointMotorSpeed');
|
||||
|
||||
aut
|
||||
@@ -2124,7 +2110,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setRevoluteJointMaxMotorTorque')
|
||||
|
||||
.setGetter('getRevoluteJointMaxMotorTorque');
|
||||
|
||||
aut
|
||||
@@ -2405,7 +2390,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setPrismaticJointMotorSpeed')
|
||||
|
||||
.setGetter('getPrismaticJointMotorSpeed');
|
||||
|
||||
aut
|
||||
@@ -2438,7 +2422,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setPrismaticJointMaxMotorForce')
|
||||
|
||||
.setGetter('getPrismaticJointMaxMotorForce');
|
||||
|
||||
aut
|
||||
@@ -2709,7 +2692,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setGearJointRatio')
|
||||
|
||||
.setGetter('getGearJointRatio');
|
||||
|
||||
aut
|
||||
@@ -2835,7 +2817,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMouseJointMaxForce')
|
||||
|
||||
.setGetter('getMouseJointMaxForce');
|
||||
|
||||
aut
|
||||
@@ -2868,7 +2849,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMouseJointFrequency')
|
||||
|
||||
.setGetter('getMouseJointFrequency');
|
||||
|
||||
aut
|
||||
@@ -2901,7 +2881,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMouseJointDampingRatio')
|
||||
|
||||
.setGetter('getMouseJointDampingRatio');
|
||||
|
||||
aut
|
||||
@@ -3071,7 +3050,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWheelJointMotorSpeed')
|
||||
|
||||
.setGetter('getWheelJointMotorSpeed');
|
||||
|
||||
aut
|
||||
@@ -3104,7 +3082,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWheelJointMaxMotorTorque')
|
||||
|
||||
.setGetter('getWheelJointMaxMotorTorque');
|
||||
|
||||
aut
|
||||
@@ -3151,7 +3128,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWheelJointFrequency')
|
||||
|
||||
.setGetter('getWheelJointFrequency');
|
||||
|
||||
aut
|
||||
@@ -3184,7 +3160,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWheelJointDampingRatio')
|
||||
|
||||
.setGetter('getWheelJointDampingRatio');
|
||||
|
||||
aut
|
||||
@@ -3281,7 +3256,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWeldJointFrequency')
|
||||
|
||||
.setGetter('getWeldJointFrequency');
|
||||
|
||||
aut
|
||||
@@ -3314,7 +3288,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setWeldJointDampingRatio')
|
||||
|
||||
.setGetter('getWeldJointDampingRatio');
|
||||
|
||||
aut
|
||||
@@ -3390,7 +3363,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setRopeJointMaxLength')
|
||||
|
||||
.setGetter('getRopeJointMaxLength');
|
||||
|
||||
aut
|
||||
@@ -3459,7 +3431,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setFrictionJointMaxForce')
|
||||
|
||||
.setGetter('getFrictionJointMaxForce');
|
||||
|
||||
aut
|
||||
@@ -3492,7 +3463,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setFrictionJointMaxTorque')
|
||||
|
||||
.setGetter('getFrictionJointMaxTorque');
|
||||
|
||||
aut
|
||||
@@ -3610,7 +3580,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMotorJointAngularOffset')
|
||||
|
||||
.setGetter('getMotorJointAngularOffset');
|
||||
|
||||
aut
|
||||
@@ -3643,7 +3612,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMotorJointMaxForce')
|
||||
|
||||
.setGetter('getMotorJointMaxForce');
|
||||
|
||||
aut
|
||||
@@ -3676,7 +3644,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMotorJointMaxTorque')
|
||||
|
||||
.setGetter('getMotorJointMaxTorque');
|
||||
|
||||
aut
|
||||
@@ -3709,7 +3676,6 @@ module.exports = {
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName('setMotorJointCorrectionFactor')
|
||||
|
||||
.setGetter('getMotorJointCorrectionFactor');
|
||||
|
||||
aut
|
||||
|
@@ -303,9 +303,34 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
|
||||
.SetGetter("GetJumpSpeed")
|
||||
.SetIncludeFile("PlatformBehavior/PlatformerObjectRuntimeBehavior.h");
|
||||
|
||||
aut.AddCondition(
|
||||
"JumpSustainTime",
|
||||
_("Jump sustain time"),
|
||||
_("Compare the jump sustain time of the object (in seconds)."),
|
||||
_("the jump sustain time"),
|
||||
_("Options"),
|
||||
"CppPlatform/Extensions/platformerobjecticon24.png",
|
||||
"CppPlatform/Extensions/platformerobjecticon16.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
|
||||
.UseStandardRelationalOperatorParameters("number")
|
||||
.MarkAsAdvanced();
|
||||
|
||||
aut.AddAction(
|
||||
"JumpSustainTime",
|
||||
_("Jump sustain time"),
|
||||
_("Change the jump sustain time of an object (in seconds)."),
|
||||
_("the jump sustain time"),
|
||||
_("Options"),
|
||||
"CppPlatform/Extensions/platformerobjecticon24.png",
|
||||
"CppPlatform/Extensions/platformerobjecticon16.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
|
||||
.UseStandardOperatorParameters("number");
|
||||
|
||||
aut.AddAction(
|
||||
"SetCanJump",
|
||||
_("Allow again jumping"),
|
||||
_("Allow jumping again"),
|
||||
_("When this action is executed, the object is able to jump again, "
|
||||
"even if it is in the air: this can be useful to allow a double "
|
||||
"jump for example. This is not a permanent effect: you must call "
|
||||
@@ -502,6 +527,14 @@ void DeclarePlatformBehaviorExtension(gd::PlatformExtension& extension) {
|
||||
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior")
|
||||
.SetFunctionName("GetJumpSpeed")
|
||||
.SetIncludeFile("PlatformBehavior/PlatformerObjectRuntimeBehavior.h");
|
||||
|
||||
aut.AddExpression("JumpSustainTime",
|
||||
_("Jump sustain time"),
|
||||
_("The time during which keeping the jump button held allow the initial jump speed to be maintained."),
|
||||
_("Options"),
|
||||
"CppPlatform/Extensions/platformerobjecticon16.png")
|
||||
.AddParameter("object", _("Object"))
|
||||
.AddParameter("behavior", _("Behavior"), "PlatformerObjectBehavior");
|
||||
#endif
|
||||
}
|
||||
{
|
||||
|
@@ -92,6 +92,12 @@ class PlatformBehaviorJsExtension : public gd::PlatformExtension {
|
||||
.SetFunctionName("setJumpSpeed")
|
||||
.SetGetter("getJumpSpeed");
|
||||
autExpressions["JumpSpeed"].SetFunctionName("getJumpSpeed");
|
||||
autConditions["PlatformBehavior::JumpSustainTime"].SetFunctionName(
|
||||
"getJumpSustainTime");
|
||||
autActions["PlatformBehavior::JumpSustainTime"]
|
||||
.SetFunctionName("setJumpSustainTime")
|
||||
.SetGetter("getJumpSustainTime");
|
||||
autExpressions["JumpSustainTime"].SetFunctionName("getJumpSustainTime");
|
||||
|
||||
autActions["PlatformBehavior::SetCanJump"].SetFunctionName("setCanJump");
|
||||
autActions["PlatformBehavior::SimulateLeftKey"].SetFunctionName(
|
||||
|
@@ -6,11 +6,13 @@ This project is released under the MIT License.
|
||||
*/
|
||||
|
||||
#include "PlatformerObjectBehavior.h"
|
||||
|
||||
#include <SFML/Window.hpp>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
|
||||
#include "GDCore/Tools/Localization.h"
|
||||
#include "GDCpp/Runtime/CommonTools.h"
|
||||
#include "GDCpp/Runtime/Project/Layout.h"
|
||||
@@ -22,6 +24,7 @@ This project is released under the MIT License.
|
||||
#if defined(GD_IDE_ONLY)
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
|
||||
#include "GDCore/Project/PropertyDescriptor.h"
|
||||
#endif
|
||||
|
||||
@@ -34,6 +37,7 @@ void PlatformerObjectBehavior::InitializeContent(
|
||||
behaviorContent.SetAttribute("deceleration", 1500);
|
||||
behaviorContent.SetAttribute("maxSpeed", 250);
|
||||
behaviorContent.SetAttribute("jumpSpeed", 600);
|
||||
behaviorContent.SetAttribute("jumpSustainTime", 0.2);
|
||||
behaviorContent.SetAttribute("ignoreDefaultControls", false);
|
||||
behaviorContent.SetAttribute("slopeMaxAngle", 60);
|
||||
behaviorContent.SetAttribute("canGrabPlatforms", false);
|
||||
@@ -51,6 +55,14 @@ PlatformerObjectBehavior::GetProperties(
|
||||
gd::String::From(behaviorContent.GetDoubleAttribute("gravity")));
|
||||
properties[_("Jump speed")].SetValue(
|
||||
gd::String::From(behaviorContent.GetDoubleAttribute("jumpSpeed")));
|
||||
properties[_("jumpSustainTime")]
|
||||
.SetValue(gd::String::From(
|
||||
behaviorContent.GetDoubleAttribute("jumpSustainTime", 0)))
|
||||
.SetLabel(_("Jump sustain time"))
|
||||
.SetDescription(
|
||||
_("Maximum time (in seconds) during which the jump strength is "
|
||||
"sustained if the jump key is held - allowing variable height "
|
||||
"jumps."));
|
||||
properties[_("Max. falling speed")].SetValue(
|
||||
gd::String::From(behaviorContent.GetDoubleAttribute("maxFallingSpeed")));
|
||||
properties[_("Acceleration")].SetValue(
|
||||
@@ -91,7 +103,7 @@ bool PlatformerObjectBehavior::UpdateProperty(
|
||||
gd::Project& project) {
|
||||
if (name == _("Default controls"))
|
||||
behaviorContent.SetAttribute("ignoreDefaultControls", (value == "0"));
|
||||
if (name == _("Round coordinates"))
|
||||
else if (name == _("Round coordinates"))
|
||||
behaviorContent.SetAttribute("roundCoordinates", (value == "1"));
|
||||
else if (name == _("Can grab platform ledges"))
|
||||
behaviorContent.SetAttribute("canGrabPlatforms", (value == "1"));
|
||||
@@ -112,6 +124,8 @@ bool PlatformerObjectBehavior::UpdateProperty(
|
||||
behaviorContent.SetAttribute("maxSpeed", value.To<double>());
|
||||
else if (name == _("Jump speed"))
|
||||
behaviorContent.SetAttribute("jumpSpeed", value.To<double>());
|
||||
else if (name == _("jumpSustainTime"))
|
||||
behaviorContent.SetAttribute("jumpSustainTime", value.To<double>());
|
||||
else if (name == _("Slope max. angle")) {
|
||||
double newMaxAngle = value.To<double>();
|
||||
if (newMaxAngle < 0 || newMaxAngle >= 90) return false;
|
||||
|
@@ -323,6 +323,7 @@ void PlatformerObjectRuntimeBehavior::DoStepPreEvents(RuntimeScene& scene) {
|
||||
}
|
||||
|
||||
if (jumping) {
|
||||
// TODO: Port the jump sustain feature
|
||||
requestedDeltaY -= currentJumpSpeed * timeDelta;
|
||||
currentJumpSpeed -= gravity * timeDelta;
|
||||
if (currentJumpSpeed < 0) {
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,282 +1,483 @@
|
||||
const makeTestRuntimeScene = () => {
|
||||
const runtimeGame = new gdjs.RuntimeGame({
|
||||
variables: [],
|
||||
resources: {
|
||||
resources: [],
|
||||
},
|
||||
properties: { windowWidth: 800, windowHeight: 600 },
|
||||
});
|
||||
const runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [{ name: '', visibility: true }],
|
||||
variables: [],
|
||||
behaviorsSharedData: [],
|
||||
objects: [],
|
||||
instances: [],
|
||||
});
|
||||
runtimeScene._timeManager.getElapsedTime = function() {
|
||||
return (1 / 60) * 1000;
|
||||
};
|
||||
return runtimeScene;
|
||||
};
|
||||
|
||||
const addPlatformObject = runtimeScene => {
|
||||
var platform = new gdjs.RuntimeObject(runtimeScene, {
|
||||
name: 'obj2',
|
||||
type: '',
|
||||
behaviors: [
|
||||
{
|
||||
type: 'PlatformBehavior::PlatformBehavior',
|
||||
canBeGrabbed: true,
|
||||
},
|
||||
],
|
||||
});
|
||||
platform.getWidth = function() {
|
||||
return 60;
|
||||
};
|
||||
platform.getHeight = function() {
|
||||
return 32;
|
||||
};
|
||||
runtimeScene.addObject(platform);
|
||||
|
||||
return platform;
|
||||
};
|
||||
|
||||
describe('gdjs.PlatformerObjectRuntimeBehavior', function() {
|
||||
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
|
||||
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [{name: "", visibility: true}],
|
||||
variables: [],
|
||||
behaviorsSharedData: [],
|
||||
objects: [],
|
||||
instances: []
|
||||
});
|
||||
runtimeScene._timeManager.getElapsedTime = function() { return 1 / 60 * 1000; };
|
||||
const runtimeScene = makeTestRuntimeScene();
|
||||
|
||||
//Put a platformer object in the air.
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{
|
||||
type: "PlatformBehavior::PlatformerObjectBehavior",
|
||||
name: "auto1",
|
||||
gravity: 900,
|
||||
maxFallingSpeed: 1500,
|
||||
acceleration: 500,
|
||||
deceleration: 1500,
|
||||
maxSpeed: 500,
|
||||
jumpSpeed: 1500,
|
||||
canGrabPlatforms: true,
|
||||
ignoreDefaultControls: true,
|
||||
slopeMaxAngle: 60
|
||||
}]});
|
||||
object.getWidth = function() { return 10; };
|
||||
object.getHeight = function() { return 20; };
|
||||
runtimeScene.addObject(object);
|
||||
object.setPosition(0, -100);
|
||||
//Put a platformer object in the air.
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {
|
||||
name: 'obj1',
|
||||
type: '',
|
||||
behaviors: [
|
||||
{
|
||||
type: 'PlatformBehavior::PlatformerObjectBehavior',
|
||||
name: 'auto1',
|
||||
gravity: 900,
|
||||
maxFallingSpeed: 1500,
|
||||
acceleration: 500,
|
||||
deceleration: 1500,
|
||||
maxSpeed: 500,
|
||||
jumpSpeed: 1500,
|
||||
canGrabPlatforms: true,
|
||||
ignoreDefaultControls: true,
|
||||
slopeMaxAngle: 60,
|
||||
},
|
||||
],
|
||||
});
|
||||
object.getWidth = function() {
|
||||
return 10;
|
||||
};
|
||||
object.getHeight = function() {
|
||||
return 20;
|
||||
};
|
||||
runtimeScene.addObject(object);
|
||||
object.setPosition(0, -100);
|
||||
|
||||
//Put a platform
|
||||
var platform = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [{
|
||||
type: "PlatformBehavior::PlatformBehavior",
|
||||
canBeGrabbed: true,
|
||||
}]});
|
||||
platform.getWidth = function() { return 60; };
|
||||
platform.getHeight = function() { return 32; };
|
||||
runtimeScene.addObject(platform);
|
||||
platform.setPosition(0, -10);
|
||||
//Put a platform
|
||||
const platform = addPlatformObject(runtimeScene);
|
||||
platform.setPosition(0, -10);
|
||||
|
||||
it('can fall when in the air', function() {
|
||||
for(var i = 0; i<30; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
if (i < 10) expect(object.getBehavior("auto1").isFalling()).to.be(true);
|
||||
}
|
||||
it('can fall when in the air', function() {
|
||||
for (var i = 0; i < 30; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
if (i < 10) expect(object.getBehavior('auto1').isFalling()).to.be(true);
|
||||
}
|
||||
|
||||
//Check the platform stopped the platformer object.
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
expect(object.getBehavior("auto1").isFalling()).to.be(false);
|
||||
expect(object.getBehavior("auto1").isMoving()).to.be(false);
|
||||
//Check the platform stopped the platformer object.
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
expect(object.getBehavior('auto1').isMoving()).to.be(false);
|
||||
|
||||
for(var i = 0; i<35; ++i) { //Check that the platformer object can fall.
|
||||
object.getBehavior("auto1").simulateRightKey();
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getX()).to.be.within(87.50, 87.51);
|
||||
expect(object.getY()).to.be(-24.75);
|
||||
expect(object.getBehavior("auto1").isFalling()).to.be(true);
|
||||
for (var i = 0; i < 35; ++i) {
|
||||
//Check that the platformer object can fall.
|
||||
object.getBehavior('auto1').simulateRightKey();
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getX()).to.be.within(87.5, 87.51);
|
||||
expect(object.getY()).to.be(-24.75);
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(true);
|
||||
|
||||
for(var i = 0; i<100; ++i) { //Let the speed on X axis go back to 0.
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
});
|
||||
for (var i = 0; i < 100; ++i) {
|
||||
//Let the speed on X axis go back to 0.
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
});
|
||||
|
||||
it('can grab, and release, a platform', function() {
|
||||
//Put the object near the right ledge of the platform.
|
||||
object.setPosition(platform.getX() + platform.getWidth() + 2, platform.getY() - 10);
|
||||
it('can grab, and release, a platform', function() {
|
||||
//Put the object near the right ledge of the platform.
|
||||
object.setPosition(
|
||||
platform.getX() + platform.getWidth() + 2,
|
||||
platform.getY() - 10
|
||||
);
|
||||
|
||||
for(var i = 0; i<35; ++i) {
|
||||
object.getBehavior("auto1").simulateLeftKey();
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
for (var i = 0; i < 35; ++i) {
|
||||
object.getBehavior('auto1').simulateLeftKey();
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
//Check that the object grabbed the platform
|
||||
expect(object.getX()).to.be.within(
|
||||
platform.getX() + platform.getWidth() + 1,
|
||||
platform.getX() + platform.getWidth() + 2
|
||||
);
|
||||
expect(object.getY()).to.be(platform.getY());
|
||||
//Check that the object grabbed the platform
|
||||
expect(object.getX()).to.be.within(
|
||||
platform.getX() + platform.getWidth() + 1,
|
||||
platform.getX() + platform.getWidth() + 2
|
||||
);
|
||||
expect(object.getY()).to.be(platform.getY());
|
||||
|
||||
object.getBehavior("auto1").simulateReleaseKey();
|
||||
for(var i = 0; i<10; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
object.getBehavior('auto1').simulateReleaseKey();
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
//Check that the object is falling
|
||||
expect(object.getY()).to.be(1.25);
|
||||
});
|
||||
//Check that the object is falling
|
||||
expect(object.getY()).to.be(1.25);
|
||||
});
|
||||
|
||||
it('can track object height changes', function() {
|
||||
//Put the object near the right ledge of the platform.
|
||||
object.setPosition(platform.getX() + 10, platform.getY() - object.getHeight() - 1);
|
||||
it('can track object height changes', function() {
|
||||
//Put the object near the right ledge of the platform.
|
||||
object.setPosition(
|
||||
platform.getX() + 10,
|
||||
platform.getY() - object.getHeight() - 1
|
||||
);
|
||||
|
||||
for(var i = 0; i<15; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
for (var i = 0; i < 15; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
expect(object.getBehavior("auto1").isFalling()).to.be(false);
|
||||
expect(object.getX()).to.be(10);
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
expect(object.getX()).to.be(10);
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
|
||||
object.getHeight = function() { return 9; }
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getBehavior("auto1").isFalling()).to.be(false);
|
||||
expect(object.getY()).to.be(-19); // -19 = -10 (platform y) + -9 (object height)
|
||||
object.getHeight = function() {
|
||||
return 9;
|
||||
};
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
expect(object.getY()).to.be(-19); // -19 = -10 (platform y) + -9 (object height)
|
||||
|
||||
for(var i = 0; i<10; ++i) {
|
||||
object.getBehavior("auto1").simulateRightKey();
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getBehavior("auto1").isFalling()).to.be(false);
|
||||
}
|
||||
expect(object.getY()).to.be(-19);
|
||||
expect(object.getX()).to.be.within(17.638, 17.639);
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
object.getBehavior('auto1').simulateRightKey();
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
}
|
||||
expect(object.getY()).to.be(-19);
|
||||
expect(object.getX()).to.be.within(17.638, 17.639);
|
||||
|
||||
object.getHeight = function() { return 20; }
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
});
|
||||
object.getHeight = function() {
|
||||
return 20;
|
||||
};
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
});
|
||||
});
|
||||
|
||||
describe('gdjs.PlatformerObjectRuntimeBehavior, jump and jump sustain (round coordinates on)', function() {
|
||||
const runtimeScene = makeTestRuntimeScene();
|
||||
|
||||
//Put a platformer object on a platform
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {
|
||||
name: 'obj1',
|
||||
type: '',
|
||||
behaviors: [
|
||||
{
|
||||
type: 'PlatformBehavior::PlatformerObjectBehavior',
|
||||
name: 'auto1',
|
||||
gravity: 1500,
|
||||
maxFallingSpeed: 1500,
|
||||
acceleration: 500,
|
||||
deceleration: 1500,
|
||||
maxSpeed: 500,
|
||||
jumpSpeed: 900,
|
||||
canGrabPlatforms: true,
|
||||
ignoreDefaultControls: true,
|
||||
slopeMaxAngle: 60,
|
||||
jumpSustainTime: 0.2,
|
||||
roundCoordinates: true,
|
||||
},
|
||||
],
|
||||
});
|
||||
object.getWidth = function() {
|
||||
return 10;
|
||||
};
|
||||
object.getHeight = function() {
|
||||
return 20;
|
||||
};
|
||||
runtimeScene.addObject(object);
|
||||
object.setPosition(0, -32);
|
||||
|
||||
//Put a platform
|
||||
const platform = addPlatformObject(runtimeScene);
|
||||
platform.setPosition(0, -10);
|
||||
|
||||
it('can jump', function() {
|
||||
// Ensure the object falls on the platform
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
//Check the object is on the platform
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
expect(object.getBehavior('auto1').isMoving()).to.be(false);
|
||||
|
||||
// Jump without sustaining
|
||||
object.getBehavior('auto1').simulateJumpKey();
|
||||
for (var i = 0; i < 18; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
// Check that we reached the maximum height
|
||||
expect(object.getY()).to.be.within(-180, -179);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be(-180);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-180, -179);
|
||||
|
||||
// Then let the object fall
|
||||
for (var i = 0; i < 60; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be(-30);
|
||||
});
|
||||
|
||||
it('can jump, sustaining the jump', function() {
|
||||
//Check the object is on the platform
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
expect(object.getBehavior('auto1').isMoving()).to.be(false);
|
||||
|
||||
// Jump with sustaining as much as possible, and
|
||||
// even more (18 frames at 60fps is greater than 0.2s)
|
||||
for (var i = 0; i < 18; ++i) {
|
||||
object.getBehavior('auto1').simulateJumpKey();
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
// Check the height reached
|
||||
expect(object.getY()).to.be(-230);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be(-235);
|
||||
for (var i = 0; i < 5; ++i) {
|
||||
// Verify that pressing the jump key does not change anything
|
||||
object.getBehavior('auto1').simulateJumpKey();
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
// Check that we reached the maximum height
|
||||
expect(object.getY()).to.be(-247.5);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be(-247.5);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-247, -246);
|
||||
|
||||
// Then let the object fall
|
||||
for (var i = 0; i < 60; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be(-30);
|
||||
});
|
||||
|
||||
it('can jump, and only sustain the jump while key held', function() {
|
||||
//Check the object is on the platform
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
expect(object.getBehavior('auto1').isMoving()).to.be(false);
|
||||
|
||||
// Jump with sustaining a bit (5 frames at 60fps = 0.08s), then stop
|
||||
for (var i = 0; i < 5; ++i) {
|
||||
object.getBehavior('auto1').simulateJumpKey();
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be.within(-101, -100);
|
||||
|
||||
// Stop holding the jump key
|
||||
runtimeScene.renderAndStep();
|
||||
|
||||
for (var i = 0; i < 13; ++i) {
|
||||
// then hold it again (but it's too late, jump sustain is gone for this jump)
|
||||
object.getBehavior('auto1').simulateJumpKey();
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
// Check that we reached the maximum height
|
||||
expect(object.getY()).to.be.within(-206, -205);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-208, -207);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-208, -207);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-208, -207);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-206, -205);
|
||||
runtimeScene.renderAndStep();
|
||||
|
||||
// Then let the object fall
|
||||
for (var i = 0; i < 60; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be(-30);
|
||||
});
|
||||
});
|
||||
|
||||
describe('gdjs.PlatformerObjectRuntimeBehavior, jumpthru', function() {
|
||||
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
|
||||
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [{name: "", visibility: true}],
|
||||
variables: [],
|
||||
behaviorsSharedData: [],
|
||||
objects: [],
|
||||
instances: []
|
||||
});
|
||||
runtimeScene._timeManager.getElapsedTime = function() { return 1 / 60 * 1000; };
|
||||
const runtimeScene = makeTestRuntimeScene();
|
||||
|
||||
//Put a platformer object in a platform.
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{
|
||||
type: "PlatformBehavior::PlatformerObjectBehavior",
|
||||
name: "auto1",
|
||||
roundCoordinates: true,
|
||||
gravity: 900,
|
||||
maxFallingSpeed: 1500,
|
||||
acceleration: 500,
|
||||
deceleration: 1500,
|
||||
maxSpeed: 500,
|
||||
jumpSpeed: 500,
|
||||
canGrabPlatforms: true,
|
||||
ignoreDefaultControls: true,
|
||||
slopeMaxAngle: 60
|
||||
}]});
|
||||
object.getWidth = function() { return 10; };
|
||||
object.getHeight = function() { return 20; };
|
||||
runtimeScene.addObject(object);
|
||||
object.setPosition(0, -30);
|
||||
//Put a platformer object in a platform.
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {
|
||||
name: 'obj1',
|
||||
type: '',
|
||||
behaviors: [
|
||||
{
|
||||
type: 'PlatformBehavior::PlatformerObjectBehavior',
|
||||
name: 'auto1',
|
||||
roundCoordinates: true,
|
||||
gravity: 900,
|
||||
maxFallingSpeed: 1500,
|
||||
acceleration: 500,
|
||||
deceleration: 1500,
|
||||
maxSpeed: 500,
|
||||
jumpSpeed: 500,
|
||||
canGrabPlatforms: true,
|
||||
ignoreDefaultControls: true,
|
||||
slopeMaxAngle: 60,
|
||||
},
|
||||
],
|
||||
});
|
||||
object.getWidth = function() {
|
||||
return 10;
|
||||
};
|
||||
object.getHeight = function() {
|
||||
return 20;
|
||||
};
|
||||
runtimeScene.addObject(object);
|
||||
object.setPosition(0, -30);
|
||||
|
||||
//Put a platform
|
||||
var platform = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [{
|
||||
type: "PlatformBehavior::PlatformBehavior",
|
||||
canBeGrabbed: true,
|
||||
platformType: "Platform",
|
||||
}]});
|
||||
platform.getWidth = function() { return 60; };
|
||||
platform.getHeight = function() { return 32; };
|
||||
runtimeScene.addObject(platform);
|
||||
platform.setPosition(0, -10);
|
||||
//Put a platform
|
||||
const platform = addPlatformObject(runtimeScene);
|
||||
platform.setPosition(0, -10);
|
||||
|
||||
// Put a jump thru, higher than the platform so that the object jump from under it
|
||||
// and will land on it at the end of the jump.
|
||||
var jumpthru = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [{
|
||||
type: "PlatformBehavior::PlatformBehavior",
|
||||
canBeGrabbed: true,
|
||||
platformType: "Jumpthru",
|
||||
}]});
|
||||
jumpthru.getWidth = function() { return 60; };
|
||||
jumpthru.getHeight = function() { return 5; };
|
||||
runtimeScene.addObject(jumpthru);
|
||||
jumpthru.setPosition(0, -33);
|
||||
// Put a jump thru, higher than the platform so that the object jump from under it
|
||||
// and will land on it at the end of the jump.
|
||||
var jumpthru = new gdjs.RuntimeObject(runtimeScene, {
|
||||
name: 'obj2',
|
||||
type: '',
|
||||
behaviors: [
|
||||
{
|
||||
type: 'PlatformBehavior::PlatformBehavior',
|
||||
canBeGrabbed: true,
|
||||
platformType: 'Jumpthru',
|
||||
},
|
||||
],
|
||||
});
|
||||
jumpthru.getWidth = function() {
|
||||
return 60;
|
||||
};
|
||||
jumpthru.getHeight = function() {
|
||||
return 5;
|
||||
};
|
||||
runtimeScene.addObject(jumpthru);
|
||||
jumpthru.setPosition(0, -33);
|
||||
|
||||
it('can jump through the jumpthru', function() {
|
||||
//Check the platform stopped the platformer object.
|
||||
for(var i = 0; i<5; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
expect(object.getBehavior("auto1").isFalling()).to.be(false);
|
||||
expect(object.getBehavior("auto1").isMoving()).to.be(false);
|
||||
it('can jump through the jumpthru', function() {
|
||||
//Check the platform stopped the platformer object.
|
||||
for (var i = 0; i < 5; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be(-30); // -30 = -10 (platform y) + -20 (object height)
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
expect(object.getBehavior('auto1').isMoving()).to.be(false);
|
||||
|
||||
// Check that the jump starts properly, and is not stopped on the jumpthru
|
||||
object.getBehavior("auto1").simulateJumpKey();
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-39, -38);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-47, -46);
|
||||
runtimeScene.renderAndStep();
|
||||
// At this step, the object is almost on the jumpthru (-53 + 20 (object height) = -33 (jump thru Y position)),
|
||||
// but the object should not stop.
|
||||
expect(object.getY()).to.be.within(-54, -53);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-61, -60);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-67, -66);
|
||||
expect(object.getBehavior("auto1").isJumping()).to.be(true);
|
||||
// Check that the jump starts properly, and is not stopped on the jumpthru
|
||||
object.getBehavior('auto1').simulateJumpKey();
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-39, -38);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-47, -46);
|
||||
runtimeScene.renderAndStep();
|
||||
// At this step, the object is almost on the jumpthru (-53 + 20 (object height) = -33 (jump thru Y position)),
|
||||
// but the object should not stop.
|
||||
expect(object.getY()).to.be.within(-54, -53);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-61, -60);
|
||||
runtimeScene.renderAndStep();
|
||||
expect(object.getY()).to.be.within(-67, -66);
|
||||
expect(object.getBehavior('auto1').isJumping()).to.be(true);
|
||||
|
||||
// Continue the simulation and check that position is correct in the middle of the jump
|
||||
for(var i = 0; i<20; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be.within(-89, -88);
|
||||
// Continue the simulation and check that position is correct in the middle of the jump
|
||||
for (var i = 0; i < 20; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be.within(-89, -88);
|
||||
|
||||
// Continue simulation and check that we arrive on the jumpthru
|
||||
for(var i = 0; i<10; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be.within(jumpthru.getY() - object.getHeight(), jumpthru.getY() - object.getHeight() + 1);
|
||||
expect(object.getBehavior("auto1").isFalling()).to.be(false);
|
||||
});
|
||||
// Continue simulation and check that we arrive on the jumpthru
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
expect(object.getY()).to.be.within(
|
||||
jumpthru.getY() - object.getHeight(),
|
||||
jumpthru.getY() - object.getHeight() + 1
|
||||
);
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('gdjs.PlatformerObjectRuntimeBehavior, rounded coordinates (moving platforms)', function() {
|
||||
var runtimeGame = new gdjs.RuntimeGame({variables: [], properties: {windowWidth: 800, windowHeight: 600}});
|
||||
var runtimeScene = new gdjs.RuntimeScene(runtimeGame);
|
||||
runtimeScene.loadFromScene({
|
||||
layers: [{name: "", visibility: true}],
|
||||
variables: [],
|
||||
behaviorsSharedData: [],
|
||||
objects: [],
|
||||
instances: []
|
||||
});
|
||||
runtimeScene._timeManager.getElapsedTime = function() { return 1 / 60 * 1000; };
|
||||
const runtimeScene = makeTestRuntimeScene();
|
||||
|
||||
//Put a platformer object on a platform.
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {name: "obj1", type: "", behaviors: [{
|
||||
type: "PlatformBehavior::PlatformerObjectBehavior",
|
||||
name: "auto1",
|
||||
roundCoordinates: true,
|
||||
gravity: 900,
|
||||
maxFallingSpeed: 1500,
|
||||
acceleration: 500,
|
||||
deceleration: 1500,
|
||||
maxSpeed: 500,
|
||||
jumpSpeed: 1500,
|
||||
canGrabPlatforms: true,
|
||||
ignoreDefaultControls: true,
|
||||
slopeMaxAngle: 60
|
||||
}]});
|
||||
object.getWidth = function() { return 10; };
|
||||
object.getHeight = function() { return 20; };
|
||||
runtimeScene.addObject(object);
|
||||
object.setPosition(0, -30);
|
||||
//Put a platformer object on a platform.
|
||||
var object = new gdjs.RuntimeObject(runtimeScene, {
|
||||
name: 'obj1',
|
||||
type: '',
|
||||
behaviors: [
|
||||
{
|
||||
type: 'PlatformBehavior::PlatformerObjectBehavior',
|
||||
name: 'auto1',
|
||||
roundCoordinates: true,
|
||||
gravity: 900,
|
||||
maxFallingSpeed: 1500,
|
||||
acceleration: 500,
|
||||
deceleration: 1500,
|
||||
maxSpeed: 500,
|
||||
jumpSpeed: 1500,
|
||||
canGrabPlatforms: true,
|
||||
ignoreDefaultControls: true,
|
||||
slopeMaxAngle: 60,
|
||||
},
|
||||
],
|
||||
});
|
||||
object.getWidth = function() {
|
||||
return 10;
|
||||
};
|
||||
object.getHeight = function() {
|
||||
return 20;
|
||||
};
|
||||
runtimeScene.addObject(object);
|
||||
object.setPosition(0, -30);
|
||||
|
||||
//Put a platform
|
||||
var platform = new gdjs.RuntimeObject(runtimeScene, {name: "obj2", type: "", behaviors: [{
|
||||
type: "PlatformBehavior::PlatformBehavior",
|
||||
canBeGrabbed: true,
|
||||
}]});
|
||||
platform.getWidth = function() { return 60; };
|
||||
platform.getHeight = function() { return 32; };
|
||||
runtimeScene.addObject(platform);
|
||||
platform.setPosition(0, -10);
|
||||
//Put a platform
|
||||
const platform = addPlatformObject(runtimeScene);
|
||||
platform.setPosition(0, -10);
|
||||
|
||||
it('follows the platform', function() {
|
||||
for(var i = 0; i<30; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
it('follows the platform', function() {
|
||||
for (var i = 0; i < 30; ++i) {
|
||||
runtimeScene.renderAndStep();
|
||||
}
|
||||
|
||||
// Check the object has not moved.
|
||||
expect(object.getY()).to.be(-30);
|
||||
expect(object.getX()).to.be(0);
|
||||
expect(object.getBehavior("auto1").isOnFloor()).to.be(true);
|
||||
expect(object.getBehavior("auto1").isFalling()).to.be(false);
|
||||
expect(object.getBehavior("auto1").isMoving()).to.be(false);
|
||||
// Check the object has not moved.
|
||||
expect(object.getY()).to.be(-30);
|
||||
expect(object.getX()).to.be(0);
|
||||
expect(object.getBehavior('auto1').isOnFloor()).to.be(true);
|
||||
expect(object.getBehavior('auto1').isFalling()).to.be(false);
|
||||
expect(object.getBehavior('auto1').isMoving()).to.be(false);
|
||||
|
||||
// Check that the object follow the platform, even if the
|
||||
// movement is less than one pixel.
|
||||
platform.setX(platform.getX()+0.12);
|
||||
runtimeScene.renderAndStep();
|
||||
platform.setX(platform.getX()+0.12);
|
||||
runtimeScene.renderAndStep();
|
||||
platform.setX(platform.getX()+0.12);
|
||||
runtimeScene.renderAndStep();
|
||||
// Check that the object follow the platform, even if the
|
||||
// movement is less than one pixel.
|
||||
platform.setX(platform.getX() + 0.12);
|
||||
runtimeScene.renderAndStep();
|
||||
platform.setX(platform.getX() + 0.12);
|
||||
runtimeScene.renderAndStep();
|
||||
platform.setX(platform.getX() + 0.12);
|
||||
runtimeScene.renderAndStep();
|
||||
|
||||
expect(object.getX()).to.be(0.36);
|
||||
});
|
||||
expect(object.getX()).to.be(0.36);
|
||||
});
|
||||
});
|
||||
|
@@ -42,6 +42,21 @@ void DeclareSystemInfoExtension(gd::PlatformExtension& extension) {
|
||||
.AddCodeOnlyParameter("currentScene", "")
|
||||
.SetFunctionName("SystemInfo::IsWebGLSupported")
|
||||
.SetIncludeFile("SystemInfo/SystemInfoTools.h");
|
||||
|
||||
extension
|
||||
.AddCondition(
|
||||
"IsPreview",
|
||||
_("Is the game running as a preview"),
|
||||
_(
|
||||
"Check if the game is currently being previewed in the editor. "
|
||||
"This can be used to enable a \"Debug mode\" or do some work only in previews."
|
||||
),
|
||||
_("The game is being previewed in the editor"),
|
||||
_("System information"),
|
||||
"CppPlatform/Extensions/systeminfoicon24.png",
|
||||
"CppPlatform/Extensions/systeminfoicon16.png")
|
||||
|
||||
.AddCodeOnlyParameter("currentScene", "");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -31,6 +31,10 @@ class SystemInfoJsExtension : public gd::PlatformExtension {
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
|
||||
.SetFunctionName("gdjs.evtTools.systemInfo.isWebGLSupported");
|
||||
GetAllConditions()["SystemInfo::IsPreview"]
|
||||
.codeExtraInformation
|
||||
.SetIncludeFile("Extensions/SystemInfo/systeminfotools.js")
|
||||
.SetFunctionName("gdjs.evtTools.systemInfo.isPreview");
|
||||
|
||||
StripUnimplementedInstructionsAndExpressions();
|
||||
GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION();
|
||||
|
@@ -36,4 +36,13 @@ gdjs.evtTools.systemInfo.isMobile = function() {
|
||||
*/
|
||||
gdjs.evtTools.systemInfo.isWebGLSupported = function(runtimeScene) {
|
||||
return runtimeScene.getGame().getRenderer().isWebGLSupported();
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if the game is running as a preview, launched from an editor.
|
||||
* @param {gdjs.RuntimeScene} runtimeScene The current scene.
|
||||
* @returns {boolean} true if the game is running as a preview.
|
||||
*/
|
||||
gdjs.evtTools.systemInfo.isPreview = function(runtimeScene) {
|
||||
return runtimeScene.getGame().isPreview();
|
||||
};
|
||||
|
@@ -10,203 +10,253 @@ Copyright (c) 2010-2016 Florian Rival (Florian.Rival@gmail.com)
|
||||
* @class TopDownMovementRuntimeBehavior
|
||||
* @constructor
|
||||
*/
|
||||
gdjs.TopDownMovementRuntimeBehavior = function(runtimeScene, behaviorData, owner)
|
||||
{
|
||||
gdjs.RuntimeBehavior.call(this, runtimeScene, behaviorData, owner);
|
||||
gdjs.TopDownMovementRuntimeBehavior = function(
|
||||
runtimeScene,
|
||||
behaviorData,
|
||||
owner
|
||||
) {
|
||||
gdjs.RuntimeBehavior.call(this, runtimeScene, behaviorData, owner);
|
||||
|
||||
//Behavior configuration:
|
||||
this._allowDiagonals = behaviorData.allowDiagonals;
|
||||
this._acceleration = behaviorData.acceleration;
|
||||
this._deceleration = behaviorData.deceleration;
|
||||
this._maxSpeed = behaviorData.maxSpeed;
|
||||
this._angularMaxSpeed = behaviorData.angularMaxSpeed;
|
||||
this._rotateObject = behaviorData.rotateObject;
|
||||
this._angleOffset = behaviorData.angleOffset;
|
||||
this._ignoreDefaultControls = behaviorData.ignoreDefaultControls;
|
||||
this._angle = 0; // The latest angle of movement, in degrees.
|
||||
//Behavior configuration:
|
||||
this._allowDiagonals = behaviorData.allowDiagonals;
|
||||
this._acceleration = behaviorData.acceleration;
|
||||
this._deceleration = behaviorData.deceleration;
|
||||
this._maxSpeed = behaviorData.maxSpeed;
|
||||
this._angularMaxSpeed = behaviorData.angularMaxSpeed;
|
||||
this._rotateObject = behaviorData.rotateObject;
|
||||
this._angleOffset = behaviorData.angleOffset;
|
||||
this._ignoreDefaultControls = behaviorData.ignoreDefaultControls;
|
||||
this._angle = 0; // The latest angle of movement, in degrees.
|
||||
|
||||
//Attributes used when moving
|
||||
this._xVelocity = 0;
|
||||
this._yVelocity = 0;
|
||||
this._angularSpeed = 0;
|
||||
this._leftKey = false;
|
||||
this._rightKey = false;
|
||||
this._upKey = false;
|
||||
this._downKey = false;
|
||||
//Attributes used when moving
|
||||
this._xVelocity = 0;
|
||||
this._yVelocity = 0;
|
||||
this._angularSpeed = 0;
|
||||
this._leftKey = false;
|
||||
this._rightKey = false;
|
||||
this._upKey = false;
|
||||
this._downKey = false;
|
||||
};
|
||||
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype = Object.create( gdjs.RuntimeBehavior.prototype );
|
||||
gdjs.registerBehavior("TopDownMovementBehavior::TopDownMovementBehavior", gdjs.TopDownMovementRuntimeBehavior);
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype = Object.create(
|
||||
gdjs.RuntimeBehavior.prototype
|
||||
);
|
||||
gdjs.registerBehavior(
|
||||
'TopDownMovementBehavior::TopDownMovementBehavior',
|
||||
gdjs.TopDownMovementRuntimeBehavior
|
||||
);
|
||||
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setAcceleration = function(acceleration) {
|
||||
this._acceleration = acceleration;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setAcceleration = function(
|
||||
acceleration
|
||||
) {
|
||||
this._acceleration = acceleration;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getAcceleration = function() {
|
||||
return this._acceleration;
|
||||
return this._acceleration;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setDeceleration = function(deceleration) {
|
||||
this._deceleration = deceleration;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setDeceleration = function(
|
||||
deceleration
|
||||
) {
|
||||
this._deceleration = deceleration;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getDeceleration = function() {
|
||||
return this._deceleration;
|
||||
return this._deceleration;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setMaxSpeed = function(maxSpeed) {
|
||||
this._maxSpeed = maxSpeed;
|
||||
this._maxSpeed = maxSpeed;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getMaxSpeed = function() {
|
||||
return this._maxSpeed;
|
||||
return this._maxSpeed;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setAngularMaxSpeed = function(angularMaxSpeed) {
|
||||
this._angularMaxSpeed = angularMaxSpeed;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setAngularMaxSpeed = function(
|
||||
angularMaxSpeed
|
||||
) {
|
||||
this._angularMaxSpeed = angularMaxSpeed;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getAngularMaxSpeed = function() {
|
||||
return this._angularMaxSpeed;
|
||||
return this._angularMaxSpeed;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setAngleOffset = function(angleOffset) {
|
||||
this._angleOffset = angleOffset;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setAngleOffset = function(
|
||||
angleOffset
|
||||
) {
|
||||
this._angleOffset = angleOffset;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getAngleOffset = function() {
|
||||
return this._angleOffset;
|
||||
return this._angleOffset;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.allowDiagonals = function(allow) {
|
||||
this._allowDiagonals = allow;
|
||||
this._allowDiagonals = allow;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.diagonalsAllowed = function() {
|
||||
return this._allowDiagonals;
|
||||
return this._allowDiagonals;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setRotateObject = function(allow) {
|
||||
this._rotateObject = allow;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.setRotateObject = function(
|
||||
allow
|
||||
) {
|
||||
this._rotateObject = allow;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.isObjectRotated = function() {
|
||||
return this._rotateObject;
|
||||
return this._rotateObject;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.isMoving = function() {
|
||||
return this._xVelocity !== 0 || this._yVelocity !== 0;
|
||||
return this._xVelocity !== 0 || this._yVelocity !== 0;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getSpeed = function() {
|
||||
return Math.sqrt(this._xVelocity*this._xVelocity+this._yVelocity*this._yVelocity);
|
||||
return Math.sqrt(
|
||||
this._xVelocity * this._xVelocity + this._yVelocity * this._yVelocity
|
||||
);
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getXVelocity = function() {
|
||||
return this._xVelocity;
|
||||
return this._xVelocity;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getYVelocity = function() {
|
||||
return this._yVelocity;
|
||||
return this._yVelocity;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.getAngle = function() {
|
||||
return this._angle;
|
||||
return this._angle;
|
||||
};
|
||||
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.doStepPreEvents = function(runtimeScene)
|
||||
{
|
||||
var LEFTKEY = 37;
|
||||
var UPKEY = 38;
|
||||
var RIGHTKEY = 39;
|
||||
var DOWNKEY = 40;
|
||||
var SHIFTKEY = 16;
|
||||
var object = this.owner;
|
||||
var timeDelta = this.owner.getElapsedTime(runtimeScene)/1000;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.doStepPreEvents = function(
|
||||
runtimeScene
|
||||
) {
|
||||
var LEFTKEY = 37;
|
||||
var UPKEY = 38;
|
||||
var RIGHTKEY = 39;
|
||||
var DOWNKEY = 40;
|
||||
var object = this.owner;
|
||||
var timeDelta = this.owner.getElapsedTime(runtimeScene) / 1000;
|
||||
|
||||
//Get the player input:
|
||||
this._leftKey |= !this._ignoreDefaultControls && runtimeScene.getGame().getInputManager().isKeyPressed(LEFTKEY);
|
||||
this._rightKey |= !this._ignoreDefaultControls && runtimeScene.getGame().getInputManager().isKeyPressed(RIGHTKEY);
|
||||
this._downKey |= !this._ignoreDefaultControls && runtimeScene.getGame().getInputManager().isKeyPressed(DOWNKEY);
|
||||
this._upKey |= !this._ignoreDefaultControls && runtimeScene.getGame().getInputManager().isKeyPressed(UPKEY);
|
||||
//Get the player input:
|
||||
this._leftKey |=
|
||||
!this._ignoreDefaultControls &&
|
||||
runtimeScene
|
||||
.getGame()
|
||||
.getInputManager()
|
||||
.isKeyPressed(LEFTKEY);
|
||||
this._rightKey |=
|
||||
!this._ignoreDefaultControls &&
|
||||
runtimeScene
|
||||
.getGame()
|
||||
.getInputManager()
|
||||
.isKeyPressed(RIGHTKEY);
|
||||
this._downKey |=
|
||||
!this._ignoreDefaultControls &&
|
||||
runtimeScene
|
||||
.getGame()
|
||||
.getInputManager()
|
||||
.isKeyPressed(DOWNKEY);
|
||||
this._upKey |=
|
||||
!this._ignoreDefaultControls &&
|
||||
runtimeScene
|
||||
.getGame()
|
||||
.getInputManager()
|
||||
.isKeyPressed(UPKEY);
|
||||
|
||||
var direction = -1;
|
||||
var directionInRad = 0;
|
||||
var directionInDeg = 0;
|
||||
if (!this._allowDiagonals) {
|
||||
if (this._upKey && !this._downKey) direction = 6;
|
||||
else if (!this._upKey && this._downKey) direction = 2;
|
||||
var direction = -1;
|
||||
var directionInRad = 0;
|
||||
var directionInDeg = 0;
|
||||
if (!this._allowDiagonals) {
|
||||
if (this._upKey && !this._downKey) direction = 6;
|
||||
else if (!this._upKey && this._downKey) direction = 2;
|
||||
|
||||
if (!this._upKey && !this._downKey) {
|
||||
if (this._leftKey && !this._rightKey) direction = 4;
|
||||
else if (!this._leftKey && this._rightKey) direction = 0;
|
||||
}
|
||||
if (!this._upKey && !this._downKey) {
|
||||
if (this._leftKey && !this._rightKey) direction = 4;
|
||||
else if (!this._leftKey && this._rightKey) direction = 0;
|
||||
}
|
||||
} else {
|
||||
if (this._upKey && !this._downKey) {
|
||||
if (this._leftKey && !this._rightKey) direction = 5;
|
||||
else if (!this._leftKey && this._rightKey) direction = 7;
|
||||
else direction = 6;
|
||||
} else if (!this._upKey && this._downKey) {
|
||||
if (this._leftKey && !this._rightKey) direction = 3;
|
||||
else if (!this._leftKey && this._rightKey) direction = 1;
|
||||
else direction = 2;
|
||||
} else {
|
||||
if (this._upKey && !this._downKey) {
|
||||
if (this._leftKey && !this._rightKey) direction = 5;
|
||||
else if (!this._leftKey && this._rightKey) direction = 7;
|
||||
else direction = 6;
|
||||
} else if (!this._upKey && this._downKey) {
|
||||
if (this._leftKey && !this._rightKey) direction = 3;
|
||||
else if (!this._leftKey && this._rightKey) direction = 1;
|
||||
else direction = 2;
|
||||
} else {
|
||||
if (this._leftKey && !this._rightKey) direction = 4;
|
||||
else if (!this._leftKey && this._rightKey) direction = 0;
|
||||
}
|
||||
if (this._leftKey && !this._rightKey) direction = 4;
|
||||
else if (!this._leftKey && this._rightKey) direction = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//Update the speed of the object
|
||||
if (direction != -1) {
|
||||
directionInRad = direction*Math.PI/4.0;
|
||||
directionInDeg = direction*45;
|
||||
//Update the speed of the object
|
||||
if (direction != -1) {
|
||||
directionInRad = (direction * Math.PI) / 4.0;
|
||||
directionInDeg = direction * 45;
|
||||
|
||||
this._xVelocity += this._acceleration*timeDelta*Math.cos(directionInRad);
|
||||
this._yVelocity += this._acceleration*timeDelta*Math.sin(directionInRad);
|
||||
} else {
|
||||
directionInRad = Math.atan2(this._yVelocity, this._xVelocity);
|
||||
directionInDeg = Math.atan2(this._yVelocity, this._xVelocity)*180.0/Math.PI;
|
||||
this._xVelocity +=
|
||||
this._acceleration * timeDelta * Math.cos(directionInRad);
|
||||
this._yVelocity +=
|
||||
this._acceleration * timeDelta * Math.sin(directionInRad);
|
||||
} else {
|
||||
directionInRad = Math.atan2(this._yVelocity, this._xVelocity);
|
||||
directionInDeg =
|
||||
(Math.atan2(this._yVelocity, this._xVelocity) * 180.0) / Math.PI;
|
||||
|
||||
var xVelocityWasPositive = this._xVelocity >= 0;
|
||||
var yVelocityWasPositive = this._yVelocity >= 0;
|
||||
this._xVelocity -= this._deceleration*timeDelta*Math.cos(directionInRad);
|
||||
this._yVelocity -= this._deceleration*timeDelta*Math.sin(directionInRad);
|
||||
if ( this._xVelocity > 0 ^ xVelocityWasPositive ) this._xVelocity = 0;
|
||||
if ( this._yVelocity > 0 ^ yVelocityWasPositive ) this._yVelocity = 0;
|
||||
var xVelocityWasPositive = this._xVelocity >= 0;
|
||||
var yVelocityWasPositive = this._yVelocity >= 0;
|
||||
this._xVelocity -=
|
||||
this._deceleration * timeDelta * Math.cos(directionInRad);
|
||||
this._yVelocity -=
|
||||
this._deceleration * timeDelta * Math.sin(directionInRad);
|
||||
if ((this._xVelocity > 0) ^ xVelocityWasPositive) this._xVelocity = 0;
|
||||
if ((this._yVelocity > 0) ^ yVelocityWasPositive) this._yVelocity = 0;
|
||||
}
|
||||
|
||||
var speed = Math.sqrt(
|
||||
this._xVelocity * this._xVelocity + this._yVelocity * this._yVelocity
|
||||
);
|
||||
if (speed > this._maxSpeed) {
|
||||
this._xVelocity = this._maxSpeed * Math.cos(directionInRad);
|
||||
this._yVelocity = this._maxSpeed * Math.sin(directionInRad);
|
||||
}
|
||||
this._angularSpeed = this._angularMaxSpeed; //No acceleration for angular speed for now
|
||||
|
||||
//Position object
|
||||
object.setX(object.getX() + this._xVelocity * timeDelta);
|
||||
object.setY(object.getY() + this._yVelocity * timeDelta);
|
||||
|
||||
//Also update angle if needed
|
||||
if (this._xVelocity !== 0 || this._yVelocity !== 0) {
|
||||
this._angle = directionInDeg;
|
||||
if (this._rotateObject) {
|
||||
object.rotateTowardAngle(
|
||||
directionInDeg + this._angleOffset,
|
||||
this._angularSpeed,
|
||||
runtimeScene
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
var speed = Math.sqrt(this._xVelocity*this._xVelocity+this._yVelocity*this._yVelocity);
|
||||
if ( speed > this._maxSpeed ) {
|
||||
this._xVelocity = this._maxSpeed*Math.cos(directionInRad);
|
||||
this._yVelocity = this._maxSpeed*Math.sin(directionInRad);
|
||||
}
|
||||
this._angularSpeed = this._angularMaxSpeed; //No acceleration for angular speed for now
|
||||
|
||||
//Position object
|
||||
object.setX(object.getX()+this._xVelocity*timeDelta);
|
||||
object.setY(object.getY()+this._yVelocity*timeDelta);
|
||||
|
||||
//Also update angle if needed
|
||||
if ( (this._xVelocity !== 0 || this._yVelocity !== 0) ) {
|
||||
this._angle = directionInDeg;
|
||||
if (this._rotateObject) {
|
||||
object.rotateTowardAngle(directionInDeg+this._angleOffset, this._angularSpeed, runtimeScene);
|
||||
}
|
||||
}
|
||||
|
||||
this._leftKey = false;
|
||||
this._rightKey = false;
|
||||
this._upKey = false;
|
||||
this._downKey = false;
|
||||
this._leftKey = false;
|
||||
this._rightKey = false;
|
||||
this._upKey = false;
|
||||
this._downKey = false;
|
||||
};
|
||||
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateControl = function(input) {
|
||||
if ( input === "Left" ) this._leftKey = true;
|
||||
else if ( input === "Right" ) this._rightKey = true;
|
||||
else if ( input === "Up" ) this._upKey = true;
|
||||
else if ( input === "Down" ) this._downKey = true;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateControl = function(
|
||||
input
|
||||
) {
|
||||
if (input === 'Left') this._leftKey = true;
|
||||
else if (input === 'Right') this._rightKey = true;
|
||||
else if (input === 'Up') this._upKey = true;
|
||||
else if (input === 'Down') this._downKey = true;
|
||||
};
|
||||
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.ignoreDefaultControls = function(ignore)
|
||||
{
|
||||
this._ignoreDefaultControls = ignore;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.ignoreDefaultControls = function(
|
||||
ignore
|
||||
) {
|
||||
this._ignoreDefaultControls = ignore;
|
||||
};
|
||||
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateLeftKey = function()
|
||||
{
|
||||
this._leftKey = true;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateLeftKey = function() {
|
||||
this._leftKey = true;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateRightKey = function()
|
||||
{
|
||||
this._rightKey = true;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateRightKey = function() {
|
||||
this._rightKey = true;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateUpKey = function()
|
||||
{
|
||||
this._upKey = true;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateUpKey = function() {
|
||||
this._upKey = true;
|
||||
};
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateDownKey = function()
|
||||
{
|
||||
this._downKey = true;
|
||||
gdjs.TopDownMovementRuntimeBehavior.prototype.simulateDownKey = function() {
|
||||
this._downKey = true;
|
||||
};
|
||||
|
File diff suppressed because one or more lines are too long
@@ -180,22 +180,20 @@ module.exports = {
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("mute");
|
||||
|
||||
object
|
||||
object
|
||||
.addAction(
|
||||
"SetTime",
|
||||
_("Set time"),
|
||||
_("Set the time of the video object in seconds"),
|
||||
_("Set time of _PARAM0_: _PARAM1__PARAM2_ seconds"),
|
||||
_("the time"),
|
||||
"",
|
||||
"JsPlatform/Extensions/videoicon24.png",
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter("operator", _("Modification's sign"), "", false)
|
||||
.addParameter("expression", _("Time in seconds"), "", false)
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setCurrentTime")
|
||||
.setManipulatedType("number")
|
||||
.setGetter("getCurrentTime");
|
||||
|
||||
object
|
||||
@@ -211,11 +209,9 @@ module.exports = {
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter("operator", _("Modification's sign"), "", false)
|
||||
.addParameter("expression", _("Value"), "", false)
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setVolume")
|
||||
.setManipulatedType("number")
|
||||
.setGetter("getVolume");
|
||||
|
||||
object
|
||||
@@ -384,11 +380,9 @@ module.exports = {
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter("operator", _("Modification's sign"), "", false)
|
||||
.addParameter("expression", _("Opacity (0-255)"), "", false)
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setOpacity")
|
||||
.setManipulatedType("number")
|
||||
.setGetter("getOpacity");
|
||||
|
||||
object
|
||||
@@ -431,11 +425,9 @@ module.exports = {
|
||||
"JsPlatform/Extensions/videoicon16.png"
|
||||
)
|
||||
.addParameter("object", _("Video object"), "VideoObject", false)
|
||||
.addParameter("operator", _("Modification's sign"), "", false)
|
||||
.addParameter("expression", _("Speed "), "", false)
|
||||
.useStandardOperatorParameters("number")
|
||||
.getCodeExtraInformation()
|
||||
.setFunctionName("setPlaybackSpeed")
|
||||
.setManipulatedType("number")
|
||||
.setGetter("getPlaybackSpeed");
|
||||
|
||||
object
|
||||
|
@@ -186,6 +186,9 @@ BaseObjectExtension::BaseObjectExtension() {
|
||||
GetAllConditions()["RaycastToPosition"]
|
||||
.SetFunctionName("RaycastObjectToPosition")
|
||||
.SetIncludeFile("GDCpp/Extensions/Builtin/RuntimeSceneTools.h");
|
||||
GetAllConditions()["SourisSurObjet"]
|
||||
.SetFunctionName("CursorOnObject")
|
||||
.SetIncludeFile("GDCpp/Extensions/Builtin/ObjectTools.h");
|
||||
|
||||
GetAllExpressions()["Count"]
|
||||
.SetFunctionName("PickedObjectsCount")
|
||||
|
@@ -48,17 +48,13 @@ MouseExtension::MouseExtension() {
|
||||
GetAllConditions()["MouseButtonReleased"]
|
||||
.SetFunctionName("MouseButtonReleased")
|
||||
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
|
||||
GetAllConditions()["IsMouseWheelScrollingUp"]
|
||||
GetAllConditions()["IsMouseWheelScrollingUp"]
|
||||
.SetFunctionName("IsMouseWheelScrollingUp")
|
||||
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
|
||||
GetAllConditions()["IsMouseWheelScrollingDown"]
|
||||
GetAllConditions()["IsMouseWheelScrollingDown"]
|
||||
.SetFunctionName("IsMouseWheelScrollingDown")
|
||||
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
|
||||
|
||||
GetAllConditions()["SourisSurObjet"]
|
||||
.SetFunctionName("CursorOnObject")
|
||||
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
|
||||
|
||||
GetAllExpressions()["MouseX"]
|
||||
.SetFunctionName("GetCursorXPosition")
|
||||
.SetIncludeFile("GDCpp/Extensions/Builtin/MouseTools.h");
|
||||
|
@@ -1,7 +1,6 @@
|
||||
#include "GDCpp/Extensions/Builtin/MouseTools.h"
|
||||
#include <SFML/Graphics.hpp>
|
||||
#include "GDCpp/Runtime/RuntimeLayer.h"
|
||||
#include "GDCpp/Runtime/RuntimeObjectsListsTools.h"
|
||||
#include "GDCpp/Runtime/RuntimeScene.h"
|
||||
|
||||
void GD_API CenterCursor(RuntimeScene &scene) {
|
||||
@@ -83,14 +82,3 @@ bool GD_API IsMouseWheelScrollingUp(RuntimeScene &scene) {
|
||||
bool GD_API IsMouseWheelScrollingDown(RuntimeScene &scene) {
|
||||
return scene.GetInputManager().IsScrollingDown();
|
||||
}
|
||||
|
||||
bool GD_API CursorOnObject(
|
||||
std::map<gd::String, std::vector<RuntimeObject *> *> objectsLists,
|
||||
RuntimeScene &scene,
|
||||
bool precise,
|
||||
bool conditionInverted) {
|
||||
return PickObjectsIf(
|
||||
objectsLists, conditionInverted, [&scene, precise](RuntimeObject *obj) {
|
||||
return obj->CursorOnObject(scene, precise);
|
||||
});
|
||||
}
|
||||
|
@@ -26,10 +26,5 @@ bool GD_API MouseButtonReleased(RuntimeScene &scene, const gd::String &key);
|
||||
int GD_API GetMouseWheelDelta(RuntimeScene &scene);
|
||||
bool GD_API IsMouseWheelScrollingUp(RuntimeScene &scene);
|
||||
bool GD_API IsMouseWheelScrollingDown(RuntimeScene &scene);
|
||||
bool GD_API CursorOnObject(
|
||||
std::map<gd::String, std::vector<RuntimeObject *> *> objectsLists,
|
||||
RuntimeScene &scene,
|
||||
bool precise,
|
||||
bool conditionInverted);
|
||||
|
||||
#endif // MOUSETOOLS_H
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user