generated from sigonasr2/CPlusPlusProjectTemplate
	Implement defend command and refactor damage calculation formula to be in its own separate function
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
		
							parent
							
								
									6fbcc64f44
								
							
						
					
					
						commit
						e96e5248e8
					
				
										
											Binary file not shown.
										
									
								
							| @ -1 +0,0 @@ | ||||
| #include "battlemoves.h" | ||||
| @ -1,8 +0,0 @@ | ||||
| #include <string> | ||||
| #include <map> | ||||
| #include <array> | ||||
| #include <vector> | ||||
| 
 | ||||
| #ifndef BATTLEMOVES_H | ||||
| #define BATTLEMOVES_H | ||||
| #endif | ||||
							
								
								
									
										62
									
								
								main.cpp
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								main.cpp
									
									
									
									
									
								
							| @ -273,6 +273,7 @@ enum class BattleMoveName{ | ||||
|     TESTMOVE2, | ||||
|     TESTMOVE3, | ||||
| 	BASH, | ||||
| 	DEFEND, | ||||
| 	HAILSTORM_A, | ||||
| 	HAILSTORM_B, | ||||
| 	HAILSTORM_G, | ||||
| @ -343,9 +344,7 @@ namespace Battle{ | ||||
| 			Move(std::string name,std::string desc,int baseDmg,int randomDmg,int PPCost,int range,int channelTime,bool friendly,std::array<int,4>composition,Effect*eff=nullptr,bool pctDamage=false,std::vector<std::pair<Property,int>> properties={}) | ||||
| 			:Move(name,desc,0,baseDmg,randomDmg,PPCost,range,channelTime,friendly,composition,eff,pctDamage,properties){}; | ||||
| 			Move(std::string name,std::string desc,int grade,int baseDmg,int randomDmg,int PPCost,int range,int channelTime,bool friendly,std::array<int,4>composition,Effect*eff=nullptr,bool pctDamage=false,std::vector<std::pair<Property,int>> properties={}) | ||||
| 			:name(name),grade(grade),PPCost(PPCost),desc(desc),randomDmg(randomDmg),baseDmg(baseDmg),range(range),friendly(friendly),eff(eff),channelTime(channelTime),composition(composition),pctDamage(pctDamage),properties(properties){ | ||||
| 				this->channelTime=180; | ||||
| 			} | ||||
| 			:name(name),grade(grade),PPCost(PPCost),desc(desc),randomDmg(randomDmg),baseDmg(baseDmg),range(range),friendly(friendly),eff(eff),channelTime(channelTime),composition(composition),pctDamage(pctDamage),properties(properties){} | ||||
| 	}; | ||||
| } | ||||
| 
 | ||||
| @ -1041,7 +1040,10 @@ goes on a very long time, I hope you can understand this is only for testing pur | ||||
| 									//BATTLE_STATE=BattleState::ITEM_SELECT;
 | ||||
