void Game_Character::Move(int dir) { int dx = (dir == Right || dir == UpRight || dir == DownRight) - (dir == Left || dir == DownLeft || dir == UpLeft); int dy = (dir == Down || dir == DownRight || dir == DownLeft) - (dir == Up || dir == UpRight || dir == UpLeft); SetDirection(dir); if (!(IsDirectionFixed() || IsFacingLocked())) { if (dir > 3) // Diagonal SetSpriteDirection(GetSpriteDirection() % 2 ? -dx + 2 : dy + 1); else SetSpriteDirection(dir); } if (jumping) { jump_plus_x += dx; jump_plus_y += dy; return; } move_failed = !IsPassable(GetX(), GetY(), dir); if (move_failed) { if (!CheckEventTriggerTouch(Game_Map::RoundX(GetX() + dx), Game_Map::RoundY(GetY() + dy))) return; } else { SetX(Game_Map::RoundX(GetX() + dx)); SetY(Game_Map::RoundY(GetY() + dy)); remaining_step = SCREEN_TILE_WIDTH; BeginMove(); } stop_count = 0; max_stop_count = (GetMoveFrequency() > 7) ? 0 : pow(2.0, 9 - GetMoveFrequency()); }
void Game_Vehicle::SyncWithPlayer() { SetX(Main_Data::game_player->GetX()); SetY(Main_Data::game_player->GetY()); remaining_step = Main_Data::game_player->GetRemainingStep(); SetDirection(Main_Data::game_player->GetDirection()); SetSpriteDirection(Main_Data::game_player->GetSpriteDirection()); }
void Game_Event::StopTalkToHero() { if (!(IsDirectionFixed() || IsFacingLocked())) { SetSpriteDirection(GetDirection()); } halting = true; }
void Game_Event::StopTalkToHero() { if (!IsDirectionFixed()) { SetSpriteDirection(GetDirection()); } ready1 = true; }
void Game_Character::Turn(int dir) { SetDirection(dir); SetSpriteDirection(dir); move_failed = false; stop_count = 0; max_stop_count = (GetMoveFrequency() > 7) ? 0 : pow(2.0, 8 - GetMoveFrequency()); }
void Game_Event::Setup(RPG::EventPage* new_page) { bool from_null = page == NULL; page = new_page; // Free resources if needed if (interpreter) { // If the new page is null and the interpreter is running, it should // carry on executing its command list during this frame if (page) interpreter->Clear(); Game_Map::ReserveInterpreterDeletion(interpreter); interpreter.reset(); } if (page == NULL) { tile_id = 0; SetSpriteName(""); SetSpriteIndex(0); SetDirection(RPG::EventPage::Direction_down); //move_type = 0; trigger = -1; list.clear(); return; } SetSpriteName(page->character_name); SetSpriteIndex(page->character_index); tile_id = page->character_name.empty() ? page->character_index : 0; if (original_pattern != page->character_pattern) { pattern = page->character_pattern; original_pattern = pattern; } move_type = page->move_type; SetMoveSpeed(page->move_speed); SetMoveFrequency(page->move_frequency); max_stop_count = (GetMoveFrequency() > 7) ? 0 : (int)pow(2.0, 8 - GetMoveFrequency()); original_move_frequency = page->move_frequency; original_move_route = page->move_route; SetOriginalMoveRouteIndex(0); bool last_direction_fixed = IsDirectionFixed() || IsFacingLocked(); animation_type = page->animation_type; if (from_null || !(last_direction_fixed || IsMoving()) || IsDirectionFixed()) SetSpriteDirection(page->character_direction); if (!IsMoving()) SetDirection(page->character_direction); SetOpacity(page->translucent ? 160 : 255); SetLayer(page->layer); data.overlap_forbidden = page->overlap_forbidden; trigger = page->trigger; list = page->event_commands; if (trigger == RPG::EventPage::Trigger_parallel) { interpreter.reset(new Game_Interpreter_Map()); } }
void Game_Event::MoveTypeAwayFromPlayer() { int sx = DistanceXfromPlayer(); int sy = DistanceYfromPlayer(); int last_direction = GetDirection(); if ( std::abs(sx) + std::abs(sy) >= 20 ) { MoveRandom(); } else { switch (Utils::GetRandomNumber(0, 5)) { case 0: MoveRandom(); break; case 1: MoveForward(); break; default: MoveAwayFromPlayer(); } } if (move_failed && !starting) { if (stop_count >= max_stop_count + 60) { stop_count = 0; } else { SetDirection(last_direction); if (!(IsDirectionFixed() || IsFacingLocked())) SetSpriteDirection(last_direction); } } }
void FieldCharacter::UpdateDirection(Vector2 directionVector) { directionVector = directionVector.Normalize(); // We'll snap the player's direction vector according to // the nearest direction for which we have an animation. double angleToHorizontal = acos(directionVector.GetX()); // acos() only returns values from 0 to pi, // so to get the full circle we need to check // whether we're in the bottom two quandrants, // and change the angle to account for this if so. if (directionVector.GetY() > 0) { angleToHorizontal = 2 * M_PI - angleToHorizontal; } if (angleToHorizontal <= M_PI / 8 || angleToHorizontal > M_PI * 15 / 8) { SetSpriteDirection(FieldCharacterDirectionSide); SetDirection(CharacterDirectionRight); } else if (angleToHorizontal > M_PI / 8 && angleToHorizontal <= M_PI * 3 / 8) { SetSpriteDirection(FieldCharacterDirectionDiagonalUp); SetDirection(CharacterDirectionRight); } else if (angleToHorizontal > 3 * M_PI / 8 && angleToHorizontal <= M_PI * 5 / 8) { SetSpriteDirection(FieldCharacterDirectionUp); } else if (angleToHorizontal > 5 * M_PI / 8 && angleToHorizontal <= M_PI * 7 / 8) { SetSpriteDirection(FieldCharacterDirectionDiagonalUp); SetDirection(CharacterDirectionLeft); } else if (angleToHorizontal > 7 * M_PI / 8 && angleToHorizontal <= M_PI * 9 / 8) { SetSpriteDirection(FieldCharacterDirectionSide); SetDirection(CharacterDirectionLeft); } else if (angleToHorizontal > 9 * M_PI / 8 && angleToHorizontal <= M_PI * 11 / 8) { SetSpriteDirection(FieldCharacterDirectionDiagonalDown); SetDirection(CharacterDirectionLeft); } else if (angleToHorizontal > 11 * M_PI / 8 && angleToHorizontal <= M_PI * 13 / 8) { SetSpriteDirection(FieldCharacterDirectionDown); } else if (angleToHorizontal > 13 * M_PI / 8 && angleToHorizontal <= M_PI * 15 / 8) { SetSpriteDirection(FieldCharacterDirectionDiagonalDown); SetDirection(CharacterDirectionRight); } }
void Game_Vehicle::SyncWithPlayer() { SetX(Main_Data::game_player->GetX()); SetY(Main_Data::game_player->GetY()); SetRemainingStep(Main_Data::game_player->GetRemainingStep()); SetJumping(Main_Data::game_player->IsJumping()); SetBeginJumpX(Main_Data::game_player->GetBeginJumpX()); SetBeginJumpY(Main_Data::game_player->GetBeginJumpY()); if (!IsAscendingOrDescending()) { SetDirection(Main_Data::game_player->GetDirection()); SetSpriteDirection(Main_Data::game_player->GetSpriteDirection()); } else { if (!IsMoving() && !IsJumping()) { SetDirection(Left); SetSpriteDirection(Left); } } }
void Game_Vehicle::SyncWithPlayer() { if (!driving || IsAscending() || IsDescending()) return; SetX(Main_Data::game_player->GetX()); SetY(Main_Data::game_player->GetY()); remaining_step = Main_Data::game_player->GetRemainingStep(); SetDirection(Main_Data::game_player->GetDirection()); SetSpriteDirection(Main_Data::game_player->GetSpriteDirection()); }
void Game_Vehicle::GetOff() { if (type == Airship) { data.remaining_descent = SCREEN_TILE_WIDTH; } else { driving = false; } SetDirection(Left); SetSpriteDirection(Left); }
void Game_Character::Update() { if (IsJumping()) { UpdateJump(); if (IsSpinning()) anime_count++; } else if (IsMoving()) { remaining_step -= 1 << (1 + GetMoveSpeed()); if (IsSpinning() || (animation_type != RPG::EventPage::AnimType_fixed_graphic && walk_animation)) anime_count++; } else { stop_count++; if (IsSpinning() || IsContinuous() || pattern != original_pattern) anime_count++; } if (anime_count >= GetSteppingSpeed()) { if (IsSpinning()) { SetSpriteDirection((GetSpriteDirection() + 1) % 4); } else if (!IsContinuous() && IsStopping()) { pattern = original_pattern; last_pattern = last_pattern == RPG::EventPage::Frame_left ? RPG::EventPage::Frame_right : RPG::EventPage::Frame_left; } else { if (last_pattern == RPG::EventPage::Frame_left) { if (pattern == RPG::EventPage::Frame_right) { pattern = RPG::EventPage::Frame_middle; last_pattern = RPG::EventPage::Frame_right; } else { pattern = RPG::EventPage::Frame_right; } } else { if (pattern == RPG::EventPage::Frame_left) { pattern = RPG::EventPage::Frame_middle; last_pattern = RPG::EventPage::Frame_left; } else { pattern = RPG::EventPage::Frame_left; } } } anime_count = 0; } if (wait_count > 0) { wait_count -= 1; return; } if (stop_count >= max_stop_count) { if (IsMoveRouteOverwritten()) { MoveTypeCustom(); } else { // Only events UpdateSelfMovement(); } } }
Game_Vehicle::Game_Vehicle(Type _type) : Game_Character(getDataFromType(_type)) { type = _type; SetDirection(Left); SetSpriteDirection(Left); SetAnimationType(AnimType::AnimType_non_continuous); SetLayer(RPG::EventPage::Layers_same); LoadSystemSettings(); }
void Game_Event::Setup(RPG::EventPage* new_page) { page = new_page; // Free resources if needed if (interpreter) { interpreter->Clear(); Game_Map::ReserveInterpreterDeletion(interpreter); interpreter.reset(); } if (page == NULL) { tile_id = 0; SetSpriteName(""); SetSpriteIndex(0); SetDirection(RPG::EventPage::Direction_down); //move_type = 0; trigger = -1; list.clear(); return; } SetSpriteName(page->character_name); SetSpriteIndex(page->character_index); tile_id = page->character_name.empty() ? page->character_index : 0; if (GetDirection() != page->character_direction) { SetDirection(page->character_direction); SetSpriteDirection(page->character_direction); } if (original_pattern != page->character_pattern) { pattern = page->character_pattern; original_pattern = pattern; } move_type = page->move_type; SetMoveSpeed(page->move_speed); SetMoveFrequency(page->move_frequency); max_stop_count = (GetMoveFrequency() > 7) ? 0 : pow(2.0, 8 - GetMoveFrequency()); original_move_frequency = page->move_frequency; original_move_route = page->move_route; SetOriginalMoveRouteIndex(0); animation_type = page->animation_type; SetOpacity(page->translucent ? 160 : 255); SetLayer(page->layer); trigger = page->trigger; list = page->event_commands; if (trigger == RPG::EventPage::Trigger_parallel) { interpreter.reset(new Game_Interpreter_Map()); } CheckEventTriggerAuto(); }
void Game_Vehicle::GetOff() { if (type == Airship) { data()->remaining_descent = SCREEN_TILE_SIZE; } else { Main_Data::game_player->UnboardingFinished(); } // Get off airship can be trigger while airship is moving. Don't break the animation // until its finished. if (type != Airship || (!IsMoving() && !IsJumping())) { SetDirection(Left); SetSpriteDirection(Left); } }
Game_Vehicle::Game_Vehicle(Type _type) : data(_type == Boat ? Main_Data::game_data.boat_location : _type == Ship ? Main_Data::game_data.ship_location : Main_Data::game_data.airship_location) { assert(_type >= 1 && _type <= 3 && "Invalid Vehicle index"); type = _type; driving = false; SetDirection(Left); SetSpriteDirection(Left); walk_animation = type != Airship; animation_type = RPG::EventPage::AnimType_continuous; LoadSystemSettings(); }
void Game_Character::UpdateSprite() { if (IsJumping()) { UpdateJump(); if (IsSpinning()) anime_count++; } else if (IsMoving()) { remaining_step -= min(1 << (1 + GetMoveSpeed()), remaining_step); if (IsSpinning() || (animation_type != RPG::EventPage::AnimType_fixed_graphic && walk_animation)) anime_count++; } else { stop_count++; if ((walk_animation && (IsSpinning() || IsContinuous())) || pattern != original_pattern) anime_count++; } if (anime_count >= GetSteppingSpeed()) { if (IsSpinning()) { SetSpriteDirection((GetSpriteDirection() + 1) % 4); } else if (!IsContinuous() && IsStopping()) { pattern = original_pattern; last_pattern = last_pattern == RPG::EventPage::Frame_left ? RPG::EventPage::Frame_right : RPG::EventPage::Frame_left; } else { if (last_pattern == RPG::EventPage::Frame_left) { if (pattern == RPG::EventPage::Frame_right) { pattern = RPG::EventPage::Frame_middle; last_pattern = RPG::EventPage::Frame_right; } else { pattern = RPG::EventPage::Frame_right; } } else { if (pattern == RPG::EventPage::Frame_left) { pattern = RPG::EventPage::Frame_middle; last_pattern = RPG::EventPage::Frame_left; } else { pattern = RPG::EventPage::Frame_left; } } } anime_count = 0; } }
void Game_Event::MoveTypeRandom() { int last_direction = GetDirection(); switch (Utils::GetRandomNumber(0, 5)) { case 0: stop_count -= Utils::GetRandomNumber(0, stop_count); if (stop_count < 0) { stop_count = 0; } return; case 1: MoveForward(); break; default: MoveRandom(); } if (move_failed && !starting) { SetDirection(last_direction); if (!(IsDirectionFixed() || IsFacingLocked())) SetSpriteDirection(last_direction); } else { max_stop_count = max_stop_count / 5 * Utils::GetRandomNumber(3, 6); } }
void Game_Player::PerformTeleport() { if (!teleporting) return; teleporting = false; if (Game_Map::GetMapId() != new_map_id) { Refresh(); // Reset sprite if it was changed by a move pattern = RPG::EventPage::Frame_middle; Game_Map::Setup(new_map_id); last_pan_x = 0; last_pan_y = 0; } SetOpacity(255); MoveTo(new_x, new_y); if (new_direction >= 0) { SetDirection(new_direction); SetSpriteDirection(new_direction); } if (InVehicle()) GetVehicle()->MoveTo(new_x, new_y); }
void Game_Player::PerformTeleport() { if (!teleporting) return; teleporting = false; // Finish (un)boarding process if (location.boarding) { location.boarding = false; location.aboard = true; } else if (location.unboarding) { location.unboarding = false; location.aboard = false; } // Reset sprite if it was changed by a move // Even when target is the same map Refresh(); if (Game_Map::GetMapId() != new_map_id) { pattern = RPG::EventPage::Frame_middle; Game_Map::Setup(new_map_id); last_pan_x = 0; last_pan_y = 0; } SetOpacity(255); MoveTo(new_x, new_y); if (new_direction >= 0) { SetDirection(new_direction); SetSpriteDirection(new_direction); } if (InVehicle()) GetVehicle()->MoveTo(new_x, new_y); }
void Game_Player::PerformTeleport() { if (!teleporting) return; teleporting = false; if (Game_Map::GetMapId() != new_map_id) { Refresh(); // Reset sprite if it was changed by a move Game_Map::Update(); // Execute remaining events (e.g. ones listed after a teleport) Game_Map::Setup(new_map_id); last_pan_x = 0; last_pan_y = 0; } SetOpacity(255); MoveTo(new_x, new_y); if (new_direction >= 0) { SetDirection(new_direction); SetSpriteDirection(new_direction); } if (InVehicle()) GetVehicle()->MoveTo(new_x, new_y); }