📄 pkpair.java
字号:
package com.swing.game.crystal.utils;
import java.util.*;
import com.swing.game.crystal.CrystalController;
import com.swing.game.crystal.CrystalPlayer;
public class PKPair {
public int status; // demonstrate the progress of the pk action
public CrystalPlayer sponser;
public CrystalPlayer embracer;
public long sponserTimer;
public long embracerTimer;
public static final StringBuffer sponserComm = new StringBuffer();
public static final StringBuffer embracerComm = new StringBuffer();
public PKPair(CrystalPlayer sponser, CrystalPlayer embracer) {
this.sponser = sponser;
this.embracer = embracer;
this.status = PKStatus.INITIAL;
this.sponserTimer = System.currentTimeMillis();
}
public void process(String userID, String[] command) {
switch (command[0].charAt(0)) {
case '4':
// first time the two user exchange their personnal data
// send response back to the sponser
sponser.setStatus(UserStatus.USER_PKING);
sponser.pkData.append("K ");
sponser.pkData.append(embracer.level);
sponser.pkData.append(" ");
sponser.pkData.append(embracer.hp);
sponser.pkData.append(" ");
Object[] keys = embracer.getEquips().toArray();
Arrays.sort(keys, new StringComparator());
boolean first = true;
int start = -1;
for (int i = 0; i < keys.length; i++) {
/* weapons of User now just contains the id of the weapon and the number of the weapon but not the
* reference of the weapon, so you have to get the reference by using the WeaponMapping.
*/
Equip w = (Equip) CrystalController.WeaponMapping.get(keys[i]);
if (w.id.length() == 1)
sponser.pkData.append(w.id);
else {
if (first) {
start = i;
first = false;
sponser.pkData.append(" ");
}
sponser.pkData.append(w.id);
sponser.pkData.append(" ");
sponser.pkData.append(w.name);
sponser.pkData.append(" ");
}
}
if (start != -1) {
for (int i = start; i < keys.length; i++) {
Equip w = (Equip) CrystalController.WeaponMapping.get(keys[i]);
sponser.pkData.append(w.image);
sponser.pkData.append(" ");
}
}
// notify the embracer
embracer.setStatus(UserStatus.USER_PKING);
embracer.pkData.append("k ");
embracer.pkData.append(sponser.id);
embracer.pkData.append(" ");
embracer.pkData.append(sponser.level);
embracer.pkData.append(" ");
embracer.pkData.append(sponser.hp);
embracer.pkData.append(" ");
keys = sponser.getEquips().toArray();
Arrays.sort(keys, new StringComparator());
first = true;
start = -1;
for (int i = 0; i < keys.length; i++) {
Equip w = (Equip) CrystalController.WeaponMapping.get(keys[i]);
if (w.id.length() == 1)
embracer.pkData.append(w.id);
else {
if (first) {
start = i;
first = false;
embracer.pkData.append(" ");
}
embracer.pkData.append(w.id);
embracer.pkData.append(" ");
embracer.pkData.append(w.name);
embracer.pkData.append(" ");
}
}
if (start != -1) {
for (int i = start; i < keys.length; i++) {
Equip w = (Equip) CrystalController.WeaponMapping.get(keys[i]);
embracer.pkData.append(w.image);
embracer.pkData.append(" ");
}
}
break;
case '8': // concrete pk info
if (this.status == PKStatus.INITIAL) {
// you should make sure that all the two users have take their data away and then start another battle
if ( (sponser.pkData.length() == 0 || embracer.pkData.length() == 0) &&
command.length == 4) {
this.status = PKStatus.WAITING;
if (command[2].equals(sponser.id)) {
sponserComm.append(command[3]);
sponserTimer = System.currentTimeMillis();
}
else {
embracerComm.append(command[3]);
embracerTimer = System.currentTimeMillis();
}
}
}
else if (this.status == PKStatus.WAITING) {
if (command.length == 4) {
if ( (sponserComm.length() == 0 || embracerComm.length() == 0)) {
if (command[2].equals(sponser.id)) {
sponserComm.append(command[3]);
sponserTimer = System.currentTimeMillis();
}
else {
embracerComm.append(command[3]);
embracerTimer = System.currentTimeMillis();
}
}
if (sponserComm.length() != 0 && embracerComm.length() != 0) {
// calculate the data of the two user
pk(command[1]);
}
}
break;
}
}
}
private int[] attack() {
// re[2] demonstrate that if the run away behavior is successful
int[] re = new int[5];
re[0] = 0; // 发起者被打掉的血
re[1] = 0; // 被打者被打掉的血
re[2] = 0; // 显示本次攻击的状态 0 : 正常PK 1 : 发起者逃跑 2 : 被打者逃跑
re[3] = 0; // 发起者得到的经验值
re[4] = 0; // 被打者得到的经验值
// 被打者要逃跑
if (embracerComm.toString().equals("r")) {
// 被打者随意逃跑
boolean ifRun = true;
// 被打者逃跑成功
if (ifRun) {
re[2] += 2;
}
// 被打者逃跑失败
else {
re[2] = 0;
}
}
else {
// 计算被打者给对方造成的伤害
String number = embracerComm.toString().substring(1,
embracerComm.toString().length());
int attack = ( (Equip) CrystalController.WeaponMapping.get(number)).attack;
// 攻击性武器是给对方用的,是正数,因为对方要减
if (embracerComm.toString().substring(0, 1).equals("a")) {
re[0] += attack;
sponser.hp -= attack;
}
// 物品是给自己用的,是负数,减完就加上了
else {
re[0] -= attack;
embracer.hp += attack;
embracer.hp = embracer.hp > embracer.hpLimit ? embracer.hpLimit : embracer.hp;
}
}
if (sponser.hp > 0) {
// 发起者要逃跑
if (sponserComm.toString().equals("r")) {
// 发起者不允许逃跑
boolean ifRun = false;
// 发起者逃跑成功
if (ifRun) {
re[2] += 1;
}
// 发起者逃跑失败
else {
re[1] = 0;
}
}
else {
// 计算发起者给对方造成的伤害
String number = sponserComm.toString().substring(1,
sponserComm.toString().length());
int attack = ( (Equip) CrystalController.WeaponMapping.get(number)).attack;
// 攻击性武器是给对方用的,是正数,因为对方要减
if (sponserComm.toString().substring(0, 1).equals("a")) {
re[1] += attack;
embracer.hp -= attack;
}
// 物品是给自己用的,是负数,减完就加上了
else {
re[1] -= attack;
sponser.hp += attack;
sponser.hp = sponser.hp > sponser.hpLimit ? sponser.hpLimit : sponser.hp;
}
}
}
System.out.println( sponser.id + " : " + sponser.hp);
System.out.println( embracer.id + " : " + embracer.hp);
return re;
}
public void pk(String userID) {
int[] re = attack();
int[] exp = null;
// 战斗中有人逃跑
if (re[2] != 0) {
// 计算经验
// exp[0] 是给sponser的
// exp[1] 是给embracer的
exp = calculateExp(re[2]);
sponser.pkData.append("r");
sponser.pkData.append(exp[0]);
embracer.pkData.append("r");
embracer.pkData.append(exp[1]);
// change the dead one's blood to 10
sponser.hp = sponser.hpLimit;
// add experince to the winner
// change the winner's blood to the up limit
embracer.hp = embracer.hpLimit;
sponser.isPkOver = true;
embracer.isPkOver = true;
this.status = PKStatus.OVER;
}
// 正常战斗过程
else {
String sponserStr = sponserComm.toString();
String embracerStr = embracerComm.toString();
if (sponser.hp > 0) {
sponser.pkData.append("k ");
sponser.pkData.append(re[0]);
sponser.pkData.append(" ");
sponser.pkData.append(re[1]);
sponser.pkData.append(" ");
sponser.pkData.append(embracerStr);
}
else {
sponser.isPkOver = true;
embracer.isPkOver = true;
sponser.pkData.append("k ");
sponser.pkData.append(re[0]);
sponser.pkData.append(" ");
sponser.pkData.append(re[1]);
sponser.pkData.append(" ");
sponser.pkData.append(embracerStr);
sponser.pkData.append(" 0");
// the second person must set this pk's status to be over
this.status = PKStatus.OVER;
}
if (embracer.hp > 0 /*|| sponser.hp <= 0 */) {
embracer.pkData.append("k ");
embracer.pkData.append(re[1]);
embracer.pkData.append(" ");
embracer.pkData.append(re[0]);
embracer.pkData.append(" ");
embracer.pkData.append(sponserStr);
}
else {
sponser.isPkOver = true;
embracer.isPkOver = true;
embracer.pkData.append("k ");
embracer.pkData.append(re[1]);
embracer.pkData.append(" ");
embracer.pkData.append(re[0]);
embracer.pkData.append(" ");
embracer.pkData.append(sponserStr);
embracer.pkData.append(" 0");
// the second person must set this pk's status to be over
this.status = PKStatus.OVER;
}
if (sponser.hp <= 0) {
exp = calculateExp(1);
embracer.hp = embracer.hpLimit;
// add experince to the winner
// change the winner's blood to the up limit
sponser.hp = sponser.hpLimit;
embracer.pkData.append(" ");
embracer.pkData.append(exp[1]);
}
else if (embracer.hp <= 0) {
exp = calculateExp(2);
embracer.hp = embracer.hpLimit;
// add experince to the winner
// change the winner's blood to the up limit
sponser.hp = sponser.hpLimit;
sponser.pkData.append(" ");
sponser.pkData.append(exp[0]);
}
}
sponserComm.delete(0, sponserComm.length());
embracerComm.delete(0, embracerComm.length());
if (this.status != PKStatus.OVER)
this.status = PKStatus.INITIAL;
}
/**
*
* @param who int 用来表示PK中是谁失败(逃跑算失败)
* 1 : 发起者失败
* 2 : 被打者失败
* 3 : 两者同时逃跑
* @return int[]
*/
private int[] calculateExp(int who) {
int[] re = new int[2];
if (who == 1) {
re[0] = 0;
re[1] = 1000;
}
else if (who == 2) {
re[0] = 1000;
re[1] = 0;
}
else {
re[0] = 0;
re[1] = 0;
}
return re;
}
public boolean isJoined(String id) {
if (this.sponser.id.equals(id) || this.embracer.id.equals(id))
return true;
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -