Ultima Underworld/technical/conversations/88
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 #88 // string block 0x0e58 (3672), name Brawnclan // // 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[68]; private[3] = 1; if ( private[0] ) { } else { private[2] = 1; say( "It's been a long time since we of the Folk have seen one such as ye. Be ye an outcast from above, or an outsider?" ); locals[1] = 2; // "I have recently been unjustly imprisoned." locals[2] = 3; // "I am attempting to rescue a kidnapped girl." locals[3] = 4; // "I am an adventurer in search of fortune." locals[4] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: goto label_0307; break; case 2: goto label_030c; break; case 3: goto label_0316; break; } // end switch label_0307:; say( "Aye, so all of ye say. Well, it's not me place to cast judgment upon ye. Behave yourself properly when dealing with the Mountainfolk, that's all we ask. What else ye do is your own business. Now, what is it that ye be wanting?" ); goto label_0319; label_030c:; label_030c:; private[2] = 0; say( "Aye, I heard of such a thing. The Abyss isn't a safe place these days, I tell ye. Perhaps some other of the Folk might know more about that. Is there anything else I can help ye with?" ); goto label_0319; label_0316:; say( "Is that so? Well, the Abyss is nae a place to be searching for fortune. Just a shadow of itself, it is nowadays. Yet of all the Abyss, we be the ones who still know what fortune is and what to do with it. Goldthirst, our king, has a hoard to rival any in all of Britannia.\n" " Now, is there anything I can do for ye?" ); label_0319:; label_0319:; label_0319:; label_0319:; locals[44] = private[2]; locals[23] = 8; // "Hast thou news of a kidnapped girl?" locals[45] = 1; locals[24] = 9; // "I would like to trade items with thee." locals[46] = private[3]; locals[25] = 10; // "Canst thou let me through this portcullis?" locals[47] = 1; locals[26] = 11; // "That is all. Well met, and farewell." locals[27] = 0; // "" locals[65] = babl_fmenu( 0, &locals[23], &locals[44] ); switch ( locals[65] ) { case 8: goto label_030c; break; case 9: goto label_03cd; break; case 10: goto label_03a3; break; case 11: func_00e0(); break; } // end switch label_03a3:; private[3] = 0; locals[66] = 13; locals[67] = 30; locals[68] = 0; gronk_door( 3, &locals[68], &locals[67], &locals[66] ); say( "Very well, ye seem a reasonable sort. Just mind your manners and ye'll nae have trouble with the Folk. Now, before ye meet the rest of the clan, is there anything else ye'll be wanting?" ); goto label_0319; label_03cd:; say( "Very well, let's see what ye've found in your adventures." ); func_03df(); say( "Farewell." ); func_00e0(); } // end if say( "A hearty greetings to ye - it is good to meet again. What can I do for ye now?" ); goto label_0319; } // end func void func_03df() { int locals[44]; setup_to_barter( 0 ); while ( !private[1] ) { locals[1] = 16; // "I make thee this offer." locals[2] = 17; // "I demand thou givest me these items." locals[3] = 18; // "Excuse me, I must think about this deal." locals[4] = 19; // "I do not wish to barter any further." locals[5] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_0490(); break; case 2: func_04ea(); break; case 3: do_judgement( 0 ); break; case 4: do_decline( 0 ); private[1] = 1; break; } // end switch } // while locals[23] = 20; // "Farewell." locals[24] = 0; // "" locals[44] = babl_menu( 0, &locals[23] ); if ( locals[44] == 1 ) { private[1] = 1; } // end if } // end func void func_0490() { int locals[15]; locals[0] = -1; locals[6] = -1; locals[11] = 21; // "I accept thy offer." locals[12] = 22; // "No, I do not like this deal." locals[13] = 23; // "Dost thou take me for a fool?" locals[14] = 24; // "I am weary of this haggling." locals[15] = 25; // "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_04ea() { int locals[24]; say( "Dost thou intend to rob me?" ); locals[1] = 27; // "Yes, I must." locals[2] = 28; // "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] = 29; // "If thou dost insist, thou canst have them." locals[24] = 30; // "No! Thou shalt not take them!" if ( do_demand( 2, &locals[24], &locals[23] ) ) { private[1] = 1; } else { func_008b(); } // end if } // end func