src/Rope.hh
author saiam
Mon, 08 Dec 2008 00:05:45 +0000
changeset 273 eeb699e1d908
parent 255 99431fdb0dc8
child 283 7540b0859579
permissions -rw-r--r--
Made forceq to contain time again.
#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"

enum RopeState {
    ROPE_FOLDED, 
    ROPE_FLYING, 
    ROPE_FIXED 
};

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);

    /*
     * If the rope is currently longer than length, this returns ROPE_FORCE, else 0
     */
    virtual float getPivotForce (PhysicsObject *bob);

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