Map.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:5k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. # Win32::GUI Map Viewer for OpenKore
  3. # by: amacc_boy (koreadvance@yahoo.com)
  4. #
  5. #########################################################################
  6. package Interface::Win32::Map;
  7. use strict;
  8. use Win32::GUI;
  9. use Globals;
  10. use Field;
  11. use Misc;
  12. my ($r_field,$W,$H,$DC,$bit,$DC2);
  13. our $map_name;
  14. our $mapOpened = 0;
  15. our @input_que;
  16. sub new {
  17. my $class = shift;
  18. my $self = {
  19. mw => undef,
  20. };
  21. bless $self, $class;
  22. return $self;
  23. }
  24. ################################################################
  25. # init
  26. ################################################################
  27. sub initMapGUI {
  28. my $self = shift;
  29. $self->{mw} = new Win32::GUI::Window (
  30.     -left   => 0,
  31.     -top    => 0,
  32.     -width  => 300,
  33.     -height => 300,
  34.     -name   => "Window",
  35.     -text   => "Map Viewer: ",
  36.     -maximizebox => 0,
  37.     -minimizebox => 0,
  38.     -onTerminate => &onexit, 
  39.     -resizable => 0,
  40.     -topmost => 1,
  41. );
  42. $mapOpened = 1;
  43. $self->{mw}->Show();
  44. }
  45. #Paint map in temporary dc before painting to window
  46. sub paintMap {
  47. my $self = shift;
  48. $map_name = $field->name();
  49. $r_field = $field;
  50. $self->{mw}->Resize($field->width(),$field->height()+30);
  51.     $W = $self->{mw}->ScaleWidth;
  52.     $H = $self->{mw}->ScaleHeight;
  53.     $DC = $self->{mw}->GetDC;
  54.     $DC2 = $DC->CreateCompatibleDC();
  55.     $bit = $DC->CreateCompatibleBitmap($W,$H); 
  56.     $DC2->SelectObject($bit);
  57.     
  58. my ($mvw_x,$mvw_y);
  59. $mvw_x = $field->width();
  60. $mvw_y = $field->height();
  61.     
  62. for (my $j = 0; $j < $mvw_x; $j++) {
  63. for (my $k = 0; $k < $mvw_y; $k++) {
  64. my $block = $field->getBlock($j, $mvw_y-$k);
  65. if ($block == Field::WALKABLE) {
  66. $DC2->SetPixel($j, $k, [202,255,228],);
  67. } elsif ($block == Field::NON_WALKABLE) {
  68. $DC2->SetPixel($j, $k, [181,182,181],);
  69. } elsif ($block == Field::WALKABLE_WATER) {
  70. $DC2->SetPixel($j, $k, [255,0,0],);
  71. } elsif ($block == Field::SNIPABLE_CLIFF) {
  72. $DC2->SetPixel($j, $k, [194,135,135],);
  73. }
  74. }
  75. }
  76. $DC->BitBlt(0, 0, $W,$H,$DC2, 0, 0);
  77.     #We now delete the DC
  78.     #$DC2->DeleteDC(); #Dont delete need for repainting
  79. }
  80. sub onexit {
  81. my $self = shift;
  82. }
  83. sub mapIsShown {
  84. return $mapOpened;
  85. }
  86. # Repaint Map by BitBlt from stored DC2 to DC
  87. #
  88. sub Repaint {
  89. return if (!$DC2);
  90. $DC->BitBlt(0, 0, $W,$H,$DC2, 0, 0);
  91. }
  92. # Paint own position
  93. #
  94. sub paintPos {
  95. my $self = shift;
  96. return unless defined($config{'char'}) && defined($chars[$config{'char'}]) && defined($char->{'pos_to'});
  97. my ($x,$y) = @{$char->{'pos_to'}}{'x', 'y'};
  98. my ($C,$left,$top,$right,$bottom);
  99. if ($self->mapIsShown()) {
  100. if ($map_name ne $r_field->name()) {
  101. $self->paintMap();
  102. }
  103. $self->{mw}->Caption("Map View: " . $field->name() . " ($x,$y)");
  104. #$DC = $self->{mw}->GetDC;
  105. $C = new Win32::GUI::Pen(
  106.             -color => [0,0,255], 
  107.             -width => 2,
  108.         );
  109.         
  110.         $DC->SelectObject($C);
  111.         
  112.         $left   = $x;
  113.         $top    = $r_field->height()-$y;
  114.         $right  = $left+3;
  115.         $bottom = $top+3;
  116.         $DC->Ellipse($left, $top, $right, $bottom);
  117. }
  118. }
  119. # Paint Position of monsters, players, npcs
  120. #
  121. sub paintMiscPos {
  122. my $self = shift;
  123. my ($C,$D,$E,$left,$top,$right,$bottom);
  124. if ($self->mapIsShown()) {
  125. #$DC = $self->{mw}->GetDC;
  126. $C = new Win32::GUI::Pen( #monster color
  127.             -color => [255,0,0], 
  128.             -width => 2,
  129.         );
  130. $D = new Win32::GUI::Pen( #player color
  131.             -color => [128,128,64], 
  132.             -width => 2,
  133.         );
  134.         
  135. $E = new Win32::GUI::Pen( #npc color
  136.             -color => [128,128,255], 
  137.             -width => 2,
  138.         );
  139.                 
  140.         $DC->SelectObject($C);
  141. for (my $i = 0; $i < @monstersID; $i++) {
  142. next if ($monstersID[$i] eq "");
  143.         $left   = $monsters{$monstersID[$i]}{'pos'}{'x'};
  144.         $top    = $r_field->height()-$monsters{$monstersID[$i]}{'pos'}{'y'};
  145.         $right  = $left+3;
  146.         $bottom = $top+3;
  147.         $DC->Ellipse($left, $top, $right, $bottom);
  148. }
  149. $DC->SelectObject($D);
  150. for (my $i = 0; $i < @playersID; $i++) {
  151. next if ($playersID[$i] eq "");
  152.         $left   = $players{$playersID[$i]}{'pos'}{'x'};
  153.         $top    = $r_field->height()-$players{$playersID[$i]}{'pos'}{'y'};
  154.         $right  = $left+3;
  155.         $bottom = $top+3;
  156.         $DC->Ellipse($left, $top, $right, $bottom);
  157. }
  158. $DC->SelectObject($E);
  159. for (my $i = 0; $i < @npcsID; $i++) {
  160. next if ($npcsID[$i] eq "");
  161.         $left   = $npcs{$npcsID[$i]}{'pos'}{'x'};
  162.         $top    = $r_field->height()-$npcs{$npcsID[$i]}{'pos'}{'y'};
  163.         $right  = $left+3;
  164.         $bottom = $top+3;
  165.         $DC->Ellipse($left, $top, $right, $bottom);
  166. }
  167. }
  168. }
  169. 1;