# AGI versus SCI – A Comparison

AGI, which Sierra used up until around the release of King’s Quest IV – The Perils of Rosella, was a strictly linear scripting language with a fairly simple bytecode. Much simpler than SCI’s object-oriented virtual machine. But how do they compare?

Inspired by this one particular book that’s ostensibly about SCI but contains only AGI snippets from what I’ve seen, here’s the first playable room in King’s Quest IV, and how it’s initialized. I’ve left out a bunch of stuff for clarity. Because it’s so simple, AGI bytecode is pretty easy to decompile:

```if (justEntered)
{
set.horizon(84);

if (!nightTime) { v152 = 1; }
else { v152 = 101; }
draw.pic(v152);

//Place Ego according to the previous room
if (lastRoom == 1) { position(ego, 141, 82); }
if (lastRoom == 2) { position(ego, 107, 82); }
if (lastRoom == 9) { position(ego, 96, 82); }
if (lastRoom == 10) { position(ego, 80, 82); }
if ((lastRoom == 11 || lastRoom == 15)) { position(ego, 70, 82); }
if ((lastRoom == 12 || lastRoom == 14)) { position(ego, 60, 82); }

//Add some waves in the water.
animate.obj(o3);
set.view(o3, 55);
set.loop(o3, 4);
set.priority(o3, 5);
ignore.objs(o3);
cycle.time(o3, 3);
position(o3, 64, 152);
draw(o3);

draw(ego);
show.pic();
}```

Hmm. Compare that to its SCI equivalent. SCI bytecode is much harder to decompile. You can disassemble it, but until SCI Companion came out it wasn’t possible to decompile it. Still here we are:

```(instance Room1 of Room
(properties
picture 1
north 25
south 7
west 31
east 2
horizon 100
)

(method (init)
(if gNightTime (= picture 101))
(super init:)
(self setRegions: 503 501 504 506)
(wave1
isExtra: 1
view: 665
loop: 0
cel: 0
posn: 203 76
setPri: 0
ignoreActors:
cycleSpeed: 3
init:
)
; Other waves left out for clarity
(wave1 setScript: waveActions)

; This part is simplified significantly.
(switch gPreviousRoom
(south (gEgo posn: 225 188))
(north (gEgo x: 225 y: (+ horizon 1)))
(0 (gEgo x: 220 y: 135))
(east (gEgo x: 318)) ; Y stays the same.
)
(gEgo init:)
)
)```

You might notice that there’s no equivalent to `draw.pic` and `discard.pic` and such. The `Room` class handles that by itself the moment `Room1` calls `(super init:)`.