diff --git a/sjplayer/src/sjplayer/CircleElement.d b/sjplayer/src/sjplayer/CircleElement.d index f086ef6..dbaaf37 100644 --- a/sjplayer/src/sjplayer/CircleElement.d +++ b/sjplayer/src/sjplayer/CircleElement.d @@ -3,6 +3,7 @@ module sjplayer.CircleElement; import std.algorithm, std.conv, + std.math, std.exception; import gl4d; @@ -34,7 +35,36 @@ class CircleElement : ElementInterface { } override DamageCalculationResult CalculateDamage(vec2 p1, vec2 p2) const { - // TODO: + if (!alive) return DamageCalculationResult(0, 0); + + const m = matrix.transposed.inverse; + + const a = (m * vec3(p1, 1)).xy; + const b = (m * vec3(p2, 1)).xy; + const s = b - a; + + const s_length = s.length; + if (s_length == 0) { + // TODO: nearness calculation + return DamageCalculationResult(a.length < 1? damage: 0, 0); + } + + const d = cross(vec3(s, 0), vec3(a, 0)).length / s_length; + if (d > 1) { + const nearness = (1 - (d-1).min(1f)).pow(2); + return DamageCalculationResult(0, nearness * nearness_coe); + } + + const a_length = a.length; + const b_length = b.length; + + const hit = + a.dot(s) * b.dot(s) <= 0 || + a_length < 1 || + b_length < 1; + if (hit) return DamageCalculationResult(damage, 0); + + // TODO: nearness calculation return DamageCalculationResult(0, 0); } diff --git a/sjplayer/src/sjplayer/Context.d b/sjplayer/src/sjplayer/Context.d index 16578a6..3fd3724 100644 --- a/sjplayer/src/sjplayer/Context.d +++ b/sjplayer/src/sjplayer/Context.d @@ -81,7 +81,14 @@ class Context { /// ElementInterface.DamageCalculationResult CalculateDamage() const { - assert(false); // TODO: + auto result = ElementInterface.DamageCalculationResult(0, 0); + elements_. + map!(x => x.CalculateDamage(actor_.pos, actor_.pos - actor_.speed)). + each!((x) { + result.damage += x.damage; + result.nearness += x.nearness; + }); + return result; } /// diff --git a/sjplayer/standalone/main.d b/sjplayer/standalone/main.d index c95ebea..f81259c 100644 --- a/sjplayer/standalone/main.d +++ b/sjplayer/standalone/main.d @@ -43,6 +43,14 @@ int main(string[] args) { context.actor.Update(); context.posteffect.Update(); + const dmg = context.CalculateDamage(); + if (dmg.damage != 0) { + "damage: %f (%f)".writefln(dmg.damage, beat); + } + if (dmg.nearness != 0) { + "nearness: %f (%f)".writefln(dmg.nearness, beat); + } + context.StartDrawing(); context.DrawBackground();