Ultima Underworld/technical/conversations/268
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 #268 // string block 0x0f0c (3852), critter #12, goblin // // 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[88]; if ( private[0] ) { say( "Hello, is funny-looking person again." ); } else { say( "You have business here?" ); } // end if private[2] = 1; private[3] = 1; locals[1] = 3; // "Canst thou tell me of thy race, the Goblins?" locals[2] = 4; // "Where can I find the Green Goblins?" locals[3] = 5; // "I wish to trade with thee." locals[4] = 6; // "No, I must be going." locals[5] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: goto label_031e; break; case 2: goto label_03b2; break; case 3: goto label_03f2; break; case 4: func_00e0(); break; } // end switch label_031e:; say( "GRAY Goblins, GRAY Goblins, not just Goblins. Say Goblins, maybe you mean Green Goblins too, ugh. You not want to know about them. Nasty and brutish they are. Uglier than humans even. Not related to us, no, not at all." ); locals[23] = 8; // "Well then, what of the Gray Goblins?" locals[24] = 9; // "I will try to avoid them then. Farewell." locals[25] = 0; // "" locals[44] = babl_menu( 0, &locals[23] ); switch ( locals[44] ) { case 1: goto label_035e; break; case 2: func_00e0(); break; } // end switch label_035e:; label_035e:; say( "Ah, yes, Gray Goblins, much better. We the rulers of this area. All others look up to us, humans, Green Goblins, spiders even. You look for powerful group, you came to right place." ); locals[45] = 11; // "Perhaps. I shall continue to explore." locals[46] = 12; // "Dost thou wish to trade some items with me?" locals[47] = 13; // "I thank thee for thy time." locals[48] = 0; // "" locals[66] = babl_menu( 0, &locals[45] ); switch ( locals[66] ) { case 1: func_00e0(); break; case 2: goto label_03f2; break; case 3: func_00e0(); break; } // end switch label_03b2:; say( "Oh, no, no, no, you no want Green Goblins. They evil and ugly and dumb. No, you stick with Gray Goblins. We smart and tough." ); locals[67] = 15; // "Maybe I will." locals[68] = 16; // "I will visit these Green Goblins and make up my own mind." locals[69] = 0; // "" locals[88] = babl_menu( 0, &locals[67] ); switch ( locals[88] ) { case 1: goto label_035e; break; case 2: func_00e0(); break; } // end switch label_03f2:; label_03f2:; if ( !func_0020() ) { say( "No, I not want your stuff." ); func_00e0(); } else { say( "Okay, what you have?" ); } // end if func_040c(); say( "Goodbye then." ); func_00e0(); } // end func void func_040c() { int locals[44]; setup_to_barter( 0 ); while ( !private[1] ) { locals[1] = 20; // "I make thee this offer." locals[2] = 21; // "I demand thou givest me these items." locals[3] = 22; // "Excuse me, I must think about this deal." locals[4] = 23; // "I do not wish to barter any further." locals[5] = 0; // "" locals[22] = babl_menu( 0, &locals[1] ); switch ( locals[22] ) { case 1: func_04bd(); break; case 2: func_0517(); break; case 3: do_judgement( 0 ); break; case 4: do_decline( 0 ); private[1] = 1; break; } // end switch } // while locals[23] = 24; // "Farewell." locals[24] = 0; // "" locals[44] = babl_menu( 0, &locals[23] ); if ( locals[44] == 1 ) { private[1] = 1; } // end if } // end func void func_04bd() { int locals[15]; locals[0] = -1; locals[6] = -1; locals[11] = 25; // "Yeah, we trade this." locals[12] = 26; // "No, I no like." locals[13] = 27; // "You think me stupid?" locals[14] = 28; // "I tired of this, go away." locals[15] = 29; // "You make no sense." 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_0517() { int locals[24]; say( "You think you just take this from me?" ); locals[1] = 31; // "Yes, I must." locals[2] = 32; // "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] = 33; // "You not very fair." locals[24] = 34; // "Ha! Nobody take from Goblin!" if ( do_demand( 2, &locals[24], &locals[23] ) ) { private[1] = 1; } else { func_008b(); } // end if } // end func