-
Notifications
You must be signed in to change notification settings - Fork 1
/
RuneDivision.cs
90 lines (86 loc) · 2.36 KB
/
RuneDivision.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using Assets.draco18s.runic.init;
using Assets.draco18s.util;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Assets.draco18s.runic.runes {
internal class RuneDivision : IExecutableRune {
public bool Execute(Pointer pointer, ExecutionContext context) {
object a = pointer.Pop();
object b = pointer.Pop();
if(a != null && b != null) {
if(a is ValueType && b is ValueType) {
if(MathHelper.IsInteger((ValueType)a) && MathHelper.IsInteger((ValueType)b)) {
double v = MathHelper.GetValue((ValueType)a);
if(Mathf.Approximately((float)v, 0)) {
pointer.DeductMana(pointer.GetMana());
return true;
}
float c = (float)MathHelper.GetValue((ValueType)b) / (int)v;
pointer.Push(c);
}
else if(a is Vector3 || b is Vector3) {
if(a is Vector3 && b is Vector3) {
pointer.Push(Vector3.Dot((Vector3)a, (Vector3)b));
}
else if(a is Vector3) {
double d = MathHelper.GetValue((ValueType)b);
if(Mathf.Approximately((float)d, 0)) {
pointer.DeductMana(pointer.GetMana());
return true;
}
pointer.Push(((Vector3)a) / (float)d);
}
else if(b is Vector3) {
double d = MathHelper.GetValue((ValueType)a);
if(Mathf.Approximately((float)d,0)) {
pointer.DeductMana(pointer.GetMana());
return true;
}
pointer.Push(((Vector3)b) / (float)d);
}
}
else {
double d = MathHelper.GetValue((ValueType)a);
if(Mathf.Approximately((float)d,0)) {
pointer.DeductMana(pointer.GetMana());
return true;
}
double c = MathHelper.GetValue((ValueType)b) / d;
pointer.Push(c);
}
}
else if(a is ValueType && b is string) {
string s = (string)b;
int n = (int)MathHelper.GetValue((ValueType)a);
int m = 0;
int r = 0;
if(n < 0) {
n *= -1;
m = (int)(Math.Ceiling((float)s.Length / n) * n);
r = m - s.Length;
s = s.PadLeft(m);
}
bool b2 = true;
foreach(string chk in s.ChunksUpto(n)) {
if(b2 && r > 0) {
string chk2 = chk.Substring(r);
b2 = false;
pointer.Push(chk2);
}
else {
pointer.Push(chk);
}
}
}
else {
}
}
return true;
}
public IExecutableRune Register() {
RuneRegistry.ALL_RUNES.Add(',', this);
return this;
}
}
}