You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
3.8 KiB
171 lines
3.8 KiB
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
|
|
#include "encounter.h"
|
|
#include "playerinput.h"
|
|
#include "helper.h"
|
|
|
|
/*Gegner mit AC, damagedealt = damage-AC, kann nicht kleiner 1 sein
|
|
evtl. lair bonus der dem gegner ein wenig mehr/weniger damage erlaubt
|
|
gegner erhalten eine zufällige menge Gold, die beim tod an den spieler gegeben werden
|
|
humanoide gegner haben heiltränke mit denen sie sich ggf heilen.
|
|
heilung erfolgt dann, wenn bestimmte hp (50%) unterschritten wird. wird allerdings gewürfelt,
|
|
je niedriger die hp%, desto höher die chance. */
|
|
|
|
bool playerAlive(int health)
|
|
{
|
|
if (health > 0)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
int playerHealth(int health, int damage, int armor)
|
|
{
|
|
const int maxhealth = 100;
|
|
health = health - damage;
|
|
if (health > maxhealth)
|
|
{
|
|
health = maxhealth;
|
|
}
|
|
return health;
|
|
}
|
|
|
|
void enemyHeal(enemy *enemy, int healAmount)
|
|
{
|
|
int currentHealth = getEnemyHealth(enemy);
|
|
int maxHealth = getEnemyMaxHealth(enemy);
|
|
if (currentHealth + healAmount > maxHealth)
|
|
{
|
|
healAmount = maxHealth - currentHealth;
|
|
}
|
|
setEnemyHealth(enemy, currentHealth + healAmount);
|
|
}
|
|
|
|
void enemyDamaged(enemy *enemy, int damage)
|
|
{
|
|
int armor = getEnemyArmor(enemy);
|
|
int currentHealth = getEnemyHealth(enemy);
|
|
int damagedealt = damage - armor;
|
|
if (damagedealt < 1)
|
|
{
|
|
damagedealt = 1;
|
|
}
|
|
setEnemyHealth(enemy, currentHealth - damagedealt);
|
|
}
|
|
|
|
|
|
|
|
int switchTurns(int currentTurn)
|
|
{
|
|
currentTurn = currentTurn % 2 + 1;
|
|
return currentTurn;
|
|
}
|
|
|
|
int fight(int playerH, int playerDamage, int playerArmor, int playerAttack, enemy* enemy)
|
|
{
|
|
int currentTurn = 2;
|
|
char decision;
|
|
while (playerAlive(playerH) && getEnemyHealth(enemy) > 0)
|
|
{
|
|
if (currentTurn != 1)
|
|
{
|
|
decision = playerInputChar();
|
|
switch(decision){
|
|
case 'a':
|
|
enemyDamaged(enemy, playerDamage);
|
|
break;
|
|
case 'h':
|
|
playerH = playerHealth(playerH, -10, playerArmor);
|
|
break;
|
|
case 'f':
|
|
return 2;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if(enemyChoosesHeal(enemy))
|
|
{
|
|
enemyHeal(enemy, 10);
|
|
}
|
|
else
|
|
{
|
|
playerH = playerHealth(playerH, getEnemyDamage(enemy), playerArmor);
|
|
}
|
|
}
|
|
currentTurn = switchTurns(currentTurn);
|
|
}
|
|
if (playerAlive(playerH))
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int randomIntRange(int min, int max)
|
|
{
|
|
int value = randomInt();
|
|
return (value % (max - min + 1)) + min;
|
|
}
|
|
|
|
|
|
int map(int x, int in_min, int in_max, int out_min, int out_max)
|
|
{
|
|
//vgl Arduino map() https://www.arduino.cc/reference/en/language/functions/math/map/
|
|
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
|
}
|
|
|
|
bool enemyChoosesHeal(enemy* enemy)
|
|
{
|
|
int currentHealth = getEnemyHealth(enemy);
|
|
int maxHealth = getEnemyMaxHealth(enemy);
|
|
int healthd20 = 20 - map(currentHealth, 0, maxHealth, 0, 20);
|
|
int rolld20 = randomIntRange(1, 20);
|
|
return (healthd20 + rolld20) >= 30;
|
|
}
|
|
|
|
// Getter/Setter Funktionen
|
|
void setEnemyHealth(enemy* enemy, int newhealth)
|
|
{
|
|
enemy->health = newhealth;
|
|
}
|
|
|
|
void setEnemyDamage(enemy* enemy, int newdamage)
|
|
{
|
|
enemy->damage = newdamage;
|
|
}
|
|
|
|
void setEnemyArmor(enemy* enemy, int newarmor)
|
|
{
|
|
enemy->armor = newarmor;
|
|
}
|
|
|
|
int getEnemyHealth(enemy* enemy)
|
|
{
|
|
return enemy->health;
|
|
}
|
|
|
|
int getEnemyArmor(enemy* enemy)
|
|
{
|
|
return enemy->armor;
|
|
}
|
|
|
|
int getEnemyDamage(enemy* enemy)
|
|
{
|
|
return enemy->damage;
|
|
}
|
|
|
|
int getEnemyMaxHealth(enemy* enemy)
|
|
{
|
|
return enemy->maxHealth;
|
|
}
|