src/Rope.hh
author nireco
Mon, 08 Dec 2008 23:11:40 +0000
changeset 327 09a3b5055862
parent 322 f94a5c192097
child 328 51d644c8d5a2
permissions -rw-r--r--
stronger texture
#ifndef ROPE_HH
#define ROPE_HH

// Pre-declarations since rope wants to know the Player
// and the Player wants to know the rope.
class Rope;

#include "Player.hh"
#include "PhysicsObject.hh"
#include "GraphicsPointer.hh"

/**
 * The rope can be in one of three states...
 *
 * @see Rope
 */
enum RopeState {
    ROPE_FOLDED,    //<<< The rope is folded, out of sight, and not in use
    ROPE_FLYING,    //<<< The rope is flying through the air as a projectile
    ROPE_FIXED      //<<< The rope is attached to something
};

/**
 * A rope is a PhysicsObject that can be thrown, whereupon it then flies until it hits something, whereupon
 * it attaches to that, and sets itself as the player's pivot.
 */
class Rope : public PhysicsObject {
private:
    // the owner
    Player &player;

    // How long is the rope in its unstrected state
    float length;
        
    // basic state
    RopeState state;

protected:
    /**
     * Attach the rope, so disable the PhysicsObject and change state
     * @param collisionPoint Where the rope has hit the ground.
     */
    virtual void onCollision (Vector collisionPoint, PhysicsObject *other);

public:
    Rope(Player &player);
        
    /*
     * Throw the rope, so it flies up and away: o._-*
     */
    void throwRope (void);

    /*
     * Release the rope, so if it's currently fixed or flying, then fold it 
     */
    void release (void);

    /*
     * Climb up/down the rope
     */
    void changeLength (float delta);
        
    /*
     * Current state
     */
    RopeState getState (void);

    /*
     * Current length
     */
    float getLength (void);

    /*
     * For use by NetworkClient
     */
    void updateState (RopeState state, Vector position, Vector velocity, float length);
    void updateLength (float length);
        
    virtual void tick (TimeMS dt);

    /*
     * Just draws it
     */ 
    virtual void draw (Graphics *c, PixelCoordinate camera);
};

#endif