Update
I'm starting to reach the point where the visual programming interface of GB Studio is becoming a hindrance. Scripting interactions with monsters involves some complex conditionals, which I find hard to read when they aren't in text.

So I decided to step back and write out the first of these in pseudocode, which helped a lot with planning the control flow:
ON Trigger.ENTER {
If GOBLIN_COMPLETE is False {
If GoblinActive is False {
Display "The goblin is asleep… Try to sneak past? {Stealth}"
Display.Choice Set Temp0 {
True : "Yes"
False : "No"
}
If Temp0 is True {
Call RollUnder(Temp0, PC_Stealth, Temp1)
If Temp1 is True {
Display "{Stealth: $Temp0} Success!"
Scene.change(D1_R2, 16, 9)
Stop
}
Else {
Display "{Stealth: $Temp0} Failure!"
Goblin.StopOnUpdate
Goblin.Emote(Shock)
Display(avatar=Goblin) "Zzz--wha? Whozzat?"
Goblin.Move(5,9)
Display "The goblin approaches!"
GoblinActive = True
}
}
Loop {
If Goblin_HP <= 0 {
Stop
}
Else If GoblinComplete is True {
Stop
}
Else If PC_HP <= 0 {
Display "You collapse from exhaustion and injury!"
Call PCdead
Stop
}
Else {
Display "What do you do?"
Display.Menu Set GoblinWhatDo {
Attack:1,
Scare:2,
Friend:3,
Trick:4,
Escape:0
}
}
If GoblinWhatDo == 1 { \\Attack
Call RollUnder(Temp0, PC_Attack, Temp1)
If Temp1 is True {
Display "{Attack: $Temp0} Success!"
Goblin_HP = Goblin_HP - PC_Damage - Equip_Damage
Display "You strike at the goblin with your weapon!"
Display(avatar=Goblin) "Arrgh!"
}
Else {
Display "Attack $Temp1 Failure!"
Call RollUnder(Temp0, PC_Armour, Temp1)
Display "The goblin counterattacks!"
If Temp1 is True {
Display "You evade damage!"
}
Else {
PC_hp -= 1
Display "The goblin hits! (1 Damage)"
}
}
}
Else If GoblinWhatdo == 2 { \\Scare
If GoblinScared == 2 {
Display "The goblin isn't afraid of you."
}
Else {
Call RollUnder(Temp0, PC_Scare, Temp1)
If Temp1 is True {
Display "{Scare: $Temp0} Success!"
Display "You frighten the goblin, suggesting that
they might be cut to shreds or blasted into
goo if they attack."
Display(avatar=Goblin) "Okay, okay! I don't want
no trouble!"
Goblin.move(15, 6)
GoblinComplete = True
GoblinScared = 1
Stop
}
Else {
Display "{Scare: $Temp1} Failure"
Display "You try to scare the goblin with threats and
promises, but they aren't impressed."
Display(avatar=Goblin) "Heh, you think that's scary?
Say hello to my little, uh, my
knife!"
Display "The goblin brings the knife a little too
close to you and grins menacingly. But they
don't attack yet."
GoblinScared = 2
}
}
Else If GoblinWhatDo == 3 { \\Friend
[...]
Now that I have that mapped out, I can actually implement it in the engine.Here's the goblin in question, for fun. It's an edit of a sprite from the roguelike repository linked earlier.
