1-- Trigger functions for the different weapons.
2local weapons = {
3    knife = function(self)
4        local level = self:getLevel()
5        local entity = jvgslua.Entity("resources/knife/knife.xml", level)
6
7        local velocity = jvgslua.Vector2D_fromPolar(entity:getSpeed(), math.random() * 20 - 10)
8
9        if not self:isFacingRight() then
10            velocity:setX(-velocity:getX())
11        end
12
13        entity:setPosition(self:getPosition())
14        entity:setVelocity(velocity)
15        level:addEntity(entity)
16        self:setTimer(2000)
17
18        local am = jvgslua.AudioManager_getInstance()
19        am:playSound("resources/knife/throw.ogg")
20    end,
21
22    clock = function(self)
23        local em = jvgslua.EffectManager_getInstance()
24        local te = jvgslua.TimeEffect(0.2, 3000)
25        em:addEffect(te)
26        self:setTimer(3000)
27    end,
28
29    hat = function(self)
30        local velocity = jvgslua.Vector2D(0.0, -1.0) * self:getSpeed() * 2
31        self:setVelocity(velocity)
32        self:setTimer(500)
33        local pos = jvgslua.Vector2D(self:getPosition():getX(),
34                self:getPosition():getY() + self:getRadius():getY())
35        effects.stars(pos, 0.5, {"star"})
36    end,
37
38    grenade = function(self)
39        local level = self:getLevel()
40        local entity = jvgslua.Entity("resources/grenade/grenade.xml", level)
41
42        local velocity = jvgslua.Vector2D_fromPolar(entity:getSpeed(), -math.random() * 45)
43
44        if not self:isFacingRight() then
45            velocity:setX(-velocity:getX())
46        end
47
48        entity:setPosition(self:getPosition())
49        entity:setVelocity(velocity)
50        level:addEntity(entity)
51        self:setTimer(4000)
52    end
53}
54
55events.trigger{
56    spawn = function(self, event)
57        self:setBool("ready", true)
58    end,
59
60    die = function(self, event)
61        common.gameOver()
62    end,
63
64    action = function(self, event)
65        print(string.format("<point x=\"%.0f\" y=\"%.0f\" \/>",
66                self:getPosition():getX(), self:getPosition():getY()))
67
68        if self:isSet("weapon") and self:getBool("ready") then
69            local weapon = self:get("weapon")
70            if weapons[weapon] then weapons[weapon](self) end
71            self:setBool("ready", false)
72            local sprite = jvgslua.Sprite("resources/player/regular-sprite.xml")
73            self:setSprite(sprite)
74        end
75    end,
76
77    timer = function(self, event)
78        if common.isDead(self) then
79            -- Falling sequence limit reached.
80            common.gameOver()
81        else
82            if self:isSet("weapon") then
83                local sprite = jvgslua.Sprite("resources/player/" ..
84                        self:get("weapon") .. "-sprite.xml")
85                self:setSprite(sprite)
86            end
87
88            self:setBool("ready", true)
89        end
90    end,
91
92    property = function(self, event)
93        if event:getKey() == "health" and common.isDead(self) then
94            effects.commonDie(self)
95            local em = jvgslua.EffectManager_getInstance()
96            local effect = jvgslua.InvertEffect()
97            em:addEffect(effect)
98            local lm = jvgslua.LevelManager_getInstance()
99            lm:setTimeFactor(0.2)
100            -- Limit falling sequence.
101            self:setTimer(1000)
102        end
103    end
104}
105