summary refs log tree commit diff stats
path: root/res/scripts/hallucination_cliff.lua
blob: 35da0b1734622ef3e1b98677a9564f4872ff87d2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
hallucination_cliff = {}

function hallucination_cliff.off_bottom()
  ChangeMap("hallucination_interior", "fromTop")
end

function hallucination_cliff.off_left()
  ChangeMap("hallucination_hot_spring", "fromRight")
end

function hallucination_cliff.enter_door()
  CreateAnimatedSpriteAtWarpPoint("entryway", "entryway", "entryway_appear", "pink_shell", Direction.DOWN, SpriteLayer.NORMAL)
  PlaySound("door_open.wav")
  ChangeMap("pink_shell", "fromOutside")
end

function hallucination_cliff.talk_to_nana()
  StartCutscene()
  SetAnimation("nana", "talk")
  DisplayMessage("* Don't talk to me.", "Nana", SpeakerType.WOMAN)
  WaitForEndOfMessage()

  SetAnimation("nana", "still")
  SetDirection("nana", Direction.RIGHT)
  HideCutsceneBars()
end

function hallucination_cliff.claus_fall_event()
  -- do not trigger if we don't have claus
  if not gamestate.still_has_claus then
    return
  end

  -- do not trigger a second time
  if gamestate.claus_fall_scene then
    return
  end

  gamestate.claus_fall_scene = true

  -- have the player automatically climb most of the ladder. this is to ensure
  -- that Claus is off screen when the event triggers.
  DisablePlayerControl()
  Halt("lucas")
  DirectSpriteToLocation("lucas", "near_top_first_ladder", PathfindingOptions.CARDINAL_DIRECTIONS_ONLY)
  WaitForSpritePath("lucas")
  DisableBehaviour("lucas")

  StartCutscene(CutsceneOptions.DO_NOT_CHANGE_ANIMATION)
  DisplayMessage("* Aiee!", "Claus", SpeakerType.MAN)
  PlaySound("wobble_and_fall.wav")
  WaitForEndOfMessage()

  Delay(1000)

  PlaySound("thud.wav")
  ShakeCamera(100)
  Delay(50)

  ShowExpression("lucas", "surprise")
  Delay(50)

  ShowExpression("kuma", "surprise")
  ShowExpression("duster", "surprise")
  Delay(100)

  StopShakingCamera()
  Delay(1000)

  MoveSpriteToWarp("join_claus", "claus_fall_location")
  SetDirection("join_claus", Direction.LEFT)
  SetAnimation("join_claus", "collapsed")
  PanToSprite("join_claus", 4000)
  Delay(1000)

  RemoveExpression("lucas")
  RemoveExpression("kuma")
  RemoveExpression("duster")
  WaitForPan()

  Delay(1000)

  -- we need to break up the party to detach Claus anyway, and while we're there
  -- we should turn down the movement speed because the pathfinding algorithm
  -- doesn't take media into consideration, and if we don't change the speed
  -- before adding the other characters back, they'll bunch up as they move down
  BreakUpParty("lucas")
  SetMovementSpeed("lucas", 1)
  character():addSpriteToParty(getPlayerSprite(), getSpriteByAlias("kuma"))
  character():addSpriteToParty(getPlayerSprite(), getSpriteByAlias("duster"))
  character():addSpriteToParty(getPlayerSprite(), getSpriteByAlias("boney"))

  UnpauseSprite("lucas")
  DirectSpriteToLocation("lucas", "near_bottom_first_ladder", PathfindingOptions.CARDINAL_DIRECTIONS_ONLY)
  WaitForSpritePath("lucas")
  DisableBehaviour("lucas")
  PauseSprite("lucas")
  SetAnimation("lucas", "frozen") -- so he doesn't blink

  -- TODO: rest of scene

  -- same as before but less justifiable because the only reason we're doing
  -- this is to fix the movement trails
  -- BreakUpParty("lucas")
  -- SetMovementSpeed("lucas", 2)
  -- character():addSpriteToParty(getPlayerSprite(), getSpriteByAlias("kuma"))
  -- character():addSpriteToParty(getPlayerSprite(), getSpriteByAlias("duster"))
  -- character():addSpriteToParty(getPlayerSprite(), getSpriteByAlias("boney"))
end