├── MuConfig ├── errs9112221 ├── main.rc ├── mu.ico ├── lcc │ ├── muKonfig.err │ ├── main.res │ ├── muKonfig.exe │ ├── mukonfig.obj │ ├── muKonfig.dep │ └── Makefile ├── muConfig.exe ├── muConfig.layout ├── muKonfig.prj ├── Makefile.win ├── muConfig.dev └── muKonfig.c ├── .gitignore ├── MuMapEdit ├── fp.dir ├── RGBHead.bmp ├── menu.rc ├── menu.res ├── fpc-res.or ├── MonoHead.bmp ├── bmpheads.res ├── fpc-res.res ├── mumapedit.exe ├── bmpheads.rc ├── MuMapEditTMP │ ├── Terrain.att │ ├── Terrain.map │ ├── TileGrass01.bmp │ ├── TileGrass02.bmp │ ├── TileRock01.bmp │ ├── TileRock02.bmp │ ├── TileWater01.bmp │ ├── TileWood01.bmp │ ├── TerrainHeight.ozb │ ├── TerrainLight.bmp │ ├── TileGround01.bmp │ ├── TileGround02.bmp │ └── TileGround03.bmp ├── example │ ├── World3 │ │ ├── borken.bmp │ │ ├── Terrain.att │ │ ├── Terrain.map │ │ ├── TileGrass01.bmp │ │ ├── TileGrass02.bmp │ │ ├── TileRock01.bmp │ │ ├── TileRock02.bmp │ │ ├── TileRock03.bmp │ │ ├── TileRock04.bmp │ │ ├── TileRock05.bmp │ │ ├── TileRock06.bmp │ │ ├── TileRock07.bmp │ │ ├── TileWater01.bmp │ │ ├── TileWood01.bmp │ │ ├── TerrainHeight.ozb │ │ ├── TerrainLight.bmp │ │ ├── TileGround01.bmp │ │ ├── TileGround02.bmp │ │ └── TileGround03.bmp │ └── World1 │ │ ├── Terrain.att │ │ ├── Terrain.map │ │ ├── TileGrass01.bmp │ │ ├── TileGrass02.bmp │ │ ├── TileRock01.bmp │ │ ├── TileRock02.bmp │ │ ├── TileWater01.bmp │ │ ├── TileWood01.bmp │ │ ├── TerrainHeight.OZB │ │ ├── TerrainLight.bmp │ │ ├── TileGround01.bmp │ │ ├── TileGround02.bmp │ │ └── TileGround03.bmp └── mumapedit.pas ├── MuThreeJs ├── style.css ├── world0 │ ├── TerrainLight.jpg │ ├── TileGrass01.jpg │ ├── TileGrass01.tga │ ├── TileGrass02.jpg │ ├── TileGround01.jpg │ ├── TileGround02.jpg │ ├── TileGround03.jpg │ ├── TileRock01.jpg │ ├── TileRock02.jpg │ ├── TileWater01.jpg │ ├── TileWood01.jpg │ ├── _TileGrass01.jpg │ └── TerrainHeight.bmp ├── imgLoader.js ├── index.html ├── input.js └── main.js ├── MuBmd ├── 0.74 │ ├── Gate.bmd │ ├── Item.txt │ ├── Text.bmd │ ├── item.bmd │ ├── skill.bmd │ ├── Filter.bmd │ ├── NpcName(Kor).txt │ └── skill_dexor.bmd ├── 0.78 │ ├── Text.bmd │ ├── item.bmd │ └── skill.bmd ├── mobius │ ├── Item.bmd │ ├── Quest.bmd │ ├── Skill.bmd │ ├── Text.bmd │ ├── Text.txt │ ├── Movereq.bmd │ ├── skill_dexor.bmd │ └── NpcName(Eng).txt ├── 0.74_fixed │ ├── Text.txt │ ├── item.bmd │ ├── text.bmd │ ├── filter.bmd │ ├── skill.bmd │ ├── Skill.txt │ ├── NpcName(kor).txt │ └── Item.txt ├── 0.78_fixed │ ├── Item.bmd │ ├── Text.bmd │ ├── Text.txt │ ├── Skill.bmd │ └── Skill.txt ├── defBMD.php ├── _defBMD │ ├── filterAll.php │ ├── textAll.php │ ├── skill074.php │ ├── skill100.php │ ├── item074.php │ └── item100.php └── index.php ├── MuMapConv ├── mumapconv.exe └── mumapconv.pas ├── MuTexConv ├── mutexconv.exe └── mutexconv.pas ├── wtf2txt ├── pascal │ ├── wtf2txt.exe │ └── wtf2txt.pas ├── sample files │ ├── message.txt │ ├── message.wtf │ ├── message_kor.txt │ ├── message_kor.wtf │ └── New folder │ │ ├── message_kor.txt │ │ └── message_kor.wtf └── php │ └── wtf2txt.php ├── MuClientAssemble └── clientAssemble.php ├── LICENSE.md ├── README.md └── mulogo.svg /MuConfig/errs9112221: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | \.vscode/ 3 | -------------------------------------------------------------------------------- /MuConfig/main.rc: -------------------------------------------------------------------------------- 1 | 888 ICON "mu.ico" 2 | -------------------------------------------------------------------------------- /MuMapEdit/fp.dir: -------------------------------------------------------------------------------- 1 | Comment=Do NOT delete this file!!! 2 | -------------------------------------------------------------------------------- /MuMapEdit/RGBHead.bmp: -------------------------------------------------------------------------------- 1 | BM66(  -------------------------------------------------------------------------------- /MuThreeJs/style.css: -------------------------------------------------------------------------------- 1 | HTML, BODY { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | -------------------------------------------------------------------------------- /MuConfig/mu.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuConfig/mu.ico -------------------------------------------------------------------------------- /MuMapEdit/menu.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/menu.rc -------------------------------------------------------------------------------- /MuMapEdit/menu.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/menu.res -------------------------------------------------------------------------------- /MuBmd/0.74/Gate.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74/Gate.bmd -------------------------------------------------------------------------------- /MuBmd/0.74/Item.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74/Item.txt -------------------------------------------------------------------------------- /MuBmd/0.74/Text.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74/Text.bmd -------------------------------------------------------------------------------- /MuBmd/0.74/item.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74/item.bmd -------------------------------------------------------------------------------- /MuBmd/0.74/skill.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74/skill.bmd -------------------------------------------------------------------------------- /MuBmd/0.78/Text.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.78/Text.bmd -------------------------------------------------------------------------------- /MuBmd/0.78/item.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.78/item.bmd -------------------------------------------------------------------------------- /MuBmd/0.78/skill.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.78/skill.bmd -------------------------------------------------------------------------------- /MuConfig/lcc/muKonfig.err: -------------------------------------------------------------------------------- 1 | Warning d:\prg\__c\muconfig\mukonfig.c: 70 missing return value 2 | -------------------------------------------------------------------------------- /MuMapEdit/fpc-res.or: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/fpc-res.or -------------------------------------------------------------------------------- /MuBmd/0.74/Filter.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74/Filter.bmd -------------------------------------------------------------------------------- /MuBmd/mobius/Item.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/mobius/Item.bmd -------------------------------------------------------------------------------- /MuBmd/mobius/Quest.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/mobius/Quest.bmd -------------------------------------------------------------------------------- /MuBmd/mobius/Skill.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/mobius/Skill.bmd -------------------------------------------------------------------------------- /MuBmd/mobius/Text.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/mobius/Text.bmd -------------------------------------------------------------------------------- /MuBmd/mobius/Text.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/mobius/Text.txt -------------------------------------------------------------------------------- /MuConfig/lcc/main.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuConfig/lcc/main.res -------------------------------------------------------------------------------- /MuConfig/muConfig.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuConfig/muConfig.exe -------------------------------------------------------------------------------- /MuMapConv/mumapconv.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapConv/mumapconv.exe -------------------------------------------------------------------------------- /MuMapEdit/MonoHead.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MonoHead.bmp -------------------------------------------------------------------------------- /MuMapEdit/bmpheads.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/bmpheads.res -------------------------------------------------------------------------------- /MuMapEdit/fpc-res.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/fpc-res.res -------------------------------------------------------------------------------- /MuMapEdit/mumapedit.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/mumapedit.exe -------------------------------------------------------------------------------- /MuTexConv/mutexconv.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuTexConv/mutexconv.exe -------------------------------------------------------------------------------- /MuBmd/0.74_fixed/Text.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74_fixed/Text.txt -------------------------------------------------------------------------------- /MuBmd/0.74_fixed/item.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74_fixed/item.bmd -------------------------------------------------------------------------------- /MuBmd/0.74_fixed/text.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74_fixed/text.bmd -------------------------------------------------------------------------------- /MuBmd/0.78_fixed/Item.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.78_fixed/Item.bmd -------------------------------------------------------------------------------- /MuBmd/0.78_fixed/Text.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.78_fixed/Text.bmd -------------------------------------------------------------------------------- /MuBmd/0.78_fixed/Text.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.78_fixed/Text.txt -------------------------------------------------------------------------------- /MuBmd/mobius/Movereq.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/mobius/Movereq.bmd -------------------------------------------------------------------------------- /MuConfig/lcc/muKonfig.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuConfig/lcc/muKonfig.exe -------------------------------------------------------------------------------- /MuConfig/lcc/mukonfig.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuConfig/lcc/mukonfig.obj -------------------------------------------------------------------------------- /MuBmd/0.74/NpcName(Kor).txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74/NpcName(Kor).txt -------------------------------------------------------------------------------- /MuBmd/0.74/skill_dexor.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74/skill_dexor.bmd -------------------------------------------------------------------------------- /MuBmd/0.74_fixed/filter.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74_fixed/filter.bmd -------------------------------------------------------------------------------- /MuBmd/0.74_fixed/skill.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.74_fixed/skill.bmd -------------------------------------------------------------------------------- /MuBmd/0.78_fixed/Skill.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/0.78_fixed/Skill.bmd -------------------------------------------------------------------------------- /MuBmd/mobius/skill_dexor.bmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/mobius/skill_dexor.bmd -------------------------------------------------------------------------------- /wtf2txt/pascal/wtf2txt.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/wtf2txt/pascal/wtf2txt.exe -------------------------------------------------------------------------------- /MuBmd/mobius/NpcName(Eng).txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuBmd/mobius/NpcName(Eng).txt -------------------------------------------------------------------------------- /MuMapEdit/bmpheads.rc: -------------------------------------------------------------------------------- 1 | RGBHead RCDATA "C:\prg\MuMapEdit\RGBHead.bmp" 2 | MonoHead RCDATA "C:\prg\MuMapEdit\MonoHead.bmp" -------------------------------------------------------------------------------- /MuThreeJs/world0/TerrainLight.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TerrainLight.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileGrass01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileGrass01.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileGrass01.tga: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileGrass01.tga -------------------------------------------------------------------------------- /MuThreeJs/world0/TileGrass02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileGrass02.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileGround01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileGround01.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileGround02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileGround02.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileGround03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileGround03.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileRock01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileRock01.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileRock02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileRock02.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileWater01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileWater01.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/TileWood01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TileWood01.jpg -------------------------------------------------------------------------------- /MuThreeJs/world0/_TileGrass01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/_TileGrass01.jpg -------------------------------------------------------------------------------- /wtf2txt/sample files/message.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/wtf2txt/sample files/message.txt -------------------------------------------------------------------------------- /wtf2txt/sample files/message.wtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/wtf2txt/sample files/message.wtf -------------------------------------------------------------------------------- /MuClientAssemble/clientAssemble.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuClientAssemble/clientAssemble.php -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/Terrain.att: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/Terrain.att -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/Terrain.map: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/Terrain.map -------------------------------------------------------------------------------- /MuMapEdit/example/World3/borken.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/borken.bmp -------------------------------------------------------------------------------- /MuThreeJs/world0/TerrainHeight.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuThreeJs/world0/TerrainHeight.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileGrass01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileGrass01.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileGrass02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileGrass02.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileRock01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileRock01.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileRock02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileRock02.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileWater01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileWater01.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileWood01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileWood01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/Terrain.att: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/Terrain.att -------------------------------------------------------------------------------- /MuMapEdit/example/World1/Terrain.map: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/Terrain.map -------------------------------------------------------------------------------- /MuMapEdit/example/World3/Terrain.att: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/Terrain.att -------------------------------------------------------------------------------- /MuMapEdit/example/World3/Terrain.map: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/Terrain.map -------------------------------------------------------------------------------- /wtf2txt/sample files/message_kor.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/wtf2txt/sample files/message_kor.txt -------------------------------------------------------------------------------- /wtf2txt/sample files/message_kor.wtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/wtf2txt/sample files/message_kor.wtf -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TerrainHeight.ozb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TerrainHeight.ozb -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TerrainLight.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TerrainLight.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileGround01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileGround01.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileGround02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileGround02.bmp -------------------------------------------------------------------------------- /MuMapEdit/MuMapEditTMP/TileGround03.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/MuMapEditTMP/TileGround03.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileGrass01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileGrass01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileGrass02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileGrass02.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileRock01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileRock01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileRock02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileRock02.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileWater01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileWater01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileWood01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileWood01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileGrass01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileGrass01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileGrass02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileGrass02.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileRock01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileRock01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileRock02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileRock02.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileRock03.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileRock03.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileRock04.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileRock04.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileRock05.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileRock05.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileRock06.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileRock06.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileRock07.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileRock07.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileWater01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileWater01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileWood01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileWood01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TerrainHeight.OZB: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TerrainHeight.OZB -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TerrainLight.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TerrainLight.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileGround01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileGround01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileGround02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileGround02.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World1/TileGround03.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World1/TileGround03.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TerrainHeight.ozb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TerrainHeight.ozb -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TerrainLight.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TerrainLight.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileGround01.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileGround01.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileGround02.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileGround02.bmp -------------------------------------------------------------------------------- /MuMapEdit/example/World3/TileGround03.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/MuMapEdit/example/World3/TileGround03.bmp -------------------------------------------------------------------------------- /wtf2txt/sample files/New folder/message_kor.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/wtf2txt/sample files/New folder/message_kor.txt -------------------------------------------------------------------------------- /wtf2txt/sample files/New folder/message_kor.wtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tehKaiN/muonline-appz/HEAD/wtf2txt/sample files/New folder/message_kor.wtf -------------------------------------------------------------------------------- /MuThreeJs/imgLoader.js: -------------------------------------------------------------------------------- 1 | textureLoader = function() { 2 | this.toLoad = []; 3 | this.loadState = 0; 4 | } 5 | 6 | textureLoader.prototype.add = function(img) { 7 | this.toLoad = 8 | } -------------------------------------------------------------------------------- /MuConfig/muConfig.layout: -------------------------------------------------------------------------------- 1 | [Editor_0] 2 | CursorCol=1 3 | CursorRow=1 4 | TopLine=1 5 | LeftChar=1 6 | Open=1 7 | Top=1 8 | [Editors] 9 | Order=0 10 | Focused=0 11 | [Editor_1] 12 | Open=0 13 | Top=0 14 | -------------------------------------------------------------------------------- /MuBmd/defBMD.php: -------------------------------------------------------------------------------- 1 | [], 5 | 'skill' => [], 6 | 'item' => [], 7 | 'filter' => [], 8 | ); 9 | 10 | $defFiles = scanDir('_defBMD'); 11 | forEach($defFiles as $file) { 12 | if($file != '.' && $file != '..') 13 | require('_defBMD/'.$file); 14 | } 15 | 16 | ?> -------------------------------------------------------------------------------- /MuBmd/_defBMD/filterAll.php: -------------------------------------------------------------------------------- 1 | 20, 8 | 'groupSize' => 0, 9 | 'header' => 0, 10 | 'footer' => 0, 11 | 'translateField' => 'Phrase', 12 | 'fields' => [ 13 | ['Phrase', 'txt', 20], 14 | ], 15 | ]; 16 | 17 | ?> -------------------------------------------------------------------------------- /MuBmd/_defBMD/textAll.php: -------------------------------------------------------------------------------- 1 | 300, 8 | 'groupSize' => 0, 9 | 'header' => 0, 10 | 'footer' => 0, 11 | 'translateField' => 'Content', 12 | 'fields' => [ 13 | ['Content', 'txt', 300], 14 | ], 15 | ]; 16 | 17 | ?> -------------------------------------------------------------------------------- /MuBmd/_defBMD/skill074.php: -------------------------------------------------------------------------------- 1 | 36, 8 | 'groupSize' => 0, 9 | 'header' => 0, 10 | 'footer' => 0, 11 | 'translateField' => 'Name', 12 | 'fields' => [ 13 | ['Name', 'txt', 32], // 32 14 | ['Lvl', 'int', 1], // 33 15 | ['Dmg', 'int', 1], // 34 16 | ['Mana', 'int', 1], // 35 17 | ['Range', 'int', 1], // 36 18 | ], 19 | ]; 20 | 21 | ?> -------------------------------------------------------------------------------- /MuThreeJs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Lulz 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /MuConfig/lcc/muKonfig.dep: -------------------------------------------------------------------------------- 1 | [main.rc] 2 | [mukonfig.c] 3 | D:\kompilatory\lcc\include\windows.h 4 | D:\kompilatory\lcc\include\stdlib.h 5 | D:\kompilatory\lcc\include\stddef.h 6 | D:\kompilatory\lcc\include\_syslist.h 7 | D:\kompilatory\lcc\include\safelib.h 8 | D:\kompilatory\lcc\include\string.h 9 | D:\kompilatory\lcc\include\safelib.h 10 | D:\kompilatory\lcc\include\win.h 11 | D:\kompilatory\lcc\include\limits.h 12 | D:\kompilatory\lcc\include\stdarg.h 13 | D:\kompilatory\lcc\include\ctype.h 14 | D:\kompilatory\lcc\include\basetsd.h 15 | -------------------------------------------------------------------------------- /MuConfig/muKonfig.prj: -------------------------------------------------------------------------------- 1 | ; Wedit project file. Syntax: Name = value 2 | [muKonfig] 3 | PrjFiles=2 4 | File1=main.rc 5 | ProjectFlags=0 6 | Frame=154 154 960 750 7 | StatusBar=0,0,0,0 8 | Name=muKonfig 9 | CurrentFile=D:\prg\__C\muConfig\muKonfig.c 10 | OpenFiles=1 11 | OpenFile1="D:\prg\__C\muConfig\muKonfig.c" 39 22 22 974 675 12 | ProjectPath=d:\prg\__c\muconfig 13 | SourcesDir=D:\prg\__C\muConfig 14 | Defines= 15 | IncludeFilesCount=2 16 | IncludeFile0=D:\kompilatory\lcc\include 17 | Libraries= 18 | LinkerArgs= 19 | ProjectTime=9731 20 | MakeName=D:\kompilatory\lcc\bin\make.exe 21 | MakeDir=D:\prg\__C\muConfig\lcc 22 | Exe=d:\prg\__c\muconfig\lcc\mukonfig.exe 23 | DebuggerArguments= 24 | DbgExeName=mukonfig.exe 25 | DbgDir=d:\prg\__c\muconfig\lcc 26 | CompilerFlags=10485829 27 | Useframework=0 28 | NumberOfBreakpoints=0 29 | ErrorFile=D:\prg\__C\muConfig\lcc\muKonfig.err 30 | NrOfFileProcessors=0 31 | File2=mukonfig.c 32 | -------------------------------------------------------------------------------- /MuBmd/_defBMD/skill100.php: -------------------------------------------------------------------------------- 1 | 52, 8 | 'groupSize' => 0, 9 | 'header' => 0, 10 | 'footer' => 4, 11 | 'translateField' => 'Name', 12 | 'fields' => [ 13 | ['Name', 'txt', 32], // 32 14 | ['unk2', 'int', 1], // 33 15 | ['unk3', 'int', 1], // 34 16 | ['unk4', 'int', 1], // 35 17 | ['unk5', 'int', 1], // 36 18 | ['unk6', 'int', 1], // 37 19 | ['unk7', 'int', 1], // 38 20 | ['unk8', 'int', 1], // 39 21 | ['unk9', 'int', 1], // 40 22 | ['unk10', 'int', 1], // 41 23 | ['unk11', 'int', 1], // 42 24 | ['unk12', 'int', 1], // 43 25 | ['unk13', 'int', 1], // 44 26 | ['unk14', 'int', 1], // 45 27 | ['unk15', 'int', 1], // 46 28 | ['unk16', 'int', 1], // 47 29 | ['unk17', 'int', 1], // 48 30 | ['unk18', 'int', 1], // 49 31 | ['unk19', 'int', 1], // 50 32 | ['unk20', 'int', 1], // 51 33 | ['unk21', 'int', 1], // 52 34 | ], 35 | ]; 36 | 37 | ?> -------------------------------------------------------------------------------- /MuConfig/Makefile.win: -------------------------------------------------------------------------------- 1 | # Project: muConfig 2 | # Makefile created by Dev-C++ 4.9.9.2 3 | 4 | CPP = g++.exe 5 | CC = gcc.exe 6 | WINDRES = windres.exe 7 | RES = muConfig_private.res 8 | OBJ = muKonfig.o $(RES) 9 | LINKOBJ = muKonfig.o $(RES) 10 | LIBS = -L"D:/kompilatory/Dev-Cpp/lib" -mwindows -s -march=pentium2 11 | INCS = -I"D:/kompilatory/Dev-Cpp/include" 12 | CXXINCS = -I"D:/kompilatory/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"D:/kompilatory/Dev-Cpp/include/c++/3.4.2/backward" -I"D:/kompilatory/Dev-Cpp/include/c++/3.4.2/mingw32" -I"D:/kompilatory/Dev-Cpp/include/c++/3.4.2" -I"D:/kompilatory/Dev-Cpp/include" 13 | BIN = muConfig.exe 14 | CXXFLAGS = $(CXXINCS) -O3 -march=pentium2 15 | CFLAGS = $(INCS) -O3 -march=pentium2 16 | RM = rm -f 17 | 18 | .PHONY: all all-before all-after clean clean-custom 19 | 20 | all: all-before muConfig.exe all-after 21 | 22 | 23 | clean: clean-custom 24 | ${RM} $(OBJ) $(BIN) 25 | 26 | $(BIN): $(OBJ) 27 | $(CC) $(LINKOBJ) -o "muConfig.exe" $(LIBS) 28 | 29 | muKonfig.o: muKonfig.c 30 | $(CC) -c muKonfig.c -o muKonfig.o $(CFLAGS) 31 | 32 | muConfig_private.res: muConfig_private.rc main.rc 33 | $(WINDRES) -i muConfig_private.rc --input-format=rc -o muConfig_private.res -O coff 34 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | This is free and unencumbered software released into the public domain. 3 | 4 | Anyone is free to copy, modify, publish, use, compile, sell, or 5 | distribute this software, either in source code form or as a compiled 6 | binary, for any purpose, commercial or non-commercial, and by any 7 | means. 8 | 9 | In jurisdictions that recognize copyright laws, the author or authors 10 | of this software dedicate any and all copyright interest in the 11 | software to the public domain. We make this dedication for the benefit 12 | of the public at large and to the detriment of our heirs and 13 | successors. We intend this dedication to be an overt act of 14 | relinquishment in perpetuity of all present and future rights to this 15 | software under copyright law. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | OTHER DEALINGS IN THE SOFTWARE. 24 | 25 | For more information, please refer to 26 | -------------------------------------------------------------------------------- /MuConfig/muConfig.dev: -------------------------------------------------------------------------------- 1 | [Project] 2 | FileName=muConfig.dev 3 | Name=muConfig 4 | UnitCount=2 5 | Type=0 6 | Ver=1 7 | ObjFiles= 8 | Includes= 9 | Libs= 10 | PrivateResource=muConfig_private.rc 11 | ResourceIncludes= 12 | MakeIncludes= 13 | Compiler= 14 | CppCompiler= 15 | Linker= 16 | IsCpp=0 17 | Icon= 18 | ExeOutput= 19 | ObjectOutput= 20 | OverrideOutput=0 21 | OverrideOutputName=muConfig.exe 22 | HostApplication= 23 | Folders= 24 | CommandLine= 25 | UseCustomMakefile=0 26 | CustomMakefile= 27 | IncludeVersionInfo=0 28 | SupportXPThemes=0 29 | CompilerSet=0 30 | CompilerSettings=00000000000010000001g0 31 | 32 | [Unit1] 33 | FileName=muKonfig.c 34 | CompileCpp=0 35 | Folder= 36 | Compile=1 37 | Link=1 38 | Priority=1000 39 | OverrideBuildCmd=0 40 | BuildCmd= 41 | 42 | [VersionInfo] 43 | Major=0 44 | Minor=1 45 | Release=1 46 | Build=1 47 | LanguageID=1033 48 | CharsetID=1252 49 | CompanyName= 50 | FileVersion= 51 | FileDescription=Developed using the Dev-C++ IDE 52 | InternalName= 53 | LegalCopyright= 54 | LegalTrademarks= 55 | OriginalFilename= 56 | ProductName= 57 | ProductVersion= 58 | AutoIncBuildNr=0 59 | 60 | [Unit2] 61 | FileName=main.rc 62 | Folder=muConfig 63 | Compile=1 64 | Link=0 65 | Priority=1000 66 | OverrideBuildCmd=0 67 | BuildCmd= 68 | 69 | -------------------------------------------------------------------------------- /MuBmd/_defBMD/item074.php: -------------------------------------------------------------------------------- 1 | 55, 8 | 'groupSize' => 16, 9 | 'header' => 0, 10 | 'footer' => 0, 11 | 'translateField' => 'Name', 12 | 'fields' => [ 13 | ['Name', 'txt', 30], // 30 14 | ['Hands', 'int', 1], // 31 15 | ['Lvl', 'int', 1], // 32 16 | ['X', 'int', 1], // 33 17 | ['Y', 'int', 1], // 34 18 | ['DmgMin', 'int', 1], // 35 19 | ['DmgMax', 'int', 1], // 36 20 | ['DefRate', 'int', 1], // 37 21 | ['Def', 'int', 1], // 38 22 | ['unk10', 'int', 1], // 39 23 | ['att/swSpeed', 'int', 1], // 40 24 | ['walkSpeed', 'int', 1], // 41 25 | ['Dur', 'int', 1], // 42 26 | ['reqSTR', 'int', 1], // 43 27 | ['reqAGI', 'int', 1], // 44 28 | ['reqENE', 'int', 1], // 45 29 | ['reqLVL', 'int', 1], // 46 30 | ['Value', 'int', 1], // 47 31 | ['DW', 'int', 1], // 48 32 | ['DK', 'int', 1], // 49 33 | ['Elf', 'int', 1], // 50 34 | ['MG', 'int', 1], // 51 35 | ['resIce', 'int', 1], // 52 36 | ['resPoison', 'int', 1], // 53 37 | ['resLightning', 'int', 1], // 54 38 | ['resFire', 'int', 1], // 55 39 | ], 40 | ]; 41 | 42 | ?> -------------------------------------------------------------------------------- /MuConfig/lcc/Makefile: -------------------------------------------------------------------------------- 1 | # Wedit Makefile for project muKonfig 2 | SRCDIR=d:\prg\__c\muconfig 3 | CFLAGS=-I"D:\kompilatory\lcc\include" -O -p6 -unused 4 | CC=$(LCCROOT)\bin\lcc.exe 5 | LINKER=$(LCCROOT)\bin\lcclnk.exe 6 | OBJS=\ 7 | main.res \ 8 | mukonfig.obj 9 | 10 | LIBS= 11 | EXE=mukonfig.exe 12 | 13 | $(EXE): $(OBJS) Makefile 14 | $(LINKER) -s -subsystem windows -o $(SRCDIR)\lcc\mukonfig.exe $(OBJS) $(LIBS) 15 | 16 | # Build main.res 17 | MAIN_RC=\ 18 | 19 | main.res: $(MAIN_RC) $(SRCDIR)\main.rc 20 | $(LCCROOT)\bin\lrc.exe -I$(SRCDIR) -I"D:\kompilatory\lcc\include" $(SRCDIR)\main.rc 21 | 22 | # Build mukonfig.c 23 | MUKONFIG_C=\ 24 | D:\kompilatory\lcc\include\windows.h\ 25 | D:\kompilatory\lcc\include\stdlib.h\ 26 | D:\kompilatory\lcc\include\stddef.h\ 27 | D:\kompilatory\lcc\include\_syslist.h\ 28 | D:\kompilatory\lcc\include\safelib.h\ 29 | D:\kompilatory\lcc\include\string.h\ 30 | D:\kompilatory\lcc\include\safelib.h\ 31 | D:\kompilatory\lcc\include\win.h\ 32 | D:\kompilatory\lcc\include\limits.h\ 33 | D:\kompilatory\lcc\include\stdarg.h\ 34 | D:\kompilatory\lcc\include\ctype.h\ 35 | D:\kompilatory\lcc\include\basetsd.h\ 36 | 37 | mukonfig.obj: $(MUKONFIG_C) $(SRCDIR)\mukonfig.c 38 | $(CC) -c $(CFLAGS) $(SRCDIR)\mukonfig.c 39 | 40 | link: 41 | $(LINKER) -s -subsystem windows -o $(SRCDIR)\lcc\mukonfig.exe $(OBJS) $(LIBS) 42 | 43 | clean: 44 | del $(OBJS) mukonfig.exe 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MuOnline editors and misc apps 2 | 3 | This repo contains minor stuff I've written during my MuOnline private server dev years (around 2006 - 2014). Most of Pascal sources are written and commented in Polish. If your translator won't help you enough, just start an issue - I'll translate them if needed. Don't expect any further updates though. 4 | 5 | This repo consists of: 6 | 7 | - **MuTexConv** - my first ever app for MuOnline - CLI tool which converts OZJ, OZB and OZT to JPG, BMP and TGA respectively. Converting back to game files works too. 8 | - **MuMapConv** - converts between .map and .bmp. 9 | - **MuMapEdit** - my final project for programming class from 2007. Partially done 2D map viwer & editor. Doesn't support JPG, so you need to convert all textures to BMP. Written in FreePascal and WinAPI. 10 | - **wtf2txt** - Converts between WTF and TXT files. There are 2 versions of this app: one is written in Pascal, the newer one is in PHP. 11 | - **MuBmd** - my attempt at finally make somewhat complete text BMD editor for all client versions. Allows defining fields for each BMD version. 12 | - **MuClientAssemble** - allows assembling patch from any source version to any destination version, based on game's update server FTP dump. So if you've done one just like me you're in huge luck ;) 13 | - **MuThreeJs** - game map previewer - incomplete, but works as a Proof-of-concept. Mouse handling has rotten apparently. 14 | 15 | And some stuff, which might interest even non-coders: 16 | 17 | - **MuConfig** - smallest game client's resolution/audio/auto login settings app you'll ever find on the Internet. Written in C & WinAPI using DevC++. 18 | - **mulogo.svg** - a logo I traced for making icons and some minor gfx. 19 | 20 | ## Further development 21 | 22 | If you feel like contributing to those apps and/or maintaining them in some way, feel free to do so - the source code is yours if you can understand it. ;) Should you make some nice progress be sure to notify me - I'll link your repo in this readme. 23 | -------------------------------------------------------------------------------- /MuBmd/_defBMD/item100.php: -------------------------------------------------------------------------------- 1 | 76, 8 | 'groupSize' => 32, 9 | 'header' => 0, 10 | 'footer' => 4, 11 | 'translateField' => 'Name', 12 | 'fields' => [ 13 | ['Name', 'txt', 30], // 30 14 | ['Hands', 'int', 1], // 31 15 | ['Lvl', 'int', 1], // 32 16 | ['EqSlot', 'int', 1], // 33 17 | ['SkillID', 'int', 1], // 34 18 | ['X', 'int', 1], // 35 19 | ['Y', 'int', 1], // 36 20 | ['DmgMin', 'int', 1], // 37 21 | ['DmgMax', 'int', 1], // 38 22 | ['DefRate', 'int', 1], // 39 23 | ['Def', 'int', 1], // 40 24 | ['unk12', 'int', 1], // 41 25 | ['att/swSpeed', 'int', 1], // 42 26 | ['walkSpeed', 'int', 1], // 43 27 | ['Dur', 'int', 1], // 44 28 | ['unk16', 'int', 1], // 45 29 | ['unk17', 'int', 1], // 46 30 | ['reqSTR', 'int', 2], // 48 31 | ['reqAGI', 'int', 2], // 50 32 | ['reqENE', 'int', 2], // 52 33 | ['reqCMD', 'int', 2], // 54 34 | ['reqLVL', 'int', 1], // 55 35 | ['Value', 'int', 1], // 56 36 | ['unk28', 'int', 1], // 57 37 | ['unk29', 'int', 1], // 58 38 | ['unk30', 'int', 1], // 59 39 | ['unk31', 'int', 1], // 60 40 | ['ArmType', 'int', 1], // 61 41 | ['DW', 'int', 1], // 62 42 | ['DK', 'int', 1], // 63 43 | ['Elf', 'int', 1], // 64 44 | ['MG', 'int', 1], // 65 45 | ['DL', 'int', 1], // 66 46 | ['resIce', 'int', 1], // 67 47 | ['resPoison', 'int', 1], // 68 48 | ['resLightning', 'int', 1], // 69 49 | ['resFire', 'int', 1], // 70 50 | ['resEarth', 'int', 1], // 71 51 | ['resWind', 'int', 1], // 72 52 | ['resWater', 'int', 1], // 73 53 | ['unk45', 'int', 1], // 74 54 | ['unk46', 'int', 1], // 75 55 | ['unk47', 'int', 1], // 76 56 | ], 57 | ]; 58 | 59 | ?> -------------------------------------------------------------------------------- /wtf2txt/php/wtf2txt.php: -------------------------------------------------------------------------------- 1 | '; 18 | echo 'Version: 0x',dechex(ord(fRead($hIn, 1))), '
'; 19 | 20 | $caption = fRead($hIn, 22); 21 | $caption = str_replace("\0", '0', $caption); 22 | echo 'Caption: ',$caption,'
'; 23 | 24 | $stringCount = fReadUWord($hIn); 25 | echo 'Expected string count: ',$stringCount,'
'; 26 | 27 | $unk = fReadUWord($hIn); 28 | echo 'Unk1: ',dechex(ord($unk)),'
'; 29 | 30 | while($stringCount--) { 31 | $num = fReadUWord($hIn); 32 | $len = fReadUWord($hIn); 33 | echo '
Decoded string no ',$num,', length:',$len,'
'; 34 | if($len) { 35 | $bfr = fRead($hIn, $len); 36 | for($j = strLen($bfr); $j--;) { 37 | $bfr[$j] = chr(ord($bfr[$j]) ^ 0xCA); 38 | } 39 | $wtfStrings[$num] = $bfr; 40 | 41 | } else { 42 | $wtfStrings[$num] = ''; 43 | } 44 | } 45 | 46 | $tail = fRead($hIn, 4096); 47 | $tail = str_replace("\0", '0', $tail); 48 | echo 'Tail: ',$tail,'
'; 49 | var_dump($tail); 50 | 51 | fClose($hIn); 52 | ksort($wtfStrings); 53 | // var_dump($wtfStrings); 54 | // var_dump($wtfStrings[110]); 55 | 56 | // for($i = 0; $i != strLen($wtfStrings[110]); ++$i) { 57 | // echo ord($wtfStrings[110][$i]),' '; 58 | // } 59 | 60 | $hOut = fOpen(substr($fName, 0, -3).'txt', 'w'); 61 | forEach($wtfStrings as $idx => $txt) { 62 | fWrite($hOut, $idx."\t".$txt."\n"); 63 | } 64 | fClose($hOut); 65 | 66 | ?> -------------------------------------------------------------------------------- /wtf2txt/pascal/wtf2txt.pas: -------------------------------------------------------------------------------- 1 | program wtf2txt; 2 | 3 | uses crt; 4 | 5 | var 6 | wtf,txt: file of byte; {pliki deklarujemy jako skladajace sie z bajtow 7 | i o tyle czytamy} 8 | bufor: byte; //bufor do ktorego czytamy zawartosc pliku 9 | i,j,len,lenstr,numer: integer; {i,j to do forow, len to ilosc linii, 10 | lenstr to dlugosc linii, numer to jej numer} 11 | numerstr: string; {uzyte do konwersji numeru linii na lancuch ascii 12 | zeby to sobie zapisac w outpucie} 13 | 14 | BEGIN 15 | 16 | assign(wtf,'c:\plik.wtf'); //przypisujemy pliki do sciezek i je otwieramy 17 | reset(wtf); 18 | assign(txt,'c:\plik.txt'); 19 | rewrite(txt); 20 | 21 | seek(wtf,$18); //idziemy do offsetu w .wtf liczonego od 0, 0x18 22 | read(wtf,bufor); {czytamy sobie podwojna liczbe, liczba calkowita 23 | linii = len} 24 | len:= bufor; 25 | read(wtf,bufor); 26 | len:=len+bufor shl 8; {shl to przesuniecie wartosci w lewo o dana ilosc 27 | bitow, x shl 8 = x *FF, to jest po to by bylo 28 | parami od tylu czytane} 29 | 30 | seek(wtf,$1C); //idziemy do offsetu wlasciwego, 0x1c 31 | 32 | for j:=1 to len do //czytamy tyle razy ile jest linii 33 | begin 34 | read(wtf,bufor); //czytamy pierwsze 2 bajty jako numer linii 35 | numer:= bufor; 36 | read(wtf,bufor); 37 | numer:=numer+bufor shl 8; 38 | 39 | read(wtf,bufor); //czytamy nast. 2 bajty jako dl. linii = lenstr 40 | lenstr:= bufor; 41 | read(wtf,bufor); 42 | lenstr:=lenstr+bufor shl 8; 43 | str(numer,numerstr); //konwersja numeru z liczby int na string 44 | for i:=1 to byte(numerstr[0]) do write(txt,byte(numerstr[i])); 45 | {w stringu na pozycji 0 zawsze jest podany rozmiar, od 1 zaczyna sie 46 | str wlasciwy, for do pisania kolejnych cyfr numeru} 47 | 48 | write(txt,32); //po numerze spacja zeby oddzielic nr od linii 49 | 50 | for i:=1 to lenstr do {czytaj i zapisz kolejne bajty przez dlugosc 51 | linii = lenstr} 52 | begin 53 | read(wtf,bufor); 54 | write(txt,bufor xor $CA); //oczywiscie z odpowiednim xorem 55 | end; 56 | 57 | write(txt,13,10); // NL CR 58 | 59 | end; 60 | 61 | close(txt); //zamykamy pliki 62 | close(wtf); 63 | readkey; //czekamy na nacisniecie klawisza 64 | END. 65 | 66 | -------------------------------------------------------------------------------- /MuTexConv/mutexconv.pas: -------------------------------------------------------------------------------- 1 | program multikonwerter; 2 | 3 | {$RESOURCE kain.res} 4 | {bmp4, jpg24, tga4} 5 | 6 | var 7 | sciezka1, sciezka2: string; 8 | plik1, plik2: file of byte; 9 | i, j, bufor: byte; 10 | 11 | procedure encrypt(ilosc: byte;ext: string); {dodaje okreslona ilosc 12 | bajtow z przodu pliku} 13 | begin 14 | for j:=0 to 2 do sciezka2[i-j]:=ext[3-j]; {zmieniamy rozszerzenie 15 | w sciezce 2} 16 | assign(plik2,sciezka2); 17 | rewrite(plik2); 18 | 19 | for i:=1 to ilosc do 20 | begin 21 | read(plik1,bufor); 22 | write(plik2,bufor); {przepisujemy okreslona w parametrze ilosc bajtow 23 | z poczatku pliku} 24 | end; 25 | 26 | reset(plik1); {i czytamy plik od nowa zeby napisac je jeszcze raz} 27 | 28 | repeat 29 | read(plik1,bufor); {i teraz dalej czytamy} 30 | write(plik2,bufor); {i zapisujemy} 31 | until eof(plik1); {az do konca pliku} 32 | end; 33 | 34 | procedure decrypt(ilosc: byte;ext: string); {omija okreslona ilosc 35 | bajtow z przodu pliku} 36 | begin 37 | for j:=0 to 2 do sciezka2[i-j]:=ext[3-j]; {zmieniamy rozszerzenie 38 | w sciezce 2} 39 | assign(plik2,sciezka2); 40 | rewrite(plik2); 41 | seek(plik1,ilosc); {omija pierwsze bajty ktore sa powtorzone} 42 | repeat 43 | read(plik1,bufor); {reszte czytamy} 44 | write(plik2,bufor); {i zapisujemy} 45 | until eof(plik1); {poki nie dojdziemy do konca pliku} 46 | end; 47 | 48 | BEGIN 49 | 50 | if paramstr(1) = '' then 51 | begin 52 | writeln('Sciezka pliku do konwersji (ozb, ozj, ozt, bmp, jpg, tga): '); 53 | readln(sciezka1); 54 | end 55 | else sciezka1:=paramstr(1); 56 | 57 | assign(plik1,sciezka1); 58 | {$I-}reset(plik1);{$I+} 59 | if (IOResult <> 0) or (sciezka1 = '') then 60 | begin 61 | writeln('Nieprawidlowa sciezka'); 62 | halt; 63 | end; 64 | 65 | sciezka2:=sciezka1; {sciezka drugiego pliku jest taka sama} 66 | i:= length(sciezka2); {liczymy dlugosc sciezki do sprawdzenia rozszerzenia} 67 | 68 | case upcase(sciezka1[i]) of 69 | 'P': encrypt(4,'ozb'); {jak rozszerzenie to bmP to robimy bmp->ozb} 70 | 'B': decrypt(4,'bmp'); {jaka ozB to ozb->bmp} 71 | 'J': decrypt(24,'jpg'); {jak ozJ to ozj->jpg} 72 | 'G': encrypt(24,'ozj'); {jak jpG to jpg->ozj} 73 | 'T': decrypt(4,'tga'); {jak ozT to ozt->tga} 74 | 'A': encrypt(4,'ozt'); {jak tgA to tga->ozt} 75 | end; 76 | 77 | writeln('Zrobione'); 78 | close(plik1); {zamykamy odczyt plikow} 79 | close(plik2); 80 | END. 81 | 82 | -------------------------------------------------------------------------------- /MuBmd/0.74_fixed/Skill.txt: -------------------------------------------------------------------------------- 1 | // ------------------ 2 | // BMD exported by 3 | // KaiN client toolz 4 | // ------------------ 5 | 6 | // Idx Name Lvl Dmg Mana Range 7 | 0 0 0 0 0 8 | 1 Poison 30 12 42 6 9 | 2 Meteorite 21 21 12 6 10 | 3 Lightning 13 17 15 6 11 | 4 Fire Ball 5 8 3 6 12 | 5 Flame 35 25 50 6 13 | 6 Teleport 17 0 30 6 14 | 7 Ice 25 10 38 6 15 | 8 Twister 40 35 60 6 16 | 9 Evil Spirits 50 45 90 6 17 | 10 Hell Fire 60 120 160 0 18 | 11 Power Wave 9 14 5 6 19 | 12 Aqua Beam 74 80 140 6 20 | 13 0 0 0 0 21 | 14 0 0 0 0 22 | 15 0 0 0 0 23 | 16 0 0 0 0 24 | 17 Energy Ball 2 3 1 6 25 | 18 Defend 0 0 30 0 26 | 19 Falling Slash 0 0 10 3 27 | 20 Lunge 0 0 9 2 28 | 21 Uppercut 0 0 8 2 29 | 22 Cyclone Slash 0 0 9 2 30 | 23 Slash 0 0 12 2 31 | 24 Triple Shot 0 0 5 6 32 | 25 Piercing Arrow 0 0 5 6 33 | 26 Heal 8 0 20 6 34 | 27 Greater Defense 13 0 30 6 35 | 28 Greater Damage 18 0 40 6 36 | 29 0 0 0 0 37 | 30 Summon Goblin 0 0 40 0 38 | 31 Summom Stone Golem 0 0 70 0 39 | 32 Summon Assassin 0 0 110 0 40 | 33 Summon Elder Yeti 0 0 160 0 41 | 34 Summon Dark Knight 0 0 200 0 42 | 35 Summon Bali 0 0 250 0 43 | 36 0 0 0 0 44 | 37 0 0 0 0 45 | 38 0 0 0 0 46 | 39 0 0 0 0 47 | 40 0 0 0 0 48 | 41 0 0 0 0 49 | 42 0 0 0 0 50 | 43 0 0 0 0 51 | 44 0 0 0 0 52 | 45 0 0 0 0 53 | 46 0 0 0 0 54 | 47 0 0 0 0 55 | 48 0 0 0 0 56 | 49 0 0 0 0 57 | 50 Flame of Evil 60 120 160 0 58 | 51 0 0 0 0 59 | 52 0 0 0 0 60 | 53 0 0 0 0 61 | 54 0 0 0 0 62 | 55 0 0 0 0 63 | 56 0 0 0 0 64 | 57 0 0 0 0 65 | 58 0 0 0 0 66 | 59 0 0 0 0 67 | 60 0 0 0 0 68 | 61 0 0 0 0 69 | 62 0 0 0 0 70 | 63 0 0 0 0 71 | end 72 | 73 | -------------------------------------------------------------------------------- /MuBmd/0.78_fixed/Skill.txt: -------------------------------------------------------------------------------- 1 | // ------------------ 2 | // BMD exported by 3 | // KaiN client toolz 4 | // ------------------ 5 | 6 | // Idx Name Lvl Dmg Mana Range 7 | 0 0 0 0 0 8 | 1 Poison 30 12 42 6 9 | 2 Meteorite 21 21 12 6 10 | 3 Lightning 13 17 15 6 11 | 4 Fire Ball 5 8 3 6 12 | 5 Flame 35 25 50 6 13 | 6 Teleport 17 0 30 6 14 | 7 Ice 25 10 38 6 15 | 8 Twister 40 35 60 6 16 | 9 Evil Spirits 50 45 90 6 17 | 10 Hell Fire 60 120 160 0 18 | 11 Power Wave 9 14 5 6 19 | 12 Aqua Beam 74 80 140 6 20 | 13 0 0 0 0 21 | 14 0 0 0 0 22 | 15 0 0 0 0 23 | 16 0 0 0 0 24 | 17 Energy Ball 2 3 1 6 25 | 18 Defend 0 0 30 0 26 | 19 Falling Slash 0 0 10 3 27 | 20 Lunge 0 0 9 2 28 | 21 Uppercut 0 0 8 2 29 | 22 Cyclone Slash 0 0 9 2 30 | 23 Slash 0 0 12 2 31 | 24 Triple Shot 0 0 5 6 32 | 25 Piercing Arrow 0 0 5 6 33 | 26 Heal 8 0 20 6 34 | 27 Greater Defense 13 0 30 6 35 | 28 Greater Damage 18 0 40 6 36 | 29 0 0 0 0 37 | 30 Summon Goblin 0 0 40 0 38 | 31 Summom Stone Golem 0 0 70 0 39 | 32 Summon Assassin 0 0 110 0 40 | 33 Summon Elder Yeti 0 0 160 0 41 | 34 Summon Dark Knight 0 0 200 0 42 | 35 Summon Bali 0 0 250 0 43 | 36 0 0 0 0 44 | 37 0 0 0 0 45 | 38 0 0 0 0 46 | 39 0 0 0 0 47 | 40 0 0 0 0 48 | 41 Twisting Slash 0 0 10 2 49 | 42 0 0 0 0 50 | 43 0 0 0 0 51 | 44 0 0 0 0 52 | 45 0 0 0 0 53 | 46 0 0 0 0 54 | 47 0 0 0 0 55 | 48 0 0 0 0 56 | 49 0 0 0 0 57 | 50 Flame of Evil 60 120 160 0 58 | 51 0 0 0 0 59 | 52 0 0 0 0 60 | 53 0 0 0 0 61 | 54 0 0 0 0 62 | 55 0 0 0 0 63 | 56 0 0 0 0 64 | 57 0 0 0 0 65 | 58 0 0 0 0 66 | 59 0 0 0 0 67 | 60 0 0 0 0 68 | 61 0 0 0 0 69 | 62 0 0 0 0 70 | 63 0 0 0 0 71 | end 72 | 73 | -------------------------------------------------------------------------------- /MuThreeJs/input.js: -------------------------------------------------------------------------------- 1 | var keyboard = { 2 | init: function(e) { 3 | e.onkeydown = keyboard.keydown; 4 | e.onkeyup = keyboard.keyup; 5 | 6 | setInterval(keyboard.process, 10); 7 | }, 8 | 9 | process: function() { 10 | var sin = Math.sin(g_camera.rotation.y); 11 | var cos = Math.cos(g_camera.rotation.y); 12 | if(keyboard.keys.w) { 13 | g_camera.position.x -= 0.1 * sin; 14 | g_camera.position.z -= 0.1 * cos; 15 | // TODO: fly - y 16 | } 17 | if(keyboard.keys.s) { 18 | g_camera.position.x += 0.1 * sin; 19 | g_camera.position.z += 0.1 * cos; 20 | } 21 | if(keyboard.keys.a) { 22 | g_camera.position.x -= 0.1 * cos; 23 | g_camera.position.z += 0.1 * sin; 24 | } 25 | if(keyboard.keys.d) { 26 | g_camera.position.x += 0.1 * cos; 27 | g_camera.position.z -= 0.1 * sin; 28 | } 29 | if(keyboard.keys.space) 30 | g_camera.position.y += 0.1; 31 | if(keyboard.keys.ctrl) 32 | g_camera.position.y -= 0.1; 33 | }, 34 | 35 | keydown: function(e) { 36 | var pressed = 1; 37 | switch(e.keyCode) { 38 | case 17: 39 | keyboard.keys.ctrl = 1; 40 | break; 41 | case 32: 42 | keyboard.keys.space = 1; 43 | break; 44 | case 65: 45 | keyboard.keys.a = 1; 46 | break; 47 | case 68: 48 | keyboard.keys.d = 1; 49 | break; 50 | case 83: 51 | keyboard.keys.s = 1; 52 | break; 53 | case 87: 54 | keyboard.keys.w = 1; 55 | break; 56 | default: 57 | pressed = 0; 58 | // $('keyCode').innerHTML = e.keyCode; 59 | } 60 | if(pressed) 61 | return false; 62 | }, 63 | 64 | keyup: function(e) { 65 | var pressed = 1; 66 | switch(e.keyCode) { 67 | case 17: 68 | keyboard.keys.ctrl = 0; 69 | break; 70 | case 32: 71 | keyboard.keys.space = 0; 72 | break; 73 | case 65: 74 | keyboard.keys.a = 0; 75 | break; 76 | case 68: 77 | keyboard.keys.d = 0; 78 | break; 79 | case 83: 80 | keyboard.keys.s = 0; 81 | break; 82 | case 87: 83 | keyboard.keys.w = 0; 84 | break; 85 | default: 86 | pressed = 0; 87 | // $('keyCode').innerHTML = e.keyCode; 88 | } 89 | if(pressed) 90 | return false; 91 | }, 92 | 93 | keys: {} 94 | }; 95 | 96 | var mouse = { 97 | element: null, 98 | 99 | init: function(e) { 100 | if(document.pointerLockElement || document.mozPointerLockElement) 101 | return; 102 | mouse.element = e; 103 | e.requestPointerLock = e.requestPointerLock || e.mozRequestPointerLock; 104 | document = document.onpointerlockerror = document.onmozpointerlockerror = mouse.hookRetry; 105 | e.onmousemove = mouse.process; 106 | e.requestPointerLock(); 107 | }, 108 | 109 | hookRetry: function() { 110 | console.log('err ' + document.mozPointerLockElement); 111 | // mouse.element.requestPointerLock(); 112 | }, 113 | 114 | process: function(evt) { 115 | var dx = evt.movementY || evt.mozMovementY; 116 | var dy = evt.movementX || evt.mozMovementX; 117 | 118 | var dAngX = Math.PI/2*(dx/mouse.element.height); 119 | var dAngY = Math.PI/2*(dy/mouse.element.width); 120 | 121 | // g_camera.rotation.x += 0.0.1; 122 | // g_camera.rotation.y = (g_camera.rotation.y + dAngY) % (Math.PI*2); 123 | // console.log(mouse.element.height); 124 | g_camera.rotation.order = "YXZ"; 125 | g_camera.rotation.y -= dAngY; 126 | g_camera.rotation.x -= dAngX; 127 | // $('dx').innerHTML = g_camera.rot.x; 128 | // $('dy').innerHTML = g_camera.rot.y; 129 | } 130 | } -------------------------------------------------------------------------------- /MuBmd/0.74_fixed/NpcName(kor).txt: -------------------------------------------------------------------------------- 1 | // Idx Show Name 2 | 0 1 "Bull Fighter" 3 | 1 1 "Hell Hound" 4 | 2 1 "Budge Dragon" 5 | 3 1 "Spider" 6 | 4 1 "Elite Bull Fighter" 7 | 5 1 "Hell Hound" 8 | 6 1 "Lich" 9 | 7 1 "Giant" 10 | 8 1 "Poison Bull Fighter" 11 | 9 1 "Thunder Lich" 12 | 10 1 "Dark Knight" 13 | 11 1 "Ghost" 14 | 12 1 "Larva" 15 | 13 1 "Hell Spider" 16 | 14 1 "Skeleton" 17 | 15 1 "Skeleton Archer" 18 | 16 1 "Elite skeleton" 19 | 17 1 "Cyclops" 20 | 18 1 "Gorgon" 21 | 19 1 "Yeti" 22 | 20 1 "Elite Yeti" 23 | 21 1 "Assassin" 24 | 22 1 "Ice Monster" 25 | 23 1 "Hommerd" 26 | 24 1 "Worm" 27 | 25 1 "Ice Queen" 28 | 26 1 "Goblin" 29 | 27 1 "Chain Scorpion" 30 | 28 1 "Beetle Monster" 31 | 29 1 "Hunter" 32 | 30 1 "Forest Monster" 33 | 31 1 "Agon" 34 | 32 1 "Stone Golem" 35 | 33 1 "Elite Goblin" 36 | 34 1 "Cursed Wizard" 37 | 35 1 "Death Gorgon" 38 | 36 1 "Shadow" 39 | 37 1 "Devil" 40 | 38 1 "Balrog" 41 | 39 1 "Poison Shadow" 42 | 40 1 "Death Knight" 43 | 41 1 "Death Cow" 44 | 43 1 "Golden Budge Dragon" 45 | 44 1 "Dragon" 46 | 45 1 "Bahamut" 47 | 46 1 "Vepar" 48 | 47 1 "Valkyrie" 49 | 48 1 "Lizard King" 50 | 49 1 "Hydra" 51 | 50 1 "Sea Worm" 52 | 51 1 "Great Bahamut" 53 | 52 1 "Silver Valkyrie" 54 | 53 1 "Golden Titan" 55 | 54 1 "Golden Soldier" 56 | 55 1 "Death King" 57 | 56 1 "Death Bone" 58 | 100 1 "Lance" 59 | 101 1 "Iron Stick" 60 | 102 1 "Fire" 61 | 103 1 "meteorite" 62 | 150 1 "Bali" 63 | 200 1 "" 64 | 238 1 "Chaos Goblin" 65 | 239 1 "Arena Guard" 66 | 240 1 "Baz the Vault Keeper" 67 | 241 1 "Guild Master" 68 | 242 1 "Elf Lala" 69 | 243 1 "Eo the Craftsman" 70 | 244 1 "Lumen the Barmaid" 71 | 245 1 "Wizard" 72 | 246 1 "Zienna the Weapon Merchant" 73 | 247 1 "Guard" 74 | 248 1 "Wandering Merchant" 75 | 249 1 "Guard" 76 | 250 1 "Wandering Merchant" 77 | 251 1 "Hanzo the Blacksmith" 78 | 252 1 "" 79 | 253 1 "Potion Girl" 80 | 254 1 "Pasi the Mage" 81 | 255 1 "Lumen the Barmaid" 82 | -------------------------------------------------------------------------------- /MuThreeJs/main.js: -------------------------------------------------------------------------------- 1 | var g_scene, g_camera, g_renderer; 2 | 3 | var g_plane; 4 | 5 | function renderLoop() { 6 | requestAnimationFrame( renderLoop ); 7 | g_renderer.render(g_scene, g_camera); 8 | 9 | // g_plane.rotation.y += 0.01; 10 | } 11 | 12 | window.onload = function() { 13 | $ = document.getElementById; 14 | g_scene = new THREE.Scene(); 15 | g_camera = new THREE.PerspectiveCamera( 16 | 75, // fov 17 | window.innerWidth / window.innerHeight, // ratio 18 | 0.1, 1000 // zmin, zmax 19 | ); 20 | g_renderer = new THREE.WebGLRenderer(); 21 | g_renderer.setSize(window.innerWidth, window.innerHeight); 22 | 23 | document.body.appendChild(g_renderer.domElement); 24 | 25 | // geometry 26 | geometry = new THREE.PlaneGeometry(100, 100, 256, 256); 27 | for(y = 0; y != 256; ++y) { 28 | for(x = 0; x != 256; ++x) { 29 | geometry.vertices[257*y+x].z = g_height[y][x]/255 * 5; 30 | geometry.faces[(256*y+x)*2].materialIndex = g_textures[255-y][x]; 31 | geometry.faces[(256*y+x)*2+1].materialIndex = g_textures[255-y][x]; 32 | } 33 | } 34 | 35 | // materials 36 | var materials = []; 37 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileGrass01.jpg')})); 38 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileGrass02.jpg')})); 39 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileGround01.jpg')})); 40 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileGround02.jpg')})); 41 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileGround03.jpg')})); 42 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileWater01.jpg')})); 43 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileWood01.jpg')})); 44 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileRock01.jpg')})); 45 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileRock02.jpg')})); 46 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileRock03.jpg')})); 47 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileRock04.jpg')})); 48 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileRock05.jpg')})); 49 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileRock06.jpg')})); 50 | materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('world0/TileRock07.jpg')})); 51 | 52 | // Add materialIndex to face 53 | var l = geometry.faces.length/2; 54 | var bok = Math.sqrt(geometry.faces.length/2); 55 | for (var i = 0; i < l; i++) { 56 | j = i*2; 57 | // geometry.faces[j].materialIndex = 0; 58 | // geometry.faces[j+1].materialIndex = 0; 59 | 60 | geometry.faceVertexUvs[0][j][0] = new THREE.Vector2(0.0, 1.0); 61 | geometry.faceVertexUvs[0][j][1] = new THREE.Vector2(0.0, 0.0) 62 | geometry.faceVertexUvs[0][j][2] = new THREE.Vector2(1.0, 1.0) 63 | 64 | geometry.faceVertexUvs[0][j+1][0] = new THREE.Vector2(0.0, 0.0) 65 | geometry.faceVertexUvs[0][j+1][1] = new THREE.Vector2(1.0, 0.0) 66 | geometry.faceVertexUvs[0][j+1][2] = new THREE.Vector2(1.0, 1.0) 67 | } 68 | 69 | // plane mesh 70 | g_plane = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial(materials)); 71 | g_plane.rotation.x = -Math.PI/2; 72 | g_plane.position.y = -10; 73 | // g_plane.rotation.y = Math.PI/8; 74 | g_scene.add(g_plane); 75 | 76 | document.body.onclick = function() {mouse.init(document.getElementsByTagName('canvas')[0]);}; 77 | keyboard.init(window); 78 | renderLoop(); 79 | } -------------------------------------------------------------------------------- /MuConfig/muKonfig.c: -------------------------------------------------------------------------------- 1 | #include 2 | #define quit 801 3 | #define save 802 4 | #define windowMode 803 5 | #define music 804 6 | #define sound 805 7 | #define resolution 806 8 | #define ikona 888 9 | 10 | HWND hMain,hQuit,hSave,hWindowMode,hMusic,hSound,hRes,hId,hIdD; 11 | DWORD vWndMode = 0, vMusic = 0, vSound = 0, vRes = 0; 12 | LPSTR vId; 13 | HKEY hk; 14 | 15 | void chgState(WPARAM *btn,DWORD *state) 16 | { 17 | CheckDlgButton(hMain,*btn,(*state == 0?BST_CHECKED:BST_UNCHECKED)); 18 | *state = ! *state; 19 | } 20 | void initCb(LPSTR opt,DWORD *v,int btn) 21 | { 22 | DWORD sBuf1 = sizeof(DWORD); 23 | DWORD tBuf1 = REG_DWORD; 24 | RegQueryValueEx(hk,opt,NULL,&tBuf1,(LPBYTE)v,&sBuf1); 25 | if(btn != 0) 26 | CheckDlgButton(hMain,btn,(*v == 0?BST_UNCHECKED:BST_CHECKED)); 27 | } 28 | 29 | LRESULT CALLBACK wpMain(HWND hWnd,UINT msg, WPARAM wPar, LPARAM lPar) 30 | { 31 | switch(msg) 32 | { 33 | case WM_CREATE: 34 | break; 35 | case WM_DESTROY: 36 | PostQuitMessage(0); 37 | break; 38 | case WM_CLOSE: 39 | DestroyWindow(hWnd); 40 | break; 41 | case WM_COMMAND: 42 | switch(LOWORD(wPar)) 43 | { 44 | case quit: 45 | DestroyWindow(hWnd); 46 | break; 47 | case save: 48 | vRes = SendMessage(hRes,LB_GETCURSEL,0,0); 49 | RegSetValueEx(hk,"Resolution",0,REG_DWORD,(LPBYTE)&vRes,sizeof(DWORD)); 50 | RegSetValueEx(hk,"WindowMode",0,REG_DWORD,(LPBYTE)&vWndMode,sizeof(DWORD)); 51 | RegSetValueEx(hk,"MusicOnOff",0,REG_DWORD,(LPBYTE)&vMusic,sizeof(DWORD)); 52 | RegSetValueEx(hk,"SoundOnOff",0,REG_DWORD,(LPBYTE)&vSound,sizeof(DWORD)); 53 | GetWindowText(hId,vId,10); 54 | RegSetValueEx(hk,"ID",0,REG_SZ,vId,10); 55 | break; 56 | case windowMode: 57 | chgState(&wPar,&vWndMode); 58 | break; 59 | case music: 60 | chgState(&wPar,&vMusic); 61 | break; 62 | case sound: 63 | chgState(&wPar,&vSound); 64 | break; 65 | } 66 | break; 67 | default: 68 | return DefWindowProc(hWnd,msg,wPar,lPar); 69 | } 70 | } 71 | 72 | int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpPar, int cmdShow) 73 | { 74 | WNDCLASSEX wcMain; 75 | wcMain.cbSize = sizeof(WNDCLASSEX); 76 | wcMain.style = 0; 77 | wcMain.lpfnWndProc = wpMain; 78 | wcMain.cbClsExtra = 0; 79 | wcMain.cbWndExtra = 0; 80 | wcMain.hInstance = hInstance; 81 | wcMain.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(ikona)); 82 | wcMain.hCursor = LoadCursor(NULL,IDC_ARROW); 83 | wcMain.hbrBackground = (HBRUSH)COLOR_WINDOW; 84 | wcMain.lpszMenuName = NULL; 85 | wcMain.lpszClassName = "muKonfig"; 86 | wcMain.hIconSm = LoadIcon(hInstance,MAKEINTRESOURCE(ikona)); 87 | 88 | RegisterClassEx(&wcMain); 89 | 90 | hMain = CreateWindowEx(WS_EX_WINDOWEDGE,"muKonfig", 91 | "muConfig 0.1 for DarkMuBat",WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_THICKFRAME ^ WS_MINIMIZEBOX, 92 | CW_USEDEFAULT,CW_USEDEFAULT, 93 | 300,120, 94 | 0,NULL, 95 | hInstance,NULL); 96 | hQuit = CreateWindowEx(0,"BUTTON", 97 | "quit",WS_CHILD | WS_VISIBLE, 98 | 200,60, 99 | 65,25, 100 | hMain,(HMENU)quit, 101 | hInstance,NULL); 102 | hSave = CreateWindowEx(0,"BUTTON", 103 | "save",WS_CHILD | WS_VISIBLE, 104 | 120,60, 105 | 65,25, 106 | hMain,(HMENU)save, 107 | hInstance,NULL); 108 | hWindowMode = CreateWindowEx(0,"BUTTON", 109 | "windowed",WS_CHILD|WS_VISIBLE|BS_CHECKBOX, 110 | 5,5, 111 | 85,16, 112 | hMain,(HMENU)windowMode, 113 | hInstance,NULL); 114 | hMusic = CreateWindowEx(0,"BUTTON", 115 | "music",WS_CHILD|WS_VISIBLE|BS_CHECKBOX, 116 | 100,5, 117 | 60,16, 118 | hMain,(HMENU)music, 119 | hInstance,NULL); 120 | hSound = CreateWindowEx(0,"BUTTON", 121 | "sound",WS_CHILD|WS_VISIBLE|BS_CHECKBOX, 122 | 165,5, 123 | 60,16, 124 | hMain,(HMENU)sound, 125 | hInstance,NULL); 126 | hRes = CreateWindowEx(WS_EX_CLIENTEDGE,"LISTBOX", 127 | "resolution",WS_CHILD|WS_VISIBLE|LBS_NOTIFY, 128 | 5,25, 129 | 100,80, 130 | hMain,(HMENU)resolution, 131 | hInstance,NULL); 132 | hId = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT", 133 | NULL,WS_CHILD|WS_VISIBLE, 134 | 190,25, 135 | 100,24, 136 | hMain,(HMENU)0, 137 | hInstance,NULL); 138 | hIdD = CreateWindowEx(0,"STATIC", 139 | "Auto Login:",WS_CHILD|WS_VISIBLE, 140 | 110,30, 141 | 80,24, 142 | hMain,0, 143 | hInstance,NULL); 144 | LPSTR tRes[4] = {"640x480","800x600","1024x768","1280x1024"}; 145 | BYTE i; 146 | for(i = 0; i != 4; ++i) 147 | SendMessage(hRes,LB_ADDSTRING,0,(LPARAM)tRes[i]); 148 | 149 | RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Webzen\\Mu\\Config", 150 | 0,NULL, 151 | REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, 152 | NULL,&hk,NULL); 153 | 154 | initCb("WindowMode",&vWndMode,windowMode); 155 | initCb("MusicOnOff",&vMusic,music); 156 | initCb("SoundOnOff",&vSound,sound); 157 | initCb("Resolution",&vRes,0); 158 | DWORD sBuf1 = 10; 159 | DWORD tBuf1 = REG_SZ; 160 | vId = malloc(11); 161 | if(RegQueryValueEx(hk,"ID",NULL,&tBuf1,(LPBYTE)vId,&sBuf1) == ERROR_SUCCESS) 162 | SetWindowText(hId,vId); 163 | 164 | SendMessage(hRes,LB_SETCURSEL,vRes,0); 165 | 166 | ShowWindow(hMain,SW_SHOW); 167 | UpdateWindow(hMain); 168 | MSG msg; 169 | while(GetMessage(&msg,NULL,0,0)) 170 | { 171 | TranslateMessage(&msg); 172 | DispatchMessage(&msg); 173 | } 174 | return msg.wParam; 175 | } 176 | -------------------------------------------------------------------------------- /mulogo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 20 | 22 | 40 | 42 | 43 | 45 | image/svg+xml 46 | 48 | 49 | 50 | 51 | 55 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /MuBmd/index.php: -------------------------------------------------------------------------------- 1 | '; 42 | return null; 43 | } 44 | $blockCount = $size/$def['blockSize']; 45 | // Read blocks 46 | $xor = [0xFC, 0xCF, 0xAB]; 47 | $out['blocks'] = []; 48 | for($j = 0; $j != $blockCount; ++$j) { 49 | $block = fRead($hIn, $def['blockSize']); 50 | // deXOR 51 | for($i = 0; $i != $def['blockSize']; ++$i) { 52 | $block[$i] = chr(ord($block[$i]) ^ $xor[$i%sizeOf($xor)]); 53 | } 54 | // Slice to fields 55 | $fieldOffset = 0; 56 | $blockOut = []; 57 | forEach($def['fields'] as $field) { 58 | $fieldVal = subStr($block, $fieldOffset, $field[2]); 59 | $fieldOffset += $field[2]; 60 | if($field[1] == 'int' ) { 61 | if($field[2] == 1) { 62 | $fieldVal = ord($fieldVal); 63 | } 64 | elseif($field[2] == 2) { 65 | $fieldVal = (ord($fieldVal[1])<<8)+ord($fieldVal[0]); 66 | } 67 | } 68 | else if($field[1] == 'txt') { 69 | $fieldVal = substr($fieldVal, 0, strPos($fieldVal, "\0")); 70 | } 71 | $blockOut[] = $fieldVal; 72 | } 73 | if($def['groupSize']) { 74 | @$out['blocks'][floor($j/$def['groupSize'])][$j%$def['groupSize']] = $blockOut; 75 | } else { 76 | $out['blocks'][] = $blockOut; 77 | } 78 | } 79 | // Footer 80 | if($def['footer']) { 81 | $bmdContent['footer'] = fRead($hIn, $def['footer']); 82 | } 83 | fClose($hIn); 84 | return $out; 85 | } 86 | 87 | function writeTXTgroup($h, &$def, $items) { 88 | // Prepare group header and fmt 89 | $header = '// Idx'; 90 | $fmt = '%6u'; 91 | forEach($def['fields'] as $fieldIdx => $field) { 92 | $colWidth = strLen($field[0]); 93 | // var_dump($colWidth); 94 | forEach($items as $item) { 95 | $colWidth = max($colWidth, strLen($item[$fieldIdx].'')); 96 | } 97 | $fmt .= ' %'.$colWidth; 98 | if($field[1] == 'txt') 99 | $fmt .= 's'; 100 | elseif($field[1] == 'int') 101 | $fmt .= 'd'; 102 | $header .= sprintf(' %'.$colWidth.'s', $field[0]); 103 | } 104 | $header .= EOL; 105 | $fmt .= EOL; 106 | // Write group 107 | fWrite($h, $header); 108 | forEach($items as $itemIdx => $item) { 109 | $ln = vsprintf($fmt, array_merge([$itemIdx], $item)); 110 | fWrite($h, $ln); 111 | } 112 | fWrite($h, 'end'.EOL.EOL); 113 | } 114 | 115 | function writeTXT($fName, &$def, $in) { 116 | $hOut = fOpen($fName.'.txt', 'wb'); 117 | fWrite($hOut, '// ------------------'.EOL.'// BMD exported by'.EOL.'// KaiN client toolz'.EOL.'// ------------------'.EOL.EOL); 118 | // Footer 119 | if($def['header']) { 120 | // ... 121 | } 122 | // Write blocks 123 | if($def['groupSize']) { 124 | forEach($in['blocks'] as $groupIdx => $group) { 125 | fWrite($hOut, $groupIdx.EOL); 126 | writeTXTgroup($hOut, $def, $group); 127 | } 128 | } 129 | else { 130 | writeTXTgroup($hOut, $def, $in['blocks']); 131 | } 132 | // Footer 133 | if($def['footer']) { 134 | // ... 135 | } 136 | fClose($hOut); 137 | } 138 | 139 | function writeBMDgroup($h, &$def, $items) { 140 | $xor = [0xFC, 0xCF, 0xAB]; 141 | forEach($items as $item) { 142 | $block = ''; 143 | // merge fields 144 | forEach($def['fields'] as $fieldIdx => $field) { 145 | if($field[1] == 'txt') 146 | $block .= str_pad($item[$fieldIdx], $field[2], "\0"); 147 | elseif($field[1] == 'int') { 148 | if($field[2] == 1) 149 | $block .= chr($item[$fieldIdx]); 150 | elseif($field[2] == 2) 151 | $block .= chr($item[$fieldIdx] & 0xFF) . chr($item[$fieldIdx] >> 8); 152 | } 153 | } 154 | $d = strLen($block); 155 | if($d != $def['blockSize']) { 156 | echo 'Wrong block size!'; 157 | return 0; 158 | } 159 | // XOR 160 | for($i = 0; $i != $d; ++$i) 161 | $block[$i] = chr(ord($block[$i]) ^ $xor[$i % sizeOf($xor)]); 162 | // write 163 | fWrite($h, $block); 164 | } 165 | } 166 | 167 | function writeBMD($fName, &$def, $in) { 168 | $hOut = fOpen($fName.'.bmd', 'wb'); 169 | // Header 170 | if($def['header']) { 171 | // ... 172 | } 173 | // Write groups 174 | if($def['groupSize']) { 175 | forEach($in['blocks'] as $group) 176 | writeBMDgroup($hOut, $def, $group); 177 | } 178 | else 179 | writeBMDgroup($hOut, $def, $in['blocks']); 180 | // Footer 181 | if($def['footer']) { 182 | // ... 183 | } 184 | fClose($hOut); 185 | } 186 | 187 | function translateBMD(&$destDef, &$src, &$dest) { 188 | forEach($destDef['fields'] as $fieldIdx => $field) 189 | if($field[0] == $destDef['translateField']) { 190 | $tIdx = $fieldIdx; 191 | break; 192 | } 193 | if($destDef['groupSize']) { 194 | forEach($dest['blocks'] as $groupIdx => $group) 195 | forEach($group as $itemIdx => $item) { 196 | $destName = &$dest['blocks'][$groupIdx][$itemIdx][$tIdx]; 197 | $srcName = &$src['blocks'][$groupIdx][$itemIdx][$tIdx]; 198 | if(strLen($srcName) && strLen($destName)) 199 | $destName = $srcName; 200 | } 201 | } 202 | else { 203 | forEach($dest['blocks'] as $itemIdx => $item) { 204 | $destName = &$dest['blocks'][$itemIdx][$tIdx]; 205 | $srcName = &$src['blocks'][$itemIdx][$tIdx]; 206 | if(strLen($srcName) && strLen($destName)) 207 | $destName = $srcName; 208 | } 209 | } 210 | } 211 | 212 | // ------ NPCNAME ------ 213 | 214 | function readNpcNameTXT($fName) { 215 | $names = []; 216 | $lines = file($fName.'.txt'); 217 | forEach($lines as &$line) { 218 | $line = trim($line); 219 | $line = str_replace("\t", ' ', $line); 220 | $line = str_replace(' ', '', $line); 221 | $qStart = strPos($line, '"'); 222 | if($qStart !== false) { 223 | $no = subStr($line, 0, strPos($line, ' ')); 224 | $name = subStr($line, $qStart+1, strPos($line, '"', $qStart+1)-($qStart+1)); 225 | $names[$no] = $name; 226 | } 227 | } 228 | ksort($names); 229 | return $names; 230 | } 231 | 232 | function translateNpcName(&$srcNames, &$destNames) { 233 | forEach($destNames as $idx => &$name) { 234 | if(@strLen($srcNames[$idx]) && @strLen($name)) { 235 | $name = $srcNames[$idx]; 236 | } 237 | } 238 | } 239 | 240 | function writeNpcNameTXT($fName, $names) { 241 | $hOut = fOpen($fName.'.txt', 'wb'); 242 | $nameLength = 0; 243 | forEach($names as &$name) { 244 | $name = '"'.$name.'"'; 245 | $nameLength = max($nameLength, strLen($name)); 246 | } 247 | $head = sprintf('// Idx Show %'.$nameLength.'s'."\n", 'Name'); 248 | $fmt = ' %3u 1 %'.$nameLength.'s'."\n"; 249 | fWrite($hOut, $head); 250 | forEach($names as $idx => &$name) { 251 | fPrintf($hOut, $fmt, $idx, $name); 252 | } 253 | fClose($hOut); 254 | } 255 | 256 | // ------ META ------ // 257 | 258 | function convertDir_BMD2TXT($dir) { 259 | convertText_BMD2TXT($dir.'/text'); 260 | } 261 | 262 | function fixDir($dir) { 263 | global $defs; 264 | @mkDir($dir.'_fixed'); 265 | 266 | // translate Text.BMD 267 | if(file_exists($dir.'/Text.bmd')) { 268 | echo 'Text.bmd
'; 269 | $translateSrc = readBMD('mobius/Text', $defs['text']['all']); // TODO: txt 270 | $translateDest = readBMD($dir.'/Text', $defs['text']['all']); 271 | translateBMD($defs['text']['all'], $translateSrc, $translateDest); 272 | writeBMD($dir.'_fixed/Text', $defs['text']['all'], $translateDest); 273 | writeTXT($dir.'_fixed/Text', $defs['text']['all'], $translateDest); 274 | } 275 | 276 | // clear Filter.BMD 277 | if(file_exists($dir.'/Filter.bmd')) { 278 | echo 'Filter.bmd
'; 279 | // clearFilter($dir.'/filter', $dir.'_fixed/Filter'); 280 | } 281 | 282 | // translate Item.BMD 283 | if(file_exists($dir.'/Item.bmd')) { 284 | echo 'Item.bmd
'; 285 | $translateSrc = readBMD('mobius/Item', $defs['item']['100']); // TODO: txt 286 | $translateDest = readBMD($dir.'/Item', $defs['item']['074']); 287 | translateBMD($defs['item']['074'], $translateSrc, $translateDest); 288 | writeBMD($dir.'_fixed/Item', $defs['item']['074'], $translateDest); 289 | writeTXT($dir.'_fixed/Item', $defs['item']['074'], $translateDest); 290 | } 291 | 292 | // translate Skill.BMD 293 | if(file_exists($dir.'/Skill.bmd')) { 294 | echo 'Skill.bmd
'; 295 | $translateSrc = readBMD('mobius/skill', $defs['skill']['100']); // TODO: txt 296 | $translateDest = readBMD($dir.'/skill', $defs['skill']['074']); 297 | translateBMD($defs['skill']['074'], $translateSrc, $translateDest); 298 | writeBMD($dir.'_fixed/Skill', $defs['skill']['074'], $translateDest); 299 | writeTXT($dir.'_fixed/Skill', $defs['skill']['074'], $translateDest); 300 | } 301 | 302 | // translate NpcName(kor).txt 303 | if(file_exists($dir.'/NpcName(kor).txt')) { 304 | echo 'NpcName(kor).txt
'; 305 | $translateSrc = readNpcNameTXT('mobius/NpcName(eng)'); 306 | $translateDest = readNpcNameTXT($dir.'/NpcName(kor)'); 307 | translateNpcName($translateSrc, $translateDest); 308 | writeNpcNameTXT($dir.'_fixed/NpcName(kor)', $translateDest); 309 | } 310 | } 311 | 312 | fixDir('0.74'); 313 | 314 | // deXOR('0.74/skill'); 315 | // deXOR('mobius/skill'); 316 | 317 | // $item = readBMD('0.74_fixed/item', $defs['item']['074']); 318 | // writeBMD('0.74_fixed/item2', $defs['item']['074'], $item); 319 | // writeTXT('0.74_fixed/item', $defs['item']['074'], $item); 320 | 321 | // $item = readBMD('mobius/item', $defs['item']['100']); 322 | // writeTXT('mobius/item', $defs['item']['100'], $item); 323 | 324 | ?> -------------------------------------------------------------------------------- /MuMapConv/mumapconv.pas: -------------------------------------------------------------------------------- 1 | {$RESOURCE kain.res} 2 | 3 | //COMPILER: FPC OR COMPATIBLE 4 | 5 | program mapconv; 6 | 7 | var 8 | sciezka: string; 9 | input, output: file of byte; 10 | bufor: byte; 11 | i: integer; 12 | 13 | procedure map2bmp; 14 | 15 | //w bardzo lamerski sposob wsadzony header dla pliku bmp 16 | const header: array [$00..$0435] of byte = ( 66, 77, 54, 4, 3, 0, 0, 0, 17 | 0, 0, 54, 4, 0, 0, 40, 0, 18 | 0, 0, 0, 1, 0, 0, 0, 3, 19 | 0, 0, 1, 0, 8, 0, 0, 0, 20 | 0, 0, 0, 0, 3, 0, 19, 11, 21 | 0, 0, 19, 11, 0, 0, 0, 1, 22 | 0, 0, 0, 1, 0, 0, 0,100, 23 | 0, 0, 0,175, 0, 0, 0, 75, 24 | 150, 0, 50,125,200, 0,100,175, 25 | 250, 0,255, 0, 0, 0,255,255, 26 | 0, 0, 94, 94, 94, 0,117,117, 27 | 117, 0,140,140,140, 0,163,163, 28 | 163, 0,186,186,186, 0,209,209, 29 | 209, 0,232,232,232, 0, 14, 14, 30 | 14, 0, 15, 15, 15, 0, 16, 16, 31 | 16, 0, 17, 17, 17, 0, 18, 18, 32 | 18, 0, 19, 19, 19, 0, 20, 20, 33 | 20, 0, 21, 21, 21, 0, 22, 22, 34 | 22, 0, 23, 23, 23, 0, 24, 24, 35 | 24, 0, 25, 25, 25, 0, 26, 26, 36 | 26, 0, 27, 27, 27, 0, 28, 28, 37 | 28, 0, 29, 29, 29, 0, 30, 30, 38 | 30, 0, 31, 31, 31, 0, 32, 32, 39 | 32, 0, 33, 33, 33, 0, 34, 34, 40 | 34, 0, 35, 35, 35, 0, 36, 36, 41 | 36, 0, 37, 37, 37, 0, 38, 38, 42 | 38, 0, 39, 39, 39, 0, 40, 40, 43 | 40, 0, 41, 41, 41, 0, 42, 42, 44 | 42, 0, 43, 43, 43, 0, 44, 44, 45 | 44, 0, 45, 45, 45, 0, 46, 46, 46 | 46, 0, 47, 47, 47, 0, 48, 48, 47 | 48, 0, 49, 49, 49, 0, 50, 50, 48 | 50, 0, 51, 51, 51, 0, 52, 52, 49 | 52, 0, 53, 53, 53, 0, 54, 54, 50 | 54, 0, 55, 55, 55, 0, 56, 56, 51 | 56, 0, 57, 57, 57, 0, 58, 58, 52 | 58, 0, 59, 59, 59, 0, 60, 60, 53 | 60, 0, 61, 61, 61, 0, 62, 62, 54 | 62, 0, 63, 63, 63, 0, 64, 64, 55 | 64, 0, 65, 65, 65, 0, 66, 66, 56 | 66, 0, 67, 67, 67, 0, 68, 68, 57 | 68, 0, 69, 69, 69, 0, 70, 70, 58 | 70, 0, 71, 71, 71, 0, 72, 72, 59 | 72, 0, 73, 73, 73, 0, 74, 74, 60 | 74, 0, 75, 75, 75, 0, 76, 76, 61 | 76, 0, 77, 77, 77, 0, 78, 78, 62 | 78, 0, 79, 79, 79, 0, 80, 80, 63 | 80, 0, 81, 81, 81, 0, 82, 82, 64 | 82, 0, 83, 83, 83, 0, 84, 84, 65 | 84, 0, 85, 85, 85, 0, 86, 86, 66 | 86, 0, 87, 87, 87, 0, 88, 88, 67 | 88, 0, 89, 89, 89, 0, 90, 90, 68 | 90, 0, 91, 91, 91, 0, 92, 92, 69 | 92, 0, 93, 93, 93, 0, 94, 94, 70 | 94, 0, 95, 95, 95, 0, 96, 96, 71 | 96, 0, 97, 97, 97, 0, 98, 98, 72 | 98, 0, 99, 99, 99, 0,100,100, 73 | 100, 0,101,101,101, 0,102,102, 74 | 102, 0,103,103,103, 0,104,104, 75 | 104, 0,105,105,105, 0,106,106, 76 | 106, 0,107,107,107, 0,108,108, 77 | 108, 0,109,109,109, 0,110,110, 78 | 110, 0,111,111,111, 0,112,112, 79 | 112, 0,113,113,113, 0,114,114, 80 | 114, 0,115,115,115, 0,116,116, 81 | 116, 0,117,117,117, 0,118,118, 82 | 118, 0,119,119,119, 0,120,120, 83 | 120, 0,121,121,121, 0,122,122, 84 | 122, 0,123,123,123, 0,124,124, 85 | 124, 0,125,125,125, 0,126,126, 86 | 126, 0,127,127,127, 0,128,128, 87 | 128, 0,129,129,129, 0,130,130, 88 | 130, 0,131,131,131, 0,132,132, 89 | 132, 0,133,133,133, 0,134,134, 90 | 134, 0,135,135,135, 0,136,136, 91 | 136, 0,137,137,137, 0,138,138, 92 | 138, 0,139,139,139, 0,140,140, 93 | 140, 0,141,141,141, 0,142,142, 94 | 142, 0,143,143,143, 0,144,144, 95 | 144, 0,145,145,145, 0,146,146, 96 | 146, 0,147,147,147, 0,148,148, 97 | 148, 0,149,149,149, 0,150,150, 98 | 150, 0,151,151,151, 0,152,152, 99 | 152, 0,153,153,153, 0,154,154, 100 | 154, 0,155,155,155, 0,156,156, 101 | 156, 0,157,157,157, 0,158,158, 102 | 158, 0,159,159,159, 0,160,160, 103 | 160, 0,161,161,161, 0,162,162, 104 | 162, 0,163,163,163, 0,164,164, 105 | 164, 0,165,165,165, 0,166,166, 106 | 166, 0,167,167,167, 0,168,168, 107 | 168, 0,169,169,169, 0,170,170, 108 | 170, 0,171,171,171, 0,172,172, 109 | 172, 0,173,173,173, 0,174,174, 110 | 174, 0,175,175,175, 0,176,176, 111 | 176, 0,177,177,177, 0,178,178, 112 | 178, 0,179,179,179, 0,180,180, 113 | 180, 0,181,181,181, 0,182,182, 114 | 182, 0,183,183,183, 0,184,184, 115 | 184, 0,185,185,185, 0,186,186, 116 | 186, 0,187,187,187, 0,188,188, 117 | 188, 0,189,189,189, 0,190,190, 118 | 190, 0,191,191,191, 0,192,192, 119 | 192, 0,193,193,193, 0,194,194, 120 | 194, 0,195,195,195, 0,196,196, 121 | 196, 0,197,197,197, 0,198,198, 122 | 198, 0,199,199,199, 0,200,200, 123 | 200, 0,201,201,201, 0,202,202, 124 | 202, 0,203,203,203, 0,204,204, 125 | 204, 0,205,205,205, 0,206,206, 126 | 206, 0,207,207,207, 0,208,208, 127 | 208, 0,209,209,209, 0,210,210, 128 | 210, 0,211,211,211, 0,212,212, 129 | 212, 0,213,213,213, 0,214,214, 130 | 214, 0,215,215,215, 0,216,216, 131 | 216, 0,217,217,217, 0,218,218, 132 | 218, 0,219,219,219, 0,220,220, 133 | 220, 0,221,221,221, 0,222,222, 134 | 222, 0,223,223,223, 0,224,224, 135 | 224, 0,225,225,225, 0,226,226, 136 | 226, 0,227,227,227, 0,228,228, 137 | 228, 0,229,229,229, 0,230,230, 138 | 230, 0,231,231,231, 0,232,232, 139 | 232, 0,233,233,233, 0,234,234, 140 | 234, 0,235,235,235, 0,236,236, 141 | 236, 0,237,237,237, 0,238,238, 142 | 238, 0,239,239,239, 0,240,240, 143 | 240, 0,241,241,241, 0,242,242, 144 | 242, 0,243,243,243, 0,244,244, 145 | 244, 0,245,245,245, 0,246,246, 146 | 246, 0,247,247,247, 0,248,248, 147 | 248, 0,249,249,249, 0,250,250, 148 | 250, 0,251,251,251, 0,252,252, 149 | 252, 0,253,253,253, 0,254,254, 150 | 254, 0,255,255,255, 0); 151 | 152 | 153 | begin 154 | sciezka[i-2]:='b'; //w bardzo lamerski sposob zmieniamy ext dla outputu 155 | sciezka[i-1]:='m'; 156 | sciezka[i]:='p'; 157 | assign(output,sciezka); 158 | rewrite(output); 159 | 160 | for i:= $00 to $0434 do //przepisz caly header 161 | write(output,header[i]); 162 | while not eof(input) do //i potem caly plik map 163 | begin 164 | read(input,bufor); 165 | write(output,bufor); 166 | end; 167 | end; 168 | 169 | procedure bmp2map; 170 | begin 171 | sciezka[i-2]:='m'; //w bardzo lamerski sposob zmieniamy ext dla outputu 172 | sciezka[i-1]:='a'; 173 | sciezka[i]:='p'; 174 | assign(output,sciezka); 175 | rewrite(output); 176 | 177 | seek(input,$0435); //idziemy za header bmp 178 | 179 | while not eof(input) do //do konca pliku przepisujemy 180 | begin 181 | read(input,bufor); 182 | write(output,bufor); 183 | end; 184 | end; 185 | 186 | BEGIN 187 | 188 | if paramstr(1) = '' then 189 | begin 190 | writeln('Sciezka pliku do konwersji (bmp, map): '); 191 | readln(sciezka); 192 | end 193 | else sciezka:=paramstr(1); 194 | 195 | assign(input,sciezka); 196 | {$I-}reset(input);{$I+} 197 | if (IOResult <> 0) or (sciezka = '') then 198 | begin 199 | writeln('Nieprawidlowa sciezka'); 200 | halt; 201 | end; 202 | 203 | i:= length(sciezka); {liczymy dlugosc sciezki do sprawdzenia rozszerzenia} 204 | 205 | case upcase(sciezka[i-2]) of {wybierz procedure wg pierwszej litery 206 | rozszerzenia} 207 | 'M': map2bmp; {jak rozszerzenie to Map to robimy map -> bmp} 208 | 'B': bmp2map; {jak rozszerzenie to Bmp to robimy bmp -> map} 209 | else begin write('zle rozszerzenie!'); halt; end; 210 | end; 211 | 212 | writeln('Zrobione'); 213 | close(input); {zamykamy odczyt plikow} 214 | close(output); 215 | 216 | END. 217 | 218 | -------------------------------------------------------------------------------- /MuMapEdit/mumapedit.pas: -------------------------------------------------------------------------------- 1 | {$APPTYPE GUI} 2 | {$r menu.res} 3 | {$r bmpheads.res} 4 | program MuMapEdit; 5 | 6 | uses 7 | Windows, 8 | Messages, 9 | Strings; 10 | 11 | type 12 | TPos = packed record 13 | x: longint; 14 | y: longint; 15 | end; 16 | TTex = record 17 | handle: hBitmap; 18 | szer: word; 19 | wys: word; 20 | hThumb: hBitmap; 21 | substc: longint; 22 | end; 23 | var 24 | /////////////////////////////////////////////////zmienne do okna glownego 25 | Wnd: WndClass; //klasa okna glownego 26 | wymiaryokna: RECT; //wymiary okna glownego bez belki gornej itd. 27 | WspRect: RECT; //pole odswiezane przy odmalowaniu wspolrzednych 28 | hOkna: HWND; // uchwyt do okna 29 | hdcOkna: HDC; // uchwyt do rysowania po oknie 30 | TextProp: TEXTMETRIC; 31 | 32 | ///////////////////////////////////////////////////////zmienne do planszy 33 | plansza: WndClass; // klasa okna planszy 34 | hPlanszy: HWND; // uchwyt do okna planszy 35 | hdcPlanszy: HDC; // uchwyt do rysowania po planszy 36 | szerPlanszy,wysPlanszy: word; //mierzona w ilosci pol 37 | kp,wp,kk,wk: byte; {numery pol poczatkowych i koncowych aktualnie 38 | wyswietlanych na planszy} 39 | skala: byte = 64; //dlugosc boku pola w pikselach i wartosc domyslna 40 | pozycja: TPos; //aktualne x i y na mapie 41 | xscroll,yscroll : longint; //wymiary x i y suwaka 42 | war: byte; //obecnie wyswietlana warstwa na planszy 43 | RefPole: RECT; //pole wymagane do odswiezania przy rysowaniu 44 | 45 | //////////////////////////////////////////////////////operacje na plikach 46 | hPlik: HWND; //uchwyt do okna 47 | przeczyt:LongWord; //ilosc przeczytanych/zapisanych bajtow podczas operacji 48 | otworz,zapisz: OPENFILENAME; //dane do dialogow otworz/zapisz plik 49 | folder: BROWSEINFO; //dane do dialogu wybierania katalogu 50 | FilePath: array [0..MAX_PATH] of char; {sciezka do czytanego/zapisywanego 51 | pliku} 52 | WorldPath: array [0..MAX_PATH] of char; //sciezka do folderu z worldem 53 | przesuw: integer; //offset do czytania niektorych plikow 54 | tempdir: pchar; //sciezka do folderu tymczasowego 55 | znaleziony: win32_find_data; //dane znalezionych po wyszukiwaniu plikow 56 | 57 | ////////////////////////////////////////////////////////////////dane mapy 58 | MAP: array [0..7,0..255,0..255] of byte; {wartosci warstw, uporzadkowanie: 59 | warstwa,x,y} 60 | tekstury: array [0..$0E] of TTex; {tablica z uchwytami do tekstur, 61 | ostatnia dla nieprawidlowych wartosci} 62 | 63 | //////////////////////////////////////////////////////////kontrolka RYSUJ 64 | rysuj: boolean; //rysujemy albo nie 65 | hPrzycisk: HWND; //uchwyt do przycisku rysuj 66 | 67 | //////////////////////////////////////////////////////////kontrolka SKALA 68 | hSkala: HWND; // uchwyt do comboboxa skali 69 | 70 | ////////////////////////////////////////////////////////kontrolka WARSTWA 71 | hWar: HWND; //uchwyt do comboboxa warstw 72 | 73 | /////////////////////////////////////////////////kontrolka WYBOR TEKSTURY 74 | hSelTex: HWND; //uchwyt do okna wyboru 75 | SelTex: WndClass; //klasa okna wyboru 76 | hdcSelTex: HDC; //uchwyt do rysowania po oknie wyboru 77 | valSelTex: byte; //wybrana przez uzytkownika tekstura 78 | 79 | /////////////////////////////////////////////kontrolka WARTOSC POJEDYNCZA 80 | hSel1: HWND; //uchwyt do okna wpisywania wartosci 81 | sSel1: string; //lancuch przechowujacy tymczasowo wartosc z pola hSel1 82 | dSel1: word; {wartosc liczbowa otrzymana z konwersji sSel1. Typ word 83 | dla sprawdzania przekroczenia dozwolonych wartosci} 84 | 85 | ////////////////////////////////////////////////////////////////////ROZNE 86 | Msg: TMsg; 87 | w,k: byte; 88 | ps: PAINTSTRUCT; 89 | bufor: PCHAR = ''; 90 | defPen,polePen: HPEN; 91 | defBrush,poleBrush: HBRUSH; 92 | hbmOld: HBITMAP; // poprzednia, domyslna wartosc bitmapy dla hdcNowy 93 | hdcNowy: HDC; // uchwyt dla bitmapy przy BitBlt 94 | BelkaMenu: HMENU; //uchwyt do belki gornego menu 95 | i,tex:byte; 96 | 97 | nazwy: array [$00..$12] of pchar = ('\TileGrass01.bmp', 98 | '\TileGrass02.bmp', 99 | '\TileGround01.bmp', 100 | '\TileGround02.bmp', 101 | '\TileGround03.bmp', 102 | '\TileWater01.bmp', 103 | '\TileWood01.bmp', 104 | '\TileRock01.bmp', 105 | '\TileRock02.bmp', 106 | '\TileRock03.bmp', 107 | '\TileRock04.bmp', 108 | '\TileRock05.bmp', 109 | '\TileRock06.bmp', 110 | '\TileRock07.bmp', 111 | '\borken.bmp', 112 | '\Terrain.map', 113 | '\Terrain.att', 114 | '\TerrainHeight.ozb', 115 | '\TerrainLight.bmp'); 116 | 117 | procedure loadtex(nr: byte; src: pchar); 118 | var 119 | sciezka: pchar; 120 | info: bitmap; 121 | begin 122 | sciezka:=stralloc(max_path); 123 | strmove(sciezka,tempdir,max_path); 124 | strcat(sciezka,nazwy[nr]); 125 | 126 | if src <> '' then 127 | begin 128 | deletefile(sciezka); 129 | copyfile(src,sciezka,false); 130 | end; 131 | with tekstury[nr] do 132 | begin 133 | handle:= loadimage(0,sciezka,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 134 | if handle <> 0 then 135 | begin 136 | hThumb:= loadimage(0,sciezka,IMAGE_BITMAP,48,48,LR_LOADFROMFILE); 137 | GetObject(handle,sizeof(info),@info); 138 | szer:= info.bmWidth; 139 | wys:= info.bmHeight; 140 | if skala <> 64 then 141 | begin 142 | handle:= loadimage(0,sciezka,IMAGE_BITMAP,szer div 64 * skala, wys div 64 * skala,LR_LOADFROMFILE); 143 | GetObject(handle,sizeof(info),@info); 144 | szer:= info.bmWidth; 145 | wys:= info.bmHeight; 146 | end; 147 | end 148 | else hThumb:=0; 149 | end; 150 | end; 151 | 152 | procedure PrepOpen(listatypow,rozszerzenie:pchar); 153 | begin 154 | fillchar(otworz,sizeof(otworz),0); 155 | with otworz do 156 | begin 157 | lstructsize:=sizeof(TOPENFILENAME); 158 | lpstrFilter:= listatypow; 159 | nMaxFile:= MAX_PATH; 160 | lpstrFile:= pchar(FilePath); 161 | lpstrDefExt:= rozszerzenie; 162 | flags:= ofn_filemustexist or ofn_hidereadonly 163 | end; 164 | end; 165 | 166 | procedure PrepSave(listatypow,rozszerzenie:pchar); 167 | begin 168 | fillchar(zapisz,sizeof(zapisz),0); 169 | with zapisz do 170 | begin 171 | lstructsize:=sizeof(TOPENFILENAME); 172 | lpstrFilter:= listatypow; 173 | nMaxFile:= MAX_PATH; 174 | lpstrFile:= pchar(FilePath); 175 | lpstrDefExt:= rozszerzenie; 176 | flags:= ofn_hidereadonly 177 | end; 178 | end; 179 | 180 | procedure WriteLayer(war: byte); 181 | begin 182 | for w:=255 downto 0 do //256 wierszy, czytane od tylu 183 | for k:=0 to 255 do 184 | begin 185 | writefile(hPlik,map[war,k,w],1,przeczyt,poverlapped(0)); 186 | if przeczyt = 0 then messagebox(hOkna,'Blad zapisu!','',MB_OK); 187 | end; 188 | end; 189 | 190 | procedure frOpen(src: pchar; defname: byte); 191 | var 192 | fpath: pchar; 193 | begin 194 | fpath:=stralloc(max_path); 195 | strmove(fpath,tempdir,max_path); 196 | strcat(fpath,nazwy[defname]); 197 | 198 | if src <> '' then 199 | copyfile(src,fpath,false); 200 | 201 | hPlik:= CreateFile(fpath,generic_read, 202 | file_share_read,lpsecurity_attributes(0), 203 | open_always,file_flag_sequential_scan, 204 | 0); 205 | end; 206 | 207 | 208 | procedure AttMapRead(wmin,wmax,offs: byte); 209 | begin 210 | if hPlik <> INVALID_HANDLE_VALUE then 211 | begin 212 | setfilepointer(hPlik,offs,plong(0),file_begin); 213 | for i:= wmin to wmax do 214 | for w:=255 downto 0 do //256 wierszy, czytane od tylu 215 | for k:=0 to 255 do 216 | begin 217 | readfile(hPlik,map[i,k,w],1,przeczyt,poverlapped(0)); 218 | if przeczyt = 0 then 219 | begin 220 | messagebox(hOkna,'Blad odczytu!','',MB_OK); 221 | Closehandle(hPlik); 222 | exit; 223 | end; 224 | end; 225 | if (war >= wmin) and (war <= wmax) then 226 | invalidaterect(hPlanszy,lprect(0),true); 227 | end; 228 | Closehandle(hPlik); 229 | end; 230 | 231 | procedure HeightRead(lwar: byte); 232 | begin 233 | if hPlik <> INVALID_HANDLE_VALUE then 234 | begin 235 | setfilepointer(hPlik,14,plong(0),file_begin); 236 | //4 dla ominiecia powtorzonych bajtow + 10 dla adresu danych 237 | readfile(hPlik,przesuw,2,przeczyt,poverlapped(0)); 238 | inc(przesuw,4); 239 | if przeczyt = 0 then 240 | begin 241 | messagebox(hOkna,'Blad odczytu!','',MB_OK); 242 | Closehandle(hPlik); 243 | exit; 244 | end; 245 | setfilepointer(hPlik,przesuw,plong(0),file_begin); 246 | for w:=255 downto 0 do //256 wierszy, czytane od tylu 247 | for k:=0 to 255 do 248 | begin 249 | readfile(hPlik,map[lwar,k,w],1,przeczyt,poverlapped(0)); 250 | if przeczyt = 0 then 251 | begin 252 | messagebox(hOkna,'Blad odczytu!','',MB_OK); 253 | Closehandle(hPlik); 254 | exit; 255 | end; 256 | end; 257 | if war = lwar then 258 | invalidaterect(hPlanszy,lprect(0),true); 259 | end; 260 | Closehandle(hPlik); 261 | end; 262 | 263 | procedure LightRead(wmin,wmax: byte); 264 | begin 265 | if hPlik <> INVALID_HANDLE_VALUE then 266 | begin 267 | setfilepointer(hPlik,10,plong(0),file_begin); 268 | readfile(hPlik,przesuw,2,przeczyt,poverlapped(0)); 269 | if przeczyt = 0 then 270 | begin 271 | messagebox(hOkna,'Blad odczytu!','',MB_OK); 272 | Closehandle(hPlik); 273 | exit; 274 | end; 275 | setfilepointer(hPlik,przesuw,plong(0),file_begin); 276 | for w:=255 downto 0 do //256 wierszy, czytane od tylu 277 | for k:=0 to 255 do 278 | for i:=wmax downto wmin do //zeby BGR obrocic na RGB 279 | begin 280 | readfile(hPlik,map[i,k,w],1,przeczyt,poverlapped(0)); 281 | if przeczyt = 0 then 282 | begin 283 | messagebox(hOkna,'Blad odczytu!','',MB_OK); 284 | Closehandle(hPlik); 285 | exit; 286 | end; 287 | end; 288 | if (war >= wmin) and (war <=wmax) then 289 | invalidaterect(hPlanszy,lprect(0),true); 290 | end; 291 | Closehandle(hPlik); 292 | end; 293 | 294 | procedure fwTempOpen(defname: byte); 295 | var 296 | fpath: pchar; 297 | begin 298 | fpath:=stralloc(max_path); 299 | strmove(fpath,tempdir,max_path); 300 | strcat(fpath,nazwy[defname]); 301 | hPlik:= CreateFile(fpath,generic_write, 302 | 0,lpsecurity_attributes(0), 303 | open_existing, file_flag_random_access, 304 | 0); 305 | end; 306 | 307 | procedure fwTemp(value: byte;offs: dword); 308 | begin 309 | setfilepointer(hPlik,offs,plong(0),file_begin); 310 | WriteFile(hPlik,value,1,przeczyt,poverlapped(0)); 311 | if przeczyt = 0 then 312 | messagebox(hOkna,'Blad Zapisu!','',mb_ok); 313 | end; 314 | 315 | procedure AttMapSave(wmin,wmax: byte; sciezka: pchar; header:shortstring); 316 | begin 317 | hPlik:= CreateFile(sciezka,generic_write, 318 | 0,lpsecurity_attributes(0), 319 | create_always, file_flag_sequential_scan, 320 | 0); 321 | for i:= 1 to byte(header[0]) do 322 | begin 323 | writefile(hPlik,header[i],1,przeczyt,poverlapped(0)); 324 | if przeczyt = 0 then 325 | begin 326 | messagebox(hOkna,'Blad zapisu!','',MB_OK); 327 | Closehandle(hPlik); 328 | exit; 329 | end; 330 | end; 331 | for i:= wmin to wmax do 332 | for w:=255 downto 0 do //256 wierszy, czytane od tylu 333 | for k:=0 to 255 do 334 | begin 335 | writefile(hPlik,map[i,k,w],1,przeczyt,poverlapped(0)); 336 | if przeczyt = 0 then 337 | begin 338 | messagebox(hOkna,'Blad zapisu!','',MB_OK); 339 | Closehandle(hPlik); 340 | exit; 341 | end; 342 | end; 343 | Closehandle(hPlik); 344 | end; 345 | 346 | procedure BmpWrite(wmin,wmax: byte; sciezka: pchar); 347 | var 348 | hHeader: LongWord; 349 | begin 350 | if wmin<> wmax then 351 | hHeader:= FindResource(hInstance,'RGBHead',RT_RCDATA) 352 | else 353 | hHeader:= FindResource(hInstance,'MonoHead',RT_RCDATA); 354 | 355 | hPlik:= CreateFile(sciezka,generic_write, 356 | 0,lpsecurity_attributes(0), 357 | create_always, file_flag_sequential_scan, 358 | 0); 359 | writefile(hPlik,LockResource(LoadResource(hInstance,hHeader))^,SizeOfResource(hInstance,hHeader),przeczyt,poverlapped(0)); 360 | if przeczyt <> SizeOfResource(hInstance,hHeader) then 361 | begin 362 | messagebox(hOkna,'Blad zapisu!','',MB_OK); 363 | Closehandle(hPlik); 364 | exit; 365 | end; 366 | for w:= 255 downto 0 do 367 | for k:= 0 to 255 do 368 | for i:=wmax downto wmin do 369 | begin 370 | writefile(hPlik,map[i,k,w],1,przeczyt,poverlapped(0)); 371 | if przeczyt = 0 then 372 | begin 373 | messagebox(hOkna,'Blad zapisu!','',MB_OK); 374 | Closehandle(hPlik); 375 | exit; 376 | end; 377 | end; 378 | 379 | CloseHandle(hPlik); 380 | end; 381 | 382 | procedure odrysujSelTex(nrTex: byte); 383 | begin 384 | SelectObject(hdcNowy,tekstury[nrTex].hThumb); 385 | w:=nrTex div 2; 386 | k:=nrTex mod 2; 387 | 388 | if nrTex = valSelTex then 389 | begin 390 | polePen:= createpen(ps_solid,1,RGB(255,0,0)); 391 | defPen:= selectobject(hdcSelTex,polePen); 392 | if tekstury[nrTex].hthumb = 0 then 393 | poleBrush:= createsolidbrush(tekstury[nrTex].substc) 394 | else 395 | poleBrush:= createpatternbrush(tekstury[nrTex].hThumb); 396 | defBrush:= selectobject(hdcSelTex,poleBrush); 397 | 398 | rectangle(hdcSelTex,k*48,w*48,k*48+48,w*48+48); 399 | 400 | selectobject(hdcSelTex,defBrush); 401 | deleteobject(poleBrush); 402 | selectobject(hdcSelTex,defpen); 403 | deleteobject(polePen); 404 | end 405 | else 406 | if tekstury[nrTex].hthumb = 0 then 407 | begin 408 | polePen:= createpen(ps_solid,1,tekstury[nrTex].substc); 409 | defPen:= selectobject(hdcSelTex,polePen); 410 | poleBrush:= createsolidbrush(tekstury[nrTex].substc); 411 | defBrush:= selectobject(hdcSelTex,poleBrush); 412 | 413 | rectangle(hdcSelTex,k*48,w*48,k*48+48,w*48+48); 414 | 415 | selectobject(hdcSelTex,defBrush); 416 | deleteobject(poleBrush); 417 | selectobject(hdcSelTex,defpen); 418 | deleteobject(polePen); 419 | end 420 | else 421 | BitBlt(hdcSelTex,k*48,w*48,48,48,hdcNowy,0,0,srccopy); 422 | 423 | end; 424 | 425 | 426 | (*******************FUNKCJE SELTEX*******************************************) 427 | 428 | function funkcjeSelTex(hSelTex: hwnd; umsg: uint; wpar: wparam; lpar: lparam):lresult; stdcall; 429 | begin 430 | funkcjeSelTex:=0; 431 | case uMsg of 432 | WM_CREATE: 433 | begin 434 | end; 435 | WM_PAINT: 436 | begin 437 | hdcSelTex:= beginpaint(hSelTex,ps); 438 | hdcSelTex:= getdc(hSelTex); 439 | hdcNowy:= createcompatibleDC(hdcSelTex); 440 | hbmOld:= SelectObject(hdcNowy,tekstury[0].hThumb); 441 | 442 | for i:= $00 to $0E do 443 | odrysujSelTex(i); 444 | 445 | SelectObject(hdcNowy,hbmOld); 446 | deleteDC(hdcNowy); 447 | releasedc(hSelTex,hdcSelTex); 448 | endpaint(hSelTex,ps); 449 | end; 450 | WM_LBUTTONUP: 451 | begin 452 | valSelTex:= loWord(lPar) div 48 + 2* (hiWord(lPar) div 48); 453 | if valSelTex > $0E then valSelTex:= $0E; 454 | sendmessage(hSelTex,wm_paint,0,0); 455 | end; 456 | else funkcjeSelTex:=defwindowproc(hSeltex,umsg,wpar,lpar); 457 | end; 458 | end; 459 | 460 | (*******************FUNKCJE PLANSZY******************************************) 461 | 462 | function funkcjeplanszy(hPlanszy: hwnd; umsg: uint; wpar: wparam; lpar: lparam):lresult; stdcall; 463 | begin 464 | funkcjeplanszy:=0; 465 | case uMsg of 466 | WM_CREATE: 467 | begin 468 | setscrollrange(hPlanszy,sb_horz,0,255-szerplanszy+1,true); 469 | setscrollrange(hPlanszy,sb_vert,0,255-wysplanszy+1,true); 470 | end; 471 | WM_SIZE: 472 | begin 473 | setscrollrange(hPlanszy,sb_horz,0,255-szerplanszy+1,true); 474 | setscrollrange(hPlanszy,sb_vert,0,255-wysplanszy+1,true); 475 | end; 476 | WM_PAINT: 477 | begin 478 | hdcPlanszy:= beginpaint(hPlanszy,ps); 479 | hdcPlanszy:= getdc(hplanszy); 480 | 481 | if wp+wysplanszy > $FF then wk:= $FF else wk:= wp+wysplanszy; 482 | if kp+szerplanszy > $FF then kk:= $FF else kk:= kp+szerplanszy; 483 | case war of 484 | 0,1: /////////////TEX 1, 2 485 | begin 486 | if war=1 then 487 | i:=i; 488 | hdcNowy:= createcompatibleDC(hdcPlanszy); 489 | hbmOld:= selectobject(hdcNowy,tekstury[0].handle); 490 | for w:=wp to wk do 491 | for k:=kp to kk do 492 | begin 493 | if map[war,k,w] <= $0D then 494 | tex:=map[war,k,w] 495 | else 496 | tex:=$0E; 497 | selectobject(hdcnowy,tekstury[tex].handle); 498 | 499 | if tekstury[tex].handle = 0 then 500 | begin 501 | polePen:= createpen(ps_solid,1,tekstury[tex].substc); 502 | defPen:= selectobject(hdcPlanszy,polePen); 503 | poleBrush:= createsolidbrush(tekstury[tex].substc); 504 | defBrush:= selectobject(hdcPlanszy,poleBrush); 505 | 506 | rectangle(hdcPlanszy,(k-kp)*skala,(w-wp)*skala,(k-kp)*skala+skala,(w-wp)*skala+skala); 507 | 508 | selectobject(hdcPlanszy,defPen); 509 | deleteobject(polePen); 510 | selectobject(hdcPlanszy,defBrush); 511 | deleteobject(poleBrush); 512 | end 513 | else 514 | bitblt(hdcPlanszy,(k-kp)*skala,(w-wp)*skala,skala,skala,hdcnowy,(k mod (tekstury[tex].szer div skala))*skala, (w mod (tekstury[tex].wys div skala))*skala,srccopy); 515 | end; 516 | selectobject(hdcNowy,hbmOld); 517 | deletedc(hdcNowy); 518 | end; 519 | 2,4,5,6,7: ////TEXATR, SWIATLO R, G, B, HEIGHT 520 | for w:=wp to wk do 521 | for k:=kp to kk do 522 | begin 523 | polePen:= createpen(ps_solid,1,RGB(map[war,k,w],map[war,k,w],map[war,k,w])); 524 | defPen:= selectobject(hdcPlanszy,polePen); 525 | poleBrush:= createsolidbrush(RGB(map[war,k,w],map[war,k,w],map[war,k,w])); 526 | defBrush:= selectobject(hdcPlanszy,poleBrush); 527 | 528 | rectangle(hdcPlanszy,(k-kp)*skala,(w-wp)*skala,(k-kp)*skala+skala,(w-wp)*skala+skala); 529 | 530 | selectobject(hdcPlanszy,defPen); 531 | deleteobject(polePen); 532 | selectobject(hdcPlanszy,defBrush); 533 | deleteobject(poleBrush); 534 | end; 535 | 3: /////////////ATT 536 | for w:=wp to wk do 537 | for k:=kp to kk do 538 | begin 539 | polePen:= createpen(ps_solid,1,RGB(map[war,k,w]*20,map[war,k,w]*20,map[war,k,w]*20)); 540 | defPen:= selectobject(hdcPlanszy,polePen); 541 | poleBrush:= createsolidbrush(RGB(map[war,k,w]*20,map[war,k,w]*20,map[war,k,w]*20)); 542 | defBrush:= selectobject(hdcPlanszy,poleBrush); 543 | 544 | rectangle(hdcPlanszy,(k-kp)*skala,(w-wp)*skala,(k-kp)*skala+skala,(w-wp)*skala+skala); 545 | 546 | selectobject(hdcPlanszy,defPen); 547 | deleteobject(polePen); 548 | selectobject(hdcPlanszy,defBrush); 549 | deleteobject(poleBrush); 550 | end; 551 | 8: //////SWIATLO RGB 552 | for w:=wp to wk do 553 | for k:=kp to kk do 554 | begin 555 | polePen:= createpen(ps_solid,1,RGB(map[4,k,w],map[5,k,w],map[6,k,w])); 556 | defPen:= selectobject(hdcPlanszy,polePen); 557 | poleBrush:= createsolidbrush(RGB(map[4,k,w],map[5,k,w],map[6,k,w])); 558 | defBrush:= selectobject(hdcPlanszy,poleBrush); 559 | 560 | rectangle(hdcPlanszy,(k-kp)*skala,(w-wp)*skala,(k-kp)*skala+skala,(w-wp)*skala+skala); 561 | 562 | selectobject(hdcPlanszy,defPen); 563 | deleteobject(polePen); 564 | selectobject(hdcPlanszy,defBrush); 565 | deleteobject(poleBrush); 566 | end; 567 | end; 568 | 569 | releasedc(hplanszy,hdcPlanszy); 570 | endpaint(hplanszy,ps); 571 | end; 572 | WM_HSCROLL: 573 | begin 574 | case wpar of 575 | sb_lineleft: 576 | begin 577 | if kp > 0 then dec(kp); 578 | setscrollpos(hPlanszy,sb_horz,kp,true); 579 | invalidaterect(hPlanszy,lprect(0),true); 580 | end; 581 | sb_lineright: 582 | begin 583 | if kp <= $FF-szerplanszy then inc(kp); 584 | setscrollpos(hPlanszy,sb_horz,kp,true); 585 | invalidaterect(hPlanszy,lprect(0),true); 586 | end; 587 | sb_pageright: 588 | begin 589 | if kp <= $FF-szerplanszy+1 then kp:=kp+szerplanszy 590 | else kp:=$FF-szerplanszy+1; 591 | setscrollpos(hPlanszy,sb_horz,kp,true); 592 | invalidaterect(hPlanszy,lprect(0),true); 593 | end; 594 | sb_pageleft: 595 | begin 596 | if kp >szerplanszy then kp:=kp-szerplanszy 597 | else kp:=0; 598 | setscrollpos(hPlanszy,sb_horz,kp,true); 599 | invalidaterect(hPlanszy,lprect(0),true); 600 | end; 601 | end; 602 | end; 603 | WM_VSCROLL: 604 | begin 605 | case wpar of 606 | sb_lineup: 607 | begin 608 | if wp > 0 then dec(wp); 609 | setscrollpos(hPlanszy,sb_vert,wp,true); 610 | invalidaterect(hPlanszy,lprect(0),true); 611 | end; 612 | sb_linedown: 613 | begin 614 | if wp <= $FF-wysplanszy then inc(wp); 615 | setscrollpos(hPlanszy,sb_vert,wp,true); 616 | invalidaterect(hPlanszy,lprect(0),true); 617 | end; 618 | sb_pageup: 619 | begin 620 | if wp > wysplanszy then wp:=wp-wysplanszy 621 | else wp:=0; 622 | setscrollpos(hPlanszy,sb_vert,wp,true); 623 | invalidaterect(hPlanszy,lprect(0),true); 624 | end; 625 | sb_pagedown: 626 | begin 627 | if wp <= $FF-wysplanszy+1 then wp:=wp+wysplanszy 628 | else wp:=$FF - wysplanszy+1; 629 | setscrollpos(hPlanszy,sb_vert,wp,true); 630 | invalidaterect(hPlanszy,lprect(0),true); 631 | end; 632 | end; 633 | end; 634 | WM_MOUSEMOVE: 635 | begin 636 | if loword(lpar) div skala +kp <= $FF then 637 | pozycja.x:= loword(lpar) div skala +kp; 638 | if (hiword(lpar) div skala +wp) <= $FF then 639 | pozycja.y:= (hiword(lpar) div skala +wp) xor $FF; 640 | wvsprintf(bufor,'x: %d, y: %d',@pozycja); 641 | invalidaterect(hOkna,@wspRect,true); 642 | 643 | if rysuj and (wpar = mk_lbutton) then 644 | begin 645 | case war of 646 | 0,1: 647 | if map[war,pozycja.x,pozycja.y xor $FF] <> valSelTex then 648 | begin 649 | map[war,pozycja.x,pozycja.y xor $FF]:= valSelTex; 650 | with RefPole do 651 | begin 652 | left:= (LoWord(lpar) div skala) * skala; 653 | right:= left+skala; 654 | top:= (HiWord(lpar) div skala) * skala; 655 | bottom:= top+skala; 656 | end; 657 | fwTemp(valSelTex,1+(war shl 16) + pozycja.x + (pozycja.y shl 8)); 658 | invalidaterect(hPlanszy,RefPole,true); 659 | end; 660 | 661 | 662 | 2,4,5,6,7: 663 | begin 664 | fillchar(sSel1,256,0); 665 | sSel1[0]:= char(getwindowtext(hSel1,@sSel1[1],getwindowtextlength(hSel1)+1)); 666 | val(sSel1,dSel1,i); 667 | if dSel1 > $FF then 668 | begin 669 | dSel1:= $FF; 670 | str(dSel1,sSel1); 671 | SetWindowText(hSel1,@sSel1[1]); 672 | end; 673 | if map[war,pozycja.x,pozycja.y xor $FF] <> dSel1 then 674 | begin 675 | map[war,pozycja.x, pozycja.y xor $FF]:= dSel1; 676 | case war of 677 | 2: fwTemp(dSel1,1+(war shl 16) + pozycja.x + (pozycja.y shl 8)); 678 | 4,5,6: fwTemp(dSel1,54+((pozycja.x*3)+2-(war-4))+(pozycja.y*3) shl 8); 679 | 7: fwTemp(dSel1,1082+pozycja.x+(pozycja.y shl 8)); 680 | end; 681 | with RefPole do 682 | begin 683 | left:= (LoWord(lpar) div skala) * skala; 684 | right:= left+skala; 685 | top:= (HiWord(lpar) div skala) * skala; 686 | bottom:= top+skala; 687 | end; 688 | invalidaterect(hPlanszy,RefPole,true); 689 | end; 690 | end; 691 | end; 692 | end; 693 | end; 694 | WM_LBUTTONDOWN: 695 | begin 696 | if rysuj then 697 | case war of 698 | 0,1: 699 | begin 700 | fwTempOpen($0F); 701 | if map[war,pozycja.x,pozycja.y xor $FF] <> valSelTex then 702 | begin 703 | map[war,pozycja.x,pozycja.y xor $FF]:= valSelTex; 704 | with RefPole do 705 | begin 706 | left:= (LoWord(lpar) div skala) * skala; 707 | right:= left+skala; 708 | top:= (HiWord(lpar) div skala) * skala; 709 | bottom:= top+skala; 710 | end; 711 | fwTemp(valSelTex,1+(war shl 16) + pozycja.x + (pozycja.y shl 8)); 712 | invalidaterect(hPlanszy,RefPole,true); 713 | end; 714 | end; 715 | 716 | 2,4,5,6,7: 717 | begin 718 | case war of 719 | 2: fwTempOpen($0F); 720 | 4,5,6: fwTempOpen($12); 721 | 7: fwTempOpen($11); 722 | end; 723 | fillchar(sSel1,256,0); 724 | sSel1[0]:= char(getwindowtext(hSel1,@sSel1[1],getwindowtextlength(hSel1)+1)); 725 | val(sSel1,dSel1,i); 726 | if dSel1 > $FF then 727 | begin 728 | dSel1:= $FF; 729 | str(dSel1,sSel1); 730 | SetWindowText(hSel1,@sSel1[1]); 731 | end; 732 | if map[war,pozycja.x,pozycja.y xor $FF] <> dSel1 then 733 | begin 734 | map[war,pozycja.x, pozycja.y xor $FF]:= dSel1; 735 | case war of 736 | 2: fwTemp(dSel1,1+(war shl 16) + pozycja.x + (pozycja.y shl 8)); 737 | 4,5,6: fwTemp(dSel1,54+((pozycja.x*3)+2-(war-4))+(pozycja.y*3) shl 8); 738 | 7: fwTemp(dSel1,1082+pozycja.x+(pozycja.y shl 8)); 739 | end; 740 | with RefPole do 741 | begin 742 | left:= LoWord(lpar); 743 | right:= left+skala; 744 | top:= HiWord(lpar); 745 | bottom:= top+skala; 746 | end; 747 | invalidaterect(hPlanszy,RefPole,true); 748 | end; 749 | end; 750 | end; 751 | end; 752 | WM_LBUTTONUP: 753 | closehandle(hPlik); 754 | else funkcjeplanszy:=defwindowproc(hplanszy,umsg,wpar,lpar); 755 | end; 756 | end; 757 | 758 | (***************FUNKCJE OKNA*************************************************) 759 | 760 | function FunkcjeOkna(hOkna: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall; 761 | begin 762 | funkcjeokna := 0; 763 | case uMsg of 764 | WM_DESTROY: PostQuitMessage(0); 765 | 766 | WM_PAINT: 767 | begin 768 | hdcOkna:= beginpaint(hOkna,ps); 769 | case war of 770 | 0,1: 771 | begin 772 | showwindow(hSelTex,sw_show); 773 | showwindow(hSel1,sw_hide); 774 | end; 775 | 2,4,5,6,7: 776 | begin 777 | showwindow(hSel1,sw_show); 778 | showwindow(hSelTex,sw_hide); 779 | end; 780 | else 781 | begin 782 | showwindow(hSel1,sw_hide); 783 | showwindow(hSelTex,sw_hide); 784 | end; 785 | end; 786 | 787 | setbkmode(hdcOkna,transparent); 788 | textout(hdcOkna,5,wymiaryokna.bottom-20,bufor,length(bufor)); 789 | 790 | endpaint(hOkna,ps); 791 | end; 792 | 793 | WM_CREATE: 794 | begin 795 | hdcOkna:= getdc(hOkna); 796 | GetTextMetrics(hdcOkna,@TextProp); 797 | releasedc(hOkna,hdcOkna); 798 | 799 | tempdir:=stralloc(max_path); 800 | getcurrentdirectory(max_path,tempdir); 801 | strcat(tempdir,pchar('\MuMapEditTMP')); 802 | createdirectory(tempdir,lpsecurity_attributes(0)); 803 | xscroll:= getsystemmetrics(sm_cxhthumb)+getsystemmetrics(sm_cxedge); 804 | yscroll:= getsystemmetrics(sm_cyvthumb)+getsystemmetrics(sm_cyedge); 805 | getclientrect(hOkna,wymiaryokna); 806 | 807 | with wspRect do 808 | begin 809 | left:=5; 810 | right:=100; 811 | top:=wymiaryokna.bottom-20; 812 | bottom:=top + TextProp.tmHeight; 813 | end; 814 | szerPlanszy:= (wymiaryokna.right-100-xscroll) div skala; 815 | wysPlanszy:= (wymiaryokna.bottom-yscroll) div skala; 816 | hPlanszy:= CreateWindow('Plansza','', 817 | WS_CHILD or WS_VISIBLE or WS_BORDER or 818 | WS_HSCROLL or WS_VSCROLL, 819 | 100,0, 820 | wymiaryokna.right-100, wymiaryokna.bottom, 821 | hOkna,1,hInstance,nil); 822 | hSkala:= CreateWindow('COMBOBOX','', 823 | WS_CHILD or WS_VISIBLE or WS_BORDER or 824 | CBS_DROPDOWNLIST, 825 | 1,wymiaryokna.bottom-50, 826 | 98,200, 827 | hOkna,50,hInstance,nil); 828 | hWar:= CreateWindow('COMBOBOX','', 829 | WS_CHILD or WS_VISIBLE or WS_BORDER or 830 | CBS_DROPDOWNLIST, 831 | 1,wymiaryokna.bottom-80, 832 | 98,200, 833 | hOkna,100,hinstance,nil); 834 | hPrzycisk:= Createwindow('BUTTON','Rysuj', 835 | WS_CHILD or WS_VISIBLE or BS_CHECKBOX, 836 | 1,0, 837 | 98,TextProp.tmHeight+6, 838 | hOkna,150,hInstance,nil); 839 | hSelTex:= Createwindow('Seltex','', 840 | WS_CHILD or WS_BORDER, 841 | 1,20, 842 | 98,386, 843 | hOkna,2,hInstance,nil); 844 | hSel1:= Createwindow('EDIT','', 845 | WS_CHILD or WS_BORDER, 846 | 1,20, 847 | TextProp.tmMaxCharWidth*3+6,TextProp.tmHeight+6, 848 | hOkna,2,hInstance,nil); 849 | 850 | sendmessage(hSkala,cb_addstring,0,lparam(lpctstr('64x64'))); 851 | sendmessage(hSkala,cb_addstring,0,lparam(lpctstr('32x32'))); 852 | sendmessage(hSkala,cb_addstring,0,lparam(lpctstr('16x16'))); 853 | sendmessage(hSkala,cb_addstring,0,lparam(lpctstr('8x8'))); 854 | sendmessage(hSkala,cb_addstring,0,lparam(lpctstr('4x4'))); 855 | sendmessage(hSkala,cb_addstring,0,lparam(lpctstr('2x2'))); 856 | sendmessage(hSkala,cb_setcursel,0,0); 857 | 858 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Tekstury1'))); 859 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Tekstury2'))); 860 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Atr teks2'))); 861 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Att'))); 862 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Swiatlo R'))); 863 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Swiatlo G'))); 864 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Swiatlo B'))); 865 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Wysokosci'))); 866 | sendmessage(hWar,cb_addstring,0,lparam(lpctstr('Swiatlo RGB'))); 867 | sendmessage(hWar,cb_setcursel,0,0); 868 | end; 869 | 870 | WM_SIZE: 871 | begin 872 | getwindowrect(hOkna,wymiaryokna); 873 | if wymiaryokna.bottom-wymiaryokna.top < 535 then 874 | begin 875 | setwindowpos(hOkna,hwnd_top, 876 | 0,0, 877 | wymiaryokna.right,535, 878 | swp_nomove or swp_drawframe or swp_nozorder); 879 | sendmessage(hOkna,WM_PAINT,0,0); 880 | end; 881 | getclientrect(hOkna,wymiaryokna); 882 | invalidaterect(hOkna,@wspRect,true); 883 | with wspRect do 884 | begin 885 | left:=5; 886 | right:=100; 887 | top:=wymiaryokna.bottom-20; 888 | bottom:=wymiaryokna.bottom-4; 889 | end; 890 | 891 | szerPlanszy:= (wymiaryokna.right-100-xscroll) div skala; 892 | wysPlanszy:= (wymiaryokna.bottom-yscroll) div skala; 893 | setwindowpos(hPlanszy,hwnd_top, 894 | 0,0, 895 | wymiaryokna.right-100, wymiaryokna.bottom, 896 | swp_nomove or swp_noownerzorder); 897 | setwindowpos(hSkala,hwnd_top, 898 | 1,wymiaryokna.bottom -50, 899 | 0,0, 900 | swp_nosize or swp_noownerzorder); 901 | setwindowpos(hWar,hwnd_top, 902 | 1,wymiaryokna.bottom -80, 903 | 0,0, 904 | swp_nosize or swp_noownerzorder); 905 | setscrollrange(hPlanszy,sb_horz,0,255-szerplanszy+1,true); 906 | setscrollrange(hPlanszy,sb_vert,0,255-wysplanszy+1,true); 907 | if wysplanszy > $FF then wp:=0 908 | else if wp > $FF - wysplanszy then wp:= $FF -wysplanszy+1; 909 | if szerplanszy > $FF then kp:=0 910 | else if kp > $FF - szerplanszy then kp:= $FF -szerplanszy+1; 911 | sendmessage(hOkna,WM_PAINT,0,0); 912 | end; 913 | WM_COMMAND: 914 | begin 915 | if lpar = hSkala then ////////////////////SKALA 916 | begin 917 | i:= 64 shr sendmessage(hSkala,cb_getcursel,0,0); 918 | if skala <> i then 919 | begin 920 | skala:= i; 921 | szerPlanszy:= (wymiaryokna.right-100-xscroll) div skala; 922 | wysPlanszy:= (wymiaryokna.bottom-yscroll) div skala; 923 | setscrollrange(hPlanszy,sb_horz,0,255-szerplanszy+1,true); 924 | setscrollrange(hPlanszy,sb_vert,0,255-wysplanszy+1,true); 925 | if wysplanszy > $FF then wp:=0 926 | else if wp > $FF - wysplanszy then wp:= $FF -wysplanszy+1; 927 | if szerplanszy > $FF then kp:=0 928 | else if kp > $FF - szerplanszy then kp:= $FF -szerplanszy+1; 929 | for i:= $00 to $0E do 930 | loadtex(i,''); 931 | 932 | invalidaterect(hPlanszy,lprect(0),true); 933 | end; 934 | end 935 | 936 | else if lpar =hWar then /////////////WARSTWY 937 | begin 938 | i:=sendmessage(hWar,cb_getcursel,0,0); 939 | if i <> war then 940 | begin 941 | war:= i; 942 | sendmessage(hPlanszy,WM_PAINT,0,0); 943 | sendmessage(hOkna,WM_PAINT,0,0); 944 | end; 945 | end 946 | 947 | else if lpar =hPrzycisk then ///////////'RYSUJ' BUTTON 948 | begin 949 | if IsDlgButtonChecked(hOkna,150) = bst_checked then 950 | begin 951 | checkdlgbutton(hOkna,150,bst_unchecked); 952 | rysuj:=false; 953 | end 954 | else 955 | begin 956 | checkdlgbutton(hOkna,150,bst_checked); 957 | rysuj:=true; 958 | end; 959 | end 960 | 961 | else 962 | case loword(wpar) of 963 | 101: ///////////////////////MAP READ 964 | begin 965 | PrepOpen(pchar('Pliki map'#00'*.map'#00),'map'); 966 | if GetOpenFileName(@otworz) then 967 | frOpen(pchar(FilePath),$0F); 968 | AttMapRead(0,2,1); 969 | end; 970 | 102: //////////////ATT READ 971 | begin 972 | PrepOpen(pchar('Pliki att'#00'*.att'#00),'att'); 973 | if getopenfilename(@otworz) then 974 | frOpen(pchar(FilePath),$10); 975 | AttMapRead(3,3,3); 976 | end; 977 | 103: /////////////////LIGHT READ 978 | begin 979 | PrepOpen(pchar('Pliki bmp'#00'*.bmp'#00),'bmp'); 980 | if getopenfilename(@otworz) then 981 | frOpen(pchar(FilePath),$12); 982 | LightRead(4,6); 983 | end; 984 | 104: ////////////////HEIGHT READ 985 | begin 986 | PrepOpen(pchar('Pliki ozb'#00'*.ozb'#00),'ozb'); 987 | if getopenfilename(@otworz) then 988 | frOpen(pchar(FilePath),$11); 989 | HeightRead(7); 990 | 991 | end; 992 | 112..126: ///////////////SINGLE TEX READ 993 | begin 994 | PrepOpen(pchar('Pliki bmp'#00'*.bmp'#00),'bmp'); 995 | if getopenfilename(@otworz) then 996 | begin 997 | LoadTex(loword(wpar)-112,pchar(FilePath)); 998 | sendmessage(hSelTex,WM_PAINT,0,0); 999 | sendmessage(hPlanszy,WM_PAINT,0,0); 1000 | end; 1001 | end; 1002 | 127: ///////////////ALL TEX READ 1003 | begin 1004 | folder.hwndOwner:= hOkna; 1005 | if SHGetPathFromIdList(SHBrowseForFolder(@folder),WorldPath) then 1006 | begin 1007 | for i:=$0 to $0D do 1008 | begin 1009 | strcopy(FilePath,WorldPath); 1010 | strcat(FilePath,nazwy[i]); 1011 | LoadTex(i,FilePath); 1012 | end; 1013 | sendmessage(hSelTex,WM_PAINT,0,0); 1014 | sendmessage(hPlanszy,WM_PAINT,0,0); 1015 | end; 1016 | 1017 | end; 1018 | 105: //////////////ALL READ 1019 | begin 1020 | folder.hwndOwner:= hOkna; 1021 | if SHGetPathFromIdList(SHBrowseForFolder(@folder),WorldPath) then 1022 | begin 1023 | strcopy(FilePath,WorldPath); 1024 | strcat(FilePath,'\*.map'); 1025 | FindFirstFile(FilePath,znaleziony); //*.MAP 1026 | strcopy(FilePath,WorldPath); 1027 | strcat(FilePath,'\'); 1028 | strcat(FilePath,znaleziony.cfilename); 1029 | frOpen(FilePath,$0F); 1030 | AttMapRead(0,2,1); 1031 | 1032 | strcopy(FilePath,WorldPath); 1033 | strcat(FilePath,'\*.att'); 1034 | FindFirstFile(FilePath,znaleziony); //*.ATT 1035 | strcopy(FilePath,WorldPath); 1036 | strcat(FilePath,'\'); 1037 | strcat(FilePath,znaleziony.cfilename); 1038 | frOpen(FilePath,$10); 1039 | AttMapRead(3,3,3); 1040 | 1041 | strcopy(FilePath,WorldPath); 1042 | strcat(FilePath,'\Terrainlight.bmp'); //TERRAINLIGHT.BMP 1043 | frOpen(FilePath,$12); 1044 | LightRead(4,6); 1045 | 1046 | strcopy(FilePath,WorldPath); 1047 | strcat(FilePath,nazwy[$11]); //TERRAINHEIGHT.OZB 1048 | frOpen(FilePath,$11); 1049 | HeightRead(7); 1050 | 1051 | for i:=$0 to $0D do 1052 | begin 1053 | strcopy(FilePath,WorldPath); 1054 | strcat(FilePath,nazwy[i]); //TEKSTURY 1055 | LoadTex(i,FilePath); 1056 | end; 1057 | sendmessage(hSelTex,WM_PAINT,0,0); 1058 | sendmessage(hPlanszy,WM_PAINT,0,0); 1059 | end; 1060 | end; 1061 | 106: //////////////MAP SAVE 1062 | begin 1063 | PrepSave(pchar('Pliki map'#00'*.map'#00),'map'); 1064 | if getsavefilename(@zapisz) then 1065 | AttMapSave(0,2,filepath,#00); 1066 | end; 1067 | 107: //////////////ATT SAVE 1068 | begin 1069 | PrepSave(pchar('Pliki att'#00'*.att'#00),'att'); 1070 | if getsavefilename(@zapisz) then 1071 | AttMapSave(3,3,filepath,#00#255#255); 1072 | end; 1073 | 108: /////////////LIGHT SAVE 1074 | begin 1075 | PrepSave(pchar('Pliki bmp'#00'*.bmp'#00),'bmp'); 1076 | if getsavefilename(@zapisz) then 1077 | BmpWrite(4,6,filepath); 1078 | end; 1079 | 109: /////////////HEIGT SAVE 1080 | begin 1081 | PrepSave(pchar('Pliki ozb'#00'*.ozb'#00),'ozb'); 1082 | if getsavefilename(@zapisz) then 1083 | BmpWrite(7,7,filepath); 1084 | end; 1085 | 110: /////////////ALL SAVE 1086 | begin 1087 | folder.hwndOwner:= hOkna; 1088 | if SHGetPathFromIdList(SHBrowseForFolder(@folder),WorldPath) then 1089 | begin 1090 | strcopy(FilePath,WorldPath); 1091 | strcat(FilePath,nazwy[$0F]); //MAP 1092 | AttMapSave(0,2,filepath,#00); 1093 | 1094 | strcopy(FilePath,WorldPath); 1095 | strcat(FilePath,nazwy[$10]); //ATT 1096 | AttMapSave(0,2,filepath,#00); 1097 | 1098 | strcopy(FilePath,WorldPath); 1099 | strcat(FilePath,nazwy[$12]); //LIGHT 1100 | BmpWrite(4,6,filepath); 1101 | 1102 | strcopy(FilePath,WorldPath); 1103 | strcat(FilePath,nazwy[$11]); //HEIGHT 1104 | BmpWrite(7,7,filepath); 1105 | end; 1106 | end; 1107 | 128: ///////////SESSION LOAD 1108 | begin 1109 | for i:= 0 to 14 do 1110 | loadtex(i,''); 1111 | frOpen('',$0F); 1112 | AttMapRead(0,2,1); 1113 | frOpen('',$10); 1114 | AttMapRead(3,3,3); 1115 | frOpen('',$11); 1116 | HeightRead(7); 1117 | frOpen('',$12); 1118 | LightRead(4,6); 1119 | sendmessage(hSelTex,WM_PAINT,0,0); 1120 | end; 1121 | 111: //////////EXIT 1122 | begin 1123 | postquitmessage(0); 1124 | end; 1125 | end; 1126 | end; 1127 | else funkcjeokna := DefWindowProc(hOkna, uMsg, wPar, lPar); 1128 | end; 1129 | end; 1130 | 1131 | BEGIN 1132 | with Wnd do 1133 | begin 1134 | lpfnWndProc := @FunkcjeOkna; 1135 | hInstance := hInstance; 1136 | lpszClassName := 'Glowne'; 1137 | hbrBackground := COLOR_WINDOW; 1138 | hcursor:= loadcursor(0,idc_arrow); 1139 | end; 1140 | 1141 | with plansza do 1142 | begin 1143 | style:= cs_bytealignclient; 1144 | lpfnWndProc:= @FunkcjePlanszy; 1145 | hInstance:= hInstance; 1146 | lpszClassName:= 'Plansza'; 1147 | hbrBackground:= color_window; 1148 | hcursor:= loadcursor(0,idc_arrow); 1149 | end; 1150 | 1151 | with seltex do 1152 | begin 1153 | style:= cs_bytealignclient; 1154 | lpfnWndProc:= @FunkcjeSelTex; 1155 | hInstance:= hInstance; 1156 | lpszClassName:= 'Seltex'; 1157 | hbrBackground:= color_window; 1158 | hcursor:= loadcursor(0,idc_arrow); 1159 | end; 1160 | 1161 | RegisterClass(Wnd); // zarejestruj nowa klase 1162 | RegisterClass(plansza); 1163 | RegisterClass(seltex); 1164 | 1165 | // stworz forme... 1166 | BelkaMenu:= Loadmenu(hinstance,makeintresource(200)); 1167 | hOkna:= CreateWindow('glowne', 'MuMapEdit Alpha 8', 1168 | WS_VISIBLE or WS_TILEDWINDOW, 1169 | 20, 20, cw_usedefault, cw_usedefault, 1170 | 0, BelkaMenu, hInstance, NIL); 1171 | 1172 | tekstury[$0].substc:= $006400; 1173 | tekstury[$1].substc:= $00AF00; 1174 | tekstury[$2].substc:= $004B96; 1175 | tekstury[$3].substc:= $317DC8; 1176 | tekstury[$4].substc:= $64AFFA; 1177 | tekstury[$5].substc:= $FF0000; 1178 | tekstury[$6].substc:= $00FFFF; 1179 | tekstury[$7].substc:= $5E5E5E; 1180 | tekstury[$8].substc:= $757575; 1181 | tekstury[$9].substc:= $8C8C8C; 1182 | tekstury[$A].substc:= $A3A3A3; 1183 | tekstury[$B].substc:= $BABABA; 1184 | tekstury[$C].substc:= $D1D1D1; 1185 | tekstury[$D].substc:= $E8E8E8; 1186 | tekstury[$E].substc:= $000000; 1187 | 1188 | while GetMessage(msg, 0, 0, 0) do 1189 | begin 1190 | TranslateMessage(msg); 1191 | DispatchMessage(msg); 1192 | end; 1193 | END. 1194 | -------------------------------------------------------------------------------- /MuBmd/0.74_fixed/Item.txt: -------------------------------------------------------------------------------- 1 | // ------------------ 2 | // BMD exported by 3 | // KaiN client toolz 4 | // ------------------ 5 | 6 | 0 7 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 8 | 0 Kris 0 6 1 2 6 9 0 0 0 50 0 1 4 4 0 0 0 1 1 1 1 0 0 0 0 9 | 1 Short Sword 0 3 1 3 3 5 0 0 0 20 0 1 6 0 0 0 0 1 1 1 1 0 0 0 0 10 | 2 Rapier 0 9 1 3 9 10 0 0 0 40 0 2 5 4 0 0 0 0 1 1 1 0 0 0 0 11 | 3 Katana 0 16 1 3 16 18 0 0 0 35 0 2 8 4 0 0 0 0 1 0 1 0 0 0 0 12 | 4 Sword of Assassin 0 12 1 3 12 20 0 0 0 30 0 2 6 4 0 0 0 0 1 0 1 0 0 0 0 13 | 5 Blade 0 36 1 3 36 40 0 0 0 30 0 2 8 5 0 0 0 1 1 1 1 0 0 0 0 14 | 6 Gladius 0 20 1 3 20 24 0 0 0 20 0 3 11 0 0 0 0 0 1 1 1 0 0 0 0 15 | 7 Falchion 0 24 1 3 24 30 0 0 0 25 0 3 12 0 0 0 0 0 1 0 1 0 0 0 0 16 | 8 Serpent Sword 0 28 1 3 28 36 0 0 0 20 0 2 13 0 0 0 0 0 1 0 1 0 0 0 0 17 | 9 Sword of Salamander 1 32 2 3 32 52 0 0 0 30 0 3 13 0 0 0 0 0 1 0 1 0 0 0 0 18 | 10 Light Saber 1 40 2 4 40 60 0 0 0 25 0 4 8 6 0 0 0 0 1 1 1 0 0 0 0 19 | 11 Legendary Sword 1 44 2 3 44 69 0 0 0 20 0 3 12 0 0 0 0 0 1 0 1 0 0 0 0 20 | 12 Heliacal Sword 1 56 2 3 56 86 0 0 0 25 0 4 14 0 0 0 0 0 1 0 1 0 0 0 0 21 | 13 Double Blade 0 48 1 3 48 52 0 0 0 30 0 4 7 7 0 0 0 0 1 1 1 0 0 0 0 22 | 14 Lightning Sword 0 59 1 3 59 64 0 0 0 30 0 3 9 5 0 0 0 0 1 1 1 0 0 0 0 23 | 15 Giant Sword 1 52 2 3 52 84 0 0 0 20 0 3 14 0 0 0 0 0 1 0 1 0 0 0 0 24 | end 25 | 26 | 1 27 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 28 | 0 Small Axe 0 1 1 3 1 6 0 0 0 20 0 1 5 0 0 0 0 1 1 1 1 0 0 0 0 29 | 1 Hand Axe 0 4 1 3 4 9 0 0 0 30 0 1 7 0 0 0 0 1 1 1 1 0 0 0 0 30 | 2 Double Axe 0 14 1 3 14 20 0 0 0 20 0 1 9 0 0 0 0 0 1 0 1 0 0 0 0 31 | 3 Tomahawk 0 18 1 3 18 24 0 0 0 30 0 2 10 0 0 0 0 0 1 0 1 0 0 0 0 32 | 4 Elven Axe 0 26 1 3 26 36 0 0 0 40 0 2 5 7 0 0 0 1 0 1 1 0 0 0 0 33 | 5 Battle Axe 1 30 2 3 30 50 0 0 0 20 0 2 12 0 0 0 0 0 1 1 1 0 0 0 0 34 | 6 Nikea Axe 1 34 2 3 34 56 0 0 0 30 0 2 13 0 0 0 0 0 1 1 1 0 0 0 0 35 | 7 Larkan Axe 1 44 2 3 44 72 0 0 0 25 0 3 14 0 0 0 0 0 1 0 1 0 0 0 0 36 | 8 Crescent Axe 1 53 2 3 53 82 0 0 0 30 0 3 10 4 0 0 0 1 1 0 1 0 0 0 0 37 | 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 | 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 | 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 | 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 | 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 | 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 | 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 | end 45 | 46 | 2 47 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 48 | 0 Mace 0 7 1 3 7 14 0 0 0 15 0 1 10 0 0 0 0 0 1 0 1 0 0 0 0 49 | 1 Morning Star 0 13 1 3 13 26 0 0 0 15 0 1 10 0 0 0 0 0 1 0 1 0 0 0 0 50 | 2 Flail 0 22 1 3 22 44 0 0 0 15 0 2 8 5 0 0 0 0 1 0 1 0 0 0 0 51 | 3 Warhammer 1 38 2 3 38 74 0 0 0 15 0 2 15 0 0 0 0 0 1 0 1 0 0 0 0 52 | 4 Crystal Morning Star 1 66 2 3 66 90 0 0 0 30 0 3 13 0 0 0 0 1 1 1 1 0 0 0 0 53 | 5 Crystal Sword 1 72 2 4 72 110 0 0 0 40 0 3 13 7 0 0 0 1 1 1 1 0 0 0 0 54 | 6 Chaos Dragon Axe 1 75 2 4 75 120 0 0 0 35 0 3 14 5 0 0 0 0 1 0 1 0 0 0 0 55 | 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56 | 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 | 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 58 | 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 | 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 | 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 | 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 62 | 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 63 | 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 | end 65 | 66 | 3 67 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 68 | 0 Light Spear 1 42 2 4 42 54 0 0 0 25 0 2 6 7 0 0 0 0 1 1 1 0 0 0 0 69 | 1 Spear 1 23 2 4 23 34 0 0 0 30 0 4 7 5 0 0 0 0 1 1 1 0 0 0 0 70 | 2 Dragon Lance 1 15 2 4 15 28 0 0 0 30 0 3 7 5 0 0 0 0 1 1 1 0 0 0 0 71 | 3 Great Trident 1 29 2 4 29 40 0 0 0 25 0 3 9 3 0 0 0 0 1 1 1 0 0 0 0 72 | 4 Serpent Spear 1 46 2 4 46 64 0 0 0 20 0 2 9 3 0 0 0 0 1 1 1 0 0 0 0 73 | 5 Double Poleaxe 1 13 2 4 13 25 0 0 0 30 0 2 7 5 0 0 0 0 1 1 1 0 0 0 0 74 | 6 Halberd 1 19 2 4 19 32 0 0 0 30 0 3 7 5 0 0 0 0 1 1 1 0 0 0 0 75 | 7 Berdysh 1 37 2 4 37 46 0 0 0 30 0 4 8 5 0 0 0 0 1 1 1 0 0 0 0 76 | 8 Great Scythe 1 54 2 4 54 78 0 0 0 20 0 2 9 5 0 0 0 0 1 1 1 0 0 0 0 77 | 9 Bill of Balrog 1 63 2 4 63 90 0 0 0 20 0 2 8 5 0 0 0 0 1 1 1 0 0 0 0 78 | 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 79 | 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80 | 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 | 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 | 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83 | 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 84 | end 85 | 86 | 4 87 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 88 | 0 Short Bow 1 2 2 3 2 5 0 0 0 30 0 2 2 8 0 0 0 0 0 1 0 0 0 0 0 89 | 1 Bow 1 8 2 3 8 15 0 0 0 30 0 2 3 9 0 0 0 0 0 1 0 0 0 0 0 90 | 2 Elven Bow 1 16 2 3 16 24 0 0 0 30 0 3 3 9 0 0 0 0 0 1 0 0 0 0 0 91 | 3 Battle Bow 1 26 2 3 26 35 0 0 0 30 0 2 3 9 0 0 0 0 0 1 0 0 0 0 0 92 | 4 Tiger Bow 1 40 2 4 40 50 0 0 0 30 0 2 3 10 0 0 0 0 0 1 0 0 0 0 0 93 | 5 Silver Bow 1 56 2 4 56 68 0 0 0 40 0 2 3 10 0 0 0 0 0 1 0 0 0 0 0 94 | 6 Chaos Nature Bow 1 75 2 4 75 94 0 0 0 35 0 2 4 15 0 0 0 0 0 1 0 0 0 0 0 95 | 7 Bolt 0 0 1 2 0 0 0 0 0 0 0 250 0 0 0 0 0 0 0 1 0 0 0 0 0 96 | 8 Crossbow 1 4 2 2 4 8 0 0 0 40 0 2 2 9 0 0 0 0 0 1 0 0 0 0 0 97 | 9 Golden Crossbow 1 12 2 2 12 17 0 0 0 40 0 3 3 9 0 0 0 0 0 1 0 0 0 0 0 98 | 10 Arquebus 1 20 2 2 20 26 0 0 0 40 0 2 3 9 0 0 0 0 0 1 0 0 0 0 0 99 | 11 Crossbow of Light 1 32 2 3 32 40 0 0 0 40 0 3 3 9 0 0 0 0 0 1 0 0 0 0 0 100 | 12 Serpent Crossbow 1 48 2 3 48 56 0 0 0 40 0 2 3 10 0 0 0 0 0 1 0 0 0 0 0 101 | 13 Blue Wing Crossbow 1 68 2 3 68 80 0 0 0 40 0 2 4 11 0 0 0 0 0 1 0 0 0 0 0 102 | 14 Aqua Gold Crossbow 1 72 2 3 72 90 0 0 0 30 0 2 5 13 0 0 0 0 0 1 0 0 0 0 0 103 | 15 Arrows 0 0 1 2 0 0 0 0 0 0 0 250 0 0 0 0 0 0 0 1 0 0 0 0 0 104 | end 105 | 106 | 5 107 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 108 | 0 Skull Staff 0 6 1 3 6 8 0 0 0 20 0 2 4 0 0 0 0 1 0 0 1 0 0 0 0 109 | 1 Angelic Staff 1 18 2 3 18 20 0 0 0 20 0 3 5 0 0 0 0 1 0 0 1 0 0 0 0 110 | 2 Serpent Staff 1 30 2 3 30 32 0 0 0 20 0 3 5 0 0 0 0 1 0 0 1 0 0 0 0 111 | 3 Thunder Staff 1 42 2 4 42 44 0 0 0 20 0 4 4 1 0 0 0 1 0 0 1 0 0 0 0 112 | 4 Staff of Gorgon 1 52 2 4 52 54 0 0 0 20 0 4 5 0 0 0 0 1 0 0 1 0 0 0 0 113 | 5 Legendary Staff 0 59 1 4 59 62 0 0 0 20 0 4 5 0 0 0 0 1 0 0 1 0 0 0 0 114 | 6 Staff of Resurrection 0 70 1 4 70 78 0 0 0 20 0 4 6 1 0 0 0 1 0 0 1 0 0 0 0 115 | 7 Chaos Lightning Staff 1 75 2 4 75 80 0 0 0 20 0 4 6 1 0 0 0 1 0 0 1 0 0 0 0 116 | 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 117 | 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 118 | 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 119 | 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 120 | 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 121 | 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 122 | 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 123 | 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 124 | end 125 | 126 | 6 127 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 128 | 0 Light Plate Shield 0 3 2 2 0 0 3 1 0 0 0 2 7 0 0 0 0 1 1 1 1 0 0 0 0 129 | 1 Horn Shield 0 9 2 2 0 0 9 3 0 0 0 2 10 0 0 0 0 0 1 0 1 0 0 0 0 130 | 2 Kite Shield 0 12 2 2 0 0 12 4 0 0 0 2 11 0 0 0 0 0 1 0 1 0 0 0 0 131 | 3 Elven Shield 0 21 2 2 0 0 21 8 0 0 0 2 3 10 0 0 0 0 0 1 1 0 0 0 0 132 | 4 Buckler 0 6 2 2 0 0 6 2 0 0 0 2 8 0 0 0 0 1 1 1 1 0 0 0 0 133 | 5 Shield of Dragon Slayer 0 35 2 2 0 0 35 10 0 0 0 3 10 4 0 0 0 0 1 0 1 0 0 0 0 134 | 6 Skull Shield 0 15 2 2 0 0 15 5 0 0 0 2 11 0 0 0 0 1 1 1 1 0 0 0 0 135 | 7 Spiked Shield 0 30 2 2 0 0 30 9 0 0 0 2 13 0 0 0 0 0 1 0 1 0 0 0 0 136 | 8 Tower Shield 0 40 2 2 0 0 40 11 0 0 0 3 13 0 0 0 0 0 1 1 1 0 0 0 0 137 | 9 Plate Shield 0 25 2 2 0 0 25 8 0 0 0 3 12 0 0 0 0 0 1 0 1 0 0 0 0 138 | 10 Large Round Shield 0 18 2 2 0 0 18 6 0 0 0 4 12 0 0 0 0 0 1 0 1 0 0 0 0 139 | 11 Serpent Shield 0 45 2 2 0 0 45 12 0 0 0 3 13 0 0 0 0 0 1 1 1 0 0 0 0 140 | 12 Bronze Shield 0 54 2 2 0 0 54 13 0 0 0 3 14 0 0 0 0 0 1 0 1 0 0 0 0 141 | 13 Dragon Shield 0 60 2 2 0 0 60 14 0 0 0 3 12 4 0 0 0 0 1 0 1 0 0 0 0 142 | 14 Legendary Shield 0 48 2 3 0 0 48 7 0 0 0 3 10 3 0 0 0 1 0 1 1 0 0 0 0 143 | 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 144 | end 145 | 146 | 7 147 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 148 | 0 Bronze Helm 0 16 2 2 0 0 0 9 0 0 0 4 8 2 0 0 0 0 1 0 0 0 0 0 0 149 | 1 Dragon Helm 0 57 2 2 0 0 0 24 0 0 0 3 12 3 0 0 0 0 1 0 0 0 0 0 0 150 | 2 Pad Helm 0 5 2 2 0 0 0 4 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 151 | 3 Legendary Helm 0 50 2 2 0 0 0 18 0 0 0 3 3 0 0 0 0 1 0 0 0 0 0 0 0 152 | 4 Bone Helm 0 18 2 2 0 0 0 9 0 0 0 0 3 0 0 0 0 1 0 0 0 0 0 0 0 153 | 5 Leather Helm 0 6 2 2 0 0 0 5 0 0 0 2 8 0 0 0 0 0 1 0 0 0 0 0 0 154 | 6 Scale Helm 0 26 2 2 0 0 0 12 0 0 0 3 11 0 0 0 0 0 1 0 0 0 0 0 0 155 | 7 Sphinx Helm 0 32 2 2 0 0 0 13 0 0 0 4 3 0 0 0 0 1 0 0 0 0 0 0 0 156 | 8 Brass Helm 0 36 2 2 0 0 0 17 0 0 0 2 10 3 0 0 0 0 1 0 0 0 0 0 0 157 | 9 Plate Helm 0 46 2 2 0 0 0 20 0 0 0 2 13 0 0 0 0 0 1 0 0 0 0 0 0 158 | 10 Vine Helm 0 6 2 2 0 0 0 4 0 0 0 3 3 6 0 0 0 0 0 1 0 0 0 0 0 159 | 11 Silk Helm 0 16 2 2 0 0 0 8 0 0 0 3 3 7 0 0 0 0 0 1 0 0 0 0 0 160 | 12 Helm of Wind 0 28 2 2 0 0 0 12 0 0 0 3 3 8 0 0 0 0 0 1 0 0 0 0 0 161 | 13 Helm of Spirit 0 40 2 2 0 0 0 16 0 0 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 162 | 14 Helm of Guardian 0 53 2 2 0 0 0 20 0 0 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 163 | 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 164 | end 165 | 166 | 8 167 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 168 | 0 Bronze Armor 0 18 2 2 0 0 0 14 0 0 0 4 8 2 0 0 0 0 1 0 1 0 0 0 0 169 | 1 Dragon Armor 0 59 2 3 0 0 0 37 0 0 0 3 12 3 0 0 0 0 1 0 1 0 0 0 0 170 | 2 Pad Armor 0 10 2 2 0 0 0 7 0 0 0 2 3 0 0 0 0 1 0 0 1 0 0 0 0 171 | 3 Legendary Armor 0 56 2 2 0 0 0 22 0 0 0 3 4 0 0 0 0 1 0 0 1 0 0 0 0 172 | 4 Bone Armor 0 22 2 2 0 0 0 13 0 0 0 2 4 0 0 0 0 1 0 0 1 0 0 0 0 173 | 5 Leather Armor 0 10 2 3 0 0 0 10 0 0 0 2 8 0 0 0 0 0 1 0 1 0 0 0 0 174 | 6 Scale Armor 0 28 2 2 0 0 0 18 0 0 0 3 11 0 0 0 0 0 1 0 1 0 0 0 0 175 | 7 Sphinx Armor 0 38 2 3 0 0 0 17 0 0 0 4 4 0 0 0 0 1 0 0 1 0 0 0 0 176 | 8 Brass Armor 0 38 2 2 0 0 0 22 0 0 0 2 10 3 0 0 0 0 1 0 1 0 0 0 0 177 | 9 Plate Armor 0 48 2 2 0 0 0 30 0 0 0 2 13 0 0 0 0 0 1 0 1 0 0 0 0 178 | 10 Vine Armor 0 10 2 2 0 0 0 8 0 0 0 3 3 6 0 0 0 0 0 1 0 0 0 0 0 179 | 11 Silk Armor 0 20 2 2 0 0 0 12 0 0 0 3 3 7 0 0 0 0 0 1 0 0 0 0 0 180 | 12 Armor of Wind 0 32 2 2 0 0 0 16 0 0 0 3 3 8 0 0 0 0 0 1 0 0 0 0 0 181 | 13 Armor of Spirit 0 44 2 2 0 0 0 21 0 0 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 182 | 14 Armor of Guardian 0 57 2 3 0 0 0 26 0 0 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 183 | 15 Armor of Storm crow 0 76 2 3 0 0 0 42 0 0 0 3 15 7 0 0 0 0 0 0 1 0 0 0 0 184 | end 185 | 186 | 9 187 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 188 | 0 Bronze Pants 0 15 2 2 0 0 0 10 0 0 0 4 8 2 0 0 0 0 1 0 1 0 0 0 0 189 | 1 Dragon Pants 0 55 2 2 0 0 0 26 0 0 0 3 12 3 0 0 0 0 1 0 1 0 0 0 0 190 | 2 Pad Pants 0 8 2 2 0 0 0 5 0 0 0 1 3 0 0 0 0 1 0 0 1 0 0 0 0 191 | 3 Legendary Pants 0 53 2 2 0 0 0 20 0 0 0 3 4 0 0 0 0 1 0 0 1 0 0 0 0 192 | 4 Bone Pants 0 20 2 2 0 0 0 10 0 0 0 0 4 0 0 0 0 1 0 0 1 0 0 0 0 193 | 5 Leather Pants 0 8 2 2 0 0 0 7 0 0 0 2 8 0 0 0 0 0 1 0 1 0 0 0 0 194 | 6 Scale Pants 0 25 2 2 0 0 0 14 0 0 0 3 11 0 0 0 0 0 1 0 1 0 0 0 0 195 | 7 Sphinx Pants 0 34 2 2 0 0 0 15 0 0 0 4 4 0 0 0 0 1 0 0 1 0 0 0 0 196 | 8 Brass Pants 0 35 2 2 0 0 0 18 0 0 0 2 10 3 0 0 0 0 1 0 1 0 0 0 0 197 | 9 Plate Pants 0 45 2 2 0 0 0 22 0 0 0 2 13 0 0 0 0 0 1 0 1 0 0 0 0 198 | 10 Vine Pants 0 8 2 2 0 0 0 6 0 0 0 3 3 6 0 0 0 0 0 1 0 0 0 0 0 199 | 11 Silk Pants 0 18 2 2 0 0 0 10 0 0 0 3 3 7 0 0 0 0 0 1 0 0 0 0 0 200 | 12 Pants of Wind 0 30 2 2 0 0 0 14 0 0 0 3 3 8 0 0 0 0 0 1 0 0 0 0 0 201 | 13 Pants of Spirit 0 42 2 2 0 0 0 18 0 0 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 202 | 14 Pants of Guardian 0 54 2 2 0 0 0 22 0 0 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 203 | 15 Pants of Storm crow 0 74 2 2 0 0 0 32 0 0 0 3 15 7 0 0 0 0 0 0 1 0 0 0 0 204 | end 205 | 206 | 10 207 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 208 | 0 Bronze Gauntlets 0 12 2 2 0 0 0 4 0 4 0 4 8 2 0 0 0 0 1 0 1 0 0 0 0 209 | 1 Dragon Gauntlets 0 52 2 2 0 0 0 14 0 6 0 3 12 3 0 0 0 0 1 0 1 0 0 0 0 210 | 2 Pad Gloves 0 3 2 2 0 0 0 2 0 0 0 1 2 0 0 0 0 1 0 0 1 0 0 0 0 211 | 3 Legendary Gauntlets 0 44 2 2 0 0 0 11 0 0 0 3 2 0 0 0 0 1 0 0 1 0 0 0 0 212 | 4 Bone Gloves 0 14 2 2 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 1 0 0 0 0 213 | 5 Leather Gloves 0 4 2 2 0 0 0 2 0 8 0 2 8 0 0 0 0 0 1 0 1 0 0 0 0 214 | 6 Scale Gauntlets 0 22 2 2 0 0 0 7 0 10 0 3 11 0 0 0 0 0 1 0 1 0 0 0 0 215 | 7 Sphinx Gauntlets 0 28 2 2 0 0 0 8 0 0 0 4 2 0 0 0 0 1 0 0 1 0 0 0 0 216 | 8 Brass Gauntlets 0 32 2 2 0 0 0 9 0 8 0 2 10 3 0 0 0 0 1 0 1 0 0 0 0 217 | 9 Plate Gauntlets 0 42 2 2 0 0 0 12 0 4 0 2 13 0 0 0 0 0 1 0 1 0 0 0 0 218 | 10 Vine Gloves 0 4 2 2 0 0 0 2 0 4 0 3 3 6 0 0 0 0 0 1 0 0 0 0 0 219 | 11 Silk Gloves 0 14 2 2 0 0 0 4 0 8 0 3 3 7 0 0 0 0 0 1 0 0 0 0 0 220 | 12 Gauntlets of Wind 0 26 2 2 0 0 0 6 0 10 0 3 3 8 0 0 0 0 0 1 0 0 0 0 0 221 | 13 Gauntlets of Spirit 0 38 2 2 0 0 0 9 0 4 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 222 | 14 Gauntlets of Guardian 0 50 2 2 0 0 0 12 0 6 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 223 | 15 Gauntlets of Storm crow 0 70 2 2 0 0 0 18 0 6 0 3 15 7 0 0 0 0 0 0 1 0 0 0 0 224 | end 225 | 226 | 11 227 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 228 | 0 Bronze Boots 0 12 2 2 0 0 0 4 0 0 10 4 8 2 0 0 0 0 1 0 1 0 0 0 0 229 | 1 Dragon Boots 0 54 2 2 0 0 0 15 0 0 2 3 12 3 0 0 0 0 1 0 1 0 0 0 0 230 | 2 Pad Boots 0 4 2 2 0 0 0 3 0 0 10 1 2 0 0 0 0 1 0 0 1 0 0 0 0 231 | 3 Legendary Boots 0 46 2 2 0 0 0 12 0 0 0 3 3 0 0 0 0 1 0 0 1 0 0 0 0 232 | 4 Bone Boots 0 16 2 2 0 0 0 6 0 0 6 0 3 0 0 0 0 1 0 0 1 0 0 0 0 233 | 5 Leather Boots 0 5 2 2 0 0 0 2 0 0 12 2 8 0 0 0 0 0 1 0 1 0 0 0 0 234 | 6 Scale Boots 0 22 2 2 0 0 0 8 0 0 8 3 11 0 0 0 0 0 1 0 1 0 0 0 0 235 | 7 Sphinx Boots 0 30 2 2 0 0 0 9 0 0 8 4 3 0 0 0 0 1 0 0 1 0 0 0 0 236 | 8 Brass Boots 0 32 2 2 0 0 0 10 0 0 6 2 10 3 0 0 0 0 1 0 1 0 0 0 0 237 | 9 Plate Boots 0 42 2 2 0 0 0 12 0 0 4 2 13 0 0 0 0 0 1 0 1 0 0 0 0 238 | 10 Vine Boots 0 5 2 2 0 0 0 2 0 0 0 3 3 6 0 0 0 0 0 1 0 0 0 0 0 239 | 11 Silk Boots 0 15 2 2 0 0 0 4 0 0 0 3 3 7 0 0 0 0 0 1 0 0 0 0 0 240 | 12 Boots of Wind 0 27 2 2 0 0 0 7 0 0 0 3 3 8 0 0 0 0 0 1 0 0 0 0 0 241 | 13 Boots of Spirit 0 40 2 2 0 0 0 10 0 0 0 3 4 8 0 0 0 0 0 1 0 0 0 0 0 242 | 14 Boots of Guardian 0 52 2 2 0 0 0 13 0 0 0 3 4 9 0 0 0 0 0 1 0 0 0 0 0 243 | 15 Boots of Storm crow 0 72 2 2 0 0 0 20 0 0 2 3 15 7 0 0 0 0 0 0 1 0 0 0 0 244 | end 245 | 246 | 12 247 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 248 | 0 Elven Wings 0 100 3 2 0 0 0 10 0 0 0 0 0 0 0 180 0 0 0 1 0 0 0 0 0 249 | 1 Angel Wings 0 100 5 3 0 0 0 10 0 0 0 0 0 0 0 180 0 1 0 0 1 0 0 0 0 250 | 2 Devil Wings 0 100 5 2 0 0 0 20 0 0 0 0 0 0 0 180 0 0 1 0 1 0 0 0 0 251 | 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 252 | 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 253 | 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 254 | 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 | 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 256 | 8 Healing Orb 0 8 1 1 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 1 0 0 0 0 0 257 | 9 Orb of Greater Defense 0 13 1 1 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 1 0 0 0 0 0 258 | 10 Orb of Greater Damage 0 18 1 1 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 1 0 0 0 0 0 259 | 11 Summoning Orb 0 3 1 1 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 1 0 0 0 0 0 260 | 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 261 | 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 262 | 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 263 | 15 Jewel of Chaos 0 12 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 264 | end 265 | 266 | 13 267 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 268 | 0 Angel 0 23 1 1 0 0 0 0 0 0 0 255 0 0 0 23 0 1 1 1 1 0 0 0 0 269 | 1 Imp 0 28 1 1 0 0 0 0 0 0 0 255 0 0 0 28 0 1 1 1 1 0 0 0 0 270 | 2 Unicorn 0 33 1 1 0 0 0 0 0 0 0 255 0 0 0 33 0 1 1 1 1 0 0 0 0 271 | 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 272 | 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 273 | 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 274 | 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 275 | 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 276 | 8 Ring of Ice 0 20 1 1 0 0 0 0 0 0 0 50 0 0 0 20 0 1 1 1 1 1 0 0 0 277 | 9 Ring of Poison 0 17 1 1 0 0 0 0 0 0 0 50 0 0 0 17 0 1 1 1 1 0 1 0 0 278 | 10 Ring of Transformation 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 279 | 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 280 | 12 Pendant of Lightning 0 21 1 1 0 0 0 0 0 0 0 50 0 0 0 21 0 1 1 1 1 0 0 1 0 281 | 13 Pendant of Fire 0 13 1 1 0 0 0 0 0 0 0 50 0 0 0 13 0 1 1 1 1 0 0 0 1 282 | 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 283 | 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 284 | end 285 | 286 | 14 287 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 288 | 0 Apple 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 289 | 1 Small Healing Potion 0 10 1 1 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 290 | 2 Healing Potion 0 25 1 1 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 291 | 3 Large Healing Potion 0 40 1 1 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 292 | 4 Small Mana Potion 0 10 1 1 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 293 | 5 Mana Potion 0 25 1 1 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 294 | 6 Large Mana Potion 0 40 1 1 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 295 | 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 296 | 8 Antidote 0 10 1 1 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 297 | 9 Ale 0 15 1 2 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 298 | 10 Town Portal Scroll 0 30 1 2 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 299 | 11 Box of Luck 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 300 | 12 Heart 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 301 | 13 Jewel of Bless 0 25 1 1 0 0 0 0 0 0 0 0 0 0 0 0 150 0 0 0 0 0 0 0 0 302 | 14 Jewel of Soul 0 30 1 1 0 0 0 0 0 0 0 0 0 0 0 0 150 0 0 0 0 0 0 0 0 303 | 15 Zen 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 304 | end 305 | 306 | 15 307 | // Idx Name Hands Lvl X Y DmgMin DmgMax DefRate Def unk10 att/swSpeed walkSpeed Dur reqSTR reqAGI reqENE reqLVL Value DW DK Elf MG resIce resPoison resLightning resFire 308 | 0 Scroll of Poison 0 30 1 2 30 45 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 309 | 1 Scroll of Meteorite 0 21 1 2 21 31 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 310 | 2 Scroll of Lightning 0 13 1 2 13 19 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 311 | 3 Scroll of Fire Ball 0 5 1 2 5 7 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 312 | 4 Scroll of Flame 0 35 1 2 35 52 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 313 | 5 Scroll of Teleport 0 17 1 2 17 25 0 0 0 0 0 0 0 0 10 0 0 1 0 0 0 0 0 0 0 314 | 6 Scroll of Ice 0 25 1 2 25 37 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 315 | 7 Scroll of Twister 0 40 1 2 40 60 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 316 | 8 Scroll of Evil Spirits 0 50 1 2 50 75 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 317 | 9 Scroll of Hell Fire 0 60 1 2 60 90 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 318 | 10 Scroll of Power Wave 0 9 1 2 9 13 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 319 | 11 Scroll of Aqua Beam 0 74 1 2 74 111 0 0 0 0 0 0 0 0 10 0 0 1 0 0 1 0 0 0 0 320 | 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 321 | 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 322 | 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 323 | 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 324 | end 325 | 326 | --------------------------------------------------------------------------------