2023-08-01 19:50:29 +02:00

162 lines
4.1 KiB
C++

/*
Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file)
This file is part of Lugaru.
Lugaru is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Lugaru is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Lugaru. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Level/Awards.hpp"
#include "Game.hpp"
#include "Objects/Person.hpp"
int bonus;
int bonusvalue;
int bonustotal;
int startbonustotal;
float bonustime;
float bonusnum[100];
const char* bonus_names[bonus_count] = {
#define DECLARE_BONUS(id, name, ...) name,
#include "Bonuses.def"
#undef DECLARE_BONUS
};
const char* award_names[award_count] = {
#define DECLARE_AWARD(id, name) name,
#include "Awards.def"
#undef DECLARE_AWARD
};
static const int bonus_values[bonus_count] = {
#define DECLARE_BONUS(id, name, value) value,
#include "Bonuses.def"
#undef DECLARE_BONUS
};
void award_bonus(int playerid, int bonusid, int alt_value)
{
if (playerid != 0) {
return;
}
bonus = bonusid;
bonustime = 0;
bonusvalue = alt_value ? alt_value : bonus_values[bonusid];
}
// FIXME: make these per-player
float damagetaken;
int numfalls;
int numflipfail;
int numseen;
int numresponded;
int numstaffattack;
int numswordattack;
int numknifeattack;
int numunarmedattack;
int numescaped;
int numflipped;
int numwallflipped;
int numthrowkill;
int numafterkill;
int numreversals;
int numattacks;
int maxalarmed;
int award_awards(int* awards)
{
int numawards = 0;
if (damagetaken == 0 && Person::players[0]->bloodloss == 0) {
awards[numawards] = awardflawless;
numawards++;
}
bool alldead = true;
for (unsigned i = 1; i < Person::players.size(); i++) {
if (Person::players[i]->dead != 2) {
alldead = 0;
}
}
if (alldead) {
awards[numawards] = awardalldead;
numawards++;
}
alldead = 1;
for (unsigned i = 1; i < Person::players.size(); i++) {
if (Person::players[i]->dead != 1) {
alldead = 0;
}
}
if (alldead) {
awards[numawards] = awardnodead;
numawards++;
}
if (numresponded == 0 && !numthrowkill) {
awards[numawards] = awardstealth;
numawards++;
}
if (numattacks == numstaffattack && numattacks > 0) {
awards[numawards] = awardbojutsu;
numawards++;
}
if (numattacks == numswordattack && numattacks > 0) {
awards[numawards] = awardswordsman;
numawards++;
}
if (numattacks == numknifeattack && numattacks > 0) {
awards[numawards] = awardknifefighter;
numawards++;
}
if (numattacks == numunarmedattack && numthrowkill == 0 && weapons.size() > 0) {
awards[numawards] = awardkungfu;
numawards++;
}
if (numescaped > 0) {
awards[numawards] = awardevasion;
numawards++;
}
if (numflipfail == 0 && numflipped + numwallflipped * 2 > 20) {
awards[numawards] = awardacrobat;
numawards++;
}
if (numthrowkill == (int(Person::players.size()) - 1)) {
awards[numawards] = awardlongrange;
numawards++;
}
alldead = 1;
for (unsigned i = 1; i < Person::players.size(); i++) {
if (Person::players[i]->dead != 2) {
alldead = 0;
}
}
if (numafterkill > 0 && alldead) {
awards[numawards] = awardbrutal;
numawards++;
}
if (numreversals > ((float)numattacks) * .8 && numreversals > 3) {
awards[numawards] = awardaikido;
numawards++;
}
if (maxalarmed == 1 && Person::players.size() > 2) {
awards[numawards] = awardstrategy;
numawards++;
}
if (numflipfail > 3) {
awards[numawards] = awardklutz;
numawards++;
}
return numawards;
}