int maxexp(A_exp exp) { switch (exp -> kind) { case A_idExp: case A_numExp: return 1; case A_opExp: { int num1 = maxexp(exp -> u.op.left); int num2 = maxexp(exp -> u.op.right); if (num1 > num2) { return num1; } else { return num2; } } case A_eseqExp: { int num1 = maxarg(exp -> u.eseq.stm); int num2 = maxexp(exp -> u.eseq.exp); if (num1 > num2) { return num1; } else { return num2; } } default: fprintf(stderr, "Expression error"); exit(EXIT_FAILURE); } }
void Handler_PINIT(int* myID, Character *myChar, std::string* str) { SYNCHED_CHARACTER_MAP* chars = SYNCHED_CHARACTER_MAP::getInstance(); SYNCHED_MONSTER_MAP* mons = SYNCHED_MONSTER_MAP::getInstance(); INIT::CONTENTS contents; contents.ParseFromString(*str); Scoped_Wlock SW(&chars->srw); auto user = contents.data(0); int id = user.id(), x = user.x(), y = user.y(); std::string name = user.name(); int lv = user.lv(), maxHp = user.maxhp(), power = user.power(), maxExp = user.maxexp(); int prtExp = user.prtexp(); *myID = id; Character* myCharacter = myChar; myCharacter->setID(id); myCharacter->setName(name); myCharacter->setX(x); myCharacter->setY(y); myCharacter->setLv(lv, maxHp, power, maxExp); myCharacter->setPrtExp(prtExp); chars->insert(id, myChar); printf("- %s님께서 위치 (%d,%d) 에 생성되었습니다!\n", myChar->getName().c_str(), myChar->getX(), myChar->getY()); contents.clear_data(); }
int maxexp_list(A_expList exp_list) { switch (exp_list -> kind) { case A_pairExpList: { int num1 = maxexp(exp_list -> u.pair.head); int num2 = 1 + maxexp_list(exp_list -> u.pair.tail); if (num1 > num2) { return num1; } else { return num2; } } case A_lastExpList: { return maxexp(exp_list -> u.last); } default: fprintf(stderr, "Expression list error"); exit(EXIT_FAILURE); } }
void Handler_PUSER_SET_LV(int *myID, std::string* str) { SYNCHED_CHARACTER_MAP* chars = SYNCHED_CHARACTER_MAP::getInstance(); SYNCHED_MONSTER_MAP* mons = SYNCHED_MONSTER_MAP::getInstance(); SET_USER_LV::CONTENTS setuserlvContents; setuserlvContents.ParseFromString(*str); Scoped_Rlock SW(&chars->srw); for (int i = 0; i < setuserlvContents.data_size(); ++i) { auto setuserlv = setuserlvContents.data(i); int id = setuserlv.id(); int lv = setuserlv.lv(); int maxHp = setuserlv.maxhp(); int power = setuserlv.power(); int expUp = setuserlv.expup(); int maxexp = setuserlv.maxexp(); Character* lvUpChar = chars->find(id); if (lvUpChar->getID() == *myID) printf("- 레벨 업을 하였습니다!!\n"); if (lvUpChar == NULL) { printf("나 나오면 안돼는데 나옴?"); exit(0); } else { lvUpChar->setExpUp(expUp); lvUpChar->setLv(lv, maxHp, power, maxexp); printf("★ 유저 %s 님께서 레벨이 %d로 올랐습니다!!\n", lvUpChar->getName().c_str(), id, lv); } } }
int maxarg(A_stm stm) { switch (stm -> kind) { case A_compoundStm: { int num1 = maxarg(stm -> u.compound.stm1); int num2 = maxarg(stm -> u.compound.stm2); if (num1 > num2) { return num1; } else { return num2; } } case A_assignStm: { return maxexp(stm -> u.assign.exp); } case A_printStm: { return maxexp_list(stm -> u.print.exps); } default : { fprintf(stderr, "Expression error"); exit(EXIT_FAILURE); } } }