Giter Club home page Giter Club logo

jw3gparser's Introduction

jw3gparser

Java解析《魔兽争霸3》游戏录像工具

魔兽争霸3是一款非常著名的即时战略游戏。相信很多人都听过sky、moon、grubby这些名字,还有塔魔infi、**的鬼王ted、刚猛的fly、飘逸的th000等选手。此外,还有DOTA、真三、澄海3C等著名的地图。

魔兽争霸的录像大家都知道,是用来回放的,文件后缀名是.w3g,保存在魔兽争霸下的REPLAY目录下。现在很多软件可以分析魔兽争霸录像,直接可以查看录像的玩家、地图,以及玩家的APM等信息。

以前在对战平台打魔兽,经常能遇到Java程序员,说明Java程序员中有很多魔兽争霸3的玩家,这里将Java解析魔兽争霸3录像的方法分享给同是WAR3玩家的小伙伴们。

使用方法

public class Test {

	public static void main(String[] args) throws IOException, W3GException, DataFormatException {
		
		Replay replay = new Replay(new File("d:/wucao/Desktop/151020_[UD]LuciferLNMS_VS_[NE]checkuncle_Amazonia_RN.w3g"));
		
		Header header = replay.getHeader();
        System.out.println("版本:1." + header.getVersionNumber() + "." + header.getBuildNumber());
        long duration = header.getDuration();
        System.out.println("时长:" + convertMillisecondToString(duration));
        
        UncompressedData uncompressedData = replay.getUncompressedData();
        System.out.println("游戏名称:" + uncompressedData.getGameName());
        System.out.println("游戏创建者:" + uncompressedData.getCreaterName());
        System.out.println("游戏地图:" + uncompressedData.getMap());
        
        List<Player> list = uncompressedData.getPlayerList();
        for(Player player : list) {
        	System.out.println("---玩家" + player.getPlayerId() + "---");
        	System.out.println("玩家名称:" + player.getPlayerName());
        	if(player.isHost()) {
        		System.out.println("是否主机:主机");
        	} else {
        		System.out.println("是否主机:否");
        	}
        	System.out.println("游戏时间:" + convertMillisecondToString(player.getPlayTime()));
        	System.out.println("操作次数:" + player.getAction());
        	System.out.println("APM:" + player.getAction() * 60000 / player.getPlayTime());
        	if(!player.isObserverOrReferee()) {
        		System.out.println("玩家队伍:" + (player.getTeamNumber() + 1));
        		switch(player.getRace()) {
        			case HUMAN:
        				System.out.println("玩家种族:人族");
        				break;
        			case ORC:
        				System.out.println("玩家种族:兽族");
        				break;
        			case NIGHT_ELF:
        				System.out.println("玩家种族:暗夜精灵");
        				break;
        			case UNDEAD:
        				System.out.println("玩家种族:不死族");
        				break;
        			case RANDOM:
        				System.out.println("玩家种族:随机");
        				break;
        		}
        		switch(player.getColor()) {
	        		case RED:
	    				System.out.println("玩家颜色:红");
	    				break;
	    			case BLUE:
	    				System.out.println("玩家颜色:蓝");
	    				break;
	    			case CYAN:
	    				System.out.println("玩家颜色:青");
	    				break;
	    			case PURPLE:
	    				System.out.println("玩家颜色:紫");
	    				break;
	    			case YELLOW:
	    				System.out.println("玩家颜色:黄");
	    				break;
	    			case ORANGE:
	    				System.out.println("玩家颜色:橘");
	    				break;
	    			case GREEN:
	    				System.out.println("玩家颜色:绿");
	    				break;
	    			case PINK:
	    				System.out.println("玩家颜色:粉");
	    				break;
	    			case GRAY:
	    				System.out.println("玩家颜色:灰");
	    				break;
	    			case LIGHT_BLUE:
	    				System.out.println("玩家颜色:浅蓝");
	    				break;
	    			case DARK_GREEN:
	    				System.out.println("玩家颜色:深绿");
	    				break;
	    			case BROWN:
	    				System.out.println("玩家颜色:棕");
	    				break;
        		}
        		System.out.println("障碍(血量):" + player.getHandicap() + "%");
        		if(player.isComputer()) {
        			System.out.println("是否电脑玩家:电脑玩家");
        			switch (player.getAiStrength())
					{
						case EASY:
							System.out.println("电脑难度:简单的");
							break;
						case NORMAL:
							System.out.println("电脑难度:中等难度的");
							break;
						case INSANE:
							System.out.println("电脑难度:令人发狂的");
							break;
					}
        		} else {
        			System.out.println("是否电脑玩家:否");
        		}
        	} else {
        		System.out.println("玩家队伍:裁判或观看者");
        	}
        	
        }
        
        List<ChatMessage> chatList = uncompressedData.getReplayData().getChatList();
        for(ChatMessage chatMessage : chatList) {
        	String chatString = "[" + convertMillisecondToString(chatMessage.getTime()) + "]";
        	chatString += chatMessage.getFrom().getPlayerName() + " 对 ";
        	switch ((int)chatMessage.getMode()) {
				case 0:
					chatString += "所有人";
					break;
				case 1:
					chatString += "队伍";
					break;
				case 2:
					chatString += "裁判或观看者";
					break;
				default:
					chatString += chatMessage.getTo().getPlayerName();
			}
        	chatString += " 说:" + chatMessage.getMessage();
        	System.out.println(chatString);
        }  
          
	}
	
	private static String convertMillisecondToString(long millisecond) {  
        long second = (millisecond / 1000) % 60;  
        long minite = (millisecond / 1000) / 60;  
        if (second < 10) {
            return minite + ":0" + second;  
        } else {  
            return minite + ":" + second;  
        }  
    } 

}

输出DEMO:

版本:1.26.6059
时长:24:53
游戏名称:WCA01
游戏创建者:A.1st_LawLiet
游戏地图:Maps\Download\(2)Amazonia.w3x
---玩家1---
玩家名称:A.1st_LawLiet
是否主机:主机
游戏时间:24:32
操作次数:0
APM:0
玩家队伍:裁判或观看者
---玩家2---
玩家名称:checkuncle
是否主机:否
游戏时间:24:31
操作次数:5831
APM:237
玩家队伍:2
玩家种族:暗夜精灵
玩家颜色:红
障碍(血量):100%
是否电脑玩家:否
---玩家3---
玩家名称:LuciferLNMS
是否主机:否
游戏时间:24:31
操作次数:7816
APM:318
玩家队伍:1
玩家种族:不死族
玩家颜色:灰
障碍(血量):100%
是否电脑玩家:否
---玩家4---
玩家名称:WCA_SEA_OB2
是否主机:否
游戏时间:24:53
操作次数:0
APM:0
玩家队伍:裁判或观看者
---玩家5---
玩家名称:wca_sea_ob1
是否主机:否
游戏时间:24:32
操作次数:0
APM:0
玩家队伍:裁判或观看者
[0:09]checkuncle 对 所有人 说:All rights reserved by Blizzard
[0:10]checkuncle 对 所有人 说:w3g files released by www.Replays.Net.
[0:36]LuciferLNMS 对 所有人 说:gl
[0:38]checkuncle 对 所有人 说:gl
[24:30]checkuncle 对 所有人 说:gg
[24:43]checkuncle 对 所有人 说:For more replays, plz visit www.Replays.Net

参考文档

http://w3g.deepnode.de/files/w3g_format.txt

http://w3g.deepnode.de/files/w3g_actions.txt

jw3gparser's People

Contributors

wucao avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.