summaryrefslogtreecommitdiff
path: root/actions.c
diff options
context:
space:
mode:
Diffstat (limited to 'actions.c')
-rw-r--r--actions.c295
1 files changed, 58 insertions, 237 deletions
diff --git a/actions.c b/actions.c
index dcbfc10..bd1ce2e 100644
--- a/actions.c
+++ b/actions.c
@@ -5,6 +5,64 @@
#include <stdio.h>
#include <stdlib.h>
+static int compute_damages(const struct character_t *src, const struct character_t *dest,
+ enum damages_type_t type, enum element_t element)
+{
+ int avg;
+ int min;
+ int max;
+
+ /* we optimize if the target is invulnerable */
+ if (element != ELEMENT_NONE && dest->affinities[element] == AFFINITY_INVULNERABILITY)
+ return 0;
+
+ if (type == DAMAGES_PHYSICAL) {
+ avg = src->strength * 60 - dest->defense * 50;
+ } else if (type == DAMAGES_MAGICAL) {
+ avg = src->magic * 60 - dest->spirit * 50;
+ }
+
+ if (avg <= 0)
+ return 0;
+
+ if (element != ELEMENT_NONE) {
+ switch (dest->affinities[element]) {
+ case AFFINITY_SENSITIVE:
+ avg *= 2;
+ break;
+ case AFFINITY_RESISTANCE:
+ avg /= 2;
+ break;
+ case AFFINITY_ABSORPTION:
+ avg = -avg;
+ break;
+ case AFFINITY_NONE:
+ break;
+ default:
+ abort();
+ }
+ }
+
+ min = avg - avg / 4;
+ max = avg + avg / 4;
+
+ return rand() % (max - min + 1) + min;
+}
+
+static int compute_cure(const struct character_t *src, const struct character_t *dest)
+{
+ int avg, max, min;
+
+ /* TODO maybe we should use the dest to compute the cure ? */
+ (void) dest;
+
+ avg = src->magic * 20;
+ min = avg - avg / 4;
+ max = avg + avg / 4;
+
+ return rand() % (max - min + 1) + min;
+}
+
void attack(SURFACES *surfaces, POSITIONS *positions, struct character_t *src, struct character_t *dest, void *data)
{
int damages;
@@ -77,240 +135,3 @@ void use_ether(SURFACES *surfaces, POSITIONS *positions, struct character_t *src
cure_target_mp(surfaces, positions, dest, cure);
}
-
-enum action_state_t Fattaquer(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, struct team_t *enemy, void *data)
-{
- int degats;
- struct character_t *target;
- int clan=ENNEMI;
- int selection = 0;
- SDL_Event event;
- SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions);
-
- (void) data;
-
- while(!enemy->chrs[selection].alive)
- selection++;
-
- update_selected_target(surfaces, positions, &enemy->chrs[selection]);
-
- for (;;) {
- SDL_Flip (surfaces->Pecran);
- SDL_WaitEvent (&event);
- switch (event.type)
- {
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym)
- {
- case SDLK_ESCAPE:
- case SDLK_a:
- update_selected_target(surfaces, positions, NULL);
- SDL_Flip(surfaces->Pecran);
- return ACTION_CANCELED;
- SELECTION_CIBLE();
- case SDLK_RETURN:
- case SDLK_f:
- if (clan == ENNEMI) {
- target = &enemy->chrs[selection];
- } else {
- target = &ally->chrs[selection];
- }
-
- degats = compute_damages(&ally->chrs[ally->chr_cur], target, DAMAGES_PHYSICAL, ELEMENT_NONE);
-
- update_selected_target(surfaces, positions, NULL);
-
- damage_target_hp(surfaces, positions, target, degats);
- SDL_Flip(surfaces->Pecran);
-
- SDL_Delay(1000);
-
- SDL_BlitSurface(surfaces->Pfondjeu, &positions->Vpositiondegats, surfaces->Pecran, &positions->Vpositiondegats);
-
- SDL_Flip(surfaces->Pecran);
-
- return ACTION_PERFORMED;
- default:
- break;
- }
- break;
-
- }
- }
-}
-
-int compute_damages(const struct character_t *src, const struct character_t *dest,
- enum damages_type_t type, enum element_t element)
-{
- int avg;
- int min;
- int max;
-
- /* we optimize if the target is invulnerable */
- if (element != ELEMENT_NONE && dest->affinities[element] == AFFINITY_INVULNERABILITY)
- return 0;
-
- if (type == DAMAGES_PHYSICAL) {
- avg = src->strength * 60 - dest->defense * 50;
- } else if (type == DAMAGES_MAGICAL) {
- avg = src->magic * 60 - dest->spirit * 50;
- }
-
- if (avg <= 0)
- return 0;
-
- if (element != ELEMENT_NONE) {
- switch (dest->affinities[element]) {
- case AFFINITY_SENSITIVE:
- avg *= 2;
- break;
- case AFFINITY_RESISTANCE:
- avg /= 2;
- break;
- case AFFINITY_ABSORPTION:
- avg = -avg;
- break;
- case AFFINITY_NONE:
- break;
- default:
- abort();
- }
- }
-
- min = avg - avg / 4;
- max = avg + avg / 4;
-
- return rand() % (max - min + 1) + min;
-}
-
-enum action_state_t Fpotion(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, struct team_t *enemy, void *data)
-{
- struct character_t *target;
- SDL_Event event;
- int selection=0;
- int soins=0;
- int clan=ALLIE;
-
- int type = *((int *)data);
-
- if (type == POTION && ally->objects.potions <= 0)
- return ACTION_ERROR;
- else if(type == POTIONPLUS && ally->objects.potionsplus <= 0)
- return ACTION_ERROR;
-
- SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions);
- while (!ally->chrs[selection].alive)
- selection++;
- update_selected_target(surfaces,positions, &ally->chrs[selection]);
- SDL_Flip(surfaces->Pecran);
-
- for (;;) {
- SDL_WaitEvent(&event);
- switch(event.type)
- {
- case SDL_KEYDOWN:
- switch(event.key.keysym.sym)
- {
- case SDLK_ESCAPE:
- case SDLK_a:
- update_selected_target(surfaces, positions, NULL);
- SDL_Flip(surfaces->Pecran);
- return ACTION_CANCELED;
- SELECTION_CIBLE();
- case SDLK_RETURN:
- case SDLK_f:
- if (clan == ENNEMI) {
- target = &enemy->chrs[selection];
- } else {
- target = &ally->chrs[selection];
- }
-
- update_selected_target(surfaces, positions, NULL);
-
- if (type == POTION) {
- soins = 1000;
- ally->objects.potions--;
- } else if (type == POTIONPLUS) {
- soins = 4000;
- ally->objects.potionsplus--;
- }
-
- cure_target_hp(surfaces, positions, target, soins);
-
- SDL_Flip(surfaces->Pecran);
- SDL_Delay(1000);
- SDL_BlitSurface(surfaces->Pfondjeu, &positions->Vpositiondegats, surfaces->Pecran, &positions->Vpositiondegats);
-
- return ACTION_PERFORMED;
- default:
- break;
- }
- break;
- }
- }
-}
-
-enum action_state_t Fether(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, struct team_t *enemy, void *data)
-{
- struct character_t *target;
- SDL_Event event;
- int selection=0;
- int soins=0;
- int clan=ALLIE;
-
- int type = *((int *)data);
-
- if (type == ETHER && ally->objects.ethers <= 0)
- return ACTION_ERROR;
- else if (type == ETHERPLUS && ally->objects.ethersplus <= 0)
- return ACTION_ERROR;
-
- SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions);
- while (!ally->chrs[selection].alive)
- selection++;
- update_selected_target(surfaces,positions, &ally->chrs[selection]);
- SDL_Flip(surfaces->Pecran);
-
- for (;;) {
- SDL_WaitEvent(&event);
- switch(event.type)
- {
- case SDL_KEYDOWN:
- switch(event.key.keysym.sym)
- {
- case SDLK_ESCAPE:
- case SDLK_a:
- update_selected_target(surfaces, positions, NULL);
- SDL_Flip(surfaces->Pecran);
- return ACTION_CANCELED;
- SELECTION_CIBLE();
- case SDLK_RETURN:
- case SDLK_f:
- if (clan == ENNEMI) {
- target = &enemy->chrs[selection];
- } else {
- target = &ally->chrs[selection];
- }
-
- if (type == ETHER) {
- soins = 10;
- ally->objects.ethers--;
- } else if (type == ETHERPLUS) {
- soins = 40;
- ally->objects.ethersplus--;
- }
-
- cure_target_mp(surfaces, positions, target, soins);
-
- SDL_Flip(surfaces->Pecran);
- SDL_Delay(1000);
- SDL_BlitSurface(surfaces->Pfondjeu, &positions->Vpositiondegats, surfaces->Pecran, &positions->Vpositiondegats);
-
- return ACTION_PERFORMED;
- default:
- break;
- }
- break;
- }
- }
-}