Ultima Underworld/technical/conversations/214

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 #214 // string block 0x0ed6 (3798), name Bolinard // // 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]global[0]; 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[22]; if ( private[0] == 1 ) { func_0485(); } else { say( "Heh? What art thou doing here?" ); global[0] = 0; locals[1] = 2; // "I am here to rescue thee." locals[2] = 3; // "I am attemping to save the world from a powerful demon." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_02f6(); break; case 2: func_0352(); } // end if break; } // end switch } // end func void func_02f6() { int locals[22]; say( "Ah, I'm not worth saving. Thou shouldst find something else to do." ); locals[1] = 5; // "In fact, I have something else to do: save Britannia from a demon that would destroy it." locals[2] = 6; // "Very well. Goodbye." locals[3] = 7; // "Dost thou have any food? I am quite hungry." locals[4] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_0352(); break; case 2: func_00e0(); break; case 3: func_039a(); break; } // end switch } // end func void func_0352() { int locals[22]; say( "I know not how to help thee defeat this demon, but I would help thee any other way I can." ); locals[1] = 9; // "Hast thou any helpful information at all?" locals[2] = 10; // "Oh, perhaps some food if thou hast any to spare." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_03e2(); break; case 2: func_039a(); break; } // end switch } // end func void func_039a() { int locals[22]; say( "I have no food, but I can help thee with a map of the area." ); locals[1] = 12; // "Yes, please." locals[2] = 13; // "I have no need of a map." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_042a(); break; case 2: func_0567(); break; } // end switch } // end func void func_03e2() { int locals[22]; say( "I don't know how useful it might be, but I can sketch thee a map of the immediate area." ); locals[1] = 15; // "Please! Every little bit helps." locals[2] = 16; // "I thank thee, but I already know my way around." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_042a(); break; case 2: func_0567(); break; } // end switch } // end func void func_042a() { int locals[23]; global[0] = 1; say( "Surely. Here, I'll just sketch it on the back of this old picture. The corridor goes like this, see, and there are all these little branches going off over here. We are here.\n" " Hmm, this map didn't come out very well. Oh well, take this picture anyways. It has an inscription that says "Tom."" ); locals[1] = 272; take_from_npc( 1, &locals[1] ); locals[2] = 18; // "I thank thee." locals[3] = 19; // "Surely this will come in handy." locals[4] = 0; // "" locals[23] = babl_menu( 0, &locals[2] ); switch ( locals[23] ) { case 1: func_051f(); break; case 2: func_051f(); break; } // end switch } // end func void func_0485() { int locals[3]; if ( !global[0] ) { func_04d7(); } else { locals[1] = random( 1, &locals[2] ); locals[2] = 3; locals[3] = locals[1]; if ( 1 == locals[3] ) { say( "Begone! I cannot talk." ); } else { if ( 2 == locals[3] ) { say( "Run along, before the guards come back!" ); } else { if ( 3 == locals[3] ) { say( "Farewell, friend! I'm bound for a better place!" ); } // end if } // end if } // end if } // end if } // end func void func_04d7() { int locals[22]; say( "Hello there! How can I help thee?" ); locals[1] = 24; // "I'll take any help thou canst offer." locals[2] = 25; // "Canst thou help me against the demon I seek to defeat?" locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_03e2(); break; case 2: func_0352(); break; } // end switch } // end func void func_051f() { int locals[22]; say( "Thou art most welcome. May the powers of good be with thee." ); locals[1] = 27; // "And also with thee. Farewell." locals[2] = 28; // "Good-bye." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_00e0(); break; case 2: func_00c2(); break; } // end switch } // end func void func_0567() { int locals[22]; say( "Very well. Don't say I didn't try to help thee." ); locals[1] = 30; // "I won't." locals[2] = 31; // "Excuse me, I must be getting on." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_00c2(); break; case 2: func_00e0(); break; } // end switch } // end func void func_05af() { int locals[44]; setup_to_barter( 0 ); while ( !private[1] ) { locals[1] = 32; // "I make thee this offer." locals[2] = 33; // "I demand thou givest me these items." locals[3] = 34; // "Excuse me, I must think about this deal." locals[4] = 35; // "I do not wish to barter any further." locals[5] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_0660(); break; case 2: func_06ba(); break; case 3: do_judgement( 0 ); break; case 4: do_decline( 0 ); private[1] = 1; break; } // end switch } // while locals[23] = 36; // "Farewell." locals[24] = 0; // "" locals[44] = babl_menu( 0, &locals[23] ); if ( locals[44] == 1 ) { private[1] = 1; } // end if } // end func void func_0660() { int locals[15]; locals[0] = -1; locals[6] = -1; locals[11] = 37; // "I accept thy offer." locals[12] = 38; // "No, I do not like this deal." locals[13] = 39; // "Dost thou take me for a fool?" locals[14] = 40; // "I am weary of this haggling." locals[15] = 41; // "Surely thou art joking." if ( do_offer( 7, &locals[15], &locals[14], &locals[13], &locals[12], &locals[11], &locals[6], &locals[1] ) ) { private[1] = 1; } // end if } // end func void func_06ba() { int locals[24]; say( "Dost thou intend to rob me?" ); locals[1] = 43; // "Yes, I must." locals[2] = 44; // "No, thou dost misunderstand me." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: break; case 2: return; break; } // end switch locals[23] = 45; // "If thou dost insist, thou canst have them." locals[24] = 46; // "No! Thou shalt not take them!" if ( do_demand( 2, &locals[24], &locals[23] ) ) { private[1] = 1; } else { func_008b(); } // end if } // end func