Ultima Underworld/technical/conversations/213

From Ultima Codex
Jump to navigation Jump to search

Technical Details Warning

While the encyclopedic nature of the codex means that many articles will have information that could spoil some minor aspects of the game for newer players, this article is known to contain technical information about the game, game engine, data files, logic, etc. This information is not generally useful to the typical game players.

Continue reading at your own discretion.

This page contains decompiled conversation code from Ultima Underworld. The original files came from Paul Carr and are currently archived here.

This file has been modified from that source (by Sir Robin) in the following ways:

  • local variables holding pointers to string text have had that string text specified in a comment on that same line. This should make the conversation code easier to read.
  • strings (both dereferenced ones in the code and also the ones added to comments as specified above) have been highlighted for easier reading
  • function definitions have been anchored and function calls have been linked, to make it easier to follow the flow of the code

Start viewing the flow at main

// cnvdasm - ultima underworld conversation script disassembler / decompiler // // loading game strings // // conversation #213 // string block 0x0ed5 (3797), name Fintor // // converting to graph // searching functions // replacing expression opcodes // folding expressions // adding control structures // fixing up functions extern int private[31]; void main() { private[1] = 0; func_029d(); func_0012(); } // end func void func_0012() { private[0] = 1; } // end func void func_0020() { int locals[1]; if ( (((npc_goal == 5 || npc_goal == 6) || npc_goal == 9) && npc_gtarg == 1 || npc_attitude == 0) ) { locals[1] = 0; } else { locals[1] = 1; } // end if return locals[1]; } // end func void func_0063() { npc_gtarg = 1; npc_attitude = 1; npc_goal = 6; func_0012(); } // end func void func_007c() { npc_goal = 1; func_0012(); } // end func void func_008b() { npc_gtarg = 1; npc_goal = 5; npc_attitude = 1; func_0012(); } // end func void func_00a4() { npc_attitude = 6; } // end func void func_00b1() { npc_attitude = param1[0]play_hunger; func_0012(); } // end func void func_00c2() { npc_attitude = 2; func_0012(); } // end func void func_00d1() { npc_attitude = 1; func_0012(); } // end func void func_00e0() { func_0012(); } // end func void func_00ea() { param1[1] = game_days; param1[2] = game_mins; } // end func void func_0106() { int locals[4]; locals[2] = game_days - param2[1]; locals[3] = game_mins - param2[2]; if ( locals[3] < 0 ) { locals[3] = locals[3] + 1440; locals[2] = locals[2] - 1; } // end if if ( locals[2] >= param1[1] && locals[3] >= param1[2] ) { locals[1] = 1; } else { locals[1] = 0; } // end if return locals[1]; } // end func void func_018f() { param1[1] = game_days - param3[1]; param1[2] = game_mins - param3[2]; if ( param1[2] < 0 ) { param1[2] = param1[2] + 1440; param1[1] = param1[1] - 1; } // end if param1[1] = param2[1] - param1[1]; param1[2] = param2[2] - param1[2]; if ( param1[2] < 0 ) { param1[2] = param1[2] + 1440; param1[1] = param1[1] - 1; } // end if } // end func void func_0243() { param1[1] = game_days - param2[1]; param1[2] = game_mins - param2[2]; if ( param1[2] < 0 ) { param1[2] = param1[2] + 1440; param1[1] = param1[1] - 1; } // end if } // end func void func_029d() { int locals[154]; say( "Tyball! At last we meet! I have been warned of thee. After years of imprisonment, I will finally have my revenge!" ); locals[1] = 2; // "Surely thou art mad! I am not Tyball." locals[2] = 3; // "Ha! Thou hast not a chance of defeating me!" locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: goto label_0322; break; case 2: goto label_02e2; break; } // end switch label_02e2:; say( "We shall see. Now, prepare to die!" ); locals[23] = 5; // "No, it is thou who will die!" locals[24] = 6; // "Wait! I am not Tyball!" locals[25] = 0; // "" locals[44] = babl_menu( 0, &locals[23] ); switch ( locals[44] ) { case 1: func_008b(); break; case 2: goto label_0322; break; } // end switch label_0322:; label_0322:; say( "Not Tyball, eh? True, thou dost look rather scrawny, not like a powerful mage at all. Let me see, a test, a test... Aha! Now answer me truly - what dost thou know of the secret doors in the tombs?" ); locals[45] = 8; // "There are secret doors in the tombs?" locals[46] = 9; // "I know nothing of these secret doors." locals[47] = 10; // "I constructed them myself!" locals[48] = 0; // "" locals[66] = babl_menu( 0, &locals[45] ); switch ( locals[66] ) { case 1: goto label_03b6; break; case 2: goto label_03b6; break; case 3: goto label_0376; break; } // end switch label_0376:; say( "Ah! So thou art Tyball after all! Finally, we meet again!" ); locals[67] = 12; // "Yes, it is I, Tyball! Thou canst not defeat me!" locals[68] = 13; // "No, no, I was merely jesting. What didst thou say of secret doors?" locals[69] = 0; // "" locals[88] = babl_menu( 0, &locals[67] ); switch ( locals[88] ) { case 1: func_008b(); break; case 2: goto label_03b6; break; } // end switch label_03b6:; label_03b6:; label_03b6:; say( "Secret doors? Who told thee of these secret doors? Did he tell thee of the chasm of fire they lead to, as well? It's becoming impossible to keep a secret around here these days." ); locals[89] = 15; // "Don't worry, I can keep a secret." locals[90] = 16; // "The chasm of fire? Why would I want to go to a chasm of fire?" locals[91] = 0; // "" locals[110] = babl_menu( 0, &locals[89] ); switch ( locals[110] ) { case 1: goto label_03f6; break; case 2: goto label_03f6; break; } // end switch label_03f6:; label_03f6:; say( "Well, don't tell anyone, but I hid some things over there. But that's not important." ); locals[111] = 18; // "Surely it is, if they will help me defeat Tyball!" locals[112] = 19; // "What things were these?" locals[113] = 0; // "" locals[132] = babl_menu( 0, &locals[111] ); switch ( locals[132] ) { case 1: goto label_0476; break; case 2: goto label_0436; break; } // end switch label_0436:; say( "I do not remember what they were. That was years and years ago, or so it seems..." ); locals[133] = 21; // "Perhaps they will be useful in dealing with Tyball." locals[134] = 22; // "Thank thee, and farewell." locals[135] = 0; // "" locals[154] = babl_menu( 0, &locals[133] ); switch ( locals[154] ) { case 1: goto label_0476; break; case 2: func_00e0(); break; } // end switch label_0476:; label_0476:; say( "Tyball! It is thee again! Thou hast defeated and imprisoned me already. Now leave me in peace." ); func_00e0(); } // end func