| 								}break; | ||||
| 								case 3:{ //Defend selected.
 | ||||
| 									DisplayMessageBox("Not implemented yet."); | ||||
| 									//DisplayMessageBox("Not implemented yet.");
 | ||||
| 									PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove=MOVELIST[BattleMoveName::DEFEND]; | ||||
| 									ConfirmPlayerTargetSelection(); | ||||
| 									BATTLE_STATE=BattleState::WAIT; | ||||
| 								}break; | ||||
| 								case 4:{ //Move selected.
 | ||||
| 									//DisplayMessageBox("Not implemented yet.");
 | ||||
| @ -1202,16 +1204,7 @@ goes on a very long time, I hope you can understand this is only for testing pur | ||||
| 					} | ||||
| 					if (ACTIONKEYPRESSED) { | ||||
| 						PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget=SELECTED_TARGET; | ||||
| 						if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove==nullptr) { //We have to check for this because other actions will need a target select and will override this.
 | ||||
| 							PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove=BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][POWER_GRADE_CURSOR[-CURRENT_TURN-1]]; | ||||
| 						} | ||||
| 						for (int i=0;i<PARTY_MEMBER_COUNT;i++) { | ||||
| 							PARTY_MEMBER_OBJ[i]->highlighted=false; | ||||
| 						} | ||||
| 						for (int i=0;i<BATTLE_ENCOUNTER->objs.size();i++) { | ||||
| 							BATTLE_ENCOUNTER->objs[i]->obj->highlighted=false; | ||||
| 						} | ||||
| 						PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->channelTimeRemaining=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->channelTime; | ||||
| 						ConfirmPlayerTargetSelection(); | ||||
| 						BATTLE_STATE=BattleState::WAIT; | ||||
| 					} | ||||
| 				}break; | ||||
| @ -2191,6 +2184,7 @@ goes on a very long time, I hope you can understand this is only for testing pur | ||||
| 		MOVELIST[BattleMoveName::TESTMOVE2]=new Battle::Move("Test Move 2","An attack",40,10,ㅍ 0,1,0,false,{0,0,0,0}); | ||||
| 		MOVELIST[BattleMoveName::TESTMOVE3]=new Battle::Move("Test Move 3","An attack",25,5,ㅍ 0,3,0,false,{0,0,20,0}); | ||||
| 		MOVELIST[BattleMoveName::BASH]=new Battle::Move("Bash","Regular attack.",5,5,ㅍ 0,1,0,false,{0,0,0,0}); | ||||
| 		MOVELIST[BattleMoveName::DEFEND]=new Battle::Move("Defend","Defend.",0,0,ㅍ 0,1,5*60,true,{0,0,0,0}); | ||||
| 		MOVELIST[BattleMoveName::HAILSTORM_A]=new Battle::Move("Hailstorm","Causes heavy ice rocks to crash",ALPHA,40,20,ㅍ 4,4,0,false,{0,0,20,0}); | ||||
| 		MOVELIST[BattleMoveName::HAILSTORM_B]=new Battle::Move("Hailstorm","Causes heavy ice rocks to crash",BETA,80,20,ㅍ 12,4,0,false,{0,0,20,0}); | ||||
| 		MOVELIST[BattleMoveName::HAILSTORM_G]=new Battle::Move("Hailstorm","Causes heavy ice rocks to crash",GAMMA,120,20,ㅍ 28,4,0,false,{0,0,20,0}); | ||||
| @ -3081,6 +3075,15 @@ goes on a very long time, I hope you can understand this is only for testing pur | ||||
| 				case BattleState::WAIT_ANIMATION:{ | ||||
| 					BATTLE_ROLLING_COUNTER_WAITTIME=5; | ||||
| 					BATTLE_ANIMATION_TIMER++; | ||||
| 					if (CURRENT_TURN<0) { | ||||
| 						if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove==MOVELIST[BattleMoveName::DEFEND]) { | ||||
| 							BATTLE_ANIMATION_TIMER=999; | ||||
| 						} | ||||
| 					} else { | ||||
| 						if (BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove==MOVELIST[BattleMoveName::DEFEND]) { | ||||
| 							BATTLE_ANIMATION_TIMER=999; | ||||
| 						} | ||||
| 					} | ||||
| 					if (BATTLE_ANIMATION_TIMER==30) { | ||||
| 						Effect*eff=(CURRENT_TURN<0)?PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->eff:BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->eff; | ||||
| 						if (eff!=nullptr) { | ||||
| @ -3110,9 +3113,7 @@ goes on a very long time, I hope you can understand this is only for testing pur | ||||
| 								if (BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->GetHP()>0) { | ||||
| 									 //Enemies have their health directly set.
 | ||||
| 									 for (auto&ent:GetEntitiesInRange(PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget,PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->channelPos,PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove)) { | ||||
| 										int dmgAmt = PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->baseDmg+ | ||||
| 											((PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg>0)?rand()%PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg:0) | ||||
| 											+PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->baseAtk; | ||||
| 										int dmgAmt = CalculateDamage(PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]],ent); | ||||
| 										if (ent->GetHP()>0) { | ||||
| 											std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << ent->obj->name << " dealing " << dmgAmt << " health.\n"; | ||||
| 											ent->_SetDirectHP(ent->GetHP()-dmgAmt); | ||||
| @ -3146,9 +3147,7 @@ goes on a very long time, I hope you can understand this is only for testing pur | ||||
| 							} else { | ||||
| 								if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]]->GetHP()>0) { | ||||
| 									for (auto&ent:GetEntitiesInRange(BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget,BATTLE_ENCOUNTER->objs[CURRENT_TURN]->channelPos,BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove)) { | ||||
| 										int dmgAmt = BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->baseDmg+ | ||||
| 											((rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg>0)?rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg:0) | ||||
| 											+BATTLE_ENCOUNTER->objs[CURRENT_TURN]->baseAtk; | ||||
| 										int dmgAmt = CalculateDamage(BATTLE_ENCOUNTER->objs[CURRENT_TURN],ent); | ||||
| 										if (ent->GetHP()>0) { | ||||
| 											std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << ent->obj->name << " dealing " << dmgAmt << " health.\n"; | ||||
| 											ent->SubtractHP(dmgAmt); | ||||
| @ -3557,6 +3556,29 @@ goes on a very long time, I hope you can understand this is only for testing pur | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	//Can run this after target selection to reset states.
 | ||||
| 	void ConfirmPlayerTargetSelection() { | ||||
| 		for (int i=0;i<PARTY_MEMBER_COUNT;i++) { | ||||
| 			PARTY_MEMBER_OBJ[i]->highlighted=false; | ||||
| 		} | ||||
| 		for (int i=0;i<BATTLE_ENCOUNTER->objs.size();i++) { | ||||
| 			BATTLE_ENCOUNTER->objs[i]->obj->highlighted=false; | ||||
| 		} | ||||
| 		PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->channelTimeRemaining=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->channelTime;					 | ||||
| 	} | ||||
| 
 | ||||
| 	int CalculateDamage(Entity*attacker,Entity*defender) { | ||||
| 		int finalDamage = 0; | ||||
| 		int attackerDamage = (attacker->selectedMove->baseDmg+ | ||||
| 			((rand()%attacker->selectedMove->randomDmg>0)?rand()%attacker->selectedMove->randomDmg:0) | ||||
| 			+attacker->baseAtk); | ||||
| 		finalDamage += attackerDamage; | ||||
| 		if (defender->selectedMove==MOVELIST[BattleMoveName::DEFEND]) { | ||||
| 			finalDamage*=0.4; | ||||
| 		} | ||||
| 		return finalDamage; | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user