Kingdom of the Lyre: Encounters
Wednesday, 13th November 2019
In this blog series, Damian explains how the game works.
Encounters in Kingdom of the Lyre have a different type of complexity to map generation. They need to change during the game: if you kill the three orcs at the mountain pass, you don't want to see the same three orcs a moment later. On the other hand, if you don't like the look of a crocodile that guards the entrance to the swamp, you shouldn't be able to hide around a corner and expect it to be gone a moment later.
These are casual encounters. There are other types, too. The object of your quest is an encounter, there might be villages, and there is the main enemy who relentlessly chases you. The first subroutine I want to look at today is short, and decides which of these encounters should happen at a given time.
REM --- Determine possible encounter types 340 LET V=0 IF P=L THEN IF P<>O THEN LET V=2 IF V=0 THEN IF P=U THEN LET V=3 IF V=0 THEN IF P=L THEN IF P=O THEN LET V=4 IF V=0 THEN IF P=O THEN LET V=1 IF V<>0 THEN RETURN REM --- All predictable encounters eliminated - check villages LET Z=4883 LET C=0 341 GOSUB 990 LET C=C+1 IF C<=P THEN GOTO 341 IF Z-Z/20*20=0 THEN LET V=1 RETURN
The first part of the subroutine deals with the "predictable" encounters: have we found the lyre? Has the army of the underworld found us? Have we returned the lyre and won? Are we otherwise at our home village? If the answer to all these is "no", then the second part of the subroutine checks to see if there's a random village here. If there is no village, then that leaves us with the default (V=0), which is a random encounter. These are determined by this subroutine:
REM --- Deal with a random encounter 210 LET Z=F LET C=0 211 GOSUB 990 LET C=C+1 IF C<=P THEN GOTO 211 IF Z-Z/8*8>1 THEN RETURN REM --- Monster encountered GOSUB 400 IF J=3 THEN GOTO 213 LET Z=G REM --- Combat loop ...
While path, terrain and village generation use set seeds (4881, 4882 and 4883 respectively), random encounters use a variable seed, stored in F. This is generated at the start of the game, from the 4-digit number the player was asked for. It is only changed when the player wins a battle.
The effect of this is that if the player evades random monsters by fleeing or drinking an invisibility potion, then those monsters will stay where they are. But if a player fights the monsters and wins, then they will disappear and others may or may not take their place. A side-effect is that all other random monsters will also move around at that time, but that is hopefully not too noticeable.
Line 400 is the subroutine that generates the details of the encounter and displays them:
REM --- Subroutine to generate a monster encounter REM --- Inputs: T - the terrain REM --- Changes: Z - random number seed REM --- Outputs: M - the number/strength of the monster(s) 400 GOSUB 990 LET M=1+Z-Z/5*5 GOTO 401+T 401 IF M=1 THEN PRINT "There is a thief here." IF M>1 THEN PRINT "There are ",M," thieves here." RETURN 402 PRINT "You see ",M," wild boar emerge from the undergrowth." RETURN 403 IF M=1 THEN PRINT "You encounter a goblin in the mountain pass." IF M>1 THEN PRINT "You encounter ",M," goblins in the mountain pass." RETURN 404 PRINT "You are stalked by a hungry crocodile." RETURN
The random number that determines the strength of the enemy is the second one in the series that starts with F. If the player flees and returns, then F will not have changed, there will still be an encounter, and the strength of the enemy will be the same. Notice that the type of monster is determined by the terrain the player is in. As mentioned before, this is just flavour text and doesn't affect how the monsters fight. I'll leave combat to the next blog post.
Comments