Ultima Underworld/technical/conversations/219

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 #219 // string block 0x0edb (3803), name guard // // 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() { if ( private[0] == 0 ) { private[2] = 0; private[3] = 0; private[4] = 0; } // end if if ( private[0] == 1 ) { func_039c(); } else { func_02ca(); } // end if } // end func void func_02ca() { int locals[31]; locals[1] = random( 1, &locals[2] ); locals[2] = 4; locals[3] = locals[1]; if ( 1 == locals[3] ) { say( "EH! What you do here? Where you medallion?" ); } else { if ( 2 == locals[3] ) { say( "Why you here? You got medallion, eh?" ); } else { if ( 3 == locals[3] ) { say( "You got medallion? Where be medallion?" ); } else { if ( 4 == locals[3] ) { say( "Not allowed pass without medallion. Letsee medallion... Letsee!" ); } // end if } // end if } // end if } // end if locals[4] = 5; // "Medallion?! I need no stinking medallion!" locals[5] = 6; // "Here it is." locals[6] = 0; // "" locals[25] = babl_menu( 0, &locals[4] ); switch ( locals[25] ) { case 1: locals[26] = 9; locals[27] = 0; locals[28] = 6; set_race_attitude( 3, &locals[28], &locals[27], &locals[26] ); locals[29] = 4; locals[30] = 29; locals[31] = 0; gronk_door( 3, &locals[31], &locals[30], &locals[29] ); func_008b(); break; case 2: func_0408(); break; } // end switch } // end func void func_039c() { int locals[5]; if ( private[4] == 1 ) { say( "Arrggh! You warned not stay. Die now!" ); locals[1] = 9; locals[2] = 0; locals[3] = 6; set_race_attitude( 3, &locals[3], &locals[2], &locals[1] ); locals[4] = 219; locals[5] = 0; set_attitude( 2, &locals[5], &locals[4] ); func_07b7(); } else { if ( private[3] == 1 ) { say( "Medallion allow you to pass, go somewhere else, not stay here. Leave now or you wish you did. Last warning." ); private[4] = 1; func_0709(); } else { say( "What you want? Up ramp through north gate is way you want go. Scram!" ); private[3] = 1; func_0709(); } // end if } // end if } // end func void func_0408() { int locals[100]; locals[13] = 0; label_0412:; label_0412:; locals[11] = show_inv( 2, &locals[6], &locals[1] ); if ( locals[11] > 0 ) { locals[12] = 1; while ( locals[12] <= locals[11] ) { if ( locals[0] == 300 ) { say( "Hmmmm... OK, I open gate. You want head straight north up ramp to north gate. That way you want go. Other areas here off limits." ); locals[14] = 4; locals[15] = 29; locals[16] = 0; gronk_door( 3, &locals[16], &locals[15], &locals[14] ); private[2] = 1; func_0860(); } // end if locals[12] = locals[12] + 1; } // while if ( locals[13] > 2 ) { } else { say( "That no medallion... show me medallion or die!" ); locals[17] = 12; // "So sorry, here it is." locals[18] = 13; // "I appear to have misplaced it. Wait here. I shall be right back." locals[19] = 15; // "No, YOU die!!" locals[20] = 0; // "" locals[38] = babl_menu( 0, &locals[17] ); switch ( locals[38] ) { case 1: locals[13] = locals[13] + 1; goto label_0412; break; case 2: say( "You have medallion now, or never!" ); locals[39] = 9; locals[40] = 0; locals[41] = 6; set_race_attitude( 3, &locals[41], &locals[40], &locals[39] ); locals[42] = 219; locals[43] = 0; set_attitude( 2, &locals[43], &locals[42] ); locals[44] = 4; locals[45] = 29; locals[46] = 0; gronk_door( 3, &locals[46], &locals[45], &locals[44] ); func_008b(); break; case 3: locals[47] = 9; locals[48] = 0; locals[49] = 6; set_race_attitude( 3, &locals[49], &locals[48], &locals[47] ); locals[50] = 219; locals[51] = 0; set_attitude( 2, &locals[51], &locals[50] ); locals[52] = 4; locals[53] = 29; locals[54] = 0; gronk_door( 3, &locals[54], &locals[53], &locals[52] ); func_008b(); } // end if } else { break; } // end switch if ( locals[13] > 2 ) { } else { say( "What?... you think me stupid. I see no medallion." ); locals[55] = 17; // "Sorry, here it is. " locals[56] = 18; // "I can't seem to find it anywhere. Wait and I shall return with it." locals[57] = 20; // "Yes, I do think thou'rt stupid!" locals[58] = 0; // "" locals[76] = babl_menu( 0, &locals[55] ); switch ( locals[76] ) { case 1: locals[13] = locals[13] + 1; goto label_0412; break; case 2: say( "You have medallion now, or never!" ); locals[77] = 9; locals[78] = 0; locals[79] = 6; set_race_attitude( 3, &locals[79], &locals[78], &locals[77] ); locals[80] = 219; locals[81] = 0; set_attitude( 2, &locals[81], &locals[80] ); locals[82] = 4; locals[83] = 29; locals[84] = 0; gronk_door( 3, &locals[84], &locals[83], &locals[82] ); func_008b(); break; case 3: locals[85] = 9; locals[86] = 0; locals[87] = 6; set_race_attitude( 3, &locals[87], &locals[86], &locals[85] ); locals[88] = 219; locals[89] = 0; set_attitude( 2, &locals[89], &locals[88] ); locals[90] = 4; locals[91] = 29; locals[92] = 0; gronk_door( 3, &locals[92], &locals[91], &locals[90] ); func_008b(); } // end if } // end if break; } // end switch say( "Me tired of this. You die now!" ); locals[93] = 9; locals[94] = 0; locals[95] = 6; set_race_attitude( 3, &locals[95], &locals[94], &locals[93] ); locals[96] = 219; locals[97] = 0; set_attitude( 2, &locals[97], &locals[96] ); locals[98] = 4; locals[99] = 29; locals[100] = 0; gronk_door( 3, &locals[100], &locals[99], &locals[98] ); func_008b(); } // end func void func_0709() { int locals[30]; locals[1] = 22; // "Pardon me. I'll be on my way now." locals[2] = 23; // "Don't tell me what to do, goblin, or I'll remove your head." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_07a5(); break; case 2: locals[23] = 9; locals[24] = 0; locals[25] = 6; set_race_attitude( 3, &locals[25], &locals[24], &locals[23] ); locals[26] = 219; locals[27] = 0; set_attitude( 2, &locals[27], &locals[26] ); locals[28] = 4; locals[29] = 29; locals[30] = 0; gronk_door( 3, &locals[30], &locals[29], &locals[28] ); func_008b(); break; } // end switch } // end func void func_07a5() { say( "You better be." ); npc_goal = 7; func_00e0(); } // end func void func_07b7() { int locals[22]; locals[1] = 25; // "No, please wait!" locals[2] = 26; // "Ha, we shall see." locals[3] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_07fc(); break; case 2: func_07fc(); break; } // end switch } // end func void func_07fc() { int locals[8]; say( "GRRAAARRRGGH!!!" ); locals[1] = 9; locals[2] = 0; locals[3] = 6; set_race_attitude( 3, &locals[3], &locals[2], &locals[1] ); locals[4] = 219; locals[5] = 0; set_attitude( 2, &locals[5], &locals[4] ); locals[6] = 4; locals[7] = 29; locals[8] = 0; gronk_door( 3, &locals[8], &locals[7], &locals[6] ); func_008b(); } // end func void func_0860() { int locals[22]; locals[1] = 28; // "Thank you, kind goblin." locals[2] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); if ( locals[22] == 1 ) { remove_talker( 0 ); func_00e0(); } // end if } // end func void func_0896() { int locals[44]; setup_to_barter( 0 ); while ( !private[1] ) { locals[1] = 29; // "I make thee this offer." locals[2] = 30; // "I demand thou givest me these items." locals[3] = 31; // "Excuse me, I must think about this deal." locals[4] = 32; // "I do not wish to barter any further." locals[5] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_0947(); break; case 2: func_09a1(); break; case 3: do_judgement( 0 ); break; case 4: do_decline( 0 ); private[1] = 1; break; } // end switch } // while locals[23] = 33; // "Farewell." locals[24] = 0; // "" locals[44] = babl_menu( 0, &locals[23] ); if ( locals[44] == 1 ) { private[1] = 1; } // end if } // end func void func_0947() { int locals[15]; locals[0] = -1; locals[6] = -1; locals[11] = 34; // "I accept thy offer." locals[12] = 35; // "No, I do not like this deal." locals[13] = 36; // "Dost thou take me for a fool?" locals[14] = 37; // "I am weary of this haggling." locals[15] = 38; // "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_09a1() { int locals[24]; say( "Dost thou intend to rob me?" ); locals[1] = 40; // "Yes, I must." locals[2] = 41; // "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] = 42; // "If thou dost insist, thou canst have them." locals[24] = 43; // "No! Thou shalt not take them!" if ( do_demand( 2, &locals[24], &locals[23] ) ) { private[1] = 1; } else { func_008b(); } // end if } // end func