ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/cfplus
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/cfplus (file contents):
Revision 1.95 by root, Sun Jul 16 23:30:08 2006 UTC vs.
Revision 1.98 by root, Sat Jul 22 13:20:33 2006 UTC

189 $MESSAGE_WINDOW->show; 189 $MESSAGE_WINDOW->show;
190 190
191 unshift @dialog, new CFClient::UI::Label 191 unshift @dialog, new CFClient::UI::Label
192 max_w => $::WIDTH * 0.4, 192 max_w => $::WIDTH * 0.4,
193 ellipsise => 0, 193 ellipsise => 0,
194 markup => "\nOr use your keyboard:\n"; 194 markup => "\nOr use your keyboard and the text entry below:\n";
195 195
196 unshift @dialog, my $table = new CFClient::UI::Table; 196 unshift @dialog, my $table = new CFClient::UI::Table;
197 197
198 $table->add (0, 0, new CFClient::UI::Button 198 $table->add (0, 0, new CFClient::UI::Button
199 text => "Next Race", 199 text => "Next Race",
216 max_w => $::WIDTH * 0.4, 216 max_w => $::WIDTH * 0.4,
217 ellipsise => 0, 217 ellipsise => 0,
218 markup => 218 markup =>
219 "<big><b>Character Creation: Race</b></big>\n\n" 219 "<big><b>Character Creation: Race</b></big>\n\n"
220 . "Look at the <b>Messages</b> window to see a description of this race " 220 . "Look at the <b>Messages</b> window to see a description of this race "
221 . "(<small>or hover with your mouse over the bottommost entry in the status area in the lower left area of the screen</small>) "
222 . "and the center of the screen to see how this race looks like " 221 . "and the center of the screen to see how this race looks like "
223 . "(<small>this is below this dialog window, you may need to click on the display area to make it visible</small>).\n\n" 222 . "(<small>below this dialog window: you may need to move the dialog away and "
223 . "click into the display area to make it visible</small>).\n\n"
224 . "You can look at another race, or accept this race (you will come back to this race eventually, " 224 . "You can look at another race, or accept this race (you will cycle back to "
225 . "so you can take your time making this important choice." 225 . "this race eventually, so you can take your time making this important choice."
226 ; 226 ;
227 227
228 } elsif ($prompt =~ /roll new stats/) { 228 } elsif ($prompt =~ /roll new stats/) {
229 if (my $stat = delete $conn->{stat_change_with}) { 229 if (my $stat = delete $conn->{stat_change_with}) {
230 $conn->send ("reply $stat"); 230 $conn->send ("reply $stat");
236 $MESSAGE_WINDOW->hide; 236 $MESSAGE_WINDOW->hide;
237 237
238 unshift @dialog, new CFClient::UI::Label 238 unshift @dialog, new CFClient::UI::Label
239 max_w => $::WIDTH * 0.4, 239 max_w => $::WIDTH * 0.4,
240 ellipsise => 0, 240 ellipsise => 0,
241 markup => "\nOr use your keyboard:\n"; 241 markup => "\nOr use your keyboard and the text entry below:\n";
242 242
243 unshift @dialog, my $table = new CFClient::UI::Table; 243 unshift @dialog, my $table = new CFClient::UI::Table;
244 244
245 # left: re-roll 245 # left: re-roll
246 $table->add (0, 0, new CFClient::UI::Button 246 $table->add (0, 0, new CFClient::UI::Button
252 }, 252 },
253 ); 253 );
254 254
255 # center: swap stats 255 # center: swap stats
256 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox 256 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox
257 expand => 1,
257 value => $_, 258 value => $_,
258 options => [ 259 options => [
259 [1 => "Str", "Strength ($conn->{stat}{+CS_STAT_STR})"], 260 [1 => "Str", "Strength ($conn->{stat}{+CS_STAT_STR})"],
260 [2 => "Dex", "Dexterity ($conn->{stat}{+CS_STAT_DEX})"], 261 [2 => "Dex", "Dexterity ($conn->{stat}{+CS_STAT_DEX})"],
261 [3 => "Con", "Constitution ($conn->{stat}{+CS_STAT_CON})"], 262 [3 => "Con", "Constitution ($conn->{stat}{+CS_STAT_CON})"],
286 destroy_query_dialog $conn; 287 destroy_query_dialog $conn;
287 0 288 0
288 }, 289 },
289 ); 290 );
290 291
292 unshift @dialog, my $hbox = new CFClient::UI::HBox;
293 for (
294 [Str => CS_STAT_STR],
295 [Dex => CS_STAT_DEX],
296 [Con => CS_STAT_CON],
297 [Int => CS_STAT_INT],
298 [Wis => CS_STAT_WIS],
299 [Pow => CS_STAT_POW],
300 [Cha => CS_STAT_CHA],
301 ) {
302 my ($name, $id) = @$_;
303 $hbox->add (new CFClient::UI::Label
304 markup => "$conn->{stat}{$id} <span foreground='yellow'>$name</span>",
305 align => 0,
306 expand => 1,
307 can_events => 1,
308 can_hover => 1,
309 tooltip => $CFClient::STAT_TOOLTIP{$name},
310 );
311 }
312
291 unshift @dialog, new CFClient::UI::Label 313 unshift @dialog, new CFClient::UI::Label
292 max_w => $::WIDTH * 0.4, 314 max_w => $::WIDTH * 0.4,
293 ellipsise => 0, 315 ellipsise => 0,
294 markup => 316 markup =>
295 "<big><b>Character Creation: Stats</b></big>\n\n" 317 "<big><b>Character Creation: Stats</b></big>\n\n"
296 . "Look at the <b>Stats</b> window to see your basic stats " 318 . "<b>Stats</b> are a very important aspect of your character. You can use the tooltips to learn what each Stat governs.\n\n"
297 . "(first column: 1 strength, 2 dexterity, 3 constitution, 4 intelligence, 5 wisdom, 6 power and 7 charisma).\n\n" 319 . "The stats generated by the server are always sorted from Str (highest) to Cha (lowest). "
320 . "They will be modified later by both the race and the class you choose.\n\n"
298 . "You can create another set of stats, swap two stat values with each other or accept the stats as they are now and continue. " 321 . "You can create another set of stats, swap two stat values with each other or accept the stats as shown below and continue.\n"
299 . "Race selection will influence those values later on."
300 ; 322 ;
301 } 323 }
302 324
303 push @dialog, my $entry = new CFClient::UI::Entry 325 push @dialog, my $entry = new CFClient::UI::Entry
304 on_changed => sub { 326 on_changed => sub {
644 666
645 $table 667 $table
646} 668}
647 669
648sub stats_window { 670sub stats_window {
671 my $r = new CFClient::UI::ScrolledWindow (
672 expand => 1,
673 scroll_y => 1
674 );
649 my $vb = new CFClient::UI::VBox; 675 $r->add (my $vb = new CFClient::UI::VBox);
650 676
651 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, 677 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1,
652 can_hover => 1, can_events => 1, 678 can_hover => 1, can_events => 1,
653 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 679 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
654 $vb->add ($STATWIDS->{map} = new CFClient::UI::Label valign => 0, align => -1, text => "Map:", expand => 1, 680 $vb->add ($STATWIDS->{map} = new CFClient::UI::Label valign => 0, align => -1, text => "Map:", expand => 1,
668 $hb->add (my $tbl = new CFClient::UI::Table expand => 1); 694 $hb->add (my $tbl = new CFClient::UI::Table expand => 1);
669 695
670 my $color2 = [1, 1, 0]; 696 my $color2 = [1, 1, 0];
671 697
672 for ( 698 for (
673 [0, 0, st_str => "Str", 30, "<b>Physical Strength</b>, determines damage dealt with weapons, how much you can carry, and how often you can attack"], 699 [0, 0, st_str => "Str", 30],
674 [0, 1, st_dex => "Dex", 30, "<b>Dexterity</b>, your physical agility. Determines chance of being hit and affects armor class and speed"], 700 [0, 1, st_dex => "Dex", 30],
675 [0, 2, st_con => "Con", 30, "<b>Constitution</b>, physical health and toughness. Determines how many healthpoints you can have"], 701 [0, 2, st_con => "Con", 30],
676 [0, 3, st_int => "Int", 30, "<b>Intelligence</b>, your ability to learn and use skills and incantations (both prayers and magic) and determines how much spell points you can have"], 702 [0, 3, st_int => "Int", 30],
677 [0, 4, st_wis => "Wis", 30, "<b>Wisdom</b>, the ability to learn and use divine magic (prayers). Determines how many grace points you can have"], 703 [0, 4, st_wis => "Wis", 30],
678 [0, 5, st_pow => "Pow", 30, "<b>Power</b>, your magical potential. Influences the strength of spell effects, and also how much your spell and grace points increase when leveling up"], 704 [0, 5, st_pow => "Pow", 30],
679 [0, 6, st_cha => "Cha", 30, "<b>Charisma</b>, how well you are received by NPCs. Affects buying and selling prices in shops."], 705 [0, 6, st_cha => "Cha", 30],
680 706
681 [2, 0, st_wc => "Wc", -120, "<b>Weapon Class</b>, effectiveness of melee/missile attacks. Lower is more potent. Current weapon, level and Str are some things which effect the value of Wc. The value of Wc may range between 25 and -72."], 707 [2, 0, st_wc => "Wc", -120],
682 [2, 1, st_ac => "Ac", -120, "<b>Armour Class</b>, how protected you are from being hit by any attack. Lower values are better. Ac is based on your race and is modified by the Dex and current armour worn. For characters that cannot wear armour, Ac improves as their level increases."], 708 [2, 1, st_ac => "Ac", -120],
683 [2, 2, st_dam => "Dam", 120, "<b>Damage</b>, how much damage your melee/missile attack inflicts. Higher values indicate a greater amount of damage will be inflicted with each attack."], 709 [2, 2, st_dam => "Dam", 120],
684 [2, 3, st_arm => "Arm", 120, "<b>Armour</b>, how much damage (from physical attacks) will be subtracted from successful hits made upon you. This value ranges between 0 to 99%. Current armour worn primarily determines Arm value. This is the same as the physical resistance."], 710 [2, 3, st_arm => "Arm", 120],
685 [2, 4, st_spd => "Spd", 10.54, "<b>Speed</b>, how fast you can move. The value of speed may range between nearly 0 (\"very slow\") to higher than 5 (\"lightning fast\"). Base speed is determined from the Dex and modified downward proportionally by the amount of weight carried which exceeds the Max Carry limit. The armour worn also sets the upper limit on speed."], 711 [2, 4, st_spd => "Spd", 10.54],
686 [2, 5, st_wspd => "WSp", 10.54, "<b>Weapon Speed</b>, how many attacks you may make per unit of time (0.120s). Higher values indicate faster attack speed. Current weapon and Dex effect the value of weapon speed."], 712 [2, 5, st_wspd => "WSp", 10.54],
687 ) { 713 ) {
688 my ($col, $row, $id, $label, $template, $tooltip) = @$_; 714 my ($col, $row, $id, $label, $template) = @$_;
689 715
690 $tbl->add ($col , $row, $STATWIDS->{$id} = new CFClient::UI::Label 716 $tbl->add ($col , $row, $STATWIDS->{$id} = new CFClient::UI::Label
691 font => $FONT_FIXED, can_hover => 1, can_events => 1, valign => 0, align => +1, template => $template, tooltip => $tooltip); 717 font => $FONT_FIXED, can_hover => 1, can_events => 1, valign => 0,
718 align => +1, template => $template, tooltip => $CFClient::STAT_TOOLTIP{$label});
692 $tbl->add ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new CFClient::UI::Label 719 $tbl->add ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new CFClient::UI::Label
693 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0, align => -1, text => $label, tooltip => $tooltip); 720 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0,
721 align => -1, text => $label, tooltip => $CFClient::STAT_TOOLTIP{$label});
694 } 722 }
695 723
696 $vb->add (my $tbl2 = new CFClient::UI::Table expand => 1); 724 $vb->add (my $tbl2 = new CFClient::UI::Table expand => 1);
697 725
698 my $row = 0; 726 my $row = 0;
773 } 801 }
774 } 802 }
775 803
776 #update_stats_window ({}); 804 #update_stats_window ({});
777 805
778 $vb 806 $r
779} 807}
780 808
781sub skill_window { 809sub skill_window {
810 my $sw = new CFClient::UI::ScrolledWindow (expand => 1);
782 $STATWIDS->{skill_tbl} = new CFClient::UI::Table expand => 1, col_expand => [0, 0, 1, 0, 0, 1] 811 $sw->add ($STATWIDS->{skill_tbl} = new CFClient::UI::Table expand => 1, col_expand => [0, 0, 1, 0, 0, 1]);
812 $sw
783} 813}
784 814
785sub formsep($) { 815sub formsep($) {
786 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1 816 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1
787} 817}
1229sub inventory_widget { 1259sub inventory_widget {
1230 my $hb = new CFClient::UI::HBox homogeneous => 1; 1260 my $hb = new CFClient::UI::HBox homogeneous => 1;
1231 1261
1232 $hb->add (my $vb1 = new CFClient::UI::VBox); 1262 $hb->add (my $vb1 = new CFClient::UI::VBox);
1233 $vb1->add (new CFClient::UI::Label align => 0, text => "Player"); 1263 $vb1->add (new CFClient::UI::Label align => 0, text => "Player");
1264 $vb1->add (my $sw1 = new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1234 $vb1->add ($INV = new CFClient::UI::Inventory); 1265 $sw1->add ($INV = new CFClient::UI::Inventory);
1235 1266
1236 $hb->add (my $vb2 = new CFClient::UI::VBox); 1267 $hb->add (my $vb2 = new CFClient::UI::VBox);
1237 1268
1238 $vb2->add ($INV_RIGHT_HB = new CFClient::UI::HBox); 1269 $vb2->add ($INV_RIGHT_HB = new CFClient::UI::HBox);
1239 1270
1271 $vb2->add (my $sw2 = new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1240 $vb2->add ($INVR = new CFClient::UI::Inventory); 1272 $sw2->add ($INVR = new CFClient::UI::Inventory);
1241 1273
1242 # XXX: Call after $INVR = ... because set_opencont sets the items 1274 # XXX: Call after $INVR = ... because set_opencont sets the items
1243 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor"); 1275 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor");
1244 1276
1245 $hb 1277 $hb
1267 has_close_button => 1 1299 has_close_button => 1
1268 ; 1300 ;
1269 1301
1270 my $ntb = 1302 my $ntb =
1271 $PL_NOTEBOOK = 1303 $PL_NOTEBOOK =
1272 new CFClient::UI::Notebook 1304 new CFClient::UI::Notebook expand => 1, debug => 1;
1273 expand => 1,
1274 debug => 1,
1275 filter => (new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1),
1276 ;
1277 1305
1278 $ntb->add ( 1306 $ntb->add (
1279 "Statistics (F2)" => $STATS_PAGE = stats_window, 1307 "Statistics (F2)" => $STATS_PAGE = stats_window,
1280 "Shows statistics, where all your Stats and Resistances are shown." 1308 "Shows statistics, where all your Stats and Resistances are shown."
1281 ); 1309 );
1282 $ntb->add ( 1310 $ntb->add (
1283 "Skills (F3)" => $SKILL_PAGE = skill_window, 1311 "Skills (F3)" => $SKILL_PAGE = skill_window,
1284 "Shows all your Skills." 1312 "Shows all your Skills."
1285 ); 1313 );
1314
1315 my $spellsw = new CFClient::UI::ScrolledWindow (expand => 1, scroll_y => 1);
1316 $spellsw->add ($SPELL_PAGE = new CFClient::UI::SpellList);
1286 $ntb->add ( 1317 $ntb->add (
1287 "Spellbook (F4)" => $SPELL_PAGE = new CFClient::UI::SpellList, 1318 "Spellbook (F4)" => $spellsw,
1288 "Displays all spells you have and lets you edit keyboard shortcuts for them." 1319 "Displays all spells you have and lets you edit keyboard shortcuts for them."
1289 ); 1320 );
1290 $ntb->add ( 1321 $ntb->add (
1291 "Inventory (F5)" => $INVENTORY_PAGE = inventory_widget, 1322 "Inventory (F5)" => $INVENTORY_PAGE = inventory_widget,
1292 "Toggles the inventory window, where you can manage your loot (or treasures :). " 1323 "Toggles the inventory window, where you can manage your loot (or treasures :). "
1409 $refresh->(); 1440 $refresh->();
1410 1441
1411 $vb 1442 $vb
1412} 1443}
1413 1444
1445# just weirdness, pls. ignore
1446sub load_html_page {
1447 my ($viewer, $base) = @_;
1448
1449 $viewer->clear;
1450
1451 require LWP::Simple;
1452 require HTML::Parser;
1453 require URI;
1454
1455 my $page = LWP::Simple::get ($base)
1456 or return;
1457
1458 my @s = { };
1459 my %passthrough = map ($_ => undef), qw(b i u s tt big small sub sup);
1460
1461 my $parser = HTML::Parser->new (
1462 text_h => [sub {
1463 my ($text) = @_;
1464 $text =~ s/\s+/ /g;
1465 $s[-1]{text} .= CFClient::UI::Label::escape $text;
1466 }, "dtext"],
1467 start_h => [sub {
1468 my ($tag, $attr) = @_;
1469 if ($passthrough{$tag}) {
1470 $s[-1]{text} .= "<$tag>";
1471 } elsif ($tag eq "h1") {
1472 push @s, { text => "<span foreground='#ffff00' size='x-large'>" };
1473 } elsif ($tag eq "h2") {
1474 push @s, { text => "<span foreground='#ccccff' size='large'>" };
1475 } elsif ($tag eq "h3") {
1476 push @s, { text => "<span size='large'>" };
1477 } elsif ($tag eq "a") {
1478 push @s, { text => "", url => $attr->{href} };
1479 } elsif ($tag eq "p") {
1480 push @s, { };
1481 } elsif ($tag eq "img") {
1482 eval {
1483 push @{$s[-1]{obj}}, new CFClient::UI::Image
1484 tex => (new_from_image CFClient::Texture LWP::Simple::get (URI->new ($attr->{src}, $base)->abs ($base)));
1485 $s[-1]{text} .= "\x{fffc}";
1486 };
1487 }
1488 }, "tagname, attr"],
1489 end_h => [sub {
1490 my ($tag) = @_;
1491 if ($passthrough{$tag}) {
1492 $s[-1]{text} .= "</$tag>";
1493 } elsif ($tag =~ /^h\d$/) {
1494 $s[-1]{text} .= "</span>";
1495 push @s, { };
1496 } elsif ($tag eq "a") {
1497 my $S = pop @s;
1498 $s[-1]{text} .= "\x{fffc}";
1499 push @{$s[-1]{obj}}, new CFClient::UI::Label
1500 fg => [0.8, 0.8, 1],
1501 markup => "<u>$S->{text}</u>",
1502 fontsize => 0.8,
1503 can_events => 1,
1504 can_focus => 1,
1505 on_button_up => sub {
1506 load_html_page ($viewer, URI->new ($S->{url}, $base)->abs ($base));
1507 },
1508 ;
1509 }
1510 }, "tagname"],
1511 );
1512
1513 $parser->parse ($page);
1514 $parser->eof;
1515
1516 $viewer->add_paragraph ([1, 1, 1, 1], [$_->{text}, @{ $_->{obj} || [] }], $_->{indent})
1517 for @s;
1518
1519 $viewer->set_offset (0);
1520}
1521
1414sub help_window { 1522sub help_window {
1415 my $win = new CFClient::UI::FancyFrame 1523 my $win = new CFClient::UI::FancyFrame
1416 x => 'center', 1524 x => 'center',
1417 y => 'center', 1525 y => 'center',
1418 z => 2, 1526 z => 2,
1436 [manual => "Main Manual"], 1544 [manual => "Main Manual"],
1437 [skill_help => "Skill Reference"], 1545 [skill_help => "Skill Reference"],
1438 [command_help => "Command Reference"], 1546 [command_help => "Command Reference"],
1439 [dmcommand_help => "DM Commands"], 1547 [dmcommand_help => "DM Commands"],
1440 [COPYING => "License Terms"], 1548 [COPYING => "License Terms"],
1549 [test => "test (do not select)"], #d#TODO
1441 ], 1550 ],
1442 on_changed => sub { 1551 on_changed => sub {
1443 my ($self, $pod) = @_; 1552 my ($self, $pod) = @_;
1553
1554 if ($pod eq "test") {#d#TODO
1555 eval {
1556 load_html_page $viewer, "http://crossfire.real-time.com/guides/walkthrough/newbie-tower.html";
1557 };
1558 warn "$@" if $@;
1559 return;
1560 }
1444 1561
1445 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod", 1562 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod",
1446 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] }; 1563 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] };
1447 1564
1448 $viewer->clear; 1565 $viewer->clear;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines