mmb.engine.worlds.world.PlayerPhysicsPipe Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of multimachinebuilder Show documentation
Show all versions of multimachinebuilder Show documentation
Dependency for the MultiMachineBuilder, a voxel game about building an industrial empire in a finite world.
THIS RELEASE IS NOT PLAYABLE. To play the game, donwload from >ITCH.IO LINK HERE< or >GH releases link here<
The newest version!
/**
*
*/
package mmb.engine.worlds.world;
import org.joml.Vector2d;
import mmb.NN;
import mmb.content.ppipe.Direction;
import mmb.content.ppipe.PipeTunnel;
import mmb.content.ppipe.PipeTunnelEntry;
import mmb.engine.debug.Debugger;
/**
* Defines behavior of the player in pipes
* @author oskar
*/
public class PlayerPhysicsPipe implements PlayerPhysics {
private static final Debugger debug = new Debugger("PLAYER IN PIPE");
//When player reaches end of the pipe, then it returns to beginning
@Override
public void onTick(World w, Player p, double ctrlX, double ctrlY) {
//Transfer to next or previous
boolean check = true;
while(check) {
//Perform checks
boolean below = direction == Direction.BWD && progress < 0;
boolean above = direction == Direction.FWD && progress > pipe.path.length;
check = below || above;
//Some old values
Direction olddir = direction;
double len = pipe.path.length;
//Define replacements
Direction newdir = direction;
double newprog = progress;
double oldprog = progress;
PipeTunnel newpipe = pipe;
if(below) {
PipeTunnelEntry pte = pipe.findPrev();
if(pte == null) {
progress += len;
eject(p);
return;
}
newprog += len;
newpipe = pte.pipe;
newdir = pte.dir;
if(olddir != newdir) newprog = -oldprog;
}
if(above) {
PipeTunnelEntry pte = pipe.findNext();
if(pte == null) {
progress -= len;
eject(p);
return;
}
newprog -= len;
newpipe = pte.pipe;
newdir = pte.dir;
/*
* 0123456789ABCDEFGHIJKLMN
* EDCBA9876543210
* 0 - - - a>||
* |<->|
* pt2
* A 8 6 4 2 0
* ||
* 0 - - - a>||<->|
* pt1 pt2
* |<-------->|
* len travel
*/
if(olddir != newdir) newprog = (len+newpipe.path.length)/2 - newprog;
}
//Update the values
direction = newdir;
progress = newprog;
pipe = newpipe;
}
//Move along the pipe
double speed = p.speed.x;
speed += ACCELRATION * 0.02;
if(speed > MAX_SPEED) speed = MAX_SPEED;
progress += speed * direction.mul * 0.02;
pipe.path.interpolate(progress, p.pos);
p.speed.x = speed;
p.speed.y = 0;
}
private static final double MAX_SPEED = 10.0;
private static final double ACCELRATION = 1.0;
//Ejects the player out of the pipe
private void eject(Player p) {
Vector2d dump = new Vector2d();
progress += 1.5 * direction.mul;
pipe.path.interpolate(progress, dump);
p.pos.set(dump);
p.speed.x = 0;
p.speed.y = 0;
p.physics = new PlayerPhysicsNormal();
debug.printl("Player ejected");
}
public double progress;
public PipeTunnel pipe;
@NN public Direction direction = Direction.FWD;
@Override
public String description() {
return "Direction: "+direction;
}
}