diff --git a/objects/oTsumuri.object.gmx b/objects/oTsumuri.object.gmx index a4e13ae..e6b8545 100644 --- a/objects/oTsumuri.object.gmx +++ b/objects/oTsumuri.object.gmx @@ -34,18 +34,33 @@ hitsound = sndEHit5; deathsound = sndEDeath1; platyoffset = -14; frozenspr = sTsumuriFrozen; -target = 0; -canattack = 1; +image_speed = 0.2; state = 1; -myangle = 0; -update = 1; -sbstate = 0; -sbmove = 0; -angleprevious = 0; -rotationspeed = 0; +angle = 0; +shouldMove = true; +tsumuriState = 0; +tsumuriDirection = 0; +previousAngle = 0; +rotationSpeed = 0; falling = false; xVel = 0; yVel = 0; + +enum TsumuriStates{ + FALLING, + BOTTOMFLOOR, + RIGHTWALL, + CEILING, + LEFTWALL, + INNERDOWNRIGHTWALL, + INNERUPRIGHTWALL, + INNERUPLEFTWALL, + INNERDOWNLEFTWALL, + OUTERUPRIGHTWALL, + OUTERDOWNRIGHTWALL, + OUTERDOWNLEFTWALL, + OUTERUPLEFTWALL +} @@ -68,19 +83,20 @@ yVel = 0; 1 - if(sbstate == 0) { + // If Tsumuri is falling, make it fall faster +if(tsumuriState == TsumuriStates.FALLING) { yVel += 0.1; if (stun == 0) moveTo(xVel, yVel); alarm[0] = 1; } else { - angleprevious = 0; - direction = myangle; + previousAngle = 0; + direction = angle; image_angle = direction; xVel = 0; yVel = 0; - x=round(x); - y=round(y); + x = round(x); + y = round(y); falling = false; } @@ -138,42 +154,45 @@ if (room_width <= 320) { // just in case we have flush rooms, we don't want t 1 action_inherited(); if (active == 1 && frozen == 0) { - update = !update; + shouldMove = !shouldMove; - // movement // Run the movement code every other step, effectively resulting in 0.5 speed. - if(update){ + // Run the movement code every other step, effectively resulting in 0.5 speed. + if(shouldMove){ event_user(1); } var inst1 = collision_line(x-2, y, x+2, y, oSolid, false, true), inst2 = collision_line(x, y-2, x, y+2, oSolid, false, true), - inst = noone; // -1 IS SELF YOU DIP + inst = noone; + + // If we're on Slopes, set our angle accordingly if(instance_exists(inst1) && string_pos("Slope", object_get_name(inst1.object_index))) inst = inst1; else if(instance_exists(inst2) && string_pos("Slope", object_get_name(inst2.object_index))) inst = inst2; if(instance_exists(inst)) { - if(string_pos("1", object_get_name(inst.object_index))) myangle = 45; - if(string_pos("2", object_get_name(inst.object_index))) myangle = 315; - if(string_pos("3", object_get_name(inst.object_index))) myangle = 225; - if(string_pos("4", object_get_name(inst.object_index))) myangle = 135; - if(string_pos("1B", object_get_name(inst.object_index))) myangle = 25; - if(string_pos("2B", object_get_name(inst.object_index))) myangle = 334; - if(string_pos("3B", object_get_name(inst.object_index))) myangle = 205; - if(string_pos("4B", object_get_name(inst.object_index))) myangle = 154; + if(string_pos("1", object_get_name(inst.object_index))) angle = 45; + if(string_pos("2", object_get_name(inst.object_index))) angle = 315; + if(string_pos("3", object_get_name(inst.object_index))) angle = 225; + if(string_pos("4", object_get_name(inst.object_index))) angle = 135; + if(string_pos("1B", object_get_name(inst.object_index))) angle = 25; + if(string_pos("2B", object_get_name(inst.object_index))) angle = 334; + if(string_pos("3B", object_get_name(inst.object_index))) angle = 205; + if(string_pos("4B", object_get_name(inst.object_index))) angle = 154; } - if(angleprevious != myangle) { - rotationspeed = (abs(angle_difference(myangle, angleprevious))*15)/90; - angleprevious = myangle; + if(previousAngle != angle) { + rotationSpeed = (abs(angle_difference(angle, previousAngle))*15)/90; + previousAngle = angle; } - if(falling == false) turn_towards_direction(myangle, rotationspeed); + if(falling == false) turn_towards_direction(angle, rotationSpeed); image_angle = direction; - image_speed = 0.2; + + // Make Tsumuri fall if there's oQuake if (instance_number(oQuake) > 0 && falling == false) { if(image_angle >= 90 && image_angle <= 270) { x = x + lengthdir_x(4, image_angle + 90); y = y + lengthdir_y(4, image_angle + 90); } } -} // if (active == 1 && frozen == 0) +} if (state == 100) enemy_death(); @@ -197,167 +216,120 @@ if (state == 100) enemy_death(); 1 - ///Movement Refactor Attempt 1 + /// Tsumuris Movement Code -sbstateprevious = sbstate; -sbstate = 0; -edgedl = position_meeting(x - 2, y + 1, oSolid); -edgedr = position_meeting(x + 2, y + 1, oSolid); -edgeul = position_meeting(x - 2, y - 2, oSolid); -edgeur = position_meeting(x + 2, y - 2, oSolid); +tsumuriState = TsumuriStates.FALLING; +edgedl = position_meeting(x - 2, y + 1, oSolid); // down-left +edgedr = position_meeting(x + 2, y + 1, oSolid); // down-right +edgeul = position_meeting(x - 2, y - 2, oSolid); // up-left +edgeur = position_meeting(x + 2, y - 2, oSolid); // up-right if (isCollisionBottom(0) == 1) y -= 1; if (isCollisionTop(0) == 1) y += 1; if (isCollisionLeft(0) == 1) x += 1; if (isCollisionRight(0) == 1) x -= 1; -var _collisionRight = isCollisionRight(1); -var _collisionLeft = isCollisionLeft(1); -var _collisionBottom = isCollisionBottom(1); -var _collisionTop = isCollisionTop(1); +// We save the results from Collision checks, in order to only need to call them once +var tempCollisionRight = isCollisionRight(1); +var tempCollisionLeft = isCollisionLeft(1); +var tempCollisionBottom = isCollisionBottom(1); +var tempCollisionTop = isCollisionTop(1); -if (_collisionBottom && !_collisionRight && !_collisionLeft) sbstate = 1; -if (_collisionRight && !_collisionBottom && !_collisionTop) sbstate = 2; -if (_collisionTop && !_collisionRight && !_collisionLeft) sbstate = 3; -if (_collisionLeft && !_collisionBottom && !_collisionTop) sbstate = 4; +if (tempCollisionBottom && !tempCollisionRight && !tempCollisionLeft) tsumuriState = TsumuriStates.BOTTOMFLOOR; +if (tempCollisionRight && !tempCollisionBottom && !tempCollisionTop) tsumuriState = TsumuriStates.RIGHTWALL; +if (tempCollisionTop && !tempCollisionRight && !tempCollisionLeft) tsumuriState = TsumuriStates.CEILING; +if (tempCollisionLeft && !tempCollisionBottom && !tempCollisionTop) tsumuriState = TsumuriStates.LEFTWALL; -if (_collisionBottom && _collisionRight) sbstate = 5; -if (_collisionTop && _collisionRight) sbstate = 6; -if (_collisionTop && _collisionLeft) sbstate = 7; -if (_collisionBottom && _collisionLeft) sbstate = 8; +if (tempCollisionBottom && tempCollisionRight) tsumuriState = TsumuriStates.INNERDOWNRIGHTWALL; +if (tempCollisionTop && tempCollisionRight) tsumuriState = TsumuriStates.INNERUPRIGHTWALL; +if (tempCollisionTop && tempCollisionLeft) tsumuriState = TsumuriStates.INNERUPLEFTWALL; +if (tempCollisionBottom && tempCollisionLeft) tsumuriState = TsumuriStates.INNERDOWNLEFTWALL; -if (!_collisionRight && !_collisionLeft && !_collisionBottom && !_collisionTop) { - if (edgedl == 1 && edgeul == 0 && edgeur == 0 && edgedr == 0) sbstate = 9; - if (edgeul == 1 && edgedl == 0 && edgeur == 0 && edgedr == 0) sbstate = 10; - if (edgeur == 1 && edgedl == 0 && edgeul == 0 && edgedr == 0) sbstate = 11; - if (edgedr == 1 && edgedl == 0 && edgeul == 0 && edgeur == 0) sbstate = 12; +if (!tempCollisionRight && !tempCollisionLeft && !tempCollisionBottom && !tempCollisionTop) { + if (edgedl == 1 && edgeul == 0 && edgeur == 0 && edgedr == 0) tsumuriState = TsumuriStates.OUTERUPRIGHTWALL; + if (edgeul == 1 && edgedl == 0 && edgeur == 0 && edgedr == 0) tsumuriState = TsumuriStates.OUTERDOWNRIGHTWALL; + if (edgeur == 1 && edgedl == 0 && edgeul == 0 && edgedr == 0) tsumuriState = TsumuriStates.OUTERDOWNLEFTWALL; + if (edgedr == 1 && edgedl == 0 && edgeul == 0 && edgeur == 0) tsumuriState = TsumuriStates.OUTERUPLEFTWALL; - if (edgedl == 1 && edgeul == 0 && edgeur == 0 && edgedr == 1) sbstate = 1; - if (edgedl == 0 && edgeul == 0 && edgeur == 1 && edgedr == 1) sbstate = 2; - if (edgedl == 0 && edgeul == 1 && edgeur == 1 && edgedr == 0) sbstate = 3; - if (edgedl == 1 && edgeul == 1 && edgeur == 0 && edgedr == 0) sbstate = 4; + if (edgedl == 1 && edgeul == 0 && edgeur == 0 && edgedr == 1) tsumuriState = TsumuriStates.BOTTOMFLOOR; + if (edgedl == 0 && edgeul == 0 && edgeur == 1 && edgedr == 1) tsumuriState = TsumuriStates.RIGHTWALL; + if (edgedl == 0 && edgeul == 1 && edgeur == 1 && edgedr == 0) tsumuriState = TsumuriStates.CEILING; + if (edgedl == 1 && edgeul == 1 && edgeur == 0 && edgedr == 0) tsumuriState = TsumuriStates.LEFTWALL; } -/*if (isCollisionBottom(1) == 1 && isCollisionRight(1) == 0 && isCollisionLeft(1) == 0) sbstate = 1; -if (isCollisionRight(1) == 1 && isCollisionBottom(1) == 0 && isCollisionTop(1) == 0) sbstate = 2; -if (isCollisionTop(1) == 1 && isCollisionRight(1) == 0 && isCollisionLeft(1) == 0) sbstate = 3; -if (isCollisionLeft(1) == 1 && isCollisionBottom(1) == 0 && isCollisionTop(1) == 0) sbstate = 4; - -if (isCollisionBottom(1) == 1 && isCollisionRight(1) == 1) sbstate = 5; -if (isCollisionTop(1) == 1 && isCollisionRight(1) == 1) sbstate = 6; -if (isCollisionTop(1) == 1 && isCollisionLeft(1) == 1) sbstate = 7; -if (isCollisionBottom(1) == 1 && isCollisionLeft(1) == 1) sbstate = 8; - -if (isCollisionBottom(1) == 0 && isCollisionLeft(1) == 0 && isCollisionRight(1) == 0 && isCollisionTop(1) == 0) { - if (edgedl == 1 && edgeul == 0 && edgeur == 0 && edgedr == 0) sbstate = 9; - if (edgeul == 1 && edgedl == 0 && edgeur == 0 && edgedr == 0) sbstate = 10; - if (edgeur == 1 && edgedl == 0 && edgeul == 0 && edgedr == 0) sbstate = 11; - if (edgedr == 1 && edgedl == 0 && edgeul == 0 && edgeur == 0) sbstate = 12; - - if (edgedl == 1 && edgeul == 0 && edgeur == 0 && edgedr == 1) sbstate = 1; - if (edgedl == 0 && edgeul == 0 && edgeur == 1 && edgedr == 1) sbstate = 2; - if (edgedl == 0 && edgeul == 1 && edgeur == 1 && edgedr == 0) sbstate = 3; - if (edgedl == 1 && edgeul == 1 && edgeur == 0 && edgedr == 0) sbstate = 4; -}*/ - // falling -if (sbstate == 0 && falling == false) { +if (tsumuriState == TsumuriStates.FALLING && falling == false) { falling = true; if(image_angle > 270 || image_angle < 90) xVel = 0.5 * facing; if(image_angle > 90 && image_angle < 270) xVel = -0.5 * facing; alarm[0] = 1; } -if (facing == 1 && sbmove == 0) { - if (sbstate == 1) sbmove = 1; - if (sbstate == 3) sbmove = -1; - if (sbstate == 5) sbmove = 1; - if (sbstate == 6) sbmove = -1; - if (sbstate == 7) sbmove = -1; - if (sbstate == 8) sbmove = 1; - if (sbstate == 9) sbmove = 1; - if (sbstate == 10) sbmove = -1; - if (sbstate == 11) sbmove = -1; - if (sbstate == 12) sbmove = 1; -} -if (facing == -1 && sbmove == 0) { - if (sbstate == 1) sbmove = -1; - if (sbstate == 3) sbmove = 1; - if (sbstate == 5) sbmove = -1; - if (sbstate == 6) sbmove = 1; - if (sbstate == 7) sbmove = 1; - if (sbstate == 8) sbmove = -1; - if (sbstate == 9) sbmove = -1; - if (sbstate == 10) sbmove = 1; - if (sbstate == 11) sbmove = 1; - if (sbstate == 12) sbmove = -1; -} -if (sbstate == 1) x += sbmove; -if (sbstate == 2) y -= sbmove; -if (sbstate == 3) x -= sbmove; -if (sbstate == 4) y += sbmove; -if (sbstate == 5) { - if (sbmove == 1) y -= 1; - if (sbmove == -1) x -= 1; -} -if (sbstate == 6) { - if (sbmove == 1) x -= 1; - if (sbmove == -1) y += 1; -} -if (sbstate == 7) { - if (sbmove == 1) y += 1; - if (sbmove == -1) x += 1; -} -if (sbstate == 8) { - if (sbmove == 1) x += 1; - if (sbmove == -1) y -= 1; -} -if (sbstate == 9) { - if (sbmove == 1) y += 1; - if (sbmove == -1) x -= 1; -} -if (sbstate == 10) { - if (sbmove == 1) x -= 1; - if (sbmove == -1) y -= 1; -} -if (sbstate == 11) { - if (sbmove == 1) y -= 1; - if (sbmove == -1) x += 1; -} -if (sbstate == 12) { - if (sbmove == 1) x += 1; - if (sbmove == -1) y += 1; +if (tsumuriDirection == 0) { + switch (tsumuriState){ + case TsumuriStates.BOTTOMFLOOR: + case TsumuriStates.INNERDOWNRIGHTWALL: + case TsumuriStates.INNERDOWNLEFTWALL: + case TsumuriStates.OUTERUPRIGHTWALL: + case TsumuriStates.OUTERUPLEFTWALL: tsumuriDirection = facing; break; + case TsumuriStates.CEILING: + case TsumuriStates.INNERUPRIGHTWALL: + case TsumuriStates.INNERUPLEFTWALL: + case TsumuriStates.OUTERDOWNRIGHTWALL: + case TsumuriStates.OUTERDOWNLEFTWALL: tsumuriDirection = -facing; break; + } } - // rotation -switch (sbstate) { - case 1: myangle = 0; break; - case 2: myangle = 90; break; - case 3: myangle = 180; break; - case 4: myangle = 270; break; - } - - - - - - - - 1 - 603 - 7 - 0 - 0 - -1 - 2 - - - self - 0 - 0 - - - 1 - /// dummied +// Move tsumuris according to their state +switch (tsumuriState){ + case TsumuriStates.BOTTOMFLOOR: + angle = 0; + x += tsumuriDirection; + break; + case TsumuriStates.RIGHTWALL: + angle = 90; + y -= tsumuriDirection; + break; + case TsumuriStates.CEILING: + angle = 180; + x -= tsumuriDirection; + break; + case TsumuriStates.LEFTWALL: + angle = 270; + y += tsumuriDirection + break; + case TsumuriStates.INNERDOWNRIGHTWALL: + if (tsumuriDirection == 1) y -= 1; + if (tsumuriDirection == -1) x -= 1; + break; + case TsumuriStates.INNERUPRIGHTWALL: + if (tsumuriDirection == 1) x -= 1; + if (tsumuriDirection == -1) y += 1; + break; + case TsumuriStates.INNERUPLEFTWALL: + if (tsumuriDirection == 1) y += 1; + if (tsumuriDirection == -1) x += 1; + break; + case TsumuriStates.INNERDOWNLEFTWALL: + if (tsumuriDirection == 1) x += 1; + if (tsumuriDirection == -1) y -= 1; + break; + case TsumuriStates.OUTERUPRIGHTWALL: + if (tsumuriDirection == 1) y += 1; + if (tsumuriDirection == -1) x -= 1; + break; + case TsumuriStates.OUTERDOWNRIGHTWALL: + if (tsumuriDirection == 1) x -= 1; + if (tsumuriDirection == -1) y -= 1; + break; + case TsumuriStates.OUTERDOWNLEFTWALL: + if (tsumuriDirection == 1) y -= 1; + if (tsumuriDirection == -1) x += 1; + break; + case TsumuriStates.OUTERUPLEFTWALL: + if (tsumuriDirection == 1) x += 1; + if (tsumuriDirection == -1) y += 1; + break; +}