A sixth-century post-Roman kingdom called Urland (named after the River Ur, which runs through it) is being terrorized by a 400-year-old dragon named “Vermithrax Pejorative”. To appease the dragon, King Casiodorus offers it virgin girls selected by lottery twice a year. An expedition led by a young man called Valerian seeks the last sorcerer, Ulrich of Cragganmore, for help.
Tyrian, the brutal and cynical Captain of Casiodorus’ Royal Guard, has followed the expedition. He and his lieutenant Jerbul openly intimidate the wizard, doubtful of his abilities. Ulrich invites Tyrian to stab him to prove his magical powers. Tyrian does so and Ulrich dies instantly, much to the horror of his young apprentice Galen Bradwarden and his elderly servant Hodge, who cremates Ulrich’s body and places the ashes in a leather pouch. Hodge informs Galen that Ulrich wanted his ashes spread over a lake of burning water.
Galen is selected by the wizard’s magical amulet as its next owner; encouraged, he journeys to Urland. On the way, he discovers Valerian is really a young woman, who is disguised to avoid being selected in the lottery. In an effort to discourage the expedition, Tyrian kills Hodge—who, just before dying, hands Galen the pouch of ashes.
Arriving in Urland, Galen inspects the dragon’s lair and magically seals – he thinks – its entrance with a rock slide. Tyrian apprehends Galen and takes him to Castle Morgenthorme, from which King Casiodorus governs Urland. Casiodorus guesses that Galen is not a real wizard and complains that his attack may have angered the dragon instead of killing it, as his own brother and predecessor once did. The king confiscates the amulet and imprisons Galen. His daughter, Princess Elspeth, visits Galen—initially to taunt him. Instead, she is shocked when he informs her of rumors that the lottery is rigged; it excludes her name, and those who are rich enough to bribe the king into disqualifying their children. Her father is unable to lie convincingly when she confronts him over this.
Meanwhile, the dragon frees itself from its prison and causes an earthquake. Galen narrowly escapes from his prison, but without the amulet. The village priest, Brother Jacopus, leads his congregation to confront the dragon, denouncing it as the Devil, but the dragon incinerates him and then heads for the village of Swanscombe, burning all in its path.
When the lottery begins anew, Elspeth rigs the draw so that only her name can be chosen. Consequently, King Casiodorus returns the amulet to Galen so that he might save Elspeth. Galen uses the amulet to enchant a heavy spear that had been forged by Valerian’s father (which he had dubbed Sicarius Dracorum, or “Dragonslayer”) with the ability to pierce the dragon’s armored hide. Valerian gathers some molted dragon scales to create a shield for Galen. Valerian laments now that her gender cover is blown, she’ll be eligible for the lottery since she herself is still a virgin, and that Galen has fallen in love with Princess Elspeth. Galen admits he has fallen in love, but it’s Valerian, not Elspeth, he’s in love with. The couple kiss, thus realizing their romantic feelings for each other.
Attempting to rescue Elspeth, Galen fights Tyrian and kills him emerging victorious. The Princess, however, is determined to make amends for all the girls whose names have been chosen in the past; she descends into the dragon’s cave and to her death. Galen follows her and finds a brood of young dragons feasting on her corpse. He kills them and finds Vermithrax resting by an underground lake of fire. He manages to wound the dragon, but the spear is broken. Only Valerian’s shield saves him from incineration.
After his failure to kill Vermithrax, Valerian convinces Galen to leave Swanscombe with her. As both prepare to depart, the amulet gives Galen a vision which explains his teacher’s final wishes: He used Galen to deliver him to Urland. Ulrich had asked that his ashes be spread over “burning water”, which is in the dragon’s cave. Galen realizes that the wizard had planned his own death and cremation, realizing he was too old and frail to make the journey.
Galen returns to the cave. When he spreads the ashes over the fiery lake, the wizard is resurrected within the flames. Ulrich reveals that his time is short and that Galen must destroy the amulet “when the time is right”. The wizard then transports himself to a mountaintop, where he summons a storm and confronts Vermithrax. After a brief battle, the monster snatches the old man and flies away with him. Cued by Ulrich, Galen crushes the amulet with a rock. The wizard’s body explodes and kills the dragon, whose corpse falls out of the sky.
In the aftermath, villagers inspecting the wreckage credit God with the victory. The king arrives and drives a sword into the dragon’s broken carcass to claim the glory for himself. As Galen and Valerian leave Urland together, he confesses that he misses both Ulrich and the amulet. He says, “I just wish we had a horse.” Suddenly, a white horse appears, and the couple use the horse to ride away.