File: tubes.ss

package info (click to toggle)
opensurge 0.6.1.3%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 47,404 kB
  • sloc: ansic: 62,066; sh: 739; makefile: 193; java: 110; xml: 66; javascript: 53
file content (140 lines) | stat: -rw-r--r-- 3,519 bytes parent folder | download
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// -----------------------------------------------------------------------------
// File: tubes.ss
// Description: tube system
// Author: Alexandre Martins <http://opensurge2d.org>
// License: MIT
// -----------------------------------------------------------------------------
using SurgeEngine.Level;
using SurgeEngine.Player;
using SurgeEngine.Audio.Sound;
using SurgeEngine.Collisions.CollisionBox;

// Tube Out unlocks the player
object "Tube Out" is "entity", "special"
{
    tube = spawn("Tube");
    sfx = Sound("samples/tube.wav");
    maxSpeed = 960;
    boostSpeed = 600;

    fun onTubeCollision(player)
    {
        // cap the speed when entering the tube
        if(player.input.enabled)
            player.gsp = Math.clamp(player.gsp, -maxSpeed, maxSpeed);

        // tube logic
        if(player.rolling) {
            // Tube In guarantees that
            // player.input.enabled == false
            // just before this occurs
            player.input.enabled = !player.input.enabled;
        }
        else {
            // walking at the entrance of the tube?
            player.input.enabled = true;
        }

        // roll
        if(!player.rolling) {
            sfx.play();
            player.roll();
        }
    }

    fun onTubeOverlap(player)
    {
        // do nothing if the player is midair
        if(player.midair)
            return;

        // boost the player
        if(isOutsideTheTube(player))
            boost(player);
    }

    fun isOutsideTheTube(player)
    {
        return (player.child("Tube - Player Watcher") == null);
    }

    fun boost(player)
    {
        if(player.gsp >= 0)
            player.gsp = Math.max(boostSpeed, player.gsp);
        else
            player.gsp = Math.min(-boostSpeed, player.gsp);
    }
}

// Tube In locks the player
object "Tube In" is "entity", "special"
{
    tube = spawn("Tube");
    refs = [];

    fun onTubeCollision(player)
    {
        // disable input
        player.input.enabled = false;

        // spawn the watcher
        if(player.child("Tube - Player Watcher") == null) {
            watcher = player.spawn("Tube - Player Watcher");
            refs.push(watcher);
        }
    }

    fun onTubeOverlap(player)
    {
    }
}

// Base class
object "Tube" is "private", "special", "entity"
{
    collider = CollisionBox(32, 32);

    fun onCollision(otherCollider)
    {
        if(otherCollider.entity.hasTag("player")) {
            player = otherCollider.entity;
            if(!player.frozen)
                parent.onTubeCollision(player);
        }
    }

    fun onOverlap(otherCollider)
    {
        if(otherCollider.entity.hasTag("player")) {
            player = otherCollider.entity;
            if(!player.frozen)
                parent.onTubeOverlap(player);
        }
    }
}

// An object that watches the player while inside the tube
object "Tube - Player Watcher" is "special", "companion"
{
    player = parent;
    pushSpeed = 300;
    pushThreshold = 60;

    state "main"
    {
        // prevent soft lock by giving the player a little push if needed
        if(Math.abs(player.gsp) < pushThreshold)
            player.gsp = pushSpeed * Math.sign(player.gsp);

        // the player is out of the tube: we're done
        // (or we froze it with some other script)
        if(player.input.enabled || player.frozen)
            destroy();

        // the player may get unrolled if he or she falls inside the tube
        else if(!player.rolling)
            player.roll();

    }
}