CabinGame/Luxe/math/vector.wren
2020-09-03 17:31:23 +02:00

132 lines
No EOL
2 KiB
Text

class Vector is Sequence{
x{_x}
x=(val){_x = val}
y{_y}
y=(val){_y = val}
list{[x, y]}
construct new(x, y){
_x = x
_y = y
}
construct new(arg){
if(arg is Num){
_x = arg
_y = arg
} else {
_x = arg.x
_y = arg.y
}
}
construct new(){
_x = 0
_y = 0
}
floor(){
_x = _x.floor
_y = _y.floor
return this
}
invert_x(){
_x = -_x
return this
}
invert_y(){
_y = -_y
return this
}
static or_lt(one, other){
return one.x < other.x || one.y < other.y
}
static or_gt(one, other){
return one.x > other.x || one.y > other.y
}
toString {
return "(%(x)|%(y))"
}
y0(){
_y = 0
return this
}
x0(){
_x = 0
return this
}
iterate(iter){
if(iter == null) return 0
if(iter >= 1) return false
return iter + 1
}
iteratorValue(iter){this[iter]}
[index]{
if(index == 0){
return x
} else if(index == 1){
return y
}
return false
}
+(other){
if(other is Num) {
return Vector.new(x + other, y + other)
}
return Vector.new(x + other.x, y + other.y)
}
-(other){
return Vector.new(x - other.x, y - other.y)
}
*(other){
if(other is Vector || other is List){
return Vector.new(x * other.x, y * other.y)
}
if(other is Num) {
return Vector.new(x * other, y * other)
}
}
/(other){
if(other is Vector || other is List) {
return Vector.new(x / other.x, y / other.y)
}
if(other is Num) {
return Vector.new(x / other, y / other)
}
}
%(other){
if(other is Vector || other is List) {
return Vector.new(x % other.x, y % other.y)
}
if(other is Num) {
return Vector.new(x % other, y % other)
}
}
<(other){
return x < other.x && y < other.y
}
>(other){
return x > other.x && y > other.y
}
}