Created the project, added some rooms
47
README.md
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
# Megaman Battle Network 5 Mini Map App
|
||||
|
||||
This app is a Windows only tool that reads MMBN Legacy Collection 2's memory and grabs current map ID from that.
|
||||
|
||||
Then it displays an image of the current room if that's present in the [images](/images/) folder.
|
||||
|
||||
The images were taken from [Dr. Cossack's Lab](https://www.interordi.com/mega_man_pc/games/mmbn5/) without anyone's consent.
|
||||
|
||||
|
||||
# How to use
|
||||
|
||||
- Open the legacy collection 2
|
||||
- Load up MMBN 5 (tested with Team Protoman)
|
||||
- Open this app
|
||||
- Use `Start`/`Stop` button to enable/disable memory reading.
|
||||
- If you encounter an `Unknown` Room - press `Edit` it and give it a name.
|
||||
- The name you've given will be used when loading images, e.g. when you're in the `Lan's Room`, the app will try to load `./images/Lan's Room.png` image.
|
||||
|
||||
The app should work under a regular user ***do not*** give this app (and 99.9% of all the other apps) admin privs
|
||||
|
||||
|
||||
# Usecases
|
||||
|
||||
I dunno, having a map ready? Maybe for a stream? Does the reason have to exist?
|
||||
|
||||
|
||||
# Legal Stuff
|
||||
|
||||
One word: **WTFPL**.
|
||||
|
||||
Assets are *not* included. Because...
|
||||
|
||||
***- Wait, did you *steal* the images? ~ The User***
|
||||
|
||||
> As stated above, the images were obtained from the internet w/o anyone's consent.
|
||||
>
|
||||
> We can argue all day about whether coding something means I can tell you what to do. Especially when the app in question uses assets made by other people and is useless without those.
|
||||
>
|
||||
> The same goes for the images. Yes, [Mega Boy](megaboy@sympatico.ca) did create the images used in this app, but does he own them? Can he (or Dr. Cossack's for that sake) grant *any* persmissions regading Capcom's assets?
|
||||
>
|
||||
> Don't think so.
|
||||
>
|
||||
> It's not hard to ask, but I don't feel like there's any reason to.
|
||||
>
|
||||
> Dumping something from a game sure requires an investment of time - just as crating this app and writing this readme does. But neither act magically makes any of use the owner of those assets. At best it's a derivative work akin fan art.
|
||||
>
|
||||
> If there's anyone to ask that would be Capcom themselves. And we all know what they think (see [III. IMPERMISSIBLE USES](https://www.capcomusa.com/video-policy/)). Be happy Capcom doesn't enforce its rights and allows us to to what we do
|
||||
BIN
images/ACDC Area 1.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
images/ACDC Area 2.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
images/ACDC Area 3.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
images/Drill Comp 1.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
images/Drill Comp 2.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
images/Drill Comp 3.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
images/Drill Comp 4.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
images/End Area 1.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
images/End Area 2.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
images/End Area 3.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
images/End Area 4.png
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
images/End Area 5.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
images/Factory Comp 1.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
images/Factory Comp 2.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
images/Factory Comp 3.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
images/Factory Comp 4.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
images/Gargoil Comp 1.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
images/Gargoil Comp 2.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
images/Gargoil Comp 3.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
images/Gargoil Comp 4.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
images/Main System 1.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
images/Main System 2.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
images/Nebula 1.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
images/Nebula 2.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
images/Nebula 3.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
images/Nebula 4.png
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
images/Nebula 5.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
images/Nebula 6.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
images/Oran Area 1.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
images/Oran Area 2.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
images/Oran Area 3.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
images/SciLab Area 1.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
images/SciLab Area 2.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
images/SciLab Area 3.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
images/SciLab Area 4.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
images/Ship Comp 1.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
images/Ship Comp 2.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
images/Ship Comp 3.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
images/Ship Comp 4.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
images/Undernet 1.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
images/Undernet 2.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
images/Undernet 3.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
images/Undernet 4.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
92
mmbn5m.lpi
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="12"/>
|
||||
<PathDelim Value="\"/>
|
||||
<General>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<Title Value="mmbn5m"/>
|
||||
<Scaled Value="True"/>
|
||||
<ResourceType Value="res"/>
|
||||
<UseXPManifest Value="True"/>
|
||||
<XPManifest>
|
||||
<DpiAware Value="True"/>
|
||||
</XPManifest>
|
||||
<Icon Value="0"/>
|
||||
</General>
|
||||
<BuildModes>
|
||||
<Item Name="Debug" Default="True"/>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<UseFileFilters Value="True"/>
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<FormatVersion Value="2"/>
|
||||
</RunParams>
|
||||
<RequiredPackages>
|
||||
<Item>
|
||||
<PackageName Value="LCL"/>
|
||||
</Item>
|
||||
</RequiredPackages>
|
||||
<Units>
|
||||
<Unit>
|
||||
<Filename Value="mmbn5m.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit>
|
||||
<Unit>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="Form1"/>
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="Unit1"/>
|
||||
</Unit>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<PathDelim Value="\"/>
|
||||
<Target>
|
||||
<Filename Value="mmbn5m"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<CodeGeneration>
|
||||
<SmartLinkUnit Value="True"/>
|
||||
<RelocatableUnit Value="True"/>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="4"/>
|
||||
</Optimizations>
|
||||
<SmallerCode Value="True"/>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsDwarf2Set"/>
|
||||
<StripSymbols Value="True"/>
|
||||
<UseExternalDbgSyms Value="True"/>
|
||||
</Debugging>
|
||||
<LinkSmart Value="True"/>
|
||||
<Options>
|
||||
<Win32>
|
||||
<GraphicApplication Value="True"/>
|
||||
</Win32>
|
||||
</Options>
|
||||
</Linking>
|
||||
</CompilerOptions>
|
||||
<Debugging>
|
||||
<Exceptions>
|
||||
<Item>
|
||||
<Name Value="EAbort"/>
|
||||
</Item>
|
||||
<Item>
|
||||
<Name Value="ECodetoolError"/>
|
||||
</Item>
|
||||
<Item>
|
||||
<Name Value="EFOpenError"/>
|
||||
</Item>
|
||||
</Exceptions>
|
||||
</Debugging>
|
||||
</CONFIG>
|
||||
25
mmbn5m.lpr
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
program mmbn5m;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
uses
|
||||
{$IFDEF UNIX}
|
||||
cthreads,
|
||||
{$ENDIF}
|
||||
{$IFDEF HASAMIGA}
|
||||
athreads,
|
||||
{$ENDIF}
|
||||
Interfaces, // this includes the LCL widgetset
|
||||
Forms, Unit1
|
||||
{ you can add units after this };
|
||||
|
||||
{$R *.res}
|
||||
|
||||
begin
|
||||
RequireDerivedFormResource:=True;
|
||||
Application.Scaled:=True;
|
||||
Application.Initialize;
|
||||
Application.CreateForm(TForm1, Form1);
|
||||
Application.Run;
|
||||
end.
|
||||
|
||||
204
mmbn5m.lps
Normal file
|
|
@ -0,0 +1,204 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<CONFIG>
|
||||
<ProjectSession>
|
||||
<PathDelim Value="\"/>
|
||||
<Version Value="12"/>
|
||||
<BuildModes Active="Release">
|
||||
<Item Name="Release">
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<PathDelim Value="\"/>
|
||||
<Target>
|
||||
<Filename Value="mmbn5m"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<CodeGeneration>
|
||||
<SmartLinkUnit Value="True"/>
|
||||
<RelocatableUnit Value="True"/>
|
||||
<TargetCPU Value="x86_64"/>
|
||||
<TargetOS Value="win64"/>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="4"/>
|
||||
</Optimizations>
|
||||
<SmallerCode Value="True"/>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsDwarf2Set"/>
|
||||
<TrashVariables Value="True"/>
|
||||
<StripSymbols Value="True"/>
|
||||
<UseExternalDbgSyms Value="True"/>
|
||||
</Debugging>
|
||||
<LinkSmart Value="True"/>
|
||||
<Options>
|
||||
<Win32>
|
||||
<GraphicApplication Value="True"/>
|
||||
</Win32>
|
||||
</Options>
|
||||
</Linking>
|
||||
</CompilerOptions>
|
||||
</Item>
|
||||
</BuildModes>
|
||||
<Units>
|
||||
<Unit>
|
||||
<Filename Value="mmbn5m.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<EditorIndex Value="1"/>
|
||||
<CursorPos X="69" Y="19"/>
|
||||
<UsageCount Value="29"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit>
|
||||
<Unit>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<ComponentName Value="Form1"/>
|
||||
<HasResources Value="True"/>
|
||||
<ResourceBaseClass Value="Form"/>
|
||||
<UnitName Value="Unit1"/>
|
||||
<IsVisibleTab Value="True"/>
|
||||
<TopLine Value="144"/>
|
||||
<CursorPos X="41" Y="175"/>
|
||||
<UsageCount Value="29"/>
|
||||
<Loaded Value="True"/>
|
||||
<LoadedDesigner Value="True"/>
|
||||
</Unit>
|
||||
<Unit>
|
||||
<Filename Value="C:\lazarus\lcl\interfaces\win32\win32listsl.inc"/>
|
||||
<EditorIndex Value="2"/>
|
||||
<TopLine Value="128"/>
|
||||
<CursorPos Y="152"/>
|
||||
<UsageCount Value="12"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit>
|
||||
</Units>
|
||||
<JumpHistory HistoryIndex="29">
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="200" Column="35" TopLine="142"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="108" Column="17" TopLine="82"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="116" TopLine="84"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="108" Column="33" TopLine="84"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="192" Column="11" TopLine="182"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="199" Column="11" TopLine="174"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="200" Column="25" TopLine="176"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="117" TopLine="93"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="132" Column="12" TopLine="122"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="175" TopLine="144"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="118" Column="41" TopLine="94"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="170" Column="55" TopLine="146"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="117" Column="13" TopLine="117"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="136" Column="25" TopLine="116"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="135" Column="25" TopLine="115"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="134" Column="25" TopLine="114"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="133" Column="25" TopLine="113"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="132" Column="25" TopLine="112"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="210" Column="6" TopLine="208"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="209" Column="6" TopLine="207"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="199" Column="38" TopLine="181"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="166" Column="7" TopLine="153"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="182" Column="91" TopLine="156"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="145" Column="63" TopLine="113"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="141" Column="58" TopLine="113"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="140" Column="41" TopLine="118"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="171" Column="61" TopLine="155"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="130" Column="37" TopLine="106"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="129" Column="22" TopLine="106"/>
|
||||
</Position>
|
||||
<Position>
|
||||
<Filename Value="unit1.pas"/>
|
||||
<Caret Line="174" Column="38" TopLine="155"/>
|
||||
</Position>
|
||||
</JumpHistory>
|
||||
<RunParams>
|
||||
<FormatVersion Value="2"/>
|
||||
<Modes ActiveMode=""/>
|
||||
</RunParams>
|
||||
</ProjectSession>
|
||||
</CONFIG>
|
||||
BIN
mmbn5m.res
Normal file
BIN
mmbn5mm.exe
Normal file
31
rooms.ini
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
[Rooms]
|
||||
144=ACDC Area 1
|
||||
145=Oran Area 1
|
||||
146=SciLab Area 1
|
||||
147=End Area 1
|
||||
148=Undernet 1
|
||||
400=ACDC Area 2
|
||||
401=Oran Area 2
|
||||
402=SciLab Area 2
|
||||
902=End Area 2
|
||||
404=Undernet 2
|
||||
134=ACDC Area 3
|
||||
390=Oran Area 3
|
||||
646=SciLab Area 3
|
||||
403=End Area 3
|
||||
660=Undernet 3
|
||||
658=SciLab Area 4
|
||||
659=End Area 4
|
||||
661=Undernet 4
|
||||
897=Drill Comp 4
|
||||
898=Ship Comp 4
|
||||
899=Gargoil Comp 4
|
||||
900=Factory Comp 4
|
||||
256=Lan's House
|
||||
512=Lan's Room
|
||||
0=ACDC Town
|
||||
768=Mayl's Room
|
||||
1024=Dex's Room
|
||||
1280=Yai's Room
|
||||
136=Lan's Home Page
|
||||
392=Mayl's Home Page
|
||||
61
unit1.lfm
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
object Form1: TForm1
|
||||
Left = 802
|
||||
Height = 461
|
||||
Top = 496
|
||||
Width = 548
|
||||
BorderStyle = bsSingle
|
||||
Caption = 'MMBN5M'
|
||||
ClientHeight = 461
|
||||
ClientWidth = 548
|
||||
Font.CharSet = ANSI_CHARSET
|
||||
Font.Height = -16
|
||||
Font.Pitch = fpVariable
|
||||
Font.Quality = fqDraft
|
||||
OnCreate = FormCreate
|
||||
OnDestroy = FormDestroy
|
||||
LCLVersion = '2.2.6.0'
|
||||
object room_name_label: TLabel
|
||||
Left = 120
|
||||
Height = 21
|
||||
Top = 8
|
||||
Width = 157
|
||||
Caption = 'Room #0: Lan''s Room '
|
||||
ParentColor = False
|
||||
end
|
||||
object map_image: TImage
|
||||
Left = 120
|
||||
Height = 400
|
||||
Top = 40
|
||||
Width = 400
|
||||
Center = True
|
||||
OnPaint = map_imagePaint
|
||||
Proportional = True
|
||||
Stretch = True
|
||||
end
|
||||
object start_stop_button: TSpeedButton
|
||||
Left = 8
|
||||
Height = 30
|
||||
Top = 8
|
||||
Width = 100
|
||||
AllowAllUp = True
|
||||
Caption = 'Start'
|
||||
GroupIndex = 1
|
||||
Transparent = False
|
||||
OnClick = start_stop_buttonClick
|
||||
end
|
||||
object edit_room_button: TButton
|
||||
Left = 8
|
||||
Height = 30
|
||||
Top = 40
|
||||
Width = 100
|
||||
Caption = 'Edit Room'
|
||||
OnClick = edit_room_buttonClick
|
||||
TabOrder = 0
|
||||
end
|
||||
object Timer1: TTimer
|
||||
Enabled = False
|
||||
OnTimer = Timer1Timer
|
||||
Left = 24
|
||||
Top = 192
|
||||
end
|
||||
end
|
||||
204
unit1.pas
Normal file
|
|
@ -0,0 +1,204 @@
|
|||
unit Unit1;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
|
||||
Buttons, IniFiles ;
|
||||
|
||||
type
|
||||
|
||||
{ TForm1 }
|
||||
|
||||
TForm1 = class(TForm)
|
||||
edit_room_button: TButton;
|
||||
map_image: TImage;
|
||||
room_name_label: TLabel;
|
||||
start_stop_button: TSpeedButton;
|
||||
Timer1: TTimer;
|
||||
procedure edit_room_buttonClick(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure FormDestroy(Sender: TObject);
|
||||
procedure map_imagePaint(Sender: TObject);
|
||||
procedure start_stop_buttonClick(Sender: TObject);
|
||||
procedure Timer1Timer(Sender: TObject);
|
||||
private
|
||||
|
||||
public
|
||||
|
||||
end;
|
||||
|
||||
var
|
||||
Form1: TForm1;
|
||||
|
||||
implementation
|
||||
|
||||
|
||||
uses Windows, JwaTlHelp32;
|
||||
|
||||
|
||||
|
||||
function FindProcessID(const ExeFileName: string): DWORD;
|
||||
var
|
||||
ContinueLoop: BOOL;
|
||||
FSnapshotHandle: THandle;
|
||||
FProcessEntry32: TProcessEntry32;
|
||||
begin
|
||||
Result := 0;
|
||||
|
||||
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
|
||||
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
|
||||
|
||||
while Integer(ContinueLoop) <> 0 do
|
||||
begin
|
||||
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or
|
||||
(UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
|
||||
begin
|
||||
Result := FProcessEntry32.th32ProcessID;
|
||||
Break;
|
||||
end;
|
||||
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
|
||||
end;
|
||||
|
||||
CloseHandle(FSnapshotHandle);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
function ReadMemory(hProcess: THandle; Address: Pointer; var Buffer; Size: DWORD): Boolean;
|
||||
var
|
||||
NumberOfBytesRead: SIZE_T;
|
||||
begin
|
||||
Result := ReadProcessMemory(hProcess, Address, @Buffer, Size, NumberOfBytesRead) and (NumberOfBytesRead = Size);
|
||||
end;
|
||||
|
||||
procedure ListRunningProcesses(ProcList: TStrings);
|
||||
var
|
||||
pProc: TProcessEntry32;
|
||||
pSnap: THandle;
|
||||
pBool: BOOL;
|
||||
begin
|
||||
ProcList.Clear;
|
||||
pProc.dwSize := SizeOf(pProc);
|
||||
pSnap := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
|
||||
pBool := Process32First(pSnap, pProc);
|
||||
while Integer(pBool) <> 0 do
|
||||
begin
|
||||
ProcList.Add(pProc.szExeFile);
|
||||
pBool := Process32Next(pSnap, pProc);
|
||||
end;
|
||||
CloseHandle(pSnap);
|
||||
end;
|
||||
|
||||
|
||||
|
||||
var
|
||||
hProcess: THandle;
|
||||
ROOMS : TIniFile; // contains room labels
|
||||
process_list : TStrings;
|
||||
room: SmallInt = -1; // contains current room 16-bit value
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
{ TForm1 }
|
||||
|
||||
procedure TForm1.FormCreate(Sender: TObject);
|
||||
begin
|
||||
// open ini file and create a list to hold processes
|
||||
ROOMS := TIniFile.Create('rooms.ini');
|
||||
process_list := TStringList.Create();
|
||||
end;
|
||||
|
||||
procedure TForm1.FormDestroy(Sender: TObject);
|
||||
begin
|
||||
// close the process on exit if it's been opened
|
||||
if start_stop_button.Down = true then begin
|
||||
Timer1.Enabled:=false;
|
||||
CloseHandle(hProcess);
|
||||
end;
|
||||
// free additionally created objects
|
||||
ROOMS.Free;
|
||||
process_list.Free;
|
||||
end;
|
||||
|
||||
procedure TForm1.map_imagePaint(Sender: TObject);
|
||||
begin
|
||||
map_image.Canvas.Brush.Style:=bsClear;
|
||||
map_image.Canvas.Rectangle(0,0,400,400);
|
||||
end;
|
||||
|
||||
procedure TForm1.start_stop_buttonClick(Sender: TObject);
|
||||
var i:integer;
|
||||
ProcID: DWORD;
|
||||
|
||||
begin
|
||||
if start_stop_button.Down = false then begin
|
||||
start_stop_button.Caption:='Start';
|
||||
Timer1.Enabled:=false;
|
||||
CloseHandle(hProcess);
|
||||
end else begin
|
||||
start_stop_button.Caption:='Stop';
|
||||
ListRunningProcesses(process_list);
|
||||
for i:=0 to process_list.Count-1 do begin
|
||||
if (process_list[i] = 'MMBN_LC2.exe') then begin
|
||||
ProcID := FindProcessID(process_list[i]);
|
||||
hProcess := OpenProcess(PROCESS_VM_READ, False, ProcID);
|
||||
Caption:= 'MMBN5M: Reading from process ID '+ IntToStr(ProcID);
|
||||
Timer1.Enabled:=true;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
procedure TForm1.Timer1Timer(Sender: TObject);
|
||||
var
|
||||
room_name: string;
|
||||
begin
|
||||
|
||||
if hProcess <> 0 then
|
||||
begin
|
||||
try
|
||||
if ReadMemory(hProcess, Pointer($80205FF4), room, SizeOf(room)) then
|
||||
begin
|
||||
room_name := ROOMS.ReadString('Rooms', inttostr(room), 'Unknown');
|
||||
room_name_label.Caption := 'Room #'+ inttostr(room)+ ': '+ room_name;
|
||||
if FileExists('images/'+room_name+'.png') then begin
|
||||
map_image.Picture.LoadFromFile('images/'+room_name+'.png');
|
||||
end else begin
|
||||
map_image.Picture.Clear;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
room_name_label.Caption := 'error';
|
||||
end;
|
||||
except
|
||||
on edit_room_button: Exception do
|
||||
room_name_label.Caption:='error';
|
||||
end;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
procedure TForm1.edit_room_buttonClick(Sender: TObject);
|
||||
var new_room_name:string;
|
||||
begin//
|
||||
if InputQuery('Editing Room # '+inttostr(room), 'Enter this Room''s name', new_room_name) then begin
|
||||
ROOMS.WriteString('Rooms', inttostr(room), new_room_name);
|
||||
end;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||